Strudelify
Thunderstruck cover art

1990 · The Razors Edge

Thunderstruck

AC DC

KeyB majorTempo134 bpm
0:00/0:00
// Thunderstruck — AC DC
// 134 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 163 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(134/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 · piano
const piano = note("<~@5 A@8 ~@4 B@6 C@7 ~@85 D@8 ~@40>".pickRestart({
  A: "[~ d4@31]/8", B: "[~@12 d4@23 ~@9 d4@23 ~@10 d4@19]/6", C: "[~@13 d4@22 ~@10 d4@22 ~@11 d4@21 ~@13]/7",
  D: "[~@12 d4@23 ~@10 d4@23 ~@9 d4@22 ~@9 d4@20]/8",
})).s("gm_piano").gain(0.06)

// bass · electric bass finger
const bass = note(`<
  ~@21 A B@61 C ~ D ~ D ~ D ~ E F G F G F G F H B@7 I F J F J F J F H B@9 K F G F G F G F L M L M L M L M G F G F G F G
  F G F G F G F G F N@6
>`.pickRestart({
  A: "~@4 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~", B: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  C: "b1 ~ b1 ~ b1@4 a1@4 e1@3 ~, ~@12 a1 ~@3", D: "a1@3 ~ b1@4 a1@4 e1@3 ~, ~@12 a1 ~@3", E: "~@2 b1!3 a1!3",
  F: "e1 f#1 a1!3 e1!3", G: "e1!2 b1!3 a1!3", H: "e1@2 e1@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  I: "b1 ~ b1 ~ e1@2 e1@2 e1@2 b1@2 b1@2 b1@2", J: "e1!5 b1!3", K: "b1 ~ b1 ~ b1@2 b1@2 b1@2 a1@2 a1@2 a1@2",
  L: "e1!2 b1!5 f#1", M: "a1 e1!7", N: "[e1@2 e1@2 b1@36 b1@47 b1@3 ~@6]/6",
})).s("gm_electric_bass_finger").gain(0.48)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@29 A B@53 C ~ D ~ D ~ D ~ E F@6 G@7 H@3 I@6 J@2 ~ K ~ K ~ K ~@3 E F@6 L@2 M@6 N@2 F@14 O@7
>`.pickRestart({
  A: "~@4 [f#3,b3] [f#3,b3]@2 ~ [f#3,b3]@2 ~ [f#3,b3] ~ [f#3,b3]!2 ~", // B5
  B: "[f#3,b3] ~@3 [f#3,b3] [f#3,b3]@2 ~ [f#3,b3]@2 ~ [f#3,b3] ~ [f#3,b3]!2 ~", // B5
  C: "[f#3,b3] ~@3 [f#3,b3]@3 ~ [e3,a3]@3 ~ [b2,e3]@3 ~", D: "[e3,a3]@3 ~ [f#3,b3]@3 ~ [e3,a3]@3 ~ [b2,e3]@3 ~",
  E: "~@2 [f#3,b3]@3 [e3,a3]@3", F: "[e3 f#3 [e3,a3]@3 [b2,e3]@5 [f#3,b3]@3 [e3,a3]@3]/2",
  G: "[e3 f#3 [e3,a3]@3 [b2,e3]@5 [f#3,b3]@16 [f#3,b3]@16 [f#3,b3] [e3,a3] ~ [b2,f#3]@11]/7", // A5 E5 B5 A5 B5
  H: "[~@4 [f#3,b3]@2 [e3,a3]@2 ~@2 [b2,f#3]@25 ~ [b2,e3]@6 [f#3,b3]@4 e3@2]/3", // B5 A5 B5 E5 B5
  I: "[f#3 [e3,a3] [e3,a3]@3 [b2,e3]@5 [b2,e3]@3 [f#3,b3]@2 e3]/2", // A5 E5 B5
  J: "[f#3@2 [e3,a3]@2 [e3,a3]@6 [b2,e3]@10 [f#3,b3]@6 [e3,a3]@3 ~@3]/2", K: "~@4 [f#3,b3]@6 [e3,a3]@3 ~@3",
  L: "[e3 f#3 [e3,a3]@3 [b2,e3]@5 [f#3,b3]@5 f#3]/2", M: "[g#3 ~ [b2,e3]@17 ~ [f#3,b3]@10 f#3@2]/2",
  N: "[g#3 ~ [b2,e3]@17 ~ [f#3,b3]@6 [e3,a3]@6]/2", // E5 B5 A5
  O: "[e3@2 f#3@2 [e3,a3]@6 [b2,e3]@10 [f#3,b3]@36 [f#3,b3]@47 [f#3,b3]@3 ~@6]/7", // A5 E5 B5
})).s("gm_overdriven_guitar").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@17 A B@43 C D E@20 F ~ G ~ G ~ G ~ E@24 A B@7 C H E@32 I ~ A ~@2 J>".pickRestart({
  A: "~ x", B: "x!2", C: "x", D: "~@9 x ~@5 x", E: "~ x ~ x", F: "~ x!3", G: "x!4", H: "~@7 x ~@2 x ~@3 x ~",
  I: "~ x ~@2", J: "~@7 x ~@8",
})).gain(0.71)

// drums · snare
const snare = s("sd").struct("<~@62 A B C@3 D C@15 E ~@7 F C@15 D C@7 E ~@8 G H C@15 D C@15 E ~@5>".pickRestart({
  A: "~@7 x ~@4 x ~@3", B: "~ x ~@6 x ~@7", C: "x!2", D: "x ~ x!2 ~@4 x ~@7", E: "x", F: "~@2 x!2 ~@4 x ~@7",
  G: "~ x ~@2", H: "x!2 ~@6 x ~@7",
})).gain(0.71)

// drums · hihat
const hihat = s("hh").struct("<A B C@60 D E C@19 F ~@7 E C@32 F E C@31 F ~@5>".pickRestart({
  A: "~ x!3", B: "x ~ x!6", C: "x!8", D: "x!3 ~@5", E: "~@2 x!6", F: "x!2 ~@6",
})).gain(0.57)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 A ~@3 A ~@3 A ~@3 A ~@4 B C ~@24 D ~ E ~ E ~ E ~@34 F ~@38
>`.pickRestart({
  A: "~ x!2 ~", B: "~ x", C: "x", D: "~ x!3", E: "x!4", F: "~@7 x ~@2 x ~@3 x ~",
})).gain(0.57)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 A ~@3 A ~@3 A ~@3 A ~@4 B ~@4 C D ~@19 E ~ F ~ F ~ F ~@34 G H ~@37
>`.pickRestart({
  A: "~ x!2 ~", B: "~ x", C: "~@7 x ~@4 x ~@3", D: "~ x ~@14", E: "~ x!3", F: "x!4", G: "~ x ~@2", H: "x!2 ~@14",
})).gain(0.57)

// drums · crash
const crash = s("cr").struct("<~@63 A ~@3 A ~@23 A@9 ~ A ~ A ~ A ~ A@9 ~@9 A@33 ~ B ~@2 C>".pickRestart({
  A: "~ x ~@2", B: "~ x", C: "~@7 x ~@8",
})).gain(0.43)

stack(piano, bass, overdriven_guitar, kick, snare, hihat, low_tom, mid_tom, crash)

More by AC DC