overdub

schwung-maze

sd88me/schwung-maze · ★ 2

Moog-Labyrinth-inspired mono synth voice and generative MIDI sequencer, for the Schwung framework on Ableton Move. Two 8-step generative sequencers that quantise random voltages to a scale, and play MIDI out — a recreation of the Labyrinth's dual generative sequencer section. Paired with a Sine TZFM, wavefolded, percussive analog style voice

Built on Schwung

README from GitHub, MIT

Maze — Moog-Labyrinth-style modules for Ableton Move (Schwung)

Moog-Labyrinth-inspired modules for the Schwung framework on Ableton Move. This repository ships three modules:

ModuleIDTypeWhat it is
Mazemaze_seqovertake toolFull pad + step-button instrument with its own display
Maze Litemaze_seq_liteslot MIDI FXThe same engine as a chain MIDI-FX slot
Maze Voicemaze-voicesound generatorMonophonic thru-zero oscillator / wavefolder / SVF voice — the Labyrinth's synth section as a chain slot

maze_seq / maze_seq_lite run two 8-step generative sequencers that clock-sync to the Move transport, quantise random voltages to a scale, and play MIDI out — a recreation of the Labyrinth's dual generative sequencer section.

maze-voice is the matching monosynth: pair it in a Signal Chain slot behind Maze Lite, or via Maze Overtake.


Maze Sequencer

Features

  • Dual 8-step generative sequencers with per-step random CV, quantised to a scale.
  • Corrupt (0–100) — mutates stored voltages; past 12 o'clock also flips bits (evolving patterns).
  • Range (0–100) — bipolar pitch spread around the root.
  • Trig Mix — velocity cross-fade between Seq 1 and Seq 2 (−63 = Seq1 only @ vel 127, centre = both @ vel 100, +64 = Seq2 only @ vel 127).
  • Length / Bit Flip / Advance per sequencer.
  • Sequence Reset — snap a sequencer's play head back to step 1 every 1 / 2 / 4 / 8 bars (or Off). Bar-aligned at any Note Rate. Per-sequencer in Maze Lite, plus a Reset Both control that resets both together (also the 8th knob on Maze's SEQUENCERS page).
  • 12 scales, selectable key, note-rate (1/32…1 bar), gate length (1/4…2 steps).
  • Clock-synced to the Move transport (24 PPQN, start/stop/continue).
  • Pattern + position persistence (Maze tool) — survives exit.

Maze Seq (tool) hardware layout

  • 16 step buttons = the two sequencers. 1–8 = Seq1 (red bit / yellow play head), 9–16 = Seq2 (blue bit / yellow play head). Press to flip a bit. The play head stays lit when the transport is stopped.
  • Top 3 pad rows = a fixed scale keyboard (each row = one octave, ascending scale degrees left→right; the middle-row first pad is the root). Press a pad to transpose the whole sequence to that interval. Octave roots light white, the active pad lights green.
  • + / − = shift the pad keyboard up/down an octave to reach higher/lower registers. The sounding note doesn't change — the layout moves, and the highlighted pad follows the same note to its new row.
  • Bottom pad row = per-sequencer advance ◄/► (orange) and length−minus1 (red).
  • Jog wheel = switch between the two knob pages.
  • Knobs — Sequencers page: 1 - Corrupt, 2 - Range, 3 - Length (Seq1, red LEDs); 4 - Trig Mix (red/white/blue LED); 5 - Corrupt, 6 - Range, 7 - Length (Seq2, blue LEDs); 8 - Reset Both, in bars (orange when armed, off when Off).
  • Knobs — Global page: 1 Scale, 2 Key, 3 Note Rate, 4 Note Length (white LEDs); 5 - Seq1 MIDI Channel, 6 - MIDI Seq2 Channel (green LEDs).
  • Back = hide (keeps playing in the background); Shift+Back = exit.
  • Remote UI — open Maze's panel from Schwung Manager for a browser control surface: both sequencers' Bits (click a step to flip it directly, same as the hardware) with a genuinely live-tracking play head, Corrupt/Range/Length/Trig Mix/Reset/Advance, the Global page, and Panic.

Maze Seq Lite (slot MIDI FX)

Insert in a MIDI-FX slot, route to a synth, press Play. Pages in order:

  • Sequencer 1: Corrupt, Range, Length, Bit Flip, Advance, Reset, Trig Mix.

  • Sequencer 2: Corrupt, Range, Length, Bit Flip, Advance, Reset, Trig Mix (same Trig Mix as page 1, kept in sync).

  • Global: Scale, Note Rate, Note Length, Reset Both.

  • Bit Flip and Advance are momentary buttons (fire once per press/turn).

  • Incoming notes set the root (transpose).

  • Remote UI — a browser panel with all of the above. No live pattern/play-head display: a chain-slot module doesn't get the live-state push a Tool-tab module (Maze, above) does in this version of Schwung, so Bit Flip/Advance still act on the real sequence, just without a visual readout here.


Maze Voice (chainable sound generator)

A monophonic Moog Labyrinth–style thru-zero-FM voice that recreates the Labyrinth's parallel voice path: sine VCO + triangle modulator with TZFM, a wavefolder and a state-variable filter (LP→BP morph) in switchable routing (VCW>VCF / parallel / VCF>VCW).

Voice architecture

  • Two low‑harmonic oscillators — a sine VCO and a wide‑range triangle MOD VCO.
  • Thru‑zero FM from the MOD VCO into the VCO — stays in tune at any depth.
  • Ring modulation of the two oscillators
  • Variable‑tone noise generator, morphing dark → bright.
  • Diode/transistor‑style wavefolder (VCW) with a Bias control for asymmetric folding (even vs odd harmonic emphasis).
  • 2‑pole state‑variable filter morphing continuously from lowpass → bandpass, with resonance up to near self‑oscillation that keeps its low end intact, plus a Filt Drive stage into the filter input for MS‑20‑style grit.
  • 3‑way ORDER routing — VCW>VCF, Parallel, or VCF>VCW (set on the WaveFolder page) — with a bipolar Blend crossfader between the wavefolder and filter paths (available on both the WaveFolder and Filter pages).
  • Two decay‑only envelopes — EG1 (modulation) and EG2 (VCA amp) — with a musically weighted, exponential time response from 5ms to 2s.

Analog character

  • Per‑channel warm overdrive — VCO, MOD and Noise each break up independently above unity (0–200 mixer knobs, 100 = unity)
  • Boss‑pedal‑style overdrive on the final VCA output (drive → asymmetric soft clip → passive tone)
  • Oversampling + anti‑aliasing (ADAA) on every nonlinear stage.
  • Nonlinear filter resonance that self‑limits (vocal squelch, not a digital screech).
  • Per‑voice drift & fixed detune
  • RC‑curve envelopes, DC blockers, a 2 ms attack ramp (click‑free retriggers), and a low analog noise floor (~−79 dB).

Ergonomics on Move

  • Six knob pages with jog‑wheel navigation: Voice · WaveFolder · Filter · Tone · Mod Routing · Randomise.
  • Keyboard tracking depth per oscillator (Mod Routing page), a Move‑native stand‑in for the hardware's 1V/oct inputs.
  • Randomise page — arm any of Voice / WaveFolder / Filter / Tone with per‑page toggles, then hit Generate to randomise all armed pages at once.
  • Preset save/recall of the full patch, including the Randomise toggles.
  • Remote UI — open Maze Voice's panel from Schwung Manager for a browser control surface laid out from the real Labyrinth panel: Oscillators, Mixer, Wavefolder → Filter, Output, all live two‑way synced with the device.

Signal Flow

 MIDI note / velocity
        │
        ├─► EG1 (decay)  ──┐ modulation → VCO pitch · MOD pitch · FM depth
        │                  │              · Fold amount · Filter cutoff
        └─► EG2 (decay)  ──┼─┐
                           │ └──────────────► VCA (amplitude)
                           │
   ┌───────────────────────┴───────────────────────────────────┐
   │                     OSCILLATORS                            │
   │   VCO (sine) ◄──TZFM── MOD VCO (triangle)                  │
   │       │                    │                               │
   │       ├────── RING (VCO × MOD) ──────┐                     │
   │       │                    │         │      NOISE (var tone)
   └───────┼────────────────────┼─────────┼────────────┼────────┘
           ▼                    ▼         │            ▼
      warm sat              warm sat      │        warm sat        ← per-channel
      (VCO lvl)             (MOD lvl)     │        (Noise lvl)       overdrive
           └─────────┬──────────┘         │            │
                     ▼                    │            ▼
                  Σ mix  ◄────────── ring (clean) ─────┘
                     │
                     │
     ┌───────────────┴────────────────────────────────────┐
     │            ORDER  (VCW>VCF · Parallel · VCF>VCW)     │
     │                                                     │
     │     ┌── VCW: Wavefolder (+ Bias) ──┐                │
     │     │                              │                │
     │     └── VCF: State-Variable Filter ┘   (LP ◄─► BP)  │
     │              cutoff · reso · mode · drive            │
     │                                                     │
     │            BLEND  (fold ◄─────► filter)             │
     └───────────────────────┬─────────────────────────────┘
                             ▼
                             │
                     VCA  × EG2 × velocity
                             │
                   Tone/Sat  (Boss-style OD)      ← on the VCA output
                     drive → asym clip → tone
                             │
                        Out Level
                             │
                    + analog noise floor
                             ▼
                          L / R  out

Install

Option A — manual (for testers, no store needed)

  1. Download the latest tarballs from Releases.
  2. Extract onto the Move (each module goes in its own category dir):
    # tool
    scp maze_seq-module.tar.gz ableton@<MOVE_IP>:/tmp/
    ssh ableton@<MOVE_IP> 'cd /data/UserData/schwung/modules/tools && tar xzf /tmp/maze_seq-module.tar.gz'
    # lite (slot MIDI FX)
    scp maze_seq_lite-module.tar.gz ableton@<MOVE_IP>:/tmp/
    ssh ableton@<MOVE_IP> 'cd /data/UserData/schwung/modules/midi_fx && tar xzf /tmp/maze_seq_lite-module.tar.gz'
    # voice (chainable sound generator)
    scp maze-voice-module.tar.gz ableton@<MOVE_IP>:/tmp/
    ssh ableton@<MOVE_IP> 'cd /data/UserData/schwung/modules/sound_generators && tar xzf /tmp/maze-voice-module.tar.gz'
    
  3. Power-cycle the Move. Maze appears in Shadow → Tools; Maze Lite in a MIDI-FX slot; Maze Voice in a sound-generator slot.

Option B — Schwung Manager / Module Store

Once listed in the Schwung catalog, install from the Schwung Manager web UI at http://move.local:7700.


Build from source

Requires Docker (the build cross-compiles the DSP for the Move's ARM64 chip).

bash scripts/build.sh
# produces:
#   dist/maze_seq-module.tar.gz
#   dist/maze_seq_lite-module.tar.gz
#   dist/maze-voice-module.tar.gz

Vendored headers

The DSP compiles against two Schwung API headers. Copy them from a Schwung checkout into src/include/ before building (kept out of git so they stay in sync with the host ABI):

cp <schwung>/src/host/plugin_api_v1.h    src/include/
cp <schwung>/src/host/midi_fx_api_v1.h   src/include/

Repository layout

src/
  maze_seq/                 # overtake tool
    module.json  ui.js  help.json
    dsp/maze_seq.c
  maze_seq_lite/            # slot MIDI FX
    module.json  help.json
    dsp/maze_seq_lite.c
  maze-voice/               # chainable sound generator
    module.json  help.json
    dsp/maze_voice.c
  include/                  # vendored Schwung headers (not committed)
scripts/
  build.sh  Dockerfile
.github/workflows/release.yml
release.json  catalog-entries.json

Publishing (tagged releases)

# bump versions in the src/*/module.json files, commit, then:
git tag v1.0.0
git push --tags

GitHub Actions cross-compiles all modules, attaches the tarballs to the release, and updates release.json on main. To be listed in the Schwung Module Store, open a PR adding the entries in catalog-entries.json to module-catalog.json.


Credits & license

Created by sd88me. Inspired by the dual generative sequencer of the Moog Labyrinth (concept only; original code). Built for Schwung by Charles Vestal.

Licensed under the MIT License — see LICENSE.