【摘要】聲音的響度與聲波振動的幅度有關(guān),而聲波的頻率主要影響音調(diào)。通過儲存音符的頻率以及時長,再循環(huán)遍歷,就能合成了多音軌的樂曲。本文就是通過識別五線譜來合成雙音軌的樂曲,matlab仿真波形實現(xiàn)樂曲的音調(diào)與節(jié)奏的變化。為了進一步使樂曲聽起來更加和諧,用ADSR實現(xiàn)對音樂響度的調(diào)整。使之對人耳更友好。
【關(guān)鍵詞】音樂合成器;matlab;頻率;ADSR
數(shù)字化已經(jīng)在很多領(lǐng)域有廣泛的應(yīng)用,給人們的生活帶來了極大的方便。同樣,音頻信號也可以通過數(shù)字化來實現(xiàn),當代音樂合成的發(fā)展經(jīng)歷了電子模擬、數(shù)字模擬、采樣回放、物理模型4個階段,其中數(shù)字合成法由于具有良好的靈活性和穩(wěn)定性而被人們普遍接受。在數(shù)字音樂合成器的設(shè)計中,將MATLAB作為仿真工具,以五線譜為例研究出基于MATLAB進行數(shù)字音樂合成器的設(shè)計方法,并結(jié)合ADRS進行改進,使之更適合聆聽。
一、樂理實驗準備
在五線譜的五根等距離的平行橫線上,線上和線間都代表不同的音符,同時可以再五線譜的上方或下方加線或間,在五線譜上音的位置愈高,音也愈高,反之音的位置愈低,音也愈低。五線譜音符與簡譜音階對應(yīng)的對照圖如下。
圖1 五線譜的線和間
圖2五線譜、簡譜音階對照示意圖
二、音樂合成存儲準備
圖3鍵盤樣式和按鍵編號
在上述鍵盤中,我們將A4鍵即編號為49的按鍵的頻率作為基準頻率,該鍵被命名為A-440,表示它的頻率是440Hz,由于每個音階相隔12個按鍵,那么每兩個按鍵之間的頻率跨度為2的12分之一Hz。這樣可以計算得出編號為44的按鍵的頻率為440×2(44-49)/12Hz。由此可以得出更加一般的頻率計算公式:
freq=440×2(keynumber-49)/12
這樣,只要我們能得到每個按鍵的編號,經(jīng)過上述公式變換,便能得到每個按鍵的頻率。頻率的大小反映了音調(diào)的高低,記錄音符的頻率就相當于決定了按鍵在琴盤的位置。在解決了每個按鍵的頻率問題之后,接下來還有一個問題要解決:每個音符持續(xù)的時間。在五線譜中,不同的音符代表不同的長度。音符有以下幾種:全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符。我們可以通過識別每個音符的外形來判斷其持續(xù)的節(jié)拍數(shù)。然后再把所有的節(jié)拍數(shù)存儲起來,就可以得到所有音符的時長了。
圖4樂譜截圖
比如在上面的五線譜截圖中,在Violin1音軌,4/4表示以4分音符為一拍,每一節(jié)4拍。例如,在第一小節(jié)中前兩個音符各占一拍,第三個音符占一拍半,第四個音符占半拍。而第一個節(jié)拍中的四個音符的pulse數(shù)分別為4,4,6,2,對pulse單位的說明如下:
圖5BMP算法
我們存儲的時長是以pulse為單位的,所以乘以該變量就可以完成從樂譜節(jié)拍到存儲音符時長的轉(zhuǎn)換,得到每個音符持續(xù)的時間。至此,讓MATLAB函數(shù)發(fā)出完整的旋律的所有要素我們已經(jīng)準備好了。
三、數(shù)據(jù)存儲
我們得到了每個音符的頻率和時長,我們將數(shù)據(jù)存儲在.mat文件中,mat文件不是文本格式的,而是二進制的,通過Matlab的load命令可以打開。下面是依次打開的過程:
圖6 加載mat后的視圖
這里的兩個結(jié)構(gòu)體表明是對應(yīng)的樂譜是雙音軌。兩個音軌疊加,可以得到更加悅耳的和弦。
圖7每個結(jié)構(gòu)體的成員變量
這是每個結(jié)構(gòu)體里的成員變量,其中keys對應(yīng)的是按鍵的編號,durations對應(yīng)的是每個音符持續(xù)的時長,以pulse為單位。
圖8 keys成員變量的值的集合
這是打開keys成員變量后的視圖,可以很清楚的看到,這是按鍵的編號集合。通過循環(huán)遍歷,我們就可以得到每個按鍵的頻率。
四、Matlab結(jié)構(gòu)體仿真
Matlab的結(jié)構(gòu)體不用預(yù)先定義,直接使用即可。實例代碼如下:
x.Amp=7;
x.phase=-pi/2;
x.freq=100;
x.fs=11025;
x.timeInterval=0:(1/x.fs):0.05;
x.values=x.Amp*cos(2*pi*(x.freq)*(x.timeInterval)+x.phase);
x.name='SinSignal';
%----echothecontentsofthestructure\"x\"
plot(x.timeInterval,x.values);
title(x.name);
上述代碼的運行效果如下:
圖9驗證結(jié)構(gòu)體使用方法得到的正弦波形
程序流程圖:
圖10程序流程圖
五、實驗改進(ADSR)
ADSR用來調(diào)整合成的音樂的幅度,使之對聽眾的耳朵更加友好。x(t)=E(t)cos(2πfkeyt+Φ)
公式中的E(t)就是我們應(yīng)該施加的窗函數(shù)。一種普遍的做法是,利用一下函數(shù)來實現(xiàn):
圖11ADSR實例
對上述四個參數(shù)的解釋如下:(1)起音(attack):這段決定聲音從開始發(fā)出到最初的最大音量所需的時間長短。在打擊樂音色里這部分當然要很短。(2)衰減(delay):在聲音達到最大音量后立即發(fā)生衰減的時間長短,衰減后的音量大小就是后面保持的音量大小。(3)保持(sustain):他決定在衰減后音量保持的大小,與其他三個不同的是他并不代表保持的時間長短,形象的說當你按下鍵盤不松手,持續(xù)發(fā)聲時的音量大小就是保持決定的,你按多長時間他就保持多長時間,所以他不代表時間長短。通常保持的音量都低于起音的最高音量,不過也有相同甚至高出起音音量的。(4)釋音(release):這是聲音最后的階段,代表著聲音從保持的音量逐漸衰減到0電平(最小音量)的時間長短。
用matlab設(shè)計數(shù)字音樂合成器,很大程度上發(fā)揮了matlab的數(shù)字信號處理優(yōu)勢。本方案采用數(shù)字頻率合成發(fā)實現(xiàn)樂曲音調(diào)的合成,實現(xiàn)了數(shù)字信號處理的原理的研究,對于研究更加精湛的技術(shù)如嵌入式音樂合成系統(tǒng)等都有很大的幫助。
參考文獻
[1]李云鴻,胡修林,張?zhí)N玉.基于人耳聽覺模型的語音質(zhì)量客觀評價方法[J].華中理工大學(xué)學(xué)報.2000,28(5)63~65
[2]毛春靜,關(guān)永,劉永梅,吳敏華,劉旭敏.數(shù)字音樂合成器的研究與設(shè)計[J].計算機工程與應(yīng)用.2009,45(6)89~91