op1-overdub, image 1 from its README
1/10
Mod

op1-overdub

Loud80/100

https://wsbuck.github.io/op1-overdub/

op1-overdub is a mod for the Teenage Engineering OP-1, by @wsbuck. Latest release v1.0 (October 2026), 1 star on GitHub.

forTeenage Engineering OP-1·by@wsbuck

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

Downloads
0
Star
1
Fork
1
Commits
147
Last commit
Download v1.0

overdub-1.0.zip· 1.5 MB

Custom license· wsbuck/op1-overdub·downloads come from the creator’s GitHub releases

147
Commits
1
Releases
147 commits and 1 release in the last year
Activity · last 12 months

overdub

op1-overdub: new synth engines, FX with animated screens, and keyboard modes for the original OP-1 (firmware 246). They are patched into TE's own firmware: every stock engine, FX and feature keeps working. Like an overdub on tape, it adds new layers over TE's firmware without erasing anything underneath.

Not affiliated with or supported by teenage engineering. You flash this at your own risk (see Safety).

va vawavetable wavetable
grain grainensemble ensemble
pingpong pingpongdistortion distortion

Every knob drives part of the picture, in its own colour.

FX screens in motion
choirpingpong
pedal modeswah

What's in it

Synth engines (in the engine list with their own presets and screens)

enginebluegreenwhiteorange
va: two-oscillator virtual analog with sub and noise (no filter: use the filter FX)wave (sine → saw → square → pulse)osc 2 detunenoisesub (square, octave down)
wavetable: 8 banks of morphing wavetables, plus SAMPLE: a bank built from any sampler slot (green fully clockwise)positionbankwarpunison
grain: granular; plays a built-in bank, or the sample in any sampler slotpositiongrain sizedensityspray

FX (on synth, drum and master; stereo as master FX)

FXbluegreenwhiteorangescreen
ensemble: BBD chorus, CE-2 style by defaultratedepthcharacter (CE solo → Juno-style dual → three-tap string ensemble)mixa choir
pingpong: ping-pong delaytime: free 20 ms … 1.28 s, then tempo-synced 1/32 … 1/2 (dotted, triplets)feedbacktonemixtable tennis
distortion: TUBE, MUFF, FUZZ, CLIP, FOLD, CRUSHdrivevoice (low-pass ↓, wah ↑)charactermixtwo pedals

Keyboard

  • HOLD: SHIFT + T2 on the synth screen latches released notes; again to release.
  • CHORD: hold SHIFT and play a chord (up to 4 notes); then every key plays that shape. SHIFT + one key turns it off.

Install

  1. Download stock firmware 246 from TE: https://teenage.engineering/_software/op-1/op1_246.op1.
  2. Download overdub-*.zip from Releases and unzip it.
  3. python3 apply.py op1_246.op1 (Python 3.10+, no other dependencies) asks which features to install and writes OVERDUB.OP1. It checks that your file is stock 246 and that the result is exactly the expected image for your choice.
  4. On the OP-1: hold COM while switching on, press 1 (upload firmware), connect USB, copy OVERDUB.OP1 to the OP-1 disk, eject. Same procedure as an official update.

Choosing features

Every engine, FX, HOLD and CHORD can be left out. In a terminal apply.py shows a checklist with everything on; type numbers to toggle, Enter to install. Or choose with flags:

python3 apply.py --list                               # the features in this release
python3 apply.py op1_246.op1 --all                    # everything, no questions (also the default when not in a terminal)
python3 apply.py op1_246.op1 --without amp,crush      # everything except these
python3 apply.py op1_246.op1 --only va,grain,hold     # only these

A left-out engine or FX stays in the firmware with the same name and id but is not listed in the browsers (its engine/FX list entry, presets and kits are not installed), so a sound saved with it still loads. A left-out HOLD or CHORD is switched off: SHIFT+T2 and SHIFT+keys behave as on stock firmware.

The release contains only our code, our database rows (engine/FX names and presets) and our SVG screens. TE's firmware never leaves your computer.

Safety

  • The bootloader is never touched. te-boot.ldr stays byte-identical to stock (the tools refuse otherwise), so you can always go back: hold COM at power-on, upload stock op1_246.op1.
  • Before going back to stock, delete sounds saved with these engines or FX. Stock firmware doesn't know their names and stops at boot on such a sound. If that happens: COM at power-on, then factory reset.
  • Never name a firmware file with FRC, RBT or KEY in it: the OP-1's updater treats those as commands. apply.py and build.py refuse such names.

Build from source

Needs Docker and Python 3.10+.

docker build -t op1-bfin tools/docker          # ADI's bfin-elf GCC 4.3 toolchain (x86_64; runs under emulation on Apple silicon)
python3 build.py                               # everything; downloads stock 246 into firmware/stock/
python3 build.py --engines grain --fx distortion --no-hold --name MINE
python3 build.py --without crush --name MINE           # the image with a feature left out (the zip keeps them all)

Outputs firmware/images/<NAME>.OP1 and the shareable dist/overdub-<version>.zip. firmware/ holds TE's firmware and anything built from it: it is gitignored, never commit or share it. DSP is checked in the Blackfin simulator first (src/engine/test/, src/slot/test/). Screens render on the computer too: python3 src/slot/test/preview.py OUTDIR 15 k0 k1 k2 k3 ... (engine ids 15 va, 16 wavetable, 18 grain; 108–110 the FX as master). CLEAN=1 gives the README screenshots in docs/screens/.

How it works

Short version: the update file has a checksum but no signature, almost all of the app is unencrypted, and the boot ROM loads the app as a list of "copy these bytes here" blocks. We append blocks that put our code in RAM that TE's firmware doesn't use and repoint a few of TE's tables at it. Details, with what is confirmed and what is a hypothesis:

Everything is tied to firmware 246 (addresses change with any TE update).

Credits

  • op1repacker (op1hacks): the hidden iter engine and filter FX, and the iter presets our presets start from.
  • op1-decryptor (TabascoEye) and op1dumps (Tolsi): reading the encrypted part of the firmware for research. Nothing from them is needed to build or apply.
  • ghidra-blackfin: Blackfin support for Ghidra.

MIT License (see LICENSE).