matlab弹奏旋律(发声)笔记

matlab弹奏旋律(发声)

最近在进行matlab的学习,使用matlab进行发声可以使用sound函数,那么如何使用matlab发出一串旋律呢?
数字音频是有一个采样频率的,在这里设定采样频率为8192mhz,各个音调的频率参照十二平均律。存放在freqs向量中,从前往后前14个为两阶1-7,从后向前7个为低一阶的1-7,如果tone为负数就从后向前取频率。x为声音的长度平均划分,y为发声最终读取的波形。只需要使用tone(音色)和rhythm(所占用的节拍)来不停调用函数就可发出一段旋律。

%首先是产生波形的函数,存放在gen_wave.m文件
function y =gen_wave(tone,rhythm)
fs=8192; %设定一个采样频率
freqs=[262,293,330,349,392,440,493,523,587,659,698,783,880,988,247,220,196,175,165,147,131];
x=linspace(0 , 2pirhythm , floor(fsrhythm));
if tone>0
y=sin(freqs(tone)x).(1-x/(rhythm
2pi)); %这后面乘的内容是直线衰减,乘了rhythm是要普适于所有长度的声音
else
y=sin(freqs(1,end+1+tone)x).(1-x/(rhythm
2*pi));
end

%其次是要发声的谱子,注意第一个y的赋值和之后的不一样,第一个是开始设置频率,之后的是要在第一个的基础上续。 这里的音乐是两只老虎,0.6是一拍,其余是半拍和两拍,可以根据改变Per的大小改变每拍的时间长度,也就是改变播放的快慢。存放在music.m,脚本式运行。
fs=8196;
per=0.6;
y1=gen_wave(1,per);
y2=gen_wave(2,per);
y3=gen_wave(3,per);
y4=gen_wave(1,per);
y5=gen_wave(1,per);
y6=gen_wave(2,per);
y7=gen_wave(3,per);
y8=gen_wave(1,per);
y=[y1,y2,y3,y4,y5,y6,y7,y8];
y1=gen_wave(3,per);
y2=gen_wave(4,per);
y3=gen_wave(5,2per);
y4=gen_wave(3,per);
y5=gen_wave(4,per);
y6=gen_wave(5,2
per);
y=[y,y1,y2,y3,y4,y5,y6];
for i=1:2
y1=gen_wave(5,per/2);
y2=gen_wave(6,per/2);
y3=gen_wave(5,per/2);
y4=gen_wave(4,per/2);
y5=gen_wave(3,per);
y6=gen_wave(1,per);
y=[y,y1,y2,y3,y4,y5,y6];
end
y1=gen_wave(1,per);
y2=gen_wave(-5,per);
y3=gen_wave(1,2per);
y4=gen_wave(1,per);
y5=gen_wave(-5,per);
y6=gen_wave(1,2
per);
y=[y,y1,y2,y3,y4,y5,y6];
sound(y,fs)

你可能感兴趣的:(matlab弹奏旋律(发声)笔记)