Strudelify

True Colors

Phil Collins

KeyF♯ majorTempo85 bpm
0:00/0:00
// True Colors — Phil Collins
// 85 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 100 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(85/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 · electric bass finger
const bass = note(`<
  ~ A B A B C@2 A D E F G H I J K L K M K N O P Q A R A S A D E F G H I J K L K M K N O P Q A R A T U V A D E W G H I J
  X L K M K N O P O Y K M K Z O P O AA@2 A R A S A R A S A R A S A R A S A R A AB ~@2
>`.pickRestart({
  A: "d#1 f1", B: "f#1@3 b1@5", C: "b0/2", D: "f#1@3 a#1@5", E: "b1@4 ~ b1 ~@3 b1@15", F: "d#2@3 c#2@5", G: "f#1 g#1",
  H: "a#1@3 b1@5", I: "d#2 c#2", J: "f#1@2 ~ f#1@2 ~@4 f#1@15", K: "b1@3 f#1@5", L: "c#1@8 ~ c#1@15", M: "b1@3 c#2@5",
  N: "b1@3 d#2@5", O: "f#1@8 ~ f#1@14 ~", P: "f#1@3 f#1@5", Q: "c#2@8 ~ c#2@14 ~", R: "f#1@9 b1@8 ~ b1@6",
  S: "f#1@9 b1@9 b1@5 ~", T: "f#2@4 f2@4 ~ c#2@15", U: "b1@8 ~ b1@13 ~ b1", V: "b1@8 ~ b1@14 ~",
  W: "d#2 ~@2 d#2@6 c#2@15", X: "b1@8 ~ f#1@15", Y: "c#2", Z: "d2@3 d#2@5", AA: "c#2/2", AB: "f#1@3 b1@3 ~@2",
})).s("gm_electric_bass_finger").gain(0.3)

// chords · epiano2
const epiano2 = note(`<
  ~ A B C D@3 A E F G H I J K L M L N O P Q R S A B C T@3 F G H I J K L M L N O P Q R S A B C U V@2 A E F W H I J K L M
  L N O P Q R@2 S L N O X Q R@2 Y@2 A B C Z@3 C Z@3 C Z@3 C Z@3 C AA@3
>`.pickRestart({
  A: "f#3 g#3, c#4", B: "[g#3,a#3]@3 f#3@3 f#3 g#3, c#4", C: "[f#3,a#3] g#3, c#4",
  D: "[~@5 b4, a#3 f#4@7, ~@4 c#4@67 ~, ~@3 c#5]/3", E: "[f#3,c#4]@3 [f#3,a#3,c#4]@5", F: "[f#3,c#4]",
  G: "[f#3,c#4]@3 [f3,g#3,c#4]@5", H: "[f#2,a#3] [g#2,g#3,b3], c#4@23 ~, f#3@5 ~@7",
  I: "[a#2,f#3,a#3,c#4]@3 [b2,f#3,d#4]@5, ~@9 b3@13 ~@2", J: "[d#3,f#3]@6 [c#3,f3,g#3]@5 ~, c#4",
  K: "[f#2,c#3,f#3,b3] ~@2 [f#2,c#3,f#3,b3]@4 ~@2 [c#3,f#3,a#3]@15, ~@9 f#2@13 ~@2", // F#sus4 F#
  L: "[f#3,b3,d#4]@9 [f#3,a#3,c#4]@14 ~", M: "[g#3,c#4]@5 c#3 f3 g#3, f3@7 ~@5",
  N: "[f#3,b3,d#4]@9 [f3,g#3,c#4]@13 ~@2", O: "[f#3,b3,d#4]@8 ~ [f#3,a#3,c#4]@13 ~@2",
  P: "[f#3,b3,d#4]@8 ~ [f#3,a#3,d#4]@14 ~", Q: "[c#3,f#3,b3]@8 ~ [c#3,f#3]@15, ~@9 a#3@13 ~@2",
  R: "[c#3,f#3,b3]@8 ~ [c#3,f#3,a#3]@14 ~", S: "f#3@12 f3@11 ~, [c#3,g#3,c#4]@23 ~",
  T: "[~@8 f#3@4 g#3@4 [f#3,c#4]@3 [f#3,a#3,c#4]@5, a#3 f#4@7, ~@4 c#4@43 ~@25]/3", // F#5 F#
  U: "[f#3,a#3]@4 f3@3 ~@2 [c#3,f3]@15, c#3@7 ~@17, ~@4 g#3@19 ~", V: "[[c#4,f#4,a#4]@47 ~]/2",
  W: "[f#3,c#4]@3 [f3,a#3,c#4]@5", X: "[g#3,b3,f4]@8 ~ [f#3,a#3,d#4]@14 ~", Y: "[c#3,f3,g#3,c#4]/2",
  Z: "[~@8 f#3@4 g#3@4 [g#3,a#3]@3 f#3@3 f#3 g#3, a#3 f#4@7, ~@4 c#4@43 ~ c#4@23 ~]/3", // G#sus2
  AA: "[~ f#4@7, a#3 ~@7, ~@4 c#4@67 ~]/3",
})).s("gm_epiano2").gain(0.18)

// other · recorder
const recorder = note(`<
  ~@15 A@2 B C D ~ E F G H ~@5 I J ~ K ~ L M@2 B C D ~ E F G H ~@5 N O P Q R K ~ L M@2 B C D ~ E F S@2 B C D ~ E F T U V
  W X Y Z AA AB AC Z AA AB AC Z AA AB AC ~@7
>`.pickRestart({
  A: "[b4@9 b4@6 a#4@6 f#4@6 f4@2 ~ f4@9 ~@9]/2", B: "b4@8 ~ b4@6 a#4@5 ~ a#4@3",
  C: "b4@2 ~ b4@2 ~ b4@2 ~ b4@6 g#4@7 ~@2", D: "b4@2 ~ b4@3 a#4@2 ~ a#4@3 f#4@6 ~@6", E: "b4@8 ~ a#4@6 a#4@3 ~@6",
  F: "b4@8 ~ a#4@4 b4@2 c#5@3 ~@6", G: "d#5@3 c#5@2 ~ c#5@9 d#5@3 c#5@3 ~ a#4 ~, ~@21 b4@2 ~",
  H: "b4 a#4@2 f#4@6 a#4@8 ~@7", I: "~@7 a#4", J: "c#5@2 ~ c#5@3 c#5@2 ~ c#5@3 a#4@6 ~@6",
  K: "c#5@3 d#5@3 f#5@3 f#5@4 d#5@6 ~@5", L: "b4@3 b4@2 ~ b4@3 a#4@9 ~@6",
  M: "[b4@9 b4@6 a#4@6 f#4@6 f4@2 ~@4 [g#4,c#5]@14 ~, ~@30 f4@17 ~]/2", N: "~@9 [f#4,a#4]@2 ~ [f#4,a#4]@4 [f4,g#4]@7 ~",
  O: "~@21 f#5@2 ~", P: "f#5@3 d#5@2 ~ d#5@3 c#5@6 ~@9", Q: "c#5@3 a#4@2 ~ a#4@5 ~@13",
  R: "a#4@3 a#4@2 ~ a#4@2 ~ a#4@3 b4@3 b4@4 ~@2 b4@3",
  S: "[b4@8 ~ a#4@6 [a#4,c#5]@3 d#5@3 ~@6 f5@2 ~ f5@8 ~@10, ~@7 f#5@2 ~@7, ~ [f4,g#4,c#5]]/2", // A#m C#
  T: "[b4,g#5]@9 [a#4,f#5]@6 c#5@7 ~@2", U: "d#5@3 c#5@2 ~ c#5@15 ~@3",
  V: "a#4@3 g#4@2 ~ g#4@13 ~@3 a#4 ~, ~@21 b4@2 ~", W: "~ a#4@2 f#4@6 a#4@6 ~@9, b4 ~@11", X: "~@3 f#5",
  Y: "d#5@2 c#5@2 a#4 g#4@2 ~", Z: "~@19 g#4@2 a#4 a#4@2, ~@9 f#4 ~@2", AA: "~ a#4@4 ~@19",
  AB: "~@19 g#4 ~ a#4 a#4@2, ~@9 f#4 ~@2", AC: "~ g#4@2 f#4 f#4@3 d#4 ~ c#4@5 ~@10",
})).s("gm_recorder").gain(0.16).pan(0.7)

// other · recorder · soft notes
const recorder_soft = note(`<
  ~@93
  [~@19 g#4@2 a#4 a#4@2, ~@9 f#4 ~@2]
  [~ a#4@4 ~@19]
  [~@19 g#4 ~ a#4 a#4@2, ~@9 f#4 ~@2]
  [~ g#4@2 f#4 f#4@3 d#4 ~ c#4@5 ~@10]
  [~@19 g#4@2 a#4 a#4@2, ~@9 f#4 ~@2]
  ~@2
>`).s("gm_recorder").gain(0.06).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@6 ~@17 B@4 C D@3 ~ E@3 ~@9 F@6 G H@2 I J K L M N@3 O P Q R@3 S T O P U R@3 ~@2 B@20 ~@2
>`.pickRestart({
  A: "[f#3@4 g#3@4 a#3@3 f#3@5 a#3@4 g#3@4 a#3@3 f#3@21, c#4]/6",
  B: "[[d#3,f#4]@4 [f3,g#4]@4 [f#3,a#4]@3 [b3,f#5]@5 [d#3,f#4]@4 [f3,g#4]@4 f#3@3 ~ b4@4, c#4@95 ~, ~@6 a#4 ~, ~@27 b3@5]/4", // D#m Fm F# B5 D#m Fm
  C: "d#2 f2",
  D: "[f#2@3 ~@9 b3@2 ~@2 d#3@4 f#3@2 f3@2, ~@3 a#2@5 b2@8 ~@4 [c#3,g#3]@4, ~@3 f#3@7 ~@2, ~@7 a#3@3 ~@2]/3", // C#5
  E: "[~@10 f#4@39 ~@23]/3",
  F: "[[d#3,f#4]@12 [f3,g#4]@12 [f#3,a#4]@9 [b3,f#5]@15 [d#3,f#4]@12 [f3,g#4]@12 a#4@10 g#4@13 ~@3 f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 f#3 f3@2 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@3 ~, c#4@95 f3@2 f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~@4 f#3@2 ~ f#3@2 ~ f#3@2 ~ f#3@2 ~@3, ~@2 a#3]/6", // D#m Fm F# B5 D#m Fm
  G: "[d#3,f#3] [f3,g#3]", H: "[a#3@3 c#4@13, f#3]/2", I: "[d#3,f#3]@3 [c#3,f3]@5, a#3",
  J: "[f#3,a#3,c#4] [g#3,b3,d#4]", K: "[a#3,c#4]@3 [b3,d#4]@5, f#4@23 ~", L: "[a#3,d#4,f#4] [g#3,c#4,f4]",
  M: "b3@3 a#3@5, f#3", N: "[~@9 [a#3,c#4]@15 [c#3,f3,g#3]@24 ~@15 [a#3,c#4]@8 ~, f#3@71 ~, [b3,d#4]@7 ~]/3",
  O: "[f#3,b3,d#4]@9 [f3,g#3,c#4]@14 ~", P: "[b3,d#4]@3 [a#3,c#4]@5, f#3", Q: "b3@9 a#3@14 ~, [f#3,d#4]@23 ~",
  R: "[b3@3 a#3@5 b3@3 a#3@5 b3@3 a#3@5, [c#3,f#3]]/3", S: "[g#3,c#4,f4]", T: "[b3,d#4]@15 [a#3,c#4]@8 ~, f#3@23 ~",
  U: "[g#3,b3,f4]@3 [f#3,a#3,d#4,f#4]@5", // Fdim D#m
})).s("gm_synth_strings_1").gain(0.14)

// other · violin
const violin = note(`<
  ~ A B@2 C@2 D ~@17 E F@2 G ~@17 H@2 I J K L ~@30 M@2 N O P Q R S T U V@2 W X Y X Z ~@2
>`.pickRestart({
  A: "~@7 b4@2 c#5@15, ~@3 a#4 ~@8", B: "[a#4 b4 c#5 b4@2 a#4 f#4@10]/2",
  C: "[a#4@9 b4@21 ~ a#4@2 f#4@15, ~@15 b4 ~@8]/2", D: "g#4 a#4 g#4 f#4@2 g#4 a#4 f#4@17, ~@7 g#4 ~@16",
  E: "~@13 b4@2 c#5@9, ~@6 a#4 ~@5", F: "[a#4@3 b4@3 c#5@3 b4@6 a#4@3 f#4@15 a#4@13 f#4@2]/2",
  G: "g#4@3 a#4@6 f#4@14 ~", H: "[~@6 f#5@22 c#5@5 a#4@12 ~ a#4@2, ~@45 g#4@2 ~]/2",
  I: "c#5@4 d#5@5 ~ g#4@10 ~ f#4@3, ~@9 a#4@2 ~@13", J: "b4@3 ~ g#4@3 f#4@2 g#4@15, ~@3 a#4@2 ~@19", K: "g#4",
  L: "b4@7 c#5@2 b4@15", M: "[a#4 b4 c#5 b4@2 a#4 f#4@6 g#4@4]/2", N: "c#5", O: "f#5", P: "g#5@3 f#5", Q: "g#5",
  R: "f5@3 c#5@5", S: "d#5@3 c#5@2 a#4@3", T: "g#4@4 f#4@5 d#4@15", U: "c#5@3 f#5@5",
  V: "[c#5@9 b4@6 c#5@4 d#5@13 ~ c#5@10 b4@5]/2", W: "a#4@3 f#4@5", X: "g#4@3 a#4@5", Y: "f#4@3 d#4@5",
  Z: "f#4@4 g#4@5 d#4@9 c#4@6",
})).s("gm_violin").gain(0.28).pan(0.7)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@26 A B ~@9 C ~ D ~ E F G H ~@2 A I ~@9 J F K L M N O P@3 Q L M N ~ P@3 R@2 ~@22
>`.pickRestart({
  A: "~@9 c#5@3 c#5@3 g#4@2 ~ g#4@4 ~@2, ~@6 [g#4,d#5]@5 ~ g#4@2 ~@10", B: "[c#4,g#4]@9 [b3,f#4]@14 ~",
  C: "~@15 c#4@8 ~, ~@9 f#4@5 ~@10, ~@12 f4@11 ~", D: "[b3,d#4]@9 [c#4,f4]@14 ~", E: "~@3 [f#3,a#3,d#4]@5",
  F: "~ f#4@3, ~ c#4@7", G: "~@3 f#4@8 ~, ~@3 c#4@19 ~@2", H: "~@3 f5@5, ~@3 c#5@20 ~, ~ f#5@3",
  I: "f#5@4 f5@5 c#5@13 ~@2", J: "g#4@3 d#4@3 ~@2", K: "~@9 c#4@13 ~@2, ~@3 f#4@20 ~, ~@6 f4@17 ~",
  L: "~@6 f#4@17 ~, ~@3 c#4@20 ~", M: "~@6 c#4@5 ~@7 c#4@6, ~ f#4@3 ~ g#4@3", N: "[f#4,b4]@8 ~ [f#4,a#4]@13 ~@2",
  O: "[g#3,c#4]@2 ~ [g#3,c#4]@6 [a#3,d#4]@13 ~@2", // C#5 D#5
  P: "[~@21 c#4@2 ~, ~@3 g#4@22 ~@2 g#4@22 ~@2 g#4@18 ~@3, ~@9 f#4@11 ~ f#4@10 ~@2 f#4@18 ~@6 f#4@13 ~@2, ~@15 c#4@22 ~@2 c#4@22 ~@11]/3",
  Q: "[c#4,f4]@17 ~@7", R: "[c#4,f4]/2",
})).s("gm_electric_guitar_jazz").gain(0.17).pan(0.6)

// chords · piano
const piano = note("<~@48 A B C D E@3 F G H I ~@17 J@2 ~@22>".pickRestart({
  A: "f#5@4 f5@5 c#5@9 ~@3 a#4 b4@2", B: "[c#4,c#5]@22 [c#4,f#4,b4] ~",
  C: "[c#4,f#4,b4]@4 [c#4,f#4,a#4]@4 ~ [c#4,f#4]@4 [c#4,c#5]@4 ~ [b3,b4]@3 [a#3,a#4]@2 ~", // F#sus4 F# F#5 C# B A#
  D: "[d#3,f#3,a#3] [c#3,g#3], ~@6 c#4@5 ~", // D#m C#5
  E: "[[f#3,a#3,c#4]@8 ~@28 b4@3 a#4@6 ~@3 f#4@2 ~ f#4@6 [a#3,c#4,f4]@15, ~@9 [f#3,a#3,c#4]@15 [f#3,b3,d#4]@22 ~@2 [a#3,d#4]@8 ~@16, ~@5 a#5@3 ~@16, ~@7 d#5@5 ~@3 g#4@2 ~@7]/3", // F# A#m F# B D#5
  F: "[f#2,f#3]@12 [g#2,f#3,b3]@11 ~", G: "[a#2,f#3,c#4]@9 [b2,f#3,d#4]@14 ~",
  H: "[a#3,d#4,f#4]@11 ~ [g#3,c#4,f4]@7 ~@5", I: "[c#3,f#3,b3]@8 ~ [c#3,f#3,a#3]@14 ~",
  J: "[~@23 c#6 c#5@16 ~@8, ~@23 g#5@7 ~@18]/2",
})).s("gm_piano").gain(0.32).pan(0.7)

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

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

// drums · low tom
const low_tom = s("lt").struct("<A ~@5 B ~@16 A ~@11 B ~@8 A ~@5 C ~@17 A ~@8 A ~@22>".pickRestart({
  A: "~@7 x", B: "~@6 x!2", C: "~@11 x ~@6 x ~@2 x ~@2",
})).gain(0.48)

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

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@5 B ~@16 C ~@11 B ~@8 C ~@5 D ~@17 E ~@8 F ~@22>".pickRestart({
  A: "~@15 x ~@4 x ~@3", B: "~@4 x!2 ~@2", C: "~@5 x", D: "~@3 x ~@4 x ~@5 x ~@2 x ~@6",
  E: "~@12 x ~@2 x ~@2 x ~ x ~@3", F: "~@15 x ~@2 x ~ x ~@3",
})).gain(0.48)

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

// drums · high tom
const high_tom = s("ht").struct("<A ~@22 B ~@20 C ~@5 D ~@17 B ~@31>".pickRestart({
  A: "~@5 x ~@2", B: "~ x", C: "~@7 x ~@4", D: "~ x ~@6",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~ A ~@5 A ~@16 A ~@11 A ~@8 A ~@3 A ~ A ~@7 A ~@9 A ~@8 A ~@21>".pickRestart({
  A: "x",
})).gain(0.24)

// drums · shaker
const shaker = s("sh").struct("<~ [x ~@4 x!2 ~@4 x!2 ~@4 x!2 ~ x!2 ~ x]!96 [x ~@4 x!2 ~@4 x!2 ~@4 x ~@6] ~@2>")
  .gain(0.16)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~ A B@9 A B@3 A B@3 A B@4 A B@3 A B@3 A B@3 A B@3 A B@4 A B@3 A B A B@3 A B@3 A B@3 A B@7 A B@6 A B@3 A B@3 A B@3 A
  B@3 A B@2 C ~@2
>`.pickRestart({
  A: "~@11 x!2 ~@7 x!2 ~ x", B: "x ~@10 x!2 ~@7 x!2 ~ x", C: "x ~@10 x!2 ~@11",
})).gain(0.08)

stack(
  bass, epiano2, recorder, recorder_soft, synth_strings_1, violin, electric_guitar_jazz, piano, kick, snare, low_tom,
  hihat, mid_tom, open_hat, high_tom, crash, shaker, shaker_soft
)

More by Phil Collins