Strudelify

We're Gonna Groove

Led Zeppelin

KeyD majorTempo120 bpm
0:00/0:00
// We're Gonna Groove — Led Zeppelin
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 7/8 at bar 3, 4/4 at bar 4) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 79 bars on a 16-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 4, Guitar 5.
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 · distortion guitar · "Guitar 1"
const distortion_guitar = note("<~@23 A ~@3 A ~@13 B@2 ~@9 C ~@5 A ~@3 A ~@16>".pickRestart({
  A: "~@3 a4 g4 e4 d4@8 ~@2", B: "[~@13 e4@2 d#4@2 ~@15]/2", C: "g#5@2 ~@2 d5@2 ~@2 b4 d5 b4 a4 d5 a4 b4@2",
})).s("gm_distortion_guitar").gain(0.41)

// chords · overdriven guitar · "Guitar 2"
const overdriven_guitar = note(`<
  ~@7 A ~@10 B@3 ~@2 A ~@3 A ~@6 C@8 ~ D@2 E F@2 G@3 H ~ H I@3 ~ A ~@3 A ~@6 B@3 ~@7
>`.pickRestart({
  A: "d4@3 g4@4 ~, c4 ~@5 f4 ~@9", B: "[d4, c4 ~@47]/3",
  C: "[d4@40 c4 c4@18 ~ f4 ~@21 e4@2 f#4@2 e4@6 f#4@3 e4 g4@8 a2 ~@5 d4@6 e4 d4 e4@8 ~@2, c4 ~@39 d4@64 ~@24, ~@59 c4@6 ~@63, ~@61 g4@24 ~@43, ~@62 f4@24 ~@19 e4@8 ~@15]/8",
  D: "[~@2 c5@4 b4 ~ b4!2 ~ b4 ~ b4@2 ~ b4!2 ~ b4 ~ b4@2 ~@2 g4@2 ~ a#4 a4 g4 a#4, ~@2 b4 ~@3 c5@4 c5@2 [b4,c5]@2 ~ [b4,c5]@2 ~ c5@2 [b4,c5]@2 ~ [b4,c5]@2 ~@7, ~@24 [a4,b4]@2 ~ a4@2 ~@3]/2", // Cmaj7 Asus2
  E: "a4 g4 a#4 a4 g4 a#4 a4 g4 a4 g4 e4 d4 g4 e4 d4 g4",
  F: "[e4 d4 g4@6 a4@4 b4@12 ~ a4 b4 [a4,a#4,b4] a4 b4 [a4,a#4,b4] a4, ~@12 [a4,b4,c5] ~@3]/2", // Am
  G: "[[a4,b4]@2 [a4,a#4,b4] [a4,b4]@2 a#4@4 a4@2 ~ g4@6 e4@2 d4@15 b3@2 [e2,d3]@2 ~@5 [e5,g5]@4, ~@44 d5 ~@3]/3", // Asus2 E7 Em
  H: "[e5,g5]@4 ~ [e5,g5]@4 [e5,g5]@4 [e5,g5]@3, d5 ~@4 d5 ~@3 d5 ~@3 d5 ~@2", // Em
  I: "[[e5,g5]@36 ~@9 [d4,g4]!3, d5 ~@47]/3", // Em G5
})).s("gm_overdriven_guitar").gain(0.41)

// chords · overdriven guitar · "Guitar 3"
const overdriven_guitar_2 = note(`<
  ~@9 A ~ B ~ C D E F G ~@7 H ~@3 H D E F G I J ~@3 K ~ L ~ M@2 L ~ N@3 ~@10 H ~@3 H D E F G ~@4 D E F G O@2
>`.pickRestart({
  A: "[e4,g#4] [d4,f#4]@2 e4@2 d4 b3 a3@8 ~", B: "d4@3 g4@4 ~, c4 ~@5 f4 ~@9",
  C: "[e4,g#4] [d4,f#4]@2 [a3,d4,f#4]@3 [e3,a3,c#4]@6 ~@4", D: "~@10 [e4,a4,c#5] [d4,g4,b4] [e4,a4,c#5]@4",
  E: "~@5 [e4,a4,c#5]@2 ~, ~@10 [d4,g4,b4] ~@5", F: "~@11 [e4,a4,c#5]@4 ~, ~@11 [d4,g4,b4] ~@4",
  G: "~@3 [e4,a4,c#5]@2 ~@3, ~@6 [d4,g4,b4] ~@9", H: "[e4,g#4] [d4,f4]@2 b3 a3 g3 [e3,a3,c#4]@4 ~@6",
  I: "~@7 c#4 d4@7 a3", J: "b3 ~@3", K: "~@3 [a4,c#5]@4 ~, ~@6 [g4,b4] ~@9",
  L: "[e4,g#4] [d4,f#4]@2 b3 a3 g3 [e3,a3,c#4]@8 ~@2", // E D A
  M: "[[e4,g#4] [d4,f#4] b3 [e4,a4,c#5]@6 ~@7, ~@6 [d4,g4,b4] ~@25]/2", N: "[~@11 e4 d4@24 ~@12]/3",
  O: "[[b3,e4,g#4] [a3,d4,f#4] [e3,a3]@6]/2", // E D A5
})).s("gm_overdriven_guitar").gain(0.41)

// bass · overdriven guitar · "Guitar 4"
const bass = note("<~@17 A ~@15 A ~@9 B ~ B ~@22 A ~@7 A ~@2>".pickRestart({
  A: "~@13 [g1,a1]@2 ~", B: "~@14 d2 e2",
})).s("gm_overdriven_guitar").gain(0.41)

// chords · overdriven guitar · "Guitar 5"
const overdriven_guitar_3 = note("<~@19 A B C ~ D ~@3 D ~@30 D ~@3 D ~@7 A B C ~@6>".pickRestart({
  A: "~@3 e2 ~@3 [g#3,d4,g4] ~ [e3,g#3,d4,g4]@2 ~ [g#3,d4,g4] ~@3", B: "~@2 b3!4 [e3,b3]!2 ~ [e3,b3]@2 b3 [e3,b3]!4",
  C: "~@6 [e3,g#3,d4,g4] ~@9", D: "~@6 d3 ~",
})).s("gm_overdriven_guitar").gain(0.41)

// chords · overdriven guitar · "Guitar 6"
const overdriven_guitar_4 = note(`<
  ~ A B C D E F G H I J K L M N@4 O P Q R F G H S J G T U N@4 T@2 V W T X H S J Y L U T@8 Z AA AB F G H S J G T U N@4 O
  P Q R N@4 AC@2
>`.pickRestart({
  A: "~ [e3,g#3,d4,g4]!4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 ~@4", // E7
  B: "e2@2 e3@2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 ~@2", // E7
  C: "~ [e3,g#3,d4,g4]!7 ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~@2 d3 e3", // E7
  D: "~@2 [e3,g#3,d4]!2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 ~@2, e2 ~@3", // E7
  E: "~ [e3,g#3,d4,g4]!7 ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]!2 ~ d3 e3", // E7
  F: "e2@2 [e3,g#3,d4,g4]!4 ~ [e3,g#3,d4,g4]!2 ~@2 [e3,g#3,d4,g4] ~ d3!2 e3", // E7
  G: "[e2,e3,b3]@3 [f#3,c#4]@3 [g3,d4]@6 ~@2 d3 e3", // E5 F#5 G5
  H: "e2@2 [e3,g#3,d4,g4]!4 ~ [e3,g#3,d4,g4]!2 ~@2 [e3,g#3,d4,g4] ~@2 a2@2", // E7
  I: "[e3,b3,e4,g#4]@3 [d3,a3,d4,f#4]@3 [a2,e3,a3,c#4]@8 d3 e3", // E D A
  J: "e2@2 [e3,g#3,d4,g4]!4 ~@2 [e3,g#3,d4,g4]!2 ~ [e3,g#3,d4,g4] ~ d3!2 e3", K: "[d3,b3]@3 [f#3,c#4]@3 [g3,d4]@8 ~@2",
  L: "e2@2 [e3,g#3,d4,g4]!4 ~ [e3,g#3,d4,g4]!3 ~ [e3,g#3,d4,g4] ~ e4@3", // E7
  M: "[e3,b3,e4,g#4]@3 [d3,a3,d4,f#4]@3 [a2,e3,a3,c#4]@8 ~@2", // E D A
  N: "[a2,e3,a3,c#4]@3 [g2,d3,g3,b3]@3 [a2,e3,a3,c#4]@3 ~@7", // A G A
  O: "[e3,g#3,d4,g4]!2 ~@2 [e3,g#3,d4,g4]!2 ~@2 [g#3,d4,g4] ~@2 [g#3,d4,g4] ~ [g#3,d4,g4] ~@2", // E7 G
  P: "e3@2 e2@2 [e3,g#3,d4,g4]!2 ~@2 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]!2 ~ [e3,g#3,d4,g4]!3", // E7
  Q: "e2@2 [e3,g#3,d4,g4]!4 ~@2 [e3,g#3,d4,g4] ~@2 [e3,g#3,d4,g4] ~@4", // E7
  R: "~ [e3,g#3,d4,g4]!4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]!3 d3 e3", // E7
  S: "[e3,b3,e4,g#4]@3 [d3,a3,d4,f#4]@3 ~@8 d3 e3, ~@3 [a2,e3,a3,c#4]@5", // E D A
  T: "e2@2 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]!2 ~ [e3,g#3,d4,g4]!2 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ d3!2 e3", // E7
  U: "[e3,b3,e4,g#4]@3 [d3,a3,d4,f#4]@3 [a2,e3,a3,c#4]@10", // E D A
  V: "e2@2 e2@2 [e3,g#3,d4,g4]!2 ~ [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ d3!2 e3", // E7
  W: "e2@2 [e3,g#3,d4,g4]!3 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~@2 d3 e3", // E7
  X: "[e2,e3,b3]@3 [f3,c4]@3 [g3,d4]@4 ~@4 d3 e3", Y: "[e2,e3,b3]@3 [f#3,c#4]@3 [g3,d4]@6 ~@4",
  Z: "e2@2 [e3,g#3,d4,g4]!3 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 ~@4", // E7
  AA: "~@2 [e3,g#3,d4,g4]!3 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~ [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 ~@4", // E7
  AB: "~ [e3,g#3,d4,g4]!4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] ~@2 [e3,g#3,d4,g4]!2 ~@2 e2!2", // E7
  AC: "[[e3,b3,e4,g#4] [d3,a3,d4,f#4] [a2,e3,a3,c#4]@6]/2", // E D A
})).s("gm_overdriven_guitar").gain(0.41)

// bass · acoustic bass · "Bass"
const bass_2 = note(`<
  ~@2 A B C D E F G H E F G I J@4 E K L M N O N P N F N Q J@4 N R N S N F N T U V@2 W X Y Z AA AB N@3 AC AD AE N O N P N
  F N Q J@4 E K L M J@4 AF@2
>`.pickRestart({
  A: "e1@2 e2@2 b1 b1@2 e2 ~ g#2@2 e2 ~ b1 d2 d#2, ~@9 g2 ~@6", B: "e2@2 e2!2 g2 g2@2 a2 ~ a#2@2 b2 ~ b2 d3 e3",
  C: "e1@2 c#2!2 b1@2 ~ g2 ~ a2@2 g2@3 g#2@2", D: "e2@2 e2!2 d2@3 a1 ~ a#1@2 a1 b1 a1 d2 e2",
  E: "e2@2 e2!2 b1 ~@2 a2@2 g2@2 e2@2 d2!2 d#2", F: "e2@3 f#2@3 g2@4 d3@2 c#3 b2 g2@2",
  G: "e2 ~@2 b1!2 ~@2 a2@2 g2@2 e2!2 d2!2 d#2, ~@7 a#2 ~@8", H: "e2@3 d2@3 a1@4 c#2@2 c#2 d2!2 d#2",
  I: "e2@3 d2@3 a1@2 a2@2 e2@2 d2@2 e2@2", J: "a1@3 g1@3 a1@4 c#2@2 d2!2 d#2 e2",
  K: "e2@2 e2!2 g2@2 e2 a2 ~ a#2 ~@2 b2@2 d3 e3", L: "e2@2 e2!2 a2@3 g2@2 e2@2 d2!5",
  M: "e2 a2!2 a2@2 a2@2 c2@2 d2@2 c2@2 c#2 d2 d#2", N: "e2@2 e2!2 b1@3 a2@2 g2@2 e2@2 d2!2 d#2",
  O: "e2 ~@2 f#2 ~@2 g2@8 ~@2", P: "e2@3 d2@3 a1@4 c#2@2 d2!2 d#2!2", Q: "e2 ~ e2 d2 ~ d2 a1@4 e1@2 g1@2 a1@2",
  R: "e2@2 e2!2 g2@2 g#2 a2 ~ a#2@2 b2@3 d3 e3", S: "e2@2 e2 b1 a1@3 a#1 ~ b1@2 b1 d2@2 d2 d#2",
  T: "e2@3 d2@3 a2@4 ~ c#2 c#2@2 d2 d#2", U: "e2@2 e2!2 b1@3 a2@2 g2@2 e2@2 ~@3",
  V: "[e2@3 f#2@3 ~@10 e2@2 e2!2 b1@3 a2@2 g2@2 e2@2 d2!2 d#2, ~@3 g2@6 ~@7]/2", W: "e2@3 d2@3 a1@4 ~ g1 g1@2 a1@2",
  X: "e2@2 b1!2 a1@2 a#1 b1 ~ c#2@2 d2 ~@2 d2 d#2", Y: "e2@2 e2!2 a1@3 a1@2 a#1@2 b1@2 c#2 d2 d#2",
  Z: "e2@2 b1!2 g2@2 e2 a2 ~ a#2@2 b2 ~ e2 g2 e2", AA: "e2@2 e2!2 b1@3 g2@2 e2@2 b2 d3@2 d2 d#2",
  AB: "e2@2 e2!2 g2@2 e2 a2 ~ g2@2 g2 b2@2 d3 e3", AC: "e2@2 e2!2 g2@2 e2 a2 ~ a#2@2 a#2 b2@2 b1@2",
  AD: "~@2 b1@2 e2 e2@2 e2 ~ e2 e2@2 e2!4", AE: "e2!5 e2@2 e2 ~ e2 e2@2 d2 b1 d2 b1", AF: "[e2 d2 a1@6]/2",
})).s("gm_acoustic_bass").gain(0.41)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@7 A ~ B ~@13 A ~@3 A ~@30 A ~@3 A ~@16>".pickRestart({
  A: "~@13 x ~@2", B: "~@7 x",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<A B ~@3 C ~@8 C@3 ~@13 C@3 ~@32 C@3 ~@5 C@3 ~@3>".pickRestart({
  A: "~ x!7", B: "x!8", C: "~@14 x!2",
})).gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A ~ B ~ C ~@5 D ~@5 A ~@3 A ~@30 A ~@3 A ~@16>".pickRestart({
  A: "~@13 x ~@2", B: "~@7 x", C: "~@11 x ~ x!3", D: "~@13 x!3",
})).gain(0.41)

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~@2 A B A B A ~ C ~ C ~ C ~@5 C D A ~ A ~ C ~ C ~ C ~@28 A ~ C ~ C ~ C ~@5 C D A ~@7
>`.pickRestart({
  A: "~ x!7", B: "x!6 ~@2", C: "~@2 x!6", D: "x!8",
})).gain(0.41)

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

stack(
  distortion_guitar, overdriven_guitar, overdriven_guitar_2, bass, overdriven_guitar_3, overdriven_guitar_4, bass_2,
  kick, snare, low_tom, hihat, mid_tom, ride_bell, crash
)

More by Led Zeppelin