田佳鷺
(沈陽師范大學(xué),沈陽110034)
音樂由音調(diào)、節(jié)奏、和聲、音色等部分組成,通過各種不同的音符構(gòu)成曲調(diào)旋律,通過聲音所產(chǎn)生的頻率能夠有效地使人們產(chǎn)生共鳴[1]。此外音樂通常以簡譜、五線譜等記譜法描述,該方法的實(shí)現(xiàn)將簡化圖譜的表現(xiàn)形式,利用動態(tài)直觀的可視化視圖方法代替原本的靜態(tài)視圖,使音樂的表現(xiàn)形式不再單一??梢暬膶?shí)現(xiàn)為人們帶來視聽上的新體驗(yàn),使音樂的美以另一種方式得以呈現(xiàn),同時有利于對樂理知識掌握甚少的人進(jìn)行音樂的學(xué)習(xí),為人們對于音樂的學(xué)習(xí)降低門檻[2]。此外該方法借助于MATLAB,利用多種基礎(chǔ)庫函數(shù),例如音樂處理函數(shù)、FFT快速傅里葉變換函數(shù)、各種繪圖函數(shù)等實(shí)現(xiàn)音樂旋律的實(shí)時動態(tài)可視化。
所謂音樂旋律動態(tài)可視化從圖形上來說是指將音樂的播放時間設(shè)置為二維圖形的橫坐標(biāo),將音樂的頻率轉(zhuǎn)化為音高作為縱坐標(biāo),例如:do,re,mi,fa,so,la,xi七個基本音調(diào),在此基礎(chǔ)上根據(jù)所選取音樂是C調(diào)還是F調(diào)以及其他音調(diào)進(jìn)行相應(yīng)的修改[3]。音樂中不只包含音調(diào)還要涉及到節(jié)拍、時值等因素的處理,音樂中每一首歌曲都有固定的節(jié)拍設(shè)置,音的時值代表每個音持續(xù)的時長通常分為全音符、二分音符、四分音符、八分音符、十六分音符等。方法所使用的節(jié)選音樂為C調(diào)音樂《小星星》,它是以四分音符為一拍每小節(jié)四拍構(gòu)成的。音樂的節(jié)拍和時值則分別用zpz變量和duration矩陣進(jìn)行存放,并作為重要元素繪制到階梯圖當(dāng)中[4]。該方法中動態(tài)視圖以可視化的方式呈現(xiàn)時利用了兩種方式:一種是固定橫坐標(biāo)軸,通過一個代表音樂實(shí)時播放的點(diǎn)帶動整個階梯圖的走向來實(shí)現(xiàn)動態(tài)成像;另一種則更具靈活性,將階梯圖伴隨著橫坐標(biāo)軸時間軸一起運(yùn)動,展現(xiàn)出音樂頻率高低起伏、音高持續(xù)時間的變化[5]。
作為一款強(qiáng)大的數(shù)學(xué)軟件MATLAB的繪圖功能較為突出,方便用戶利用可視化的方式實(shí)現(xiàn)計(jì)算結(jié)果[6]。它包含眾多有關(guān)數(shù)值、符號的計(jì)算功能,讓用戶不再被晦澀難懂的數(shù)學(xué)運(yùn)算所困擾。此外它還提供了豐富的應(yīng)用工具箱,極大地方便用戶使用這些處理工具,使得用MATLAB解決問題所編寫的代碼相比其他編程語言例如C、C++、Java等要更加簡潔易懂[7]。該方法中重點(diǎn)用到了MATLAB的數(shù)值分析、圖像繪制功能以及音樂處理函數(shù),例如MATLAB中的audioread()函數(shù)可以自動獲取音樂的音頻信號、采樣頻率、采樣精度等信息。目前大數(shù)據(jù)應(yīng)用十分廣泛,為了與時俱進(jìn)MATLAB也進(jìn)行了相應(yīng)的改善,將其與大數(shù)據(jù)相結(jié)合[8]。實(shí)際上MATLAB覆蓋了從最主要的數(shù)據(jù)獲取、數(shù)據(jù)的組織和基礎(chǔ)的探索和分析等方面,通過這些高端的機(jī)器學(xué)習(xí)方法進(jìn)行大數(shù)據(jù)的一些學(xué)習(xí)并轉(zhuǎn)換成模型,之后把大數(shù)據(jù)嵌入到生產(chǎn)環(huán)境當(dāng)中去,并且MATLAB針對不同的數(shù)據(jù)規(guī)模也擁有著專門的針對這些問題的處理方式,可以說MATLAB現(xiàn)在已經(jīng)可以被廣泛應(yīng)用到各個專業(yè)領(lǐng)域當(dāng)中去[9]。
首先將音樂的音長、時值、音色等存放在特征向量的矩陣中,在呈現(xiàn)出靜態(tài)可視化圖形的基礎(chǔ)上實(shí)現(xiàn)運(yùn)動。所謂點(diǎn)實(shí)現(xiàn)是指,以時間為橫坐標(biāo)的坐標(biāo)軸保持不變的情況下,以一個質(zhì)點(diǎn)代表音樂的播放軌跡,為重點(diǎn)說明旋律可視化,這里直接以矩陣的方式輸入特征向量。
例如方法中所例舉的音樂《小星星》1=C 4/4,部分代碼如下:
>>pitch=[1 1 5 5 6 6 5 4 4 3 3 2 2 1 5 5 4 4 3 3 2 5 5 4 4 3 3 2 1 1 5 5 6 6 5 4 4 3 3 2 2 1]%音高
>>duration=repmat([1 1 1 1 1 1 2],1,6)%利用repmat函數(shù)復(fù)制生成時值矩陣
在繪制圖形時,階梯圖將每個起點(diǎn)連接成階梯形狀,stairs階梯圖的坐標(biāo)是<起點(diǎn),值>
>>start(1)=duration(1);%起始矩陣第1個元素
>>for k=2:1:length(duration);
start(k)=start(k-1)+duration(k);
>>end;%生成起始矩陣
>>start(length(start)+1)=start(length(start))+duration(length
(duration));%最后一個起始點(diǎn)
>>pitch(length(pitch)+1)=pitch(length(pitch));%最后一個時值
方法中應(yīng)用到庫函數(shù)comet(xdata,ydata,p),它的作用的以類似彗星運(yùn)動軌跡的形式動態(tài)繪制曲線圖。庫函數(shù)comet、comet3函數(shù),前者主要用于繪制二維動態(tài)彗星軌跡圖,comet3函數(shù)用于繪制三維圖像,comet(y)僅需一個參數(shù)即可繪制出質(zhì)點(diǎn)繞向量y運(yùn)動的軌跡,comet(x,y,n)需要三個參數(shù)繪制質(zhì)點(diǎn)軌跡包含x,y坐標(biāo),第三個參數(shù)n代表軌跡尾線長度nXlength(y),n的范圍在0到1之間,默認(rèn)為0.1。如果只運(yùn)用基本的comet()函數(shù)則無法實(shí)現(xiàn)所需要的動態(tài)視圖效果,由于庫函數(shù)中質(zhì)點(diǎn)運(yùn)動的速度過快人的肉眼無法清晰地識別,所以該方法對comet()函數(shù)進(jìn)行了改進(jìn),在庫函數(shù)源代碼的四處for循環(huán)繪圖處增加語句pause(0.2);目的是延緩質(zhì)點(diǎn)的運(yùn)動軌跡,以此來實(shí)現(xiàn)0.2秒的暫停時間使動態(tài)圖得以完整呈現(xiàn)。
在MATLAB中對音樂振幅、頻率的分析時利用FFT快速傅里葉變換,它是對基本的離散傅里葉變換的變形,傳統(tǒng)的DET離散傅里葉變換計(jì)算量大、浪費(fèi)時間,而使用改進(jìn)的FFT簡單易行,減少了大量以前需要做的乘積工作[10]。通過FFT快速傅里葉變換對頻率和振幅的分析獲取音樂特征。FFT快速傅里葉變換將時間采樣信號與頻率采樣信號進(jìn)行關(guān)聯(lián),揭示振幅與頻率的特點(diǎn)?;A(chǔ)的傅立葉級數(shù)為:
對于包含n個均勻采樣點(diǎn)的向量x,其傅里葉變換定義為:
其中i是虛數(shù)單位。對于x和y,索引j和k的范圍為0到 n-1[11]。
該方法的實(shí)現(xiàn)可以獲取到更加準(zhǔn)確的振幅、頻率便于對樂曲中的音高進(jìn)行分析,為以后將該方法應(yīng)用到更多音樂的識別中提供了良好的基礎(chǔ)[12]。第一種點(diǎn)實(shí)現(xiàn)方法的實(shí)現(xiàn)結(jié)果如圖1所示。
圖1 音樂旋律動態(tài)實(shí)時可視化點(diǎn)實(shí)現(xiàn)方法結(jié)果圖
第二種實(shí)現(xiàn)方法是使圖形伴隨著時間軸一起實(shí)時運(yùn)動,比起第一種呈現(xiàn)效果看起來要更加靈活生動,所謂動態(tài)圖無外乎是將一幀一幀的圖片呈現(xiàn)出來并將這若干幀快速的連接起來呈現(xiàn)出動態(tài)的效果[13]。方法中主要對音高和時值兩個矩陣進(jìn)行描述,階梯圖stairs的坐標(biāo)為<起點(diǎn),值>,pitch矩陣保存了音樂中每個音調(diào)的音高作為第2個坐標(biāo)值,由于start矩陣中還不完全是起始值,因此利用相關(guān)的duration時值矩陣與start矩陣相結(jié)合去描述起點(diǎn)值,將其從時值變換為起點(diǎn)值生成起點(diǎn)值矩陣,利用>>start(k)=start(k-1)+duration(k);>>start(1)=duration(1);語句實(shí)現(xiàn)[14]。
然后在呈現(xiàn)出靜態(tài)階梯圖的基礎(chǔ)上加入一個循環(huán)變量,在程序中設(shè)置一個名為m的變量進(jìn)行循環(huán)控制,設(shè)m的初始值為0,最大值設(shè)定為40,此處注意需要根據(jù)不同的音樂對m的最大值進(jìn)行調(diào)整,否則循環(huán)的時間過長產(chǎn)生無用數(shù)據(jù),此處實(shí)現(xiàn)利用語句m=m+0.8;來控制循環(huán)速度。最后通過基本的坐標(biāo)軸函數(shù)>>axis([m,m+8,0,10]);設(shè)置當(dāng)前圖形的坐標(biāo)范圍,參數(shù)的設(shè)置分別為x軸、y軸的最小值和最大值,第二個參數(shù)設(shè)置為m加8的目的,在于由于在階梯圖中繪制了網(wǎng)格圖片,所以將每一幀呈現(xiàn)出的圖片大小規(guī)定為一幀中有8個方格的寬度使畫面更加清晰直觀,否則畫面將呈現(xiàn)密集或稀疏的狀態(tài)[15]。
主要的部分代碼如下:
>>pitch=[1 1 5 5 6 6 5 4 4 3 3 2 2 1 5 5 4 4 3 3 2 5 5 4 4 3 3 2 1 1 5 5 6 6 5 4 4 3 3 2 2 1];%音高矩陣
>>duration=repmat([1 1 1 1 1 1 2],1,6);%利用repmat函數(shù)復(fù)制生成時值矩陣
>>start(1)=duration(1);%起始矩陣第1個元素>>for k=2:1:length(duration);
start(k)=start(k-1)+duration(k);>>end;%生成起始矩陣
>>start(length(start)+1)=start(length(start))+duration(length(duration));%最后一個起始點(diǎn)
>>pitch(length(pitch)+1)=pitch(length(pitch));%最后一個時值
>>stairs(pitch);%繪制階梯圖
>>pz=4;%本音樂是每小節(jié)有4拍,該值要根據(jù)具體音樂來指定
>>zpz=start(length(start));%音樂的總節(jié)拍數(shù)>>grid on;%設(shè)置網(wǎng)格線
>>set(set(gca,'YTickLabel',{'c','d','e','f','g','a','b','1','2','3','4','5','6','7','C','D','E','F','G','A','B'})%設(shè)置Y軸刻度標(biāo)簽>>m=m+0.8;
>>axis([m,m+8,0,10]);%移動坐標(biāo)系>>pause(0.2);
第二種音樂旋律實(shí)時動態(tài)可視化方法的結(jié)果如圖2、圖3所示。
圖2 音樂旋律實(shí)時動態(tài)可視化第二種實(shí)現(xiàn)方法的結(jié)果圖(截取的音樂片段)
圖3 音樂旋律動態(tài)可視化完整圖
結(jié)果顯示音樂旋律的動態(tài)實(shí)時可視化可以很好地表達(dá)音樂的旋律,通過快速傅里葉變換分析進(jìn)行相應(yīng)頻率的轉(zhuǎn)換,對音樂中的重要特征進(jìn)行提取并解析。充分運(yùn)用MATLAB函數(shù)庫,使得音高能夠隨著時間以梯形圖的方式動態(tài)呈現(xiàn),可以使人們通過視覺的方式更加直觀的理解音樂。通過兩種可視化的實(shí)現(xiàn)方式使音樂的呈現(xiàn)更具有多元化,即使是以可視化的方式呈現(xiàn)也可以擁有多種方式,使旋律變得更加生動靈活。將音調(diào)轉(zhuǎn)換成階梯圖方便了人們對音樂的理解學(xué)習(xí)即使是對于不懂樂理的人也能迅速理解每一個旋律。
在日后的研究中還要對該方法繼續(xù)進(jìn)行完善,使其能夠自動識別音樂,不用針對每一首歌進(jìn)行手動設(shè)置。此外該方法以后還將應(yīng)用到對于人們在唱歌時所產(chǎn)生的不夠準(zhǔn)確的音調(diào)加以調(diào)整等方面,通過此方法來幫助人們進(jìn)行糾正。音樂可視化已經(jīng)成為未來的發(fā)展趨勢,音樂將以各種形態(tài)方式得以展現(xiàn),可視化的應(yīng)用極大地豐富了人們的現(xiàn)實(shí)生活,將來還會將該應(yīng)用與大數(shù)據(jù)相結(jié)合從中擴(kuò)充大量的音樂對曲庫進(jìn)行豐富,變成系統(tǒng)完善的體系優(yōu)化其性能,快速實(shí)現(xiàn)大量音樂的旋律轉(zhuǎn)換。