Summary
Add two more arpeggiator motions to round out the set. Today arpStep() in js/generator.js supports up / down / updown / random (driven by state.arpDir). Add ping-pong with repeated endpoints and odd-then-even.
Why it fits
Small, cheap, high-flavour. The current "updown" already ping-pongs but clips the top and bottom notes; repeating the endpoints gives a different, rounder feel, and odd-then-even is a classic arp shuffle that reorders the same chord tones into a fresh contour — more variety from the notes already being spelled.
Proposed scope
arpStep(len, dir) in js/generator.js
pingpongRep — like updown but the first and last notes are played twice at the turnaround (no skipped endpoints).
oddeven — indices 0, 2, 4, … then 1, 3, 5, …, wrapping continuously across bars (keep the existing "flows continuously" behaviour via the persisted arpIdx).
UI (js/app.js)
- Add both to the arp-direction select (currently
['up','down','updown','random']).
- Update Style presets only where a style clearly wants the new motion (optional).
Where
js/generator.js (arpStep cases), js/app.js (arpDir options).
Done when
Open questions
- Worth making arp direction per-part (it's currently a single global
state.arpDir) while we're here, or keep that for a separate change?
Summary
Add two more arpeggiator motions to round out the set. Today
arpStep()injs/generator.jssupports up / down / updown / random (driven bystate.arpDir). Add ping-pong with repeated endpoints and odd-then-even.Why it fits
Small, cheap, high-flavour. The current "updown" already ping-pongs but clips the top and bottom notes; repeating the endpoints gives a different, rounder feel, and odd-then-even is a classic arp shuffle that reorders the same chord tones into a fresh contour — more variety from the notes already being spelled.
Proposed scope
arpStep(len, dir)injs/generator.jspingpongRep— likeupdownbut the first and last notes are played twice at the turnaround (no skipped endpoints).oddeven— indices0, 2, 4, …then1, 3, 5, …, wrapping continuously across bars (keep the existing "flows continuously" behaviour via the persistedarpIdx).UI (
js/app.js)['up','down','updown','random']).Where
js/generator.js(arpStepcases),js/app.js(arpDir options).Done when
Open questions
state.arpDir) while we're here, or keep that for a separate change?