2013-10-15 84 views
0

我正在逆向工程一个音乐格式,它似乎是一个声音银行的MIDI。如何在给定的MIDI音符/八度处播放声音?

但是我不能让我的实现声音正确,因为我不知道如何在给定的MIDI音符(我只是在他们的本地khz播放它们)从声音库播放样本。

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

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

+0

尝试downloads.dspdimension.com/smbPitchShift。 CPP,虽然看起来更倾向于Pitch Shifting,但这不是一个小问题。 – IdeaHat

+0

@MadScienceDreams:音高移位并不是一个小问题,但在许多情况下播放样本更快或更缓慢就足够了。 – Shannon

回答

3

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

样本和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。


注:计算时的两个音符m1m2,在440 Hz69方面抵消频率之间的比,你会得到:

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

我很困惑..所以如果一个给定样本的f值是21/A,而我想把它当作21来玩,那么什么都不需要改变?但如果是30,那么我会减少9? – paulm

+0

对不起,我不应该使用“resample”这个词;您需要将样品视为具有不同的比率。 (您仍然需要将其重新采样到输出设备的速率。) –

+0

您能否在B计算的音符B中添加一个44100khz示例的示例?我仍然很无能:( – paulm