Strudelify

In The Evening

Led Zeppelin

KeyF minorTempo105 bpm
0:00/0:00
// In The Evening — Led Zeppelin
// 105 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "Electric Guitar II" distortion guitar (copy of ch 2 "Electric Guitar I" distortion guitar); ch 2 "Electric Guitar I" distortion guitar (copy of ch 4 "Electric Guitar III" overdriven guitar); ch 5 "Electric Guitar IV" overdriven guitar (copy of ch 4 "Electric Guitar III" overdriven guitar); ch 6 "Electric Guitar V" overdriven guitar (copy of ch 7 "Electric Guitar VI" distortion guitar); ch 9 "Lead Vocal II" pan flute (copy of ch 8 "Lead Vocal I" lead 3 calliope)
// note: Full arrangement: all 168 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 · "Electric Guitar III"
const overdriven_guitar = note(`<
  ~@2 A@3 B@8 ~@5 C@16 D@3 E@2 F@2 G C@12 H@2 C@2 D@3 E@2 F@2 G C@16 D@3 E@2 F@2 I J@2 K@2 J@2 K@2 L@2 K@2 M@6 N@2 O@2 P
  Q R@2 S@2 T@2 U ~ V@16 W@3 X@2 Y@2 Z L@2 K@2 L@2 K@2 L@2 K@2 L@2 K@2 L@2 K@2 L@2
>`.pickRestart({
  A: "[c3,f3]/3", B: "[~ [c2,f2]@3, [c1,f1]@5 ~@3]/8",
  C: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~@2 ab3@3 ab3@3 g3@4 ~ f4@8 ~@16, ~@28 [eb2,f3,bb3]@29 ~@7, ~@7 f4@2 ~@7]/2", // F5 Fsus4 Fm Ebsus2
  D: "[[bb2,db3,g3]@11 ~ [bb2,eb3,g3]@2 [bb2,eb3,g3]@2 [bb2,eb3,g3]@20 [bb2,db3,g3]@5 ~@4 [bb2,eb3]@7 [ab2,c3,eb3]@7 ~ [bb2,eb3,g3]@15 ~ [c3,eb3]@4 [db3,f3]@4 [c3,eb3]@4 g2@4 bb2@4, ~@11 g3@2 ~@11]/3", // Gdim Eb Gdim Eb5 Ab Eb Cm Db …
  E: "[[g2,c3]@4 bb2@4 g2@4 bb2@8 [ab2,c3,eb3]@7 ~ [bb2,g3]@5 ~ g2 bb2 db3@4 eb3@4 f3@4 eb3@4 ~@4 bb2@4 ~@4, ~@28 eb3@4 ~ eb3@3 ~@28]/2", // C5 Ab Eb
  F: "[[g2,c3]@4 bb2@4 g2@4 bb2@7 ~ [ab2,c3,eb3]@7 ~ [bb2,eb3,g3]@19 ~ g2@2 bb2@2 eb3@2 f3@2 eb3@7 ~]/2", // C5 Ab Eb
  G: "eb3@4 [bb2,db3,g3]@7 ~ [bb2,eb3,g3]@11 ~@9", // Gdim Eb
  H: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~@2 ab3@3 ab3@3 g3@4 ~@9 f4@8 ~@8, ~@28 [eb2,f3,bb3]@29 ~@7, ~@7 f4@2 ~@7]/2", // F5 Fsus4 Fm Ebsus2
  I: "eb3@4 [bb2,db3,g3]@7 ~ [bb2,eb3,g3]@7 ~@13", // Gdim Eb
  J: "[~@3 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~@3 ab3@3 ab3@3 g3@4 ~ f4@8 ~@16, ~@27 [eb2,f3,bb3]@29 ~@8, ~@27 f4@8 ~@29]/2", // F5 Fsus4 Fm Ebsus2
  K: "[~@3 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~ [eb2,f3,ab3,bb3]@29 ~@8]/2", // F5 Fsus4 Fm Ebsus4
  L: "[~@3 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~@3 ab3@3 ab3@3 ab3@4 ~ f4@8 ~@16, ~@27 [eb2,f3,bb3]@29 ~@8, ~@27 f4@8 ~@29]/2", // F5 Fsus4 Fm Ebsus2
  M: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~@2 ab3@3 ab3@3 ab3@4 ~ f4@8 ~@100 eb4@7 ~ f4@8 ab4@7 ~ f4@4 c4@4 ab3@4 bb3@7 ~, ~@28 [eb2,f3,bb3]@101 ~@63, ~@7 f4@2 ~@39]/6", // F5 Fsus4 Fm Ebsus2
  N: "[~@12 ab3@4 ab3@4 c4@7 ~ db4@8 f4@7 ~ db4@19 ~]/2", O: "[~@12 f3@8 bb3@7 ~ c4@8 f4@7 ~ c4@8 bb3@11 ~]/2",
  P: "~@12 ab3@8 ab3@11 ~", Q: "ab3@7 ~ ab3@4 ab3@8 ab3@11 ~",
  R: "[~@8 ab3@4 bb3@8 c4@7 ~ ab4@8 c4@4 c4@4 bb3@8 bb3@11 ~]/2",
  S: "[~@12 ab3@8 c4@7 ~ f4@8 c4@7 ~ f4@4 bb3@4 ab3@11 ~]/2",
  T: "[~@12 ab3@8 c4@7 ~ db4@8 ab4@7 ~ db4@4 c4@4 ab3@4 c4@4 ab3@4]/2", U: "f3@4 ab3@4 bb3@4 bb3@19 ~",
  V: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,bb3,c4,f4]@4 [f2,f3,ab3,c4,f4]@7 ~@2 ab3@3 ab3@3 ab3@4 ~ f4@8 ~@16, ~@28 [eb2,f3,bb3]@29 ~@7, ~@7 f4@2 ~@7]/2", // F5 Fsus4 Fm Ebsus2
  W: "[[bb2,db3,ab3]@11 ~ [bb2,eb3,ab3]@2 [bb2,eb3,ab3]@2 [bb2,eb3,ab3]@20 [bb2,db3,ab3]@5 ~@4 [bb2,eb3]@7 [ab2,c3,eb3]@7 ~ [bb2,eb3,ab3]@15 ~ [c3,eb3]@4 [db3,f3]@4 [c3,eb3]@4 ab2@4 bb2@4, ~@11 ab3@2 ~@11]/3", // Bbm7 Ebsus4 Bbm7 Eb5 Ab Ebsus4 Cm Db …
  X: "[[ab2,c3]@4 bb2@4 ab2@4 bb2@8 [ab2,c3,eb3]@7 ~ [bb2,ab3]@5 ~ ab2 bb2 db3@4 eb3@4 f3@4 eb3@4 ~@4 bb2@4 ~@4, ~@28 eb3@4 ~ eb3@3 ~@28]/2", // Ab Bb7
  Y: "[[ab2,c3]@4 bb2@4 ab2@4 bb2@7 ~ [ab2,c3,eb3]@7 ~ [bb2,eb3,ab3]@19 ~ ab2@2 bb2@2 eb3@2 f3@2 eb3@7 ~]/2", // Ab Ebsus4
  Z: "eb3@4 [bb2,db3,ab3]@7 ~ [bb2,eb3,ab3]@11 ~@9", // Bbm7 Ebsus4
})).s("gm_overdriven_guitar").gain(0.31).pan(1)

// chords · distortion guitar · "Electric Guitar VI"
const distortion_guitar = note(`<
  ~@14 A@4 ~@16 B@3 C@2 D@2 E ~@16 B@3 C@2 D@2 E ~@16 B@3 C@2 D@2 F@2 G H@2 I J K@3 L M N O P@2 Q R@2 S@2 T@3 U V@2 W@2
  X@2 Y@2 ~@16 Z@3 AA@2 AB@2 AC ~ AD AE AF@2 I ~ I ~ AG ~ AG ~ AH AI@3 ~@5
>`.pickRestart({
  A: "[~@28 f2@93 ~@7]/4",
  B: "[~@12 [bb2,eb3,g3]@2 [bb2,eb3,g3]@2 [bb2,eb3,g3]@20 ~@16 [ab2,c3,eb3]@7 ~ [bb2,eb3,g3]@15 ~@21]/3", // Eb Ab Eb
  C: "[~@20 [ab2,c3,eb3]@7 ~ [bb2,eb3,g3]@15 ~@21]/2", D: "[~@20 [ab2,c3,eb3]@7 ~ [bb2,eb3,g3]@19 ~@17]/2",
  E: "~@4 [ab2,c3,eb3]@7 ~ [bb2,eb3,g3]@11 ~@9", // Ab Eb
  F: "[~@13 [bb-1,bb0,bb1]@2 [bb-1,bb0,bb1]@2 [bb-1,bb0,bb1]@2 ~ [bb-1,bb0,bb1]@2 [bb-1,bb0,bb1]@2 ~@16 c4@2 f4@2 eb4@20, ~@13 [eb0,eb1]@35 ~@16, ~@17 eb-1@16 [f0,f1,f2]@15 ~@16]/2", // Bb Eb F
  G: "~@2 ab3@2 ab3@2 f4@2 eb4@15 ~ bb3@2 c4@2 eb4@2 f4@2",
  H: "[bb3@2 c4@2 eb4@2 f4@2 c4@4 f4@2 c4@4 f4@2 c4@4 bb4@2 c5@2 c5@8 bb4@4 ab4@2 bb4@2 ab4@15 ~ f4@4]/2",
  I: "eb4@29 ~@3", J: "~@4 eb5@11 ~ c5@2 bb4@2 bb4@4 bb4@2 bb4@2 bb4@2 c5@2",
  K: "[ab4@2 ab4@2 f4@2 eb4@2 ab4@2 eb4@2 f4@21 ~@4 [bb0,bb1]@2 ~@4 bb-1@2 [bb-1,bb0,bb1]@2 ~@3 bb-1@2 [bb0,bb1]@2 [bb0,bb1]@2 ~@4 [f0,f1,f2]@8 c4@2 eb4@2 f4@2 ab3@2 eb4@2 f4@2 c4@2 eb4@2 f4@4 eb4@7 ~, ~@33 [eb0,eb1]@32 ~@31, ~@40 [bb0,bb1]@2 [bb0,bb1]@2 ~@3 [bb0,bb1]@2 [bb0,bb1]@2 ~@45, ~@41 bb-1@2 ~@5 bb-1@2 ~@46]/3", // Bb F Eb Bb
  L: "~@2 c4 bb3 ~ c4 ab3@4 f3@4 ab3@7 ~@5 f4@4 ~@2", M: "f4@2 c4@2 f3@4 ab3@2 bb3@2 c4@11 ~ c4@4 c4@4",
  N: "c4@4 c4@2 bb3@2 c4@2 bb3@2 ab3@2 bb3@2 c4 ab3 f3@2 ab3@2 f3@2 ab3@4 eb3@2 f3@2",
  O: "ab3@4 f3@21 ~@3 bb3 ab3 ~ f3", P: "[eb4@4 c4@2 ab3@2 c4@2 ~ ab3@2 ~ ab3@39 ~ eb4@2 eb4@4 f4@4]/2",
  Q: "eb5@11 ~ eb5@4 eb5@7 ~ eb4@4 eb4@4", R: "[f4@57 ~@3 eb4@2 eb4@2]/2",
  S: "[eb4@4 eb4@43 ~ eb4@4 eb4@4 ab3@4 eb4@4]/2", T: "[c4@4 eb4@76 ~@4 c4@3 bb3@3 ab3@3 ~@3]/3",
  U: "bb3@4 ab3@7 ~ ab3@14 ~ f3@2 ~ eb3@2", V: "[eb3@4 c3@4 eb3@50 ~ eb3@2 ~ f3@2]/2",
  W: "[f3@4 ab3@4 ab3@44 bb3@11 ~]/2", X: "[ab3@4 eb3@4 eb3@44 bb3@11 ~]/2", Y: "[ab3@4 c3@4 c3@4 eb3@4 eb3@45 ~@3]/2",
  Z: "[~@12 [bb2,eb3,ab3]@2 [bb2,eb3,ab3]@2 [bb2,eb3,ab3]@20 ~@16 [ab2,c3,eb3]@7 ~ [bb2,eb3,ab3]@15 ~@21]/3", // Ebsus4 Ab Ebsus4
  AA: "[~@20 [ab2,c3,eb3]@7 ~ [bb2,eb3,ab3]@15 ~@21]/2", AB: "[~@20 [ab2,c3,eb3]@7 ~ [bb2,eb3,ab3]@19 ~@17]/2",
  AC: "~@4 [ab2,c3,eb3]@7 ~ [bb2,eb3,ab3]@11 ~@9", AD: "~@4 f5 c5 eb5@10",
  AE: "~@2 bb5@2 bb5@2 c5@2 eb5@15 ~ ab4@2 f4@2 eb4@2 c4@2",
  AF: "[ab4@2 f4@2 eb4@2 c4@2 f4@4 c4@2 f4@4 c4@2 f4@4 ab3@2 f3@2 f3@8 ab3@4 bb3@2 ab3@2 bb3@15 ~ c4@4]/2",
  AG: "c4@29 ~@3", AH: "eb3@29 ~@3", AI: "[~@24 c4@55 ~@17]/3",
})).s("gm_distortion_guitar").gain(0.56).pan(0.9)

// chords · distortion guitar · "Electric Guitar VI" · soft notes · F5 Gb F5 Gb F5 Gb F5 Ebsus2
const distortion_guitar_soft = note(`<
  ~@162
  [~@24 [f3,c4,f4] ~@7]
  [~@8 [gb3,bb3] ~@15 [f3,c4,f4] ~@7]!2
  [~@8 [gb3,bb3] ~@11 [f3,c4,f4] ~@11]
  [~@4 [gb3,bb3] ~@15 [f3,c4,f4] ~@11]
  [~@3 [eb2,f3,bb3]@28 ~]
>`).s("gm_distortion_guitar").gain(0.21).pan(0.9)

// bass · electric bass finger · "Bass Guitar"
const bass = note(`<
  ~@18 A@2 B@2 C@2 D E C@2 F@4 C@2 G@3 H@2 I@2 J A@2 B@2 C@2 D E C@2 F@4 C@2 G@3 H@2 I@2 J A@2 B@2 C@2 D E C@2 F@4 C@2
  G@3 H@2 K@3 A@2 B@2 C@2 D E C@2 L@6 M@4 N@2 O@2 N@2 M@4 N@2 A@2 P@2 C@2 D Q C@2 R@4 C@2 G@3 H@2 I@2 J A@2 P@2 C@2 D Q
  C@2 R@4 ~@8
>`.pickRestart({
  A: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@14 db2@4 f2@4 ab2@2 ~ db2@2 ~ f2@2 ~@8, ~@7 bb1@7 ~@2]/2",
  B: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 g2@2 f2@2 eb2@2 ~@15, ~@7 bb1@7 ~@2]/2",
  C: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 db2@3 f2@3 ~@15, ~@7 bb1@7 ~@2]/2",
  D: "f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@2 bb1@4", E: "~@9 c2@7 ~ db2@7 ~ ab2@4 g2@3, ~ bb1@23 ~@8",
  F: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@23 db2@4 f2@4 ab2@2 g2@2 f2@2 ~ f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 db2@3 f2@3 ~@15, ~@28 bb1@28 ~@7 db2@2 ~@27 bb1@28 ~@8]/4",
  G: "[f2@8 eb2@7 ~ eb2@4 eb2@7 ~ eb2@7 ~ f2@5 eb2@7 ~ eb2@2 ~@2 c2@6 ~ eb2@12 f2@7 ~ eb2@7 ~ eb2@7 ~]/3",
  H: "[f2@7 ~ eb2@7 ~ eb2@4 c2@7 ~ eb2@11 ~ f2@7 ~ eb2@4 ~@4 eb2@3 ~@5]/2",
  I: "[f2@7 ~ eb2@7 ~ eb2@4 c2@7 ~ eb2@11 ~ f2@7 ~ eb2@7 ~ eb2@4 eb2@4]/2", J: "f2@4 c2@7 ~ eb2@11 ~@9",
  K: "[f2@7 ~ eb2@7 ~ eb2@4 c2@7 ~ eb2@11 ~ f2@7 ~ eb2@7 ~ eb2@4 eb2@23 ~@13]/3",
  L: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@23 db2@4 f2@4 ab2@2 ab2@2 f2@2 ~ f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 db2@3 f2@3 ~@79, ~@28 bb1@28 ~@7 db2@2 ~@27 bb1@100]/6",
  M: "[c2@61 ~@3]/2", N: "[bb1@61 ~@3]/2", O: "[f2@61 ~@3]/2",
  P: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 ab2@2 f2@2 eb2@2 ~@15, ~@7 bb1@7 ~@2]/2",
  Q: "~@9 c2@7 ~ db2@7 ~ ab2@4 ab2@3, ~ bb1@23 ~@8",
  R: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@23 db2@4 f2@4 ab2@2 ab2@2 f2@2 ~ f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 db2@3 f2@3 ~@15, ~@28 bb1@28 ~@7 db2@2 ~@27 bb1@28 ~@8]/4",
})).s("gm_electric_bass_finger").gain(0.54)

// bass · electric bass finger · "Bass Guitar" · soft notes
const bass_soft = note("<~@160 A B C@2 D@4>".pickRestart({
  A: "f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@2 bb1@4", B: "~@9 c2@7 ~ db2@7 ~ ab2@4 ab2@3, ~ bb1@23 ~@8",
  C: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 db2@3 f2@3 ~@15, ~@7 bb1@7 ~@2]/2",
  D: "[f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@23 db2@4 f2@4 ab2@2 ab2@2 f2@2 ~ f2@3 f2@4 f2@4 f2@4 eb2@4 eb2@7 ~@7 db2@4 f2@4 ab2@2 db2@3 f2@3 ~@15, ~@28 bb1@28 ~@7 db2@2 ~@27 bb1@28 ~@8]/4",
})).s("gm_electric_bass_finger").gain(0.16)

// other · whistle · "Synthesizer I"
const whistle = note(`<
  A@5 B@8 ~@2 C@3 D@2 E@2 F@2 G H F@2 I@4 F@2 J@3 K@2 L@2 M D@2 E@2 F@2 G H F@2 I@4 F@2 J@3 K@2 L@2 M D@2 E@2 F@2 G H
  F@2 I@4 F@2 J@3 K@2 L@2 M D@2 E@2 F@2 G H N@2 O@6 P@4 Q@2 R@2 Q@2 P@4 Q@2 S@2 T@2 N@2 G U N@2 V@4 N@2 J@3 K@2 L@2 M
  S@2 T@2 N@2 G U N@2 V@4 ~@8
>`.pickRestart({
  A: "[~@17 f2@143]/5", B: "[~@3 c2@5, c3]/8", C: "[f1@11 ~]/3",
  D: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@14 db3@4 f3@4 g3@2 ~ db3@2 ~ f3@2 ~@8, ~@7 bb2@7 ~@2]/2",
  E: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 g3@2 g3@2 f3@2 eb3@2 ~@15, ~@7 bb2@7 ~@2]/2",
  F: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 g3@2 db3@3 f3@3 ~@15, ~@7 bb2@7 ~@2]/2",
  G: "f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@2 bb2@4", H: "~@9 c3@7 ~ db3@7 ~ g3@4 g3@3, ~ bb2@23 ~@8",
  I: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@23 db3@4 f3@4 g3@2 g3@2 f3@2 ~ f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 g3@2 db3@3 f3@3 ~@15, ~@28 bb2@28 ~@7 db3@2 ~@27 bb2@28 ~@8]/4",
  J: "[f3@8 eb3@7 ~ eb3@4 eb3@7 ~ eb3@7 ~ f3@5 eb3@7 ~ eb3@2 ~@2 c3@6 ~ eb3@12 f3@7 ~ eb3@7 ~ eb3@7 ~]/3",
  K: "[f3@7 ~ eb3@7 ~ eb3@4 c3@7 ~ eb3@11 ~ f3@7 ~ eb3@4 ~@4 eb3@3 ~@5]/2",
  L: "[f3@7 ~ eb3@7 ~ eb3@4 c3@7 ~ eb3@11 ~ f3@7 ~ eb3@7 ~ eb3@4 eb3@4]/2", M: "f3@4 c3@7 ~ eb3@11 ~@9",
  N: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 ab3@2 db3@3 f3@3 ~@15, ~@7 bb2@7 ~@2]/2",
  O: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@23 db3@4 f3@4 ab3@2 ab3@2 f3@2 ~ f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 ab3@2 db3@3 f3@3 ~@79, ~@28 bb2@28 ~@7 db3@2 ~@27 bb2@95 ~@5]/6",
  P: "[bb2@61 ~@3]/2", Q: "[ab2@61 ~@3]/2", R: "[eb3@61 ~@3]/2",
  S: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@14 db3@4 f3@4 ab3@2 ~ db3@2 ~ f3@2 ~@8, ~@7 bb2@7 ~@2]/2",
  T: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 ab3@2 ab3@2 f3@2 eb3@2 ~@15, ~@7 bb2@7 ~@2]/2",
  U: "~@9 c3@7 ~ db3@7 ~ ab3@4 ab3@3, ~ bb2@23 ~@8",
  V: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@23 db3@4 f3@4 ab3@2 ab3@2 f3@2 ~ f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 ab3@2 db3@3 f3@3 ~@15, ~@28 bb2@28 ~@7 db3@2 ~@27 bb2@28 ~@8]/4",
})).s("gm_whistle").gain(0.54).pan(0.3)

// other · whistle · "Synthesizer I" · soft notes
const whistle_soft = note("<~@160 A B C@2 D@4>".pickRestart({
  A: "f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@2 bb2@4", B: "~@9 c3@7 ~ db3@7 ~ ab3@4 ab3@3, ~ bb2@23 ~@8",
  C: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 ab3@2 db3@3 f3@3 ~@15, ~@7 bb2@7 ~@2]/2",
  D: "[f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@23 db3@4 f3@4 ab3@2 ab3@2 f3@2 ~ f3@3 f3@4 f3@4 f3@4 eb3@4 eb3@7 ~@7 db3@4 f3@4 ab3@2 db3@3 f3@3 ~@15, ~@28 bb2@28 ~@7 db3@2 ~@27 bb2@28 ~@8]/4",
})).s("gm_whistle").gain(0.16).pan(0.3)

// chords · synth drum · "Synthesizer II"
const synth_drum = note("<~@3 A ~ B ~ C@2 D@2 ~ E@3 ~@153>".pickRestart({
  A: "~@5 ab2@2 ab2@4 ~@2 bb2@2 ~@2 c3@7 ~@8, ~ eb2@7 ~@7 bb2@7 ~@10, ~@3 f2@7 ~ ab2@7 ~@14",
  B: "~@13 ab2@2 ab2@4 ~@2 f2@2 ~@2 eb2@7, ~@9 c3@7 ~@7 f2@7 ~@2, ~@11 bb2@7 ~ ab2@7 ~@6",
  C: "[~@18 ab1@4 ab1@2 ~@4 eb1@2 ~@6 c1@2 ~@2 bb0@2 bb0@7 ~@15, ~@24 ab1@6 eb1@7 ~ c1@7 ~@19, ~@26 f1@6 db1@7 ~@25]/2",
  D: "[~@13 bb0@2 ~@2 c1@2 ~@6 eb1@2 ~@4 ab1@2 ab1@4 ab1@7 ~@20, ~@15 bb0@7 ~ db1@6 f1@7 ~@28, ~@19 c1@7 ~ eb1@7 ~@30]/2",
  E: "[~@10 bb1@2 ~@2 ab1@2 ab1@2 ~@6 eb2@2 ~@8 bb1@2 ~@2 ab1@2 ab1@2 ~@8 ab1@2 ab1@2 ~@2 bb1@2 ~@8 eb2@2 ~@6 ab1@2 ab1@2 ~@2 bb1@2 bb1@7 ~@7, ~@12 bb1@6 ab1@7 ~ eb2@6 c2@7 ~@3 ab1@7 ~@5 ab1@6 c2@7 ~ eb2@7 ~@21, ~@22 f1@6 db2@7 ~ bb1@7 ~@3 f1@7 ~@5 bb1@6 db2@6 f1@7 ~ ab1@7 ~@11]/3",
})).s("gm_synth_drum").gain(0.42).pan(0.7)

// chords · synth strings 1 · "Synthesizer IV"
const synth_strings_1 = note("<~@18 A@16 ~@8 B@16 ~@8 B@16 ~@10 B@10 C@4 ~@16 B@16 ~@8 B@16 ~@6>".pickRestart({
  A: "[~@4 [f3,f4,c5,f5]@4 [f3,f4,c5,f5]@4 [f3,f4,c5,f5]@4 [f3,f4,c5,f5]@4 [f3,f4,c5,f5]@7 ~ [eb3,f4,bb4,f5]@29 ~@7, ~@20 ab4@37 ~@7]/2", // F5 Ebsus2
  B: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@7 ~ [eb2,f3,bb3,f4]@29 ~@7, ~@20 ab3@37 ~@7]/2", // F5 Ebsus2
  C: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@7 ~ [eb2,f3,bb3,f4]@100, ~@5 ab3@27]/4", // F5 Ebsus2
})).s("gm_synth_strings_1").gain(0.44)

// chords · synth strings 1 · "Synthesizer IV" · soft notes
const synth_strings_1_soft = note("<~@162 A@6>".pickRestart({
  A: "[~@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@4 [f2,f3,c4,f4]@7 ~ [eb2,f3,bb3,f4]@29 ~@7, ~@20 ab3@37 ~@7]/2", // F5 Ebsus2
})).s("gm_synth_strings_1").gain(0.15)

// other · pad sweep · "Synthesizer V"
const pad_sweep = note("<A@8 ~@96 B C D E@3 F@2 G H@5 I@2 J@2 ~@46>".pickRestart({
  A: "[~ [c2,f2], [c3,f3]]/8", B: "~@23 eb2@2 eb2@4 f2@3", C: "~ eb3@11 ~ eb3@4 eb3@7 ~ eb2@4 eb2@3", D: "~ f2@29 ~@2",
  E: "[~@29 eb2@2 eb2@2 eb2@4 eb2@43 ~ eb2@4 eb2@4 ab1@4 eb2@3]/3", F: "[~ c2@4 eb2@57 ~@2]/2",
  G: "~@21 c2@3 bb1@3 ab1@3 ~@2",
  H: "[~ bb1@4 ab1@7 ~ ab1@14 ~ f1@2 ~ eb1@2 eb1@4 c1@4 eb1@50 ~ eb1@2 ~ f1@2 f1@4 ab1@4 ab1@44 bb1@11]/5",
  I: "[~ ab1@4 eb1@4 eb1@44 bb1@11]/2", J: "[~ ab1@4 c1@4 c1@4 eb1@4 eb1@45 ~@2]/2",
})).s("gm_pad_sweep").gain(0.24).pan(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@17 A B@17 C B D B C E F B@17 C B D B C E G B@17 C B D B C E ~ B@14 ~ A@16 F B@17 C B D B C E G B@22
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@2 x ~@2 x!2 ~", D: "~@2 x ~@2 x!3", E: "~@2 x ~@3 x!2", F: "~@8 x ~@7 x ~@8 x ~@6",
  G: "~ x ~@2",
})).gain(0.76)

// drums · low tom
const low_tom = s("lt").struct("<~@104 [~@7 x] ~@63>").gain(0.76)

// drums · hihat
const hihat = s("hh").struct("<~@18 A@16 B@7 C A@16 B@7 C A@16 B@7 C A@14 D@17 C A@16 B@7 C A@22>".pickRestart({
  A: "x!8", B: "x!16", C: "x!7 ~@9", D: "~ x ~ x ~ x ~ x",
})).gain(0.76)

// drums · mid tom
const mid_tom = s("mt").struct("<~@104 [~@15 x ~@6 x ~@9] ~@63>").gain(0.76)

// drums · open hat
const open_hat = s("oh").struct("<~@41 [~@2 x!2] ~@79 [~@2 x!2] ~@46>").gain(0.76)
// … 32 more lines

More by Led Zeppelin