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
matlab演奏《卡农》代码
于 2022-01-26 00:33:11 首次发布