【趣味】用MATLAB演奏《追光者》

【趣味】用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
  • 29
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值