关于用MATLAB 实现简易钢琴 App的教程分享

描述

MATLAB 是科学计算软件,同时也提供了图形、声音等多媒体展示特性和人机交互特性。利用这些特性,很容易完成复杂的任务,例如写一个钢琴 APP,将电脑的键盘当成钢琴的琴键,发出悦耳的声音。

实现以上功能的核心代码和语法知识包括:

脚本和函数的概念

全局变量

switch流程

sound函数

figure的属性和回调函数

这些都可以在 MATLAB 基本语法的帮助文档(中文)中找到详细说明:

将代码打包成 App 需要用到 MATLAB Compiler:

首先,要知道 MATLAB 中“发声”的方法,最简单的是 sound 函数。这里将声音的采样频率设为和一般 mp3 文件一样的 44100 Hz,将一个音符的时间设定为 0.4 s,以音阶 do 的频率 261.63 Hz 为例,发出一段声音。声音的包络线,其目的在于模拟一个音符渐响和渐轻的过程。

Fs=44100;                          %mp3标准采样品频率

T=0:Fs^-1:4e-1;                 %假定每个声音持续0.4s

A=sin(2*pi/8e-1*T);           %声音振幅包络

a=A.*sin(2*pi*261.63*T);    %do的时域波形

sound(a,Fs)

也可以用 plot(T,a) 观察波形。

变量

对于其他音阶,设定不同的频率,于是就可以获得一系列的音符,他们随时可以放进 sound 中进行发声。

a=A.*sin(2*pi*261.63*T);

s=A.*sin(2*pi*293.66*T);

d=A.*sin(2*pi*329.63*T);

其次,要知道 MATLAB 中怎么用键盘实时控制,这样才是一个真正的钢琴 App。较为简单的方法是利用 figure 的 KeyPressFcn 属性。建立一个图形,在选中图形的情况下,只要键盘被按下,就会执行一个函数(通常称为回调函数),在这个函数中通过 sound 发声。

fig=figure('KeyPressFcn','sound(a,Fs)');

再次,要在回调函数中判断刚才按下的是哪个键,并决定让 sound 发出哪个声音。这是一个典型的 switch 流程。而 switch 的判断依据则是 figure 的 'CurrentChar' 属性,可以通过 get 函数来获得。

args=get(fig,'CurrentChar');

switch args

case 'a'

sound(a,Fs)

case 's'

sound(s,Fs)

此时,显然回调函数不会那么简单,需要单独封装并命名,例如叫mysound。而为了使刚才定义的Fs等变量可以在mysound中使用,需要声明他们为全局变量,即:

function mysound

global Fs z x c ……

最后,进行适当的美化,通过 rectangle 函数画出矩形琴键,通过 text 函数标注音阶和键盘的对应。同时,在回调函数中,根据不同的键盘输入,对矩形进行一定的显示变化,通过 pause 函数控制这种变化的持续时间,就很像一个钢琴 App 了。

附件使用方法:在 MATLAB 工作路径中,放置 mymusic 脚本和 mysound 函数两个文件,在 Command Window 中运行 mymusic,按键盘发声。

当然,也可以继续在 Command Window 中运行。

sound([a a g g h h g zeros(size(a)) f f d d s sa],Fs)

来听一小段音乐,enjoy~

App 如何脱离 MATLAB 运行?这里需要用到 MATLAB Compiler,仅需点击几次鼠标即可:

点击:APPS -> Application Compiler

变量

点击:Add main file,选择 mymusic

点击:Files required for your application to run,选择 mysound

这两步的目的是告诉 MATLAB 需要打包的脚本和这个脚本调用的函数。

变量

点击:package,一路确定即可。

软件打包完成后,可以关闭 MATLAB。在弹出的 for_testing 目录下找到 mymusic 的 exe 文件,双击即可执行。

这样就完成了一个钢琴 App,可以分享给其他小伙伴。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分