Matlab课程设计报告--MATLAB GUI的音乐键盘仿真
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《 MATLAB 实践》
课程设计
目录
1.设计目的 (3)
2.题目分析 (3)
3.总体设计 (4)
4.具体设计 (4)
5.结果分析 (15)
6.心得体会 (15)
1、设计目的:
运用MATLAB实现MATLAB的GUI程序设计。
2、题目分析:
课程设计题目:
MATLAB GUI的音乐键盘仿真
课程设计的基本要求:
1)熟悉和掌握MATLAB 程序设计方法。
2)掌握MATLAB GUI 程序设计。
3)学习音乐合成基本知识。
设计分析:
这次使用的设计软件是MATLAB的GUI模块,要设计一个音乐键盘要知道一个最简单的键盘本身要有36个发音键,既21个音阶和15个辅音阶。
于是就要在界面上画出36个pushbutton键,再根据其他要求的功能设计出其他相应的模块。
模拟键盘发音是使用音频函数soundsc将不同频率的函数以声音的模式表现出来,而每个音阶相差频率f=440*2^2/12;音阶与相应的辅音阶相差频率f=440*2^1/12。
有了音乐合成的这些基本知识后便可根据自己需要设计界面根据功能编写相应的回调函数。
课程设计的内容:
学习MATLAB GUI程序设计,设计和实现一个音乐键盘仿真系统。
要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。
然后按照自己拟定的功能要求进行程序设计和调试。
1)设计音乐键盘GUI界面,实现单音键盘的发声。
2)实现键盘的双音多频,即每个键盘对应低音频组的一个频率和高音频组的一个频率,实现按键的发出双音。
3)能改变音乐包络形式,实现音型的改变。
4)能够演奏一段音乐。
5)改变键盘的音色,给基音加上泛音序列,模拟不同的乐器演奏。
6)选作:根据节奏节拍,根据简谱自动演奏一段音乐。
3、总体设计
其中琴键区域实现按键发声,可用鼠标点击,也可以用键盘实现;显示屏区域实现声音波形的实时显示;控制区域实现对整个系统的控制,包括音乐播放、暂停、停止,视屏播放,乐器切换,节拍切换和谐波切换。
4、具体设计
外板设计图如下:
4.1 琴键区域设计
(1)界面设计
(2)单个按键函数设计
该琴键设计为C调,1对应频率为261.63Hz,相邻两键为一个半音,频率比为:2^1/12,因此后面频率类推,如2对应293.67Hz。
单个按键函数如下:
function pushbutton1_Callback(hObject, eventdata, handles)
f=261.63;
if get(handles.radiobutton3,'Value')==1;
N=8000;
end;
if get(handles.radiobutton4,'Value')==1;
N=2000;
end;
if get(handles.radiobutton5,'Value')==1;
N=25000;
end;
if get(handles.radiobutton9,'Value')==1;
T=1;
end;
if get(handles.radiobutton10,'Value')==1;
T=0.5;
end;
if get(handles.radiobutton11,'Value')==1;
T=0.25;
end;
n=0:1/N:T;
x=exp(-2*n);
if get(handles.radiobutton14,'Value')==1;
ft=x.*sin(f*2*pi*n);
end
if get(handles.radiobutton13,'Value')==1;
ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n);
end
if get(handles.radiobutton12,'Value')==1;
ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n)+0.3*sin(f*3*2*pi*n);
end
voice=get(handles.voice,'Value')
sound(ft*voice,8000);
plot(n,ft);
axis tight;
(3)实现结果:
可以根据按下不同的键,发出不同音调的声音,且没有失真。
4.2显示屏区域设计
(1)界面设计
(2)函数设计
改模块主要功能是用来实现声音波形实时显示,因此只需要要在每个按键函数里面添加波形显示函数即可:
plot(n,ft);
axis tight;
(3)功能实现
钢琴,1/2节拍,单音波形
敲击,1/8节拍,2次谐波波形
4.3 节拍切换设计
(1)界面设计
(2)函数设计
if get(handles.radiobutton3,'Value')==1; N=8000;
end;
if get(handles.radiobutton4,'Value')==1;
N=2000;
end;
if get(handles.radiobutton5,'Value')==1;
N=25000;
end;
if get(handles.radiobutton9,'Value')==1;
T=1;
end;
if get(handles.radiobutton10,'Value')==1;
T=0.5;
end;
if get(handles.radiobutton11,'Value')==1;
T=0.25;
end;
n=0:1/N:T;
(3)功能实现
‘duo’音,1/2节拍:
‘duo’音,1/4节拍:
‘duo’音,1/8节拍:
4.4 谐波切换设计
(1)界面设计
(2)函数设计
if get(handles.radiobutton14,'Value')==1;
ft=x.*sin(f*2*pi*n);
end
if get(handles.radiobutton13,'Value')==1;
ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n);
end
if get(handles.radiobutton12,'Value')==1;
ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n)+0.3*sin(f*3*2*pi*n);
end
(3)功能实现
‘duo’音,单音谐波:
‘duo’音,1次谐波:
‘duo’音,2次谐波:
(1)界面设计
(2)函数设计
Music:选取音乐
function pushbutton35_Callback(hObject, eventdata, handles)
global yinyue;
[FileName,PathName]=uigetfile('*.wav','Music Play');
[y,fs,bits]=wavread(FileName);
yinyue=audioplayer(y,fs)
voice=get(handles.voice,'Value')
play(yinyue);
Pauses:播放暂停
function pushbutton38_Callback(hObject, eventdata, handles)
global yinyue;
pause(yinyue);
Stop:播放停止
function pushbutton37_Callback(hObject, eventdata, handles)
global yinyue;
stop(yinyue);
Resume:播放恢复
function pushbutton40_Callback(hObject, eventdata, handles)
global yinyue;
resume(yinyue);
(3)功能实现
(1)界面设计
(2)函数设计
function pushbutton48_Callback(hObject, eventdata, handles) [name,path]=uigetfile('*.*','');
file=sprintf('%s%s',path,name);
mplay(file,24);
(3)功能实现
4.7 音量控制设计
(1)界面设计
(2)函数设计
voice=get(handles.voice,'Value')
sound(ft*voice,8000);
(3)功能实现
能实现对音量的调节
4.8键盘控制发音设计
(1)界面设计
(2)函数设计
function figure1_KeyPressFcn(hObject, eventdata, handles) if get(gcf,'CurrentCharacter')==49, %Èç¹û°´ÏµÄÊÇ1
pushbutton10_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==50, %Èç¹û°´ÏµÄÊÇ2
pushbutton15_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==51, %Èç¹û°´ÏµÄÊÇ3
pushbutton16_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==52, %Èç¹û°´ÏµÄÊÇ4
pushbutton17_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==53, %Èç¹û°´ÏµÄÊÇ5
pushbutton18_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')=='C', %Èç¹û°´ÏµÄÊÇC
pushbutton1_Callback(hObject,eventdata,handles); end if get(gcf,'CurrentCharacter')==68, %Èç¹û°´ÏµÄÊÇD
pushbutton2_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==69, %Èç¹û°´ÏµÄÊÇE
pushbutton3_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==70, %Èç¹û°´ÏµÄÊÇF
pushbutton4_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==71, %Èç¹û°´ÏµÄÊÇG
pushbutton5_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==65, %Èç¹û°´ÏµÄÊÇA
pushbutton6_Callback(hObject,eventdata,handles);end if get(gcf,'CurrentCharacter')==66, %Èç¹û°´ÏµÄÊÇB
pushbutton7_Callback(hObject,eventdata,handles);end
(3)功能实现
能通过按下对应键盘,发出对应声音。
如按下C键,发“duo”音
4.9界面美观设计:选自己的图片作为背景
(1)界面设计
(2)函数设计
function figure1_CreateFcn(hObject, eventdata, handles)
ha=axes('units','normalized','position',[0.583 0.01 0.417
0.984]);
uistack(ha,'down')
II=imread('2.bmp');
image(II)
colormap gray
set(ha,'handlevisibility','off','visible','off');
(3)功能实现
4.10乐谱播放设计
(1)界面设计
(2)函数设计
function qinpu(a,b)
f=261.6*2^(a/12);
n=0:1/8000:b*0.5;
x=exp(-2*n);
ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n)+0.3*sin(f*3*2*pi*n);
soundsc(ft);
plot(n,ft);
axis tight;
function pushbutton49_Callback(hObject, eventdata, handles)
[name,path]=uigetfile('*.*','');
file=sprintf('%s%s',path,name);
de=importdata(file);
for k=1:length(de)
qinpu(de(k),de(k+length(de)));
pause(0.5)
end
(3)功能实现
播放事先编辑好的乐谱
5、结果分析
基本上要求的内容都能实现,但是也纯在一些欠缺:
(1)使用键盘发声时如果弹得太快,函数执行的速度跟不上容易形成音阶与节拍对不上位,在用其演奏歌曲时有点欠缺。
(2)在播放视频时无法将食品中的声音一起播出,我有上网查过好像MATLAB 现在还无法实现播放视频连带视频中的声音。
(3)乐器切换功能做的不够完善,一方面也是因为自己对音律知识的欠缺。
在今后的学习过程中,希望能通过自己的努力去完成修补这些欠缺的点。
6、心得体会
说实在的这次的MATLAB实验的题目比较令人感兴趣,无论是做PS,音乐键盘还是数据库都让人比较有兴趣去尝试。
跟以往很学术性的实验课设题目大大不同,做完实验每个人都可以利用自己的作品要么玩弄自己的照片,要嘛编歌或者自弹自唱等!模板的设计多种做样格局自己的审美可以设计不同的界面。
查数据、编程序的过程也可以让自己学到许多知识同时也培养了自己的动手能力,总之,通过这次试验和同学的交流学到了很多东西,培养了动手实验的兴趣也很有成就感。
通过对电子琴此程序的研究与设计,对我们以后论文的书写打下了坚实的基础,同时也使思想提前进入了对论文的思考,这些无疑是给我们提供了一个很好的平台。
参考书目:
[1]MATLAB实用教程(第二版)电子工业出版社
[2]《信号与系统—MATLAB综合实验》谷源涛高等教育出版社
[3]张志涌等精通MATLAB【M】6.5版 .北京:北京航空航天大学出版社,2003,3 [4]董霖. MATLAB使用详解——基础、开发及工程应用北京:电子工业出版社,2009.1 [5]蔡旭辉,刘卫国,蔡立燕. MATLAB基础与应用教程北京:人民邮电出版社,2009.8 [6]Chapman S J. MATLAB Programming for Enginerrs.
Brooks/Cole. CA,2002.。