Strudelify

Planet Telex

Radiohead

KeyE majorTempo144 bpm
0:00/0:00
// Planet Telex — Radiohead
// 144 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 12 electric guitar clean (copy of ch 11 electric guitar clean)
// note: Full arrangement: all 161 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(144/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 · piano
const piano = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 D@2 E@2 F@2 C@2 D@2 C@2 D@2 E@2 F@2 E@2 F@2 G@2 H@2 I@2 H@2 G@2 H@2 I@2
  H@2 ~@4 C@2 D@2 E@2 F@2 C@2 D@2 C@2 D@2 E@2 F@2 E@2 F@2 G@2 H@2 I@2 H@2 G@2 H@2 I@2 H@2 G@2 H@2 I@2 H@2 G@2 H@2 I@2
  H@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~
>`.pickRestart({
  A: "[[e3,b3,g#4]@3 [e3,c#4,a4]@5]/2", B: "[[e3,d4,b4]@3 [e3,c4,a4]@5]/2", C: "[[b2,b3,e4]@3 [b2,b3,d#4]@5]/2",
  D: "[[b2,b3,d4]@3 [b2,b3,d#4]@5]/2", E: "[[a2,a3,d#4]@3 [a2,a3,c#4]@5]/2", F: "[[a2,a3,b3]@3 [a2,a3,c#4]@5]/2",
  G: "[e2,b3,e4,g#4]/2", H: "[e2,b3,d#4,g#4]/2", I: "[e2,b3,d4,g#4]/2",
})).s("gm_piano").gain(0.43)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A@4 B C D@2 A@4 B C D@2 ~@104 A@4 B C D@2 A@4 B C D@2 A@4 B C D@2 A@4 B C D@2 A@4 B C D@2 ~
>`.pickRestart({
  A: "[e3,b3]!8", B: "[e3,b3,a4]!5 ~ [e3,b3,a4]!2", C: "~@6 [e3,b3,a4]!2", D: "[e3,b3,a4]!8",
})).s("gm_acoustic_guitar_nylon").gain(0.21).pan(0.1)

// chords · acoustic guitar nylon · soft notes
const acoustic_guitar_nylon_2 = note("<~@4 A B ~@6 A B ~@110 A B ~@6 A B ~@6 A B ~@6 A B ~@6 A B ~@3>".pickRestart({
  A: "~@5 [e3,b3,a4] ~@2", B: "[e3,b3,a4]!6 ~@2",
})).s("gm_acoustic_guitar_nylon").gain(0.11).pan(0.1)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~@16 A@2 B@2 A@2 B@2 C@2 D@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 D@2 E@2 F@2 G@2 H@2 I@2 J@2 G@2 H@2 K@4 A@2 B@2 C@2 D@2 A@2
  B@2 A@2 B@2 C@2 D@2 C@2 D@2 E@2 F@2 G@2 H@2 I@2 J@2 G@2 H@2 E@2 F@2 G@2 H@2 I@2 J@2 G@2 H@2 ~@41
>`.pickRestart({
  A: "[[b3,e4,f#4]@3 e4 [b3,e4]@2 d#4@2 d#4 [b2,b3,d#4] [b2,b3]@2 b2 [b2,d#4] [b2,b3]!2, [b2,d#4]@6 [b2,b3]@3 ~@3 b3@2 ~@2, ~@3 f#4@3 f#4@10, ~@4 b4 ~@5 d#4@3 ~ d#4@2]/2", // Bsus4 E5 B
  B: "[b2@2 ~ d4 [b3,d4]@2 [b2,b3,d#4]@3 [b2,b3,d#4] [b2,b3,d#4]@2 [b2,d#4] d#4@2 ~, b4 ~, [b3,d4]@3 ~@9 b3@2 ~@2, ~@2 b2@4 ~@7 b2 ~@2]/2", // Bm B Bm
  C: "[[a3,d#4]@3 d#4 [a3,d#4]@2 c#4@2 c#4 [a2,a3,c#4] [a2,a3]@2 a2 [a2,c#4] [a2,a3]!2, a2@6 [a2,a3]@3 ~ c#4@3 ~ c#4@2, ~@4 a4 ~ e4@10, ~@6 a3 ~]/2", // Adim A
  D: "[a2@2 ~ b3 [a3,b3]@2 [a2,a3,c#4]@3 [a2,a3,c#4] [a2,a3,c#4]@2 [a2,c#4] c#4@2 ~, a4 ~, [a3,b3]@3 ~@9 a3@2 ~@2, ~@2 a2@4 ~@7 a2 ~@2]/2", // Asus2 A Asus2
  E: "[[b3,e4]@4 [b3,e4]@5 [b3,e4]@3 b3@3 b3, [e2,g#4], ~@3 e4]/2", // E5 E
  F: "[[b3,d#4]@4 [b3,d#4]@5 [b3,d#4]@3 [b3,d#4]@3 [b3,d#4], [e2,g#4]]/2", // B E
  G: "[[b3,d4]@4 [b3,d4]@5 [b3,d4]@3 [b3,d4]@4, [e2,g#4]]/2", // Bm E
  H: "[[b3,d#4]@4 [b3,d#4]@5 [b3,d#4]@3 d#4@3 d#4, [e2,g#4], ~@3 b3]/2", // B E
  I: "[[b3,e4]@4 [b3,e4]@5 [b3,e4]@3 [b3,e4]@4, [e2,g#4]]/2", // E5 E
  J: "[[b3,d#4]@4 [b3,d#4]@5 [b3,d#4]@3 [b3,d#4]@4, [e2,g#4]]/2", // B E
  K: "[[b3,e4,f#4]@3 e4 [b3,e4]@2 d#4@2 d#4 [b2,b3,d#4] [b2,b3]@2 b2 [b2,d#4] [b2,b3]!2 b2@2 ~ d4 [b3,d4]@2 [b2,b3,d#4]@3 [b2,b3,d#4] [b2,b3,d#4]@2 [b2,d#4] d#4@2 ~, [b2,f#3,d#4]@3 f#3@13, ~@3 f#4@3 f#4@10 b4@8 ~@8, ~@4 b4 ~ [b2,b3]@3 ~ d#4@3 ~ d#4@2 ~@2 b2@4 ~@7 b2 ~@2, ~@12 b3@2 ~@2 [b3,d4]@3 ~@9 b3@2 ~@2]/4", // Bsus4 E5 B Bm B Bm
})).s("gm_distortion_guitar").gain(0.25)

// chords · distortion guitar · soft notes
const distortion_guitar_soft = note(`<
  ~@19 A ~@3 A ~@3 B ~@3 A ~@3 A ~@3 B ~@3 B ~@19 A ~@3 A ~@3 B ~@3 A ~@3 A ~@3 B ~@3 B ~@73
>`.pickRestart({
  A: "~@6 [b2,b3] [b2,b3,d#4]", B: "~@6 [a2,a3] [a2,a3,c#4]",
})).s("gm_distortion_guitar").gain(0.16)

// other · distortion guitar
const distortion_guitar_2 = note("<~@64 A@4 B@4 A@4 C@2 D@2 E F G H E F G H ~@73>".pickRestart({
  A: "[e4@4 d4 e4 d#4@6 b3@20]/4", B: "[e4@4 d4 e4 d4@6 b3@20]/4", C: "[e4@4 b3 a#3 a3@8 b2 a#2]/2", D: "a2/2",
  E: "a4!6 g#4!2", F: "g#4!4 a4!4", G: "f#4!6 e4!2", H: "e4!8",
})).s("gm_distortion_guitar").gain(0.25)

// chords · synth brass 2
const synth_brass_2 = note("<~@80 A B@2 C A B@2 C ~@73>".pickRestart({
  A: "a4!3 [g#4,a4]", B: "[[g#4,a4]!3 g#4 [f#4,g#4] [f#4,g#4,a4]!2 [e4,f#4,g#4,a4], ~@3 a4@2 ~@3]/2",
  C: "[e4,g#4,a4]!4", // Amaj7
})).s("gm_synth_brass_2").gain(0.4)

// chords · ocarina · "James Mulvale"
const ocarina = note("<~@104 A@6 B@8 ~@43>".pickRestart({
  A: "e5/6", B: "[~@15 b5@17, a5]/8",
})).s("gm_ocarina").gain(0.37)

// bass · fretless bass
const bass = note(`<
  ~@8 A@8 ~@4 B@4 C@4 B@8 C@8 D E D E D E D E D E D E D E D E ~@4 B@4 C@4 B@8 C@8 D E D E D E D E D E D E D E D E D E D
  E D E D E D E D E D E D E ~@8 A@32 ~
>`.pickRestart({
  A: "[d2 b1 d2 b1 d2 e2 e1@3 e1!3 e2 b1!3]/2", B: "[a1 b1@2 a1 b1@2 a1 b1@2 b1 c#2@2 d2@4]/2",
  C: "[g#1 a1@2 g#1 a1@2 g#1 a1@2 a1 g#2@2 a2@4]/2", D: "e2!4", E: "e2 b1 e2!2",
})).s("gm_fretless_bass").gain(0.64)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B ~@4 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
  ~@4 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 ~
>`.pickRestart({
  A: "x!4 ~@2 x!2", B: "~@2 x!2 ~@4",
})).gain(0.8)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "~@11 x ~@4",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A B A B A B A B A B ~@4 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
  ~@4 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 ~
>`.pickRestart({
  A: "x!4", B: "x!3 ~",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct(`<
  A B A B A B A B A B A B A B A B ~@4 C D C D C D C D C D C D C D C D C D C D C D C D A B A B A B A B A B A B A B A B
  ~@4 C D C D C D C D C D C D C D C D C D C D C D C D 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 ~
>`.pickRestart({
  A: "x", B: "~@3 x", C: "x!2", D: "x ~@2 x",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 B@24 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 B@24 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", B: "x!2",
})).gain(0.8)

stack(
  piano, acoustic_guitar_nylon, acoustic_guitar_nylon_2, distortion_guitar, distortion_guitar_soft, distortion_guitar_2,
  synth_brass_2, ocarina, bass, kick, snare, snare_soft, hihat, open_hat, crash
)

More by Radiohead