Skip to content

Releases: filliformes/loopex-move

Loopex v0.9.1 — first-day feedback fixes

Choose a tag to compare

@github-actions github-actions released this 20 Sep 05:55

Fixes from the first day of user feedback on 0.8.7 / 0.9.0.

  • Input Tape knobs work on every tape model. They were gated on the model, which made the whole
    page silently dead on Tapeless, and on Clean — the default — Drive multiplied by 4 and then
    divided by 4 around a model that does not saturate: a no-op. Tapeless and Clean now soft-clip
    under Drive; the coloured models keep their own curves. Tapeless still has no hiss floor and no
    head loss or bump: it bypasses the machine, not the knobs. (Thanks Neuro.)
  • Input channels (InCh, Settings page 1: Stereo · Left · Right · Sum). A mono synth on one jack
    used to record on one side only; Left copies it to both. Replaces the second InMon, which was
    the same parameter as the Input FX menu's Mon. (Thanks CTribe.)
  • InSrc says when a stem is unavailable. S1–S4 / M1–M4 need host 1.4 with
    link_audio_publish; below that they fell back to Line without a word, so the selector looked
    broken. It still falls back, and now says so on screen while Settings is open. (Thanks Hannes.)
  • Sends are stereo. They were a mono sum, so every delay-type Palette effect (Collage, Cascade,
    Reels, Reverse) came back mono on a stereo loop; the reverbs only hid it because they generate
    their own width. Sends are now stereo and post-pan, so the bus gets what you hear from the loop.
  • Tape Drive pushes. Up to +24 dB into the curve with makeup, instead of +12 dB and exact unity,
    which never reached the knee from a line-level source.

Install: Schwung Manager → search Loopex, or download loopex-module.tar.gz below. If Loopex was already open, full-exit (Shift + Volume + Jog-click) before reopening.

Full 0.9.0 notes: https://github.com/filliformes/loopex-move/releases/tag/v0.9.0 · Manual: https://filliformes.github.io/loopex-move/

Loopex v0.9.0 — the character box update

Choose a tag to compare

@github-actions github-actions released this 20 Sep 05:22

The biggest release since the Overtake conversion: the Character system rebuilt from manufacturer
documentation, the Output stage made one contiguous block, the tape models re-derived from head
physics, a long list of click fixes, and a hardware-profiled CPU pass that took the engine from
56% / 74% (avg / peak, 12 loops × 4 playheads) to 41% / 43%.

Character and the Output page

  • Thirteen Character voicings, ordered by gritOff · 962 · Air · SSL · Neve · Trident · Studer · API · Ampex · MPC · S950 · SP12 · Emu. Every voicing was re-derived from manufacturer
    documentation (manuals, schematics, published specs) and measurements, with each figure tagged
    as documented, measured or chosen: CHARACTER-RESEARCH.md. Juno became
    Air (Focusrite ISA 110) and Console became Trident (A-Range); S950 is new.
  • Character now sets the whole output stage, not an EQ curve: the converter (bit depth,
    sample-rate hold, µ-law companding on the MPC60), the saturator's curve and asymmetry, the
    reconstruction filter, the pole count of LoCut/HiCut (2, 3 or 6), how the loops are read
    (Hermite → linear → drop-sample for the SP-1200 / SP-12), and Glue and Limit modelled on
    the dynamics unit each machine shipped beside — Neve 2254, API 2500 (with THRUST), the SSL bus
    compressor, the A800 and ATR-102's tape compression.
  • The saturator is anti-aliased (first-order ADAA) so the grit you hear is the machine's
    transfer curve, not fold-back; that is what keeps thirteen voicings from blurring into one.
  • Settings page 2 is now "Output": gSat, LoCut and HiCut moved after the punch bank so the
    page is one contiguous stage in signal order — Out · LoCut · HiCut · PWide · Char · gSat · Glue
    · Limit.
  • Sessions store the Character by name; older sessions with numeric indices are remapped.

Tape models and the record path

  • Tape HF loss derived from head physics (gap length × speed), with a speed-scaled head
    bump
    , so Reel15 / Reel7 / Reel3 finally differ where they should: in the bass and the top.
  • VHS split in kind: VHS1 is the Hi-Fi track (depth-modulated FM carrier with its companding
    noise reduction, bright but pumping — the compander is now a full compress-and-expand pair at
    unity); VHS2 is the linear edge track, slow and dark.
  • Generations cascades the selected machine's own loss filter once per pass, so a fourth
    generation of a Reel3 is darker than one of a Reel15.
  • Studer 961/962 channel EQ rebuilt from the service manual's fan-equaliser curves (Bass and
    Treble had been doing nothing); Mid follows the published presence spec.
  • Dither on every loop-buffer write and on the final 16-bit output.

Playback and interpolation

  • 4-point Hermite reads on every playhead (was linear) with a rate-aware anti-imaging
    filter
    for slowed heads — the high ringing on slowed loops is gone. Wow/flutter reads are
    Hermite too.
  • Scan is exactly 2.0× — one octave up, not the old 1.8-octave near-miss.
  • Attack/Decay were inaudible (the transport froze on pause, so the release faded DC); the tape
    keeps rolling through the release now. Un-pause restarts from Start and re-phases all four heads.
  • Self input source: Loopex's own master output, one block old, for resampling the whole mix.

Click fixes and level

  • Reverse punch, Seed (now morphs between seeds at the next slice boundary), Smear / Haze / Strum
    (16-grain pool with voice stealing and window-power normalisation), Palette FX switching
    (outgoing fades as incoming fades in, sends and the PalFX punch), the overdub seam crossfade, and
    DC blocking on Drift, Shimmer and Self.
  • Palette level matching: Drive, Fuzz, Howl and Sweeten used to sit many dB apart; every effect
    is now loudness-matched to the dry it replaces.
  • A bq_reset that produced a muting biquad rather than a bypass — the cause of one total
    silence — is fixed at the source.

CPU pass (profiled on the Move)

  • Per-loop pitch shifters run on their own worker thread (lpx-ps, SCHED_OTHER, cores 0–2).
    A Signalsmith hop cost ~600 µs — a quarter of the audio callback's slack — for one pitched loop;
    it now costs the callback two memcpys. Results are collected four blocks later (latency 61 ms,
    cancelled by the head-nudge as before); a missed deadline rides that loop to dry over 3 ms
    instead of clicking, and is counted.
  • The waveform display scan moved off the audio thread. It read ~15,000 scattered samples of
    a 45 s loop on every 12th UI tick, invisible to the CPU meter but paid for by the callback.
  • Per-sample work that only changed at knob rate is cached: the pan law, pow(2, pitch), the
    Disintegration fade, the Master Clock's snap search and ratio (and the clock's shifter is
    bypassed at unity); the DJ filter no longer computes a 6-pole ladder just to multiply it by
    zero; idle voices are skipped at the call site; a unity-rate fast path returns the sample
    directly when the interpolation would anyway; Drift's four LFOs use a polynomial sine.
  • A per-stage profiler is compiled in (ARM cntvct_el0 probes, ~0.3% overhead): touch
    /data/UserData/schwung/loopex-prof.on on the Move and the worker writes avg/peak µs per stage
    to loopex-prof.txt once a second. The CPU meter (get_param("cpu")) gained a peak-hold.
  • FTZ is now enabled on all three threads; the semitone hand-off is atomic.

UI

  • Two-line REC / LOOP / DUB counter with two-decimal times.
  • Waveform view: an empty slot no longer shows the previous loop's waveform, and a loop that is
    still loading is never labelled EMPTY LOOP.
  • Rename: Settings page 2 → Output; Character entries reordered by grit.

Install: Schwung Manager → search Loopex (the catalog serves the latest release), or download loopex-module.tar.gz below and extract it to /data/UserData/schwung/modules/overtake/. If Loopex was already open, full-exit (Shift + Volume + Jog-click) before reopening.

Manual: https://filliformes.github.io/loopex-move/

v0.8.7

Choose a tag to compare

@github-actions github-actions released this 19 Sep 18:48
Release v0.8.7

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v0.8.6

Choose a tag to compare

@github-actions github-actions released this 17 Sep 19:37
Release v0.8.6

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v0.8.5

Choose a tag to compare

@github-actions github-actions released this 17 Sep 18:40
Release v0.8.5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v0.8.3

Choose a tag to compare

@github-actions github-actions released this 17 Sep 15:30
release: bump to v0.8.3

First release under the Loopex name. Includes the LaunchControl XL mapping and
channel-2 LED feedback, the mute-sync fix, and the pre-release audit fixes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v0.8.2

Choose a tag to compare

@github-actions github-actions released this 16 Sep 14:17
release: bump to v0.8.2

Includes the stacked-shifter engage de-click (Oct/Shimmer) and the Master Clock
readout rework (ratio in Free with a unity catch, semitones in Music), on top of
the v0.8.1 pre-release audit fixes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v0.8.1

Choose a tag to compare

@github-actions github-actions released this 15 Sep 23:28
release: bump to v0.8.1

Pre-release audit fixes (crash/hang safety, DSP de-click and level fixes,
session persistence for playheads/Send B/Scatter). See prior commit for detail.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 02:46
LoopBox v0.8.0

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 01:42
LoopBox v0.7.0