Strudelify

Life's Been Good

Joe Walsh

KeyF majorTempo100 bpm
0:00/0:00
// Life's Been Good — Joe Walsh
// 100 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 142 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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 · distortion guitar · "Lead Guitar"
const distortion_guitar = note(`<
  ~@3 A B A C D B E F G H@2 I G H@2 I G J ~@16 K L M N K L ~@11 K L M N K L ~@9 O@2 P@2 O@2 Q R S@2 T@2 U@2 V@2 W@2 X
  Y@2 ~@2 Z AA@2 AB@2 AC@2 AD@2 AE@2 AF@2 AE@2 AF@2 AG@2 ~@15 AH AI AJ@3 AI AK AL@8 ~
>`.pickRestart({
  A: "~@2 b2@3 b2 a2@2 db3@2 a3@2 ~@2 a2@2", B: "b2 e3 c3 a3@2 [e3,a3] ~ [e3,a3]",
  C: "db3@2 e3@2 c3@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2", D: "a2@2 b2!3 a2 ~ a2",
  E: "~@2 db3 e3 b2 a2 ~ a2", F: "b2@2 e3@2 c3@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2",
  G: "~ [g3,c4] [gb3,b3] [e3,a3] [g3,c4] [e3,a3] ~@2", // C5 B5 A5 C5 A5
  H: "[~@2 [e3,a3,db4] [e4,a4,db5]@6 [g3,c4] [gb3,b3] [e3,a3] [g3,c4] [e3,a3] ~@2]/2", // A C5 B5 A5 C5 A5
  I: "~@2 [a3,d4,gb4] [a3,d4,gb4]@5", J: "~@2 [e3,a3,db4] [e4,a4,db5]@4 ~", K: "g2 ~@2 g3 f3 ~@3",
  L: "~@2 e3@2 f3@2 e3@2 f3@2 e3@2 f3 g3@3", M: "c3 e3 g3 [g2,d3,g3]@5", N: "[c3,e3,g3]@3 [g2,d3,g3]@5",
  O: "[b4 e5 gb5 b4@3 a4@7 ~@2 a4]/2", P: "[gb5@2 e5@2 b4@16 c5 ~ db5 ~ c5 ~ db5 ~ b4 ~ a4 ~]/2", Q: "gb5 e5 b4 b4@5",
  R: "c5 ~ db5 ~ c5 ~ db5 ~ c5 ~ db5 ~ b4 ~ a4 ~", S: "[b4 e5 gb5 b4@3 a4@8 ~ b4]/2", T: "[gb5 e5 b4 b4@9 ~@2 a5@2]/2",
  U: "[gb5 e5 b4@2 b4@5 e5 gb5 b4@2 a4 ~ a4]/2", V: "[a4@2 d5@2 e5@2 a4@14 bb4 ~ b4 ~ bb4 ~ b4 ~ a4@2 g4@2]/2",
  W: "[a4@10 ~ db5 c5 db5 c5 b4]/2", X: "a4", Y: "[db5 a4 e4@2 d5@2 db5@2 e4 gb4 a4@2 a4@20]/2", Z: "~@10 b2@3 b2 a2@2",
  AA: "[db3@2 a3@2 ~@2 a2@2 b2@2 e3@2 c3@2 a3@4 [e3,a3]@2 ~@2 [e3,a3]@2 ~@2 b2@3 b2 a2@2]/2", // A5
  AB: "[db3@2 a3@2 ~@2 a2@2 db3@2 e3@2 c3@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2 a2@4 b2@2 b2@2]/2", // D5
  AC: "[b2 a2 ~ a2 b2 e3 c3 a3@2 [e3,a3] ~ [e3,a3] ~@2 db3 e3]/2", // A5
  AD: "[b2!2 a2@2 ~@2 a2@2 db3@2 e3@2 c3@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2 ~@2 [g3,c4]@2 [gb3,b3]@2 [e3,a3]@2]/2", // D5 C5 B5 A5
  AE: "[[g3,c4] [e3,a3] ~@4 [e3,a3,db4] [e4,a4,db5]@6 [g3,c4] [gb3,b3] [e3,a3]]/2", // C5 A5 A C5 B5 A5
  AF: "[[g3,c4] [e3,a3] ~@4 [a3,d4,gb4] [a3,d4,gb4]@5 ~ [g3,c4] [gb3,b3] [e3,a3]]/2", // C5 A5 D C5 B5 A5
  AG: "[[g3,c4] [e3,a3] ~@4 [e3,a3,db4] [e4,a4,db5]@4 ~@5]/2", AH: "~@4 g2 ~@2 g3", AI: "f3 ~@4 e3 f3 e3",
  AJ: "[f3@2 e3@2 f3 g3@3 c3@2 e3@2 g3@2 [g2,d3,g3]@10 [c3,e3,g3]@6 [g2,d3,g3]@10 g2@2 ~@4 g3@2]/3", // G5 C G5
  AK: "f3@2 e3@2 f3 g3@3 ~@8",
  AL: "[~@8 [e3,a3]@26 [e3,a3]@2 ~@2 [e3,a3]@28 [d3,a3]!2 [d3,a3]@2 [d3,a3]!2 [e3,a3]@26 [e3,a3]@2 ~@2 [e3,a3]@26]/8", // A5 D5 A5
})).s("gm_distortion_guitar").gain(0.72)

// chords · distortion guitar · "Second Guitar"
const distortion_guitar_2 = note(`<
  ~@11 A B C D A B C D A E F G H@2 F G I@2 J K J K J K J L ~@2 M N ~@2 O P@2 J K J K J K J L ~@2 M N ~@2 Q R@2 ~@37 S
  T@2 U@2 T@2 U@2 V@2 W X@2 Y W Z@3 AA AB AA AB AA AB AC AD ~ AE@2 AF ~ AG AH AI AJ AK@2 AI AJ AL ~
>`.pickRestart({
  A: "a2@2 [g3,c4]@2 [gb3,b3]@2 [e3,a3]@2 [g3,c4] [gb3,b3] [e3,a3]@2 ~@2 a2@2", // C5 B5 A5 C5 B5 A5
  B: "db3 e3 db3 [e3,a3]@2 [e3,a3] ~ [e3,a3]", // A5
  C: "~@2 [g3,c4]@2 [gb3,b3]@2 [e3,a3]@2 [g3,c4] [gb3,b3] [e3,a3]@2 ~@2 a2@2", // C5 B5 A5 C5 B5 A5
  D: "db3@2 e3@2 db3@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2", // D5
  E: "db3 e3 db3 [e3,a3]@2 [a2,e3,a3]!2 [f2,c3,f3]", F: "[f2,c3,f3] ~@6 [f2,c3,f3]", G: "[f2,c3,f3] ~@6 [a2,e3,a3]",
  H: "[[a2,e3,a3]@12 [e3,a3] [d3,g3] e3 d3]/2", I: "[[a2,e3,a3]@25 ~ c3 ~ d3 ~ e3 ~]/2",
  J: "f3@3 f3 f3@2 f3@2 e3@2 ~@6", K: "d3@3 d3 d3@2 d3@2 c3@2 ~@6", L: "d3@3 d3 d3@2 c3@2 ~@2 c3@2 b2@2 a2@2",
  M: "e5@2 a4!2 a4@2 g4@4 [c4,b4]@2 [d4,c5]@4", N: "e5@2 a4!2 a4@2 ~@2 b4@2 a4@2 [d4,g4]@4",
  O: "~ e3 g3 c4 ~ d3 g3 b3, c3 b2", P: "[[a2,e3,a3]@24 [a2,e3,a3] ~ c3 ~ d3 ~ e3 ~]/2", Q: "c3 e3 g3 c4 b2 d3 g3 b3",
  R: "[[a2,e3,a3]@3 ~]/2", S: "~@4 a2 [g3,c4] [gb3,b3] [e3,a3]",
  T: "[[g3,c4] [gb3,b3] [e3,a3]@2 ~@2 a2@2 db3@2 e3@2 db3@2 [e3,a3]@4 [e3,a3]@2 ~@2 [e3,a3]@2 ~@2 [g3,c4]@2 [gb3,b3]@2 [e3,a3]@2]/2", // C5 B5 A5 C5 B5 A5
  U: "[[g3,c4] [gb3,b3] [e3,a3]@2 ~@2 a2@2 db3@2 e3@2 db3@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2 a2@2 [g3,c4]@2 [gb3,b3]@2 [e3,a3]@2]/2", // C5 B5 A5 D5 C5 B5 A5
  V: "[[g3,c4] [gb3,b3] [e3,a3]@2 ~@2 a2@2 db3@2 e3@2 db3@2 [e3,a3]@4 [a2,e3,a3]@2 [a2,e3,a3]@2 [f2,c3,f3]@2 [f2,c3,f3]@2 ~@6]/2", // C5 B5 A5 F5
  W: "~@3 [f2,c3,f3]!2 ~@3", X: "[~@3 [a2,e3,a3] [a2,e3,a3]@12]/2", Y: "[e3,a3] [d3,g3] e3 d3 [f2,c3,f3] ~@3",
  Z: "[~@6 [a2,e3,a3]@2 [a2,e3,a3]@25 ~ c3 ~ d3 ~ e3 ~ f3@3 f3 f3@2 f3@2]/3", AA: "e3@2 ~@6 d3@3 d3 d3@2 d3@2",
  AB: "c3@2 ~@6 f3@3 f3 f3@2 f3@2", AC: "e3@2 ~@6 d3@3 d3 d3@2 c3@2", AD: "~ c3 b2 a2 ~@4",
  AE: "[~@8 e5@2 a4!2 a4@2 g4@4 [c4,b4]@2 [d4,c5]@4 e5@2 a4!2 a4@2 ~@2]/2", AF: "b4 a4 [d4,g4]@2 ~@4",
  AG: "~@4 c3 e3 g3 c4", AH: "b2 d3 g3 b3 a2@2 [e3,a3] ~", AI: "a2 [e3,a3] ~ a2 [e3,a3] ~ a2 [e3,a3]",
  AJ: "~ [a2,e3,a3] ~ [a2,e3,a3]@3 [e3,a3] ~", // A5
  AK: "[a2@2 [e3,a3]@2 ~@2 a2@2 [e3,a3]@2 ~@2 a2@2 [d3,a3,d4]@4 [d3,a3]!2 [d3,a3,d4]@2 [d3,a3]!2 a2@4 [e3,a3]@2 ~@2]/2", // A5 D5 A5
  AL: "a2 [e3,a3] ~ a2 ~@4", // A5
})).s("gm_distortion_guitar").gain(0.72)

// chords · distortion guitar · "Second Guitar" · soft notes
const distortion_guitar_soft = note("<~@37 A@2 ~@2 A@2 ~@11 A@2 ~@2 A@2 ~@66 B A C ~ B A C ~@9>".pickRestart({
  A: "~@4 [f4,a4,d5] ~@7 [f4,a4,d5] ~@3", B: "~@12 [f4,a4,d5] ~@3", C: "~@4 [f4,a4,d5] ~@11",
})).s("gm_distortion_guitar").gain(0.4)

// bass · electric bass pick · "Base"
const bass = note(`<
  ~@6 A B@3 C D E F G H I@2 J K L M N O@2 M N P@2 Q R Q R Q R Q S T U V@2 T U W P@2 Q R Q R Q R Q S T U V@2 T U W X@2
  ~@4 Y Z AA AB AC AD AA AB AC AD AA AB AC AD AE AF AG AH AI Z AJ AK AL@4 ~@3 AM@3 ~ AN AO AP AQ@2 AR AS AT AU AV@2 AW
  AX@3 AW AY@2 AZ BA BB BA BB BA BB BC BD BE BF@3 BE BG BH@8 ~
>`.pickRestart({
  A: "~@10 d2!3 ~ d2!2", B: "[a1@13 a1 ~ a1@3 ~@6]/3", C: "~@10 d2!2 d2@2 d2!2", D: "a1!2 ~@2 a1!2 ~@2",
  E: "a1 a1@2 e2 a1 a2 a1 a2", F: "a1!2 ~ g1 a1!2 ~ g1", G: "a1@2 g1@2 a1@2 d2@4 d2!2 d2@2 d2!2",
  H: "a1@4 ~@2 a1 ~ a1@2 a1@2 g1@2 ab1@2", I: "[a1@2 ~ g1 a1!2 ~ a1@3 ~ g1 a1!2 ~ g1]/2",
  J: "a1@4 ~@2 c2@2 d2@2 d2!2 d2@2 d2!2", K: "a1@4 ~@2 a1 ~ a1@2 a1@2 ~@2 g1@2", L: "a1@2 ~ a1@2 a1!2 e1",
  M: "f1 ~@6 f1", N: "f1 ~@6 a1", O: "[a1@15 e1]/2", P: "[a1@24 ~@2 c2 ~ d2 ~ e2 ~]/2", Q: "f2 ~@2 f2!2 ~ f2 ~ e2 ~@7",
  R: "d2 ~@2 d2!2 ~ d2 ~ c2 ~@7", S: "d2 ~@2 d2!2 ~ c2 ~@3 c2 ~ b1 ~ a1 ~", T: "g1 ~@2 g2 e2 ~@3",
  U: "~@2 e2@2 f2@2 e2@2 f2@2 e2@2 f2 g2@3", V: "c2@4 ~@2 g1@4 d2 e2 g2@2 e2 d2", W: "c2!2 b1!2", X: "[a1@3 ~]/2",
  Y: "~@6 b1 c2", Z: "db2 e2 gb2 a2 ~@4", AA: "a1 ~ gb2 e2 ~@4", AB: "e1!2 gb1 a1 ~@4", AC: "e1@2 gb1 a1 ~@2 b1 c2",
  AD: "db2 e2 gb2 a1 ~@4", AE: "a2 b2 a2 ~ e2@2 a1@2 ~@4 b1@2 c2@2", AF: "db2 e1 gb1 a1 ~@4", AG: "g1 ~ e2 d2@2 e2 ~@2",
  AH: "c2 b1 a1 g1 ~ d1@3", AI: "e1!2 gb1 a1 ~@2 b1 c2", AJ: "[a1,a2]@2 b2 a2@2 b2 b1 c2",
  AK: "db2 e1 gb1 a1 ~@2 b1 c2", AL: "[db2 e1 gb1 a1@25 ~@4]/4", AM: "[~@2 d2!3 ~ d2!2 a1@26 a1@2 ~@2 a1@6 ~@4]/3",
  AN: "~@2 d2!2 d2@2 d2!2 a1@2 a1@2 ~@4", AO: "a1!2 ~@2 a1 a1@2 e2", AP: "a1 a2 a1 a2 a1!2 ~ g1",
  AQ: "[a1@2 a1@2 ~@2 g1@2 a1@2 g1@2 a1@2 d2@4 d2!2 d2@2 d2!2 a1@4 ~@2 a1 ~]/2", AR: "a1!2 g1 ab1 a1@2 ~ g1",
  AS: "a1!2 ~ a1@3 ~ g1", AT: "a1!2 ~ g1 a1@2 ~ c2", AU: "d2@2 d2!2 d2@2 d2!2 a1@4 ~@2 a1 ~",
  AV: "[a1!2 ~ g1 a1@2 ~ a1@2 a1!2 e1 f1 ~@3]/2", AW: "~@3 f1!2 ~@3", AX: "[~@3 a1 a1@15 e1 f1 ~@3]/3",
  AY: "[~@3 a1 a1@12]/2", AZ: "~@2 c2 ~ d2 ~ e2 ~ f2 ~@2 f2!2 ~ f2 ~", BA: "e2 ~@7 d2 ~@2 d2!2 ~ d2 ~",
  BB: "c2 ~@7 f2 ~@2 f2!2 ~ f2 ~", BC: "e2 ~@7 d2 ~@2 d2!2 ~ c2 ~", BD: "~@2 c2 ~ b1 ~ a1 ~ g1@2 ~@4 g2@2",
  BE: "e2 ~@4 e2 f2 e2",
  BF: "[f2@2 e2@2 f2 g2@3 c2@4 ~@2 g1@4 d2 e2 g2@2 e2 d2 c2@4 ~@2 g1@4 d2 e2 g2@2 e2 d2 g1@2 ~@4 g2@2]/3",
  BG: "f2@2 e2@2 f2 g2@3 c2@2 e2@2 g2@2 c3@2",
  BH: "[b2@2 a2@2 g2@2 b1@2 a1@6 a1@4 a1@4 a1@2 a1@6 a1@4 a1@4 a1@2 a1@6 a1@8 a1@2 a1@6 d2@4 d2!2 d2@2 d2!2 a1@6 a1@4 a1@4 a1@2 a1@6 a1@4 a1@4 a1@2 a1@6 a1@8 a1@2 ~@8]/8",
})).s("gm_electric_bass_pick").gain(0.72)

// chords · piano
const piano = note("<~@10 A B C D E B C D E B C ~@44 F@18 ~@2 F@6 ~@9 G H I J@2 H I J@2 H K ~@31>".pickRestart({
  A: "~@12 e5 [db5,d5] [a4,b4] [gb4,ab4]", B: "[e4,a4,db5] [e4,a4,db5]@2 [e4,a4,db5]!2 [e4,a4,db5]@2 [e4,a4,db5]",
  C: "~ [e4,a4,db5] [e4,a4,db5]@2 [e4,a4,db5]@2 [e4,a4,db5]@2", // A
  D: "~ [e4,a4,db5] [e4,a4,db5]@2 [e4,a4,db5]@3 [e4,a4,db5]", // A
  E: "[e4,a4,db5] [e4,a4,db5]@2 [gb4,a4,d5]@2 [gb4,a4,d5] [gb4,a4,d5]@2", F: "[a2,db3,e3]/2",
  G: "~@4 e5 [db5,d5] [a4,b4] [gb4,ab4] [e4,a4,db5]@2 [e4,a4,db5]@4 [e4,a4,db5]@2", // Dmaj7 Asus2 Gbsus2 A
  H: "[e4,a4,db5] [e4,a4,db5]@2 [e4,a4,db5] ~ [e4,a4,db5] [e4,a4,db5]@2", // A
  I: "[e4,a4,db5]@2 [e4,a4,db5]@2 ~ [e4,a4,db5] [e4,a4,db5]@2", // A
  J: "[[e4,a4,db5]@3 [e4,a4,db5]!2 [e4,a4,db5]@2 [gb4,a4,d5]@2 [gb4,a4,d5] [gb4,a4,d5]@2 [e4,a4,db5] [e4,a4,db5]@2 [e4,a4,db5]]/2", // A D A
  K: "[e4,a4,db5]!2 ~@2", // A
})).s("gm_piano").gain(0.56)

// chords · acoustic guitar steel · "Acoustic"
const acoustic_guitar_steel = note("<~@21 A@2 B@2 A@2 C D ~@81 E F G H I F G J@2 ~@23>".pickRestart({
  A: "~@2 [a4,c5,f5]!2 [a4,c5,f5]@2 [e4,g4,c5]!2 [e4,g4,c5]@2 [c4,f4,a4]@2 [c4,f4,a4]@4", // F C F
  B: "~@2 [a4,c5,e5]!2 [a4,c5,e5]@2 [g4,b4,d5]!2 [g4,b4,d5]@2 [e4,a4,c5]@2 [e4,a4,c5]@4", // Am G Am
  C: "~@2 [a4,c5,e5]!2 [a4,c5,e5]@2 [g4,b4,d5]!2 [g4,b4,d5]@2 [e4,a4,c5]@2 [e4,a4,c5]@2 [g4,b4,e5]@2", D: "[a4,c5,e5]",
  E: "~@10 [a4,c5,f5]!2 [a4,c5,f5]@2 [e4,g4,c5]!2", // F C
  F: "[e4,g4,c5]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 ~@4 [a4,c5,f5]!2 [a4,c5,f5]@2 [e4,g4,c5]!2", // C F C
  G: "[e4,g4,c5]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 ~@4 [a4,c5,e5]!2 [a4,c5,e5]@2 [g4,b4,d5]!2", // C F Am G
  H: "[g4,b4,d5]@2 [e4,a4,c5]@2 [e4,a4,c5]@4 ~@2 [a4,c5,e5]!2 [a4,c5,e5]@2 [g4,b4,d5]!2", // G Am G
  I: "[g4,b4,d5]@2 [e4,a4,c5]@2 [e4,a4,c5]@4 ~@2 [a4,c5,f5]!2 [a4,c5,f5]@2 [e4,g4,c5]!2", // G Am F C
  J: "[[g4,b4,d5] [e4,a4,c5]!2 [g4,b4,e5] [a4,c5,e5]@8 ~@4]/2", // G Am Em Am
})).s("gm_acoustic_guitar_steel").gain(0.56)

// other · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~@11 A@8 B@2 ~@16 C@2 D E@3 F G@2 ~@8 C@2 D E@3 F G@2 ~@37 H@8 I@3 ~@15 J@7 K@5 ~@4
>`.pickRestart({
  A: "[db4@7 d4 db4@7 d4, a3]/8", B: "db4/2", C: "g3/2", D: "c4@3 g3@5", E: "[c4 g3@7]/3", F: "c4 b3",
  G: "[a3@13 ~@3]/2", H: "[~ db4@7 d4 db4@7, ~ a3@15]/8", I: "[d4 db4@4 ~]/3",
  J: "[~@4 g3@16 c4@3 g3@5 c4@3 g3@21 c4@4]/7", K: "[b3 db4@7 d4 ~, ~ a3@8 ~]/5",
})).s("gm_string_ensemble_2").gain(0.56)

// bass · synth bass 1 · "Synth Base"
const bass_2 = note("<~@61 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C ~@49>".pickRestart({
  A: "a2 e2 a1 gb3 a1 e3 db2 gb2", B: "e2 db2 a1 a2 a1 ~ a1 ~", C: "e2 db2 a1 a2 ~@4",
})).s("gm_synth_bass_1").gain(0.56)

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

// drums · snare
const snare = s("sd").struct(`<
  A@4 B A C B@2 A C D@10 ~@3 E ~@3 E ~@8 D@3 F D@3 ~ G ~@8 D@3 F D@3 ~@4 H@3 I D@20 J D@2 K C L I M C N I O D@9 H ~@3 P
  ~@3 P ~@7 C D@3 Q D@4 R D S D R H ~
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@5 x ~ x", C: "~@3 x", D: "~ x ~ x", E: "~ x", F: "~@4 x ~@7 x!3 ~", G: "~@7 x!2 ~@7",
  H: "~ x ~@2", I: "~@2 x!2", J: "~ x!2 ~@3 x ~", K: "~@2 x ~@4 x", L: "x ~@6 x", M: "x ~ x!3 ~ x!2 ~@6 x ~",
  N: "x ~@2 x", O: "x ~ x!3 ~ x!2 ~@4 x ~@3", P: "x", Q: "~@4 x!3 ~@5 x ~@3", R: "~ x ~@4 x ~",
  S: "~@2 x!3 ~ x!2 ~@4 x ~@3",
})).gain(0.72)

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

// drums · low tom
const low_tom = s("lt").struct("<~@53 [~@7 x] ~@68 [~ x ~@6] ~@19>").gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@49 A ~@3 B ~@35 C ~@32 D ~@3 E ~@15>".pickRestart({
  A: "~@11 x ~@4", B: "~@6 x!2", C: "~ x ~@2", D: "~ x!3 ~@12", E: "~@2 x ~ x!2 ~@10",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@20 A@3 ~ A@3 ~ B ~@9 C D E ~@2 D ~@12 D E ~@2 D ~@11 A ~@3 A ~ A ~ A ~ A ~ F ~ A ~ A ~ A ~@19 G@3 ~ G@3 ~@7 H ~ G
  ~@2 I H ~@2 I ~@8
>`.pickRestart({
  A: "~@7 x", B: "~@7 x ~@8", C: "~@13 x ~@2", D: "~@5 x ~ x", E: "~@5 x ~@2", F: "~@2 x!2", G: "~@3 x ~@4",
  H: "~ x ~@6", I: "~ x ~ x ~@4",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<~@49 A ~@3 B ~@35 C ~@32 D ~@3 C ~@15>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@5 x!2 ~", C: "~ x ~@6", D: "x!2 ~@14",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A ~@3 A B ~@3 B C ~@2 B ~ B@3 ~ B@3 ~@4 A ~@4 B ~ D@2 B ~ D B ~@4 A ~@4 B E D@2 B ~ D B ~@7 B ~@3 B ~ B ~ B ~@4
  B@2 ~ B ~ B ~ D ~@2 F ~ F ~ G ~ A ~ G ~@3 F ~ H ~ F ~ F@3 ~ F@3 ~@5 I ~@3 F ~ J@2 F ~ J F ~ K ~ G ~ H ~@2
>`.pickRestart({
// … 8 more lines

More by Joe Walsh