Strudelify

Millenium

Robbie Williams

KeyD♭ majorTempo92 bpm
0:00/0:00
// Millenium — Robbie Williams
// 92 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 acoustic bass (copy of ch 2 synth bass 2)
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(92/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
const bass = note(`<
  ~ A B A C A D A D E F E G H I E J E F E G H K L M N O N O N P E Q E R E S T U L V N O N W N X Y Z AA AB AA AC AA AB AA
  AD AE AF AE AF AG AH E Q AG AI E Q AJ AH AK AF AJ AH AL AF AJ AH AM AN AJ AH AJ AN AJ AO AJ AN AJ AI AP@2 ~
>`.pickRestart({
  A: "db2@4 db2 ~@2 db2 f2@2 gb2@2 ~@2 ab2@2", B: "ab2@7 ab2 b1@2 ab1@2 ~ ab1@2 ab1",
  C: "ab1@4 ab1@3 ab1 b1@2 ab1@2 ab1@4", D: "ab1@7 ab1 b1@2 ab1@4 ab1@2", E: "db2@4 ~@3 db2 f2@2 gb2@2 ~@2 ab2@2",
  F: "ab1@4 ~@3 ab1 b1@2 ab1@3 ab1 ab1@2", G: "ab1@4 ~@3 ab2 ab2@2 gb2@2 ~ db2!2 ab1",
  H: "db2@4 ~@3 db2 f2@2 gb2@2 ~ ab2!3", I: "ab2@4 ~@3 ab1 b1@2 ab1@3 ab1 db2!2",
  J: "ab2@4 ~@3 ab2 ab2@2 gb2@2 ~ db2!2 ab1", K: "ab2@4 ~@3 ab1 b1@2 b1@3 ~@2 db2",
  L: "db2@4 ~@3 db2 f2@2 gb2@2 ~@2 gb2@2", M: "ab2@5 ~@11", N: "db2@4 db2@3 db2 f2@2 gb2@2 ~@2 ab2@2",
  O: "ab2@4 ab1@3 ab1 b1@2 b1@3 ~ ab1@2", P: "ab2@4 ab1@3 ab1 b1@2 b1@2 ab1@2 ab1@2",
  Q: "ab2@7 ab2 ab2@2 gb2@2 ~ db2!2 ab1", R: "ab1@4 ~@3 ab1 b1@2 bb1@3 ab1 ab1@2",
  S: "ab1@4 ~@3 f2 gb2 f2 gb2@2 f2@2 db2@2", T: "db2@4 ~@3 db2 f2@2 gb2@2 ~ db2 f2 gb2",
  U: "ab2@4 ~@3 ab1 b1@2 b1@3 ab1!3", V: "ab2@15 ~", W: "ab2@4 ab1@3 ab1 db2@2 b1@5 db2",
  X: "ab2@4 ab1@3 ab1 db2@2 db2@3 ab1 ab1@2", Y: "db2@7 db2 f2@2 gb2@2 ~ ab1 ab1@2",
  Z: "ab1@7 ab1 ab1@2 ab1@3 db2!2 ab1", AA: "db2@2 ~@5 db2 f2 ~ gb2 ~@3 ab2 ~",
  AB: "ab1@2 ~@5 ab1 b1 ~ ab1 ~@2 ab1!2 ~", AC: "ab1@2 ~@5 ab2!2 ~ gb2 ~@2 db2!2 ab1", AD: "b1@2 ~@5 db2!2 ~ gb2@6",
  AE: "db2@7 db2 db2@2 db2@4 db2@2", AF: "ab1@7 ab1 ab1@2 ab1@6", AG: "db2@4 eb2@3 eb2 f2@2 gb2@2 ~@2 ab2@2",
  AH: "ab2@4 ab1@3 ab1 db2@2 b1@4 ab1@2", AI: "ab1@4 ab1@3 ab1 db2@2 b1@4 ab1@2", AJ: "db2@7 db2 f2@2 gb2@2 ~@2 ab2@2",
  AK: "db2@4 ~@3 db2 f2@2 gb2@2 ~@2 ab1@2", AL: "db2@7 db2 f2@2 gb2@2 ~@2 ab1@2", AM: "db2@7 db2 f2@2 gb2@2 ~@2 gb2@2",
  AN: "ab1@7 ab1 ab1@2 ab1@4 ab1@2", AO: "ab1@7 ab1 b1@2 bb1@4 ab1@2", AP: "db2/2",
})).s("gm_synth_bass_2").gain(0.64)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A B A B A B A B C ~@15 A B A B A B A B C ~ D@2 E@3 F G B A B A B A B C ~ D@2 E@3 F G 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 H@2 ~
>`.pickRestart({
  A: "[db5,db6]@2 [c5,c6] [db5,db6] [c5,c6]@2 [bb4,bb5] [c5,c6] [bb4,bb5]@4 [ab4,ab5]@4", // Db C Db C Bb C Bb Ab
  B: "[b4,b5]@2 [bb4,bb5] [b4,b5] [bb4,bb5]@2 [ab4,ab5] [bb4,bb5] [ab4,ab5]@4 [gb4,gb5]@4", C: "[db5,db6]@3 ~",
  D: "[db2@23 ab2 b2 bb2 b2@4 f2@2]/2",
  E: "[~@3 f3@12 ~@8 bb2 b2 bb2 b2@4 ~@5 ab3@13, db3@15 gb3@15 f2@2 ~@16, ~@31 f3@17]/3",
  F: "gb3@12 db4 [eb4,f4] [f4,gb4] [gb4,g4]", // Ebsus2 Gbmaj7 Gmaj7
  G: "[db5,db6]@2 [c5,c6] [db5,db6] [c5,c6]@2 [bb4,bb5] [c5,c6] [bb4,bb5]@4 [ab4,ab5]@4, a4 ~@15", // Db C Db C Bb C Bb Ab
  H: "[[db4,db5,db6]@31 ~]/2", // Db
})).s("gm_string_ensemble_1").gain(0.4)

// chords · synth strings 1
const synth_strings_1 = note("<~ A B A B A B A B ~@85>".pickRestart({
  A: "[db4,eb4,f4,ab4]", B: "[b3,eb4,gb4,ab4]",
})).s("gm_synth_strings_1").gain(0.45)

// chords · epiano1
const epiano1 = note("<~ A B C B A B C D ~@85>".pickRestart({
  A: "[db4,f4,ab4]@15 ~", B: "[bb3,b3,gb4]@15 ~", C: "[ab3,db4,f4]@15 ~", D: "[bb3,b3,gb4]@11 ~@5",
})).s("gm_epiano1").gain(0.5)

// other · orchestral harp · Db Ab Ebm Bbm Fm Dbsus2 Ab Gbmaj7 …
const orchestral_harp = note(`<
  ~@7
  [~@14 gb6 [db6,eb6,f6]]
  [[ab5,bb5,c6] [eb5,f5,gb5] [bb4,c5,db5] [f4,gb4,ab4] [db4,eb4] [ab3,bb3,c4] [f3,gb3] [c3,db3,eb3] [db3,eb3] [f3,gb3,ab3] [bb3,c4,db4] [eb4,f4,gb4] [ab4,bb4] [c5,db5,eb5] [f5,gb5] [ab5,bb5]]
  [db6 ~@3, c6 ~@15]
  ~@84
>`).s("gm_orchestral_harp").gain(0.4).pan(0.6)

// 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 C A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A 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 C ~@2
>`.pickRestart({
  A: "x ~@6 x!2 ~ x ~ x ~ x ~", B: "x ~@6 x!2 ~ x ~@3 x!2", C: "x", D: "x ~@6 x!2 ~ x ~@5",
})).gain(0.54)

// drums · clap
const clap = s("cp").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A C 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 ~@3
>`.pickRestart({
  A: "~@4 x ~@4 x ~@6", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.54)

// 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 ~ A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A C 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 ~@3
>`.pickRestart({
  A: "~@4 x ~@4 x ~@6", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.54)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@16 A ~@7 B ~@7 A ~@7 B ~@7 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~ A ~@3
>`.pickRestart({
  A: "~@10 x ~@2 x ~@2", B: "x ~@4 x ~@2",
})).gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 [~@15 x] ~@15 [~@15 x] ~@53>").gain(0.54)

// drums · high tom
const high_tom = s("ht").struct("<~@24 [~@13 x!2 ~] ~@15 [~@13 x!2 ~] ~@53>").gain(0.54)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A ~@6 B A ~@6 C A ~@6 B A ~@6 C A ~@6 B A ~@2 B A ~@3 A ~@2 B A ~@6 B A ~@2 B A ~@2 B A ~@6 B A ~@2 B A B A
  ~@2
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~ x",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~ A@23 ~ A@15 ~ A@15 B A@34 ~@3>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.36)

// drums · bongos
const bongos = s("bongo:18").struct("<~@24 [~@11 x ~@4] ~@15 [~@11 x ~@4] ~@53>").gain(1.42)

// drums · congas
const congas = s("conga:13").struct("<~@24 [~@3 x] ~@15 [~@3 x] ~@53>").gain(1.73)

stack(
  bass, string_ensemble_1, synth_strings_1, epiano1, orchestral_harp, kick, clap, snare, hihat, open_hat, mid_tom,
  high_tom, crash, tambourine, bongos, congas
)

More by Robbie Williams