Strudelify

Houses of the Holy

Led Zeppelin

KeyA majorTempo120 bpm
0:00/0:00
// Houses of the Holy — Led Zeppelin
// 120 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.

// chords · overdriven guitar
const overdriven_guitar = note(`<
  A@4 B@2 C D@5 E@6 F@2 G H I D@5 J@4 K L@2 M@2 N H I O@5 E@6 F@2 G H I D@5 J@4 K L@2 M@2 N H I P@8 Q@3 R@2 S@2 T P@8 U
  K V@2 W@2 V@4 X@2 V@4 Y@2 X@2 V@4 Y@2
>`.pickRestart({
  A: "[~ c4 c#4 a3 [a3,e4,a4]!2 ~ c4 c#4 a3 [a3,e4,a4]!2 ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  B: "[~@2 c4@2 c#4@2 a3@2 [a3,e4,a4]@2 [a3,e4,a4]@2 ~@2 c4@2 c#4@2 a3@2 [a3,e4,a4]@2 [a3,e4,a4]@2 ~@2 [e4,a4,c#5,f#5]@2 ~ [e4,a4,c#5,f#5]@2 [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  C: "[e4,a4,c#5,f#5] c4 c#4 a3 [a3,e4,a4]!2 ~ [c4,e4], ~ e4@3 ~@4", // F#m7 A5 C
  D: "[c#4 a3 [a3,e4,a4]!2 ~ [e4,a4,c#5,f#5] ~ [e4,g#4,b4,f#5]@6 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5]]/5", // A5 F#m7 E D G D A E …
  E: "[~ [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5]@2 c4 c#4 a3 [e4,a4,c#5]!2 ~ c4 c#4 a3 [e4,a4,c#5]!2 ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~@11 e4 ~ e4 ~@2]/6", // E D G D A E D G …
  F: "[~@2 c4@2 c#4@2 a3@2 [e4,a4,c#5]@2 [e4,a4,c#5]@2 ~@2 c4@2 c#4@2 a3@2 [e4,a4,c#5]@2 b4 c#5 b4 a4 b4 a4 b4 a4 f#4 e4, ~ e4@3 ~@3 e4@3 ~@6]/2", // A
  G: "a3 c4 c#4 a3 [e4,a4,c#5]!2 ~ c4", // A
  H: "c#4@2 a3@2 [e4,a4,c#5]@2 [e4,a4,c#5]@2 ~@2 [e4,a4,c#5,f#5]@2 ~ [e4,a4,c#5,f#5]@2 [e4,a4,c#5,f#5]", // A F#m7
  I: "[e4,a4,c#5,f#5] c4 c#4 a3 [e4,a4,c#5]!2 ~ [c4,e4]", // F#m7 A C
  J: "[~ [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]]/4", // E D G D A E D G …
  K: "~ [e3,b3,e4,g#4,b4]!4 c4 c#4 a3", // E
  L: "[~ c4 c#4 a3 [e4,a4,c#5]!2 ~ c4 c#4 a3 [e4,a4,c#5]!2 ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A F#m7
  M: "[~@2 c4@2 c#4@2 a3@2 [e4,a4,c#5]@2 [e4,a4,c#5]@2 ~@2 c4@2 c#4@2 a3@2 b4@2 c#5 f#5 e5 c#5 b4 a4 f#4 b4 a4 f#4, ~ e4@3 ~@3 e4@3 ~@6]/2", // A
  N: "a4 c4 c#4 a3 [e4,a4,c#5]!2 ~ c4", // A
  O: "[c#4 a3 [e4,a4,c#5]!2 ~ [e4,a4,c#5,f#5] ~ [e4,g#4,b4,f#5]@6 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5]]/5", // A F#m7 E D G D A E …
  P: "[c#4 a3 [e4,a4,c#5]!2 ~ [e4,a4,c#5,f#5] ~ [e4,g#4,b4,f#5]@6 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5,e5]@2 [e4,g#4,b4] [e4,g#4,b4]@3 c#4 e4 [d4,a4,d5,f#5]]/8", // A F#m7 E D G D A E …
  Q: "[~ [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5]@2 c4 c#4 a3 [e4,a4,c#5]!2 ~ c4 c#4 a3 [e4,a4,c#5]!2 ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~@3 e4 ~ e4 ~@2]/3", // D G D A F#m7
  R: "[~@2 c4@2 c#4@2 a3@2 [e4,a4,c#5]@2 [e4,a4,c#5]@2 ~@2 c4@2 c#4@2 a3@2 b4 c#5 b4 a4 b4 a4 b4 a4 f#4 b4 a4 f#4, ~ e4@3 ~@3 e4@3 ~@6]/2", // A
  S: "[a4@2 c4@2 c#4@2 a3@2 [e4,a4,c#5]@2 [e4,a4,c#5]@2 ~@2 c4@2 c#4@2 a3@2 [a3,e4,a4]@2 [a3,e4,a4]@2 ~@2 [e5,a5,c#6,f#6]@2 ~ [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6], ~ e4@3 ~@3 e4@3 ~@6]/2", // A A5 F#m7
  T: "[e5,a5,c#6,f#6] c4 c#4 a3 [e4,a4,c#5]!2 ~ [c4,e4], ~ e4@3 ~@4", // F#m7 A C
  U: "~ [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [e4,a4,c#5]", // D G D A
  V: "[~ c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [a3,e4] [a3,e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  W: "[~ c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [e4,a4]!2 ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  X: "[[e4,a4,c#5,f#5] c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [a3,e4] [a3,e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~@7 e4@3 ~@6]/2", // F#m7 A5 F#m7
  Y: "[~@2 c4@2 c#4@2 a3@2 [e4,a4]@2 [e4,a4]@2 ~@2 c4@2 c#4@2 a3@2 ~@2 [e4,a4]@2 ~@2 [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6] [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
})).s("gm_overdriven_guitar").gain(0.64).pan(0)

// bass · electric bass finger
const bass = note(`<
  ~ A B C D E D F@8 G@2 C D H D I D J@8 K L D C D M D N O F@8 G@2 C D H D I D J@8 K L D C D M D N O J@8 G@2 C D P D Q R
  J@8 K L B S D T D U R V R W D X R Y D Z R W D X R Y D Z
>`.pickRestart({
  A: "~@5 a2 ~ a2", B: "~ c3 c#3 a2 a3!2 ~ c3", C: "c#3 a2 a3!2 ~ a2 ~ a2", D: "~ c3 c#3 ~ a3!2 ~ c3",
  E: "c#3 ~ a3!2 ~ a2 ~ a2",
  F: "[c#3 a2 a3!2 ~ a2 ~ e2@2 e2 e2@2 e2 c#3 e3 d3@2 d3@2 g3@2 d3@2 a2@2 e2!4 c#3 e3 d3@2 d3@2 g3@2 d3@2 a2@2 e2!4 c#3 e3 d3@2 d3@2 g3@2 d3@2 a2@2 e2!4 c#3 e3 g3]/8",
  G: "[~ d3@2 g3@2 d3@2 a2@2 c3 c#3 a2 a3!2 ~ c3]/2", H: "c#3 ~ a3!2 ~ f#2 g2 a2", I: "c#3 ~ a3!2 ~ f#2 ~ a2",
  J: "[c#3 a2 a3!2 ~ a2 ~ e2@2 e2 e2@2 e2 c#3 e3 d3@2 d3@2 g3@2 d3@2 a2@2 e2!4 c#3 e3 d3@2 d3@2 g3@2 d3@2 a2@2 e2!4 c#3 e3 d3@2 d3@2 g3@2 d3@2 a2@2 e2!4 c#3 e3 d3]/8",
  K: "~ d3@2 g3@2 d3@2 a2", L: "~ e2!4 c3 c#3 a2", M: "c#3 a2 c#3 a2 ~ a2 f#2 a2",
  N: "c#3@2 a2@2 a3@2 a3@2 ~@2 g2@2 ~ a2@2 a2", O: "a2 c3 c#3 ~ [a3,d4]!2 ~ c3", P: "c#3 a2 a3!2 ~ f#2 g2 a2",
  Q: "c#3@2 a2@2 f#2@2 a2@2 ~@2 f#2@2 ~ a2@2 a2", R: "a2 c3 c#3 ~ a3!2 ~ c3", S: "c#3 a2 f#2 a2 ~ a3 ~ a3",
  T: "c#3 a3!3 ~ f#3 ~ a2", U: "c#3@2 a2@2 a2@2 a2@2 ~@2 f#2@2 ~ a2@3", V: "c#3@2 a2@2 a3@2 a3@2 ~@2 a2@2 ~@2 a2!2",
  W: "c#3 a2 f#2 a2 ~ g3 ~ a2", X: "c#3@2 a2@2 f#2@2 a2@2 ~@2 f#2@2 ~ a2@3", Y: "c#3 a2 f#2 a2 ~ a2 ~ a2",
  Z: "c#3@2 a2@2 ~@3 a2 f#2@2 g2@4 a2@2",
})).s("gm_electric_bass_finger").gain(0.57).pan(0)

// chords · accordion
const accordion = note("<~@101 A@2 B@4 C@2 B@4 D@2 C@2 ~@6>".pickRestart({
  A: "[~ c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [e4,a4]!2 ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  B: "[~ c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [a3,e4] [a3,e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  C: "[[e4,a4,c#5,f#5] c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [a3,e4] [a3,e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~@7 e4@3 ~@6]/2", // F#m7 A5 F#m7
  D: "[~@2 c4@2 c#4@2 a3@2 [e4,a4]@2 [e4,a4]@2 ~@2 c4@2 c#4@2 a3@2 ~@2 [e4,a4]@2 ~@2 [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6] [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
})).s("gm_accordion").gain(0.1).pan(0)

// chords · accordion · soft notes
const accordion_soft = note("<~@117 A@4 B@2>".pickRestart({
  A: "[~ c4 c#4 a3 [e4,a4]!2 ~ c4 c#4 a3 [a3,e4] [a3,e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5] ~ [e4,a4,c#5,f#5], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
  B: "[~@2 c4@2 c#4@2 a3@2 [e4,a4]@2 [e4,a4]@2 ~@2 c4@2 c#4@2 a3@2 ~@2 [e4,a4]@2 ~@2 [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6] [e5,a5,c#6,f#6]@2 [e5,a5,c#6,f#6], ~ e4@3 ~@3 e4@3 ~@6]/2", // A5 F#m7
})).s("gm_accordion").gain(0.02).pan(0)

// other · lead 1 square
const lead_1_square = note("<~@106 A@2 B C D E F G H I B C ~@5>".pickRestart({
  A: "[~@7 a3@6 e5@3]/2", B: "e5@4 e5@2 d5 c5 d5 c5!2 d5 c5@2 c5@2", C: "g4@2 g4@2 a4@4 ~@2 d5 e5 a5 g5 e5 d5",
  D: "c5 a4 d5 c5 ~ d5 c5 ~ c5 d5 c5 a4 c5 d5 ~@2", E: "a4 g4@2 c#5 g4@2 g4@2 e4 d4 c4 a3 d4 c4@2 d4",
  F: "c4@2 c4 c#4 a3@2 a3@2 a3@2 c4 c#4 f#4 a4 b4!2", G: "c#5@4 c#5@4 b4 a4@2 b4 a4@2 a4@2",
  H: "b4 a4 ~@4 b4 a4 ~@4 c#5!2 f#5 e5", I: "~@5 e5@3",
})).s("gm_lead_1_square").gain(0.56).pan(0)

// other · lead 1 square · soft notes
const lead_1_square_soft = note(`<
  ~@118
  [c5 a4 d5 c5 ~ d5 c5 ~ c5 d5 c5 a4 c5 d5 ~@2]
  [a4 g4@2 c#5 g4@2 g4@2 e4 d4 c4 a3 d4 c4@2 d4]
  [c4@2 c4 c#4 a3@2 a3@2 a3@2 c4 c#4 f#4 a4 b4!2]
  [c#5@4 c#5@4 b4 a4@2 b4 a4@2 a4@2]
  [b4 a4 ~@4 b4 a4 ~@4 c#5!2 f#5 e5]
>`).s("gm_lead_1_square").gain(0.16).pan(0)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@117
  [~ x ~@2 x ~@3]
  [x ~ x ~@7 x ~@2 x!2 ~]
  [~ x ~@2 x ~@3]
  [x ~ x ~@7 x ~@2 x ~ x]
  [~@4 x!2 ~@2]
  [x ~ x ~@7 x ~@2 x ~ x]
>`).gain(0.16).pan(0)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@117 [~ x ~ x]!5 [~@4 x ~@4 x ~@2 x ~@3]>").gain(0.16).pan(0)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@117 [x!8]!6>").gain(0.24).pan(0)

// drums · low tom
const low_tom = s("lt").struct("<~@98 x ~ x ~@22>").gain(0.64).pan(0)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A ~@6 B ~@8 A ~@15 C A ~@6 B ~@8 A ~@23 B ~@15 B D ~@24>".pickRestart({
  A: "~@5 x ~@2", B: "~@7 x", C: "~@4 x!3 ~", D: "~@5 x!2 ~",
})).gain(0.64).pan(0)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@4 B@2 ~@11 C ~@2 B@2 ~@15 B@2 ~@11 C ~@2 B@2 ~@15 B@2 ~@14 B@2 ~@8 D ~@23
>`.pickRestart({
  A: "~ x ~@2", B: "~@7 x", C: "x", D: "~ x ~@6",
})).gain(0.64).pan(0)

stack(
  overdriven_guitar, bass, accordion, accordion_soft, lead_1_square, lead_1_square_soft, kick, kick_soft, snare,
  snare_soft, hihat, hihat_soft, low_tom, open_hat, crash
)

More by Led Zeppelin