Strudelify
Devil's Haircut cover art

1996 · Odelay

Devil's Haircut

Beck

KeyD majorTempo60 bpm
0:00/0:00
// Devil's Haircut — Beck
// 60 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 53 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(60/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.

// other · distortion guitar
const distortion_guitar = note("<~ A@2 B ~@3 C D E ~@8 F@2 G ~@23 H I J@3 K@3 ~>".pickRestart({
  A: "[~ d2@5 ~@2 d2@2 g2@4 c3@4 d2@6 d2@2 g2@5 c3@4 d2@5 ~ d2@2 g2@4 c3@4 d2@6 ~ d2@2 g2@4]/2", B: "c3 ~@7",
  C: "~@10 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~", D: "d2@3 g2@4 c3@4 d2@6 d2@2 g2@4 c3@4 ~ d2@4", E: "~ d2 g2@2 c3@2 ~@10",
  F: "[~@25 a5@6 g5@6 f5@8 ~ d5@4 f5@2 g5@4 f5@2 a5@6]/2", G: "g5@6 f5@9 d5@4 f5@2 g5@4 f5@2 a5@5", H: "~@13 a4@3",
  I: "~ g4@6 f4@6 d4@6 f4@3 g4@3 f4@2 ~ a4@4, ~@27 g4@2 ~@3",
  J: "[~ g4@6 ~ f4@6 d4@6 f4@3 g4@3 f4@2 ~ d2@5 ~@2 d2@2 g2@4 [c3,f4]@4 ~@6 d2@2 ~ f4@2 ~@3 f4@2 ~ d2@5 ~ d2@2 g2@4 ~@7 d4@4 ~@2 g2@3 ~@2 f4@3, ~@29 a4@3 ~@4 g4@6 ~@4 d2@5 ~@3 g2@4 c3@4 ~@13 [c3,f4]@7 ~@5 f4@3 ~ g4@3 ~@2, ~@48 d4@7 ~@2 g4@3 ~@2 a4@7 g4@6 ~@4 d2@5 ~@2 d2@2 ~@4 c3@4]/3", // F5
  K: "[a4 a4@5 ~@2 g2@4 f4 [c3,f4]@4 ~@2 d4@4 d2@2 [g2,f4]@3 ~@3 [f4,a4]@2 [d2,a4]@6 ~ d2@2 g2@4 [c3,f4]@4 ~@2 d4@4 d2@2 [g2,f4]@3 g4@2 ~ f4@2 ~ [d2,a4]@5 ~ d2@2 g2@4 [c3,f4]@6 ~@11, d2@5 ~ [d2,g4]@2 ~@9 d2@5 ~@7 c3@4 ~@17 d2@5 ~@8 c3@4 ~@29, ~@7 g4@6 ~@15 g4@3 ~@9 g4@6 ~@20 f4@3 ~@4 g4@6 ~@17]/3", // F5 G7 F D5 F5 G7 D5 F5 …
})).s("gm_distortion_guitar").gain(0.57)

// bass · acoustic bass
const bass = note(`<
  ~ A@2 B C@2 D@2 E F@3 G@3 H I@2 J ~ K L@4 M@3 N@3 ~@3 O@3 P Q@2 R S@2 T@2 ~ U@3 V@3 W
>`.pickRestart({
  A: "[~ d2@5 ~@2 d2@2 g2@4 c3@4 d2@6 d2@2 g2@5 c3@4 d2@5 ~ d2@2 g2@4 c3@4 d2@6 ~ d2@2 g2@4]/2",
  B: "c3@4 d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@3",
  C: "[~ c3@4 d2@6 ~ d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@4 c3@4 ~ d2@6 d2@2, ~@22 e2 ~@41]/2",
  D: "[g2@4 c3@4 d2@6 d2@3 g2@4 c3@4 d2@6 d2@2 g2@4 c3@4 ~ d2@5 ~ d2 ~ g2@4 c3@4 d2@5 ~]/2",
  E: "d2@2 ~ g2@4 c3@4 d2@6 d2@2 g2@4 c3@4 ~ d2@4",
  F: "[~@2 d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 c3@5 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@5 c3@4]/3",
  G: "[d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@4 c3@4 d2@6 ~ d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~]/3",
  H: "c3@4 d2@6 d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@3",
  I: "[~ c3@4 d2@6 d2@2 g2@5 c3@4 d2@6 d2@2 g2@4 c3@4 d2@6 ~ d2 ~ g2@4 c3@4 d2@6 d2@2 ~]/2",
  J: "g2@4 c3@4 d2@5 ~ d2@2 g2@4 c3@4 ~@8", K: "~@27 d2@5",
  L: "[~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 c3@5 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@3 ~ d2@5 ~ d2@2 g2@4 c3@4 ~ d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~ c3@3]/4",
  M: "[~ d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@4 c3@3 ~ d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4]/3",
  N: "[~ c3@4 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2 ~ g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@4 c3@4 ~@25]/3",
  O: "[~@13 d2@5 ~ d2@2 g2@4 c3@4 ~ d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@3 ~ c3@4 d2@5 ~ d2@2 g2@3 ~@2 c3@4 d2@5 ~ d2@2 g2@4 c3@4]/3",
  P: "d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 g2@4 ~ c3@2",
  Q: "[~@2 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@3 ~ d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@4]/2",
  R: "c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@6 d2@2 g2@3",
  S: "[~@2 c3@4 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@3 g2@4 c3@4 d2@5 ~ d2@2]/2",
  T: "[g2@4 c3@5 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~ d2@2 ~ g2@4 c3@4 d2@5 ~ d2@2 g2@4 c3@3 ~@7]/2",
  U: "[~@29 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 ~ g2@4 c3@4 d2@5 ~ d2@2 g2@4 c3@4 ~ d2@5 ~ d2@2 g2@4 c3@4]/3",
  V: "[d2@5 ~ d2@2 g2@4 ~ c3@4 d2@5 ~ d2@2 g2@4 c3@4 d2@5 ~@2 d2@2 g2@4 c3@4 d2@5 ~ d2@2 ~ g2@4 c3@3 ~ d2@5 ~ d2@2 g2@4 c3@4 ~ d2@5 ~ d2@2 g2@4]/3",
  W: "c3 ~@7",
})).s("gm_acoustic_bass").gain(0.41)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A@2 B C D E F G H I J K L M N O P Q@2 R S T U V ~ W S T U X ~@9 Y Z AA AB AC AD AE AF AA AB AG ~@2
>`.pickRestart({
  A: "[~@6 [d5,f#5] ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@3 ~@6 [d5,f#5]@2 ~@6 [d5,f#5] ~@7 [d5,f#5]@2 ~@15]/2", // D
  B: "~@8 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@5", C: "~ [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5] ~@7 [d5,f#5] ~@5",
  D: "~@3 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5]@2 ~@2", // D
  E: "~@4 [d5,f#5] ~@7 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~", // D
  F: "~@5 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@6 [d5,f#5]@2", G: "~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@6 [d5,f#5] ~@8",
  H: "[d5,f#5]@2 ~@14 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@5", // D
  I: "~ [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@4", // D
  J: "~@2 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@2", // D
  K: "~@4 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@6 [d5,f#5]@2 ~", L: "~@5 [d5,f#5]@2 ~@7 [d5,f#5]@2 ~@16",
  M: "~@23 [d5,f#5]@2 ~@7", N: "[d5,f#5]@2 ~@6 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@6",
  O: "~ [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@5", // D
  P: "~@2 [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@4", // D
  Q: "[~@4 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@4 d4@5 ~ d4@5 ~ c4@7 a3@3 d4@3 c4@3 a3@3 d3@2 g3@5 ~]/2", // D
  R: "g3@5 ~ g3@8 ~ a3@2 d3@2 f3@9 ~@3 [d5,f#5]", S: "~@8 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@7",
  T: "~ [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@5", // D
  U: "~@2 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@4", // D
  V: "~@4 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@2", // D
  W: "~@6 [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5]", X: "~@3 [d5,f#5] ~@28", Y: "~@25 [d5,f#5] ~@6",
  Z: "~@2 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@4", // D
  AA: "~@3 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@3", // D
  AB: "~@4 [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@2", AC: "~@6 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@4 d4@5",
  AD: "~ d4@5 ~ d4@5 ~ c4@3 ~@2 e4@2 d4@3 ~ c4@2 d3@2 g3@4", AE: "~@2 g3@5 ~ g3@8 ~ a3@2 [d3,e3] ~ f3@9 ~@2",
  AF: "~ [d5,f#5] ~@8 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@5", // D
  AG: "~@6 [d5,f#5] ~@7 [d5,f#5] ~@7 [d5,f#5] ~@8 [d5,f#5]", // D
})).s("gm_acoustic_guitar_steel").gain(0.41)

// other · lead 5 charang
const lead_5_charang = note("<~@14 A B@2 C D ~@15 E F@2 G H ~@10 I J K L>".pickRestart({
  A: "~@15 d4 ~ d4 ~ e4@2 f#4@3 ~ e4@4 ~ d4@2",
  B: "[~@4 c4@2 d4@4 b3@3 ~@3 d4 ~ d4 ~ e4 ~@2 f#4@4 e4@4 d4@4 ~@2 c4@2 d4@4 b3@4 ~@3 d4 ~ d4 ~ e4@2 f#4@4 e4@4]/2",
  C: "d4@4 ~@2 c4@2 ~ d4@4 b3@4 ~@2 d4@2 d4@2 e4@2 f#4@3 ~ e4@3, ~@29 f4 ~@2", D: "~@2 d4@4 ~@2 c4@2 d4@4 b3@5 ~@13",
  E: "~@13 f#3 ~ f#3@4 e3@5 ~ e3@5 d3@2, ~@19 b3 ~@12",
  F: "[~@2 d3 ~ d3@4 c3@3 ~@3 f#3 ~ f#3@3 ~@2 e3@4 e3@3 ~ e3@2 d3@3 ~ d3 ~ d3@4 c3@4 ~@3 f#3 ~ f#3@4 e3@8 ~@2]/2",
  G: "d3 ~ d3 ~@2 d3 ~ d3@4 c3@4 c3 ~ f#3 ~ f#3 ~ f#3 ~ f#3 ~ e3@3 ~@2 e3 ~", H: "e3 ~ d3@3 ~ d3 ~ d3@4 c3@4 ~@16",
  I: "a4@2 a4@3 ~@2 a4@5 ~@4 a4@2 ~ a4@4 a4@5 ~@4", J: "~@2 a4 ~ a4 ~ a4 ~ a4@4 ~@6 a4 ~ a4@3 ~ a4@5 ~@3",
  K: "~@3 a4@2 a4@4 a4@4 a4@5 ~ a4 ~@2 a4@3 ~ a4@6",
  L: "[e4,f4,g4] [e3,f3,g3,a3,b3,c4,d4] [g2,a2,b2,c3,d3] [c2,d2,e2,f2] ~@28", // Em Em7 G Dm7
})).s("gm_lead_5_charang").gain(0.41)

// other · tremolo strings
const tremolo_strings = note("<~@25 [~@7 d5@14 ~@11, d3@29 ~@3, ~@4 d4@21 ~@7] ~@27>")
  .s("gm_tremolo_strings").gain(0.41)

// chords · marimba
const marimba = note("<~@11 A ~ B ~@16 C D E F G ~@18>".pickRestart({
  A: "~@6 d3 e3 [f3,g3,a3] [b3,c4,d4,e4,f4] [g4,a4,b4,c5] d5@9 ~@12", B: "~@9 d2 e2 [f2,g2,a2] [b2,c3] d3@11 ~@8",
  C: "~@7 a3@2 [b3,c4] d4 [e4,f4] ~ a4@8 ~@3 [b2,e4,f4,g4] ~ [b2,e4,f4,g4]@2 ~@2 [c3,b3,c4,d4,e4] ~, ~@7 f2@15 ~@10, ~@6 g4 ~@9", // Cmaj7 Fmaj7 Em Cmaj7
  D: "~ c3@7 ~@5 b3 [c4,d4,e4] [f4,g4] a4@7 ~@2 [b2,e4,f4,g4,a4] ~ [b2,e4,f4,g4,a4]@3 ~ [c4,d4,e4], [c4,d4,e4]@5 ~@3 a3@5 ~@19, ~@9 f2@16 ~@7", // C Fsus2 Em C
  E: "c3 ~ c3@7 ~@6 [b3,c4] [d4,e4,f4] a4@7 ~@2 [d4,e4,f4,g4,a4] b2 ~ b2@3, ~ [c4,d4,e4]@5 ~@3 a3@6 ~@2 g4 ~@10 [e4,f4,g4,a4]@3 ~, ~@5 f2@8 ~@3", // Cmaj7 Dm C Fmaj7
  F: "[c4,d4,e4,f4] c3@2 [c4,d4,e4,f4]@5 ~@9 b3 [c4,d4,e4] [f4,g4] ~@8 [b2,e4,f4,g4,a4] ~ [b2,e4,f4,g4,a4]@2, ~@3 c3@8 a3@7 ~ a4@5 ~@8, ~@3 f2@4 ~", // Dm7 C Fsus2 Em
  G: "~@2 [c4,d4,e4,f4] ~@6 [a3,c4,d4,e4] ~@3 f2 ~@18, ~@3 c3@2 c3@8 ~@19, ~@4 [c4,d4,e4,f4]@5 b3@2 ~ a3@7 ~@13", // Dm7 Am Dm7
})).s("gm_marimba").gain(0.41)

// chords · epiano1 · D
const epiano1 = note(`<
  ~@34
  [~@13 d5!3 d5@2 ~ d5 ~@3 d5 ~@2 d5 ~@2 d5 ~ d5]
  [d5!3 ~ d5 ~@2 d5!2 ~ d5 ~@3 d5 ~ d5!4 ~ d5 ~@2 d5!2 ~ d5 ~@3 d5]
  [d5!4 ~ d5 ~@3 d5!2 ~ d5 ~@2 [d5,f#5] ~ [d5,f#5]!4 ~ [d5,f#5] ~@2 [d5,f#5]!2 ~ [d5,f#5]@2 ~@2]
  [[d5,f#5]!2 ~ [d5,f#5]!3 ~ d5@2 ~@4 [d5,f#5]@2 ~@2 [d5,f#5]!4 ~ [d5,f#5] d5@2 ~@2 f#5!2 ~ [d5,f#5]@2, ~@7 f#5 ~@15 f#5 ~@3 d5@2 ~@3]
  [~@2 [d5,f#5]!3 f#5!2 ~ d5@2 ~@22, ~@5 d5@2 ~ f#5 ~@23]
  ~@14
>`).s("gm_epiano1").gain(0.41)

// other · agogo
const agogo = note("<~@34 A B@2 C D ~@14>".pickRestart({
  A: "~@13 d5@2 ~ d5 g5@2 c6@3 d5 g5@2 c6@2 ~@3 d5@2",
  B: "[~@2 c6@2 d5@3 g5 c6@2 d5@3 ~ d5@2 ~ d5 g5@2 ~ c6@3 d5 g5@2 c6@2 ~@2 d5@2 ~ g5 c6@2 d5@2 ~ g5 c6@2 ~ d5@2 ~@2 d5@2 ~ d5 g5@2 c6@2 ~@2 g5@2 c6@2 ~@2, ~ g5@2 ~@54 d5@2 ~@5]/2",
  C: "d5 ~@2 g5 ~ c6@2 d5@3 g5 c6@2 d5@2 ~@2 d5@3 d5 g5@2 c6@2 ~ d5 g5@2 ~ c6@2", D: "~@2 d5@2 ~ g5 c6@2 d5@2 ~@22",
})).s("gm_agogo").gain(0.41)

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

// drums · rim
const rim = s("rim").struct("<[x ~@3 x ~@3 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2] ~@52>").gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A ~@3 B ~@4 C ~ D E F G H I J ~@3 K ~ L M N O P Q R S T ~@3 U V W X Y Z AA AB AC AD AE AF AG ~@2
>`.pickRestart({
  A: "x!2 ~@30", B: "~@5 x ~@26", C: "~@12 x!2 ~@18", D: "~@23 x ~@2 x ~ x ~@3",
  E: "x ~@7 x ~@2 x ~ x ~@2 x ~@8 x ~@2 x ~ x ~", F: "~ x ~@7 x ~@2 x ~@2 x ~@2 x ~@7 x ~@2 x ~ x",
  G: "~@2 x ~@8 x ~@2 x ~ x ~@2 x ~@7 x ~@2 x ~", H: "~ x ~@2 x ~@7 x ~@2 x ~ x ~@2 x ~@8 x ~@2",
  I: "x ~ x ~@2 x ~@7 x ~@3 x ~ x ~@2 x ~@7 x ~", J: "~ x ~ x ~@2 x ~@8 x ~@2 x ~ x ~@2 x ~@8", K: "~@29 x!2 ~",
  L: "~@6 x ~@2 x ~ x ~@3 x ~@7 x ~@2 x ~ x ~@2 x", M: "~@8 x ~@2 x ~ x ~@2 x ~@7 x ~@2 x ~ x ~@2",
  N: "~ x ~@7 x ~@2 x ~ x ~@2 x ~@8 x ~@2 x ~ x", O: "~@2 x ~@7 x ~@2 x ~@2 x ~@2 x ~@7 x ~@2 x ~",
  P: "x ~@2 x ~@8 x ~@4 x ~@2 x ~@7 x ~@3", Q: "~@2 x ~@2 x ~@7 x ~@4 x ~@2 x ~@8 x ~",
  R: "~@3 x ~@2 x ~@7 x ~@5 x ~@2 x ~@7 x", S: "~@4 x ~@2 x ~@8 x ~@4 x ~@2 x ~@7", T: "x ~@5 x ~@2 x ~@22",
  U: "~@13 x!3 ~@7 x ~@4 x ~@2 x", V: "~@7 x ~@4 x ~@3 x ~@7 x ~@4 x ~@2", W: "x ~@8 x ~@4 x ~@2 x ~@7 x ~@2 x ~@2 x",
  X: "~@2 x ~@7 x ~@2 x ~ x ~@2 x ~@8 x ~@2 x ~", Y: "x ~@2 x ~@7 x ~@2 x ~@2 x ~@2 x ~@7 x ~@2 x",
  Z: "~ x ~@2 x ~@8 x ~@2 x ~ x ~@2 x ~@7 x ~@2", AA: "~ x ~ x ~@2 x ~@7 x ~@2 x ~ x ~@2 x ~@8 x",
  AB: "~@2 x ~ x ~@2 x ~@7 x ~@3 x ~ x ~@2 x ~@7", AC: "x ~@2 x ~ x ~@2 x ~@8 x ~@2 x ~ x ~@2 x ~@6",
  AD: "~ x ~@3 x ~ x ~@2 x ~@7 x ~@2 x ~ x ~@2 x ~@5", AE: "~@3 x ~@2 x ~ x ~@2 x ~@8 x ~@2 x ~ x ~@2 x ~@3",
  AF: "~@4 x ~@2 x ~@5 x ~@7 x ~@2 x ~ x ~@2 x ~@2", AG: "~@6 x ~@2 x ~ x ~@2 x ~@7 x ~@2 x ~ x ~@3 x",
})).gain(0.41)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A B C D E F G H I J K L M N O P Q R ~ S T U V W X Y A E F Z ~@9 AA AB P AC AD AE AF AG AH AI A B ~
>`.pickRestart({
  A: "~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@14",
  C: "~@4 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  D: "~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~",
  E: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~",
  F: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  G: "~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~",
  H: "x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~",
  I: "x ~ x ~@9 x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x",
  J: "~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~",
  K: "x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~",
  L: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x", M: "~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~@15",
  N: "~@19 x ~ x ~ x ~ x ~ x ~@2 x ~", O: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x",
  P: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~",
  Q: "x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2", R: "x!12 ~@4", S: "~@27 x ~ x ~@2",
  T: "~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@4 x ~ x ~ x",
  U: "~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@4 x ~ x ~ x ~@3 x ~ x ~",
  V: "x ~@3 x ~ x ~ x ~@4 x ~ x ~ x ~@3 x ~ x ~ x ~ x ~ x ~ x",
  W: "~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@4 x", X: "~ x ~@30",
  Y: "~@2 x ~ x ~@3 x ~ x ~ x ~@4 x ~ x ~ x ~@3 x ~ x ~ x ~ x", Z: "~ x ~ x ~ x ~@26", AA: "~@21 x ~ x ~ x ~ x ~ x ~@2",
  AB: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x",
  AC: "x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  AD: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x",
  AE: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~",
  AF: "x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  AG: "~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x",
  AH: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~",
  AI: "x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
})).gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@39 [~ x!2 ~@14 x!2 ~@13] [~@2 x!2 ~@15 x!2 ~@11] ~@12>").gain(0.41)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@30
  [~@22 x!2 ~@8]
  [~@7 x!2 ~@14 x ~ x ~@6]
// … 35 more lines

More by Beck