  /******************************************************************/
 /*     How to insert Tempo-Messages into Standard MIDI Files?     */
/******************************************************************/
1993, 1994 by Bogi-Productions



ACHTUNG: Datei enthlt nichtdruckbare Zeichen!!!


Leider knnen nicht alle Sequencerprogramme SMF's mit Tempoangaben
speichern. Oder diese werden wie bei Cubase (Version <= 2.x) in einen
speziellen Tempo-Track geschrieben, womit es dann nicht mglich ist,
SMF's im Format 0 mit Tempoangaben zu speichern, weil die Tempodaten
und die Mididaten in getrennten Tracks zu finden sind (also Format 1).
Um aber im Format 0 dennoch Tempoangaben nutzen zu knnen kann man
diese nachtrglich einfgen. (Konsequenterweise erkennt Cubase (<= 2.x)
in solchen modifizierten SMF's die Tempoangaben nicht. Oder ist es eine
Forderung, die MIDI-Daten und die Tempoangeben getrennt zu speichern,
von der ich nur noch nichts erfahren habe? Kann ja sein, da ich nicht
gerade die aktuelleste Literatur zur Verfgung hatte, oder auch nur 
den wichtigen Abschnitt, der darber Aufschlu htte geben knnen,
berlesen habe. Vieleicht kann mir darauf jemand eine Antwort geben.)

Cubase >= 3.x behandelt die Tempoangaben brigens fast genau so, wie
ich es eigentlich erwarte, d.h. auch in SMF's mit Format 0 werden die
Tempoangaben gespeichert - beim Laden werden die richtig Tempoangaben
erkannt. Fr Anwender dieses Programms ist dann das weitere Lesen die-
ses Textes unntig! 
[Leider erwartet Cubase beim Einladen von SMF's (Format 0) die drei
 META-Events 03 - 'Sequence/Track Name', 03 - 88 - 'Time Signature' 
 und 81 - 'Set Tempo' im einzuladenen Track. Fehlt eines dieser Events
 werden wohl auch die anderen evtl. vorhandenen META-Events nicht be-
 achtet. Da meine bisherigen SMF's, die ich auf die im folgenden Text
 beschriebene Weise modifiziert habe, diese zustzlichen META-Events
 (auer den Tempoangaben) nicht vorsahen, werden bei diesen SMF's die
 angegebenen Tempoangaben von Cubase verschluckt.
 (Ob sich dies wirklich so wie eben beschrieben verhlt ist nur eine 
 Annahme meinerseits, da ich bisher keine Zeit hatte, alle erdenklichen
 Flle auszuprobieren. Fr die von mir getesteten Flle kann ich dies
 zumindest besttigen.)
 Fazit: Die eingefgten Tempoangaben finden, wenn sie auf die im fol-
 genden beschreibenen Weise eingefgt werden, wohl nur fr mein Pro-
 gramm Verwendung. Sollen die modifizierten SMF's auch fr Sequencer-
 programme wie Cubase eingesetzt werden, wobei die Tempoangaben ge-
 nutzt werden sollen, so sind auch die entsprechenden unbedingt not-
 wendigen META-Events (hier 03, 88 und 81) einzufgen.]


Nun aber zurck zum eigentlichen Thema, dem Einfgen der Tempodaten:
Mit dem Pure C Editor knnen diese leicht eingefgt werden, da dieser
alle Dateien als HEX-Codes anzeigen, verndern und wieder speichern kann.
Dazu ldt man das gewnschte SMF ein. Das Ergebnis dieses Ladevorgangs
ist ein Textfenster mit etwas unbersichtlichen Inhalt, z.B.:

MThd       MTrk  U 04 7* <4 ...
(hier folgen weitere Datenbytes bis zum End-Of-Track Zeichen / )

Fr eine Erluterung der gesammten Daten verweise ich auf [1] und [2].
Hier ist nur wichtig, da das Tempo, das fr das gesammte Stck gelten
soll, vor den ersten Note-On-Befehlen stehen soll, d.h. kurz nach
Track-Length.

z.B.
				  vvvv Hier ist Track-Len!
MThd       MTrk  \ Q 04 7* <4 ...
					  ^^^^^^^ Hier ist das Set-Tempo Meta-Event eingefgt!

Die eingefgten Bytes sind folgendermaen aufgebaut:

-   (0x00) - keine Zeitverzgerung, nachfolgenden Befehl sofort ausfhren.
-  (0xFF) - Leitet Meta-Events ein.
- Q (0x51) - Meta-Event >Set Tempo<.
-  (0x03) - Lnge der nachfolgenden Daten.
- xxx (0xxx, 0xxx, 0xxx) - 3 Datenbytes

Diese 3 Datenbytes geben die Anzahl der Mikrosekunden pro Viertelnote an
Berechnung: 60 / Tempo * 1.000.000, das Tempo ist hierbei pro Viertelnote,
wie meist angegeben, einzusetzen.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! WICHTIG: Zustzlich ist, wenn Daten manuell eingefgt werden, noch die !
!  Track-Lnge um die Anzahl der eingefgten Bytes zu erhhen, da sonst  !
!evtl. Schwierigkeiten mit diversen Sequencerprogrammen auftreten knnen !
!!Also, wenn Set-Tempo eingefgt wird, mu Track-Len um 7 erhht werden!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Beispiele fr Tempoangaben:
===========================
Tempo =  78:	 Q		(0x00, 0xFF, 0x51, 0x03, 0x0B, 0xBC, 0xCE)
													 (769230 mikro-sek)
Tempo = 120:	 Q 		(0x00, 0xFF, 0x51, 0x03, 0x07, 0xA1, 0x20)
													 (500000 mikro-sek)
Tempo = 140:	 Q		(0x00, 0xFF, 0x51, 0x03, 0x06, 0x8A, 0x1B)
													 (428571 mikro-sek)


Hilfshinweis:
=============
Die oben geschilderten Einfgungen knnen direkt im Pure C Editor erfolgen,
wenn man auf die im Hilfssystem integrierte ASCII-Tabelle zurckgreift,
da nicht alle HEX-Zeichen ber Tasten zur Verfgung stehen.

Eine vieleicht einfachere Mglichkeit ist es aber, ein Dateimonitor-
programm zu Hilfe zu nehmen. Dabei knnte zunchst mit dem Pure C Editor
n-beliebige, auf der Tastatur erreichbare Zeichen eingefgt werden, wobei
n die Anzahlder einzufgenden Bytes darstellt (z.B. ########).
Im Dateimonitorprogramm kann man dann diese eingefgten Bytes suchen und
leicht verndern.



LITERATUR:
==========
[1] Siegfried Just: MIDITALK - Standard MIDI-Files
	ST-Computer 12/90, S. 144ff

[2] Michael Cxelperger: Introducing Standard MIDI File,
	Electronic Musican, April 1989, S. 50ff

[3] Kai Schwirzke: MIDI macht die Musik - Standard MIDI-File-Format
	c't magazin fr computer technik 07/93, S.232ff



--------------------------------------------------------------------

      \ | /     Peter Bogner, Humbserstr. 10, D-90763 Frth
      (o o)     email: prbogner@cip.informatik.uni-erlangen.de
--oOO--(_)--OOo-------------------------------------------------

'You can't trust code that you did not totally create yourself.
(Especially code from companies that employ people like me.)'

--------------------------------------------------------------------
/// das war's, jetzt kommt nichts mehr ///
