Strudelify

Heartbreak

Led Zeppelin

KeyA majorTempo96 bpm
0:00/0:00
// Heartbreak — Led Zeppelin
// 96 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 3/4 at bar 20, 2/4 at bar 20, 4/4 at bar 21, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 105 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar 2 Double.
setcpm(96/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 · "Guitar 1"
const distortion_guitar = note("<~@19 A B ~@16 C ~@31 D@3 E F G@5 H I@2 J K L M@2 N O P Q@2 ~@9 R ~@3>".pickRestart({
  A: "~@3 g3", B: "e3 ~@3", C: "g3 e3 ~@2",
  D: "[~@22 [f#4,d5]@22 [a2,e3,g3,c#4]@5 ~@2 [a2,f#3,g3,d4]@4 ~ [a2,g3,e4]@5 ~ [a2,g3,a3,f#4]@4 ~@2 [a2,g3,a3,e4]@3 [a2,f#3,g3,d4]@3 ~ [a2,e3,g3,c#4]@5 ~@2 [a2,f#3,g3,d4]@4 ~ [a2,g3,e4]@5 ~ [a2,g3,a3,f#4]@3]/3", // D A7 D A7 D A7 D A7 …
  E: "~@2 [a2,g3,a3,e4]@3 ~ [a2,f#3,g3,d4]@3 ~ [a2,e3,g3,c#4]@5 ~ [a2,f#3,g3,d4]@4 ~@2 [a2,g3,e4]@5 ~ [a2,g3,a3,f#4]@4", // A7 D A7 D A7 D
  F: "~ [a2,g3,a3,e4]@3 ~ [a2,f#3,g3,d4]@3 ~ [a2,e3,g3,c#4]@5 ~ [a2,f#3,g3,d4]@4 ~ [a2,g3,e4]@5 ~@2 [a2,g3,a3,f#4]@4 ~", // A7 D A7 D A7 D
  G: "[[a2,g3,a3,e4]@3 ~ [a2,f#3,g3,d4]@3 [a2,a3,c#4,g4]@31 [a2,a3,c4,f#4]@31 [a2,a3,c#4,g4]@31 [a2,a3,c4,f#4]@30 c#3 a2 c3 c#3 a3!2 ~ f#3 a3!2 ~ c#4 a4!2 f#4 ~ a4@2 a4@9 c5@2 ~]/5", // A7 D A7 F#dim A7 F#dim
  H: "c#5 d5@2 ~ c#5 d5@2 c#5 ~ e5@2 e5@2 ~ e5@6 c5@3 c#5 d5@3 c5 c#5@2 a4 ~",
  I: "[c5@2 c5 ~ c5@2 c5 c5@2 ~ a4@4 g4@8 f#4 a4@2 e5 ~ f#5@3 f#5@4 e5@2 ~ f#5@5 e5@2 ~ f#5@9 [e5,f#5] d5 c5 d5@3 c5 a4 c5 a4]/2", // Esus2
  J: "g4 a4@3 c5 a4 c5 a4 g4 a4@2 c#5 ~ [a4,c5] a4 g4 a4@3 c5 a4 c5 a4 g4 a4@3 c#5 a4 c5 a4 ~", // Am
  K: "b4 a4 f#4 ~ a4 c5 a4 b4 ~ a4 f#4 a4 ~ c5 a4 b4 a4 ~ f#4 a4 c5 ~ a4 b4 a4!2 ~ d5@5",
  L: "~ d5@9 a4 c5 a4 g4 c5@2 a4@2 g4@2 a4@2 a4@2 e5@4 d5 e5@3",
  M: "[~ e5@2 d5@2 a4@2 g4@2 c5 a4@10 e4 ~ e4 a4 a2@6 g2@5 ~ a2@6 c3 c#3 ~ e3 f#3 a3@2 ~ c#4@2 f#4@3 a4@2 a4@7]/2",
  N: "a4@2 c5@6 ~ c5@5 c5@6 c5@12",
  O: "~ b4@4 a4@2 g4@2 e4@2 g4@2 [e4,g4] [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2", // Em
  P: "[e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4] [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2 f#5@2 e5@2 c5@2 f#5@2 e5@2 ~ f#5@2, ~@29 c5@2 ~", // Em
  Q: "[e5@2 c5@2 f#5@2 e5@2 c5@2 f#5@2 e5@2 c5@2 c5 ~@3 g5@2 ~@13 g5@2 e5 ~@26, ~@18 e5@4 e5@3 e5@4 e5@4 e5@4 ~@27, ~@23 g5@4 g5@4 g5@4 ~@29]/2",
  R: "~@2 g3 e3",
})).s("gm_distortion_guitar").gain(0.45)

// chords · overdriven guitar · "Guitar 2"
const overdriven_guitar = note(`<
  A B C B C B C D E B C F G H G H G H I J K L M L N O P L Q R ~ R ~ R ~ R S T U V U W X Y Z AA AB AC AD AE AF ~@20 AG@5
  AH AI@2 AJ AK@3 AL AM AN@3 AO AP AQ@2 G H G H AR H AS AT AU@2 AV AW AX
>`.pickRestart({
  A: "~@3 g#2", B: "a2@4 c3@4 d3@3 d#3 e3 g#2@3", C: "a2!4 c3@4 d3@3 d#3 e3 g#2@3", D: "b2@4 d3@4 e3@3 f3 f#3 a2@3",
  E: "b2!4 d3@4 e3@3 f3 f#3 a2@3", F: "[a2,e3]@8 ~@5 [d3,a3,d4,f#4]@3", G: "[d3,g3,b3,d4] ~@3",
  H: "~@13 [d3,a3,d4,f#4]@3", I: "[d3,g3,b3,d4]@4 ~@9 [d3,a3,d4,f#4]@3",
  J: "[e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,c#4,e4]@4", K: "~@4 a2@4 c3@4 d3@3 d#3",
  L: "e3 g#2@3 a2!4 c3@4 d3@3 d#3", M: "e3 g#2@3 a2@4 c3@4 d3@3 d#3", N: "e3 g#2@3 b2@4 d3@4 e3@3 f3",
  O: "f#3 a2@3 b2!4 d3@4 e3@3 f3", P: "f#3 a2@3 a2@4 c3@4 d3@3 d#3", Q: "e3 g#2@3 [a2,e3]@8 ~@4",
  R: "~ [d3,a3,d4,f#4]@3 [d3,g3,b3,d4]@4 ~@8", // D G
  S: "~ [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3", // D A D A D
  T: "[e3,c#4,e4] ~ c3 d#3", U: "f3@3 f#3 g3 b2@3 c3!4 d#3@4", V: "f3@3 f#3 g3 b2@3 c3@4 d#3@4",
  W: "f3@3 f#3 g3 b2@3 d3@4 f3@4", X: "g3@3 g#3 a3 c3@3 d3!4 f3@4", Y: "g3@3 g#3 a3 c3@3 e3@4 g3@4",
  Z: "a3@3 a#3 b3 d#3@3 e3!4 g3@4", AA: "a3@3 a#3 b3 d#3@3 ~ b3 d4 b3 d4@2 d4 b3",
  AB: "d4@2 d4 b3 d4 e4 e4@2 ~ b3 d4 b3 d4@2 d4 b3", AC: "d4@2 d4 b3 d4 e4 e4@2 [e3,b3]@2 [e3,b3]!6",
  AD: "[e3,b3,e4]!8 [e3,b3,e4,g#4]!8", AE: "[e3,b3,e4,g#4]!16", AF: "[e3,b3,e4,g#4] ~@15",
  AG: "[~@11 a2@31 a2@31 a2@30 a2@6 ~ c3@5 c#3@6 g3 ~ g3@2 e3 f#3@4 e3@4 a2@6 ~ c3@5 c#3@6 g3 g3@3 e3 f#3@3]/5",
  AH: "~ e3@4 a2@6 c3@5 c#3@6 ~ g3 g3@3 e3 f#3@4",
  AI: "[e3@4 a2@6 c3@5 c#3@6 ~ g3 g3@2 e3 ~ f#3@3 e3@4 a2@6 ~ c3@5 c#3@6 g3 ~ g3@2 e3 f#3@4 e3@3]/2",
  AJ: "~ a2@6 c3@5 ~ c#3@6 g3 g3@3 e3 f#3@4 e3@4",
  AK: "[a2@6 c3@5 c#3@6 ~ g3 g3@3 e3 f#3@4 e3@3 a2@6 ~ c3@5 c#3@6 g3 ~ g3@2 e3 ~ f#3@3 e3@4 a2@6 ~ c3@5 c#3@6 g3 g3@3 e3 f#3@4 e3@4 a2@4]/3",
  AL: "~@2 c3@5 c#3@6 ~ g3 g3@3 e3 f#3@4 e3@4 a2@5", AM: "~ c3@5 c#3@6 ~ g3 g3@2 e3 ~ f#3@4 e3@3 a2@6 ~",
  AN: "[c3@5 c#3@6 g3 ~ g3@2 e3 f#3@4 e3@4 [e3,a3,c#4,e4]@6 [d3,g3,b3,d4]@5 ~ [e3,a3,c#4,e4]@6 [g3,c4,e4,g4]@5 [e3,a3,c#4,e4]@4 [d3,g3,b3,d4]@4 [e3,a3,c#4,e4]@6 [d3,g3,b3,d4]@5 [e3,a3,c#4,e4]@6 ~ [g3,c4,e4,g4]@5 [e3,a3,c#4,e4]@4 [d3,g3,b3,d4]@4 [e3,a3,c#4,e4]@6 [d3,g3,b3,d4]@4]/3", // A G A C A G A G …
  AO: "~ [e3,a3,c#4,e4]@6 [g3,c4,e4,g4]@5 ~ [e3,a3,c#4,e4]@3 [d3,g3,b3,d4]@4 [e3,a3,c#4,e4]@6 ~ [d3,g3,b3,d4]@5", // A C A G A G
  AP: "[e3,a3,c#4,e4]@6 [g3,c4,e4,g4]@5 [e3,a3,c#4,e4]@4 [d3,g3,b3,d4]@4 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] [e3,a3,c#4,e4]@2", // A C A G A
  AQ: "[[e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] ~@24 [d3,a3,d4,f#4]@6]/2", // A D
  AR: "[e3,a3,c#4,e4] ~@3", AS: "[e3,a3,c#4,e4]@4 ~@9 [d3,a3,d4,f#4]@3",
  AT: "[e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@4", // A D A D A
  AU: "[~@9 [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,a3,c#4,e4]@3 [d3,a3,d4,f#4]@3 [e3,c#4,e4]@4 ~@4]/2", // D A D A D C#m
  AV: "a2@4 c3@4 d3@3 d#3 e3 g2@3", AW: "a2!4 c3@4 d3@3 d#3 e3 g2@3", AX: "a2@4 c3@4 d3@3 d#3 e3 [g3,b3,d4]@3",
})).s("gm_overdriven_guitar").gain(0.42).pan(0.3)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@3 A B A B C D A B ~@8 E F G H G I J K G L ~@7 M N O P O Q R S T U V W@2 X Y ~@19 Z@3 AA AB@2 AC AD@2 AE AF@3 AG AH
  AI@3 AJ AK@2 AL ~@7 E AM@2 A AN AO
>`.pickRestart({
  A: "a1@4 c2@4 d2@3 d#2 e2 g#1@3", B: "a1@3 a1 c2@4 d2@3 d#2 e2 g#1@3", C: "b1@4 d2@4 e2@3 f2 f#2 a1@3",
  D: "b1@3 b1 d2@3 d2 e2@3 f2 f#2 a1@3", E: "a2@3 d3@3 a2@3 d3@3 a2@4", F: "e2@4 a1@4 c2@4 d2@3 d#2",
  G: "e2 g#1@3 a1@3 a1 c2@4 d2@3 d#2", H: "e2 g#1@3 a1@4 c2@4 d2@3 d#2", I: "e2 g#1@3 b1@4 d2@4 e2@3 f2",
  J: "f#2 a1@3 b1@3 b1 d2@4 e2@3 f2", K: "f#2 a1@3 a1@4 c2@4 d2@3 d#2", L: "e2 g#1@3 ~@12",
  M: "~@4 a2@3 d3@3 a2@3 d3@3", N: "a2 g2 c2 d#2", O: "f2@3 f#2 g2 b1@3 c2@3 c2 d#2@3 d#2",
  P: "f2@2 f2 f#2 g2 b1@3 c2@4 d#2@4", Q: "f2@2 f2 f#2 g2 b1@3 d2@2 d2!2 f2@3 f2",
  R: "g2@3 g#2 a2 c2@3 d2@2 d2!2 f2@3 f2", S: "g2@3 g#2 a2 c2@3 e2@2 e2!2 g2@3 g2",
  T: "a2@3 a#2 b2 d#2@3 e2@3 e2 g2@3 g2", U: "a2@2 a2 a#2 b2 d#2@3 e2@2 e2!2 e2@3 e2",
  V: "e2 b1 d2 c2 b1 a1 g1 f#1 e1!2 e1@2 e2!4", W: "e2 b1 d2 c2 b1 a1 g1 f#1 e1!4 e2!4", X: "e2!4 e1!12", Y: "e1 ~@3",
  Z: "[~@12 a1@6 ~ d2@5 g2@6 f#2@5 ~ g2@3 f#2@4 a1@6 ~ d2@5 g2@6 f#2@5 g2@4 f#2@4 a1@6 d2@5 ~ g2@6 f#2@4]/3",
  AA: "~ g2@4 f#2@4 a1@6 d2@5 g2@6 ~ f#2@5",
  AB: "[g2@4 f#2@3 a1@6 ~ c2@5 c#2@6 e2@5 d2@4 c#2@4 a1@6 ~ c2@5 c#2@6 e2@5 d2@3]/2",
  AC: "~ c#2@4 a1@6 c2@5 c#2@6 ~ e2@5 d2@4",
  AD: "[c#2@4 a1@6 c2@5 c#2@6 ~ e2@5 d2@3 c#2@4 a1@6 ~ c2@5 c#2@6 e2@5 d2@4 c#2@3]/2",
  AE: "~ a1@6 c2@5 ~ c#2@6 e2@5 d2@4 c#2@4",
  AF: "[a1@6 c2@5 c#2@6 ~ e2@5 d2@4 c#2@3 a1@6 ~ c2@5 c#2@6 e2@5 ~ d2@3 c#2@4 a1@6 ~ c2@5 c#2@6 e2@5 d2@4 c#2@4 a1@4]/3",
  AG: "~@2 c2@5 c#2@6 ~ e2@5 d2@4 c#2@4 a1@5", AH: "~ c2@5 c#2@6 ~ e2@5 d2@4 c#2@3 a1@6 ~",
  AI: "[c2@5 c#2@6 e2@5 d2@4 c#2@4 a1@6 g1@5 ~ a1@6 c2@5 a1@4 g1@4 a1@6 c2@5 a1@6 ~ c2@5 a1@4 g1@4 a1@6 a1@4]/3",
  AJ: "~ a1@4 a1@2 a1@2 a1@2 a1@2 e2 e2@2 e2@2 e2@2 a1@6 ~ a1@5",
  AK: "[~@2 a1@5 a1@4 a1@4 a1@4 a1@4 a1@4 a1@3 a1@4 a1@2 a1@2 a1@2 a1@2 a1@2 a1@2 a1@2 a1@2 a1@4 a1@3 a1@4 a1@3]/2",
  AL: "~ a1@4 ~@21 a2@6", AM: "[~@9 d3@3 a2@3 d3@3 a2@3 d3@3 a2@4 e2@4]/2", AN: "a1@3 a1 c2@3 c2 d2@3 d#2 e2 g#1@3",
  AO: "a1@4 c2@4 d2@3 d#2 e2 g1@3",
})).s("gm_electric_bass_finger").gain(0.48).pan(0.4)

// bass · acoustic bass · "Bass Slide"
const bass_2 = note("<~@11 A B@2 C B D B@2 E F ~@7 G H@2 I J K@2 G L M ~@53 N O B C B P B Q ~@6>".pickRestart({
  A: "a1@4 [e2,a2]@3 ~ a#1@4 ~@4, ~@7 [f2,a#2]@5 ~@4", B: "[a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@5 ~@4",
  C: "[a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@2 [d2,a2,d3] [c2,g2,c3]@6", // A5 A#5 D5 C5
  D: "[a1,e2,a2]@8 [a1,e2,a2]@6 [a#1,f2,a#2]@10 e1 ~@7", E: "~@3 g3", F: "e3 ~@3",
  G: "~@4 [a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@5", // A5 A#5
  H: "[~@4 [a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@2 [d2,a2,d3] [c2,g2,c3]@6 [a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@5]/2", // A5 A#5 D5 C5 A5 A#5
  I: "~@4 [a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@2 [d2,a2,d3] [c2,g2,c3]@2", // A5 A#5 D5 C5
  J: "~ [b1,f#2,b2]@3 [a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@5", // B5 A5 A#5
  K: "[~@4 [a1,e2,a2]@4 [a1,e2,a2]@3 [a1,e2,a2] [c2,g2,c3]@3 [c2,g2,c3]@2 [c2,g2,c3] [b1,f#2,b2]@2 [a1,e2,a2]@4 [a1,e2,a2]@3 [a#1,f2,a#2]@5]/2", // A5 C5 B5 A5 A#5
  L: "~@4 a2@3 d3@3 a2@3 d3@3", M: "a2 g2 ~@2", N: "~@13 a2@3", O: "a2@4 [a1,e2,a2]@3 [a#1,f2,a#2]@5 ~@4",
  P: "[a1,e2,a2]@4 [a1,e2,a2] [a1,e2,a2]@3 [c2,g2,c3] [d2,a2,d3] [c2,g2,c3]@2 [c2,g2,c3] [b1,f#2,b2]@2 [b1,f#2,b2]", // A5 C5 D5 C5 B5
  Q: "[a1,e2,a2]@4 [a1,e2,a2]@3 [a1,e2,a2] [c2,g2,c3] [d2,a2,d3] [c2,g2,c3]@6", // A5 C5 D5 C5
})).s("gm_acoustic_bass").gain(0.25).pan(0.3)

// other · overdriven guitar · "Solo Guitar"
const overdriven_guitar_2 = note("<~@45 A@3 ~@2 B C D@2 E@5 F G H I J@2 K L M@2 N@3 O P Q ~@30>".pickRestart({
  A: "[~ [e3,b3,e4]@4 ~]/3", B: "~@16 a3@5 c4 a3@2 ~ e3 d3 c3 ~@4",
  C: "a3@5 c4 a3@2 e3 d3 ~ c3 ~@4 a3@4 c4 ~ a3@2 c4 ~ a3@2 c4 ~ a3@2",
  D: "[c4 ~ a3@2 ~ c4 a3@2 ~ c4 a3@2 ~ d4@4 c4 ~ a3@2 ~ d4@4 c4 a3@2 ~ d#4@4 ~ c4 a3@2 ~ d#4@4 c4 ~ a3@2 d#4@4 ~ c4 ~ a3@3 d#4@4 ~ c4@2]/2",
  E: "[a3@3 d4@40 ~@6 a3 ~@4 c4 ~@3 d#4@2 ~@3 e4@2 ~@21 a3 ~@4 c4@2 ~@2 d#4@4 ~ d4@13 ~@10 a3@4 c4@4 ~ d4@24 ~@2 d4@2]/5",
  F: "~@2 a3@4 d4@3 ~@2 a3@4 d4@3 ~ a3@4 c4@4 d4@4 e4",
  G: "e4 ~ f#4@2 d4 ~ e4!4 ~ f#4@2 e4!2 ~ e4 f#4@2 d4 ~ e4!4 ~ f#4@2 e4!3 ~",
  H: "e4 f#4@2 e4 ~ c5 a4 b4 ~ e4 f#4 ~ a4 c5 a4 ~ b4 e4 ~ f#4 a4 c5 ~ a4 b4 ~ e4 f#4 a4 ~ c5 a4",
  I: "b4 ~ e4 f#4 ~ a4 c5 d#5 ~ c5 d5 ~ c5 a4 ~ d5 g4 ~@2 e4 ~ e4 d#4@2 d4 ~ d4 c4@4 g3, ~@9 a4 ~@6",
  J: "[f#3 g3 ~ f#3 e3 f#3 ~ g3@2 b3@2 c4@2 b3@2 ~ a2 ~ f#3@2 g3@2 f#3@2 ~ f#3 ~ g3 f#3 e3@2 f#3@2 a2@5 ~ d3@4 c3@4 ~ c#3@4 g2@8 ~ a2@2 ~, ~@15 a3@2 ~@7 e3@2 ~@38]/2",
  K: "c3 c#3 e3 ~ f#3 a3 b3 ~ c#4 e4 ~ a4 g4 ~ e4 d#4 ~ d4 c4 ~ d4 c4 a3 ~ a3 g3 ~ e3 g3 ~ g#3 a3",
  L: "~ c4@3 d4 c4 ~ a3 g3 ~ a3 c4 ~ d4 d4@3 ~ a4 g4 ~ e4 g4@3 e4 ~ e4 d#4 ~ d4 c4",
  M: "[~ c4 ~ a3 c4@3 ~ c#4@3 ~ c#4@3 e4@3 ~ a4@3 ~ a4@3 g4@9 ~@3 a2 ~@2 b3@2 ~ g#4@3 ~@2 a3@2 f#4@3 ~@2 g#3@2 ~ e4@3 ~@2]/2",
  N: "[g3@2 d#4@3 ~@7 d4@25 ~@7 [a2,e3,g3,c#4]@5 ~@2 [a2,f#3,g3,d4]@4 ~ [a2,g3,e4]@5 ~ [a2,g3,a3,f#4]@4 ~@2 [a2,g3,a3,e4]@3 [a2,f#3,g3,d4]@3 ~ [a2,e3,g3,c#4]@5 ~@2 [a2,f#3,g3,d4]@4 ~ [a2,g3,e4]@5 ~ [a2,g3,a3,f#4]@3, ~@7 f#3@30 ~@59]/3", // A7 D A7 D A7 D A7 D …
  O: "~@2 [a2,g3,a3,e4]@3 ~ [a2,f#3,g3,d4]@3 ~ [a2,e3,g3,c#4]@5 ~ [a2,f#3,g3,d4]@4 ~@2 [a2,g3,e4]@5 ~ [a2,g3,a3,f#4]@4", // A7 D A7 D A7 D
  P: "~ [a2,g3,a3,e4]@3 ~ [a2,f#3,g3,d4]@3 ~ [a2,e3,g3,c#4]@5 ~ [a2,f#3,g3,d4]@4 ~ [a2,g3,e4]@5 ~@2 [a2,g3,a3,f#4]@4 ~", // A7 D A7 D A7 D
  Q: "[a2,g3,a3,e4]@3 ~ [a2,f#3,g3,d4]@3 ~@25", // A7 D
})).s("gm_overdriven_guitar").gain(0.45).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A B A B A B A B C D C D C D C@2 E F G H G H G H G I@2 J I J I J K L M N O N O N O N P Q@4 R ~@19 S T U V W X Y Z
  AA AB AC AD AE AF AG AH AI AJ AK AL AM AN D C D C D C@2 E AO AP A@3
>`.pickRestart({
  A: "x ~@7 x ~@2 x ~ x ~@2", B: "x ~@2 x ~@4 x ~@2 x ~ x ~@2", C: "x ~@9 x ~@2 x ~@2", D: "x ~@4 x ~@2",
  E: "x ~@2 x ~@2 x ~@2 x ~@2 x ~@3", F: "~@4 x ~@7 x ~@2 x", G: "~ x ~@2 x ~@2 x ~@4 x ~@2 x",
  H: "~ x ~@2 x ~@7 x ~@2 x", I: "~ x ~@2 x ~@9 x ~", J: "~@2 x ~@4 x", K: "~ x ~@2 x ~@2 x ~@6 x ~",
  L: "~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2", M: "x!2", N: "x ~@2 x ~ x ~@2 x ~@2 x ~@4", O: "x ~ x ~@2 x ~@2 x ~@7",
  P: "x ~@7 x!8", Q: "x!16", R: "x", S: "~@7 x", T: "~@2 x ~@4 x ~@6 x ~@4 x ~@7 x ~@4",
  U: "~ x ~@4 x ~@6 x ~@4 x ~@6 x ~@6", V: "x ~@4 x ~@5 x ~@4 x ~@7 x ~@5 x ~", W: "~@4 x ~@5 x ~@4 x ~@7 x ~@5 x ~@2",
  X: "~@2 x ~@6 x ~@4 x ~@7 x ~@5 x ~@3", Y: "~ x ~@5 x ~@5 x ~@6 x ~@6 x ~@4", Z: "x ~@5 x ~@4 x ~@7 x ~@5 x ~@4 x ~",
  AA: "~@5 x ~@4 x ~@7 x ~@5 x ~@4 x ~@2", AB: "~@4 x ~@4 x ~@6 x ~@6 x ~@4 x ~@3",
  AC: "~@2 x ~@4 x ~@7 x ~@6 x ~@4 x ~@4", AD: "~ x ~@4 x ~@7 x ~@5 x ~@4 x ~@6",
  AE: "x ~@4 x ~@7 x ~@5 x ~@4 x ~@5 x ~", AF: "~@4 x ~@6 x ~@6 x ~@4 x ~@5 x ~@2", AG: "~ x ~@3 x ~@2 x ~@2 x ~@2 x ~",
  AH: "~ x ~@7 x ~@5 x ~@4 x ~@6 x ~@4", AI: "x ~@6 x ~@6 x ~@4 x ~@5 x ~@4 x ~",
  AJ: "~@6 x ~@6 x ~@4 x ~@5 x ~@4 x ~@2", AK: "~@5 x ~@5 x ~@4 x ~@6 x ~@4 x ~@3",
  AL: "~@4 x ~@5 x ~@4 x ~@3 x ~@5 x ~ x ~@4", AM: "~ x!2 ~@6 x!2 ~@5 x ~ x ~@5 x!2 ~@6", AN: "x!2 ~@24 x ~@5",
  AO: "~@9 x ~@2 x ~@2 x", AP: "~@2 x ~@4 x!2 ~@7",
})).gain(0.4)

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@104 [~@13 x ~@2]>").gain(0.5)

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

// drums · ride
const ride = s("rd").struct("<~@37 A B C D@5 E ~@24 F G H I G H I G H I G H I G H I G H I G H ~@14>".pickRestart({
  A: "~@4 x!4", B: "x!3 ~ x!3 ~ x ~ x ~ x!3 ~", C: "x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~", D: "x!8", E: "x!4 ~@4", F: "~@7 x",
  G: "x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2 x ~", H: "~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2 x ~@3 x ~@2",
  I: "~ x ~@3 x ~@3 x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@3",
})).gain(0.45)

stack(
  distortion_guitar, overdriven_guitar, bass, bass_2, overdriven_guitar_2, kick, snare, hihat, open_hat, crash, ride
)

More by Led Zeppelin