# Sintetizador Game Boy: Creando el Rungler en Ensamblador
Desarrollo de un sintetizador de software para Game Boy (DMG/CGB) inspirado en la síntesis modular y secuenciación. El proyecto arrancó emulando el Circuito Rungler —un diseño de Rob Hordijk con dos osciladores y un registro de desplazamiento para modulación caótica—. Implementado en ensamblador Sharp SM83, probado solo en emuladores BGB y SameBoy.
Antecedentes e Inspiración
La idea surgió tras descubrir el trabajo de Ess Mattisson: su jam de una pista en el Dirtywave M8 y el plugin Junior para síntesis de 4 bits similar a LSDJ. RetroPlug te permite conectar un emulador de Game Boy a tu DAW como VST con control MIDI. ¿El objetivo? Sacar sonidos caóticos —pitidos, bips y ruido— del APU de Game Boy (4 canales: 2x pulso, onda, ruido).
Circuito Rungler: Dos osciladores donde uno activa un registro de desplazamiento de retroalimentación lineal de 3 bits (LFSR). Su salida (0–7) modula las frecuencias de los osciladores. Teoría del caos en acción: pequeños ajustes de parámetros generan sonidos totalmente distintos.
Capacidades Técnicas de Game Boy
Desglosando el APU y la CPU para evaluar viabilidad:
- Registro de Desplazamiento: Byte de 8 bits con operaciones bit a bit (desplazamiento, OR). Fácil de implementar.
- Osciladores: Canales 1–2 (pulso con ciclo de trabajo). Frecuencia desde 64 Hz, más un contador para submuestreo. Canal 1 con barrido.
- Modulación: Escritura en registros de audio (p. ej., $FF17 para volumen CH1). Sin multiplicación hardware: operaciones bit a bit en su lugar. Volumen: 4 bits (0–$F). Frecuencia: NR13/NR14, aplicada al final del frame sin re disparo.
- Lectura de Osciladores: Solo en GBC (registros no documentados), soportado por BGB/SameBoy.
- Interfaz: Sprites en VRAM, interrupción VBlank (~60 Hz, 4560 ciclos) para actualizaciones. Gráficos basados en tiles a 160x144.
Problemas en tiempo real: Re disparar canales causa clics; la modulación de frecuencia es más suave.
Desarrollo en Ensamblador
Herramientas: RGBDS + plugin de VSCode. ¿Por qué ensamblador en vez de C? Optimización en tiempo real: desarmar código C de otros reveló asm inline pesado de todos modos.
Desafíos clave:
- Sincronización VBlank: Lógica en la interrupción, bajo 1500 ciclos (verificado con profiler). Desbordes causan desgarros (pantalla corrupta).
- Matemáticas de 16 bits: Malabarismos manuales con registro A, seguimiento de acarreo manual.
- Operaciones Bit a Bit: Sin mul/div: tablas de consulta o desplazamientos/OR/XOR.
- Memoria: Escrituras en VRAM solo durante VBlank (líneas de escaneo 0–153).
Para empezar: Tutoriales, Pandocs, ayuda de IA para "Hola Mundo". Interfaz: Cursor, parámetros (frecuencias, modulación), actualizaciones reactivas.
Implementación y Limitaciones
- Lógica LFSR: Activado por osc1, puerta por osc2 para entrada. 3 bits → DAC (0–7) → escalado + sesgo → registros.
- Secuenciación: LFSR para disparos, re disparos periódicos.
- Optimizaciones: Limpieza de pantalla, dibujo de cursor, visualización LFSR. Profiler asegura zona segura.
Resultado: No es una Blippoo Box completa (límites de 4 bits y timing), más bien como Double Knot. Sonidos: De pulsos a ruido.
Lecciones Clave:
- El APU de Game Boy sirve para modulación LFSR, pero el tiempo real está limitado por re disparos y resolución de 4 bits.
- VBlank es decisivo para la interfaz (<1500 ciclos); el ensamblador es esencial para margen.
- Registros de lectura de osciladores en GBC son no documentados, dependen del emulador.
- Operaciones bit a bit sustituyen multiplicaciones: suficientes para efectos caóticos.
- Proyecto escalable: Canal onda CH3, Karplus-Strong a continuación.
Direcciones Futuras
Próximos pasos: Sintetizador de 4 bits (onda CH3), Karplus-Strong/Batería Risset, actuaciones audiovisuales (al estilo Robert Henke), depuración con profiler, empujando límites de matemáticas de 16 bits.
— Editorial Team
Aún no hay comentarios.