digiswarm, image 1 from its README
1/7
Mod

digiswarm

Rising76/100

An effects engine for the Digitone mk1's audio inputs, grains, micro-loops and a looper: an elekloader mod (core-dn1 3.2)

digiswarm is a mod for the Elektron Digitone and Elektron Digitone Keys, by @irpina. Open source under GPL-2.0, 19 stars on GitHub.

forElektron Digitone,Elektron Digitone Keys·by@irpina

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

Downloads
0
Stars
19
Forks
0
Commits
5
Last commit
Download v0.2

Betadigiswarm-0.2-os1.44.elemod· 196 KB· +6 files

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

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

DigiSwarm

An effects engine for the Digitone mk1's two audio inputs: eleven engines with four variations each, a 60-second looper, Hold, Reverse, a resonant filter, pitch modulation and a reverb with four rooms, all in time with the Digitone's tempo, and MIDI CCs for its controls and looper. DigiSwarm is an elekloader mod on fxkit (core-dn1 4.1).

Its MIDI CCs follow the Hologram Electronics Microcosm's published CC chart, so a controller set up for that pedal works with it too. DigiSwarm is not affiliated with Hologram Electronics and uses none of its code.

DIGISWARM is an entry in core-dn1's Mod Menu (hold a track key). While it is the active effect, DigiSwarm owns the audio engine (fxkit's core_audio owner): the synths are silent, the Digitone's own effects are off, and everything you hear is the inputs through DigiSwarm. NO turns it off and gives the audio and the screen back. The sequencer keeps running, so DigiSwarm follows its tempo and PLAY, STOP and TEMPO still work.

DigiSwarm 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/digiswarm-dn1.

DIGISWARM 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 DigiSwarm 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). DigiSwarm keeps 26 MB of buffers in the Digitone profile's bulk area, which the 0.4.0 app does not know: it refuses DigiSwarm.
  • This mod, fxkit and their core, from this repository's releases: digiswarm-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. DigiSwarm 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 digiswarm):

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 digiswarm-0.2-os1.44.elemod \
    --out Digitone_OS1.44-digiswarm.syx --version SW02

--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 DIGISWARM with its trig key (or YES). NO turns it off and gives the synths back.

0.2: on fxkit

From 0.2 DigiSwarm 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 DigiSwarm's page
SYN1, SYN2, FLTRits three pages (EFFECT, SHIFT and LOOPER)
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 (DigiSwarm'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 DigiSwarm 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 DigiSwarm playing on; its Mod Menu entry brings the page back
NODigiSwarm 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 DigiSwarm's locks, or its trigs go astray. 0.1's presets are gone: the project keeps DigiSwarm's controls, mixer and LFOs (tag DCSM, 44 bytes).

The page

DigiSwarm's page is drawn like the Digitone's own parameter pages, in their fonts: the tempo in the box at the top left, the engine and variation in the title bar with the page number (1/3), the looper's state (and the H, R and B of Hold, Reverse and Bypass when they are on) and the input's meter on the left, and eight controls, one per knob: a knob, a value box or a switch. While you turn a knob, the title bar shows its value. LEFT and RIGHT, or PAGE, move between the three pages; holding FUNC shows page 2.

PageKnobs A-DKnobs E-H
1 EffectACT, REP, SHP (its contour), FLTMIX, TIME, SPC, LOOP
2 Shift (also FUNC + a knob on page 1)GAIN (input, 64 is 0 dB; the - and + knob), MDEP, MRAT (pitch modulation), RESOFXVL (effect volume), LSPD (loop speed), VERB (room), FADE (loop fade)
3 LooperHOLD, REV, BYP: turn right for on, left for off, or pushLOOP (record, play, overdub), STOP, UNDO, CLR: push

Pushing a knob on pages 1 and 2 sets it back to its default. Time picks a bar, 1/2, 1/4, 1/8, 1/16 or 1/32 of the Digitone's tempo, and when the sequencer plays the engines' grid is its timeline.

FunctionOn DigiSwarm
Engine and variationtrig keys 1-11 pick the engine, 13-16 the variation (A-D)
HoldHOLD on page 3, or trig key 12 (latching, or momentary in SETUP)
Looper: record / play / overdub, hold for undo; stop, hold to erasepage 3, or T1 and T2 as two footswitches (hold T1 to undo, T2 to erase)
Reverse, Bypass (with trails)REV and BYP on page 3
Presetsnone from 0.2: the project keeps the controls, and p-locks (RECORD) follow the pattern
SettingsYES opens SETUP (input mono/stereo, loop route, looper only, quantize, burst, hold mode, loop order, MIDI channel); UP and DOWN pick a row, LEFT or RIGHT changes it
MIDI CCson the Digitone's auto channel (see MIDI below)
Tempothe Digitone's own tempo (TEMPO)

MIDI

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

CCCC
5Subdivision (Time), in steps: 0-518Loop Speed in steps: 0-5
6Activity (A)19Mod Depth (FUNC + B)
7Shape (C)20Space type (FUNC + G)
8Filter (D)21Loop Fade (FUNC + H)
9Mix (E)23, 47Reverse: on from 64
10Time (F)24-27SETUP's loop route (PRE-FX), looper only, burst, quantize: on from 64
11Repeats (B)28Record: starts a loop, closes it, or starts a new take
12Space (G)29Play: closes a recording, restarts a stopped loop, ends an overdub
13Loop Level (H)30Overdub, on and off
14Mod Rate (FUNC + C)31Stop
15Resonance (FUNC + D)34, 35Erase, undo
16Effect Volume (FUNC + E)48Hold: on from 64
17Loop Speed (FUNC + F)102Bypass below 64, on from 64

CC 5 and CC 18 take steps, 0 to 5: 1/4, 1/2, TAP, 2x, 4x and 8x (anything above 5 as 8x). The six subdivisions are DigiSwarm's six Time steps, a bar down to 1/32; the loop speeds are its five, 1/4X to 4X, with 8x as 4X. The looper's CCs act on a value of 64 or more.

CC 22 (looper on/off), 45 and 46 (copy and save preset) and 93 (tap tempo) have nothing to do here: the looper is always on, there are no presets and the tempo is the Digitone's. DigiSwarm takes them anyway while it is open, so they don't change the active track's sound. Program changes (preset recall) are not mapped: core-dn1 passes DigiSwarm the CCs only.

Engines

EngineABCD
1SHARDS: loops at several speeds1x and 2x1x and 0.5xall 2x0.5x, 1x, 2x, 4x
2SEQ: slices shuffled into rhythmsfiltered1x and 0.5x (a pad at full Activity)layers with filter sweepslayers, crushed
3GLIDE: loops whose speed glides0.5x-1x2x-0.5x1x-2xup and down at once
4MIST: grain cloudsstretchedrandom1x and 2x1x and 0.5x
5DRONE: drones from short loopsthe loop breathesan octave down, sweptresonant band-passesthe input moves the loop
6RAKE: repeats of note onsetsthe last onsetcopies phasinga cascade of onsetsa cascade and 2x grains
7CHOPS: rearranged blockswith burstspitchedfiltered, softpitched and crushed
8STUTTER: bursts in place of the dryrearrangedpitchedfilter sweepscrushed
9ARP: onsets as arpeggios1xthirds, fifths, octavesa filter a stepcrushed
10PATTERN: taps of a delaystraightsyncopatedclusterstriplets
11WARP: taps, processedenvelope filtersresonant band-passespitched2x grains

Activity is density (loopers, grains, taps, steps), Repeats how long or how often (a loop's life, a drone's decay, a delay's feedback), and Shape the contour of each loop or grain: FLAT, SWEL(l), PERC, ARCH. What these controls move in each variation is DigiSwarm's own.

How it works

Every engine is a scheduler that starts heads: readers of a 10.9-second history of the input, interpolated and windowed, as one-shot grains or as loops. PATTERN reads taps off a delay line of its own. After the engine come the looper (60 s stereo, with one overdub layer for undo), pitch modulation, the filter, Space (an eight-line feedback delay network) and Mix against the dry input. Everything is fixed point in C (dsp.c), at interrupt level in core-dn1's render; the UI (ui.c) runs in the Digitone's UI task.

  • Memory: the buffers (26 MB) are a region in the Digitone profile's bulk area (resources.regions in mod.json), cleared when DigiSwarm first opens. The code and its state take 30 KB of the 128 KB mods share.
  • CPU: DigiSwarm times its own render with DMA timer 0 and shows its share of a block in the corner (C). Over 45% it starts fewer new grains; under 30% it allows more again, up to sixteen heads.
  • Project data: DigiSwarm's controls, its latches and SETUP, with fxkit's mixer and LFOs (fx_pack), are saved with the project (tag DCSM, 44 bytes; mods share 480 there, and the seven effects, GAIN and fxkit take about 470). The p-locks are the pattern's. Loops are not saved.

Build

With the SDK and a stock OS file:

python -m elekloader.sdk.build . --stock Digitone_and_Digitone_Keys_OS1.43.syx   # out/digiswarm-0.2.elemod
python -m elekloader.sdk.build . --stock Digitone_and_Digitone_Keys_OS1.44.syx   # out/digiswarm-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"}; its page uses 3.2's fw_font_label and fw_font_title) and an elekloader with the profile's bulk area. gentables.py makes tables.h.

Checked

It runs on a Digitone mk1, with core-dn1 3.2. In digikit's emulator, OS 1.43 and 1.44, in detail:

  • Owning the audio. With the factory pattern playing, its FM is silent while DigiSwarm is open and back at once after NO, also when PLAY was pressed while DigiSwarm was open. After DigiSwarm has used its buffers, the FM plays as before.
  • The page. Its three pages, laid out pixel for pixel as the stock FLTR, AMP and LFO pages (their labels on the same rows, in the same font); a knob turn and its value in the title bar; FUNC's view; page 3's switches, turned and pushed, and its looper boxes (record, play, stop, clear); the engine and variation keys; SETUP and NO; as screenshots and as the state DigiSwarm keeps. T3 and T4 do nothing now.
  • The engines. Every engine at every variation, with plucked notes on the inputs, on the emulator's cycle clock (MCF5441x tables at 250 MHz): each makes sound, at the octaves its variation names (SHARDS C an octave up, SHARDS D down, at and up; MIST C and D; GLIDE's ranges; WARP C's pitched taps), and the whole render, the stock part included, takes 30-55% of a block, never more than stock's 56.6%. DigiSwarm's own reading agrees with the cycle clock (MIST at full Activity: 39%, sixteen heads).
  • The looper. Record, play, overdub (a fifth over the loop), undo (the fifth gone), reverse, stop with its fade, and erase.
  • Hold. SHARDS and MIST keep sounding with the input silent while Hold is on, and fall silent once it is off.
  • Mono input (0.1.1). With SETUP's INPUT on MONO and white noise on the left input only, the dry and the bypassed signal come out of both sides at the same level (in 0.1 they stayed on the left), and every engine's effect is centred: over 5 s, right against left between 0.87 and 1.07, except CHOPS and STUTTER, whose random placements average out over longer. SHARDS, DRONE, PATTERN and WARP used to lean to one side (down to 0.62) and now spread their voices evenly.
  • Presets. A page saved as preset 5 from SETUP comes back exactly with FUNC + trig 5 after the engine, variation and knobs have changed; an empty preset changes nothing. The page and its presets fit in the project beside digitables' tables.
  • MIDI. CCs sent into the emulator's MIDI input on 1.43 and 1.44: while the page is open, the mapped ones on the auto channel set DigiSwarm (the knobs, CC 5 and 18 in steps, FUNC's knobs, Reverse, Hold, Bypass, SETUP's rows, and the looper through record, play, overdub, stop and erase) and do not reach the Digitone's own CC handling, nor do CC 22, 45, 46 and 93; an unmapped CC, a CC on a track's channel (with AUTO CH) and every CC while the page is closed go on to it. With ANY CH a track's channel works too.
  • The Digitone Keys. With the Keys bit set in the emulator, core-dn1 3.2 hands the inputs left first as on a Keys and keeps the Keys' own output buffer silent. Nothing has run on a Keys.

Not yet

  • Saving loops. The Digitone's +Drive is not a file system but a fixed store of slots (a project slot is 4 MB, the 128 of them from 256 MB on, with other regions below and above), so a mod has no file to write, and no part of the card is known to be free. Loops stay in memory and are lost at power-off.
  • Program changes for presets: core-dn1 has no event for them.
  • An expression pedal (the Digitone Keys has an input for one).
  • A run on a Digitone Keys: only the code path was checked, in the emulator.

Licence

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