Datum:
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:
8X YY ZZ X=Kanal YY=Note (siehe Noten) 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
99 2A 73 28 89 2A 00 81 18 99 2A 6D 28 89 2A 00 68 99 2A 62 1A 89 2A 00 16 99 2A 6D 24 89 2A 00 81 1C 99 2A 6D 1E 89 2A 00 72 99 2A 56 28 |
diese Note On Befehle:
89 2A 00 68 89 2A 00 16 89 2A 00 81 1C 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.
Datum:
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.
Datum:
>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_Di... Gruß Jonas
Datum:
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.
Datum:
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.
Beitrag #2649081 wurde von einem Moderator gelöscht.
Datum:
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
Datum:
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.
Datum:
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
Datum:
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
Datum:
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