Strudelify

Last Caress

Metallica

KeyC majorTempo101 bpm
0:00/0:00
// Last Caress — Metallica
// 101 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "Overdriven Guitar Right" overdriven guitar (copy of ch 1 "Overdriven Guitar Left" overdriven guitar)
// note: Full arrangement: all 37 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(101/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · overdriven guitar · "Overdriven Guitar Left"
const overdriven_guitar = note("<A B C D@4 E F G H I J@2 K@2 E L G H I J@2 K@2 E M I H I J@4 A ~@2>".pickRestart({
  A: "[c3,g3,c4]@12 [f3,c4,f4] ~ [g3,d4,g4] ~", B: "~@12 [f3,c4,f4] ~ [g3,d4,g4] ~", C: "[f3,c4,f4] [d3,a3,d4]",
  D: "[c3,g3,c4]@2 [c3,g3,c4]!10 [f3,c4,f4]@2 [g3,d4,g4]@2", // C5 F5 G5
  E: "[f3,c4,f4]@2 [f3,c4,f4]!2 [f3,c4,f4]@2 [f3,c4,f4]!2 [d3,a3,d4]@2 [d3,a3,d4]!2 [d3,a3,d4]@2 [d3,a3,d4]!2", // F5 D5
  F: "[c3,g3,c4]@2 [c3,g3,c4]!2 [c3,g3,c4]@2 [c3,g3,c4]!10", // C5
  G: "[f2,c3,f3]@2 [f2,c3,f3]!2 [f2,c3,f3]@2 [f2,c3,f3]!2 [g2,d3,g3]@2 [g2,d3,g3]!6", // F5 G5
  H: "[c3,g3]!4 b2!4 [a2,e3]!4 g2!4", // C5 A5
  I: "[f2,c3,f3]@2 [f2,c3,f3]!2 [f2,c3,f3]@2 [f2,c3,f3]!2 [g2,d3,g3]@2 [g2,d3,g3]!2 [g2,d3,g3]@2 [g2,d3,g3]!2", // F5 G5
  J: "[c3,g3,c4]@2 [c3,g3,c4]!6 [f3,c4,f4]!3 [g3,d4,g4]@3 [g3,d4,g4]@2", // C5 F5 G5
  K: "[c3,g3,c4]@2 [c3,g3,c4]!10 [f3,c4,f4] ~ [g3,d4,g4] ~", L: "[c3,g3,c4]@2 [c3,g3,c4]!6 [b2,g3,c4] [c3,g3,c4]!7",
  M: "[c3,g3,c4]@2 [c3,g3,c4]!6 [b2,g3,c4] [c3,g3,c4]!3 [b2,g3,c4] [c3,g3,c4]!3", // C5 Cmaj7 C5 Cmaj7 C5
})).s("gm_overdriven_guitar").gain(0.64).pan(1)

// bass · electric bass finger · "Bass Guitar"
const bass = note("<A@2 B C@4 D E F G H I@2 J@2 K L F G H I@2 M@2 K N O P O Q@4 R ~@2>".pickRestart({
  A: "~@12 f1 ~ g1 ~", B: "f1 d1", C: "c1@2 c1!10 f1@2 g1@2", D: "f1@2 ~ f1 f1@2 f1!2 d1@2 ~ d1 d1@2 d1!2",
  E: "c1@2 ~ c1 c1@2 c1!10", F: "f1@2 ~ f1 f1@2 f1!2 g1@2 ~ g1!5", G: "c2@2 ~ c2 b1@2 ~ a#1 a1@2 ~ a1 g1@2 ~ g1",
  H: "f1@2 ~ f1 f1@3 f1 g1@2 ~ g1!5", I: "c2@2 ~ c2 c2@2 c2!2 f2!3 g2@3 g2@2", J: "c2@2 c2!10 f2 ~ g2 ~",
  K: "f2@2 ~ f2 f2@2 f2!2 d2@2 ~ d2 d2@2 d2!2", L: "c2@2 ~ c2 c2@2 c2!10", M: "c2!12 f2 ~ g2 ~",
  N: "c2!8 b1 c2!3 b1 c2!3", O: "f1@2 ~ f1 f1@2 f1!2 g1@2 ~ g1 g1@2 g1!2", P: "c2!4 b1!4 a1!4 g1!4",
  Q: "c2@2 c2!6 f2!3 g2@3 g2@2", R: "c1@12 f1 ~ g1 ~",
})).s("gm_electric_bass_finger").gain(0.64)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@28 [~@10 x!6] ~@8>").gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<A@2 B ~@7 C ~@8 C ~@8 D ~@5 A ~@2>".pickRestart({
  A: "~@6 x!2", B: "x!2", C: "~@12 x!4", D: "~@6 x!4 ~@6",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@3 A@7 B A@8 C A@8 ~ A@5 ~@3>".pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "x!4 ~@4",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<A@2 B ~@7 C ~@8 C ~@8 D ~@5 A ~@2>".pickRestart({
  A: "~@6 x!2", B: "x!2", C: "~@10 x!2 ~@4", D: "~@2 x!4 ~@10",
})).gain(0.64)

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

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

More by Metallica