Strudelify
Good Times Bad Times cover art

Led Zeppelin

Good Times Bad Times

Led Zeppelin

KeyA majorTempo91 bpm
0:00/0:00
// Good Times Bad Times — Led Zeppelin
// 91 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 67 bars on a 16-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): OVERDRIVE.
setcpm(91/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 · "OVERDRIVE"
const overdriven_guitar = note("<~@17 A@2 B C ~ D ~@3 E ~@5 F G ~ H@8 A@2 B C ~@20>".pickRestart({
  A: "e3 ~", B: "f#3 ~", C: "f#3@9 ~ [f#3,b3]@3 [f#3,b3]@3", D: "~@7 b3", E: "~@15 e3, ~@7 b3", F: "c3 ~@15",
  G: "~@12 [c#3,g#3] ~@3", H: "~@4 [e3,b3]@3 ~@9",
})).s("gm_overdriven_guitar").gain(0.25).pan(0.7)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  A@6 B C B D E D F D F C F G H I J K L M N O P Q R@2 S T U V W X Y Z@5 X AA H I J AB A B C B D E D F D F C F A B C B D
  E ~
>`.pickRestart({
  A: "e2 ~ e2@2 ~@12", B: "d2 a2 d3 a2 d3 a2 d2 f#2 a2 c#2@2 c#2 d2@2 d#2@2", C: "e2@2 e2@3 ~@11", D: "e2!2 ~@6",
  E: "~ a2 d3 a2 d3 a2 d2 f#2 a2 c#2 ~ c#2 d2@2 d#2@2, d2 ~@7", F: "d2 a2 d3 a2 d3 a2 d2 f#2 a2 c#2 ~ c#2 d2@2 d#2@2",
  G: "a1!3 ~ a1@2 c#2 d2@2 d2@2 d2 d#2@2 e2@2", H: "a1@2 a1 ~ a1@2 c#2 d2 ~ d2@2 d2 c#2@2 d2@2",
  I: "b1@2 b1 ~ b1 c#2 d#2 e2@2 e2 ~ e2 e2@2 e2@2", J: "b1@2 b1 ~ b1@3 a1 b1!5 a1 b1!2",
  K: "b1@2 ~ f#2 b2 a#2 ~ a2@2 d2 f#2 d2 e2 d#2 b1 a1", L: "f#1 ~ f#1@2 f#2 a#1 b1 c#2 ~ c#2 d2 d#2 e2!2 f2 f#2",
  M: "f#1 ~ f#1@2 ~ a#1@2 b1@2 c2@2 c#2 d#2@2 e2 f#2", N: "f#1 ~ f#1@2 a#1 b1 ~ c2 ~ c#2 ~ d2@2 d#2 e2 f#2",
  O: "f#1 ~ f#1@2 a#1 b1 ~ c2 ~ c#2 ~ d2 d#2@2 e2 f#2", P: "f#1 ~ f#1!2 f#2 f2 ~ e2@2 f#1 c#2 f#1 c2 b1@3",
  Q: "f#1 ~ f#1@2 f#2 f2 ~ e2@2 f#1 c#2 f#1 c2 ~ b1@2", R: "f#1 ~ f#1@2 f#2 f2 ~ e2 ~ f#1 c#2 f#1 c2 ~ b1@2",
  S: "b1 ~ b1 ~ b1@2 ~ b1 e2!2 ~ e2!4 f#2", T: "b1 ~ b1 ~ b1 d#2 ~ f#2 e2!2 ~ e2 ~ e2 ~ f#2",
  U: "c#2 ~ c#2 ~ c#2 ~ c#2 f2 f#2!2 ~ f#2 g2 ~ g2 g#2", V: "c#2 ~ c#2 ~ c#2 ~ c#2@3 ~ c#2 ~ c#2@2 g#1@2",
  W: "c#2@2 ~@10 c#2@3 ~", X: "e2 b2 e3 b2 e3 b2 e2 ~ d3 a2 d2 ~ a1@2 ~@2",
  Y: "~ b2 e3 b2 e3 b2 e2 ~ d3 a2 d2 ~ a1@2 ~@2, e2 ~@7", Z: "e2 b2 e3 b2 e3 b2 e2 ~ d3 a2 d2 ~ a1@3 ~",
  AA: "e2 b2 e3 b2 e3 b2 e2 ~ a1 ~ a1 ~ a1 ~ a1 ~", AB: "b1@2 a2 b2 d3 a2 b2 d3 a2 b2 d3 a2 b2 d3 a2 b2",
})).s("gm_fretless_bass").gain(0.54)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note(`<
  A@5 B C B C B D E C B C B C F@2 G H I J K L M L N O@2 P Q R S T U V U V U@4 F@2 G H I B C B C B D E C B C B C B C B C
  B W ~
>`.pickRestart({
  A: "[e3,g#3,b3,e4,g#4]@2 [e3,g#3,b3,e4,g#4] ~@13", B: "[e3,b3,e4,g#4]!2 ~@6",
  C: "d3 a3 d4 a3 d4 a3 d3 f#3 a3 c#3@2 c#3 d3@2 d#3@2",
  D: "d3 a3 d4 a3 d4 a3 d3 f#3 a3 c#3@2 ~ d3@2 d#3@2, ~@11 c#3@2 ~@3", E: "[e3,b3,e4,g#4]@2 [e3,b3,e4,g#4] ~@13",
  F: "~@2 e4 ~ [a3,c#4,e4]@3 ~ [d3,g3]@4 f#3@4, a3@3 ~@13, ~ c#4@2 ~@13", // A G5
  G: "~@2 f#4 ~ [b3,d#4,f#4]@3 ~ [e3,a3]@4 g#3@4, b3 ~@7, ~ d#4@2 ~@13", // B A5
  H: "~@2 f#4 ~ [b3,d#4,f#4]@3 ~ d#4 [b3,d#4,f#4] ~ b3 [b3,d#4,f#4]@3 [b3,d#4,f#4], b3@2 ~@5 b3@2 ~@7, ~ d#4@2 ~@13", // B
  I: "[f#1,b3,d#4,f#4] ~@7", // B
  J: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3]@3 ~@3 c#4 b3 c#4 ~ f#3 e3 f#3 ~, ~@8 [f#3,f#4]@3 ~ [b2,b3]@4", // F#5 F# B
  K: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3]@3 ~@3 c#4 b3 c#4 ~ [f#3,b3] ~ [f#3,b3]@2, ~@8 [f#3,f#4]@3 ~ b2@4, ~@13 e3@2 ~", // F#5 B5 F#
  L: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3]@3 ~@3 c#4 b3 c#4 ~ f#3 e3 f#3@2, ~@8 [f#3,f#4]@3 ~ [b2,b3]@4", // F#5 F# B
  M: "[f#2,c#3,f#3] ~ [b2,c3,c#3] ~ c#3 ~@3 c#4 b3 c#4 ~ [f#3,b3] e3 [f#3,b3]@2, ~@2 [f#2,f#3]@2 ~@4 [f#3,f#4]@3 ~ b2@4", // F#5 B5 F#
  N: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3]@3 ~@3 c#4 b3 c#4 ~ [f#3,b3] ~ [f#3,b3]@2, ~@8 [f#3,f#4]@3 ~ b2@4, ~@13 e3@3", // F#5 B5 F#
  O: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3]@3 ~@3 c#4 b3 c#4 ~ [f#3,b3] e3 [f#3,b3]@2, ~@8 [f#3,f#4]@3 ~ b2@4", // F#5 B5 F#
  P: "[b2,f#3]@2 [b2,f#3]@2 [b2,f#3]@2 ~ a3@5 g#3@4, ~@7 e3@9", // B5
  Q: "[b2,f#3] ~ [b2,f#3] ~ [b2,f#3]@2 ~ a3@5 g#3@3 ~, ~@7 e3@8 ~", // B5
  R: "[c#3,g#3] ~ [c#3,g#3] ~ [c#3,g#3]@2 ~ b3@5 a#3@4, ~@7 f#3@9", // C#5
  S: "[c#3,g#3] ~ [c#3,g#3] ~ [c#3,g#3]@2 [c#3,g#3] ~ [c#3,g#3]@2 [c#3,g#3]@3 ~ [c#3,g#3]@2", // C#5
  T: "[c#3,g#3]@2 ~@10 [c#3,g#3]@3 ~", U: "[b2,e3,b3] ~ [b2,e3,b3]@3 ~@5 [a2,d3,a3] ~ [a2,e3,a3]@3 ~",
  V: "[b2,e3,b3]@2 [b2,e3,b3]@3 ~@5 [a2,d3,a3] ~ [a2,e3,a3]@3 ~", // E5 D5 A5
  W: "d3 a3 d4 a3 d4 a3 d3 f#3 a3 c#3@2 ~ d3@2 ~@2, ~@11 c#3@2 ~@3",
})).s("gm_overdriven_guitar").gain(0.25).pan(0.3)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_3 = note("<~@35 A B C D E F@2 G ~@5 H I ~ J K L@2 M ~@2 N ~ O P ~ Q R ~@2>".pickRestart({
  A: "b4!2 ~ b4!2 e5 b4 e5 b4@2 e5 b4!2 a4 b4@2, ~ e5 ~@6", B: "[e4,g4] e4 g4 e4 a4 g4 a4 d5 a4 [e4,g4] a4 g4@3 ~@2",
  C: "b5@7 ~ f#5@6 g5 e5", D: "g5 ~ g5@2 e5@2 g5 e5 e5@5 ~@3",
  E: "b3!2 d4 [b3,d4] e4 [d4,e4] [e4,g4] g4 [g4,a4] a4 [a4,b4] b4 [b4,d5] d5 [d5,e5] e5", // Bm Dsus2 Em Gsus2 Asus2 Bm Dsus2
  F: "[a5 ~ g#5@2 e5 d5 e5 b5 ~ a#5 b5 ~ a#5 ~ b5 b5@2 g5 e5 g#5 a5 ~ g#5 a5 ~ g#5 a5 ~ a5 g5@3]/2",
  G: "e5@6 ~@2 g#5@4 d5@3 ~", H: "[d5,e5] b4 [b4,d5] a4 [a4,b4] g4 [g4,a4] e4 [e4,g4] d4 [d4,e4] b3 d4 [a3,b3]!2 g3",
  I: "d3@7 ~ e3@6 ~@2", J: "~@8 a5 ~ g#5 a5 ~ a5 g#5 a5", K: "a5 ~ g#5@6 ~@8", L: "[~ d6@8 b5 ~ b5@3 ~ e5@5 ~@12]/2",
  M: "~@2 g5@3 d5 g5@3 ~ d5 g5 ~ d5@3", N: "b4@2 d5 b4@2 ~ d5 b4@2 d5 b4@3 d5@3",
  O: "b5@3 b5!2 [g5,a5] a5 [e5,g5]!2 d5 [d5,e5] b4 [b4,d5] a4 [a4,b4] g4", P: "[g4,a4] e4 [g4,a4] g4@5 ~@8",
  Q: "~@9 g5 e5 g#5 a5 g#5 a5 g#5, ~@4 b5 ~@3", R: "a5 ~ g5@2 e5@5 ~@7",
})).s("gm_overdriven_guitar").gain(0.57).pan(0.7)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  A@4 B ~ C ~ C ~ C ~ C ~ C ~ C ~ D ~@4 E ~ E ~ E ~ E ~ D ~@7 F ~@4 D ~@4 C ~ C ~ C ~ C ~ G H C ~ C ~ C ~ C ~
>`.pickRestart({
  A: "x!2 ~@6", B: "x ~ x ~@2 x ~@9 x", C: "~@7 x", D: "~@13 x!3", E: "~@13 x ~@2", F: "~@11 x ~@4",
  G: "~@8 x!2 ~@2 x!2 ~@2", H: "~@4 x!2 ~@2 x!2 ~@6",
})).gain(0.62)

// drums · hihat
const hihat = s("hh").struct("<A B@4 C@12 D ~@4 C@8 ~@18 C@18 D>".pickRestart({
  A: "~ x!3", B: "~@2 x!6", C: "x!8", D: "x",
})).gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A@4 B ~ C ~ C ~ C ~ C ~ C ~ C ~ D E ~@3 C F C ~ C F C ~ D E ~ C ~@4 G ~@4 D E ~@3 C ~ C ~ C ~ C ~ H I C ~ C ~ C ~ C ~
>`.pickRestart({
  A: "x!2 ~@6", B: "x ~ x ~@10 x!2 ~", C: "~@3 x", D: "~@8 x ~ x!4 ~@2", E: "~@12 x ~ x!2", F: "~@12 x!2 ~@2",
  G: "~@5 x ~@2", H: "~@8 x!2 ~@6", I: "~@4 x!2 ~@10",
})).gain(0.62)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@18 A B ~@11 A B ~@11 A B ~@21>".pickRestart({
  A: "~@9 x ~@6", B: "~@13 x ~@2",
})).gain(0.39)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~ A ~ A ~ A ~ A ~ A ~@6 A ~ A ~ A ~ A ~@5 B C D C@3 E C E ~@7 A ~ A ~ A ~ A ~@2 A ~@2 A ~ A ~ A
>`.pickRestart({
  A: "x", B: "~@3 x", C: "x ~ x ~ x ~@2 x ~ x ~@2 x ~ x ~", D: "x ~ x ~ x ~ x!2 ~ x!2 ~ x ~@3",
  E: "x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~",
})).gain(0.47)

// drums · ride
const ride = s("rd").struct("<~@17 A B C D E ~@8 F B C D E G H G@6 A B C D E ~@19>".pickRestart({
  A: "x ~ x ~ x ~@2 x ~ x ~@2 x ~@3", B: "x ~ x ~ x ~ x!2 ~@8", C: "x ~ x ~ x ~ x!2 ~ x ~@2 x ~ x ~",
  D: "~@2 x ~ x ~ x!2 ~ x ~ x!2 ~ x ~", E: "x", F: "~@2 x ~ x ~@2 x ~ x ~@2 x ~@3",
  G: "x ~ x ~ x ~ x!2 ~ x ~ x!2 ~ x ~", H: "x ~ x ~ x ~ x!2 ~ x!2 ~ x ~@3",
})).gain(0.62)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@17 A ~ B C ~@9 A ~ B C ~@9 A ~ B C ~@20>".pickRestart({
  A: "~@6 x ~@4 x ~@2 x ~", B: "~@11 x ~@4", C: "~@7 x",
})).gain(0.39)

// drums · cowbell
const cowbell = s("cb").struct("<~@2 A B ~ C@9 D E F ~@5 G H I J K L M L ~@18 C@9 D E F C@6 N>".pickRestart({
  A: "~@4 x!2 ~ x ~ x ~ x ~@2 x ~", B: "~@4 x!2 ~ x ~ x ~ x!2 ~ x ~", C: "x!8", D: "x!7 ~", E: "x!5 ~ x!2",
  F: "x ~ x!6", G: "~ x ~ x ~ x ~ x", H: "x!2 ~ x ~ x ~ x", I: "~ x!3 ~ x ~ x", J: "~ x!3 ~ x!3", K: "~ x!5 ~ x",
  L: "~ x ~ x!3 ~ x", M: "~ x ~ x!5", N: "x",
})).gain(0.47)

// drums · cowbell · soft notes
const cowbell_soft = s("cb").struct("<~@14 A B C ~@5 D@2 E F E G ~ H ~@27 A B C ~@7>".pickRestart({
  A: "~@7 x", B: "~@5 x ~@2", C: "~ x ~@6", D: "~ x!3", E: "~@3 x", F: "x!2", G: "x ~@2 x", H: "x!2 ~ x",
})).gain(0.23)

stack(
  overdriven_guitar, bass, overdriven_guitar_2, overdriven_guitar_3, kick, snare, low_tom, hihat, mid_tom, mid_tom_soft,
  crash, ride, ride_soft, cowbell, cowbell_soft
)

More by Led Zeppelin