Voltar às atualizações
New releaseSep 3, 2026

libpo32 v0.3.0

Biblioteca C99 para transferências acústicas PO-32 e síntese de bateria.

Compartilhar

libpo32

Tests Codecov FOSSA Status

Uma pequena biblioteca C99 para transferências de dados acústicos e síntese de bateria do Teenage Engineering PO-32.

libpo32 reimplementa a pilha de transferência do PO-32 Tonic e um modelo de voz de bateria compatível. Não é um firmware completo do PO-32 nem um emulador de interface; cobre o formato de pacotes, o modem acústico, o decodificador de quadros e a síntese de bateria local necessários para construir, enviar, receber e pré-visualizar transferências do PO-32.

Conteúdo

Visão Geral

ÁreaO que libpo32 fornece
Protocolo de transferênciaConstruir e analisar pacotes de patch, padrão e estado do PO-32
Modem acústicoRenderizar quadros de transferência em áudio DPSK para reprodução no dispositivo
DecodificadorRecuperar quadros e pacotes normalizados a partir do áudio de transferência
Síntese de bateriaRenderizar a voz de bateria de 21 parâmetros do PO-32 localmente para pré-visualização e testes

O núcleo é C99 freestanding: sem runtime libc, sem bibliotecas DSP externas, sem APIs de áudio de plataforma, sem E/S de arquivos. Apenas os cabeçalhos freestanding <stddef.h> e <stdint.h> são usados. Adequado para alvos embarcados e ambientes bare-metal.

Como Usar com um PO-32

O PO-32 não recebe áudio de bateria finalizado quando você transfere um som ou um padrão. Ele recebe dados estruturados:

DadoSignificado
Pacotes de patchOs dois endpoints de patch por instrumento (Left e Right), com o slot de instrumento de destino codificado no pacote
Pacotes de padrãoQuais instrumentos acionam em quais passos, com o slot de padrão de destino codificado como pattern_number
Pacote de estadoTempo, swing, padrões de morph e a lista de padrões transferidos

O dispositivo então usa seu próprio mecanismo de síntese interno para transformar esses parâmetros em som.

Em alto nível, o fluxo de trabalho com hardware real é:

PassoO que você faz
1Construir uma transferência em software a partir de dados de patch, padrão e estado
2Renderizar essa transferência em um WAV ou fluxo de áudio ao vivo
3Colocar o PO-32 em seu fluxo normal de recepção/importação
4Reproduzir o áudio de transferência renderizado no dispositivo
5O PO-32 decodifica os pacotes e os grava nos slots de som ou padrão nomeados dentro desses pacotes

Começando

A partir da raiz do repositório, configure, compile, execute os testes e depois a demonstração:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
ctest --test-dir build --output-on-failure
./build/po32_demo

Opcional, mas recomendado para desenvolvimento local:

./scripts/install-git-hooks.sh

Isso ativa o hook de pre-commit gerenciado pelo repositório, que executa clang-format em arquivos .c e .h preparados antes de cada commit e valida os assuntos dos commits conforme Conventional Commits. O hook de pre-push gerenciado pelo repositório executa o script de análise estática antes do push.

O hook de pre-commit requer clang-format 18 e falha em qualquer outra versão principal; consulte CONTRIBUTING.md para opções de instalação.

A demonstração constrói um quadro de transferência, renderiza-o em áudio, decodifica-o de volta (verificando um roundtrip sem perdas), sintetiza uma batida de bateria e grava dois arquivos WAV: demo_modem.wav e demo_kick.wav.

Instalação e Consumo

cmake --install fornece a biblioteca estática, cabeçalhos, um pacote CMake e um arquivo pkg-config, para que ambos os caminhos de consumo funcionem prontamente:

find_package(LibPO32 0.2 REQUIRED)
target_link_libraries(app PRIVATE LibPO32::po32)
cc app.c $(pkg-config --cflags --libs po32) -lm

Exemplos

ComandoFinalidade
./build/po32_exampleRoundtrip mínimo: codificar, renderizar, decodificar e verificar
./build/po32_demoDemonstração de ponta a ponta: construção/renderização/decodificação de quadro de transferência mais síntese de bateria local
./build/po32_pattern_editorEdição interativa de padrões do PO-32 e exportação WAV
./build/po32_decode_capture <input.wav> <out-dir>Dumps de pacotes e padrões a partir de um WAV de transferência

Projetos Construídos com libpo32

ProjetoO que faz
Libpo32 for SchwungUm módulo sintetizador de bateria de 16 vozes para Schwung no Ableton Move, alimentado por libpo32

API Pública

CabeçalhoResponsabilidade
core/include/po32.hConstrutor de transferência, utilitários de pacote, renderizador e decodificador
core/include/po32_synth.hSintetizador de bateria

Documentação

DocumentoFinalidade
ArquiteturaComo o codec funciona
ProtocoloDetalhes do formato de transmissão
API CReferência de funções C
SínteseCaminho do sinal do sintetizador
Parâmetros de PatchOs 21 parâmetros
BindingsComo escrever um novo binding de linguagem
ExemplosProgramas de exemplo suportados
FuzzingHarnesses de fuzzing e propriedades diferenciais
ContribuindoConfiguração local, verificações e convenções de commit

Estrutura do Projeto

CaminhoFinalidade
core/srcImplementação C principal
core/includeCabeçalhos C públicos
core/examplesExemplos C suportados
core/testsCobertura de testes do núcleo
core/fuzzHarnesses libFuzzer para cada superfície de entrada não confiável
core/docsNotas de arquitetura, protocolo e API
bindings/goBindings Go (cgo, envolvem toda a API pública)

Contribuindo

Consulte CONTRIBUTING.md para configuração local, comandos de verificação e a política de Conventional Commits usada para um histórico compatível com SemVer.

Licença

Copyright (c) 2026 Eric Lewis. Licenciado sob a Licença MIT. Consulte LICENSE.

Categorias