Strudelify
Black Dog cover art

Led Zeppelin IV

Black Dog

Led Zeppelin

KeyA majorTempo150 bpm
0:00/0:00
// Black Dog — Led Zeppelin
// 150 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 6, 4/4 at bar 7, 5/4 at bar 9, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 190 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(150/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · acoustic bass · "Bass"
const bass = note(`<
  ~@4 A B C D E@5 F G H@6 I J K L M N O P I J K Q@2 R@6 S@4 B C D E@5 F G T U@8 V W X Y Z W X Y Z W X Y Z W X Y AA@5 F G
  H@6 I J K AB@4 AC AD AE AF@2 AG@2 M AC AD AE AH AI@2 AJ@8 ~ AK F G H@6 I J K AL@8 AM AN AO AP AM AN AO AP AM AN AO AP
  AM AN AO AP AM AN AO AP AM AN AO AP AM AN AO AP AM AN AO AP AM AN AO AP AM AN AO AP AM AN AO AP AM AN AO AP
>`.pickRestart({
  A: "~@7 e2", B: "g2 g#2 a2 e2 c3@2 a2@2", C: "d3@2 e3@2 c3 d3 ~ c3 a2@2 a2@2 c3@4", D: "a2@2 g2 a2!2 d2 e2 c2",
  E: "[d2@2 a1@6 a1@61 ~@5 e2@2 g2@2 g#2@2]/5", F: "a2 e2 c3@2 a2@2 d3 e3", G: "c3 d3 ~ c3 a2@2 a2@2 c3@4 a2@4",
  H: "[g2@2 a2@2 a2@2 d2@2 e2@2 c2@2 d2@2 a1@6 a1@61 ~@5 e2@2 g2@2 g#2@2 a2@2 e2@2]/6",
  I: "c3@4 a2@4 d3@2 e3@2 c3 d3 ~ c3", J: "a2!2 c3@2 a2@2 g2 a2", K: "a2 d2 e2 c2 d2 a1@3", L: "a1@3 b1 d2 d#2 e2 b1",
  M: "g2@2 e2@2 b1 d2 d#2 e2", N: "b1 g2@2 e2@2 b1 d2 d#2", O: "e2 b1 g2@2 e2@2 b1 d2", P: "d#2 e2 ~ e2 g2 g#2 a2 e2",
  Q: "a1@2 ~@3 a1@3", R: "[a1@2 ~@3 a1@4 c2@4 a1@4 c2@4 a1@4 c2@4 a1@4 c2@4 a1@4 c2@4 a1@3]/6", S: "[a1@57 ~@5 e2@2]/4",
  T: "g2 a2!2 d2 e2 c2 d2 a1", U: "[~ a1@31]/8", V: "~@5 a1 g1@2", W: "a1@2 g1 f#1 ~ a1 g1 a1",
  X: "c2@2 a1 g1 e1 a1 g1@2", Y: "a1@2 g1 f#1 ~ e2@3", Z: "~ d2@3 ~ a1 g1@2",
  AA: "[~@2 d2@6 a1@61 ~@5 e2@2 g2@2 g#2@2]/5", AB: "[a1@61 ~@3]/4", AC: "~ e2 g2 g#2 a2 e2 c3@2",
  AD: "a2@4 d3@2 e3@2 c3 d3 ~ c3 a2@2 a2@2", AE: "c3@2 a2@2 g2 a2!2 d2",
  AF: "[e2 c2 d2 a1@3 a1@3 b1 d2 d#2 e2 b1 g2@2]/2", AG: "[e2@2 b1 d2 d#2 e2 b1 g2@2 e2@2 b1 d2 d#2 e2 b1]/2",
  AH: "e2 c2 d2 a1@3 a1@2", AI: "~@3 a1@3 a1@2",
  AJ: "[~@3 a1@4 c2@4 a1@4 c2@4 a1@4 c2@4 a1@4 c2@4 a1@4 c2@4 a1@3 a1@18]/8", AK: "~@5 e2 g2 g#2", AL: "[a1@61 ~@3]/8",
  AM: "~ a1 g1@2 a1@2 g1@2", AN: "~ a1 g1 g#1 a1@2 ~@2", AO: "~ a1 g1 g#1 a1@2 g#1 f#1", AP: "~ e2@3 ~ d2@3",
})).s("gm_acoustic_bass").gain(0.48)

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

// other · overdriven guitar · "Guitar 2"
const overdriven_guitar_2 = note(`<
  ~@4 A B C D E@5 F G H@6 I J K L M N O P I Q R S T U@2 V T W@2 X@4 B C D E@5 F G Y Z@8 AA AB AC AD@2 AB AC AD@2 AB AC
  AD@2 AB AC AE@3 ~@2 AF F G H@6 I J AG AH@4 AI AJ AK AL@2 AM@2 M AI AJ AN AO@2 AP AQ@2 AR AP AS@6 F G AT@6 AU AV AW
  AX@7 AY AZ@3 BA AZ@3 BA AZ@3 BA BB BC BD BE@2 BF BG@2 BH@4 BI@4 BJ BK@2 BL@3 BM BN BO BP@2 BQ BR BQ BR BS BR BT BU BV
>`.pickRestart({
  A: "~@7 e3", B: "g3 g#3 a3 e3 c4@2 a3@2", C: "d4@2 e4@2 c4 d4 ~ c4 a3@2 a3@2 c4@4", D: "a3@2 g3 a3!2 d3 e3 c3",
  E: "[d3@2 [a2,e3]@6 [a2,e3]@61 ~@5 e3@2 g3@2 g#3@2]/5", F: "a3 e3 c4@2 a3@2 d4 e4",
  G: "c4 d4 ~ c4 a3@2 a3@2 c4@4 a3@4",
  H: "[g3@2 a3@2 a3@2 d3@2 e3@2 c3@2 d3@2 [a2,e3]@6 [a2,e3]@61 ~@5 e3@2 g3@2 g#3@2 a3@2 e3@2]/6", // A5
  I: "c4@4 a3@4 d4@2 e4@2 c4 d4 ~ c4", J: "a3!2 c4@2 a3@2 g3 a3", K: "a3 d3 e3 c3 d3 a2@3", L: "a2@3 b2 d3 d#3 e3 b2",
  M: "g3@2 e3@2 b2 d3 d#3 e3", N: "b2 g3@2 e3@2 b2 d3 d#3", O: "e3 b2 g3@2 e3@2 b2 d3", P: "d#3 e3 ~ e3 g3 g#3 a3 e3",
  Q: "a3!2 c4@2 a3@2 ~@2", R: "~@5 [a2,e3]@3", S: "[a2,e3]@3 [a2,e3] c3 [a2,e3]@3",
  T: "[a2,e3]@2 ~ [a2,e3] c3 [a2,e3]@3", U: "[[a2,e3]@2 ~ [a2,e3] c3 [a2,e3]@4 [c3,g#3]@4 [a2,e3]@3]/2",
  V: "[a2,e3]@2 ~@2 c3 [a2,e3]@3", W: "[[a2,e3]@2 ~ [a2,e3] c3 [a2,e3]@4 [c3,g3]@4 [a2,e3]@3]/2",
  X: "[[a2,e3]@57 ~@5 e3@2]/4", Y: "g3 a3!2 d3 e3 c3 d3 [a2,e3]", Z: "[~ [a2,e3]@31]/8", AA: "~@5 [a2,e3,a3] g2@2",
  AB: "[a2,e3,a3]@2 [a2,e3,a3] ~@2 [a2,e3,a3] [d3,g3] [e3,a3]", AC: "[g3,c#4]@2 [a2,e3,a3] ~@2 [a2,e3,a3] g2@2",
  AD: "[[a2,e3,a3]@2 g2@2 ~ g3@4 f#3@3 ~ [a2,e3,a3] g2@2]/2", AE: "[[a2,e3,a3]@4 g2@4 ~@2 g3@8 f#3@6 e3@23 ~]/3",
  AF: "~@5 e3 g3 g#3", AG: "a3 d3 e3 c3 d3 [a2,e3]@3", AH: "[[a2,e3]@61 ~@3]/4", AI: "~ e3 g3 g#3 a3 e3 c4@2",
  AJ: "a3@4 d4@2 e4@2 c4 d4 ~ c4 a3@2 a3@2", AK: "c4@2 a3@2 g3 a3!2 d3",
  AL: "[e3 c3 d3 a2@3 a2@3 b2 d3 d#3 e3 b2 g3@2]/2", AM: "[e3@2 b2 d3 d#3 e3 b2 g3@2 e3@2 b2 d3 d#3 e3 b2]/2",
  AN: "c4 a3 ~@2", AO: "[~@3 [a2,e3]@3 [a2,e3]@3 [a2,e3] c3 [a2,e3]@3 [a2,e3]@2]/2",
  AP: "~ [a2,e3] c3 [a2,e3]@3 [a2,e3]@2", AQ: "[~ [a2,e3] c3 [a2,e3]@4 [c3,g#3]@4 [a2,e3]@3 [a2,e3]@2]/2",
  AR: "~@2 c3 [a2,e3]@3 [a2,e3]@2", // A5
  AS: "[~@2 [a2,e3]@2 c3@2 [a2,e3]@8 [c3,g3]@8 [a2,e3]@6 [a2,e3]@57 ~@5 e3@2 g3@2 g#3@2]/6", // A5 C5 A5
  AT: "[g3@2 a3@2 a3@2 d3@2 e3@2 c3@2 d3@2 [a2,e3]@6 [a2,e3]@61 ~@5 a3@2 b3@2 c4@2 c#4@2 a3@2]/6", // A5
  AU: "d#4 e4@3 c#4@4 f#4@2 g4@2 e4 f#4 ~ e4", AV: "c#4@2 c#4@2 d#4 e4@3 c#4@4 b3@2 c#4@2", AW: "c#4 g3 a3 e3 f#3 e3@3",
  AX: "[[a2,e3]@53 ~@3]/7", AY: "~@2 e2@2 e2 f#2 a2@2 b2 c3 a2@2 f#2@2 e2@2",
  AZ: "a2@3 c3!2 e3 ~ f#3 a3 f#3 ~ a3 b3 c#4 ~ a4", BA: "c4 d4 d4@2 c#4@2 b3@2 a3@2 f#3@2 a3 b3@3",
  BB: "a3@3 [e4,a4]!3 ~ [e4,a4] a4@2 b4 c#5@3 ~@2", BC: "b4@2 a4@2 [e4,a4]@2 [e4,a4]@2 [e4,a4]@2 g#4 a4@5",
  BD: "c#6@2 d6@2 d#6@2 e6@4 e6@2 d6 c6 ~ d6", BE: "[e6 d6 c6 e6 ~ c6@2 a5@4 c6 ~@3 a5]/2", BF: "e6 d6 c6 e6 e6@2 ~@2",
  BG: "[e5@4 g5@4 e5 d5 ~ c5@3 e5@4 d5@2 c5@4 e5@2 c5@6]/2",
  BH: "[~@2 e5@2 a5@3 e5@2 e5 a5@2 g5 a5@2 c6@2 a5 g5@2 ~ e5@2 e5@3 a5 g5@3 e5 g5]/4",
  BI: "[a4@3 a4 g#4 e4@2 e4@2 g#4@3 ~@3 a4@2 c5@2 a4 g4 e4@2 e4@2 d4 c#4 a3 d4 c#4@3]/4",
  BJ: "~@4 e4@3 e4 a4 g4 ~ e4 e4@3 e4", BK: "a4 g4 ~ e4 e4@3 e4 a4 g4 ~ e4 e4@3 e4",
  BL: "[a4 g4 ~ e4!2 d4 ~ c4!2 d4 ~ c#4 a3 d4 ~ c#4@5 a3@2 g3@2 a3@6 c#4@4 a3@2 c4@2 d4@2 e4@2 ~@4 a3@2]/3",
  BM: "d4!3 e4 d4 c4 a3 c4", BN: "g4 ~@2 e4 ~ d4 ~ c4 a3 d4 ~ d4@5", BO: "g3 g#3 ~ a3 c4@4 g3 g#3 ~ a3 c4@4",
  BP: "g3 g#3 ~ a3 d4@4 g3 g#3 ~ a3 c4@4", BQ: "g3 g#3 ~ a3 d3@2 c3@2 d3@2 g2@2 f#2@4",
  BR: "a2@3 c3 c#3 e3 ~ f#3 a3 f#3 ~ a3 b3 c#4 ~ a4", BS: "c#3 e3 d3 c#3 d3 g#2 f#2@2", BT: "a4 a4@3 c5 ~@3",
  BU: "e5 ~ d5 ~ e5 ~ d5 ~", BV: "e5 d5 c#5 d5 e5 c#5@3",
})).s("gm_overdriven_guitar").gain(0.55).pan(0.9)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@32 A@3 ~ A@3 ~@72 B@3 ~ B@3 ~@72>".pickRestart({
  A: "~@3 x ~@4", B: "~ x ~@6",
})).gain(0.52)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 [~ x!2 ~] ~@78 [x!2 ~@2] ~@37 [~@5 x!2 ~] ~@48>").gain(0.52)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@2 A ~@4 B ~@2 B ~@4 C ~@2 D ~@3 E ~@2 F G@7 H C ~@3 A ~@2 A ~@4 B ~@2 B ~@7 E ~@2 E I ~@2 E I ~@2 E I ~@2 E J
  ~@4 B ~@2 B ~@4 C ~@2 C ~@3 E ~@2 E A ~@3 A ~@2 K G@7 L ~@4 B ~@2 B ~@4 C ~@2 C ~@7 B ~@2 M ~@3 M ~@3 M ~@3 M ~@3 M
  ~@3 M ~@3 M ~@3 M ~@3 M ~@3 M ~@3 M ~@3 M
>`.pickRestart({
  A: "~ x", B: "~ x ~@2", C: "x", D: "x ~@2 x", E: "~@3 x", F: "~@5 x ~@2", G: "x!4", H: "x!3 ~", I: "~ x ~@6",
  J: "~ x ~@2 x ~@3", K: "~@3 x ~@2 x ~", L: "x!2 ~ x", M: "~ x ~@3 x ~@2",
})).gain(0.52)

// drums · high tom
const high_tom = s("ht").struct("<~@62 [~@11 x ~@4] [~ x ~@14] ~@77 [~@2 x!2 ~@4] ~@48>").gain(0.52)

stack(bass, overdriven_guitar, overdriven_guitar_2, kick, snare, low_tom, hihat, mid_tom, crash, high_tom)

More by Led Zeppelin