Strudelify

Pools

Steps Ahead

KeyG minorTempo83 bpm
0:00/0:00
// Pools — Steps Ahead
// 83 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 120 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(83/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano
const piano = note(`<
  A@2 B@4 C D@5 E@5 F@4 G@2 H@2 I J K@2 L@2 M@2 N@4 O@2 P@2 Q@2 R@4 S@7 T U T U T U T V@2 W@8 X@8 Y@2 Z@2 AA@4 AB@6 AC@4
  AD@6 AE@2 AF@6 AG@2 AH@2 AI@4 ~
>`.pickRestart({
  A: "[~@7 [bb3,db4,e4,gb4,a4]@6 ~@2 [ab3,bb3,eb4,g4]@15 ~@2]/2", // Gb7 Eb
  B: "[~@11 c2 ~@3 [ab3,bb3,eb4,g4]@18 ~@10 c2 ~@3 [ab3,bb3,eb4,g4]@17, ~@7 [bb3,db4,e4,gb4,a4]@6 ~@26 [bb3,db4,e4,gb4,a4]@6 ~@19]/4", // Eb Gb7
  C: "~@3 [eb2,eb3,a3,d4,gb4]@3 ~@2 [eb2,eb3,a3,db4,f4] ~@6 [a3,c4,eb4]", // D Dbaug Adim
  D: "[~@3 ab2@10 ~@2 [a2,g3,b3,db4,eb4,gb4]@14 ~@2 [ab2,gb3,bb3,db4,f4]@20 ~@4 [bb3,db4,e4,gb4,a4]@6 ~@2 [ab3,bb3,eb4,g4]@15 ~@2, [gb3,b3,db4]@3 ~@17]/5", // B7 Gbmaj7 Gb7 Eb Gbsus4
  E: "[~@7 [bb3,db4,e4,gb4,a4]@4 c2 ~@3 [ab3,bb3,eb4,g4]@19 ~@9 c2 ~@3 [ab3,bb3,eb4,g4]@18 ~@2 [eb2,eb3,a3,d4,gb4]@3 ~@2 [eb2,eb3,a3,db4,f4] ~@6 eb4, ~@39 [bb3,db4,e4,gb4,a4]@6 ~@35]/5", // Gb7 Eb D Dbaug Gb7
  F: "[[ab2,gb3,b3,db4]@12 ~@3 [a2,g3,db4,gb4]@14 ~@2 [ab2,gb3,bb3,db4,f4]@20 ~@5 [d3,c4,e4,g4,b4] ~ [d3,c4,e4,g4,b4] [gb2,d4,e4,f4,bb4,d5] ~ [gb2,d4,f4,bb4,d5] ~@2]/4", // Abm7 Gbm Gbmaj7 Cmaj7 Bb
  G: "[~@4 c4@15 ~@5 [d3,c4,e4,g4,b4] ~ [d3,c4,e4,g4,b4] [gb2,d4,f4,bb4,d5] ~ [gb2,d4,f4,bb4,d5] ~@2, ~@3 [g2,g3,d4,e4,g4]@17 ~@12]/2", // Cmaj7 Bb Em7
  H: "[~@3 [g2,d3,g3,f4,a4,b4,db5,e5]@17 ~@4 [db3,b3,eb4,gb4,bb4] ~ [db3,b3,eb4,gb4,bb4] [db4,e4,a4] ~ [db4,e4,a4,db5] ~@2, ~@3 [c5,f5] ~@28]/2", // G7 Ebm7 A F5
  I: "~@3 bb3 ~@5 eb4@3 gb2 ~ e2 ~, ~@3 [db4,gb4]@11 ~@2, ~@3 [gb2,gb3]@9 ~@4", // Gb5 Gb
  J: "[eb2,eb3,g3,bb3,db4]@3 [eb2,eb3,g3,bb3,db4] ~@4 [ab2,gb3,b3,eb4,gb4]@5 ~@3", // Eb7 Abm7
  K: "[[db3,b3,eb4,gb4,bb4] ~@2 [c3,bb3,e4,a4]@8 [ab3,eb4,g4]@15 ~@6, ~@11 bb3 ~@20]/2", // Ebm7 Am Abmaj7
  L: "[~@7 c2 ~@3 [ab3,bb3,eb4,g4]@19 ~@2, ~@3 [bb3,db4,e4,gb4,a4]@6 ~@23]/2", // Eb Gb7
  M: "[~@7 c2 ~@3 [ab3,bb3,eb4,g4]@18 ~@3, ~@3 [bb3,db4,e4,a4]@6 ~@23]/2", // Eb A
  N: "[[eb2,eb3,a3,d4,gb4]@3 ~ [eb2,eb3,a3,db4,f4] ~@6 eb4 [ab2,gb3,b3,db4]@14 ~ [a2,g3,db4,gb4]@14 ~@2 [ab2,gb3,bb3,db4,f4]@20 ~]/4", // D Dbaug Abm7 Gbm Gbmaj7
  O: "[~@4 [d3,c4,e4,g4,b4] ~ [d3,c4,e4,g4,b4] [gb2,d4,f4,bb4,d5] ~ [gb2,d4,f4,bb4,d5] ~@5 g2@9 g2 ~ f2 ~ [g2,g3]@2 ~ [g2,g3], ~@15 [c4,d4,e4,g4]@16 ~, ~@15 g3@11 ~@6]/2", // Cmaj7 Bb G C
  P: "[~@4 [d3,c4,e4,g4,b4] ~ [d3,c4,e4,g4,b4] [gb2,gb3,d4,f4,bb4,d5] ~ [gb2,gb3,d4,f4,bb4,d5] ~@5 g2@9 [g2,g3] ~ [f2,f3] ~ [g2,g3]@2 ~ [g2,g3], ~@15 [f4,a4,b4,db5,e5]@16 ~, ~@15 g3@7 ~@10]/2", // Cmaj7 Bb G F G A
  Q: "[~@4 [db3,b3,eb4,gb4,bb4] ~ [db3,b3,eb4,gb4] [f2,f3,db4,e4,a4,db5] ~ [f2,f3,db4,e4,a4,db5] ~@5 [gb2,db3,gb3,db4,eb4,gb4]@9 [gb2,gb3] ~ [e2,e3] ~ [eb2,eb3,g3,bb3,db4]@3 [eb2,g3,bb3,db4]]/2", // Ebm7 B A Ebm7 Gb E Eb7
  R: "[~@4 [ab2,gb3,b3,eb4,gb4]@7 ~ [db3,b3,eb4,gb4,bb4] ~@2 [c3,bb3,e4,a4]@29 [d3,d4,db5,gb5,a5]@14 ~@2 [a3,g4,db5,gb5,a5]@4, ~@15 db4 ~@28 a4 ~@19]/4", // Abm7 Ebm7 Am Dmaj7 Gbm
  S: "[~@12 [d3,d4,a4,db5,gb5,a5]@15 ~ [a3,g4,db5,gb5,a5]@14 ~@2 [d3,d4,a4,db5,gb5,a5]@14 ~@2 [a3,g4,db5,gb5,a5]@14 ~@2 [d3,d4,a4,db5,gb5,a5]@14 ~@2 [a3,g4,db5,gb5,a5]@14 ~@2 [d3,d4,a4,db5,gb5,a5]@2 ~ [d3,d4,a4,db5,gb5,a5]]/7", // Dmaj7 Gbm Dmaj7 Gbm Dmaj7 Gbm Dmaj7
  T: "~@12 [a3,g4,db5,gb5,a5]@2 ~ [a3,g4,db5,gb5,a5]", U: "~@12 [d3,d4,a4,db5,gb5,a5]@2 ~ [d3,d4,a4,db5,gb5,a5]",
  V: "[~@4 [ab2,ab3,c4,gb4,bb4]@5 ~@2 [g2,f3,bb3,d4,f4,a4]@21]/2", // Ab7 Gm7
  W: "[~@3 [d3,c4,gb4,bb4]@7 ~ [g2,f3,bb3,d4,f4,a4]@22 ~@2 [d3,c4,gb4,bb4]@6 ~ d3 [g2,bb3,d4,f4,a4]@22 bb3 ~ [d3,c4]@8 [bb3,f4,a4]@22 ~@2 [c3,bb3,e4,ab4]@6 ~@2 [f2,c3,f3,ab3,c4,eb4,g4]@21, ~@11 d3 ~@31 f3@20 ~@4 [gb4,bb4]@6 ~@2 [g2,d4]@24 ~@29, ~@75 f3@14 ~@39]/8", // Daug Gm7 Daug Gm7 D7 Bbmaj7 Caug Fm7 …
  X: "[~@3 [c3,bb3,e4,ab4]@7 ~@2 f3@21 ~ c3 [c3,bb3]@8 [f2,c3,f3,ab3,c4,eb4,g4]@22 ~ [f2,f3] [bb3,e4,ab4]@7 ~ [f2,f3,c4,eb4,g4]@23 ~ [d3,c4,gb4,bb4]@7 ~ d3@2 ~ d3@12 ~@6, ~@10 c3@23 ~@2 [e4,ab4]@6 ~@34 ab3@21 ~@32, ~@11 [f2,ab3,c4,eb4,g4]@22 ~@34 c3@30 ~@10 [g2,f3,bb3,d4,f4,a4]@21]/8", // Caug C7 Fm7 F Bbm7b5 Cm Daug E …
  Y: "[~@7 d4@3 ~ [g2,g3,bb3,d4,f4,a4]@21, ~@3 [d3,c4,gb4,bb4]@8 ~@21]/2", // Gm7 Daug
  Z: "[~@3 [c4,gb4,bb4]@6 ~@2 [g2,f3,bb3,d4,f4,a4]@21, ~@3 [d3,d4]@8 ~@21]/2", // Cm7b5 Gm7 D
  AA: "[~@3 [d3,c4,d4,gb4,bb4]@7 ~ [bb3,d4,f4,a4]@22 ~@2 [c3,bb3,e4,ab4]@7 ~ [f2,c3,f3,ab3,c4,eb4,g4]@21, ~@11 [g2,f3]@24 ~@29]/4", // Daug Bbmaj7 Caug Fm7 G7
  AB: "[~@3 [c3,bb3,e4,ab4]@8 [f2,c3,f3,ab3,c4,eb4,g4]@23 ~ [c3,bb3,e4,ab4]@7 ~ [ab3,c4,eb4,g4]@22 ~@2 [c3,bb3,e4,ab4]@7 ~ [f2,c3,f3,ab3,c4,eb4,g4]@21, ~@43 [f2,c3,f3]@24 ~@29]/6", // Caug Fm7 Caug Abmaj7 Caug Fm7 F5
  AC: "[~@3 [d3,c4,gb4,bb4]@7 d3 [g2,f3,bb3,d4,f4,a4]@24 [d3,c4,gb4,bb4]@8 [g3,bb3,d4,f4,a4]@10 [bb3,d4] ~@2 [g3,bb3,d4,f4]@8, ~@43 g2@20 ~]/4", // Daug Gm7 Daug Gm7 Bb Gm7
  AD: "[~@3 [d3,c4,gb4,bb4]@7 ~@2 bb3@7 g3 [bb3,d4,f4]!2 ~@5 [g3,bb3,d4,f4]@6 ~@2 [d3,c4,gb4,bb4]@6 ~ d3 [g3,bb3,d4,f4,a4]@10 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~@10 [bb3,db4,e4,gb4,a4]@6 ~@2 [ab3,bb3,eb4,g4]@19 ~@2, ~@11 g2@22 ~@10 g2@23 ~@30, ~@11 [g3,d4,f4,a4]@8 ~@37 g3@11 ~@29]/6", // Daug Bb Gm7 Daug Gm7 Bb Gb7 Eb …
  AE: "[~@7 c3@2 ~@2 [ab3,bb3,eb4,g4]@19 ~@2, ~@3 [bb3,db4,e4,gb4,a4]@6 ~@23]/2", // Eb Gb7
  AF: "[~@7 c3 ~@3 [ab3,bb3,eb4,g4]@18 ~@2 [eb2,eb3,a3,d4,gb4]@4 ~ [eb2,eb3,a3,db4,f4] ~@6 [a3,c4,eb4] [ab2,gb3,b3,db4]@11 ~@4 [a2,g3,db4,gb4]@14 ~@2 [ab2,gb3,bb3,db4,f4]@19 ~@2, ~ [bb3,db4,e4,gb4,a4]@2 ~@29]/6", // Eb D Dbaug Adim Abm7 Gbm Gbmaj7 Gb7
  AG: "[~@4 [d3,c4,e4,g4,b4] ~ [d3,c4,e4,g4,b4] [gb2,d4,f4,bb4,d5] ~ [gb2,d4,f4,bb4,d5] ~@5 [g2,g3]@9 [g2,g3] ~ [f2,f3] ~ [g2,g3]@2 ~ [g2,g3], ~@15 [c4,d4,e4,g4]@17]/2", // Cmaj7 Bb G F G C
  AH: "[~@4 [d3,c4,e4,g4,b4] ~ [d3,c4,e4,g4,b4] [gb2,gb3,d4,f4,bb4,d5] ~ [gb2,gb3,d4,f4,bb4,d5] ~@5 g3 g3@8 [g2,g3] ~ [f2,f3] ~ [g2,g3]@2 ~ [g2,g3], ~@15 [f4,a4,b4,db5,e5]@17, ~@15 g2@9 ~@8, ~@15 d3@5 ~@12]/2", // Cmaj7 Bb G F G A
  AI: "[~@4 [db3,b3,eb4,gb4,bb4] ~ [db3,b3,eb4,gb4,bb4] [gb2,db4,e4,a4] ~ [gb2,db4,e4,a4] ~@5 gb2@9 gb2 ~ e2 ~ eb2@2 [g3,bb3,db4] [eb2,g3,bb3,db4] ~@4 [ab2,gb3,b3,eb4,gb4]@6 ~@2 [db3,b3,eb4,gb4] ~@2 [c3,bb3,e4,gb4,a4]@17, ~@15 [db4,gb4]@13 ~@36, ~@15 [gb3,eb4]@11 ~@2 eb3@7 ~@29]/4", // Ebm7 Gbm7 Gdim Eb7 Abm7 B Gbm7b5 Gb5 …
})).s("gm_piano").gain(0.37).pan(0.2)

// bass · acoustic bass
const bass = note(`<
  ~ A B C D E@2 F G H I J K L@2 M@2 N O H P Q R S T U V W X Y Z Y AA ~ AB AC AD AE@2 AF@4 AG@3 AH AI AJ AK AL AI AL AM
  AN AO AP@2 AN AO AN AQ AR AS@2 AT@2 AU@2 AV@2 AW@2 AX AY AZ@2 BA@2 BB@2 BC@2 BD@2 BE@2 BF@2 BG BH AZ@2 BI@2 BJ@2 BK@2
  BL@2 ~ BM Y BN Y BO ~ BP BQ AD BR@2 BS@2 BT@2 BU@2 ~
>`.pickRestart({
  A: "~@7 f3 c3@2 ~ f3@3 ~@2", B: "~@11 c2@2 ~@3", C: "~@7 f3 c3@2 f3 c3 ab2@2 c3 ab2", D: "~ f2 ~ f2@2 ~@6 c2@2 ~@3",
  E: "[~@4 eb3 ~ eb3 ~ f3@3 ~@2 f3 ~ ab3@4 ~@13]/2", F: "~@7 eb3 eb3@2 ~ ab3@3 ~@2", G: "~@5 a2 e3 a3 b3@2 ~ e3 ~ a2@3",
  H: "~@3 bb3 ~@3 ab3 ~@3 eb3 ~@3 bb2", I: "ab2@2 ~ bb2@2 ~@6 c2@2 ~@3", J: "~@7 f3 c3@3 f3@2 ~@3", K: "~@11 c2 ~@4",
  L: "[~@7 f3 c3 ~ f3 c3 ~@2 c3 ab2@2 f2 ~ f2 ~@7 c2 ~@4]/2", M: "[~@4 eb3 ~ eb3 ~ f3@2 ~ eb3 ~ f3 ~ ab3@5 ~@12]/2",
  N: "~@7 eb3 eb3@2 ~ ab3@4 ~", O: "~@5 a2 e3 a3 b3@2 ~ e3 b2 a2@2 ~", P: "ab2@2 ~ bb2 ~@4 d3 ~ d3 gb3 ~ gb3 ~ c3",
  Q: "d3@2 f3 g2@8 ~ g2 ~ f2 ~", R: "g2@2 ~ g2 ~@4 d3 ~ d3 gb3 ~ gb3 ~ d3", S: "~@2 f3 a3@8 ~ g2 ~ f2 ~",
  T: "g2@2 ~ g2@2 ~@3 db3 ~ db3 f3 ~ f3 ~ bb2", U: "db3 ~ eb3 gb2@5 ~@4 gb2 ~ e2 ~", V: "eb2@2 ~ eb2 ~@4 ab1@6 ~@2",
  W: "db2 ~@2 c2@5 ~@8", X: "~@3 f3 c3@3 f3@2 ~@7", Y: "~@7 c2 ~@8", Z: "~@3 f3 c3 ~ f3 c3 ~@2 c3 ab2 ~ f2 ~ f2",
  AA: "eb3 ~ eb3 ~ f3@2 ~ eb3 ~ f3 ~ ab3@5", AB: "~@3 eb3 eb3@2 ~ ab3@4 ~@5",
  AC: "~ a2 e3 a3 b3@2 ~ e3 b2 a2@2 ~@4 bb3", AD: "~@3 ab3 ~@3 eb3 ~@3 bb2 ab2@2 ~ bb2",
  AE: "[~@4 d3 ~ d3 gb2 ~ gb2 ~ [c2,d2] f2 ~ g2 g2@6 ~@3 g2 ~ f2 ~ g2@2 ~ g2]/2", // Csus2
  AF: "[~@4 d3 ~ d3 gb2 ~ gb2 ~ c3 d3 ~ f3 a3@7 ~@2 g2 ~ f2 ~ g2@2 ~ g2@2 ~@3 db3 ~ db3 f2 ~ f2 ~ db3 eb3@2 db3 gb2@5 ~@4 gb2 ~ e2 ~ eb2 ~@2 eb2]/4",
  AG: "[~@4 ab1@6 ~@2 db2 ~@2 c2@25 ~@4 d2 ~@3]/3", AH: "~@3 d2 b1@3 d2 ~@4 a1@3 a1", AI: "~@7 a1 b1@3 ~ d2@2 ~@2",
  AJ: "~@4 b1@2 ~ d2 ~@4 a1@2 ~ a1", AK: "~@7 a1 b1@3 ~ d2 ~@3", AL: "~@3 d2 b1@2 ~ d2 ~@4 a1@2 ~ a1",
  AM: "~@7 a1 b1@2 ~@2 d2@2 ~ d2", AN: "~@12 a1@2 ~ a1", AO: "~@12 d2@2 ~ d2",
  AP: "[~@12 a1@2 ~ a1@2 ~@11 d2@2 ~ d2]/2", AQ: "~@4 ab1@7 g1@2 ~@3", AR: "~@3 g1 g1@9 g1 ~@2",
  AS: "[~@3 d2@7 ~ g1@7 ~ g1 ~@9 g1 ~@2]/2", AT: "[~@3 d2@8 ~ g1@9 ~ g1 ~ g1@2 ~@6]/2",
  AU: "[~@3 d2@7 ~ g1@7 ~@2 g1!2 ~@10]/2", AV: "[~@3 c2@7 ~ f1@7 ~@4 f1 ~@9]/2",
  AW: "[~ f1 ~@2 c2@6 ~ f1@7 ~ c1 f1!2 ~@7 f1 ~@2]/2", AX: "~@3 c2@8 ~@5", AY: "~@5 f1 ~@2 f1 ~@7",
  AZ: "[~@3 c2@7 ~ f1@7 ~@3 f1 ~@2 f1 ~@7]/2", BA: "[~@11 g1@7 ~ f1 g1 ~@8 g1 ~@2]/2",
  BB: "[g1 ~@2 d2@7 ~ g1@7 ~@3 g1 ~ g1 ~@8]/2", BC: "[~@3 d2@7 ~ g1@7 ~@2 g1!2 ~@7 g1 ~@2]/2",
  BD: "[~@3 d2@7 ~ g1@7 ~@3 g1 ~@2 g1 ~@7]/2", BE: "[~@3 c2@7 ~ f1@9 ~ f1 ~@2 f1@2 ~@6]/2",
  BF: "[~ f1 ~ c2@7 ~ f1@7 ~@3 f1 ~@2 f1 ~@7]/2", BG: "~@3 c2@8 f1@5", BH: "~@5 f1 ~@4 f1 ~@5",
  BI: "[~@3 d2@7 ~ g1@7 ~ f1 g1@3 ~@9]/2", BJ: "[~@3 d2@7 ~ g1@8 ~@2 g1 ~@2 g1 ~@4 g1 ~@2]/2",
  BK: "[~@3 d2@7 ~ g1@7 ~ f1 g1 ~ g1 ~@6 g1 ~@2]/2", BL: "[~@3 d2@7 ~ g1@8 ~@2 g1 ~@10]/2", BM: "~@3 f3 c3@3 f3 ~@8",
  BN: "~@3 f3 c3@2 f3 c3 ab2@2 c3 ab2 ~ f2 ~ f2", BO: "eb3 ~ eb3 ~ f3@3 eb3 ~ f3 ~ ab3@4 ~",
  BP: "~@3 eb3 eb3@3 ab3@2 ~@7", BQ: "~ a2 ~ a3 b3 ~@3 b2 a2@2 ~@4 bb3",
  BR: "[~@4 d3 ~ d3 gb2 ~ gb2 ~@2 f2 ~ g2 g2@6 ~@3 g2 ~ f2 ~ g2@2 ~ g2]/2",
  BS: "[~@4 d3 ~ d3 gb2 ~ gb2 ~ c3 d3 ~ f3 a3@7 ~@2 g2 ~ f2 ~ g2@2 ~ g2]/2",
  BT: "[~@4 db3 ~ db3 ~ f2!2 ~@5 gb2@8 ~ gb2 ~ e2 ~ eb2@2 ~ eb2]/2",
  BU: "[~@4 ab2@5 ~@3 db2 ~@2 c2@6 ~@11, ~@4 ab1@3 ~@25]/2",
})).s("gm_acoustic_bass").gain(0.38)

// bass · acoustic bass · soft notes
const bass_soft = note(`<
  ~@5 A ~@2 B ~@4 C ~@4 D ~@4 E ~@6 F ~@4 G ~@12 H ~@16 I ~@2 J ~@4 K@2 ~@2 L M ~@3 J ~@7 N ~ O ~@7 P ~@8 Q ~@10
>`.pickRestart({
  A: "~@11 eb3 ~@4", B: "~@10 a3 ~ b2 ~@3", C: "~@6 ab2 ~", D: "~@10 a3 ~@5", E: "c3 ~@15", F: "~@4 ab2 ~@3",
  G: "~@6 a3 ~@9", H: "~@3 d2 ~@12", I: "~@11 bb1 ~@4", J: "~@3 f1 ~@12", K: "[~@11 bb1 f1@7 ~@13]/2",
  L: "~@3 d2@8 ~@5", M: "~@5 g1 ~@10", N: "~@3 c1 f1 ~@11", O: "~@6 c1 ~@9", P: "~@11 g1@2 ~@3",
  Q: "~@2 e3 ~@3 a3 e3 ~@8",
})).s("gm_acoustic_bass").gain(0.21)

// chords · vibraphone
const vibraphone = note(`<
  A@2 B@4 C D@5 E@5 F@4 G@2 H@2 I J K@2 L@2 M@2 N@4 O@2 P@2 Q@2 R@3 S@8 T U T V W X T ~@16 Y Z AA AB AC AD AE AF AG AH
  AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW@2 AX@2 AY@6 AZ@2 BA@2 BB@2 BC@3
>`.pickRestart({
  A: "[~@7 [bb5,db6,e6,gb6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@15 ~@2]/2", // Gb7 Eb
  B: "[~@7 [bb5,db6,e6,gb6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@18 ~@6 [bb5,db6,e6,gb6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@17]/4", // Gb7 Eb Gb7 Eb
  C: "~@3 [eb4,eb5,a5,d6,gb6]@3 ~@2 [eb4,eb5,a5,db6,f6] ~@6 [a5,c6,eb6]", // D Dbaug Adim
  D: "[[b5,db6]@12 ~@3 [a4,g5,b5,db6,eb6,gb6]@14 ~@2 [ab4,gb5,bb5,db6,f6]@20 ~@4 [bb5,db6,e6,gb6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@15 ~@2]/5", // Bsus2 B7 Gbmaj7 Gb7 Eb
  E: "[~@7 [bb5,db6,e6,gb6,a6]@5 ~@3 [ab5,bb5,eb6,g6]@19 ~@5 [bb5,db6,e6,gb6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@18 ~@2 [eb4,eb5,a5,d6,gb6]@3 ~@2 [eb4,eb5,a5,db6,f6] ~@6 eb6]/5", // Gb7 Eb Gb7 Eb D Dbaug
  F: "[[ab4,gb5,b5,db6]@12 ~@3 [a4,g5,db6,gb6]@14 ~@2 [ab4,gb5,bb5,db6,f6]@20 ~@5 [d5,c6,e6,g6,b6] ~ [d5,g6] [gb4,d6,e6,f6,bb6,d7] ~ [gb4,d6,f6,bb6,d7] ~@2]/4", // Abm7 Gbm Gbmaj7 Cmaj7 G5 Bb
  G: "[~@3 [g4,g5,d6,e6,g6]@17 ~@4 [d5,c6,e6,g6,b6] ~ [d5,e6,g6] [gb4,d6,f6,bb6,d7] ~ [gb4,d6,f6,bb6,d7] ~@2]/2", // Em7 Cmaj7 Em7 Bb
  H: "[~@3 [g4,d5,g5,f6,a6,b6,db7,e7]@17 ~@4 [db5,b5,eb6,gb6,bb6] ~ [db5,b5,gb6,bb6] [db6,e6,a6] ~ [db6,e6,a6,db7] ~@2, ~@3 f7 ~@28]/2", // G7 Ebm7 Gb A
  I: "~@3 [gb4,gb5]@9 gb4 ~ e4 ~, ~@3 [db6,gb6]@11 ~@2, ~@3 bb5 ~@12", // Gb Gb5
  J: "[eb4,eb5,db6]@6 ~@2 [ab4,gb5,b5,eb6,gb6]@5 ~@3", // Eb7 Abm7
  K: "[[db5,b5,eb6,gb6,bb6] ~@2 [c5,bb5,e6,a6]@8 [ab5,eb6,g6]@15 ~@6, ~@11 bb5 ~@20]/2", // Ebm7 Am Abmaj7
  L: "[~@3 [bb5,db6,e6,gb6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@19 ~@2]/2", // Gb7 Eb
  M: "[~@3 [bb5,db6,e6,a6]@6 ~@2 [ab5,bb5,eb6,g6]@18 ~@3]/2", // A Eb
  N: "[[eb4,eb5,a5,d6,gb6]@3 ~ [eb4,eb5,a5,db6,f6] ~@6 eb6 [ab4,b5,db6]@14 ~ [a4,g5,db6,gb6]@14 ~@2 [ab4,gb5,bb5,db6,f6]@20 ~]/4", // D Dbaug Db7 Gbm Gbmaj7
  O: "[~@4 [d5,c6,e6,g6,b6] ~ [d5,e6,g6] [gb4,d6,f6,bb6,d7] ~ [gb4,d6,f6,bb6,d7] ~@5 [g4,c6,d6,e6,g6]@16 g5, ~@15 g5@11 ~@6]/2", // Cmaj7 Em7 Bb C
  P: "[~@4 [d5,c6,e6,g6,b6] ~ [d5,c6,e6,g6,b6] [gb4,gb5,d6,f6,bb6,d7] ~ [gb4,gb5,d6,f6,bb6,d7] ~@5 g5@7 ~@2 g5 ~ f5 ~ g5@2 ~ g5, ~@15 [g4,f6,a6,b6,db7,e7]@16 ~]/2", // Cmaj7 Bb A7
  Q: "[~@4 [db5,b5,eb6,gb6,bb6] ~ [db5,b5,eb6,gb6] [f4,f5,db6,e6,a6,db7] ~ [f4,f5,db6,e6,a6,db7] ~@5 [gb4,db5,gb5,db6,eb6,gb6]@9 [gb4,gb5] ~ e4 ~ [eb4,eb5,g5,bb5,db6]@3 [eb4,g5,bb5,db6]]/2", // Ebm7 B A Ebm7 Gb Eb7
  R: "[~@4 [ab4,gb5,b5,eb6,gb6]@7 ~ [db5,b5,eb6,gb6,bb6] ~@2 [c5,bb5,e6,a6]@29 [d3,d4,e5,gb5]@4, ~@15 db6 ~@28 c5 ~@3]/3", // Abm7 Ebm7 Am D
  S: "[~@12 [a3,a4,db5,gb5,a5]@14 ~@2 [d3,d4,b4,c5,e5,gb5,a5]@14 ~@2 [a3,a4,db5,gb5,a5]@14 ~@2 [d3,d4,b4,c5,e5,a5]@14 ~@2 [a3,a4,db5,gb5,a5]@14 ~@2 [d3,d4,b4,c5,e5,a5]@14 ~@2 [a3,a4,db5,gb5,a5]@14 ~@2 [d3,d4,b4,c5,e5,a5]@2 ~ [d3,d4,b4,e5,gb5,a5]]/8", // Gbm D7 Gbm Am Gbm Am Gbm Am …
  T: "~@12 [a3,a4,db5,gb5,a5]@2 ~ [a3,a4,db5,gb5,a5]", U: "~@12 [d3,d4,b4,c5,e5,gb5,a5]@2 ~ [d3,d4,b4,c5,e5,a5]",
  V: "~@12 [d3,d4,b4,c5,gb5,a5]@2 ~ [d3,d4,b4,c5,e5,gb5,a5], ~@12 e5 ~@3", W: "~@12 [a3,a4,db5]@2 ~ [a3,a4,db5,gb5,a5]",
  X: "~@12 [d3,d4,b4,c5]@2 ~ [d3,d4,b4,c5,e5,a5], ~@12 [e5,a5] ~@3", Y: "~@14 a4 g4",
  Z: "~ a4 ~ f4 ~@5 g4 ab4 a4 bb4 c5 d5 f5", AA: "g5 ~@2 d5 f5 g5 [g5,a5] ~ g5 f5 g5 a5 g5@2 f5 d5",
  AB: "f5 ~ d5 ~@6 [g4,a4,bb4,d5]@3 ~ g5 f6 ~", // Gm
  AC: "d6 c6 f5 bb5 ~ a5 g5 f5 d5 [g5,a5] [f5,g5] [c5,d5] [d5,f5] [ab4,b4] a4 [f4,g4]", // Gsus2 Fsus2 Csus2 Dm Abm Fsus2
  AD: "d4 c4 d4 ~@5 c4 d4 f4 g4 ~ f4 g4 a4", AE: "bb4 c5 d5 f5 ~ g5 f5 ~ f5 d5 ~ f5 ~ f5 d5 ~",
  AF: "[e5,f5] ~ f5 ~@2 f5 d5 ~ f5!2 d5 c5 ~ [g5,a5] g5 f5", // Fmaj7 Gsus2
  AG: "g5 a5 g5 [d5,f5] [c5,f5] [b4,d5] [ab4,a4] [ab4,c5] [f4,g4] [c4,d4] d4 [eb4,e4] [f4,gb4] g4@2 ~", // Dm F5 Bm Amaj7 Ab Fsus2 Csus2 Emaj7 …
  AH: "ab4 [gb4,g4] f4 c4 bb3 g3 ab3 g3 f3 g3 ~@2 [c4,g4,ab4]@3 ~", // Gmaj7 Abmaj7
  AI: "bb4 c5 d5 eb5 f5 g5 ab5 bb5 ab5 ~@2 g5 f5@2 g5 eb5",
  AJ: "~ f5 c5 ~@2 bb4 ~ ab4 g4@2 f4 g4 c4 ~ f4 c4, ~@8 ab4 ~@7",
  AK: "~ f4 bb4 f4 bb4 [g4,ab4] bb4 [bb4,b4] g4 [ab4,bb4] [b4,c5] [d5,eb5] e5 [f5,gb5] [g5,bb5] [g5,ab5]", // Abmaj7 Bmaj7 Absus2 Cmaj7 Ebmaj7 Gbmaj7 Gm Abmaj7
  AL: "[f5,g5] [c5,eb5] [f5,g5] [c5,eb5] [g4,bb4] [bb4,c5] [f4,g4] [c4,eb4] [f4,g4] [bb3,c4,eb4] ab3 [f3,g3] eb3 ~@3", // Fsus2 Cm Fsus2 Cm Gm Bbsus2 Fsus2 Cm …
  AM: "[ab4,c5] ~@2 bb3 g3 ~ a3 bb3 b3 c4 db4 d4 f4 ~ g4 ~", AN: "ab4 ~ bb4 g4 ab4 bb4 c5 d5 eb5 f5!2 ~@2 bb5 ~ ab5",
  AO: "[gb5,g5] ~ f5 g5 [eb5,f5] eb5 ~ c5 d5@2 eb5 [db5,d5] ~ c5 bb4!2", // Gmaj7 Ebsus2 Dmaj7
  AP: "a4 [g4,ab4] [f4,g4] a4 bb4 ~@4 a4 ~ g4!2 a4 f4 g4", AQ: "f4 c4 ~ d4 ~@9 bb4 gb4 g4",
  AR: "a4 bb4 db5 d5 e5 f5 bb5 ~ a5 ~ f5 ~ g5 ~@3", AS: "~ f6 c6 ~ eb6 ~ d6 ~ c6 d6 c6 ~ bb5 [ab5,a5] ab5 [c5,f5]",
  AT: "bb4 [a4,c5] [a4,bb4] [ab4,a4] f4 [bb3,c4] [ab3,a3] [f3,g3] [c3,d3] [a2,bb2] g2 f2 ~@4", // Am Bbmaj7 Amaj7 Bbsus2 Amaj7 Fsus2 Csus2 Bbmaj7
  AU: "~@2 c4 f4 g4 bb4 ~ ab4 a4 ~ g4 f4 ~ g4 [ab4,a4] ~", AV: "f4 ~ d4 ~@6 g4 a4 bb4 c5 f5 a4@2, ~@14 ab4 ~",
  AW: "[~@3 [bb5,e6,a6]@6 ~@2 [ab5,c6,eb6,g6]@17 ~@4, ~@3 c5@8 ~@21]/2", // A Abmaj7
  AX: "[~@3 [c5,bb5,e6,a6]@6 ~@2 [ab5,c6,eb6,g6]@18 ~@3]/2", // Am Abmaj7
  AY: "[~@3 [c5,bb5,e6,a6]@6 ~@2 [f4,ab5,c6,eb6,g6]@17 ~@3 [eb4,a5,db6,gb6]@4 ~ [eb4,a5,db6,f6] ~@6 eb6 [ab4,b5,db6]@13 ~@2 [a4,g5,db6,gb6]@14 ~@2 [ab4,bb5,db6,f6]@21]/6", // Am Fm7 Ebm7b5 Dbaug Db7 Gbm Bbm7
  AZ: "[~@4 b6 ~ b6 d7 ~ d7 ~@5 [g4,d5]@15 ~@2, ~@15 [b5,d6]@12 ~@5]/2", // G5 Bm
  BA: "[~@4 [d5,c6,e6,g6,b6] ~@2 [d6,f6,bb6] ~ [gb4,d6,f6,bb6] ~@5 [g4,g5,f6,a6,e7]@12 ~@5]/2", // Cmaj7 Bb Fmaj7
  BB: "[~@4 [db5,b5,db6,eb6,gb6] ~ [db5,gb6] [f4,e6,a6] ~ [f4,db6,e6,a6] ~@5 [gb4,db5,db6,gb6]@9 ~@4 [eb4,bb5,eb6]@4]/2", // B Gb5 Fmaj7 A Gb5 Eb5
  BC: "[~@4 [eb5,b5,eb6,gb6]@5 ~@3 [db5,b5,eb6,gb6] ~@2 [c5,e6,a6]@20 ~@13, ~@15 bb5@11 ~@22]/3", // B Am
})).s("gm_vibraphone").gain(0.15).pan(0.6)

// chords · vibraphone · soft notes
const vibraphone_soft = note(`<
  ~@7 A ~@12 B C@2 D E F G ~@6 H@2 ~@2 I J ~@3 K ~@2 L@2 ~@2 M@4 N ~ O ~@2 P Q ~@24 R S ~@4 T U V ~@3 W ~@3 X Y@2 Z@2
  ~@2 AA@2 AB@2 AC@2 AD ~ AE@2 AF ~@2
>`.pickRestart({
  A: "~@3 ab4@10 ~@3, gb5@3 ~", B: "~@10 [c6,e6,b6] ~@5", C: "[~@4 c6@15 ~@7 [c6,b6] ~@5]/2", D: "~@3 c7 ~@12",
  E: "~@10 eb6 ~@5", F: "~@9 eb6@4 ~@3", G: "[g5,bb5]@5 ~@11", H: "[~@12 gb5@13 ~@7]/2", I: "~@6 [c6,b6] ~@9",
  J: "~@6 g5 ~", K: "~@10 e5 ~@5", L: "[~@6 [b4,a5]@7 ~@3]/2", M: "[~@6 gb5@7 ~@3]/2", N: "~@12 gb5@2 ~ c5",
  O: "~@15 gb5", P: "~@6 [gb5,a5] ~", Q: "~@12 gb5@2 ~ gb5", R: "~@3 d5 ~@12", S: "~@10 db4 ~@5", T: "~@10 a3 ~@5",
  U: "f4 ~@15", V: "~@9 e5 ~@6", W: "~@11 c5 ~@4", X: "~ c4 ~@14", Y: "[~@11 f4@17 ~@4]/2", Z: "[~@11 f4@18 ~@3]/2",
  AA: "[~@3 gb5@3 ~@2]/2", AB: "[~@11 gb5@20 ~]/2", AC: "[~@15 g5@15 ~@2, ~@15 a5@12 ~@5]/2",
  AD: "~@6 [c6,e6,g6,b6] gb4 ~@8", AE: "[~@6 [b5,eb6] db6 ~@8 ab5@9 ~@3 [eb5,g5]@4, ~@15 bb5@9 ~@8]/2",
  AF: "~@4 [ab4,gb5]@5 ~@7", // Ab7
})).s("gm_vibraphone").gain(0.08).pan(0.6)

// drums · kick
const kick = s("bd").struct(`<
  A B C B C B@2 D B D B@2 C B E B@3 D B@3 F B@3 G H I J I J I@2 K I@3 L I@2 L M N O P I@31 Q F B F@3 R F S F R F T F B@2
  S U I@5 V W I J K J I@2 K I L I L I L@2 X Y ~@2
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@6 x ~@4", D: "~@4 x ~@6 x!2 ~@3", E: "~@3 x!2 ~@6 x ~@4",
  F: "~@3 x!2 ~@7 x ~@3", G: "~@3 x ~@12", H: "x ~@2 x ~@12", I: "x!2", J: "x ~@6 x ~@8", K: "x ~@6 x!2 ~@7",
  L: "x ~@7 x ~@6 x", M: "x ~@7 x ~@3 x ~@2 x", N: "~@4 x ~@7 x ~@2 x", O: "~@15 x", P: "~ x ~ x!2 ~@7 x ~@3",
  Q: "x ~ x!2", R: "~@3 x ~@2 x ~@5 x ~@3", S: "~@3 x ~@8 x ~@3", T: "~@3 x ~@2 x ~", U: "~ x", V: "x",
  W: "x ~@2 x ~@4 x ~@7", X: "~@8 x ~ x ~ x ~@2 x", Y: "~@12 x ~@2 x",
})).gain(0.42)

// drums · rim
const rim = s("rim").struct("<~@45 A B@15 C D E F G E H I ~ J K L M N ~ O P ~@42>".pickRestart({
  A: "~@14 x!2", B: "x!16", C: "x!5 ~@11", D: "~ x ~@2 x ~@9 x ~", E: "~ x ~@14", F: "~ x ~@2 x ~@2 x ~@8", G: "~@7 x",
  H: "~@5 x ~@2 x ~@7", I: "~ x ~@2 x ~@2 x ~@2 x ~@5", J: "~ x ~@7 x ~@2 x ~@3", K: "~@6 x ~@2 x ~@6",
  L: "~@9 x ~@2 x ~@3", M: "~@13 x ~@2", N: "x ~@8 x ~@2 x ~@3", O: "~ x ~@2 x ~@8 x ~@2", P: "x",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct(`<
  A B C D E F G H I J K L I M N I O P Q I R S T I U V W X Y Z AA AB AC AD AE AF S AG AH AI AJ AK AL ~@2 AM ~@32 AN@2
  AO@2 AN AO AN AO AN AO AN@2 AO@2 AN ~@8 AP AQ AR AS S AT AQ AR AU AR AV S AW AX AY AZ ~@3
>`.pickRestart({
  A: "~@10 x!2 ~@2 x ~", B: "~@2 x!2 ~@3 x ~@7 x", C: "~@2 x!2 ~@3 x ~@8", D: "~@3 x ~@2 x ~@4 x ~@3 x",
  E: "~@3 x ~@2 x!2 ~@3 x ~@2 x ~", F: "~@3 x ~ x!3 ~@3 x ~@2 x ~", G: "~@3 x ~@2 x ~@9", H: "~@3 x ~@2 x ~@3 x!3 ~@3",
  I: "~@2 x!2 ~@2 x ~@4 x ~@2 x ~", J: "~@3 x ~@2 x ~@4 x ~@2 x ~", K: "~@2 x!2 ~ x ~@3 x ~@3 x ~@2",
  L: "~@2 x!2 ~@2 x ~@8 x", M: "~@2 x!2 ~@4 x!2 ~@2 x ~@2 x", N: "~@2 x!2 ~@12", O: "~@2 x!2 ~@2 x!2 ~@2 x ~@5",
  P: "~@2 x!2 ~@2 x ~@3 x!2 ~@2 x!2", Q: "~@3 x ~@2 x ~@2 x ~@3 x ~@2", R: "~@3 x ~@12",
  S: "~@2 x ~@3 x!2 ~@2 x ~@3 x!2", T: "~ x ~@4 x ~@9", U: "~ x ~ x ~ x ~ x ~@8", V: "~@2 x!2 ~@2 x ~@4 x ~@4", W: "x",
  X: "~@15 x", Y: "~@2 x ~@4 x ~@2 x ~@4 x", Z: "~ x ~@4 x ~@2 x ~@6", AA: "~@2 x!2 ~@2 x ~@4 x ~@2 x!2",
// … 127 more lines