2009-07-25 4 views
4

Ich versuche, Informationen aus einer. Mid-Datei zu lesen, aber ich sehe weiterhin zusätzliche Bytes, die nicht zu Midi-Nachrichten gehören. Ich bin mir nicht sicher, wie ich diese vorhersagen kann, und es wirft alles andere in mein Projekt. Irgendwelche Vorschläge? Hier ein paar Beispiele:Zusätzliche Bytes in .mid-Dateien

 
4d 54 72 6b 00 00 04 48   Track Header 
00 c0 19       Program Change 
00 ff 03 07 54 72 61 63 6b 20 31 Track Title 
00 b0 05 00      Controller Event 
00 64 00 00 06 0c 00 26 00  ???? 
00 b0 20 00      Controller Event 

00 ff 58 04 0c 03 0c 08   Time Signature 
81 89        ???? 
50 ff 51 03 0f 42 40    Tempo 
00 ff 2f 00      End of Track 

00 ff 21 01 00     Unknown Meta Event 
30 b0 79 00      Controller Event 
00 07 64 01 0a 32 01 5b   ???? 
14 01 5d 11 01 20 00 00 00  ???? 
00 c0 23       Program Change 
8c 7c 90 23      ???? 

Ich bin skeptisch, dass ich sogar den Zusammenbruch haben hier, weil einige von ihnen scheinen ohne ersichtlichen Grund nicht Null Delta mal zu haben.

Antwort

1

Sieht aus, als würdest du nicht einmal richtig anfangen. Die ersten acht Bytes should be

4D 54 68 64 00 00 00 06

Meine Vermutung ist, dass die Datei abgespritzt ist oder Sie lesen es nicht richtig?

EDIT: Macht nichts. Du hast nicht gesagt, dass dies der Anfang der Datei war. Die vier Bytes, die Sie haben, ist ein Chunk-Header.

2

Delta-Zeiten in MIDI-Events haben eine variable Länge. Jedes Ereignis verwendet also 1 oder mehr Bytes, um die Zeit zu codieren, die vom letzten Event verstreichen soll. Siehe this.

Jedes MIDI-Ereignis hat eine Delta-Zeit, die entweder 0 ist (zeigt an, dass es genau zur selben Zeit wie das vorherige Ereignis auftritt) oder ein positiver Wert (zeigt an, dass es nach dem vorherigen Ereignis auftreten sollte).

2

MusiGenesis hat es halb richtig - Sie analysieren nicht korrekt Deltas mit variabler Länge. Aber die anderen Ereignisse, die Sie sehen, sind running status, eine Technik, die verwendet wird, um Bandbreite zu sparen, indem das Statusbyte weggelassen wird, wenn Sie mehrere Nachrichten des gleichen Typs senden.

Hier ist, wie das Dump analysiert werden soll:

 
4d 54 72 6b 00 00 04 48   Track Header 
00 c0 19       Program Change 
00 ff 03 07 54 72 61 63 6b 20 31 Track Title 
00 b0 05 00      Controller Event 
00 64 00       Running status (controller event) 
00 06 0c       Running status (controller event) 
00 26 00       Running status (controller event) 
00 b0 20 00      Controller Event 

und so weiter. Aber was ich nicht verstehe ist, warum eine ganze Reihe zusätzlicher Events nach dem Ende der Track-Nachricht vor dem nächsten Track-Header erscheinen? Haben Sie Ihre MIDI-Datei vollständig eingefügt?

+0

Sorry, ich hätte angeben sollen. Es sind nur Teile, die gesamte Datei ist riesig, und ich kann unmöglich alle Bytes dazwischen posten. Es gibt immer noch ein paar Dinge, die ich nicht verstehe. Hier ist ein fortlaufender Teil der Datei. 00 ff 21 01 00 (Unbekanntes Meta-Ereignis) 30 b0 79 00 (Controllerwechsel) 00 07 64 01 0a 32 01 5b 14 01 5d 11 01 20 00 00 00 00 00 c0 23 Programmwechsel 8c 7c 90 23 73 0d 23 Das ist gefolgt von A LOT mehr Bytes, die Controller-Änderungen sein müssen. Es gibt keinen Hinweis auf Ereignisse in der gesamten Spur und die wenigen Werte über 7f werden nur in der Delta-Zeit angezeigt. – Skunkwaffle