Volver a actualizaciones
Nuevo releaseSep 3, 2026

libpo32 v0.3.0

Biblioteca C99 para transferencias acústicas y síntesis de batería PO-32.

Compartir

libpo32

Tests Codecov FOSSA Status

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

ÁreaQué proporciona libpo32
Protocolo de transferenciaConstruye y analiza paquetes de patch, patrón y estado del PO-32
Módem acústicoRenderiza tramas de transferencia a audio DPSK para reproducirlas en el dispositivo
DecodificadorRecupera tramas y paquetes normalizados a partir del audio de transferencia
Síntesis de bateríaRenderiza 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:

DatosSignificado
Paquetes de patchLos dos endpoints de patch por instrumento (Left y Right), con la ranura de instrumento de destino codificada en el paquete
Paquetes de patrónQué instrumentos se activan en qué pasos, con la ranura de patrón de destino codificada como pattern_number
Paquete de estadoTempo, 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:

PasoQué haces
1Construyes una transferencia en software a partir de datos de patch, patrón y estado
2Renderizas esa transferencia a un WAV o a un flujo de audio en vivo
3Pones el PO-32 en su flujo normal de recepción/importación
4Reproduces el audio de transferencia renderizado en el dispositivo
5El 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

ComandoPropósito
./build/po32_exampleRoundtrip mínimo: codificar, renderizar, decodificar y verificar
./build/po32_demoDemo de extremo a extremo: construcción/renderizado/decodificación de tramas de transferencia más síntesis de batería local
./build/po32_pattern_editorEdició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

ProyectoQué hace
Libpo32 for SchwungUn módulo sintetizador de batería de 16 voces para Schwung en Ableton Move, impulsado por libpo32

API pública

EncabezadoResponsabilidad
core/include/po32.hConstructor de transferencias, helpers de paquetes, renderizador y decodificador
core/include/po32_synth.hSintetizador de batería

Documentación

DocumentoPropósito
ArquitecturaCómo funciona el códec
ProtocoloDetalles del formato de cable
API CReferencia de funciones en C
SíntesisRuta de señal del sintetizador
Parámetros de patchLos 21 parámetros
BindingsCómo escribir un nuevo binding de lenguaje
EjemplosProgramas de ejemplo compatibles
FuzzingHarnesses de fuzzing y propiedades diferenciales
ContribucionesConfiguración local, comprobaciones y convenciones de commits

Estructura del proyecto

RutaPropósito
core/srcImplementación central en C
core/includeEncabezados públicos en C
core/examplesEjemplos en C compatibles
core/testsCobertura de pruebas del núcleo
core/fuzzHarnesses de libFuzzer para cada superficie de entrada no confiable
core/docsNotas de arquitectura, protocolo y API
bindings/goBindings 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.

Categorías