【偽教程】手把手教你成為matlab作曲家
為了不被槍斃決定開一個小系列,慢慢填坑。
警告:本教程不涉及任何樂理知識,但涉及部分數理和編程,請小心觀看。
構成聲音最基本的成分是什麼?根據傅里葉的回答:是正弦波。正弦波可以用來線性組合成幾乎所有的聲音,而且最基礎的單個正弦波已經可以組成基本的音高感,因此也可以被用來創作音樂。
在matlab的command window中輸入:
Fs=4000 ;Td=1 ;Ft=1000 ; s=sin([1:Fs*Td]*2*pi*Ft/Fs); sound(s,Fs)
後回車,能聽到一個1kHz的純音,以上變數中:Fs為採樣率,本例中為3kHz;Td為純音的持續時間,本例中為1s;Ft為音高,本例為1kHz。
一般來說採樣率至少是聲音最高頻率的2倍以上,至於低於這個數字會怎樣,建議感興趣的可以嘗試一下,改改參數。原理參照:採樣定理_百度百科
在matlab中,1:x這種表達等同於數組[1,2,3,…,x ],意即x個採樣點上,數值呈等差數列排布。經過這個等差數列經過公式 s=sin([1:Fs*Td]*2*pi*Ft/Fs)運算後就得到了正弦波的值了。
成功播放一次聲音之後,輸入以下指令:Ft=1500 ; s1=sin([1:Fs*Td]*2*pi*Ft/Fs); s2=[s,s1];sound(s2,Fs)
這次操作是將兩次生成的不同音高的數列前後拼接到一起,就可以生成旋律啦!是不是很高級(並沒有)。這種操作是有一些問題的,不過寫個一句兩句玩一玩還好。
matlab最為大名鼎鼎的就是作為「矩陣實驗室」(這個名稱為直譯),它的所有運算單位都為矩陣或者數組,本案例的運算也是如此,3000個採樣點的等差數列數值經公式轉換後變成了3000個正弦波數列的值,再經由sound(s,Fs)播放出來。
至於這個公式是怎麼工作的,以及最後一條指令是如何將數組變成聲音從揚聲器/耳機放出來,私以為是碼農最不需要關心的問題了(筆者也不太想談數學和硬體),所以本次偷懶教程到此為止(下次寫什麼也還沒想好)。再見!
參考文獻:
Applied Speech and Audio Processing: With MATLAB Examples ,Ian McLoughlin
推薦閱讀:
※我從編程總結的 22 個經驗
※CMD有哪些有趣的命令?
※【philippica】一次linux 下stack overflow實驗
※Kotlin傳教文 中(inline略解)