✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

⛄ 内容介绍

每个某块功能的设计方案(帮助理解)

(1)设计音乐键盘GUI界面,实现单音音阶的发声;

方案:通过matlab中的命令行窗口输入guide打开GUI,并在GUI界面上设计键盘布局,通过查找每个音阶对应的频率[2]以及寻找与真实音阶振幅波形相似的函数[1],利用每个按键的callback函数与封装好的Press函数相结合,便可以实现音阶的发声功能。

(2)实现改变音阶的长短(持续时间),即可以实现倍速功能;

方案:利用GUI中滑块组件,通过读取滑块的值赋值于一个设置好的全局变量,再通过该全局变量传递传递到音阶播放间隔时长的函数中,通过修改该函数的播放时间的值,即可以实现倍速的功能。

(3)经过每个琴键按键关联键盘,实现键盘弹琴功能;

方案:通过调用GUI界面的WindowkeyPressFcn函数,在该函数中写上switch和case判断语句对键盘的按键输入进行判断,在判断过后回到该按键对应的callback函数中,即可实现键盘弹琴功能。

(4)实现乐谱输入自动“弹奏”琴键功能;

方案:通过可编辑文本框于按钮键结合,在按钮键中读取可编辑文本框中的字符串,并利用字符串的长度来设置for循环的次数,在for循环中利用switch和case语句实现对字符串的判断,在判断过后回到该按键对应的callback函数中,即可实现输入乐谱自动弹奏功能功能。

(5)实现随时中断停止乐谱的“自动弹奏”功能;

方案:通过按键的回调函数,在该函数内部加上全局变量,当按键被按下时,便设置该全局变量为1,当该全局变量为1时,即不进行在另外的函数中if循环中的switch-case语句判断,直接跳出循环,不会调用到任何一个钢琴键的callback函数。这便实现了停止自动弹奏的功能。

(6)通过一个乐谱输出框,实现记谱功能;

方案:先在启动函数中设置一个空字符串的全局变量,再在每个琴键的callback函数中都设调用该全局变量,利用字符串连接函数将不同琴键代表的音阶与该全局变量连接并再次赋值于该全局变量,最后利用set函数对动态文本框进行输出即可实现记谱功能。

(7)实现显示当前演奏音阶的波形及频谱;

方案:利用与钢琴琴声振幅曲线近似的曲线写出每个音阶对应的函数,在Press函数中写上plot函数,因为Press函数的输入值具有频率量,所以每个音阶画出的图像都是不同的。再利用fft做出快速傅里叶变换,同样利用plot函数也可画出音阶的频谱。

(8)绘制波形演示音乐的音阶变化;

方案:在GUI启动函数中定义一个1×10的空数组,并设置每个音阶对应不同的值,由低到高。并通过if判断语句对每次按下的音阶进行判断,判断后赋值于数组中。在下一个音阶按下时,利用数组下移操作,使得利用plot函数呈现出来的图像随着音阶的按下不断移动。同时对数组设置一个界,利用if语句判断,当数组再次移动超过该界时,丢弃数组的最后一位数据,使之为0。反复重复该操作也就实现了音阶变化的波形绘制。

(9)实现通过按键清空乐谱输出框的功能;

方案:在按键的回调函数中,调用set函数赋值给乐谱输出框一个空字符串即可实现清空乐谱输出框的功能。

(10)能够以txt文本或者其它允许的格式输出乐谱;

方案:在GUI界面中新增按钮,在该按钮的回调函数中,使用get函数获取乐谱输出框中的字符串。同时在GUI界面中,加入一个动态文本框,其用来输入所需保存的地址以及想要保存的文件格式。同样利用get函数得到该地址。将get到的字符串以及地址放入函数writematrix中,即可实现输出乐谱以matlab所允许的格式保存到用户所想保存的地址中。

(11)实现能够开启和关闭键盘的弹琴功能

方案:在GUI界面中新增按钮,并在GUI的启动函数中新增一个全局变量,该全局变量在启动时设置为1。每次按钮按下后,该全局变量便取一次反,并在先前设置好的WindowPressFcn函数中加入判断语句,只有当该全局变量为1时,才能进入switch语句进行键盘输入判断。由此便实现了键盘弹琴功能的开启与关闭。

(12)设计出GUI封面

方案:新建一个GUI,并在GUI中加入按钮。在按钮的回调函数中利用set函数进行不同前缀的.fig文件的运行与关闭。即可设计出从GUI封面进入用户操作界面。

(13)实现对输入文本框进行检错检测功能

方案:在GUI界面中新增按钮,在按钮的回调函数中,对该输入文本框的字符串进行读取。读取后利用str2double函数转为double类型变量进行if语句判断,若超过或者小于我们设定的值,便利用set函数将提示语句输出到该输入文本框中。由此便实现了对输入文本框的检错检测功能。

⛄ 部分代码

function varargout = title(varargin)

% TITLE MATLAB code for title.fig

%      TITLE, by itself, creates a new TITLE or raises the existing

%      singleton*.

%

%      H = TITLE returns the handle to a new TITLE or the handle to

%      the existing singleton*.

%

%      TITLE('CALLBACK',hObject,eventData,handles,...) calls the local

%      function named CALLBACK in TITLE.M with the given input arguments.

%

%      TITLE('Property','Value',...) creates a new TITLE or raises the

%      existing singleton*.  Starting from the left, property value pairs are

%      applied to the GUI before title_OpeningFcn gets called.  An

%      unrecognized property name or invalid value makes property application

%      stop.  All inputs are passed to title_OpeningFcn via varargin.

%

%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one

%      instance to run (singleton)".

%

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help title

% Last Modified by GUIDE v2.5 10-Mar-2023 16:56:56

% Begin initialization code - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

                   'gui_Singleton',  gui_Singleton, ...

                   'gui_OpeningFcn', @title_OpeningFcn, ...

                   'gui_OutputFcn',  @title_OutputFcn, ...

                   'gui_LayoutFcn',  [] , ...

                   'gui_Callback',   []);

if nargin && ischar(varargin{1})

    gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

    gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before title is made visible.

function title_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

% hObject    handle to figure

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% varargin   command line arguments to title (see VARARGIN)

% Choose default command line output for title

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

% UIWAIT makes title wait for user response (see UIRESUME)

% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.

function varargout = title_OutputFcn(hObject, eventdata, handles) 

% varargout  cell array for returning output args (see VARARGOUT);

% hObject    handle to figure

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure

varargout{1} = handles.output;

% --- Executes on button press in pushbutton1.

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton1 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

g=piano2;

set(g,'Visible','on');

set(title,'Visible','off'); 

% --- Executes during object creation, after setting all properties.

function figure1_CreateFcn(hObject, eventdata, handles)

% hObject    handle to figure1 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    empty - handles not created until after all CreateFcns called

ha=axes('units','normalized','pos',[0 0 1 1]);

uistack(ha,'down');

pic=imread('background.jpg');

image(pic);

colormap gray

set(ha,'handlevisibility','off','visible','on');

% --- Executes during object creation, after setting all properties.

function text2_CreateFcn(hObject, eventdata, handles)

% hObject    handle to text2 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    empty - handles not created until after all CreateFcns called

⛄ 运行结果

基于Matlab模拟钢琴键的设计与仿真_文本框

⛄ 参考文献

⛳️ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料