Try  HackMD Logo HackMD

3.音樂盒與電子琴(ArduinoDemo3)

tags: ArduinoDemo

分類:音樂盒與電子琴
總覽:
26-2利用Arduino板播放鋼琴入門音樂—小星星(Little Star)。小星星
簡譜如表11-3 所示,每一段有4 小節,每小節有4 拍,演奏速度是每分鐘120 拍。並使用6 個LED 顯示C、D、E、F、G、A 等6 個目前正在播放的音符。

32-2使用1 個TACK 按鍵開關SW,控制播放四首音樂,同時使用LED顯示播放的音符。

33-1使用七個按鍵開關實作一電子琴,要有C、D、E、F、G、A、B七個音階,並利用另外三個按鍵開關 切換成 低/中/高音模式。


26-2利用Arduino板播放鋼琴入門音樂—小星星(Little Star)。小星星簡譜如表11-3 所示,每一段有4 小節,每小節有4 拍,演奏速度是每分鐘120 拍。並使用6 個LED 顯示C、D、E、F、G、A 等6 個目前正在播放的音符。

const int speaker=2; char toneName[]="CDEFGAB"; unsigned int frequency[7]={523,587,659,694,784,880,988}; byte led[]={14,15,16,17,18,19,20}; char beeTone[]="CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC"; byte beeBeat[]={1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2}; const int beeLen=sizeof(beeTone); unsigned long tempo=120; int i,j; void setup() { } void loop() { for(i=0;i<beeLen;i++) playTone(beeTone[i],beeBeat[i]); delay(3000); } void playTone(char toneNo,byte beatNo) { unsigned long duration=beatNo*60000/tempo; for(j=0;j<7;j++) { if(toneNo==toneName[j]) { tone(speaker,frequency[j]); analogWrite(led[j],255); delay(duration); noTone(speaker); analogWrite(led[j],0); } } }

32-2使用1 個TACK 按鍵開關SW,控制播放四首音樂,同時使用LED顯示播放的音符。

const int speaker=2; const int sw=4; const int debounce=20; char toneName[]="CDEFGAB"; unsigned int frequency[7]={523,587,659,694,784,880,988}; byte led[]={14,15,16,17,18,19,20,3}; char beeTone[]="GEEFDDCDEFGGGGEEFDDCEGGEDDDDDEFEEEEEFGGEEFDDCEGGC"; char starTone[]="CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC"; char tigerTone[]="CDECCDECEFGEFGGAGFECGAGFECCGCCGC"; char trainTone[]="GGECGGECDEFFEFGGGEGEDECFDDDECCCDEFDCBC"; byte beeBeat[]={1,1,2,1,1,2,1,1,1,1,1,1,2, 1,1,2,1,1,2,1,1,1,1,4, 1,1,1,1,1,1,2,1,1,1,1,1,1,2, 1,1,2,1,1,2,1,1,1,1,4}; byte starBeat[]={1,1,1,1,1,1,2,1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,1,1,1,1,1,2}; byte tigerBeat[]={1,1,1,1,1,1,1,1,1,1,2,1,1,2, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2}; byte trainBeat[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2}; unsigned long tempo=180; const int beeLen=sizeof(beeTone); const int starLen=sizeof(starTone); const int tigerLen=sizeof(tigerTone); const int trainLen=sizeof(trainTone); int len=0; int num; int keyVal=0; void setup() { pinMode(sw,INPUT_PULLUP); } void loop() { if(digitalRead(sw)==0) { delay(debounce); while(digitalRead(sw)==0) ; keyVal++; if(keyVal>4) keyVal=0; num=0; if(keyVal==1) len=beeLen; else if(keyVal==2) len=starLen; else if(keyVal==3) len=tigerLen; else if(keyVal==4) len=trainLen; } if(keyVal==1 && len>0) { playTone(beeTone[num],beeBeat[num]); num++; len--; } else if(keyVal==2 && len>0) { playTone(starTone[num],starBeat[num]); num++; len--; } else if(keyVal==3 && len>0) { playTone(tigerTone[num],tigerBeat[num]); num++; len--; } else if(keyVal==4 && len>0) { playTone(trainTone[num],trainBeat[num]); num++; len--; } } void playTone(char toneNo,byte beatNo) { unsigned long duration=beatNo*60000/tempo; int j; for(j=0;j<7;j++) { if(toneNo==toneName[j]) { tone(speaker,frequency[j]); analogWrite(led[j],255); delay(duration); noTone(speaker); analogWrite(led[j],0); } } }

33-1使用七個按鍵開關實作一電子琴,要有C、D、E、F、G、A、B七個音階,並利用另外三個按鍵開關 切換成 低/中/高音模式。

const int speaker=2; const int key[]={11,12,13}; const int sw[]={4,5,6,7,8,9,10}; const int toneTable[7][5]={ { 66, 131, 262, 523, 1046}, // C Do { 74, 147, 294, 587, 1175}, // D Re { 83, 165, 330, 659, 1318}, // E Mi { 88, 175, 349, 698, 1397}, // F Fa { 98, 196, 392, 784, 1568}, // G So {110, 220, 440, 880, 1760}, // A La {124, 247, 494, 988, 1976} // B Si }; int i; int val; void setup() { for(i=0;i<8;i++) pinMode(key[i],INPUT_PULLUP); pinMode(sw[i],INPUT_PULLUP); } void loop() { for(i=0;i<8;i++) { val=digitalRead(sw[i]); if(val==0) tone(speaker,toneTable[i],100); } }