Chiptunes en tu escritorio: un reproductor de musica de arcade con CircuitPython
Te acuerdas de los bleeps y bloops de las maquinitas de los 80? Esos sonidos no salian de un MP3: los generaba un chip dedicado, el famoso AY-3-8910, un generador de sonido programable de 3 voces que estaba adentro de un monton de arcades y computadores de la epoca. En este proyecto vas a revivir ese sonido armando un reproductor de chiptunes portatil que corre CircuitPython y emula ese chip por software con el modulo synthio.
La idea es simple pero entretenida: cargas archivos de musica de videojuegos (formato .VGM / .VGZ) en una tarjeta microSD, los eliges desde una pantalla tactil y los escuchas por un DAC I2S de buena calidad conectado a unos parlantes. Al terminar vas a saber como emular hardware de sonido retro por software, como sacar audio digital I2S desde un microcontrolador y como montar una interfaz tactil de reproductor (play, pausa, siguiente, repetir) en pocas lineas.
Este tutorial esta inspirado en la guia original de Adafruit (Liz Clark y los Ruiz Brothers), que usa un Feather RP2350 con una TFT FeatherWing. Aca lo reescribimos con enfoque chileno y te mostramos ademas como re portarlo a un ESP32-S3, que es mucho mas facil de conseguir en el pais. El codigo CircuitPython lo dejamos fiel al original: lo que cambia es el hardware alrededor.

Como funciona: emular un chip de sonido de los 80
Los archivos VGM no son audio grabado, son un log de comandos: "escribe este valor en tal registro del chip de sonido en este instante". Para reproducirlos necesitas un chip AY-3-8910 real... o emularlo. Aca el microcontrolador ejecuta un emulador del AY8912 (adafruit_ay8912) que va leyendo esos comandos y sintetizando las 3 voces mas el canal de ruido en tiempo real. Ese audio sintetizado se envia por el bus I2S a un DAC externo, y de ahi a los parlantes.
Por que un DAC I2S separado y no el DAC interno del micro? Porque la calidad importa: el PCM5102 entrega 112 dB de relacion senal ruido y una salida de nivel de linea limpia, muy superior a un PWM filtrado. Para musica, la diferencia se nota.
Hardware y conexiones
En la version original se usa un Feather RP2350 encajado sobre una TFT FeatherWing de 3.5" (que trae la pantalla tactil y el lector microSD integrados). El DAC PCM5102 se cablea a los pines del Feather que quedan duplicados en la FeatherWing.

El cableado del DAC I2S es de solo 5 cables:
- 3.3V de la placa -> VIN del DAC (cable rojo)
- GND de la placa -> GND del DAC (cable negro)
- A1 de la placa -> BCK del DAC (cable amarillo). reloj de bit
- A2 de la placa -> WSEL del DAC (cable verde). word select (canal L/R)
- A3 de la placa -> DIN del DAC (cable azul). datos de audio
Ese trio de senales (BCK, WSEL, DIN) es exactamente el protocolo I2S: un reloj de bit, una senal que indica el canal y la linea de datos serie. En el codigo, esos tres pines se declaran en una sola linea: audiobusio.I2SOut(board.A1, board.A2, board.A3).

La microSD entra en el socket de la FeatherWing y usa el mismo bus SPI que la pantalla, con su propio chip select (board.D5). Ahi copias tus archivos .vgm o .vgz.

Instalar CircuitPython
Antes que nada, tienes que dejar la placa corriendo CircuitPython:
- Descarga el UF2 mas reciente de tu placa desde circuitpython.org.
- Entra al bootloader: manten apretado el boton BOOT/BOOTSEL y, sin soltarlo, presiona y suelta el boton de reset. Sigue apretando BOOTSEL hasta que aparezca la unidad
RP2350(en el ESP32-S3 el procedimiento equivalente es mantener BOOT y tocar reset). - Arrastra el archivo
.uf2a esa unidad. La placa se reinicia y aparece la unidadCIRCUITPY.
Un consejo que ahorra rabias: usa un cable USB que sepas que transmite datos, no uno de solo carga. Es el error mas comun y frustrante al empezar.
El codigo del reproductor
Una vez con CircuitPython instalado, descarga el Project Bundle desde la pagina original (trae el code.py y todas las librerias necesarias en la carpeta lib). El programa completo arma dos vistas en la pantalla tactil. la de reproduccion y el menu de seleccion de pistas. y maneja el emulador AY8912. Este es el codigo, fiel al original byte a byte:
El programa hace, en orden: monta la microSD (reintentando 3 veces por si falla la inicializacion), lista los archivos VGM/VGZ, inicializa la pantalla HX8357 y el touch TSC2007, abre el bus I2S hacia el DAC, construye los botones tactiles de ambas vistas, arranca el emulador AY8912(sample_rate=22050, clock_rate=1773400) y define las funciones de reproduccion (play_track, load_track, change_track) y el despachador de toques (dispatch).
Fíjate en un detalle elegante del manejo de memoria: antes de abrir cada archivo VGM se llama a gc.collect() y se apaga display.auto_refresh mientras se parsea el archivo. En un micro con RAM limitada, esos gestos evitan cuelgues al cambiar de pista.

Como correrlo
- Copia tus archivos
.vgm/.vgza la raiz de la microSD. Puedes bajarlos de sitios de archivo de musica de videojuegos o exportarlos desde software tracker; el Project Bundle incluye una pista de ejemplo para probar. - Inserta la microSD, conecta los parlantes al DAC con un cable estereo de 3.5 mm y alimenta la placa por USB.
- Copia
code.pyy la carpetalibaCIRCUITPY. La placa recarga sola y aparece el reproductor. - Toca MENU, elige una pista y vuelve a NOW PLAYING. Usa PLAY/PAUSE,
<</>>para saltar y REPEAT para dejarla en loop.

Variantes y mejoras
Ideas para llevar el proyecto mas alla de la guia original:
- Salida a un amplificador de tu equipo: en vez de parlantes USB, la salida de nivel de linea del PCM5102 se puede enchufar directo a la entrada AUX de un amplificador o parlante Bluetooth con entrada de 3.5 mm. Suena bastante mejor.
- Control fisico con botones: si prefieres botones reales en vez de la pantalla tactil, puedes mapear tres pulsadores (play, siguiente, anterior) a GPIO libres y llamar a las mismas funciones
dispatch("play"),change_track(1)ychange_track(-1). Ideal si armas una carcasa tipo arcade sin touch. - Visualizador de espectro: como ya tienes el emulador generando las 3 voces, puedes dibujar barras de nivel en la pantalla leyendo la actividad de cada canal y actualizandolas en el loop principal. Le da onda de ecualizador retro.
- Playlist con autoavance: el codigo ya trae
repeat_mode; una extension natural es detectar el fin de la pista (cuando el progreso llega a 1.0) y llamar achange_track(1)automaticamente para que la microSD suene como un album continuo.
Personalizacion para Chile
Este proyecto usa hardware de la linea Feather de Adafruit, que no siempre se encuentra facil en Chile. Aca va el BOM real y las equivalencias honestas para armarlo con lo que si se consigue localmente. En MechatronicStore encuentras varios de estos componentes; te dejo las categorias, sin inventar SKUs ni precios:
- Microcontrolador: el original usa un Adafruit Feather RP2350. Una alternativa muy conseguible es una placa ESP32-S3 con CircuitPython, que tambien tiene I2S por hardware y sobra de RAM/flash para el emulador. Ojo: los nombres de pines cambian, asi que tendras que ajustar
board.D5,board.D9,board.D10,board.A1/A2/A3por los GPIO reales de tu ESP32-S3. El codigo de audio y del emulador queda igual. - DAC I2S PCM5102: este si esta en catalogo (DAC I2S PCM5102) y es exactamente el mismo modulo del tutorial. Es la pieza central del sonido.
- Tarjeta microSD: cualquier microSD de 512 MB en adelante formateada en FAT32 sirve. Si tu placa ESP32-S3 no trae lector, necesitas ademas un modulo lector microSD SPI.
- Parlantes USB: los Parlantes USB del catalogo cumplen igual que los del original; o usa cualquier parlante con entrada de 3.5 mm.
- Pantalla tactil: la TFT FeatherWing de 3.5" (HX8357 + touch TSC2007) es especifica de Adafruit. Si la reemplazas por un display generico distinto, tendras que cambiar la libreria (
adafruit_hx8357) y el driver del touch por los de tu pantalla. Es la adaptacion mas grande respecto del original. - Cables y tornilleria: jumpers macho macho de 20 cm para el DAC, un cable de audio estereo 3.5 mm y la tornilleria M2.5/M3 para la carcasa impresa en 3D.
Dos componentes (el Feather RP2350 y la TFT FeatherWing especifica) pueden no tener equivalente exacto en tienda local; por eso mostramos la ruta ESP32-S3 + display generico como camino realista para armarlo en Chile.
Recursos
- Tutorial original: CircuitPython Chiptune Player de Liz Clark y los Ruiz Brothers (Adafruit Learn), en ingles. Este articulo esta basado en esa guia.
- Piezas 3D y Project Bundle: los archivos 3MF para imprimir, el codigo completo (
code.py+ librerias) y las fuentes CAD se descargan desde la pagina original enlazada arriba. - Modelos CAD de placas Adafruit: Adafruit CAD Parts (GitHub).
- Documentacion: modulos
synthioyaudiobusiode CircuitPython en docs.circuitpython.org.
Version chilena con componentes en stock local en MechatronicStore.




