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,可以分享给其他小伙伴。
全部0条评论
快来发表一下你的评论吧 !