Strudelify

Yesterday's

Guns N' Roses

KeyF majorTempo120 bpm
0:00/0:00
// Yesterday's — Guns N' Roses
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 107 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
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 · acoustic bass · "Bass    (BB)"
const bass = note(`<
  ~@2 A B A C D E F G H A I J K L M N A O A P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AG AJ AK AL AM AN AO AP
  AQ@2 AR AE AS AE AT@2 AE AJ AU AV AW AN AX AY AZ BA BB BC BD BE BF A BG BH BI BJ G BK BL BM BN Y Z T BO BE BP BQ BG BR
  BS BJ BT U BE I BU BV BW BX BY BE BZ CA CB ~
>`.pickRestart({
  A: "d2@12 a2@11 ~", B: "e2@5 bb1 a1@6", C: "e2@8 e1 ~ e2 ~ a1@8 eb2@2 db2 ~", D: "d2@12 d2@8 eb2@2 db2 ~",
  E: "c2@12 c2@11 ~", F: "b1@12 f2@11 ~", G: "e2@6 b2@3 bb1@2 e1", H: "a1@12 e2@9 ~ eb2@2", I: "g2@12 d2@11 ~",
  J: "c2@12 g2@9 ~ db2@2", K: "c2 f2", L: "bb1@5 e2 eb2@6", M: "e2@12 b1@10 e1 ~",
  N: "eb2@10 bb2@2 eb3@3 ~ bb2@2 eb2@5 ~", O: "e2@6 a1@5 eb2", P: "e2@10 e1 ~ a1@10 eb2@2", Q: "d2!2",
  R: "c2@12 a2@10 c2 ~", S: "b1@12 f2@9 ~ f2@2", T: "e2@12 b1@11 ~", U: "a1@12 e2@10 a0 ~", V: "d2@12 a2@9 ~ ab2@2",
  W: "g2@12 d2@9 ~ db2@2", X: "c2@10 g2@2 c3@3 ~ g2@2 c2@5 ~", Y: "c2@10 c1 ~ f2@12", Z: "bb1 eb2",
  AA: "e2@12 b2@10 e2 ~", AB: "a1@11 ~ eb2@6 eb2@4 db2 ~", AC: "d2 a2", AD: "d2@10 d1 ~ a2@11 ~",
  AE: "d2@3 ~ d1 ~ e2@5 ~ f2@6 a2@4 d2@2", AF: "e2@2 e1 bb1@3 a1@2 a0 a1@3", AG: "d2@6 e2@5 ~ f2@6 a2@4 d2@2",
  AH: "e2@5 ~ e2@5 ~ a1@6 db2@4 a1@2", AI: "d2@4 d1@2 d2@6 d2@5 ~ d2@6", AJ: "b1@3 f2@3 b2@3 f2@2 f2",
  AK: "e2@3 b2@3 e3@3 b2@2 bb1", AL: "a1@6 b1@5 ~ c2@5 ~ db2@4 a1@2", AM: "d2@5 ~ c2@5 ~ bb1@6 a1@4 d2@2",
  AN: "g2@5 ~ f2@5 ~ e2@6 d2@4 g2@2", AO: "c2@5 ~ bb1@5 ~ a1@6 g1@4 c2@2", AP: "c2@5 ~ c2@6 f2@4 f1@2 b1@6",
  AQ: "[bb1@5 ~ bb1@5 ~ eb2@5 ~ eb2@4 e2@5 ~ e1 ~ gb2@5 ~ g2@6 b2@4 e2@2]/2",
  AR: "eb2@4 eb1 ~ db2@6 c2@6 ~@4 eb2@2, ~@3 bb1", AS: "e3 bb2 e2 bb1@2 ab1 a1@2 a0 a1@3",
  AT: "[e2@5 ~ e2@6 a1@5 ~ a1@4 d2@6 ~@2 d2@5 ~ d2@5 ~@5 eb2@2, ~@7 d2]/2", AU: "e2@5 ~ d2@5 ~ c2@6 b1@4 e2@2",
  AV: "a1@3 e2@3 a2@3 e2@2 eb2", AW: "d2@3 a2@3 d3@3 a2@2 ab2", AX: "c2@3 g2@3 c3@3 g2@2 db2",
  AY: "c2@5 ~ c2@5 ~ f2@6 b1@6", AZ: "bb1@5 ~ bb1@3 ~@3 eb2@5 ~@5 f2@2, ~@5 bb0@2 ~@11 eb2@6",
  BA: "e2@3 ~ e1 ~ gb2@5 ~ g2@6 b2@4 e2@2", BB: "a1@3 eb2@3 a2@3 eb2@2 eb2", BC: "d2@4 a1 ~ f2@5 ~ g2@5 ~ a2@4 a1 ~",
  BD: "d2@5 ~ c2@5 ~ b1@6 a1@4 eb2@2", BE: "d2@12 a2@10 d1 ~", BF: "e2@10 e1 ~ a1@12", BG: "e2 a1",
  BH: "d2@8 eb2@2 db2 ~ d2@12", BI: "c2@10 a2@2 c3@3 ~ a2@2 c2@5 ~", BJ: "b1@12 f2@10 b0 ~", BK: "a1@12 e2@11 ~",
  BL: "d2@4 d1@2 d2@6 e2@6 gb2@4 d1 ~", BM: "g2@12 d3@10 g2 ~", BN: "c2@12 g2@10 c1 ~", BO: "eb2@12 bb1@9 ~ eb2@2",
  BP: "e2@12 a1@8 eb2@2 db2 ~", BQ: "d2@12 a2@9 ~ f2@2", BR: "d2@6 d2@5 eb2", BS: "c2@12 c2@10 c1 ~",
  BT: "e2@5 ~ e2@6 ~@4 e1 ~ b1@5 ~, ~@2 d2 ~", BU: "c2@11 ~ g2@6 db2@4 b1 ~", BV: "c2@8 gb2@2 e2 ~ f2@10 f1 ~",
  BW: "bb1@8 e2@2 d2 ~ eb2@12", BX: "e2@12 b1@9 ~ bb1@2", BY: "a1 eb2", BZ: "d2@10 a2@2 d3@3 ~ a2@2 d2@5 ~",
  CA: "d2@7 f2@6 g2@6 ab2@5", CB: "~ a2@5 ~ c3@2 ~ d3@8 d2@3 ~@3",
})).s("gm_acoustic_bass").gain(0.56)

// chords · piano · "Piano   (BB)"
const piano = note(`<
  ~@2 A B C@2 D E F G H I J K L M N O P@2 Q R S T U V W X Y Z@2 AA AB AC AD AE AF@2 AG AH@2 AI AJ@2 AK AL AM AN@2 AO
  AP@2 AQ AR AS AT@2 AU AV AW AX X AY AZ BA@2 BB BC BD@2 A BE BF BG BH BI BJ BK H BL BM BN BO M BP W BQ@2 BR BS BT BU BV
  BW BX BY J BZ CA CB N CC CD@2 ~ CE ~
>`.pickRestart({
  A: "[f3,a3,b3,d4]@5 ~", B: "~@4 [g3,d4,e4,bb4]@6 ~@2 [g3,db4,f4,bb4]@11 ~",
  C: "[[f3,a3,b3,d4]@20 ~@2 [g3,d4,e4,bb4]@12 [g3,db4,f4,bb4]@13 ~]/2", // Bm7b5 Em7b5 Gm7b5
  D: "[f3,b3,d4,a4]@3 ~ [f3,b3,d4,a4]@7 ~ [f3,a3,db4,e4]@3 ~ [f3,a3,db4,e4]@7 ~", // Bm7b5 A
  E: "[f3,a3,c4,e4]@3 ~ [f3,a3,c4,e4]@2 ~@4 [f3,a3,c4,e4]@12 ~@2", // Fmaj7
  F: "[a3,d4,f4,b4]@3 ~ [a3,d4,f4,b4]@2 ~@4 [a3,d4,f4,b4]@12 ~@2", // Bm7b5
  G: "[ab3,d4,f4,c5]@3 ~ [ab3,d4,f4,c5]@2 ~@4 [ab3,d4,f4,c5]@12 ~@2", // Dm7b5
  H: "~@4 [g3,db4,f4,bb4]@5 ~ a2@2 [g3,db4,f4,bb4]@4 ~@8", // Gm7b5
  I: "[gb3,a3,c4,e4]@3 ~ [gb3,a3,c4,e4]@2 ~@4 [gb3,a3,c4,e4]@12 ~@2", // Gbm7b5
  J: "[f3,b3,e4,a4]@3 ~ [f3,b3,e4,a4]@2 ~@4 [f3,b3,e4,a4]@12 ~@2", // Fmaj7
  K: "~@4 [e3,bb3,d4,g4]@5 ~ c3@2 [e3,bb3,d4,g4]@4 ~@8", L: "[eb3,bb3,d4,g4]@3 ~ [eb3,a3,c4,g4] ~ [eb3,a3,c4,g4]@2",
  M: "[a3,c4,d4,f4]@3 ~ [g3,d4,f4,bb4] ~ [g3,d4,f4,bb4]@2", N: "[g3,d4,e4,b4]@5 ~",
  O: "~@4 [g3,db4,f4,c5]@5 ~ eb3@2 [g3,db4,f4,c5]@4 ~@8", // Csus4
  P: "[[f3,b3,d4,a4]@3 ~ [f3,b3,d4,a4]@2 ~@4 [f3,b3,d4,a4]@12 [g3,d4,e4,bb4]@13 ~ [g3,bb3,db4,f4]@4 a2@2 [g3,bb3,db4,f4]@3 ~@3]/2", // Bm7b5 Em7b5 Gm7b5
  Q: "[f3,a3,b3,d4]@3 ~ [f3,a3,b3,d4]@2 ~@4 [f3,a3,b3,d4]@12 ~@2", // Bm7b5
  R: "[g3,d4,e4,bb4]@4 e3@2 [g3,d4,e4,bb4]@3 ~@3 [g3,bb3,db4,f4]@3 ~ [g3,bb3,db4,f4]@7 ~", // Em7b5 Gm7b5
  S: "[f3,a3,b3,d4]@3 ~@3 [f3,a3,b3,d4]@6 ~@4 [f3,db4,e4,a4]@6 ~@2", T: "[f3,c4,e4,a4]@5 ~",
  U: "[a3,d4,f4,b4]@11 ~ [a3,d4,f4,b4]@3 ~ b2@2 [a3,d4,f4,b4]@4 ~@2", // Bm7b5
  V: "[ab3,b3,d4,f4]@3 ~ [ab3,b3,d4,f4]@2 ~@4 [ab3,b3,d4,f4]@12 ~@2", // Abdim
  W: "[g3,db4,f4,bb4]@3 ~ [g3,db4,f4,bb4]@2 ~@4 [g3,db4,f4,bb4]@12 ~@2", X: "[gb3,b3,c4,e4]@5 ~",
  Y: "~@4 [f3,b3,e4,a4]@5 ~ g2@2 [f3,b3,e4,a4]@4 ~@8", // Fmaj7
  Z: "[[e3,bb3,d4,g4]@3 ~ [e3,bb3,d4,g4]@2 ~@4 [e3,bb3,d4,g4]@12 [eb3,bb3,d4,g4]@13 ~ [eb3,g3,a3,d4]@3 ~ [eb3,g3,a3,d4]@7 ~]/2", // Em7b5 Ebmaj7
  AA: "[a3,d4,f4,c5]@3 ~ [a3,d4,f4,c5]@7 ~ [g3,bb3,d4,f4]@11 ~", // Dm7 Gm7
  AB: "[g3,d4,e4,b4]@3 ~ [g3,d4,e4,b4]@2 ~@4 [g3,d4,e4,b4]@12 ~@2", AC: "[g3,db4,f4,c5]@5 ~",
  AD: "~@4 [f3,b3,d4,a4]@5 ~@3 [f3,b3,d4,a4]@6 ~@6", AE: "[f3,b3,d4,a4]@9 ~ [f3,b3,d4,a4]@2 ~@4 f3@2 a3@2 b3 ~ d4 ~",
  AF: "[[f3,a3,b3,d4]@10 ~ [g3,bb3,d4,e4]@6 ~ [g3,db4,e4,bb4]@5 ~]/2", // Bm7b5 Em7b5 Gdim
  AG: "[f3,b3,d4,a4]@11 ~ [f3,b3,d4,a4]@3 ~ d3@2 [f3,b3,d4,a4]@2 ~@4", // Bm7b5
  AH: "[[g3,d4,e4,bb4]@10 ~@2 [g3,db4,f4,bb4]@3 ~@7 [f3,b3,d4,a4]@7 ~ f3@2 ~@2 [f3,db4,e4,a4]@12 ~@2]/2", // Em7b5 Gm7b5 Bm7b5 A
  AI: "~@10 c3@2 [f3,a3,c4,d4]@4 c3@2 [f3,a3,c4,d4]@3 ~@3", // Dm7
  AJ: "[~@10 b2@2 [a3,d4,f4,b4]@4 b2@2 [a3,d4,f4,b4]@3 ~ [ab3,c4,d4,f4]@21 ~@5]/2", // Bm7b5 Dm7b5
  AK: "~@10 a2@2 [g3,bb3,db4,f4]@4 a2@2 [g3,bb3,db4,f4]@3 ~@3", // Gm7b5
  AL: "~@10 d3@2 [gb3,c4,e4,a4]@4 d3@2 [gb3,c4,e4,a4]@3 ~@3", AM: "[f3,a3,b3,e4]@17 ~@7",
  AN: "[[e3,bb3,d4,a4]@9 ~ [e3,bb3,d4,a4]@2 ~@10 [eb3,g3,bb3,d4]@4 ~@10 [eb3,a3,d4,g4]@6 eb4@2 a4@2 c5 ~]/2", // Dsus2 Ebmaj7
  AO: "[a3,d4,f4,c5]@5 [g3,bb3,d4,f4]@2 ~@5", // Dm7 Gm7
  AP: "[[g3,d4,e4,b4]@17 ~@5 [g3,c4,db4,f4]@12 ~@2 [g3,c4,db4,f4]@3 ~ eb3@2 [g3,c4,db4,f4]@2 ~@4]/2", // Em7 Csus4
  AQ: "[f3,b3,d4,a4]@9 ~ [f3,b3,d4,a4]@2 ~@12", AR: "[g3,d4,e4,bb4]@3 ~@9 [g3,db4,f4,bb4]@6 db4@2 g4@2 bb4 ~",
  AS: "[f3,b3,d4,a4]@17 ~@7", // Bm7b5
  AT: "[[g3,d4,e4,bb4]@10 [g3,bb3,db4,f4]@7 ~ db4@2 ~@2 [f3,a3,b3,d4]@4 ~@10 [f3,db4,e4,a4]@10 ~@2]/2", // Em7b5 Gm7b5 Bm7b5 A
  AU: "[f3,a3,c4,d4]@11 ~ [f3,a3,c4,d4]@3 ~ c3@2 [f3,a3,c4,d4]@2 ~@4", // Dm7
  AV: "~@10 b2@2 [a3,d4,f4,b4]@4 b2@2 [a3,d4,f4,b4]@3 ~@3", // Bm7b5
  AW: "[ab3,d4,g4,b4]@11 ~ [ab3,d4,g4,b4]@3 ~ e3@2 [ab3,d4,g4,b4]@2 ~@4", AX: "[g3,a3,db4,f4]@17 ~@7",
  AY: "~@10 g2@2 [f3,b3,e4,a4]@4 g2@2 [f3,b3,e4,a4]@3 ~@3", AZ: "~@10 c3@2 [e3,bb3,d4,g4]@4 c3@2 [e3,bb3,d4,g4]@3 ~@3",
  BA: "[~@4 [eb3,bb3,c4,g4]@5 ~@3 [eb3,g3,a3,d4]@6 eb4@2 ~@2 [a3,c4,d4,f4]@4 ~@8 [g3,d4,f4,bb4]@12 ~@2]/2", // Cm7 Ebmaj7 Dm7 Gm7
  BB: "[g3,d4,e4,b4]@11 ~ [g3,d4,e4,b4]@3 ~ e3@2 [g3,d4,e4,b4]@2 ~@4", BC: "[g3,db4,f4,c5]@17 ~@7",
  BD: "[~@12 [f3,b3,d4,a4]@3 ~ [f3,b3,d4,a4]@2 ~@4 [f3,b3,d4,a4]@19 ~@7]/2", // Bm7b5
  BE: "[g3,bb3,d4,e4]@4 e3@2 [g3,bb3,d4,e4]@3 ~ [g3,db4,f4,bb4]@13 ~", // Em7b5 Gm7b5
  BF: "[f3,b3,d4,a4]@11 ~ [f3,b3,d4,a4]@3 ~ d3@2 [f3,b3,d4,a4]@4 ~@2", // Bm7b5
  BG: "~@2 [g3,d4,e4,bb4]@3 ~@3 [g3,bb3,db4,f4]@3 ~", // Em7b5 Gm7b5
  BH: "~@4 [f3,b3,d4,a4]@6 ~@2 [f3,db4,e4,a4]@3 ~@3 [f3,db4,e4,a4]@6", BI: "[f3,c4,d4,a4]@5 ~",
  BJ: "~@4 [a3,d4,f4,b4]@5 ~ b2@2 [a3,d4,f4,b4]@4 ~@8", BK: "~@4 [ab3,d4,f4,c5]@5 ~ e3@2 [ab3,d4,f4,c5]@4 ~@8",
  BL: "[gb3,a3,c4,e4]@5 ~", BM: "[f3,b3,e4,a4]@5 ~",
  BN: "[e3,bb3,d4,g4]@3 ~ [e3,bb3,d4,g4]@2 ~@4 [e3,bb3,d4,g4]@12 ~@2", // Em7b5
  BO: "[eb3,bb3,d4,g4]@3 ~ [eb3,bb3,d4,g4]@7 ~ [eb3,a3,c4,g4]@9 ~@3", // Ebmaj7 Am7b5
  BP: "~@4 [g3,d4,e4,b4]@5 ~ e3@2 [g3,d4,e4,b4]@4 ~@8", // Em7
  BQ: "[[f3,b3,d4,a4]@20 ~@2 [g3,bb3,d4,e4]@12 [g3,db4,f4,bb4]@13 ~]/2", BR: "[f3,b3,d4,a4]@5 ~",
  BS: "[g3,d4,e4,bb4]@4 e3@2 [g3,d4,e4,bb4]@3 ~@3 [g3,db4,e4,bb4]@4 a2@2 [g3,db4,e4,bb4]@3 ~@3", // Em7b5 Gdim
  BT: "[f3,b3,d4,a4]@4 d3@2 [f3,b3,d4,a4]@3 ~ [f3,db4,e4,a4]@13 ~", // Bm7b5 A
  BU: "[f3,c4,e4,a4]@3 ~ [f3,c4,e4,a4]@2 ~@4 [f3,c4,e4,a4]@12 ~@2", BV: "[a3,d4,f4,b4]@5 ~",
  BW: "[ab3,c4,d4,f4]@11 ~ [ab3,c4,d4,f4]@3 ~ e3@2 [ab3,c4,d4,f4]@4 ~@2", BX: "[g3,db4,f4,bb4]@5 ~",
  BY: "[gb3,c4,e4,a4]@11 ~ [gb3,c4,e4,a4]@3 ~ d3@2 [gb3,c4,e4,a4]@4 ~@2", // Gbm7b5
  BZ: "[e3,bb3,d4,g4]@11 ~ [e3,bb3,d4,g4]@3 ~ c3@2 [e3,bb3,d4,g4]@4 ~@2", // Em7b5
  CA: "~@4 [eb3,bb3,d4,g4]@6 ~@2 [eb3,g3,a3,d4]@9 ~@3", CB: "~@4 [a3,d4,f4,c5]@6 [g3,d4,f4,bb4]@11 ~@3",
  CC: "[g3,db4,f4,c5]@3 ~ [g3,db4,f4,c5]@2 ~@4 [g3,db4,f4,c5]@12 ~@2", // Csus4
  CD: "[f3,b3,d4,a4]@3 ~ [f3,b3,d4,a4]@2 ~@4 [f3,b3,d4,a4]@12 ~@2", // Bm7b5
  CE: "[f3,a3,b3,d4]@3 ~@3 [gb3,bb3,c4,eb4]@3 ~ [f3,a3,b3,d4]@11 ~@3", // Bm7b5 Cm7b5 Bm7b5
})).s("gm_piano").gain(0.23)

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

// drums · rim
const rim = s("rim").struct(`<
  A B C@7 ~ C@6 D ~ C@6 D ~ C@9 ~ C@7 ~ C@7 ~ C@7 ~ C@9 ~ C@7 ~ C@7 ~ C@7 ~ C@8 D ~@4
>`.pickRestart({
  A: "x!2", B: "x!4", C: "~ x ~ x", D: "~ x ~@2",
})).gain(0.19)

// drums · snare
const snare = s("sd").struct(`<
  ~@9 A ~@6 B C ~@6 B A ~@9 A ~@3 B ~ D E F ~@2 F B ~@2 F G ~ H F B ~ H@2 C ~@2 F I ~ H F B E F ~@7 J ~@7 G ~@7 C ~@8 B
  J K L ~
>`.pickRestart({
  A: "x ~@5 x ~@4 x", B: "~@2 x", C: "~@3 x", D: "~@5 x ~@6", E: "~@8 x ~@2 x", F: "~ x ~@4", G: "x ~@4 x ~@5 x",
  H: "~@11 x", I: "~@2 x ~@5 x ~@2 x", J: "~@2 x ~@2 x!2 ~@5", K: "~@2 x ~@2 x ~@2 x ~ x!2", L: "x ~ x!2 ~@8",
})).gain(0.19)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@36 A B C ~ D ~ B ~ C E D ~ D B@2 ~ C E D ~ A F B ~ A ~ B ~ A E D ~ B ~@38
>`.pickRestart({
  A: "~ x", B: "~@5 x ~@6", C: "~@5 x!2 ~@5", D: "~@5 x ~@5 x", E: "~@5 x ~@2 x ~@3", F: "~@2 x ~@2 x ~@6",
})).gain(0.1)

// drums · low tom
const low_tom = s("lt").struct("<~@43 [~@10 x!2] ~@25 [~@10 x!2] ~@37>").gain(0.22)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@2 A B ~ B ~@2 C ~ B ~@2 D C ~@3 B ~ D@2 ~ D E ~ B D ~@4 D B D ~@35 A B ~ D C ~@3 A D ~@6 A D ~@4 D ~ A B D@3 ~ D B
  ~@5
>`.pickRestart({
  A: "~@5 x ~@5 x", B: "~@5 x ~@6", C: "~@2 x", D: "~@11 x", E: "~ x ~",
})).gain(0.13)

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 A ~@25 A ~@7 B ~@25 B ~@3>".pickRestart({
  A: "~@2 x", B: "~@9 x ~ x",
})).gain(0.19)

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

// drums · high tom
const high_tom = s("ht").struct("<~@43 A ~@7 B ~@17 A ~@15 B ~@21>".pickRestart({
  A: "~@5 x!2 ~@5", B: "~@6 x ~ x!2 ~@2",
})).gain(0.22)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@7 A ~@7 A ~@7 A ~@9 A ~@5 B A@2 ~@7 A ~@7 A ~@7 B A@2 ~@6 A@2 ~@7 A ~@7 A ~@8 A@2 C ~
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@5 x ~@6",
})).gain(0.22)

// drums · ride
const ride = s("rd").struct(`<
  ~@9 A ~@7 B ~@7 A ~@9 A C A D E F E G ~ C A E@3 A E ~ H I E@2 D I E B C E@2 C D A E@2 G ~@8 J ~@15 B ~@9 K L ~@2
>`.pickRestart({
  A: "x ~@2 x ~ x!2 ~@2 x ~@2", B: "x!2 ~@2", C: "x!4", D: "x ~ x!2 ~@2 x ~@2 x ~@2", E: "x ~@2 x ~@2 x ~@2 x ~ x",
  F: "x ~@2 x ~@2 x ~ x!2 ~ x", G: "x ~@2 x ~@2 x ~ x ~@2 x", H: "x ~@2 x ~@2 x ~ x!2 ~@2",
  I: "x ~@2 x ~ x!2 ~ x!2 ~@2", J: "x ~@2 x ~@2 x ~ x ~@3", K: "x!3 ~", L: "~ x",
})).gain(0.22)
// … 12 more lines

More by Guns N' Roses