
libpo32 v0.3.0
PO-32 음향 전송 및 드럼 합성을 위한 C99 라이브러리
libpo32
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와 함께 사용하기
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 훅이 활성화되어 각 커밋 전에 스테이징된 .c 및 .h 파일에 대해 clang-format을 실행하고 커밋 제목을 Conventional Commits에 대해 검증합니다. 저장소 관리 pre-push 훅은 푸시 전에 정적 분석 스크립트를 실행합니다.
pre-commit 훅은 clang-format 18이 필요하며 다른 주요 버전에서는 실패합니다. 설치 옵션은 CONTRIBUTING.md를 참조하세요.
데모는 전송 프레임을 구축하고, 오디오로 렌더링하고, 다시 디코딩하여(무손실 왕복 검증) 드럼 히트를 합성하고, demo_modem.wav와 demo_kick.wav 두 개의 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 | 종단 간 데모: 전송 프레임 구축/렌더링/디코딩 및 로컬 드럼 합성 |
./build/po32_pattern_editor | 대화형 PO-32 패턴 편집 및 WAV 내보내기 |
./build/po32_decode_capture <input.wav> <out-dir> | 전송 WAV에서 패킷 및 패턴 덤프 |
libpo32로 구축된 프로젝트
| 프로젝트 | 기능 |
|---|---|
| Libpo32 for Schwung | libpo32 기반 Ableton Move용 Schwung 16-음성 드럼 신디사이저 모듈 |
공개 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 래핑) |
기여
로컬 설정, 검증 명령, SemVer 친화적 히스토리에 사용되는 Conventional Commits 정책은 CONTRIBUTING.md를 참조하세요.
라이선스
Copyright (c) 2026 Eric Lewis. MIT 라이선스에 따라 라이선스가 부여됩니다. LICENSE를 참조하세요.