Как воспроизвести звук на данной ноте / октаве MIDI?

Я реверс-инжиниринг музыкального формата, который, кажется, MIDI со звуковым банком.

Однако я не могу заставить мою реализацию звучать правильно, потому что я не знаю, как воспроизвести семпл из звукового банка на данной ноте MIDI (я просто играю их на их родной кГц).

Итак, мой вопрос: если у меня есть какой-то звук в волновом файле, например, foo.wav @ 44100khz и нота MIDI от 0 до 127, то как мне воспроизвести его на этой ноте?

Я использую Win32 API и DirectSound — но я не думаю, что это имеет значение, так как я предполагаю, что теория может применяться где угодно.

0

Решение

Вы должны воспроизвести семпл с другой скоростью, чтобы его высота была правильной.

Как образец, так и событие 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)
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]