
libpo32 v0.3.0
Bibliothèque C99 pour les transferts acoustiques du PO-32 et la synthèse de batterie.
libpo32
Une petite bibliothèque C99 pour les transferts de données acoustiques et la synthèse de batterie du Teenage Engineering PO-32.
libpo32 réimplémente la pile de transfert du PO-32 Tonic ainsi qu'un modèle de voix de batterie compatible. Ce n'est pas un firmware PO-32 complet ni un émulateur d'interface ; elle couvre le format de paquets, le modem acoustique, le décodeur de trames et la synthèse de batterie locale nécessaires pour construire, envoyer, recevoir et prévisualiser les transferts PO-32.
Sommaire
- Vue d'ensemble
- Utilisation avec un PO-32
- Pour commencer
- Exemples
- Projets construits avec libpo32
- API publique
- Documentation
- Structure du projet
- Contribuer
- Licence
Vue d'ensemble
| Domaine | Ce que fournit libpo32 |
|---|---|
| Protocole de transfert | Construire et analyser les paquets de patch, de motif et d'état PO-32 |
| Modem acoustique | Rendre les trames de transfert en audio DPSK pour lecture dans l'appareil |
| Décodeur | Récupérer les trames et paquets normalisés à partir de l'audio de transfert |
| Synthèse de batterie | Rendre localement la voix de batterie à 21 paramètres du PO-32 pour prévisualisation et test |
Le cœur est en C99 autonome : pas d'exécution libc, pas de bibliothèques DSP externes, pas d'API audio de plateforme, pas d'E/S de fichiers. Seuls les en-têtes autonomes <stddef.h> et <stdint.h> sont utilisés. Convient aux cibles embarquées et aux environnements bare-metal.
Utilisation avec un PO-32
Le PO-32 ne reçoit pas d'audio de batterie finalisé lorsque vous transférez un son ou un motif. Il reçoit des données structurées :
| Données | Signification |
|---|---|
| Paquets de patch | Les deux points de terminaison de patch par instrument (Left et Right), avec l'emplacement d'instrument de destination encodé dans le paquet |
| Paquets de motif | Quels instruments se déclenchent sur quelles étapes, avec l'emplacement de motif de destination encodé comme pattern_number |
| Paquet d'état | Tempo, swing, valeurs par défaut de morph et liste des motifs transférés |
L'appareil utilise ensuite son propre moteur de synthèse interne pour transformer ces paramètres en son.
À un niveau élevé, le flux de travail avec du matériel réel est :
| Étape | Ce que vous faites |
|---|---|
| 1 | Construire un transfert en logiciel à partir des données de patch, de motif et d'état |
| 2 | Rendre ce transfert en WAV ou en flux audio en direct |
| 3 | Mettre le PO-32 dans son flux normal de réception/import |
| 4 | Lire l'audio de transfert rendu dans l'appareil |
| 5 | Le PO-32 décode les paquets et les écrit dans les emplacements de son ou de motif nommés dans ces paquets |
Pour commencer
Depuis la racine du dépôt, configurez, compilez, exécutez les tests, puis la démo :
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
ctest --test-dir build --output-on-failure
./build/po32_demo
Facultatif, mais recommandé pour le développement local :
./scripts/install-git-hooks.sh
Cela active le hook pre-commit géré par le dépôt, qui exécute clang-format sur les fichiers .c et .h indexés avant chaque commit et valide les sujets de commit par rapport aux Conventional Commits. Le hook pre-push géré par le dépôt exécute le script d'analyse statique avant le push.
Le hook pre-commit nécessite clang-format 18 et échoue sur toute autre version majeure ; voir CONTRIBUTING.md pour les options d'installation.
La démo construit une trame de transfert, la rend en audio, la décode (en vérifiant un aller-retour sans perte), synthétise un coup de batterie et écrit deux fichiers WAV : demo_modem.wav et demo_kick.wav.
Installation et consommation
cmake --install fournit la bibliothèque statique, les en-têtes, un paquet CMake et un fichier pkg-config, de sorte que les deux chemins de consommation fonctionnent immédiatement :
find_package(LibPO32 0.2 REQUIRED)
target_link_libraries(app PRIVATE LibPO32::po32)
cc app.c $(pkg-config --cflags --libs po32) -lm
Exemples
| Commande | Objectif |
|---|---|
./build/po32_example | Aller-retour minimal : encoder, rendre, décoder et vérifier |
./build/po32_demo | Démo de bout en bout : construction/rendu/décodage de trame de transfert plus synthèse de batterie locale |
./build/po32_pattern_editor | Édition interactive de motifs PO-32 et export WAV |
./build/po32_decode_capture <input.wav> <out-dir> | Dumps de paquets et de motifs à partir d'un WAV de transfert |
Projets construits avec libpo32
| Projet | Ce qu'il fait |
|---|---|
| Libpo32 for Schwung | Un module de synthétiseur de batterie à 16 voix pour Schwung sur Ableton Move, propulsé par libpo32 |
API publique
| En-tête | Responsabilité |
|---|---|
core/include/po32.h | Constructeur de transfert, utilitaires de paquets, rendu et décodeur |
core/include/po32_synth.h | Synthétiseur de batterie |
Documentation
| Document | Objectif |
|---|---|
| Architecture | Comment fonctionne le codec |
| Protocole | Détails du format filaire |
| API C | Référence des fonctions C |
| Synthèse | Chemin du signal du synthétiseur |
| Paramètres de patch | Les 21 paramètres |
| Liaisons | Comment écrire une nouvelle liaison de langage |
| Exemples | Programmes d'exemple pris en charge |
| Fuzzing | Harnais de fuzzing et propriétés différentielles |
| Contribuer | Configuration locale, vérifications et conventions de commit |
Structure du projet
| Chemin | Objectif |
|---|---|
core/src | Implémentation C principale |
core/include | En-têtes C publics |
core/examples | Exemples C pris en charge |
core/tests | Couverture de tests principale |
core/fuzz | Harnais libFuzzer pour chaque surface d'entrée non fiable |
core/docs | Notes d'architecture, de protocole et d'API |
bindings/go | Liaisons Go (cgo, englobe toute l'API publique) |
Contribuer
Voir CONTRIBUTING.md pour la configuration locale, les commandes de vérification et la politique Conventional Commits utilisée pour un historique compatible SemVer.
Licence
Copyright (c) 2026 Eric Lewis. Sous licence MIT. Voir LICENSE.