利用MATLAB对乐曲进行钢琴演奏【matlab调音_1】
/*僅當作學習筆記,若有紕漏歡迎友好交流指正,此外若能夠提供一點幫助將會十分榮幸*/
?
摘要:本文首先對鋼琴結(jié)構(gòu)以及matlab發(fā)聲原理進行簡單介紹。然后利用matlab擬合鋼琴的發(fā)聲,基于十二平均律利用sound函數(shù)編曲,并利用包絡函數(shù)對鋼琴聲音進行優(yōu)化。
圖1 Matlab發(fā)聲基本流程圖?
關(guān)于鋼琴的基礎(chǔ)知識
1鋼琴的基本結(jié)構(gòu)
1、擁有88個琴鍵,其中52個白色琴鍵,36個黑色琴鍵。第1號琴鍵為A2,第88號琴鍵為c5
圖2 鋼琴琴鍵與大譜對照表
2、第1號琴鍵A2為最低音,發(fā)出樂音的基頻為27.5Hz,第88號琴鍵c5為最高音,發(fā)出樂音的基頻為4186.01Hz。
3、鋼琴上存在著一個國際基準音,為第49號琴鍵a1,也就是小字一組的第6個白鍵,其發(fā)出樂音的基頻為440Hz(也稱作標準音)。
4、鋼琴是遵循十二平均律制制作的樂器,鋼琴上每相鄰的兩個琴鍵(包括黑、白琴鍵)的頻率差異稱為半音。半音是十二平均律體系中最小的頻率差異距離,即最小的音高距離。將一個八度音程十二等分為十二個半音,其數(shù)學意義為:
八度音程指的是從基頻至兩倍頻率的范圍。因此在八度音程中分為十二等分乃是把這個頻率范圍分為十二個等比級數(shù),其結(jié)果就是每個后續(xù)音的基頻為前一個音的1.059463 倍。
、分別為前后兩個音
表1 十二平均律對照表
2利用matlab模擬鋼琴發(fā)聲的原理
聲音是一種常見的物理現(xiàn)象。物體機械振動形成聲波,借助空氣媒介,傳至人類的耳膜,引起神經(jīng)反射,被人類感知為聲音,人腦又對聲音信號快速翻譯成人類可以理解的語言、音樂和各種已知的聲音。人類能感知的聲音在每秒振動數(shù)為20-20000次左右,即20 Hz-20000 Hz的頻率范圍。
音樂中使用的樂音通過長期改良、調(diào)整,已形成了固定組合,能夠表達作曲者的感情,傳遞作曲者的思想,形成音樂文化。考慮到人耳對聲波頻率的感知能力,音樂樂音被限定在27-4100 Hz的頻率范圍內(nèi),超過這個頻率范圍,人類不能清晰地感知,對表現(xiàn)塑造音樂形象的意義不大。
樂器的樂音音高特征對應振動頻率
樂音音長特征對應振動的持續(xù)時間長短
樂音的音強特征對應振動的振幅
樂音的音色特征對應著振動的頻譜分布
因此樂音特征由振動波的頻率、時長、振幅、頻譜四種物理量所決定。樂音四種物理量是樂器具有完美表現(xiàn)與感染效果不可缺失的四大元素,所以對樂音的研究,應首先從物理學入手。物理學研究發(fā)現(xiàn),聲音的音高和聲波的振動頻率關(guān)系密切,琴弦振動時,觀察振動的波形圖,兩個相鄰同方向峰值之間的間隔時間稱為振蕩周期,琴弦振動周期越短,則振動頻率越高,表現(xiàn)為產(chǎn)生的聲音音高越高。
簡而言之,要想利用matlab簡單的發(fā)出一段聲音,只要找到該聲音對應的頻率、音長,并且最好利用包絡函數(shù)稍加潤色,然后利用程序進行相應發(fā)聲即可。
正文
1樂曲識譜
這里以孫燕姿《遇見》的第一句歌詞為例,其對應簡譜見下圖3。
圖3 《遇見》第一句歌詞簡譜
《遇見》為一首四四拍(四分音符為一拍,每小節(jié)四拍)的樂曲。在第一節(jié)中前3個“0”表示休止符,“5 3”表示兩個八分音符。(由于這里是音樂簡譜相關(guān)知識,就不班門弄斧了,故不作過多介紹)
2根據(jù)十二平均律表找到每個音對應頻率
為了便于計算,這里我們?nèi) 队鲆姟返那{(diào)為1=C(與實際樂譜中的曲調(diào)不相同),即簡譜音符”1”對應“do”。我們?nèi)≈幸魠^(qū)的小字一組,查看表1,即音符”1”對應的頻率為523Hz。以此類推計算出第一句歌詞中各樂音對應的頻率如表2所示。
| 5 | 3 | 3 | 5 | 2 | 2 | 3 | 2 | 2 | 1 | 1 |
| 784 | 659 | 659 | 784 | 587 | 587 | 659 | 587 | 587 | 523 | 523 |
表2 《遇見》第一句歌詞對應音符頻率
3將頻率以及音長(節(jié)奏)信息輸入到一個函數(shù)中存儲
為了能夠利用sound函數(shù)播放聲音,需滿足sound(y,Fs)的結(jié)構(gòu),其中 Fs代表采樣率,取為Fs=8192(matlab的默認采樣率區(qū)間為1000-38400,超出這個區(qū)間就不能播出聲音了)。而y代表音頻信號矩陣,我們將前面得到的音符頻率代入到正弦函數(shù)中得到一個信號值:
并且,為了使音樂具備基礎(chǔ)的節(jié)奏(即使得每一個音符有長有短),我們引入另外一個量rhythm,它用于控制每個音符的長度。例如二分音符對應的rhythm值就大于四分音符對應的rhythm值。則音頻信號矩陣y就可以表示為:
4利用包絡函數(shù)潤色聲音
利用plot函數(shù),可得信號矩陣y對應的聲音波形為:
圖4 未進行包絡處理的聲音波形
從上圖中的波形可以看出,聲音幾乎沒有起伏,聲音播放出來人耳也只會聽到一段長長的“嗶”,這顯然是8行的,于時在此基礎(chǔ)上我們利用包絡函數(shù)對其進行潤色。最常見的包絡函數(shù)為指數(shù)衰減,最簡單衰減方式是對每個音乘以因子。當我們對原始信號使用函數(shù)進行包絡,得到的波形為
圖5 包絡函數(shù)處理后的聲音波形
5利用sound函數(shù)進行發(fā)聲
接下來的工作就很機械了,我們只需要將上面根據(jù)譜子得到的音符頻率、音長等信息導入正弦函數(shù),然后利用包絡函數(shù)潤色,并最終利用sound(y,Fs)函數(shù)發(fā)聲即可。
展示部分程序: 《遇見》主程序: Fs=8192; %聽見 冬天 的離開 y1=gen_wave_C5(8,0.5); y2=gen_wave_C5(5,0.7); y3=gen_wave_C5(8,0.5); y4=gen_wave_C5(3,0.7); y5=gen_wave_C5(5,0.5); y6=gen_wave_C5(3,0.55); y7=gen_wave_C5(1,0.7); y=[y1,y2,y3,y4,y5,y6,y7]; %我在某年某月 醒過來 y1=gen_wave_C5(1,0.4); y2=gen_wave_C4(12,0.5); y3=gen_wave_C4(10,0.4); y4=gen_wave_C4(12,0.5); y5=gen_wave_C5(1,0.4); y6=gen_wave_C4(12,0.5); y7=gen_wave_C5(1,0.5); y8=gen_wave_C5(3,0.5); y9=gen_wave_C5(5,0.65); y=[y,y1,y2,y3,y4,y5,y6,y7,y8,y9]; %播放聲音 sound(y,Fs);《遇見》gen_wave函數(shù)程序(包括指數(shù)衰減包絡處理) %音調(diào)函數(shù)C5(音高,節(jié)奏) function y= gen_wave_C5( tone,rhythm ) %定義采樣頻率 Fs=8192; x=linspace(0,2*rhythm*pi,floor(rhythm*Fs));%floor朝負無窮方向取整,保證采樣頻率為整 %定義基礎(chǔ)音階對應的頻率(C,C#,D,D#,E,F,F#,G,G#,A,A#,B) freqs=[521,556,586,618,660,695,742,782,835,880,927,990]; %聲音 y=sin(freqs(tone)*x).*exp(-1*x); end總結(jié)
以上是生活随笔為你收集整理的利用MATLAB对乐曲进行钢琴演奏【matlab调音_1】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11111111111111111111
- 下一篇: FPGA学习笔记_图像处理3_FPGA实