arduino编乐谱_把乐谱播出来,自制简谱播放库
關注我們微信的童鞋可能還記得,昨天我發了一章關于UNO+喇叭就可以播放歌曲的文章。
文章到最后也沒有完成整個天空之城歌曲。因為實在是太麻煩了。。于是今天就苦思冥想,想借此機會整理出一個簡譜的播放程序。借此來播放所有簡譜寫成的歌曲。既能提高復用性,也很有趣
那么既然要寫庫,我們來一步步分析我們要完成的工作吧:1、如何把簡譜用程序里的數據表示出來。2、表示出來的數據如何解析。3、解析出來的數據如何播放。
來看看我分解出來的三個問題,可以看到第三個問題非常簡單,之前的文章已經解決了這個問題。一個普通的UNO+一個小喇叭+Arduino的tone函數就可以搞定。
一、那么先來解決第一個問題:如何把簡譜用程序里的數據表示出來。這里設計到我們如何來設計這個存儲數據的結構的問題。一開始我是想兼容現有的樂譜的格式的。現有的樂譜格式倒是有一些,但是卻沒找到相關的資料,所以也沒辦法兼容了。所以我只能做一個沒辦法的辦法,自己設計這個數據。Arduino使用的是C++語言,數據處理相比較起高級語言是比較麻煩的,而且芯片本身速度也比較慢,所以我選擇的是最簡單的方案,用字符串來存儲。那么問題來了,我們有哪些數據需要保存?先來看看簡譜。
看了譜子眼花繚亂。。。簡單介紹下:
數字代表音調 1234567分別代表do re mi fa sol la xi數字下面的點代表下降一個8度數字上面的點代表上升一個8度和數字同樣的橫線 “-”代表延長數字下方有橫線,代表8分音符。2個橫線代表16分音符。數字前面的#代表這個音調要升半調。
可以看見樂譜上的信息很多,那么我們要一一記錄這些信息,最終我設計的數據是這樣的。
舉個例子:n61f4,n71f4,n10f34,n71f4,n10f3,n30f3代表以下音符。
n代表沒有#號,如果有#,則用s代替。6代表la1f代表6下面有1個點,若上面有一個點則用1s代替4代表這個音符是8分音符1代表全音符
2代表2分音符3代表4分音符4代表8分音符5代表16分音符6代表32分音符可以看見第三個音符后面有個點,這個叫延長符號,及要延長他本身一半的時間,他是一個4分音符,點就代表要延長8分音符的時間。所以f后面有2個數字34,這樣即可延長時間。這樣就基本把簡譜表示出來了。
二、我們再來解決第二個問題解析我們表示的數據。C++解析字符串比較麻煩,所以設計的時候每個音符都用‘,’隔開,這樣就方便解析。解析函數如下。
void MELODY::playMelody(char *Melody,int playSpeed){ const char d = " ,"; char p; char cgy[10]; int noteDuration=0; int i,j; uint8_t thisNote1=0,thisNote2=0; p = strtok(Melody,d); sprintf(cgy, "%s", p); while(p) { char note[]="0000000000"; noteDuration=0; for (i=0;(p+i)!='\0';i++){ note=(p+i); } for (int j=4;jdebug) this->serial->println(noteDuration); if (note[]=='n'){ switch (note[1]){ case '1':thisNote1=0; break; case '2':thisNote1=2; break; case '3':thisNote1=4; break; case '4':thisNote1=5; break; case '5':thisNote1=7; break; case '6':thisNote1=9; break; case '7':thisNote1=11; break; } } else if (note[
頭文件中,我將每個音對應的頻率設置成為一個數組,方便解析。
至此,左右的工作的都完成了,只需要將簡譜輸入成我剛才的格式就可以播放音樂啦,當然還是比較麻煩,但比上次的效率高了很多,上次2個小時大概輸入了1半,這次半個小時就輸入了整首歌。
現在附上程序的地址,想要庫的可以去下載哦:https://github.com/rainbowyu/LD_ArduinoLib/tree/V1.02如果喜歡觀看類似科技新奇事物,以及了解創客圈最新資訊,或者您對Arduino有所耳聞,可以關注我們微信公眾號,一定會帶給您最新的資訊,最實用的教程,以及創客最新的玩意。
總結
以上是生活随笔為你收集整理的arduino编乐谱_把乐谱播出来,自制简谱播放库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更换新口号 ,发力雄安,李彦宏在百度AI
- 下一篇: Atlassian Crowd实现JIR