Mididatei Tempo umrechnen

#2764502
Lesenswert?

Hallo

Das Tempo in einer Mididatei hängt meines Wissens nur von 
TimeDivision-Wert des Headers und von den SetTempo-Metaevents ab.

Mein Programm soll die Mididateien in ein anderes eigenes Format für 
meinen Synthesizer konvertieren. Der Synthesizer selbst zählt in 
Millisekunden.
Um das Tempo der Mididatei zu übernehmen werden die Deltaticks erst mit 
dem SetTempoEvent-Wert multipliziert und durch 1000 geteilt. Später 
werden die errechneten Absoluten Zeiten durch den TimeDivision-Wert 
geteilt:

Im Prinzip werden einfach die DeltaTimes mit folgendem Faktor 
multiplizert:
1
TempoWert / 1000 / TimeDivision

Das ganze kommt dem vom Computer abgespielten Tempo ziemlich nahe. Es 
liegt jedoch bei 4 getesteten Mididateien um Faktor ~ 0.5-1.3 daneben. 
Da es sowohl darunter als auch darüber liegt, vermute ich dass es noch 
einen dritten Faktor in der Mididatei geben muss, der das Tempo leicht 
verändern kann. Wenn ich mir die Seite 
http://www.sonicspot.com/guide/midifiles.html anschaue vermute ich fast, 
dass das Metaevent Time Signature was damit zu tun haben könnte. Gerade 
der Sinn des letzten Bytes (wie viele 32tel in eine 4tel passen) 
erschließt sich mir nicht.
#2765863
Lesenswert?

> Das Tempo in einer Mididatei hängt meines Wissens nur von
> TimeDivision-Wert des Headers und von den SetTempo-Metaevents ab.

Jein.
Es hängt nicht von der Timedivision ab.
Set Tempo:
1
0xFF 0x51 0x03 (24 bit number which represents microseconds per quarter note)
Settempo bezieht sich auf Zeit pro 1/4 Note unabhängig von der 
Timedivision.

> Der Synthesizer selbst zählt in Millisekunden.
Heisst das, dass ein Tick = 1ms entsprechen muss?
#2766238
Lesenswert?

Deine obige Rechnung dürfte schon richtig sein, je nachdem Du unter 
"tempowert" verstehst. Tempo kann man in "Schláge pro Minute" (bpm) 
ausdrücken oder "microseconds per quarternote" wie beim Meta-Event 0x51.

Angenommen dein Stück hat Tempo 120bpm und die Timediv=240.
Die Zeitdauer einer 1/4 Note ist dann

duration( 1/4note  ) = 60sec / 120 = 500 ms.
Die Zeitdauer eines Ticks (was du "Deltatime" nennst) ist dann:
Und mit diesem Faktor müssen die Original-Deltatimes multipliziert 
werden.

Vielleicht solltest Du beachten, dass Meta-Events Set-Tempo auch während 
des Stücks vorkommen können. Das könnte die obige Abweichung erklären.
#2766505
Lesenswert?

Jürgen G. schrieb:
> Vielleicht solltest Du beachten, dass Meta-Events Set-Tempo auch während
> des Stücks vorkommen können. Das könnte die obige Abweichung erklären.

Ja, das habe ich, allerdings für jeden Kanal getrennt. Mir ist gerade an 
der Ausgabe des Konverters etwas seltsames aufgefallen:
1
Tempo: 87
2
3/8, 24, 8
3
Tempo: 120
4
1/2, 24, 8
5
Tempo: 160
6
2/2, 24, 8
7
Tempo: 87
8
6/8, 24, 8
9
9/8, 24, 8
10
Tempo: 93
11
6/8, 24, 8
12
3/8, 24, 8
13
6/8, 24, 8
14
9/8, 24, 8
15
Tempo: 120
Das ist ein Teil des ersten Tracks.

btw: Dürfen bei einem Tempowechsel Noten gespielt werden? Das würde die 
Implementieren ein bisschen komplizierter machen.
In dieser Spur sind alle Tempowechsel drinnnen - ich schätze ich muss 
diese auf die anderen Übernehmen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren