
Bibliothèque C99 pour les transferts acoustiques du PO-32 et la synthèse de batterie.
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.
| 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.
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 |
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.
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
| 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 |
| 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 |
| 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 |
| 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 |
| 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) |