Strudelify
Immigrant Song cover art

1970 · Led Zeppelin III

Immigrant Song

Led Zeppelin

KeyG♭ majorTempo102 bpm
0:00/0:00
// Immigrant Song — Led Zeppelin
// 102 bpm, 4/4, key Gb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 66 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/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.

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@7 A B C D E F G D H I J K L M N O P Q R S T U V B C D E F G D H I J K L M N O P W X Y Z AA AB AC AD AE@2 AF@2 AG AH
  AI AJ AK AL@2 AM
>`.pickRestart({
  A: "~@12 a1 e1@3", B: "e1@2 e1 e1@2 e1@2 e1 e1@2 e1!2 ~ e1@2 e1", C: "e1 ~ e1 e1@3 e1 ~ e1@2 e1@2 a1 a1@2 ~",
  D: "gb1 ~ gb1 ~@2 gb1@2 e1 gb1 ~ gb1 ~@2 gb1@2 e1", E: "gb1@2 gb1 ~@2 gb1@2 e1 gb1 ~ gb1@2 ~ gb1@2 e1",
  F: "gb1@2 gb1@2 ~ gb1@2 e1 gb1@2 gb1@2 ~ gb1@2 e1", G: "gb1@2 gb1 ~@2 gb1@2 e1 gb1@2 gb1@2 ~ gb1@2 e1",
  H: "gb1@2 gb1@2 ~ gb1@2 e1 gb1@2 a1!3 a1@2 e1", I: "e1 ~ e1!2 ~ e1 ~ e1!2 ~ e1!2 ~ e1 ~ e1",
  J: "e1 ~ e1!3 e1@2 e1!2 ~ e1!2 a1 a1@2 gb1", K: "gb1 ~ gb1@2 ~ gb1 ~ e1 gb1@2 gb1@2 ~ gb1@2 e1",
  L: "gb1@2 gb1@2 ~ gb1@2 e1 gb1@2 gb1 ~@2 gb1@2 e1", M: "a1!2 db2 d2 e2 gb2 g2 a2 a1 b1 db2 d2 e2 gb2 g2 a2",
  N: "b1 db2 eb2 e2 gb2 ab2 a2 b2 b1 db2 eb2 ~ gb2 ab2 a2 c3, ~@11 e2@2 ~@3",
  O: "c2 d2 e2 f2 g2 a2 bb2 c3 c2 d2 e2 f2 g2 a2 bb2 c3", P: "c2 d2 e2 f2 g2 a2 bb2 b2 c3 ~@6 gb1",
  Q: "gb1 ~ gb1 ~ gb2 gb1 ~ e1 gb1 ~ gb1@2 gb2 gb1 ~ e1", R: "gb1 ~ gb1 ~ gb2 gb1@2 e1 gb1 ~ gb1 ~ gb2 gb1 ~ e1",
  S: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1 ~ gb1 ~ gb2 gb1 ~ e1",
  T: "gb1 ~ gb1 ~ gb2 gb1 ~@2 gb1 ~ gb1 ~ gb2 gb1 ~ e1, ~@7 e1@2 ~@7",
  U: "gb1 ~ gb1 ~ gb2 gb1 ~ e1 gb1 ~ gb1 ~ gb2 gb1 ~ e1", V: "gb1 ~ gb1 ~@2 gb1@2 e1 gb1 ~ gb1 e1 a1 e1@3",
  W: "gb1 ~ gb1!2 ~ gb1 ~@2 gb1 ~ gb1@2 ~ gb1 ~ e1", X: "gb1@2 gb1 ~@2 gb1 ~ e1 gb1@2 gb1@2 ~ gb1 ~ e1",
  Y: "gb1@2 gb1@2 ~ gb1 ~ e1 gb1@2 gb1 ~@2 gb1 ~ e1", Z: "gb1@2 gb1 ~@2 gb1 ~ e1 gb1 ~ gb1 ~@2 gb1 ~ e1",
  AA: "gb1@2 gb1 ~@2 gb1 ~ e1 gb1@2 gb1 ~@2 gb1 ~ e1", AB: "gb1@2 gb1 ~@2 gb1 ~ e1 gb1 ~ gb1!2 ab1 a1@2 gb1",
  AC: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1 ~ gb1@2 gb2 gb1@2 e1", AD: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1@3 c2 c2@3 ~",
  AE: "[gb1@2 gb1@2 gb2 gb1 ~@2 gb1 ~ gb1@2 gb2 gb1 ~@2 gb1@2 gb1@2 gb2 gb1 ~ e1 gb1@3 c2 c2@2 c2@2, ~@7 e1@2 ~@6 e1@2 ~@15]/2",
  AF: "[gb1@2 gb1@2 gb2 gb1 ~ e1 gb1@2 gb1@2 gb2 gb1 ~@2 gb1@2 gb1@2 gb2 gb1 ~ e1 gb1@2 ~ c2@3 c2@2, ~@15 e1@2 ~@15]/2",
  AG: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1 ~ gb1@2 gb2@2 ~@2", AH: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1 ~ gb1@2 c2 ~ c2@2",
  AI: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1@2 gb1@2 c2 gb1 c2@2", AJ: "gb1 ~ gb1@2 gb2 gb1 e1!2 gb1@2 ~ c2@2 g1 c2@2",
  AK: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1@2 ~ a1 c2 ~ f1 gb1, ~@13 e1@2 ~",
  AL: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1 ~@2 c2@2 g1 c2@2", AM: "gb1 ~ gb1@2 gb2 gb1 ~ e1 gb1 ~@7",
})).s("gm_fretless_bass").gain(0.54)

// chords · overdriven guitar · "Guitar 1"
const overdriven_guitar = note(`<
  ~@7 A B@2 C@5 D B@2 C@2 E F G H C@5 D B@2 C@5 D B@2 C@2 E I J H C@7 K C K C K@8 L
>`.pickRestart({
  A: "~@3 [a3,db4,e4,a4]", B: "[[e3,ab3,b3,e4]@6 [b3,e4,ab4] [a3,db4,e4,a4]]/2",
  C: "[gb3,db4] ~@2 [gb3,db4] [db4,gb4,db5] [gb3,db4] ~ [gb3,db4]!2 ~@2 [gb3,db4] [db4,gb4,db5] [gb3,db4] ~ [gb3,db4]", // Gb5
  D: "[gb3,db4] ~@2 [gb3,db4] [db4,gb4,db5] [gb3,db4] ~ [gb3,db4]!2 ~@2 [gb3,db4] [a3,db4,e4,a4]@4, ~@12 db5 ~@3", // Gb5 A
  E: "[a2,e3,a3]", F: "[b2,gb3,b3]", G: "[c3,g3,c4]", H: "[c3,g3,c4]@8 [c3,g3,c4] ~@7", I: "[b2,gb3,b3]@15 ~",
  J: "[c3,g3,c4]@15 ~", K: "[gb3,db4] ~@2 [gb3,db4] [db4,gb4,db5] [gb3,db4] ~ [gb3,db4]!2 ~@2 [gb3,db4] db5 ~@3",
  L: "[gb3,db4] ~@2 [gb3,db4] [db4,gb4,db5] [gb3,db4] ~ [gb3,db4]!2 ~@7", // Gb5
})).s("gm_overdriven_guitar").gain(0.12).pan(0.7)

// chords · overdriven guitar · "Guitar 1" · soft notes
const overdriven_guitar_soft = note("<~@10 A@6 ~@2 A@2 ~@4 A@6 ~@2 A@6 ~@2 A@2 ~@4 A@19 B>".pickRestart({
  A: "~@2 [gb3,db4] ~@7 [gb3,db4] ~@5", B: "~@2 [gb3,db4] ~@13",
})).s("gm_overdriven_guitar").gain(0.07).pan(0.7)

// other · overdriven guitar · "Guitar 2"
const overdriven_guitar_2 = note(`<
  A B A@5 C D@2 A@5 C E@2 A F@2 G H I A@5 C D@2 A@5 C J@2 A F@2 G H I K L K@3 M A M K N K M N@7 O
>`.pickRestart({
  A: "gb2@2 gb2 ~ gb3 gb2 ~ gb2 gb2@2 gb2 ~ gb3 gb2 ~ gb2, ~@3 gb2@2 ~@6 gb2@2 ~@3",
  B: "gb2@2 gb2 ~ gb3 gb2 ~ gb2 gb2@2 gb2 ~@2 gb2 ~ gb2, ~@3 gb2@2 ~@6 gb2@2 ~@3, ~@6 gb3 ~",
  C: "gb2@2 gb2 ~ gb3 gb2 ~ gb2 gb2@2 gb2 ~ [a2,e3,a3]@4, ~@3 gb2@2 ~@6 gb2@2 ~@3", // A5
  D: "[[b2,e3,ab3,b3]@24 [b2,e3,ab3]@2 [c3,f3,a3] [db3,d3,gb3,g3,ab3,bb3] [a2,e3,a3,db4]@4, e2@15 ~, ~@3 b3, ~@28 [eb3,c4] ~@3]/2", // E F A Cm
  E: "[[b2,ab3,b3]@24 [b2,e3,ab3]@2 [c3,f3,a3] [db3,d3,gb3,g3,ab3,bb3] [a2,e3,a3,db4]@4, e4, e2@15 ~, e3 ~@23 b3@8, ~@28 [eb3,c4] ~@3]/2", // E F A Cm
  F: "[gb2@2 gb2 ~ gb3 gb2 ~ gb2 gb2@2 gb2 ~ gb3 gb2 ~@2 [a2,e3,a3,db4,e4]@3 [e3,db4,e4] e4 e4@3 [a2,e3,a3,db4]@3 [db4,e4] e4 e4@3, ~@3 gb2@2 ~@6 gb2@2 ~@2 gb2@4 a3@5 e4@2 ~ a3@5, ~@5 [a2,e3,db4] ~ [a2,e3,db4]]/2", // A Dbm A Dbm A
  G: "[b2,gb3,b3,eb4]@2 [b3,eb4] [gb3,b3,eb4]!2 [gb3,b3,eb4]@2 [b2,gb3,b3,eb4] [b2,gb3,b3,eb4]@2 [gb3,eb4]!2 eb4 [b2,eb4]@2 [b2,b3,eb4], ~@3 b2@4 ~@3 [b2,b3]@2 [gb3,b3]@4", // B Ebm B B5
  H: "[c3,g3,c4,e4]@4 [g3,c4,e4]@2 e4 [c4,e4]@2 [g3,c4,e4] [g3,e4]@2 [c3,e4]@2 [c3,c4,e4]@2, ~ c3@2 g3, ~@6 g3@3 ~ c4@4 ~@2", // C
  I: "[c4,e4] ~ e4 ~ e4 ~ e4 [c4,e4] [c3,g3,c4,e4]@2 ~@6, [c3,g3]!2 ~@2, ~ [c4,e4]@2 [c4,e4]@2 [c4,e4]@2 ~@9", // C C5 C
  J: "[[b2,e3,ab3,b3]@24 [b2,e3,ab3]@2 [c3,f3,a3] [db3,d3,gb3,g3,ab3,bb3] [a2,e3,a3,db4]@4, e4, e2@15 ~, ~@3 b3, ~@28 [eb3,c4] ~@3]/2", // E F A Cm
  K: "gb2@2 gb2 ~ gb3 gb2 ~@2 gb2@2 gb2 ~ gb3 gb2 ~@2, ~@3 gb2@2 ~@6 gb2@2 ~@3",
  L: "gb2@2 gb2 ~ gb3 gb2 ~@2 gb2@2 gb2 ~@2 gb2 ~@2, ~@3 gb2@2 ~@6 gb2@2 ~@3, ~@6 gb3 ~",
  M: "gb2@2 gb2 ~ gb3 gb2 ~@2 gb2@2 gb2 ~ [c3,g3,bb3,d4]@4, ~@3 gb2@2 ~@6 gb2@2 ~@3", // Gm
  N: "gb2@2 gb2 ~ gb3 gb2 ~ gb2 gb2@2 gb2 ~ [c3,g3,bb3,d4]@4, ~@3 gb2@2 ~@6 gb2@2 ~@3", // Gm
  O: "gb2@2 gb2 ~ gb3 gb2 ~ gb2 gb2@2 ~@6, ~@3 gb2@2 ~@11",
})).s("gm_overdriven_guitar").gain(0.19).pan(0.3)

// drums · kick
const kick = s("bd").struct("<A@8 B A@11 C A@2 D A@5 B A@11 C A@3 D A@4 B A@2 E A E A E@5 C A@2 F>".pickRestart({
  A: "x ~ x!2 ~ x ~@2 x ~ x!2 ~ x ~@2", B: "x ~@2 x ~ x ~@2 x ~ x!2 ~ x ~@2", C: "x ~ x!2 ~@4 x ~@7",
  D: "x ~ x!2 ~ x ~@2 x ~@6 x", E: "x ~ x!2 ~ x ~@2 x ~ x!2 ~@3 x", F: "x ~ x!2 ~ x ~@2 x ~@7",
})).gain(0.37)

// drums · snare
const snare = s("sd").struct(`<
  [x ~ x!3 ~@2 x!2 ~ x!3 ~@2 x]!23
  [x ~ x!3 ~@2 x!2 ~@7]
  [x ~ x!3 ~@2 x!2 ~ x!3 ~@2 x]!21
  [x ~ x!3 ~@2 x!2 ~@7]
  [x ~ x!3 ~@2 x!2 ~ x!3 ~@2 x]!19
  [x ~ x!3 ~@2 x!2 ~@7]
>`).gain(0.12)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  A B@9 C B@5 C B A B A@3 D A B@5 A B C B@5 E B C B E@3 F G B@6 H B H B H@8 F
>`.pickRestart({
  A: "~@2 x ~ x ~ x!3 ~ x!3 ~ x!2", B: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", C: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2",
  D: "x ~ x!3 ~ x!3 ~@7", E: "~@2 x ~ x ~ x ~ x ~ x!3 ~ x!2", F: "x ~ x!3 ~ x!2 ~@8",
  G: "~@2 x ~ x ~@3 x ~ x ~ x ~ x!2", H: "x ~ x!3 ~ x!3 ~ x ~@5",
})).gain(0.28)

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

stack(bass, overdriven_guitar, overdriven_guitar_soft, overdriven_guitar_2, kick, snare, pedal_hat, crash)

More by Led Zeppelin