Repository navigation
Releases
libpo 2.0.0
libpo 2.0.0 focuses the repository on the freestanding C library and native tools, improves PO-32 capture compatibility, and documents the current evidence for all supported families.
Breaking change
The in-tree Go module, generated C bundle, Go-specific scripts and CI jobs have been removed. Existing Go consumers must pin an earlier revision. The last main-branch revision containing the module is 2eb1e77. This release does not publish a replacement Go binding.
Fixes and documentation
- PO-32 capture decoding accepts PCM and float WAVEFORMATEXTENSIBLE input with strict subtype validation.
- PO-32 parsing recognizes the one-byte
0x496Fpattern-slot record found in Flat Beat and legacy backups, while retaining checksum and length validation. - Expanded format documentation distinguishes verified field behavior from candidate meanings, including sample-pool references, parameter-only pattern rows, effect footers and retained state.
- README, contribution and release instructions now describe the C library and native tools.
Compatibility and limits
The C API is unchanged. Canonical LibPO::po and pkg-config po interfaces remain available alongside LibPO32::po32, pkg-config po32 and libpo32.a.
Package metadata now reports 2.0.0. The existing 1.0.0 tag retained 0.3.0 in its VERSION file; that historical tag has not been modified.
Selected PO-33 rebuilds and sample replacements have hardware acceptance evidence. This does not validate every edit, allocation size or related device. PO-35/137 speech analysis and synthesis remain approximate, and unknown metadata is preserved rather than assigned guessed meanings.
Validation
- Release CTest: 40/40 passed, including freestanding and installed-package checks.
- ASan/UBSan CTest: 38/38 passed.
- Version synchronization, clang-format 18, cppcheck, Clang static analysis and diff checks passed.
1.0.0
What's Changed
- docs(readme): add downstream projects section by @ericlewis in #19
- docs(changelog): scope 0.3.0 Fixed to user-visible fixes by @ericlewis in #21
- fix(synth): correct parameter maps and stabilize pitch modulation by @ericlewis in #22
- feat: add support for PO-33, PO-35, PO-133, PO-137 by @ericlewis in #23
- feat: expose all libpo model families in one go module by @ericlewis in #24
- docs: cover PO-32, PO-33/133 and PO-35/137 workflows by @ericlewis in #25
Full Changelog: 0.3.0...1.0.0
0.3.0
What's Changed
- chore: move core implementation into core/ directory by @ericlewis in #5
- fix: extreme-exponent handling in strtof import by @ericlewis in #4
- feat(go): add Go bindings for the full public API by @ericlewis in #6
- fix(core): improve allocation checks and float limit by @ericlewis in #9
- feat(core): expose streaming audio APIs by @ericlewis in #8
- fix(core): decode frames with no trailing silence by @ericlewis in #13
- fix(synth): guard zero sample rate and invalid durations by @ericlewis in #16
- fix(dpsk): hold carrier at unit magnitude by @ericlewis in #15
- ci(format): fail on clang-format version mismatch by @ericlewis in #14
- fix(go): support large decoded frames and signal early-stop parse by @ericlewis in #12
- perf(synth): remove per-sample powf, fdiv, and LUT range reduction from the render loop by @ericlewis in #10
- feat(build): add fuzzing, sanitizer CI, and package config by @ericlewis in #11
- chore(release): cut 0.3.0 by @ericlewis in #18
Full Changelog: 0.2.1...0.3.0
0.2.1
Fixed
ARCHITECTURE.mdnow listspo32_patch_import.cas a core module.C_API.mdnow documentsPO32_ERR_PARSE, the streaming modulator API,
andpo32_patch_parse_mtdrum_text(...).README.mdnow lists thepo32_examplecommand in the examples table.
Changed
- Expanded test coverage across all
src/andexamples/files, covering
error paths, edge cases, and previously untested branches in the import
parser, synth renderer, frame builder, and example programs. - Add license scan report and status by @fossabot in #2
- fix(import): bound exponent parsing and add helper coverage by @ericlewis in #3
New Contributors
Full Changelog: 0.2.0...0.2.1
0.2.0
This release focuses on correctness and usability for real PO-32 pattern transfers.
Fixed
- Corrected pattern packet encode/decode to match the verified on-device wire layout:
16trigger bytes, then16morph pairs, repeated four times. - Fixed pattern trigger handling to follow verified wire semantics: a zero low nibble means an empty step, and active triggers require a non-zero fill-rate nibble.
- Resolved cases where patterns decoded correctly locally but landed on the wrong steps or instruments on real PO-32 hardware.
Added
- High-level pattern builder helpers:
po32_pattern_init(...)po32_pattern_clear(...)po32_pattern_set_trigger(...)po32_pattern_clear_trigger(...)po32_pattern_clear_step(...)po32_pattern_set_accent(...)
po32_pattern_step_tand decodedpo32_pattern_packet_t.steps[]as the primary pattern editing surface.po32_decode_captureexample for decoding transfer WAVs into normalized frame dumps, per-packet payloads, and compact pattern summaries.- Starter presets in
po32_pattern_editorfor quick hardware-safe pattern export.
Changed
po32_pattern_packet_tno longer exposes rawtrigger_lanes[]; pattern data is edited through decoded step entries and builder helpers.- The core is fully freestanding C99, with self-contained replacements for libc-dependent helpers.
- Release docs were revised for clearer protocol, API, and usage documentation.
Verification
./scripts/check-version-sync.sh./scripts/ci-verify.sh core
Tag: 0.2.0