将音符转换为音高并获得音频信号

时间:2015-03-21 07:49:51

标签: matlab

音高持续时间和采样率 fs 其中“pitch”是半音中音符音高的向量(0表示静音),“持续时间”是音符持续时间的向量,以秒为单位,“fs”是用于播放的输出波信号的采样率。

pitch=   [55 55 55 55 57 55 0 57 60 0 ];
duration=[23 23 23 23 23 35 9 23 69 18 ]/64;
fs=16000;

我想使用上面的信息在MATLAB中返回音频信号。 有人可以教我吗?

THX

1 个答案:

答案 0 :(得分:1)

这需要一些思考,可能只需要花一些时间在一切正常之前写下来。

就个人而言,我将任务分解为多个功能,在我看来会涉及到:

1. Semitone to frequency
2. Time to sample number
3. Frequency and sample number to output waveform

如果可能的话,你应该添加另一个数组,其中涉及级别以便稍后进一步进展/帮助将问题简化为阶段。

由于我不确定你使用的是哪个半音缩放,你必须自己确认这个,但是你需要某种类似转换器/查找表(根据Physics of Music website的公式):

 function [frequency] = semitone2frequency(semitone)
     %Your input is how many semitones ABOVE middle C your note is
     frequency = 440*((2^(1/12))^semitone); % where 440 Hz is middle C
 end

这是基于相同的钢化量表。现在你知道了你可以产生声音的音符的频率,但等等了......

现在,您可以通过编写另一个函数来计算样本中每个声音的时间......

function [nSamples] = time2samples(time, Fs)
    dt = 1/Fs;
    nSamples = time*dt;
end

现在您已拥有这两个值,您可以生成音频信号!

frequency = semitone2frequency(55); %55 semitones above middle C
nSamples = time2samples(2,16000); %How many samples does it need to play 2 seconds

%Generate time array from 0 to how long you want the sound to be
time = 0:1:nSamples;  %Starts at 0 increases by 1 sample each time up until 2 seconds worth of samples

%Create your output waveform!
outputAudio = sin(2*pi*frequency.*time);

这将创建一个你可以播放的数组,它会发出一个音符55个半音大于中音C(不确定实际上是什么音符)2秒钟。通过使用:

收听
sound(outputAudio, 16000);

你可以在此基础上一个接一个地创建多个声音(我建议创建一个主函数,让你传递所有数组并输出一个音频波形),但这应该足以在给定的持续时间内创建某些半音!

P.S。要在任何时候将级别设为0,只需将 outputAudio 变量乘以0

即可
outputAudio = outputAudio.*0; %The . in .* is important!

或进一步控制将其乘以0到1之间的任何等级,以完成音量控制。

我希望这就足够了!祝你好运。