Skip to content

Repository files navigation

Loopex

A 16-track live tape looper for the Ableton Move, built as a Schwung Overtake module.

Loopex turns the Move into an asynchronous, tape-flavoured looping instrument: sixteen stereo loops on the left pads — each with up to four independent playheads — a bank of momentary/latchable glitch FX on the right pads, two send buses drawing on a 24-effect Palette engine plus four reverbs, a full record-path tape machine, session save/load, and a MIDI-keyboard polyphony layer.

Inspired by the 1010music BlackBox looper workflow, and by the sound of Kinotone Ribbons, Chase Bliss Blooper / Mood MK2, and Microcosm-style glitch. Interaction ideas borrowed from the norns looper world (wrms, cranes, oooooo, samsara, nydl, otis).

  • Module: loopex · Name: Loopex · Type: Overtake (Schwung) · API v2
  • Format: 44100 Hz, 128-frame blocks, stereo · Version: 0.9.5 · Manual: online · markdown · License: GPL-3.0

What it does

16 stereo tape loops

Each left pad is an independent, free-running stereo loop (up to 45 s). Record, play, pause and overdub live; every loop has its own speed, tone, FX sends, amp envelope and playheads.

  • Overdub modes: Replace · Multiply (default; endless layering with decay) · Disintegration (the loop's FX are re-applied each pass, so it slowly falls apart).
  • Playback speed is tinted onto the pad LED (blue ½× · green 1× · yellow 2×).

Up to 4 playheads per loop

Every loop can be read by four independent heads at once, each with its own mode and speed — one recording becomes a canon, a drone, or a ping-ponging texture.

  • Modes: Off · Fwd · Bwd · Ping (ping-pong) · Jump (leaps to a random spot at random intervals, crossfaded).
  • Per-head speed (0.25×–4×); heads sum with 1/sqrt(n) normalisation so stacking stays sane.
  • Turning a head on always restarts it at the loop start.
  • Head 1 is the main head — Scatter, Seed, scrub and Jump all drive it.
  • In the Playheads page, touch a head's knob and the jog wheel moves that head along the waveform.

The five loop pages

Navigate with Down (next) and Up (previous).

Page Knobs
P1 · Loop Speed · Filter · Pan · Volume · Start · End · Reverse · Send A
P2 · Texture Pitch · Reso · Sat · Comp · Wow/Flutter · Scatter · Seed · Send B
P3 · Tone Studer Bass · MidF · MidGain · Treble · Tilt · Attack · Decay · Wear
P4 · Playheads H1 mode/speed · H2 · H3 · H4
P5 · HeadMix per-head Vol/Pan — H1 (mirrors P1 Vol/Pan) · H2 · H3 · H4
  • Speed — playback rate, ±2 octaves in 0.1-semitone steps (pitch and tempo together, like tape). Reads are 4-point Hermite with a rate-aware anti-imaging filter below 0.75×; the sampler Characters replace that with linear or drop-sample reads, which is where their grit comes from.
  • Pitch — an independent shift, −24 to +24 semitones, tempo untouched: a Signalsmith Stretch phase-vocoder shifter. It runs on two worker threads (lpx-ps0 / lpx-ps1, even and odd loops), off the audio callback, and its latency (61 ms including the hand-off queue) is cancelled by nudging the playheads, so the loop stays in time.
  • Seed — a Smack-style seeded slice re-order (2/4/8/16 slices, some reversed). The knob is the seed: every position is a different reproducible mangle, click-free.
  • Scatter — stochastic slice jumps, crossfaded.
  • DJ Filter + Reso — continuous LP/HP sweep with resonance, smoothed over ~10 ms.
  • Start / End — the loop window. End is a length (a fraction of the whole recording, clamped to what's left after Start), so a short window keeps its size while Start slides it through the sample. Both are fine and velocity-sensitive: 2 ms per detent when turned slowly.
  • Attack / Decay — per-loop amplitude envelope (3 ms → 3 s / 5 s), used on trigger, mute, pause and stop.
  • Wear (Tape Wear) — the loop wears out like the ageing tape loops of William Basinski's Disintegration Loops. The knob is a rate: every time a playhead crosses a spot on the loop, that spot loses a little oxide. Treble goes first (spacing loss, 54.6·gap/wavelength dB), then the level, until the spot drops out; damage grows where it started and speeds up at the end, so the melody fragments into the same holes lap after lap. It is truly stereo: each track has its own damage (mostly shared, partly its own, the edge track wearing a little faster), so a hole often opens on one side first and the image wanders as the loop dies. More active playheads wear it faster. Turn it to 0 and the tape stops wearing but stays damaged; Shift + Undo + pad (or Sessions → Reset) gives you clean tape again, recording kept, and Undo brings the damage back. The recording itself (and the saved WAV) is never touched, and the damage is saved with the session. At the top an 8-second loop collapses in about a minute, in the middle in about twenty.

Two send buses — the Palette engine

Send A and B each select from 29 effects (Off + 24 Palette effects + four reverbs): Drive, Sweeten, Fuzz, Howl, Fold, Swell, Doubler, Vibrato, Phaser, Tremolo, Pitch, Shift, Cascade, Reels, Collage, Reverse, Space, Bloom, Filter, Squash, Cassette, Broken, Interference, Halo, Plate, Quartz, Prism, Veil — each with Amount / Macro / Drift.

The last four are proper reverbs, and the last three come from the standalone instruments:

Tank Amount Macro Drift
Plate Dattorro plate decay pre-delay damping
Quartz 8-line Hadamard FDN, dual-band damping room → hall dark → bright still → swimming
Prism same tank, frequency-dependent decay decay lows ring ⇄ highs shimmer crossover + movement
Veil Householder FDN, modulated diffusers size + tail dark → bright movement + colour

Every effect is loudness-matched to the dry signal it replaces (the Character family used to sit many dB apart), and switching effects morphs — the outgoing one fades as the incoming one fades in — so sweeping through the list never clicks. The PalFX punch pad behaves the same way.

Punch-in FX (right 16 pads)

Sixteen momentary effects over a 2-second capture ring, in four families — Loops (1/12 · 1/16 · short · Chop, with 32 rhythmic patterns drawn from Signal), Grains (Haze · Mosaic · Smear · Strum), Pitch (Oct− · Oct+ · Glide · Shimmer) and Time (Stretch · Freeze · Reverse · PalFX, one Palette effect as a punch: FX / Amount / Macro / Drift, default Space) — up to 5 stacked in series. Slice effects auto-pan in sync with their rate, and every slot loudness-matches its wet to the dry it replaces. The grain effects draw on a 16-grain pool with voice stealing and window-power normalisation. Oct+, Oct−, Shimmer and Chop are spread to stereo by a microshifter, the same widener Stretch and Freeze use. Hold a pad to apply; knobs 5–8 edit the held effect's four parameters live, and pad pressure drives a per-effect expression (subdivide, density, glide, freeze, rate…) shown in the footer. Shift + pad latches it on hands-free; Shift while holding latches it exactly as it is, pressure included. Undo + pad resets a pad to its defaults.

FX sequencer (✕ button)

One shared 16-step pattern of punch pads, modelled on the Polyend MESS. Tap ✕ to run or stop; hold ✕ to see the pattern on the step buttons (orange = step, dim = extension, white = playhead) and its page: Run · Speed (1/32 … 1 beat) · Length · Chance · Gate · Swing · Direction · Clear. ✕ + pad(s) + step writes up to five pads into a step with their knobs and pressure locked; ✕ + step clears it; ✕ + step + later step extends it; ✕ + held step + knob 4 sets that step's play chance (Always, 10–90 %, Like Last, Play X Skip Y) and knobs 5–8 edit its locks. Play restarts the pattern.

Tape transport (◀ ▶)

Hold Left and the whole master brakes to a stop in about three seconds; hold Right and it winds up to a tone. Release and it eases back to 1×. The glide is linear in semitones and the last octaves of a stop fade to silence.

The Input (track button 1, two pages)

Everything you record passes through here first, so set it before you play — it is baked into the take. Input Tape is the machine: Mon (monitor level) · Tape · Trim · Drive · Wow · Flut · Hiss · Gen. The 13 models are Tapeless · Clean · Cass1 · Cass2 · VHS1 · VHS2 · Reel15 · Reel7 · Reel3 · 4trk · Porta · Dub · Warp, default Clean. Each model's high-frequency loss is derived from its head gap and tape speed, with a speed-scaled head bump, so the three reel speeds genuinely differ; VHS1 is the Hi-Fi track (an FM carrier with its companding noise reduction, bright but pumping) and VHS2 the linear edge track, slow and dark; Gen is a static setting — the take is recorded as if already dubbed up to four times on that machine: the loss filter and the head bump re-applied once per pass, a little more saturation and hiss, and more wow per dub. Tapeless bypasses the machine — no hiss floor, no head loss or bump — but every knob still works, and Drive pushes up to +24 dB into the curve on every model.

Input EQ (page 2): LoCut · HF · LowF · Low · Mid · MidF · High · HiF. A blend of the Studer 962 presence band and the Tascam 424 MkII/MkIII channel EQ (owner's manual p.11/36/45): ±15 dB 2nd-order shelves with a sweepable low corner (LowF 40–400 Hz, default 100 Hz — the 424's point) and a high corner 3–15 kHz (default 10 kHz), a ±12 dB peak sweepable 150 Hz–7 kHz, a 20–800 Hz low cut and a 2–20 kHz tape rolloff (HF: turn down to roll off). Every sweep is log, so each octave gets the same knob travel.

Dynamic sampling (Capture button)

The input plays the sampler. Turn Dyn (K1) to a mode — or long-press Capture to toggle it; the button blinks while it listens — and every phrase you play is captured into a pad by itself: an ordinary recording, so it gets the tape stage, the loop pages, the sends, and its LED goes red then green like any take. What was on the pad is replaced, never stacked (Chase Bliss Onward); Spread is how many pads the sampler rotates through from the selected one — 1 replaces the same pad every time, 16 is a rolling memory of the last sixteen phrases (AC Noises Continua's dimension, with sixteen layers). Muted pads are skipped, and a pad that already holds a loop is never overwritten until you say so: when the range is full the menu opens and asks CONTINUE DYNAMIC LOOPING AND OVERWRITE PADS? in whatever view you are in — K6 lets it carry on, K5 or Back turns Dynamic off.

Knob
Dyn Off · Level (a sound above the threshold) · Onset (a transient, however loud the sustain under it; the next hit ends one capture and starts the next) · Phrase (a sentence: starts on sound, ends at a gap of 400 ms or more, at least 1 s long) · Clock (every Size on Move's clock — on the beat, on the bar once Move has pressed Play; Free = 1 bar)
Sense the mode's threshold, −60 → −6 dBFS
Size 1/16 … 8 bars at Move's tempo, or Free — record until 200 ms of quiet (default)
Spread 1–16 pads from the pad selected when Dynamic was switched on (default 16); selecting pads afterwards doesn't move it
Error how much of each new capture is randomised — 0 faithful, 1 a new creature every time
Sustn how long a capture plays before it pauses itself (its Release fades it) and its pad is free for the next capture: 1 → 60 s (SYNC: 1 → 64 bars), top = forever
RndPad · RndAll randomise every loop-page parameter of the selected pad / of all sixteen, no confirmation

A 100 ms pre-roll means a capture keeps the transient that triggered it. On screen Sense reads in dB, Error in %, and Sustn in seconds (bars in SYNC) or never. Dynamic is saved with the set; loading a session brings back its Dynamic knobs but always leaves the sampler off. Randomise is musical by rule: Speed and Pitch move only as complementary musical intervals (the heard transposition and the tempo ratio are both octaves, fifths or major/minor thirds — never more than two octaves — and 30 % of the time nothing moves), playhead speeds are never touched, heads 2–4 are switched on or off and only an active one gets a random pan, the loop's Volume is left alone, the Start/End window never drops below half the loop, and sends, Comp and Sat never go past 60 %.

Drift — a global evolving memory (Sample button)

A drifting-delay memory station inspired by Soma COSMOS, on the Sample button. Four coprime-length delay lines, each read at a slowly drifting tap, feed back through a matrix that morphs from self-feedback to a normalised Hadamard cross-mix. The loop mix feeds it, the memory recirculates, and the coprime lengths plus per-line async LFOs keep it from ever landing on an exact repeat. It runs in the master chain just before the pump, tanh-limited so high feedback sustains without runaway.

  • Drift feed level · Rate tap-drift speed · Size tap length (shimmer → long hall) · FBk memory sustain (below unity fades, near unity holds) · Supr loud input erases old memory (play over to replace) · Blur self-feedback → full cross-mix · Damp tail high-frequency damping · Mix wet into the master.
  • FBk is capped below unity, so the tail always fades: up to a few minutes at maximum. Leave everything paused and a silence bleed clears an abandoned tail after about eight seconds with no input.
  • Drift and Mix start at zero (silent until dialled in); ~1.7 MB of memory; saves with the session.

ASYNC / SYNC (Sessions page, K8)

Loopex is an asynchronous looper by default: loops are exactly as long as you play them and nothing waits for a beat. Switch Mode to SYNC and it locks to Move's bars and beats (4/4 bars, triplet ratios included). Switching is always silent: nothing that is playing jumps, values are only put on the grid the next time you turn them, and anything waiting for a beat starts at once if you switch back.

ASYNC SYNC
Tap to record starts now starts on the next beat (a tap up to 1/8 beat late still catches the beat)
Tap to close exactly what you played whole bars (under ¾ bar: whole beats) — it records on to the bar line, or trims
Threshold arm starts when the input crosses starts on the beat after it crosses
Un-pause from Start, now from Start, on the next bar (the pad blinks while it waits)
Move presses Play — every playing loop restarts on bar 1
Tempo change loops ignore it loops follow the tempo tape-style (speed and pitch together), from the tempo they were recorded at
Speed / head speeds 0.1-semitone steps ¼× ½× ⅔× 1× 3/2× 2× 4×
Start fine, 2 ms per detent 1/16 steps
End (length) fine 1/16 · 1/8T · 1/8 · 1/4T · 1/4 · 1/2T · 1/2 · 1, 2, 4, 8 bars · all
Jump heads / Scatter free leap on 1/16s, to 1/16 positions / slices on 1/16s
Dynamic Size default Free its own value, default 1 bar; Free = until quiet, rounded to bars and brought in on the bar
Dynamic Sustain 1–60 s 1–64 bars
Stumble step 20–1000 ms 1/32 … 1 bar, on the grid
Drift Rate free 8 bars … 1/16 per cycle
FX sequencer / Pump follow the tempo locked to the bar
Punch Loops, Chop, Reverse, Glide repeat from the moment you hit them live audio until the next grid line, then the bit that just played repeats on the grid; Rate / Len in note values (triplets included)
Punch pressure continuous: the rate follows your finger, releases bloom out steps on the grid: Loops 1 → ½ → ⅓ → ¼, Reverse and Strum through shorter note values, Chop and Mosaic ×2 — a new step takes over on a full slice line
Mosaic / Strum free-running grains fire on the grid lines; Strum's Rate in note values
Punch LFO Rate 0.05–20 Hz 8 bars … 1/32, triplets included, locked to the bar
Screen seconds bars.beats, with beat and bar lines on the waveform

SYNC keeps time from Move's MIDI clock: Start or Song Position gives it the bar. Without a running clock it keeps Move's tempo on its own grid.

Sessions

64 numbered slots, saved and loaded from the ≡ (Menu) button, each named slot_YYYYMMDD_HHMM; saving over a used slot asks for confirmation. Settings and recorded audio are stored — the audio as plain 16-bit stereo WAV files (sessionNN/sNN_loopNN.wav, one per loop) that you can copy straight off the Move — the folder shows up in the Schwung Manager's file browser (move.local:7700 → Files → data/UserData/UserLibrary/Loopex); sessions from before 0.9.5 are moved there and still load. Clear (K5 on the Sessions page) wipes all sixteen loops and resets every loop's settings after a confirmation (the global pages — Output, Input, Drift… — are untouched); Reset (K6) returns every setting of the selected loop to factory defaults — the audio and its playback are untouched — and Reset All (K7) does the same for all sixteen, both after a confirmation; all disk work runs on a SCHED_OTHER worker thread (lpx-sio) pinned to cores 0–2, never on the audio callback. Two more workers, lpx-ps0 and lpx-ps1, run the per-loop pitch shifters the same way (even and odd loops). Sessions live in /data/UserData/UserLibrary/Loopex/ so reinstalls keep them.

Perform, MIDI and I/O

  • Perform menu (two pages): page 1 — Stumble (probabilistic step glitch), Jump and Scan (doubles the speed while held: exactly one octave up); page 2 — the master Filter (Cut · Reso · FChar), Master Clock (Clock · ClkMd · ClkAt) and the ducking Pump (Pump · PmpRt).
  • External MIDI (Settings → MIDI): three modes — Off (default) ignores external MIDI; Keys plays the loops from a MIDI keyboard (8-voice polyphony, each MIDI channel driving a loop chromatically through its full FX chain: channel 1 → loop 1, channel 2 → loop 2, … — but see Known limitations); Ctrl hands external MIDI to the LaunchControl XL control surface (below). Off by default so Move tracks' MIDI-out can't trigger loops.
  • Settings (two pages): page 1 is behaviour and I/O — arm threshold, overdub mode, loop filter (the 12 Master-filter voicings applied to every loop's low-pass), root note, input channels (InCh: Stereo · Left · Right · Sum — a mono synth on one jack records to both sides with Left), input source (see below), MIDI In and MIDI Out. Page 2 is Output, the master stage in signal order: Out · LoCut · HiCut · PWide · Char · gSat · Glue · Limit.
  • Character (Output page) is thirteen hardware voicings ordered by grit — Off · 962 · Air · SSL · Neve · Trident · Studer · API · Ampex · MPC · S950 · SP12 · Emu — and it sets far more than an EQ curve. Each one chooses the converter (bit depth, sample-rate hold, µ-law companding on the MPC), the saturator's curve and asymmetry (first-order ADAA, so the grit is the machine's, not aliasing), the pole count of LoCut/HiCut, how the loops are read (Hermite → linear → drop-sample), and it gives Glue and Limit the attack, release, knee and distortion of the dynamics unit that machine shipped beside — the 2254 behind a Neve, the 2500 (with its THRUST sidechain) behind an API, the SSL bus compressor.
Char Machine What it sets
Off — transparent bypass
962 Studer 961/962 desk near-flat, a whisper of transformer; 2-pole filters; no glue colour
Air Focusrite ISA 110 the air band: +3 dB at 15 kHz, 3-pole filters, clean and open
SSL SSL 4000 bus tight lows, present mids; 3-pole filters; the bus compressor's fast glue
Neve Neve 1073 + 2254 warm lows, silky top; 2254 glue with its diode-bridge distortion
Trident Trident A-Range broad mid lift, 2-pole; the slow, soft A-Range dynamics
Studer Studer A800 tape 60 Hz head bump, airy top; slow tape glue (30 ms / 600 ms)
API API 550A + 2500 forward 800 Hz, fast; 2500 glue with THRUST sidechain tilt
Ampex Ampex ATR-102 fat lows, the heaviest saturation; slowest glue, limiter at −1.7 dB
MPC Akai MPC60 40 kHz hold, 12-bit µ-law companding, 18 kHz 2-pole reconstruction
S950 Akai S950 12-bit linear, 25 kHz, 6-pole 10 kHz reconstruction filter; linear-interpolation reads
SP12 E-mu SP-1200 26.04 kHz, 12-bit, no reconstruction filter; drop-sample reads (repeats samples when slowed)
Emu E-mu SP-12 the same 26.04 kHz clock, darker fixed output (−4.5 dB at 5.5 kHz); drop-sample reads

Every figure, its source and whether it is documented, measured or chosen is in docs/CHARACTER-RESEARCH.md.

  • Record source (Settings p1 → InSrc): Line · Master · S1 · S2 · S3 · S4 · M1 · M2 · M3 · M4 · Self. Line is the line/mic input (default). Master is the Move's whole master mix, minus Loopex's own output so it can never feed back. S1–S4 are Schwung's own four mixer slots and M1–M4 the four OG Move hardware tracks, each captured as an isolated stereo stem over Ableton Link Audio: the host publishes its slots on /schwung-pub-audio and reconstructs the Move tracks on /schwung-link-in, and Loopex reads the selected channel (needs the host's link_audio_publish, on by default). So a loop can sample any single Schwung or Move track on its own, not just the summed mix. Self is Loopex's own master output, one block (2.9 ms) old — every loop, the punch chain, both sends and the master stage — so you can resample the whole mix back into a new loop. Unlike Master it carries no feedback guard, because the regeneration is the point: the tape limiter at the end of the master chain keeps it saturating instead of diverging, and InGain is the control. If the host cannot provide a stem (they need host 1.4 with link_audio_publish on), Loopex records Line instead and says so on screen while Settings is open.
  • Undo walks back 32 steps (a gesture on all sixteen pads comes back in one press but uses 16 of them): overdubs (every overwritten sample is saved as it goes), clears, arms, Dynamic overwrites, randomise, reset — newest gesture first; a gesture that touched several pads (Rnd All, Clear) comes back in one press. Clears and overwrites swap buffers, so they come back instantly. Knob moves and a first recording onto an empty pad are not undoable; loading a session starts a fresh history.

LaunchControl XL (external MIDI)

A Novation LaunchControl XL can drive all sixteen loops. Set MIDI (Settings p1) to Ctrl to route external MIDI to the surface; MIDI Out (Settings p1 → MidiO) mirrors each loop's transport back to the LCXL's LEDs, sent on MIDI channel 2 so the notes never collide with the Move's own channel-1 pads.

  • Track Focus buttons (row 1) — record / play / pause per loop; Track Control buttons (row 2) — mute / unmute.
  • Per column the top knob is Loop Speed, then Filter, then Pan, and the fader is Volume, for that loop.
  • Two SysEx templates ship at the repo root — BlackBox 1-8.syx (loops 1–8) and BlackBox 9-16.syx (loops 9–16); set both to MIDI channel 2 so the LED feedback lands.

Controls

Pads and steps

Gesture Action
Tap left pad cycle Empty → Rec → Play ⇄ Pause (un-pause restarts from Start)
Shift + Undo + pad reset that loop's settings to factory (audio stays)
Hold left pad (~1 s) Clear the loop (Undo restores it)
Shift + tap cycle playback speed (½× / 1× / 2×)
Mute + tap quick-mute (playhead keeps running — returns in phase)
Copy + pad, then pad clone a loop (source blinks, second pad receives it)
Loop + pad cycle loop length 1× → ½× → ¼× → ⅛×
Right pad punch-FX (momentary) · Shift + pad = latch · Undo + pad = reset params · ✕ + pad + step = sequence
Step select track (shows its waveform) · same step again = next loop page · hold ~0.6 s = overdub that loop (one hand)
Track buttons 1–4 menus: Input (Tape / EQ) · Perform · Send FX · Settings

Buttons and knobs

Control Action
8 knobs selected-track params (or menu / punch params)
Touch a knob full 8-knob page on screen (~5 s)
Up / Down previous / next loop page (P1–P5)
Jog wheel scrub the selected loop (audible, tape-style) · in P4 moves the touched head
Capture Dynamic sampling menu · hold = sampler on/off (blinks while listening)
✕ (Delete) tap = run/stop the FX sequencer · hold = pattern view + FX Seq page
Left / Right tape stop / tape wind (held)
Sample/Record Drift menu · Shift + Sample = threshold-arm (pad blinks red) · + jog sets the threshold
≡ (Menu) Sessions menu
Mute / Copy / Loop (held) modifiers — lit while held
Undo step back up to 32 steps: overdub, clear, Dynamic overwrite, randomise, reset
Back close a menu, then exit
Full exit Shift + Volume + Jog-click (a plain Back only suspends)

Screens

The main screen shows the 16-track strip, CPU and input level. Touching a knob or opening a menu shows the full 8-knob page; pressing a step (or scrubbing) shows the loop's waveform with the active playheads riding over it. Turning a loop's Start or End shows that waveform with labelled S and E markers at the trim points. Both fall back after ~5 s.


Signal chain

Record path: input -> tape model (13) -> tape drive -> input EQ -> HF loss (head physics)
             + head bump -> wow + flutter -> generations (the model's loss filter, once per pass)
             -> [loop buffers]

Per voice:   4 playheads (Hermite reads + rate-aware anti-imaging; the sampler Characters
             read linear / drop-sample) -> Seed slice re-order -> Scatter
             -> Pitch (Signalsmith Stretch, on its own thread) -> saturation -> wow/flutter
             -> DJ filter (+reso) -> tilt EQ -> Studer 962 EQ -> stability -> compressor
             -> amp env -> tape transport -> pan/vol -> sends A/B

Master:      sum of voices + MIDI-poly -> input monitor -> + Palette send returns
             -> master wow/flutter -> compressor -> Stumble -> [Clock + Filter, pre]
             -> punch-FX (5 in series) -> [Clock + Filter, post] -> Drift -> pump
             -> OUTPUT PAGE: gSat -> lo/hi cut -> Character -> Glue -> master out
             -> tape limiter -> TPDF dither -> output

Build and install

Loopex is on the Schwung Module Store — most people can install it from the Schwung Manager (search Loopex), no build needed. To build from source you need a host with Docker (cross-compiles the ARM64 dsp.so) and ssh/scp, and an Ableton Move running Schwung reachable over USB-C at move.local (or 172.16.254.1):

cd overtake-shell
./scripts/build.sh      # Docker cross-compiles dsp.so (aarch64) + validates ui.js
./scripts/install.sh    # scp + atomic-rename install to move.local

Then on the Move: rescan modules and open Loopex from the Overtake list. If it was already loaded, full-exit first (Shift + Volume + Jog-click) — suspend_keeps_js otherwise resumes the old code.

MOVE_HOST overrides the target (MOVE_HOST=ableton@172.16.254.1 ./scripts/install.sh).

Deploy safety: the installer stages to /data/UserData and moves files into place atomically — never write straight over a mapped .so, which crashes the audio process.


Repository layout

overtake-shell/            <- the active module
  module.json              Overtake manifest (id/name/capabilities)
  src/
    loopex.c               engine: voices, playheads, punch-FX, Character, Drift, sessions, master
    palette_fx.c/.h        24-effect Palette engine + Dattorro Plate
    fx_clouds.cc           Clouds-based Space/Bloom (C++)
    pitch_shift.cc         Signalsmith Stretch wrapper (per-loop Pitch, run on the lpx-ps worker)
    warps_data.c           Warps wavetables (Fold/Shift)
    ui.js                  QuickJS Overtake UI (pads, knobs, screens, LEDs)
  include/plugin_api_v1.h  host API
  vendor/                  clouds_engine + signalsmith + signalsmith-stretch (third-party DSP)
  scripts/                 build.sh, install.sh, Dockerfile
docs/MANUAL.md             the full manual
docs/CHARACTER-RESEARCH.md every figure behind the 13 Character voicings, with sources
docs/CHANGELOG.md          release history
OVERTAKE-SDK.md            reverse-engineered Overtake SDK reference
design-spec.md             full design rationale

Known limitations

  • MIDI-keyboard play reaches 4 loops, not 16. In Keys mode each MIDI channel plays its own loop, and the module maps all sixteen (channel n → loop n). But a Schwung Overtake module only receives external MIDI through the host's four forwarding slots, so only four channels arrive at once — the other twelve have no slot to ride in on. To play loops 1–4, set four Schwung slots (or Move tracks) to receive channels 1–4 with Forward = Auto. This is a host delivery limit, not a module one (MOVE_MIDI_SOURCE_FX_BROADCAST is audio-FX-only, so a synth-role module can't tap it); lifting it to all 16 needs Schwung's ext_midi_remap passthrough enabled host-side, after which the existing mapping handles all sixteen unchanged.

Changelog

Release history, with what changed and why: docs/CHANGELOG.md.


Credits

Loopex stands on a lot of open work. Code that is vendored or ported is used under its own license (see overtake-shell/vendor/ and the file headers); the rest is inspiration.

Code used

Sibling Move modules (same author)

Other software instruments (same author)

  • Res and Essaim — the Quartz and Prism reverbs: one dual-mode 8-line Hadamard FDN whose two feedback colourings fill the roles of Ableton's abl.dsp.quartz~ and abl.dsp.prism~ Max objects.
  • Phasma — the Veil reverb: a modulated Householder FDN (Signalsmith-style tank with CloudSeed-style modulated diffusers) carrying Prism's band-split colouring.

Other Schwung modules

Design inspiration

  • Polyend MESS — the FX sequencer: per-step locks, play chance, extensions, gate and swing. https://polyend.com/mess/
  • 1010music Blackbox — sixteen free-running pads. https://1010music.com/product/blackbox
  • Kinotone Ribbons — tape character as an instrument. https://kinotone.com/ribbons
  • Puremagnetik LAPS — layered asynchronous loops. https://puremagnetik.com
  • Chase Bliss Blooper, Mood MK2, Generation Loss MK2 — Stability, the old Clock's degradation, Disintegration overdub, Generations. https://www.chasebliss.com
  • Hologram Microcosm — the grain and glide punch families. https://hologramelectronics.com/microcosm
  • Chase Bliss Onward — the Dynamic sampler's core idea: the input decides when to capture, and a new capture replaces what was there instead of stacking on it. https://www.chasebliss.com/onward
  • AC Noises Continua — the stereo dynamic sampler behind Dynamic's rolling memory: Spread is Continua's dimension, sixteen layers wide. https://www.acnoises.com/products/continua-stereo-dynamic-sampler-and-multi-effect
  • Character voicings — every figure behind the thirteen Char models, with sources and an explicit mark on what is documented versus chosen: docs/CHARACTER-RESEARCH.md.
  • Studer 961/962 — the per-loop channel EQ, modelled on the console's Fächerentzerrer (fan equaliser) in the 1.960.221 input unit. Bass and Treble corners and slopes are a least-squares fit to the response curves printed in the service manual (§1.7.2 / D 3/3), digitised off the plot; Mid follows the published Q = 1, 150 Hz–7 kHz, ±11 dB presence spec.
  • Tascam 424 MkII / MkIII Portastudio — the other half of the Input EQ: its ±15 dB shelves with the sweepable 100 Hz low corner and the 10 kHz high shelf, taken from the owner's manual and blended with the Studer 962 presence band.
  • William Basinski, The Disintegration Loops — Tape Wear: ageing tape loops shedding oxide on every pass over the head, so the music breaks into the same holes lap after lap. https://en.wikipedia.org/wiki/The_Disintegration_Loops
  • Soma Laboratory COSMOS — the Drift memory: prime-length shifting delay lines that recombine endlessly into an ever-evolving ambient layer. https://somasynths.com/cosmos/
  • norns loopers — wrms, concrète, cranes, oooooo, otis, reels, ndls, samsara, mlre, nydl, giro: multiple playheads, threshold arm, loop multiples, jog scrub. https://norns.community

License

GPL-3.0

About

16-track live tape looper for Schwung (Overtake module)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages