我正在对一种音乐格式进行逆向工程,它似乎是带有声音库的 MIDI。
但是我无法让我的实现听起来正确,因为我不知道如何以给定的 MIDI 音符播放音库中的样本(我只是以它们的原生 khz 播放它们)。
所以我的问题是 - 如果我在波形文件中有一些声音,例如 foo.wav @ 44100khz 和 0 到 127 的 MIDI 音符,那么我该如何在这个音符上播放呢?
我正在使用 Win32 API 和 DirectSound - 但我认为这并不重要,因为我认为该理论可以应用于任何地方。
我正在对一种音乐格式进行逆向工程,它似乎是带有声音库的 MIDI。
但是我无法让我的实现听起来正确,因为我不知道如何以给定的 MIDI 音符播放音库中的样本(我只是以它们的原生 khz 播放它们)。
所以我的问题是 - 如果我在波形文件中有一些声音,例如 foo.wav @ 44100khz 和 0 到 127 的 MIDI 音符,那么我该如何在这个音符上播放呢?
我正在使用 Win32 API 和 DirectSound - 但我认为这并不重要,因为我认为该理论可以应用于任何地方。
您必须以不同的速率播放样本,以便其音高正确。
样本和 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
和的频率之间的比率时m2
,440 Hz
和69
项抵消,你得到:
f1 / f2 = 2 ^ ((m1 - m2) / 12)