南陽理工學院智能制造學院 周先輝 沈明宇
基于數(shù)字音頻處理技術(shù)的虛擬音樂以其獨特的優(yōu)勢受到眾多音樂創(chuàng)作者和聽眾的喜愛。為從數(shù)據(jù)化和圖像可視化的角度對音樂進行賞析、增強對音樂的理解、分析和處理,本文以電子琴為研究對象,提出了一種基于MATLAB軟件的音樂模擬和可視化方法。通過對樂音的特征分析、GUI界面設(shè)計、控件回調(diào)函數(shù)編程等方法實現(xiàn)了對琴鍵的模擬。利用timerfcn等函數(shù)功能完成了MP3音樂播放器設(shè)計,系統(tǒng)具有曲目添加、播放、暫停、音量調(diào)節(jié)等功能,播放時間、進度及音頻時域波形可動態(tài)實時顯示。通過DSP實時采集音樂信息展示動態(tài)頻譜,實現(xiàn)了樂曲旋律的動態(tài)可視化;通過定義音符、節(jié)拍和音調(diào)等模擬實現(xiàn)了編曲仿真和虛擬演奏,直觀地展現(xiàn)了電子聲樂,達到了較好的視聽效果。
計算機音樂因具有可利用軟件進行修改編輯、聲形并茂地展現(xiàn)音樂效果、檢測音樂細節(jié)聽感、方便合成和模擬等功能,受到眾多音樂創(chuàng)作者的喜愛[1]。通過計算機技術(shù)和數(shù)字音頻處理技術(shù)完成的虛擬音樂作品,可將原始高質(zhì)量數(shù)字音頻的細膩與真實還原,擁有獨特的音色,帶來非同一般的音樂體驗[2],受到眾多聽眾的喜愛。當前,數(shù)字音頻處理技術(shù)為音頻信號的采集,量化、修正、模擬和音量音質(zhì)的完善提供了有效的手段,通過相關(guān)軟件可對傳入計算機的音頻進行一定的修改、完善、合成、模擬和動態(tài)處理[3-5]。MATLAB具有強大的數(shù)據(jù)處理能力,可方便快捷地完成語音信號的分析、處理和可視化,其GUI界面功能為用戶提供了高品質(zhì)的可視化體驗?;诖耍疚囊噪娮忧贋檠芯繉ο?,借助MATLAB軟件進行樂器模擬和音樂視覺表現(xiàn)。通過對音樂進行分析、處理和合成,實現(xiàn)琴鍵模擬、播放器設(shè)計、旋律動態(tài)可視化、編曲仿真和虛擬演奏等功能,從數(shù)據(jù)化以及圖像可視化的角度輔助音樂賞析,增強愛好者對音樂的學習和理解、分析和處理。
常見61鍵電子琴一般由5組音高不同的八度和1組高位Do組成。為簡化設(shè)計,琴鍵模擬時將鍵數(shù)簡化為34個,包含大字八度、無重音八度和三個小字組八度。音高、音色、響度和音長為樂音的主要特征。音高為音調(diào)高低不同的聲音,電子琴樂音的各個音調(diào)都對應(yīng)著不同的基波信號頻率。音色取決于諧波頻譜,將基波頻率信號與樂器音色諧波信號疊加,可使人感知真實的樂器聲音。響度主要取決于信號振幅的大小,音長即樂音信號在時間上的延續(xù)。
為實現(xiàn)對琴鍵樂音的模擬,首先提取所模擬電子琴每一音鍵的基波頻率特征。為此,先對電子琴樂音進行信號采集,將音頻信號通過audioread()函數(shù)讀入MATLAB軟件,繪制出音頻信號時域波形,然后通過length()函數(shù)獲取音頻長度,用于計算音頻總采樣點數(shù),利用hanning窗函數(shù)進行頻譜分析得到樂音的基波頻率值。中音Do的樂音分析如圖1所示。依此方法獲得需模擬的電子琴各琴鍵的音階-頻率關(guān)系。
圖1 電子琴琴鍵樂音分析Fig.1 Key music analysis of electronic organ
樂聲模擬以音階-頻率方式進行。選取合適的采樣頻率和采樣點數(shù),以正弦函數(shù)的形式寫入發(fā)聲函數(shù)sound(),組成各琴鍵的樂音。為實現(xiàn)音色的模擬,利用傅里葉變換技術(shù)在樂音中增加一些幅值小于基波的諧波分量。琴聲樂音結(jié)束時都有一個響度衰減的過程,尾音明顯,為實現(xiàn)樂音的響度衰減,需要對聲音幅值進行處理。圖2為音色與幅值處理后的虛擬中音Do時域波形及頻譜,其m文件為
圖2 虛擬中音Do樂音波形及頻譜Fig.2 Virtual alto Do tone waveform and spectrum
Function g=key(p,n,fs) %音調(diào)拍
fs=22050;
t=0∶1/fs∶4/n
tt=n∶-1/fs∶0;
g=1/6*((sin(2*pi*524.6*t)+0.2*sin(6*pi*524.6*t)).*exp(2*tt));
plot(t,g);
sound(g,fs)
N=length(g)
y= fft(g);
f= fs/N*(0∶round(N/2)-1);
subplot(212);
plot(f,abs(y(1∶round(N/2))));
axis([0 2000 0 6000]);
在GUI界面中,電子琴鍵盤采用按鈕控件創(chuàng)建?;卣{(diào)函數(shù)中的發(fā)聲函數(shù)基于正弦函數(shù),按音階-頻率對應(yīng)關(guān)系建立一組數(shù)值向量freqs作為各琴鍵音符頻率,內(nèi)嵌自變量tone調(diào)用。7個中音音符的M文件及Do音回調(diào)函數(shù)為
function y=gen_wave(tone,rythm)
Fs=8192;
freqs=[523,587,659,698,783,880,988];
x=linspace(0,2*pi*rythm,floor(Fs*rythm));
y=sin(freqs(tone)*x).*(1-x/(rythm*2*pi));
end
function Do Callback (hObject,eventdata, handles)
y=gen_wave(1,1);
sound(y,8192);
界面樂音中發(fā)聲函數(shù)的時域波形通過draw()函數(shù)繪制,頻譜分析由fft()函數(shù)完成后,使用handles結(jié)構(gòu)體將數(shù)據(jù)傳遞給坐標軸以顯示頻譜曲線,頻率數(shù)值顯示通過可編輯文本實現(xiàn)。圖3為創(chuàng)建完成的GUI音樂鍵盤。
圖3 模擬音樂鍵盤Fig.3 Virtual music keyboard
播放器GUI界面由音樂播放器、歌曲列表、波形顯示、音量調(diào)節(jié)等四個模塊組成,分別由不同的面板封裝。音樂播放器面板設(shè)為固定主面板,用按鈕控件控制其他三個面板的顯示狀態(tài)。界面設(shè)計時,在音樂播放器面板插入播放曲名及時長文本、進度滑動條控件、歌曲切換按鈕控件、播放/暫停切換按鈕控件等。歌曲列表面板插入歌曲添加和刪除按鈕控件及歌曲列表。波形顯示面板插入樂曲播放時的動態(tài)時域波形顯示用坐標軸。音量調(diào)節(jié)面板插入音量調(diào)節(jié)的滑動條控件及文本。各功能模塊基于控件屬性及其回調(diào)函數(shù)、控件間回調(diào)函數(shù)變量和函數(shù)內(nèi)部對變量的處理。播放器總體結(jié)構(gòu)如圖4所示。
圖4 播放器總體結(jié)構(gòu)Fig.4 Overall structure of the player
樂曲添加列表由MATLAB列表框完成,利用uigetfile()函數(shù)創(chuàng)建標準對話框并通過交互式操作讀取存儲路徑文件夾中的歌曲文件名,獲取并添加樂曲數(shù)量、排序編號、更新列表框曲名。為實現(xiàn)樂曲播放,播放器面板GUI程序中,通過播放按鈕控件讀取存儲在列表框的文件名、路徑和音頻采樣頻率,利用audioplayer()函數(shù)根據(jù)給定的音量值播放選定的樂曲。按鈕控件具有停止→播放、播放→暫停、暫?!^續(xù)播放三種狀態(tài)的切換功能,也可由播放或暫停切換至停止狀態(tài),其回調(diào)函數(shù)m文件主體為
function togglebutton1_Callback(hObject, ~, handles)
global player
if get(hObject,'Value')
set(hObject,'FontSize',15,'String','l l');
try
if isplaying(player)
resume(player);
handles.isPlaying = true;
handles.isPaused = false;
end
catch
if isempty(get(handles.Listbox,'String'))
msgbox('請?zhí)砑痈枨?);
set(hObject,'Value',0,'FontSize',20,'String','l>');
else
set(handles.SongNameText,'String','讀取歌曲信息中...');
PathList=get(handles.Listbox,'userData');
str=get(handles.Listbox,'string');
n=get(handles.Listbox,'value');
set(handles.SongNameText,'UserData',n);
player=CreatePlayer(PathList,str,n);
set(player,'TimerFcn',{@PlayerTimerFcn, handles},...
'StopFcn',{@PlayerStopFcn,handles});
play(player);
info=getappdata(0,'info');
……
end
end
end
guidata(hObject,handles);
播放器設(shè)計界面如圖5所示,播放過程中播放進度滑動條、播放時間、動態(tài)音頻時域波形等的動態(tài)實時狀態(tài)顯示通過timerfcn()函數(shù)以定時循環(huán)的方式實現(xiàn)更新,其流程圖如圖6所示。為減少MATLAB運算量并提高響應(yīng)速度,設(shè)計時動態(tài)顯示更新時間間隔設(shè)置為0.1秒。
圖5 播放器GUI界面效果圖Fig.5 Effect of player GUI interface
圖6 播放信息動態(tài)顯示流程Fig.6 Flow chart of information dynamic display visualizing
歌曲的旋律由音高、音色、響度和音長共同決定。系統(tǒng)設(shè)計時,響度和音長的動態(tài)可視化通過實時采樣音樂信號后,用信號振幅隨時間作動態(tài)變化的時域波形圖體現(xiàn)。樂曲音色取決于演唱者及器樂,系統(tǒng)在對某一確定的樂曲旋律可視化時,將音色高次諧波略去。音高是歌曲主旋律的重要組成部分,其豐富的變化性及多樣性特征使音樂具有極大的可欣賞性和藝術(shù)性,動態(tài)可視化利用MATLAB信號處理DSP工具箱中的AudioRecorder()函數(shù)進行。對音頻信號實時采樣后,將播放器內(nèi)的音頻信息、實時采樣函數(shù)及頻譜分析相結(jié)合,通過draw()函數(shù)更新頻譜圖和波形圖實現(xiàn)音頻動態(tài)頻譜圖的展現(xiàn)。M文件程序流程圖如圖7所示。旋律動態(tài)頻譜圖選用倍頻程算法實現(xiàn)響度隨頻率的實時變化。為表現(xiàn)出樂曲頻率的動態(tài)效果并考慮譜密度聲壓值,系統(tǒng)選用1/3倍頻程表示,頻譜圖橫坐標選對數(shù)坐標,以便將音域足夠?qū)挼念l率動態(tài)的完整展示出來。圖5(b)為播放的樂曲旋律動態(tài)可視化效果。
圖7 旋律動態(tài)可視化流程Fig.7 Flow chart of dynamic melody
樂曲的節(jié)奏由音節(jié)和小節(jié)節(jié)拍組成的,每個音節(jié)的節(jié)拍數(shù)取決于曲譜分數(shù)。如選編歌曲《殘酷月光》部分簡譜
4/4中的分子4代表了每個小節(jié)有4拍,分母4代表以四分音符為一拍。小節(jié)節(jié)拍固定,由一個或多個數(shù)字組成,這些數(shù)字即音符,音符對應(yīng)著發(fā)聲頻率。樂器的基本音為C調(diào)大音階,由7個音組成。C D E F G A B音階分別對應(yīng)do,re,mi,fa,so,la,xi(即簡譜1,2,3,4,5,6,7),其中第3,4(即mi和fa)音之間和第7,8(即xi和高音do)音之間是半音程。不同的音高決定不同的頻率,1=A表示該樂曲簡譜中標準A音(即la)唱為do,由音階頻率關(guān)系可知其對應(yīng)的頻率為440Hz。半音程頻率,可依據(jù)十二平均率計算得到。
MATLAB編程時,選用sound(Y,fs,nBits)實現(xiàn)歌曲演奏,Y為輸入的樂音信號A*sin(2*pi*ω*t)。其中,參數(shù)A控制樂音的強弱(振幅),設(shè)定為1;ω控制音的高低,取決于曲譜的音調(diào);時間變量t控制音的長短。曲譜公式化時,先根據(jù)音調(diào)獲得頻率值,再依曲譜控制音樂節(jié)拍和音符,將選定的樂器依據(jù)曲譜分割成多個不同的波段公式化并合成,最后用sound()函數(shù)播放合成的聲音即可完成樂曲演奏。
分析樂曲《殘酷月光》可知,該曲每節(jié)四拍,每拍四分之一音符。節(jié)拍包括一拍半、一拍、半拍和四分之一拍。節(jié)拍間具有休止符和連音符。編曲時,首先根據(jù)節(jié)拍、音階定義音符頻率、節(jié)拍、音調(diào)及空拍,再將樂曲分成獨立的小段,以part變量表示,最后將各part部分串聯(lián)成曲播放。簡譜陰影部分(part1)m文件示例為
%發(fā)聲函數(shù)
function output=key(p,n,fs)
t=0∶1/fs∶1/n;
output=sin(2*pi*440*2^((p-69)/12)*t);%標準la音p=69
end
% part1音符與編曲
la0_2=key(57,2,fs);%半拍
so0_23=key(55,2/3,fs);%一拍半
mi0_23=key(52,2/3,fs);%低音mi,一拍半
t1=0∶1/fs∶0.5;
blk_2=zeros(1,length(t1));% 停頓半拍
so0_4=key(55,4,fs);
do_2=key(60,2,fs);
re_2=key(62,2,fs);
re_4=key(62,4,fs);
do_45=key(60,4/5,fs);%5/4拍
t2=0∶1/fs∶3/4;
blk_43=zeros(1,length(t2));
part1=[la0_2 so0_23 la0_2 mi0_23 blk_2 so0_4 so0_4 la0_2 do_2 re_2 re_4 do_45 blk_43];
%樂曲串聯(lián)
song=[part0 part1…… part9];
編寫好的樂曲通過audiowrite()函數(shù)轉(zhuǎn)換為音頻信號添加至播放器中后,利用dsp.AudioRecorder展示的旋律動態(tài)效果如圖8所示。
圖8 虛擬演奏樂音的動態(tài)旋律Fig.8 Dynamic melody of virtual playing
基于計算機技術(shù)和數(shù)字音頻處理技術(shù)的虛擬音樂,可給創(chuàng)作者和聽眾帶來非同一般的音樂體驗。利用MATLAB編程模擬琴鍵、合成音樂靈活多變,有助于從數(shù)據(jù)化和可視化的角度增強對音樂的理解、分析和處理。通過DSP實時采集音樂信息將樂曲旋律動態(tài)可視化,可清晰展示樂曲頻率與曲調(diào)的關(guān)系。通過定義音符、節(jié)拍和音調(diào)等模擬編曲仿真和虛擬演奏,結(jié)合不同的算法對音樂進行處理,可直觀地展現(xiàn)電子聲樂、改善音質(zhì),充分發(fā)揮自己的創(chuàng)新能力,為用戶提供高品質(zhì)的音樂賞析和可視化體驗。