Forum: PC-Programmierung Mididatei - Befehle erkennen


von Sam .. (sam1994)


Lesenswert?

Hi
ich versuche gerade den Aufbau einer Mididatei nach zu vollziehen. Ich 
selbst verstehe den Inhalt, allerdings funktioniert meine 
Analyse-Software nicht, da sie nicht die Länge der Befehle erkennt und 
somit schon nach kurzer Zeit "verrutscht". Zum Beispiel gibt es den Note 
Off Befehl:
Laut dieser Seite:
1
8X YY ZZ
2
3
X=Kanal
4
YY=Note (siehe Noten)
5
ZZ=Dynamik (Drucklautstärke)
http://jakob-werner.de/Midi/Tabellen.htm#Tabelle%207:

Also insgesamt hat der Note Off Befehl 3 Bytes.

In einer Mididatei aus dem Internet 
(http://users.snip.net/~mshuster/mario2.mid , die völlig fehlerfrei 
abgespielt wird), finde ich aus diesem Ausschnitt
1
99 2A 73 28 
2
89 2A 00 
3
81 18 
4
99 2A 6D 28 
5
89 2A 00 68 
6
99 2A 62 1A 
7
89 2A 00 16 
8
99 2A 6D 24 
9
89 2A 00 
10
81 1C 
11
99 2A 6D 1E
12
89 2A 00 72 
13
99 2A 56 28

diese Note On Befehle:
1
89 2A 00 68
2
89 2A 00 16
3
89 2A 00
4
81 1C
5
89 2A 00 72

Diese haben Länge zwischen 2 und 4 Bytes. Wie kann ein Programm nun 
erkennen ob der nächste Midi-Befehl beginnt? Ich erkenne es nur dadurch, 
dass es keine andere Möglichkeit gibt, die Befehle aufzuteilen - aber 
eigentlich müsste das doch eindeutig sein.

von Tassilo (Gast)


Lesenswert?

Wenn ich mir die MIDI-Befehlsliste so ansehe: Höchstwertiges Bit (Bit 7) 
gesetzt (also 80h...FFh) ist ein Befehl, ansonsten (also 00h bis 7Fh) 
sind Daten zum vorangehenden Befehl.

von Jonas B. (jibi)


Lesenswert?

>Wenn ich mir die MIDI-Befehlsliste so ansehe: Höchstwertiges Bit (Bit 7)
>gesetzt (also 80h...FFh) ist ein Befehl, ansonsten (also 00h bis 7Fh)
>sind Daten zum vorangehenden Befehl.

Genauso ist es. Siehe Midi-Spezifikation.

http://de.wikipedia.org/wiki/Musical_Instrument_Digital_Interface

Gruß Jonas

von Sam .. (sam1994)


Lesenswert?

wow, das ging ja schnell. Dankeschön für die Aufklärung. So etwas 
ähnliches hatte ich mal im Kopf, aber aus irgendeinem Grund wieder 
verworfen.

von Sam .. (sam1994)


Lesenswert?

Das Programm schafft es nun sich durch die Mididatei zu wursteln. Jetzt, 
wo ich die Mididatei in ein anderes Format konvertieren will, frage ich 
mich, welche Angabe in der Mididatei, die Länge zum nächsten Befehl 
angibt.

Auf dieser Seite gibt es ein Beispiel:
http://jakob-werner.de/Midi/Dateiaufbau.htm

9045 6E81 20 Spiele Note A in der 5 Oktave
9 = Note ein 0=Kanal 1
45 = Note A in der 5 Oktave
6E = Anschlagstärke
81 = Dauer der Note

90 4500 20 = Schalte Note 45 aus
9 = Note ein 0=Kanal 1
45 = Note A in der 5 Oktave
00 = Anschlagdynamik (Lautstärke 0)
Erklärung: Schalte Note mit
Lautstärke 0 ein hat die gleiche
Bedeutung wie Note off.

Der NoteOn-Befehl enthält 81 als Dauer der Note. Der NoteOff Befehl 
jedoch nicht. Ein Sequencer sendet also zuerst den NoteOn Befehl und 
wartet 81 Ticks bis er den NoteOff Befehl sendet. Danach sendet er den 
nächsten Befehl (stimmt das?). Aber wie wird dann z.B. eine Pause 
beschrieben? Der NoteOff Befehl sollte doch eigentlich auch eine 
Variable Verzögerung zum nächsten Befehl erlauben? Oder stelle ich mir 
das Midi-System falsch vor?

Was mich außerdem noch verwirrt ist die 0x20 am Ende jedes Befehls im 
obigen Beispiel.

von Simon B. (nomis)


Lesenswert?

Samuel K. schrieb:
> Der NoteOn-Befehl enthält 81 als Dauer der Note. Der NoteOff Befehl
> jedoch nicht. Ein Sequencer sendet also zuerst den NoteOn Befehl und
> wartet 81 Ticks bis er den NoteOff Befehl sendet. Danach sendet er den
> nächsten Befehl (stimmt das?). Aber wie wird dann z.B. eine Pause
> beschrieben? Der NoteOff Befehl sollte doch eigentlich auch eine
> Variable Verzögerung zum nächsten Befehl erlauben? Oder stelle ich mir
> das Midi-System falsch vor?

Ich glaube die Beschreibung auf dieser Seite taugt nicht so recht.

In einer Midi-Datei stehen nicht nur Midi-events, sondern auch 
Delta-Times, die die Zeiten zwischen zwei Events beschreiben.

Das ist eine "variable-length" Zahl. Dabei werden nur 7 Bits für die 
Daten verwendet, und das höchstwertigste Bit zeigt an, ob noch ein 
weiteres Datenbyte für diesen Wert folgt.

Siehe z.B. http://www.sonicspot.com/guide/midifiles.html

Viele Grüße,
        Simon

von Sam .. (sam1994)


Lesenswert?

Danke, die Seite sieht schon vielversprechender aus.

Sehe ich das richtig, dass die Deltatimes vor dem Event beginnen?
Bisher sucht mein Programm das nächste Event und wertet das dann aus. 
Wenn ich jetzt ein Channel-Event finde muss ich also die Deltaticks 
davor auch noch auslesen?

Das hieße auch, dass eine Midi-Datei mit einem Deltaevent beginnen muss. 
Und das erklärt auch das ganze 0x00 in den Mididateien, dass mich bisher 
verwirrt hat - einfach keine Pause bis zum nächsten event.

von Jonas B. (jibi)


Lesenswert?

Nö, der Noteon befehl sendet keine Notenlänge. Die Notenlänge wird 
einfach durch die Zeit bestimmt, die zwischen einem NoteOn und dem 
entsprechenden NoteOff Befehl verstreicht. Manche Sequencer senden auch 
ein NoteOn mit Velocity 0 als NoteOff Befehl.

Gruß Jonas

von Jonas B. (jibi)


Lesenswert?

Du musst bei Midi zwei Dinge unterscheiden im Datenstrom:
Einmal die eigentlichen Musikdaten und dann zusätzliche (nicht unbedingt 
notwendige) Synchronisationsdaten. Diese brauchst du um mehrere 
Midigeräte sinnvoll zu verbinden(also synchronisiert).

Gruß und sorry für Doppelpost

von Simon B. (nomis)


Lesenswert?

Samuel K. schrieb:
> Das hieße auch, dass eine Midi-Datei mit einem Deltaevent beginnen muss.
> Und das erklärt auch das ganze 0x00 in den Mididateien, dass mich bisher
> verwirrt hat - einfach keine Pause bis zum nächsten event.

Genau.

Man muss halt unterscheiden zwischen einem Midi-Datenstrom (auf einem 
Kabel) - da gibt es keine Delta-Times, die Events kommen "live", und 
einer Midi-Datei, wo natürlich irgendwo die Zeitabstände gespeichert 
werden müssen.

Viele Grüße,
        Simon

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.