Strudelify
Whole Lotta Love cover art

1969 · Led Zeppelin II

Whole Lotta Love

Led Zeppelin

KeyE majorTempo87 bpm
0:00/0:00
// Whole Lotta Love — Led Zeppelin
// 87 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 88 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): MUTED GTR.
setcpm(87/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 · "FINGERDBAS"
const bass = note("<~@2 A B C D E F G H I J K@18 L ~@12 M N O@2 N P D@10 K@4 L ~@6 Q@3 ~ A D@10 R@2 ~>".pickRestart({
  A: "~@20 b1@3 d2@3 b1@2 d2@3 ~", B: "e1@3 ~@3 e1 ~ e1@4 ~@2 e1 ~ e1@4 ~@2 e1 ~ e1@4 ~@2 e1 ~",
  C: "~ e1@4 ~@2 e1 ~ e1@5 ~ e1 ~ e1@2 ~@2 b1@2 d2@3 b1@2 d2@4",
  D: "e1@3 ~@3 e1 ~@2 e1@3 ~@2 e1 ~ e1@2 ~@2 b1@2 d2@4 b1@2 d2@4",
  E: "e1@3 ~@3 e1 ~ e1@4 ~@2 e1 ~ e1@2 ~@2 b1@2 d2@4 ~ b1@2 d2@3",
  F: "~ e1@3 ~@2 e1 ~@2 e1@4 ~ e1 ~ e1@2 ~@3 b1@2 d2@4 ~ d2@4, ~@27 b1@2 ~@3",
  G: "e1@3 ~@3 e1 ~@2 e1@3 ~@2 e1 ~ e1@2 ~@3 b1@2 d2@3 b1@2 d2@3 ~",
  H: "e1@3 ~@3 e1 ~@2 e1@3 ~@2 e1 ~ e1@2 ~@3 b1@2 d2@4 b1@2 d2@3",
  I: "e1@3 ~@3 e1 ~ e1@3 ~@3 e1 ~ e1@2 ~@2 b1@2 d2@4 ~@2 d2@3 ~, ~@27 b1@2 ~@3",
  J: "e1@3 ~@3 e1 ~ e1@3 ~@3 e1 ~ e1 ~@4 b1@2 d2@4 ~ d2@3 ~, ~@27 b1@2 ~@3",
  K: "e1@3 ~@3 e1 ~ e1@3 ~@3 e1 ~ e1@2 ~@2 b1@2 d2@4 b1@2 d2@3 ~", L: "e1@3 ~@13", M: "e1@3 ~@3 e1@2 ~@24",
  N: "e1@3 ~@3 e1@3 ~@23", O: "e1@4 ~@2 e1@3 ~@23", P: "e1@3 ~@3 e1@3 ~@11 b1@3 d2@3 b1@2 d2@3 ~",
  Q: "[~@16 e1@7 ~@6 a1@60 ~@7]/3", R: "[e1@57 ~@7]/2",
})).s("gm_electric_bass_finger").gain(0.57)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A B C B C D@8 E@4 D@9 E@4 F@3 ~@10 G H@2 I@2 J D@10 E@4 F@3 ~@4 K@3 ~ A D@10 F@3
>`.pickRestart({
  A: "~@20 b2@2 d3@4 b2@2 d3@3 ~",
  B: "[e2,b2,e3]@3 ~@3 e2@2 [e2,b2,e3]@3 ~@3 e2 ~ [e2,b2,e3]@3 ~@3 e2 ~ [e2,b2,e3]@3 ~@3 e2 ~", // E5
  C: "[e2,b2,e3]@2 ~@4 e2@2 [e2,b2,e3]@2 ~@2 e2 ~ [e2,b2,e3]@2 [e2,b2,e3]@3 ~ b2@2 d3@4 b2@2 d3@4", // E5
  D: "[e2,b2,e3]@2 ~@4 e2@2 [e2,b2,e3]@2 ~@2 e2 ~ e2@2 [e2,b2,e3]@3 ~ b2@2 d3@4 b2@2 d3@4", // E5
  E: "[e2,b2,e3]@2 ~@4 e2@2 [e2,b2,e3]@2 ~@2 e2 ~ e2@2 [e2,b2,e3] ~ [d3,a3,d4] ~ [a3,d4] ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~ [d3,a3,d4] ~", // E5 D5
  F: "[[e3,b3,e4]@67 ~@29]/3", G: "[e2,b2,e3]@3 ~@3 [e2,b2,e3]@5 ~@21", H: "[e2,b2,e3]@2 ~ [e2,b2,e3]@2 ~@11",
  I: "[e2,b2,e3]@4 ~@2 [e2,b2,e3]@3 ~@23", J: "[e2,b2,e3]@4 ~@2 [e2,b2,e3]@4 ~@10 b2@2 d3@4 b2@2 d3@3 ~",
  K: "[~@16 [e2,b2,e3]@5 ~@8 [a2,e3,a3]@55 ~@12]/3", // E5 A5
})).s("gm_overdriven_guitar").gain(0.54)

// chords · overdriven guitar · "OVERDRIVE" · soft notes
const overdriven_guitar_soft = note("<~ A B A B@9 C@4 B@9 C@4 ~@19 B@10 C@4 ~@12 B@10 ~@3>".pickRestart({
  A: "~@2 e2@2 e2 ~@5 e2@2 e2 ~@5 e2@2 e2 ~@5 e2@2 e2 ~@3", B: "~@2 e2@2 e2 ~@5 e2@2 ~@20",
  C: "~@2 e2@2 e2 ~@5 e2@2 ~@8 d3 ~@11",
})).s("gm_overdriven_guitar").gain(0.31)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note("<~@14 A@2 B@2 ~@9 C B D E@3 ~@27 C B D E@3 ~@19 E@3>".pickRestart({
  A: "~@4 [b3,e4]@13 ~@15, ~@3 e3@13 ~@16", B: "~@2 [e3,b3,e4]@7 ~@7", C: "~@3 [e3,b3,e4]@16 ~@13",
  D: "~@4 [e3,b3,e4]@15 ~@13", E: "[~@3 [e3,b3,e4]@73 ~@20]/3",
})).s("gm_overdriven_guitar").gain(0.36).pan(0.3)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@43 A B C D E@3 ~@38>".pickRestart({
  A: "~@11 b4@3 e5 d5 b4 a#4 ~ a4@2 g4 ~ a4@3 g4 ~ a4@2 g4 ~",
  B: "b4@6 ~@7 d4@2 b3 a3 g3 a3@3 g3 ~ a3 g3 e3 d3 e3@5, ~@6 b3 ~@9", C: "~@10 b4@3 d5@2 ~ e5 ~@2 e5@2 ~ g5 ~@2 e5@7",
  D: "~@9 e5@3 g5 ~@2 b5@5 [e5,g5]@2 ~ c#5 ~ g5@2 e5@5", // Em
  E: "[~@10 e5@2 ~ c#6@2 ~@2 c6@2 ~ b5@2 ~@4 e5 ~ c#5 g5 ~ e5@7 ~ f#5@2 g5@2 ~@2 g#5@2 ~@2 g#5@4 a5@4 b5@2 e5@8 ~@29, ~@25 g5@2 ~@69]/3",
})).s("gm_distortion_guitar").gain(0.64).pan(0.7)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@12 A B C@3 B@10 C D E ~@11 F G H@5 I B@3 J B K L M N K B O C@2 P ~@10 Q B@2 R S B@6 ~@3
>`.pickRestart({
  A: "~@7 x ~ x!3 ~@4", B: "~@2 x ~@4 x", C: "~ x ~@2", D: "~@2 x ~@2 x ~@2", E: "~ x!2 ~", F: "~@15 x",
  G: "x ~ x!5 ~ x!6 ~@18", H: "x ~@2 x ~@12", I: "x ~@2 x ~ x!7 ~ x!2 ~", J: "~@4 x!4 ~@8",
  K: "~@8 x ~@5 x ~ x!3 ~ x!3 ~@9", L: "~@4 x ~@7 x ~ x!2", M: "~ x!5 ~@6 x ~ x ~", N: "~@4 x ~@10 x",
  O: "~@4 x ~@2 x ~@8", P: "x", Q: "x!16", R: "~@4 x ~ x!10", S: "~@16 x!2 ~ x!3 ~ x ~@8",
})).gain(0.64)

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

// drums · low tom
const low_tom = s("lt").struct("<~@12 A ~@16 B ~@12 C ~@9 D ~ E ~ F ~ E ~@19 G ~@9>".pickRestart({
  A: "~@14 x!2", B: "~@5 x ~@2", C: "~@7 x", D: "~@12 x!4", E: "~@28 x!3 ~", F: "~@8 x!4 ~@4", G: "~@24 x!2 ~ x!4 ~",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A ~@29 B ~@9 C ~ D ~ E ~ D ~@2 C@2 ~@15 F ~@9>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@18 x ~@4 x ~ x ~@6", C: "~@8 x!4 ~@4", D: "~@24 x!2 ~ x ~@4", E: "~@6 x!2 ~@8", F: "x!8 ~@8",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@30 [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!19 ~@39>").gain(0.57)

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

// drums · ride
const ride = s("rd").struct("<~@31 A B C D C E D@2 F A B C D C E D@2 F ~@39>".pickRestart({
  A: "~@18 x ~@6 x ~@6", B: "x ~@9 x ~@2 x ~@2 x ~ x ~ x ~@4 x ~@2 x ~@3",
  C: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2 x ~ x ~ x ~ x ~", D: "x!16",
  E: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2 x ~ x ~", F: "x!9 ~@7",
})).gain(0.43)

// drums · bongos
const bongos = s("bongo:18").struct("<~@31 A B C A B C A B C A D ~@46>".pickRestart({
  A: "x ~@6 x ~@8 x ~@6 x ~@7 x", B: "~@7 x ~@8 x ~@7 x ~@7", C: "x ~@6 x ~@7 x ~@8 x ~@7",
  D: "x ~@6 x ~@8 x ~@6 x ~@8",
})).gain(1.13)

// drums · congas
const congas = s("conga:13").struct("<~@31 A B C A B C A B C A@2 ~@46>".pickRestart({
  A: "~@5 x ~@8 x ~@6 x ~@8 x ~", B: "~@5 x ~@8 x ~@7 x ~@3 x ~@3 x ~", C: "~@5 x ~@3 x ~@4 x ~@7 x ~@3 x ~@5",
})).gain(1.14)

// drums · congas
const congas_2 = s("conga:18").struct("<~@31 A B@2 A B@2 A B@2 A@2 ~@46>".pickRestart({
  A: "~@4 x ~@14 x ~@12", B: "~@3 x ~@16 x ~@11",
})).gain(1.14)

// drums · congas
const congas_3 = s("conga:33").struct("<~@31 A B C A B C A B C A@2 ~@46>".pickRestart({
  A: "~@2 x ~@7 x ~@7 x ~@6 x ~@6", B: "~ x ~@8 x ~@7 x ~@13", C: "~ x ~@16 x ~@13",
})).gain(1.14)

stack(
  bass, overdriven_guitar, overdriven_guitar_soft, overdriven_guitar_2, distortion_guitar, kick, snare, hihat, low_tom,
  mid_tom, open_hat, crash, ride, bongos, congas, congas_2, congas_3
)

More by Led Zeppelin