libpo32

작고 간결한 C99 라이브러리로, Teenage Engineering PO-32의 음향 데이터 전송 및 드럼 합성을 지원합니다.
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를 일반 수신/가져오기 흐름으로 전환합니다. |
시작하기
저장소 루트에서 다음을 실행하여 설정, 빌드, 테스트, 데모를 수행합니다:
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 |
공개 API
문서
프로젝트 구조
기여하기
로컬 설정, 검증 명령어 및 SemVer 친화적인 기록을 위한 Conventional Commits 정책은 CONTRIBUTING.md를 참조하세요.
라이선스
Copyright (c) 2026 Eric Lewis. MIT 라이선스에 따라 라이선스가 부여됩니다. LICENSE를 참조하세요.