南陽理工學院智能制造學院 周先輝 沈明宇
基于數字音頻處理技術的虛擬音樂以其獨特的優勢受到眾多音樂創作者和聽眾的喜愛。為從數據化和圖像可視化的角度對音樂進行賞析、增強對音樂的理解、分析和處理,本文以電子琴為研究對象,提出了一種基于MATLAB軟件的音樂模擬和可視化方法。通過對樂音的特征分析、GUI界面設計、控件回調函數編程等方法實現了對琴鍵的模擬。利用timerfcn等函數功能完成了MP3音樂播放器設計,系統具有曲目添加、播放、暫停、音量調節等功能,播放時間、進度及音頻時域波形可動態實時顯示。通過DSP實時采集音樂信息展示動態頻譜,實現了樂曲旋律的動態可視化;通過定義音符、節拍和音調等模擬實現了編曲仿真和虛擬演奏,直觀地展現了電子聲樂,達到了較好的視聽效果。
計算機音樂因具有可利用軟件進行修改編輯、聲形并茂地展現音樂效果、檢測音樂細節聽感、方便合成和模擬等功能,受到眾多音樂創作者的喜愛[1]。通過計算機技術和數字音頻處理技術完成的虛擬音樂作品,可將原始高質量數字音頻的細膩與真實還原,擁有獨特的音色,帶來非同一般的音樂體驗[2],受到眾多聽眾的喜愛。當前,數字音頻處理技術為音頻信號的采集,量化、修正、模擬和音量音質的完善提供了有效的手段,通過相關軟件可對傳入計算機的音頻進行一定的修改、完善、合成、模擬和動態處理[3-5]。MATLAB具有強大的數據處理能力,可方便快捷地完成語音信號的分析、處理和可視化,其GUI界面功能為用戶提供了高品質的可視化體驗。基于此,本文以電子琴為研究對象,借助MATLAB軟件進行樂器模擬和音樂視覺表現。通過對音樂進行分析、處理和合成,實現琴鍵模擬、播放器設計、旋律動態可視化、編曲仿真和虛擬演奏等功能,從數據化以及圖像可視化的角度輔助音樂賞析,增強愛好者對音樂的學習和理解、分析和處理。
常見61鍵電子琴一般由5組音高不同的八度和1組高位Do組成。為簡化設計,琴鍵模擬時將鍵數簡化為34個,包含大字八度、無重音八度和三個小字組八度。音高、音色、響度和音長為樂音的主要特征。音高為音調高低不同的聲音,電子琴樂音的各個音調都對應著不同的基波信號頻率。音色取決于諧波頻譜,將基波頻率信號與樂器音色諧波信號疊加,可使人感知真實的樂器聲音。響度主要取決于信號振幅的大小,音長即樂音信號在時間上的延續。
為實現對琴鍵樂音的模擬,首先提取所模擬電子琴每一音鍵的基波頻率特征。為此,先對電子琴樂音進行信號采集,將音頻信號通過audioread()函數讀入MATLAB軟件,繪制出音頻信號時域波形,然后通過length()函數獲取音頻長度,用于計算音頻總采樣點數,利用hanning窗函數進行頻譜分析得到樂音的基波頻率值。中音Do的樂音分析如圖1所示。依此方法獲得需模擬的電子琴各琴鍵的音階-頻率關系。

圖1 電子琴琴鍵樂音分析Fig.1 Key music analysis of electronic organ
樂聲模擬以音階-頻率方式進行。選取合適的采樣頻率和采樣點數,以正弦函數的形式寫入發聲函數sound(),組成各琴鍵的樂音。為實現音色的模擬,利用傅里葉變換技術在樂音中增加一些幅值小于基波的諧波分量。琴聲樂音結束時都有一個響度衰減的過程,尾音明顯,為實現樂音的響度衰減,需要對聲音幅值進行處理。圖2為音色與幅值處理后的虛擬中音Do時域波形及頻譜,其m文件為

圖2 虛擬中音Do樂音波形及頻譜Fig.2 Virtual alto Do tone waveform and spectrum
Function g=key(p,n,fs) %音調拍
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界面中,電子琴鍵盤采用按鈕控件創建。回調函數中的發聲函數基于正弦函數,按音階-頻率對應關系建立一組數值向量freqs作為各琴鍵音符頻率,內嵌自變量tone調用。7個中音音符的M文件及Do音回調函數為
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);
界面樂音中發聲函數的時域波形通過draw()函數繪制,頻譜分析由fft()函數完成后,使用handles結構體將數據傳遞給坐標軸以顯示頻譜曲線,頻率數值顯示通過可編輯文本實現。圖3為創建完成的GUI音樂鍵盤。

圖3 模擬音樂鍵盤Fig.3 Virtual music keyboard
播放器GUI界面由音樂播放器、歌曲列表、波形顯示、音量調節等四個模塊組成,分別由不同的面板封裝。音樂播放器面板設為固定主面板,用按鈕控件控制其他三個面板的顯示狀態。界面設計時,在音樂播放器面板插入播放曲名及時長文本、進度滑動條控件、歌曲切換按鈕控件、播放/暫停切換按鈕控件等。歌曲列表面板插入歌曲添加和刪除按鈕控件及歌曲列表。波形顯示面板插入樂曲播放時的動態時域波形顯示用坐標軸。音量調節面板插入音量調節的滑動條控件及文本。各功能模塊基于控件屬性及其回調函數、控件間回調函數變量和函數內部對變量的處理。播放器總體結構如圖4所示。

圖4 播放器總體結構Fig.4 Overall structure of the player
樂曲添加列表由MATLAB列表框完成,利用uigetfile()函數創建標準對話框并通過交互式操作讀取存儲路徑文件夾中的歌曲文件名,獲取并添加樂曲數量、排序編號、更新列表框曲名。為實現樂曲播放,播放器面板GUI程序中,通過播放按鈕控件讀取存儲在列表框的文件名、路徑和音頻采樣頻率,利用audioplayer()函數根據給定的音量值播放選定的樂曲。按鈕控件具有停止→播放、播放→暫停、暫停→繼續播放三種狀態的切換功能,也可由播放或暫停切換至停止狀態,其回調函數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('請添加歌曲');
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);
播放器設計界面如圖5所示,播放過程中播放進度滑動條、播放時間、動態音頻時域波形等的動態實時狀態顯示通過timerfcn()函數以定時循環的方式實現更新,其流程圖如圖6所示。為減少MATLAB運算量并提高響應速度,設計時動態顯示更新時間間隔設置為0.1秒。

圖5 播放器GUI界面效果圖Fig.5 Effect of player GUI interface

圖6 播放信息動態顯示流程Fig.6 Flow chart of information dynamic display visualizing
歌曲的旋律由音高、音色、響度和音長共同決定。系統設計時,響度和音長的動態可視化通過實時采樣音樂信號后,用信號振幅隨時間作動態變化的時域波形圖體現。樂曲音色取決于演唱者及器樂,系統在對某一確定的樂曲旋律可視化時,將音色高次諧波略去。音高是歌曲主旋律的重要組成部分,其豐富的變化性及多樣性特征使音樂具有極大的可欣賞性和藝術性,動態可視化利用MATLAB信號處理DSP工具箱中的AudioRecorder()函數進行。對音頻信號實時采樣后,將播放器內的音頻信息、實時采樣函數及頻譜分析相結合,通過draw()函數更新頻譜圖和波形圖實現音頻動態頻譜圖的展現。M文件程序流程圖如圖7所示。旋律動態頻譜圖選用倍頻程算法實現響度隨頻率的實時變化。為表現出樂曲頻率的動態效果并考慮譜密度聲壓值,系統選用1/3倍頻程表示,頻譜圖橫坐標選對數坐標,以便將音域足夠寬的頻率動態的完整展示出來。圖5(b)為播放的樂曲旋律動態可視化效果。

圖7 旋律動態可視化流程Fig.7 Flow chart of dynamic melody
樂曲的節奏由音節和小節節拍組成的,每個音節的節拍數取決于曲譜分數。如選編歌曲《殘酷月光》部分簡譜

4/4中的分子4代表了每個小節有4拍,分母4代表以四分音符為一拍。小節節拍固定,由一個或多個數字組成,這些數字即音符,音符對應著發聲頻率。樂器的基本音為C調大音階,由7個音組成。C D E F G A B音階分別對應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,由音階頻率關系可知其對應的頻率為440Hz。半音程頻率,可依據十二平均率計算得到。
MATLAB編程時,選用sound(Y,fs,nBits)實現歌曲演奏,Y為輸入的樂音信號A*sin(2*pi*ω*t)。其中,參數A控制樂音的強弱(振幅),設定為1;ω控制音的高低,取決于曲譜的音調;時間變量t控制音的長短。曲譜公式化時,先根據音調獲得頻率值,再依曲譜控制音樂節拍和音符,將選定的樂器依據曲譜分割成多個不同的波段公式化并合成,最后用sound()函數播放合成的聲音即可完成樂曲演奏。
分析樂曲《殘酷月光》可知,該曲每節四拍,每拍四分之一音符。節拍包括一拍半、一拍、半拍和四分之一拍。節拍間具有休止符和連音符。編曲時,首先根據節拍、音階定義音符頻率、節拍、音調及空拍,再將樂曲分成獨立的小段,以part變量表示,最后將各part部分串聯成曲播放。簡譜陰影部分(part1)m文件示例為
%發聲函數
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];
%樂曲串聯
song=[part0 part1…… part9];
編寫好的樂曲通過audiowrite()函數轉換為音頻信號添加至播放器中后,利用dsp.AudioRecorder展示的旋律動態效果如圖8所示。

圖8 虛擬演奏樂音的動態旋律Fig.8 Dynamic melody of virtual playing
基于計算機技術和數字音頻處理技術的虛擬音樂,可給創作者和聽眾帶來非同一般的音樂體驗。利用MATLAB編程模擬琴鍵、合成音樂靈活多變,有助于從數據化和可視化的角度增強對音樂的理解、分析和處理。通過DSP實時采集音樂信息將樂曲旋律動態可視化,可清晰展示樂曲頻率與曲調的關系。通過定義音符、節拍和音調等模擬編曲仿真和虛擬演奏,結合不同的算法對音樂進行處理,可直觀地展現電子聲樂、改善音質,充分發揮自己的創新能力,為用戶提供高品質的音樂賞析和可視化體驗。