2013-08-07 2 views
1

У меня есть файл midi, который был создан с использованием MuseScore. Он хорошо воспроизводится в проигрывателе Windows Media, но приводит к сбою моей программы чтения миди. Я использовал следующие ссылки, чтобы помочь мне: MIDI specification и Mobilefish MIDI Guide, второй в первую очередь.Ошибка чтения MIDI-файлов в программу

4d 54 68 64 = MThd 
00 00 00 06 = Header length of 6 
00 01 = Track format 1 
00 02 = two tracks 
01 e0 = 480 delta-ticks per quarter note 

4d 54 72 6b = MTrk 
00 00 00 86 = length of 0x86 
00 ff 58 04 04 02 18 08 = time signature 
00 ff 59 02 00 00 = key signature 
00 c0 00 = program change (channel 1) 
02 b0 07 64 = control mode change (channel 1) 
02 0a = running status 
40 02 = running status 
5b 1e = running status 
02 5d = running status 
1e ac 78 90 = Aftertouch event (channel 13, not really applicable in this context) 
3e 50 = running status 
83 5f 3e = delta time (83 5f) and 3e, which is not a status byte 
(more bytes for context): 00 01 40 50 

Что существует в стандарте MIDI, который я упустил здесь?

+0

Это ваша собственная программа чтения миди? И вы ожидаете, что мы будем более способными, чем ваша программа, только поставляя входные данные, чтобы выяснить, что пошло не так в вашей программе? Мне льстит ваша уверенность ... – rene

+0

@rene Да, это мое. Какой вклад я должен добавить, чтобы сделать это сообщество более способным, чем моя программа? Я могу сказать, что я слежу за этим: [Спецификация MIDI] (http://www.oktopus.hu/imgs/MANAGED/Hangtechnikai_tudastar/The_MIDI_Specification.pdf), но эта ссылка может быть как раз проблемой (потому что это может быть неполный). И да, я уверен, что считаю, что сообщество сотен тысяч знает ответ. – glaba

+0

Я только что понял, что это может быть состояние запуска. Состояние выполнения имеет дельта-времена? И если да, то требуется ли иметь дельта-время, предшествующее байтам данных? – glaba

ответ

1

Этот вопрос, который я написал, полностью испорчен, и мне жаль тех людей, которые пытались мне помочь; Я, должно быть, неправильно скопировал вывод Notepad ++. Однако для тех, кто может столкнуться с теми же проблемами, что и я, я напишу ответ на этот вопрос.

Когда используется текущий статус, это всегда, которому предшествует дельта-время. Для тех, кто может видеть проводников, которые говорят иначе, например, этот, http://www.blitter.com/~russtopia/MIDI/~jglatt/tech/midispec/run.htm, знают, что информация об этом полностью вводит в заблуждение.

Например:

00 90 7F 7F 
7F 00 
50 7F 
50 00 

Это неправильно.

Однако, это правильная версия:

00 90 7F 7F 
81 00 7F 00 
00 50 7F 
81 00 50 00 

Это явно предшествует время дельты.

0

Если я не ошибаюсь, в текущем состоянии по-прежнему требуется указать переменную временную дельту, поэтому, даже если оба события происходят одновременно, все равно будет стоять байт 00, исходящий из текущего состояния. Однако, имея в виду, что событие aftertouch в вашем предыдущем дампе не будет иметь никакого временного смещения, так что я в тупике.

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