www.mikrocontroller.net

Forum: PC-Programmierung Mididatei - Befehle erkennen


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Sam .. (sam1994)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
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.

Autor: Tassilo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Jonas Biensack (jibi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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_Di...

Gruß Jonas

Autor: Sam .. (sam1994)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Sam .. (sam1994)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Beitrag #2649081 wurde von einem Moderator gelöscht.
Autor: Simon Budig (nomis)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Sam .. (sam1994)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Jonas Biensack (jibi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Jonas Biensack (jibi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Simon Budig (nomis)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net