diff --git a/mobile-sessions.html b/mobile-sessions.html
index f01c3f1..0ecb743 100644
--- a/mobile-sessions.html
+++ b/mobile-sessions.html
@@ -174,7 +174,7 @@ function renderList(){
const list=$("list"); list.innerHTML="";
if(!sessions.length){
$("listLabel").style.display="none";
- list.innerHTML='
-
ππ
-
πΎ
+
pf
+
β§
?
β
βΆ
@@ -570,7 +571,7 @@ function newList(){ const n=prompt("New set list name:","My set list"); if(n==nu
function buildSaveTo(){ savedLists=userSetlists(); const sel=$("saveTo"); sel.innerHTML="";
savedLists.forEach((sl,i)=>sel.appendChild(opt("s"+i,(sl.title||("Set list "+(i+1)))+" ("+(sl.items?sl.items.length:0)+")")));
- sel.appendChild(opt("__new","β New set listβ¦"));
+ sel.appendChild(opt("__new","+ New set listβ¦"));
sel.value = slKey[0]==="s" ? slKey : (savedLists.length?"s0":"__new");
$("saveNewName").style.display = sel.value==="__new" ? "block":"none"; }
$("saveTo").onchange=()=>{ $("saveNewName").style.display = $("saveTo").value==="__new" ? "block":"none"; };
@@ -581,15 +582,15 @@ function renderLibrary(){ savedLists=userSetlists(); const box=$("libBody"); box
savedLists.forEach((sl,i)=>{ const row=el("div","librow"+(slKey==="s"+i?" active":""));
const nm=el("button","libname",(sl.title||"set list")+" ("+(sl.items?sl.items.length:0)+")"); nm.onclick=()=>selectUserList(i); row.appendChild(nm);
row.appendChild(ibtn("β",()=>moveList(i,-1),i===0)); row.appendChild(ibtn("β",()=>moveList(i,1),i===savedLists.length-1));
- row.appendChild(ibtn("β",()=>renameList(i))); row.appendChild(ibtn("π",()=>deleteList(i))); box.appendChild(row); });
- const addL=el("button","addlane","β New set list"); addL.onclick=newList; box.appendChild(addL);
+ row.appendChild(ibtn("β",()=>renameList(i))); row.appendChild(ibtn("β",()=>deleteList(i))); box.appendChild(row); });
+ const addL=el("button","addlane","+ New set list"); addL.onclick=newList; box.appendChild(addL);
if(slKey[0]==="s"){ const i=+slKey.slice(1), sl=savedLists[i]; if(sl){
box.appendChild(el("div","liblbl","Tracks in β"+(sl.title||"set list")+"β"));
sl.items.forEach((it,j)=>{ const row=el("div","librow"+(idx===j?" active":""));
const nm=el("button","libname",(j+1)+". "+(it.name||"track")); nm.onclick=()=>{ gotoItem(j,state.running); renderLibrary(); }; row.appendChild(nm);
row.appendChild(ibtn("β",()=>moveTrack(i,j,-1),j===0)); row.appendChild(ibtn("β",()=>moveTrack(i,j,1),j===sl.items.length-1));
- row.appendChild(ibtn("β",()=>renameTrack(i,j))); row.appendChild(ibtn("π",()=>deleteTrack(i,j))); box.appendChild(row); });
- const addT=el("button","addlane","β Add current track here"); addT.onclick=()=>{ $("saveTo").value="s"+i; doSaveAsNew(); }; box.appendChild(addT);
+ row.appendChild(ibtn("β",()=>renameTrack(i,j))); row.appendChild(ibtn("β",()=>deleteTrack(i,j))); box.appendChild(row); });
+ const addT=el("button","addlane","+ Add current track here"); addT.onclick=()=>{ $("saveTo").value="s"+i; doSaveAsNew(); }; box.appendChild(addT);
}} else { box.appendChild(el("div","libhint","This set list is built-in (read-only). βSave as new trackβ copies your edits into one of your own set lists.")); }
}
function openSaveSheet(){
diff --git a/src/setlists.js b/src/setlists.js
index 2010c8a..7da491b 100644
--- a/src/setlists.js
+++ b/src/setlists.js
@@ -1,50 +1,42 @@
-// Demo set list (each item authored in the share language β also exercises the parser).
+// Seed set lists β baked into every page; each item is authored in the share language
+// (so this also exercises the parser). Two curated lists:
+// Styles β full, genre-true grooves; good as backing tracks to jam/solo over.
+// Practice β drills for learning to PLAY those styles (isolations, independence,
+// dynamics, polyrhythms, tempo/gap tools).
const SEED_SETLISTS = [
- { title: "π₯ Styles", description: "Grooves & feels β load one, press Space, and click pads to shape the accents.", items: [
- ["Four-on-the-floor", "t120;kick:4;snare:4=.x.x;hatClosed:4/2"],
- ["Swing ride", "t150;ride:4/2s;kick:4=X..x;snare:4=.x.x"],
- // Purdie half-time shuffle: triplet grid, backbeat on 3, snare ghosts (normal) around it
- ["Purdie half-time shuffle", "t92;kick:4/3=X....x...x..;snare:4/3=..gg.gX.gg.g;hatClosed:4/3=X.xX.xX.xX.x"],
- // Samba in 2/4 (16ths): surdo strong on beat 2, steady ganzΓ‘, tamborim teleco-teco
- ["Samba (2/4)", "t104;tomLow:2/4=x...X...;hatClosed:2/4;woodblock:2/4=X.xx.xX."],
- // NaΓ±igo / 6/8 bembΓ© bell over a 12/8 grid, low drum on the two main pulses
- ["NaΓ±igo (6/8 bembΓ©)", "t130;cowbell:4/3=X.xx.x.xx.x.;kick:4/3=X.....X.....;hatClosed:4/3=..x..x..x..x"],
- ["6/8 groove", "t100;kick:3+3=x..x..;snare:3+3=...x..;hatClosed:3+3/2"],
- ["7/8 (2+2+3)", "t130;kick:2+2+3=x..x..x;hatClosed:2+2+3/2"],
- ["5/4 (3+2)", "t112;kick:3+2=x..x.;snare:3+2=..x..;hatClosed:3+2/2"],
+ { title: "Styles", description: "Full genre grooves β load one, press play, and jam over it. Tap pads to reshape the feel.", items: [
+ ["Rock", "t116;kick:4/2=X...Xx..;snare:4/2=..X...X.;hatClosed:4/2=Xxxxxxxx"],
+ ["Pop (16ths)", "t104;kick:4/4=X.....x...X.....;snare:4/4=....X.......X...;hatClosed:4/4=xxxxxxxxxxxxxxxx"],
+ ["Funk", "t100;kick:4/4=X..x..X...x.X...;snare:4/4=....X..g.g..X.g.;hatClosed:4/4=xxxxxxxxxxxxxxxx"],
+ ["Disco", "t120;kick:4;clap:4=.X.X;hatClosed:4/2=X.X.X.X.;hatOpen:4/2=.x.x.x.x"],
+ ["Motown backbeat", "t132;kick:4/2=X..x.X..;snare:4/2=..X...X.;tambourine:4/2=xxxxxxxx"],
+ ["Blues shuffle (12/8)", "t84;ride:4/3=X.xX.xX.xX.x;snare:4/3=...X.....X..;kick:4/3=X.....X....."],
+ ["Jazz swing", "t150;ride:4/3=X.xX.xX.xX.x;hatClosed:4=.x.x;kick:4=x.x.@-9"],
+ ["Bossa nova", "t128;rim:4/4=..x.x...x..x..x.;kick:4/2=X..X.X..;hatClosed:4/2=xxxxxxxx"],
+ ["Samba (2/4)", "t102;tomLow:2/4=x...X...;hatClosed:2/4=xxxxxxxx;woodblock:2/4=X.xx.xX."],
+ ["Reggae one-drop", "t74;kick:4=..X.;rim:4=..X.;hatClosed:4/2=.x.x.x.x"],
+ ["Afrobeat", "t108;cowbell:4/4=x.xx.xx.x.xx.xx.;kick:4/4=X..x..X..x..X...;snare:4/4=....g..X..g..X.g;hatClosed:4/4=xxxxxxxxxxxxxxxx"],
+ ["Hip-hop (boom bap)", "t88;kick808:4/4=X.....x....X....;snare808:4/4=....X.......X...;hat808:4/4=x.x.x.x.x.x.x.x."],
+ ["Metal driving", "t168;kick:4/2=XxXxXxXx;snare:4/2=..X...X.;hatClosed:4/2=Xxxxxxxx;crash:4=X..."],
+ ["6/8 ballad", "t66;kick:3+3=X..X..;snare:3+3=...X..;hatClosed:3+3/2=xxxxxxxxxxxx"],
+ ["7/8 (2+2+3)", "t130;kick:2+2+3=X..X..X;snare:2+2+3=..X..X.;hatClosed:2+2+3/2"],
+ ["5/4 (3+2)", "t112;kick:3+2=X..X.;snare:3+2=..X..;hatClosed:3+2/2"],
] },
- { title: "π― Practice", description: "Polyrhythms, independence and tempo / gap tools.", items: [
- ["5 over 4 polyrhythm", "t100;kick:4;claves:5~"],
- ["3 over 2 hemiola", "t96;woodblock:2;cowbell:3~"],
- ["2 & 4 & 3 over one bar", "t100;kick:3;cowbell:2~;claves:4~"],
- ["Triplet hats", "t100;kick:4;snare:4=.x.x;hatClosed:4/3"],
- ["Accents β cycle the pads", "t92;kick:4=X..X;snare:4=.X.X;hatClosed:4/2"],
- ["Tempo builder 80β", "t80;woodblock:4;rmp80/4/4"],
- ["Gap trainer (play 2 / rest 2)", "t100;kick:4;hatClosed:4/2;tr2/2"],
- ] },
- // A continuous ~4:00 song: each item has a bar length (b
) so it auto-advances (with
- // Continue on) through tempo ramps and shifting styles. Durations β bars Γ beats Γ 60/bpm.
- { title: "π΅ Song β continuous (~4:00)", description: "A full song: turn on Continue, press βΆ on βIntroβ, and it plays straight through (~4 min) β segments auto-advance on their bar counts, through tempo ramps and shifting styles.", items: [
- ["Intro β hats & kick", "t88;b8;kick:4=X.x.;hatClosed:4/2=gggggggg"],
- ["Groove in β backbeat", "t88;b16;kick:4=X.x.;snare:4=.X.X;hatClosed:4/2"],
- ["Half-time shuffle", "t92;b12;kick:4/3=X....x...x..;snare:4/3=..gg.gX.gg.g;hatClosed:4/3=X.xX.xX.xX.x"],
- ["Build β ramp 92β120", "t92;b16;rmp92/4/2;kick:4;snare:4=.X.X;hatClosed:4/2"],
- ["Four-on-the-floor (909)", "t124;b18;kick909:4;clap909:4=.X.X;hat909:4/2=.X.X.X.X"],
- ["Samba break (2/4)", "t116;b24;tomLow:2/4=x...X...;hatClosed:2/4;woodblock:2/4=X.xx.xX."],
- ["Peak β 16ths", "t132;b16;kick:4=X..x;snare:4=.X.X;hatClosed:4/4"],
- ["Outro β ramp down", "t132;b8;rmp132/-7/1;kick:4=X..x;hatClosed:4/2=gggggggg"],
- ] },
- // Showcase for the PM_E-2 engraved notation view β one groove per notation feature; also the
- // visual test battery. Exercises the flam/drag/roll grammar (f/F d/D z/Z), ghosts, odd meters,
- // clave (Latin), a West-African bell (read it in TUBS), and a polyrhythm.
- { title: "π Notation showcase", description: "Open pm_e-2.html (the Notation editor) and step through these β each shows a different notation feature: dynamics, ghosts, flams/drags/rolls, odd-meter beaming, clave, a 12/8 bell, and a polyrhythm.", items: [
- ["Rock 4/4 β the basics", "t120;kick:4=x.x.;snare:4=.x.x;hatClosed:4/2=xxxxxxxx"],
- ["Funk ghosts", "t96;kick:4/2=X..x.x..;snare:4/2=..g.X.g.;hatClosed:4/4=xxxxxxxxxxxxxxxx"],
- ["Flams & rolls", "t90;kick:4=x.x.;snare:4=F.fz;hatClosed:4/2=xxxxxxxx"],
- ["Drags (ruffs)", "t100;kick:4=x..x;snare:4=d.D.;hatClosed:4/2=xxxxxxxx"],
- ["7/8 (2+2+3) beaming", "t140;kick:2+2+3=x.x.x..;snare:2+2+3=..x..x.;hatClosed:2+2+3/2"],
- ["Son clave 2-3", "t96;claves:4/4=..x.x...x..x..x.;cowbell:4/4=x.x.x.x.x.x.x.x.;kick:4=x.x."],
- ["Afro 12/8 bell (try TUBS)", "t120;cowbell:4/3=x.xx.x.x.x.x;kick:4/3=X.....X.....;hatClosed:4/3=..x..x..x..x"],
- ["3 over 2 polyrhythm", "t90;kick:2;claves:3~"],
+ { title: "Practice", description: "Drills to learn the styles - isolations, independence, dynamics, polyrhythms, and tempo / gap tools.", items: [
+ ["Rock beat - quarter hats", "t80;kick:4=X.X.;snare:4=.X.X;hatClosed:4=xxxx"],
+ ["Rock beat - 8th hats", "t96;kick:4/2=X...Xx..;snare:4/2=..X...X.;hatClosed:4/2=xxxxxxxx"],
+ ["Backbeat + ghost notes", "t90;kick:4/4=X.....x...X.....;snare:4/4=..g.X.g.g.g.X.g.;hatClosed:4/2=xxxxxxxx"],
+ ["16th-note hand control", "t84;kick:4=X..X;snare:4/4=x.xxX.xxx.xxX.xx"],
+ ["Shuffle feel (triplets)", "t92;hatClosed:4/3=X.xX.xX.xX.x;snare:4/3=...X.....X..;kick:4/3=X.....X....."],
+ ["Jazz ride - spang-a-lang", "t140;ride:4/3=X.xX.xX.xX.x;hatClosed:4=.x.x;kick:4=x.x.@-9"],
+ ["Bossa independence", "t120;rim:4/4=..x.x...x..x..x.;kick:4/2=X..X.X..;hatClosed:4=.x.x"],
+ ["Linear funk", "t96;kick:4/4=X..x..X.....x...;snare:4/4=....X......X..g.;hatClosed:4/4=x.x.x.xxx.x.x.x."],
+ ["Accent / ghost dynamics", "t88;snare:4/4=X.g.x.g.X.g.x.g.;hatClosed:4/2=xxxxxxxx;kick:4=X..X"],
+ ["Double-bass workout", "t120;kick:4/4=xxxxxxxxxxxxxxxx;snare:4=.X.X;crash:4=X..."],
+ ["Independence: 3 over 4", "t96;kick:4;hatClosed:4/2=xxxxxxxx;cowbell:3~"],
+ ["3 over 2 hemiola", "t96;woodblock:2;cowbell:3~"],
+ ["5 over 4 polyrhythm", "t100;kick:4;claves:5~"],
+ ["Tempo builder 80 up", "t80;kick:4=X.X.;snare:4=.X.X;hatClosed:4/2=xxxxxxxx;rmp80/4/4"],
+ ["Gap trainer (play 2 / rest 2)", "t100;kick:4/2=X...Xx..;snare:4/2=..X...X.;hatClosed:4/2=xxxxxxxx;tr2/2"],
] },
];