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.
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.
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.
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
Zatím žádné komentáře.