
libpo32 v0.3.0
Biblioteca C99 para transferências acústicas PO-32 e síntese de bateria.
libpo32
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
- Como Usar com um PO-32
- Começando
- Exemplos
- Projetos Construídos com libpo32
- API Pública
- Documentação
- Estrutura do Projeto
- Contribuindo
- Licença
Visão Geral
| Área | O que libpo32 fornece |
|---|---|
| Protocolo de transferência | Construir e analisar pacotes de patch, padrão e estado do PO-32 |
| Modem acústico | Renderizar quadros de transferência em áudio DPSK para reprodução no dispositivo |
| Decodificador | Recuperar quadros e pacotes normalizados a partir do áudio de transferência |
| Síntese de bateria | Renderizar 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:
| Dado | Significado |
|---|---|
| Pacotes de patch | Os dois endpoints de patch por instrumento (Left e Right), com o slot de instrumento de destino codificado no pacote |
| Pacotes de padrão | Quais instrumentos acionam em quais passos, com o slot de padrão de destino codificado como pattern_number |
| Pacote de estado | Tempo, 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 é:
| Passo | O que você faz |
|---|---|
| 1 | Construir uma transferência em software a partir de dados de patch, padrão e estado |
| 2 | Renderizar essa transferência em um WAV ou fluxo de áudio ao vivo |
| 3 | Colocar o PO-32 em seu fluxo normal de recepção/importação |
| 4 | Reproduzir o áudio de transferência renderizado no dispositivo |
| 5 | O 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
| Comando | Finalidade |
|---|---|
./build/po32_example | Roundtrip mínimo: codificar, renderizar, decodificar e verificar |
./build/po32_demo | Demonstraçã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_editor | Ediçã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
| Projeto | O que faz |
|---|---|
| Libpo32 for Schwung | Um módulo sintetizador de bateria de 16 vozes para Schwung no Ableton Move, alimentado por libpo32 |
API Pública
| Cabeçalho | Responsabilidade |
|---|---|
core/include/po32.h | Construtor de transferência, utilitários de pacote, renderizador e decodificador |
core/include/po32_synth.h | Sintetizador de bateria |
Documentação
| Documento | Finalidade |
|---|---|
| Arquitetura | Como o codec funciona |
| Protocolo | Detalhes do formato de transmissão |
| API C | Referência de funções C |
| Síntese | Caminho do sinal do sintetizador |
| Parâmetros de Patch | Os 21 parâmetros |
| Bindings | Como escrever um novo binding de linguagem |
| Exemplos | Programas de exemplo suportados |
| Fuzzing | Harnesses de fuzzing e propriedades diferenciais |
| Contribuindo | Configuração local, verificações e convenções de commit |
Estrutura do Projeto
| Caminho | Finalidade |
|---|---|
core/src | Implementação C principal |
core/include | Cabeçalhos C públicos |
core/examples | Exemplos C suportados |
core/tests | Cobertura de testes do núcleo |
core/fuzz | Harnesses libFuzzer para cada superfície de entrada não confiável |
core/docs | Notas de arquitetura, protocolo e API |
bindings/go | Bindings 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.