目前我用MATLAB演奏音乐主要通过我编写fplay函数和fchord函数。最基础的是fplay函数,它用来实现单个乐音,fchord用来实现和弦。
下面是两个函数的文件:
这两个函数只能实现比较简单的音,演奏简单的谱,比较复杂的琶音等我还不懂呢~
1.fplay.m
% Usage : music=fplay(freq,time) % input : % freq : frequency code % the number 49 represents a1( 440 Hz ), % the number 89 represents a rest % time : the continuing time of tone % 1 represents the time spends in 1 beat % output : % music : the data of the tone with the samping frequency is 44100 function music=fplay(freq,time) freqs=440*2.^([-48:60]/12); Fs=44100; t=linspace(0,time,floor(time*Fs)); % 一种琴音衰减曲线 % if freq==89 % music=0*sin(freqs(freq)*2*pi*t).*(1-t/time); % else % music=sin(freqs(freq)*2*pi*t).*(1-t/time); % end % 另一种琴音衰减曲线 if freq==89 music=0*sin(freqs(freq)*2*pi*t).*exp(-4*t); else %随便加的泛音数据 music=(sin(freqs(freq)*2*pi*t)+0.6*sin(freqs(freq+12)*2*pi*t)+0.3*sin(freqs(freq+24)*2*pi*t)... ).*exp(-4*t); end end
fplay函数需要让乐音的频率对应编号,下面是我自编的编号
另外,休止符是89。
2.fchord.m
% 演奏和弦 function c=fchord(f,t) c=fplay(f(1),t); for i=2:length(f) c=c+fplay(f(i),t); end
3.这是一部分我和我的祖国的代码,剩下的大家可以找谱自己编写
clear;clc;
Fs=44100;
bt=0.36;
music=[];
% 1
mg=[];
mf=[];
g=[89,64,66,68,66,64,61];
t=ones(1,7)*bt;
for i=1:length(g)
m=fplay(g(i),t(i));
mg=[mg,m];
end
f=[89,28,35,40,44,40,35];
for i=1:length(f)
m=fplay(f(i),t(i));
mf=[mf,m];
end
music=[music,mg+mf];
% 2
mg=[];
mf=[];
g=[63,61,56,59];
t=[1,1.5,0.5,6]*bt;
for i=1:length(g)
m=fplay(g(i),t(i));
mg=[mg,m];
end
f=[28,35,40,28,35,40,44,40,35];
t=ones(1,9)*bt;
for i=1:length(f)
m=fplay(f(i),t(i));
mf=[mf,m];
end
mg(length(mf))=0;
music=[music,mg+mf];
% 3
mg=[];
mf=[];
g=[64,66,68,66,64,61];
t=ones(1,6)*bt;
for i=1:length(g)
m=fplay(g(i),t(i));
mg=[mg,m];
end
f=[28,35,40,44,40,35];
for i=1:length(f)
m=fplay(f(i),t(i));
mf=[mf,m];
end
music=[music,mg+mf];
% 4
mg=[];
mf=[];
g=[63,59,56,61];
t=[1,1.5,0.5,6]*bt;
for i=1:length(g)
m=fplay(g(i),t(i));
mg=[mg,m];
end
f=[28,35,40,33,40,45,49,45,40];
t=ones(1,9)*bt;
for i=1:length(f)
m=fplay(f(i),t(i));
mf=[mf,m];
end
mg(length(mf))=0;
music=[music,mg+mf];
% 5
mg=[];
mf=[];
g=[59,57,56,54];
t=[1,1,1,3]*bt;
for i=1:length(g)
m=fplay(g(i),t(i));
mg=[mg,m];
end
f=[30,37,42,45,42,37];
t=ones(1,6)*bt;
for i=1:length(f)
m=fplay(f(i),t(i));
mf=[mf,m];
end
mg(length(mf))=0;
music=[music,mg+mf];
% 6
mg=[];
mf=[];
g=[51,49,47,56];
t=[1,1,1,3]*bt;
for i=1:length(g)
m=fplay(g(i),t(i));
mg=[mg,m];
end
f=[23,30,35,28,35,40];
t=ones(1,6)*bt;
for i=1:length(f)
m=fplay(f(i),t(i));
mf=[mf,m];
end
mg(length(mf))=0;
music=[music,mg+mf];
soundsc(music,Fs) % soundsc好像比sound要好听