Strudelify

Never Too Late

Kylie Minogue

KeyF majorTempo119 bpm
0:00/0:00
// Never Too Late — Kylie Minogue
// 119 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(119/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 · slap bass 2
const bass = note(`<
  ~ A B C D E F G H I J K L M N O P Q R S T A B C D E F G H I J K L M N O P Q R S T A B C D E F G U A B C D E F G H V W
  X Y Z AA AB AC I J K L M N O P Q R S T A B C D E F G U A B C D E F G U A B C D E F G U A B C D E F G AD
>`.pickRestart({
  A: "g1@4 g1@3 g1 g1@3 g1 a1!2 bb1@2", B: "c2@4 c2@3 c2 g1 bb1 c2@2 bb1@2 c2!2", C: "a1@4 a1@3 g1 a1@2 a1 c2@3 a1 c2",
  D: "d2@4 d2@3 d2 a1 c2 d2@2 a1@2 f1!2", E: "g1@4 g1@3 g1 g1@3 a1 g1!3 a1", F: "c2@4 c2@3 c2 g1 bb1 c2@2 d2@2 c2!2",
  G: "f1@4 f1@3 f1 f1@3 f1!3 g1!2", H: "f1@4 f1@3 f1!2 a1 c2 d2 e2@2 c2 d2", I: "a1@4 a1@3 g1 a1@3 g1 a1!2 f1 g1",
  J: "a1@4 a1@3 c2 g1@2 a1@2 c2@2 a1@2", K: "d2@4 d2@3 a1 d2@3 c2 g1 a1!2 c2", L: "d2@4 d2@3 d2 a1@2 d2@2 d2 c2 g1 a1",
  M: "c2 c2@3 c2@3 g1 c2@3 a1 g1@2 a1@2", N: "c2@4 c2@3 c2 a1!2 c2@2 d2@2 c2@2", O: "f1@4 f1@3 f1 f1@3 a1 d2@2 c2@2",
  P: "f1@4 f1@3 a1 c2 a1 eb2@2 d2@2 bb1@2", Q: "c2@4 c2@3 g1 c2@3 d2 eb2!2 d2 c2", R: "f1@4 f1@3 f1 f1@2 f2@6",
  S: "bb1@4 bb1@3 bb1 bb1@2 a1@2 a1@2 f1@2", T: "d2@4 d2@3 d2 d2@2 c2@2 bb1@2 a1@2", U: "f1@4 f1@3 f1 d2@4 d2@4",
  V: "e2@4 e1@4 e1@3 g1 e1@2 g1@2, d2 ~@15", W: "a1@4 a1@3 a1 e1@2 a1@2 c2@2 a1@2", X: "d2@4 d2@3 a1 d2@3 d2 a1@2 g1@2",
  Y: "g1@4 g1@3 g1 g1@2 g1@2 a1@2 g1@2", Z: "c2@4 c2@3 g1 c2@3 g1 c2@2 g1@2", AA: "a1@4 a1@3 a1 a1@3 e1 a1 ~ a1 c2",
  AB: "d2@4 d2@3 a1 d2@3 a1 d2!2 a1!2", AC: "g1!2 e1!2", AD: "~ f1@2 ~@13",
})).s("gm_slap_bass_2").gain(0.45).pan(0.3)

// chords · epiano2
const epiano2 = note(`<
  ~@2 A ~ B ~ C D@2 E F G H I J K L M N O P Q R S B T C U@2 E V G H I J K L M N W X Y A S B T C Z@2 AA AB AC AD AE C U@2
  AF@2 AG@2 AH@2 AI AJ AK@4 AL@2 AM@2 M N W AN AO A S B T C Z@2 AO A S B T C Z@2 AO A S B T C Z@2 AO A S B T C AP ~
>`.pickRestart({
  A: "[d5,f5,bb5] ~@3 [d5,f5,bb5] ~@5 [d5,f5,bb5] ~@5", B: "[a4,c5,e5]@4 [a4,d5,f5] ~ [f4,bb4,d5]@5 ~ [f4,a4,c5]@3 ~",
  C: "[c6,f6,a6]@3 ~ [c6,e6,g6] ~ [bb5,d6,f6]@3 ~ [c6,e6,g6]@5 ~", // F C Bb C
  D: "[[a5,c6,f6]@3 ~ [a5,c6,e6] ~ [a5,c6,f6]@5 ~ [a5,c6,e6] ~ [a5,c6,f6]@9 ~ [b3,f4,a4]@3 ~ [b3,e4,ab4]@3 ~]/2", // F Am F Am F Bm7b5 E
  E: "e4@2 a3@2 ~@2 [a3,e4]@9 ~, ~@4 c4@11 ~", F: "e4@2 a3@2 [a3,c4,e4] ~ [a3,c4,e4]@4 [c4,e4,a4]@5 ~",
  G: "[g4,c5,e5]@4 [g4,b4,d5]@2 [e4,a4,c5]@9 ~", H: "[g4,c5,e5]@3 ~ [g4,b4,d5]@2 [e4,a4,c5]@3 ~ [c4,e4,a4]@5 ~",
  I: "[bb4,d5,f5]@3 ~ [g4,bb4,d5] ~ [bb4,d5,f5]@9 ~", J: "[bb4,d5,f5]@3 ~ [g4,bb4,d5] ~ [bb4,d5,f5]@3 ~ [bb4,d5,g5]@6",
  K: "[c5,e5,a5]@2 [c5,e5,g5] [c5,e5,a5]@5", L: "[c5,e5,a5]@2 [c5,e5,g5] [c5,e5,a5]@2 [a4,c5,e5]@3",
  M: "[g5,bb5,eb6]@3 [g5,bb5,eb6]@5", N: "[eb5,g5,bb5]@3 [eb5,g5,bb5]@2 [g5,bb5,c6]@3",
  O: "[d5,f5]@4 [d5,f5] [db5,e5]@3", P: "[d5,f5]", Q: "[d5,f5]@3 ~ [d5,f5] ~ [d5,f5] ~@9",
  R: "[d5,f5] ~@3 [d5,f5] ~@5 [d5,f5] ~@5", S: "[c5,e5,a5]@3 ~ [c5,e5,g5] ~ [c5,e5,a5] ~@9",
  T: "[f4,bb4,d5]@5 ~ [bb4,d5,f5]@3 ~ [d5,f5,bb5]@4 ~@2", // Bb
  U: "[[a5,c6,f6]@3 ~ [a5,c6,e6] ~ [a5,c6,f6]@5 ~ [a5,c6,e6] ~ [a5,c6,f6]@10 [b3,f4,a4]@3 ~ [b3,e4,ab4]@3 ~]/2", // F Am F Am F Bm7b5 E
  V: "e4@2 a3@2 [a3,e4] ~ [a3,c4,e4]@4 [c4,e4,a4]@5 ~, ~@2 c4 ~@5", W: "[bb4,d5,f5]@4 [bb4,d5,f5] [a4,db5,e5]@3",
  X: "[a4,f5]", Y: "[f5,bb5]@3 ~ [d5,f5,a5] ~ [d5,f5,bb5] ~@9",
  Z: "[[a4,c5,f5]@4 [a4,c5,e5]@2 [a4,c5,f5]@6 [a4,c5,e5]@2 [f4,a4,d5]@6 [a4,c5,e5]@2 [gb4,a4,c5]@9 ~]/2", // F Am F Am Dm Am Gbdim
  AA: "[d5,f5,bb5]@4 [d5,f5,a5]@2 [f5,bb5] ~@7 [d5,f5,a5]@2, ~@3 d5 ~@4", // Bb Dm Bb5 Dm
  AB: "[d5,f5,bb5]@4 [d5,f5,bb5]@2 [d5,f5,bb5]!2 [c5,e5,a5]@2 [d5,f5,bb5]@6", // Bb Am Bb
  AC: "[c5,e5,a5]@2 [c5,e5,g5] [c5,e5,a5] ~@4", AD: "[a4,c5,e5]@4 [a4,d5,f5]@2 [f4,bb4,d5]@6 [f4,a4,c5]@3 ~",
  AE: "[f4,bb4,d5]@5 ~ [bb4,d5,f5]@10", // Bb
  AF: "[[e4,g4,b4]@5 ~ [e4,g4,b4]!2 ~@4 [e4,g4,b4] ~ [e4,a4,c5]@5 ~ [e4,a4,c5]@2 ~ [e4,a4,c5] ~@4 [e4,a4,c5]@3 ~]/2", // Em Am
  AG: "[[f4,a4,c5]@13 ~@13 g4@2 b4@2 d5 ~, ~@7 [g4,b4,d5]@5 ~@4, ~@11 g3@5]/2", // F G
  AH: "[[c5,e5,g5]@3 ~ [a4,d5,f5]@3 ~ [g4,c5,e5]@2 [g4,b4,d5] ~@15 [a4,c5]@2 b4@2 [c5,e5]@2, ~@14 [a4,c5,e5]@10 ~@4 d5 ~@3, ~@11 a3@5]/2", // C Dm C G Am C Am
  AI: "[a4,c5,f5]@3 ~ [a4,c5,e5]@3 ~ [a4,d5,f5] ~ [c5,f5] ~@3 [b4,d5,g5] ~, ~@5 a4 ~@2", // F Am Dm F5 G
  AJ: "~@2 g4@2 d5@2 [ab4,b4,e5]@6 [e4,ab4,b4]@3 ~, [b4,g5]@3 ~@5, d5 ~@3", // E Em
  AK: "[e4,g4,b4]@2 [e4,g4,a4] [e4,g4,b4]@2 [e4,g4,c5] [e4,g4,b4] [e4,g4,a4]", // Em A7 Em C Em A7
  AL: "[d4,f4,a4]@2 [d4,f4,g4] [d4,f4,a4]@2 [d4,f4,bb4] [d4,f4,a4] [d4,f4,g4]", // Dm G7 Dm Bb Dm G7
  AM: "[e4,c5,f5,a5]@3 [a3,f5] [c4,g5]@2 e4@3 ~ f4@2 g4@2 f4@2, ~@6 [c5,f5,a5]@9 ~", AN: "[a4,d5,f5]",
  AO: "[d5,f5,bb5]@3 ~ [d5,f5,a5] ~ [d5,f5,bb5] ~@9", // Bb Dm Bb
  AP: "[a5,c6,f6]@3 ~ [a5,c6,e6] ~ [a5,c6,f6]@5 ~ [a5,c6,e6] ~ [a5,c6,f6]@2", // F Am F Am F
})).s("gm_epiano2").gain(0.35).pan(0.7)

// other · synth brass 2
const synth_brass_2 = note(`<
  A B@2 C@2 D@2 ~@2 E@2 F@2 G@2 H@2 F@2 I J K@2 L@2 M@2 N O E@2 F@2 G@2 H@2 F@2 I J K@2 L@2 M@2 P@2 K@2 L@2 M@2 N O ~@20
  K@2 L@2 M@2 P@2 K@2 L@2 M@2 P@2 K@2 L@2 M@2 P@2 K@2 L@2 M@2 N Q
>`.pickRestart({
  A: "~@3 d4", B: "[[d4,f4,bb4]@31 ~]/2", C: "[[c4,e4,a4]@31 ~]/2", D: "[bb4@3 a4@2 f4@2 c4@9]/2", E: "a3/2", F: "g4/2",
  G: "[f4@7 g4]/2", H: "a4/2", I: "f4@7 ~ f4@2 e4@6", J: "a4@3 ~ a4@3 ~ a4@2 g4@6", K: "[bb4@27 ~ bb4@4]/2",
  L: "[c5@7 a4]/2", M: "[bb4@3 a4@2 f4@2 c4@6 ~@3]/2", N: "f4", O: "~@2 f4 e4", P: "[f4@11 gb4@5]/2", Q: "~ f4@2 ~@13",
})).s("gm_synth_brass_2").gain(0.35).pan(0.3)

// chords · synth brass 2
const synth_brass_2_2 = note(`<
  ~@5 A@2 ~@2 B@2 C@2 D@2 B@2 E@2 F G H@2 I@2 A@2 ~@2 B@2 C@2 D@2 B@2 E@2 J K L@2 M@2 A@2 ~@2 H@2 I@2 A@2 ~@2 N O P Q R
  O S@2 B@2 C@2 D@2 B@2 E@2 J K H@2 I@2 A@2 ~@2 H@2 I@2 A@2 ~@2 H@2 I@2 A@2 ~@2 H@2 I@2 A@2 ~ T
>`.pickRestart({
  A: "[bb4@3 a4@2 f4@2 c4@5 ~@4]/2", B: "[a3,c4,e4]/2", C: "[c4,e4,g4]/2", D: "[bb3,d4,f4]/2", E: "[g3,bb3,eb4]/2",
  F: "[bb3,d4,f4]@5 [a3,db4,e4]@3", G: "[a3,d4,f4]@5 [c4,e4,g4]@3", H: "[d4,f4,bb4]/2", I: "[c4,e4,a4]/2",
  J: "[d4,f4]@5 [db4,e4]@3", K: "[d4,f4]@5 [e4,g4]@3", L: "[f4,bb4]/2", M: "[e4,a4]/2", N: "[e4,g4,b4]",
  O: "[e4,a4,c5]", P: "[f4,a4,c5]", Q: "[g4,b4,d5]", R: "[e4,g4,c5]", S: "[[f4,a4,c5]@7 [g4,b4,d5]@4 [ab4,b4,e5]@5]/2",
  T: "~ [f4,a4,c5]@2 ~@13", // F
})).s("gm_synth_brass_2").gain(0.3).pan(0.7)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A B@2 C@2 D@2 E@2 ~@8 F G H I J@2 C@2 D@2 K@2 ~@8 F G L M N@2 C@2 D@2 O@2 N@2 C@2 D@2 P@2 Q R@2 S T@2 U V ~@3 W X@2
  Y@2 F G L Z N@2 C@2 D@2 AA@2 N@2 C@2 D@2 AA@2 N@2 C@2 D@2 AA@2 N@2 C@2 D@2 U AB
>`.pickRestart({
  A: "~@14 [d6,f6] [e6,g6,a6]", B: "[bb6@31 ~]/2", C: "a6/2", D: "[d6@3 f6@2 bb6@2 g6@9]/2", E: "[f6@3 ~]/2", F: "c5",
  G: "eb5@3 eb5@3 f5@2", H: "[f4,d5,d6]@3 ~ [f4,d5,d6]@3 ~ [f4,d5,d6]@2 db6@3 db6 d6 ~, ~@5 [a4,db5]@3",
  I: "[f4,a4,d7]@4 [f4,a4,d7]@3 ~ [f4,a4,d7]@2 ~@4 [d6,f6] [e6,g6], ~@5 [e4,g4,c7]@3", J: "[bb6, a6 ~@31]/2",
  K: "[f6@12 c5@2 d5 a4]/2", L: "[bb4,d5,d6]@3 ~ [bb4,d5,d6]@3 ~ [bb4,d5,d6]@2 db6@3 db6 d6 ~, ~@5 [a4,db5]@3",
  M: "[a4,d5,d7]@4 [a4,d5,d7]@3 ~ [a4,d5,d7]@2 ~@4 [d6,e6,f6] [g6,a6], ~@5 [g4,c5,c7]@3", N: "bb6/2",
  O: "[f5@12 e5@2 d5@6 e5@2 c5@5 ~ d5@2 d6 [e6,f6,g6,a6]]/2", P: "[f6@12 b4@2 d5 b4]/2", Q: "b5", R: "c6/2", S: "d6",
  T: "[g6@4 f6@4 e6@2 d6@3 ~ e6@18]/2", U: "f6", V: "g6 ab6", W: "~ c5 d5 e5", X: "[f5@2 e5 d5@2 c5@11]/2",
  Y: "[e5@3 a4@2 bb4@2 c5@9]/2", Z: "[a4,d5,d7]@4 [a4,d5,d7]@3 ~ [a4,d5,d7]@2 ~@4 [d6,e6] [f6,g6,a6], ~@5 [g4,c5,c7]@3",
  AA: "[f5@12 e5@2 d5@6 e5@2 c5@5 ~ d5@2 [d6,e6] [f6,g6,a6]]/2", AB: "f6 ~@15",
})).s("gm_string_ensemble_1").gain(0.3)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~ A@2 B@2 C@4 ~@12 A@2 B@2 C@4 ~@12 A@2 B@2 C@4 A@2 B@2 C@4 ~@11 D E@2 F@2 ~@4 A@2 B@2 G@2 ~@2 A@2 B@2 G@2 ~@2 A@2 B@2
  G@2 ~@2 A@2 B@2 G@2 ~@2
>`.pickRestart({
  A: "bb5/2", B: "a5/2", C: "[bb5@6 d6@3 ~ d6@4 c6@42 ~@8]/4", D: "~ c4 d4 e4", E: "[f4@2 e4 d4@2 c4@11]/2",
  F: "[e4@3 a3@2 bb3@2 c4@9]/2", G: "[bb5@6 d6@3 ~ d6@4 c6@18]/2",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.3)

// other · string ensemble 1
const string_ensemble_1_3 = note(`<
  ~@3 A B C D E@2 ~@14 A B C D E@2 ~@14 A B C D E@2 ~@2 A B C D E@2 ~@6 F@2 ~@14 A B C D E@2 ~@2 A B C D E@2 ~@2 A B C D
  E@2 ~@2 A B C D G H
>`.pickRestart({
  A: "~@7 e5", B: "e5@2 f5@2 d5@2 bb4@5 ~ a4@4", C: "bb4", D: "c5", E: "[a4@3 ~]/2",
  F: "[f5@2 e5@2 d5 c5 ~ d5@4 ~ e5 c5 d5 a4]/2", G: "a4", H: "~ f5@2 ~@13",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.7)

// chords · brass section
const brass_section = note("<~ A B C D E@2 ~@101 F>".pickRestart({
  A: "[d5,f5,bb5]@2 [d5,f5,bb5]@2 [d5,f5,a5]@2 [d5,f5,bb5] ~@9", B: "~@4 [d5,f5,bb5] ~@5 [d5,f5,bb5] ~@5",
  C: "[c5,e5,a5]@2 [c5,e5,a5]@2 [c5,e5,g5]@2 [c5,e5,a5] ~@9", D: "~@4 [d5,f5,a5] ~@5 [c5,e5,a5] ~@5",
  E: "[[f4,bb4,d5]@5 ~ [bb4,d5,f5]@3 ~ [f4,bb4,d5]@3 ~ [f4,g4,c5]@10 ~@8]/2", F: "~ [f4,f5]@2 ~@13",
})).s("gm_brass_section").gain(0.5)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!107 [~ x ~@14]>").gain(0.5)

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

// drums · hihat
const hihat = s("hh").struct("<~ [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!107 [~ x ~@14]>").gain(0.3)

// drums · crash
const crash = s("cr").struct("<~ A ~@15 A ~@3 A ~@15 A ~@3 A ~@7 A ~@15 A ~@7 A ~@3 A ~@31>".pickRestart({
  A: "x",
})).gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@5 A ~@13 A@2 ~@18 A@2 ~@34 A@2 ~@32>".pickRestart({
  A: "x",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@9 [~ x ~ x ~ x ~ x]!99 ~>").gain(0.2)

// drums · congas
const congas = s("conga:13").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 ~@8 A B A B A B A B A B A B 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: "~ x ~@3 x ~@2", B: "~@2 x ~@4 x ~@2 x ~@5",
})).gain(0.95)

// drums · congas
const congas_2 = s("conga:18").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 ~@8 A B A B A B A B A B A B 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: "~ x ~ x", B: "~@4 x ~@3 x!2 ~@6",
})).gain(0.95)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@8 ~@12 A@8 ~@12 A@16 ~@20 A@31 ~>".pickRestart({
  A: "x ~@6 x ~@8",
})).gain(1.51)

// drums · shaker
const shaker = s("sh").struct("<~ A@8 ~@12 A@8 ~@12 A@16 B@16 ~@4 A@31 ~>".pickRestart({
  A: "~ x!2 ~", B: "x!2 ~@5 x!3 ~@5 x",
})).gain(0.3)

stack(
  bass, epiano2, synth_brass_2, synth_brass_2_2, string_ensemble_1, string_ensemble_1_2, string_ensemble_1_3,
  brass_section, kick, snare, hihat, crash, ride, tambourine, congas, congas_2, cabasa, shaker
)

More by Kylie Minogue