#77 – retrololo goes GBA

Irgendwie haben mich die Floppy-Laufwerke gefesselt. Ich denke es liegt eher weniger an den kratzigen Musikstücken als vielmehr an der Tatsache, dass die Schrittmotoren es schaffen doch knapp drei Oktaven an Tönen abzubilden! 🙂

Wie dem auch sei, ich dachte mir es wäre cool, wenn man das erste retrololo-Album (game over level up) auch auf einer Videospielkonsole zum Laufen bekommen könnte. Ich habe viel recherchiert und leider fallen die meisten Konsolen (GB, GBC, SNES, N64) auf Grund offensichtlicher Limitationen (nur MIDI-ähnliche Musikformate können abgespielt werden) aus. Aber ich denke ich habe eine Möglichkeit gefunden. Wenn wir es schaffen die Quelldateien stark genug zu komprimieren, sollten wir mit dem „Game Boy Advance“ eine Chance haben! 😉

Fun Fact: Erinnert sich noch jemand? Auf dem N64 haben wir ja bereits in Artikel 39 schon mal etwas mit dem Abspielen von MP3-Dateien experimentiert, allerdings mit eher mäßigem Erfolg! 😀

Praktisch, dass für diesen Anwendungsfall bereits fleißige Entwickler einen Audioplayer namens „GSM Player GBA“ geschrieben haben, welcher WAVE-Dateien abspielen kann. Na das ist doch eigentlich genau das, was wir brauchen, oder? 🙂

Doch wie bekommen wir das zum Laufen? Den Sourcecode bekommen wir auf GitHub – so weit so gut!

Damit wir diesen jedoch kompilieren können benötigen wir die devkitARM-Toolchain. Diese ist Teil der devkitPro-Entwicklungsumgebung. Für Windows gibt es sogar einen automatischen Installer – sehr schön! 🙂

Der Installer macht vieles richtig, jedoch nicht alles. Damit devkitPro auch reibungslos funktioniert, müssen leider (wie häufig bei solchen Toolchains) Systemumgebungsvariablen (DEVKITARM und Path-Variable) angepasst werden – unschön!

Zum Starten der Toolchain müssen wir dann einfach die Windows-App „MSys2“ aufrufen. Diese stellt eine kleine für die GBA-Entwicklung vorkonfigurierte Unix-Shell (Bash) unter Windows zur Verfügung.

Anschließend können wir mit dem „make“-Befehl das Makefile ausführen, welches die Sourcen kompiliert, linkt und in eine GBA-Romdatei zusammenpackt.

Fun Fact: Die ganzen Compilerwarnungen sowie einige Stunden an Troubleshooting wegen falschen Pfaden und fehlenden Bibliotheken erspare ich euch jetzt einfach mal! 😉

Das „fertige“ GBA-Spiel können wir nun mit einem Emulator ausprobieren. Ich verwende hierfür „VisualBoyAdvance“:

Zumindest wird uns schon mal das mitgelieferte Sample in einer Dauerschleife abgespielt – ein erster Erfolg! 🙂

Doch wie schaffen wir es jetzt, dass der GBA das retrololo-Album abspielt? 😉

Damit das klappt, müssen wie die MP3-Dateien erst mal in das WAV-Format konvertieren. Hierfür verwende ich „fre:ac“, einen kostenlosen Audio Converter.

Was man sofort erkennen kann: Die WAV-Dateien sind im Vergleich zu qualitätsreduzierten Formaten (wie z.B. MP3) nicht komprimiert und somit auch viel größer:

Damit der Game Boy Advance die WAV-Dateien auch verstehen kann müssen sie in ein proprietäres GSM-Format (mit spezieller Samplerate 18157) konvertiert werden. Hierfür verwende ich ein kleines Commandline-Tool namens „SoX“:

Man kann sofort erkennen, dass die Dateien nun wesentlich komprimierter sind und definitiv an Qualität eingebüßt haben, aber hey – einen Tod muss man sterben. Mehr gibt die Hardware des GBA einfach nicht her…

In einem letzten Schritt müssen die Dateien noch zu einer einzigen (GBFS-)Datei zusammengestückelt werden. Hierfür kann das Tool „gbfs“, welches in der devkitARM-Installation enthalten ist, verwendet werden.

Mit einem „copy /b allnewgsm.gba+gsmsongs.gbfs gsm.gba“ wird dann abschließend die Musik mit der GBA-ROM verknüpft.

Fun Fact: Wer das alles automatisieren möchte, kann auch die Sounddateien vorbereiten (richtig benennen und via SoX konvertieren) und einfach das Make-File starten, das ergänzt das Rom nämlich auch automatisch um die GBFS-Datei! 🙂

Scheint zu funktionieren, zumindest wird die Musik abgespielt! 🙂

Fun Fact: Wenn ich das jetzt nachträglich so lese, klingt das alles so einfach. Leider gab es zahlreiche „Herausforderungen“. So mussten z.B. die MP3-Dateien in der Lautstärke (von 89dB auf 97dB) erhöht werden, da der GBA sie sonst zu leise abgespielt hat. Auch müssen die Dateinamen der konvertierten GSM-Dateien ein exaktes Format besitzen um korrekt weiterverarbeitet zu werden. Abschließend musste die ROM-Datei auf die nächste Bytegrenze aufgeblasen werden („Padding“), damit eine gültige ROM-Datei entsteht. Alles „Lerneffekte“, welche erst nach vielen fehlgeschlagenen Versuchen eintreten! 😀

So weit so gut. Eigentlich könnte man jetzt schon zufrieden sein, aber ich finde es nicht gut, dass auf dem Titelbildschirm „GSM Player for GBA“ und ein Copyright von 2004 angezeigt wird. Da müsste doch was von retrololo stehen! 😉

Auch die grünliche Farbe für Schrift und Hintergrund finde ich nicht optimal. Glücklicherweise lassen sich auch die beiden Werte recht einfach ändern. Hierfür müssen wir allerdings in den Sourcecode abtauchen:

Fix ein paar Werte angepasst und siehe da – ein erster Erfolg! 😉

Fun Fact: Anhand der Jahreszahl erkennt man, dass ich bereits letztes Jahr mit dem Projekt begonnen habe. Je älter man wird, desto schwieriger wird es mehrere Stunden Zeit am Stück für solche Basteleien aufzubringen! xD

Anschließend habe ich das Layout des Players verändert. So hat es mich gestört, dass der Titel abgeschnitten und der unnötige Dateiname (.gsm) pro Track angezeigt wird. Ich habe den Output so angepasst, dass beide Informationen (Game und Song) getrennt und sauber untereinander dargestellt werden. Das war ein Geschnipsel kann ich euch sagen! 🙂

Fun Fact: Ebenso musste ich die GSM-Files nochmal umbenennen und ein neues GBFS-Set erstellen, weil nur 24 Stellen des Dateinamens von der GSM-Routine übergeben werden! xD

Um den Player etwas einfacher zu bedienen, habe ich auch die Steuerung etwas überarbeitet. Mit den Pfeiltasten (Steuerkreuz) können Lieder vor- und zurückgeschaltet werden. Mit „Start“ kann die Wiedergabe angehalten werden und mit „Select“ können alle anderen Tasten gesperrt werden. Mit den Schultertasten („L“ und „R“) kann innerhalb eines Tracks vor- oder zurückgespult werden.

Als kleinen „Bonus“ habe ich abschließend noch die Farbwerte mit einem Zufallsgenerator ausgestattet. So ändert sich beim Drücken des „A-Knopfes“ die Hintergrundfarbe…

und beim Drücken des „B-Knopfes“ die Schriftfarbe zufällig! Unnötig, aber cool. 😀

Fun Fact: Lasst euch aber von der Grafik-Spielerei nicht täuschen. Komplexere Änderungen (z.B. mit echten Grafiken und bewegten Bildern) lassen sich leider nicht so einfach umsetzen. Möchte man z.B. ein ganzes GBA-Spiel programmieren, müsste man sich noch viel tiefer einarbeiten. Hierfür fehlt mir definitiv der Skill (und nicht zuletzt die Zeit, die man investieren müsste)!

Insgesamt bin ich mit dem Player, bzw. dem „GBA-retrololo-Album“ recht zufrieden. Jetzt wäre es nur noch cool, wenn wir diesen auch tatsächlich auf einem GBA-Modul hätten! 🙂

Um das zu bewerkstelligen benötigen wir ein spezielles Stück Hardware namens „Flash Linker“. Dieses Teil erlaubt es uns Flash-Chips auf speziellen Modulen („Flash Carts“) mit einer ROM-Datei zu beschreiben. Solche Geräte sind mittlerweile leider recht selten geworden, ich hatte Glück und habe mein Exemplar für einen schmalen Taler in einem Spieleforum gefunden. 😉

Fun Fact: Es ist sogar eine der letzten Versionen des Geräts, welche bereits mit einer USB-Schnittstelle ausgestattet ist – üblicherweise funktionieren Geräte aus dieser Zeit lediglich via Parallelport-Kommunikation. 😀

Natürlich kann man damit nicht einfach jedes GBA-Modul überschreiben, denn meistens wurden in diesen nicht wiederbeschreibbare PROM-Chips verwendet. Hierfür benötigt man eine Flash Cartridge. Leider sind auch diese nur sehr schwer zu bekommen und nicht jede Flash Cartridge ist mit jedem Linker kompatibel. Immerhin – bei meinem Flash Linker war bereits eine 64Mbit (8MB) Cartridge dabei, unsere ROM-Datei mit knapp 7MB sollte also genug Platz haben! 🙂

Na, ob wir das gute Stück zum Laufen bekommen? Immerhin war sogar eine CD mit Treibern und Software dabei, das spart uns die mühsame Suche im Netz auf längst vergessenen Seiten – dachte ich! 😀

Zuerst war ich naiv und habe versucht das Teil unter Windows 10 (64 Bit) zum Laufen zu bekommen. Leider lässt sich der (nicht signierte) Treiber nicht mehr installieren und auch das Setup der Writer-Software verweigert einen Start. Also habe ich versucht, die Software in einer (via VirtualBox konfigurierten) virtuellen Windows XP Maschine (Wir erinnern uns an Artikel 44) zu installieren. Immerhin war die Installation erfolgreich, trotzdem trat spätestens beim Schreibvorgang der Karte ein Problem auf und die Software ist abgestürzt. 😀

Da hilft nur eins: Echte Hardware! 😉 Wer Artikel 30 aufmerksam gelesen hat, weiß was jetzt kommt. Ich habe den guten alten „copmaq nx9005“ Laptop nochmal rausgekramt. Mit 32-Bit-Windows XP, USB 1.1, einem Disketten- sowie einem CD-Laufwerk ist dieser für die alte Software bestens ausgestattet!

Kaum macht man es richtig, funktioniert es auch! Mit der Software (XtremeLink) lässt sich die Flashkarte einwandfrei formatieren und beschreiben. 🙂

Fun Fact: Es waren mehrere Versuche notwendig, um die uralte, doch recht kryptisch gestaltete Software dazu zu bringen, das Modul zu beschreiben, aber mit den ganzen „Fehlschlägen“ will ich euch jetzt nicht langweilen… 😀

Damit die Sache rund wird, braucht unser Modul natürlich noch ein angepasstes Label…

… sowie eine Verpackung! Die jeweiligen Grafiken habe ich auf Basis des originalen Logos erstellt und mir ausdrucken lassen.

Fun Fact: So gesehen war das ein internationales Projekt. Das Flash-Modul kommt aus Spanien (eBay), der Modulaufkleber aus Amerika (eBay) und die Pappschachtel aus Kroatien (Etsy)! 😀

Bin damit echt zufrieden, sieht sehr cool aus wie ich finde! 🙂

Abschließend sollten wir natürlich noch testen, ob das Modul überhaupt funktioniert. Ouh yeah! 😉

In diesem Sinne – stay retro! 😉

2 Kommentare zu „#77 – retrololo goes GBA

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s