# 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 個目前正在播放的音符。
---
```Arduino=
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顯示播放的音符。
---
```Arduino=
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七個音階,並利用另外三個按鍵開關 切換成 低/中/高音模式。
---
```Arduino=
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);
}
}
```