2013-10-15 2 views
0

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

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

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

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

+0

Попробуйте downloads.dspdimension.com/smbPitchShift. cpp, хотя посмотрите больше на Pitch Shifting, это не тривиальная проблема. – IdeaHat

+0

@MadScienceDreams: Pitch Shifting - это не тривиальная проблема, но воспроизведение образца быстрее или медленнее и во многих случаях достаточно. – Shannon

ответ

3

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

Как образец, так и MIDI-событие имеют примечание. Используйте формулу из Note names, MIDI numbers and frequencies вычислить обе частоты:

f = 440Hz * 2^((m−69)/12) 

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


Например, если у вас есть образец 44,1 кГц в ноты, сыгранной на В4, и если вы получите 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? – paulm

+0

Извините, я не должен был использовать слово «resample»; вам нужно обработать образец, как если бы он имел другую скорость. (Вам все равно нужно пересчитать его на скорость выходного устройства.) –

+0

Не могли бы вы добавить пример, например, пример 44100khz в примечании B, который воспроизводится на D, рассчитанном? Я все еще довольно невежественный :( – paulm

Смежные вопросы