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

0

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

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

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

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

Теги:
language-agnostic
midi
directsound

1 ответ

3

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

И образец, и 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)
  • 0
    Я в замешательстве ... так что, если значение f для данного сэмпла - это нота 21 / "A", и я хочу воспроизвести ее как 21, то ничего менять не нужно? Но если бы было 30, тогда я бы уменьшил выборку на 9?
  • 0
    Извините, я не должен был использовать слово «resample»; вам нужно относиться к образцу так, как если бы он имел другую скорость. (Вам все еще нужно пересчитать его до скорости устройства вывода.)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню