
libpo32 v0.3.0
Библиотека на C99 для акустической передачи и синтеза ударных для PO-32.
libpo32
Небольшая библиотека на C99 для акустической передачи данных и синтеза ударных для Teenage Engineering PO-32.
libpo32 перереализует стек передачи PO-32 Tonic и совместимую модель голоса ударных. Это не полный эмулятор прошивки или интерфейса PO-32; она охватывает формат пакетов, акустический модем, декодер кадров и локальный синтез ударных, необходимые для создания, отправки, приёма и предпросмотра передач PO-32.
Содержание
- Обзор
- Использование с PO-32
- Начало работы
- Примеры
- Проекты, созданные с помощью libpo32
- Публичный API
- Документация
- Структура проекта
- Участие в разработке
- Лицензия
Обзор
| Область | Что предоставляет libpo32 |
|---|---|
| Протокол передачи | Создание и разбор пакетов патчей, паттернов и состояния PO-32 |
| Акустический модем | Рендеринг кадров передачи в DPSK-аудио для воспроизведения в устройство |
| Декодер | Восстановление нормализованных кадров и пакетов из аудио передачи |
| Синтез ударных | Локальный рендеринг 21-параметрового голоса ударных PO-32 для предпросмотра и тестирования |
Ядро — автономный C99: без рантайма libc, без внешних DSP-библиотек, без платформенных аудио-API, без файлового ввода-вывода. Используются только автономные заголовки <stddef.h> и <stdint.h>. Подходит для встраиваемых и bare-metal сред.
Использование с PO-32
PO-32 не получает готовое аудио ударных при передаче звука или паттерна. Он получает структурированные данные:
| Данные | Значение |
|---|---|
| Пакеты патчей | Две конечные точки патча на инструмент (Left и Right), с закодированным в пакете слотом назначения инструмента |
| Пакеты паттернов | Какие инструменты срабатывают на каких шагах, со слотом назначения паттерна, закодированным как pattern_number |
| Пакет состояния | Темп, свинг, значения морфинга по умолчанию и список переданных паттернов |
Затем устройство использует собственный внутренний синтезаторный движок для преобразования этих параметров в звук.
На высоком уровне рабочий процесс с реальным оборудованием выглядит так:
| Шаг | Что вы делаете |
|---|---|
| 1 | Создаёте передачу в программном обеспечении из данных патчей, паттернов и состояния |
| 2 | Рендерите эту передачу в WAV или живой аудиопоток |
| 3 | Переводите PO-32 в обычный режим приёма/импорта |
| 4 | Воспроизводите отрендеренное аудио передачи в устройство |
| 5 | PO-32 декодирует пакеты и записывает их в слоты звуков или паттернов, указанные внутри этих пакетов |
Начало работы
Из корня репозитория настройте, соберите, запустите тесты, затем демо:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
ctest --test-dir build --output-on-failure
./build/po32_demo
Опционально, но рекомендуется для локальной разработки:
./scripts/install-git-hooks.sh
Это включает управляемый репозиторием pre-commit хук, который запускает clang-format на подготовленных .c и .h файлах перед каждым коммитом и проверяет темы коммитов на соответствие Conventional Commits. Управляемый репозиторием pre-push хук запускает скрипт статического анализа перед push.
Pre-commit хук требует clang-format 18 и завершается ошибкой при любой другой основной версии; см. CONTRIBUTING.md для вариантов установки.
Демо создаёт кадр передачи, рендерит его в аудио, декодирует обратно (проверяя без потерь roundtrip), синтезирует удар барабана и записывает два WAV-файла: demo_modem.wav и demo_kick.wav.
Установка и использование
cmake --install поставляет статическую библиотеку, заголовки, CMake-пакет и pkg-config файл, поэтому оба пути потребления работают из коробки:
find_package(LibPO32 0.2 REQUIRED)
target_link_libraries(app PRIVATE LibPO32::po32)
cc app.c $(pkg-config --cflags --libs po32) -lm
Примеры
| Команда | Назначение |
|---|---|
./build/po32_example | Минимальный roundtrip: кодирование, рендеринг, декодирование и проверка |
./build/po32_demo | Сквозное демо: создание/рендеринг/декодирование кадра передачи плюс локальный синтез ударных |
./build/po32_pattern_editor | Интерактивное редактирование паттернов PO-32 и экспорт в WAV |
./build/po32_decode_capture <input.wav> <out-dir> | Дампы пакетов и паттернов из WAV передачи |
Проекты, созданные с помощью libpo32
| Проект | Что он делает |
|---|---|
| Libpo32 for Schwung | Модуль синтезатора ударных на 16 голосов для Schwung на Ableton Move, работающий на libpo32 |
Публичный API
| Заголовок | Ответственность |
|---|---|
core/include/po32.h | Создатель передачи, помощники пакетов, рендерер и декодер |
core/include/po32_synth.h | Синтезатор ударных |
Документация
| Документ | Назначение |
|---|---|
| Архитектура | Как работает кодек |
| Протокол | Детали формата передачи |
| C API | Справочник по функциям C |
| Синтез | Сигнальный путь синтезатора |
| Параметры патчей | 21 параметр |
| Привязки | Как написать новую языковую привязку |
| Примеры | Поддерживаемые примеры программ |
| Фаззинг | Фаззинг-харнессы и дифференциальные свойства |
| Участие в разработке | Локальная настройка, проверки и соглашения о коммитах |
Структура проекта
| Путь | Назначение |
|---|---|
core/src | Основная реализация на C |
core/include | Публичные C-заголовки |
core/examples | Поддерживаемые примеры на C |
core/tests | Покрытие тестами ядра |
core/fuzz | libFuzzer харнессы для каждой поверхности недоверенного ввода |
core/docs | Заметки по архитектуре, протоколу и API |
bindings/go | Go-привязки (cgo, оборачивают полный публичный API) |
Участие в разработке
См. CONTRIBUTING.md для локальной настройки, команд проверки и политики Conventional Commits, используемой для SemVer-совместимой истории.
Лицензия
Copyright (c) 2026 Eric Lewis. Лицензировано по MIT License. См. LICENSE.