4 KB Tunes

von TOMAES

Hin und wieder gibt es sie noch: Die Compos, bei denen es auf jedes Byte ankommt. Doch es muss sich dabei nicht zwangsläufig um 4kb Intros handeln. Auch andere größenorientierte Wettbewerbe kommen wieder in Mode. 4KB Flash-, 4KB HTML- und eben auch 4 KB-MOD Compos bringen den Beweis, dass es auch im Zeitalter der 50GB Festplatte immer noch ein großes Interesse an solchen Spektakeln gibt. Es scheint sogar unverzichtbar, in einer PC-Welt ohne echte Speicher- und Ressourcenlimits solche Compos zu starten und zu beweisen, dass man auch in 4096 Bytes noch Erstaunliches vollbringen kann, auch wenn 4k-Compos speziell auf großen Demopartys eher auf dem Rückzug sind.

Nicht mehr als 4096 Kalorien bitte...


Wenn man also einen 4k Tune basteln möchte, ist es zunächst nicht unwichtig, einige Vorüberlegungen anzustellen. Einfach drauflos tracken und hinterher das 2MB-Meisterwerk auf 4k "runterzubrechen" ist keine besonders gute Idee.

Das Fileformat

...wirft schonmal einige Fragen auf. MOD, XM, IT, oder was Exotisches (OKT, AMS, FNK)?. Der Vorteil bei klassischen MODs ist der, dass man erst gar nicht auf die verwegene Idee kommt 16bit Samples zu benutzen. ;-) Auch wird jeglicher unnützer(?) Kram über Bord geworfen. Envelopes, NNAs, Filter, Instrumente... kostet ja schließlich alles Speicher, auch wenn man von den Möglichkeiten "moderner" Trackingformate nur wenig Gebrauch macht.

IT wiederrum kommt mit einigen extrem nützlichen Commands daher, die unter Umständen viel Speicher sparen. Der Mxx-Command erspart uns z.B. bei einfachen Echos/Hall jedesmal für jede Note einen Volume-Command setzen zu müssen. Man legt einfach für die jeweilgen Channels eine nach unten abgestufte Channel-Volume fest, und fertig ist der Salat. Interne Samplekompression wäre ein weiteres Thema, sollte man der Fairness halber aber außen vor lassen (und nützt in diesen Dimensionen auch nicht sooo viel).

XM liegt bei den genannten Standard-Formaten in der Mitte. Zwar gibt es kein Random Panning, dass uns eventuell unnötig viele Panning-Commands, bzw. eine Panning-Envelope erspart (wie bei IT), aber immerhin variable Patternlängen sowie einiges mehr, was bei einer Orientierung auf möglichst geringen Speicherbedarf wichtig sein könnte.

Ein weiteres Argument, das für IT sprechen könnte, ist, dass man hier Channels einzeln hinzufügen kann und nicht immer alles im 2er-Pack nehmen muss. Während bei IT also auch 5 oder 7-Channel Werke herauskommen können, muss man bei XM u.U. einen (eigentlich unnötigen) weiteren Channel in Kauf nehmen, der auch nur Speicher frisst. Mit dem Modplug Tracker kann man dies freilich auch umgehen. Andererseits ist es mit dem MPT aber nicht möglich, Tracks mit weniger als 4 Channels zu speichern, dabei ist ein 2ch-XM, sowie ein 1(!)-ch IT mit der jeweiligen Orginalsoftware möglich.

Halten wir fest: IT ist die beste Wahl, XM geht auch zur Not, MOD nur wenn man ganz sicher ist, dass man den ganzen "neumodischen" Kram nicht braucht. Alles andere ist i.d.R. sowieso nicht zugelassen. ;-)

Samples

Nun wird's etwas komplizierter. Es geht an die Auswahl bzw. Eigenkreation der Grundbausteine unseres Tracks. Schwierig auch die Frage, wieviel man überhaupt ins Boot nehmen kann. Mehr als 1K sollte es nicht sein, damit für alles andere noch genügend Speicher zur Verfügung steht. Man wird sich nun auch entscheiden müssen, welche Art Track man eigentlich machen will. Dass es sich dabei grundsätzlich bzw. tendentiell um einen Chiptune handelt, dürfte eigentlich klar sein. Aber was für ein Chiptune genau? Mit Drums, oder ohne? Eher "dünner" Sound, oder doch etwas "brummiger"? Überhaupt ist es die Frage ob man in weniger als 1k vernünftige Drums hingekommt. Wenn man sich dafür entscheidet, braucht man natürlich nicht nur einen Sound, sondern mindestens Drei (Bassdrum, HiHat, Snare...).

Idealerweise hat man für alles ein einziges Sample. Eine (natürlich geloopte) Sinuskurve, die nicht weniger als 100 Byte benötigt, ist noch idealer. Dies ist nun die Quelle aller weiteren Sounds in unserem Track. Egal ob Basslines (Oktave 2 und 3), mittleres Ryhtmusgedudel (4 und 5), oder hohe, führende Melodiestimmen (6 und aufwerts) sind kein Problem. Auch Drums kann man (mit Abstrichen) ganz gut hinbekommen.

Drums ohne Drum-Samples


Aber wie soll das gehen? Wer schonmal mit einem Adlib-Tracker gearbeitet hat, der kennt das Problem und hat bestimmt auch schon damals eine einfache Methode entwickelt, um zumindet brauchbare Bassdrums hinzubekommen.
c-0 27f
... 27f
... c00
Mit dieser einfachen, wie effektiven Methode bekommt man mit fast jedem Sample (und sei es nur ein Sinus) eine Bassdrum zustande, die diesen Namen auch halbwegs verdient. Das Sample wird auf einer extrem niedrigen Oktave gespielt und mit einem wuchtigen potamento down in die Knie gezwungen um kurz darauf durch ein auf Null gesetztes Channel-Volume gänzlich zum Schweigen gebracht zu werden.

Wenn man nun etwas mit den Werten experimetriert, oder es einmal mit potamento up versucht, bekommt man auch eine Snare bzw. HiHat hin.

Mit etwas zusätzlicher Distortion Marke E5x und etwas Panning - Gewitter geht's eventuell noch etwas besser:
c-0 27f  c-0 e55
..  27f  c-0 27f
..  c00  ... c00
Durch eine entsprechende Gestaltung von Volume-Envelopes kann man auch noch den c00 einsparen. Sofern man dies durchgehend macht lohnt es sich, auch eine zusätzlich Kopie des Samples mit entsprechend verschobenem Tune-Regler anzulegen und zu verwenden.

Tipps zur Optimierung

Nun noch ein paar Takte zum Thema: "Wie bekomme ich die verdammten 10 Bytes noch weg". Den größten potentiellen Einsparposten stellen die Patterndaten dar. Natürlich mal vorrausgesetzt, dass die Samples hinreichend optimiert sind. Alles 8bit, mono, alles sauber aufgeräumt (keine überflüssigen Daten nach dem Ende eines Loops) ect. Es scheint zwar verführerisch, die Bezeichnung für ein Instrument leer zu lassen (um weitere Bytes zu sparen) in der Praxis ist dies jedoch unsinnig, da zumindest die Instrumentbezeichnung immer mit konstanter Länge abgespeichert wird. Das selbe gilt auch für den Songtitel. Hier nichts einzutragen bedeutet leider nicht, zusätzlich Speicher sparen zu können.

Also ran an die Pattern. Hier muss man sich der Möglichkeiten der variablen Länge bedienen. Wenn also "unten", d.h. nach der letzten Note oder letztem Effekt nur noch Leerlauf ist: Weg damit. Hier hilft ein EEx aka. Pattern-Delay weiter.Auch sollte man schauen, ob man nicht alles in einem einzigen, langen Pattern reinbekommt. Das spart dann auch nochmal ein paar Bytes.

Ein wichtiger Punkt bei der Komprimierung von Pattern-Daten ist die Grundgeschwindigkeit des Tracks. Bei einem Speed/BPM von 6 bzw. 125 langt ein "normaler" Pattern-Table für ca. 7 Sekunden Musik. Bei 12 bzw. 125 sind es schon 15 Sekunden. Und schließlich ist...
e-4     |     e-4
...   [und]   g-3
g-3     |     d-4
...     |
d-4     |
..so ziemlich dasselbe. Duch EDx (Note-Delay) und E9x (retrigg note) kann man die durch die hohe Komprimierung der Pattern verloren gegangene Flexibilität bei Rhytmus und Tempo auffangen, hat aber dafür bis zu 50% an Pattern-Daten gespart.

Zusätzlich sollte man versuchen, alles in möglichst wenigen Cannels unterzubringen. Gerade bei Drums, die nicht unbedingt polyphon sein müssen, kann man einsparen. Wenn man nun noch auf herkömmliche Simulation von Hall- und Reverb Effekte weitgehend verzichtet (und statt dessen die Resonanzfilter des IT zu nutzen weiß), kann man auch hier viel einsparen.

Das mit großem Abstand wichtigste ist der E6x, also der Pattern - Loop. Erst durch ihn sind längere 4kb-Tunes möglich. Diese Loops zu verschachteln ist zumeist keine gute Idee, da sie dann nicht so funktionieren, wie man sich das wünschen würde.

Eine weitere verlockende Idee wäre es, einen "Pattern Ping-Pong Loop" zu konstruieren. Ein Teilstück wird also im wahrsten Sinne des Wortes rauf- und runtergespielt (wie die Animation verdeutlichen soll). Das man Pattern auch rückwärts spielen kann, ist bekannt. Leider geht beides zusammen, also erst rückwerts und dann wieder vorwärts bzw. umgekehrt, leider nicht.

Und schließlich noch eine weitere Möglichkeit, das ein oder andere Byte zu sparen: Ein üblicher "global fadeout" besteht aus eine Latte von H01s. Nun wollen wir aber sparen und loopen fröhlich vor uns hin:
... e60
... h01
....e6f
Das ist natülich noch lange nicht das letzte Wort. Es geht auch noch komprimierter:
... e60 ... h01
....e6f ... h01
Dies spart immerhin eine Patternzeile. Aber auch das ist noch längst nicht das Ende der Fahnenstange. Noch besser ist: (*Trommelwirbel*)
... h01 ... eef
Na wer sagst denn: Alles in einer Zeile. Der Pattern-Delay hält den Pattern nicht nur eine ganze Weile an, nein, während dessen wird auch unser Global-Fade zyklisch bearbeitet. Ich würde sagen, dies ist eine Global-Fadeout Schleife mit Knoff-Hoff. ;-)

Noch viel Spaß beim weiteren Experimentieren. Die nächste 4k-Compo kommt bestimmt.
(Tomaes)