Firmware

po-backup-decode

Hype29/100

Demodulate and decode Teenage Engineering PO-33 sound and pattern transfer WAVs

po-backup-decode is custom firmware for the Teenage Engineering PO-33 K.O!, by @danielpradilla. Open source under MIT, 3 stars on GitHub.

forTeenage Engineering PO-33 K.O!·by@danielpradilla

Unclaimed. Is this yours? Sign in with GitHub as @danielpradilla to claim it.

Downloads
0
Stars
3
Fork
1
Commit
1
Last commit
Get the source

No release files yet. Build from source.

MIT· danielpradilla/po-backup-decode·downloads come from the creator’s GitHub releases

1
Commits
0
Releases
1 commit and 0 releases in the last year
Activity · last 12 months

po-backup-decode

Single-file Python tool that demodulates a Teenage Engineering PO-33 sound and pattern transfer WAV, then exports the decoded packet data, raw sample bytes, patterns, BPM and audition WAVs.

The module is po33_decode.py and the installed command is po33-decode. Only the PO-33 transfer format is decoded here; see Known limits.

This repository contains no device material. You supply the transfer recording, either captured from your own unit or downloaded from the manufacturer's PO-33 page. The tool reads that file and writes plain output; it never contacts a network.

The protocol description is in docs/FORMAT.md.

Requirements

Python 3.9 or newer, NumPy, and a stereo 8-, 16- or 24-bit PCM WAV of the transfer. No other runtime dependency.

pip install numpy

Usage

python3 po33_decode.py                       # self-checks only, no input file needed
python3 po33_decode.py transfer.wav out/     # decode
python3 po33_decode.py transfer.wav out/ --symbol-rate 7812.485
python3 po33_decode.py transfer.wav out/ --codec signed8

The output folder must not exist; the tool refuses to overwrite one. It validates the whole transfer before writing anything, so a bad packet CRC, a missing end marker or a truncation leaves no partial output.

Install as a command with pipx install . after cloning, or run the file directly.

Options

OptionEffect
--symbol-rate HZFix the symbol clock instead of auto-calibrating it. Accepted range 7500 to 8100 Hz, nominal 7812.5.
--codec mulawDefault. Treat each audio byte as a signed G.711 mu-law code.
--codec signed8Treat each audio byte as linear signed 8-bit, for comparison.

Auto-calibration is the default because the two official transfers observed here run at approximately 7,812.485 Hz and approximately 7,812.185 Hz. Both are close to nominal but differ enough that a fixed clock fails on the longer capture.

Output files

FileContents
manifest.jsonSource file name and SHA-256, detected input format, symbol rate, packet counts, BPM, per-object trim and source references, unresolved trims, codec, counts.
transfer.binPacked, whitened wire bytes through the validated end packet.
packets.binDewhitened packet headers, payloads and CRCs, concatenated.
configuration-0.bin, configuration-1.binThe two 255-byte configuration payloads. Byte 129 of the second payload is the BPM value.
pattern-01.bin to pattern-16.binThe 16 pattern payloads, 1,032 bytes each.
audio-NNN.pcm8Raw owner audio bytes before waveform expansion, including 4,096-byte padding.
slot-NN.wav, slot-NN-pad-NN.wavIndividually trimmed audition sounds, resampled to 44.1 kHz mono 16-bit.

Melodic slots 1 to 8 come from objects 0 to 7. Sliced slots 9 to 16 come from objects 8 to 135, with 16 pads per slot. Object and WAV counts are not counts of independent original recordings, because several objects refer to different slices of one recording.

Verified and inferred

The split matters when you use the output.

ResultStatus
Transport demodulationVerified: both official transfers and three independent controlled captures decode with every packet CRC and the end marker accepted.
Raw audio bytesVerified: exact recovered bytes, written to audio-*.pcm8 before any conversion.
Trim endpoints and source referencesRecovered bytes. Inclusive-end interpretation is inferred from factory lengths such as 0 to 4,095.
Pattern payloadsVerified bytes, 1,032 per pattern. The note and effect layout is not mapped, so patterns do not reconstruct the original songs.
BPMVerified by a controlled round trip: only byte 129 of the second configuration payload changes between BPM 60 and 61.
Audition WAV conversionInferred. Assumes a native rate of 23,437.5 Hz and a monotonic signed ordering of mu-law codes. Not compared with hardware.
Hardware soundNot established. Nothing here has been verified against a physical unit's output.

Known limits

  • Compatibility with PO-133, PO-35 and PO-137 is not established. Their guides document a backup and restore facility, but no decoder for their formats was verified here. Do not assume this format applies to them.
  • Ten slice references in one observed transfer point past the end of the recovered source audio even though every CRC passes. Those entries are flagged in manifest.json and get no WAV. No audio is fabricated or clamped for them.
  • The tool decodes sound and pattern data. It does not write transfers back to hardware and does not reconstruct songs.

Verify

python3 po33_decode.py

The self-check needs no input and covers stereo packing under all four phase rotations, the captured official reset packet, CRC-rejection and truncation-rejection paths, sample alias handling, an out-of-range alias retained without a WAV, duplicate-selector rejection and the audio conversion endpoints. Continuous integration runs the same check on Python 3.9 and 3.12.

Legal

This tool ships no manufacturer material. Device factory audio and any decoded output are Teenage Engineering's material, and third-party samples may be present in a transfer you did not create. Teenage Engineering's published terms permit use of that material in the creation, performance, recording and distribution of your own original creation, and prohibit redistributing, reselling, leasing, sharing, reproducing or publicly displaying it in its original or modified form unless it is substantially transformed into an original creation. See teenage.engineering/ip-rights-te-products.

Publishing decoded samples is your decision and your risk; this repository only provides the decoder. This is not legal advice.

Not affiliated with, authorised by or endorsed by Teenage Engineering AB. Teenage Engineering, Pocket Operator, PO-33 and PO-133 are trademarks of Teenage Engineering AB, used here only to identify the hardware this tool reads.

MIT licensed; see LICENSE.

Prior public work

The format was worked out independently here, and the following public investigations and implementations were consulted. None of their code is included.