用matlab演奏周杰伦的《七里香》

问题描述

前几天在学习matlab的时候,发现了一篇用matlab演奏音乐的文章,不禁感叹matlab居然还能这么玩!于是我就学着用matlab演奏我最喜欢听的一首歌——周杰伦的《七里香》。最后成果我已经发到B站,链接为:用matlab演奏周杰伦的《七里香》。

matlab播放音乐的原理

matlab播放音乐是由sound(Y,fs,bits)函数完成的,该函数的3个参数代表输入信号、采样率、比特率。先说采样率fs的设置,人耳能够听到的声音范围是20~20000Hz。根据采样定理fs只需要大于40000即可。此处采样率的设置采用了MP3的标准,即fs=44.1k.再说输入信号Y,Y一般是一个正弦波,如A* sin(2* pi* w* t)。其中A控制着声音的大小,w控制着声音的高低,t的范围控制着声音的长短,所以理论上利用这个公式可以发出任何声音,只是不能控制音色和音质(音色音质很难用参数量化,我问了一下学语音的同学,这个东西跟音频谱重心,音频扩展度和音频谱平坦度有关系,这里不作讨论)。比特率采用默认值即可,该参数省略。
于是用下面的公式就可以播放出标准音la:(座机电话提示音就是la,可以用来调吉他)
fs=44100;
t=0: 1/fs: 0.5;
la = sin(2* pi* 440* t); (下文介绍440是怎么来的)
sound(la, fs)
下面介绍一下简单乐理:
看过柯南的同学都知道,音高和频率是指数的关系,它们满足下面的公式,其中p是音高,f是频率
f=440*2^((p-69)/12)

标准音la,即钢琴的A4键,定义为p=69。音高每上升一个半音,p加1。
在这里插入图片描述
如上图所示,从C4到B4分别对应着do re mi fa sol la xi,它们的p值分别为 60 62 64 65 67 69 71,注意中间有黑键,你也可以根据下表来查询某个音的频率。

Frequency in hertz (semitones above or below middle C)
Octave→
Note↓
0123456789
C 16.352 (−48) 32.703 (−36) 65.406 (−24) 130.81 (−12) 261.63 (0) 523.25 (+12) 1046.5 (+24) 2093.0 (+36) 4186.0 (+48) 8372.0 (+60)
C♯/D♭ 17.324 (−47) 34.648 (−35) 69.296 (−23) 138.59 (−11) 277.18 (+1) 554.37 (+13) 1108.7 (+25) 2217.5 (+37) 4434.9 (+49) 8869.8 (+61)
D 18.354 (−46) 36.708 (−34) 73.416 (−22) 146.83 (−10) 293.66 (+2) 587.33 (+14) 1174.7 (+26) 2349.3 (+38) 4698.6 (+50) 9397.3 (+62)
D♯/E♭ 19.445 (−45) 38.891 (−33) 77.782 (−21) 155.56 (−9) 311.13 (+3) 622.25 (+15) 1244.5 (+27) 2489.0 (+39) 4978.0 (+51) 9956.1 (+63)
E 20.602 (−44) 41.203 (−32) 82.407 (−20) 164.81 (−8) 329.63 (+4) 659.26 (+16) 1318.5 (+28) 2637.0 (+40) 5274.0 (+52) 10548 (+64)
F 21.827 (−43) 43.654 (−31) 87.307 (−19) 174.61 (−7) 349.23 (+5) 698.46 (+17) 1396.9 (+29) 2793.8 (+41) 5587.7 (+53) 11175 (+65)
F♯/G♭ 23.125 (−42) 46.249 (−30) 92.499 (−18) 185.00 (−6) 369.99 (+6) 739.99 (+18) 1480.0 (+30) 2960.0 (+42) 5919.9 (+54) 11840 (+66)
G 24.500 (−41) 48.999 (−29) 97.999 (−17) 196.00 (−5) 392.00 (+7) 783.99 (+19) 1568.0 (+31) 3136.0 (+43) 6271.9 (+55) 12544 (+67)
G♯/A♭ 25.957 (−40) 51.913 (−28) 103.83 (−16) 207.65 (−4) 415.30 (+8) 830.61 (+20) 1661.2 (+32) 3322.4 (+44) 6644.9 (+56) 13290 (+68)
A 27.500 (−39) 55.000 (−27) 110.00 (−15) 220.00 (−3) 440.00 (+9) 880.00 (+21) 1760.0 (+33) 3520.0 (+45) 7040.0 (+57) 14080 (+69)
A♯/B♭ 29.135 (−38) 58.270 (−26) 116.54 (−14) 233.08 (−2) 466.16 (+10) 932.33 (+22) 1864.7 (+34) 3729.3 (+46) 7458.6 (+58) 14917 (+70)
B 30.868 (−37) 61.735 (−25) 123.47 (−13) 246.94 (−1) 493.88 (+11) 987.77 (+23) 1975.5 (+35) 3951.1 (+47) 7902.1 (+59) 15804 (+71)

有了上面的基础,下面就可以用matlab创作歌曲了。

用matlab演奏的过程

目标音乐的简谱

首先需要搜索目标音乐的简谱。以本文创作的“七里香”为例,在“百度图片”上就能够找到相应的简谱。
在这里插入图片描述

对音符的定义

在这个过程中,需要对节拍稍作注意,最常见的像四分之一拍,八分之一拍,以及十六分之一拍。

以四分之一拍的do为例:

do1f= mod4.* cos(2* pi* ScaleTable(5)* f0* t4);

其中涉及节拍,音调以及频率。mod4,ScaleTable及t4的定义,可参见帖子最后的源码。

分享几点我在编程过程中绕的弯路:

在这里插入图片描述

像图中所示的这种情况,最初我也是分别做两个do音符数据输出,但是整体听下来的效果比较奇怪,也因为我在乐理基础上的欠缺。

最终,我处理的方式是,这两个个音符作为一个5/16拍的do输出,这样听起来的效果会相对连续些,不知道从音乐方面来看,这么处理的方式是否正确。

在这里插入图片描述

类似的情况,这幅图中的mi,可作为3/16拍的mi输出。

那么针对这些情况,需要在节拍以及时间间隔定义上,额外再定义5/16拍,3/16拍等情况的数据。

在这里插入图片描述
还有这种情况,两个不同的音符连成一个音节。如果分别用1/16拍的fa和1/8拍的mi输出的话,中间会有所停顿,听起来不够连贯。所以我直接用3/16拍的fa输出,这样听起来只是略微和原曲不同,而不会让人感觉不连贯。

乐谱的定义

在最基本的音符定义完之后,就可以着手通过音符来定义乐谱了。根据简谱依次用所定义的音符定义一个声音矩阵:

violin = [mi1e fa1e so1e mi1f fa1e so1e ti1e];

如果出现有和弦的情况,以同样的方式定义和弦的曲子,并与violin的声音矩阵做加法处理。

之后通过sound函数就能够听到整首歌的效果:

sound(s,fs);

同时,如果你想保存这首歌的话,可以通过audiowrite函数来实现:

audiowrite(‘Qilixiang.wav’,violin,fs)

另外,如果已经有一个音频文件想通过Matlab处理,可以通过audioread函数来读取该音频文件:

audioread(‘Qilixiang.wav’)

以上就是实现Matlab演奏歌曲的整个过程,接下来附上我的源代码,如果你有兴趣想用该代码实现别的歌曲的演奏,只需要将violin矩阵中的乐谱矩阵稍作修改,就能实现你所需的效果。

源代码:

fs = 44100;
dt = 1/fs;
T16 = 0.2;
t16 = [0:dt:T16];
[temp k] = size(t16);
t2 = linspace(0,8*T16,8*k);
t3 = linspace(0,7*T16,7*k);%7/16拍
t4_25=linspace(0,5*T16,5*k);%5/16拍
t4 = linspace(0,4*T16,4*k);
t6 = linspace(0,3*T16,3*k);%3/16拍
t8 = linspace(0,2*T16,2*k);
[temp i] = size(t4);
[temp j] = size(t8);mod2 = sin(pi*t2/t2(end));
mod3= sin(pi*t3/t3(end));
mod4 = sin(pi*t4/t4(end));
mod4_25= sin(pi*t4_25/t4_25(end));
mod6 = sin(pi*t6/t6(end));
mod8 = sin(pi*t8/t8(end));
mod16 = sin(pi*t16/t16(end));
f0 = 2*146.8;
ScaleTable = [2/3 3/4 5/6 15/16 ...
1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...
2 9/4 5/2 8/3 3 10/3 15/4 4 ...
1/2 9/16 5/8];% 1/4 notes
do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);
re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);
mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);
fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);
so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);
la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);
ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);
do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);
re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);
mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);
fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);
so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);
la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);
tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);
ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);
do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4);
re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4);
mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4);
fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4);
so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);
la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);
ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);
do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);
blkf = zeros(1,i);% 1/8 notes
do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);
fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);
so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);
la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);
ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);
do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);
do1_6 = mod6.*cos(2*pi*ScaleTable(5)*f0*t6);
re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);
mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);
mi1_6= mod6.*cos(2*pi*ScaleTable(7)*f0*t6);
fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);
fa1_6=mod6.*cos(2*pi*ScaleTable(8)*f0*t6);
so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);
so1_2= mod2.*cos(2*pi*ScaleTable(9)*f0*t2);
so1_3= mod3.*cos(2*pi*ScaleTable(9)*f0*t3);
la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);
la1_6 = mod6.*cos(2*pi*ScaleTable(10)*f0*t6);
tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);
ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);
do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);
do2_4_25= mod4_25.*cos(2*pi*ScaleTable(13)*f0*t4_25);
do2_6=mod6.*cos(2*pi*ScaleTable(13)*f0*t6);
re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);
re2_6 = mod6.*cos(2*pi*ScaleTable(14)*f0*t6);
mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);
mi2_6 = mod6.*cos(2*pi*ScaleTable(15)*f0*t6);
fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);
fa2_6 = mod6.*cos(2*pi*ScaleTable(16)*f0*t6);
so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);
la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);
ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);
do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);
blke = zeros(1,j);% 1/16 notes
fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16);
so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);
la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);
ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16);
do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16);
re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);
mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16);
fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);
so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);
la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);
tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);
ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);
do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);
re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);
mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);
fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);
so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);
la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);
ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);
do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16);
blks = zeros(1,k);violin = [blke so1e...
do2f ti1e do2s do2_4_25 blke do2e...
do2e ti1e la1e ti1s la1_6 so1f so1e...
so1f fa1e mi1s so1_3 so1e...
so1e la1_6 re1e fa1s fa1_6 mi1f so1e...
do2f ti1e do2s do2_4_25 blke do2e...
do2e ti1e do2e re2s re2_6 do2e do2e ti1e...
do2e do2s do2_6 ti1e ti1e la1e la1e ti1s la1s...
so1_2 blkf so1e do2e...
do2f mi1e la1e la1f so1e re2e...
re2f re1e fa1s fa1_6 mi1e blke so1e...
so1e fa1e fa1e mi1s mi1_6 re1e re1e do1e...
mi1e re1f fa1e mi1f so1e do2e...
do2f mi1e la1e la1e so1e so1e re2e...
re2e re1e re1e fa1e mi1e so1e so1e mi2e...
mi2e re2e re2e do2e do2e re2e do2e mi2e...
mi2_6 re2_6 blke so1e ti1e do2s do2_4_25...
blke do2e do2e la1e la1e so1e...
ti1e do2e re2_6 do2_6 so1e ti1e do2s do2_4_25...
blke do2e do2e la1e la1e so1e...
re2e mi2e fa2_6 mi2_6 so1e ti1e do2s do2_4_25...
blke do2e do2e la1e la1e so1e...
re2e do2e ti1e do2s do2_6 blke do2e...
do2e re2e re2e do2e do2e ti1e re2e do2s do2_6
];s = violin;
s = s/max(s);sound(s,fs);
audiowrite('Qilixiang.wav',violin,fs)

参考文献

.
[1]:https://mp.weixin.qq.com/s?__biz=MzU5NTAyMTIzOQ==&mid=2247483839&idx=1&sn=e8f6a92ed8dcbdaaa4cb43facf58bccf&chksm=fe791d67c90e94719e12fd30247afe352d03395d626b8d9e9ab674420994de6f5a96c7022b27&scene=21#wechat_redirect
[2]:https://www.zhihu.com/question/27780598/answer/666803900
[3]:http://www.qupu123.com/tongsu/sanzi/qilixiang
[4]:https://blog.csdn.net/leonliu070602/article/details/76254153

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61426.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 消息传递简明教程

WPF 消息传递简明教程 独立观察员 2023 年 4 月 24 日 0、说明 参考:https://www.cnblogs.com/cdaniu/p/16852620.html 使用包:CommunityToolkit.Mvvm(8.1.0) 1、订阅 让需要使用消息的 ViewModel 继承 ObservableRecipient&#…

VMware官网注册账号之验证码问题

VMware官网注册账号之验证码问题 首先上个官网注册账号链接~ https://my.vmware.com/zh/web/vmware/registration 点我访问官网注册 然后不出意外都会看见中文版页面 这时候不要着急注册,因为你会发现验证码是这个造型的 抓狂的时候来了,不…

ChatGpt3.5 使用小记001

使用了一段时间的ChatGpt。主要的用途是向它咨询些学习的问题。因为有些它的分类是对话形式的,所以,一定问题多了,自己都不好找。故此想稍做整理,在此留存。 1.英语学习类 英语单词类,主要是因为有些近义词在中文的翻…

chatgpt赋能Python-python3_5怎么打开

Python 3.5怎么打开?教你几种方法 Python是目前非常流行的一种编程语言,几乎在所有行业都得到了广泛的应用。Python非常容易上手,且有强大的数据处理和科学计算能力。现在我们来说一下,如何在您的计算机上打开Python 3.5。 方法…

python-openCV实现银行卡卡号识别

实现效果: code import cv2 as cv import numpy as np# 轮廓排序 默认从左到右 # --cnts 待排序的轮廓列表 # --method 排序方法 自上而下,从左到右等 def sort_contours(cnts, method"left-to-right"):# 初始化反向标志和排序索引reverse F…

opencv之银行卡号识别

1.项目背景 1.1 项目介绍 这个一个opencv的经典应用,所以用它来熟悉之前的一些操作。 1.2 项目目的 通过此程序可以识别出银行卡图片中包括的银行卡卡号。 2.项目介绍 此项目主要分为两部分:模板图片处理,银行卡图片处理。 模板图片: 银行卡图片示例: 2.1 模板图片处…

【OpenCV】银行卡号识别

文章目录 前言一、环境二、代码总结 前言 本文引用其他作者代码,本文仅供记录用。详细内容可看此处 一、环境 如果提示没有imutils模块就pip install imutils 提供一个字体模板文件和银行卡图片。可以右键保存。 字体模板文件: 银行卡图片&#xff1b…

opencv-python 银行卡卡号识别

模板: 银行卡: 主要思路:用遮盖法 将无关紧要的上面和下面部分截掉,保留银行卡号差不多的位置,然后用opencv做图像处理,得到四个 连着数字的小框框,然后再在四个小框框里面提取出每一个单个的…

使用 OpenCV 和 Python 识别信用卡号

使用 OpenCV 和 Python 识别信用卡号 在之前的博文中,我们学习了如何安装 Tesseract 二进制文件并将其用于 OCR。 然后我们学习了如何使用基本的图像处理技术来清理图像以提高 Tesseract OCR 的输出。 但是,不应将 Tesseract 视为能够获得高精度的光学…

OpenCV-Python 模板匹配的银行卡号识别

目录 实现流程模板数字处理对模板图片进行二值化处理对二值化后的图片进行轮廓检测确定每个模板数字的图像 银行卡图片处理预处理确定每组数字轮廓检测每个数字提取数字组中的数字 模板匹配附录完整代码 实现流程 对数字模板进行处理,提取出单一数字的图片&#xf…

银行卡验证接口API(仅需一行代码,实现全国银行卡核验)

银行卡确认在互联网越来越普及,在二手、电商、贷款、等主流互联网应用中都有明确的刚需,传统的 银行卡核验方式是用户上传图片,客服后台人肉审核,但问题在于根本无从确认 银行卡的真实性,也不能确认该 银行卡持有人和身…

openCV+Python实战练习——银行卡号识别

目录 项目Introduce: 项目名称: 具体操作步骤以及代码: 实现结果展示: 代码整体展示: 项目Introduce: 项目名称: 通过导入模板数字,对银行卡面上的数字进行识别,提…

【opencv学习】银行卡的识别

今天做一个小项目,运用已经学到的知识,做一个银行卡的识别。 银行卡的图像如下 这个银行卡是的数字模板是 现在我的任务是识别中间的16个数字 大致思路是: 1:读取模板,获得每个数字的模板信息 2:读取银行…

OpenCV C++案例实战二十《银行卡号识别》

OpenCV C案例实战二十《银行卡号识别》 前言一、获取模板图像1.1 功能效果1.2 功能源码 二、银行卡号定位2.1 将银行卡号切割成四块2.1.1 功能效果2.1.2 功能源码 2.2 字符切割2.2.1 功能效果2.2.2 功能源码 三、字符识别3.1.读取文件3.2.字符匹配3.3.功能源码 四、效果显示4.1…

opencv实际案例(一)银行卡号的识别

一、目标: 识别银行卡上的卡号 二、思路: 一 、准备模板,能够与卡号数字样式进行模型匹配 二、处理模板图片:将其分割成为单个数字的图片,和所对应的数字相匹配存储可迭代的数据类型中。 读入模板图片&#xff0…

(openCV--python)检测银行卡号 (应用篇)(包含模板图)

适合人群: 有python基础,注重应用、不追求深层次知识的小伙伴。前言: 本文对很多说用到的很多函数都是粗浅地解释一下用法以及作用,并不会解释该函数的具体结构。若想进一步深入了解还请自行谷狗一下。 完整代码 # Author :Eri…

opencv项目实践二(银行卡卡号识别)

任务说明 将银行卡卡号打印输出 实现 一、思路 1、定位银行卡卡号数字区域 2、将银行卡每个卡号数字单独提取出来 3、处理模板图片,将每个模板数字单独提取出来 4、通过模板匹配来识别每个卡号 二、具体代码实现 1、处理模板 卡号数字模板 # 读取模板图片 img_…

CVAT——2. CVAT简单使用

文章目录 基本使用管理员界面登录管理用户添加/删除用户及用户权限管理组管理 任务管理 创建任务和上传标签datumaroanaconda安装datumaro安装datumaro基本使用支持的格式查看帮助文件报错导入projects数据增加 数据标注标注面板使用快捷键左侧工具栏和右侧面板说明追踪模式Tra…

OpenCV图像处理——(实战)信用卡识别

总目录 图像处理总目录←点击这里 十四、信用卡数字识别 识别的图片模板图片 14.1、模板图片处理 读入图片->灰度图->二值图->计算轮廓->存储每一个模板 如果是所需模板匹配只有一个,课直接读入灰度图像即可 这里有10个模板(0-9),所以需…

关于opencv的实战——银行卡号识别

首先我们先来引入我们所需要的库和我们定义的图像显示(方便): import cv2 import numpy as np import imutils from imutils import contours#显示图像 def cv_show(img,name"image"):cv2.imshow(name,img)cv2.waitKey(0)cv2.dest…