
libpo32 v0.3.0
Biblioteca C99 para transferencias acústicas y síntesis de batería PO-32.
libpo32
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.
Contenido
- Descripción general
- Uso con un PO-32
- Primeros pasos
- Ejemplos
- Proyectos construidos con libpo32
- API pública
- Documentación
- Estructura del proyecto
- Contribuciones
- Licencia
Descripción general
| Á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.
Uso con un PO-32
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 |
Primeros pasos
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.
Instalación y consumo
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
Ejemplos
| 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 |
Proyectos construidos con libpo32
| Proyecto | Qué hace |
|---|---|
| Libpo32 for Schwung | Un módulo sintetizador de batería de 16 voces para Schwung en Ableton Move, impulsado por libpo32 |
API pública
| Encabezado | Responsabilidad |
|---|---|
core/include/po32.h | Constructor de transferencias, helpers de paquetes, renderizador y decodificador |
core/include/po32_synth.h | Sintetizador de batería |
Documentación
| 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 |
Estructura del proyecto
| Ruta | Propósito |
|---|---|
core/src | Implementación central en C |
core/include | Encabezados públicos en C |
core/examples | Ejemplos en C compatibles |
core/tests | Cobertura de pruebas del núcleo |
core/fuzz | Harnesses de libFuzzer para cada superficie de entrada no confiable |
core/docs | Notas de arquitectura, protocolo y API |
bindings/go | Bindings en Go (cgo, envuelve toda la API pública) |
Contribuciones
Consulta CONTRIBUTING.md para la configuración local, los comandos de verificación y la política de Conventional Commits utilizada para un historial compatible con SemVer.
Licencia
Copyright (c) 2026 Eric Lewis. Licenciado bajo la Licencia MIT. Consulta LICENSE.