Strudelify
True Colors cover art

1986 · True Colors

True Colors

Cyndi Lauper

KeyC majorTempo122 bpm
0:00/0:00
// True Colors — Cyndi Lauper
// 122 bpm, 4/4, key C major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: duplicate parts dropped: ch 3 "SLAPBASS 1" slap bass 1 (copy of ch 2 "SYN BASS 1" synth bass 1)
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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 1 · "SYN BASS 1"
const bass = note(`<
  A B A B A B A B C@2 D E C@2 D E C@2 D F G H I@2 J K ~ L J M ~ L J M ~ L J K ~ N@2 O P A B A B A B A B C@2 D E C@2 D E
  C@2 D F G H I@2 J K ~ L J M ~ L J M ~ L J K ~ N@2 O P Q R@5 S@4 T@2 U V W X Y T Z AA J K ~ L J M ~ L J M ~ L J K ~ N@2
  O AB@4
>`.pickRestart({
  A: "d3@15 ~", B: "~@6 c3@9 ~", C: "[d2,d3]/2", D: "d3", E: "a#2@3 c3@5", F: "a#2@6 c3@9 ~",
  G: "[a#2,a#3]@3 [a2,a3]@5", H: "[g2,g3]@3 [f2,f3]@5", I: "[[a#2,a#3]@13 a2 c3 a2]/2", J: "d3 ~@6 d3",
  K: "~ d3 ~@2 d3 ~ c3 b2", L: "a2 ~@2 a2 ~@3 a2", M: "~ d3 ~@6", N: "a2@15 ~", O: "g2 a2", P: "a#2 c3", Q: "~@2 d3!6",
  R: "d3!8", S: "a2!8", T: "b2!8", U: "c3!8", V: "~ d3!7", W: "f2@3 ~ f2@3 ~ f2@3 ~ f2@3 ~", X: "g2!8",
  Y: "~@4 a2@3 ~ a2@3 ~ a2@3 ~", Z: "c#3@7 ~", AA: "a2 b2 c#3 d3@2 e3 f3@2", AB: "[a#2@8 ~ c3@9 [d2,d3]@38 ~@8]/4",
})).s("gm_synth_bass_1").gain(0.26)

// bass · synth bass 1 · "SYN BASS 1" · soft notes
const bass_soft = note(`<
  ~ A ~ A ~ A ~ A ~@17 B C D ~@2 C D ~@2 C D ~ B C ~@5 A ~ A ~ A ~ A ~@17 B C D ~@2 C D ~@2 C D ~ B C ~@4 E ~@12 F ~@2 G
  ~@4 B C D ~@2 C D ~@2 C D ~ B C ~@7
>`.pickRestart({
  A: "a#2@5 ~@11", B: "~@5 c#3 ~@2", C: "a#2 ~@7", D: "~@5 a2 c3 ~", E: "d3!2 ~@6", F: "d3 ~@7", G: "a2@3 ~@13",
})).s("gm_synth_bass_1").gain(0.1)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A@2 B@2 C@2 D@2 ~@2 E F ~@2 E F ~@2 E F G H I ~@20 A@2 B@2 C@2 D@2 ~@2 E F ~@2 E F ~@2 E F G H I ~@59 J@3
>`.pickRestart({
  A: "[d6@11 c6@3 d6@2]/2", B: "[a5 g5 a5@20 e5@6 f5@2 ~@2]/2", C: "[d5 c5 d5@20 g4@6 a4@4]/2", D: "[d5@27 ~@5]/2",
  E: "~@2 a4@2 d5@2 f5 e5@3 d5@2 a4@3 ~", F: "f4 ~ d5 ~ g4 c5 d5@2", G: "[d5,f5]@3 [a4,c5,e5,a5]@5",
  H: "[g4,d5,g5]@3 [a4,c5,f5]@5", I: "[d5,f5]", J: "[~ [d3,a4,d5,f#5]@19 ~@4]/3",
})).s("gm_string_ensemble_1").gain(0.25)

// other · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<~@11 A ~@3 A ~@3 A B C D ~@31 A ~@3 A ~@3 A B C D ~@62>".pickRestart({
  A: "~@2 a#4@3 ~@11", B: "[a#4,a#5]@3 ~@5", C: "a#4@3 f4@5", D: "[f4,a#4]",
})).s("gm_string_ensemble_1").gain(0.1)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A B A C A C D B ~@2 D E ~@2 D E ~@2 D E ~@23 A B A C A C D B ~@2 D E ~@2 D E ~@2 D E ~@65
>`.pickRestart({
  A: "~@2 a4@2 d5@2 f5 e5@3 d5@2 a4@2 ~@2", B: "f4 a#4 d5 ~ g4 c5 d5 ~", C: "f4@2 a#4@2 d5 ~@3 g4@2 c5@2 d5@2 ~@2",
  D: "~@2 a4@2 d5@2 f5 e5@3 d5@2 a4 ~@3", E: "f4@2 a#4@2 d5 ~@3 g4@2 c5@2 d5@4",
})).s("gm_overdriven_guitar").gain(0.48)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  A B A B A C A D E F G H E F I H E F I H J K L M N O P Q N O P Q N O P Q N O P R S T U A B A B A C A D E F I H E F I H
  E F I H J K L M N O P Q N O P Q N O P Q N O P R S T U ~@20 N O P Q N O P Q N O P Q N O P R S T V@4
>`.pickRestart({
  A: "[a3,d4,e4]@3 ~", B: "[f3,a#3,d4]@4 ~@2 [g3,c4,d4]@7 ~@3", C: "[f3,a#3,d4]@2 ~ [g3,c4,d4]@3 ~@2",
  D: "[f3,a#3,d4]@4 ~@2 [g3,c4,d4]@5 ~@5", E: "[a4,d5,f5]@6 [g4,c5,e5]@7 ~@3", F: "[f4,a#4,d5]@5 ~ [g4,c5,e5]@9 ~",
  G: "[a4,d5,e5]@3 ~", H: "[f4,a#4,d5]@5 ~ [g4,c5,d5]@6 ~@4", I: "[a4,d5,e5]@3 ~, c5 ~@15",
  J: "[a#4,d5,f5]@3 [a4,c5,e5]@5", K: "[g4,a#4,d5]@3 [f4,a4,c5]@5", L: "[a#4,d5,f5]",
  M: "[f3,a#3,d4]@2 [a#3,d4,f4]@2 [a3,c4,e4] ~@3", // A# Am
  N: "[d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [c5,e5,g5] ~", // Dm C
  O: "[c5,e5,g5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~", // C Dm
  P: "[d5,f5,a#5] ~ [d5,f5,a#5] ~ [d5,f5,a#5] ~ [d5,f5,a#5] ~ [d5,f5,a#5] ~ [d5,f5,a#5] ~ [d5,f5,a#5] ~ [d5,f5,a#5] ~", // A#
  Q: "[d5,e5,a5] ~ [d5,e5,a5] ~ [d5,e5,a5] ~ [d5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~", // Dsus2 Am
  R: "[d5,e5,a5]!2", S: "[c5,e5,a5]!2", T: "[g4,a#4,d5]!2", U: "[g4,a#4,d5] [g4,c5,e5]",
  V: "[[g4,a#4,d5]@9 [g4,c5,e5]@9 [d5,f#5,a5]@38 ~@8]/4", // Gm C D
})).s("gm_epiano1").gain(0.4)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  ~@24 A B C D E F G H I F J K I F L M N O P ~@24 A Q R S T F U V I F R V W F X Y@2 Z AA AB AC AD AE AF AG AH AI AJ AK
  AL@2 AM AN AO AP AQ AR@3 AS AT AU AV AW AX AY AZ@2 AX BA BB BC F G BD BE BF BG BH@3
>`.pickRestart({
  A: "[d3,a4]@2 ~@12 [c3,g4,c5,e5] ~, [d5,f5] ~@15", B: "~@2 [a4,d5,f5] ~@13, ~ d3 ~@6", C: "[d5,f5] ~@7",
  D: "[a2,d5,e5,a5]@3 ~@5 [a2,c5,e5,a5]@2 ~@6", E: "[d3,d5]@2 ~@12 [c3,c5,e5,g5] ~, [f5,a5] ~@15",
  F: "~@2 [d3,d5,f5,a5] ~@13", G: "d5 ~@7, f5 ~@15", H: "[d5,e5,a5] ~@3 [c5,e5,a5] ~@3, a2 ~@7 a2 ~@7",
  I: "[d5,f5,a5] ~@13 [c3,c5,e5,g5] ~, d3 ~@7", J: "[d5,a#5] ~@7, f5 ~@15", K: "[a2,d5,e5,a5] ~@3 [a2,c5,e5,a5] ~@3",
  L: "[f5,a#5] ~@15, d5 ~@7", M: "[a2,d5,e5,a5] ~ [a2,d5,e5,a5] ~", N: "[a2,e5,a5] ~ [a2,c5,e5,a5] ~",
  O: "[g4,d5]@5 ~@3 [a2,g4,d5]@5 ~@3", P: "[a#2,g4,a#4,d5]@5 ~@3 [c3,g4,c5,e5]@4 ~@4",
  Q: "~ [d3,d5] ~@6, ~@2 [a4,f5] ~@13", R: "[a#2,d5,f5,a#5] ~@7", S: "[d5,e5,a5]@3 ~@5 [a2,c5,e5,a5]@2 ~@6",
  T: "[d3,d5,f5,a5] ~@13 [c3,c5,e5,g5] ~", U: "[d5,a#5] ~@7, [a#2,f5] ~@15",
  V: "[a2,d5,e5,a5]@3 ~@5 [a2,c5,e5]@2 ~@6, ~@8 a5 ~@7", W: "[d3,d5,f5]@2 ~@12 [c5,e5,g5] ~, a5 ~@13 c3@2",
  X: "[a#2,d5,f5] ~@7, a#5 ~@15", // A#
  Y: "[[d5,e5,a5]@3 ~@5 [d5,e5,a5]@3 ~@5 [c5,e5,a5]@4 ~@4 [c5,e5,a5]@5 ~@3, a2@29 ~@3]/2", // Dsus2 Am
  Z: "[g2,g4,d5] ~ [a2,g4,d5] ~", AA: "[g4,a#4,d5] ~ [g4,c5,e5] ~",
  AB: "[f#4,a4,d5]@2 ~@2 [f#4,a4,d5] ~ [f#4,a4,d5]@4 ~@6", AC: "[f#4,a4,d5]@3 ~@3 [f#4,a4,d5]@5 ~@5",
  AD: "[g#4,b4,e5]@3 ~ [b4,e5] ~ [g#4,b4,e5]@4 ~@6", AE: "[g#4,b4,e5]@3 ~@3 [g#4,b4,e5]@5 ~@5",
  AF: "[a4,c5,f5]@2 ~ [a4,c5,f5] ~@2 [c5,f5]@4 ~@6, ~@5 a4@4 ~@7", AG: "[b4,d5,g5]@3 ~@3 [b4,d5,g5]@6 ~@4",
  AH: "[d5,e5,a5]@2 ~@2 [d5,e5,a5] ~ [d5,e5,a5]@4 ~@6", AI: "[c#5,e5,a5]@3 ~@3 [c#5,e5,a5]@6 ~@4",
  AJ: "[d5,f#5,a5]@3 ~ [d5,f#5,a5] ~ [d5,f#5,a5]@3 ~@7", AK: "[d5,f#5,a5] ~@2 [d5,f#5,a5]@2 ~@3",
  AL: "[[e5,b5]@2 ~@2 [e5,g#5,b5] ~ [e5,g#5,b5]@3 ~@7 g#5@2 ~@4 [e5,g#5,b5]@6 ~@4, ~@15 [e5,b5]@3 ~@14]/2", // E5 E E5
  AM: "[f5,a5,c6]@3 [f5,c6] a5 ~ [f5,a5,c6]@3 ~@7", AN: "[g5,b5,d6]@3 ~@3 [g5,b5,d6]@5 ~@5",
  AO: "[d5,f5,a5]!2 ~ [d5,f5,a5] [f5,a5] [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5]!2 ~ [d5,f5,a5] ~ [d5,f5,a5] ~", // Dm F Dm
  AP: "[e5,g5,b5]@3 ~@3 [e5,g5,b5]@2 ~@4 [e5,g5]@2 ~@2, ~@12 b5 ~@3", // Em
  AQ: "[d5,e5,a5]!2 ~ [d5,e5,a5]!2 ~ [d5,e5,a5]!2 ~ [d5,e5,a5]!2 ~ [d5,e5,a5] ~ [d5,e5,a5] ~", // Dsus2
  AR: "[[d5,g5,b5]@3 ~@3 [d5,g5,b5]@2 ~@2 [d5,g5,b5]@2 ~@3 [e5,a5,e6]@30 ~@3]/3", // G A5
  AS: "[d3,a4,d5,f5]@2 ~@12 [g4,c5,e5] ~, ~@7 c3", AT: "~ [d3,a4] ~@6, ~@2 [d5,f5] ~@13",
  AU: "[d5,f5,a#5] ~@7, a#2 ~@15", AV: "[a2,d5,e5,a5]@2 ~@6 [c5,e5,a5]@3 ~@5",
  AW: "[d3,f5,a5] ~@13 [c5,e5,g5] ~, d5 ~@7", AX: "~@2 [d5,f5,a5] ~@13", AY: "[d5,f5,a#5] ~@7",
  AZ: "[[d5,e5,a5]@2 ~@6 [c5,a5] ~@6 a5 f5 ~@13 [c5,e5,g5] ~, ~@8 e5@2 ~@5 d5@2 ~@15]/2", BA: "[d5,f5] ~@7, a#2 ~@15",
  BB: "[a2,d5,e5,a5]@3 ~@5 [c5,e5,a5]@2 ~@6", BC: "[d3,d5]@2 ~@12 [c5,e5,g5] ~, [f5,a5] ~@15",
  BD: "[a2,d5,e5,a5]@3 ~@5 [a2,d5,e5,a5]@3 ~@5", BE: "[a2,c5,e5,a5]@3 ~@5 [a2,c5,e5,a5]@3 ~@5",
  BF: "[g2,g4,d5]@5 ~@3 [a2,g4,d5]@5 ~@3", BG: "[a#2,g4,d5]@5 ~@4 [c3,c5,e5]@5 ~@2, ~@8 g4@5 ~@3",
  BH: "[~@2 [d3,a4,d5]@37 ~@9]/3", // D5
})).s("gm_string_ensemble_1").gain(0.36)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft_2 = note(`<
  ~@26 A ~@3 B ~@3 C ~@3 D ~ E F ~@28 G ~@13 H I ~@2 J ~@7 K ~@6 L@3 ~@3 M ~@6 N ~ O ~ B ~@2 P Q R@3
>`.pickRestart({
  A: "[a#2,a#5] ~@7", B: "a#5 ~@7, a#2 ~@15", C: "a#2 ~@7", D: "a#2 ~@15", E: "c5 ~@3", F: "[g2,a#4]@5 ~@3 a#4@5 ~@3",
  G: "a2 ~@7", H: "a#4 ~ a#4 ~", I: "a#2@3 ~@5 c3@4 ~@4", J: "~@4 g#4 ~@11", K: "g#5 ~@7", L: "[~@5 c#6@10 ~]/3",
  M: "~@8 a2 ~@7", N: "a#5 ~@7", O: "~@14 c3 ~", P: "a#4@4 ~@4 a#4@5 ~@3", Q: "a#4@5 ~@11",
  R: "[~ f#5@19 ~@4, ~@2 a5@35 ~@11]/3",
})).s("gm_string_ensemble_1").gain(0.2)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@3]!105 ~ [x ~@2 x!2 ~@3]!18 [x ~@6 x ~ x ~@6] ~@3>").gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct("<[~ x ~ x]!105 ~ [~ x ~ x]!18 [~@5 x ~@7 x ~@2] ~@3>").gain(0.8)

// drums · congas
const congas = s("conga:13").struct("<[x!8]!105 ~ [x!8]!18 [x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~] x ~@2>").gain(1.28)

stack(
  bass, bass_soft, string_ensemble_1, string_ensemble_1_soft, overdriven_guitar, epiano1, string_ensemble_1_2,
  string_ensemble_1_soft_2, kick, mid_tom, congas
)

More by Cyndi Lauper