Strudelify

Who Made Who

AC DC

KeyC majorTempo120 bpm
0:00/0:00
// Who Made Who — AC DC
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · "Rhythm overdrive gui"
const overdriven_guitar = note(`<
  ~@36 A@2 B C A@2 D@2 ~@4 B E F G ~@9 A@4 H@2 I@4 A@10 D@2 ~@8 A@2 D@2 J K L@2 M N O@3 ~@6
>`.pickRestart({
  A: "[e3 g3@2 c4@2 g3@2 f3@2 g3@2 c4@2 g3@3]/2", B: "e3 g3@2 c4@2 g3@2 f3", C: "~@2 g3@4 c4@3 ~ g3@6",
  D: "[e3@2 g3@4 c4@4 g3@4 f3@4 g3@4 c4@4 g3@5 ~]/2", E: "~ g3@2 c4@2 g3@3", F: "e3 g3@2 c4@2 g3@3", G: "f3 g3 a3 c4@5",
  H: "[e3 g3@2 c4@2 g3@2 e3@2 g3@2 c4@2 g3@3]/2", I: "[f3 g3@2 c4@2 g3@2 f3@2 g3@2 c4@2 g3@3]/2",
  J: "[g1,g2] ~@2 [f1,f2] ~@2 [c1,c2] ~", K: "~@2 [g1,g2]@4 ~@2 [g1,g2]@7 ~",
  L: "[[f1,f2]@5 ~ [c1,c2]@6 [g1,g2]@18 ~@2]/2", M: "[g1,g2]@5 ~ [f1,f2]@5 ~ [c1,c2]@4",
  N: "~@2 [g1,g2]@5 ~ [g1,g2]@7 ~", O: "[[f1,f2]@6 ~ [c1,c2]@7 [g1,g2]@25 ~@9, ~@14 c1 ~@33]/3",
})).s("gm_overdriven_guitar").gain(0.59).pan(0.7)

// bass · overdriven guitar · "more rhythm guitar"
const bass = note(`<
  ~@4 A@8 B@2 C@4 A@4 D A@2 E B@2 C@4 A@10 E A C@3 F A@3 G H I@3 J K L M@2 A@4 B@2 F C@3 A@6 E A@2 E@3 N O P Q R Q R S
  T@4 U V@3 W@5 ~@6
>`.pickRestart({
  A: "~ [c2,c3] ~ [c2,c3]@5", B: "~ [a1,a2] ~ [a1,a2]@5", C: "~ [g1,g2] ~ [g1,g2]@5", D: "~ [c2,c3] ~ [c2,c3]@4 ~",
  E: "~@2 [c2,c3]@3 ~ [c2,c3]@10", F: "~@2 [g1,g2]@3 ~ [g1,g2]@10", G: "~ [c2,c3] ~ [c2,c3]@3 ~@2", H: "~@7 [a1,a2]",
  I: "~@2 [a1,a2]@2 ~@2 [a1,a2]@3 ~ [a1,a2]@2 ~@2 [a1,a2]@2", J: "~@2 [a1,a2]@2 ~@2 [a1,a2]@3 ~ [a1,a2]@4 ~@2",
  K: "[g1,g2]@5 ~ [g1,g2]@4 ~@2 [g1,g2]@4", L: "~@2 [g1,g2]@5 ~ [g1,g2]@6 ~@2", M: "[f1,f2]/2",
  N: "g1@2 ~@2 g1@2 ~@2 g1 ~@3 d2@4, f2@3 e2@3 g1 ~", O: "g1 ~ g1 ~ g1 ~ g1 ~, ~@2 d2@5 ~ d2@8",
  P: "[g1,f2]@2 f2 ~ g1@2 [g1,d2]@2, ~ g1 ~@2, ~@3 e2@3 ~@2", Q: "~ g1!3, g1 ~@3, ~@2 d2@5 ~ d2@8",
  R: "g1 ~ g1 [g1,d2], f2@3 e2@3 ~@2, ~ g1 ~@2", S: "~ g1!3, g1 ~@3, ~ d2@2 ~ d2@4",
  T: "[~@2 [c2,c3]@2 ~@2 [c2,c3]@11 ~ [c2,c3]@2 ~@2 [c2,c3]@10 ~@2 [c2,c3]@3 ~ [c2,c3]@11 ~ [c2,c3]@3 ~ [c2,c3]@10, g1]/4", // C
  U: "g2 ~@5 [f1,f2]@2 ~@4 [c1,c2]@2 ~@2", V: "[~ [g1,g2]@3 g2@3 ~ [f1,f2]@3 [c1,c2]@3 g1@10, ~@4 g1@10 g2@9 ~]/3",
  W: "[g2@6 [f1,f2]@6 [c1,c2]@6 g1@6 g2@6 ~@2 [f1,f2]@6 [c1,c2]@7 [g1,g2]@35, ~@18 g2@4 ~@2 g1@21 ~@35]/5", // F C F C G
})).s("gm_overdriven_guitar").gain(0.46).pan(0.2)

// bass · electric bass finger · "fingered bass"
const bass_2 = note("<A@12 B@2 C@4 A@8 B@2 C@4 A@12 C@4 A@2 ~@60>".pickRestart({
  A: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", B: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  C: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
})).s("gm_electric_bass_finger").gain(0.39)

// bass · oboe · "fingered bass"
const bass_3 = note("<~@50 [c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~] [f1 ~ g1 ~ a1 ~ c2@9 ~] ~@58>")
  .s("gm_electric_bass_finger").gain(0.39)

// bass · soprano sax · "fingered bass"
const bass_4 = note("<~@52 A B C@3 D@2 E@2 F@4 C@2 D@4 F@12 D@8 F@4 G H I@2 J K L@4 ~@5>".pickRestart({
  A: "~@7 a1", B: "~@2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", C: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  D: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", E: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~",
  F: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", G: "d2 ~@5 c2 ~@5 g1 ~@3", H: "~@2 d2@5 ~ d2@7 ~",
  I: "[c2@3 g1@3 d2@9 ~]/2", J: "d2@3 c2@3 g1@2", K: "~@2 d2@5 ~ d2@6 ~@2", L: "[c2@7 g1@4 ~@3 g1@50]/4",
})).s("gm_electric_bass_finger").gain(0.59)

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

// drums · snare
const snare = s("sd").struct("<A@51 B C A@4 D E F@2 A@26 D E D G A@4 H ~@2 I H J ~@9>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@3 x", D: "~@3 x ~@4", E: "~ x ~@4 x ~", F: "x!8", G: "~ x ~@2 x!4",
  H: "x ~@2 x ~@2 x ~", I: "~@2 x!3 ~ x ~ x ~@3 x ~@3", J: "~ x ~@2 x ~@3",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@44 A@4 ~@35 A@4 ~@9 B ~ C ~ D ~@9>".pickRestart({
  A: "x!8", B: "~@10 x!3 ~ x ~", C: "~@10 x ~@2 x ~@2", D: "~@3 x",
})).gain(0.64)

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

// drums · open hat
const open_hat = s("oh").struct("<~@36 [~ x!7] [x!8]!7 ~@31 [~ x!7] [x!8]!7 ~@27>").gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct("<~@98 [~@9 x ~@3 x ~@2] ~ [~@11 x ~@4] ~@9>").gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~@36 A ~@7 A ~@3 B C@2 D E ~@4 F G ~@2 A ~@13 A ~@11 F G F G B C@2 ~@2 G F ~ F H I ~@8
>`.pickRestart({
  A: "x", B: "x ~@2 x", C: "~@3 x", D: "~@3 x ~@4", E: "~@7 x", F: "x ~@2 x ~@2 x ~", G: "~ x ~@2 x ~@3", H: "~ x ~@6",
  I: "x ~@6 x ~@7 x",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<~@44 x ~@55 [~@5 x ~@2] ~@9>").gain(0.56)

stack(overdriven_guitar, bass, bass_2, bass_3, bass_4, kick, snare, low_tom, hihat, open_hat, mid_tom, crash, high_tom)

More by AC DC