Skip to content

[WIP] Loop Jefe - #192

Draft
sastraxi wants to merge 25 commits into
mainfrom
feat/loopjefe
Draft

[WIP] Loop Jefe#192
sastraxi wants to merge 25 commits into
mainfrom
feat/loopjefe

Conversation

@sastraxi

@sastraxi sastraxi commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Putting together a live loop pedalboard and needed some more pi-Stomp features...

  • support binding footswitches to momentary LV2 ports -- pulls high (127), expects plugin to clear
  • allows plugins to customize footswitch behaviour
  • plugins can opt into metronome pulse for their LED color -- both pixel and on-screen display
  • add LoopJefe LV2 plugin customization (https://github.com/sastraxi/loopjefe-lv2)

TODO

  • actual testing (all theoretical right now)
  • custom RC-505 inspired plugin drawing

sastraxi and others added 25 commits July 3, 2026 20:42
mod-host/mod-ui now broadcast an absolute-timestamped downbeat over
WebSocket (beat_sync); pi-Stomp parses it, tracks a BeatGrid anchored
to CLOCK_MONOTONIC, and flashes the tap-tempo footswitch's LED/pixel
on each beat as a visual metronome (no audible click is available on
v3's single shared DAC).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… group

Extends the 'longpress' config field to accept {midi_CC: N} alongside the
existing named-group form (string or list), so a footswitch's longpress can
MIDI-learn directly onto a plugin port (e.g. loopjefe's future "reset")
without inventing a new pi-Stomp-internal callback for every such action.

Kept as one field rather than a sibling 'longpress_midi_CC' key so a
per-pedalboard overlay can't leave a stale chord-group registration behind
when a later config only overrides one of the two.

Consolidates the near-duplicate _emit_midi (mod.py/modhandler.py) into a
single implementation on the Handler base, since both were already routing
through self.hardware — no new shared state needed, just an optional CC
override so longpress can target a different port than the short-press
binding. Also adds 'toggle_tuner_enable' to the longpress schema enum: it
was already a registered callback and used in both shipped templates, but
the old loose ["array","string"] schema silently skipped enum validation
for the bare-string form.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
# Conflicts:
#	modalapi/websocket_bridge.py
Brings the branch up to v3.3.0 (AGPL relicense, footswitch UI, v1 removal).

Longpress-sends-MIDI was implemented independently on both sides; main's is
the superset (LongpressActionConfig -> RawMidiCcEffect, plus preset/pedalboard
targets), so the branch's narrower Footswitch.set_longpress/longpress_midi_CC
layer and its tests are dropped in favor of it. Likewise Handler.
_handle_footswitch, superseded by main's Effects/BindingDecl dispatch.

Kept from the branch: the per-tick LED driver (set_led is a pure state update,
_drive_footswitch_leds renders), LedSpec/render_led_spec, generic output_set
mirroring into Plugin.output_values, BeatGrid, and Parameter Type.TRIGGER /
is_momentary.

v1 (modalapi/mod.py) is gone with main's "Remove v1", taking the branch's v1
metronome work with it.

Momentary trigger semantics are NOT yet wired into main's Effect model --
MidiCcEffect and RawMidiCcEffect both still toggle, so a pprops:trigger port
(loopjefe advance/reset) only fires every other press. Follow-up.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.

1 participant