arduino+无源蜂鸣器制作音乐《诺言》(实战篇)——从识读简乐谱到程序编写
前言:
上一章博客已經介紹了無源電磁式蜂鳴器的結構和工作原理!
看看我制作的音樂效果
arduino+無源蜂鳴器制作音樂
這是我們小時候看過的動畫片《洛洛歷險記》的主題曲《諾言》!!!這里我只展示了一部分!
?
在開始編程之前需要先識讀簡樂譜,與音符頻率對照表相結合!
先大概普及一下樂理知識:
1=bB 是指:簡譜上的1等于五線譜中的降B(即降si)
4/4 是節拍,意思是以四分音符為一拍,每小節有四拍
音符節奏分為一拍、半拍、1/4拍、1/8拍,我們規定一拍音符的時間為1;半拍為0.5;1/4拍為0.25;1/8拍為0.125……,
所以我們可以為每個音符賦予這樣的拍子播放出來,音樂就成了。
規律就是時間上單個音符沒有下劃線,就是一拍(1),
有下劃線是半拍(0.5),
兩個下劃線是四分之一拍(0.25),
有“—”=前面音符的拍子+1【有幾個+1就有幾拍】;
如果音符后面帶“·”點,那么這個音符的拍子+0.5
頻率上就是按照音符是否帶點,點在上還是在下到下表中查找就可以了。
音符頻率對照表|||||
?從簡譜照片的左上角可以看到,這首歌曲的音調為E調,那么E調所對應的音符頻率我已經用綠色方框給框出來了!
1、識讀音符對應的頻率
現在我們已經知道整首曲子的音調為E調,那么如何從簡譜上面去看音符呢?
例如這段:它所對應的音符頻率,我用編程怎么寫呢?
?0默認等于-1(整首歌曲都是的)。數字上面有點代表高音,下面有點代表低音,不帶點則是中音,先這么理解。(這樣就可以在對應的音符頻率對照表里面去找了)
就是像下面這樣編程的:(你可以像我一樣,定義完頻率再寫到程序里,也可以直接像下面這樣把頻率直接寫進去,你隨意!!!)
-1,393,
661,624,661,700,661,
624,495,624,
556,
-1,-1,-1,393,
2、如何把簡譜中的節拍以程序的方式寫出來
從剛才的樂理知識當中,我們知道了有一條下劃線是0.5拍,有兩條下劃線是0.25拍,沒有下劃線則是1拍,音符后面有橫線是表示前面的音符+1,有幾個橫線就+幾個1,有點則前面的音符+0.5......接下來我還是用下面這一段來舉一個例子展示拍子用程序怎么寫
注意:0也代表1拍(整首歌曲都是的)
0.5,0.5,
1+1+1,0.25,0.25,0.25,0.25,
1+1+1,0.5+0.5,0.25,
1+1+1+1,
1,1,1,1,
?
準備好之后,我們開始吧!!!
需要準備的材料
1、無源蜂鳴器(直插式)
2、Arduino UNO板
3、杜邦線(兩根)
接線圖:
?
?編程邏輯:
?
?
程序部分:
/*把每一個音符對應的頻率都定義出來*//*低音部分*/ #define A0 -1 #define A1 165 #define A2 175 #define A3 196 #define A4 221 #define A5 248 #define A6 278 #define A7 312/*中音部分*/ #define B1 330 #define B2 350 #define B3 393 #define B4 441 #define B5 495 #define B6 556 #define B7 624/*高音部分*/ #define C1 661 #define C2 700 #define C3 786 #define C4 882 #define C5 990 #define C6 1112 #define C7 1248/*定義所有E調的節拍*/ #define WHOLE 1 #define HALF 0.5 #define QUARTER 0.25 #define EIGHTH 0.25 #define SIXTEENTH 0.625int num[]= {A0,B3,C1,B7,C1,C2,C1,B7,B5,B7,B6,A0,A0,A0,B3,/*第一行*/C1,B3,B7,B5,B6,B6,B6,B5,B4,B3,B3,C1,B5,/*第二行*/C2,A0,B5,B6,C1,B7,B5,B6,B6,A0,A0,A0,B3,C1,C1,C1,B6,/*第三行*/B7,B3,B3,A0,B5,B6,B6,B6,B5,B4,B3,A0,B3,C1,C1,C1,B5,/*第四行*/B7,C2,C2,A0,B5,C4,C4,C4,C1,C2,C3,/*第五行*/ };float zi[]={0.5,0.5,1+1+1,0.25,0.25,0.25,0.25,1+1+1,0.5+0.5,0.25,1+1+1+1,1,1,1,1,/*第1行*/1+1+1,1,1+1+1,1,1+0.5,0.5,0.5,0.5,1,1+1+1,1,1+1+1,1,/*第2行*/1+1+1,0.5,0.5,1,0.5,1,0.5,1,1+1+1+1,1+0.5,0.5,1,1,/*第3行*/1,0.5,1+0.5,0.5,0.5,1+0.5,0.5,0.5,0.5,1,1+1,1,1,1+0.5,0.5,1,1,/*第4行*/1+0.5,0.5,1,0.5,0.5,1+0.5,0.5,0.5,0.5,1,1+1+1+1,/*第5行*/ };int changdu;//此定義用存儲音符長度 int tonepin = 3;//這個就是輸出端口void setup()//子函數 {pinMode(tonepin,OUTPUT);changdu=sizeof(num)/sizeof(num[0]); }void loop() {for(int x=0;x<changdu;x++){tone(tonepin,num[x]);delay(500*zi[x]); //這里用來根據節拍調節延時,500這個指數可以自己調整,在該音樂中,我發現用500比較合適。noTone(tonepin);}delay(2000); }?
?
?
總結
以上是生活随笔為你收集整理的arduino+无源蜂鸣器制作音乐《诺言》(实战篇)——从识读简乐谱到程序编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 C++实现 基于不同策略的英文
- 下一篇: 算法的稳定性matlab,基于MATLA