Ich habe für diese 4k die Musik und die Assembler Optimierungen gemacht.
Zur Musik ein paar Worte: Ich nutze seit jahren schon einen synthesizer, welches selbst aus Mitgliedern der Demoszene entstanden ist. Es nennt sich
4klang. Der synthesizer besteht aus 2 Teilen: Zum einen hat es einen VSTi Plugin, womit man ganz bequem aus der DAW seiner wahl komponieren kann, und zum anderen hat es eine 4klang.asm Datei, die zusammen mit dem Projekt kompiliert wird. Im VSTi kann man über visuelle Programmierung 16 individuelle Instrumente erstellen. Jedes Instrument besteht aus maximal 64 Operatoren. Ein Operator kann entweder ein Signal erzeugen (z.B. Oszillatoren), verändern (z.B. Filter oder Effekte) oder kombinieren (addieren, multiplizieren, andere arithmetische Operatoren). Viele Operatoren arbeiten wahlweise mit 2 Signalen gleichzeitig, um Stereosignale zu unterstützen.
Nachdem die Instrumente erstellt und das Lied komponiert ist, kann man in der GUI vom VSTi den 'Record' aktivieren, wonach man dann den Song ein mal komplett abspielen muss. Nach dem stoppen vom 'Record' kann man nun die generierte 4klang.inc und 4klang.h abspeichern. Dies sind die Dateien, die die Informationen der Musik für die Intro enthalten.
In der 4klang.h stehen nützliche Informationen zur Musik drinnen, wie z.b. die BPM, anzahl an Samples, und die Deklaration der Methode, die die Musik generiert. Die intro muss quasi nur 4klang_render(myBuffer) aufrufen, der rest passiert von allein. Wir machen das in einem extra Thread, um nicht bis zum Ende der Generierung zu warten, die an sich recht lange braucht. Abspielen und Generieren geht gleichzeitig, vorausgesetzt dass die Generierung schneller als das Abspielen erfolgt, was meistens der Fall ist.
Um die 4klang.asm zu kompilieren, die unsere 4klang.inc includet, nutzen wir yasm. Dafür haben wir in Visual Studio für die 4klang.asm eine custom build tool Regel erzeugt, wo yasm einfach aufgerufen wird, und dadurch eine linkbare 4klang.obj erzeugt wird.
Da wir schon beim Thema assembler sind, will ich noch einiges über die Arbeit berichten, die hinter der Kulisse abgeht, und dafür sorgt, dass die Intro überhaupt 4k klein wird. Wir nutzen nicht den linker von Visual C++, sondern einen, auch aus der Demoszene entstandenen, komprimierenden linker. Compressing linker, es heißt
Crinkler. Das ersetzen des Linkers geschieht, in dem man einfach eine link.exe im Projektverzeichnis ablegt, und in den Projekteinstellungen das Projektverzeichnis selbst unter den 'Executable Directories' einträgt. Crinkler bietet viele Kommandozeilenargumenten um den Komprimierungsvorgang nach Belieben zu tweaken. Meistens reicht es aus, Crinkler zu verwenden. Doch wenn man immernoch eine Datei erzeugt kriegt, die trotz aller Mühe größer als 4k ist, muss man etwas mehr arbeit reinstecken. Crinkler hilft dem Entwickler, zu identifizieren, wie groß welche Bereiche des codes sind. Es erzeugt eine report.html seite, wo man den disassembly der intro einsehen kann, übersichtlich gegliedert und auf- und zuklappbar. Jeder opcode ist farblick gekennzeichnet, sodass man genau sehen kann, welcher code schlecht komprimiert und am Ende viel Platz belegt.
Man hat die Wahl, ob man den C++ code kompressorfreundlich umschreibt, oder gleich in Assembler übersetzt. Das habe ich gemacht. Es gibt viele Möglichkeiten, den Assembler code so umzuformen, sodass er zwar noch die selbe Bedeutung hat, dennoch durch seiner Anordnung komprimierfreundlicher ist.
Ihr könnt zum Vergleichen beide varianten sehen. Im Quelltext gibt es eine 'release' Version von der main.cpp, und eine 'compress' Version. Im Release ist der Leit-Code, in C++ geschrieben, und in 'compress' ist der Assembler Port. Dazu sei gesagt, dass der Assembler Port zum Glück nicht immer neu geschrieben wurde, den habe ich für frühere 4ks gemacht, und mit kleinen Veränderungen übernommen. Meiner Erfahrung nach, konnten wir alleine durch den Assembler port zwischen 100 und 150 Bytes sparen, was bei einer Gesamtgröße von 4096 bytes nicht unerheblich ist.
Mit diesem C++ und Assembler Grundgerüst, stand uns Jahr für Jahr die Tür offen, neue Intros zu gestalten, in dem man einfach neue Shader und neue Musik macht. Ich hoffe, euch gefallen weiterhin unsere Kunststücke!