//喇叭控制接腳
const int speaker = 7;
//樂曲速度
int tempo=250;
//低音頻率表 lfreqs[1]=>低音Do
int lfreqs[] = {0,131,147,165,175,196,220,247};
//中音頻率表 freqs[1]=>Do
int freqs[] = {0,262,294,330,349,392,440,494};
//高8度音頻率表 hfreqs[1]=>高音Do
int hfreqs[] = {0,523,587,659,698,784,880,988};
//高16度音頻率表 shfreqs[1]=>高16度音Do
int shfreqs[] = {0,1046,1175,1318,1397,1568,1760,1976};
float *s;
//小蜜蜂歌曲
float song1[]={
//音階,拍子
//高音 10=>Do 20=>Re ...
//中音 1=>Do 2=>Re ...
//低音 0.1=>Do 0.2=>Re ...
//0 休止符
5,1,3,1,3,2,
4,1,2,1,2,2,
1,1,2,1,3,1,4,1,
5,1,5,1,5,2,
5,1,3,1,3,2,
4,1,2,1,2,2,
1,1,3,1,5,1,5,1,
3,3,0,1,
2,1,2,1,2,1,2,1,
2,1,3,1,4,2,
3,1,3,1,3,1,3,1,
3,1,4,1,5,2,
5,1,3,1,3,2,
4,1,2,1,2,2,
1,1,3,1,5,1,5,1,
1,4
};
float song2[]={
//音階,拍子
5,1,3,1,3,2,
4,1,2,1,2,2,
1,1,2,1,3,1,4,1,
5,1,5,1,5,2,
5,1,3,1,3,2,
4,1,2,1,2,2,
1,1,3,1,5,1,5,1,
3,3,0,1,
};
void setup() {
pinMode(speaker,OUTPUT);
}
void loop() {
int freq;
int num;
//準備演奏第2首歌
num=sizeof(song2)/sizeof(float);
s=song2;
//開始讀取表格中的樂譜,開始演奏
for(int i=0;i<num;i+=2){
if(*(s+i)>10){ //判斷是不是高音
//讀取高音相對應的頻率
freq=hfreqs[int(*(s+i)/10)];
}else if(*(s+i)<1 && *(s+i)>0){ //判斷是不是低音
//讀取低音相對應的頻率
freq=lfreqs[int(*(s+i)*10)];
}else{
//讀取中音相對應的頻率
freq=freqs[int(*(s+i))];
}
tone(speaker,freq,*(s+i+1)*tempo);
delay(*(s+i+1)*tempo);
delay(tempo/20);
}
//演奏完就停止
while(1){
delay(1000);
}
}