以前在网上读到一个用matlab播canon音乐的源码感觉很有意思,但声音还不够好。

于是想做个自己的音乐播放器,有键盘,有对应的钢琴声音,读取乐谱就能播。如下。

(1)按键的音高与频率

从1到下一个音高的1之间有12个音,分别是:1,1#,2,2#,3,4,4#,5,5#,6,6#,7,1(高)。

假设1的音波振动频率是f,而1(高)的频率是2f,那么这十二个半音之间的频率间隔是2对12开方,即2^(1/12)。

于是各个音的相对频率就确定了。

(2)按键的绝对中心频率

钢琴C调1的中心频率是261.626Hz,对应88键钢琴中的第24个白键。这样根据中心频率和相对频率,所有琴键的振动频率就都知道了。

(3)采样频率

多种音波采样频率,在此选标准的44100Hz,即每秒钟从声音中采集44100个点。

(4)音速与采样时间

通常的节拍每分钟对应120个四分之一音符,即每个1/4音符的时长是0.5秒,由此可得1/2音符是1秒,1/8音符是0.25秒,1/16音符是0.125秒。

(5)乐器音色

不同的乐器演奏出的音色不同,主要是因为发声时不但有中心频率的振动,还有谐波甚至和频波。在网上下载了标准C键钢琴音进行分析。

频率:将声音波形FFT变换到频域,发现除中心频率,还有2阶到6阶的谐波,各阶的谐波也有对应的强度。

时域:是一个近似的指数衰减,可以通过拟合曲线得到包络参数。

最终可以将基频与谐波的采样曲线线性叠加并乘以时域的包络曲线得到单个钢琴按键的声音。

(6)变音与升降调

有的时候音符需要升降调,感觉很复杂,看不懂,目前我主要采用升降半音或升降一个全音的方式来实现调的转换。

这样通过(1)-(6),钢琴的发声基本完成。

(7)键盘布局

标准钢琴共有88键,其中白键52个,黑键26个。白键长144mm*24mm,黑键长86mm*9mm,以以上参数在matlab中使用rectangle函数分别采用edgecolor和facecolor参数设置边框颜色和填充颜色没有问题。

(8)按键的动态显示

当按下键时使用set函数改变对应按键handleID的facecolor可以实现变色。由于会出现图形图层的变化,可以使用uistack函数将白键设置为底层,黑键设置为顶层。

这样通过(7)-(8),钢琴的按键动画基本完成。

(9)按键声音与按键动画的配合

在程序中首先初始化所有声音,钢琴键盘和为每个按键分配一个handleID,将每个ID与该ID进行声音和图像关联。当需要对一个音符响应时,首先将音符翻译到对应的handleID,然后设置该ID的键变色,然后开始播放声音,根据音符的长度使用pause函数停顿对应的时长,然后将ID的按键颜色复原。

(10)乐谱读取

最方便的播放方法是将乐谱写在一个文本文件中,程序读取文本文件,然后翻译成音符,然后再翻译成handleID,然后播放。我用一个6位字符表示一个音符,比如1#+104表示音高为1升半音再高一个八度音符是1/4音符;比如3-216表示音高为3再减2个八度音符是1/16音符;1/4-108表示音高为1的键和音高为4减一个八度的键同时按下持续时长对应1/8音符。

在程序中使用fgets读取文件,并将所有行连接成一个单行字符串,然后使用regexp的split方法将字符串用空格分开,再用split方法用/符号将各元胞分开得到单个音符,然后判断音符的音高,是否升降半音,是否升降八度,音符长度。之后根据音调得到这个按键对应的handleID,是否是黑键,和音符长度。

通过(9)-(10),乐谱读取和播放的功能就实现了。

(11)音乐保存

想把生成的音乐保存下来,首先要把所有的音符根据其时长间隔加到同一个一维数组上,然后使用audiowrite函数保存为文件。

(12)视频保存

想把视频保存下来,首要要把所有的按键响应动画使用getframe获取,然后使用VideoWriter,open,writeVideo,close函数实现。中间需要根据帧速和音符长度设置每帧写入的数量。

(13)合成多媒体

将视频和音乐合成在一起就完美了,但我还没有实现,有个toolbox可以做,但目前由于采样率的不同遇到一些问题。可以在matlab的命令行窗口中输入ex_combine_video_and_andio_streams打开示例查看。最终将matlab生成的视频和音乐用moviemaker合成,可以得到初级的视频效果。

附件:CanonC.mp4(CanonC调),CanonD.mp4(CanonD调)

转载本文请联系原作者获取授权,同时请注明本文来自王楠科学网博客。

链接地址:http://blog.sciencenet.cn/blog-2857675-936944.html

上一篇:[原][Python][01] 下载器+破防盗链

下一篇:[随记][算法]进行三维图像处理的入门算法

matlab音乐键盘模拟,科学网—[原][Matlab][04] Midi音乐键盘 - 王楠的博文相关推荐

  1. 乐符识别matlab,科学网—[原][Matlab][04] Midi音乐键盘 - 王楠的博文

    以前在网上读到一个用matlab播canon音乐的源码感觉很有意思,但声音还不够好. 于是想做个自己的音乐播放器,有键盘,有对应的钢琴声音,读取乐谱就能播.如下. (1)按键的音高与频率 从1到下一个 ...

  2. matlab根据乐谱播放音乐,科学网-[原][Matlab][04] Midi音乐键盘-王楠的博文

    以前在网上读到一个用matlab播canon音乐的源码感觉很有意思,但声音还不够好. 于是想做个自己的音乐播放器,有键盘,有对应的钢琴声音,读取乐谱就能播.如下. (1)按键的音高与频率 从1到下一个 ...

  3. matlab排序 第二条件,科学网—【MATLAB技术贴】矩阵多条件排序 - 崔健的博文

    针对矩阵的多个条件排序问题,可以采用如下函数(以列为例):sortrows 具体参数如下: 1.先按照第二列的升序排序,然后按照第一列的升序排序:sortrows(a,[2,1]) 2.先按照第二列的 ...

  4. matlab pdepe函数边界,科学网-使用MATLAB中pdepe函数求解一维偏微分方程-邓浩鑫的博文...

    由于自己科研水平较低,记录的各种体会更多的是给自己做个小结,错误之处,欢迎大家指正. 使用MATLAB求解偏微分方程或者方程组,大致有三类方法.第一种是使用MATLAB中的PDE Toolbox,PD ...

  5. matlab print 保留颜色,科学网—解决matlab saveas printf保存图片时 colorbar中的字体颜色发生改变 - 肖鑫的博文...

    matlab在画多个图片循环保存时很容易出现看到的图跟保存的图片不一样,最常见的是大小不同导致坐标轴拉伸变形,主要是图片分辨率跟屏幕分辨率不同的原因,这个可以通过在设置figure时,固定画布大小解决 ...

  6. matlab 数组去掉0,科学网—在Matlab环境下去除矩阵中的零向量 - 李航的博文

    主要用到了any()函数. e.g.1 找到矩阵中为零的列向量,并将其删除. >> a=[1,2,3;0,0,0;4,5,6;0,0,0;7,8,9]' a = 1     0     4 ...

  7. matlab返回每月天数,科学网-[转载] matlab 输入月份得到该月天数-肖鑫的博文

    这个程序是近一年前在百度知道上看到的,发现还挺有用,所以在此分享一下 % 输入201501,返回31 % 输入201502,返回28 % 输入201504,返回30 function [day]=da ...

  8. matlab print 白边,科学网-[原创] matlab输出图片无白边-杨光的博文

    今天要做一个gif动画,可惜GIF Movie Gear不认eps文件,无奈只好输出png格式的文件,麻烦来了,输出的图像有白边!之前挥之不去的问题再一次来了.在网上搜索一个多小时,都是说什么先ims ...

  9. matlab 更换坐标轴_科学网—【Matlab】坐标轴的设置 - 叶瑞杰的博文

    使用matlab的绘图函数plot绘图时系统默认设置了一些属性,例如坐标轴字号大小等并根据情况自动设置坐标轴显示的上下限,这些属性可以通过函数灵活改动,此处总结一小部分. figure; %设置坐标轴 ...

最新文章

  1. 深入理解Java线程池:ThreadPoolExecutor
  2. hibernate之关联关系(一对多)
  3. 示例演示数据压缩的效果
  4. CAS Server(二):基于SpringBoot搭建客户端
  5. 访问Access数据库需要注意的问题
  6. 工作45:注意公用方法 别混入
  7. C# WebApi POST 提交
  8. jeewx-api.jar入门教程
  9. linux列举网卡,linux下快速列出局域网中所有主机名(计算机名)的脚本
  10. Redis学习总结(17)——Redis 持久化和过期机制复习
  11. 2015 - Human-level control through deep reinforcement learning
  12. Java的一些基础问题
  13. Webpack框架知识整理——Modules
  14. python计算直角三角形斜边上的中线_直角三角形斜边上的中线等于斜边的一半教学设计...
  15. 你会卖掉自己的网上信息吗?大数据可能根本不属于你
  16. 温度及pH敏感性聚乙烯醇/羧甲基壳聚糖水凝胶/金银花多糖/薄荷多糖/O-羧甲基壳聚糖水凝胶
  17. conda命令报错Collecting package metadata (repodata.json): failed
  18. 盘点行业APP运营推广渠道有哪些
  19. 宋词欣赏 李清照
  20. c语言编程函数名:b开头

热门文章

  1. C语言程序设计(第3版) 何钦铭 颜晖 主编
  2. Ubuntu 小企鹅输入法fcitx 支持 五笔拼音
  3. 【程序源代码】微信小程序商城管理系统(Java后台+微信小程序)最新版
  4. 计算机安装Hp1005打印机,hp1005打印机驱动 (64)
  5. 孩子发烧,别急着降温
  6. Qt OpenGL 旋转、平移、缩放
  7. 我的大学六年-郭天祥
  8. 这个工具能替代Excel,可惜90%的人都没用过!
  9. windows重装系统步骤及相关知识①
  10. 【蓝桥系列】——十三届蓝桥杯PythonB组第五题E题蜂巢(AC代码)