digitide, image 1 from its README
1/7
Mod

digitide

Rising75/100

A wet channel and a micro-looper for the Digitone mk1's audio inputs: an elekloader mod (core-dn1 3.2)

digitide is a mod for the Elektron Digitone, by @irpina. Open source under GPL-2.0, 1 star on GitHub.

forElektron Digitone·by@irpina

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

Downloads
0
Star
1
Forks
0
Commits
3
Last commit
Download v0.2

Betadigitide-0.2-os1.44.elemod· 164 KB· +6 files

GPL-2.0· irpina/digitide·downloads come from the creator’s GitHub releases

3
Commits
3
Releases
3 commits and 3 releases in the last year
Activity · last 12 months

DigiTide

A two-channel pedal for the Digitone mk1's audio inputs: a wet channel (REVERB, DELAY, GRAB, with FREEZE) and an always-listening micro-looper (ENV, TAPE, STRETCH, with OVERDUB) that pass sound to each other as ROUTING says, a CLOCK that lowers the sample rate of both, extra options and switches, and MIDI CCs. DigiTide is an elekloader mod on fxkit (core-dn1 4.1).

Its MIDI CCs follow the Chase Bliss MOOD MKII's published CC chart, so a controller set up for that pedal works with it too. DigiTide is not affiliated with Chase Bliss and uses none of its code.

DIGITIDE is an entry in core-dn1's Mod Menu (hold a track key). While it is the active effect, DigiTide owns the audio engine, as DigiSwarm and DigiPrism do (fxkit's core_audio owner): the synths are silent, the Digitone's own effects are off, and what you hear is the inputs through the pedal. NO turns it off and gives the audio and the screen back. The sequencer keeps running, so PLAY, STOP and TEMPO still work and the clock can follow the Digitone's tempo. Opening the page steps the pedal on; BYPASS (trig 16) passes the inputs through dry, with the wet channel's tail.

DigiTide 0.2 is a beta (a pre-release). It is an effect on fxkit: a MIXER on AMP (the inputs' levels and pans, as loud as the Digitone's own input), two LFOs on the stock LFO page aimed at its controls, p-locks kept in the pattern (RECORD, then hold a trig and turn a control), and MIDI hands the screen to the stock UI for the MIDI tracks while it keeps playing. Presets are gone: the project keeps its controls, mixer and LFOs, and a project saved with 0.1 opens it at its defaults. 0.2 was tested on a Digitone mk1 by its author (built before the effects' rename, which changed only names); it was also checked in digikit's emulator (digiemu) on OS 1.43 and 1.44. Not yet run on a Digitone Keys. Its source is also in elekloader, as mods/digitide-dn1.

DIGITIDE in core-dn1's Mod Menu Page 1 Page 2 Page 3 The MIXER (AMP) LFO 1 (LFO), as the stock LFO page SETUP

The screenshots are from the emulator, which has no DMA timer 0, so the C at the top right (the render's share of each block) does not read true there.

Install

The easiest way is elekloader's web page: tick DigiTide and the + beside its Needs fxkit; the page takes the core it needs. To build it yourself you need:

  • elekloader from its main branch, with Python 3.9 or newer (see its README). DigiTide keeps 4 MB of buffers in the Digitone profile's bulk area, which the 0.4.0 app does not know: it refuses DigiTide.
  • This mod, fxkit and their core, from this repository's releases: digitide-0.2.elemod, fxkit-0.1.elemod and core-dn1-4.1.elemod for OS 1.43, or the three -os1.44 files for 1.44. DigiTide needs core-dn1 4.1 or newer and fxkit; every effect on fxkit (DigiSwarm, DigiPrism, DigiTide, DigiTriad, DigiReel, DigiHoard, DigiHalo) fits in one build with them.
  • The stock OS file: Digitone_and_Digitone_Keys_OS1.44.syx or ..._OS1.43.syx, from Elektron's Digitone downloads. elekloader recognises the file by its hash.

Build your OS on the command line (or in elekloader's window, run from source: + Install from file... the three files and tick digitide):

python -m elekloader.patch --stock Digitone_and_Digitone_Keys_OS1.44.syx \
    --mod core-dn1-4.1-os1.44.elemod --mod fxkit-0.1-os1.44.elemod \
    --mod digitide-0.2-os1.44.elemod \
    --out Digitone_OS1.44-digitide.syx --version TI02

--version is the 4 characters the unit will show. Flash the .syx with Elektron Transfer, as for any OS update: connect the unit over USB, select it in Transfer and Connect, drag the .syx onto Drop files here, and press YES on the unit. Don't turn it off until the upgrade is done.

Recovery: elekloader never changes the bootloader, so the stock OS file always restores the unit. Hold FUNC while powering on for the startup menu, and press TRIG 4 for OS UPGRADE. Then send the stock .syx with Transfer.

Opening it: hold a track key on its own for the Mod Menu, then pick DIGITIDE with its trig key (or YES). NO turns it off and gives the synths back.

0.2: on fxkit

From 0.2 DigiTide is an effect on fxkit (../fxkit-dn1), as every effect in the build is: one at a time is active. Its Mod Menu entry makes it the active effect and opens its page; while it is active it owns the audio, page or no page, and opening another effect's entry hands that one the audio.

keyon DigiTide's page
SYN1, SYN2, FLTRits three pages (page 1, 2 and the toggles)
AMPthe MIXER: IN L, IN R (the inputs' levels, as the stock mixer's: 32 unity, up to +24 dB), L PAN, R PAN (where each input sits), BAL, VOL, WDTH (the output's width)
LFOLFO 1, pressed again LFO 2: the stock LFO page (its knobs, WAVE and SPH as one wave, a turned knob's value under it), at the stock rates; turning DEST opens its list (DigiTide's controls and the mixer's), YES picks, NO closes
RECORDLOCK mode: hold a trig and turn a control, and that step has a p-lock of it (the title bar shows the 16 steps, filled where DigiTide has a lock); FUNC + a trig clears the step; PAGE the next 16 steps. RECORD again (or NO) leaves it
MIDIthe stock UI, for the MIDI tracks and the rest, with DigiTide playing on; its Mod Menu entry brings the page back
NODigiTide off: the synths again

The p-locks are the pattern's: they are kept in one synth track's lock table (SETUP's LOCK TRACK, T4 unless you pick another), saved and copied with the pattern, and play on their steps; that track should play nothing of its own (no notes, no arpeggiator) in a pattern with DigiTide's locks, or its trigs go astray. 0.1's presets are gone: the project keeps DigiTide's controls, mixer and LFOs (tag DMOD, 52 bytes).

The two channels

The wet channel is a suite of real-time effects, picked with WET on page 3 or T3:

ModeTIMEMODIFY (WMOD)Frozen (T1 held)
REVERBits size and decay together: a decay of 0.3 s to about 15 sthe smear: at 0 a cluster of distinct echoes (a multi-tap delay), up to a dense reverban ambient pad: the tail holds, nothing new comes in
DELAYthe delay time: 20 ms to 1.2 s, or with the clock 1/32, 1/16, 1/8T, 1/8, 1/8D, 1/4the feedback; at 127 the repeats hold, as a loopera looping echo
GRABhow often it samples: 25-800 ms, or the same divisionsthe playback's speed and direction: the middle plays at 1x, right goes up in semitones to 2x, left plays backwards, faster to 2xa repeating tone

A new TIME in DELAY crossfades to the new delay instead of bending the repeats' pitch.

The looper always listens: a ring keeps the last 15 seconds of what the pedal plays (at the 48K clock). Turning it on (T2) loops the last LENGTH of it, so you catch what just happened; there is nothing to arm. While it plays, the ring stops; turned off, it listens again from where it stopped, so a loop stays in the ring for a while, and turning it off and on again catches what is new. LENGTH is in time with the tempo when the clock follows the Digitone (x/32 to x1 of two bars: a 1/16 note to two bars), or free from 40 ms to 10 s.

ModeLENGTHMODIFY (LMOD)
ENVthe slice's size, 4 ms to 1 sthe sensitivity: sound at the input over its threshold holds the slice the loop is in, which repeats until the input goes quiet, and the loop goes on from there. At 0 nothing holds
TAPEshortens the loop from its start (up to what was caught)the speed and direction in octaves: 4x, 2x, 1x, 0.5x backwards (left) and forwards (right)
STRETCHthe grains' size, 4 ms (blurry) to 1 s (clear)how fast the loop moves under the grains, pitch kept: 1x backwards at 0, slower to stalled in the middle (the moment held), faster to 1x forwards at 127 (no effect)

Holding T2 overdubs: the clean input goes onto the loop (the wet channel is not recorded) while FADE (page 2) lowers the old loop a little each pass. NO DUB (page 3) replaces the loop with the input while overdubbing. The loop's seams are faded over XFAD (page 2) into what came before the loop, so they do not click, either way the loop plays.

ROUTING (page 3, or T3 held) decides what the wet channel hears when both channels are on: IN (the input; the loop goes to the output beside it), ML+I (the input and the loop) or ML (the loop alone, the input dry beside it). A loop routed through the wet channel is heard 100% wet; DIRECT (page 2) blends its clean version back in. While the looper listens, it records what the pedal plays, the wet channel included, whatever the routing.

CLOCK is the sample rate, from 2K to 48K in steps (2K, 3K, 4K, 6K, 8K, 12K, 16K, 24K, 32K, 48K), or without steps with SMOOTH CLK in SETUP. Both channels run at that rate (a one-pole before it keeps the worst of the aliasing out, and another smooths the steps after it, so a lower clock is also darker), and what they keep is counted in samples: a loop caught at 48K plays an octave down and twice as long at 24K, a fifth down at 32K; the delays and the reverb get longer and darker; at 2K-4K the pedal is all aliasing and grit. A synced LENGTH or TIME is in time at 48K and at the octaves below it (24K, 12K, 6K, 3K: twice, four times ...). RAMP (page 2) bounces CLOCK from its knob down to the bottom and back.

The page

DigiTide's page is drawn like the Digitone's own parameter pages, in their fonts: the tempo in the box at the top left, the page in the title bar, the channels' state on the left (W the wet channel on, F frozen; L the looper playing, O overdubbing, a dot while it listens; under them the modes' letters, R D S and E T S, a star while ENV holds a slice, B while bypassed) and the output's meter, and eight controls, one per knob. A knob that does nothing now is dotted (the wet's while it is off, LMOD while the looper listens, WDTH without SPREAD on the wet, DIRECT with ROUTING IN, FADE with NO DUB). While you turn a knob the title bar shows its value; LEFT and RIGHT, or PAGE, move between the three pages, and holding FUNC shows page 2.

PageKnobs A-DKnobs E-H
1 Tide (the main knobs, the wet side left, the looper's right)TIME, MIX, LNGT (LENGTH), BAL (level balance)WMOD (the wet's MODIFY), CLK (CLOCK), LMOD (the looper's MODIFY), TONE
2 Extras (the extra options)WDTH (stereo width), FADE, DRCT (DIRECT, the clean loop), OUT (output level)WOBL (the wet's modulation), DAMP (the damping inside the wet's feedback), XFAD (the loop's seams, 1-60 ms), RAMP (CLOCK's bounce)
3 TogglesWET (REV, DLY, GRAB), LOOP (ENV, TAPE, STR), ROUT (IN, ML+I, ML), SYNC (OFF, LOOP, WET)SPRD (OFF, BOTH, WET, LOOP), LTCH (LATCH), DRYK (DRY KILL), NDUB (NO DUB)

MIX blends the input and the pedal (both channels). BAL sets the two channels' levels: the middle (EVEN) both at unity, left the looper quieter, right the wet quieter. TONE is a hi-cut on the wet channel from open (127) down to 600 Hz.

ControlWhat it does
T1tap the wet channel on/off, hold FREEZE (with LTCH, a hold toggles FREEZE)
T2tap the looper on (plays the last loop) or off (listens), hold OVERDUB (with LTCH, a hold toggles OVERDUB)
T3 and T4 tappedthe next WET and LOOP mode; also on page 3
T3 heldthe next routing; also on page 3
page 2, or FUNC heldthe extra options; BAL and TONE are on page 1
page 3's SYNC (T4 held: the next)the looper to the wet, or the wet to the looper: LOOP makes the loop four of the wet's TIME; WET makes TIME a part of the loop (1/16, 1/8, 1/6, 1/4, 1/3, 1/2)
page 3's SPRDSPREAD on both channels, the wet only or the looper only
SETUP's LOOP BUFFERhalf or full: HALF halves LENGTH
page 3LATCH, DRY KILL, NO DUB
SETUPSMOOTH CLK, INPUT (MONO: input L to both sides), BYPASS (TRAILS or CUT)
trig 15tap tempo
presetsnone from 0.2: the project keeps the pedal, and p-locks (RECORD) follow the pattern
trig 1-6, 7-12, 13 and 14TIME's six divisions; LENGTH's six; CLOCK a step down, up

With SPREAD each mode makes its own stereo: REVERB widens its tail (WDTH, 0 to 2x the sides), DELAY ping-pongs (each repeat crosses sides, so a sound on one side moves to the other and back), GRAB pans, a cycle every two samples; on the looper, TAPE plays a copy backwards on the left, STRETCH pans slowly, and ENV pans while a slice is held.

MIDI

DigiTide takes its MIDI CCs (the chart below) that come on the Digitone's auto channel (MIDI CONFIG > CHANNELS > AUTO CHANNEL), through core-dn1's ev_midi_cc, while its page is open; with SETUP's CC CLOSED on, also while it is closed, and with MIDI CC on ANY CH on a track's channel too. The Digitone does not apply a CC DigiTide takes; every other CC goes on to the Digitone. MIDI CONFIG > PORT CONFIG > INPUT FROM has to let them in.

CCCC
14TIME (with the clock: its six divisions by the chart's bands)24stereo width (WDTH)
15MIX26FADE
16LENGTH (the chart's six bands, x/32 .. x1)27TONE
17MODIFY (the wet channel)28level balance (BAL)
18CLOCK (the chart's bands; its 64K is 48K here)29DIRECT (DRCT)
19MODIFY (the looper; TAPE's and STRETCH's bands)31SYNC: 0-1 the looper to the wet, 2 none, 3-127 the wet to the looper
20RAMP (here CLOCK's bounce speed)32which channels SPREAD is on: 0-1 the wet, 2 both, 3-127 the looper
21WET: 0-1 REVERB, 2 DELAY, 3-127 GRAB33LOOP BUFFER: 0-1 half, 2-127 full
22ROUTING: 0-1 IN, 2 ML+IN, 3-127 ML72-78mono input, SPREAD, DRY KILL, TRAILS, LATCH, NO DUB, SMOOTH (0 off, 1-127 on)
23LOOP: 0-1 ENV, 2 TAPE, 3-127 STRETCH102, 103the looper, the wet channel: 0 off, 1-127 on
104the extra options: 1-127 page 2, 0 page 1105, 106FREEZE, OVERDUB: 0 off, 1-127 on
93, 107TAP

Not mapped (the Digitone does them): ramping's waveform (25) and its switches (61-68), a classic mode (71), MIDI clock ignore and clock divisions (51-54), true bypass, factory and MIDI reset (55, 56, 110), expression (100), preset save (111) and program changes, and a synth mode.

How it works

The render (dsp.c) runs at interrupt level in core-dn1's render, on each block of 32 frames: the input to the clock's ticks (at 48K, every frame), the looper, the wet channel fed per ROUTING, the ring (while the looper listens), back to frames (each tick held, then smoothed), and the mix. The pedal shell (pedal_dsp.inc) then sets OUTPUT LEVEL and a soft clip. Everything is fixed point in C; the ring and the lines hold 16-bit samples at half scale. REVERB is DigiPrism's SPACE (eight lines with a Householder feedback matrix) with its allpasses' coefficient on MODIFY. The UI (ui.c) runs in the Digitone's UI task.

  • Memory: the ring (15 s at 48K, 2.9 MB), the wet channel's line (2.7 s, shared by DELAY and GRAB) and REVERB's lines, 3.4 MB of the region DigiTide claims in the Digitone profile's bulk area (0x47300000-0x47700000), cleared in the first 14 ticks after power-up. The code and its state take 33 KB of the 128 KB mods share (the exponential knob curves are worked out, not tabled, to keep it small).
  • CPU: in digikit's emulator, with the factory pattern playing (the Digitone's own render is about 18% of a block with the synths muted): the whole render takes 38% of a block with the defaults (REVERB, the looper listening), 44% (at most 46%) with REVERB and STRETCH both playing, the heaviest (DigiTide's own share about 26%), 40% with REVERB and TAPE, 32-33% with DELAY or GRAB and STRETCH, and 25% at CLOCK 2K (the channels run on one frame in 24). REVERB is the heavy part: eight lines, two of them modulated, and two allpasses a side. The emulator's timing tables assume memory without wait states, so a unit runs slower: a guard times the whole render on DMA timer 0 every block, and if the unit stays over 93% for 0.2 s it bypasses the pedal at once (no trails) and says so in the title ("CPU full: bypassed"); BYPASS turns it back on.
  • Project data: DigiTide's controls, its latches and SETUP, with fxkit's mixer and LFOs (fx_pack), are saved with the project (tag DMOD, 52 bytes; mods share 480 there, and the seven effects, GAIN and fxkit take about 470). The p-locks are the pattern's. The loop is not saved: the Digitone's +Drive has no files for mods.

Build

With the SDK and a stock OS file:

python -m elekloader.sdk.build . --stock Digitone_and_Digitone_Keys_OS1.43.syx   # out/digitide-0.2.elemod
python -m elekloader.sdk.build . --stock Digitone_and_Digitone_Keys_OS1.44.syx   # out/digitide-0.2-os1.44.elemod

It names no firmware address, so its 1.44 port is empty. It needs fxkit and core-dn1 4.1 ("requires": ["core", "fxkit"], "resources": {"core": "4.1"}) and an elekloader with the profile's bulk area. gentables.py makes tables.h.

Checked

In digikit's emulator, OS 1.43 and 1.44, and with the render's own code compiled for a computer and fed test signals (tests.sh):

  • On a unit: tested on a Digitone mk1 by its author: it loads and works as expected. It is still a beta.

  • The firmware. A build with the released core-dn1 3.2 and DigiTide passes every stage of the emulator's check against stock on 1.43 and 1.44, with every screen identical.

  • In the emulator (1.43, plucked notes on the inputs, the factory pattern playing): closed, the synths; open, the plucks through the REVERB and the synths silent (with the inputs silent too, an rms of 0 against the synths' 1819); the three pages, SETUP, a knob turn, a preset saved as P5 and recalled, T1-T4 tapped and held (the wet on and frozen, the looper caught and overdubbing, the next modes, ROUTING and SYNC), a second catch, CLOCK down to 2K and a step up by trig 14, TIME's trigs, BYPASS; the chart's CCs (the knobs, the modes, ROUTING, the extra options, SYNC, DRY KILL, the channels on and off, FREEZE, TAP) taken and applied, and a CC outside the chart going on; after NO the synths again.

  • The effects (the render on a computer): with both channels off the input untouched, with DRY KILL silence; REVERB's decay from 0.3 s to about 15 s, its first reflection earlier with MODIFY up, FREEZE holding the tail within 1 dB for 5 s and letting it go; DELAY's first repeat at the knob's time (20 ms, 157 ms, 1.2 s) and on the tempo (1/4: 500 ms, 1/16: 125 ms), its feedback, a steady loop at MODIFY 127 and frozen, a new TIME without a click; GRAB at 1x, a fifth up, 2x and 2x backwards (440 Hz in: 440, 660, 880, 880 Hz), frozen a held tone; the looper catching the note that was just played, TAPE at 0.5x, 1x, 2x, 1x and 4x backwards (220, 440, 880, 440, 1760 Hz), LENGTH shortening the loop, seams with no step larger than the sine's own, the catch and the release without a click; STRETCH with no stretch (the loop unchanged), 4x slower and stalled at the loop's pitch; ENV holding slices while the input is loud; OVERDUB adding, with FADE settling, with NO DUB replacing; the three routings and DIRECT; CLOCK 24K and 32K playing a 48K loop an octave and a fifth down, 3K darker, SMOOTH and RAMP; SYNC (the loop four of TIME; TIME a quarter of the loop: 500 ms); the level balance at both ends; TONE; WIDTH 0 (mono); BYPASS with its tail and without; the ring listening while bypassed; the CPU guard's trip.

  • CPU on the emulator's cycle clock: above.

Not done (yet)

  • A 64K clock (DigiTide's top is 48K, the Digitone's rate) and MIDI clock divisions; MIDI clock itself (the Digitone's tempo, or TAP, stands in).
  • Ramping and its waveforms on any knob, expression and CV: here only CLOCK bounces (RAMP, a triangle).
  • A classic mode (noise, degrading loops, a ringing reverb, a bendy delay).
  • A synth mode, program changes and presets (the project keeps one).
  • An ENV where the loop's level follows the input; here ENV holds a slice while the input is loud.

Licence

GPL-2.0-or-later, as the rest of elekloader (LICENSE).