极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25505|回复: 6

Arduino虚拟架子鼓

[复制链接]
发表于 2012-2-19 11:49:02 | 显示全部楼层 |阅读模式
老外做的虚拟架子鼓,看着不错~



这个视频里设备的arduino代码
  1. void noteOn(byte channel, byte note, byte velocity)
  2. {

  3.   midiMsg(channel+0x90, note, velocity);
  4. }
  5. void midiMsg(byte cmd, byte data1, byte data2)
  6. {
  7.   Serial.write(cmd);


  8.   Serial.write(data1);
  9.   Serial.write(data2);
  10. }  
  11. const int numSnareReadings = 10;
  12. const int numHighHatReadings = 2;
  13. const int numKickReadings = 5;
  14. const int numCrashReadings = 10;

  15. int snareReadings[numSnareReadings];
  16. int snareIndex = 0;
  17. int snareTotal = 0;
  18. int snareAverage = 0;
  19. int currentSnareState;
  20. int switchSnareState = 0;

  21. int highHatReadings[numHighHatReadings];
  22. int highHatIndex = 0;
  23. int highHatTotal = 0;
  24. int highHatAverage = 0;
  25. int currentHighHatState;
  26. int switchHighHatState = 0;

  27. int crashReadings[numCrashReadings];
  28. int crashIndex = 0;
  29. int crashTotal = 0;
  30. int crashAverage = 0;
  31. int currentCrashState;
  32. int switchCrashState = 0;

  33. int kickReadings[numKickReadings];
  34. int kickIndex = 0;
  35. int kickTotal = 0;
  36. int kickAverage = 0;
  37. int currentKickState;
  38. int switchKickState = 0;

  39. long previousMillis1 = 0;
  40. long previousMillis2 = 0;
  41. long previousMillis3 = 0;
  42. long previousMillis4 = 0;

  43. long interval1 = 100;
  44. long interval2 = 100;
  45. long interval3 = 100;
  46. long interval4 = 100;

  47. void setup()
  48. {
  49.   Serial.begin(36000);
  50.   for (int thisReading = 0; thisReading < numSnareReadings; thisReading++)
  51.     snareReadings[thisReading] = 0;

  52.   for (int thisReading = 0; thisReading < numHighHatReadings; thisReading++)
  53.     highHatReadings[thisReading] = 0;

  54.   for (int thisReading = 0; thisReading < numKickReadings; thisReading++)
  55.     kickReadings[thisReading] = 0;

  56.   for (int thisReading = 0; thisReading < numKickReadings; thisReading++)
  57.     crashReadings[thisReading] = 0;
  58. }

  59. void loop()
  60. {
  61.   unsigned long currentMillis = millis();

  62.   snareAverage = snareTotal / numSnareReadings;
  63.   snareTotal = snareTotal - snareReadings[snareIndex];
  64.   snareReadings[snareIndex] = analogRead(A0);
  65.   snareTotal = snareTotal + snareReadings[snareIndex];
  66.   snareIndex = snareIndex + 1;

  67.   if(snareIndex >= numSnareReadings)
  68.     snareIndex = 0;

  69.   snareAverage = snareTotal / numSnareReadings;

  70.   currentSnareState = snareAverage;
  71.   if( currentSnareState > 500 && (currentMillis - previousMillis1) > interval1)
  72.   {

  73.     previousMillis1 = currentMillis;
  74.     noteOn(9, 38, 120);
  75.   }


  76.   highHatAverage = highHatTotal / numHighHatReadings;
  77.   highHatTotal = highHatTotal - highHatReadings[highHatIndex];
  78.   highHatReadings[highHatIndex] = analogRead(A1);
  79.   highHatTotal = highHatTotal + highHatReadings[highHatIndex];
  80.   highHatIndex = highHatIndex + 1;

  81.   if(highHatIndex >= numHighHatReadings)
  82.     highHatIndex = 0;

  83.   highHatAverage = highHatTotal / numHighHatReadings;

  84.   currentHighHatState = highHatAverage;
  85.   if( currentHighHatState > 550 && currentHighHatState < 700 && (currentMillis - previousMillis2) > interval2 )
  86.   {
  87.     previousMillis2 = currentMillis;
  88.     noteOn(9, 46, 120);

  89.   }   


  90.   kickAverage = kickTotal / numKickReadings;
  91.   kickTotal = kickTotal - kickReadings[kickIndex];
  92.   kickReadings[kickIndex] = analogRead(A2);
  93.   kickTotal = kickTotal + kickReadings[kickIndex];
  94.   kickIndex = kickIndex + 1;

  95.   if(kickIndex >= numKickReadings)
  96.     kickIndex = 0;

  97.   kickAverage = kickTotal / numKickReadings;

  98.   currentKickState = kickAverage;
  99.   if( currentKickState > 360 && (currentMillis - previousMillis3) > interval3 )
  100.   {
  101.     previousMillis3 = currentMillis;
  102.     noteOn(9, 35, 120);

  103.   }   

  104.   crashAverage = crashTotal / numCrashReadings;
  105.   crashTotal = crashTotal - crashReadings[crashIndex];
  106.   //crashReadings[crashIndex] = analogRead(A1);
  107.   crashTotal = crashTotal + crashReadings[crashIndex];
  108.   crashIndex = crashIndex + 1;

  109.   if(crashIndex >= numCrashReadings)
  110.     crashIndex = 0;

  111.   crashAverage = crashTotal / numCrashReadings;

  112.   currentCrashState = crashAverage;
  113.   if( currentCrashState > 700 && (currentMillis - previousMillis4) > interval2 )
  114.   {
  115.     previousMillis4 = currentMillis;
  116.     noteOn(9, 55, 120);

  117.   }   

  118. }
复制代码
还有另外一个国外的博客,有详细介绍。
http://blimp12.blogspot.com/
回复

使用道具 举报

发表于 2012-2-19 14:56:12 | 显示全部楼层
我来消灭零回复{:soso__10469387108248471281_4:}
回复 支持 反对

使用道具 举报

发表于 2012-2-19 20:32:26 | 显示全部楼层
nice!               
回复 支持 反对

使用道具 举报

发表于 2012-2-20 22:39:30 | 显示全部楼层
cool,这个老外年纪轻轻就秃顶了
回复 支持 反对

使用道具 举报

发表于 2015-2-20 23:39:45 | 显示全部楼层
没看懂程序,这是调用的MINI芯片里的信号发生器来产生的鼓声吗?
回复 支持 反对

使用道具 举报

发表于 2015-2-22 23:15:17 | 显示全部楼层
应该是向波表发的MIDI信号,模拟出的鼓声。 MIDI实际上就是个串口。
回复 支持 反对

使用道具 举报

发表于 2015-2-23 10:32:24 | 显示全部楼层
这玩意很好玩,我本身也喜爱玩MIDI,有空搞一个来玩。
这是它的教程http://www.instructables.com/id/Arduino-Air-Drums/
代码与pdf文件https://github.com/bhar92/AirDrums
关鍵部分(MIDI软件)没有示范,很多人肯定看不懂。
MIDIS软件有很多,免费的也很多。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 11:18 , Processed in 0.042817 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表