Das Soundmodul
Verglichen mit anderen Konsolen ist das Soundmodul des Gameboys spartanisch. Von den Fähigkeiten beispielsweise des SID-Chips im C64 ist es so weit entfernt wie ein Kochtopf von einem Schlagzeug. Es wurde abgespeckt vom NES übernommen und verfügt über vier Soundkanäle: Zwei erzeugen Rechteckwellen, einer Rauschen, der vierte gibt gesampelte Sounds wieder. Die Lautstärke der einzelnen Kanäle kann in 16 Schritten geregelt werden.
Aufgrund der geringen Auflösung und der Nutzung von Rechteckwellen würden die erzeugten Sounds normalerweise schrecklich klingen. Speziell Rechteckwellen sind eine Tortur für die Ohren. Um einen angenehmen Klang zu erreichen, wird das erzeugte Soundsignal hochpassgefiltert. Das geschieht analog - durch einen Kondensator. Das Ergebnis ist ein charakteristischer Sound, der durchaus seine Liebhaber hat. In der Chiptune-Szene erfreut sich der Gameboy großer Beliebtheit.
Mit den beiden Kanälen für Rechteckwellen wird der größte Teil der Musik erzeugt. Über jeweils einen eigenen Teiler erzeugen sie aus dem Systemtakt den Takt der Rechteckwellen - woraus sich die Frequenz des entstehenden Tons ergibt. Um die Charakteristik des Tons zu variieren, ist noch eine einfache Pulsweitenmodulation implementiert. Die Welle kann ein Achtel, ein Viertel, die Hälfte oder drei Viertel der Periodendauer auf hohem Spannungspegel sein. Für gesampelte Sounds kann die Wiedergabegeschwindigkeit eingestellt werden.
Soundeffekte
Die Soundkanäle bringen ein paar Features mit, die für prozessorunabhängige Soundeffekte genutzt werden können. Das erste Feature ist der Envelope, in diesem Fall kein Briefumschlag, sondern die Hüllkurve. Damit kann die Lautstärke des Signals in festen Zeitschritten erhöht oder gesenkt werden. Die zweite ist der Sweep (die korrekte Übersetzung ist wobbeln), der automatisch die Tonfrequenz ändert.
Die Soundkanäle können zudem kontinuierlich ein Signal erzeugen oder nach einer definierten Zeit die Ausgabe beenden. Nicht alle Soundkanäle verfügen über alle zuvor genannten Features, so dass jeder seine eigene Klasse benötigt. Auch unterscheidet sich die Realisierung des Sampling- und Rauschkanals von denen der Rechteckkanäle. Das Rauschen wird übrigens mittels eines linear rückgekoppelten Schieberegisters erzeugt. Es wird beispielsweise für Schlagzeugsounds genutzt.
Unerwartete Herausforderungen bei der Emulation
Die Beschreibung der Soundhardware klingt erst einmal nicht besonders herausfordernd - ein paar Register und den Speicher für die Samples implementieren, dazu ein wenig Programmlogik, die anhand der Werte ein Tonsignal erzeugt. Die Signale der einzelnen Kanäle werden lediglich addiert. Trotzdem gibt es zwei Dinge, die mich lange aufgehalten haben.
Zuerst der Kondensator. Wie in aller Welt baut man den in einem Programm nach? Im Physikunterricht habe ich zwar gelernt, wie man die zeitabhängige Spannung eines Kondensators berechnet. Allerdings nur für eine konstant anliegende Spannung. Zum Glück fand ich irgendwann im Internet eine Lösung, deren Herleitung ich zwar nicht verstand, sie aber umsetzte - und sie funktionierte. Der Kondensator bildet einen Hochpassfilter, dessen Verhalten das Programm nachbilden muss.
Das zweite Problem war weniger offensichtlich und hat mich Wochen beschäftigt. Die Soundausgabe klirrte unangenehm. Der Grund dafür ist die feste Abtastrate der Soundhardware des Computers. Die vom Gameboy erzeugten Signale passen nicht zu dieser Abtastrate, sie wechseln irgendwo zwischen zwei Abtastpunkten. Das bedeutet, dass über mehrere Wellenzyklen das erzeugte Signal nicht gleich ist.
Dadurch entstehen unerwünschte Signalkomponenten. Die Lösung für dieses Problem heißt Abtastratenkonvertierung. Ich habe das, als ich den Emulator programmiert habe, etwas hemdsärmelig mit Oversampling gelöst. Wechselt die Ausgabe des Gameboys zwischen zwei Samples, werden diese zwischen 0 und aktueller Lautstärke des Kanals interpoliert.
Um den Aufwand zu reduzieren, habe ich das allerdings nur für eine Schwingung der Welle gemacht und diese immer wieder ausgegeben. Das funktioniert - und klingt - ganz gut, ist allerdings nicht ganz richtig. Und manchmal fällt es auf, hier sollten also professionellere Ansätze zum Einsatz kommen. Jetzt ist zwar die Hardware komplett, aber etwas fehlt noch: die Spiele.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
- ohne Werbung
- mit ausgeschaltetem Javascript
- mit RSS-Volltext-Feed
Die Grafikeinheit | Die Spielemodule |
+1 Bin schon auf den Folgeartikel zur Umsetzung der parallel stattfindenden HW-Abläufe...
Sheep It Up ist für mich ein Musterbeispiel eines Homebrewspiels für den GB. Simpel...
Ich finde es daher umso erstaunlicher, wie die Leute Cores für den Mister erstellen. Ich...
Zuerst noch einmal vielen Dank für den Artikel. Bei aller Abkürzung hätte ich mir aber...