一个用于 Teenage Engineering PO-32 声学数据传输和鼓合成的小型 C99 库。
libpo32 重新实现了 PO-32 Tonic 传输协议栈以及兼容的鼓声部模型。它不是完整的 PO-32 固件或 UI 模拟器;它涵盖了构建、发送、接收和预览 PO-32 传输所需的包格式、声学调制解调器、帧解码器和本地鼓合成。
| 领域 | libpo32 提供的内容 |
|---|---|
| 传输协议 | 构建和解析 PO-32 音色、模式和状态包 |
| 声学调制解调器 | 将传输帧渲染为 DPSK 音频,用于回放到设备 |
| 解码器 | 从传输音频中恢复归一化帧和包 |
| 鼓合成 | 本地渲染 PO-32 的 21 参数鼓声部,用于预览和测试 |
核心是 freestanding C99:无 libc 运行时、无外部 DSP 库、无平台音频 API、无文件 I/O。仅使用 freestanding 头文件 <stddef.h> 和 <stdint.h>。适用于嵌入式目标和裸机环境。
当您传输音色或模式时,PO-32 接收的不是成品鼓音频。它接收的是结构化数据:
| 数据 | 含义 |
|---|---|
| 音色包 | 每个乐器的两个音色端点(Left 和 Right),目标乐器槽位编码在包中 |
| 模式包 | 哪些乐器在哪些步骤上触发,目标模式槽位编码为 pattern_number |
| 状态包 | 速度、摇摆、变形默认值以及传输的模式列表 |
然后设备使用其内部合成引擎将这些参数转换为声音。
在高层面上,使用真实硬件的流程是:
| 步骤 | 您要做的 |
|---|---|
| 1 | 在软件中根据音色、模式和状态数据构建传输 |
| 2 | 将该传输渲染为 WAV 或实时音频流 |
| 3 | 将 PO-32 置于其正常的接收/导入流程 |
| 4 | 将渲染的传输音频播放到设备中 |
从仓库根目录开始,配置、构建、运行测试,然后运行演示程序:
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 钩子,该钩子在每次提交前对暂存的 .c 和 .h 文件运行 clang-format,并根据 Conventional Commits 验证提交主题。仓库管理的 pre-push 钩子在推送前运行静态分析脚本。
pre-commit 钩子需要 clang-format 18,并且如果使用任何其他主版本会失败;安装选项请参阅 CONTRIBUTING.md。
演示程序会构建一个传输帧,将其渲染为音频,再解码回来(验证无损往返),合成一次鼓击,并写入两个 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 | 最小往返:编码、渲染、解码和验证 |
./build/po32_demo | 端到端演示:传输帧构建/渲染/解码以及本地鼓合成 |
| 项目 | 功能 |
|---|---|
| Libpo32 for Schwung | 适用于 Ableton Move 上 Schwung 的 16 声部鼓合成器模块,由 libpo32 驱动 |
| 头文件 | 职责 |
|---|---|
core/include/po32.h | 传输构建器、包辅助函数、渲染器和解码器 |
core/include/po32_synth.h | 鼓合成器 |
请参阅 CONTRIBUTING.md 了解本地设置、验证命令以及用于 SemVer 友好历史的 Conventional Commits 策略。
版权所有 (c) 2026 Eric Lewis。根据 MIT 许可证授权。请参阅 LICENSE。
| 5 | PO-32 解码这些包,并将它们写入这些包中指定的音色或模式槽位 |
./build/po32_pattern_editor | 交互式 PO-32 模式编辑和 WAV 导出 |
./build/po32_decode_capture <input.wav> <out-dir> | 从传输 WAV 中导出包和模式转储 |
| 文档 | 用途 |
|---|
| 架构 | 编解码器的工作原理 |
| 协议 | 线格式详情 |
| 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) |