0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

MATLAB 来源:djl 2019-09-11 15:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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) 观察波形。

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

对于其他音阶,设定不同的频率,于是就可以获得一系列的音符,他们随时可以放进 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

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

点击:Add main file,选择 mymusic

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

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

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

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

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

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

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

    关注

    12

    文章

    1275

    浏览量

    57636
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29369
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FPGA实现DDR控制模块介绍

    DDR3读写控制器主要用于生成片外存储器DDR3 SDRAM进行读写操作所需要的时序,继而实现对片外存储器的读写访问。由摄像头采集得到的图像数据通常数据量较大,使用片内存储资源难以实现大量图像数据
    发表于 10-21 08:43

    matlab appdesigner 表格组件赋值问题,求助

    如上图所示,我在用matlab2021Ra APP模块进行编程的时候,想在表格中调入自己编写的结构数组,我从网上AI了一个程序语句,看着没问题,但是就是给表格赋值不了,还请各位大神帮忙看一下这个是怎么回事,我是初学者,请各位帮忙看看
    发表于 07-12 11:45

    基于Matlab与FPGA的双边滤波算法实现

    前面发过中值、均值、高斯滤波的文章,这些只考虑了位置,并没有考虑相似度。那么双边滤波来了,既考虑了位置,有考虑了相似度,对边缘的保持比前几个好很多,当然实现上也是复杂很多。本文将从原理入手,采用Matlab与FPGA设计实现双边
    的头像 发表于 07-10 11:28 4076次阅读
    基于<b class='flag-5'>Matlab</b>与FPGA的双边滤波算法<b class='flag-5'>实现</b>

    OptiSystem应用:MATLAB组件实现振幅调制

    。我们MATLAB代码控制电脉冲对光信号的调制过程,通过在MATLAB组件中导入MATLAB代码来实现。整体光路图如图1,全局参数如图2:
    发表于 06-13 08:46

    通过御控APP实现PLC远程调试与远程监控

    御控APP,通过移动化、智能化的手段,实现了PLC远程调试与监控,为工业生产带来了便捷与高效。
    的头像 发表于 06-04 09:49 436次阅读

    普源示波器如何连接MATLAB实现数据采集与分析

    普源示波器(Rigol)作为国内知名的测试测量仪器品牌,广泛应用于电子工程、科研实验、教学等领域。为了进一步扩展其功能,用户常需将示波器与MATLAB等数据分析平台连接,实现自动化测试、实时信号处理
    的头像 发表于 05-29 09:34 702次阅读

    MATLAB如何助力全球巨头实现智能化突破

    当深度学习遇见汽车,一场静默的技术革命正在发生。从Poclain Hydraulics 利用神经网络实时监测电机温度,到梅赛德斯-奔驰虚拟传感器替代硬件,再到康明斯通过 AI 模型加速发动机仿真——这些行业领军者正借助 MATLAB 与 Simulink,将复杂算法转化
    的头像 发表于 05-16 14:51 973次阅读
    <b class='flag-5'>MATLAB</b>如何助力全球巨头<b class='flag-5'>实现</b>智能化突破

    如何使用MATLAB实现一维时间卷积网络

    本文对一维卷积操作进行介绍,包括一维扩展卷积和一维因果卷积,以及 MATLAB 对一维卷积的支持情况。在最后通过一个实例演示如何在 MATLAB 中将一维卷积和 LSTM 结合构建分类网络,实现基于传感器数据的故障诊断。
    的头像 发表于 03-07 09:15 1666次阅读
    如何使用<b class='flag-5'>MATLAB</b><b class='flag-5'>实现</b>一维时间卷积网络

    如何运用MATLAB来控制DLP4500?

    希望通过MATLAB实现对DLP4500 的控制?因为现在MATLAB可以控制相机,希望也直接控制DLP。 是否有相关的例子来参考。谢谢
    发表于 03-03 06:19

    有没有什么方案能实现直接matlab或python调用D4100_usb.dll?

    D4100_usb.dll是否有64位版本的,如果没有,那有没有什么方案能实现直接matlab或python调用D4100_usb.dll。 万分感谢。 以下是eclipse java
    发表于 02-27 06:59

    如果pattern是32*32的,matlab怎么选择dmd的活跃区域?

    如果pattern是32*32的,matlab怎么选择dmd的活跃区域
    发表于 02-27 06:17

    OptiSystem应用:MATLAB组件实现振幅调制

    。我们MATLAB代码控制电脉冲对光信号的调制过程,通过在MATLAB组件中导入MATLAB代码来实现。整体光路图如图1,全局参数如图2:
    发表于 02-14 09:39

    MATLAB或者C语言开发FPGA有什么问题吗

    最近有个项目领导要求MATLAB开发FPGA,有大佬MATLAB或者C语言开发FPGA的吗,有没有什么问题,需要注意什么问题吗
    发表于 01-26 09:57

    安科瑞如何打造基于“APP电表”的能源数据服务平台

    安科瑞徐赟杰18706165067 摘要:针对普通电表需要人工抄表,无法实现远程实时抄表,本文提出了基于APP电表的能源数据服务平台,结合APP电表为分布广泛的互联网用户提供PAAS服务。用户完成
    的头像 发表于 01-22 13:21 803次阅读
    安科瑞如何打造基于“<b class='flag-5'>APP</b>电表”的能源数据服务平台

    求LabVIEW程序代做,关于噪声测量方面,需要matlab与labview混合编程,涉及优化算法、PID控制等,可带价联系

    求LabVIEW程序代做,关于噪声测量方面,需要matlab与labview混合编程,涉及优化算法、PID控制等,可带价联系QQ2789223947
    发表于 12-11 17:27