我已经获得了播放音乐的频率和音符。
tnote= [1,1,1/2,1/2,1,1/4,1/4,1/4,1/4,1/2,1/2,1/2,1/2,1];
fnote=[493.92, 587.36, 587.36, 659.28 659.28,784,741,784,741,784,587.36,587.36,659.28,659.28];
我的采样频率
Fs= 8000;
我用于循环,以便我可以使用从tnote(1)
到tnote(14)
的每个tnote和从fnote(1)
到fnote(14)
的正弦波中的fnote。
for i= 1:14
if tnote(i)==1
t=zeros(1,8001);
elseif tnote(i)==1/2
t=zeros(1,4001);
elseif tnote(i)==1/4
t=zeros(1,2001);
end
t= 0:1/Fs:tnote(i);
x= sin(2*pi*fnote(i)*t)
播放歌曲
soundsc(x,11025)
end
感觉就像笔记是嵌套的。我不明白为什么音符不等待前一个音符停止。我将如何在matlab中正确使用它?
答案 0 :(得分:3)
那是因为当Matlab开始播放音符时,它不会等到它结束。播放声音显然是一个独立的过程,Matlab会立即继续使用其他程序。结果,笔记堆积起来。
要按顺序播放它们,您需要创建一个更大的x
,其中包含所有音符,并且在节目结束时播放该音符。例如:
tnote= [1,1,1/2,1/2,1,1/4,1/4,1/4,1/4,1/2,1/2,1/2,1/2,1];
fnote=[493.92, 587.36, 587.36, 659.28 659.28,784,741,784,741,784,587.36,587.36,659.28,659.28]
Fs= 8000;
x = [];
for i= 1:14
if tnote(i)==1
t=zeros(1,8001);
elseif tnote(i)==1/2
t=zeros(1,4001);
elseif tnote(i)==1/4
t=zeros(1,2001);
end
t= 0:1/Fs:tnote(i);
x = [x sin(2*pi*fnote(i)*t)]; %// attach new note after the others
end
soundsc(x, Fs) %// you had 11025 instead of Fs. Was it intentional?
你还应该考虑预先分配x
而不是havint它在循环中成长。但在这种情况下,它可能不是很重要。