matlab演奏《卡农》代码

clear
%% 程序配置
global fs
global trail
global fff
global fdb
fs = 44100;
trail = 0/15;
% 长唢呐频谱
fff = [261.67 523.34 785.39 1046.10 1307.76 1569.43 1829.18 1991.25 2354.05 2615.72 2881.42 3140.21 2881.42 3140.21 4446.82 4712.33 4978.61 5227.98 5748.43 5498.49 6009.90 6277.73 6532.09 6797.02 7073.50 7320.36 7585.49 7843.70 6110.36 8370.49]/261.67/2;
fdb = [51.28 52.31 62.08 55.41 65.65 68.68 52.87 24.65 52.07 52.74 45.30 42.53 45.30 42.53 24.42 21.94 3.23 30.96 34.02 24.02 35.18 39.96 35.23 26.23 26.35 28.98 21.86 21.72 18.58 11.85];
%% 卡农
% 完整版
ka_nong = [[1480,1250];[1319,1250];[1175,1250];[1109,1250];[988,1250];[880,1250];[988,1250];[1109,1250];[1175,1250];[1109,1250];[988,1250];[880,1250];[784,1250];[740,1250];[784,1250];[659,1250];[1175,313];[1109,313];[1175,313];[587,313];[554,313];[880,313];[659,313];[740,313];[587,313];[1175,313];[1109,313];[988,313];[1109,313];[1480,313];[1760,313];[1976,313];[1568,313];[1480,313];[1319,313];[1568,313];[1568,313];[1480,313];[1175,313];[1109,313];[988,313];[880,313];[784,313];[740,313];[659,313];[784,313];[740,313];[659,313];[587,313];[659,313];[740,313];[784,313];[880,313];[659,313];[880,313];[784,313];[740,313];[988,313];[880,313];[784,313];[880,313];[784,313];[740,313];[659,313];[587,313];[494,313];[988,313];[1109,313];[1175,313];[1109,313];[988,313];[880,313];[784,313];[740,313];[659,313];[988,313];[880,313];[988,313];[880,313];[784,313];[740,625];[1480,625];[1319,1250];[1175,1250];[1319,1250];[1175,625];[1480,625];[1319,625];[1568,625];[1760,313];[1480,156];[1568,156];[1760,313];[1480,156];[1568,156];[1760,156];[880,156];[988,156];[1109,156];[1175,156];[1319,156];[1480,156];[1568,156];[1480,313];[1175,156];[1319,156];[1480,313];[740,156];[784,156];[880,156];[988,156];[880,156];[784,156];[880,156];[740,156];[784,156];[880,156];[784,313];[988,156];[880,156];[784,313];[740,156];[659,156];[740,156];[659,156];[587,156];[659,156];[740,156];[784,156];[880,156];[988,156];[784,313];[988,156];[880,156];[988,313];[1109,156];[1175,156];[880,156];[988,156];[1109,156];[1175,156];[1319,156];[1480,156];[1568,156];[1760,156];[1480,313];[1175,156];[1319,156];[1480,313];[1319,156];[1175,156];[1319,156];[2217,156];[1175,156];[1319,156];[1480,156];[1319,156];[1175,156];[1109,156];[1175,313];[988,156];[1109,156];[1175,313];[587,156];[659,156];[740,156];[784,156];[740,156];[659,156];[740,156];[1175,156];[1109,156];[1175,156];[988,313];[1175,156];[1109,156];[988,313];[880,156];[784,156];[880,156];[784,156];[740,156];[784,156];[880,156];[988,156];[1109,156];[587,156];[988,313];[1175,156];[1109,156];[1175,313];[1109,156];[988,156];[1109,156];[1175,156];[1319,156];[1175,156];[1109,156];[1175,156];[988,156];[1109,156];[1480,313];[740,313];[784,313];[740,313];[659,313];[1319,313];[1480,313];[1319,313];[1175,313];[740,313];[587,313];[988,313];[880,313];[440,313];[392,313];[440,313];[494,313];[988,313];[1109,313];[988,313];[1109,313];[440,313];[392,313];[440,313];[494,313];[988,313];[880,313];[988,313];[1109,313];[1109,313];[988,313];[1109,313];[587,313];[1175,313];[1319,313];[1175,313];[1109,313];[554,313];[587,313];[554,313];[494,313];[988,313];[880,313];[988,313];[1109,313];[554,313];[740,313];[659,313];[587,313];[1175,313];[1319,313];[1568,313];[1480,313];[740,313];[880,313];[1480,313];[1175,313];[1568,313];[1480,313];[1568,313];[1319,313];[880,313];[784,313];[880,313];[740,313];[1175,156];[1109,156];[1175,313];[740,313];[880,313];[880,156];[988,156];[1109,313];[880,313];[740,313];[1175,156];[1319,156];[1480,313];[1175,313];[1480,313];[1480,156];[1319,156];[1175,313];[1109,313];[988,313];[988,156];[880,156];[988,313];[1109,313];[1175,313];[1480,156];[1319,156];[1175,313];[1480,313];];
% 高潮部分
ka_nong_0 = [[1760,313];[1480,156];[1568,156];[1760,313];[1480,156];[1568,156];[1760,156];[880,156];[988,156];[1109,156];[1175,156];[1319,156];[1480,156];[1568,156];[1480,313];[1175,156];[1319,156];[1480,313];[740,156];[784,156];[880,156];[988,156];[880,156];[784,156];[880,156];[740,156];[784,156];[880,156];[784,313];[988,156];[880,156];[784,313];[740,156];[659,156];[740,156];[659,156];[587,156];[659,156];[740,156];[784,156];[880,156];[988,156];[784,313];[988,156];[880,156];[988,313];[1109,156];[1175,156];[880,156];[988,156];[1109,156];[1175,156];[1319,156];[1480,156];[1568,156];[1760,156];[1480,313];[1175,156];[1319,156];[1480,313];[1319,156];[1175,156];[1319,156];[2217,156];[1175,156];[1319,156];[1480,156];[1319,156];[1175,156];[1109,156];[1175,313];[988,156];[1109,156];[1175,313];[587,156];[659,156];[740,156];[784,156];[740,156];[659,156];[740,156];[1175,156];[1109,156];[1175,156];[988,313];[1175,156];[1109,156];[988,313];[880,156];[784,156];[880,156];[784,156];[740,156];[784,156];[880,156];[988,156];[1109,156];[587,156];[988,313];[1175,156];[1109,156];[1175,313];[1109,156];[988,156];[1109,156];[1175,156];[1319,156];[1175,156];[1109,156];[1175,156];[988,156];[1109,156];[1480,313];[740,313];[784,313];[740,313];[659,313];[1319,313];[1480,313];[1319,313];[1175,313];[740,313];[587,313];[988,313];[880,313];[440,313];[392,313];[440,313];[494,313];[988,313];[1109,313];[988,313];[1109,313];[440,313];[392,313];[440,313];[494,313];[988,313];[880,313];[988,313];[1109,313];[1109,313];[988,313];[1109,313];[587,313];[1175,313];[1319,313];[1175,313];[1109,313];[554,313];[587,313];[554,313];[494,313];[988,313];[880,313];[988,313];[1109,313];[554,313];[740,313];[659,313];[587,313];[1175,313];[1319,313];[1568,313];[1480,313];[740,313];[880,313];[1480,313];[1175,313];[1568,313];[1480,313];[1568,313];[1319,313];[880,313];[784,313];[880,313];[740,313];[1175,156];[1109,156];[1175,313];[740,313];[880,313];[880,156];[988,156];[1109,313];[880,313];[740,313];[1175,156];[1319,156];[1480,313];[1175,313];[1480,313];[1480,156];[1319,156];[1175,313];[1109,313];[988,313];[988,156];[880,156];[988,313];[1109,313];[1175,313];[1480,156];[1319,156];[1175,313];[1480,313];];

%% 运行
MusicData()
% y = get_y(ka_nong, 0);
y = get_y(ka_nong_0, 0);
sound(y, fs);

%% 主程序
function out = get_y(data, ooo)
    y = [];
    for i = 1:length(data)
        if i == 1
            y0 = gen_wave(data(i,1)*2^ooo, data(i,2));
        else
            y0 = gen_wave(data(i,1)*2^ooo, data(i,2), y1(y1(length(y1))+1 : length(y1)-1));
        end

        y1 = y0;

        if i == length(data)
            y = [y, y0(1:length(y0)-1)];
        else
            y = [y, y0(1:y0(length(y0)))];
        end
    end

    out = y/max(y);
end

%% 函数1
function out = gen_wave(f, t, tra)
    global fs
    global trail
    global fff
    global fdb
    num1 = round(fs*t/1000.0);
    num2 = round(fs*t/(1-trail)/1000.0);
    x = linspace(0, 2*pi*t/1000.0, num2);

    out = 0 * x;
    for i = 1:length(fff)
       out = out +  fdb(i) * sin(fff(i)*f*x);
    end
    out = out .* envelope(x);
    out = [out, num1];
    
    if nargin == 3
        difn = length(out) - length(tra);
        tra = [tra, zeros(1, difn)];
        out = out + tra;
    end
end

%% 函数2
function out = envelope(x)
    len = length(x);
    x1 = 0; y1 = 0;
    px2 = round(len * 1/5); x2 = x(px2); y2 = 1.5;
    px3 = round(len * 1/3); x3 = x(px3); y3 = 1;
    px4 = round(len * 2/3); x4 = x(px4); y4 = 1;
    px5 = round(len * 1);   x5 = x(px5); y5 = 0;
    
    k1 = (y2-y1)/(x2-x1);  b1 = y1 - k1*x1;
    k2 = (y3-y2)/(x3-x2);  b2 = y2 - k2*x2;
    k3 = (y4-y3)/(x4-x3);  b3 = y3 - k3*x3;
    k4 = (y5-y4)/(x5-x4);  b4 = y4 - k4*x4;
    
    out1 = k1 * x(0+1:px2) + b1;
    out2 = k2 * x(px2+1:px3) + b2;
    out3 = k3 * x(px3+1:px4) + b3;
    out4 = k4 * x(px4+1:px5) + b4;
    
    out = [out1, out2, out3, out4];
end
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43964993

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值