一个用于 Teenage Engineering PO-32 声学数据传输和鼓合成的小型 C99 库。
libpo32 重新实现了 PO-32 Tonic 传输栈和一个兼容的鼓音色模型。它不是完整的 PO-32 固件或 UI 模拟器;它涵盖了构建、发送、接收和预览 PO-32 传输所需的包格式、声学调制解调器、帧解码器和本地鼓合成。
| 领域 | libpo32 提供的内容 |
|---|---|
| 传输协议 | 构建和解析 PO-32 音色、模式及状态包 |
| 声学调制解调器 | 将传输帧渲染为 DPSK 音频,以便播放给设备 |
| 解码器 | 从传输音频中恢复归一化帧和包 |
| 鼓合成 | 在本地渲染 PO-32 的 21 参数鼓音色,用于预览和测试 |
核心是独立的 C99 代码:无需 libc 运行时、无外部 DSP 库、无平台音频 API、无文件 I/O。仅使用了独立头文件 <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 钩子会在推送前运行静态分析脚本。
演示程序会构建一个传输帧,将其渲染为音频,然后解码回来(验证无损往返),合成一个鼓点,并写入两个 WAV 文件:demo_modem.wav 和 demo_kick.wav。
| 命令 | 用途 |
|---|---|
./build/po32_example | 最小往返:编码、渲染、解码并验证 |
./build/po32_demo | 端到端演示:传输帧的构建/渲染/解码以及本地鼓合成 |
| 头文件 | 职责 |
|---|---|
core/include/po32.h | 传输构建器、包辅助函数、渲染器与解码器 |
core/include/po32_synth.h | 鼓合成器 |
请参阅 CONTRIBUTING.md 了解本地设置、验证命令以及用于语义化版本友好历史的 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/docs | 架构、协议和 API 说明 |
bindings/go | Go 绑定(cgo,封装了完整公共 API) |