如何在给定的MIDI音符/八度音阶播放声音?

时间:2013-10-15 18:31:07

标签: c++ language-agnostic midi directsound

我正在逆向设计一种音乐格式,它似乎是带有声音库的MIDI。

但是我无法让我的实现听起来正确,因为我不知道如何在给定的MIDI音符中从声音库中播放样本(我只是以他们的原生khz播放它们)。

所以我的问题是 - 如果我在波形文件中有一些声音,如foo.wav @ 44100khz和一个0到127的MIDI音符,那我该如何在这个音符上播放?

我正在使用Win32 API和DirectSound - 但我认为这不重要,因为我认为该理论可以应用于任何地方。

1 个答案:

答案 0 :(得分:4)

您必须以不同的速率播放样本,以使其音高正确。

示例和MIDI事件都有一个注释。 使用Note names, MIDI numbers and frequencies中的公式计算两个频率:

f = 440Hz * 2^((m−69)/12)

然后,根据实际和所需频率,您知道必须更改样本速度的比率。


例如,如果您在B4播放了一个音符的44.1 kHz样本,并且如果您想要在D5播放音符的MIDI事件,则样本的音符频率为493.88 Hz,同时应该播放这样音符的频率为587.33 Hz。 换句话说,它应该加速587.33 /493.88≈1.19。

因此,不是在44.1 kHz播放该样本,而是必须以44.1 kHz×1.19≈52.4kHz播放。

假设您的输出设备仍以44.1 kHz运行,则必须重新采样该音符样本。 为此,请告诉重采样器您要从52.4 kHz转换为44.1 kHz。


注意:在计算两个音符m1m2的频率之间的比率时,440 Hz69条款会被取消,您会得到:

f1 / f2 = 2 ^ ((m1 - m2) / 12)