A master effect suite for the Elektron Digitone mk1 / Digitone Keys (OS 1.43 and 1.44) and the Digitakt mk1 (OS 1.53 and 1.54), with a new DELAYS module (WRMZ / GRAINZ).
Tone+FX 4.0c is a set of elekloader mods, packaged and released together as one suite. It adds master ring modulation, a low/high-shelf EQ, a Crunch/Redux lo-fi stage, a wavefolder with four fold modes (plus an internal overdrive), a modulation insert with five modes (wobble, pitch shift, flanger, autopan, stereo width) on two pages, a buffer-FX DELAYS module — WRMZ (modulated delay) / GRAINZ (granular cloud), output metering, a twelve-page UI across two master page trees (the six FX pages, the DELAYS page, a static PERFORM page whose 16 trigs are momentary performance pads, plus four one-slider macro pages — WASH / RADIO / DESTROY / SPACE) and an animated TONE+FX boot splash.
Four OS files, two hosts. On the Digitone mk1 / Digitone Keys take
tonefx-4.0c.elemod (OS 1.43) or tonefx-4.0c-os1.44.elemod (OS 1.44). On the
Digitakt mk1 — gdeo607's port, source mirrored under
DIGITAKT PORT/ — take tonefx-4.0c-dt.elemod (OS 1.53) or
tonefx-4.0c-dt-os1.54.elemod (OS 1.54); both now carry the DELAYS module and the
CPU pass too. Each links as core 4.0 > tonefx 4.0c and patches
byte-for-byte against its own stock file. See
its Tone+FX page.
Special thanks to gdeo607, who did most of the work on the Digitakt port — the DT1 render path, page model, keys, pattern store and its cross-platform release tooling are his.
This repository is release-only: it ships the built .elemod packages and
the docs to install them, plus a copy of the Digitakt port's source under
DIGITAKT PORT/. It contains no firmware. The Digitone
source lives in the development repo, so this repo stays a safe place to cut
releases from while the older RingTone repo is still around. The Digitakt
mk1 port (OS 1.53 / 1.54) is by gdeo607 (kept in the
digi1_mods project, vendored here). See
HANDOFF.md for the release-side state and the cross-platform
release checklist.
Unofficial and unsupported. Not affiliated with, endorsed by or supported by Elektron. Flashing modified firmware is at your own risk.
Twelve master pages on two trees (FUNC + LFO opens the master pages; LEFT / RIGHT rotates, UP or DOWN switches trees):
- Main scroll — the stock master pages, then our FX pages in play order FOLD · CRUSH · RING · STEREO · PITCH · TILT · DELAYS.
- Macro tree (UP) — PERFORM · WASH · RADIO · DESTROY · SPACE (LEFT/RIGHT cycle within it; UP returns to the FX page you left). PERFORM is not in the main scroll.
Each new FX page has a frameless animated graphic in the leftmost third that collapses to a line when the effect is at neutral; the PERFORM page is static (no animation); the four macro pages each show one vertical slider plus a per-page graphic. Page layout: the mode name is centred over the title, and the depth/rate sliders with their labelled readouts sit in the rightmost third; FUNC + an encoder turn snaps that parameter to 0 % / 100 %.
Main scroll:
| FOLD | CRUSH | RING |
|---|---|---|
![]() |
![]() |
![]() |
| STEREO | PITCH | TILT |
|---|---|---|
![]() |
![]() |
![]() |
DELAYS (WRMZ / GRAINZ — the new buffer-FX page):
| DELAYS |
|---|
![]() |
Macro tree (the static PERFORM page and the four one-slider macros):
| PERFORM | WASH | RADIO | DESTROY | SPACE |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Each macro page is one vertical slider (A on/off, B–H amount) plus a per-page graphic: WASH (wobble + WRMZ wash), RADIO (EQ tilt + TRSH fold + SRR), DESTROY (fold + bits + ring), SPACE (WAVE stereo width).
Any page whose section is switched off draws a small framed OFF box; a page driven by a macro page draws a MACRO box in the same slot.
One file is the whole suite, per device and OS:
| file | device | OS | required core |
|---|---|---|---|
tonefx-4.0c.elemod |
Digitone mk1 / Keys | 1.43 | core-dn1-4.0.elemod |
tonefx-4.0c-os1.44.elemod |
Digitone mk1 / Keys | 1.44 | core-dn1-4.0-os1.44.elemod |
tonefx-4.0c-dt.elemod |
Digitakt mk1 | 1.53 | core-4.0.elemod |
tonefx-4.0c-dt-os1.54.elemod |
Digitakt mk1 | 1.54 | core-4.0-os1.54.elemod |
Each bundles every mod below into a single elekloader mod, so it combines with your other mods. None includes the required core — install the matching core (elekloader provides it) plus anything else you use.
- digimeter — output level metering (drawn on the CRUSH and FOLD pages).
- digieq — master low-shelf / high-shelf EQ (LO + HI knobs).
- digiring — master ring modulator / tremolo, with an animated page.
- digicrush — Crunch / Redux: bit-reduce (BITS), sample-rate hold (REDUX) or a hard-clip drive (CRUNCH), one stateless stage at a time.
- digifold — master wavefolder with CLEAN / MUD / DIST / TRSH fold modes and an internal overdrive; a spiral display.
- digiwave — one modulation engine, two pages: PITCH (WOB pitch wobble, SHFT pitch shift, each with a dry/wet MIX) and STEREO (FLAN flanger, PAN autopan, WIDE stereo width).
- digiwrmz — the DELAYS buffer-FX module: one mono delay line with two modes — WRMZ (modulated delay) and GRAINZ (three drifting granular taps). True-bypass when off.
- digictl — the pages and all the controls; keeps the settings per pattern and adds MIDI CC control, plus the PERFORM page and its momentary trig pads.
- tonesplash — an animated TONE+FX boot splash (one of three animations per boot, drawn at the intro).
Everything is GPL-2.0-or-later (see LICENSE).
- Get elekloader and your own stock OS file (Elektron's download) — the
Digitone
Digitone_and_Digitone_Keys_OS1.43.syx(or your OS 1.44.syx), or the DigitaktDigitakt_OS1.53.syx(or the OS 1.54 official.zip). elekloader builds a custom OS on your machine; it never distributes firmware. - In elekloader's window, add the stock file, then + Install from file… and
pick the matching core (elekloader ships it) and suite:
- Digitone 1.43 —
core-dn1-4.0.elemod+tonefx-4.0c.elemod - Digitone 1.44 —
core-dn1-4.0-os1.44.elemod+tonefx-4.0c-os1.44.elemod - Digitakt 1.53 —
core-4.0.elemod+tonefx-4.0c-dt.elemod - Digitakt 1.54 —
core-4.0-os1.54.elemod+tonefx-4.0c-dt-os1.54.elemodAdd any of your other mods too.
- Digitone 1.43 —
- Tick the core and
tonefx, set the OS version tag, and BUILD FIRMWARE. - Flash the resulting
.syxwith Elektron Transfer, as for any OS update; press YES on the unit and do not power off until it finishes.
Or from the command line (elekloader from source):
# Windows PowerShell (OS 1.43)
./tools/build.ps1 -Stock "Digitone_and_Digitone_Keys_OS1.43.syx" -Out ToneFX.syx -Version 4.0c# POSIX
sh tools/build.sh Digitone_and_Digitone_Keys_OS1.43.syx ToneFX.syx 4.0cRecovery (the bootloader is never changed): hold FUNC while powering on
for the startup menu, press TRIG 4 (OS UPGRADE), then send the stock .syx
with Transfer's legacy OS upgrade mode.
The pages live on the master page tree: FUNC + LFO opens it. Tone+FX
appends eleven of its own after the stock ones and splits them across two
trees — the main scroll (stock pages + the six FX pages, in play order
FOLD · CRUSH · RING · STEREO · PITCH · TILT) and the macro tree
(UP or DOWN: PERFORM · WASH · RADIO · DESTROY · SPACE). LEFT /
RIGHT (or the on-screen < > arrows) rotate within the current tree, and
UP returns from the macro tree to the FX page you left. FUNC + an encoder
turn snaps that parameter to 0 % / 100 %. The stock top status bar (pattern
name, tempo, …) stays visible above every page. PAGE keeps its stock meaning; no
stock key or encoder is taken.
| page | encoders | shows |
|---|---|---|
| RING | A on/off · E depth · F frequency | a centred ring animation |
| FOLD | A on/off · D fold type · E/F/G/H amount | the spiral, the big mode title, the amount slider + L/R meter |
| TILT | A on/off · E low shelf · H high shelf | a bent low/high response curve |
| CRUSH | A on/off · D mode · E amount · F tune | a waveform (left) that is quantised / held / clipped by the mode + L/R meter |
| PITCH | A on/off · D mode · E speed · F depth · G mix | two vertical lines that wobble and intertwine |
| STEREO | A on/off · D mode · E speed · F depth · G mix · H feedback | a horizontal line that ripples / splits / spreads (FLAN shows all four sliders; PAN/WIDE show two) |
| DELAYS | A on/off · D mode (WRMZ/GRAINZ) · B/C/E/F/G/H = TIM, FB, TON, MOD, RAT, MIX (WRMZ) or DEN, SIZ, PIT, SPR, FB, MIX (GRAINZ) | a moving line whose wobble follows MIX; a fixed MIX slider + a secondary slider for the parameter you last moved |
| PERFORM | A ring depth · B fold amount · C crush amount · D wave pitch depth · E wave stereo depth · F EQ low · G EQ high · H wave speed | a static depth readout per FX block; the trigs are momentary pads (see Performance controls) |
Every parameter is 0–127 and moves one step per notch — the stock convention (EQ LOW/HIGH are 0–127 with 64 = flat).
Per-pattern settings (Digitone: one reserved MIDI track, channel 16, packed; Digitakt: a mod-owned RAM table): the settings — including the macro pages — save and reload with the pattern. On the Digitone only that one MIDI track is touched, so channels 1-15 and the synth tracks are unaffected; a fresh pattern adopts the live values. Each page true-bypasses when its A is off (fades out, then stops using CPU). An FX or macro page that is off draws a framed OFF box; a page driven by a macro page draws a MACRO box.
Continuous 0–127 spread over four modes (interpolated, capped at CLEAN/TRSH): CLEAN (36 % fold) · MUD (full fold) · DIST (36 % fold + overdrive) · TRSH (full + overdrive). The overdrive is a stateless saturation, applied only in DIST/TRSH.
WOB — vibrato: a modulated, interpolated short delay. SHFT — pitch shift (±12 st) from two crossfaded grains. E speed, F depth (detune / semitones), G mix (dry/wet).
FLAN — flanger (modulated delay + feedback; feedback capped at 75 % to avoid self-oscillation). PAN — autopan. WIDE — stereo width (64 = bypass). E speed, F depth, G mix (flanger), H feedback (flanger).
BITS — bit-reduce to 24…4 bits, optional TPDF dither (F tune). REDUX — sample-and-hold decimator. CRUNCH — Q8 gain into a hard clip.
One mono delay line, two modes (the wet is mono, mixed into both channels — the dry stays stereo). D switches the mode; A is on/off; B, C, E, F, G, H edit the active mode's six parameters; the page shows a fixed MIX slider and a secondary slider that appears while you move any of the other five.
- WRMZ — a modulated delay: TIM (time), FB (feedback, capped at 0.80), TON (damping), MOD (depth), RAT (0.1–3.0 Hz wow/flutter), MIX.
- GRAINZ — a granular cloud: three drifting, interpolated taps off the same line — DEN (drift), SIZ (tap spacing), PIT (parked), SPR (spread), FB, MIX.
All FX parameters respond to incoming MIDI CC on numbers the Digitone does not use; a CC move is saved with the pattern. On/off switch at value 64; EQ LOW/HIGH are 0–127 with 64 = flat. CCs on any MIDI channel drive the master FX.
| CC | parameter | CC | parameter |
|---|---|---|---|
8 |
RING depth | 40 |
FOLD amount |
11 |
RING on/off | 41 |
FOLD type |
36 |
RING rate | 67 |
EQ on/off |
37 |
FOLD on/off | 68 |
meter on/off |
69 |
EQ low shelf | 96 |
EQ high shelf |
20 |
CRUSH on/off | 21 |
CRUSH mode |
22 |
CRUSH amount | 23 |
CRUSH tune |
24 |
WAVE on/off | 25 |
PITCH mode |
26 |
WAVE speed | 27 |
WAVE depth |
28 |
WAVE mix | 29 |
WAVE feedback |
30 |
STEREO mode | 31 |
WAVE group |
80 |
DELAYS on/off | 81 |
DELAYS mode (WRMZ/GRAINZ) |
82 |
DELAYS 1 (TIM/DEN) | 83 |
DELAYS 2 (FB/SIZ) |
84 |
DELAYS 3 (TON/PIT) | 85 |
DELAYS 4 (MOD/SPR) |
86 |
DELAYS 5 (RAT/FB) | 87 |
DELAYS 6 (MIX) |
Signal order on the master mix is permanent: ring → EQ → crush → fold → PITCH → DELAYS (WRMZ/GRAINZ) → STEREO → ceiling → meter. The WAVE insert is split into its PITCH and STEREO passes so the delay always sits between them. Ring, EQ and fold are on by default.
A static touch page — PERFORM — in the macro tree. Press UP (or DOWN) from any FX page to open the macro tree (it lands on PERFORM), then LEFT / RIGHT to reach the macros; UP returns to the FX page you left. It draws no animation, so it adds no CPU while it is open.
The eight encoders set one depth per FX engine (0–127, one step per notch, saved with the pattern like every other DIGI control). Every engine has its own depth — fold and crush are separate, and the WAVE engine has an independent pitch depth and stereo depth:
| encoder | engine depth | encoder | engine depth |
|---|---|---|---|
| A | RING depth | E | WAVE stereo depth |
| B | FOLD amount | F | EQ low shelf |
| C | CRUSH amount | G | EQ high shelf |
| D | WAVE pitch depth | H | WAVE speed |
The 16 trig keys are momentary performance pads, one block per engine. A block of four pads is four increasing intensities (1–4); the two-pad fold and crush blocks use intensities 2 and 4:
| trigs | block | what the pad drives |
|---|---|---|
| 1 2 9 10 | RING | ring depth |
| 3 4 | FOLD | fold amount |
| 11 12 | CRUSH | crush amount |
| 5 6 13 14 | PITCH | the WAVE pitch depth |
| 7 8 15 16 | STEREO | the WAVE stereo depth |
Hold a pad: it saves the engine's resting value (and its on/off), turns the
engine on, and ramps its depth up to resting + (127 - resting) * intensity / 4, where it holds. Release: the depth ramps back to the pattern value and
the on/off is restored. A pad never writes the per-pattern store, so the
saved value is always the resting position — releasing, leaving the page, or
even saving the project mid-pad leaves your values intact. The ramp is one cheap
step per audio block, so it is smooth and click-free and costs almost nothing
while idle. Because each engine has its own depth, the pads never fight: a pitch
pad cannot move the stereo depth, and a fold pad cannot move crush.
Four one-knob macro pages bundle several engines behind a single amount control. Each shows one vertical slider on the right (A = on/off, B–H = amount) and a per-page animated graphic on the left; the macro drives the engines while it is on and restores them when it turns off.
| page | graphic | what it drives |
|---|---|---|
| WASH | drifting dots (Haze) | WAVE wobble (75% depth / 30% rate at full) + WRMZ delay mix/feedback |
| RADIO | big ring + cone | EQ tilt (low to 0, high to 127 at full) + TRSH fold drive + SRR |
| DESTROY | stair-stepped sine | fold + bit-reduction + ring modulator |
| SPACE | splitting centre line | WAVE stereo width |
Everything runs on the Digitone's main CPU (Core A); the FM DSP (Core B) is untouched. Approximate instructions per active stereo frame (32 frames/block, 1500 blocks/s); a bypassed section costs ~0. Cheapest → heaviest:
| # | block / mode | ≈ insn/frame |
|---|---|---|
| 1 | CRUSH — BITS | ~10 |
| 2 | CRUSH — REDUX | ~12 |
| 3 | meter | ~15 |
| 4 | WAVE — WIDE | ~18 |
| 5 | FOLD — CLEAN/MUD | ~20 |
| 6 | WAVE — PAN | ~24 |
| 7 | CRUSH — CRUNCH | ~25 |
| 8 | RING | ~28 |
| 9 | EQ | ~30 |
| 10 | FOLD — DIST/TRSH | ~35 |
| 11 | WAVE — WOB | ~45 |
| 12 | WAVE — FLAN | ~55 |
| 13 | WAVE — SHFT | ~75 |
Turn off the pages you are not using; each true-bypasses. Full ledger in
docs/OPTIMIZATION.md.
4.0a CPU pass (measured; nothing audible changes): the eMAC mode switch is
hoisted to once per block instead of once per handler; the wave delay lines
are s16 (half their DDR traffic and RAM); the wave mode-change flush spike
is removed (each mode's worst case now equals its p99); and animated pages
redraw at ~5 Hz. The build is size-optimised (-Os): .run 34,398 → 26,018
bytes, and it still imports nothing. The new DELAYS module adds one mono
delay line (the package's RAM is 47,246 bytes, mostly that line). On hardware an
eMAC-off A/B idled lower but ran worse while processing, so the eMAC is
kept. Ledger: docs/OPTIMIZATION-ROUND.md §10–§12 (source repo).
Output ceiling: a final soft limiter keeps the master mix below the 24-bit full scale (transparent below ~-2.5 dBFS, asymptotic max ~-0.7 dBFS), so a hot flanger-feedback / pitch-shift / drive setting cannot hard-clip.
3.5p performance pass (measured; nothing audible changes): page graphics draw
straight to the framebuffer instead of one firmware call per pixel (36 call sites
→ 0); the output meter only scans while its page is up; block-constant branches in
CRUSH/FOLD are hoisted; the per-pattern store is gated off the UI tick; and the
WAVE delay line is shorter. Net: the suite's RAM state dropped to
19,446 bytes (−6.1 KB) and it still imports nothing. Full ledger in the
source repo's docs/OPTIMIZATION.md.
The Digitone's CPU and DSP are shared between the internal FM voices and these added effects, so Tone+FX is a budget you spend: it is happiest when you leave headroom for the synth itself. A few habits keep it clean on a busy unit:
- Turn off the filter on tracks you are not using — set the track's filter type to 0 (off). An idle track's filter still costs CPU for its voices every block; freeing it buys that time back for the master FX.
- A busy pattern has less CPU headroom. More voices, notes and parameter locks on the FM engine leave less for the master FX. On busy patterns, back off RING depth / FOLD amount / CRUSH / WAVE, and turn off the pages you are not using (each true-bypasses to ~0 cost).
- The animated panels are for setting up, not for staying on. The RING / FOLD / TILT / CRUSH / PITCH / STEREO pages redraw every UI frame, and that redraw is CPU while the page is on screen. Dial the effect in, then move on — press UP to the static PERFORM page, or go to any internal page or panel. Once you leave a DIGI page it stops redrawing, and that CPU comes back.
elemods/at the repository root is the current release (this is whatSHA256SUMScovers).releases/holds a packaged copy of each cut release (README,CHANGELOG,LICENSE,SHA256SUMS,elemods/,tools/,Screenshots/and the.zip), newest first.archive/holds superseded releases (e.g.2.1h).
sha256sum -c SHA256SUMS # or: Get-FileHash elemods/* -Algorithm SHA256Tested in the digiemu emulator (boot/settle, dsp_running=2, all twelve
pages incl. DELAYS; a live diag of WRMZ + GRAINZ with real SSI renders —
0 faults; _probe_mix 0 clips; the PERFORM page's live-audio check). The
OS 1.44 port builds and patch-checks clean (digiemu cannot settle 1.44). The
4.0a CPU pass was A/B'd on hardware — the eMAC was kept (it is slower idle but
faster while processing) and the wave mode-change spike is gone. Current package
version is in CHANGELOG.md. No firmware is included or
distributed here; the .elemods carry only our own code and patch sites
(byte-checked against your stock file at build time).
Tracked as they come up; nothing here blocks normal use.
Bugs / rough edges we want fixed
PAGE still jumps some FX levels: pressing the PAGE key could push some DIGI parameters to a high value — the stock-event store guard did not cover every path.Fixed — the per-pattern store is now a mod-owned RAM table; no stock event can reach a DIGI parameter.- PITCH fires on a note-off: a PHASER trig can activate the PITCH (WAVE) effect on the note-off message instead of on the note.
Microtiming / locked trigs on MIDI tracks: LEFT / RIGHT would not nudge a MIDI-track trig and the volume could jump.Fixed in 3.5p — the key/encoder handlers now disarm the moment the master view closes.- Slider feel: the page sliders and value bars should track the stock parameter widgets more closely.
- Encoder acceleration: the base rate is stock (one step per detent); the fast-turn curve is whatever the OS driver delivers, so a fast spin can feel different from a stock parameter.
- SHFT quality: the pitch shifter is deliberately lightweight (linear interpolation, ~10 ms grains) and a little warbly — a quality pass, or a hi-fi option, is wanted.
- DELAYS GRAINZ PIT is parked: the granular taps read at rate 1.0, so the PIT knob does nothing yet (a planned tap-rate / transpose control).
WOB / SHFT have no dry-wet: MIX is used by FLAN only.Fixed in 3.5r — PITCH gains a G mix (dry/wet) so WOB/SHFT dial in like the flanger.- PERFORM trig LEDs: the pads do not yet light the trig keys (yellow) — a planned follow-up, once the Digitone LED driver is reverse-engineered.
Configured-MIDI-track store risk: the per-pattern block lived in an unused MIDI-track area that was zero on unconfigured tracks; a configured MIDI track wrote its channel/page there, so the stock data and our values corrupted each other.Fixed — the store moved to a mod-owned RAM table (digictl 2.8); the MIDI-track pattern bytes are no longer read or written.- Pattern persistence is RAM-only: the FX settings follow a pattern switch in a session but are not carried over a power cycle or a project load — the price of never touching stock pattern data.
Wanted next (features / quality)
- LFO destinations: drive the DIGI parameters from a track LFO (a bridge is parked in the source; it needs the stock destination table).
- Pre-FX routing: an option to place the chain before the sends/return effects instead of after them.
- Fuse the six master passes into one loop — order-of-magnitude fewer
loads/stores per frame, real CPU back. (Tried in 3.5r as a
CORE_AUDIO_INSERT; reverted — it raised CPU/DSP ~15 % on hardware.) - Redraw gating: only redraw an animated page while it is visible, and fold the meter into the fused loop.
- More PERFORM pads: pads for EQ, WAVE speed and CRUSH tune, and optionally tempo-synced ramp shapes.
- Measured headroom: render-worst / deadline margin and peak/RMS dB with the FX off vs on, so the load advice is measured rather than estimated.
- CC 20–31: verify against the stock CC table (
0x4018D104) before sequencing WAVE/CRUSH from a DAW. - Output ceiling: confirm it is inaudible at normal levels and matched to the 24-bit full scale.











