Strudelify

I Hate Myself for Loving You

Joan Jett

KeyE minorTempo116 bpm
0:00/0:00
// I Hate Myself for Loving You — Joan Jett
// 116 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): tk6.
setcpm(116/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 · rock organ · "tk1"
const rock_organ = note(`<
  ~@8 A@4 ~@12 B C B C D E F@4 G@2 H ~@5 A@4 ~@12 B C B C D E F@4 G@2 H ~@5 A@4 B C B C D E ~@8 F@4 G@2 H ~@5 A@8 I@4 ~
>`.pickRestart({
  A: "[b6,d7]/4", B: "[d6,g6]", C: "[e6,a6]", D: "[f#6,b6] [g6,c7] [f#6,b6] [g6,c7] [f#6,b6] [g6,c7] [f#6,b6] [g6,c7]",
  E: "[f#6,b6]@2 [g6,c7]@2 [f#6,b6]@2 [g6,c7]@2 [f#6,b6]@2 [g6,c7]@2 [f#6,b6]@3 ~", F: "[b6 [a6,c#7], e6]/4",
  G: "[f#6,b6]/2", H: "[e6,b6] ~@7", I: "[[b6,d7]@49 ~@15]/4",
})).s("gm_rock_organ").gain(0.27)

// bass · electric bass finger · "tk2"
const bass = note(`<
  ~@3 A B C D E C F G E C H I@2 J K@2 L I@2 J@2 M N O P J Q C@2 I@2 J@2 R A B C G E C F G E C H I@2 J K@2 L I@2 J@2 M N
  O P J Q S C I@2 J@2 R A B C G E C F G E M N O P J Q T ~@7 S C I@2 J@2 R A B C G E C F G E B C D E C F G U@2
>`.pickRestart({
  A: "~@5 e1!3", B: "e1!6 e1@2", C: "e1!8", D: "d2@2 d2@2 d2@2 b1@2 d2@2 d2@2 d2 ~ b1@2", E: "d2 e2@2 e1@2 e1!3",
  F: "e1!7 d2", G: "d2!3 b1 d2!3 b1", H: "e1@2 e1@2 e1@2 e1@2 e1@2 g1@2 g1@2 g#1 ~", I: "a1!8", J: "b1!8",
  K: "[b1!6 c#2 e2@2 e1!7]/2", L: "e1@2 e1@2 e1@2 e1@2 e1 ~ g1@2 g1@2 g#1 ~", M: "g1@2 ~ g1@3 g1@2 g1@2 g1@4 g1@2",
  N: "a1 a1@2 a1 a1@3 a1", O: "g1@3 g1 g1@3 g1", P: "a1@3 a1 a1@3 a1", Q: "b1!7 e1", R: "e1@3 ~@13",
  S: "e1@2 e1@2 e1 ~ e1@2 e1@2 e1@2 e1@2 e1@2", T: "e1 ~@7", U: "[d2@2 e2@4 e1@25 ~]/2",
})).s("gm_electric_bass_finger").gain(0.44)

// other · distortion guitar · "tk3"
const distortion_guitar = note(`<
  ~@3 A B@3 C D@3 E@2 F G H I J@2 K@3 I ~ L M L N O@2 P Q R S T U V W X@3 Y Z@3 AA@2 F G AB AC J@2 AD AE@2 AF ~ L M L N
  O@2 P Q R S T U V AG AH AI AJ AK AL AM AN AO L M L N O@2 AP ~@5 AQ AR ~@8 AS AT AU AV AW@2 AX AY AZ BA BB BC BD@2 AU
  BE@2
>`.pickRestart({
  A: "~@5 e3!3", B: "[e3!2 g3@2 e3@2 ~ d3@2 d#3 e3@2 e3@2 ~ d3@2 d3 d#3 b2 d3!3 b2]/3", C: "d3 e3 ~ e3@2 e3!3",
  D: "[e3!2 g3@2 e3@2 ~ d#3@2 d3 e3@2 e3@2 ~ d#3@2 d3!2 b2 d3!3 b2]/3", E: "[c#3 e3@2 e3@3 e3 e3@3 ~@6]/2",
  F: "~@5 e3!2 a3", G: "a3 ~@3", H: "~@5 a3!2 b3", I: "b3 ~@3", J: "[~@5 b3!2 f3@2 e3!2 ~@5]/2",
  K: "[~@10 e3@2 e3@2 a3@4 ~@8 [e3,a3] ~@3 [e3,a3]@6 ~@6 a3@2 a3@2 b3@2]/3", L: "[d4,g4]@3 [d4,g4]@2 [d4,g4]@2 [d4,g4]",
  M: "[e4,a4]@3 [e4,a4]@2 [e4,a4]@2 [e4,a4]", N: "[e4,a4]@6 [e4,a4]@4 [e4,a4]@4 [e4,a4] ~", O: "[b4@31 ~]/2",
  P: "e3@2 e3@2 ~@2 e2 ~@3 e3 ~@3 e3@2", Q: "e3@2 e3@2 ~@2 e2 ~@3 e3@2 e3@2 e3 ~", R: "a3@2 a3@2 a3@2 ~@4 a3 ~@3 a3@2",
  S: "a3@2 a3@2 a3 ~@5 a3 ~@3 a3@2", T: "b3@4 ~@2 b2 ~@3 b3 ~@3 b3@2", U: "b3!3 ~@2 b3!3", V: "e3 ~@3",
  W: "b2 d3@3 c#3 e3@2 e3", X: "[e3!2 g3@2 e3@2 ~ d3@2 d3 e3@2 e3@2 ~ d#3@2 d3!2 b2 d3!3 b2]/3", Y: "d3 e3@2 e3@2 e3!3",
  Z: "[e3!2 g3@2 e3@2 ~ d3@2 d3 e3@2 e3@2 ~ d#3@2 d#3 d3 b2 d3!3 b2]/3", AA: "[d3@2 g#2@3 ~ e2@8 e2@4 e2@2 ~@12]/2",
  AB: "~@2 c#4 ~ a3 f#3 e3 ~ g3@3 ~@3 b3@2", AC: "b3@3 ~@13",
  AD: "a#3@2 d4@2 a3@2 g3@2 e3 d3 b2@2 d3@2 b2@2, ~@2 e4@5 ~@9",
  AE: "[a2@4 ~@6 [e3,a3] ~@3 [e3,a3]@6 ~@6 a3@2 a3@2 b3@2]/2", AF: "b3 ~@7", AG: "a#3 d4@3 a#3 e4 e3 e4",
  AH: "e3@2 e4@2 g4@3 ~ g4@4 e4@2 d4 ~", AI: "g#3@2 g3@2 e3@2 e4@4 g4@3 ~@3",
  AJ: "~@2 b3 ~ d4@2 ~@2 d4@2 e4@2 [g4,b4]@2 [g4,b4]@2", AK: "b4@2 b4@2 [g4,b4]@2 [g4,b4]@2 e4 d4 b3 ~ d4@2 e4 ~",
  AL: "a#4@2 d5@2 [b4,d5]@2 ~ d5 d5@2 d5@3 ~ a#4@2, ~@6 b4@2 b4@5 ~@3", // Bm
  AM: "[b4,e5] ~ a4@2 g4@2 ~@2 d5 a#4 [g4,b4] g#4 a4@2 d5 b4", // E5 G
  AN: "[g4,b4]@2 [g4,b4] ~ e4 d4 b3 ~ d4@2 e4 ~ a#3@2 g3 ~", AO: "a3@2 g#3@2 f3@2 e4@7 ~@3", AP: "e3 ~@7",
  AQ: "~@12 d#4@3 d4", AR: "d#4@3 d4 e3@3 e3 b2@2 d3@2 g2@2 e2@2", AS: "~@7 [d4,g4]",
  AT: "~ [c4,c#4,f4,f#4] [a#3,b3,d#4,e4] [a3,d4] ~@12", AU: "d3!3 b2 d3!3 b2",
  AV: "[e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 ~@2 [e3,g#3,d4,g4]@5 [d3,d#3,f#3,g3,c4,c#4,f4,f#4] [c#3,b3] ~@3", // E7 C#7
  AW: "[~@7 e5@3 ~@6]/2", AX: "a#5@2 g5 e5 a#5@2 g5 e5 a#5@2 g5 e5 a#5@2 g5 e5", AY: "a5@3 ~ a5@2 g5@2 e5@6 ~@2",
  AZ: "~@7 g5", BA: "~@3 g5@2 ~@3", BB: "~@10 b4 c#5 e5 g5 d#5 d5", BC: "e5@7 ~@9",
  BD: "[~@14 g3@6 e3 d3@3 e3@5 ~@3]/2", BE: "[~@3 c6@12 ~]/2",
})).s("gm_distortion_guitar").gain(0.44)

// other · electric guitar jazz · "tk4"
const electric_guitar_jazz = note(`<
  ~@11 A@2 B C D E F@2 G H I J K L M N O@2 P Q R@2 S T U V W ~@7 X@2 Y C Z AA AB@2 AC AD AE AF AG N M N AH@2 AI Q AJ@2
  AK AL U AM AN ~@8 AO AP AQ AR@2 AI AS AT@2 AU AL AV AW AX Q AJ@2 AY AL AZ BA BB BC ~ BD BB BE ~ BF BG BE ~ BD BH BI BF
  BJ BK ~
>`.pickRestart({
  A: "[~@14 g4@6 e4@3 ~ e4!3 ~ e4@3 ~]/2", B: "e4 ~ e4@3 ~ g4@6 ~@4", C: "~@2 g4 ~ g4 ~ g4 ~ g4@2 e4 ~ e4 ~ e4@2",
  D: "g4@2 e4@2 e4 ~ e4@3 ~@7", E: "~@2 f#4 ~ f#4 ~ f#4 ~ f#4 ~ f#4 ~ f#4@2 e4 ~",
  F: "[f#4 ~ f#4@2 e4@2 g4@4 ~@4 g4@6 e4@3 ~ e4 ~ e4 ~ e4@2 c#4@2]/2", G: "d4!2 e4@2 ~@2 g4@4 ~@6",
  H: "~@2 g4 ~ g4 ~ g4 ~ g4@3 ~ e4 ~ e4@2", I: "g4@2 e4 ~ e4 ~ e4@2 ~@6 c#4@2",
  J: "f#4 ~ f#4 ~ f#4 ~ f#4@2 b3@3 ~ f#4@2 e4 ~", K: "f#4!3 ~ e4@2 g4@3 ~@7", L: "~@2 d4@2 g4@2 g4 ~ g4@4 a4@2 b4@2",
  M: "a4@2 e4@3 ~ e4@4 ~@6", N: "~@2 d4@2 g4 ~ g4 ~ g4@4 a4@2 b4@2",
  O: "[a4@2 e4@3 ~ e4@4 g4@4 f#4@4 g4@2 f#4@2 g4@2 f#4@2 g4@2 f#4@2 g4@2]/2",
  P: "f#4@2 g4@2 f#4@2 g4@2 f#4@2 g4@2 f#4@2 e4 ~", Q: "g4@4 e4@3 ~ e4@4 d4@2 b3@2",
  R: "[d4@2 e4@4 g4@3 ~@5 g4@5 ~ g4@3 ~ g4@4 e4 ~ e4@2]/2", S: "g4@2 e4 ~ e4 ~ e4@4 ~@6",
  T: "~@2 f#4 ~ f#4@2 e4@2 f#4@3 ~ f#4@2 e4@2", U: "f#4 ~ f#4@2 e4@2 g4@3 ~ e4 ~ e4 ~ e4 ~",
  V: "g4@3 ~ e4@3 ~ e4@3 ~ d4@2 ~@2", W: "d4@2 e4@3 ~ e4@4 ~@6", X: "[~@14 g4@6 e4@3 ~ e4 ~ e4 ~ e4@3 ~]/2",
  Y: "e4 ~ e4@2 ~@2 g4@5 ~@5", Z: "g4@2 e4@2 e4@2 e4@3 ~@5 b3@2", AA: "f#4!2 f#4@2 e4@2 f#4@2 b3@2 ~@2 f#4@2 e4@2",
  AB: "[f#4!3 ~ e4@2 g4@4 ~@4 g4@6 e4@3 ~ e4 ~ e4 ~ e4@2 ~@2]/2", AC: "e4@2 e4@3 ~ g4@5 ~@5",
  AD: "~@2 g4 ~ g4 ~ g4 ~ g4@2 e4 ~ e4 ~ e4 ~", AE: "g4@2 e4 ~ e4 ~ e4@2 ~@6 b3@2",
  AF: "f#4!2 f#4@2 e4@2 f#4@2 b3@2 ~@2 f#4@2 e4 ~", AG: "f#4!2 f#4@2 e4@2 g4@3 ~@7",
  AH: "[a4@2 e4@3 ~ e4@4 g4@3 ~ f#4@4 g4@2 f#4@2 g4@2 f#4@2 g4@2 f#4@2 g4@2]/2",
  AI: "f#4@2 g4@2 f#4@2 g4@2 f#4@2 g4@2 f#4 ~ e4@2", AJ: "[d4@2 e4@4 g4@4 ~@4 g4@5 ~ g4@3 ~ g4@4 e4 ~ e4@2]/2",
  AK: "g4@2 e4 ~ e4 ~ e4@2 ~@8", AL: "~@2 f#4 ~ f#4@2 e4@2 f#4@3 ~ f#4@2 e4 ~", AM: "g4@4 e4@2 ~@2 e4@4 d4@3 ~",
  AN: "d4@2 e4@3 ~ e4@7 ~@3", AO: "~@2 g4 ~ g4 ~ g4 ~ g4@3 ~ g4@2 e4 ~", AP: "g4@2 e4@2 ~@2 e4@5 ~@5",
  AQ: "~@2 g4 ~ g4 ~ g4 ~ g4@3 ~ a4@2 b4@2",
  AR: "[a4@2 e4@3 ~ e4@3 ~ g4@3 ~ f#4@4 g4@2 f#4@2 g4@2 f#4@2 g4@2 f#4@2 g4@2]/2", AS: "g4@4 e4@2 ~@2 e4@3 ~ d4@2 b3@2",
  AT: "[d4@2 e4@3 ~ g4@4 ~@4 g4@4 ~@2 g4@3 ~ g4@3 ~ e4 ~ e4@2]/2", AU: "g4@2 e4@2 e4@2 e4@3 ~@7",
  AV: "f#4 ~ f#4@2 e4@2 g4@2 ~@2 e4 ~ e4 ~ e4@2", AW: "g4@3 ~ g4@3 ~ g4@3 ~ g4@3 ~",
  AX: "g4 ~ g4@2 ~@2 e4@5 ~@3 e4@2, ~@6 g4 ~@9", AY: "g4@2 e4 ~ e4 ~ e4@5 ~@5",
  AZ: "f#4 ~ f#4@2 e4@2 g4@3 ~ e4 ~ e4 ~ e4@2", BA: "g4@4 e4@2 ~@2 e4@3 ~ d4@3 ~", BB: "d4@2 e4@3 ~ e4@5 ~@3 e4@2",
  BC: "g4@3 ~ e4@3 ~ e4@3 ~@5", BD: "~@7 b3", BE: "g4@4 e4@3 ~ e4@3 ~@5", BF: "~@7 e4", BG: "g4@2 e4@3 ~ e4@4 ~@4 e4@2",
  BH: "d4@2 e4@3 ~ e4@6 ~@2 e4@2", BI: "g4@4 e4@3 ~ e4@4 ~@4", BJ: "g4@4 e4@3 ~ e4@3 ~@3 e4@2",
  BK: "g4@2 e4@3 ~ e4@7 ~@3",
})).s("gm_electric_guitar_jazz").gain(0.45).pan(0.4)

// chords · overdriven guitar · "tk6"
const overdriven_guitar = note("<~@4 A ~@33 A ~@33 A ~@29 A ~@6 B A ~@8>".pickRestart({
  A: "~@8 c4 ~@7", B: "~@6 c#4 ~",
})).s("gm_overdriven_guitar").gain(0.38).pan(0.3)

// chords · overdriven guitar · "tk6" · soft notes
const overdriven_guitar_soft = note("<~@15 A B ~@10 C ~@21 A B ~@10 C ~@5 D ~@15 C ~@13 D ~@21>".pickRestart({
  A: "~@15 a#4", B: "f4 ~@15", C: "~@4 [a2,e3] ~@11", D: "~@7 e2",
})).s("gm_overdriven_guitar").gain(0.16).pan(0.3)

// chords · distortion guitar · "tk7"
const distortion_guitar_2 = note(`<
  ~@3 A B@3 C@2 D@2 E@2 F@2 G H I@2 J K L M ~ N O P Q R S T U V W X Y Z AA B@3 C@2 D@2 E@2 F@2 G H I@2 J K L M ~ N AB P
  Q R S T AC V W X Y Z AA B@3 C@2 D@2 AD AE AF AG AH R S Z ~@7 T AC V W X Y Z AA B@3 C@2 D@2 AI B@3 C@2 D@2 AJ@2
>`.pickRestart({
  A: "~@5 [e2,b2,e3]!3", // E5
  B: "[[e2,b2,e3]@2 [e2,b2,e3]@2 [g2,d3,g3]@3 [f2,f#2,c3,c#3] [e2,b2,e3]@4 ~@2 [d2,a2,d3]@4 [d2,a2,d3] ~ [e2,b2,e3]@4 [e2,b2,e3]@4 ~@2 d3@4 d3@2 d3@2 b2@2 d3@2 d3@2 d3@2 b2@2, ~@4 [f#2,f#3] ~@43]/3", // E5 G5 C#maj7 E5 D5 E5 F#
  C: "[d3@2 [b2,e3]@2 ~@2 [e2,b2,e3]@4 [e2,b2,e3]@2 [e2,b2,e3]@2 [e2,b2,e3]@4 [e2,b2,e3]@2 [g2,d3,g3]@3 c#3 [e2,b2,e3]@4 ~@2 [d2,a2,d3]@2]/2", // E5 G5 E5 D5
  D: "[~ [e2,b2,e3] [e2,b2,e3]@2 [e2,b2,e3]@2 ~ d3@2 d3!2 b2 d3!3 b2]/2", // E5
  E: "[d3@2 [e2,b2,e3]@2 ~@2 [e2,b2,e3]@3 ~ b2@2 c#3@2 [e2,b2,e3]@6 ~@12]/2", // E5
  F: "[~@5 [e2,b2,e3]!2 [e2,e3,a3] [e2,e3,a3] ~@7, ~@7 a2@2 ~@7]/2", G: "~@10 [a2,e3,a3]@2 [a2,e3,a3]@2 [e3,a3] ~",
  H: "[b2,f#3,b3]@3 ~@13", I: "[~@10 [b2,f#3,b3]@2 [b2,f#3,b3] ~ [e2,b2,e3]@4 [e2,b2,e3]@2 [e2,b2,e3]@2 ~@10]/2",
  J: "~@5 b2!2 [e2,b2,e3], ~@5 [e2,e3]@2 ~", K: "[a2,e3,a3] ~@7", L: "~@5 [a2,e3,a3]!3", M: "[b2,f#3,b3] ~@7",
  N: "[g2,d3,g3]@4 [g2,d3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3]@2", // G5
  O: "[a2,e3]@4 [a2,e3] ~ [a2,e3,a3] ~ [a2,e3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3]@2", // A5
  P: "[g2,d3,g3]@4 g2 ~ [g2,d3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3]@4", // G5
  Q: "[a2,e3,a3]@6 [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3]@4", // A5
  R: "[b2,f#3,b3] ~@3 [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~", // B5
  S: "[b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [e2,b2,e3]@2", // B5 E5
  T: "[e2,b2,e3]@2 [e2,b2,e3]@2 ~@6 [e2,b2] ~@3 [b2,e3]@2", U: "[e2,b2,e3] [e2,e3] ~@3 [b2,e3]!3, ~@3 e2",
  V: "[e3,a3]@2 [e3,a3]@2 [a2,e3,a3] ~@5 [a2,e3,a3] ~@3 [e3,a3]@2, a2 ~@3", // A5
  W: "[e3,a3]!2 [a2,e3,a3] ~@2 [e3,a3] [a2,e3,a3] [f#3,b3], a2 ~@3", X: "[b2,f#3,b3]@2 ~@8 [f#3,b3] ~@3 [b2,f#3,b3]@2",
  Y: "[b2,f#3,b3]@2 [b2,f#3,b3]@2 [b2,f#3,b3] ~@5 [b2,f#3,b3]@2 [b2,f#3,b3]@2 [b2,f#3,b3]@2", Z: "[e2,b2,e3] ~@7",
  AA: "b2@2 d3@7 ~ [e2,b2,e3]@2 [e2,b2,e3]@2 [e2,b2,e3]@2", // E5
  AB: "[a2,e3,a3]@4 [a2,e3] ~ [a2,e3,a3] ~ [a2,e3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3]@2", // A5
  AC: "[e2,b2,e3]@2 [e2,e3] ~@7 [b2,e3]@2 [b2,e3]@2 [b2,e3]@2, ~@3 e2", // E5 E E5
  AD: "d3@2 [e2,b2,e3]@2 ~@2 [e2,b2,e3]@3 ~ b2@2 c#3@2 [e2,b2,e3]@2", // E5
  AE: "[g2,d3,g3]@4 ~@2 d3 ~ g2 ~ [g2,d3,g3] ~ [g2,d3] ~ [g2,d3,g3]@2", // G5
  AF: "[a2,e3,a3]@4 ~@2 [a2,e3] ~@3 [a2,e3,a3] ~ [a2,e3] ~ [a2,e3,a3]@2", // A5
  AG: "[g2,d3,g3]@4 ~@4 [g2,d3] ~ [g2,d3] ~ [g2,d3,g3]@4", AH: "[a2,e3,a3]@6 e3 ~ [a2,e3] ~ [a2,e3,a3] ~ [a2,e3,a3]@4",
  AI: "d3@2 [e2,b2,e3]@2 ~@2 [e2,b2,e3]@3 ~ [e2,b2,e3]@2 [e2,b2,e3]@2 [e2,b2,e3]@2", // E5
  AJ: "[d3 [e2,b2,e3] ~ [e2,b2,e3]@12 ~]/2", // E5
})).s("gm_distortion_guitar").gain(0.38).pan(0.7)

// chords · distortion guitar · "tk7" · soft notes
const distortion_guitar_soft = note(`<
  ~@4 A ~@2 B C ~@6 D E ~@7 F G H ~ I ~ J K L M N ~@3 A ~@2 B C ~@6 D E ~@7 F G H ~ I ~ J K L M N ~@3 A ~@2 B C ~@3 O P
  Q R I ~@9 J K L M N ~@3 A ~@2 B C ~@3 A ~@2 B C ~@4
>`.pickRestart({
  A: "~@4 [f2,c3,c#3] ~@2 [f3,f#3] ~@8", B: "~ e2 ~@6", C: "~@7 [f2,f#2,c3] ~@8", D: "~@15 f3", E: "a#3 ~@15",
  F: "~@4 g3 ~@11", G: "~@4 a3 ~@3 a3 ~@7", H: "~@4 [d3,g3] ~ g3 ~@9", I: "~@2 [b2,f#3,b3] ~@13", J: "~@7 e2",
  K: "~@5 e2 ~@2", L: "~@7 a2", M: "~@5 a2 ~ b2", N: "~@10 b2 ~@5", O: "~@4 [g2,d3,g3] ~ [g2,g3] ~ [d3,g3] ~@3 g3 ~@3",
  P: "~@4 [a2,e3,a3] ~ a3 ~ [a2,e3,a3] ~@3 a3 ~@3", Q: "~@4 [g2,d3,g3] ~ [g2,d3,g3] ~ g3 ~ g3 ~@5",
  R: "~@6 [a2,a3] ~ a3 ~@7", // A
})).s("gm_distortion_guitar").gain(0.16).pan(0.7)

// drums · kick
const kick = s("bd").struct("<A@36 B C A@25 D A@6 E ~ A@3 F A@16 G H A@6 F I A@14 J K ~>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "~@10 x!3 ~@3", C: "~@5 x ~ x", D: "x ~@2 x!2 ~@3", E: "x", F: "~ x ~ x ~ x ~ x",
  G: "x ~@6 x", H: "~@7 x", I: "x ~@2 x ~@3 x", J: "x ~@2 x ~ x ~ x", K: "~ x!3 ~@4",
})).gain(0.49)

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

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!117 ~@2>").gain(0.49)

// drums · low tom
const low_tom = s("lt").struct(`<
  A@3 ~ A@3 B A@3 B C A@11 ~ D ~@3 E A@6 ~@2 A@3 B C A C F C A@10 F ~@4 G ~ C A@5 E H A@3 ~ C A C I ~@4 J K ~@5 L ~ M
  A@5 N ~@2 A@3 F C A@2 O C P A@4 F ~@2
>`.pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "~ x!7", D: "~@15 x", E: "~@2 x!6", F: "x!4 ~@4", G: "x", H: "~@3 x!2 ~@11",
  I: "x!5 ~@2 x", J: "x ~ x!6", K: "x!7 ~", L: "~@14 x!2", M: "~ x", N: "x!6 ~@2", O: "~@6 x ~ x ~@4 x!2 ~",
  P: "x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x",
})).gain(0.16)

// drums · hihat
const hihat = s("hh").struct("<~@12 A ~@5 A ~@17 B ~@9 A ~@14 C ~@8 D A ~@11 C ~@8 D ~@26>".pickRestart({
  A: "x", B: "~ x!2 ~", C: "~@7 x", D: "~ x!3",
})).gain(0.33)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A@3 ~ A@3 B A@3 B C A@2 D A@7 B ~ E ~@4 A@3 D A@2 ~ F A@3 B C A@2 G A@11 H ~@3 I J K A@6 L M A@3 ~ A@3 N ~@3 I O P ~@5
  Q ~ R A@3 S A D ~@2 A@3 B C A@2 T A@6 G ~@2
>`.pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x!2 ~ x!2 ~@3", C: "~ x ~ x!3 ~ x", D: "x!2 ~ x!3 ~@2", E: "~@7 x", F: "~ x!2 ~@2 x ~ x",
  G: "x!2 ~ x ~@4", H: "x!2 ~ x ~@2 x!2", I: "~@15 x", J: "~@2 x ~ x!4", K: "x", L: "~@2 x!6", M: "~@2 x!2 ~@12",
  N: "x ~ x ~@3 x ~ x ~@2 x!2 ~@3", O: "~ x!7", P: "x!7 ~", Q: "~@12 x!2 ~@2", R: "~@2 x!2 ~@4", S: "x!2 ~ x!2 ~@2 x",
// … 25 more lines

More by Joan Jett