Skip to content

v0.7.2: GTLT, the t gate tilt (#20) - #47

Merged
Worldwave merged 5 commits into
mainfrom
issue20-gtlt
Oct 7, 2026
Merged

Worldwave merged 5 commits into
mainfrom
issue20-gtlt

Conversation

@Worldwave

@Worldwave Worldwave commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

GTLT, the t gate tilt (MARBLES t SHIFT F1)

Closes #20. Decisions are in the issue comment.

  • What it does: tilts the height of t1's and t3's gates around t2, which it never touches. Bipolar, with a 10 % centre detent where it is off. Just past the detent both gates ramp steeply to 50 %. Towards + t1 falls to 0 % and t3 returns to 100 %; towards − the reverse. ROTC returns it to the detent.
  • TRIG ignores GTLT, so rhythm stays predictable. It scales only t outputs routed to LEVEL, FM, TIMBRE, MORPH or HARMONICS. A gate stays 0 V / +5 V, scaled by GTLT.
  • MIDI: CC 89, 7-bit, centred.
  • LEDs: on the t page a high gate is lit at its GTLT height, with 0 % shown at 8 % so a gate still firing TRIG never goes dark. On the detent the display is unchanged.
  • Pickup lock, both modules: after •• goes down or comes up, a fader's new parameter takes nothing until the fader has moved 3 % from where the finger is (Plaits' POT_STATE_LOCKING threshold). Without it, a GTLT edit carried into CLOK as •• came up — the fader's smoothing tail plus a resting finger, 27.8 semitones in the host reproduction. PLAITS had the same flaw (SHIFT → TIMBRE) and gets the same fix.
  • Version 0.7.2, plus the updated manual.

CPU

  • No per-sample cost. The gain is folded into each route's scale once per audio block (AddRoute, kept out of line so the render's per-Plaits-block loop compiles to the same instructions as main; checked by disassembly diff).
  • Bit-identical on the detent: there the gain is exactly 1.0.
  • Hardware (sp1-20261006-225513.log, v0.7.2 builds 22:21:57 and 23:06:27): rte with Marbles running is 4.1–4.6 avg, the same as the pre-GTLT baseline (~4.2). Worst window 68.8 % avg, fail=0 rst=0 throughout.
  • Over-budget blocks: the only ones are the known single block after power-on (pre/rte ~46 %, present since v0.6.0).
  • Image: 427 772 B, check_image.py passes, links at 0x20000.

Tests

  • routetest §12: the curve and its continuity, LEVEL silenced at 0 %, identical TRIG edges with GTLT off and at +1.
  • uitest §18–19: the fader, the rip, and the LEDs including the 8 % floor and independence from routing.
  • uitest §20: no SHIFT → BASE bleed on either module, and a real move afterwards still registers. It fails with the lock disabled.
  • miditest §16: CC 89 at both ends and back to the detent; CC 12 / 44 stay free.
  • All nine suites pass.

Seen in the log, not from this PR

A Marbles rip takes one block over budget: 99.25 % (sp1-20261006-225513.log) and 105.67 % (sp1-20261006-232648.log, mrb 44.7 % for that block), both on VA, fail=0 rst=0. The M4d re-seed rebuilds Marbles' generators — including 24 quantizer tables — inside the audio thread in one block. This branch does not touch that path; it is the first time a rip has been CPU-logged. Proposed as its own issue.

🤖 Generated with Claude Code

Worldwave and others added 5 commits October 6, 2026 19:27
A Wakes-only parameter that tilts the HEIGHT of t1's and t3's gates
around t2, which it never touches. Bipolar, 10 % centre detent = off.
Just past the detent both gates ramp steeply to 50 % (SP1_GTLT_RAMP, 0.1
of each half); towards + t1 falls to 0 % and t3 returns to 100 %,
towards - the reverse. Unsmoothed. ROTC returns it to the detent.

Decided with Adara on the issue:
- A gate stays 0 V / +5 V. +5 V is already the positive maximum of every
  destination a t output can reach, so no INTELLIGENT range is involved;
  GTLT scales the +5 V and the attenuverters do the rest.
- TRIG ignores GTLT: it reads the raw gate bits, so rhythm stays
  predictable. Only LEVEL, FM, TIMBRE, MORPH and HARMONICS see the gain.
  A t output at 0 % still counts as patched, like a cable at 0 V.
- MIDI: CC 89, 7-bit, centred (no 14-bit pair).

CPU: the gain is folded into each route's scale in AddRoute, once per
DMA block. AddRoute is now noinline: inlined, GTLT grew
sp1_synth_render by ~1 KB and reshuffled its per-Plaits-block loop. As
built, the render is +6 instructions, all in the per-block setup; the
per-Plaits-block routing walk is the same instruction sequence as main
(disassembly diff). At the detent the gain is exactly 1.0f, so the
output is bit-identical to main.

Image 427 260 B (main 427 644): the 28th MIDI parameter stopped GCC
unrolling a loop in sp1_midi_main_tick (-672 B, main thread only);
every other change is accounted for in a symbol diff against main.
check_image PASS, 0 warnings, links at 0x20000. Fallback build clean.

Host: routetest 12 (the curve and its continuity, LEVEL silenced at
0 %, TRIG edges identical with GTLT off and at +1 on a seeded
sequence), uitest 18 (default, both ends, X SHIFT F1 still unbound,
rip), miditest 16 (CC 89 both ends and back to the detent; CC 12 / 44
free). All nine suites pass. Not yet on hardware.

UI-SPEC v0.17, UI-PAGES, DEFAULTS and MIDI.md updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
firmware/VERSION, the README status line and the issue forms'
version placeholder. Image 427 260 B, check_image PASS, links at
0x20000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the t page's track row a high gate is now lit at its GTLT height,
from 5 % for a 0 % gate up to full (SP1_GTLT_LED_FLOOR), on every t
output whatever it is routed to: a gate still firing TRIG at 0 % never
goes dark (Adara). Low gates are off. The floor is GTLT's alone; no other
LED changes, and on the detent every gain is 1, so the display is the
old on/off one exactly.

Same curve as the audio (sp1_gtlt_gain), so the LEDs cannot disagree
with what Plaits receives. Main thread only: sp1_synth_render is
unchanged in size; +208 B in the Marbles UI.

uitest 19: detent = full, low gates dark, tilt +1 = 13 / 255 / 255,
and t1's LED independent of its routing. All nine suites pass. Image
427 468 B, check_image PASS, 0 warnings, links at 0x20000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adara's updated manual.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adara: a GTLT edit carried over into CLOK. Fader positions are low-passed
(~64 ms), and when "••" came up the BASE layer took the still-settling
position as its reference: the tail, plus a finger resting on the fader,
was applied as catch-up movement to CLOK. Reproduced on the host: a GTLT
flick then release moved CLOK by 27.8 semitones (PLAITS: a SHIFT F2 flick
moved TIMBRE 0.50 -> 0.82 -- the same scheme, so the same flaw).

Both UIs now lock each fader at a layer change: its new parameter takes
nothing until the UNFILTERED position has moved CATCH_LOCK (3 %, Plaits'
POT_STATE_LOCKING threshold) from where the finger was. Whether the fader
tracks or catches up is decided at the change as before and not
re-decided at the unlock (re-deciding against a moved fader left a
tracking fader short of it -- caught by miditest_pickup takeover).

GTLT's LED floor 5 % -> 8 % (Adara: too dim at the extremes).

uitest 20: no bleed on either module, and a real move afterwards still
works; it fails with the lock disabled. uitest 19 now presses "••" before
moving the fader. All nine suites pass. sp1_synth_render unchanged; image
427 772 B, check_image PASS, 0 warnings, links at 0x20000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Worldwave
Worldwave merged commit 67f80bd into main Oct 7, 2026
3 checks passed
@Worldwave
Worldwave deleted the issue20-gtlt branch October 7, 2026 03:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

FEATURE: GTLT - t gate tilt parameter

1 participant