Strudelify
Sweet Child O' Mine cover art

1987 · Appetite For Destruction

Sweet Child O' Mine

Guns N' Roses

KeyD♭ majorTempo128 bpm
0:00/0:00
// Sweet Child O' Mine — Guns N' Roses
// 128 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 2 distortion guitar (copy of ch 1 "Lead Guitar" distortion guitar); ch 4 distortion guitar (copy of ch 3 distortion guitar); ch 12 distortion guitar (copy of ch 11 "Lead Guitar Fill" distortion guitar); ch 14 guitar harmonics (copy of ch 13 "Guitar Harmonics" guitar harmonics)
// note: Full arrangement: all 184 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): Acoustic Guitar, Rhthym Guitar Clean & Dist.
setcpm(128/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 · "Rhthym Guitar Dist"
const distortion_guitar = note(`<
  ~@6 A B C D E F G@2 H I C D E F G@2 H I C D E F G@2 H I C D E F G@2 H J K L M J K L N O C D E F G@2 H I C D E F G@2 H
  I C D E F G@2 H J K L M J K L N O C D E F G@2 H I C D E F G@2 H J K L P Q K L R S K L P Q K L B T U V W X U V W X U V
  W X U V W Y Z AA AB AC AD AA AB AC AD AA AB AC AD AA AB AC AD AE AF AG AH AI AF AG AJ AK AL AM AH AN AO AP AQ AR AS AT
  AU AR AS AT AU AR AS AT AV AR AW AX AY AZ@4 ~@3
>`.pickRestart({
  A: "~@4 [db3,ab3,db4]!4", B: "[db3,ab3,db4]!8", C: "[db3,ab3,db4,f4]@3 [db3,ab3,db4,f4]@4 [db3,ab3,db4,f4]",
  D: "[db3,ab3,db4]@2 f4 [ab3,db4,gb4]@2 f4 [ab3,db4] [db3,ab3]", E: "[b2,eb3,gb3,b3,eb4]@2 db4 [b2,eb3,gb3,b3,eb4]@5",
  F: "db4 b3 gb3 b3@4 gb3, [b2,eb3] ~, gb3 ~@3", G: "[[gb2,bb2,db3,gb3,db4]@2 gb3 [gb2,bb2,db3,gb3,bb3]@13]/2",
  H: "[db3,ab3,db4]@2 [db3,ab3,db4]!6", // Db5
  I: "[db3,ab3,db4,gb4] [db3,ab3,db4,f4] [db3,gb3] [db3,ab3,db4,f4]@4 [db3,ab3,db4,eb4]", // Dbsus4 Db Gb5 Db Dbsus2
  J: "[db3,ab3,db4,gb4] [db3,ab3,db4,f4] [db3,ab3,db4,eb4] [db3,ab3,db4,f4]@5", // Dbsus4 Db Dbsus2 Db
  K: "[ab2,eb3,ab3]@2 ~ [ab2,eb3,ab3]@3 [bb2,f3,bb3]!2", L: "[b2,gb3,b3]@2 ~ [b2,gb3,b3]@5",
  M: "[db3,ab3,db4]@3 [db3,ab3,db4] [db3,ab3,db4]@3 [db3,ab3,db4]", N: "[db3,ab3,db4]",
  O: "[db3,ab3,db4]@3 [db3,ab3,db4] [db3,ab3,db4]@2 [db3,ab3,db4]@2", // Db5
  P: "[db3,ab3,db4,f4]@4 [db3,ab3,db4,f4]@2 [db3,ab3,db4,f4]@8 [db3,ab3,db4,f4]!2", // Db
  Q: "[db3,ab3,db4,gb4] [db3,ab3,db4,f4] [db3,ab3,db4,eb4] [db3,ab3,db4,f4]@2 [db3,ab3,db4,f4]!3", // Dbsus4 Db Dbsus2 Db
  R: "[db3,ab3,db4,f4]", // Db
  S: "[db3,ab3,db4,f4]@3 [db3,ab3,db4,f4]@2 [db3,ab3,db4,f4]@3 [db3,ab3,db4,f4]@3 [db3,ab3,db4,f4]@2 [db3,ab3,db4,f4]@3", // Db
  T: "[db3,ab3,db4]@2 [db3,ab3,db4]@2 [db3,ab3,db4]@2 [db3,ab3,db4]@2 [db3,ab3,db4]@3 ~ [d3,a3,d4]@4", // Db5 D5
  U: "[eb2,bb2,eb3,gb3,bb3]@3 [eb2,bb2,eb3,gb3,bb3]@4 [eb2,bb2,eb3,bb3]", // Ebm Eb5
  V: "[b2,eb3,gb3,b3]@3 [b2,eb3,gb3,b3]@4 [b2,eb3,gb3,b3]", W: "[bb2,f3,bb3]@3 [bb2,f3,bb3]@4 [bb2,f3,bb3]",
  X: "[ab2,eb3,ab3,b3]@6 [ab2,eb3,ab3,b3]@6 [ab2,eb3,ab3,b3]@2 [ab2,eb3,ab3]!2", Y: "[ab2,eb3,ab3]!8",
  Z: "[ab2,eb3,ab3]!6 gb2 f2", AA: "[eb2,bb2,eb3,gb3,bb3]@3 [eb2,bb2,eb3,gb3,bb3]@3 eb2 f2",
  AB: "[gb2,db3,gb3,db4]@3 [gb2,db3,gb3,db4]@3 [gb2,db3,gb3,db4]!2", // Gb5
  AC: "[ab2,eb3,ab3]@3 [ab2,eb3,ab3]@3 [ab2,eb3,ab3]!2", // Ab5
  AD: "[b2,gb3,b3]@4 [b2,gb3,b3]@2 [b2,gb3,b3]!2 [db3,ab3,db4]@4 [gb2,db3,gb3,db4]@4", AE: "eb2@2 ~@4 eb2@2 ~@6 eb2 ~",
  AF: "[gb2,db3,gb3] ~@2 gb3@2 ~@3", AG: "[ab2,eb3,ab3] ~@2 ab3@2 ~@3",
  AH: "~ [b2,gb3,b3] ~@2 [db3,ab3,db4]@2 [gb2,db3,gb3]@2", AI: "[eb2,bb2,eb3] ~@2 eb3@2 ~@3",
  AJ: "[b2,gb3,b3] ~ [b2,gb3,b3]@2 ~@4 [db3,ab3,db4]@4 [gb2,db3,gb3]@4", // B5 Db5 Gb5
  AK: "[eb2,bb2,eb3] eb2!2 [eb2,bb2,eb3] ~ eb2 [eb2,bb2,eb3] eb2", // Eb5
  AL: "[gb2,db3,gb3]@2 db3 [gb2,db3,gb3] ~@2 db3 [gb2,db3,gb3]", // Gb5
  AM: "[ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@4 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3] ~", // Ab5
  AN: "[eb2,bb2,eb3]!8", AO: "[gb2,db3,gb3]@2 [gb2,db3,gb3]@2 [gb2,db3,gb3]!3 eb2",
  AP: "[ab2,eb3,ab3]@2 [ab2,eb3,ab3]!6", AQ: "[b2,gb3,b3]!4 [db3,ab3,db4]@2 [gb2,db3,gb3]@2",
  AR: "[eb2,bb2,eb3]@4 [ab2,db3,gb3] ~ [eb2,bb2,eb3]@4 [eb2,bb2,eb3]@2 [eb2,bb2,eb3]@2 f2@2", // Eb5 Dbsus4 Eb5
  AS: "[gb2,db3,gb3]@4 [ab2,db3,gb3] ~ [gb2,db3,gb3]@6 [gb2,db3,gb3]@2 eb2@2", // Gb5 Dbsus4 Gb5
  AT: "[ab2,eb3,ab3]@4 [ab2,db3,gb3] ~ [ab2,eb3,ab3]@4 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,db3,gb3] ~", // Ab5 Dbsus4 Ab5 Dbsus4
  AU: "[b2,gb3,b3]!2 [db3,ab3,db4] [gb2,db3,gb3]", AV: "eb3@3 db3@2 bb2@3 a2@3 ab2@2 gb2@3",
  AW: "[gb2,db3,gb3]@3 [gb2,db3,gb3]@4 [gb2,db3,gb3]", AX: "[ab2,eb3,ab3]", AY: "[b2,gb3,b3] [db3,ab3,db4]",
  AZ: "[eb3,bb3,eb4]/4", // Eb5
})).s("gm_distortion_guitar").gain(0.57).pan(0)

// chords · acoustic guitar steel · "Acoustic Guitar"
const acoustic_guitar_steel = note(`<
  ~@8 A ~ B ~ C@2 D ~ E F G H I J K L@2 ~@23 E F G H I J K M ~@24 E F G H I J K M E F G H I J N@2 ~@88
>`.pickRestart({
  A: "~ [db4,f4]@15", B: "~ [b3,eb4]@15", C: "[~ [gb3,db4,gb4]@31]/2", D: "f4 ~@7", E: "~@4 [db3,ab3,db4,f4]@3 ~",
  F: "f4@3 f4 gb4 ~ eb4@2", G: "~@4 [b2,eb3,gb3,b3,eb4]@3 [b2,eb3,gb3,b3,eb4]", H: "~@3 eb4 gb4 f4 eb4@2",
  I: "~@4 [gb2,bb2,db3,gb3,db4]@3 [gb2,bb2,db3,gb3,db4]", J: "[gb2,bb2,db3,gb3,db4]@3 db4 gb4 f4 eb4@2",
  K: "f4@3 f4 f4@3 f4", L: "[f4@3 ~ [db3,ab3,db4,f4]@3 f4@3 ~@6]/2", M: "f4@3 ~ [db3,ab3,db4,f4]@3 f4",
  N: "[f4@3 f4 f4@3 f4@2 ~@7]/2",
})).s("gm_acoustic_guitar_steel").gain(0.29).pan(1)

// chords · electric guitar clean · "Rhthym Guitar Clean & Dist"
const electric_guitar_clean = note(`<
  ~@24 A@2 B C D@2 E F@7 G H@8 ~@9 I@6 E J K@7 L@8 ~@33 M N O@4 P@8 Q@3 ~@55
>`.pickRestart({
  A: "[[db4,f4,ab4,db5]@9 ~@7]/2", B: "[b3,eb4,gb4,b4]@7 ~", C: "db5@3 gb4@3 ~@2",
  D: "[gb4@4 ~@3 gb4, gb3@5 gb3@3, db4@9 db4@4 db4@3, ~@8 gb4@3 gb4@3 ~@2]/2",
  E: "[db3,ab3,db4,f4]@2 [db3,ab3,db4,f4]@5 [db3,ab3,db4,f4]", // Db
  F: "[[db3,f4]@8 ~@10 db3 f4 gb4 f4 eb4 ~@8 eb4 ~@23 gb3, ab3@10 ab3@4 ab3@2 db4@3 ~@4 db4@4 db4@5 eb4@15 gb3@2 db4 gb3@5 ~, db4@9 db4@4 db4@2 f4@4 ~@7 eb3@4 eb3@10 ab3@2 db4 ab3@13, ~@8 db3@9 ab3@2 ~@5 b2@9 db4 b2@3 gb3 b2@15 eb4@3, ~@11 eb4@8 ~@6 gb3@4 gb3@6 db4@4 gb3@6 db4@3 eb4@3 db4@3 db4@2]/7", // Db
  G: "db3 db4 ab3 gb3@2 db4 gb3 [ab3,db4,gb4]", H: "[~ db4 ab3@2 [ab3,db4,f4]@60, ~ db3 ~@14]/8",
  I: "[[ab4,db5]@9 ~@7 [b3,eb4,gb4,b4]@7 ~ db5@3 gb4@3 ~@2 gb4@8 ~@6 gb4@2, f4, db4@16 gb3@5 gb3@3, ~@32 db4@9 db4@4 db4@3, ~@40 gb4@3 gb4@3 ~@2]/6", // Db5 B
  J: "[db3,ab3,db4,f4]", // Db
  K: "[~@10 db3 ~ gb4 ~ eb4 ~@8 eb4 ~@23 gb3 db3 ~@2 gb3@2 ~ gb3 [ab3,db4,gb4], db3@9 ab3@16 db4 b2 db4@2 gb3 b2@13 db4@2 eb4@3 ~@8, ~ db4@4 db4@2 f4@4 f4@2 f4@43, ~@2 ab3@4 ab3@2 db4@7 db4@2 gb3 eb3 db4@2 gb3@3 eb4@13 db4@2 gb3 eb4 db4 gb3@4 db4@3 db4@4 db4@2 ~, ~@3 eb4@8 ~@5 b2@6 eb3@9 gb3 ab3@2 db4 ab3@15 ab3@5 ~]/7", // Dbsus4
  L: "[~ ab3 [ab3,f4]@30, ~ db3 ~@14]/8", M: "eb2 gb3 bb3 eb4 bb3 gb3 eb3 gb3", N: "eb3 gb3 b3 gb4 b3 gb3 eb3 gb3",
  O: "[d3 ~ bb3 ~ bb3 ~ d3 ~ ab2 eb3 ~ eb4 b3 ~ gb2 f2 eb2 gb3 bb3 eb4 bb3 gb3 eb3 gb3 eb3 gb3 b3 gb4 b3 gb3 eb3 gb3, ~ ab3@4 ab3@2 ab3@3 ab3@3 ab3@19, ~@3 f4@29]/4",
  P: "[d3 ~ bb3 ~ bb3 ~ d3 ~ ab2 eb3 ~ eb4 b3 ~ gb2 f2 eb2 gb3 bb3 eb4 bb3 gb3 eb3 gb3 eb3 gb3 b3 gb4 b3 gb3 eb3 gb3 d3 ~ bb3 ~ bb3 ~ d3 ~ ab2 eb3 ~ eb4 b3 ~ gb2 f2 eb2 gb3 bb3 eb4 bb3 gb3 eb3 gb3 eb3 gb3 b3 gb4 b3 gb3 eb3 gb3, ~ ab3@4 ab3@2 ab3@3 ab3@3 ab3@20 ab3@4 ab3@2 ab3@3 ab3@3 ab3@19, ~@3 f4@61]/8",
  Q: "[d3 ~ bb3 ~ bb3 ~ d3 ~ ab2 eb3 ~ eb4 b3 ~ eb3 ~ ab2 eb3 ~ eb4 b3 ~ gb2 f2, ~ ab3@4 ab3@2 ab3@3 ab3@3 ab3@2 ab3@7 ~@2]/3",
})).s("gm_electric_guitar_clean").gain(0.28).pan(1)

// other · distortion guitar · "Lead Guitar Fill"
const distortion_guitar_2 = note("<~@94 A@2 ~@30 B C D ~@2 E ~@3 F ~@21 G ~@13 H ~@12>".pickRestart({
  A: "[~ ab5@15]/2", B: "~@14 d4 eb4", C: "gb4@2 eb4 f4 ab4@2 b4@2 d5 bb4 b4 d5 eb5@2 d5 eb5",
  D: "f5@2 eb5 f5 gb5 f5@2 db5 f5 d5 eb5@2 db5 eb5 db5@2", E: "~@3 b4", F: "~@10 db5 ~@3 db5@2", G: "bb4 ~@3",
  H: "~@2 eb5@3 ~@3",
})).s("gm_distortion_guitar").gain(0.64).pan(0)

// other · distortion guitar · "Lead Guitar Fill" · soft notes
const distortion_guitar_soft = note("<~@182 A@2>".pickRestart({
  A: "[~@9 gb4@2 ~@5, ~@3 eb3 eb4 ~@3, ~@7 bb3@2 ~@7]/2",
})).s("gm_distortion_guitar").gain(0.32).pan(0)

// other · guitar harmonics
const guitar_harmonics = note("<~@148 [~@4 f3!2 ~@10] ~ [~@6 db4 ~] ~@33>").s("gm_guitar_harmonics").gain(0.16).pan(0)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@7 A B C D E F G H@2 I J K L M N O P Q R S T U V W X Q R S Y Z AA AB AC AD AE AF AG AH AI AJ AK Q AL AM AN Z AO W AP
  Q R S T U V W X Q R S Y Z AA AB AC AD AE AF AG AH AI AJ AK Q AL AM AQ Z N W P W AR AS AT Z N W AU AV AW I AX AV AY I
  AZ AV BA I BB AV BC BD BE BF BG BH BI BF BG BH BI BF BG BH BI BF BG BH BJ BK BL BM BN BO BL BM BN BO BL BM BN BO BL BM
  BN BO BP BQ BR BS BP BQ BR BS BP BQ BR BT BU BV BW BX BY BZ BN BO CA CB BN BO CC CD BN CE CF CG CH CI CJ@3 ~@4
>`.pickRestart({
  A: "~@7 ab2", B: "db3@3 f3@2 db3 f3 gb3", C: "ab3@3 ~ bb3@2 ab3@2 gb3@2 f3@2 db3@2 db2@2", D: "b2@5 ~ gb3@7 ~ b2@2",
  E: "e3 eb3 b2 e3@2 eb3 b2 db2", F: "gb2@5 ~@2 db3", G: "gb3@5 ~@2 db3",
  H: "[gb3@2 f3@2 db3@2 gb3@4 f3@2 db3@6 ~@11 db2@3]/2", I: "db2@5 ~ db2@2 db2@5 ~ db2@2",
  J: "db2@5 ~ db2@2 f2@2 ab2@2 f2@2 ab1@2", K: "b1@5 ~ b1@2 b1@5 ~ b1@2", L: "b1@5 ~ b1@2 e2@2 eb2@2 db2@2 bb1@2",
  M: "gb1@5 ~ gb1@2 gb1@5 ~ gb1@2", N: "gb1 eb1 e2 f2 gb2 ab1 b1 c2", O: "db2@3 ~ ab1@2 db2@2 db2@5 ~ db2@2",
  P: "eb2 ab2 ab1 db2 gb2@2 f2@2", Q: "db2@4 ~@2 db2@2 db2@5 ~ db2@2", R: "db2@2 ~ db2 db2@2 ab1 bb1",
  S: "b1@2 ~ b1 b1@2 ab1 b1", T: "b1!2 ab1 b1 b1@2 bb1 ab1", U: "gb1@2 ~ gb1 gb1@2 eb1 gb1",
  V: "gb1@2 ~ gb1!2 gb2 ab1!2", W: "db2@2 ab1 db2 db2@2 ~ db2", X: "db2 db3 ab1 db2 gb2@2 f2@2",
  Y: "b1 eb1!3 e1!2 f1!2", Z: "gb1@2 eb1 gb1 gb1@2 eb1 gb1", AA: "gb1@2 eb1 gb1!2 eb1 b1 c2",
  AB: "db2@4 ~@2 db2@2 db2@4 ab1@2 b2 c3", AC: "db3@2 db3!2 db3@2 db3!2 db3@2 eb1@2 e2@4",
  AD: "ab1@2 ~ ab1@2 ab1!2 bb1", AE: "b1@4 ~@2 b1@5 ~ b1@2 ab1@2", AF: "db2@2 ~ db2 db2@2 ~ db2",
  AG: "db2@2 ~ db2 ab2 gb2 f2 db2", AH: "ab1@4 ~@2 ab1@5 ~ ab1@2 bb1@2", AI: "b1@4 ~@2 b1@5 ~ b1@2 b1 c2",
  AJ: "db2@4 ~@2 db2@2 db2@5 ~ b2 c3", AK: "db3!5 eb1 eb2@2", AL: "db2@2 ~ db2!2 db3 db2 ab1",
  AM: "b1@2 ~ b1 b1@2 ~ b1", AN: "b1@2 b2@3 ~ ab1@2 b1@2 b2@3 ~ ab1@2", AO: "gb1 eb1 f1 ab1 b1 ab1 c2 ab2",
  AP: "db2@2 db3@3 ~ db2@2 gb2@4 f2@4", AQ: "b1 eb2!3 e2!2 f2 eb1", AR: "db2@5 ~ db2@2 db2@4 ab1@2 bb1@2",
  AS: "b1@2 ab1 b1 b1@2 ab1 b1", AT: "b1@2 ab1 b1!2 bb1 ab1!2", AU: "ab1@2 db3!2 db3@2 db3!2 db3@2 db3@2 db3@2 eb1@2",
  AV: "ab1@5 ~ ab1@5 ~ ab1@2 bb1@2", AW: "b1@5 ~ b1@5 ~ b1@2 ab1@2", AX: "db2 db3!3 ab2 gb2 f2 db2",
  AY: "b1@5 ~ b1@5 ~ b1@2 b1 c2", AZ: "db2 eb1 f1 eb1 gb1 eb1 g1 eb1", BA: "b1@5 ~ b1@5 ~ b1@2 ab1!2",
  BB: "db2 db3 db2!2 db3 db2 db3 ab1", BC: "b1@5 ~ b1@4 b1@2 b1@2 ab1@2", BD: "db2!8", BE: "db2!5 ab1 d2@2",
  BF: "eb1@4 eb2@2 eb2@5 ~ eb1@2 eb1@2", BG: "b1@4 b1@2 b2@7 ~ ab1@2", BH: "bb1@4 bb1@2 bb2@7 ~ eb1@2",
  BI: "ab1@2 ab1 ab2@2 eb1 gb1 f1", BJ: "ab1@4 ab1@2 ab1@2 ab1@2 ab1@2 ab1@2 gb2 g2", BK: "ab2!5 gb2 eb2 db2",
  BL: "eb1@2 eb1 eb2@2 eb1!2 f1", BM: "gb1@2 gb1 gb2@2 gb1!2 eb1", BN: "ab1@2 eb1 ab1@2 ab1!2 eb1",
  BO: "b1!4 db2@2 gb1@2", BP: "eb1 ~@2 eb1 ~@3 f1", BQ: "gb1 ~@2 gb1 ~@4", BR: "ab1 ~@2 ab1 ~@4",
  BS: "~ b1!3 db2@2 gb1@2", BT: "b1!4 db2@2 gb1!2", BU: "eb1@2 eb1!5 f1", BV: "gb1@2 gb1!5 eb1", BW: "ab1!6 eb1!2",
  BX: "eb3@2 eb3@2 eb3 db2 ab1 gb1", BY: "eb1@5 ~ eb2@4 eb1@2 eb1@2 f1@2", BZ: "gb1@4 gb1@2 gb2@5 ~ gb1@2 eb1@2",
  CA: "eb1@4 eb1@2 eb2@4 eb1@2 eb1@2 f1!2", CB: "gb1@2 gb1 gb2@2 eb1!3", CC: "eb1@4 eb1@2 eb3@4 eb1@2 eb1@2 f1!2",
  CD: "gb1@2 gb1 gb2@2 gb2!2 eb1", CE: "eb2@2 ~ db2@2 bb1@2 ~ a1@2 ~ ab1@2 gb1@2 ~",
  CF: "eb1@4 eb1!2 eb2@4 eb1@2 eb1@2 f1@2", CG: "gb1@2 gb1 gb2@2 bb2 gb1 eb1", CH: "ab1@7 ~", CI: "b1@7 ~ db2@7 ~",
  CJ: "eb1/3",
})).s("gm_electric_bass_finger").gain(0.52)

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

// drums · rim
const rim = s("rim").struct("<~@145 [~ x ~ x]!9 [~ x ~@2]!3 ~@27>").gain(0.32)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@14 A B ~@94 A B ~@15 C D ~@55>".pickRestart({
  A: "x!8", B: "x!2 ~@6", C: "~ x!7", D: "x",
})).gain(0.32)

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@24 A@7 B A@7 C ~@16 A@7 B A@7 D ~@106 E F D ~@3>".pickRestart({
  A: "x!4", B: "x ~@3 x!2 ~@10", C: "x ~@2 x!4 ~@9", D: "x", E: "~@12 x!4", F: "x!16",
})).gain(0.32)

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

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@9 A ~ A ~ A ~ B ~@72 A ~@95>".pickRestart({
  A: "x", B: "x!9 ~@7",
})).gain(0.24)

// drums · ride bell
// … 18 more lines

More by Guns N' Roses