音樂盒(查表法-指標變數)

學習如何學習!

//喇叭控制接腳 
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);
  }  

}


發佈留言