
Biblioteca C99 para transferencias acústicas y síntesis de batería PO-32.
Una pequeña biblioteca en C99 para transferencias de datos acústicos y síntesis de batería del Teenage Engineering PO-32.
libpo32 reimplementa la pila de transferencia del PO-32 Tonic y un modelo de voz de batería compatible. No es un firmware completo del PO-32 ni un emulador de interfaz; cubre el formato de paquetes, el módem acústico, el decodificador de tramas y la síntesis de batería local necesarios para construir, enviar, recibir y previsualizar transferencias del PO-32.
| Área | Qué proporciona libpo32 |
|---|---|
| Protocolo de transferencia | Construye y analiza paquetes de patch, patrón y estado del PO-32 |
| Módem acústico | Renderiza tramas de transferencia a audio DPSK para reproducirlas en el dispositivo |
| Decodificador | Recupera tramas y paquetes normalizados a partir del audio de transferencia |
| Síntesis de batería | Renderiza la voz de batería de 21 parámetros del PO-32 localmente para previsualización y pruebas |
El núcleo es C99 independiente: sin runtime de libc, sin bibliotecas DSP externas, sin APIs de audio de plataforma, sin E/S de archivos. Solo se utilizan los encabezados independientes <stddef.h> y <stdint.h>. Adecuado para objetivos embebidos y entornos bare-metal.
El PO-32 no recibe audio de batería terminado cuando transfieres un sonido o un patrón. Recibe datos estructurados:
| Datos | Significado |
|---|---|
| Paquetes de patch | Los dos endpoints de patch por instrumento (Left y Right), con la ranura de instrumento de destino codificada en el paquete |
| Paquetes de patrón | Qué instrumentos se activan en qué pasos, con la ranura de patrón de destino codificada como pattern_number |
| Paquete de estado | Tempo, swing, valores predeterminados de morph y la lista de patrones transferidos |
El dispositivo utiliza entonces su propio motor de síntesis interno para convertir esos parámetros en sonido.
A alto nivel, el flujo de trabajo con hardware real es:
| Paso | Qué haces |
|---|---|
| 1 | Construyes una transferencia en software a partir de datos de patch, patrón y estado |
| 2 | Renderizas esa transferencia a un WAV o a un flujo de audio en vivo |
| 3 | Pones el PO-32 en su flujo normal de recepción/importación |
| 4 | Reproduces el audio de transferencia renderizado en el dispositivo |
| 5 | El PO-32 decodifica los paquetes y los escribe en las ranuras de sonido o patrón nombradas dentro de esos paquetes |
Desde la raíz del repositorio, configura, compila, ejecuta las pruebas y luego la demo:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
ctest --test-dir build --output-on-failure
./build/po32_demo
Opcional, pero recomendado para el desarrollo local:
./scripts/install-git-hooks.sh
Eso habilita el hook de pre-commit gestionado por el repositorio, que ejecuta clang-format en los archivos .c y .h preparados antes de cada commit y valida los asuntos de los commits según Conventional Commits. El hook de pre-push gestionado por el repositorio ejecuta el script de análisis estático antes del push.
El hook de pre-commit requiere clang-format 18 y falla con cualquier otra versión principal; consulta CONTRIBUTING.md para opciones de instalación.
La demo construye una trama de transferencia, la renderiza a audio, la decodifica de vuelta (verificando un roundtrip sin pérdidas), sintetiza un golpe de batería y escribe dos archivos WAV: demo_modem.wav y demo_kick.wav.
cmake --install distribuye la biblioteca estática, los encabezados, un paquete CMake y un archivo pkg-config, por lo que ambas rutas de consumo funcionan de inmediato:
find_package(LibPO32 0.2 REQUIRED)
target_link_libraries(app PRIVATE LibPO32::po32)
cc app.c $(pkg-config --cflags --libs po32) -lm
| Comando | Propósito |
|---|---|
./build/po32_example | Roundtrip mínimo: codificar, renderizar, decodificar y verificar |
./build/po32_demo | Demo de extremo a extremo: construcción/renderizado/decodificación de tramas de transferencia más síntesis de batería local |
./build/po32_pattern_editor | Edición interactiva de patrones del PO-32 y exportación a WAV |
./build/po32_decode_capture <input.wav> <out-dir> | Volcados de paquetes y patrones a partir de un WAV de transferencia |
| Proyecto | Qué hace |
|---|---|
| Libpo32 for Schwung | Un módulo sintetizador de batería de 16 voces para Schwung en Ableton Move, impulsado por libpo32 |
| Encabezado | Responsabilidad |
|---|---|
core/include/po32.h | Constructor de transferencias, helpers de paquetes, renderizador y decodificador |
core/include/po32_synth.h | Sintetizador de batería |
| Documento | Propósito |
|---|---|
| Arquitectura | Cómo funciona el códec |
| Protocolo | Detalles del formato de cable |
| API C | Referencia de funciones en C |
| Síntesis | Ruta de señal del sintetizador |
| Parámetros de patch | Los 21 parámetros |
| Bindings | Cómo escribir un nuevo binding de lenguaje |
| Ejemplos | Programas de ejemplo compatibles |
| Fuzzing | Harnesses de fuzzing y propiedades diferenciales |
| Contribuciones | Configuración local, comprobaciones y convenciones de commits |