我以前在网上读过一个matlab播canon音乐的源代码很有趣,但声音还不够好。
所以想做自己的音乐播放器,有键盘,有相应的钢琴声,读音乐谱就可以播放。
(1)按钮的音高和频率
1、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)采样频率
本标准441000多种音波采样频率Hz,即每秒从声音中收集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,然后播放。我用六位字符表示一个音符,比如1# 104表示音高为1升半音,8度音符为1/4音符;例如,3-216表示音高为3,8度音符为1/16音符为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] 下载器 破防盗链
下一篇文章:[随记][算法]进行三维图像处理的入门算法