Summary
A lightweight step pattern + rhythm editor for the bass and arp, so you can grab the generated line and shape it by hand — without giving up generation. Each step holds a rest, a tie, an accent, or a velocity, with a length independent from the part's note source.
Why it fits
Modular Riffs' parts are fully algorithmic, which is great for "forward forever" but frustrating when you hear almost the right groove and want to nail one step. The flow becomes generate → freeze → tweak: keep the engine's note choices, but pin the rhythm. It also unlocks deliberate phasing when the rhythm length differs from the note-source length.
Proposed scope
Model (js/generator.js)
- Optional per-part
steps[] overriding the generated rhythm: each step is rest | tie | { vel, accent }.
- A part with a step pattern still pulls pitches from the normal generator (chord tones / motif), but the rhythm comes from the grid — so chord changes still flow through.
- Honour the rest vs velocity-1 distinction: a rest skips the next note in the line; a near-silent hit still consumes one (audible on velocity-sensitive gear, and it shifts the note pool).
- Independent
length (e.g. a 6-step bass against a 16-step bar) for built-in phasing.
Editor UI (js/app.js + js/timeline.js)
- A per-part step lane (reuse the timeline's lane styling and patch-cable colours) with click-to-cycle cells: rest → tie → low → high → accent.
- A "capture current" button that freezes the live generated rhythm into editable steps as a starting point.
- Persist in
state (rides presets / export).
Where
js/generator.js (rhythm override + tie/rest semantics), js/app.js + js/timeline.js (editor UI), state (persistence).
Done when
Open questions
- Should "capture current" snapshot one bar, or a whole section?
- Tie semantics under mono enforcement — a tie should extend the gate, not retrigger; confirm against the existing clip-before-next rule.
Summary
A lightweight step pattern + rhythm editor for the bass and arp, so you can grab the generated line and shape it by hand — without giving up generation. Each step holds a rest, a tie, an accent, or a velocity, with a length independent from the part's note source.
Why it fits
Modular Riffs' parts are fully algorithmic, which is great for "forward forever" but frustrating when you hear almost the right groove and want to nail one step. The flow becomes generate → freeze → tweak: keep the engine's note choices, but pin the rhythm. It also unlocks deliberate phasing when the rhythm length differs from the note-source length.
Proposed scope
Model (
js/generator.js)steps[]overriding the generated rhythm: each step isrest | tie | { vel, accent }.length(e.g. a 6-step bass against a 16-step bar) for built-in phasing.Editor UI (
js/app.js+js/timeline.js)state(rides presets / export).Where
js/generator.js(rhythm override + tie/rest semantics),js/app.js+js/timeline.js(editor UI),state(persistence).Done when
Open questions