课程设计(论文)-基于MATLAB的音乐电子琴制作_第1页
课程设计(论文)-基于MATLAB的音乐电子琴制作_第2页
课程设计(论文)-基于MATLAB的音乐电子琴制作_第3页
课程设计(论文)-基于MATLAB的音乐电子琴制作_第4页
课程设计(论文)-基于MATLAB的音乐电子琴制作_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、姓名:班级:2013级电子信息工程1班学号: / 14基于MATLAB的音乐电子琴制作简述:电子琴的每个音阶均对应一个特定频率的信号,通过调用数字信号发生器产生一系列指定的频率的声音,从而达到虚拟的电子琴的功能。本次设计是基于MATLAB GUI程序实现的一个音乐键盘仿真系统。1功能介绍总体设计框图如下图所示,其包括单音键盘发音模块,音效长短的选择模块,包络的 选择模块,实现键盘代替鼠标输入模块,双音多频模块,演奏音乐模块,播放歌曲,视频 模块包括对文件播放的暂停,停止和复位,多键盘输入对输入后统一播放模块和画图模 块。Matlab的数据采集工具箱(DAT)提供了一系列的函数和命令来实现实时模

2、拟信号的输出 通过调用这些函数和命令可以直接控制声卡输出虚拟信号。只需要一台带有普通多媒体声 卡并安装了 Matlab软件的计算机就可以满足要求实现虚拟信号的输出,系统结构简单方便。交互界面如图1所示:图1程序的交互界面1.1功能模块1)单音键盘发音模块设计一个带参子函数实现键盘的发音功能,当实现需要实现音阶的播放时,只要调用 这个子函数,并根据不同音阶、不同音调的频率改变子函数的参数即可。2)音效长短的选择模块制作一个button group的组控件分别选择不同的控件实现不同的音效长短,音效的长 短是通过改变播放一个音阶的时间长短来实现的。3)包络的选择模块制作一个button group的

3、组控件分别选择不同的控件实现不同的包络,在模块一的基 础上,设置选中不同的控件分别对应不同的包络,x为不同包络(如正弦波、三角波、指数等)的表达形式,将 x与模块一中实现单音键盘发音的函数相乘时便可实现不同形式的 衰减,实现音型的改变。4)实现键盘代替鼠标输入模块根据计算机键盘上的不同按键对应不同的ASCII码的值,利用函数 get()获取当前所按下的数字键对应的 ASCII码的值,根据 ASCII码的值判断对应是按下键盘的值。并执行相应 音阶的功能键。5)双音多频模块通过设置一个radio butt on来实现双音多频的功能,设置一个全局变量,当选中该控件 时,全局变量的值改变,即在带参的子

4、函数中增加它的频率分量。就可以实现双音多频功 能。6)演奏音乐模块通过设置一个push button键来实现,按下该键时,可以选择事先自己编好的txt的文档,通过这个文档就可以播放音乐。7)播放歌曲,视频模块根据matlab提供的函数,视频时首先对文件的名字和路径进行提起,直接对文件的播 放。音乐的则是首先对文件的名字和路径进行提起,得到名字和路径后就对该文件进行采 样,使其离散化。最后实现对文件的播放。8)多键盘输入对输入后统一播放模块该功能实现先对键盘输入内容进行存储,当输入完成后就可以按播放键对刚才的存储 内容进行播放,本功能通过radio butt on键实现的键盘输入的存储,当该建被

5、选中时,则会不断的扫描键盘是否有键盘按下,并对按下键进行存储,直到该键没有被选中为止,同 时设置一个push butt on键对存储的信息进行播放,播放完成后自动清除存储的内容,以便 下一次存储。9)画图模块该模块的功能是根据播放每一个音符的数组画出每一个音符的波形,使我们对播放的 音型可以一目了然,便于观察与分析。2功能实现程序由两个部分组成:MATLAB代码(.m文件)和GUI图形(.fig)。备注:软件版本: MATLAB R2011b2.1单音键盘发音模块根据要求,首先利用 push butt on键作为单音键盘的发音键。 17七个音阶对应高中低 三种不同的音调共 21个键,还有15个

6、辅音,共36个按键。如图2所示,白色的按键代 表音调键,前7个是低音的七个音阶,中间 7个是中音的七个音阶,后面 7个是高音的七 个音阶,黑色的代表辅音。查阅相关资料可知,发音频率对应的表达式为f=440*2A(s-49)/12),当所发音为低音时s的取值为3137,发中音时s的取值为4046,发高音时s的取值为4955。为了程序设 计简化目的,设计一个名为gan gqi n(s )的子函数。有以上带参的子函数后则每个键盘下面的程序非常简单,然后在每个push butt on键的callback函数中调用该子函数即可,女口 gangqin( 45);厂同音区中音区1 (DO37(5114 (F

7、A6 (LA)图2单音键盘发音模块具体代码参见:fun cti ongangqin(s)2.1.1音效长短的选择模块制作一个butt on group的组控件分别选择不同的控件实现不同的音效长短,该组控件 包括三个radio button分别对应不同的音效长短(长,中,短)。音效长短的改变实质上是改变其音阶播放时间的长短,定义一个全局变量T通过改变 T的值来改变音效的长度,gangqin的子函数如上面所示。界面如图3所示:图3音效长短的选择模块 具体代码参见:Fun cti onyin xiao Callback (hObject, eve ntdata, han dies)2.2包络的选择模

8、块制作一个butt on group的组控件分别选择不同的控件实现不同的包络,该组控件包括 三个radio butt on分别对应不同的包络。如图4所示,定义了方波、三角波和正弦波三种不同形式的包络可供选择。图4包络的选择模块将组合键中的 button group键的Tag的值设置为baol ”三个radio butt on键分别对应 指数波、三角波、正弦波,相应的Tag设“ zhishu ”、” sanjiao ” ” zhengxian ”, def=get(de,tag)获取三个 Radio Button键中Tag的值,设置一个全局变量p,用switch函数实现,当 case 为zhis

9、hu 时,p 的值 1; case 为sanjiao 时,p 的值 2; case 为zhengxian 时 p的值为3。把p的值反应到gangqin( s)的子函数中,在子函数中根据不同的p的值选用不同的包络,即可实现不同的包络,所发出的音型便不一样。由于电子琴的实验结果是声 音,难以用文字表达,在下面仅用几张图片展示一下结果。图5正弦波包络图6方波包络图7三角波 具体代码参见:Fun cti onbaoluo Callback (hObject, eve ntdata, han dies)2.3实现键盘代替鼠标输入模块用一个radio butt on键便可实现该功能,可以根据不同的键盘按键

10、发出不同的音乐。同时将该键的string改为键盘”,表示这个键是实现键盘的功能。如图8所示:图8键盘代替鼠标输入根据计算机键盘上不同键对应的ASCII码的值不同,利用函数get()获取当前所按下的键对应的ASCII码的值,并执行相应播放音阶。具体代码参见:fun cti onjia npan _KeyPressFc n( hObject, eve ntdata, han dies)2.4双首多频模块通过设置一个radio butt on来实现双音多频的功能,当选中该按钮时,则增加它的频率 分量。使其含有丰富频率分量。如图9所示:图9双音多频模块具体代码参见:fun cti onduop in

11、_Callback(hObject, eve ntdata, han dies)2.5演奏音乐模块通过设置一个 push butt on 键来实现,如图10所示:图10播放谱曲按下该键时,界面会要求你选择文档,可以选择事先自己编好的文档,并按打开键就可以播放音乐。txt文件的内容如图11所示:txt的文档,选中该立 1tlF| : IftTtiOj MhVl 科&n合3111 1o -n- 7 7 _y a* 4 4 4 447 1.I45 14-4 14-442 L42 1L40 20i47 .4B .4 & 0.0, 豹0.42 0.47 047 004S 044 44 Q,图11乐谱内容

12、Txt文件代表的意思是如44 1 是表示频率为 44,延长的长度为1。播放音乐不仅需要确定每个音符,还要确定每个音符延长的时间,音符延长的时间是 有n的取值大小所确定的。因此这里就可以调用子函数的形式方便的实现。具体代码参见:fun cti on qin pu(a,b)fun cti on dakai Callback(hObject, eve ntdata, han dies)2.6播放歌曲,视频模块本功能的实现是通过 push button键来实现的。界面如图12所示:图12播放歌曲 视频模块通过按下播放歌曲键或者播放视频键就可以选择播放的文件,界面如图13所示:按打开按钮就可以播放音乐或

13、视频。图13播放视频视频时首先对文件的名字和路径进行提起,直接对文件的播放,用的是matlab自带的函数implay()。音乐的则是首先对文件的名字和路径进行提起,得到名字和路径后就对该 文件进行采样,使其离散化。最后实现对文件的播放。这里不仅可以对音乐的播放,还可 以对音乐的暂停,复位和停止。分别用到matlab自带的函数:播放play (),暂停pause(),复位 resume ()和停止 stop ()。具体代码参见:fun cti onship in _Callback(hObject, eve ntdata, han dles)fun cti oncha ngge_Callback

14、(hObject, eve ntdata, han dles)2.7多键盘输入后统一播放模块本功能通过radio button键实现的键盘输入的存储,当该建被选中时,则会不断的扫 描键盘是否有键盘按下,并对按下键进行存储,直到该键没有被选中为止,同时设置一个 push butt on键对存储的信息进行播放,播放完成后自动清除存储的内容,以便下一次存 储。界面如图14所示:图14多键盘输入后播放该功能实现先对键盘输入内容进行存储,当输入完成后就可以按播放键对刚才的存储 内容进行播放,播放完成后对存储的内容进行清空。实现对键盘的输入内容进行存储,并 把存储的值整合到数组y内,push butt o

15、n键是对上述存储的信息进行读取,识别并播放。具体代码参见:fun cti onjia nc_KeyPressFc n( hObject, eve ntdata, han dies)fun cti onbf_Callback(hObject, eve ntdata, han dies)2.8画图模块通过axse控件实现绘图,绘出播放每个音阶的波形,并把画出的波形显示到axse上,界面如图15所示:图15音阶的波形该模块的功能是根据播放每一个音符的数组画出每一个音符的波形,并把其显示在界 面上。具体代码参见:fun cti onaxes1_CreateFc n( hObject, eve ntda

16、ta, han dies)3程序总结本程序实现简单的音频处理功能及便捷的图形化交互界面。具有以下特点与缺陷:1、图形化用户交互界面简洁明了。右侧放置音频视频播放的各选项控件,且从上到下 的排布体现操作步骤;上侧显示音频文件的数据波形。提示信息丰富,方便操作。2、程序可扩展性好,方便功能扩展。未尽功能:(1)没有调节音量大小的按钮,可以优化。(2)声音播放时,实时的显示播放进度。(3)更为实际的音频处理功能待加强。4课程总结整个制作和调试过程都是按模块进行的,对每一个模块功能的实现的情况下才对下一 个功能进行制作。刚开始做模块一时,由于没有想到后面的一些功能所以就没有写子函 数,是在每一个按键下

17、都写了一个声音播放的程序,这样做不仅量大也很不方便。因此后 面改成了子函数的形式,这样的话程序不仅简练也很好调用,非常方便。在调试过程中先 将函数gangqin(s)中的全局变量p的不同数字代表不同的波形表达式,鼠标点击包络组控件 的不同按钮,选择不同的包络,听起来的效果也相差较大,当包络为指数形式时较符合平 时听音乐的习惯。还有一个是gangqin( s)中的全局变量 T,不同的值表示不同的音效长短。播放的时间是不一样的,因此听起来会有不同的感觉。调试过程中应根据相关资料和 自己的感觉不断改变这两个值的数字,最终选择一个听起来较为合适的取值。上述完成后 就需要做键盘代替鼠标按键的功能,首先需

18、要了解按下键盘电脑获得的是按键的ASCII值。所以我们必须把按键的ASCII的值对应到播放不同音符的频率上去,这样才能灵活的控制每一个音符,每个音符要与键盘的按键形成一一对应关系,不然的话程序很容易出 错。程序完成后,需要对程序进行调试,使得每一个键盘的按钮按下对应的音符会播放出 来。接下来制作的是键盘的存储功能,即实现对键盘的多输入,输入过程中音符是不会响 的,当输入结束后可以控制对刚才输入的按键对应的音符进行播放声音。刚开始是一直对 数字的存储个数会多很多,后面才知道但你按下键时程序已经运行了好多遍了,每次按键 是当然就会存储多个相同的值。改进后就一直只能对最后一次按键进行存储,前面的被当

19、 前的值覆盖,后面设置了一个存储数据的数组进行存储,使得功能才能实现。本次课程设计,我花了大量的时间来做这些功能,但是做完后感觉功能又特别简单,而 且做的大部分时间都是做一些无用的工作,程序一直不够简单,经常用一条很长的程序来 实现一个简单的功能,做完过后发现可以用简单的程序就可以实现,整个制作过程中大部 分的时间都花在这样的工作上,工作效率很低。同时感觉到自己对matlab的编程了解太少,很多基本功能多不了解。完成实践后我深深的体会到了MATLAB功能的强大,它不但可以实现对声音信号的处理,对图像的处理,同时还可以对视频,wav格式歌曲的播放以及还有很多我现在还不知道的很多强大的功能。在实验

20、过程中,遇到了很多问题。首先是 资料的缺乏,没能找到老师推荐的信号与系统一MATLAB综合实验,所以大部分的参考资料只能上网查找没有什么权威性。还有自己对matlab的了解本来就很浅,很多知识都不懂,经常需要问老师,同学或者上网查资料。在设计刚开始没有什么明确的思路导致经常 改GUI界面,最后实在无法改了就重新设计,思路很不明确,希望在以后的学习和工作中 能好好利用这次实践的经验,要先想好总体思路,不能到临时才改,这样的话,不仅工作 量大,还耗时多。本次实践使我受益匪浅。附录(部分程序)fun cti on gangqin(s) %演奏音符global r;global n;global ff

21、;global T;global p;f=440*2A(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).*si n(2*pi* n);endif r=1%选用单频还是多频ff=x.*si n(f*2*pi* n)+0.2*x.*si n( f*4*pi* n)+0.05*x.*si n(f*8*pi* n);else ff=x.*s in( f*2*pi* n);endaxes1_Cre

22、ateFc n();%画图sou ndsc(ff);%播放音符Fun cti on yin xiao_Callback (hObject, eve ntdata, han dies)global T;g=get(ha ndles.yi nxiao,selectedobject);%获得音效的选中对象gt=get(g,tag);%把对象赋给 gtswitch gt%确认选中的对象case dua nyinT=0.3;case zh ongyinT=1;case cha ngyinT=2;EndFun cti on baoluo_Callback (hObject, eve ntdata, han

23、 dles) global T; global n; global p;de=get(ha ndles.baol,selectedobject);%def=get(de,tag);%switch defcase 正弦波x=0:0.001:1;y1=A*si n(2*f*pi*x+c); plot(x,y1);case 三角波x=0:0.001:1;y2=A*sawtooth(2*pi*f*x+c); plot(x,y2);case 方波x=0:0.001:1;y3=A*square(2*f*pi*x+c);plot(x,y3);end function jianpan KeyPressFcn(

24、hObject, eventdata, handles)s=get(ha ndles.jia npan ,value);%if s=0%elseif get(gcf,Curre ntCharacter)=48 ga ngqi n( 28);elseif get(gcf,Curre ntCharacter)=49 ga ngqi n( 29);elseif get(gcf,Curre ntCharacter)=50 ga ngqi n( 30);elseif get(gcf,Curre ntCharacter)=51 ga ngqi n( 31);elseif get(gcf,Curre ntC

25、haracter)=52 ga ngqi n( 32);elseif get(gcf,Curre ntCharacter)=53 ga ngqi n( 33);获得包络选中的对象把选中对象的tag赋给def获得按下键的值看radio butt on是否按下elseif get(gcf,Curre ntCharacter)=54ga ngqi n( 34);elseif get(gcf,Curre ntCharacter)=55 ga ngqi n( 35);elseif get(gcf,Curre ntCharacter)=56 ga ngqi n( 36);elseif get(gcf,Cu

26、rre ntCharacter)=57 ga ngqi n( 37);elseif get(gcf,Curre ntCharacter)=65 ga ngqi n( 38);elseif get(gcf,Curre ntCharacter)=66 ga ngqi n( 39);elseif get(gcf,Curre ntCharacter)=67 gangqin (40);elseif get(gcf,Curre ntCharacter)=68 gangqin (41);elseif get(gcf,Curre ntCharacter)=69 ga ngqin( 42);elseif get

27、(gcf,Curre ntCharacter)=70 gangqin (43);elseif get(gcf,Curre ntCharacter)=71 ga ngqin( 44);elseif get(gcf,Curre ntCharacter)=72 gangqin (45);elseif get(gcf,Curre ntCharacter)=73 ga ngqin( 46);elseif get(gcf,Curre ntCharacter)=74 ga ngqin( 47);elseif get(gcf,Curre ntCharacter)=75 gangqin (48);elseif

28、get(gcf,Curre ntCharacter)=76 gangqin (49);elseif get(gcf,Curre ntCharacter)=77 ga ngqi n( 50);elseif get(gcf,Curre ntCharacter)=78 ga ngqi n( 51);elseif get(gcf,Curre ntCharacter)=79 ga ngqi n( 52);elseif get(gcf,Curre ntCharacter)=80 ga ngqi n( 53);elseif get(gcf,Curre ntCharacter)=81ga ngqi n( 54

29、);elseif get(gcf,Curre ntCharacter)=82 ga ngqi n( 55);elseif get(gcf,Curre ntCharacter)=83 ga ngqi n( 56);elseif get(gcf,Curre ntCharacter)=84 ga ngqi n( 57);elseif get(gcf,Curre ntCharacter)=85 ga ngqi n( 58);elseif get(gcf,Curre ntCharacter)=86 ga ngqi n( 59);elseif get(gcf,Curre ntCharacter)=87 g

30、a ngqi n( 60);elseif get(gcf,Curre ntCharacter)=88 ga ngqi n( 61);elseif get(gcf,Curre ntCharacter)=89 ga ngqi n( 62);elseif get(gcf,Curre ntCharacter)=90 ga ngqi n( 63);endfun cti on duop in _Callback(hObject, eve ntdata, han dies) global r;r=get(ha ndles.duop in ,value);%if r=1%选单频还是多频ff=x.*si n(f

31、*2*pi* n)+0.2*x.*si n( f*4*pi* n)+0.05*x.*si n(f*8*pi* n);else ff=x.*s in( f*2*pi* n);End多频的按钮是否选中fun cti on qin pu(a,b) %度global r;global n;global ff;f=440*2A(a-49)/12);n=0:1/8000:b*0.5;%x=exp(-2* n);if r=1%播放不同延长音的音符a表示音阶的频率 b表示延长音的长延长不同的长度选用单频还是多频播放ff=x.*si n(f*2*pi* n)+0.2*x.*si n( f*4*pi* n)+0.

32、05*x.*si n(f*8*pi* n); else ff=x.*s in( f*2*pi* n);endaxes1_CreateFc n();%sou ndsc(ff);%画图播放音符fun cti on dakai_Callback(hObject, eve ntdata, han dles) n ame,path=uigetfile(*,);%file=spr in tf(%s%s,path ,n ame);de=importdata(file);%for k=1:le ngth(de)qin pu(de(k),de(k+le ngth(de);%end读取文件读取文件的数据按文件数据

33、播放音符fun cti on ship in _Callback(hObject, eve ntdata, han dles)% n ame,path=uigetfile(*,);file=path, name;implay(file);播放视频程序fun cti on cha ngge_Callback(hObject, eve ntdata, han dles) global yinl;n ame,path=uigetfile(*,);%file=path, name;y,fs,bits=wavread(file);%yinl = audioplayer(y, fs);%play(yi nl);%打开文件对打开的wav文件进行采样 对采样的值进行读取 播放wav格式文件global yi nl;pause( yin l);%暂停fun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论