# Synthétiseur Game Boy : Création du Rungler en assembleur
Développement d'un synthétiseur logiciel pour Game Boy (DMG/CGB), inspiré de la synthèse modulaire et du séquençage. Le projet a démarré par l'émulation du circuit Rungler — une conception de Rob Hordijk avec deux oscillateurs et un registre à décalage pour une modulation chaotique. Implémenté en assembleur Sharp SM83, testé uniquement sur les émulateurs BGB et SameBoy.
Contexte et inspirations
L'idée est née après la découverte des travaux d'Ess Mattisson : son jam mono-piste sur le Dirtywave M8 et le plugin Junior pour une synthèse 4 bits style LSDJ. RetroPlug permet d'insérer un émulateur Game Boy dans votre DAW en tant que VST avec contrôle MIDI. L'objectif ? Tirer des sons chaotiques — bips, blips et bruits — de l'APU de la Game Boy (4 canaux : 2x impulsions, onde, bruit).
Circuit Rungler : Deux oscillateurs dont l'un déclenche un registre à décalage à retour linéaire 3 bits (LFSR). Sa sortie (0–7) module les fréquences des oscillateurs. La théorie du chaos en action — de légers ajustements de paramètres produisent des sons radicalement différents.
Capacités techniques de la Game Boy
Décomposition de l'APU et du CPU pour évaluer la faisabilité :
- Registre à décalage : Octet 8 bits avec opérations bit à bit (décalage, OR). Simple à implémenter.
- Oscillateurs : Canaux 1–2 (impulsions avec rapport cyclique). Fréquences dès 64 Hz, plus un compteur pour le sous-échantillonnage. Canal 1 avec balayage.
- Modulation : Écriture dans les registres audio (ex. $FF17 pour volume CH1). Pas de multiplication matérielle — opérations bit à bit à la place. Volume : 4 bits (0–$F). Fréquence : NR13/NR14, appliquée en fin de trame sans réamorçage.
- Lecture des oscillateurs : GBC uniquement (registres non documentés), pris en charge par BGB/SameBoy.
- Interface : Sprites en VRAM, interruption VBlank (~60 Hz, 4560 cycles) pour les mises à jour. Graphismes basés sur tuiles à 160x144.
Pièges du temps réel : Réamorçage des canaux provoque des clics ; modulation de fréquence plus fluide.
Développement en assembleur
Outils : RGBDS + extension VSCode. Pourquoi l'assembleur plutôt que C ? Optimisation temps réel — dissection du code C d'autrui révèle un assembleur inline massif.
Défis principaux :
- Timing VBlank : Logique dans l'interruption, sous 1500 cycles (vérifié au profileur). Dépassements causent des déchirures (écran corrompu).
- Maths 16 bits : Gestion manuelle du registre A, suivi du carry à la main.
- Opérations bit à bit : Pas de mul/div — tables de consultation ou décalages/OR/XOR.
- Mémoire : Écritures VRAM uniquement pendant VBlank (lignes 0–153).
Pour débuter : Tutoriels, Pandocs, aide IA pour un "Hello World". Interface : Curseur, paramètres (fréquences, modulation), mises à jour réactives.
Implémentation et limites
- Logique LFSR : Déclenché par osc1, géré par osc2 pour l'entrée. 3 bits → DAC (0–7) → échelle + biais → registres.
- Séquençage : LFSR pour déclenchements, réamorçages périodiques.
- Optimisations : Effacement écran, dessin curseur, visualisation LFSR. Profileur assure une zone sûre.
Résultat : Pas une Blippoo Box complète (limites 4 bits et timing), plutôt comme un Double Knot. Sons : Impulsions vers bruit.
Leçons clés :
- L'APU Game Boy convient pour modulation LFSR, mais le temps réel est limité par réamorçages et résolution 4 bits.
- VBlank est décisif pour l'interface (<1500 cycles) ; l'assembleur est indispensable pour la marge.
- Registres de lecture osc GBC non documentés, dépendants de l'émulateur.
- Opérations bit à bit remplacent la multiplication : suffisant pour effets chaotiques.
- Projet évolutif : Canal onde CH3, Karplus-Strong ensuite.
Perspectives futures
Prochaines étapes : Synthé 4 bits (onde CH3), Karplus-Strong/batterie Risset, performances audiovisuelles (style Robert Henke), débogage profileur, pousser les limites des maths 16 bits.
— Editorial Team
Aucun commentaire pour le moment.