如何在matlab中将每个音符彼此分开

时间:2016-01-01 12:12:29

标签: matlab

我已经获得了播放音乐的频率和音符。

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中正确使用它?

1 个答案:

答案 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它在循环中成长。但在这种情况下,它可能不是很重要。