基于MATLAB的虚拟音乐及可视化
2022-02-19南阳理工学院智能制造学院周先辉沈明宇
南阳理工学院智能制造学院 周先辉 沈明宇
基于数字音频处理技术的虚拟音乐以其独特的优势受到众多音乐创作者和听众的喜爱。为从数据化和图像可视化的角度对音乐进行赏析、增强对音乐的理解、分析和处理,本文以电子琴为研究对象,提出了一种基于MATLAB软件的音乐模拟和可视化方法。通过对乐音的特征分析、GUI界面设计、控件回调函数编程等方法实现了对琴键的模拟。利用timerfcn等函数功能完成了MP3音乐播放器设计,系统具有曲目添加、播放、暂停、音量调节等功能,播放时间、进度及音频时域波形可动态实时显示。通过DSP实时采集音乐信息展示动态频谱,实现了乐曲旋律的动态可视化;通过定义音符、节拍和音调等模拟实现了编曲仿真和虚拟演奏,直观地展现了电子声乐,达到了较好的视听效果。
1 计算机数字音乐
计算机音乐因具有可利用软件进行修改编辑、声形并茂地展现音乐效果、检测音乐细节听感、方便合成和模拟等功能,受到众多音乐创作者的喜爱[1]。通过计算机技术和数字音频处理技术完成的虚拟音乐作品,可将原始高质量数字音频的细腻与真实还原,拥有独特的音色,带来非同一般的音乐体验[2],受到众多听众的喜爱。当前,数字音频处理技术为音频信号的采集,量化、修正、模拟和音量音质的完善提供了有效的手段,通过相关软件可对传入计算机的音频进行一定的修改、完善、合成、模拟和动态处理[3-5]。MATLAB具有强大的数据处理能力,可方便快捷地完成语音信号的分析、处理和可视化,其GUI界面功能为用户提供了高品质的可视化体验。基于此,本文以电子琴为研究对象,借助MATLAB软件进行乐器模拟和音乐视觉表现。通过对音乐进行分析、处理和合成,实现琴键模拟、播放器设计、旋律动态可视化、编曲仿真和虚拟演奏等功能,从数据化以及图像可视化的角度辅助音乐赏析,增强爱好者对音乐的学习和理解、分析和处理。
2 电子琴乐音模拟与GUI键盘
2.1 乐音分析与模拟
常见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]);
2.2 GUI音乐键盘
在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
3 播放器与旋律可视化
3.1 播放器设计
播放器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
3.2 旋律可视化
歌曲的旋律由音高、音色、响度和音长共同决定。系统设计时,响度和音长的动态可视化通过实时采样音乐信号后,用信号振幅随时间作动态变化的时域波形图体现。乐曲音色取决于演唱者及器乐,系统在对某一确定的乐曲旋律可视化时,将音色高次谐波略去。音高是歌曲主旋律的重要组成部分,其丰富的变化性及多样性特征使音乐具有极大的可欣赏性和艺术性,动态可视化利用MATLAB信号处理DSP工具箱中的AudioRecorder()函数进行。对音频信号实时采样后,将播放器内的音频信息、实时采样函数及频谱分析相结合,通过draw()函数更新频谱图和波形图实现音频动态频谱图的展现。M文件程序流程图如图7所示。旋律动态频谱图选用倍频程算法实现响度随频率的实时变化。为表现出乐曲频率的动态效果并考虑谱密度声压值,系统选用1/3倍频程表示,频谱图横坐标选对数坐标,以便将音域足够宽的频率动态的完整展示出来。图5(b)为播放的乐曲旋律动态可视化效果。
图7 旋律动态可视化流程Fig.7 Flow chart of dynamic melody
4 编曲仿真与虚拟演奏
4.1 曲谱公式化与演奏
乐曲的节奏由音节和小节节拍组成的,每个音节的节拍数取决于曲谱分数。如选编歌曲《残酷月光》部分简谱
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()函数播放合成的声音即可完成乐曲演奏。
4.2 编曲演奏示例
分析乐曲《残酷月光》可知,该曲每节四拍,每拍四分之一音符。节拍包括一拍半、一拍、半拍和四分之一拍。节拍间具有休止符和连音符。编曲时,首先根据节拍、音阶定义音符频率、节拍、音调及空拍,再将乐曲分成独立的小段,以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
5 结语
基于计算机技术和数字音频处理技术的虚拟音乐,可给创作者和听众带来非同一般的音乐体验。利用MATLAB编程模拟琴键、合成音乐灵活多变,有助于从数据化和可视化的角度增强对音乐的理解、分析和处理。通过DSP实时采集音乐信息将乐曲旋律动态可视化,可清晰展示乐曲频率与曲调的关系。通过定义音符、节拍和音调等模拟编曲仿真和虚拟演奏,结合不同的算法对音乐进行处理,可直观地展现电子声乐、改善音质,充分发挥自己的创新能力,为用户提供高品质的音乐赏析和可视化体验。