Strudelify
The Robots cover art

The Man-Machine

The Robots

Kraftwerk

KeyE♭ minorTempo122 bpm
0:00/0:00
// The Robots — Kraftwerk
// 122 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (6/4 at bar 1, 4/4 at bar 4) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 58 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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.

// bass · lead 6 voice
const bass = note("<~@27 A B C D ~ E ~ E ~ F ~ F A B C D ~ E ~ E ~ F ~ F ~@3 G H ~@2>".pickRestart({
  A: "~@7 db2", B: "eb2@2 db2 ~ eb2@2 db2 ~ eb2@2 db2 ~ gb2@2 ~@2", C: "~@14 db2!2",
  D: "eb2@2 db2 ~ eb2@2 db2 ~ eb2@2 ~@2 gb2@2 ~@2", E: "b1@3 ~ b1@2 db2 ~ d2@2 b1@2 ~@4",
  F: "ab1@3 ~ ab1@2 bb1 ~ b1@2 ab1@2 ~@4", G: "db2 ~@2 bb1 bb1@2 ~ db2 b1@2 db2@2 ~@4",
  H: "db2 ~ bb1 bb1@3 ~ eb2@2 db2 ~@6",
})).s("gm_synth_bass_1").gain(0.57).pan(0.4)

// bass · lead 6 voice · soft notes
const bass_soft = note("<~@30 [~@10 db2 ~@5] ~@11 [~@10 db2 ~@5] ~@12 [~@11 bb1!3 ~@2] ~@2>")
  .s("gm_synth_bass_1").gain(0.29).pan(0.4)

// bass · synth bass 2
const bass_2 = note("<~@4 A B A B C D C D E F E F A B A B C D C D E F E F ~@30>".pickRestart({
  A: "eb2!2 db2!2 eb2!2 db2!2 eb2!2 ~@2 gb2!2 ~@2", B: "eb2!2 db2!2 eb2!2 db2!2 eb2!6 ~@2",
  C: "b2!2 a2!2 b2!2 a2!2 b2!2 ~@2 d3!2 ~@2", D: "b2!2 a2!2 b2!2 a2!2 b2!6 ~@2",
  E: "ab2!2 gb2!2 ab2!2 gb2!2 ab2!2 ~@2 b2!2 ~@2", F: "ab2!2 gb2!2 ab2!2 gb2!2 ab2!6 ~@2",
})).s("gm_synth_bass_2").gain(0.36)

// bass · synth bass 1
const bass_3 = note(`<
  ~@5 A ~ A ~ B ~ B ~ C ~ C D E D E F G F G H I ~@2 J K J K L M N M O P O P J Q R S N M N M O P O P ~@6
>`.pickRestart({
  A: "~@10 eb1!4 ~@2", B: "~@10 b1!4 ~@2", C: "~@10 ab1!4 ~@2", D: "eb1@3 ~ eb1@2 db1@2 eb1!2 db1@2 gb1@2 db1@2",
  E: "eb1@3 ~ eb1@3 db1 eb1!6 db1@2", F: "b1@3 ~ b1@3 a1 ~ b1 a1@2 d2@2 a1 ~",
  G: "b1@2 ~@2 b1@3 a1 b1!2 a1@2 b1!2 a1@2", H: "ab1@3 ~ ab1@2 ~ gb1 ~ ab1 gb1@2 b1@2 gb1@2",
  I: "ab1@2 ~@2 ab1@2 ~ gb1 ab1!2 gb1@2 ab1!2 gb1@2", J: "eb1@2 ~@2 eb1@2 ~ db1 eb1!2 db1@2 gb1@2 db1@2",
  K: "eb1@2 ~@2 eb1@2 ~ db1 eb1!2 db1@2 eb1 ~ db1 ~", L: "b1@2 ~@2 b1@2 ~ a1 ~ b1 a1@2 d2@2 a1 ~",
  M: "b1@2 ~@2 b1 ~@2 a1 b1!2 a1 ~ b1@2 a1 ~", N: "b1@2 ~@2 b1@2 ~ a1 ~ b1 a1@2 d2 ~ a1 ~",
  O: "ab1@3 ~ ab1@2 ~ gb1 ~ ab1 gb1 ~ b1@2 gb1 ~", P: "ab1@2 ~@2 ab1@2 ~ gb1 ab1!2 gb1 ~ ab1@2 gb1 ~",
  Q: "eb1@2 ~@2 eb1@2 ~ db1 eb1!2 db1@2 eb1@2 db1 ~", R: "eb1@2 ~@2 eb1@2 ~ db1 eb1!2 db1 ~ gb1@2 db1@2",
  S: "eb1@2 ~@2 eb1@2 ~ db1 eb1!2 db1 ~ eb1 ~ db1 ~",
})).s("gm_synth_bass_1").gain(0.54)

// chords · lead 2 sawtooth · Ebm Db Ebm Db Bm A Bm A …
const lead_2_sawtooth = note(`<
  ~@28
  [[eb5,gb5]!2 ~ [eb5,gb5] ~ [eb5,gb5] [db5,f5] ~ [eb5,gb5]!2 ~ [eb5,gb5] ~ [eb5,gb5] [db5,f5] ~]!4
  [[b4,d5]!2 ~ [b4,d5] ~ [b4,d5] [a4,db5] ~ [b4,d5]!2 ~ [b4,d5] ~ [b4,d5] [a4,db5] ~]!4
  [[ab4,b4]!2 ~ [ab4,b4] ~ [ab4,b4] [gb4,bb4] ~ [ab4,b4]!2 ~ [ab4,b4] ~ [ab4,b4] [gb4,bb4] ~]!4
  [[eb5,gb5]!2 ~ [eb5,gb5] ~ [eb5,gb5] [db5,f5] ~ [eb5,gb5]!2 ~ [eb5,gb5] ~ [eb5,gb5] [db5,f5] ~]!4
  [[b4,d5]!2 ~ [b4,d5] ~ [b4,d5] [a4,db5] ~ [b4,d5]!2 ~ [b4,d5] ~ [b4,d5] [a4,db5] ~]!4
  [[ab4,b4]!2 ~ [ab4,b4] ~ [ab4,b4] [gb4,bb4] ~ [ab4,b4]!2 ~ [ab4,b4] ~ [ab4,b4] [gb4,bb4] ~]!4
  ~@6
>`).s("gm_lead_2_sawtooth").gain(0.35).pan(1)

// other · lead 1 square · Bb
const lead_1_square = note("<~@2 [[bb4,bb6] ~ [bb4,bb6] ~]!2 ~@50 [[bb4,bb6] ~ [bb4,bb6] ~]!2 ~@2>")
  .s("gm_lead_1_square").gain(0.3).pan(0.6)

// other · lead 2 sawtooth
const lead_2_sawtooth_2 = note("<A@2 ~@50 A@2 ~@2 A@2>".pickRestart({
  A: "[[bb1,bb2,bb3]@3 ~]/2", // Bb
})).s("gm_lead_2_sawtooth").gain(0.09).pan(0.3)

// chords · lead 1 square · Bb Bmaj7 C Fmaj7 Bmaj7 Gmaj7 Bb Bmaj7
const lead_1_square_2 = note(`<
  ~
  [~@10 [bb5,e6,f6] [bb5,b5] [c6,gb6,g6] ~@3]
  ~@51
  [~@10 [e6,f6] [bb5,b5] [gb6,g6] ~@3]
  ~@3
  [~@10 [bb5,e6,f6] [eb5,bb5,b5] ~@4]
>`).s("gm_lead_1_square").gain(0.07).pan(0.1)

// chords · lead 1 square · soft notes
const lead_1_square_soft = note("<~ [~@11 eb5 ~@4] ~@51 [~@10 bb5 eb5 c6 ~@3] ~@4>")
  .s("gm_lead_1_square").gain(0.04).pan(0.1)

// other · kalimba
const kalimba = note(`<
  ~@4
  [~@4 eb6 ~@7 eb6 ~@3]!4
  [~@4 b5 ~@7 b5 ~@3]!4
  [~@4 ab5 ~@7 ab5 ~@3]!4
  [~@4 eb6 ~@7 eb6 ~@3]!4
  [~@4 b5 ~@7 b5 ~@3]!4
  [~@4 ab5 ~@7 ab5 ~@3]!4
  ~@30
>`).s("gm_kalimba").gain(0.22)

// other · percussive organ · Eb B Ab Eb B Ab
const percussive_organ = note(`<
  ~@4
  [~@4 [eb6,eb7] ~@7 [eb6,eb7] ~@3]!4
  [~@4 [b5,b6] ~@7 [b5,b6] ~@3]!4
  [~@4 [ab5,ab6] ~@7 [ab5,ab6] ~@3]!4
  [~@4 [eb6,eb7] ~@7 [eb6,eb7] ~@3]!4
  [~@4 [b5,b6] ~@7 [b5,b6] ~@3]!4
  [~@4 [ab5,ab6] ~@7 [ab5,ab6] ~@3]!4
  ~@30
>`).s("gm_percussive_organ").gain(0.12)

// other · synth brass 2
const synth_brass_2 = note(`<
  ~@4
  [~@4 eb5 ~@7 eb5 ~@3]!4
  [~@4 b4 ~@7 b4 ~@3]!4
  [~@4 ab4 ~@7 ab4 ~@3]!4
  [~@4 eb5 ~@7 eb5 ~@3]!4
  [~@4 b4 ~@7 b4 ~@3]!4
  [~@4 ab4 ~@7 ab4 ~@3]!4
  ~@30
>`).s("gm_synth_brass_2").gain(0.15)

// other · tinkle bell
const tinkle_bell = note("<[~@3 b2] ~@51 [~@3 b2] ~@3 [~@3 b2] ~>").s("gm_tinkle_bell").gain(0.44)

// other · lead 8 bass lead
const lead_8_bass_lead = note("<~@52 [~@7 bb2 bb1 bb2 bb1 ~@5] ~@3 [~@7 bb2 bb1 bb2 bb1 ~@5] ~>")
  .s("gm_lead_8_bass_lead").gain(0.2).pan(0.7)

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

// drums · hihat
const hihat = s("hh").struct("<~@4 [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!53 [x!2 ~@2 x!2 ~@2 x!2 ~@6]>").gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~ x ~ x ~ x ~ x]!53 [~ x ~ x ~ x ~@2]>").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~@4 [~ x ~ x]!53 [~ x ~@2]>").gain(0.45)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@28 [~ x ~ x]!8 ~@4 [~ x ~ x]!8 ~@4 [~ x ~ x]!5 [~ x ~@2]>")
  .gain(1.07)

// drums · jingle bells · soft notes
const jingle_bells_soft = s("sleighbells:4").struct("<~@36 [~ x ~ x]!4 ~@8 [~ x ~ x]!4 ~@6>").gain(0.64)

stack(
  bass, bass_soft, bass_2, bass_3, lead_2_sawtooth, lead_1_square, lead_2_sawtooth_2, lead_1_square_2,
  lead_1_square_soft, kalimba, percussive_organ, synth_brass_2, tinkle_bell, lead_8_bass_lead, snare, hihat, open_hat,
  crash, jingle_bells, jingle_bells_soft
)

More by Kraftwerk