前言
之前学了点matlab,看朋友圈有人做了《追光者》,学了几天,兴致勃勃写了个《偏爱》,后忘记记录了,现在补上。
一、效果演示
二、如何唱
参考链接
用matlab演奏周杰伦的《七里香》
matlab中size()函数的用法
如何看懂音乐简谱
曲谱网
1、原理
我大多数参考第一个链接
首先先参考一下大佬写的
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,注意中间有黑键,你也可以根据下表来查询某个音的频率。
代码中的f0 我写的是261.63,也就是上表中的C4.
mod2 mod4 分别定义1/2拍子和1/4拍子
以下面这个为例
mod2 = sin(pi*t2/t2(end)
do0t = mod2.*cos(2*pi*ScaleTable(21)*f0*t2)
pi是Π,t2是时间长度,
其中ScaleTable是比例表,
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];%长度23
ScaleTable(21)就是1/2,
根据C4到B4(标准音)分别对应着do re mi fa sol la xi
261.63*1/2 等于130.815 查表得C3,也就是do的低音,其他同理
%{
画波形
subplot(2,2,1)
plot(mod2)
subplot(2,2,2)
plot(do0f)
subplot(2,2,3)
plot(cos(2*pi*ScaleTable(21)*f0*t4))
%}
最后的do0t就是最右边的图形所示。
如果只是sin(2piScaleTable(21)f0t2)
plot(3sin(2pi*ScaleTable(21)f0t2))
像博主这样,可以做到优化声线的效果。
最后根据谱子写代码
里面有些连音线,如果发音相同,我就采取发一个长音而不是两个短音,这样好些,其他有些细节大多忘了。有些解释写代码里了。violin是原博主写的《七里香》,violin1是我写的《偏爱》,个人感觉偏爱的谱子更难一点,然后运行的时候,一块一块运行,最后运行sound,不然会出现什么doef没定义什么的奇怪bug。
2、代码
代码如下(示例):
fs = 44100;%采样率 此处采样率的设置采用了MP3的标准,即fs=44.1k
dt = 1/fs;
T16 = 0.2;
t16 = [0:dt:T16];
%[r,c]=size(A),
%size函数将矩阵的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c
[temp k] = size(t16);%k=8821
%linspace(x1,x2,N) 其中x1、x2、N分别为起始值、中止值、元素个数
%linspace(1,100) 与X=[1:1:100]这个是一样的
%t
t2 = linspace(0,8*T16,8*k);%8/16 1/2拍
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);%1/4拍
t6 = linspace(0,3*T16,3*k);%3/16拍 1/8+1/16
t8 = linspace(0,2*T16,2*k);%1/8拍
[temp i] = size(t4);
[temp j] = size(t8);
%t2(end) 为矩阵最后一个数 为1.6 (感觉博主写的有点繁琐)
mod2 = sin(pi*t2/t2(end));
mod3= sin(pi*t3/t3(end));%7/16拍
mod4 = sin(pi*t4/t4(end));
mod4_25= sin(pi*t4_25/t4_25(end));%5/16拍
mod6 = sin(pi*t6/t6(end));%3/16拍
mod8 = sin(pi*t8/t8(end));
mod16 = sin(pi*t16/t16(end));
%f0 = 2*146.83;%293.6
f0 = 261.63 % c4
%{
画波形
subplot(2,2,1)
plot(mod2)
subplot(2,2,2)
plot(do0f)
subplot(2,2,3)
plot(cos(2*pi*ScaleTable(21)*f0*t4))
%}
%ScaleTable比例表
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];%长度23
%音符定义
%do1f =mod4.*cos(2*pi*ScaleTable(5)*f0*t4)% 优化声音
%CDEFGAB C(do第一个高音)三个高音
%1/2 notes
do0t = mod2.*cos(2*pi*ScaleTable(21)*f0*t2);
re0t = mod2.*cos(2*pi*ScaleTable(22)*f0*t2);
mi0t = mod2.*cos(2*pi*ScaleTable(23)*f0*t2);
fa0t = mod2.*cos(2*pi*ScaleTable(1)*f0*t2);
so0t = mod2.*cos(2*pi*ScaleTable(2)*f0*t2);
la0t = mod2.*cos(2*pi*ScaleTable(3)*f0*t2);
si0t = mod2.*cos(2*pi*ScaleTable(4)*f0*t2);
do1t = mod2.*cos(2*pi*ScaleTable(5)*f0*t2);
re1t = mod2.*cos(2*pi*ScaleTable(6)*f0*t2);
mi1t = mod2.*cos(2*pi*ScaleTable(7)*f0*t2);
fa1t = mod2.*cos(2*pi*ScaleTable(8)*f0*t2);
so1t = mod2.*cos(2*pi*ScaleTable(9)*f0*t2);
la1t = mod2.*cos(2*pi*ScaleTable(10)*f0*t2);
sb1t = mod2.*cos(2*pi*ScaleTable(11)*f0*t2);%降si
si1t = mod2.*cos(2*pi*ScaleTable(12)*f0*t2);
do2t = mod2.*cos(2*pi*ScaleTable(13)*f0*t2);
re2t = mod2.*cos(2*pi*ScaleTable(14)*f0*t2);
mi2t = mod2.*cos(2*pi*ScaleTable(15)*f0*t2);
fa2t = mod2.*cos(2*pi*ScaleTable(16)*f0*t2);
so2t = mod2.*cos(2*pi*ScaleTable(17)*f0*t2);
la2t = mod2.*cos(2*pi*ScaleTable(18)*f0*t2);
si2t = mod2.*cos(2*pi*ScaleTable(19)*f0*t2);
do3t = mod2.*cos(2*pi*ScaleTable(20)*f0*t2);
% 1/4 notes f four
do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);%mod4为1/4拍
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);
si0f = 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);
sb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);%降si
si1f = 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);
si2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);
do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);
b1kf = zeros(1,i);%停1/4
% 1/8 notes 8 eight
do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);
re0e = mod8.*cos(2*pi*ScaleTable(22)*f0*t8);
mi0e = mod8.*cos(2*pi*ScaleTable(23)*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);
si0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);
do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);
re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);
mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);
fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);
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);
sb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);
si1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);
d02e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);
re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);
mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);
fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);
so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);
la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);
si2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);
do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);
b1ke = zeros(1,j);
% 3/16 notes _6
do0_6 = mod6.*cos(2*pi*ScaleTable(21)*f0*t6);
re0_6 = mod6.*cos(2*pi*ScaleTable(22)*f0*t6);
mi0_6 = mod6.*cos(2*pi*ScaleTable(23)*f0*t6);
fa0_6 = mod6.*cos(2*pi*ScaleTable(23)*f0*t6);
so0_6 = mod6.*cos(2*pi*ScaleTable(2)*f0*t6);
la0_6 = mod6.*cos(2*pi*ScaleTable(3)*f0*t6);
si0_6 = mod6.*cos(2*pi*ScaleTable(4)*f0*t6);
do1_6 = mod6.*cos(2*pi*ScaleTable(5)*f0*t6);
re1_6 = mod6.*cos(2*pi*ScaleTable(6)*f0*t6);
mi1_6 = mod6.*cos(2*pi*ScaleTable(7)*f0*t6);
fa1_6 = mod6.*cos(2*pi*ScaleTable(8)*f0*t6);
so1_6 = mod6.*cos(2*pi*ScaleTable(9)*f0*t6);
la1_6 = mod6.*cos(2*pi*ScaleTable(10)*f0*t6);
sb1_6 = mod6.*cos(2*pi*ScaleTable(11)*f0*t6);%降si
si1_6 = mod6.*cos(2*pi*ScaleTable(12)*f0*t6);
do2_6 = mod6.*cos(2*pi*ScaleTable(13)*f0*t6);
re2_6 = mod6.*cos(2*pi*ScaleTable(14)*f0*t6);
mi2_6 = mod6.*cos(2*pi*ScaleTable(15)*f0*t6);
fa2_6 = mod6.*cos(2*pi*ScaleTable(16)*f0*t6);
so2_6 = mod6.*cos(2*pi*ScaleTable(17)*f0*t6);
la2_6 = mod6.*cos(2*pi*ScaleTable(18)*f0*t6);
si2_6 = mod6.*cos(2*pi*ScaleTable(19)*f0*t6);
do3_6 = mod6.*cos(2*pi*ScaleTable(20)*f0*t6);
% 5/16 notes
do0_4_25 = mod4_25.*cos(2*pi*ScaleTable(21)*f0*t4_25);
re0_4_25 = mod4_25.*cos(2*pi*ScaleTable(22)*f0*t4_25);
mi0_4_25 = mod4_25.*cos(2*pi*ScaleTable(23)*f0*t4_25);
fa0_4_25 = mod4_25.*cos(2*pi*ScaleTable(23)*f0*t4_25);
so0_4_25 = mod4_25.*cos(2*pi*ScaleTable(2)*f0*t4_25);
la0_4_25 = mod4_25.*cos(2*pi*ScaleTable(3)*f0*t4_25);
si0_4_25 = mod4_25.*cos(2*pi*ScaleTable(4)*f0*t4_25);
do1_4_25 = mod4_25.*cos(2*pi*ScaleTable(5)*f0*t4_25);
re1_4_25 = mod4_25.*cos(2*pi*ScaleTable(6)*f0*t4_25);
mi1_4_25 = mod4_25.*cos(2*pi*ScaleTable(7)*f0*t4_25);
fa1_4_25 = mod4_25.*cos(2*pi*ScaleTable(8)*f0*t4_25);
so1_4_25 = mod4_25.*cos(2*pi*ScaleTable(9)*f0*t4_25);
la1_4_25 = mod4_25.*cos(2*pi*ScaleTable(10)*f0*t4_25);
sb1_4_25 = mod4_25.*cos(2*pi*ScaleTable(11)*f0*t4_25);%降si
si1_4_25 = mod4_25.*cos(2*pi*ScaleTable(12)*f0*t4_25);
do2_4_25 = mod4_25.*cos(2*pi*ScaleTable(13)*f0*t4_25);
re2_4_25 = mod4_25.*cos(2*pi*ScaleTable(14)*f0*t4_25);
mi2_4_25 = mod4_25.*cos(2*pi*ScaleTable(15)*f0*t4_25);
fa2_4_25 = mod4_25.*cos(2*pi*ScaleTable(16)*f0*t4_25);
so2_4_25 = mod4_25.*cos(2*pi*ScaleTable(17)*f0*t4_25);
la2_4_25 = mod4_25.*cos(2*pi*ScaleTable(18)*f0*t4_25);
si2_4_25 = mod4_25.*cos(2*pi*ScaleTable(19)*f0*t4_25);
do3_4_25 = mod4_25.*cos(2*pi*ScaleTable(20)*f0*t4_25);
% 1/16 notes 16 sixteen
do0s = mod16.*cos(2*pi*ScaleTable(21)*f0*t16);
re0s = mod16.*cos(2*pi*ScaleTable(22)*f0*t16);
mi0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16);
fa0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16);
so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);
la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);
si0s = 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);
sb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);%降si
si1s = 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);
si2s = 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 si1e do2s do2_4_25 blke do2e...
do2e si1e la1e si1s la1_6 so1f so1e...
so1f fa1e mi1s so1_3 so1e...
so1e la1_6 re1e fa1s fa1_6 mi1f so1e...
do2f si1e do2s do2_4_25 blke do2e...
do2e si1e do2e re2s re2_6 do2e do2e si1e...
do2e do2s do2_6 si1e si1e la1e la1e si1s 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 si1e do2s do2_4_25...
blke do2e do2e la1e la1e so1e...
si1e do2e re2_6 do2_6 so1e si1e do2s do2_4_25...
blke do2e do2e la1e la1e so1e...
re2e mi2e fa2_6 mi2_6 so1e si1e do2s do2_4_25...
blke do2e do2e la1e la1e so1e...
re2e do2e si1e do2s do2_6 blke do2e...
do2e re2e re2e do2e do2e si1e re2e do2s do2_6
];
violin1 = [do1_6 si0e mi0s do1s so1s so1_6 la0_6 do1s re1s...
re1f so1f b1kf so0s la0_6 mi0s...%re1f so1f 3/16b1kf so0s la0_6 mi0s...
do1s la0s do1s mi1e mi0s do1s so1s so1_6 fa1_6 mi1e...
re1_6 so0_4_25 so0t...
blkf la0s do1s do1e do1f fa0s fa0_6...
blkf so0e so0e mi1f re1f re1e do1f do1_4_25...
blks do1s re1s do1_4_25 b1ke fa0s fa0s...
la0_6 so0s so0t b1kf ...
blkf la0s do1s do1e do1e re1s mi1_6 do1s mi1_4_25...
blke mi1s mi1s re1s so1_6 so1e si0s do1_6...
re1s do1_4_25 blkf mi1e fa1e mi1e fa1e...
mi1f do1e do1e la0s re1f blkf... %mi1f do1e do1e la0s 3/8re blkf...
b1kf fa1e fa1e fa1e mi1s mi1s re1e mi1_4_25...%b1kf fa1e fa1e fa1e mi1s mi1s re1e re1s mi1_4_25...
b1ke mi1s mi1s mi1s la1_6 re1e do1s do1_4_25...
blke la0s la0s la0e si0e do1s mi1e...%blke la0s la0s la0e si0e do1s mi1e re1s...
re1t mi1t...
do2e do2e do2_6 do2s d02e do1s b1ke do1s... %do2e do2e 3/16do2 do2s d02e do1s 3/16b1ke do1s...
do2e si1s la1e so1s mi1f mi1s re1s la0s...%do2e si1s la1e so1s 3/8mi1 mi1s re1s la0s...
do1s re1e mi1f so0s do1s re1e mi1s b1ke la0s... %do1s re1e mi1f so0s do1s re1e mi1s 3/16b1ke
do1s re1e mi1_4_25 b1kf...%o1s re1e mi1_4_25 mi1f b1kf..
do2e do2e do2e si1s la1s la1s si1e do2s b1ke do1s do1s...
do2e do2s si1s la1s so1e mi1_4_25 mi1s re1s la0s...%do2e do2s si1s la1s so1e mi1_4_25 mi1s re1s la2s...
mi1f mi1s re1s la0s mi1f mi1s re1s do1s la0e... %mi1f mi1s re1s la2s mi1f mi1s re1s do1s la2e...
re1t b1ke do2_6 si1s la1s do1e...%7/16re1t b1ke do2_6 si1s la1s do1e..
so1s la1f b1kf so1s fa1s mi1s fa1e...%so1s 3/8la1f b1kf so1s fa1s mi1s fa1e
re1s mi1s re1t si1s si1s la1s si1s...%re1s mi1s 7/16re1t si1s si1s la1s si1s
do1_6 mi1s mi1f la1_6 so1e mi1e re1t%do1_6 mi1s mi1f la1_6 so1e mi1e 7/16re1t
];
v1 = [do1_6 si0e mi0s do1s so1s so1_6 la0_6 do1s re1s...
re1f so1f b1kf so0s la0_6 mi0s...%re1f so1f 3/16b1kf so0s la0_6 mi0s...
do1s la0s do1s mi1e mi0s do1s so1s so1_6 fa1_6 mi1e...
re1_6 so0_4_25 so0t];
s = violin1;
s = s/max(s);%对得到的结果归一化
sound(s,fs);%sound(Y,fs,bits) Y一般是一个正弦波,如A* sin(2* pi* w* t)。
%其中A控制着声音的大小,w控制着声音的高低,t的范围控制着声音的长短,
%所以理论上利用这个公式可以发出任何声音,只是不能控制音色和音质
audiowrite('Qilixiang.wav',violin1,fs)
总结
大多数是根据写七里香的大佬跟着写的,里面还有很多我没看懂,有很多不足之处,大家看懂了可以在评论区评论。