音乐电子琴matlab设计报告
- 格式:doc
- 大小:477.47 KB
- 文档页数:18
《 MATLAB 实践》课程设计学生姓名:谢冬云学号:110900735专业班级:09级信通(3)班指导教师:郑晓明二○一二年六月二十日目录一、设计目的 (2)二、题目分析 (2)2.1 课程设计的基本要求 (2)2.2 课程设计的内容 (2)三、总体设计 (2)3.1总体设计框架 (2)3.2 功能模块 (3)四、具体设计 (4)4.1单音键盘发音模块 (4)4.2 音效长短的选择模块 (5)4.3包络的选择模块 (5)4.4实现键盘代替鼠标输入模块 (6)4.5 双音多频模块 (9)4.6 演奏音乐模块 (9)4.7 播放歌曲,视频模块 (11)4.8 多键盘输入对输入后统一播放模块 (14)4.9 画图模块 (15)五、结果分析 (15)六、心得体会 (16)七、参考书目: (17)一、设计目的运用MATLAB实现MATLAB的GUI的信号处理程序设计。
做一个基于MATLAB GUI 的音乐键盘。
二、题目分析2.1 课程设计的基本要求1)熟悉和掌握MATLAB 程序设计方法。
2)掌握MATLAB GUI 程序设计。
3)学习音乐合成基本知识。
2.2 课程设计的内容学习MATLAB GUI程序设计,设计和实现一个音乐键盘仿真系统。
要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。
然后按照自己拟定的功能要求进行程序设计和调试。
1)设计音乐键盘GUI界面,实现单音键盘的发声。
2) 能改变音的长短,即可以实现音的缩短,延长。
3)实现键盘的双音多频,即每个键盘对应低音频组的一个频率和高音频组的一个频率,实现按键的发出双音。
4)能改变音乐包络形式,实现音型的改变。
5)能够演奏一段音乐。
6)为界面添加背景音乐,实现wav格式的声音的播放,同时可以用本软件播放视频,但是matlab不支持画音同步的功能,但是可以看到没有声音的视频。
7)能够实现对键盘的输入按键进行存储,等到输入结束后统一播放刚才输入的键盘按键相对应的声音。
三、总体设计3.1总体设计框架总体设计框图如下图所示,其包括单音键盘发音模块,音效长短的选择模块,包络的选择模块,实现键盘代替鼠标输入模块,双音多频模块,演奏音乐模块,播放歌曲,视频模块包括对文件播放的暂停,停止和复位,多键盘输入对输入后统一播放模块和画图模块。
3.2 功能模块1)单音键盘发音模块设计一个带参子函数实现键盘的发音功能,当实现需要实现音阶的播放时,只要调用这个子函数,并根据不同音阶、不同音调的频率改变子函数的参数即可。
2) 音效长短的选择模块制作一个button group的组控件分别选择不同的控件实现不同的音效长短,音效的长短是通过改变播放一个音阶的时间长短来实现的。
3)包络的选择模块制作一个button group的组控件分别选择不同的控件实现不同的包络,在模块一的基础上,设置选中不同的控件分别对应不同的包络,x为不同包络(如正弦波、三角波、指数等)的表达形式,将x与模块一中实现单音键盘发音的函数相乘时便可实现不同形式的衰减,实现音型的改变。
4)实现键盘代替鼠标输入模块根据计算机键盘上的不同按键对应不同的ASCII码的值,利用函数get()获取当前所按下的数字键对应的ASCII码的值,根据 ASCII码的值判断对应是按下键盘的值。
并执行相应音阶的功能键。
5)双音多频模块通过设置一个radio button 来实现双音多频的功能,设置一个全局变量,当选中该控件时,全局变量的值改变,即在带参的子函数中增加它的频率分量。
就可以实现双音多频功能。
6)演奏音乐模块通过设置一个push button键来实现,按下该键时,可以选择事先自己编好的txt的文档,通过这个文档就可以播放音乐。
7)播放歌曲,视频模块根据matlab提供的函数,视频时首先对文件的名字和路径进行提起,直接对文件的播放。
音乐的则是首先对文件的名字和路径进行提起,得到名字和路径后就对该文件进行采样,使其离散化。
最后实现对文件的播放。
8)多键盘输入对输入后统一播放模块该功能实现先对键盘输入内容进行存储,当输入完成后就可以按播放键对刚才的存储内容进行播放,本功能通过radio button键实现的键盘输入的存储,当该建被选中时,则会不断的扫描键盘是否有键盘按下,并对按下键进行存储,直到该键没有被选中为止,同时设置一个push button键对存储的信息进行播放,播放完成后自动清除存储的内容,以便下一次存储。
9)画图模块该模块的功能是根据播放每一个音符的数组画出每一个音符的波形,使我们对播放的音型可以一目了然,便于观察与分析。
四、具体设计4.1单音键盘发音模块(1)GUI界面的设计根据要求,首先利用push button键作为单音键盘的发音键。
1~7七个音阶对应高中低三种不同的音调共21个键,还有15个辅音,共36个按键。
如图所示,白色的按键代表音调键,前7个是低音的七个音阶,中间7个是中音的七个音阶,后面7个是高音的七个音阶,黑色的代表辅音。
(2)程序设计查阅相关资料可知,发音频率对应的表达式为f=440*2^((s-49)/12),当所发音为低音时s的取值为31~37,发中音时s的取值为40~46,发高音时s的取值为49~55。
为了程序设计简化目的,设计一个名为gangqin(s)的子函数,程序如下:function gangqin(s) % 演奏音符global r;global n;global ff;global T;global p;f=440*2^((s-49)/12); %各音阶的频率n=0:1/8000:T; %各音阶的长短if p==1 %选用包络x=exp(-3*n);elseif p==2x=exp(-3*n).*sawtooth(2*pi*50*n);elseif p==3x=exp(-3*n).*sin(2*pi*n);endif r==1 %选用单频还是多频ff=x.*sin(f*2*pi*n)+0.2*x.*sin(f*4*pi*n)+0.05*x.*sin(f*8*pi*n);else ff=x.*sin(f*2*pi*n);endaxes1_CreateFcn(); %画图soundsc(ff); %播放音符有以上带参的子函数后则每个键盘下面的程序非常简单,然后在每个push button 键的callback函数中调用该子函数即可,如qangqin(45);4.2 音效长短的选择模块(1)GUI界面的设计制作一个button group的组控件分别选择不同的控件实现不同的音效长短,该组控件包括三个radio button分别对应不同的音效长短(长,中,短)。
界面如下图所示:(2)程序设计音效长短的改变实质上是改变其音阶播放时间的长短,定义一个全局变量T 通过改变T的值来改变音效的长度,gangqin的子函数如上面所示,该组控件的程序如下面所示:global T;g=get(handles.yinxiao,'selectedobject'); %获得音效的选中对象gt=get(g,'tag'); %把对象赋给gtswitch gt %确认选中的对象case'duanyin'T=0.3;case'zhongyin'T=1;case'changyin'T=2;end4.3包络的选择模块(1)GUI界面的设计制作一个button group的组控件分别选择不同的控件实现不同的包络,该组控件包括三个radio button分别对应不同的包络。
如图所示,定义了指数波、三角波和正弦波三种不同形式的包络可供选择。
(2)程序设计将组合键中的button group键的Tag的值设置为“baol”,三个radio button键分别对应指数波、三角波、正弦波,相应的Tag设“zhishu”、” sanjiao”、” zhengxian”,def=get(de,'tag')获取三个Radio Button键中Tag的值,设置一个全局变量p,用switch函数实现,当case为' zhishu '时,p的值1; case为' sanjiao '时,p 的值2; case为' zhengxian '时p的值为3。
程序如下所示:global T;global n;global p;de=get(handles.baol,'selectedobject'); %获得包络选中的对象def=get(de,'tag'); %把选中对象的tag赋给defswitch def %确认选中的对象case'zhishu'p=1;case'sanjiao'p=2;case'zhengxian'p=3;end把p的值反应到gangqin(s)的子函数中,在子函数中根据不同的p的值选用不同的包络,即可实现不同的包络,所发出的音型便不一样。
gangqin(s)中包络部分程序如下:if p==1 %选择包络x=exp(-3*n);elseif p==2x=exp(-3*n).*sawtooth(2*pi*50*n);elseif p==3x=exp(-3*n).*sin(2*pi*n);end4.4实现键盘代替鼠标输入模块(1)GUI界面的设计用一个radio button键便可实现该功能,可以根据不同的键盘按键发出不同的音乐。
同时将该键的string改为“键盘”,表示这个键是实现键盘的功能。
如图所示:(2)程序设计根据计算机键盘上不同键对应的ASCII码的值不同,利用函数get()获取当前所按下的键对应的ASCII码的值,并执行相应播放音阶。
在radio button键的KeypressFcn函数中的程序如下:function jianpan_KeyPressFcn(hObject, eventdata, handles)s=get(handles.jianpan,'value'); %获得按下键的值if s==0 %看radio button 是否按下elseif get(gcf,'CurrentCharacter')==48gangqin(28);elseif get(gcf,'CurrentCharacter')==49gangqin(29);elseif get(gcf,'CurrentCharacter')==50gangqin(30);elseif get(gcf,'CurrentCharacter')==51gangqin(31);elseif get(gcf,'CurrentCharacter')==52gangqin(32);elseif get(gcf,'CurrentCharacter')==53gangqin(33);elseif get(gcf,'CurrentCharacter')==54gangqin(34);elseif get(gcf,'CurrentCharacter')==55gangqin(35);elseif get(gcf,'CurrentCharacter')==56gangqin(36);elseif get(gcf,'CurrentCharacter')==57gangqin(37);elseif get(gcf,'CurrentCharacter')==65gangqin(38);elseif get(gcf,'CurrentCharacter')==66gangqin(39);elseif get(gcf,'CurrentCharacter')==67gangqin(40);elseif get(gcf,'CurrentCharacter')==68gangqin(41);elseif get(gcf,'CurrentCharacter')==69gangqin(42);elseif get(gcf,'CurrentCharacter')==70gangqin(43);elseif get(gcf,'CurrentCharacter')==71 gangqin(44);elseif get(gcf,'CurrentCharacter')==72 gangqin(45);elseif get(gcf,'CurrentCharacter')==73 gangqin(46);elseif get(gcf,'CurrentCharacter')==74 gangqin(47);elseif get(gcf,'CurrentCharacter')==75 gangqin(48);elseif get(gcf,'CurrentCharacter')==76 gangqin(49);elseif get(gcf,'CurrentCharacter')==77 gangqin(50);elseif get(gcf,'CurrentCharacter')==78 gangqin(51);elseif get(gcf,'CurrentCharacter')==79 gangqin(52);elseif get(gcf,'CurrentCharacter')==80 gangqin(53);elseif get(gcf,'CurrentCharacter')==81 gangqin(54);elseif get(gcf,'CurrentCharacter')==82 gangqin(55);elseif get(gcf,'CurrentCharacter')==83 gangqin(56);elseif get(gcf,'CurrentCharacter')==84 gangqin(57);elseif get(gcf,'CurrentCharacter')==85 gangqin(58);elseif get(gcf,'CurrentCharacter')==86 gangqin(59);elseif get(gcf,'CurrentCharacter')==87 gangqin(60);elseif get(gcf,'CurrentCharacter')==88 gangqin(61);elseif get(gcf,'CurrentCharacter')==89 gangqin(62);elseif get(gcf,'CurrentCharacter')==90 gangqin(63);end4.5 双音多频模块(1)GUI界面的设计通过设置一个radio button 来实现双音多频的功能,当选中该按钮时,则增加它的频率分量。