Strudelify
Wherever I May Roam cover art

1991 · Metallica

Wherever I May Roam

Metallica

KeyG majorTempo128 bpm
0:00/0:00
// Wherever I May Roam — Metallica
// 128 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 21, 4/4 at bar 21, 2/4 at bar 34, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 4 "Guitar 3" distortion guitar (copy of ch 3 "Guitar 2" distortion guitar)
// note: Full arrangement: all 214 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
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.

// other · sitar · "Guitar 1 (Sitar)"
const sitar = note("<A B C@2 A B C@2 A D E@2 ~@202>".pickRestart({
  A: "e2@3 [e3,e4]!2 [f3,f4] [e3,e4]@2", B: "e2@6 [g3,g4]@2 [g3,g4]@2 [a3,a4]@2 [f3,f4]@3 e2",
  C: "[[e3,e4]@3 [e3,e4]!2 [f3,f4] [e3,e4]@10]/2", D: "e2@3 [g3,g4]!2 [a3,a4] [f3,f4]@2, ~@12 [a3,a4] ~@3",
  E: "[[e2,e3,e4]@3 ~]/2", // E
})).s("gm_sitar").gain(0.49)

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

// other · electric guitar clean · "Guitar 4"
const electric_guitar_clean = note("<~@50 A@2 B@2 C@2 B@2 ~@35 D E F G H@2 G@2 I ~@112>".pickRestart({
  A: "e2 b2 e4 b3", B: "a#2 f3 d4 a#3", C: "g2 a#2 d4 a#3", D: "~@2 e2 b2", E: "e4 b3 e2 b2", F: "e4 b3 a#2 f3",
  G: "d4 a#3 a#2 f3", H: "d4 a#3 g2 a#2", I: "d4 a#3 ~@2",
})).s("gm_electric_guitar_clean").gain(0.49)

// other · overdriven guitar · "Guitar 5"
const overdriven_guitar = note(`<
  ~@134 A@2 B C D E F G H I@2 J@3 K L@2 M N O P Q R S@2 ~@24 T U V W X@2 Y Z AA@2 AB AC AD AE AF AG AH AI AJ AK AL AM AN
  AO AP AQ AR AS AT AU AV
>`.pickRestart({
  A: "[~@8 [b4,e5]@6 e4@4 c4 e4 f4@6 f#4 g#4 b4 g#4 b4 g#4]/2", B: "a4 g#4 f4 e4 f#4 e4 c4@2 e5@6 e4@2, ~@2 b4 ~",
  C: "~ c4 e4 e4@5 ~@2 d5@6", D: "d5@8 a5 [g#5,a5] g5 [e5,f5] a5 [g5,a5] g5 [e5,f5]",
  E: "a5 [g5,a5] g5 [e5,f5] a5 [g5,a5] g5 [e5,f5] a5 [g#5,a5] g5 [e5,f5] a5 [g5,a5] g5 [e5,f5]", // Gsus2 Fmaj7 Gsus2 Fmaj7 Amaj7 Fmaj7 Gsus2 Fmaj7
  F: "a5 [g5,a5] g5 [e5,f5] a5 [g5,a5] g5 [e5,f5] d5@3 [b4,c5] d5 b4 d5@2", // Gsus2 Fmaj7 Gsus2 Fmaj7 Cmaj7
  G: "~ [b4,c5] d5 [b4,e5] d5@3 b4 d5 [b4,e5] d5@3 b4 d5 [b4,c5]", H: "c5 b4 a4 g#4 a4@3 g4 d5@8",
  I: "[d5@24 d5@5 b4@3]/2", J: "[d5@20 d#5@2 e5@2 g#5@2 a5@2 a5@2 a5@4 g#5 [e5,f5] e5@8 e5@2 f5 e5]/3",
  K: "b4@10 [d4,g4,b4]!2 [d4,g4,b4]@2 [d4,g4,b4]@2", L: "[[d4,g4,b4] [f4,a#4,d5] ~ [f4,a#4,d5] [f4,a#4,d5]@28]/2",
  M: "[a#4,d5]!2 [g4,b4] [g#4,c5]", N: "[a4,c#5]!4 [b4,d#5]!4 [c5,f5]!4 [c5,e5,a5]!4", O: "[d5,f#5,b5]@3 [d5,f#5,b5]@5",
  P: "d6@2 d6@5 [b4,d5]", Q: "b5 g#5 e5!2 b5 g#5 e5!2 b5 g#5 [e5,g#5] e5 b5 g#5 [e5,g#5] e5",
  R: "[g#5,b5] g#5 [f5,g#5] f5!2 [f5,g#5] e5!2 f5 e5 d5 e5 d5 c5!3", S: "[c5 c5@31, ~ d5 ~@30]/2",
  T: "g#5@2 g#5 [e5,f5] g#5 [e5,f5] g#5@3 e5 g#5 [e5,f5] g#5@3 [e5,f5]", // Fmaj7
  U: "g#5 [e5,f5] g#5 [g#5,a5] ~ [e5,f5] g#5 [e5,f5] g#5@2 f5 [e5,g#5] ~ [g#5,a5]!2 f5", // Fmaj7 Amaj7 Fmaj7 E Amaj7
  V: "[e5,f5,g#5] f5 e5 [e5,f5] [e5,f5]@2 e5 [d5,e5] f5 e5 d5 e5 d5 c5 a#4 b4", W: "c5 b4 a4 g#4 b4@4 b4@2 a4 g#4 a4@4",
  X: "[d6@3 d6@3 d6@3 d6@3 d5@3 e5]/2", Y: "a5 [g#5,a5] g#5 [e5,f5] g#5@2 f5 e5 a5 [g#5,a5] g#5 [e5,f5] g#5@2 f5 e5",
  Z: "a5 [g#5,a5] g#5 [e5,f5] g#5@2 f5 e5 g#5 [e5,f5] e5@2 e5@2 c5 b4", // Amaj7 Fmaj7
  AA: "c5 b4 a4 g#4 a4@2 a4 b4 c5 b4 a4 g#4 a4@2 a4 b4", AB: "c5 b4 a4 c5 b4 a4 b4 c5!2 b4 a4 b4 a4 g#4 a4 b4",
  AC: "d5!4", AD: "g#5!8 a5!8", AE: "b5!8 d6!7 [a5,d6]", AF: "d6!4", AG: "d6 d6@3",
  AH: "g#4 a4 b4 g#4 a4 e5 g#4 a4 b4 g#4 a4 e5 g#4 a4 b4 g#4",
  AI: "a4 g#4 a4 e5 g#4 a4 b4 g#4 a4 e5 g#4 a4 b4 g#4 ~ a4", AJ: "e5 g#4 a4 b4!2 a4 a4@2 g#4 a4 b4 g#4 a4 g#4 e4@2",
  AK: "e5@4 e5@2 g#4 a4 e5@4 e5@2 g#4 a4", AL: "e5@2 g#4 a4 b4@2 g#4 a4 e5@2 g#4 a4 b4@2 g#4 a4",
  AM: "e5@2 g#4 a4 b4@2 a4 b4 d5@4 d5@2 e5 f5", AN: "g#5@2 f5@2 e5@2 d5@2 e5 [e5,f5] d5 e5 d5 c5 b4 c5",
  AO: "c5 b4 [g#4,a4] a4 c5 b4 a4 g#4 c5 b4 a4 g#4 a4 b4 e5@2", AP: "g4@2 e4 d4 g4@4 c5 b4 a4 g#4 a4@2 g4@2",
  AQ: "c5 b4 a4 g#4 a4@2 g4@2 c5 b4 a4 g#4 a4@2 g4@2", AR: "c5 b4 a4 g#4 a4@2 c5@2 c5 b4 a4 g#4 a4@2 b4@2",
  AS: "a4 c5 e5 a4 c5 e5@2 a4 c5 e5 a4 c5 e5@2 f5@2", AT: "f5@2 e5@2 f5 e5 ~ e5 f5 e5 ~ e5 f5 e5 ~ f5",
  AU: "[f5,g#5] e5 f#5 g#5 g#5@2 g#5 a5 b5 g#5 c6 a5 c#6 a#5 d6@2", AV: "d6@2 d6!2 d6@4",
})).s("gm_overdriven_guitar").gain(0.49)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~@11 A B@2 C@2 D E F@3 G H I J K H L M N O I J P Q R S T U V W X Y Z AA AB AC AD AA AE Y Z AA AB AF AG AH AI AJ AK AL
  AM AN AO AP H AQ AR AS AT AU AF AV AW AX H AN AW AY AZ AN BA U BB BC BD BE BF BG BH BI BJ BG BK BE BF BG BL BM BN BO
  AI BP BQ BR M BS AO BT H BU AR BV AT BW BX BY H BZ H CA H CB CC CD AO BT H BU AR BV AT CE CF@2 H I J K H L M P CG CH
  CI CJ CK CL CM CN AJ AK AL AZ AN CO AO CP H CQ AR@2 AT CR CS CT CU CV CW CX AZ AY AZ AN CY AY AZ AN CY AY AZ AN CY AY
  AZ AN CY AY AZ AN CY AY AZ AN CY AY AZ AN CY AY AZ AN CY AY AZ AN CY AY AZ AN CY AY AZ
>`.pickRestart({
  A: "~@5 e2@3", B: "[e1,e2]/2", C: "e1/2", D: "[e1,e2]", E: "e1", F: "[e1@10 a1 a#1]/3", G: "b1@2 c2@2 [e1,e2] e1!3",
  H: "e1!8", I: "e1!2 f1!2 e1!4", J: "e1!4 a1!2 a#1!2", K: "b1!2 c2!2 [e1,e2] e1!3", L: "g1 a1 f1!2 e1!4",
  M: "e1 f1 e1!2 a1!2 a#1!2", N: "b1!2 c2!2 d2 d#2 e2 f2", O: "e1@2 e1!2 [e1,e2]@2 e1@2 e1@2 e1@2 e1@2 e1@2",
  P: "b1!2 c2!2 d2 ~@3", Q: "e1@4 e2@3 e1", R: "e1!2 e2@2", S: "f1@2 f1@5 e1", T: "f1 e1 f1@3 f1 g1 f1, ~@12 f1 ~@3",
  U: "e1@2 e1!2 e1@2 e1!2", V: "e1@2 e1!2 e2@4", W: "f1@2 f1!2 f1@2 f1!2", X: "f1 e1 f1@2 f1@2 f2@2",
  Y: "e1@2 e1@2 e1@2 e1!2", Z: "e1@2 e1@2 e1@2 g1 a1", AA: "a#1@2 a#1!2 a#1@2 a#1!2", AB: "a#1@2 a#1@2 a#1@2 a#1!2",
  AC: "a1@2 a1!2 a1@2 a1!2", AD: "a1@2 a1@2 a1@2 a1!2", AE: "a#1@2 a#1@2 a#1@2 e1!2", AF: "g1@2 g1!2 g1@2 g1!2",
  AG: "g1@2 g1@2 g1@2 g1!2", AH: "a#1@2 a#1!6", AI: "a#1!4", AJ: "a#1!2 b1 c2", AK: "d2 d#2 e2!3 f2 e2@2",
  AL: "e1@2 e1!2 g1 a1 f1!2", AM: "e1@2 e1!3 f1 e1!2", AN: "a1!2 a#1!2 b1!2 c2!2", AO: "f1!8", AP: "f1!5 g1 f1!2",
  AQ: "e1!6 g1 a1", AR: "a#1!8", AS: "a#1!7 e1", AT: "a1@2 a1 g1 a1@2 a1 g1", AU: "a1@2 a1 g1 a1 c2 a1 g1",
  AV: "e1 g1@2 e1 g1!4", AW: "[e1,e2] e1!7", AX: "e1!6 f1!2", AY: "e1!4 g1 a1 f1!2", AZ: "e1!5 f1 e1!2",
  BA: "d2 ~@3 e1@2 e1!2", BB: "e2@4 f1@2 f1!2", BC: "f1@2 f1!3 e1 f1@2", BD: "f1 f2 e1!2", BE: "e1@2 e1!2 e1@2 e1@2",
  BF: "e1@2 g1 a1 a#1@2 a#1!2", BG: "a#1@2 a#1!2 a#1@2 a#1@2", BH: "a#1@2 a#1!2 a1@2 a1!2", BI: "a1@2 a1!2 a1@2 a1@2",
  BJ: "a1@2 a1!2 a#1@2 a#1!2", BK: "a#1@2 e1!2 e1@2 e1@2", BL: "a#1@2 a#1!2 g1@2 g1!2", BM: "g1@2 g1!2 g1@2 g1@2",
  BN: "g1@2 g1!2 a#1@2 a#1!2", BO: "a#1!4 a#1@2 a#1@2", BP: "b1@2 c2@2 d2 d#2 e2!2", BQ: "e2 f2 e2@2 e1@2 e1!2",
  BR: "g1 a1 f1!2 e1@2 e1!2", BS: "b1!2 c2!2 f1!4", BT: "f1 g1 f1!2 e1!4", BU: "e1!2 g1 a1 a#1!4",
  BV: "a#1!3 e1 a1@2 a1 g1", BW: "a1 c2 a1 g1 g1@2 g1!2", BX: "g1@2 g1!2 e1 g1@2 e1", BY: "g1!4 e1!4",
  BZ: "f1!2 e1@2 c2@2 f1@2 e1@2 e1@2 e1@2 e1@2", CA: "f#1 g1 d#2@2 e1!4", CB: "e1 f1 g1 f1 e1!4",
  CC: "e1!4 [e1,e2]!2 e1!2", CD: "f#1 g1 d#2@2 f1!4", CE: "a1 c2 a1 g1 g1@2 g1 e1",
  CF: "[g1@2 g1@2 g1@5 g1 f#1 f1 [e1,e2] e1!3]/2", CG: "e1@2 e1!2 e2@2 e1!2", CH: "e1@2 e1!2 e2@2 g1 a1",
  CI: "a#1@2 a#1@2 a#1@2 a#1 a1", CJ: "a#1 a1 a#1@2 a#1@2 a#1!2", CK: "g1@2 g1@2 g1@2 g1 e1", CL: "g1@2 g1@4 g1 a1",
  CM: "a#1@2 a#1!2 a#1@2 a#1 a1", CN: "a#1 a1 a#1@2 a#1@2 a#1 a1", CO: "d2 ~@3", CP: "f1!6 g1 f1",
  CQ: "e1!2 e1@2 e1 f1 g1 a1", CR: "a1@2 a1 g1 a1 c2 a1 e1", CS: "g1@3 e1 g1@3 e1", CT: "e1 g1!2 e1!2 g1 e1!2",
  CU: "c2@3 a1 c2@3 a1", CV: "c2@2 c2@4 d2 c2", CW: "b1!8", CX: "a#1 a#1@2 a#1@2 e1 g1 f1",
  CY: "d2 d#2 e2!2 e1 f1 e1@2",
})).s("gm_electric_bass_pick").gain(0.49)

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

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@62 A ~@8 B ~@34 C ~@8 D ~@14 E ~@2 F ~@28 G ~@2 H ~@25 F ~@12 I ~@9>".pickRestart({
  A: "~@9 x ~@6", B: "~@11 x!2 ~ x ~", C: "~@2 x!2 ~@2 x!2 ~@8", D: "~@3 x!6 ~@7", E: "~ x ~@6", F: "~@14 x!2",
  G: "~ x ~@2", H: "~@11 x!5", I: "~ x!3 ~@2 x!2 ~@8",
})).gain(0.49)

// drums · open hat
const open_hat = s("oh").struct("<~@183 [x!2 ~ x!3 ~@2] ~@30>").gain(0.49)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@58 A ~@3 B ~@9 C ~@28 D ~@13 B E ~@13 F ~@3 G ~@31 H ~@16 I ~@7 J K A ~ L ~@7 L M ~@9
>`.pickRestart({
  A: "~ x ~@2", B: "~@10 x!4 ~@2", C: "x ~@2 x!3 ~@2", D: "~@3 x", E: "~@4 x!4 ~@8", F: "~@2 x!2 ~@4", G: "x!4 ~@4",
  H: "x!4 ~ x!5 ~@2 x!4", I: "~@14 x!2", J: "x!3 ~", K: "~@2 x ~@2 x!3 ~@2 x ~ x!2 ~@2", L: "x!2 ~@2",
  M: "~@9 x!3 ~@2 x ~",
})).gain(0.49)

// drums · crash
const crash = s("cr").struct(`<
// … 18 more lines

More by Metallica