Custom .ZDL effects for Zoom MultiStomp pedals, plus the reverse-engineered
toolchain used to build them.
The ready-to-load effects are in dist/. Point Zoom Effect Manager at
that folder, or download individual .ZDL files from it. You do not need the
build toolchain unless you want to modify or rebuild effects.
Use Zoom Effect Manager 2.3.3 or newer.
- Open Zoom Effect Manager, connect your pedal, then open
Settings. - Choose
Read Effects from folderand select this repo's dist/ folder.
- In the effect browser, enable
Effects from devicesandFrom Folder. - Add the desired effects to the device and write them with Zoom Effect Manager.
Back up your current effect list before writing. This project is still reverse engineering firmware behavior, and experimental builds can crash or freeze a pedal until power-cycled.
More detailed install notes live in docs/INSTALLING-ZDLS.md.
Hardware testing is still narrow. Treat every model outside the confirmed row as unverified until someone reports a clean load and audio test.
| Device family | Status |
|---|---|
| Zoom MS-70CDR firmware 2.10 | Primary hardware target; current release effects have been developed against this pedal. |
| Other ZDL-based Zoom MultiStomp pedals | Unconfirmed. They may load compatible ZDLs, but need hardware reports. |
| Newer Zoom ZD2-based pedals | Not supported by these ZDL builds. |
Start from src/airwindows/gain/ if you want the
smallest working custom effect. Copy that directory, give the effect a new
name and unused fxid in manifest.json, then update the C audio function and
build.py to use the new names. Add the new build script to
build_all.py once it builds on its own.
Keep the first hardware test boring: audio_nop: true or tiny pass-through
DSP, no large static state, no heap, and no new runtime helper calls. The safe
path is documented in docs/SAFE-DSP-RULES.md and the
effect directory conventions are summarized in
src/airwindows/README.md.
- Only the Zoom MS-70CDR firmware 2.10 has been tested seriously so far.
- Experimental builds can freeze or crash the pedal until it is power-cycled.
ToTape9.ZDLcurrently crashes on load on the test MS-70CDR. The next debugging split is the load shape itself: audio-NOP, parameter/edit-handler count, and helper-symbol usage.- Parameter scaling is part of the porting work. A port should not be called source-equivalent until its raw knob ranges have been confirmed on hardware.
- These are
.ZDLbuilds, not.ZD2builds.
Start here if you want more than the download folder:
| Doc | What it covers |
|---|---|
| docs/INSTALLING-ZDLS.md | Step-by-step Zoom Effect Manager folder install. |
| docs/ZDL-REVERSE-ENGINEERING-STATUS.md | Current map of the ZDL wrapper, runtime ABI, and known state fields. |
| docs/STATE-ABI-PROGRESS.md | Hardware probe log and findings we do not want to lose. |
| docs/AIRWINDOWS-1TO1-PORT-ROADMAP.md | Roadmap for making honest source-equivalent Airwindows ports. |
| docs/AIRWINDOWS-EXACT-PORTS.md | Rules for what can and cannot be called a 1:1 Airwindows port. |
| docs/SAFE-DSP-RULES.md | Pedal-safe DSP/linking constraints learned from hardware failures. |
| docs/3-PARAM-LINKER-BUG.md | Investigation of the old edit-mode parameter-count bug. |
| docs/TI-PDF-NOTES.md | Notes distilled from the TI C6000 manuals in this folder. |
| docs/CONTRIBUTING.md | Hardware-test asks and contribution notes. |
| docs/sprab89b.pdf | TI C6000 application note reference. |
| docs/sprui03f.pdf | TI C6000 compiler/toolchain reference. |
| docs/sprui04g.pdf | TI C6000 assembly/linker tools reference. |
| build/ABI.md | Low-level linker/runtime ABI reference for developers. |
Building requires Python 3.10+ and TI C6000 Code Generation Tools. Installing prebuilt effects from dist/ does not.
The build scripts currently expect the TI compiler here:
/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c6000_8.5.0.LTS
On Linux, Windows, or another Code Composer Studio install, update TI_ROOT in
the relevant src/airwindows/*/build.py.
Build release effects:
python3 -B build_all.pyBuild one effect:
python3 -B build_all.py stereochorus
python3 -B build_all.py totape9Build diagnostic/probe effects too:
python3 -B build_all.py --allThe default build intentionally keeps dist/ clean and release-focused. Diagnostic ZDLs are useful for development, but should not be mixed into the download folder.
This repo builds loadable Zoom .ZDL effects without Zoom's unreleased SDK.
The core pieces are:
| Path | Purpose |
|---|---|
| build/linker.py | Static linker: TI C6000 .obj -> complete Zoom .ZDL. |
| src/airwindows/ | Effect sources, manifests, images, and per-effect build scripts. |
| src/hardware_probes/ | Diagnostic ZDLs used to map the pedal runtime ABI. |
| dist/ | Release .ZDL files for users. |
| stock_zdls/ | Tracked 830-file stock ZDL corpus used for comparison. |
The important recent finding is that custom effects can use the host-managed
large state descriptor at ctx[3]. That is what made the stateful
StereoChorus port possible. ToTape9 is now testing the next boundary:
whether a much larger 9-parameter tape kernel can use the same state strategy
without tripping load-time handler, relocation, or helper-symbol issues.
Known runtime map for custom ZDLs:
| Field | Meaning |
|---|---|
ctx[1] |
parameter float table |
ctx[4] |
dry/guitar input buffer |
ctx[5] |
current effect buffer, 8 left samples then 8 right samples |
ctx[6] |
output accumulator for effects that add instead of processing in place |
ctx[11] / ctx[12] |
magic shuttle; preserve every audio call |
ctx[2] + 0x10 / ctx[2] + 0x18 |
small persistent per-instance state blocks |
ctx[3][0..2] |
large per-instance descriptor: base, end, byte span |
Parameter scaling is not universal across every handler path. StereoChorus
showed that the current release handler path behaves like normalized 0..1
knob floats, while older helper assumptions saturated around UI value 14.
Effects that claim source-compatible control laws should document how their raw
parameter scaling was confirmed.
ZoomMultistompZDL/
βββ README.md
βββ build/ linker, ELF/ZDL helpers, stock-derived handler blobs
βββ docs/ install notes, ABI status, hardware probe logs
βββ dist/ release ZDLs to load in Zoom Effect Manager
βββ src/hardware_probes/ diagnostic ZDLs for runtime ABI experiments
βββ src/airwindows/ effect sources, manifests, and build scripts
βββ stock_zdls/ tracked 830-file stock ZDL corpus used for comparison
βββ build_all.py release/probe build entrypoint
Several research references are useful locally but are intentionally ignored by git, so they are not part of this repo checkout:
airwindows-ref/ optional full Airwindows source tree
zoom-fx-modding-ref/ optional community ZDL notes and disassembly walkthroughs
ZoomPedalFun-main/ optional independent Zoom firmware RE work
If you clone those beside the repo, keep treating them as read-only references.
Hardware reports are gold. When testing a ZDL, please include:
| Item | Example |
|---|---|
| Pedal model and firmware | MS-70CDR firmware 2.10 |
| ZDL filename and commit | StChorus.ZDL @ cee0d8a |
| Load result | boots, freezes on startup, freezes on unbypass |
| Audio result | bypass, dry passthrough, chorus works, high-pitched tone |
| Parameter behavior | Speed works 0..100, Depth saturates, page 2 knob missing |
Open an issue or PR with findings. Keep experimental claims precise: "boots on my MS-70CDR" is more useful than "works everywhere."
Repository code is MIT unless a file says otherwise. Airwindows plugin DSP is MIT by Chris Johnson/Airwindows. Zoom firmware, stock effects, and third-party reference material are owned by their respective authors and are used only for interoperability and reverse-engineering research.

