TFMX (The Final Musicsystem eXtended) ist ein kommerzielles Musikprogramm für den Commodore Amiga von Chris Hülsbeck und Peter Thierolf. Chris Hülsbeck entwickelte das Konzept, die Musikroutine und die Grafik, während Peter Thierolf den Editor programmierte. TFMX wurde 1988/89 von der Firma Demonware veröffentlicht. Eine Neuveröffentlichung erfolgte im Jahre 1994 durch die Firma Magnamedia auf der Amiga Power Disc Nr. 21.

TFMX

Der TFMX-Editor Bearbeiten

Grundlegendes Bearbeiten

 
TFMX-Editor

Der TFMX-Editor zählt zu den Trackern. Abweichend von den damals üblichen Trackern verwendet der TFMX-Editor dabei kein reines Liniensystem, sondern basiert auf Tracks, Patterns und Macros. Die Eingabe der Werte erfolgt hierbei stets im Hexadezimalsystem.

Zur Bearbeitung eines Songs stellt der TFMX-Editor die Track-Page (auch als Track-Step bezeichnet), die Pattern-Page und die Macro-Page zur Verfügung.

Die Track-Page Bearbeiten

 
Track-Page

Die Track-Page bietet acht voneinander unabhängige Spuren (Tracks). In jeder Spur können zwei Werte (jeweils ein Byte) eingetragen werden: zum einen die Nummer des zu spielenden Patterns und zum anderen die Höhe der Transponierung des zu spielenden Patterns. Die acht Spuren werden in Schritten (Steps) gleichzeitig abgespielt. Pro Schritt besitzt der Track-Step also eine Datenmenge von acht Wörtern (8× 2 Bytes). Die Anzahl der Schritte ist auf 512 begrenzt.

Gültige Patternnummern für die Track-Page sind $00 bis $7F. Das entspricht einer maximalen Anzahl von 128 Patterns. Darüber hinaus existieren spezielle Pattern-Kommandos, die sich auf einen einzelnen Track, und Track-Step-Kommandos, die sich auf den gesamten Song auswirken.

Pattern-Kommandos:

  • $80 – Weiterspielen des vorherigen Patterns
  • $FE – Löschen des im Transposewert angegebenen Tonkanals
  • $FF – Leeres Pattern

Track-Step-Kommandos:

Befehl Parameter Kommando Funktion
EFFE 0000 keine STOP Der Song wird gestoppt.
EFFE 0001 yyyy LOOP Der Song loopt zu Track-Step-Zeile yyyy.
EFFE 0002 yyyy SPEED Die Songgeschwindigkeit wird auf yyyy geändert.
EFFE 0003 yyyy TIMESHARE* Verringerung der Rechenzeit des Players ein- (yyyy = 0001) bzw. ausschalten (yyyy = 0000).
* Dieses Kommando funktioniert nur mit TFMX Musikroutinen ohne Unterstützung des 7-stimmigen Modus.
EFFE 0003 00yy 00zz 7-VOICE** Wiedergaberate des Songs in yy kHz, Feineinstellung der Songgeschwindigkeit um zz.
** Dieses Kommando funktioniert nur mit TFMX Musikroutinen, die den 7-stimmigen Modus unterstützen.
EFFE 0004 00yy 00zz FADE Die Lautstärke des Songs wird auf zz mit einer Geschwindigkeit von yy gefadet.

Beispiel: Fade-In eines Songs mit der Geschwindigkeit $28 auf die Lautstärke $3F:

Track 1 Track 2 Track 3 Track 4 Track 5 Track 6 Track 7 Track 8
STEP PT TR PT TR PT TR PT TR PT TR PT TR PT TR PT TR
0000 EF FE 00 04 00 28 00 3F FF 00 FF 00 FF 00 FF 00

Die Pattern-Page Bearbeiten

 
Pattern-Page

Die Pattern bilden die Grundbausteine des TFMX-Songs. In der Track-Page zusammengefügt, ergeben sie den Gesamtsong. In der Pattern-Page werden die Noten und die jeweils dazugehörigen Macros sowie die Lautstärke und der Tonkanal eingegeben. Weiterhin gibt es eine Vielzahl an Patternbefehlen, die ebenfalls in den Pattern verwendet werden können. Die Anzahl der Pattern ist auf 128 begrenzt. Die Länge eines einzelnen Pattern ist variabel und gliedert sich, ebenso wie die Track-Page, in Schritte. Ein Schritt eines Pattern enthält entweder eine Note oder einen Patternbefehl und besitzt jeweils die Größe eines Langwortes. Jedes Pattern wird immer mit dem Patternbefehl $F0 END abgeschlossen. Das Ende eines einzelnen Pattern lässt sich daher in der Datenstruktur des TFMX-Songs am Langwort $F0000000 erkennen.

Schematischer Aufbau eines Pattern:

STEP NOTE STATUS MACRONR. NAME VOLUME CHANNEL DETUNE
0000 18 F#2 00 F 1 00
0001 F3 WAIT 0F Count 00-FF 0 0 00
0002 F0 END 00 Next track step 0 0 00

Dieses Pattern spielt die Note F#2 mittels des Macros Nummer $00 in maximaler Lautstärke ab und wartet einen Zeitraum von $0F Schritten, bis das Pattern beendet wird. Im TFMX-Song liegt dieses Pattern in Form von drei Langworten vor (je ein Langwort pro Schritt): 1800F100 F30F0000 F0000000

Notenwerte können in drei unterschiedlichen Varianten eingegeben werden:

  • Bei Notenwerten kleiner als $80 wird mit Abarbeitung der Note automatisch der nächste Schritt ausgeführt. Ein Patternbefehl wie z. B. $F3 WAIT ist hier also erforderlich, damit die Note hörbar wird und die TFMX-Musikroutine nicht gleich die nächste Note abspielt.
  • Notenwerte ab $80, die kleiner als $C0 sind, beinhalten einen solchen WAIT Befehl. Die Anzahl der Warteschritte wird dafür im letzten, ursprünglich für DETUNE vorgesehenen Byte eingegeben.
  • Notenwerte ab $C0, die kleiner als $F0 sind, beinhalten einen PORTAMENTO Befehl. Die Tonhöhe wird auf den hier eingegebenen Notenwert hingezogen, vorausgesetzt, dass zuvor eine Note anderer Tonhöhe auf dem gleichen Tonkanal abgespielt wurde. Hierbei wird in dem für die MACRONUMMER vorgesehenen Byte der Wert für den Portamentozähler (standardmäßig auf $01 eingestellt) und in dem für DETUNE vorgesehenen Byte die Portamentogeschwindigkeit eingestellt. Die Kombination beider Werte ergibt die Geschwindigkeit des Portamentoeffekts.
  • Werte ab $F0 stellen reine Patternbefehle dar.

Patternbefehle:

NOTE STATUS MACRONR. NAME VOLUME CHANNEL DETUNE Parameter
F0 END -- Next track step - - -- keine
F1 LOOP aa count / step.w b b bb Programmierung einer Schleife
aa = Anzahl der Schleifendurchläufe (00 entspricht unendlich)
bbbb = Schritt, zu dem geloopt wird
F2 CONT aa patternno./step.w b b bb Fortsetzen in einem anderen Pattern (JMP)
aa = Patternnummer, an der fortgesetzt wird
bbbb = Schritt im Zielpattern, an dem fortgesetzt wird
F3 WAIT aa count 00-ff - - -- aa = Anzahl der Warteschritte
F4 STOP -- Stop this pattern - - -- keine
F5 KUP^ -- Set key up / channel - a -- Sendet den Befehl KEYUP an das Macro auf dem Tonkanal a
F6 VIBR aa speed / rate.b - b cc Vibrato
aa = Geschwindigkeit des Vibrato
b = Tonkanal
cc = Stärke des Vibrato
F7 ENVE aa speed / endvolume.b - b cc Envelope
aa = Geschwindigkeit der Lautstärkeveränderung
b = Tonkanal
cc = Ziellautstärke
F8 GSPT aa patternno./ step.w b b bb Verzweigen in ein Subpattern (JSR)
aa = Patternnummer, zu dem verzweigt wird
bbbb = Schritt im Zielpattern, an dem fortgesetzt wird
F9 ROPT -- Return old pattern - - -- Return to old pattern (RTS)
FA FADE aa speed / endvolume.b - - bb Fade-in/Fade-out der Gesamtlautstärke
aa = Geschwindigkeit der Lautstärkeveränderung
bb = Ziellautstärke
FB PPAT aa patt./track+transp - b cc Play Pattern
Spielt das Pattern aa im Track b mit einer Transponierung von cc ab
FC FXPR aa prio / channel+len.b - b cc (Funktion ist nicht dokumentiert)
FD FLAG aa flagnr. 0-3 / value.w b b bb (Funktion ist nicht dokumentiert)
FE STOP -- Stop custompattern - - -- Endmarkierung eines Custompatterns (für eigene Programmierung der Musikroutine)
FF NOP! -- no operation - - -- Keine Funktion (dient als Füllnote für einige Funktionen des TFMX-Editors)

Die Macro-Page Bearbeiten

 
Macro-Page

Bevor Samplematerial im Musikstück verwendet werden kann, muss zunächst ein Macro erstellt werden. Dazu bietet der TFMX-Editor die Möglichkeit, ein Standardmacro zu erstellen, das notwendigste Daten zur Wiedergabe des Samplematerials enthält (z. B. Beginn- und Länge des Samples). Abgesehen davon stellt der TFMX-Editor eine Vielzahl an Macrobefehlen zur Verfügung, die zur Entwicklung komplexer Macros verwendet werden können. Die Anzahl der Macros ist auf 128 begrenzt.

Das TFMX-Fileformat Bearbeiten

Der TFMX-Editor speichert einen TFMX-Song in drei Dateien gesplittet ab. Gespeichert werden:

  1. Präfix info. – Infodatei, welche die Namen der Pattern, Macros und Samples enthält
  2. Präfix mdat. – Musikdatei, welche sämtliche Daten des Musikstückes exklusive der Sampledaten enthält
  3. Präfix smpl. – Sampledatei, welche die reinen Sampledaten enthält

Um einen TFMX-Song abzuspielen, genügen die Musik- und Sampledateien. Die Infodatei wird lediglich zur Weiterbearbeitung des TFMX-Songs im TFMX-Editor benötigt.

Bekannte TFMX-Musiker Bearbeiten

Weblinks Bearbeiten