Strudelify
The Memory Remains cover art

1997 · Reload

The Memory Remains

Metallica

KeyE♭ minorTempo145 bpm
0:00/0:00
// The Memory Remains — Metallica
// 145 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 164 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(145/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 · overdriven guitar · "James Hetfield"
const overdriven_guitar = note(`<
  A@2 B C D E F E F E G H@2 I E F E J E G D E J K F E G L@2 M A B N A@2 B C D E F E F E G O@2 P E F E J E G D E J K F E
  G L@2 M A B N A@2 B Q R S T U V S T U V S T U V S T U V A@2 B N A@2 B N A@2 B N A@2 B C ~@2 W@4 D E F E F E X ~ D E F
  E F E F Q R S T U V S T U V S T U V S T U V Y ~@21
>`.pickRestart({
  A: "[db3,ab3,db4] [eb3,eb4] eb2!2 [eb3,bb3,eb4]@3 [eb3,bb3,eb4]", // Db5 Eb Eb5
  B: "[db3,ab3,db4] [eb3,eb4] eb2!2 ~@2 eb2!2, ~ [eb3,bb3,eb4]", C: "[e2,b2] ~@7", D: "[eb2,bb2]@4 db3 eb3@3",
  E: "db3@2 eb3@2 eb3@4 gb3@2 ab3@2 ab3@3 gb3", F: "eb3@2 eb2@2 db3 eb3@2 eb3", G: "[gb2,db3] gb3 [bb2,f3] gb3",
  H: "[~@24 [eb3,eb4,db5]@2 [eb3,eb4,db5]@2 db5@2 [bb4,b4,c5] [g4,ab4,a4], [eb2,bb2]]/2", // Eb7 Eb5
  I: "[eb2,bb2]@4 db3 eb3@3, gb4 ~@15", J: "ab3@2 eb2@2 db3 eb3@2 eb3", K: "db3 eb3 eb3@2 ab2 bb2 db3@2",
  L: "[~@24 [db4,db5]@2 [db4,db5]@2 [db4,db5]@2 [bb3,b3,c4,db5] [g3,ab3,a3], [eb2,bb2]]/2", // Db Eb5
  M: "[db3,gb3,ab3,db4] [eb3,eb4] eb2!2 [eb3,bb3,eb4]@3 [eb3,bb3,eb4]", // Dbsus4 Eb Eb5
  N: "[ab2,eb3,ab3] [gb2,db3,gb3]@3 [ab2,ab3] [gb2,db3,gb3]@3", // Ab5 Gb5 Ab Gb5
  O: "[~@24 eb3@2 eb3@2 [b2,c3] [db3,d3,eb3] [c3,db3,d3] [a2,bb2,b2], [eb2,bb2]]/2", // Cmaj7 Eb5
  P: "[eb2,bb2]@4 db3 eb3@3, ab2 ~@15", Q: "e3 b3 e4 e3", R: "gb3@2 db4@2 gb4 ab4 gb4@2", S: "eb2@2 bb2@2 eb3@2 bb2 b2",
  T: "bb2@4 f3@4 gb3@4 bb2 b2 ~ bb2", U: "gb2@2 db3@2 gb3@2 bb2 b2", V: "db3 ab3 bb2 f3", W: "[gb2,db3]!8",
  X: "eb2@2 eb2@2 db3 eb3 [e2,b2]!2", Y: "[eb2,bb2] ~@7",
})).s("gm_overdriven_guitar").gain(0.64).pan(0)

// chords · overdriven guitar · "Kirk Hammett"
const overdriven_guitar_2 = note(`<
  ~@3 A B C D C D C E F@2 G C D C H C E B C H I D C E J@2 K@2 L M K@2 L A N O P Q R S T U@2 V C D C H C E B C H I D C E
  J@2 K@2 L M K@2 L W X Y Z AA AB@2 Z AC AD AE AF AG AH@2 AF AI AJ K@2 L M K@2 L M K@2 L M K@2 L A ~@2 AK@2 AL AM B C D
  C D C AN AO AP AQ AR AS R S AT AU AV Y Z AA AB@2 Z AC AD AE AF AG AH@2 AF AI AJ AW ~@21
>`.pickRestart({
  A: "[e2,b2] ~@7", B: "[eb2,bb2]@4 db3 eb3@3", C: "db3@2 eb3@2 eb3@4 gb3@2 ab3@2 ab3@3 gb3",
  D: "eb3@2 eb2@2 db3 eb3@2 eb3", E: "[gb2,db3] [bb2,f3]",
  F: "[[eb2,bb2]@24 eb2@2 [eb2,eb3]@2 [d3,eb3] [b2,c3,db3] [ab2,a2,bb2] [f2,gb2,g2]]/2", // Eb5 Eb Ebmaj7
  G: "[eb2,bb2]@4 db3 eb3@3, e2 ~@15", H: "ab3@2 eb2@2 db3 eb3@2 eb3", I: "db3 eb3 eb3@2 ab2 bb2 db3@2",
  J: "[eb2,bb2]/2", K: "[db3,ab3,db4] [eb3,eb4] eb2!2 [eb3,bb3,eb4]@3 [eb3,bb3,eb4]",
  L: "[db3,ab3,db4] [eb3,eb4] eb2!2 ~@2 eb2!2, ~ [eb3,bb3,eb4]", // Db5 Eb Eb5
  M: "[ab2,eb3,ab3] [gb2,db3,gb3]@3 [ab2,ab3] [gb2,db3,gb3]@3", N: "~ ab4", O: "gb4 eb4@5 db4 eb4",
  P: "gb4 eb4 gb4 ab4 bb4 ab4 gb4 eb4", Q: "gb4 [ab4,db5]", R: "bb4 ab4 gb4 eb4 gb4@2 ab4@2",
  S: "bb4 ab4 gb4 eb4 gb4@2 eb4@2", T: "ab4 bb4 ~ eb5 db5@4 eb5 db5 ~ bb4!2 ab4 ~ gb4",
  U: "[eb4@8 [gb4,bb4]@4 ~@2 [gb4,bb4]@4 [gb4,bb4]@2 [gb4,bb4]@4 [gb4,bb4]@2 [gb4,bb4]@2 [f4,gb4] [d4,eb4,e4] [b3,c4,db4] [ab3,a3,bb3]]/2", // Gb Gbmaj7
  V: "[eb2,bb2]@4 db3 eb3@3, g3 ~@15", W: "e3 b3 e4 e3", X: "gb3 db4 gb4 gb3", Y: "~@4 eb4@2 f4 gb4", Z: "f4@2 gb4 f4",
  AA: "db4", AB: "[[f4,gb4] ab4@3 ab4@4 gb4@2 f4@2 eb4@10 ~@2 eb4@4 f4@2 gb4@2, ~ g4 ~@30]/2", AC: "gb4",
  AD: "ab4@2 ab4@2 bb4 ab4 gb4 f4", AE: "gb4@3 ~ [eb3,eb4]@2 [ab3,f4] [bb3,gb4]", AF: "[ab3,f4]@2 [bb3,gb4] [ab3,f4]",
  AG: "[gb3,db4]", // Gb5
  AH: "[[f4,gb4] ab4@3 [db4,ab4]@4 [b3,gb4]@2 [bb3,f4]@2 [gb3,eb4]@10 ~@2 [gb3,eb4]@4 [ab3,f4]@2 [bb3,gb4]@2, db4 ~@7, ~ g4 ~@30]/2", // Gbmaj7 Db5 B5 Bb5 Ebm Db Ebm
  AI: "[bb3,gb4]", AJ: "[db4,ab4]@2 [db4,ab4]@2 [eb4,bb4] [db4,ab4] [b3,gb4] [bb3,f4]", AK: "[gb2,db3]!8",
  AL: "~ [ab6,a6] ~ [f6,gb6] ~ [d6,eb6] ~ [b5,c6] ~ [ab5,a5] ~ [f5,gb5] ~ [d5,eb5] ~ [b4,c5], [gb2,db3,bb6] [gb2,db3,g6] [gb2,db3,e6] [gb2,db3,db6] [gb2,db3,bb5] [gb2,db3,g5] [gb2,db3,e5] [gb2,db3,db5]", // Amaj7 Gbmaj7 Ebmaj7 Cmaj7 Amaj7 Gbmaj7 Ebmaj7 Cmaj7 …
  AM: "~ [ab4,a4] ~ [f4,gb4] ~ [d4,eb4] ~ [b3,c4] ~ [ab3,a3] ~ [f3,gb3] ~ [d3,eb3] [gb2,db3]@2, [gb2,db3,bb4] [gb2,db3,g4] [gb2,db3,e4] [gb2,db3,db4] [gb2,db3,bb3] [gb2,db3,g3] [gb2,db3,e3] ~", // Amaj7 Gbmaj7 Ebmaj7 Cmaj7 Amaj7 Gbmaj7 Ebmaj7 Gb5 …
  AN: "eb2@2 eb2@2 db3 eb3 [e2,b2]!2", AO: "gb4 ~ gb4 ~ gb4 ~ gb4 ~ gb4@2 gb4@2 gb4@2 gb4@2", AP: "gb4 eb4@3",
  AQ: "gb4@2 ab4@2 bb4@2 ab4 gb4 bb4@8", AR: "ab3!2 ab3@2", AS: "gb3 eb3@3 gb3@4",
  AT: "gb4 ab4 ~ eb5 db5@4 eb5 db5 ~ bb4 ab4!2 ~ gb4", AU: "[e4,b4]", AV: "[gb4,db5]", AW: "[eb2,bb2] ~@7",
})).s("gm_overdriven_guitar").gain(0.64).pan(1)

// bass · electric bass pick · "Jason Newstead"
const bass = note(`<
  ~@3 A B C B D B C E F@2 B C B D B C E B C B D B C E G@2 H@3 I H@3 A B C B D B C E F@2 B C B D B C E B C B D B C E G@2
  H@3 I H@3 J K L M N O L M N O L M N O L M N O H@3 I H@3 I H@3 I H@3 A ~@2 P@3 Q B C B D B C R ~ B C B D B C B J K L M
  N O L M N O L M N O L M N O S ~@21
>`.pickRestart({
  A: "e1 ~@7", B: "eb1@4 db2 eb2@3", C: "db2 eb2 eb2@2 eb1@2 eb2@2", D: "db2 eb2 eb2@2 eb1@2 db2@2", E: "gb1 bb1",
  F: "[eb1@12 eb1!4]/2", G: "[eb1@3 ~]/2", H: "db2 eb2 eb1!2 eb2@2 eb2@2", I: "ab1 gb1@3 ab1 gb1@3", J: "e1 b1 e2 e1",
  K: "gb1 db2 gb2 gb1", L: "~@4 eb2@2 bb1 b1, eb1@3 ~", M: "bb1@4 f1@2 bb1 b1", N: "gb1@4 db2@2 bb1 b1",
  O: "db2@2 db2!2 bb1@2 bb1@2", P: "gb1!8",
  Q: "gb1@2 gb1@2 gb1@2 gb1@2 gb1@2 [gb1,g1] [ab1,a1,bb1] [b1,c2,db2] [bb1,b1,c2] [g1,ab1,a1] [e1,f1,gb1]", // Gmaj7
  R: "eb1@2 eb1@2 eb2@2 e1!2", S: "eb1 ~@7",
})).s("gm_electric_bass_pick").gain(0.64)

// other · guitar harmonics · "James H."
const guitar_harmonics = note(`<
  ~@71 A B C D A B C E A B C D A B C E ~@39 A B C D A B C E A B C D A B C E A B C D A B C E A B C D A B C E ~@6
>`.pickRestart({
  A: "eb4@2 bb4@2 eb5@2 bb4 b4", B: "bb4@4 f5@4 gb5@4 bb4 b4 ~ bb4", C: "gb4@2 db5@2 gb5@2 bb4 b4",
  D: "db5@4 ab5@4 [c5,db5] bb4@3 f5@4, ~@9 b4 ~@6", E: "db5@4 ab5@4 [c5,db5] [bb4,b4] db5@2 bb4@4",
})).s("gm_guitar_harmonics").gain(0.64)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@28 A ~@76 B@3 ~@25 C D ~@5 E@2 ~@22>".pickRestart({
  A: "~@7 x", B: "x!8", C: "~@15 x", D: "x", E: "x!4 ~@4",
})).gain(0.64)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A B@5 C ~@2 A B@5 C A B@5 C ~@2 A B@2 C A B@2 ~ A B@2 D B@2 C ~@2 A B@5 C A B@5 C ~@2 A B@2 C A B@2 E ~@17 A B@2 C
  B@3 C@2 F@2 C D@3 ~@15 A B@2 D A ~ G A B ~@38
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "~ x ~ x", D: "x!2 ~@2", E: "~ x!2 ~", F: "x!2 ~ x", G: "x!3 ~",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@28 [~@3 x] ~@41 [~ x] ~@62 [~@5 x ~ x ~@3 x ~@4] ~@30>").gain(0.64)

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

// drums · ride
const ride = s("rd").struct("<~@71 A B@3 C B@3 C B@4 D E ~@40 A D F B@3 G ~ H B@3 C@3 G ~@22>".pickRestart({
  A: "~ x!3", B: "x!4", C: "x!2 ~ x", D: "x!3 ~", E: "~ x ~ x", F: "~@2 x!2", G: "x!2 ~@2", H: "~@3 x",
})).gain(0.64)

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

More by Metallica