【趣味】用MATLAB演奏《追光者》
看见有很多人用MATLAB演奏歌曲,也忍不住试了一下,以下附上源码
%%%%演奏《追光者》%%%%
clear all;clc;
fs = 44100;
t = 1/fs : 1/fs :8;
N = length(t);
%% 各个音的频率
aa = [130.8 138.6 146.8 155.6 164.8 174.6 185.0 196.0 207.7 220.0 233.1 246.9...
261.6 277.2 293.7 311.1 329.6 349.2 370.0 392.0 415.3 440.0 466.2 493.9...
523.3 554.4 587.3 622.3 659.3 698.5 740.0 784.0 830.6 880.0 932.3 987.8];%各个音的频率
aa1 = [65.4 69.3 73.4 77.8 82.4 87.3 92.5 98.0 103.8 110.0 116.5 123.5];
aa2 = [1047 1109 1175 1245 1319 1397 1480 1568 1661 1760 1865 1976];
%% tone1是唱音,tone2是伴奏
tone1 = [0 0 0 0 aa(22) aa(24) aa(25) aa(24) aa(17) aa(17) aa(20) aa(20) aa(13)...
aa(15) aa(13) aa(15) aa(15) aa(20) aa(17) aa(22) aa(24) aa(25) aa(24) aa(17) aa(17) aa(20) aa(20) aa(25)...
aa(32) ...
aa(25) aa(27) aa(29) aa(25) aa(24) aa(22) aa(24) aa(25) aa(25) aa(29)...
aa(27) aa(24) aa(22) aa(20) aa(22) aa(24) aa(24) aa(27) aa(25) 0 aa(25) aa(24) aa(25) 0 aa(22) aa(22) aa(24)...
aa(25) aa(24) aa(22) aa(20) 0 aa(25) aa(27) aa(29) aa(25) aa(24) aa(22) aa(24) aa(25) aa(25) aa(29)...
aa(27) aa(24) aa(22) aa(21) aa(30) aa(29) aa(24) aa(25) 0 0 0 aa(22) aa(25)...
aa(30) aa(29) aa(25) aa(30) aa(29) aa(25) aa(25) aa(25) 0 aa(22) aa(25) aa(27) aa(27) aa(27) aa(27) aa(29) aa(30) aa(29) aa(29) aa(25)...
aa(27)...
0 0 0 aa(32) aa(34) aa(36) ...
aa2(3) aa2(1) aa(29) aa(29) aa(32) aa(32) aa(34) aa(29) aa(27) aa(25) aa(27) aa(25) aa(27) aa(27) aa(32) aa(29) aa(29) aa(32) aa(34) aa(36)...
aa2(3) aa2(1) aa(29) aa(29) aa(32) aa(32) aa(32) aa(34) aa(27) aa(25) aa(27) aa(25) aa(24) aa(24) aa(25) aa(25) aa(25) aa(32) aa(34) aa(36)...
aa2(3) aa2(1) aa(29) aa(29) aa(32) aa(32) aa(32) aa(34) aa(27) aa(25) aa(27) aa(25) aa(27) aa(27) aa(32) aa(29) aa(29) aa(32) aa(34) aa(36)...
aa2(3) aa2(1) aa(29) aa(29) aa(32) aa(32) aa(32) aa(27) aa(32) aa(32) aa(30) aa(29) aa(27) aa(27) aa(25)...
aa2(1) aa(36) aa(29) aa(29) aa(32) aa(32) aa(27) aa(25) aa(27) aa(27) aa(32) aa(29) aa(22) aa(24)...
aa(25) aa(24) aa(17) aa(17) aa(20) aa(20) aa(25) aa(32) aa(32)];
tone2 = [0 0 0 0 aa(10) aa(13) aa(6) aa(10) aa(8) aa(12) aa(13) aa(17) aa(10) aa(13) aa(6) aa(10)...
aa(8) ...
0 aa(13) aa(6) aa(13) aa(8) aa(15) aa(5) aa(12) aa(10) aa(15) aa(8) aa(13)...
aa(3) 0 aa(8) aa(8) aa(13) aa(6) aa(13) aa(8) aa(15) aa(5) aa(12) aa(10) aa(15) aa(8) aa(13)...
aa(3) aa(8) aa(8) aa(8) aa(8)...
aa1(10) aa(5) aa(10) aa(5) aa1(6) aa(1) aa(6) aa(1) aa1(8) aa(3) aa(8) aa(3) aa(1) aa1(12)...
aa1(10) aa(5) aa(10) aa(5) aa1(6) aa(1) aa(6) aa(1) aa1(8) aa(3) aa(8) aa(3) aa(1) aa1(12)...
aa1(10) aa(5) aa(10) aa(5) aa1(6) aa(1) aa(6) aa(1) aa1(8) aa(3) aa(8) aa(3) aa(1) aa1(12)...
aa1(10) aa(5) aa(10) aa(5) aa1(6) aa(1) aa(6) aa(1) aa1(8) aa(3) aa(8) aa(12) aa(3)...
aa1(10) aa(5) aa(10) aa(5) aa1(6) aa(1) aa(6) aa(1) aa1(8) aa(3) aa(8) aa(3) aa(1) aa(8) aa(13) aa(8)...
aa1(10) aa(5) aa(10) aa(5) aa1(6) aa(1) aa(6) aa1(8) aa1(8)];
for n = 1:length(tone1)
a1(n, :) = 0.1395*sin(2*pi*tone1(n)*t)+sin(4*pi*tone1(n)*t)+0.1628*sin(6*pi*tone1(n)*t)+ ...
0.0524*sin(8*pi*tone1(n)*t)+0.03145*sin(10*pi*tone1(n)*t)+0.03791*sin(12*pi*tone1(n)*t)+ ...
0.07769*sin(14*pi*tone1(n)*t)+0.03128*sin(16*pi*tone1(n)*t)+0.01328*sin(18*pi*tone1(n)*t)+ ...
0.004851*sin(20*pi*tone1(n)*t)+0.005918*sin(22*pi*tone1(n)*t);
end
for n = 1:length(tone2)
a2(n, :) = 0.1395*sin(2*pi*tone2(n)*t)+sin(4*pi*tone2(n)*t)+0.1628*sin(6*pi*tone2(n)*t)+ ...
0.0524*sin(8*pi*tone2(n)*t)+0.03145*sin(10*pi*tone2(n)*t)+0.03791*sin(12*pi*tone2(n)*t)+ ...
0.07769*sin(14*pi*tone2(n)*t)+0.03128*sin(16*pi*tone2(n)*t)+0.01328*sin(18*pi*tone2(n)*t)+ ...
0.004851*sin(20*pi*tone2(n)*t)+0.005918*sin(22*pi*tone2(n)*t);
end
%% 节奏
rym1 = [1 1 1 1/2 1/4 1/4 1/2 1/4 1/4 1/2 1/2 1 1 ...
1/2 1/4 1/4 1/2 1/2 1 1/2 1/2 1/2 1/4 1/4 1/2 1/2 1 1 ...
3 1/2 1/2 1 1/2 1/2 1/2 1/4 1/4 1/2 1/2 ...
1 1/2 1/2 1/2 1/4 1/4 1/2 1/2 1 1/2 1/4 1/4 1 1/4 1/4 1/4 1/4 ...
1/2 1/2 1/2 1/2 1 1/2 1/2 1 1/2 1/2 1/2 1/4 1/4 1/2 1/2 ...
1 1/2 1/2 1/2 1/2 1/2 1/2 1 1 1 1/2 1/4 1/4 ...
1/2 1/4 1/4 1/2 1/4 1/4 1/2 1/2 1/2 1/4 1/4 1/2 1/4 1/4 1/2 1/2 3/4 1/4 1/2 1/2 ...
4 ...
1 1 1/2 1/2 1/2 1/2 ...
1/2 1/4 1/4 1/2 1/2 1/2 1/2 1/4 1/4 1/2 1/2 1/4 1/4 1/4 1/2 1/4 1/2 1/2 1/2 1/2 ...
1/2 1/4 1/4 1/4 1/2 1/4 1/2 1/2 1/2 1/2 1/2 1/4 1/4 1/4 1/2 1/4 1/2 1/2 1/2 1/2 ...
1/2 1/4 1/4 1/4 1/2 1/4 1/2 1/2 1/2 1/2 1/2 1/4 1/4 1/4 1/2 1/4 1/2 1/2 1/2 1/2 ...
1/2 1/4 1/4 1/4 1/2 1/4 1 1/2 1/2 2 1/4 1/2 1/4 1/2 1/2 ...
1/2 1/4 1/4 1/2 1/2 2 1/2 1/4 1/4 1/2 1/2 1 1/2 1/2 ...
1/2 1/4 1/4 1/2 1/2 1 1/2 1/2 3].*fs;
rym2 = [ones(1,16) 3 1 2 ones(1,10) 1/2 1 1/2 2 2 ones(1,10) 2 2 4 4 4 ...
1/2*ones(1,12) 1 1 ...
1/2*ones(1,12) 1 1 ...
1/2*ones(1,12) 1 1 ...
1/2*ones(1,12) 2 ...
1/2*ones(1,24) 3].*fs;
%% 加包络
x1 = [];
x2 = [];
x1(1:rym1(1)) = a1(1,1:1:rym1(1));
for n = 2:length(tone1)
x1(sum(rym1(1:n-1))+1:sum(rym1(1:n))) = a1(n,1:rym1(n)).*y1(rym1(n));
end
x2(1:rym1(1)) = a2(1,1:1:rym1(1));
for n = 2:length(tone2)
x2(sum(rym2(1:n-1))+1:sum(rym2(1:n))) = a2(n,1:rym2(n)).*y1(rym2(n));
end
%% 唱音和伴奏结合
x1_left = [x1 zeros(1,100)];
x2_left = [x2 zeros(1,100)];
x1_right = [zeros(1,100) x1];
x2_right = [zeros(1,100) x2];
x_left = x1_left + 2.8*x2_left;
x_right = x1_right + 2.8*x2_right;
x_left = x_left / max(x_left);
x_right = x_right / max(x_right);
melody = [x_left;x_right];
sound(melody, fs);
%% 包络函数
function shap_y1 = y1(ylen)
yt = 1 : ylen;
shap_y1 = (5*((yt./44100).^(1/20)))./exp(yt./44100*1.8);
shap_y1 = shap_y1/max(shap_y1);
return
end
function shap_y2 = y2(ylen)
yt = ylen+1 : 352800;
shap_y2 = (5*((yt./44100).^(1/20)))./exp(yt./44100*2);
shap_y2 = shap_y2/max(shap_y2);
return
end