乐符识别matlab,科学网—[原][Matlab][04] Midi音乐键盘 - 王楠的博文
以前在网上读到一个用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音乐键盘 - 王楠的博文相关推荐
- matlab音乐键盘模拟,科学网—[原][Matlab][04] Midi音乐键盘 - 王楠的博文
以前在网上读到一个用matlab播canon音乐的源码感觉很有意思,但声音还不够好. 于是想做个自己的音乐播放器,有键盘,有对应的钢琴声音,读取乐谱就能播.如下. (1)按键的音高与频率 从1到下一个 ...
- matlab根据乐谱播放音乐,科学网-[原][Matlab][04] Midi音乐键盘-王楠的博文
以前在网上读到一个用matlab播canon音乐的源码感觉很有意思,但声音还不够好. 于是想做个自己的音乐播放器,有键盘,有对应的钢琴声音,读取乐谱就能播.如下. (1)按键的音高与频率 从1到下一个 ...
- 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...
归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...
- 网易公开课 matlab,科学网—如何保存网页上看到的视频 - 杨建功的博文
平时遇到在网页上看到的视频非常好,想把它保存在本地电脑上,以供随时观看.而且这样也 不受网速影响,看着流畅.这里告诉你一个最方便的方法来保存这些视频: 1.首先打开IE浏览器观看这些视频,但注意画面下 ...
- lyapunov函数 matlab,科学网-[转载]Matlab的Lyapunov、Sylvester和Riccati方程的Matlab求解-吴雄君的博文...
一.连续Lyapunov方程连续Lyapunov方程可以表示为 Lyapunov方程来源与微分方程稳定性理论,其中要求C为对称正定的n×n方阵,从而可以证明解X亦为n×n对称矩阵,这类方程直接求解比较 ...
- 直方图绘制误差棒matlab,科学网—【MATLAB】如何画带errorbar的直方图 - 叶瑞杰的博文...
(1)画竖直的errorbar 例子: close all;figure; h=bar(volume_month_mean./1e6); %--volume_month_mean 为12× ...
- matlab surf颜色,科学网[转载]matlab中控制mesh或者surf的颜色
科学网[转载]matlab中控制mesh或者surf的颜色 曲面的顏色越发柔順滑腻,del2 (Z) 根據數值微分來產生矩陣 Z 的 discrete Laplacian, Y,surf 及 mesh ...
- 文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...
在博文<Matlab:学习GUI(一个简单的例子)>(介绍的方法是完全用代码来建立一个GUI,实际上Matlab本身有一个设计GUI的交互系统--GUIDE,用户可以使用该系统更方便的建立 ...
- 音频剪切matlab,科学网—matlab的音频处理:读取,裁剪,输出和命名 - 张智昊的博文...
网易云下架了周杰伦的几乎所有歌曲,于是尝试下载一套周杰伦的音乐全集.从微盘上下载到的音乐前面有一段奇葩的广告,长约8秒.因为广告长度一样可以轻松的裁剪处理,于是想到可以用matlab写一个简单的小程序 ...
最新文章
- java 图像 截取正方形,Instagram API仅返回正方形(裁剪)图像
- python中打印二维列表数据
- oracle无法重建em,ORACLE 11g, EM 无法启动的问题和重建
- Java黑皮书课后题第8章:*8.24(检验数独的解决方案)程序清单8-4通过检测棋盘上的每个数字是否是有效的,从而检验一个解决方案是否是有效的。重写该程序,通过检验是否每行、每列、每个小方盒中具有
- ajax post传送数组以及java后台接收数组
- Exception handling 笔记
- 学习笔记(41):Python实战编程-按钮
- 用python进行自然语言处理_Python自然语言处理示例:SVM和贝叶斯分类
- 文档加载完成覆盖_在完成文档之前,作业尚未完成
- 在两个林间做Exchange邮箱的迁移
- STL之修改集合里边元素的顺序
- 【转载】socket as an IPC
- [NOI 2010]超级钢琴
- Android局域网工具,NetX(局域网管理工具)
- regexp函数 mysql_mysql 五中的REGEXP函数_mysql
- 前端学习-jquery-实现点击button对文本的add及detele
- java netty 内存泄露_Netty开发调试设置io.netty.leakDetection.level=PARANOID定位内存泄漏问题...
- python调用pyd_使用python pyd时出错
- 幅频特性曲线matlab,幅频特性曲线的matlab模拟
- 入门了解开发板是做什么用的?