以前在网上读到一个用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调)

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

收藏

分享

分享到:

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输出图片无白边 - 杨光的博文

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

  4. matlab 二维矩形函数,科学网—利用MATLAB对非矩形域实现二维插值 - 张乐乐的博文...

    >> load('x1.mat'); >> load('y1.mat') >> load('T.mat'); >> load('Lon.mat'); & ...

  5. matlab 二维插值 验证,科学网-利用MATLAB对非矩形域实现二维插值-张乐乐的博文...

    >> load('x1.mat'); >> load('y1.mat') >> load('T.mat'); >> load('Lon.mat'); & ...

  6. matlab中显示变量大小写,科学网—一些MATLAB的编程规范总结1.0版 - 何亮的博文

    好的编程习惯,可以提高编程效率,不仅可以使代码容易修改,也容易给别人看懂,便于交流.我们不仅要写出"给机器读懂的代码",也写出"给人看得懂的代码". 本文根据一 ...

  7. matlab绘制8条曲线,科学网—【Matlab】如何用plotyy对应坐标绘制多条曲线 - 叶瑞杰的博文...

    例子:设x=1:0.01:100; y1=0.2*sin(x); y2=0.3*sin(x); y3=0.4*sin(x); y4=0.5*sin(x); y5=0.6*sin(x); 以左边坐标轴为 ...

  8. matlab surf颜色,科学网[转载]matlab中控制mesh或者surf的颜色

    科学网[转载]matlab中控制mesh或者surf的颜色 曲面的顏色越发柔順滑腻,del2 (Z) 根據數值微分來產生矩陣 Z 的 discrete Laplacian, Y,surf 及 mesh ...

  9. matlab比Excel好在哪,科学网—再讨论浮点运算精度问题(IDL与Excel和Matlab相比) - 董彦卿的博文...

    论坛里面一个哥们的问题,原帖地址:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=90950&page=1&extra=#pid8 ...

最新文章

  1. 《图解CSS3:核心技术与案例实战》——2.4节动态伪类选择器
  2. 你有一笔新订单 语音_坐电梯动口不动手,浦东企业新技术实现乘坐电梯“零接触”!...
  3. Git在window的使用(TortoiseGit)之一
  4. HAproxy + keepalived 实现双机热备
  5. a.c:5:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wun
  6. 尚医通(二十五)就医提醒和预约统计
  7. C语言:数组与指针之 p++ 操作的细节问题(p是指针)
  8. 前端---HTML QQ空间主页制作
  9. 5.海康威视-Spring boot下实现抓图并保存
  10. jupyter输出为html隐藏代码,在jupyter noteb中隐藏代码
  11. 【C语言程序设计】实验 6
  12. 某文学网站的优化具体方案
  13. java 有10个硬盘有两个重要属性_2013年计算机一级B冲刺试题七及答案解析
  14. 2022考研数学-概率论教程
  15. python msgpack_Python中msgpack库的使用
  16. 比赛记录:ICME-2022 安全AI挑战者计划第九期:小样本商标检测挑战赛
  17. 自己部署 Docker Kong
  18. Android通过Bluetooth蓝牙发送手机照片文件到Windows PC:Java实现
  19. 插画手绘初学者怎么上色?
  20. matlab 生成 word 表格,利用MATLAB生成Word文档.doc

热门文章

  1. ActiveReports.NET Crack,集成报表设计器
  2. 构建DVD租赁商店数据仓库
  3. c语言tchar头文件,c – 什么是TCHAR字符串和Win32 API函数的“A...
  4. 【SOLIDWORKS】多转折引线线粗大小的设置技巧
  5. 【通信工程】信息类,电子类,电气工程,自动化,计算机,软件工程,机电,等相关专业 全套学习指导
  6. netty--关于Boos(老板)和worker(员工)
  7. CSS:has () 伪类,:not()伪类
  8. 查看笔记本电脑的配置
  9. 初学爬虫之 urllib 库的介绍与使用(一)
  10. QPainter绘制一个简易的饼图(含动画和tip显示)