我正在逆向工程一个音乐格式,它似乎是一个声音银行的MIDI。如何在给定的MIDI音符/八度处播放声音?
但是我不能让我的实现声音正确,因为我不知道如何在给定的MIDI音符(我只是在他们的本地khz播放它们)从声音库播放样本。
所以我的问题是 - 如果我在波形文件中有一些声音,如foo.wav @ 44100khz和0到127的MIDI音符,那么我怎么在这个音符上播放它?
我正在使用Win32 API和DirectSound - 但我不认为这很重要,因为我认为理论可以在任何地方应用。
我正在逆向工程一个音乐格式,它似乎是一个声音银行的MIDI。如何在给定的MIDI音符/八度处播放声音?
但是我不能让我的实现声音正确,因为我不知道如何在给定的MIDI音符(我只是在他们的本地khz播放它们)从声音库播放样本。
所以我的问题是 - 如果我在波形文件中有一些声音,如foo.wav @ 44100khz和0到127的MIDI音符,那么我怎么在这个音符上播放它?
我正在使用Win32 API和DirectSound - 但我不认为这很重要,因为我认为理论可以在任何地方应用。
您必须以不同的速率播放样本,以使其音高正确。
样本和MIDI事件都有一个音符。 从Note names, MIDI numbers and frequencies使用公式来计算两个频率:
f = 440Hz * 2^((m−69)/12)
然后,与实际和期望的频率,要知道,通过该样品的速度必须改变的比率。
举例来说,如果你有一个音符的44.1 kHz采样演奏在B4,如果你想要在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)
尝试downloads.dspdimension.com/smbPitchShift。 CPP,虽然看起来更倾向于Pitch Shifting,但这不是一个小问题。 – IdeaHat
@MadScienceDreams:音高移位并不是一个小问题,但在许多情况下播放样本更快或更缓慢就足够了。 – Shannon