Strudelify

Black Country Woman

Led Zeppelin

KeyG majorTempo120 bpm
0:00/0:00
// Black Country Woman — Led Zeppelin
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: duplicate parts dropped: ch 4 "Mandolin I" acoustic guitar nylon (copy of ch 5 "Mandolin II" acoustic guitar nylon); ch 7 "Acoustic Guitar II" acoustic guitar steel (copy of ch 6 "Acoustic Guitar I" acoustic guitar steel)
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level. 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.

// other · harmonica
const harmonica = note("<~@90 A B C D E@2 F G H ~@19 I J K L M@2 N O P Q R S@3 ~@2>".pickRestart({
  A: "~@6 f5 e5", B: "f5@11 ~@3 b4 [d5,f5]", C: "a5@2 g#5@2 a5@11 ~", D: "a5 g5 f5 e5 d5 c5 b4 g4",
  E: "[a#4 b4 d5@2 c5@2 a#4@2 g4@3 ~ f4@9 ~@5 g4@2 a#4 b4 c5@2]/2", F: "f5@3 ~ f5@2 f5@2 f5!8",
  G: "f5 f5@3 e5@2 d5@2 c5@2 a#4 b4 ~@2 g4@2", H: "~ g4 a#4 c5 ~ g4 a#4 c5", I: "~@8 c#5@3 ~@5",
  J: "c#5@5 ~ c#5@7 ~ d5 [c#5,d5]", K: "c#5@3 ~ d5@2 ~@2 c#5@3 ~ d5@2 c#5@2",
  L: "c#5 d5!7, ~@8 c#5 ~ c#5 ~ c#5 ~ c#5 ~",
  M: "[c#5@3 ~ d5@3 ~ c#5@3 ~ d5@2 c5@2 c5@2 g4@2 a#4 b4 c5@2 c#5@2 [d5,f5]@2 c5@2 a#4@2, ~@7 [g4,e5]@2 ~@7]/2", // Dm C
  N: "[g4,b4,d5]@2 a#4!2 a4@2 a#4@2 a4@2 a#4@2 g4@2 ~@2", O: "g4!2 a#4@4 a#4@2 [g4,b4,d5]@3 ~@5",
  P: "~ g4 [b4,d5] c5 d5 g5 f5 g5", Q: "a5!4 a5@2 a5 g#5, g#5 ~ g#5 ~ g#5 ~ g#5 ~ g#5 ~@7", R: "a5@7 g5",
  S: "[~@2 f5@2 e5@2 d5 [d5,e5] b4@2 g4@2 b4 [b4,c5] [d4,g4,b4]@25 ~@9]/3", // Dsus2 Cmaj7 G
})).s("gm_harmonica").gain(0.53).pan(0.6)

// chords · acoustic guitar nylon · "Mandolin II"
const acoustic_guitar_nylon = note(`<
  ~@3 A@2 B C B C B C B D E C F@2 G H I C J C K L M N O P Q P R S T U V W X W V W X W Y Z AA N AB C AC C AD@2 AE AF AG C
  AH@2 AI@2 AJ@2 AK W X W V W X W Y Z AA N AB C AC C AD@2 AE AF AG C AH@2 AI@2 AJ@2 AK W X W V W X W Y Z AA N AB C AC C
  AD@2 AE AF AG C AH@2 AI@2 AJ@2 AK C AL@2 AM@2 AN AO AP AQ AR@3 ~@2
>`.pickRestart({
  A: "[~@7 g3@2 [f4,b4] e4 d4 [g3,f4,b4] ~ [g3,f4,b4] ~]/2", B: "g3@2 f4@2 e4@2 d4@2 e4@2 f4@2 a#3 a3 g3@2",
  C: "g3 [f4,b4] e4 d4 [g3,f4,b4] ~ [g3,f4,b4] ~", D: "g3 [f4,a#4] e4 d4 [g3,f4,a#4] ~ [g3,f4,a#4] ~",
  E: "g3 f4 e4 d4 e4 f4 a3 g3",
  F: "[g3@2 f4@2 e4@2 d4@2 e4@2 f4@2 c4 c#4 d4@4 [d4,b4]@2 d4@2 d4@2 [g4,a#4]@2 ~@2 [g4,a#4]@2 ~@2]/2", // G Gm
  G: "g4 [g4,a#4,e5] a4 g4 a4 [g4,a#4] [d4,a4] [g4,a#4]", H: "~ [g4,a#4,e5] a4 g4 [g4,a#4] ~ [g4,a#4] ~",
  I: "~ [g4,a#4] a4 g4 a4 [g4,a#4] [d4,a4] a#3", J: "g3 [f4,b4] e4 d4 e4 f4 a#3 g3",
  K: "g3@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 b3 c4 [d4,a4]@2", L: "d4 [g4,a#4] d4!2 [g4,a#4] ~ [g4,a#4] ~",
  M: "g4 [g4,a#4] a4 g4 [d4,a4] [g4,a#4] [d4,a4] [g4,a#4]", N: "~ [g4,a#4,e5] a4 g4 [g4,a#4,e5] ~ [g4,a#4,e5] ~",
  O: "~ [g4,a#4,e5] [d4,a4] [g4,a#4] [d4,a4] [g4,a#4] a#3 g3", P: "g3 [f4,b4] e4 [d4,a4] [g3,f4,b4] ~ [g3,f4,b4] ~",
  Q: "g3 [f4,b4] e4 [d4,a4] e4 f4 a#3 g3", R: "g3@2 [f4,b4]@2 e4@2 [d4,a4]@2 e4@2 f4@2 b3 c4 d4@2",
  S: "d4 [d4,c5] [d4,d5] a4 [d4,c5] ~ [d4,c5] ~", T: "~ [g4,a#4] [d4,a4] g4 [d4,a4] [g4,a#4] [d4,a4] g3",
  U: "g3 f4 e4 d4 [g3,f4] ~ [g3,f4] ~", V: "g3@2 f4@2 [g3,e4]@2 d4@2 e4@2 f4@2 a#3 a3 g3@2",
  W: "g3 [f4,b4] [g3,e4] d4 [g3,f4] ~ [g3,f4] ~", X: "g3 f4 [g3,e4] d4 e4 f4 a#3 g3",
  Y: "g3@2 f4@2 [g3,e4]@2 d4@2 e4@2 f4@2 a#3 c4 c4@2", Z: "c4 [g4,a#4] d4!2 [g4,a#4] ~ [g4,a#4] ~",
  AA: "g4 [g4,a#4] [d4,a4] g4 [d4,a4] [g4,a#4] [d4,a4] [g4,a#4]", // Gm D5 Gm D5 Gm
  AB: "~ [g4,a#4] [d4,a4] [g4,a#4] [d4,a4] [g4,a#4] [a#3,d4] g3", AC: "g3@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 a#3 a3 g3@2",
  AD: "[g3@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 c4@2 g4@4 c5@2 d5@3 ~ c5@3 ~ g4@3 ~]/2", // Fdim
  AE: "~ [g4,a#4] [d4,a4] g4 [d4,a4] [g4,a#4] [d4,a4] [g4,a#4]", // Gm D5 Gm D5 Gm
  AF: "~ [g4,a#4] [d4,a4] g4 [g4,a#4,e5] ~ [g4,a#4,e5] ~", AG: "~ [g4,a#4] [d4,a4] g4 [d4,a4] [g4,a#4] a#3 g3",
  AH: "[~@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 a#3 a3 g3@4 [f4,b4]@2 e4@2 d4@2 [g3,f4]@2 ~@2 [g3,f4,b4]@2 ~@2]/2", // Fdim G7
  AI: "[~@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 b3 c4 d4@4 c5@2 [d4,b4]@2 a4@2 [d4,c5]@2 ~@2 [d4,c5]@2 ~@2]/2", // Fdim G D7
  AJ: "[~ [g4,a#4] [d4,a4] g4 [d4,a4] [g4,a#4] [d4,a4] g3@2 [f4,b4] e4 d4 [g3,f4,b4] ~ [g3,f4,b4] ~]/2", // Gm D5 Gm D5 Fdim G7
  AK: "g3 [f4,b4] e4 d4 e4 f4 b3 g3", // Fdim
  AL: "[g3@2 f4@2 e4@2 d4@2 e4@2 f4@2 a#3 a3 g3@4 [f4,b4]@2 e4@2 d4@2 [g3,f4,b4]@2 ~@2 [g3,f4,b4]@2 ~@2]/2", // Fdim G7
  AM: "[g3@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 a#3 a3 g3@4 [f4,b4]@2 e4@2 d4@2 [g3,f4,b4]@2 g3@2 [g3,f4,b4]@2 g3@2]/2", // Fdim G7
  AN: "~@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 a#3 a3 g3@2", AO: "g3 [f4,b4] e4 d4 [f4,b4] ~ [f4,b4] ~",
  AP: "g3@2 [f4,b4]@2 e4@2 d4@2 e4@2 f4@2 a3 b3 d4@2", AQ: "~ c5 b4 a4 [d4,c5] ~ [d4,c5] ~",
  AR: "[~@2 [g4,a#4]@2 [d4,a4]@2 g4@2 [d4,a4]@2 [g4,a#4]@2 [d4,a4]@2 [d4,b4]@25 ~@9]/3", // Gm D5 Gm D5 G
})).s("gm_acoustic_guitar_nylon").gain(0.39).pan(0.7)

// chords · acoustic guitar steel · "Acoustic Guitar I"
const acoustic_guitar_steel = note(`<
  A B C D@2 E@2 D@2 F@2 E@2 F@2 G@2 H I J@2 K@2 L I H I J@2 K@2 M N O C D@2 F@2 E@2 F@2 G@2 H I J@2 K@2 L I H I J@2 K@2
  M N O C D@2 F@2 E@2 F@2 P@2 H I J@2 K@2 Q I H I J@2 K@2 M N O C D@2 F@2 E@2 F@2 P@2 H I J@2 K@2 Q I H I J@2 K@2 M N O
  C D@2 F@2 E@2 R F@2 N S@2 T@3
>`.pickRestart({
  A: "~@2 [g2,d3,g3,d4,f4]@2 [g2,d3,g3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@3 ~ [g2,d3,g3,b3,g4]@3 ~", // G7 C#dim G
  B: "[g2,d3,g3,b3] [g2,d3,g3,d4,f4] [g2,d3,c#4,e4] [g2,d3,g3,b3,d4] [g2,d3,g3,b3,g4] [g3,b3,d4] b2 [g2,d3,g3,b3]", // G G7 C#dim G
  C: "[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,g3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [d3,g3,b3]@2 [g2,d3,g3,b3,g4]@3 ~", // G G7 C#dim G
  D: "[[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [g3,b3,d4]@2 b2@2 [g2,d3,g3,b3]@4 [g2,d3,g3,d4,f4]@2 [g2,d3,g3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@3 ~ [g2,d3,g3,b3,g4]@2 [g2,d3]@2]/2", // G G7 C#dim G G7 C#dim G G5
  E: "[[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [g3,b3,d4]@2 b2@2 [g2,d3,g3,b3]@4 [g2,d3,g3,d4,f4]@2 [g2,d3,g3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@3 ~ [g2,d3,g3,b3,g4]@2 [g3,b3]@2]/2", // G G7 C#dim G G7 C#dim G
  F: "[[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [g3,b3,d4]@2 b2@2 [g2,d3,g3,b3]@4 [g2,d3,g3,d4,f4]@2 [g2,d3,g3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [g3,b3]@2 [g2,d3,g3,b3,g4]@3 ~]/2", // G G7 C#dim G G7 C#dim G
  G: "[[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [g3,b3,d4]@2 [a#2,f3,a#3]@2 [c#3,g3,c4]@4 [c3,g3,c4,g4,a#4]@2 [c3,g3,c4,f#4,a4]@2 [c3,g3,c4,e4,g4]@2 [c3,g3,c4,g4,a#4] ~@3 [c3,g3,c4,g4,a#4]@3 ~]/2", // G G7 C#dim G A#5 C C7 F#dim …
  H: "[c3,g3,c4] [c3,g3,c4,g4,a#4] [c3,g3,c4,f#4,a4] [c3,g3,c4,e4,g4] [c3,g3,c4,f#4,a4] [c3,g3,c4,g4,a#4] [d2,c3,g3,c4,f#4,a4] [d2,c3,g3,c4,g4,a#4]", // C5 C7 F#dim C F#dim C7 D7 Gm
  I: "[c3,g3,c4]@2 [c3,g3,c4,g4,a#4]@2 [c3,g3,c4,f#4,a4]@2 [c3,g3,c4,e4,g4]@2 [c3,g3,c4,g4,a#4] ~@3 [c3,g3,c4,g4,a#4]@3 ~", // C5 C7 F#dim C C7
  J: "[[c3,g3,c4] [c3,g3,c4,g4,a#4] [c3,g3,c4,f#4,a4] [c3,g3,c4,e4,g4] [c3,g3,c4,f#4,a4] [c3,g3,c4,g4,a#4] [a#2,f#3,a#3] g2 g2 [g2,d3,g3,d4,f4] [g2,d3,g3,c#4,e4] [g2,d3,g3,b3,d4]!2 [d3,g3,b3] [g2,d3,g3,b3,d4] [d3,g3,b3], ~@7 [d3,g3,b3]@2 ~@7]/2", // C5 C7 F#dim C F#dim C7 D#m G7 …
  K: "[[g2,d3,g3,b3] [g2,d3,g3,d4,f4] [g2,d3,g3,c#4,e4] [g2,d3,g3,b3,d4]!3 b2 g2 g2 [g2,d3,g3,d4,f4] [g2,d3,g3,c#4,e4] [g2,d3,g3,b3,d4]!2 [d3,g3,b3] [g2,d3,g3,b3,d4] [d3,g3,b3], ~@7 [d3,g3,b3]@2 ~@7]/2", // G G7 C#dim G G7 C#dim G
  L: "[g2,d3,g3,b3] [g2,d3,g3,d4,f4] [g2,d3,g3,c#4,e4] [g2,d3,g3,b3,d4]!3 [a#2,f3,a#3] [c#3,g3,c4]", // G G7 C#dim G A#5 C
  M: "[g2,d3,g3,b3] [g2,d3,g3,d4,f4] [g2,d3,g3,c#4,e4] [g2,d3,g3,b3,d4]!3 b2 [d2,g2,d3,g3]", // G G7 C#dim G G5
  N: "[g2,d3,g3]@2 [a2,d3,a3,c4,d4]@2 [a2,d3,a3,c4,d4]@2 [a2,d3,a3,c4,d4]@2 [a2,d3,a3,c4,d4] ~@3 [a2,d3,a3,c4,d4]@2 [f2,a#2,f3,a#3]@2", // G5 D7 A#5
  O: "[g2,c3,g3,c4] [c3,g3,c4]!5 [a#2,f3,a#3,d4] [g2,d3,g3,b3]", // C5 A# G
  P: "[[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@2 [g3,b3,d4]@2 [a#2,f3,a#3]@2 [g3,c4]@4 [c3,g3,c4,g4,a#4]@2 [c3,g3,c4,f#4,a4]@2 [c3,g3,c4,e4,g4]@2 [c3,g3,c4,g4,a#4] ~@3 [c3,g3,c4,g4,a#4]@3 ~]/2", // G G7 C#dim G A#5 C5 C7 F#dim …
  Q: "[g2,d3,g3,b3] [g2,d3,g3,d4,f4] [g2,d3,g3,c#4,e4] [g2,d3,g3,b3,d4]!3 [a#2,f3,a#3] [g3,c4]", // G G7 C#dim G A#5 C5
  R: "[g2,d3,g3,b3]@2 [g2,d3,g3,d4,f4]@2 [g2,d3,g3,c#4,e4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,g4]@3 ~ [g2,d3,g3,b3,g4]@2 [g2,d3]@2", // G G7 C#dim G G5
  S: "[[g2,c3,g3,c4]@2 [c3,g3,c4,g4,a#4]@2 [c3,g3,c4,f#4,a4]@2 [c3,g3,c4,e4,g4]@2 [c3,g3,c4,f#4,a4]@2 [c3,g3,c4,g4,a#4]@2 [a#2,f#3,a#3,d4]@2 [g2,d3,g3,b3]@4 [g2,d3,g3,b3,d4]@2 [g2,f3,g3,d4]@3 ~ [g2,e3,g3,c#4,d4]@3 ~ [g2,d#3,g3,c4,d4]@3 ~]/2", // C5 C7 F#dim C F#dim C7 A#aug G …
  T: "[[g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,d4]@2 [g2,d3,g3,b3,e4]@2 [g2,d3,g3,b3,d4]@2 ~ [g2,d3,g3]@27 ~@12, ~@2 [b3,f4]@7 ~@3]/3", // G Em7 G G5 Bdim
})).s("gm_acoustic_guitar_steel").gain(0.25).pan(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~@44 A@19 B C D E F E G C G C D E G C D E F C D E G C F E F C H I H@2 J C F E F E F E F E F K L C G C F E F C F C F C
  F E F M F@2 N O F C F C G ~@4
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~@2 x", C: "~ x ~@2 x ~@3", D: "x ~@3 x ~@2 x", E: "~ x ~ x!2 ~@3", F: "x ~@3 x!2 ~ x",
  G: "x!2 ~@2 x!2 ~ x", H: "x!2 ~ x!2 ~@3", I: "x!3 ~ x ~@3", J: "x!2 ~ x!2 ~@2 x", K: "~ x ~ x!2 ~ x ~",
  L: "x!2 ~@2 x!2 ~@2", M: "x!2", N: "x ~@4 x ~ x", O: "x ~@4 x ~@2",
})).gain(0.53)

// drums · snare
const snare = s("sd").struct("<~@63 A B@7 C B@11 C B@5 D@4 B@14 C B@7 C B@3 C@5 B@5 E ~@4>".pickRestart({
  A: "~@5 x!2 ~", B: "~ x ~ x", C: "~@2 x!2 ~@2 x ~", D: "~@2 x ~@3 x!2", E: "~@2 x ~@4 x",
})).gain(0.53)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@63 A B@7 C D B@10 C D B@19 E B@6 C D B@17 ~@4>".pickRestart({
  A: "~@7 x", B: "x!8", C: "x!7 ~", D: "~ x!7", E: "x!6 ~@2",
})).gain(0.53)

// drums · crash
const crash = s("cr").struct("<~@71 A ~@11 A ~@20 B ~@6 A ~@22>".pickRestart({
  A: "~@7 x", B: "~@3 x",
})).gain(0.53)

stack(harmonica, acoustic_guitar_nylon, acoustic_guitar_steel, kick, snare, pedal_hat, crash)

More by Led Zeppelin