# TFMX

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.

## Der TFMX-Editor
### Grundlegendes

Der TFMX-Editor ist ein auf Videospiel-Musik ausgerichteter Musiksequenzer, der sich konzeptuell stark an MIDI-Sequencern orientiert. Während die Tonerzeugung mit den Mitteln des Amiga-Soundchips erfolgt, so ist die Eingabe von Noteninformationen ausgerichtet auf das Einspielen mittels eines MIDI-Keyboards. Im Gegensatz zu den sonst auf dem Amiga vorherrschenden Trackern, werden Noten nicht in ein festes zeitliches Schema gepresst, sondern es werden einzelne Events festgehalten und über einen Event-Editor bearbeitbar gemacht. Zusätzlich bietet der TFMX einen vereinfachten, trackerähnlichen Bearbeitungsmodus, der dem Soundmonitor nachempfunden ist. Dieser kann auch als Startpunkt verwendet werden, da die dortigen Noteninformationen hin zum event-orientierten Format (das die vollen Möglichkeiten von TFMX ausnutzen kann) gewandelt werden können, nicht aber zurück.

### Die 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

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

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

Der TFMX-Editor speichert einen TFMX-Song in drei Dateien gesplittet ab. Gespeichert werden:
* Präfix info. – Infodatei, welche die Namen der Pattern, Macros und Samples enthält
* Präfix mdat. – Musikdatei, welche sämtliche Daten des Musikstückes exklusive der Sampledaten enthält
* 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

* Chris Hülsbeck (z. B. Apidya, Jim Power, Turrican-Trilogie)
* Rudolf Stember (z. B. Das Schwarze Auge: Die Nordland-Trilogie, Mad TV, Mr. Nutz)
* Peter Thierolf (z. B. Fatal Heritage, Ooops Up, The Power)
* Dirk Magerkord (z. B. Brainball, PP Hammer)
* Jonathan Pickard (z. B. PreFlightCheck, Rush of Discovery)
* Jan Krolzig (z. B. Cheeky Twins)
* Markus Schneider (z. B. Gordian Tomb, Tusker)