宋曉婷
(山西建筑職業(yè)技術(shù)學(xué)院,山西 太原 030619)
MATLAB 是一種用于算法開發(fā)、符號(hào)運(yùn)算、數(shù)據(jù)可視化、數(shù)據(jù)分析以及數(shù)值運(yùn)算的高級(jí)技術(shù)計(jì)算語(yǔ)言和交互式環(huán)境.它的應(yīng)用范圍非常廣,包括信號(hào)和圖像處理、仿真、通訊、控制系統(tǒng)設(shè)計(jì)、測(cè)量和測(cè)試、建模和分析以及計(jì)算生物學(xué)等眾多應(yīng)用領(lǐng)域.它還被稱為矩陣實(shí)驗(yàn)軟件,可以進(jìn)行矩陣運(yùn)算、繪制函數(shù)和數(shù)據(jù)、實(shí)現(xiàn)算法、創(chuàng)建用戶界面、連接其他編程語(yǔ)言的程序等.可以編寫程序或調(diào)用存儲(chǔ)函數(shù)解決數(shù)學(xué)問題,如初等數(shù)學(xué)的代數(shù)計(jì)算、三角函數(shù)求值;高等數(shù)學(xué)中的微積分計(jì)算;線性代數(shù)求解行列式、矩陣、線性方程組;微分方程求通解、特解;進(jìn)行拉普拉斯變換,傅里葉級(jí)數(shù)的計(jì)算;還可以進(jìn)行數(shù)據(jù)的篩檢、對(duì)數(shù)據(jù)進(jìn)行插值擬合、對(duì)未來(lái)數(shù)據(jù)的估測(cè)、給出誤差分析等等多方面的應(yīng)用,可以說(shuō)是涉及面廣,功能強(qiáng)大.
先介紹一下樂理方面的相關(guān)知識(shí),關(guān)于簡(jiǎn)譜和琴鍵的對(duì)應(yīng)關(guān)系:基本音階(是以全音、半音以及其他音程順次排列的一串音)為C調(diào)大音階,在鋼琴上彈奏時(shí)全用白鍵,中央C是小字一組的do,也有D調(diào)、F調(diào)等.音階分為“大音階”和“小音階”,即“大調(diào)式”和“靶〉魘”.大音階由7個(gè)音組成,其中第3,4(即mi和fa)音之間和第7,8(即xi和高音do)音之間是半音程,其他音之間是全音程.小音階第2,3(即re和mi)音之間和5,6(即so和la)音之間為半音程.這里不同的音高決定不同的聲音頻率,在軟件中用不同的數(shù)值體現(xiàn),起到調(diào)節(jié)音調(diào)的作用,經(jīng)過數(shù)學(xué)公式調(diào)整可以模仿出原唱的效果.
本文在MATLAB中表示樂音所用的抽樣頻率為fs=22 050 Hz,也就是所1 s鐘內(nèi)有22 050個(gè)點(diǎn),根據(jù)抽樣點(diǎn)數(shù)的多少就可表示出每個(gè)樂音持續(xù)時(shí)間的長(zhǎng)短.給每個(gè)樂音定義存儲(chǔ)對(duì)應(yīng)的抽樣點(diǎn),再用sound函數(shù)播放即可.
選編歌曲《阿拉木汗》部分簡(jiǎn)譜
1=F 4/4
圖1 琴鍵與簡(jiǎn)譜的對(duì)應(yīng)
如圖,4/4分母的4表示曲譜以四分音符為一拍,分子的4表示每小節(jié)4拍.利用MATLAB編寫樂音需要區(qū)別每個(gè)音的節(jié)拍,確定其震動(dòng)時(shí)間,數(shù)字下兩橫表示這個(gè)音是四分之一拍,4個(gè)這樣的音為一拍;數(shù)字下一橫表示這個(gè)音是二分之一拍,即半拍,兩個(gè)這樣的音為一拍;數(shù)字下方無(wú)橫線表示這個(gè)音是一拍.數(shù)字之間的點(diǎn)代表半拍,這樣可知每小節(jié)各個(gè)音節(jié)均為四拍.1=F表示小字一組的f1對(duì)應(yīng)do的音,依次向前向后類推得表1.
表1 常用琴鍵調(diào)高、音高、頻率的關(guān)系
注:1)頻率是由公式f=440×2(p-69)/12根據(jù)p的值用MATLAB計(jì)算得到的.
2)由于mi與fa、高音mi與fa均是半音程,b1降1 和b2降1表示該鍵左側(cè)上方的黑鍵,音高只相差1.雖然低音xi與do的音高也只相差1,但在琴鍵上此處正好分別位于e1和f1的位置,它們正好也是半音程,所以無(wú)需降1.
3)表格只列出需要音高的數(shù)據(jù),可根據(jù)實(shí)際向前或向后適當(dāng)擴(kuò)展.
利用MATLAB的m文件編寫音調(diào)和節(jié)拍程序如下,這里將低音so到高音so每個(gè)音調(diào)的一拍、半拍和四分之一拍給出定義,這個(gè)范圍可以包括大多數(shù)歌曲的使用.若想保證所有曲譜的編寫,只需將琴鍵上各個(gè)組別的音調(diào)類比給出定義即可.
編寫m文件如下[1]:
function g=key(p,n,fs)
t=0∶1/fs∶4/n;
g=(sin(2*pi*fre(p)*t));
plot(g); %畫出函數(shù)圖像
function f=fre(p)
f=440*2^((p-69)/12).
由于每小節(jié)之間停頓的時(shí)間不同,要使歌曲聽起來(lái)更逼真,就需要將此部分也考慮上.在前段程序中加入條件語(yǔ)句if和else,給空拍增加定義,且不能簡(jiǎn)單地定義為0,它的時(shí)間受節(jié)拍的控制,因此表達(dá)式與時(shí)間t有關(guān),用0去乘之后,既有音調(diào)的無(wú)聲體現(xiàn),又涵蓋相應(yīng)的時(shí)間延續(xù),控制每個(gè)樂音持續(xù)的時(shí)間要符合節(jié)拍,在歌曲播放出來(lái)時(shí)就會(huì)有空拍了.
function g=key(p,n,fs)
t=0∶1/fs∶4/n;
if p==-1 %定義空拍
g=0*(sin(2*pi*fre(p)*t));
else
g=(sin(2*pi*fre(p)*t));
end
plot(g)
function f=fre(p)
f=440*2^((p-69)/12);
消除敲擊聲音這是由于相位不連續(xù)產(chǎn)生了高頻分量[2].這里可以類比實(shí)際中鐵軌的彎道和直線銜接處,如果直接相連則會(huì)產(chǎn)生曲率的突變,導(dǎo)致火車側(cè)翻或出軌,通常使用一個(gè)和軌道長(zhǎng)度及曲率半徑相關(guān)的三次函數(shù)來(lái)銜接,使曲率由0逐漸增大至彎道值再相連,這樣就不會(huì)有危險(xiǎn).我們可以采用指數(shù)衰減的包絡(luò)修正每個(gè)樂音,以保證在樂音的鄰接處信號(hào)幅度為0.給每個(gè)樂音加一個(gè)指數(shù)衰減的包絡(luò),使聲音有個(gè)減弱的過程,音調(diào)的清晰度增加,似有回聲效果.
function g=key(p,n,fs)
t=0∶1/fs∶4/n;
tt=4/n∶-1/fs∶0;
g=(sin(2*pi*fre(p)*t)).*exp(tt);
plot(g);
function f=fre(p)
f=440*2^((p-69)/12).
利用傅里葉技術(shù)在音樂中增加一些諧波分量[2],幅度要小于基波,不能掩蓋住主體的音樂聲調(diào),需要加強(qiáng)聲音的連貫程度.各個(gè)音結(jié)束時(shí)都有相對(duì)拉長(zhǎng)的一個(gè)減弱過程,尾部音尤其明顯.添加后聲音比較渾厚,圓潤(rùn)飽滿,在不會(huì)彈鋼琴的情況下也能自己譜曲,享受一下自己的勞動(dòng)果實(shí).
function g=key(p,n,fs)
t=0∶1/fs∶4/n;
tt=4/n∶-1/fs∶0;
if p==-1
g=0*(sin(2*pi*fre(p)*t)+0.2*sin(6*pi*fre(p)*t)).*exp(tt);
else
g=(sin(2*pi*fre(p)*t)+0.2*sin(6*pi*fre(p)*t)).*exp(tt);
end
plot(g);
function f=fre(p)
f=440*2^((p-69)/12).
如果聲音還比較尖銳,有些許刺耳,可能是選擇的基波頻率不合適,或者可以再加入另一種頻率的諧波,變換他們的系數(shù)進(jìn)行調(diào)試可達(dá)到良好的效果.
fs=22 050; %每秒振動(dòng)次數(shù),即頻率
t=0∶1/fs∶0.5; %每拍時(shí)間
c1-4=key(60,4,fs); %低音so一拍
c1-8=key(60,8,fs); %低音so半拍
c1-16=key(60,16,fs); %低音so四分之一拍
d1-4=key(62,4,fs); %低音la一拍
d1-8=key(62,8,fs); %低音la半拍
d1-16=key(62,16,fs); %低音la四分之一拍
e1-4=key(64,4,fs); %低音xi一拍
e1-8=key(64,8,fs); %低音xi半拍
e1-16=key(64,16,fs); %低音xi四分之一拍
f1-4=key(65,4,fs); %do一拍
f1-8=key(65,8,fs); %do半拍
f1-16=key(65,16,fs); %do四分之一拍
g1-4=key(67,4,fs); %re一拍
g1-8=key(67,8,fs); %re半拍
g1-16=key(67,16,fs); %re 四分之一拍
a1-83=key(69,8/3,fs); %mi 一拍半
a1-4=key(69,4,fs); %mi 一拍
a1-8=key(69,8,fs); %mi 半拍
a1-16=key(69,16,fs); %mi 四分之一拍
b1-4=key(70,4,fs); %fa 一拍
b1-8=key(70,8,fs); %fa 半拍
b1-16=key(70,16,fs); %fa 四分之一拍
c2-4=key(72,4,fs); %so 一拍
c2-8=key(72,8,fs); %so 半拍
c2-16=key(72,16,fs); %so四分之一拍
d2-4=key(74,4,fs); % la一拍
d2-8=key(74,8,fs); % la半拍
d2-16=key(74,16,fs); %la四分之一拍
e2-4=key(76,4,fs); %xi一拍
e2-8=key(76,8,fs); %xi半拍
e2-16=key(76,16,fs); %xi四分之一拍
f2-4=key(77,4,fs); %高音do一拍
f2-8=key(77,8,fs); %高音do半拍
f2-16=key(77,16,fs); %高音do四分之一拍
g2-4=key(79,4,fs); %高音re一拍
g2-8=key(79,8,fs); %高音re半拍
g2-16=key(79,16,fs); %高音re四分之一拍
a2-83=key(81,8/3,fs); %高音mi一拍半
a2-4=key(81,4,fs); %高音mi一拍
a2-8=key(81,8,fs); %高音mi半拍
a2-16=key(81,16,fs); %高音mi四分之一拍
b2-4=key(82,4,fs); %高音fa一拍
b2-8=key(82,8,fs); %高音fa半拍
b2-16=key(82,16,fs); %高音fa四分之一拍
c3-4=key(84,4,fs); %高音so一拍
c3-8=key(84,8,fs); %高音so半拍
c3-16=key(84,16,fs); %高音so四分之一拍
k-4=key (-1,4,fs); %空一拍
k-8=key (-1,8,fs); %空半拍
k-16=key (-1,16,fs); %空四分之一拍
part1=[c2-16 c2-16 c2-16 c2-16 c2-8 b1-8 a1-83 f2-8];%第十一部分重復(fù)
part2=[e2-16 d2-16 a2-16 g2-16 f2-16 d2-16 e2-8 f2-8 k-8 k-4];
part3=[c1-16 f1-16 f1-16 f1-16 e1-16 f1-16 g1-8 a1-83 f2-8];
part4=[e2-16 d2-16 c2-16 b1-16 a1-16 f1-16 g1-8 f1-4 k-4];%第十部分重復(fù)
part5=[k-8 c2-16 c2-16 c2-8 d2-8 f2-16 f2-16 f2-8 k-4];
part6=[k-4 f2-16 f2-16 f2-8 d2-16 f2-16 d2-16 c2-16 c2-8 k-4];
part7=[k-8 f2-16 f2-16 f2-8 f2-8 d2-16 f2-16 d2-16 c2-16 c2-8 a1-8];
part8=[k-8 c2-16 c2-16 a1-8 a1-8 g1-16 g1-16 a1-8 k-4];
part9=[c1-16 f1-16 f1-16 f1-16 f1-8 g1-8 a1-83 f2-8];
part12=[e2-16 d2-16 a2-16 g2-16 f2-16 d2-16 e2-8 f2-4 k-4];
part13=[c2-16 c2-16 c2-16 c2-16 c2-8 b1-8 a2-83 f2-8];
part14=[e2-16 f2-16 g2-16 a2-16 g2-16 d2-16 e2-8 f2-4 k-4];
line1=[part3 part4 part3 part4 part5 part6 part7 part8 part9 part4];
line2=[part1 part12];
line3=[part13 part14];
legend=[line1 line2 line3];
sound(legend,fs)
圖2 fs=1000波形振動(dòng)圖像
頻率可適當(dāng)調(diào)整,圖2是當(dāng)fs=1 000臨界值時(shí)的波形振動(dòng)圖像.頻率越大圖像越密,聲音越流暢,更接近原聲,通常取8 000,14 400等;頻率取值越小圖像分割越粗糙,聲音不流暢,間隔明顯,聽起來(lái)與原聲相差甚遠(yuǎn).如fs=200則出錯(cuò),低于1 000為無(wú)效的樣本率.利用clear sound命令可以隨時(shí)停止音樂播放.
本設(shè)計(jì)用MATLAB構(gòu)建的音樂合成程序簡(jiǎn)單易懂,可靈活多變,成功地實(shí)現(xiàn)了音樂的簡(jiǎn)單合成、音樂的降噪處理以及音樂的加傅里葉變換諧波處理,使得生澀的音樂逐步調(diào)整為優(yōu)美動(dòng)聽的聲音.利用軟件的強(qiáng)大功能實(shí)時(shí)給出相應(yīng)頻率分析圖像,更清晰地顯示曲子的頻率與曲調(diào)的關(guān)系.我們可以充分發(fā)揮自己的創(chuàng)新能力,通過選取不同的加工算法,對(duì)音樂分別處理,抑制噪聲,改善音樂質(zhì)量,便于人們欣賞品鑒.