Forum: PC-Programmierung Mididatei Tempo umrechnen


von Sam .. (sam1994)


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.

von Jürgen W. (lovos)


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?

von Sam .. (sam1994)


Lesenswert?

Danke, dann habe ich SetTempo falsch verstanden. Wenn ich nun weiß wie 
lang eine Viertelnote ist - was sagt mir wie viele Deltatimes einer 
Viertelnote entsprechen?

Jürgen G. schrieb:
>> Der Synthesizer selbst zählt in Millisekunden.
> Heisst das, dass ein Tick = 1ms entsprechen muss?

Ja.

von Jürgen W. (lovos)


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.

von Sam .. (sam1994)


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?

von Sam .. (sam1994)


Lesenswert?

Dankeschön! Es funktioniert jetzt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.