我正在逆向设计一种音乐格式,它似乎是带有声音库的MIDI。
但是我无法让我的实现听起来正确,因为我不知道如何在给定的MIDI音符中从声音库中播放样本(我只是以他们的原生khz播放它们)。
所以我的问题是 - 如果我在波形文件中有一些声音,如foo.wav @ 44100khz和一个0到127的MIDI音符,那我该如何在这个音符上播放?
我正在使用Win32 API和DirectSound - 但我认为这不重要,因为我认为该理论可以应用于任何地方。
答案 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。
注意:在计算两个音符m1
和m2
的频率之间的比率时,440 Hz
和69
条款会被取消,您会得到:
f1 / f2 = 2 ^ ((m1 - m2) / 12)