Strudelify

Tell Me When

The Human League

KeyA♭ majorTempo120 bpm
0:00/0:00
// Tell Me When — The Human League
// 120 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 140 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@18 A B C D E B C D E B C D E B C F G H I J K H I J K B C D E B C D E B C D E B C D E F G H I J K H I J K L M N@2 L O
  N@2 P Q R S Q T R U P Q R S Q T R H I J K H I J K H I J K H I J K ~@6 F G H I J K H I J K H I J K H I J K H I J K H I
  J K
>`.pickRestart({
  A: "~@7 bb1", B: "db2@3 ~ eb2@2 ~@2 f2@3 bb1@2 ~ c2 ~", C: "~@2 c2 ~ eb2@3 ~ f2@2 ~ bb1@2 ~ g1 ~",
  D: "c2@3 ~ eb2@3 ~ f2@2 ~ bb1@2 ~ c2 ~", E: "~@2 c2 ~@3 eb2 ~ f2@2 ~ bb1@2 ~@3", F: "db2",
  G: "eb2 ~ db2 ~ c2 bb1 ab1 ~", H: "eb2@3 eb2 eb2@3 ~ f2@4 ~@2 db2@2", I: "~@2 db2@2 ~@3 db2 ~@2 bb1 ~ c2 ~ db2 ~",
  J: "eb2@2 ~@2 eb2@3 ~ f2@3 f2 bb1 ~ db2@2", K: "~@2 db2 ~@4 db2!2 ~ db2 ~ c2 ~ bb1 ~",
  L: "eb2@5 ~ eb2 ~ eb2@5 ~ eb2@2", M: "~@2 f2 ~ f2@11 ~", N: "[g2@5 ~ g2 ~ g2@5 ~ g2@4 ab2 ~ ab2@11 ~]/2",
  O: "~@2 c2 ~ c2@11 ~", P: "~@2 [eb1,eb2] ~ [gb1,gb2]@2 [db1,db2]@2 [eb1,eb2]@3 [eb1,eb2]@2 ~ [eb1,eb2] ~",
  Q: "~@2 [eb1,eb2]@2 [gb1,gb2]@2 [db1,db2]@2 [eb1,eb2]@3 [eb1,eb2]@2 ~ [eb1,eb2] ~", // Eb Gb Db Eb
  R: "~@2 [eb1,eb2]@2 [gb1,gb2]@2 [db1,db2] ~ [eb1,eb2]@3 [eb1,eb2]@2 ~ [eb1,eb2] ~", // Eb Gb Db Eb
  S: "~@2 [eb1,eb2]@2 [gb1,gb2] ~ [db1,db2]@2 [eb1,eb2]@3 [eb1,eb2]@2 ~ [eb1,eb2] ~", // Eb Gb Db Eb
  T: "~@2 [eb1,eb2]@2 [gb1,gb2]@2 [db1,db2] ~ [eb1,eb2]@2 ~ [eb1,eb2]@2 ~ [eb1,eb2] ~", // Eb Gb Db Eb
  U: "~@2 [eb1,eb2]@2 [gb1,gb2] ~ [db1,db2]@2 [eb1,eb2]@2 ~ [eb1,eb2]@2 ~ [eb1,eb2] ~", // Eb Gb Db Eb
})).s("gm_synth_bass_2").gain(0.4)

// other · pad halo · "HALO PAD"
const pad_halo = note(`<
  ~@3 A@4 ~@19 B@3 C@2 ~@12 D@2 E@2 D@2 F@2 D@2 G@2 ~ H I@2 ~@10 J@8 K@8 L@8 ~@15 M@2 ~@30
>`.pickRestart({
  A: "[~ [eb4,bb4]@6 ~]/2", B: "[~ eb2 [ab4,ab5]@3 [g4,g5], ~@2 eb3@5 ~@5]/3", C: "[[bb4,bb5]@7 [c5,c6]@8 ~]/2",
  D: "[db5@3 c5, ab4]/2", E: "[bb4@16 c5@15 ~, g4@15 ~]/2", F: "[bb4@15 c5@16 ~, g4@31 ~]/2",
  G: "[bb4@7 c5@9, g4@31 ~]/2", H: "~ c5", I: "[[g4,bb4]@7 [ab4,db5]@9]/2", J: "eb3/4",
  K: "[eb4@2 ~ eb4@3 ~@2 eb4@3 ~ eb4@2 ~@2 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 eb4@3 ~ eb4@3 ~ eb4@3 ~@2 eb4@3 ~ eb4@3 ~ eb4@3 eb4@3 ~@2 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~@2 eb4@3 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 db5 ~, eb3@63 ~]/8",
  L: "[eb4@2 ~ eb4@3 ~@2 eb4@3 ~ eb4@2 ~@2 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 eb4@3 ~ eb4@3 ~ eb4@3 ~@2 eb4@3 ~ eb4@3 ~ eb4@3 eb4@3 ~@2 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~@2 eb4@3 eb4@3 ~ eb4@3 ~ eb4@3 ~ eb4@3 ~@14, eb3@63 ~]/8",
  M: "[[eb5,eb6]@5 ~@3]/2", // Eb
})).s("gm_pad_halo").gain(0.07).pan(0.6)

// other · pad halo · "HALO PAD" · soft notes
const pad_halo_soft = note(`<
  ~@15
  [ab4@3 g4@3 ab4@2]
  [~@2 g4@6 ab4@4 g4@3 ~]
  [bb4@5 ~ ab4@6 g4@4]
  [~@2 f4@6 bb4@3 ~ ab4@2 ~@2]
  ~@121
>`).s("gm_pad_halo").gain(0.04).pan(0.6)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@3 A@2 B@2 C@2 D@2 C@2 D@2 E F G H I@2 J@2 I@2 J@2 I@2 J@2 I@2 K@2 C@2 D@2 C@2 D@2 I@2 J@2 I@2 J@2 I@2 J@2 I@2 L@2
  K@2 C@2 D@2 C@2 D@2 M@3 ~ M@3 ~@16 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 ~@2 E F G H ~@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2
  D@2 C@2 D@2
>`.pickRestart({
  A: "[~@2 [eb4,bb4,eb5]@11 ~@3, [eb2,eb3]@13 ~@3]/2", B: "[~@2 [eb4,bb4,eb5]@11 ~@3, [g2,g3]@13 ~@3]/2",
  C: "[[g5,bb5]@4 [ab5,c6]@3 f5@3 f5 eb5 ~@2 bb4@2, eb5@7 ab5@9, ~@14 db5@13 ~@5, ~@24 eb5@7 ~]/2", // Gm Ab
  D: "[[g5,bb5]@8 c6@5 ~ f5@6 f5@2 ~@5 f5 ~@4, eb5@13 ~ db5@17 ~, ~ ab5@3, ~@22 eb5@9 ~]/2", // Gm
  E: "[f4,ab4] ~ [f4,ab4] ~ [f4,ab4] ~ [g4,bb4] ~ [g4,bb4] ~ [g4,bb4] ~ [eb4,ab4] ~ [eb4,ab4] ~", // Fm Gm Ab5
  F: "[eb4,ab4] ~ [f4,ab4] ~ [f4,ab4] ~ [f4,ab4] ~ [f4,bb4] ~ [f4,bb4] ~ [f4,ab4] ~@3", // Ab5 Fm Bb5 Fm
  G: "[ab4,db5] ~ [ab4,db5] ~ [ab4,db5] ~ [bb4,eb5] ~ [bb4,eb5] ~ [bb4,eb5] ~ [ab4,c5] ~ [ab4,c5] ~", // Db5 Eb5 Ab
  H: "[ab4,c5] ~ [f4,ab4] ~ [f4,ab4] ~ [f4,ab4] ~ [f4,bb4] ~ [f4,bb4] ~ [f4,ab4] ~@3", I: "[db5@3 c5, [f4,ab4]]/2",
  J: "[[g4,bb4]@14 [ab4,c5]@17 ~, eb4@31 ~]/2", K: "[f4@24 eb4@7 ~, [db4,ab4]@31 ~]/2",
  L: "[[g4,bb4]@14 [ab4,db5]@17 ~, eb4@31 ~]/2", M: "[[eb4,bb4,eb5]@11 ~]/3",
})).s("gm_synth_strings_1").gain(0.08).pan(0.6)

// other · ocarina
const ocarina = note("<~@51 A@2 B C ~@14 A@2 D@2 E@2 F@2 G H@14 I ~@47>".pickRestart({
  A: "[eb7@6 db7 c7]/2", B: "bb6", C: "c7@15 ~", D: "[bb6@9 c7@7]/2", E: "[eb7@7 c7@5 ab6@4]/2",
  F: "[bb6@14 ab6@17 ~]/2", G: "[eb5,bb5] ab5 gb5 eb5 bb5 ab5 gb5 eb5 bb5 ab5 gb5 eb5 bb5 ab5 gb5 eb5",
  H: "bb5 ab5 gb5 eb5 bb5 ab5 gb5 eb5 bb5 ab5 gb5 eb5 bb5 ab5 gb5 eb5", I: "bb5 ~@15",
})).s("gm_ocarina").gain(0.06)

// chords · vibraphone
const vibraphone = note(`<
  ~@7 A@2 B@2 A@2 B@2 ~@20 A@2 B@2 A@2 B@2 ~@18 A@2 B@2 A@2 B@2 ~@23 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@8 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: "[[g4,bb4]@7 ~ [ab4,c5]@5 ~ [f4,ab4]@17 ~]/2", B: "[[g4,bb4]@7 ~ [ab4,c5]@6 [f4,ab4]@16 ~@2]/2",
})).s("gm_vibraphone").gain(0.2)

// bass · synth bass 1 · "SYN BASS 1"
const bass_2 = note("<~@34 A ~@25 A ~@54 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "eb2@3 ~ db2@2 ~@2 c2 ~ bb1@2 ab1@2 ~@2",
})).s("gm_synth_bass_1").gain(0.31)

// other · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead = note(`<
  A B A B A B A B A B A B A B A ~@20 B A B A B A B A ~@18 B A B A B A B A ~@4 C@4 ~@15 B A B A B A B A B A B A B A B A
  ~@8 B A B A B A B A B A B A B A B A B A B A B A B D
>`.pickRestart({
  A: "ab7 ab6 eb7 ab7 ab6 bb7 eb7 eb6 eb7 ab6 ab7 bb7 eb6 ab7 bb7 ab6",
  B: "ab6 ab5 eb6 ab6 ab5 bb6 eb6 eb5 eb6 ab5 ab6 bb6 eb5 ab6 bb6 ab5",
  C: "ab5 ab4 eb5 ab5 ab4 bb4 eb5 eb4!2 eb5 ab5 bb5 ab4 eb5 ab5 ab4",
  D: "ab7 ab6 eb7 ab7 ab6 bb7 eb7 eb6 eb7 ab6 ab7 bb7 eb6 ab7 bb7 ~",
})).s("gm_lead_8_bass_lead").gain(0.12)

// drums · kick
const kick = s("bd").struct("<~@7 [x!4]!62 ~@7 [~@3 x ~@12] [x!4]!31 ~@7 [x!4]!25>").gain(0.67)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@3 [x!16]!12 ~@61 [~@11 x ~@4] ~@63>").gain(0.2)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A@12 ~@3 B C D@3 C D@3 C D@3 C D ~ B C D@3 C D@3 C D@3 C D@2 E D@8 ~ B C D@3 C D@3 ~@7 F G E G D H E@2 I G E G D H
  E I C D@3 C D@3 C D@3 C D@3 ~@7 J C D@3 C D@3 C D@3 C D@3 C D@3 C D@2 K
>`.pickRestart({
  A: "~ x ~ x", B: "~@13 x!3", C: "x ~@3 x!2 ~@6 x!2 ~ x", D: "~@4 x!2 ~@6 x!2 ~ x", E: "~@4 x!2 ~@6 x!4",
  F: "~ x!2 ~ x!2 ~@3 x!2 ~@2 x!3", G: "~@4 x!2 ~@6 x!2 ~@2", H: "~@4 x!2 ~@4 x ~ x!4", I: "~ x!2 ~ x!2 ~@3 x ~ x!5",
  J: "~ x!5 ~ x!3 ~ x!5", K: "~@4 x!2 ~@6 x ~@3",
})).gain(0.2)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@19 A B A B A B A B A B A B A B ~@2 A B A B A B A B A B A B A B A ~ A B A B A B A B ~@2 A B A B A B A B ~@10 B@2 ~@2
  C ~@3 B@2 ~@3 A B A B A B A B A B A B A B A B ~@8 A B A B A B A B A B A B A B A B A B A B A B A ~
>`.pickRestart({
  A: "~@3 x ~@10 x ~", B: "~@7 x", C: "~@3 x ~@12",
})).gain(0.13)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@49 [~@5 x ~@2] [~@10 x!2 ~@4] ~@89>").gain(0.33)

// drums · open hat
const open_hat = s("oh").struct("<~@15 A@18 ~@2 A@24 ~@2 A@8 ~@8 A@31 ~@2 B@2 C B@2 ~ A@23 D>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@7 x", C: "~@3 x", D: "~ x ~ x ~ x ~@2",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@49 [~@2 x ~@4 x ~@8] [~@3 x ~@2 x ~@2 x ~@6] ~@89>").gain(0.33)

// drums · crash
const crash = s("cr").struct(`<
  ~@18 A B ~@14 A B ~@7 B ~@7 B ~@8 A B ~@15 B ~@7 B ~@6 B ~@7 B ~@14 A B ~@7 B ~@7 B ~@7
>`.pickRestart({
  A: "~@15 x", B: "x",
})).gain(0.27)

// drums · congas
const congas = s("conga:13").struct("<~@3 [~@4 x ~@6 x ~@3 x]!12 ~@125>").gain(0.64)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@19 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B A B@3 A B@3 ~@8 A B@3 A B@3 A B@3 A B@6 A B@3 A
  B@3 A B@3 ~@7 C A B@3 A B@3 A B@3 A B@3 A B@3 A B@2 D
>`.pickRestart({
  A: "~@2 x ~ x!2 ~ x!4 ~ x!2 ~ x", B: "x ~ x ~ x!2 ~ x!4 ~ x!2 ~ x", C: "~@4 x!2 ~ x!4 ~ x!2 ~ x",
  D: "x ~ x ~ x!2 ~ x!4 ~ x!2 ~@2",
})).gain(0.2)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@19 [~@3 x ~@3 x]!50 ~@8 [~@3 x ~@3 x]!31 ~@7 [~@3 x ~@3 x]!24 [~@3 x ~@4]>")
  .gain(0.13)

// drums · triangle
const triangle = s("triangles:30").struct("<~@3 A@12 ~@20 A@8 ~@18 A@8 B@8 ~@15 A@16 ~@8 A@23 C>".pickRestart({
  A: "~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~", B: "x!3 ~ x!3 ~ x!3 ~ x!3 ~", C: "~ x!2 ~@2 x!2 ~@2 x!2 ~@5",
})).gain(2.91)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~@3 A@12 ~@20 A@8 ~@18 A@16 ~@15 A@16 ~@8 A@23 B>".pickRestart({
  A: "~@3 x ~@3 x ~@3 x ~@3 x", B: "~@3 x ~@3 x ~@3 x ~@4",
})).gain(2.91)

stack(
  bass, pad_halo, pad_halo_soft, synth_strings_1, ocarina, vibraphone, bass_2, lead_8_bass_lead, kick, kick_soft, snare,
  snare_soft, hihat, mid_tom, open_hat, high_tom, crash, congas, shaker, shaker_soft, triangle, triangle_2
)

More by The Human League