MIDI или WAV файл с массивом частот и длительности - PullRequest
5 голосов
/ 20 марта 2011

Существует ли какой-либо скрипт / программное обеспечение / алгоритм, который позволяет преобразовать файл MIDI (или WAV) в список <frequency, duration>, чтобы мы могли воспроизвести «изображение» этого звукового файла, например, через System.Console.Beep(frequency, duration) функция в C #?

Ответы [ 3 ]

2 голосов
/ 20 марта 2011

Для MIDI вы должны либо проанализировать файл самостоятельно (что я и сделал, и я рекомендую следующие две ссылки: один и два ), либо получить инструментарий MIDI.Я не знаю ничего для .NET, но вот поиск Google .

Как только вы это получите, это должно быть довольно легко.Считайте MIDI-файл с помощью инструментария, и это даст вам набор дорожек .Каждая дорожка содержит последовательность событий , каждая с отметкой времени относительно предыдущего события.Событие может быть «Записано включено», «Записано выключено» или одно из сотен других событий, которые вам, вероятно, не нужны и которые можно игнорировать в этом упражнении.Просто посмотрите на события "note on" и "note off".Обычно каждая нота - это «нота» (с определенной высотой и скоростью, то есть объемом), за которой следует «нота» через некоторое время (с той же высотой и скоростью 0).

Таким образом, вооружившись этой информацией, вы можете построить таблицу заметок с четверкой (время начала, длительность, высота тона, скорость), где время начала - это время события «заметка о», длительность - это разница во времени между «заметкой».on "и" note off ", а pitch / speed - это высота тона / скорость" note on ".Вы можете преобразовать высоту звука в частоту, используя эту формулу .

Что касается WAV / MP3 / AAC / OGG, все они имеют одинаковую технику, которую Пол предлагает в своем ответе.

2 голосов
/ 20 марта 2011

Вам необходимо преобразовать MIDI, WAV или другой звуковой файл в необработанные аудиосэмплы. Затем для последовательных блоков выборок (обычно перекрывающих каждый блок на 50%), примените оконную функцию (например, Ханнинга), затем БПФ, затем возьмите величину выходных лотков БПФ, тогда для аудио вы обычно берете 20 * log10 из эта величина, чтобы получить значение в дБ.

1 голос
/ 20 марта 2011

Объяснение Пола Р. подходит для WAV.

Для MIDI вам нужно будет выбрать дорожку и прочитать данные MIDI. Как вы решаете, какой трек вам решать, но вы действительно можете выбрать только один, поскольку вы получаете только одну «ноту» за раз из динамика ПК, используя ваш метод.

C # MIDI Tutorial: http://www.codeproject.com/KB/audio-video/MIDIToolkit.aspx

Как только вы прочитаете об этом, вы должны знать, как читать MIDI-файл. Оттуда вы можете перевести это на частоты и длительности. Продолжительность зависит от темпа и количества тактов, которое длится нота, а высота тона будет зависеть от номера ноты и соответствующей частоты в соответствии с равным темпераментом . (Если бы вы хотели по-настоящему сойти с ума, вы могли бы даже выполнять альтернативные настройки, но я бы сейчас не волновался об этом.)

Кроме того, я считаю, NAudio имеет несколько классов MIDI для чтения файлов , но они могут быть неполными.

В то время как мы сходим с ума ... если бы вы могли эффективно нарезать нить (это было бы почти невозможно, я думаю, но ...), для воспроизведения в формате WAV вы могли бы использовать PWM для управления ПК динамик и эмуляция воспроизведения звука PCM . Я помню несколько старых DOS-игр от Necrobones , которые раньше делали это, и был драйвер для Windows 3.1, который отлично работал на моем 33-мегагерцовом ноутбуке для обычных щелчков и звонов. Хотя этот метод из управляемой инфраструктуры (или даже в Windows без приоритета реального времени) может быть очень сложным.

...