Zpět na domů

Syntetizátor Rungler na Game Boy v assembleru

Článek popisuje vytvoření syntetizátoru na Game Boy inspirovaného obvodem Rungler Circuit. Použity kanály APU, LFSR pro modulaci, assembler RGBDS. Diskutována omezení reálného času, načasování VBlank a optimalizace pro middle/senior vývojáře.

Game Boy jako syntetizátor: Rungler v assembleru
Advertisement 728x90

Syntezátor na Game Boy: implementace Rungleru v assembleru

Vývoj softwarového syntezátoru pro Game Boy (DMG/CGB) založený na myšlenkách modulární syntézy a sekvencování. Projekt začal pokusem emulovat Rungler Circuit – schéma Roba Hordijka se dvěma oscilátory a posuvným registrem pro chaotickou modulaci. Implementace v assembleru Sharp SM83 bez hardwarového zařízení, pouze emulátory BGB a Same Boy.

Předhistorie a inspirace

Nápad vznikl po seznámení s pracemi Essa Mattissona: jeho skladbou na Dirtywave M8 (jedna stopa) a pluginem Junior pro 4bitovou syntézu, podobně jako LSDJ. RetroPlug umožňuje integrovat emulátor Game Boy do DAW jako VST s MIDI ovládáním. Cíl – získat z APU Game Boy (4 kanály: 2x puls, vlnový, šum) chaotické zvuky: pípání, praskání, šumy.

Rungler Circuit: dva oscilátory, jeden spouští 3bitový posuvný registr (LFSR), jehož výstup (0–7) moduluje frekvence oscilátorů. Chaotičnost podle teorie chaosu – malé změny parametrů vedou k radikálním zvukovým posunům.

Google AdInline article slot

Technické možnosti Game Boy

Revize APU a CPU pro proveditelnost:

  • Posuvný registr: 8bitový bajt s bitovými operacemi (posun, OR). Snadno implementovatelné.
  • Oscilátory: Kanály 1–2 (puls s duty cycle). Minimální frekvence 64 Hz, přidán čítač pro vzorkování. Kanál 1 podporuje sweep.
  • Modulace: Zápis do audio registrů (např. $FF17 pro volume CH1). Žádný hardwarový násobení – bitové operace místo toho. Volume: 4bit (0–$F). Frekvence: NR13/NR14, aplikuje se na konci fragmentu bez restartu spouštění.
  • Čtení oscilátorů: Pouze na GBC (nedokumentované registry), emulátory BGB/SameBoy podporují.
  • UI: Sprajty ve VRAM, VBlank interrupt (~60 Hz, 4560 cyklů) pro aktualizace. Dlážděná grafika 160x144.

Problémy reálného času: restart kanálu způsobuje praskání, modulace frekvence je stabilnější.

Vývoj v assembleru

Nástroje: RGBDS + VSCode plugin. Proč asm, ne C? Optimalizace pro reálný čas, studium cizího C-kódu ukázalo inline asm.

Google AdInline article slot

Klíčové výzvy:

  • VBlank timing: Logika v interruptu, <1500 cyklů (profiler). Překročení – tearing (smetí na obrazovce).
  • 16bitová aritmetika: Ruční správa registrů A, mutable – ruční sledování.
  • Bitové operace: Žádné mul/div – lookup nebo posuny/OR/XOR.
  • Paměť: Zápis VRAM pouze ve VBlank (řádky 0–153).

Začátek: tutoriály, Pandocs, AI pomoc pro "Hello World". UI: kurzor, parametry (frekvence, modulace), reaktivní aktualizace.

Implementace a omezení

  • LFSR logika: Spouštění od oscilátoru1, hradlo od oscilátoru2 nastavuje vstup. 3 bity → DAC (0–7) → škálování + bias → registry.
  • Sekvencování: LFSR pro spouštění, periodický restart spouštění.
  • Optimalizace: Vymazání obrazovky, kreslení kurzoru, vizualizace LFSR. Profiler: bezpečná zóna.

Výsledek: ne úplný Blippoo Box (omezení 4bit, timing), spíše blíže k Double Knot. Zvuky: pulsace → šumy.

Google AdInline article slot

Co je důležité:

  • APU Game Boy je vhodné pro LFSR modulaci, ale reálný čas je omezen restartem spouštění a 4bitovostí.
  • VBlank – kritické pro UI (<1500 cyklů), asm je nutné pro výhodu.
  • GBC registry pro čtení oscilátorů – nedokumentované, závislé na emulátoru.
  • Bitové operace místo mul: dostatečné pro chaotické efekty.
  • Projekt škálovatelný: vlnový kanál CH3, Karplus-Strong v plánu.

Perspektivy rozvoje

Dále: 4bitová syntéza (CH3 vlnový), Karplus-Strong/Risset Drum, audiovizuální performance (inspirace Robert Henke), ladění profileru, limity 16bitové aritmetiky.

— Editorial Team

Advertisement 728x90

Číst dál