运用MATLAB代码创作超好听的台剧《想见你》片尾曲——《想见你》
写在最前面的话:
2020年听过最美的故事就是来自1998的李子维爱上了2019年的黄雨萱。
- 想念离我如此之近,才发现你多遥不可及
- 你的出现就足够占据我余生的那些年
- 失去你的时间里面,我的世界从未往前
- 所有的离别都是我在练习失去你
- 要我怎么穿越时间,重新和你相识一遍
- 在想念的时候,就把温柔的自己都用完了
- 慢慢把自己搁浅在无法拼凑的昨天
27岁黄雨萱爱上的是拥有王全胜身体的李子惟的灵魂 ,17岁的李子维爱上的是拥有陈韵茹身体的黄雨萱的灵魂 ,17岁追逐阳光一样刺眼李子维的陈韵茹车祸死掉 ,27岁深爱黄雨萱的王全胜空难死掉。
这样的一部穿越时空的爱恋,深入人心,让我们认识到了李子维,也认识了黄雨萱,还有那个小天使莫俊杰。片尾曲八三夭乐团的《想见你》在一段时间甚至成为了手机中重复播放的曲目。
正文部分:
在网上闲逛的时候无意间发现有同学使用MATLAB创作了歌曲,第一次发现MATLAB竟然也可以这么玩。在仔细研究了相关的代码后,理解了一下其中的原理,并去学习了一下乐理的基础知识后,决定自己动手探索一下,并在以下部分具体解释以下其中的奥秘。
1.什么是声音
从本质上来说,声音其实是一种机械波。各种波源的振动通过介质的传播到人类或者动物的听觉器官(耳)后,听觉器官中的特殊分化细胞将感受到的振动转换为神经冲动。这些携带着振动信息的神经冲动传导至听觉中枢后,经过大脑的分析处理,最终便产生出了我们对振动的感受-声音。
声音是一种由振动带来的感受,一般来说音波常常被简化为正弦平面波的合成,而我们所说的声音的三个主要的主观属性(即音调、音量、音色)则是由如下参数刻画的:
- 频率:频率越高,音调越高。人耳可以听到的振动频率范围在20到2万赫兹(Hz)之间。高于这个频率范围的我们称为超声波,而低于这个范围的我们叫次声波。
- 波长:波长越长,音调越低。
- 振幅:振幅是在振动中距离平衡位置或静止位置的最大位移。振幅越大,音量越大。
- 波形:不同的波形有不同的音色。波形是波在物理介质上移动的抽象表达形式。简单的说,就是声波所对应的函数的曲线图形。
在信号学中,音乐信号属于正弦波,并且是由很多大大小小频率不一的波组成的。
2.MATLAB中函数介绍
在MATLAB中播放音乐的是由sound(Y,fs,bits)函数来完成,该函数的三个参数代表输入信号、采样率、比特率。假设信号输入频率是w0,采样频率为Fs,我们知道连续正弦信号可以表示为y(t)=Asin(w0*t),其中w0=2π*f0,这里f0就是信号的频率,t为连续的时间。在离散信号中,t是离散的,我们以固定的时间间隔采样,设时间间隔为Ts=1/Fs。那么t=n*Ts,n表示第n个样点。所以连续信号就可以表示成y(t)=Asin(2π*f0*n*Ts)=Asin(2π*f0*n/Fs),也就是y(n)=Asin(2π*f0*n/Fs)。
采样频率Fs是可以任意选择的,但是为了能从离散信号无失真还原原始信号,采样频率需要大于声音最高频率的两倍。Fs越大,保留的信息就越多,但是采样相同时间数据量就越大。
同时对于音频采样率的设计,音频采样率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为11025Hz、22050Hz、24000Hz、44100Hz、48000Hz五个等级,11025Hz能达到AM调幅广播的声音品质,而22050Hz和24000HZ能达到FM调频广播的声音品质,44100Hz则是理论上的CD音质界限,48000Hz则更加精确一些。所以本文中也采取使用48000Hz。
对于正弦函数y(n)=Asin(2π*f0*n/Fs),其中A决定振幅大小即控制声音大小,f0决定频率大小即控制声音的音调高低,n/Fs的范围控制着声音的长短,所以理论上利用这个公式可以发出任何声音,只是不能控制音色和音质。控制音色的主要是是谐波,一般形容高于基波频率的小波就叫作谐波。
3.简单乐理介绍
国际标准音调的频率是440Hz,即每秒内振动的次数为440次。
以国际标准音 A-la-440HZ为准:
C - do - 261.6HZ;
D - re - 293.6HZ;
E - mi - 329.6HZ;
F - fa - 349.2HZ;
G - sol- 392HZ;
A - la - 440HZ;
B - si - 493.8HZ;
在音乐中,相邻的音组中相同音名的两个音,包括变化音级,称之为八度。现代生物学研究表明,人耳的敏感程度与声音频率大致呈指数关系。每当声音的频率翻倍,我们就记它为一个单位——西方叫“八度”,东方叫均。因此对于高八度与低八度之间的频率就是成二倍的关系。
对于乐谱的简谱:
- 增时线和减时线
简谱中,音的长短是在基本音符的基础上加短横线、附点、延音线和连音符号表示的。
短横线的用法有两种:写在基本音符右边的短横线叫增时线。增时线越多,音的时值就越长。
不带增时线的基本音符叫四分音符,每增加一条增时线,表示延长一个四分音符的时间。
写在基本音符下面的短横线叫减时线。减时线越多,音就越短,每增加一条减时线,就表示缩短为原音符音长的一半。
写在音符右边的小圆点叫做附点,表示延长前面音符时值的一半。附点往往用于四分音符和少于四分音符的各种音符。
- 音高音低
记在简谱基本音符号下面的小圆点,叫低音点,它表示将基本音符降低一个音组,即降低一个纯八度。记两个圆点表示将基本音符号降低两个音组,即降低两个纯八度。
记在简谱基本音符号上面的小圆点,叫高音点,它表示将基本音符号升高一个音组,即升高一个纯八度。记两个圆点,表示升高两个音组,即升高两个纯八度。
- 音符长短
表示音乐的长短需要有一个相对固定的时间概念。简谱里将音符分为全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等。在这几个音符里面最重要的是四分音符,它是一个基本参照度量长度,即四分音符为一拍。这里一拍的概念是一个相对时间度量单位。一拍的长度没有限制,可以是1秒也可以是2秒或半秒。假如一拍是一秒的长度,那么二拍就是两秒;一拍定为半秒的话,两拍就是一秒的长度。一旦这个基础的一拍定下来,那么比一拍长或短的符号就相对容易了。
4.如何用MATLAB创作《想见你》
根据《想见你》的简谱,在这里设定采样频率为48000Hz,以标准音440为基础,通过sound函数来创作,具体代码如下。
[code]clc;clear all; fs=48000; C3_2=key(48, 2, fs); D3_2=key(50, 2, fs); E3_2=key(52, 2, fs); F3_2=key(53, 2, fs); G3_2=key(55, 2, fs); A3_2=key(57, 2, fs); B3_2=key(59, 2, fs); C4_2=key(60, 2, fs); D4_2=key(62, 2, fs); E4_2=key(64, 2, fs); F4_2=key(65, 2, fs); G4_2=key(67, 2, fs); A4_2=key(69, 2, fs); B4_2=key(71, 2, fs); C5_2=key(72, 2, fs); D5_2=key(74, 2, fs); E5_2=key(76, 2, fs); F5_2=key(77, 2, fs); G5_2=key(79, 2, fs); A5_2=key(81, 2, fs); B5_2=key(83, 2, fs); PART1=[G4_8 D4_4 C4_4 D4_4 C4_8 D4_8 D4_4 G4_8 G4_1]; PART2=[G3_8 C4_4 B3_4 C4_4 A3_8 C4_1 E4_8 E4_8]; PART3=[A3_8 A3_4 B3_4 C4_4 G3_8 G3_1 E3_8]; PART4=[F3_4 E4_8 E4_4 F4_2 D4_2]; PART5=[G3_8 D4_4 C4_4 D4_4 C4_8 D4_1 G4_8 ]; PART6=[G4_4 C4_4 B3_4 C4_4 A3_8 C4_8 C4_4 A4_8 G4_1]; PART7=[E4_8 A4_4 B4_4 C5_4 C4_1 E4_8]; PART8=[F4_4 E4_8 F4_4 G4_2 D4_2 C4_4 D4_4]; PART9=[E4_4 D4_8 E4_4 G4_2 D4_4 C4_8 D4_4 F4_2]; PART10=[C4_4 B3_8 C4_4 D4_4 A3_4 G3_2 C4_4 D4_4]; PART11=[E4_4 D4_8 E4_4 G4_2 D4_4 C4_8 D4_4 B4_1]; PART12=[C5_2 C5_4 B4_8 C5_4 B4_8 C5_4 E4_2]; PART13=[G4_2 G4_8 C5_8 B4_8 C5_8]; PART14=[E4_4 D4_8 E4_4 G4_2 D4_4 C4_8 D4_4 B4_2]; PART15=[B4_4 C5_2 E4_8 G4_8 G4_2 C5_8 B4_8 C5_8]; PART16=[A4_4 G4_8 A4_4 C5_2 G4_4 C5_8 G4_4 E4_2]; PART17=[F4_4 A4_8 G4_1 A4_8 E4_4 D4_2 C5_8 B4_8 C5_8]; PART18=[E4_4 D4_8 E4_4 G4_2 D4_4 C4_8 D4_4 B4_2]; PART19=[B4_4 C5_8 C5_8 C5_8 D5_4 E5_8 E5_2 D5_4 E5_8 C5_8]; PART20=[C5_4 A4_4 A4_2 A4_8 G4_4 C5_8 G4_8 G4_2 E4_8]; PART21=[F4_4 G4_8 A4_4 C5_2 E5_2 D5_2 C5_2]; PA1=[PART1 PART2 PART3 PART4]; PA2=[PART5 PART6 PART7 PART8]; PA3=[PART9 PART10]; PA4=[PART11 PART12 PART13]; PA5=[PART14 PART15 PART16 PART17]; PA6=[PART18 PART19 PART20 PART21]; legend=[PA1 PA2 PA3 PA4 PA5 PA6]; sound(legend,fs)
整首曲子共1分30秒,代码可以很好的重现《想见你》歌曲的伴奏(亲测有效),是不是很神奇很好听也很有意思呀!由于篇幅较长这里只粘贴部分代码,有需要的请点击链接自取~
- 运用PCA(主成分分析法)进行人脸识别的MATLAB 代码实现
- 大话遗传算法(含Matlab代码)
- 循环矩阵的Matlab代码验证
- hog matlab代码1——实现hog+svm图像二分类
- android 异步运用 --手机号码归属地查询代码
- 双边滤波(bilateral filter)快速算法 matlab实现代码
- 关于主成分分析matlab代码实现的总结
- php与XML、XSLT、Mysql的结合运用实现代码
- 如何仅用一行 matlab 代码左右翻转一副图像?
- 数值分析三次样条插值确定边界条件的函数表达式求解(MATLAB)实验报告(附实验代码)
- 自编Matlab代码实现MPC定点跟踪
- MATLAB中矩阵与数组的区别,点运算符的运用
- 运用代码管理基础架构(二)可以自定义的CMP
- 吴恩达机器学习配套第一次编程练习(代码+学习记录)(Octave/Matlab)
- matlab之SIFT代码阅读实践
- 【Matlab】关于Matlab的一些代码片段
- 一段有意思的matlab代码
- [读书笔记]Matlab代码优化
- 运用京东云代码托管、云编译、云部署等产品进行蓝绿部署简单实践
- 人脸表情识别笔记(二)特征提取之LBP(局部二值模式)原理及MATLAB代码