Strudelify

Thorn Within

Metallica

KeyA majorTempo116 bpm
0:00/0:00
// Thorn Within — Metallica
// 116 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 168 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar 2 (Distorted).
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 · distortion guitar · "Guitar 1 (Distorted)"
const distortion_guitar = note(`<
  A B@20 C@2 D C@2 D C@2 D E@2 F ~@19 C@2 D C@2 D C@2 D C@2 D G H I@4 F ~@19 C@2 D C@2 D C@2 D C@2 D G H I@2 J@2 G H G H
  K@2 L M N O P Q R@2 S@2 T U V W C@2 D C@2 D C@2 D C@2 D G X C@8 Y Z Y AA Y Z Y AA Y Z Y AA Y Z Y AA AB@2
>`.pickRestart({
  A: "~@5 e3 [g3,d4] e3", B: "[[g3,d4] [a3,e4]@12 e3 [g3,d4] e3]/2",
  C: "[f#3@2 c#4@3 ~ f#3@2 c4@3 ~ f#3@2 b3@4 f#3@2 a#3@3 ~ f#3@2 a3@3 ~ f#3 e3]/2",
  D: "[f#3,c#4]@2 [f#3,c#4]@2 [f#3,c#4]!2 e3@2 [g3,d4]@3 ~ [f#3,c#4]@2 e3@2", // F#5 G5 F#5
  E: "[f#3@2 c#4@3 ~ f#3@2 c4@3 ~ f#3@2 b3@17 ~]/2", F: "[e3,b3,e4]@15 ~",
  G: "[g3,d4]@2 [g3,d4]@2 ~@2 [g4,d5,g5]@2 [g4,d5,g5]@3 ~ [g3,d4]@2 [g3,d4]@2", // G5
  H: "~@2 [g4,d5,g5]@2 [g4,d5,g5]@3 ~ [g3,d4]@2 e3@2 [g3,d4]@2 e3@2", // G5
  I: "[[g3,d4]@2 [a3,e4]@3 ~ [g4,d5]@4 [g4,d#5]@3 ~ [g4,d5]@4 [g4,c5]@3 ~ [e4,a4]@4 e3@2 [g3,d4]@2 e3@2]/2", // G5 A5 G5 Cm G5 C5 A5 G5
  J: "[[g3,d4]@2 [a3,e4]@3 ~ [g4,d5]@4 [g4,d#5]@3 ~ [g4,d5]@4 [g4,c5]@3 ~ [e4,a4]@4 e3@2 [a3,e4]@2 [g#3,d#4]@2]/2", // G5 A5 G5 Cm G5 C5 A5 G#5
  K: "[g#5@11 ~ [c5,e5]@6 a4@5 ~ g4@2 a4@2 c5@2 d5@2]/2", L: "b5@3 a5@2 [d5,f#5]@3 b4@3 d5@2 f#5@3", M: "f#5@7 ~",
  N: "f#5@4 f#5@2 e5@2 d5@3 c#5@2 b4@3", O: "a#4@5 ~ a#4!2 b4@3 c#5@2 d5@3", P: "b4@5 ~ b4!2 c#5@3 d5@2 e5@3",
  Q: "c#5@5 e3 [g3,d4] e3", R: "[[g3,d4] [a3,e4]@12 e3 [a3,e4] e3]/2",
  S: "[[a3,e4]@2 [b3,f#4]@21 ~ e3@2 [b3,f#4]@2 [b3,f#4]@3 ~]/2", T: "[b3,f#4]@2 [g3,d4]@9 ~ [g3,d4]@3 ~",
  U: "[g3,d4]@2 [f#3,c#4]@9 ~ [f#3,c#4]@3 ~", V: "[b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~",
  W: "a3@2 [a3,e4,a4]@2 [a3,e4,a4]@2 [a3,e4,a4]@2 [a3,e4,a4]@2 [a3,e4,a4]@2 e4@3 ~", // A5
  X: "~@2 [g4,d5,g5]@2 [g4,d5,g5]@3 ~ [g3,d4]!8", // G5
  Y: "[f#3,c#4,f#4]@2 [f#3,c#4,f#4]@2 [f#3,c#4,f#4]!2 [f#3,c#4,f#4]@2 [f#3,c#4,f#4]@2 [f#3,c#4,f#4]!2 [f#3,c#4,f#4]@2 [f#3,c#4,f#4]@2", // F#5
  Z: "[f#3,c#4,f#4]!2 [f#3,c#4,f#4]@2 [e4,a4]@2 [f#4,b4]@2 [f#4,b4]@4 [e4,a4]@2 [f#4,b4]@2", // F#5 A5 B5 A5 B5
  AA: "[f#3,b3,e4]@2 [f#3,c#4,f#4]@5 ~ [e4,a4]@7 ~", AB: "[[f#3,c#4,f#4]@31 ~]/2",
})).s("gm_distortion_guitar").gain(0.11).pan(0)

// chords · distortion guitar · "Guitar 2 (Distorted)"
const distortion_guitar_2 = note(`<
  ~@5 A@16 ~@10 B C@6 ~@10 D E F G ~@18 H@4 ~@38 I@2 J@2 K L M N ~@4 D E O P ~@22 Q@2 R@2 Q@2 R@2 Q@2 R@2 Q@2 R@2 ~@2
>`.pickRestart({
  A: "[~@6 [g4,d5]@4 [g4,d#5]@3 ~ [g4,d5]@12 ~@6]/2", B: "~@14 e3!2", C: "[~@8 [a#3,a#4]@5 ~ [a3,a4]@81 ~]/6",
  D: "~@8 [b3,b4]@7 ~", E: "[a#3,a#4]@7 ~ [c#4,c#5]@7 ~", F: "[b3,b4]@7 ~ [d4,d5]@7 ~", G: "[c#4,c#5]@7 ~ [e4,e5]@7 ~",
  H: "[~@8 [a#3,a#4]@5 ~ [a3,a4]@13 ~ [b4,e5]@35 ~]/4", I: "[[g3,d4] [a3,e4]@12 e3 [a3,e4] e3]/2",
  J: "[[a3,e4]@2 [b3,f#4]@21 ~ e3@2 [b3,f#4]@2 [b3,f#4]@3 ~]/2", K: "b3@2 [g3,d4]@9 ~ [g3,d4]@3 ~",
  L: "[g3,d4]@2 [f#3,c#4]@9 ~ [f#3,c#4]@3 ~", M: "f#4@3 ~ [b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~",
  N: "[f#3,f#4]@5 ~@3", O: "~@8 [d4,d5]@7 ~", P: "[c#4,c#5]@7 ~@9",
  Q: "[~@8 c4@3 ~@3 b3@4 ~@2 a#3@3 ~@3 a3@3 ~@2 e3]/2", R: "[~@8 c4@3 ~@3 b3@4 ~@2 a#3@3 ~ f#3@2 a3@3 ~ f#3 e3]/2",
})).s("gm_distortion_guitar").gain(0.11).pan(1)

// chords · distortion guitar · "Guitar 3 (Distorted)"
const distortion_guitar_3 = note(`<
  ~@9 A@12 ~@22 B C@2 D@2 E F G H ~@29 B C@2 D@2 E F G H ~@52 I@2 J@2 I@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 L@2 R S T@2
>`.pickRestart({
  A: "[[g3,d4]@2 [a3,e4]@3 ~ [g4,d5]@4 [g4,d#5]@3 ~ [g4,d5]@4 [g4,c5]@3 ~ [e4,a4]@4 e3@2 [g3,d4]@2 e3@2]/2", // G5 A5 G5 Cm G5 C5 A5 G5
  B: "~@5 e3 [g3,d4] e3", C: "[[g3,d4] [a3,e4]@12 e3 [a3,e4] e3]/2",
  D: "[[a3,e4]@2 [b3,f#4]@21 ~ e3@2 [b3,f#4]@2 [b3,f#4]@3 ~]/2", E: "[b3,f#4]@2 [g3,d4]@9 ~ [g3,d4]@3 ~",
  F: "[g3,d4]@2 [f#3,c#4]@9 ~ [f#3,c#4]@3 ~", G: "[b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~ [b3,f#4,b4]@3 ~",
  H: "a3@2 [a3,e4,a4]@2 [a3,e4,a4]@2 [a3,e4,a4]@2 [a3,e4,a4]@2 [a3,e4,a4]@2 e4@3 ~", // A5
  I: "[f#4@2 [a4,c#5]@3 ~ f#4@2 [b4,d#5]@3 ~ f#4@2 [a4,c#5]@4 f#4@2 [a4,c#5]@2 [b4,d#5]@2 [b4,d#5]@4 [a4,c#5]@3 ~]/2", // A B A B A
  J: "[f#4@2 [a4,c#5]@3 ~ f#4@2 [b4,d#5]@3 ~ f#4@2 a4@17 ~, ~@7 c#5@2 ~@7]/2", // A B
  K: "[f#4@2 c#5@3 ~ f#4@2 [b4,d#5]@3 ~ f#4@2 [a4,c#5]@4 f#4@2 [b4,d#5]@2 [a4,c#5]@2 a4@3 ~ f#4@2 e4@2]/2", // B A B A
  L: "[f#5@2 a5@3 ~ f#5@2 [b5,d#6]@3 ~ f#5@2 a5@4 f#5@2 a5@2 [b5,d#6]@2 [b5,d#6]@4 a5@2 b5@2]/2", // B
  M: "[f#5@2 a5@3 ~ f#5@2 [b5,d#6]@3 ~ f#5@2 a5@11 b5 ~ a5 b5@3 ~]/2", // B
  N: "[f#5@2 a5@3 ~ f#5@2 [b5,d#6]@3 ~ f#5@2 a5@4 f#5@2 a5@2 [b5,d#6]@2 [b5,d#6]@4 a5@2 [b5,d#6]@2]/2", // B
  O: "[[b5,d#6]@4 a5@2 [b5,d#6]@2 [b5,d#6]@3 ~ f#5@2 [a5,c#6]@4 a5 b5 a5 f#5 a5@2 ~@2 a5@2 ~@2 a5@2]/2", // B A
  P: "[f#5@2 a5@3 ~ f#5@2 [b5,d#6]@3 ~ f#5@2 a5@4 f#5@2 a5@2 ~@6 a5@2 b5@2]/2", // B
  Q: "[f#5@2 ~@2 a5@2 b5@2 ~@2 b5@2 ~@2 b5@4 a5@2 b5@4 a5@2 b5@2 a5@3 ~]/2",
  R: "b5!2 a5 [b5,d#6]@2 a5 [b5,d#6] a5, d#6 ~@3", S: "b5!5 a5 f#5 a5", T: "[a5@31 ~]/2",
})).s("gm_distortion_guitar").gain(0.22)

// chords · acoustic guitar steel · "Guitar 4 (Clean)"
const acoustic_guitar_steel = note(`<
  ~@36 A@2 B@2 C D E F G@2 B@2 H ~@25 A@2 B@2 C D E F G@2 B@2 H ~@33 G@2 B@2 H ~@43
>`.pickRestart({
  A: "[a2@3 ~ e3@3 ~ e4@3 ~ b3@14 c3@2 d3@2 ~@2]/2",
  B: "[[e3,a3]@2 [f#3,b3]@17 ~@3 [b3,f#4]@4 [c4,g4]@2 [b3,f#4]@3 ~]/2", // A5 B5 C5 B5
  C: "[g3,b3,e4]@3 ~ b3@2 e4@7 ~ [f#3,a#3,c#4,e4]@2", D: "~@2 [f#3,a#3,c#4,e4]@13 ~", E: "f#3@3 ~ b3@3 ~ f#4@7 ~",
  F: "[f#3,a#3,c#4]@15 ~", G: "[a2@3 ~ e3@3 ~ e4@3 ~ b3@14 c3@2 d3@2 c3@2]/2", H: "[g3,b3,e4]@7 ~@9",
})).s("gm_acoustic_guitar_steel").gain(0.72).pan(0)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@21 A@2 B A@2 B A@2 B C@2 D ~@3 E@2 F@2 G H I J E@2 F@2 K L M N A@2 B A@2 B A@2 B A@2 B O P Q@4 R@2 ~@2 E@2 F@2 G H I
  J E@2 F@2 K L M N A@2 B A@2 B A@2 B A@2 B O P S@2 T@2 O P O P U@2 V@2 K L M W U@2 V@2 K L M N A@2 B A@2 B A@2 B A@2 B
  O X A@24 Y@2
>`.pickRestart({
  A: "[f#1@2 c#2@3 ~ f#1@2 c2@3 ~ f#1@2 b1@4 f#1@2 a#1@3 ~ f#1@2 a1@3 ~ f#1 e1]/2",
  B: "f#1@2 f#1@2 f#1!2 e1@2 g1@3 ~ f#1@2 e1@2", C: "[f#1@2 c#2@3 ~ f#1@2 c2@3 ~ f#1@2 b1@17 ~]/2", D: "e1@15 ~",
  E: "[a1@23 ~@3 c2@2 d2@2 ~@2]/2", F: "[a1@2 b1@17 ~@3 f#2@4 g2@2 f#2@3 ~]/2", G: "g1@7 ~ g1@3 ~ g1@2 f#1@2",
  H: "~@2 f#1@13 ~", I: "b1@15 ~", J: "f#1@15 ~", K: "b1@2 g1@9 ~ g1@3 ~", L: "g1@2 f#1@9 ~ f#1@3 ~",
  M: "b1@3 ~ b1@3 ~ b1@3 ~ b1@3 ~", N: "a1@2 a1@2 a1@2 a1@2 a1@2 a1@2 e1@3 ~", O: "g1@2 g1@2 ~@2 g1@2 g1@3 ~ g1@2 g1@2",
  P: "~@2 g1@2 g1@3 ~ g1@2 e1@2 g1@2 e1@2", Q: "[g1 a1@12 e1 g#1 e1]/2", R: "[e1@31 ~]/2", S: "[g1 a1@12 e1 g1 e1]/2",
  T: "[g1 a1@12 e1 a1 g#1]/2", U: "[g1 a1@12 e1 a1 e1]/2", V: "[a1@2 b1@21 ~ e1@2 b1@2 b1@3 ~]/2", W: "f#1@5 e1 g1 e1",
  X: "~@2 g1@2 g1@3 ~ g1!8", Y: "[f#1@31 ~]/2",
})).s("gm_electric_bass_finger").gain(0.72)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A ~ A ~ A ~ A@7 B C B@3 D E@9 F G ~@18 C H E@12 I J B@3 K ~@18 C H E@12 I J E@3 K I J I J B@3 L B M B K B@3 N O M
  H@2 E@12 I@2 E@23 P Q ~
>`.pickRestart({
  A: "~@3 x", B: "~ x", C: "x!2", D: "~@8 x!2 ~@6", E: "~ x ~ x", F: "~@4 x ~@7 x ~ x!2", G: "x ~ x!3 ~@3", H: "x!4",
  I: "~ x!3", J: "x ~@3 x ~@3 x!2 ~@2 x!2 ~@2", K: "x!2 ~@6", L: "x!2 ~@4 x ~", M: "~@2 x!2", N: "~@2 x!6",
  O: "x!2 ~@2", P: "x!9 ~@3 x ~@3", Q: "x",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~ A@14 ~@5 B ~@10 C D@18 E ~@18 C D@18 E ~@18 C ~@11 C ~@48>".pickRestart({
  A: "~ x ~@2", B: "~@14 x!2", C: "~@6 x!2", D: "~@2 x!2 ~@2 x ~", E: "~ x ~@3 x ~@2",
})).gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!15 ~@151 x ~>").gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@20 A ~@10 B ~@37 C ~@37 C ~@11 C ~@48>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~ x ~@3 x ~@2", C: "~@4 x!2 ~@2",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@21 A@10 ~@21 A@12 B C A@3 ~@21 A@12 B C@4 ~ B C B C A@7 ~ A@3 D A@16 B@2 A@23 ~ D ~
>`.pickRestart({
  A: "x!4", B: "~ x!7", C: "x!8", D: "x",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<~@20 A ~@48 B ~@37 B ~@11 B ~@48>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@2 x!2 ~@4",
})).gain(0.72)

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

stack(
  distortion_guitar, distortion_guitar_2, distortion_guitar_3, acoustic_guitar_steel, bass, kick, snare, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash
)

More by Metallica