【EvilMK】“Orchid”像样的Arduino架子鼓

2015-11-034.1万
精华项目
AI 快速预览详细 收起
本文介绍了如何制作一个Arduino架子鼓,包括硬件清单和最终效果。适合所有技术水平的创客,从产生好奇到动手实践的全过程。
来参加上海创客嘉年华的伙伴们有没有看到这个作品:lol

几位小伙伴问我开不开源,那不是必须的嘛~制作过程送上!

不好意西啦,交这个作业迟了点,都一个多月了...真的抱歉:shutup:




送上活动时候的照片(明和电机的社长大大真的好萌:loveliness:)
【EvilMK】“Orchid”像样的Arduino架子鼓图1

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(23)
派大星ym
派大星ym
////
派大星ym
派大星ym
酷酷酷酷
kiyang
kiyang
我早想做个电子鼓了,可一直停在想的阶段,大神都做出来了。。:'(
老和山小白花
老和山小白花
能有更详尽的电路图就好啦
liqunlong
liqunlong
Chinese without Chinese.:o
liqunlong
liqunlong
fluidsynth is difficult.tell me how to use it please.:'(
z550316
z550316
你好能给我一分电路图吗 ?
[email]550316019@QQ.COM[/email]
Tikoyoo
Tikoyoo
MIDI那部分接线怎么弄啊 都看不到 请赐教啊
marcusme
marcusme
arduino架子鼓,简直帅气!
qq815076543322
qq815076543322
碉堡了6666666666666
luna
luna
又会玩音乐、又会造乐器、又长的帅~~简直就是:完!美!(请自行脑补金星老师动作)
hnyzcj
hnyzcj回复luna
哈哈哈,这算是表扬他吗?
Juice
Juice
好期待好期待!!!!蘑菇云来一套~~~来一套~~~~哟哟~切克闹!!
swanglei
swanglei
好赞~~~~顶一个先。。。。
后面仔细看了一下,原理没怎么讲,一般人是看不明白的,可能只多放了些照片。。。。。希望稍微具体些,就更完美了~~~~
视频也不错的~~~
phoebe.wang40
phoebe.wang40
32个赞
dsweiliang
dsweiliang
我也要做一个~
qq558354535099
qq558354535099
去的时候看到了。牛人一枚
丄帝De咗臂
丄帝De咗臂
碉堡了6666666666666
virtualwiz
virtualwiz
作者
剩下的就是自由发挥了:D,想怎么玩都可以

virtualwiz
virtualwiz
作者
因为Windows有MIDI延迟的Bug,实时性相当不好(有专业声卡除外~)
Linux和Mac都没有这个问题
如果用Linux,可能需要这些软件(根据需要大胆配置~多种组合方案)
统统是免费或者开源软件哦:$
[code]jackd
qjackctl //jack的GUI
fluidsynth
qsynth //fluidsynth的GUI
fluid-soundfont-gm //音色库,内有多种鼓的声音[/code]
virtualwiz
virtualwiz
作者
[code]/*EvilMaker Orchid (Opensource) 2015 v1.00-d
by Virtualwiz
*/
void midiSend (int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
const byte buzzer=50;
//Serial to MIDI or Native MIDI?
boolean debug_mode=true;
const unsigned char kick=36;
const unsigned char snare=38;
const unsigned char tom_high=50;
const unsigned char tom_low=45;
const unsigned char tom_bass=41;
const unsigned char crash_left=49;
const unsigned char crash_right=57;
const unsigned char hat_open=51; //46
const unsigned char hat_close=42;
char adc_channel[7] ={
'A0','A1','A2','A3','A4','A5','A6'
};
void setup() {
pinMode(buzzer,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,INPUT);
pinMode(3,INPUT);
digitalWrite(3,HIGH);
digitalWrite(6,HIGH);
//3 is for Kick and 6 is for hi-hat
//Startup tone
tone(buzzer,1397,130);
delay(130);
tone(buzzer,1568,130);
delay(130);
tone(buzzer,1760,150);
delay(1500);
pinMode(7,OUTPUT);
if(debug_mode)
{
Serial.begin(115200); //Debug mode baud rate
tone(buzzer,1397,120);
delay(300);
tone(buzzer,1397,120);
delay(1000);
}
else
{
Serial.begin(31250); //MIDI baud rate
tone(buzzer,1397,120);
delay(1000);
}
tone(buzzer,1397,300);
delay(1000);
}
unsigned char adc_sample[7];
boolean kick_trig_flag=false; //Is Kick already triggered?
//IMPORTANT!
//Adjust this if your pads are dull or too sensitive
//{crash, hat, snare, tom_bass, crash_right, tom_high, tom_low}
unsigned char adc_cutoff[7]= //minimum strength
{
3, 3, 10, 7, 3, 3, 3};
unsigned char adc_limit[7]= //maximum strength
{
40, 10, 30, 50, 40, 10, 10};
void loop() {
digitalWrite(7,HIGH);
for(byte count=0;count<=6;count++)
{
adc_sample[count]=map(analogRead(adc_channel[count]),0,1023,0,254);
}
//Here is a strange problem
//0 and 6 can't get their correct value if following code was not written
adc_sample[6]=map(analogRead(A6),0,1023,0,254);
adc_sample[0]=map(analogRead(A0),0,1023,0,254);
//Pls contant me if you know why,thx
digitalWrite(7,LOW);
if(adc_sample[0]>=adc_cutoff[0])
{
if(adc_sample[0]>=adc_limit[0])
adc_sample[0]=adc_limit[0];
midiSend(0x99,crash_left,map(adc_sample[0],adc_cutoff[0],adc_limit[0],0x00,0x7f));
// Serial.print("\t");
//Serial.println(adc_sample[0]);
}
if(adc_sample[1]>=adc_cutoff[1])
{
if(adc_sample[1]>=adc_limit[1])
adc_sample[1]=adc_limit[1];
if(digitalRead(6)==HIGH)
midiSend(0x99,hat_open,map(adc_sample[1],adc_cutoff[1],adc_limit[1],0x00,0x7f));
else
midiSend(0x99,hat_close,map(adc_sample[1],adc_cutoff[1],adc_limit[1],0x00,0x7f));
}
if(adc_sample[2]>=adc_cutoff[2])
{
if(adc_sample[2]>=adc_limit[2])
adc_sample[2]=adc_limit[2];
midiSend(0x99,snare,map(adc_sample[2],adc_cutoff[2],adc_limit[2],0x00,0x7f));
delay(13); //sorry that my snare pad is too bouncy
}
if(adc_sample[3]>=adc_cutoff[3])
{
if(adc_sample[3]>=adc_limit[3])
adc_sample[3]=adc_limit[3];
midiSend(0x99,tom_bass,map(adc_sample[3],adc_cutoff[3],adc_limit[3],0x00,0x7f));
}
if(adc_sample[4]>=adc_cutoff[4])
{
if(adc_sample[4]>=adc_limit[4])
adc_sample[4]=adc_limit[4];
midiSend(0x99,crash_right,map(adc_sample[4],adc_cutoff[4],adc_limit[4],0x00,0x7f));
}
if(adc_sample[5]>=adc_cutoff[5])
{
if(adc_sample[5]>=adc_limit[5])
adc_sample[5]=adc_limit[5];
midiSend(0x99,tom_high,map(adc_sample[5],adc_cutoff[5],adc_limit[5],0x00,0x7f));
}
if(adc_sample[6]>=adc_cutoff[6])
{
if(adc_sample[6]>=adc_limit[6])
adc_sample[6]=adc_limit[6];
midiSend(0x99,tom_low,map(adc_sample[6],adc_cutoff[6],adc_limit[6],0x00,0x7f));
}
if(digitalRead(3)==HIGH)
{
kick_trig_flag=false;
}
if(digitalRead(3)==LOW)
{
if(kick_trig_flag==false)
{
midiSend(0x99,kick,0x7f);
kick_trig_flag=true;
}
}
delay(5); //This is the total sensitivity for all the pads
}
/*ADC Test
int val;
for(int i = 0; i < 8; i++) {
val = analogRead(i);
Serial.print("CH");
Serial.print(i);
Serial.print("\t Value=");
Serial.print(val);
Serial.print("\n");
delay(20);
}
Serial.print("\n");
delay(1000);
*/
/*MIDI Send Test
//This is a simple loop for you to check your MIDI bridge and synthesizer.
midiSend(0x99,hat_close, 0x45);
midiSend(0x99,kick, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
midiSend(0x99,snare, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
midiSend(0x99,kick, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
midiSend(0x99,kick, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
midiSend(0x99,snare, 0x45);
delay(300);
midiSend(0x99,hat_close, 0x45);
delay(300);
*/[/code]
可以选择串口转MIDI(9600bps)或真MIDI(31250bps)两种波特率,看你怎么方便连接了~
各个板子的灵敏度在程序中也可以调节。