0x00000F0C 00 90 3C 0C [0 ticks] Note On (channel 0): C4 with velocity 12
0x00000F10 85 7F 80 48 40 [767 ticks] Note Off (channel 0): C5 with velocity 64
0x00000F15 00 80 57 40 [0 ticks] Note Off (channel 0): D#6 with velocity 64
0x00000F19 00 80 30 40 [0 ticks] Note Off (channel 0): C3 with velocity 64
0x00000F1D 00 80 3C 40 [0 ticks] Note Off (channel 0): C4 with velocity 64
0x00000F21 83 01 B0 65 00 [385 ticks] Controller (channel 0): Registered Parameter ...
0x00000F26 00 B0 64 00 [0 ticks] Controller (channel 0): Registered Parameter ...Da sind 2 "Einträge", bzw. Events, welche größere Werte als Tick-Offsets besitzen. WIE krieg ich DAS raus, ohne dann explizit raus? Wird das iwo vordefiniert?
Das ist 0 Ersichtlich, dass das plötzlich 5 Bytes sein müssen.
Ich verstehe zwar kaum, was Du da geschrieben hast, aber der Output des Programms paßt zu den Daten. In MIDI gibt es für die Delta Time ein Variable Length Coding, um große Werte darzustellen -- einen Link dazu kannst Du Dir sicher selber suchen. Du kannst Dir das so vorstellen, daß pro Byte immer nur die unteren 7 Bits tatsächlich für den Zahlenwert verwendet werden. Das oberste Bit (MSB - most significant bit) gibt an, ob noch ein weiteres Byte folgt (Bit gesetzt) oder ob dies das letzte Byte dieser Kette variabler Länge ist (Bit nicht gesetzt). An Deinem konreten Beispiel:
85 7F 80 48 40
Im ersten Byte ist das oberste Bit (0x80) gesetzt. Es muß also auch noch das folgende Byte angeschaut werden, weil es mit zu dieser Kette gehört. In diesem zweiten Byte ist das oberste Bit nicht gesetzt, und somit wissen wir, daß diese Delta-Time-Angabe insgesamt zwei Byte lang ist. Danach folgen dann Event Type (0x80 - Note Off, Channel 0), Note Number (0x48 - C5), Velocity (0x40 - 64).
Um diese Delta Time auseinanderzunehmen, schaust Du sie Dir am besten in Binärnotation an:
0x85 0x7F -> 10000101 01111111
Das oberste Bit dient wie gesagt jeweils nur dem Signalisieren im Variable Length Coding. Können wir also jeweils wegschmeißen
0000101 1111111
und die Bits anschließend wieder in Achtergruppen zusammenfassen (von rechts beginnend):
000010 11111111
Im ersten Byte gibt es nur 6 Bits, also sind die obersten 2 Bits Null -- ob man diese führenden Nullen nun aufschreibt oder nicht, spielt ja für den Zahlenwert keine Rolle. Und wenn Du das nun als (Hexa-)Dezimalzahl angibst, kommt Du auf
0x02FF = 767
Analog decodierst Du die Delta Time an Offset 0x00000F21 in Deinem Beispiel und findest den Wert 385.
War das Deine Frage?