Orbit
Erfahrenes Mitglied
Hallo,
habe da so ein Problem aus 100 Quellen zusammenzupflücken wie die Zeiten im Midiformat angegeben werden.
Es gibt da verschiedene Begriffe von denen ich nicht weiß wie ich sie trennen soll:
ticks_per_quarter im MThd header (in den von meinem Programm erzeugten Dateien = 1024). Wenn ich das wörtlich nehme bekomme ich etwa nen viertel von meinem Tempo.
(Also wenn ich jedes Viertel mit 1024 ticks versehe).
Außerdem noch den Midiclock. Hier wird gesagt dass es pro Viertel 24 Midiclocks gibt. Wenn ich aber schon festgelegt habe dass ich 1024 ticks habe; wozu dann 24 clocks?
Die deltatimeevents verarbeite ich im Moment durch angabe der ticks. Also ich weiß ich habe 120 Viiertel pro minute, 1024 ticks pro Viertel (macht 120/60*1024 = 2048 ticks pro sekunde).
Wo ist denn da der Zusammenhang bezw. wo liegt mein Denkfehler (warum habe ich unter Angabe der Ticks ein falsches Tempo?)
Hoffe mir kann jemand helfen habe inzwischen an die 100 Seiten im Netz über dieses doofe Midiformat durchforstet und hab soweit auch die komplette Implementierung fertig muss nur noch das mit den Zeiten hinkriegen...
Grüße,
Orbit
EDIT: hier ein paar Zitate aus den Quellen:
Wozu einerseits ticks und wozu andererseits die midiclocks/midizyklen?
So und hier nochmal ein Ausschnitt einer Midifiole der mein Probnlem verständlich machen sollte:
8813 (hex) ist mein delay zwischen An-und Ausschalten einer Viertel.
Entspricht nach MIDI 2067.
Im header steht
0400(hex)
als beats pro Viertel. das sind nur 1024.
Da muss doch irgendwas kaputt sein? wieso spuielt jeder normale Midiplayer das dann richtig?
Also muss das ding dann ja 2 mal so langsam spielen^^ Den anderen Faktor zwei habe ich beraits gefunden und entfernt aber dieser liegt wohl an nix anderm als am Verständnisproblem..
Danke für eure Hilfe!
habe da so ein Problem aus 100 Quellen zusammenzupflücken wie die Zeiten im Midiformat angegeben werden.
Es gibt da verschiedene Begriffe von denen ich nicht weiß wie ich sie trennen soll:
ticks_per_quarter im MThd header (in den von meinem Programm erzeugten Dateien = 1024). Wenn ich das wörtlich nehme bekomme ich etwa nen viertel von meinem Tempo.
(Also wenn ich jedes Viertel mit 1024 ticks versehe).
Außerdem noch den Midiclock. Hier wird gesagt dass es pro Viertel 24 Midiclocks gibt. Wenn ich aber schon festgelegt habe dass ich 1024 ticks habe; wozu dann 24 clocks?
Die deltatimeevents verarbeite ich im Moment durch angabe der ticks. Also ich weiß ich habe 120 Viiertel pro minute, 1024 ticks pro Viertel (macht 120/60*1024 = 2048 ticks pro sekunde).
Wo ist denn da der Zusammenhang bezw. wo liegt mein Denkfehler (warum habe ich unter Angabe der Ticks ein falsches Tempo?)
Hoffe mir kann jemand helfen habe inzwischen an die 100 Seiten im Netz über dieses doofe Midiformat durchforstet und hab soweit auch die komplette Implementierung fertig muss nur noch das mit den Zeiten hinkriegen...
Grüße,
Orbit
EDIT: hier ein paar Zitate aus den Quellen:
Mhh ich vermute mit den "32 MIDI clocks per dotted-quarter " sind wohl 36 gemeint....FF 58 04 nn dd cc bb Time Signature
The time signature is expressed as four numbers. nn and dd represent the numerator and denominator of the time signature as it would be notated. The denominator is a negative power of two: 2 represents a quarter-note, 3 represents an eighth-note, etc. The cc parameter expresses the number of MIDI clocks in a metronome click. The bb parameter expresses the number of notated 32nd-notes in a MIDI quarter- note (24 MIDI Clocks). This was added because there are already multiple programs which allow the user to specify that what MIDI thinks of as a quarter-note (24 clocks) is to be notated as, or related to in terms of, something else.
Therefore, the complete event for 6/8 time, where the metronome clicks every three eighth-notes, but there are 24 clocks per quarter-note, 72 to the bar, would be (in hex):
FF 58 04 06 03 24 08
That is, 6/8 time (8 is 2 to the 3rd power, so this is 06 03), 32 MIDI clocks per dotted-quarter (24 hex!), and eight notated 32nd-notes per MIDI quarter note.
0001 0002 00C0 = Datenbytes des MThd Tracks
0001 = Midiformat 0
0000 = Eine Spur beinhaltet alle 16 Kanäle
0001 = Mehrere Spuren können alle 16 Kanäle beinhalten
0002 = Mehrere Spuren können unterschiedliche Kanäle beinhalten
0002 = Es folgen 2 MTrk Tracks
00C0 = Die Basisgeschwindigkeit einer Viertelnote = 192
FF58 0404 0218 0800 = Time Signature
FF58 04 = Message für Key Signature
04 02 = 4/4 Takt (zweites Byte: 01=2 02=4 03=8 usw.)
18 = 24 Midizyclen pro Metronomschlag
08 = Anzahl der 32stel Noten in einer Viertelnote
Wozu einerseits ticks und wozu andererseits die midiclocks/midizyklen?
So und hier nochmal ein Ausschnitt einer Midifiole der mein Probnlem verständlich machen sollte:
8813 (hex) ist mein delay zwischen An-und Ausschalten einer Viertel.
Entspricht nach MIDI 2067.
Im header steht
0400(hex)
als beats pro Viertel. das sind nur 1024.
Da muss doch irgendwas kaputt sein? wieso spuielt jeder normale Midiplayer das dann richtig?
Also muss das ding dann ja 2 mal so langsam spielen^^ Den anderen Faktor zwei habe ich beraits gefunden und entfernt aber dieser liegt wohl an nix anderm als am Verständnisproblem..
Danke für eure Hilfe!
Zuletzt bearbeitet: