Strudelify

Poor Tom

Led Zeppelin

KeyC majorTempo200 bpm
0:00/0:00
// Poor Tom — Led Zeppelin
// 200 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 160 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(200/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · harmonica
const harmonica = note(`<
  ~@105 A ~ B ~@2 C D E@3 ~@3 F G ~@3 H@2 I J K L M N O P Q R@2 S T@2 ~@2 U@3 V W V W V X V Y V Z V Z V AA V AA
>`.pickRestart({
  A: "f#4!4 [f#4,a4] a4!4 ~@7", B: "g5@3 ~@13", C: "~@4 [c5,d#5]@3 ~@3 [c5,d#5]@4 ~@2", D: "[c5,d#5]@3 ~@13",
  E: "[~@14 c5@25 ~@9]/3", F: "~@2 [g4,c5,e5]!2 ~ [g4,c5,e5] ~@2", G: "[g4,c5,e5] ~ [g4,c5,e5]!2 ~@4",
  H: "[~@8 g5@15 ~ f5@7 ~]/2", I: "g5@11 ~ d#5@2 e5@2", J: "d#5@2 e5@2 c5@11 ~", K: "c5@5 ~ c5@5 ~ c5@3 ~",
  L: "~@4 g5@6 f#5@2 g5@3 ~", M: "f#5@2 g5@3 ~ f#5@2 g5@3 ~ f#5@2 g5@2", N: "f#5@2 g5@2 f5 d#5 c5@2 c5@3 ~ c5@3 ~",
  O: "c5@5 ~ c5@5 ~@5", P: "~@2 d#5 e5 ~ d#5 e5 ~", Q: "d#5 e5 ~ d#5 e5!2 d#5 e5", R: "[c5@18 a#4@5 ~@9]/2",
  S: "~@4 d#5@2 e5@9 ~", T: "e5@15 ~", U: "[c5@3 ~ c#5 b4 c5@33 ~@9]/3", V: "[g4,c5]!4 ~ [g4,c5] ~ [g4,c5]",
  W: "[g4,c5]@2 [g4,c5]@2 [f4,a4]@3 ~ [e4,g4]@3 ~ [f4,a4]@3 ~", X: "[g4,c5]@2 [g4,c5]@2 [f4,a4]@3 ~ d#5@2 e5@2 c5@3 ~",
  Y: "c5@3 ~ c5@3 ~ d#5@2 e5@2 [f5,a5]@3 ~", Z: "[g4,c5]@3 ~ [f5,a5]@3 ~ [e5,g5]@3 ~ [f5,a5]@3 ~", AA: "[g4,c5] ~@7",
})).s("gm_harmonica").gain(0.58).pan(0.4)

// chords · acoustic guitar steel · "Acoustic Guitar I"
const acoustic_guitar_steel = note(`<
  ~@24 A B C D E F G H I J K L M N M O M N M P Q R S R M N M T E U C V E U W X Y Z AA AB M N M O M N M P Q R S R M N M T
  E U C V E U W X Y Z AA AB AC AD AC AE AC AD AC AF M@3 AG AC AH AC AI E U AJ AK E U AJ AL AM AN W AO ~@2 AP AQ AR@2 AS
  AT AU@2 AV AW AX AY AZ@2 BA BB BC BD BE BF BG BH BI BJ BI BJ BI BJ BI BJ BI BJ BI BJ BI BJ BI BK
>`.pickRestart({
  A: "a3@3 ~ c4@2 e4@4 a3@5 ~", B: "g#3@3 ~ c4@2 e4@4 g#3@5 ~", C: "~@4 c4@6 e4@3 ~ g3@2", D: "c4@10 c4@2 a3@3 ~",
  E: "a3@5 ~ g4@2 e4@2 a3@5 ~", F: "g#3@5 ~ g4@2 e4@2 c4@5 ~", G: "c4@3 ~ c4@3 ~ g3@2 c4@3 ~ g3@2",
  H: "c4@7 ~ c4@2 c4@5 ~", I: "~@4 [c4,d#4,a4]@2 [c4,e4,a4]@4 [c4,d#4,a4]@5 ~",
  J: "[c4,d#4,a4]@5 ~ [c4,e4,a4]@2 [c4,d#4,a4]@2 [c4,e4,a4]@2 [c4,d#4,a4]@2 [c4,e4,a4]@2", K: "~@4 [c4,e4]@6 g3@5 ~",
  L: "c4@5 ~ g3@4 c4@5 ~", M: "g4@2 e4@3 ~ d#4@4 e4@5 ~", N: "g4@3 ~ g3@3 ~ c4@3 ~ g3@3 ~",
  O: "c4@3 ~ g3@3 ~ c4@2 c4@2 g3@3 ~", P: "c4@3 ~ g3@3 ~ [c4,e4]@2 [c4,e4]@5 ~", Q: "~@8 [g3,c4]@2 [g3,c4]@5 ~",
  R: "~@6 d#4@4 c4@5 ~", S: "~@4 e4@2 d#4@4 e4@5 ~", T: "g4@3 ~ g3@6 c4@2 g3@3 ~", U: "g#3@5 ~ g4@2 e4@2 g3@5 ~",
  V: "c4@3 ~ g3@3 ~ c4@2 c4@2 a3@3 ~", W: "~@4 c4@6 g3@5 ~", X: "c4@3 ~ g3@6 [g3,c4]@2 g3@3 ~",
  Y: "~@2 c4 e4@2 [c4,d#4,a4]!2 [c4,e4,a4]", // Adim Am
  Z: "[c4,d#4,a4] [c4,e4,a4] [c4,d#4,a4] [c4,e4,a4] [c4,d#4,a4] [c4,e4,a4] ~@2", AA: "~@4 [g3,c4]@11 ~",
  AB: "[g3,c4]@5 ~ [g3,c4]@4 [c4,e4]@5 ~", AC: "f#4@2 e4@3 ~ d#4@4 e4@5 ~", AD: "f#4@3 ~ g3@3 ~ c4@3 ~ g3@3 ~",
  AE: "g4@3 ~ g3@3 ~ c4@2 c4@2 g3@3 ~", AF: "c4@10 c4@5 ~", AG: "d#4@2 c4@3 ~ a3@4 c4@5 ~",
  AH: "f#4@3 ~ g3@6 c4@2 c4@3 ~", AI: "c4@3 ~ g3@6 c4@2 c4@3 ~", AJ: "~@4 c4@6 c4@3 ~ g3@2",
  AK: "c4@3 ~ g3@3 ~ c4@2 g3@5 ~", AL: "c4@3 ~ g3@6 c4@2 g3@3 ~", AM: "~@4 c4@2 e4@4 [c4,d#4,a4]@5 ~",
  AN: "[c4,d#4,a4]@2 [c4,e4,a4]@3 ~ [c4,d#4,a4]@4 [c4,e4,a4]@2 [c4,d#4,a4]@2 [c4,e4,a4]@2", // Adim Am Adim Am Adim Am
  AO: "c4@3 ~ g3@3 ~ g3@3 ~ g3@3 ~", AP: "~@4 [c4,g4,c5]@7 ~ [c4,g4]@3 ~",
  AQ: "[c4,g4,c5]@5 ~ [c4,g4,c5]@4 [c4,g4,c5]@5 ~", // C5
  AR: "[[a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@2 [a#3,d4,g4,c5,f5]@3 ~ [a#3,d4,g4,c5,f5]@6 [a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@3 ~ [a#3,d4,g4,c5,f5]@3 ~]/2", // Gm7
  AS: "~@4 [c4,g4,c5]@2 [c4,g4,c5]@4 [c4,g4,c5]@2 [c4,g4,c5]@3 ~", // C5
  AT: "[c4,g4,c5]@5 ~ [c4,g4,c5]@4 [c4,g4,c5]@2 [c4,g4,c5]@3 ~", // C5
  AU: "[[a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@2 [a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@2 [a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@3 ~]/2", // Gm7
  AV: "[c4,g4]@5 ~ [c4,g4,c5]@5 ~ [c4,g4]@3 ~", AW: "[c4,g4,c5]@7 ~ [c4,g4]@3 ~ [c4,g4,c5]@3 ~",
  AX: "[a#3,d4,g4,c5,f5]@3 ~ [a#3,d4,g4,c5,f5]@2 [a#3,d4,g4,c5,f5]@5 ~ [a#3,d4,g4,c5,f5]@3 ~", // Gm7
  AY: "[a#3,d4,g4,c5,f5]@2 [a#3,d4,g4,c5,f5]@2 [a#3,d4,g4,c5,f5]@3 ~ [d4,g4,c5,f5]@3 ~ [d4,g4,c5,f5]@3 ~", // Gm7 Dm7
  AZ: "[[c4,g4,c5]@5 ~ [c4,g4,c5]@5 ~ [c4,g4,c5]@6 [c4,g4,c5]@5 ~ [c4,g4,c5]@3 ~ [c4,g4,c5]@3 ~]/2", // C5
  BA: "[c4,a#4]@3 ~ [c4,a#4]@3 ~ [c4,a#4]@2 [c4,a#4]@2 [c4,a#4]@3 ~", // C7
  BB: "[c4,g#4]@3 ~ [c4,g#4]@3 ~ [c4,g#4]@3 ~ [c4,g#4]@3 ~", BC: "[c4,g4]!3 [c4,g4,c5]@2 [c4,g4,c5]!3",
  BD: "[c4,g4,c5]@7 ~ [c4,g4,c5]@3 ~ [c4,a4]@3 ~", BE: "[c4,a4]@3 ~ [c4,a4]@3 ~ [c4,a4]@2 [c4,a4]@2 [c4,a4]@3 ~",
  BF: "[c4,g#4]@3 ~ [c4,g#4]@3 ~ [c4,g#4]@2 [c4,g#4]@2 [c4,g#4]@3 ~", BG: "[c4,g4]@3 ~ [c4,g4]@6 [c4,g4]@3 ~ [c4,g4]@2",
  BH: "[c4,g4]@5 ~ [c4,g4]@2 [c4,g4]@2 [c4,g4]@2 [c4,g4]@3 ~", // C5
  BI: "[c4,g4,c5]@2 [c4,g4,c5]@2 [c4,g4,c5]@2 [c4,g4,c5]@4 [c4,g4,c5]@3 ~ [c4,g4,c5]@2", // C5
  BJ: "[c4,g4,c5]@3 ~ [a3,c4,g4]@3 ~ [c4,g4]@3 ~ [a3,c4,g4]@3 ~", BK: "[c4,g4,c5] ~@7",
})).s("gm_acoustic_guitar_steel").gain(0.48).pan(0.3)

// other · acoustic guitar steel · "Acoustic Guitar II"
const acoustic_guitar_steel_2 = note(`<
  ~@24 A@2 B C A D E@2 F@2 G H@2 I H I H I H J K J@4 I J I L M I A N M O P Q@2 D H@2 I H I H I H J K J@4 I J I L M I A N
  M O P Q@2 D H@2 I H I H I H R I H J@2 S@2 I@2 N A T@2 A M U@2 V@2 W H X Y Z AA AB@2 Z AC AD@2 AE@2 AF@2 AE@2 AG AH AI
  AJ AG@2 AK AL AM AH AM AH AM AH AM AH AM AH AM AH AM AH AM AN
>`.pickRestart({
  A: "c4@11 ~ a3@3 ~", B: "c4@7 ~ c3@7 ~", C: "c4@3 ~ c3@7 ~ a3@3 ~", D: "c4@11 ~ c3@3 ~",
  E: "[c4@19 ~ c4@7 ~ c4@3 ~]/2", F: "[c4@31 ~]/2", G: "c4@3 ~ c3@11 ~", H: "c4@15 ~", I: "c3@15 ~",
  J: "c3@11 ~ c4@3 ~", K: "a3@3 ~ c4@7 ~ c4@3 ~", L: "[c3,a3]@15 ~", M: "c4@11 ~ c4@3 ~", N: "a3@15 ~",
  O: "c3@3 ~ c3@7 ~ c4@3 ~", P: "c3@11 ~ b3@3 ~", Q: "[a3@27 ~ b3@3 ~]/2", R: "c3@3 ~ c4@7 ~ c4@3 ~",
  S: "c3@7 ~ c3@7 ~", T: "[c3@19 ~ c4@7 ~ c4@3 ~]/2", U: "[c3@19 ~ c4@7 ~ b3@3 ~]/2", V: "[a3@31 ~]/2",
  W: "a3@3 ~ b3@3 ~ c3@3 ~ c4@3 ~", X: "c4@2 c4@3 ~ c4@4 c4@5 ~", Y: "c4@5 ~ c4@5 ~ c4@3 ~", Z: "c5@11 ~ c5@3 ~",
  AA: "c5@5 ~ c5@4 c5@5 ~", AB: "[c5@5 ~ c5@5 ~ c5@6 c5@5 ~ c5@3 ~ c5@3 ~]/2", AC: "c5@5 ~ c5@4 c5@2 c5@3 ~",
  AD: "[c5@5 ~ c5@5 ~ c5@2 c5@5 ~ c5@2 c5@5 ~ c5@3 ~]/2", AE: "[c5@27 ~ a5@3 ~]/2",
  AF: "[c5@3 ~ c5@2 c5@5 ~ c5@6 c5@2 c5@3 ~ c5@3 ~ c5@3 ~]/2", AG: "c5@3 ~ c5@3 ~ c5@2 c5@2 c5@3 ~",
  AH: "c5@3 ~ c5@3 ~ c5@3 ~ c5@3 ~", AI: "c5!3 c5@2 c5!3", AJ: "c5@7 ~ c5@3 ~ c5@3 ~", AK: "c5@3 ~ c5@6 c5@3 ~ c5@2",
  AL: "c5@5 ~ c5@2 c5@2 c5@2 c5@3 ~", AM: "c5@2 c5@2 c5@2 c5@4 c5@3 ~ c5@2", AN: "c5 ~@7",
})).s("gm_acoustic_guitar_steel").gain(0.58).pan(0.7)

// bass · fretless bass · "Bass Guitar"
const bass = note(`<
  ~@52 A B C@2 A B D E F@2 E@2 G H I H G H I J K L M N G H I E A B C@2 A B C@2 F@2 E@2 O@2 P@2 Q@2 P@2 R K S E P@2 T@2 A
  B U@2 V W X@2 Y@2 Z@2 AA@4 AB AC AD AE AF AG AH AI AJ AK AL@2 AM@2 AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA AT BB AT
  BB AT BB AT BC
>`.pickRestart({
  A: "a2@15 ~", B: "g#2@15 ~", C: "[g2@5 ~ g2@4 e2@2 d2@2 c2@17 ~]/2", D: "g2@5 e2 d2 c2", E: "c2@15 ~",
  F: "[a1@21 ~ c2@5 ~ d2@3 ~]/2", G: "g1@5 ~ f#1@4 g1@5 ~", H: "c2@7 ~ c2@7 ~", I: "g2@5 ~ f#2@4 g2@5 ~",
  J: "c2@5 ~ c2@9 ~", K: "g2@2 f#2@3 ~ c2@9 ~", L: "f#2@2 g2@3 ~ c2@5 ~ c2@3 ~", M: "f#2@2 g2@3 ~ c2@4 a1@5 ~",
  N: "g1@15 ~", O: "[a1@31 ~]/2", P: "[g1@5 ~ f#1@4 g1@21 ~]/2", Q: "[c2@5 ~ b1@4 c2@21 ~]/2", R: "c2@5 ~ b1@4 c2@5 ~",
  S: "g2@2 f#2@3 ~ c2@5 ~ c2@3 ~", T: "[g2@5 ~ f#2@4 g2@21 ~]/2", U: "[g2@7 ~ e2@2 d2@3 ~ c2@5 ~@5 g1@3 ~@5]/2",
  V: "a2@11 ~ a2@2 ~@2", W: "g#2@10 g#2@5 ~", X: "[g2@5 ~ e2@2 d2@3 ~ c2@19 ~]/2",
  Y: "[~@4 a1@6 d#2@3 ~ d2@4 c2@3 ~ a1@4 g1@2 e1@3 ~]/2", Z: "[c1@31 ~]/2", AA: "[c1@21 ~ c2@4 c2@3 ~ c2@33 ~]/4",
  AB: "~@4 a2@2 a#2@4 a#2@5 ~", AC: "g2@5 ~ f2@4 g2@2 g2@3 ~", AD: "g2@3 ~ c2@7 ~ g2@3 ~", AE: "c2@5 ~ g2@5 ~ c2@3 ~",
  AF: "~@4 a#2@2 c3@4 a2@5 ~", AG: "a#2@5 ~ g2@5 ~ a2@3 ~", AH: "~@4 g2@3 ~ c2@3 ~ g2@3 ~", AI: "c3@15 ~",
  AJ: "~@4 f2@5 ~ e2@5 ~", AK: "c2@3 ~ g1@3 ~ a1@2 c2@2 d2@3 ~", AL: "[c2@7 ~ c1@3 ~ c1@7 ~ c1@3 ~ c1@3 ~ c1@3 ~]/2",
  AM: "c2@3 ~ c2@3 ~ c2@3 ~ c2@3 ~", AN: "c2@7 ~ a1@3 ~ g1@3 ~", AO: "c1@7 ~ a1@3 ~ g1@3 ~", AP: "a1@11 ~ a1@3 ~",
  AQ: "g#1@11 ~ g1@3 ~", AR: "g1@7 ~ e1@3 ~ d1@3 ~", AS: "d1@15 ~", AT: "c2@2 c2@2 c2@2 c2@4 c2@3 ~ c2@2",
  AU: "c2@3 ~ g2@3 ~ c3@3 ~ g2@3 ~", AV: "f2@5 ~ e2@5 ~ f2@3 ~", AW: "g2@3 ~ f2@3 ~ g2@3 ~ f2@3 ~",
  AX: "e2@5 ~ f2@7 ~ b1@2", AY: "c2@3 ~ b1@3 ~@5 a1@3 ~", AZ: "c2@2 c2@2 c2@2 c2@4 b1@3 ~ b1@2",
  BA: "c2@3 ~ g1@3 ~ g1@3 ~ g1@3 ~", BB: "c2@3 ~ c1@3 ~ c2@3 ~ c1@3 ~", BC: "c2 ~@7",
})).s("gm_fretless_bass").gain(0.58)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C
>`.pickRestart({
  A: "x!2 ~ x ~ x ~ x", B: "x!2", C: "x",
})).gain(0.34)

// drums · snare
const snare = s("sd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C
>`.pickRestart({
  A: "x!2 ~ x ~ x ~ x", B: "x!2", C: "x",
})).gain(0.39)

// drums · hihat
const hihat = s("hh").struct("<[~ x ~ x]!159 ~>").gain(0.29)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~ x ~ x",
})).gain(0.49)

stack(harmonica, acoustic_guitar_steel, acoustic_guitar_steel_2, bass, kick, snare, hihat, open_hat)

More by Led Zeppelin