Code eines Midi-files

Was spricht denn dagegen, den SW-Anbieter direkt zu fragen???

ICH kann mir zwar durchaus das ein oder andere aus seinem ausgegebenen Text zusammenreimen, aber ER müsste es doch genau wissen, oder???

MfG

Sage doch bitte direkt, wenn du nicht weiter weisst!
Mfg.

Oh liebe Martha,

da hätten wir uns allerdings einiges ersparen können. Es wäre schön, wenn Du diese Frage gleich gestellt hättest. Denn das ist nahezu unmöglich. Auf einer Schlagzeugspur liegen ja mehrere Instrumente parallel auf einer Zählzeit. Zunächst muss man wissen, welches Schlagzeuginstrument auf welcher Note liegt. Dafür gibt es eine Standard-Belegung, es besteht aber keine Verpflichtung, diese zu verwenden. Weiterhin kann Schlagzeug und Percussion auf mehrere Spuren aufgeteilt sein. Dazu kommt das Zeitraster, aus dem man anhand der Abstände zwischen den Events einen Charakter herauslesen müsste. Aber welches Event auf welcher Zählzeit ergibt welches klingende Instrument? Vielleicht spielt ein ganz leise gemischter Shaker eine Mambo-Figur über einen House-Groove?!?

Was würdest Du mit dem Ergebnis anstellen wollen, wenn es leicht möglich wäre?

Ciao,

hp.

Hallo Martha, hab mich leider noch nie befasst mit der Umwandlung von Midifiles in Text, kenn mich also nicht aus.

Hallo Martha,

ups, das wird aufwändiger…

MIDI Daten bestehen aus aneinander gereihter Ereignissen.
Ein Ereignis wird daher als Event bezeichnet.

Ein Event kann z.B. ein Programm-Change oder eine Note sein.

Ein MIDI-Instrument empfängt die gesendeten Daten nacheinander also sequenziell und kann auf bis zu 16 MIDI-Kanälen empfangen und dann abspielen.

Der Einfachheit halber schauen wir uns mal nur 2 Kanäle an:
Auf Kanal 1 soll ein Klavier spielen, auf Kanal 2 soll eine Gitarre spielen.

Damit der Synthesizer weiß, welcher Kanal welches Instrument spielen muss, wird für jeden Kanal als erstes ein Programm Change gesendet. In der Bedienungsanleitung des Instruments steht, welchen Wert der PrCh haben muss.

Auch wenn man denkt, dass die Noten gleichzeitig gesendet werden, geht das per MIDI nicht s.o.; also muss noch eine Zeitangabe angegeben werden, wann, was gesendet wird; das ist die Zahl am Anfang der Zeile meist in Millisekunden. In deinem MIDI-File stehen am Anfang auf der Position 0 (Zeit=0) mehrere Werte. Diese werden aber tatsächlich gaaaaanz kurz nacheinander gesendet. In meinem Beispiel setze ich die Daten mal nacheinander, dann ist das ganze ein wenig anschaulicher:

Das Klavier hat meist die Nr. 0, die Gitarre z.B. die Nr. 25

Dein MIDI-File beginnt dann so:
0 PrCh ch=1 p=0
10 PrCh ch2 p=25

Der Synthesizer kann aber noch mehr umsetzen z.B.:

  • wie laut der Kanal sein soll (Volumen)
  • das Panorama im Stereo-Bild (Pan)
  • … es gibt auch wieder 127 Controller, wobei einige als Doppel ausgelegt sind und so mehrere Tausend Parameter mit jeweils 127 verschiedenen Werten eingegeben werden können.

Dazu werden sogenannte Controller gesendet:
Volumen ist z.B. Controller Nr. 7,
das Panorama (mehr rechts oder links) ich glaube das ist Controller Nr. 11

In der MIDI-Datei ist das so dargestellt:
1 Par ch=1 c=7 v=113
-> das heißt dann:
an zeitl. Position 1 wird auf Kanal 1 (ch=1) der Controller 7 (c=7) mit dem Wert 113 (veloicity v=113) gesendet.
Solange jetzt kein anderer Wert für diesen Controller gesendet wird, bleibt die Lautstärke so.

Daher ist es wichtig entweder am Anfang jeder MIDI-Datei ein Reset zu senden, der den Synthi in einen definierten Zustand versetzt. Spielt man nämlich eine schlecht programmierte MIDI-Datei ab, kann es sein, dass der Synthi die alten Werte von der vorherigen Datei noch hat.

Ich hoffe, das war einigermaßen verständlich… ist halt ein wenig kompliziert.

Jetzt noch zu deinen Fragen:

zu 1)
0 ist hier die zeitl. Position

zu 2)
c ist der Name des Controllers, v der Wert, den der Controller hat. Werte gehen von 0-127
Bei Controller Nr. 7 (Volumen) heist dann v=0, dass man nichts mehr hört, Lautstärke also 0, v=127 wäre dann voll aufgedreht. Was nun Controller Nr. 6 ist, ist genormt und steht eigentl. in jedem Synthi-Handbuch.

zu 3)
aus deinem Beispiel (Daten in deiner Datei ganz unten)
16388 On ch=10 n=71 v=64
20479 Off ch=10 n=71 v=0

16388 ist die zeitl. Position (ich glaube in mS Millisekunden)
Das heißt dann:
An Position 20479 (20,479 Sekunden) schaltet auf Kanal Nr. 10 die Note Nr. 71 mit einer Anschlagstärke von 64 ein,
An Position 16388 (16,388 Sekunden) schaltet auf Kanal Nr. 10 die Note Nr. 71 mit einer Ausschlagstärke von 0 aus.

Die Anschlagstärke kann man sich bei einem Klavier vorstellen, wie schnell die Taste gedrückt wird, drückt man langsam v=10, ist das Klavier leise, drückt man schnell v=127 ist das Klavier laut.
Bei sehr guten Synthesizern wird dabei auch der Klang verändert ein leiser Ton klingt ja bei einem Klavier auch etwas anders als ein lauter (hier verändert sich halt das Klangbild, weil die Saiten im Klavier vom Hammer härter oder weicher getroffen werden.

Die Ausschlagstärke bezeichnet jetzt die Geschwindigkeit, die die Tast losgelassen wird; hat bei einem Klavier keine Bedeutung, der Syntheziser könnte aber bei bestimmten Klangfarben hier auch das Klangbild verändern - ist bei guten Synthis programmierbar.

Die Noten werden durchnummeriert - ich weiß leider nicht, wo genau begonnen wird, n=0 ist auf jeden Fall ein C, welches genau weiß ich im Moment nicht, ist aber sehr tief. Wenn n=0 ein C ist, ist n=12, n=24, n=36… auch ein C; n=71 müsste dann ein H sein.

Noten müssen ein- und ausgeschaltet werden, sonst hängt der Ton.

Einige MIDI-Programme nehmen für die Position nicht die zeitl. Position, sonder verwenden ein eigenes Raster. Wie lange dann ein Ton erklingt, hängt dann vom gespielten Tempo ab - evtl. ist das in deinem Beispiel auch so, da ganz am Anfang ein Tempo gelistet ist.

Abschließend noch ein Lektüren Tip:
Von Roland gibt es einen MIDI-Guide, dieser hat damals mal 10,00 DM gekostet, ist ca. 50 Seiten dick und ganz leicht verständlich. Hier ist alles super erklärt, zus. gibt´s viele Beispiele und auch Tabellen, wo z.B. die Controller Namen erklärt sind.

Falls noch Fragen sind, bitte einfach melden;
viel Erfolg beim Programmieren

Gruß
Hans-Jürgen

Hallo, Hans-Jürgen,
erstmal herzlichen Dank für die ausführliche Antwort! (hätte viel eher geantwortet, musste System neu installieren, danach jede menge Abstürze…)
Hab eine Frage zum Timestamp: Kann man diesen errechnen? Gibt es da eine Gesetzmässigkeit? Die Notenlänge beeinflusst es auf jeden Fall, somit ist klar, auch die Numer des Taktes. Logisch wäre mir, dass z.B. ganze Noten immer einen gleichen Abstand haben, halbe entsprechend die Hälfte usw. Habe aber anhand der Zahlen Unregelmässigkeiten festgestellt (durch Ermittlung der Differenzen zwischen den note on-Werten. Und: Kann jedes Instrument einen beliebigen Kanal belegen (1-16), oder ist dies festgelegt, wenn ja, wie? (Hab keine Liste im Internet gefunden).

Danke herzlich im Voraus,

mit freundlichen Grüßen,

Martha Beng

Ich fürchte, ich kann nicht helfen.
Ich sehe zwar, dass PrCh Programm change heißt, mit ch ist der Midikanal gemeint, n kann eigentlich nicht die Note sein, denn sie wird ja auch immer genau ausformuliert c#1 oder B-1, V wird die interne Lautstärke / Volume sein, vielleicht aber auch Velocity, die Anschlagsstärke, mit Par ist vielleicht ein Part gemeint, also ein Pattern, eine Kadenz (Schlagzeug / Percussion?)
Wie gesagt, ich kann nicht wetten und hoffe, dass dier bereits ein Midi Crack helfen konnte.

Gruß Martin

Liebe/-r Experte/-in,vielleicht aber auch velocity
vielen Dank für die kostenlose Online-Auskunft!
Habe FRagen zu Midi-files:

Man kann bei http://staff.dasdeck.de/valentin/midi/mid2txt.php

ein midifile in txt konvertieren und ersieht dabei den Code.
Habe mich damit befasst, einifes ist noch unklar:

  1. z.B. 0 PrCh ch=1 p=68: Was bedeutet die Null vor Prch und
    ie 68 nach dem p? Wie kommen die Zahlen zustande? Was heisst
    das ‚p‘?

  2. z.B. 4 Par ch=10 c=6 v=12: was bedeutet das ‚c‘?
    (Notenwerte werden doch mit ‚n‘ bezeichnet)

  3. z.B. 16388 On ch=10 n=71 v=64: wie kommt die Zahl am Anfang
    der Linie zustande? wie kann man die errechnen? Ist diese Zahl
    channel-oder instrumentenabhängig? Würde die Linie mit n=71
    mit einer anderen Zahl beginnen, wenn hier z.B. ‚ch=8‘ stünde?

Unten ein selbsterstelltes Beispiel.

Vielen herzlichen Dank im Voraus für die Antworten,
mit freundlichen Grüssen,

Martha Beng

File: vierertest.MID

MFile 1 5 1024
MTrk
0 TimeSig 4/4 24 8
0 KeySig 0 major
0 Tempo 500000
0 Tempo 500000
122881 Meta TrkEnd
TrkEnd
MTrk
0 Meta TrkName „Oboe“
0 PrCh ch=1 p=68
0 Par ch=1 c=7 v=113
1 Par ch=1 c=10 v=88
2 Par ch=1 c=91 v=76
2 Par ch=1 c=12 v=2
3 Par ch=1 c=100 v=0
3 Par ch=1 c=101 v=0
4 Par ch=1 c=6 v=12
5 Par ch=1 c=38 v=0
10 Par ch=1 c=7 v=73
10 On ch=1 n=71 v=76
114 Par ch=1 c=7 v=75
218 Par ch=1 c=7 v=78
322 Par ch=1 c=7 v=81
426 Par ch=1 c=7 v=83
500 Par ch=1 c=7 v=86
604 Par ch=1 c=7 v=89
708 Par ch=1 c=7 v=91
812 Par ch=1 c=7 v=94
916 Par ch=1 c=7 v=97
1020 Par ch=1 c=7 v=99
1124 Par ch=1 c=7 v=102
1228 Par ch=1 c=7 v=105
1332 Par ch=1 c=7 v=107
1436 Par ch=1 c=7 v=110
1540 Par ch=1 c=7 v=113
1549 Par ch=1 c=7 v=113
1653 Par ch=1 c=7 v=111
1757 Par ch=1 c=7 v=109
1861 Par ch=1 c=7 v=108
1965 Par ch=1 c=7 v=106
2069 Par ch=1 c=7 v=104
2173 Par ch=1 c=7 v=103
2277 Par ch=1 c=7 v=101
2381 Par ch=1 c=7 v=99
2485 Par ch=1 c=7 v=98
2589 Par ch=1 c=7 v=96
2693 Par ch=1 c=7 v=94
2797 Par ch=1 c=7 v=93
2901 Par ch=1 c=7 v=91
3005 Par ch=1 c=7 v=89
3109 Par ch=1 c=7 v=88
3213 Par ch=1 c=7 v=86
3317 Par ch=1 c=7 v=84
3421 Par ch=1 c=7 v=83
3525 Par ch=1 c=7 v=81
3629 Par ch=1 c=7 v=79
3733 Par ch=1 c=7 v=78
3837 Par ch=1 c=7 v=76
3941 Par ch=1 c=7 v=74
4014 Off ch=1 n=71 v=0
4045 Par ch=1 c=7 v=73
6113 Par ch=1 c=7 v=113
122881 Meta TrkEnd
TrkEnd
MTrk
0 Meta TrkName „Acoustic Guitar (steel)“
0 PrCh ch=2 p=25
0 Par ch=2 c=7 v=113
1 Par ch=2 c=10 v=72
2 Par ch=2 c=91 v=76
2 Par ch=2 c=12 v=2
3 Par ch=2 c=100 v=0
3 Par ch=2 c=101 v=0
4 Par ch=2 c=6 v=12
5 Par ch=2 c=38 v=0
4100 On ch=2 n=59 v=64
8191 Off ch=2 n=59 v=0
122881 Meta TrkEnd
TrkEnd
MTrk
0 Meta TrkName „Acoustic Grand Piano“
0 PrCh ch=3 p=0
0 Par ch=3 c=7 v=87
0 Par ch=3 c=7 v=87
1 Par ch=3 c=10 v=40
1 Par ch=3 c=10 v=40
2 Par ch=3 c=91 v=76
2 Par ch=3 c=12 v=2
2 Par ch=3 c=91 v=76
2 Par ch=3 c=12 v=2
3 Par ch=3 c=100 v=0
3 Par ch=3 c=101 v=0
3 Par ch=3 c=100 v=0
3 Par ch=3 c=101 v=0
4 Par ch=3 c=6 v=12
4 Par ch=3 c=6 v=12
5 Par ch=3 c=38 v=0
5 Par ch=3 c=38 v=0
8196 On ch=3 n=71 v=64
12287 Off ch=3 n=71 v=0
12292 On ch=3 n=50 v=64
16383 Off ch=3 n=50 v=0
122881 Meta TrkEnd
TrkEnd
MTrk
0 Meta TrkName „Standard Kit“
0 PrCh ch=10 p=0
0 Par ch=10 c=7 v=113
1 Par ch=10 c=10 v=56
2 Par ch=10 c=91 v=76
2 Par ch=10 c=12 v=2
3 Par ch=10 c=100 v=0
3 Par ch=10 c=101 v=0
4 Par ch=10 c=6 v=12
5 Par ch=10 c=38 v=0
16388 On ch=10 n=71 v=64
20479 Off ch=10 n=71 v=0
122881 Meta TrkEnd
TrkEnd