Я реверс-инжиниринг музыкального формата, который, кажется, MIDI со звуковым банком.
Однако я не могу заставить мою реализацию звучать правильно, потому что я не знаю, как воспроизвести семпл из звукового банка на данной ноте MIDI (я просто играю их на их родной кГц).
Итак, мой вопрос: если у меня есть какой-то звук в волновом файле, например, foo.wav @ 44100khz и нота MIDI от 0 до 127, то как мне воспроизвести его на этой ноте?
Я использую Win32 API и DirectSound — но я не думаю, что это имеет значение, так как я предполагаю, что теория может применяться где угодно.
Вы должны воспроизвести семпл с другой скоростью, чтобы его высота была правильной.
Как образец, так и событие MIDI имеют примечание.
Используйте формулу из Ноты, MIDI-номера и частоты вычислить обе частоты:
f = 440Hz * 2^((m−69)/12)
затем, с фактическими и желаемыми частотами, вы знаете соотношение, с которым скорость выборки должна быть изменена.
Например, если у вас есть сэмпл 44,1 кГц для ноты, сыгранной на B4, и если вы получаете событие MIDI, которое хочет воспроизвести ноту на D5, то частота ноты сэмпла составляет 493,88 Гц, в то время как ее следует воспроизводить, чтобы Частота ноты составляет 587,33 Гц.
Другими словами, его следует ускорить в 587,33 раза / 493,88 ≈ 1,19 раза.
Таким образом, вместо воспроизведения этого сэмпла с частотой 44,1 кГц, он должен воспроизводиться с частотой 44,1 кГц × 1,19 ≈ 52,4 кГц.
Предполагая, что ваше выходное устройство все еще работает на частоте 44,1 кГц, вы должны пересэмплировать этот образец ноты.
Для этого скажите ресемплеру, что вы хотите конвертировать из 52,4 кГц в 44,1 кГц.
Примечание: при расчете соотношения частот двух нот m1
а также m2
, 440 Hz
а также 69
условия отменяются, и вы получаете:
f1 / f2 = 2 ^ ((m1 - m2) / 12)
Других решений пока нет …