0

我正在对一种音乐格式进行逆向工程,它似乎是带有声音库的 MIDI。

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

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

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

4

1 回答 1

4

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

样本和 MIDI 事件都有一个音符。使用来自音符名称、MIDI 编号和频率的公式来计算这两个频率:

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.4 kHz 播放。

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


注意:当计算两个音符m1和的频率之间的比率时m2440 Hz69项抵消,你得到:

f1 / f2 = 2 ^ ((m1 - m2) / 12)
于 2013-10-15T21:12:57.990 回答