Torna agli aggiornamenti
New releaseSep 3, 2026

libpo32 v0.3.0

Libreria C99 per trasferimenti acustici e sintesi di batteria per PO-32.

Condividi

libpo32

Tests Codecov FOSSA Status

Una piccola libreria C99 per i trasferimenti di dati acustici e la sintesi di batteria del Teenage Engineering PO-32.

libpo32 reimplementa lo stack di trasferimento del PO-32 Tonic e un modello di voce di batteria compatibile. Non è un firmware PO-32 completo né un emulatore di interfaccia; copre il formato dei pacchetti, il modem acustico, il decodificatore di frame e la sintesi di batteria locale necessari per costruire, inviare, ricevere e visualizzare in anteprima i trasferimenti PO-32.

Contenuti

Panoramica

AreaCosa fornisce libpo32
Protocollo di trasferimentoCostruisce e analizza pacchetti di patch, pattern e stato PO-32
Modem acusticoRenderizza frame di trasferimento in audio DPSK per la riproduzione nel dispositivo
DecodificatoreRecupera frame e pacchetti normalizzati dall'audio di trasferimento
Sintesi di batteriaRenderizza localmente la voce di batteria a 21 parametri del PO-32 per anteprima e test

Il nucleo è C99 freestanding: nessun runtime libc, nessuna libreria DSP esterna, nessuna API audio di piattaforma, nessuna I/O su file. Vengono utilizzati solo gli header freestanding <stddef.h> e <stdint.h>. Adatto per target embedded e ambienti bare-metal.

Utilizzo con un PO-32

Il PO-32 non riceve audio di batteria finito quando si trasferisce un suono o un pattern. Riceve dati strutturati:

DatiSignificato
Pacchetti di patchI due endpoint di patch per strumento (Left e Right), con lo slot dello strumento di destinazione codificato nel pacchetto
Pacchetti di patternQuali strumenti si attivano su quali step, con lo slot di pattern di destinazione codificato come pattern_number
Pacchetto di statoTempo, swing, default di morph e l'elenco dei pattern trasferiti

Il dispositivo utilizza quindi il proprio motore di sintesi interno per trasformare quei parametri in suono.

A livello generale, il flusso di lavoro con hardware reale è:

PassoCosa si fa
1Costruire un trasferimento nel software a partire da dati di patch, pattern e stato
2Renderizzare quel trasferimento in un WAV o in un flusso audio live
3Mettere il PO-32 nel suo normale flusso di ricezione/importazione
4Riprodurre l'audio di trasferimento renderizzato nel dispositivo
5Il PO-32 decodifica i pacchetti e li scrive negli slot di suono o pattern nominati all'interno di quei pacchetti

Per Iniziare

Dalla radice del repository, configurare, compilare, eseguire i test e poi la demo:

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

Opzionale, ma consigliato per lo sviluppo locale:

./scripts/install-git-hooks.sh

Questo abilita l'hook pre-commit gestito dal repository, che esegue clang-format sui file .c e .h in stage prima di ogni commit e valida i soggetti dei commit rispetto a Conventional Commits. L'hook pre-push gestito dal repository esegue lo script di analisi statica prima del push.

L'hook pre-commit richiede clang-format 18 e fallisce con qualsiasi altra versione principale; vedere CONTRIBUTING.md per le opzioni di installazione.

La demo costruisce un frame di trasferimento, lo renderizza in audio, lo decodifica nuovamente (verificando un roundtrip senza perdite), sintetizza un colpo di batteria e scrive due file WAV: demo_modem.wav e demo_kick.wav.

Installazione e Utilizzo

cmake --install distribuisce la libreria statica, gli header, un pacchetto CMake e un file pkg-config, quindi entrambi i percorsi di utilizzo funzionano immediatamente:

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

Esempi

ComandoScopo
./build/po32_exampleRoundtrip minimo: codifica, renderizza, decodifica e verifica
./build/po32_demoDemo end-to-end: costruzione/renderizzazione/decodifica del frame di trasferimento più sintesi di batteria locale
./build/po32_pattern_editorModifica interattiva dei pattern PO-32 ed esportazione WAV
./build/po32_decode_capture <input.wav> <out-dir>Dump di pacchetti e pattern da un WAV di trasferimento

Progetti Realizzati con libpo32

ProgettoCosa fa
Libpo32 for SchwungUn modulo sintetizzatore di batteria a 16 voci per Schwung su Ableton Move, alimentato da libpo32

API Pubblica

HeaderResponsabilità
core/include/po32.hCostruttore di trasferimenti, helper per pacchetti, renderizzatore e decodificatore
core/include/po32_synth.hSintetizzatore di batteria

Documentazione

DocumentoScopo
ArchitetturaCome funziona il codec
ProtocolloDettagli del formato wire
API CRiferimento delle funzioni C
SintesiPercorso del segnale del sintetizzatore
Parametri di PatchI 21 parametri
BindingCome scrivere un nuovo binding linguistico
EsempiProgrammi di esempio supportati
FuzzingHarness di fuzzing e proprietà differenziali
ContribuireConfigurazione locale, controlli e convenzioni di commit

Struttura del Progetto

PercorsoScopo
core/srcImplementazione C principale
core/includeHeader C pubblici
core/examplesEsempi C supportati
core/testsCopertura dei test principali
core/fuzzHarness libFuzzer per ogni superficie di input non attendibile
core/docsNote su architettura, protocollo e API
bindings/goBinding Go (cgo, avvolge l'intera API pubblica)

Contribuire

Vedere CONTRIBUTING.md per la configurazione locale, i comandi di verifica e la policy Conventional Commits utilizzata per una cronologia compatibile con SemVer.

Licenza

Copyright (c) 2026 Eric Lewis. Concesso in licenza sotto la MIT License. Vedere LICENSE.

Categorie