基于matlab演奏音乐,MATLAB演奏音乐,这波操作什么水平? zt

目前我用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函数需要让乐音的频率对应编号,下面是我自编的编号cf591b62f7c413ce79c295dda5d8c09d.png

另外,休止符是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;

fori=1:length(g)

m=fplay(g(i),t(i));

mg=[mg,m];

end

f=[89,28,35,40,44,40,35];

fori=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;

fori=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;

fori=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;

fori=1:length(g)

m=fplay(g(i),t(i));

mg=[mg,m];

end

f=[28,35,40,44,40,35];

fori=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;

fori=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;

fori=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;

fori=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;

fori=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;

fori=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;

fori=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要好听

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值