Strudelify

Candy Store Rock

Led Zeppelin

KeyG majorTempo110 bpm
0:00/0:00
// Candy Store Rock — Led Zeppelin
// 110 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 6 "Electric Guitar III" distortion guitar (copy of ch 3 "Electric Guitar I" distortion guitar); ch 7 "Electric Guitar IV" overdriven guitar (copy of ch 4 "Electric Guitar II" overdriven guitar)
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/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.

// chords · distortion guitar · "Electric Guitar I"
const distortion_guitar = note(`<
  A B C D C D E F E G E F E G H@4 I@6 J@2 H@4 I@6 J@2 H@4 K L M N O@2 P Q H@4 R S R S R S R T I@6 J@2 H@4 R S R S R S R
  S A B U@2 A B U@2 A B U@2 A B U@2 A B U@2 A B U@2 A B V@2
>`.pickRestart({
  A: "f2 f3@2 f3@2 ~ f3@9 ~", B: "f2 f3@2 f3@2 f3 f3@4 f2!2 f3 [e3,f3] c3 [b2,c3]",
  C: "a2@2 [g3,c4]@3 [g3,c4] [d3,g3]@2 [e3,a3]@3 [g4,b4] ~ c#5 a2!2, ~@6 [c5,e5] ~", // C5 G5 A5 G C
  D: "a2@2 [g3,c4]@3 [d3,g3]@3 [e3,a3]@3 [g3,c4]@2 [a3,d4] [g3,c4] a2", // C5 G5 A5 C5 D5 C5
  E: "[e3,a3,c#4]!2 [d3,g3,b3]@2 [e3,a3,c#4]@2 [d3,g3,b3]@2 [e3,a3,c#4]@3 [g3,c4,e4]@3 [a3,d4,f#4]@2", // A G A G A C D
  F: "[e3,a3,c#4]!2 [d3,g3,b3]@2 [e3,a3,c#4]@2 [d3,g3,b3]@2 [e3,a3,c#4]@3 [a3,d4,f#4]@3 [g3,c4,e4]@2", // A G A G A D C
  G: "[e3,a3,c#4]!2 [d3,g3,b3]@2 [e3,a3,c#4]@2 [d3,g3,b3]@2 ~@3 c#5 c#5@2 a4@2, ~@11 e5@3 ~@2", // A G A G
  H: "~@6 [g3,c4,e4]@3 [g3,c4,e4] [f#3,b3,d4]!2 [e3,a3,c#4]!2 [e3,a3,c#4]@2", // C Bm A
  I: "[~@2 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@3 [g3,c4]@3 [a3,d4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3] ~@2 [a3,d4]@3 [g3,c4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@3 [g3,c4]@3 [a3,d4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3] ~@2 [a3,d4,f#4]@3 [g3,c4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@3 [g3,c4]@3 [a3,d4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3] ~@2 c5 c#5@2 a4@2, ~@91 e5@3 ~@2]/6", // G5 A5 G5 A5 C5 D5 G5 A5 …
  J: "[~@2 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@3 [g3,c4]@3 [a3,d4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3] ~@2 b4@2 b4 [e4,a4]@2]/2", // G5 A5 G5 A5 C5 D5 G5 A5 …
  K: "~@2 [b3,d#4]@2 [c4,e4]@9 ~@3, a2 ~@3", L: "~@2 [d4,f#4]@2 [e4,g4]@9 ~@3, a2 ~@3",
  M: "~@2 [g#4,c5]@2 [a4,c5]@9 ~@3, a2 ~@3", N: "~@2 [b4,d#5]@2 [c5,e5]@9 ~@3, a2 ~@3",
  O: "[f#4,b4]@2 [e4,a4] [g4,c5]@2 [e4,a4] [f#4,b4]@2 [e4,a4] [g4,c5]@3 [g3,c4] [f#3,b3] [e3,a3]@2", // B5 A5 C5 A5 B5 A5 C5 B5 …
  P: "~@2 [c4,d4,e4,f#4] [e4,g4] [d4,f#4] [d4,e4,f#4,g4]!3 [e4,g4] [e4,g4]@3 [e4,g4] ~ [d4,f#4] [d#4,g4]", // D7 Em D Em7 Em D D#
  Q: "[d#4,g4]@2 [d4,f#4]@2 c4 d4 c4 a3 d4 a3 c4 d4 c4@2 a3@2", // D# D
  R: "[c#3,f#3,a#3,c#4] [d3,g3,b3,d4]!3 [c#3,f#3,a#3,c#4] [d3,g3,b3,d4]!3 ~ d4 c4 g3 a#3 c4 g3!2", // F# G F# G
  S: "[c#3,f#3,a#3,c#4] [d3,g3,b3,d4] [d3,g3,b3,d4]@2 [c#3,f#3,a#3,c#4] [d3,g3,b3,d4] [d3,g3,b3,d4]@2 ~ [c4,f4]!3 ~ d4 f4 g4, ~@6 [c4,f4] ~", // F# G F# G F5
  T: "[c#3,f#3,a#3,c#4] [d3,g3,b3,d4]!3 [c#3,f#3,a#3,c#4] [d3,g3,b3,d4]!3 ~ f#4!4 g4@3", // F# G F# G
  U: "[~@2 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@3 [g3,c4]@3 [a3,d4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3] ~@2 [a3,d4]@3 [g3,c4]@2]/2", // G5 A5 G5 A5 C5 D5 G5 A5 …
  V: "[~@2 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@3 [g3,c4]@3 [a3,d4]@4 [d3,g3]@2 [e3,a3]@2 [d3,g3]@2 [e3,a3]@2 ~@6]/2", // G5 A5 G5 A5 C5 D5 G5 A5 …
})).s("gm_distortion_guitar").gain(0.44).pan(0.1)

// chords · overdriven guitar · "Electric Guitar II"
const overdriven_guitar = note(`<
  ~@6 A B A B A B A B C@4 A B A B A B A B C@4 A B A B A B A B C@4 A B A B A B A B C@4 D@8 A B A B A B A B C@4 D@8 E F A
  B E F A B E F A B E F A B E F A B E F A B E F A G
>`.pickRestart({
  A: "[e3,a3,c#4]!2 [d3,g3,b3]@2 [e3,a3,c#4]@2 [d3,g3,b3]@2 [e3,a3,c#4]@3 [g3,c4,e4]@3 [a3,d4,f#4]@2", // A G A G A C D
  B: "[e3,a3,c#4]!2 [d3,g3,b3]@2 [e3,a3,c#4]@2 [d3,g3,b3]@2 [e3,a3,c#4]!3 [a3,d4,f#4]@2 [a3,d4,f#4] [g3,c4,e4]!2", // A G A G A D C
  C: "~@2 [a2,e3,a3,c#4]@2 [g3,c4,e4]@2 [g3,c4,e4]@3 [g3,c4,e4] [f#3,b3,d4]!2 [e3,a3,c#4]!2 [e3,a3,c#4]@2", // A C Bm A
  D: "[d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]!3 ~ [d3,g3,b3,d4,g4]!3 ~ [d3,g3,b3,d4,g4]!6", // G
  E: "[f3,a3,c4,f4] [f3,a3,c4,f4]@2 [f3,a3,c4,f4] [f3,a3,c4,f4]@2 [f3,a3,c4,f4]@9 ~", // F
  F: "[f3,a3,c4,f4] [f3,a3,c4,f4]@2 [f3,a3,c4,f4]!3 [f3,a3,c4,f4]@4 [f3,a3,c4,f4]!6", // F
  G: "[e3,a3,c#4]!2 [d3,g3,b3]@2 [e3,a3,c#4]@2 [d3,g3,b3]@2 [e3,a3,c#4]@2 ~@6", // A G A G A
})).s("gm_overdriven_guitar").gain(0.26).pan(0.3)

// bass · fretless bass · "Bass Guitar"
const bass = note(`<
  ~@6 A B A C D B A E F@4 A B A C D B A E F@4 A B A C D B A E F@4 A B A C D B A E F@4 G H G I H I G J A B A C D B A E
  F@4 G H G I H I G J K L M B K L M B K L M B K L M B K L M B K L M B K L M N
>`.pickRestart({
  A: "~@2 g1@2 a1@2 g1@2 a1@3 c2@2 c2 d2@2", B: "~@2 g1@2 a1@2 g1@2 a1@3 d2@2 d2 c2@2",
  C: "~@2 g1@2 a1@2 ~@5 a2@2 a2 a2@2", D: "a1@2 g1@2 a1@2 g1@2 a1@3 c2@2 c2 d2@2", E: "~ g1 a1 ~@5",
  F: "~@2 g1@2 a1@2 c2@3 c2 b1@2 a1@2 g1@2", G: "g1 g1@2 g1 f1 g1 g1@2 ~@8", H: "g1 g1@2 g1 f1 g1!3 ~@8",
  I: "g1 g1@2 g1!2 f1 g1!2 ~@8", J: "g1 g1@2 g1!2 f1 g1!2 ~@4 e1 f1 g1@2", K: "f1 f1@2 c2@2 f2 f2@9 ~",
  L: "~ f2@2 f2@2 c2 f2@5 e2 f2 e2 c2 a1", M: "a1!2 g1@2 a1@2 g1@2 a1@3 c2@2 c2 d2@2", N: "~ g1 a1 g1 a1 ~@3",
})).s("gm_fretless_bass").gain(0.63)

// drums · kick
const kick = s("bd").struct(`<
  ~@6 A@8 B@4 A@8 B@4 A@8 B@4 A@8 B@4 C@3 D@2 C@3 A@8 B@4 C@3 D@2 C@2 E F@2 G@2 F@2 G@2 F@2 G@2 F@2 G@2 F@2 G@2 F@2 G@2
  F@2 G H
>`.pickRestart({
  A: "~@2 x ~ x ~@3 x ~@4 x ~@2", B: "~@2 x ~ x ~@4 x ~ x ~@4", C: "x!2 ~ x ~@2 x!2 ~@2 x!2 ~@4",
  D: "x!2 ~ x ~@2 x!2 ~@2 x!2 ~ x!2 ~", E: "x!2 ~ x ~@2 x!2 ~@8", F: "x!2 ~ x ~ x!2 ~@9",
  G: "~@2 x ~@3 x ~ x ~@2 x ~ x ~@2", H: "x!2 ~ x!2 ~@3",
})).gain(0.63)

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

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

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A ~@7 A@5 ~@7 A@5 ~@7 A@5 ~@7 A@4 ~@8 A ~@7 A@4 ~@8 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@2
>`.pickRestart({
  A: "~ x ~@6", B: "~@3 x ~@4",
})).gain(0.63)

stack(distortion_guitar, overdriven_guitar, bass, kick, snare, open_hat, crash)

More by Led Zeppelin