Я занимаюсь разработкой музыкального формата, который, кажется, является 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)