Получить данные заметки из файла MIDI - PullRequest
7 голосов
/ 07 сентября 2010

Есть ли способ получить данные ноты из файла MIDI? То есть я хочу разбить MIDI-файл на составные части, чтобы они были в форме уникального слова (или любого другого типа данных). В конце я хочу взять MIDI-файл и найти шаблоны в примечаниях. Зайдите в каждую ноту, найдите ее частоту (сыгранность) и отметьте, насколько вероятно, что другие ноты будут сыграны после нее.

Было бы неплохо сделать это на C / C ++, но подойдет любой язык.

Ответы [ 2 ]

7 голосов
/ 13 сентября 2012

Ник Рейсман - извините, но я не согласен с вами ... парсинг миди в C #, C ++ - это что-то около 400 строк кода ... В этом нет ничего сложного и ничего сложного.

Советую начать с этой ссылки: https://web.archive.org/web/20141227205754/http://www.sonicspot.com:80/guide/midifiles.html
Здесь есть все, что вам нужно знать о миди и о том, как ее читать.

В кратком описании, как будет работать парсер:
1) Открыть миди в байтовом режиме
2) Прочитайте блок заголовка, где есть информация о размере, количестве дорожек и ВАЖНОМ формате файла !!
- Существует 3 типа форматов: 0,1,2 (тип 2 действительно «ценный», существует только несколько миди-файлов с этим типом, поэтому вам не нужно читать миди, если есть тип 2)
- если там не написано: "MThd" (0x4D546864), конец с ошибкой (это плохой миди-файл)
3) Чтение фрагмента трека
- если там не написано: "MTrk" (0x4D54726B) заканчивается ошибкой (это плохой миди файл)
4) Читайте миди события .. - Существует очень много событий, вы можете прочитать их все с помощью команд if-else, или вы можете прочитать только те события, которые хотите знать, например NOTE ON, NOTE OFF - Иногда в некоторых миди-файлах нет NOTE OFF .. это событие меняется с NOTE ON и скоростью 0

На сайтах все объясняется действительно красиво. Если вы откроете midi-файл в байтовом режиме, у вас будет только несколько методов, и тогда все будет только о командах if-else, и там вы поймете, что хранится прямо сейчас.
Важно понимать переменную длину, но на сайтах это тоже объясняется. Это не трудно. Вы можете погуглить многие сайты, где объясняется ПЕРЕМЕННАЯ ДЛИНА, с некоторыми изображениями и примерами. Поэтому я не думаю, что это трудно объяснить здесь.

Если вам нужен еще совет, напишите мне, я попробую. Но разбор миди не так сложен, как выглядит. Если у вас возникли проблемы, напишите мне ..

3 голосов
/ 07 сентября 2010

Парсинг MIDI-файлов вручную - это не весело, поверьте мне на слово. ;) С форматом, хотя и хорошо задокументированным, трудно разобраться, поскольку вы всегда находитесь на уровне необработанных байтов. Поскольку вы заинтересованы в извлечении некоторой значимой информации из самих файлов MIDI, я бы рекомендовал использовать такую ​​среду, как Juce , которая написана на C ++ и поддерживает чтение файлов MIDI.

Juce довольно большой, но API хороший и хорошо документированный. Например, класс для анализа MIDI-файлов довольно прост и прост в использовании.

...