Strudelify

True Colours

Phil Collins

KeyF♯ majorTempo86 bpm
0:00/0:00
// True Colours — Collins Phil
// 86 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "Warm Pad" shakuhachi (copy of ch 5 "Warm Pad" pad warm)
// note: Full arrangement: all 97 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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 · acoustic bass · "Bass"
const bass = note(`<
  ~ A B A C D@2 A E F G H I J K L M@2 N L O P@2 Q A B A C A E F G H I J K L M@2 N L O P@2 Q A B A C D@2 A E F G H I J K
  L M@2 N L O P@3 R S N L O P@2 Q@2 A B A C A B A C A B A C A B A C A B A ~
>`.pickRestart({
  A: "d#1 f1", B: "f#1@3 b1@5", C: "f#1@2 a#1 b1@5", D: "b0/2", E: "f#1@3 a#1@4 f#1", F: "b1@4 ~ b1@2 ~@2 b1@15",
  G: "d#2@7 ~@2 c#2@15", H: "f#1 g#1", I: "a#1@3 b1@5", J: "d#2 c#2", K: "f#1@2 ~ f#1@6 f#1@15", L: "b1@3 f#1@5",
  M: "[c#1@3 ~@2 c#1@2 ~@2 c#1@13 ~@2 b1@8 ~ f#1@15, ~@23 a#1@2 ~@23]/2", N: "b1@3 c#2@4 a#1", O: "b1@3 d#1@4 c#1",
  P: "f#1@3 ~@2 f#1@2 ~@2 f#1@15", Q: "c#2@2 ~ c#2@5", R: "c#2@3 ~@2 c#2@2 ~@2 c#2@15", S: "b1@8 ~ f#1@15",
})).s("gm_acoustic_bass").gain(0.48)

// other · bagpipe
const bagpipe = note("<~ A B@2 C@3 ~@17 A D E F ~@17 G@2 H I@4 ~@28 D E J K@2 L M N O P Q R S T@2 U ~>".pickRestart({
  A: "~@12 a#4@2 b4 c#5@9", B: "[a#4 b4 c#5 b4@2 a#4 f#4@10]/2",
  C: "[a#4@9 b4@11 a#4 f#4@18 a#4 f#4@2 g#4@3 a#4 f#4@26, ~@40 g#4 ~@5 g#4 ~@25]/3", D: "a#4 b4 c#5 b4@2 a#4 f#4@2",
  E: "g#4 a#4", F: "f#4 g#4 f#4@6", G: "[~@12 f5@18 c#5@3 a#4@12 g#4 a#4@2]/2", H: "c#5@9 a#4@2 g#4@11 f#4@2",
  I: "[b4@3 a#4@3 f#4@3 g#4@5 a#4 g#4@18 a#4@6 c#5@18 ~ c#5@26 ~@12, ~@57 f#5@2 ~@37]/4", J: "c#5@2 d#5 f#4@5",
  K: "[f#5@5 g#5 a#5@2]/2", L: "g#5", M: "f#5@3 c#5@5", N: "d#5@3 c#5@2 a#4@3", O: "g#4@6 f#4@3 d#5@13 ~ f#5",
  P: "c#5@3 f#5@5", Q: "c#5@9 b4@5 ~ c#5@9", R: "b4 a#4 g#4 f#4", S: "g#4 a#4 g#4 f#4@5", T: "[c#5 f#5@9 c#5@6]/2",
  U: "a#4 g#4 a#4 f#4",
})).s("gm_bagpipe").gain(0.24)

// chords · piano · "Elec. Piano"
const piano = note(`<
  ~@6 A ~@38 B C B D E F G H I J K L M N O P Q R Q S T@3 U Q R Q S T@2 ~@2 B C B D B C B D B C B D B C B D B C B ~
>`.pickRestart({
  A: "f#5 c#5 b4 a#4", B: "[d#2,a#3,c#4] [f2,g#3,c#4]", C: "[f#2,f#3,a#3,c#4]@3 b3@4 a#3, ~@3 [b2,d#3,f#3]@5",
  D: "f#5@3 ~@2 f5@3 ~ c#5@3 ~@10 b4@2, [f#2,f#3,a#3,c#4]@3 [b2,d#3,f#3,b3]@5, ~@7 a#4", // F# B
  E: "[b2,d#3,f#3,b3]@23 [b4,d#5,f#5], c#5 ~@7", // B
  F: "[b4,d#5,f#5]@3 ~@2 [g#4,a#4,c#5]@3 ~ [c#4,d#4,f#4]@3 ~@2 [f#4,a#4,c#5]@3 ~ [d#4,g#4,b4]@3 [c#4,f#4,a#4]@3", // B A#m7 D#m7 F# G#m F#
  G: "[c#4,d#4,f#4] [c#4,f4,g#4]", H: "[c#4,f#4,a#4]@3 [f#4,a#4,c#5]@5", I: "[d#4,f#4,b4]",
  J: "[d#4,f#4,c#5]@3 [f4,g#4,c#5]@5", K: "[f#4,a#4,c#5] [f#4,b4,d#5]", L: "[a#4,d#5,f#5]@3 [b4,d#5,f#5]@5",
  M: "[f#4,a#4,c#5] [f4,g#4,c#5]", N: "[f#4,b4,d#5] [f#4,b4,c#5] [g#4,b4] [f#4,a#4,c#5]@5, ~ d#4@3",
  O: "[d#4,f#4,b4,d#5]@3 d#5@2 c#5@3, ~@3 [c#4,f#4,a#4]@5", P: "[c#4,f4,g#4,c#5]",
  Q: "[d#4,f#4,b4,d#5]@3 [c#4,f#4,a#4,c#5]@5", R: "[d#4,f#4,b4,d#5]@3 [c#4,f4,g#4,c#5]@5",
  S: "[d#4,g#4,b4,d#5]@3 [d#4,f#4,a#4,d#5]@5", T: "[c#4,f#4,b4,c#5]@3 [c#4,f#4,a#4,c#5]@5",
  U: "[c#4,f#4,g#4,c#5]@3 [c#4,f4,g#4,c#5]@5", // C#sus4 C#
})).s("gm_piano").gain(0.28)

// chords · pad warm · "Warm Pad"
const pad_warm = note(`<
  ~ A B A C@3 D E F G H I J K L@2 K M N O K@2 P Q R S R D E F G H I J K L@2 K M N O K@2 P Q R S T@3 D E F G H I J K L@2
  K M N O K@3 U K M N O K@2 P@2 Q R S V@3 S V@3 S V@3 S V@3 S ~
>`.pickRestart({
  A: "[f#3,c#4] [g#3,c#4]", B: "[a#3,c#4]@3 [f#3,b3]@5", C: "[[a#3,c#4] [f#3,b3]@7]/3", D: "[d#3,f#3,b3] [f3,g#3,c#4]",
  E: "~ [a#3,c#4]@8 ~ f#3@14, f#3@3 a#3@5", F: "~ b3@23, [d#3,f#3]", G: "[f#3,a#3]@3 [f3,g#3]@5, c#4",
  H: "[f#3,a#3,c#4] [g#3,b3,d#4]", I: "[a#3,c#4]@3 [b3,d#4]@5, f#4", J: "[a#3,c#4,f#4] [g#3,c#4,f4]",
  K: "[f#3,b3,d#4]@3 [f#3,a#3,c#4]@5", L: "[[f#3,b3,d#4]@3 [f#3,a#3]@4 [f3,g#3]@9, ~@3 c#4@13]/2",
  M: "[f#3,b3,d#4]@3 [g#3,c#4,f4]@5", N: "[b3,d#4]@3 [a#3,c#4]@5, f#4", O: "[b3,d#4,f#4]@3 [f#3,a#3,d#4]@5",
  P: "f#4 f4, [g#3,c#4]", Q: "[f#3,c#4,d#4] [g#3,c#4], ~@4 f4@3 ~", R: "[a#3,c#4,f#4]@3 [f#3,b3,d#4]@5",
  S: "[f#3,c#4,d#4] [g#3,c#4,f4]", T: "[[a#3,c#4,f#4] [f#3,b3,d#4]@7]/3", U: "[g#3,c#4,f4]",
  V: "[[a#3,c#4,f#4]@3 [f#3,d#4]@5 c#4@4 [g#3,c#4]@4 [a#3,c#4,f#4]@3 [f#3,b3,d#4]@5, ~@3 b3@16 ~@5, ~@8 [f#3,d#4]@11 ~@5, ~@4 f4 ~@3]/3", // F# D#m C#5 F# B D#m
})).s("gm_pad_warm").gain(0.4).pan(1)

// chords · electric guitar jazz · "Guitar"
const electric_guitar_jazz = note(`<
  ~@25 A B C ~ D ~@6 E F E G H I J@2 K L A B C ~@2 M N O P ~@4 E F E G H I J@2 Q R E G H I J@2 K@2 L A B C L A B C L A B
  C L A B C L A B ~
>`.pickRestart({
  A: "c#4@2 f#4 d#4@5", B: "~@2 [a#4,d#5] [g#4,c#5]!2 [f4,a#4]!2 [c#4,f#4]",
  C: "[f4,g#4] [f#4,a#4] [f4,g#4] [d#4,f#4]@5", D: "~@3 f#3@5", E: "b3@3 a#3@5", F: "f3 g#3 c#4 f#4 f4 c#4 a#3 f#3",
  G: "d#4@3 f4@5", H: "d#4@3 c#4@5", I: "f#3@3 [f#3,a#3,d#4]@5", J: "f#3@6 c#4@3 f#4@5 ~ f#3@9, ~@7 c#4@5",
  K: "c#4 f#4 c#5 f#5 f5 c#5 g#4 c#4", L: "f#5 ~", M: "[a#4,d#5] [g#4,c#5]", N: "[a#4,c#5]@3 [f#4,a#4]@5",
  O: "[f#4,b4] ~", P: "[f#4,a#4]@3 [f4,g#4]@4 ~", Q: "f#3@2 c#4 f#4@2 [f#3,c#4]@3",
  R: "f#4@2 f4 [g#3,c#4,f4]@5, [g#3,c#4]@3 ~@5", // C# C#5
})).s("gm_electric_guitar_jazz").gain(0.24)

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

// drums · snare
const snare = s("sd").struct("<~ A@22 B A@20 B A@31 B A@19 ~>".pickRestart({
  A: "~ x ~ x", B: "~@6 x ~@10 x!2 ~@5",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@23 [~@14 x!3 ~@7] ~@20 [~@14 x!3 ~@7] ~@31 [~@14 x!3 ~@7] ~@20>").gain(0.08)

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

// drums · pedal hat
const pedal_hat = s("hh").struct("<~ [x!8]!95 ~>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@22 B ~@11 B ~@8 B ~@5 B ~@7 B ~@17 B ~@20>".pickRestart({
  A: "~@5 x!2 ~", B: "~@5 x",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@36 [~@7 x ~@4] ~@22 [~@7 x ~@4] ~@37>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<A ~@5 B ~@16 C ~@11 D ~@8 C ~@5 D ~@7 D ~@17 C ~@20>".pickRestart({
  A: "~@5 x ~@2", B: "~@14 x!2 ~@2 x ~@5", C: "~@3 x ~@4", D: "~@17 x ~@6",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@24 A ~@11 A ~@8 A ~@13 A ~@17 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3>".pickRestart({
  A: "x",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x ~@10 x ~@8 x ~@2 x]!94 [x ~@10 x ~@8 x ~@3] ~>").gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~
  [x ~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x]!94
  [x ~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~ x!2 ~@2]
  ~
>`).gain(2.03)

stack(
  bass, bagpipe, piano, pad_warm, electric_guitar_jazz, kick, snare, snare_soft, low_tom, pedal_hat, mid_tom, open_hat,
  high_tom, crash, tambourine, cabasa
)

More by Phil Collins