Strudelify

The Frayed Ends of Sanity

Metallica

KeyE minorTempo180 bpm
0:00/0:00
// The Frayed Ends of Sanity — Metallica
// 180 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 25, 4/4 at bar 25) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 2 "Guitar 2" distortion guitar (copy of ch 1 "Guitar 1" distortion guitar)
// note: Full arrangement: all 158 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(180/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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"
const distortion_guitar = note(`<
  A@7 B C@2 B D@2 E F@2 E G@2 E H I@2 J K L K L K L K M K L K L K L K N K L K O K L P Q R S K L K L P Q R S K L T U K L
  T U K L K L V@2 W X V Y W X Z AA AB Z AA AB Z AC AA AB Z AD AB AE AB K L K L K L K O P Q R S K L K L P Q R S K L T U K
  L T U K L K L V@2 W X V Y W X Z AA AB Z AA AB Z AC AA AB Z AD AB AE AB K L K L K L K L AF AG
>`.pickRestart({
  A: "[~@9 [e2,b2,e3]@24 [c3,g3,c4]@24 [e2,b2,e3]@24 [b2,f#3,b3]@6 ~ [b2,f#3,b3]@6 [b2,f#3,b3]@6 [b2,f#3,b3]@6 [e2,b2,e3]@6]/7", // E5 C5 E5 B5 E5
  B: "[a#2,f3,a#3]@6 [e2,b2,e3]@6 [e2,b2] ~@2 [e2,b2]", // A#5 E5
  C: "[[e2,b2] ~ [a#2,f3,a#3]@12 [e2,b2,e3]@6 [e2,b2] ~@2 [e2,b2] ~@2 [e2,b2,e3]@6]/2", // E5 A#5 E5
  D: "[~ [e2,b2] [a#2,f3,a#3]@12 [e2,b2,e3]@6 [e2,b2] ~@2 [e2,b2] ~@2 [e2,b2,e3]@6]/2", // E5 A#5 E5
  E: "~ [a#2,f3,a#3]@6 [e2,b2,e3]@6 [e2,b2] ~@2", // A#5 E5
  F: "[[e2,b2]!2 ~ [a#2,f3,a#3]@12 [e2,b2,e3]@6 [e2,b2] ~@2 [e2,b2] ~@2 [e2,b2,e3]@5]/2", // E5 A#5 E5
  G: "[[e2,b2] ~ [e2,b2] [a#2,f3,a#3]@12 [e2,b2,e3]@6 [e2,b2] ~@2 [e2,b2] ~@2 [e2,b2,e3]@5]/2", // E5 A#5 E5
  H: "[e2,b2] ~ [e2,b2] [a#2,f3,a#3]@12 ~", // E5 A#5
  I: "[[e2,b2,e3]@6 [e2,b2] ~@2 [e2,b2] ~@2 [e2,b2,e3]@6 [a#2,f3,a#3]@6 [e2,b2,e3]@6 [e2,b2] ~]/2", // E5 A#5 E5
  J: "~ [e2,b2]!2 ~ [a#2,f3,a#3]@12", K: "[e2,b2,e3] e2!3 [a#2,f3,a#3] e2 ~ e2",
  L: "[a#2,f3,a#3]@3 e2 [f#2,c#3,f#3] e2!2 [f2,c3,f3]", M: "[a#2,f3,a#3] ~@3 [a#2,f3,a#3]!2 ~ [a#2,f3,a#3]",
  N: "[a#2,f3,a#3]@3 e2 [a#2,f3,a#3]!2 ~ [f2,c3,f3]", O: "[a#2,f3,a#3]!2 ~@2 [a#2,f3,a#3]!2 ~ [f2,c3,f3]",
  P: "[e2,b2,e3]@2 e2!2 [e2,b2,e3]@2 e2!2", Q: "[e2,a#2,e3]@2 e2!2 [e2,a#2,e3]@2 e2!2",
  R: "[e2,a2,e3]@2 e2!2 [e2,a2,e3]@2 e2!2", S: "[g2,e3]@2 e2!2 [g2,e3]@2 e2!2", T: "[b2,f#3,b3] [a#2,f3,a#3]",
  U: "[a2,e3,a3] [g#2,d#3,g#3]", V: "e2!2 [g2,d3]@2 [g2,d3]@2 [a2,e3]@2", W: "e2!2 [g2,d3]@2 [g2,d3]@2 e2!2",
  X: "[g2,d3] [g#2,d#3] [a2,e3] [a#2,f3]", Y: "e2!2 [g2,d3]@2 [g2,d3]@2 [e2,b2]@2", Z: "[e2,b2,e3]",
  AA: "[f#2,c#3,f#3]", AB: "[g2,d3,g3] [g#2,d#3,g#3] [a2,e3,a3] [a#2,f3,a#3]", AC: "[g2,d3,g3]", AD: "[d3,a3,d4]",
  AE: "[c3,g3,c4] [c#3,g#3,c#4] [d3,a3,d4] [d#3,a#3,d#4]", AF: "e3@3 f#3 e3 ~ d3 ~ c#3@2 b2@2 b2@2 d3 b2",
  AG: "~ a2 ~ g2@2 f#2@2 a2@2 b2@2 d3@2 ~@3",
})).s("gm_distortion_guitar").gain(0.34).pan(0.7)

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

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@11 A B ~@4 C D ~@4 E ~@11 F ~@5 G ~@49 H ~@3 A I ~@9 A ~@23 J ~@15 H ~@4 K ~@6
>`.pickRestart({
  A: "~@7 x", B: "x!5 ~@3", C: "~@15 x", D: "~ x ~ x ~ x ~ x ~ x ~@6", E: "~@2 x!6", F: "~@11 x!2 ~@3", G: "~@5 x ~@2",
  H: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", I: "~@4 x!3 ~", J: "~@2 x!2", K: "x ~@3 x!2 ~@2",
})).gain(0.51)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@32 A B@3 C B@2 D A B A ~ A B A B@2 E A B@2 ~ A B F E A B G@2 B D G@2 B D A D H I@3 H I H J H K I H K I H@2 J I H@2
  ~@3 A B D ~ A D B ~ A B@2 E A B A ~ A B F E A B G@2 B@2 G@2 B D B L H I@3 H ~ H J H K I H K I H@2 J I H@2 ~@3 A B D ~
  A B@2 D ~@2
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~ x!3", D: "x!4 ~@4", E: "x ~ x!2 ~@4", F: "x ~ x!2 ~ x ~ x", G: "x!2 ~@2 x!2 ~ x",
  H: "~ x!3", I: "x!4", J: "x!3 ~", K: "~ x!2 ~", L: "x ~@2 x",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~@35 [~@5 x ~@2] ~@115 [~@2 x!2 ~@4] ~@6>").gain(0.51)

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

stack(distortion_guitar, bass, kick, snare, low_tom, mid_tom, open_hat, high_tom, crash)

More by Metallica