A hardware-style preset launcher overlaid directly on your controlXY pads:
Think of it as memory buttons on a hardware synth, but for spatial control!
<rect id="pad1" x="100" y="100" width="600" height="400"
fill="#222"
cue="controlXY(uid:pad1,
handle:[dot1,dot2],
label:true,
launcher:8,
banks:3)"/>
Parameters:
launcher:8 - Enable with 8 buttons (can be 4, 6, 8, 10, etc.)banks:3 - Number of banks (default: 3)Left-click button โ Recall preset/sequence (instant) Right-click button โ Save current state to this slot Long-press (touch) โ Save current state to this slot
Bank navigation:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ ControlXY Pad Area โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ [โ] Bank: Verse (1/3) [โ] โ โ Bank Bar
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ [1] [2] [3] [4] [5] [6] [7] [8] โ โ Slot Buttons
โ Intro Mid End โ โ โ โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Empty (gray) - No assignment
[1]
Empty
Assigned Preset (blue) - Preset stored
[1]
intro
Assigned Sequence (green) - Sequence stored
[2]
verse_loop
Active (orange) - Currently recalling (brief flash)
[1]
intro โจ
Bank 1: Intro
Bank 2: Verse
Bank 3: Chorus
Performance: Switch banks with โโ, trigger with 1-8
Launchers are saved in controlxy-presets.json:
{
"presets": { ... },
"sequences": { ... },
"launchers": {
"pad1": {
"currentBank": 0,
"banks": [
{
"name": "Bank 1",
"slots": [
{ "type": "preset", "name": "intro" },
{ "type": "preset", "name": "verse" },
{ "type": "sequence", "name": "verse_loop" },
null,
null,
null,
null,
null
]
},
{
"name": "Bank 2",
"slots": [ ... ]
},
{
"name": "Bank 3",
"slots": [ ... ]
}
]
}
}
}
// 4 buttons (smaller pads)
controlXY(uid:pad1, handle:dot1, launcher:4, banks:5)
// 10 buttons (larger pads)
controlXY(uid:pad1, handle:dot1, launcher:10, banks:3)
// 12 buttons (wide pads)
controlXY(uid:pad1, handle:dot1, launcher:12, banks:4)
Currently banks are named "Bank 1", "Bank 2", etc. Coming soon: Custom names via UI or DSL:
// Future syntax
controlXY(uid:pad1,
handle:dot1,
launcher:8,
bankNames:["Intro","Verse","Chorus"])
Each pad gets its own launcher:
<rect id="pad1" cue="controlXY(uid:pad1, handle:dot1, launcher:8, banks:3)"/>
<rect id="pad2" cue="controlXY(uid:pad2, handle:dot2, launcher:6, banks:2)"/>
Both launchers are independent and saved separately.
Map keyboard keys to slots:
1-8 โ Trigger slots 1-8[ ] โ Change banksShift+1-8 โ Store to slotsMap MIDI notes to slots for hardware control.
Same process in Sequences tab.
See all launchers, all banks at once:
One bank per section makes navigation intuitive.
Don't fill all 8 slots - leave room for improvisation.
Empty slots show slot numbers (1-8). Learn the positions for blind performance.
Long-press works great on tablets/touchscreens. Practice the 500ms timing.
launcher:8 is in DSL| Method | Speed | Flexibility | Use Case |
|---|---|---|---|
| Launcher | โกโกโก Instant | ๐๏ธ 8 slots | Live performance |
| UI | โกโก Fast | ๐๏ธ๐๏ธ๐๏ธ Unlimited | Composition work |
| DSL | โก Timed | ๐๏ธ๐๏ธ Scripted | Score automation |
Best practice: Use all three!
Pre-save 8 interesting states, perform freely between them.
Bank = section, slot = variation. Navigate song structure live.
Save 8 extreme positions, explore in-between states manually.
Odd slots = calls, even slots = responses. Alternate rapidly.
Slots 1-8 = progressive changes. Step through slowly.
You now have:
This is a complete performance system!
Start simple:
Then expand:
Score-as-instrument. Touch-as-memory. ๐๏ธโจ
// Basic
controlXY(uid:pad1, handle:dot1, launcher:8)
// Custom slots
controlXY(uid:pad1, handle:dot1, launcher:6)
// Custom banks
controlXY(uid:pad1, handle:dot1, launcher:8, banks:5)
// Full config
controlXY(uid:pad1,
handle:[dot1,dot2,dot3],
label:true,
launcher:8,
banks:3,
osc:true)
Ready to perform! ๐ต๐น