Strudelify

Four Sticks

Led Zeppelin

KeyG majorTempo186 bpm
0:00/0:00
// Four Sticks — Led Zeppelin
// 186 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "Electric Guitar II" distortion guitar (copy of ch 2 "Electric Guitar I" distortion guitar); ch 5 "Electric Guitar IV" overdriven guitar (copy of ch 4 "Electric Guitar III" overdriven guitar); ch 9 "Bass Guitar II" fretless bass (copy of ch 8 "Bass Guitar I" acoustic bass); ch 11 "Acoustic Guitar I" electric guitar jazz (copy of ch 12 "Acoustic Guitar II" acoustic guitar steel)
// note: Full arrangement: all 246 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): Electric Guitar III.
setcpm(186/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 · "Electric Guitar I"
const distortion_guitar = note(`<
  A@3 B C D@2 E A@3 F@2 G B C A@3 B C A@3 B C D@2 E A@3 F@2 G B C A@3 B C A@3 B C D@2 E A@3 H@3 ~@22 G B C A@3 B C A@3
  F@2 G B C D@2 E A@3 B C A@3 B C D@2 E A@3 F@2 ~@43 I@3 J@3 K@2 L@5 I@3 J@3 K@2 M@4 A@3 B C A@3 B C D@2 E A@3 F@2 G B C
  A@3 B C A@3 B C A@3 B C A@3 B C A@3 B C A@3 B ~@13
>`.pickRestart({
  A: "[[c#2,c#3]@2 [d2,d3]@2 [e2,e3]@3 [g2,g3]@3 [c#2,c#3]@2 [d2,d3]@2 [e2,e3]@3 [g2,g3]@3 [c#2,c#3]@2 [d2,d3]@2]/3", // C# D E G C# D E G …
  B: "[e2,e3]@3 [g2,g3]@3 [c#2,c#3]@2", C: "[d2,d3]@2 [e2,e3]@3 [g2,g3]@3",
  D: "[[c#2,c#3]@4 [d2,d3]@4 [a2,e3,a3]@2 [a2,e3,a3]@21 ~]/2", E: "[g2,d3,g3]@7 ~@9",
  F: "[[a2,e3,a3]@2 [a2,e3,a3]@21 ~ [g2,d3,g3]@7 ~]/2", G: "~@2 [c#2,c#3] [d2,d3]",
  H: "[[a2,e3,a3]@2 [a2,e3,a3]@21 ~ [g2,d3,g3]@12 ~@12]/3", I: "[~@4 b4@8 a4@7 ~ g#4@4 b4@4 c#5@8 d5@7 ~ f5@4]/3",
  J: "[f#5 a#5@5 ~ a#5@5]/3", K: "[~@13 b4@8 a4@7 ~ g#4@3]/2",
  L: "[~ b4@4 c#5@8 d5@7 ~ f5@4 f#5@4 a#5@20 ~@4 a#5@20 ~@7]/5", M: "[~ b4@4 c#5@8 d5@7 ~ f5@4 f#5@4 a#5@20 ~@15]/4",
})).s("gm_distortion_guitar").gain(0.39).pan(0.3)

// other · distortion guitar · "Electric Guitar I" · soft notes
const distortion_guitar_soft = note(`<
  ~@57 A B C D A B C D A B C D A B C D A B C E F ~@39 A B C D A B C D A B C D A B C D A B C E F A B C D A B C D A B C D
  A B C D A B C F ~@75 G H@3 I G H@3 I G J@2
>`.pickRestart({
  A: "~@4 [d2,g2]!2 [d2,g2]@2", B: "~@2 [d2,g2]!2 [d2,g2]@2 ~@2", C: "[d2,g2]!2 [d2,g2]@2 ~@2 [d2,g2]!2",
  D: "[d2,g2]@4 ~@2 [c#2,f#2]@9 ~", E: "[d2,g2]@2 ~@2 [d2,g2]!2 [d2,g2]@2", F: "~@2 [c#2,f#2]@9 ~@5",
  G: "[d2,d3]@2 [e2,e3]@3 [g2,g3]@3", // D E G
  H: "[[c#2,c#3]@2 [d2,d3]@2 [e2,e3]@3 [g2,g3]@3 [c#2,c#3]@2 [d2,d3]@2 [e2,e3]@3 [g2,g3]@3 [c#2,c#3]@2 [d2,d3]@2]/3", // C# D E G C# D E G …
  I: "[e2,e3]@3 [g2,g3]@3 [c#2,c#3]@2", J: "[[c#2,c#3]@2 [d2,d3]@2 [e2,e3]@3 [g2,g3]@3 ~@6]/2",
})).s("gm_distortion_guitar").gain(0.24).pan(0.3)

// bass · acoustic bass · "Bass Guitar I"
const bass = note(`<
  A@3 B C D@2 E F@3 G@2 H I J K@3 B C A@3 B C D@2 E F@3 G@2 L B C M@6 N@7 A@3 O@2 P@3 Q@2 R@3 S T U@2 V@2 W X Y Z AA
  AB@2 AC@3 I J A@3 B C A@3 O@2 H I J AD@2 AE K@3 B C A@3 B C D@2 E F@3 G@2 P@3 Q@2 R@3 S T U@2 V@2 W X Y Z AA AB@2 AF@3
  Q@2 R@3 S T U@2 V@2 W X Y Z AA AB@2 B C M@6 AG@4 M@6 AG@4 AH@7 B C A@3 B C D@2 E F@3 G@2 H I J A@3 B C A@3 B C A@3 B C
  A@3 B C A@3 B C A@3 B C A@3 B C A@3 B C AI@2
>`.pickRestart({
  A: "[c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4]/3", B: "e2@11 ~ c#2@4", C: "d2@4 e2@11 ~",
  D: "[c#2@4 d2@4 e2@23 ~]/2", E: "d2@7 ~@9", F: "[~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@3]/3",
  G: "[~ e2@23 ~ d2@7]/2", H: "~@9 c#2@4 d2@3", I: "~ e2@11 ~ c#2@3", J: "~ d2@4 e2@11",
  K: "[~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 c#2@4 d2@4]/3", L: "~@2 c#2 d2",
  M: "[c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@9]/6",
  N: "[~@3 c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@23 ~ d2@7 ~@10]/7",
  O: "[e2@23 ~ d2@7 ~]/2", P: "[a1@10 e2@2 g2@2 a2@3 e2 a2@4 e2@2]/3", Q: "[a2 e2 a2 e2 a1@6 a2 e2 a1@4]/2",
  R: "[a2 e2 a1@2 a2@2 a2 e2@2 a2 a1@8 a2 e2 a1@4]/3", S: "a2 e2 a1@2 e2@2 e3@2", T: "e2@2 a2@3 e2 a2 e2",
  U: "[a2@3 e2 a2 e2 a2@3 e2 a2 e2 a2@3 e2]/2", V: "[a2 e2 a1@8 e2@2 g2@2 a2@2]/2", W: "e3!2 a2@2 b2@2 e2@2",
  X: "b2@2 a2@3 a2@3", Y: "a2@11 ~ e3@2 e3@2", Z: "a2@2 a2@4 a2 f#2", AA: "e2@4 a1@11 ~",
  AB: "[e2@3 g2@2 e2 a2@3 a2@3 f#2@2 e2@2]/2", AC: "[c#2@4 a1@37 c#2@4 d2@3]/3", AD: "[~ c#2@4 d2@4 e2@23]/2",
  AE: "~ d2@7 ~@8", AF: "[c#2@2 ~@15 e2 a2@4 e2@2, ~@4 a1@37 ~@7]/3",
  AG: "[~@3 c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 ~@2]/4",
  AH: "[c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 c#2@4 d2@4 e2@11 ~ c#2@4 ~@2 c#2@4 d2@4 e2@11 ~ c#2@4 d2@4 e2@11 c#2@4 d2@4, ~@63 d2@4 ~@45]/7",
  AI: "[c#2@4 d2@4 e2@11 ~@13]/2",
})).s("gm_acoustic_bass").gain(0.7)

// chords · acoustic guitar steel · "Acoustic Guitar II"
const acoustic_guitar_steel = note(`<
  ~@56 A@2 B@3 C@3 D@3 E@3 F@3 D@3 G@2 ~@38 A@2 B@3 C@3 D@3 E@3 F@3 D@6 B@3 C@3 D@3 E@3 F@3 D@3 ~ H@3 I@3 J@2 K@5 H@3
  I@3 J@2 L@6 ~@61
>`.pickRestart({
  A: "[~@12 [d4,g4]!2 [d4,g4]@18]/2", B: "[~@5 [d4,g4] [d4,g4]@18 ~@5 [d4,g4] [d4,g4]@18]/3",
  C: "[~@4 [d4,g4]!2 [d4,g4]@18 ~@3 [d4,g4]!2 [d4,g4]@18 ~]/3", // G5
  D: "[~@4 [d4,g4]!2 [d4,g4]@18 ~@4 [d4,g4]!2 [d4,g4]@18]/3", // G5
  E: "[~@4 [d4,g4]!2 [d4,g4]@18 ~@4 [d4,g4] g4 g4@18, ~@29 d4@18 ~]/3", // G5
  F: "[~@3 [d4,g4]!2 [d4,g4]@18 ~@5 [d4,g4]!2 [d4,g4]@18]/3", G: "[~@4 [d4,g4]!2 [d4,g4]@18 ~@8]/2",
  H: "[~@4 e4@8 d4@7 ~ c#4@4 e4@4 f#4@8 g#4@7 ~ a#4@4]/3", I: "[b4 d#5@5 ~ d#5@5]/3", J: "[~@13 e4@8 d4@7 ~ c#4@3]/2",
  K: "[~ e4@4 f#4@8 g#4@7 ~ a#4@4 b4@4 d#5@20 ~@4 d#5@20 ~@7]/5",
  L: "[~ e4@4 f#4@8 g#4@7 ~ a#4@4 b4@4 d#5@20 ~@4 a#5@36 ~@7]/6",
})).s("gm_acoustic_guitar_steel").gain(0.39).pan(0)

// chords · distortion guitar · "Electric Guitar V"
const distortion_guitar_2 = note(`<
  ~@56 A@3 B@6 C@3 D@3 E@3 F@5 ~@37 A@3 B@6 C@3 D@3 E@3 G@6 B@6 C@3 D@3 E@3 H@3 ~@88
>`.pickRestart({
  A: "[[d3,g3]@18 ~@6 g3 [d3,g3]@18 ~@5]/3", B: "[g3 [d3,g3]@18 ~@5 [d3,g3]@18 ~@5 [d3,g3]@18 ~@7 [d3,g3]@18 ~@6]/6",
  C: "[g3 g3@18 ~@5 g3 g3@18 ~@5, d3@3 ~ d3@3 ~]/3", D: "[[d3,g3]@18 ~@5 [d3,g3]@18 ~@7]/3",
  E: "[[d3,g3]@18 ~@6 g3 g3@18 ~@5, ~@4 d3@3 ~]/3", F: "[g3 g3@18 ~@5 [d3,g3]@18 ~@5 [d3,g3]@18 ~@15, d3@9 ~@31]/5",
  G: "[g3 g3@18 ~@5 [d3,g3]@18 ~@5 [d3,g3]@18 ~@7 g3 [d3,g3]@18 ~@5, d3@3 ~@13]/6", // G5
  H: "[g3 g3@18 ~@5 [d3,g3]@18 ~@6, d3@3 ~@5]/3", // G5
})).s("gm_distortion_guitar").gain(0.64).pan(1)

// chords · distortion guitar · "Electric Guitar V" · soft notes
const distortion_guitar_soft_2 = note("<~@158 A@3 B@3 C@2 D@5 A@3 B@3 C@2 E@6 ~@61>".pickRestart({
  A: "[~@4 e4@8 d4@7 ~ c#4@4 e4@4 f#4@8 g#4@7 ~ a#4@4]/3", B: "[b4 d#5@5 ~ d#5@5]/3", C: "[~@13 e4@8 d4@7 ~ c#4@3]/2",
  D: "[~ e4@4 f#4@8 g#4@7 ~ a#4@4 b4@4 d#5@20 ~@4 d#5@20 ~@7]/5",
  E: "[~ e4@4 f#4@8 g#4@7 ~ a#4@4 b4@4 d#5@20 ~@4 d#5@36 ~@7]/6",
})).s("gm_distortion_guitar").gain(0.39).pan(1)

// other · pad poly · "Synthesizer II"
const pad_poly = note("<~@56 A@8 ~@13 B@3 ~@36 A@8 ~@33 C@4 D@3 E@2 F@5 G@3 D@3 E@2 H@6 ~@61>".pickRestart({
  A: "[d2,g2]/8", B: "[~ d3@40 ~@7, g3@41 ~@7]/3",
  C: "[~@20 b4@8 a4@7 ~ g#4@4 b4@4 c#5@8 d5@7 ~ f5@4, g3@41 ~@23, ~ d3@40 ~@23]/4", D: "[f#5 a#5@5 ~ a#5@5]/3",
  E: "[~@13 b4@8 a4@7 ~ g#4@3]/2", F: "[~ b4@4 c#5@8 d5@7 ~ f5@4 f#5@4 a#5@20 ~@4 a#5@20 ~@7]/5",
  G: "[~@4 b4@8 a4@7 ~ g#4@4 b4@4 c#5@8 d5@7 ~ f5@4]/3", H: "[~ b4@4 c#5@8 d5@7 ~ f5@4 f#5@4 a#5@20 ~@4 a#5@36 ~@7]/6",
})).s("gm_pad_poly").gain(0.59).pan(0.1)

// other · lead 2 sawtooth · "Synthesizer III"
const lead_2_sawtooth = note("<~@56 A@8 ~@13 B@3 ~@36 A@8 ~@33 C@4 D@3 E@2 F@5 G@3 D@3 E@2 H@6 ~@61>".pickRestart({
  A: "[d2,g2]/8", B: "[~ d3@40 ~@7, g3@41 ~@7]/3",
  C: "[~@20 e4@8 d4@7 ~ c#4@4 e4@4 f#4@8 g#4@7 ~ a#4@4, g3@41 ~@23, ~ d3@40 ~@23]/4", D: "[b4 d#5@5 ~ d#5@5]/3",
  E: "[~@13 e4@8 d4@7 ~ c#4@3]/2", F: "[~ e4@4 f#4@8 g#4@7 ~ a#4@4 b4@4 d#5@20 ~@4 d#5@20 ~@7]/5",
  G: "[~@4 e4@8 d4@7 ~ c#4@4 e4@4 f#4@8 g#4@7 ~ a#4@4]/3",
  H: "[~ e4@4 f#4@8 g#4@7 ~ a#4@4 b4@4 d#5@20 ~@4 d#5@36 ~@7]/6",
})).s("gm_lead_2_sawtooth").gain(0.59).pan(0.9)

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

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@228 A B C D E A B C D E A B C D E A B ~>".pickRestart({
  A: "~ x!3", B: "x ~ x!2", C: "x!2 ~ x", D: "x!3 ~", E: "x!4",
})).gain(0.31)

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

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@230 A B C D@2 A B C D@2 A B C D@2 ~>".pickRestart({
  A: "~@5 x ~@2", B: "x ~@4 x ~@2", C: "x", D: "~ x ~@2 x ~@3",
})).gain(0.31)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  A@7 B A@20 B A@20 B A@14 C A@26 B A@18 B A@13 C A@20 C A@50 B A@31 D ~@17
>`.pickRestart({
  A: "~ x ~@3 x ~@3 x ~@3 x ~@2", B: "~ x ~@3 x ~@3 x ~@2 x ~@3", C: "~@5 x ~@3 x ~@3 x ~@2", D: "~ x ~@14",
})).gain(0.76)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct("<~@228 [~@5 x ~@3 x ~@3 x ~@2] [~ x ~@3 x ~@3 x ~@3 x ~@2]!16 ~>").gain(0.31)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A B C ~ D E F G A B H E F G I D E B C ~ D E B H ~ D E F G A B H E F G I D E B C ~ D E B H ~ D E F G A B H E G H E G J
  A K L A M G J A K L A M H E G J A K L@2 E B C ~ D E B H ~ D E F G A B H E F L E B C ~ D E B H ~ D E F G A B H E H E G
  J A K L A M G J A K L A M H E G J A K L G J A K L A M G J A K L A M H E G J A L J A K L A M H E G J A K L@2 J A K L@3
  H E G J A L E B C ~ D E B H ~ D E F G A B H E L E B C D E B H ~ D E B H ~ D E B H ~ D E B H ~ D E B I ~@17
>`.pickRestart({
  A: "~ x", B: "~@5 x ~@2", C: "x ~@6 x", D: "~ x ~@2 x ~@3", E: "~@3 x ~@4", F: "~ x ~@5 x", G: "~ x ~@2",
  H: "x ~@2 x", I: "x", J: "x ~@4 x ~@2", K: "~@2 x ~@4 x", L: "~@3 x", M: "~ x ~@6",
})).gain(0.76)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@228 A ~ B C D E ~ B C D E ~ B C D E ~@2>".pickRestart({
  A: "~@3 x", B: "~ x ~@2 x ~@3", C: "~@3 x ~@4", D: "~@5 x ~@2", E: "x ~@2 x",
})).gain(0.31)

// drums · open hat
const open_hat = s("oh").struct("<A@64 B A@59 B A@20 B A@82 C ~@17>".pickRestart({
  A: "x!4", B: "~ x!3", C: "x",
})).gain(0.76)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@228 [~ x!3] [x!4]!16 ~>").gain(0.31)

// drums · high tom
const high_tom = s("ht").struct(`<
  A B ~ C D E D F A B ~ E D G@2 H E I ~ G H E I ~ C D E D F A B ~ E D G@2 H E I ~ G H E I ~ C D E D F A B ~ E G ~ E G I
  H ~ J ~ K ~ I H ~ J ~ K ~ E G I H ~ J@2 E I ~ G H E I ~ C D E D F A B ~ E D J E I ~ G H E I ~ C D E D F A B ~ E ~ E G
  I H ~ J ~ K ~ I H ~ J ~ K ~ E G I H ~ J G I H ~ J ~ K ~ I H ~ J ~ K ~ E G I H J I H ~ J ~ K ~ E G I H ~ J@2 I H ~ J@3
  ~ E G I H J E I ~ G H E I ~ C D E D F A B ~ E J E I ~ H E I ~ C H E I ~ C H E I ~ C H E I ~ C H E I ~@18
// … 38 more lines

More by Led Zeppelin