Strudelify

Turn the Page

Metallica

KeyE♭ minorTempo80 bpm
0:00/0:00
// Turn the Page — Metallica
// 80 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 116 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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.

// bass · electric bass finger
const bass = note(`<
  A B@5 C D E F G H I B C D E J K B C L M N M N J O B C B C D E J K B C B C D E J K B C L M N M N J O B C B C D E J K B
  C P@2 Q@2 R S P@2 L M N M N M O B C L M N M N M O B T M N M N J O U O U V W U@2 L M N M N M V X Y@6
>`.pickRestart({
  A: "~@7 eb1", B: "eb2@7 eb1", C: "eb2@7 eb2", D: "db2@3 db2 db2@3 db2", E: "db2@6 db2@2 db2@6 db2 eb2",
  F: "ab1@3 ab1 ab1@3 ab1", G: "ab1@6 ab1@2 ab1@4 ab1 bb1 db2 eb2", H: "eb1@7 eb2", I: "[eb1,eb2]",
  J: "ab1@7 ab1@2 ab1 ab1@6", K: "ab1@7 ab1@2 ab1 ab1@2 ab1 bb1 db2 eb2", L: "db2@7 db2@2 db2 db2@4 db2 eb2",
  M: "eb1@7 eb2 gb2 eb1 ~ eb2 ~@2 db2 eb2, ~@5 eb1@2 ~", N: "db2@7 db2@2 db2 db2@4 db2!2", O: "b1@2 b1 ab1 db2@2 db2@2",
  P: "eb1/2", Q: "db2@3 db2 db2@4", R: "ab1@3 ab1 ab1@4", S: "ab1@6 ab1@2 ab1@6 db2 eb2",
  T: "db2@7 db2@2 db2@3 db2 eb1 db2 eb2", U: "eb1@7 eb1@2 eb1 eb1@2 eb1@2 eb1@2", V: "b1@7 b1@2 b1 b1@2 b1@4",
  W: "db2@7 db2@2 db2 db2@2 db2@4", X: "db2@9 db2@3 db2 db2@3", Y: "[db2@5 eb1@85 ~@6]/6",
})).s("gm_electric_bass_finger").gain(0.79)

// chords · electric guitar clean
const electric_guitar_clean = note("<~ A B A B A B C D E F G@2 ~@103>".pickRestart({
  A: "~ [gb3,bb3,eb4]@6 [gb3,bb3,eb4]@2 [gb3,bb3,eb4] ~@2 eb2 gb2 eb3@2, [eb2,bb2,eb3]@4 ~ [gb3,bb3,eb4]@2 ~", // Ebm Eb5 Ebm
  B: "~@7 [gb3,bb3,eb4]@2 [gb3,bb3,eb4] [gb3,bb3,eb4]@4 ~@2, eb2", // Ebm
  C: "~@4 [ab3,db4]@3 [ab3,eb4]@3 [ab3,db4]@2 ab3@2 db4@2", // Db5 Ab5 Db5
  D: "ab3@4 ~@3 [ab3,db4,f4]@2 [ab3,db4,f4] [ab3,db4]@2 ab3@2 ~@2", // Db Db5
  E: "~@7 [ab3,db4]@2 [ab3,db4] [ab3,c4]@2 ab3@2 [ab3,c4] c4", F: "~@4 [ab3,c4]@3 [ab3,c4]@4 ~@5",
  G: "~@7 [gb3,bb3,eb4]@2 [gb3,bb3,eb4] [gb3,bb3,eb4]@4 ~@2", // Ebm
})).s("gm_electric_guitar_clean").gain(0.39)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@2 A B C ~ D E F@2 G H I ~@5 J H I ~@7 K L ~@5 M N O ~@5 J P Q ~@2 R S ~@2 T U V ~@5 J H I ~@7 W X Y X Y X Y Z ~ W X
  Y X Y X Y Z ~@15 X Y X Y X Y ~@8
>`.pickRestart({
  A: "~@12 [ab4,bb4] gb5@3", B: "f5@6 db5@2 db5@6 ab4 a4", C: "bb4@2 ~ gb4 f4@2 db4@2", D: "~@3 eb4", E: "db4 ~",
  F: "[~@3 ab3@5]/2", G: "~@12 [ab3,bb3] gb4@3", H: "f4@6 db4@2 db4@6 ab3 a3", I: "bb3 ~", J: "~@7 gb4",
  K: "~@3 [bb4,gb5] f5@3 db5", L: "db5 ab4@3 bb4@4", M: "~@7 gb5", N: "f5@7 gb5 f5@4 db5@4", O: "eb5@3 ~",
  P: "f4@7 gb4@5 ab4@4", Q: "bb4", R: "~@14 eb5 db5", S: "eb5", T: "b3 db4",
  U: "bb4 [bb4,eb5]!2 bb4 [bb4,eb5]@2 bb4 [bb4,eb5]@2 bb4 [bb4,eb5]@2 bb4 [bb4,eb5]!2 bb4", // Eb5
  V: "gb5@4 ab5@4 eb5 db5@3 ~@4", W: "~@14 f3 gb3", X: "[f3,db4]@8 ~@4 eb3!3 db3", Y: "eb2@4 eb3@8 ~@2 f3 gb3",
  Z: "b3@6 b3 db4 db4@8",
})).s("gm_overdriven_guitar").gain(0.79)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@13 A B C D E F A B G H G H G I J A B A B C D E F A B A B C D E F A B G H G H G I J A B A B C D E F A B K@2 ~@6 G H G
  H G H J B@2 G H G H G H J A G H G H G I J L J L M N L@2 G H G H G H M O P@6
>`.pickRestart({
  A: "[eb2,bb2,eb3]@7 [eb2,bb2,eb3,gb3]@2 [eb2,bb2,eb3,gb3] eb2@2 eb2 gb2 eb3@2, ~@5 [bb2,eb3,gb3]@2 ~", // Eb5 Ebm
  B: "~@7 [bb2,eb3,gb3]@2 [bb2,eb3,gb3] [bb2,eb3,gb3]@4 ~@2, eb2", // Ebm
  C: "[ab3,db4]@4 [ab3,db4]@3 [ab3,eb4]@3 [ab3,db4]@2 ab3@2 db4@2, db3 ~", // Db5 Ab5 Db5
  D: "[db3,ab3,db4]@7 [ab3,db4,f4]@2 [ab3,db4,f4] ~ db3 [db3,ab3]@4, ~@7 db3@3 [ab3,db4]@2 ~@4", // Db5 Db Db5
  E: "[ab2,eb3,ab3]@7 [ab2,eb3,ab3,db4]@2 [ab2,eb3,ab3,db4] [ab2,eb3,ab3,c4]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3,c4]!2", // Ab5 Absus4 Ab Ab5 Ab
  F: "[ab2,eb3,ab3]@7 [ab2,eb3,ab3,db4]@2 [ab2,eb3,ab3,db4] [ab2,eb3,ab3,c4]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]!2", // Ab5 Absus4 Ab Ab5
  G: "[db3,ab3]@7 [db3,ab3]@2 [db3,ab3] [db3,ab3]@4 [db3,ab3]!2", // Db5
  H: "[eb2,bb2]@7 [eb2,bb2]@2 [eb2,bb2] [eb2,bb2]@4 [eb2,bb2]!2", // Eb5
  I: "[ab2,eb3,ab3]@7 [ab2,eb3,ab3,db4]@2 [ab2,eb3,ab3,db4] [ab2,eb3,ab3,c4]@6", // Ab5 Absus4 Ab
  J: "[b2,gb3] [b2,gb3,b3] [db3,ab3] [db3,ab3,db4]", K: "[eb2,bb2]/2",
  L: "[eb2,bb2,eb3]@7 [eb2,bb2,eb3]@2 [eb2,bb2,eb3] [eb2,bb2,eb3]@2 [eb2,bb2,eb3]@4", // Eb5
  M: "[b2,gb3,b3]@7 [b2,gb3,b3]@2 [b2,gb3,b3] [b2,gb3,b3]@2 [b2,gb3,b3]@4", // B5
  N: "[db3,ab3,db4]@7 [db3,ab3,db4]@2 [db3,ab3,db4] [db3,ab3,db4]@2 [db3,ab3,db4]@4", // Db5
  O: "[db3,ab3,db4]@9 [db3,ab3,db4]@3 [db3,ab3,db4] [db3,ab3,db4]@3", // Db5
  P: "[~@3 eb3@2 [eb2,bb2,eb3]@85 ~@6, [db3,ab3,db4]@5 ~@91]/6", // Eb5 Db5
})).s("gm_overdriven_guitar").gain(0.79)

// other · overdriven guitar
const overdriven_guitar_3 = note("<~@80 A B C D E F G H I J K L M N O ~@6 P Q R S T U V W X@4 ~@3>".pickRestart({
  A: "~@4 db5@8 ~ gb4@2 ab4", B: "eb4@6 db4 eb4 [gb4,bb4] [gb4,bb4]@2 ~@5", C: "~@2 db5@3 ab4@3",
  D: "gb4@6 eb4@4 gb4 ab4!2 gb4 [ab4,db5]@2", E: "[ab4,db5]@4 [ab4,db5]@2 gb4@2 ~ eb4 db4 bb3 gb4@2 bb4@2",
  F: "gb4 eb4@3 gb4 ab4 ~ bb4 ab4@4 ~@2 db4 eb4", G: "gb4 gb4@3 ~@2 db4 eb4 [gb4,bb4]!2 bb3 ~ db4 eb4 gb4 bb4",
  H: "bb4 ab4 eb4@4 gb4!2 ~@2 eb5@2 eb5@2 eb5@2, ~@2 gb4 ~@13", I: "db4@3 db4", J: "~@7 gb4, eb4", K: "db4@3 eb5",
  L: "eb5 ~@3", M: "db4", N: "~ eb4", O: "gb5 ab5", P: "~@14 f5 gb5", Q: "f5@5 db5@3", R: "eb5@14 f5 gb5",
  S: "f5@5 ~ db5 ab4", T: "bb4@8 ~@6 f5 gb5", U: "f5@3 ab5@3 ~ db5", V: "eb5@3 ~", W: "b3",
  X: "[db4@19 gb5@2 f5@8 db5@8 bb4@27]/4",
})).s("gm_overdriven_guitar").gain(0.79)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@20 A ~@8 A ~@7 B ~@16 A ~@24 A ~@30 C ~@5>".pickRestart({
  A: "~@12 x!4", B: "~@13 x!3", C: "~@3 x ~@12",
})).gain(0.79)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@12 B C B C B C D E B C B C B@2 C F G B C B C B@3 H B C B C B@3 H B C B C B@2 C F G B C B C B C D@2 ~@6 A@2 B C B C
  B C@2 F G B C B C B C@2 F B C B C B@2 C F C F C F@3 B C B C B C@2 I ~@6
>`.pickRestart({
  A: "~ x ~ x", B: "~ x!7", C: "x!8", D: "~ x!5 ~ x", E: "x!2 ~ x!2 ~@3", F: "~ x!4 ~@2 x", G: "~@2 x!4 ~@2",
  H: "~ x!4 ~@3", I: "~@5 x ~@2 x ~@2 x ~@4",
})).gain(0.79)

// drums · mid tom
const mid_tom = s("mt").struct("<~@37 [~@11 x!2 ~@3] ~@72 [~@3 x ~@12] ~@5>").gain(0.79)

// drums · open hat
const open_hat = s("oh").struct("<~@28 A ~@24 A ~@24 A ~@8 A ~@7 A ~ A ~ A@3 ~@7 B ~@6>".pickRestart({
  A: "~@5 x!2 ~", B: "~@13 x ~@2",
})).gain(0.79)

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

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@110 [~@13 x ~ x] [x!2 ~ x!3 ~@2 x ~@2 x ~@4] ~@4>").gain(0.39)

stack(
  bass, electric_guitar_clean, overdriven_guitar, overdriven_guitar_2, overdriven_guitar_3, kick, snare, low_tom, hihat,
  mid_tom, open_hat, crash, crash_soft
)

More by Metallica