Strudelify
Come On Eileen cover art

1997 · It Means Everything

Come On Eileen

Save Ferris

KeyG majorTempo120 bpm
0:00/0:00
// Come On Eileen — Save Ferris
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar, guitar.
setcpm(120/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.

// bass · electric bass finger · "bass"
const bass = note(`<
  A B C D E F G D H I J K H I J K H I J K H I J K H F G L@2 M N O P M N O Q@2 R S T U V W X Y V W X Y V W X Y Z S T AA@2
  AB AC AD AE AB AC AD AF AB AC AD AG@2 AH AI AJ AK AL@4 AM AN AO AP AQ AR AS AT@2 AU@2 AV AW AX AY AZ BA BB BC BD BE@3
>`.pickRestart({
  A: "c2 ~@7", B: "e1 ~@7", C: "f1 ~@7", D: "c2@2 c2!6 g1@2 g1!6", E: "c2@2 c2!6 c2@2 c2!6", F: "e1@2 e1!6 e1@2 e1!6",
  G: "f1@2 f1!6 f1@2 f1!6", H: "c2!2 e2!2 g2!2 e2!2 c2!2 e2!2 f2!2 g2!2", I: "e2!2 g2!2 b2!2 g2!2 e2!2 g2!2 a2!2 c3!2",
  J: "f1!2 a1!2 c2!2 a1!2 f1!2 a1!2 a#1!2 c2!2", K: "c2!2 e2!2 g2!2 e2!2 g1!2 b1!2 d2!2 b1!2",
  L: "[c2@2 c2!6 g1@4 g1@20]/2", M: "d2!2 a1 b1 d2 a1 b1 d2", N: "a2!2 e2 f#2 a2 e2 f#2 a2",
  O: "e2!2 a1 b1 e2 a1 b1 e2", P: "g1!2 d2 g1 a1!2 e2 a1", Q: "[g1@2 g1@2 d2@2 g1@2 a1@16 c2@2 c2!6]/2",
  R: "c2@2 c2!6 e1@2 e1!6", S: "e1@2 e1!6 f1@2 f1!6", T: "f1@2 f1!6 c2@2 c2!6", U: "g1@2 g1!6 c2!2 e2!2 g2!2 e2!2",
  V: "c2!2 e2!2 f2!2 g2!2 e2!2 g2!2 b2!2 g2!2", W: "e2!2 g2!2 a2!2 c3!2 f1!2 a1!2 c2!2 a1!2",
  X: "f1!2 a1!2 a#1!2 c2!4 e2!2 g2!2 e2!2", Y: "g1!2 b1!2 d2!2 b1!2 c2!2 e2!2 g2!2 e2!2",
  Z: "c2!2 e2!2 f2!2 g2!2 e1@2 e1!6", AA: "[g1@2 g1@10 d2!2 a1 b1]/2", AB: "d2 a1 b1 d2 a2!2 e2 f#2",
  AC: "a2 e2 f#2 a2 e2!2 a1 b1", AD: "e2 a1 b1 e2 g1!2 d2 g1", AE: "a1!2 e2 a1 d2!2 a1 b1", AF: "a1!2 e2@2 d2!2 a1 b1",
  AG: "[a1!2 e2 a1 d2@12]/2", AH: "d2@2 d2 f#2@2 f#2 ~ a2@2 a2 f#2@2 f#2 d2@2 d2",
  AI: "f#2@2 ~ f#2 g2@2 g2 a2@2 a2 f#1@2 f#1 a1@2 ~", AJ: "a1 c#2@2 c#2 a1@3 f#1@2 f#1 ~ a1@2 a1 b1@2",
  AK: "b1 c#2@2 c#2 g1@2 ~ g1 b1@2 b1 c2@2 c2 c#2@2",
  AL: "[c#2 d2@2 ~ d2 c2@2 c2 b1@2 b1 c2@2 b1 ~ d2@2 d2 f#1@2 f#1 g1@2 g1 g#1@2 ~ g#1 a1@2 a1 b1@2 b1 c2@2 c2 c#2@2 ~ c#2 d2@2 d2 f#2@2 f#2 a2@2 a2 ~ f#2@2 f#2 d2@2 d2 f#2@2 f#2 g2@2 ~ g2]/4",
  AM: "a2@2 a2 f#1@2 f#1 a1@2 a1 c#2@2 ~ c#2 a1@3", AN: "f#1@2 f#1 a1@2 a1 ~ b1@2 b1 c#2@2 c#2 g1@2 g1",
  AO: "b1@2 ~ b1 c2@2 c2 c#2@2 c#2 d2@2 d2 c2@2 ~", AP: "c2 b1@2 b1 c2@2 b1 d2@2 d2 ~ f#1@2 f#1 g1@2",
  AQ: "g1 g#1@2 g#1 a1@2 ~ a1 b1@2 b1 c2@2 c2 c#2@2", AR: "c#2 d2@2 d2 f#2@2 f#2 a2@2 ~ a2 f#2@2 f#2 d2@2",
  AS: "d2 f#2@2 f#2 g2@2 g2 a2@2 a2 f#1@2 f#1 a1@2 a1",
  AT: "[c#2@2 c#2 a1@3 f#1@2 f#1 a1@2 a1 b1@2 b1 c#2@2 c#2 g1@2 g1 b1@2 b1 c2@2 c2 c#2@2 c#2 d2@2]/2",
  AU: "[d2 c2@2 b1@2 b1 c2@2 b1 d2@2 d2 f#1@2 f#1 g1@2 g#1@2 g#1 a1@2 a1 b1!2 c2@2 c2 c#2@2 c#2 d2, ~@3 c2 ~@13 g1 ~@14]/2",
  AV: "~@9 a1 ~@6", AW: "~@3 e1 ~@10 g1!2", AX: "g1 ~ g1 a1!2 ~ a1!2 d2@3 d2@3 d2@2",
  AY: "d2@3 a1@3 a1@2 a1@3 a1@3 e2@2", AZ: "e2@3 e2@3 e2@2 g1@3 g1@3 a1@2", BA: "a1@3 d2@3 d2@2 d2@3 d2@3 a1@2",
  BB: "a1@3 a1@3 a1@2 e2@3 e2@3 e2@2", BC: "e2@3 g1@3 g1@2 a1@3 a1@3 d2@2", BD: "d2@3 d2@3 d2@2 a1@3 a1@3 a1@2",
  BE: "[a1@3 e2@3 e2@2 e2@3 e2@3 g1@10 a1@21 ~@3]/3",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · overdriven guitar · "guitar"
const overdriven_guitar = note(`<
  A B C D E F G D H I J K H I J K H I J K H I J K H F G L@2 M N O P M N O Q@2 R S T U V W X Y V W X Y V W X Y Z S T AA@2
  AB AC AD AE AB AC AD AE AB AC AD AF@2 AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG
  BH BI@3
>`.pickRestart({
  A: "[c3,g3,c4] ~@7", B: "[e2,b2,e3] ~@7", C: "[f2,c3,f3] ~@7",
  D: "[c3,g3,c4]@2 [c3,g3,c4]!6 [g2,d3,g3]@2 [g2,d3,g3]!6", E: "[c3,g3,c4]@2 [c3,g3,c4]!6 [c3,g3,c4]@2 [c3,g3,c4]!6",
  F: "[e2,b2,e3]@2 [e2,b2,e3]!6 [e2,b2,e3]@2 [e2,b2,e3]!6", G: "[f2,c3,f3]@2 [f2,c3,f3]!6 [f2,c3,f3]@2 [f2,c3,f3]!6",
  H: "[e4,g4,c5]!2 ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5]", // C
  I: "[e4,g4,b4]!2 ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4]", // Em
  J: "[f4,a4,c5]!2 ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5]", // F
  K: "[e4,g4,c5]!2 ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] [g4,b4,d5]!2 ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5]", // C G
  L: "[[c3,g3,c4]@2 [c3,g3,c4]!6 [g2,d3,g3]@4 [g2,d3,g3]@20]/2", // C5 G5
  M: "~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~", // D
  N: "~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~", // A
  O: "~@2 [e4,g4,b4] ~@3 [e4,g4,b4] ~@3 [e4,g4,b4] ~@3 [e4,g4,b4] ~", // Em
  P: "~@2 [b3,d4,g4] ~@3 [b3,d4,g4] ~@3 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~", // G A
  Q: "[~@2 [b3,d4,g4] ~@3 [b3,d4,g4]@2 [c#4,e4,a4]@16 [c3,g3,c4]@2 [c3,g3,c4]!6]/2", // G A C5
  R: "[c3,g3,c4]@2 [c3,g3,c4]!6 [e2,b2,e3]@2 [e2,b2,e3]!6", S: "[e2,b2,e3]@2 [e2,b2,e3]!6 [f2,c3,f3]@2 [f2,c3,f3]!6",
  T: "[f2,c3,f3]@2 [f2,c3,f3]!6 [c3,g3,c4]@2 [c3,g3,c4]!6", // F5 C5
  U: "[g2,d3,g3]@2 [g2,d3,g3]!6 [e4,g4,c5]!2 ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5]", // G5 C
  V: "~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] [e4,g4,b4]!2 ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4]", // C Em
  W: "~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] [f4,a4,c5]!2 ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5]", // Em F
  X: "~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] [e4,g4,c5]!2 ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5]", // F C
  Y: "[g4,b4,d5]!2 ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] [e4,g4,c5]!2 ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5]", // G C
  Z: "~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] [e2,b2,e3]@2 [e2,b2,e3]!6", // C E5
  AA: "[[g2,d3,g3]@4 [g2,d3,g3]@20 ~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~]/2", // G5 D
  AB: "~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@3 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~", // D A
  AC: "~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3 [e4,g4,b4] ~@3 [e4,g4,b4] ~", // A Em
  AD: "~@2 [e4,g4,b4] ~@3 [e4,g4,b4] ~@3 [b3,d4,g4] ~@3 [b3,d4,g4] ~", // Em G
  AE: "~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~", // A D
  AF: "[~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~ [d3,a3,d4]@24]/2", // A D5
  AG: "~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4]", // D
  AH: "~@3 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [a3,c#4,f#4] ~@3", // D F#m
  AI: "[a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@2", // F#m
  AJ: "[a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@3 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2", // F#m G
  AK: "[b3,d4,g4] ~@3 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2", // G
  AL: "~ [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@2 [c#4,e4,a4] ~", // D A
  AM: "~ [c#4,e4,a4] ~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~", // A D
  AN: "~ [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4]", // D
  AO: "~@2 [d4,f#4,a4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@2 [a3,c#4,f#4]", // D F#m
  AP: "~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@2 [b3,d4,g4]", // F#m G
  AQ: "~@3 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@3", // G
  AR: "[b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@2", // G D
  AS: "[d4,f#4,a4] ~@2 [d4,f#4,a4] ~@3 [c#4,e4,a4] ~@2 [c#4,e4,a4] ~@2 [c#4,e4,a4] ~@2", // D A
  AT: "[c#4,e4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2", // A D
  AU: "[d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4]", // D F#m
  AV: "~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~@2 [a3,c#4,f#4] ~", // F#m
  AW: "~ [a3,c#4,f#4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~@2", // F#m G
  AX: "[b3,d4,g4] ~@2 [b3,d4,g4] ~ [b3,d4,g4] ~@2 [b3,d4,g4] ~@2 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~", // G D
  AY: "~ [d4,f#4,a4] ~ [d4,f#4,a4] ~@2 [c#4,e4,a4] ~ [c#4,e4,a4] ~@2 [c#4,e4,a4] ~@2 [c#4,e4,a4] [d3,a3,d4]", // D A D5
  AZ: "~@9 [a2,e3,a3] ~@6", BA: "~@3 [e2,e3,b3,e4] ~@10 [g2,d3,g3]!2",
  BB: "[g2,d3,g3] ~ [g2,d3,g3] [a2,e3,a3]!2 ~ [a2,e3,a3]!2 [d3,a3,d4] ~ [d3,a3,d4]!3 ~ [d3,a3,d4]!2", // G5 A5 D5
  BC: "[d3,a3,d4] ~ [d3,a3,d4] [a2,e3,a3]!2 ~ [a2,e3,a3]!3 ~ [a2,e3,a3]!3 ~ [e2,b2,e3]!2", // D5 A5 E5
  BD: "[e2,b2,e3] ~ [e2,b2,e3]!3 ~ [e2,b2,e3]!2 [g2,d3,g3] ~ [g2,d3,g3]!3 ~ [a2,e3,a3]!2", // E5 G5 A5
  BE: "[a2,e3,a3] ~ [a2,e3,a3] [d3,a3,d4]!2 ~ [d3,a3,d4]!3 ~ [d3,a3,d4]!3 ~ [a2,e3,a3]!2", // A5 D5 A5
  BF: "[a2,e3,a3] ~ [a2,e3,a3]!3 ~ [a2,e3,a3]!2 [e2,b2,e3] ~ [e2,b2,e3]!3 ~ [e2,b2,e3]!2", // A5 E5
  BG: "[e2,b2,e3] ~ [e2,b2,e3] [g2,d3,g3]!2 ~ [g2,d3,g3]!2 [a2,e3,a3] ~ [a2,e3,a3]!3 ~ [d3,a3,d4]!2", // E5 G5 A5 D5
  BH: "[d3,a3,d4] ~ [d3,a3,d4]!3 ~ [d3,a3,d4]!2 [a2,e3,a3] ~ [a2,e3,a3]!3 ~ [a2,e3,a3]!2", // D5 A5
  BI: "[[a2,e3,a3] ~ [a2,e3,a3] [e2,b2,e3]!2 ~ [e2,b2,e3]!3 ~ [e2,b2,e3]!3 ~ [g2,d3,g3]@10 [a2,e3,a3]@21 ~@3]/3", // A5 E5 G5 A5
})).s("gm_overdriven_guitar").gain(0.45).pan(0.3)

// other · trumpet
const trumpet = note(`<
  A@2 B C D E F C D E F C ~@7 G H@2 ~ I ~@4 J ~@8 K L M N O ~@6 P@2 ~@3 Q ~@3 R@2 ~@18 S@5 T U ~ V@2 W@4 ~@12
>`.pickRestart({
  A: "g4@2 a4@2 g4@2 a4 g4@2 g4 a4@2 g4@2 a4@2", B: "g4@2 a4@2 g4@2 a4 g4@2 g4 a4@2 g4@2 e4 f4",
  C: "g4 g4@2 g4@3 e4 f4 g4 g4@2 g4@5", D: "c4 ~ a4@2 g4 ~@2 c4", E: "e4 ~ a4@2 g4 ~@2 c4",
  F: "f4@2 ~@2 a4@4 g4@2 ~@4 e4 f4", G: "~@2 g4@2 e4 d4@2 g3@9", H: "~@10 a4@2 g4 a4@2 ~",
  I: "~@2 g4@2 e4 d4@2 g3@2 e4 g4 a4 c5@2 a4@2", J: "d4@2 e4@2 d4@2 e4 d4@2 d4 e4@2 d4@2 e4@2", K: "~@4 c4 ~ a4@2",
  L: "g4 ~@2 c4 e4 ~ a4@2", M: "g4 ~@2 c4 f4 ~ a4@2", N: "g4@2 ~@4 e4 f4 g4 g4@2 g4@3 e4 f4", O: "g4 g4@2 g4@5 ~@8",
  P: "[~@10 g4@2 e4 d4@2 g3@9 ~@8]/2", Q: "~@3 a4 c5@2 a4@2 ~@8",
  R: "[~@8 d4@2 e4@2 d4@2 e4 d4@2 d4 e4@2 d4@2 e4@2 ~@8]/2",
  S: "[~ f#4@3 g4 f#4@2 d4 f#4@5 ~ e4@11 f#4@2 e4@2 d4 a4@21 f#4@2 e4@2 d4 a4@21 g4@3]/5",
  T: "f#4@3 ~ e4@3 d4@3 g4@3 f#4@3", U: "~ e4@3 d4@3 ~@9", V: "[~ d4@6 e4@6 ~ f#4@6 g4@6 a4@6]/2",
  W: "[b4@6 c#5@6 d5@6 b4@23 a4@21 ~@2]/4",
})).s("gm_trumpet").gain(0.61).pan(0.3)

// other · trombone
const trombone = note(`<
  A@2 B C D E F C D E F C ~@7 G H@2 ~ I ~@4 J ~@8 K L M N O ~@6 P@2 ~@3 Q ~@3 R@2 ~@18 S@5 T U ~ V@2 W@4 ~@12
>`.pickRestart({
  A: "g3@2 a3@2 g3@2 a3 g3@2 g3 a3@2 g3@2 a3@2", B: "g3@2 a3@2 g3@2 a3 g3@2 g3 a3@2 g3@2 e3 f3",
  C: "g3 g3@2 g3@3 e3 f3 g3 g3@2 g3@5", D: "c3 ~ a3@2 g3 ~@2 c3", E: "e3 ~ a3@2 g3 ~@2 c3",
  F: "f3@2 ~@2 a3@4 g3@2 ~@4 e3 f3", G: "~@2 g3@2 e3 d3@2 g2@9", H: "~@10 a3@2 g3 a3@2 ~",
  I: "~@2 g3@2 e3 d3@2 g2@2 e3 g3 a3 c4@2 a3@2", J: "d3@2 e3@2 d3@2 e3 d3@2 d3 e3@2 d3@2 e3@2", K: "~@4 c3 ~ a3@2",
  L: "g3 ~@2 c3 e3 ~ a3@2", M: "g3 ~@2 c3 f3 ~ a3@2", N: "g3@2 ~@4 e3 f3 g3 g3@2 g3@3 e3 f3", O: "g3 g3@2 g3@5 ~@8",
  P: "[~@10 g3@2 e3 d3@2 g2@9 ~@8]/2", Q: "~@3 a3 c4@2 a3@2 ~@8",
  R: "[~@8 d3@2 e3@2 d3@2 e3 d3@2 d3 e3@2 d3@2 e3@2 ~@8]/2",
  S: "[~ f#3@3 g3 f#3@2 d3 f#3@5 ~ e3@11 f#3@2 e3@2 d3 a3@21 f#3@2 e3@2 d3 a3@21 g3@3]/5",
  T: "f#3@3 ~ e3@3 d3@3 g3@3 f#3@3", U: "~ e3@3 d3@3 ~@9", V: "[~ d3@6 e3@6 ~ f#3@6 g3@6 a3@6]/2",
  W: "[b3@6 c#4@6 d4@6 b3@23 a3@21 ~@2]/4",
})).s("gm_trombone").gain(0.61).pan(0.7)

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

// drums · snare
const snare = s("sd").struct(`<
  A@3 B C@3 D@3 C E D@2 C D C@3 D F C@2 D@4 C G H@7 I J K C K@4 C L K C K@3 M K@2 C K@2 C N H@7 O H@3 I P Q R S T U V W
  X Y Q R S T Z AA AB AC AD AE AF AG AH AI@4 AJ AI AK ~@2
>`.pickRestart({
  A: "x", B: "x!16", C: "~ x ~ x ~ x ~ x", D: "~@2 x ~@3 x ~@3 x ~@3 x!2", E: "~@2 x ~@3 x ~@3 x!2 ~@2 x!2",
  F: "~@2 x ~@3 x ~@3 x ~@4 x", G: "~@2 x ~@3 x ~@4 x ~@2 x!2", H: "~ x ~ x", I: "~ x!2 ~",
  J: "x ~ x ~ x!4 ~@2 x ~@3 x ~", K: "~@2 x ~@3 x!2 ~@2 x ~@3 x ~", L: "~@2 x ~@4 x ~@2 x ~@3 x ~",
  M: "~@2 x ~@2 x!3 ~@2 x ~@3 x ~", N: "~@3 x ~@2 x!2 ~@4 x ~@3", O: "~ x ~ x!2 ~ x!2 ~@4 x ~@3",
  P: "~@3 x!2 ~ x ~@2 x!2 ~ x!2 ~ x", Q: "~@3 x ~@6 x ~@5", R: "x ~@6 x ~@5 x ~@2", S: "~@4 x ~@6 x ~@4",
  T: "~ x ~@6 x ~@5 x ~", U: "~@5 x ~@5 x ~@4", V: "~@2 x ~@5 x ~@6 x", W: "~@5 x ~@6 x ~@3", X: "~@2 x ~@6 x ~@6",
  Y: "x ~@5 x ~@6 x ~@2", Z: "~@2 x ~@2 x ~@2", AA: "~ x ~@5 x ~@5 x ~@2", AB: "~@3 x ~@5 x ~@5 x",
  AC: "~@5 x ~@5 x ~ x ~@2", AD: "~ x ~@4 x ~ x ~@3 x ~@3", AE: "~ x ~@2 x!12", AF: "~@9 x ~@6", AG: "~@3 x ~@10 x!2",
  AH: "x ~ x!3 ~ x!3 ~@2 x ~@2 x ~", AI: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", AJ: "x ~@2 x ~@2 x ~ x ~@2 x!4 ~",
  AK: "x ~@2 x ~@12",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<x!3 ~@34 [x!2 ~@6] ~@65>").gain(0.56)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B@20 ~@4 B@7 C D ~@3 E C@2 B C B@3 C@5 D ~@3 F B@7 G B@3 D ~@19 H I J K ~@9
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~ x!3", D: "x!4 ~@4", E: "~@5 x!3", F: "~@4 x!4", G: "x ~@3 x!4", H: "~@15 x",
  I: "~ x ~@2 x ~ x ~@2 x ~ x ~@2 x ~", J: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", K: "x ~@2 x ~@2 x ~@9",
})).gain(0.56)

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

// drums · china
const china = s("cr").struct("<~@100 [~@14 x!2] [x ~@7 x!8] ~>").gain(0.08)

// drums · ride bell
const ride_bell = s("rd").struct("<~@72 A B C D E F G H I A B C D C J K L M N ~@12>".pickRestart({
  A: "x ~@4 x ~ x ~@4 x!2 ~@2", B: "~@2 x ~ x ~@4 x!2 ~@5", C: "x!2 ~@4 x!2 ~@5 x!2 ~", D: "~@3 x!2 ~@5 x!2 ~@4",
  E: "x!2 ~@5 x!2 ~@4 x ~ x", F: "~@4 x!2 ~@5 x!2 ~@3", G: "~ x!2 ~@5 x!2 ~@4 x!2", H: "~@5 x!2 ~@4 x!2 ~@3",
  I: "~@2 x!2 ~@4 x!2 ~@5 x", J: "~@3 x!2 ~@4 x!2 ~@4 x", K: "x ~@4 x!2 ~@4 x!2 ~@3", L: "~ x!2 ~@4 x!2 ~@4 x!2 ~",
  M: "~@2 x!2 ~@4 x!2 ~@4 x!2", N: "~@3 x!2 ~@3 x!2 ~@4 x ~",
})).gain(0.56)

// drums · shaker
const shaker = s("sh").struct("<~@29 [x!16]!7 [x!9 ~@7] ~@21 [~@8 x!8] [x!16]!11 [x!9 ~@7] ~@32>").gain(0.56)

stack(bass, overdriven_guitar, trumpet, trombone, kick, snare, low_tom, hihat, open_hat, china, ride_bell, shaker)