Strudelify

Blonde Over Blue

Billy Joel

KeyC majorTempo132 bpm
0:00/0:00
// Blonde Over Blue — Billy Joel
// 132 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 47, 4/4 at bar 48, 2/4 at bar 90, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: ch 6 "Bridge Guitar (fifths)" named as a guitar, played on electric guitar clean (its lead 7 fifths patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 9 "Bridge Guitar (solo)" overdriven guitar (copy of ch 8 "Bridge Guitar (solo)" bagpipe)
// note: Full arrangement: all 161 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Overdriven Guitar.
setcpm(132/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.

// chords · synth strings 1 · "Psycho Strings"
const synth_strings_1 = note(`<
  ~@5 A B C D E F G H I J K L M N O P Q R S T U@2 V W X@2 ~@15 Y@2 Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP
  AQ@3 AR@6 ~@23 AS AT A B C D E F G H I J K L M N O P Q R S T U@2 V W X@2 ~@36
>`.pickRestart({
  A: "[b4,c5]@2 ~@2 [b4,c5] ~@3 [b4,c5] ~@3 [b4,c5] ~@3", B: "[b4,c5] ~@3 [b4,c5] ~@3 [b4,c5]@2 ~@2 [b4,c5] ~@3",
  C: "[b4,c5]@2 ~@2 [b4,c5] ~@3 [b4,c5]@2 ~@2 [b4,c5]@2 ~@2", // Cmaj7
  D: "[a#4,c5] ~@3 [a#4,c5] ~@3 [a#4,c5]@2 ~@2 [a#4,c5]@2 ~@2", // A#sus2
  E: "[a4,c5]@2 ~@2 [a4,c5] ~@3 [a4,c5]@2 ~@2 [a4,c5] ~@3", F: "[a4,c5]@2 ~@2 [a4,c5]@2 ~@2 [a4,c5]@2 ~@2 [g4,c5] ~@3",
  G: "[b4,c5] ~@3 b4@2 ~@2 b4@2 ~@2 [b4,c5]@2 ~@2, ~@4 c5 ~@3 c5 ~@7", // Cmaj7
  H: "c5@2 ~@2 [a#4,b4,c5] ~@3 [a#4,c5]@2 ~@2 [a#4,c5] ~@3, a#4 ~@15", // A#sus2
  I: "[a4,c5] ~@3 [a4,c5] ~@2 [a4,c5] ~@4 [a4,c5] ~@3", J: "a4 ~ [a4,c5] ~ [a4,c5] ~ [g4,c5] ~, c5 ~@15",
  K: "[b4,c5] ~@3 [b4,c5] ~@3 b4@2 ~@2 b4@2 ~@2, ~@8 c5 ~@3 c5 ~@3", // Cmaj7
  L: "[a#4,c5] ~@3 [a#4,c5] ~@3 [a#4,c5] ~@3 [a#4,c5] ~@3", // A#sus2
  M: "[a4,c5] ~@3 [a4,c5] ~@3 [a4,c5] ~@3 a4@2 ~@2, ~@12 c5 ~@3", // Am
  N: "[a4,c5]@2 ~@2 [a4,c5] ~@3 [a4,c5]@2 ~@2 [g4,c5]@2 ~@2", // Am C5
  O: "b4@2 ~@2 [b4,c5] ~@3 [b4,c5] ~@3 [b4,c5]@2 ~@2, c5 ~@15", P: "[a#4,c5] ~ [a#4,c5] ~ [a#4,c5] ~ [a#4,c5] ~",
  Q: "[a4,c5] ~@3 [a4,c5] ~@3 c5@2 ~@2 [a4,c5]@2 ~@2, ~@8 a4 ~@7", // Am
  R: "[a4,c5]@2 ~@2 [a4,c5]@2 ~@2 [a4,c5] ~@3 [g4,c5]@2 ~@2", S: "a#3", T: "[f3,c4,f4], a#4 ~",
  U: "[d#4@15 [a3,f4]@16 ~]/2", V: "[a#3,d#4,g4]", W: "~ a4, [f3,c4,f4]", X: "[[a#3,d#4]@15 [a3,f4]@16 ~]/2",
  Y: "[~@8 [c4,f4,a4]@15 ~ [b4,c5]@2 ~@2 [b4,c5] ~@3]/2", Z: "[b4,c5] ~@3 [b4,c5] ~@3 [b4,c5] ~@3 [b4,c5] ~@3",
  AA: "[b4,c5]@2 ~@2 [b4,c5] ~@3 [b4,c5]@2 ~@2 [b4,c5] ~@3", // Cmaj7
  AB: "[b4,c5]@2 ~@2 [b4,c5]@2 ~@2 [a#4,c5] ~@3 [a#4,c5] ~@3", // Cmaj7 A#sus2
  AC: "[a#4,c5]@2 ~@2 [a#4,c5]@2 ~@2 [a4,c5]@2 ~@2 [a4,c5] ~@3", // A#sus2 Am
  AD: "[a4,c5]@2 ~@2 [a4,c5] ~@3 [a4,c5]@2 ~@2 [a4,c5]@2 ~@2", // Am
  AE: "[a4,c5]@2 ~@2 [g4,c5] ~@3 [b4,c5] ~@3 b4@2 ~@2, ~@12 c5 ~@3", // Am C5 Cmaj7
  AF: "b4@2 ~@2 [b4,c5]@2 ~@2 c5@2 ~@2 [a#4,b4,c5] ~@3, c5 ~@7 a#4 ~@7", // Cmaj7
  AG: "[a#4,c5]@2 ~@2 [a#4,c5] ~@3 [a4,c5] ~@3 [a4,c5] ~@2 [a4,c5]", // A#sus2 Am
  AH: "~@4 [a4,c5] ~@3 a4@2 ~@2 [a4,c5]@2 ~@2, ~@8 c5 ~@7", AI: "[a4,c5]@2 ~@2 [g4,c5]@2 ~@2 [b4,c5] ~@3 [b4,c5] ~@3",
  AJ: "b4@2 ~@2 b4@2 ~@2 [a#4,c5] ~@3 [a#4,c5] ~@3, c5 ~@3 c5 ~@11", // A#sus2
  AK: "[a#4,c5] ~@3 [a#4,c5] ~@3 [a4,c5] ~@3 [a4,c5] ~@3", // A#sus2 Am
  AL: "[a4,c5] ~@3 a4@2 ~@2 [a4,c5]@2 ~@2 [a4,c5] ~@3, ~@4 c5 ~@11", // Am
  AM: "[a4,c5]@2 ~@2 [g4,c5]@2 ~@2 b4@2 ~@2 [b4,c5] ~@3, ~@8 c5 ~@7", // Am C5 Cmaj7
  AN: "[b4,c5] ~@3 [b4,c5]@2 ~@2 [a#4,c5]@2 ~@2 [a#4,c5]@2 ~@2", // Cmaj7 A#sus2
  AO: "[a#4,c5]@2 ~@2 [a#4,c5]@2 ~@2 [a4,c5] ~@3 [a4,c5] ~@3", AP: "c5 ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~, a4 ~@15",
  AQ: "[[a4,c5] ~@3 [g4,c5]@2 ~@2 a#3@16 [f3,c4,f4]@16 d#4@8, ~@3 a#4 ~@2]/3", // Am C5 F5
  AR: "[~@7 [a3,f4]@16 ~ [a#3,d#4,g4]@16 ~@8 a4@8 [a#3,d#4]@15 [a3,f4]@16 ~@9, ~@5 [f3,c4,f4]@2 ~@5]/6", // Dm D# D#5 Dm F5
  AS: "[f#4,g4] ~@3 [f#4,g4] ~@3 [f#4,g4] ~@3 [f#4,g4]@3 ~", AT: "[f#4,g4] ~@3 [f#4,g4] ~@2 [f#4,g4] ~@4 [f#4,g4] ~@3",
})).s("gm_synth_strings_1").gain(0.46)

// chords · synth strings 1 · "Psycho Strings" · soft notes
const synth_strings_1_soft = note("<~@23 A B C@2 D@2 E@2 ~@34 F@2 G@4 H@3 ~@43 A B C@2 D@2 E@2 ~@36>".pickRestart({
  A: "[d#4,g4]", B: "~ a4", C: "[[g3,a#3,g4]@15 [c4,a4]@17]/2", D: "[d#3@15 a#4@8 ~@9]/2",
  E: "[[g3,g4]@15 ~ c4@16, ~@15 a4@16 ~]/2", F: "[~ [d#4,g4]@2 ~]/2",
  G: "[a4@8 [g3,a#3,g4]@15 [c4,a4]@17 d#3@15 a#4@8 ~]/4", H: "[~@8 [g3,g4]@15 ~ c4@16 ~@8, ~@23 a4@16 ~@9]/3",
})).s("gm_synth_strings_1").gain(0.26)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@7 A@2 B@2 C@2 D@2 E F G H I J K L M N O P Q F M R S T U V W X E Y Z X F AA AB AC AD AE ~@2 AF@6 AG@7 AH AI AJ AK@8
  AL@8 AM AN@6 AO AP ~@11 A@2 B@2 C@2 D@2 E F G H I J K L M N O P Q F M R S T U V W X E Y Z X F AA AB AC AD AE S T U V W
  X E Y Z X F AA AB AC AD AQ@2 ~@3
>`.pickRestart({
  A: "[c2@15 ~]/2", B: "[f1@29 ~@3]/2", C: "[c2@7 ~]/2", D: "[f1@15 ~]/2", E: "c2@13 ~ c2 ~", F: "c2",
  G: "f1@13 ~ f1 ~", H: "f1", I: "c2 ~ c2 ~@3 c2 ~ c2 ~ c2 ~@5", J: "c2@2 c2@2 ~@3 c2 c2@2 c2@2 ~@4",
  K: "f1 ~ f1@2 ~@2 f1 ~ f1@2 f1@2 ~@4", L: "f1 ~ f1@2 ~@2 f1 ~ f1 ~ f1@4 ~@2", M: "d#2@15 ~", N: "f2", O: "g2",
  P: "a2", Q: "a#1", R: "f2@15 ~", S: "g2@13 ~ g2@2", T: "d2@13 ~ d2@2", U: "c2@13 ~ c2@2", V: "g2@2 ~ g2@4 d2",
  W: "g2@12 ~ g2@2 ~", X: "d2@7 d2", Y: "c2@5 ~ f2@6 f2@4", Z: "g2@6 ~ g2 ~ g2@7", AA: "g2@5 ~ g2@4 d2@2 g2@2 d2 ~",
  AB: "g1@7 g2", AC: "d2", AD: "c2@7 ~ c2@7 ~", AE: "c3@2 b2@3 g2@3 f2@7 ~", AF: "[~@8 c2@30 ~@2 f1@29 ~@3 c2@24]/6",
  AG: "[~@8 f1@30 ~@2 c2@13 ~ c2 ~ c2@16 f1@13 ~ f1 ~ f1@16 c2 ~ c2 ~@3 c2 ~]/7", AH: "c2 ~ c2 ~@5 c2@2 c2@2 ~@3 c2",
  AI: "c2@2 c2@2 ~@4 f1 ~ f1@2 ~@2 f1 ~", AJ: "f1@2 f1@2 ~@4 f1 ~ f1@2 ~@2 f1 ~",
  AK: "[f1 ~ f1@4 ~@2 d#2@15 ~ f2@16 g2@16 a2@16 a#1@16 c2@16 d#2@15 ~ f2@8]/8",
  AL: "[~@8 g2@13 ~ g2@2 d2@13 ~ d2@2 c2@13 ~ c2@2 g2@4 ~@2 g2@8 d2@2 g2@12 ~ g2@2 ~ d2@14 d2@2 c2@13 ~ c2 ~ c2@5 ~ f2@2]/8",
  AM: "~@4 f2@4 g2@6 ~ g2", AN: "[~ g2@7 d2@14 d2@2 c2@16 g2@5 ~ g2@4 d2@2 g2@2 d2 ~ g1@14 g2@2 d2@16 c2@7 ~]/6",
  AO: "c2@7 ~ c3@2 b2@3 g2@3", AP: "f2@7 ~@9", AQ: "[c3@2 b2@3 g2@3 f2@15 ~@9]/2",
})).s("gm_acoustic_bass").gain(0.46)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@7 A@2 B@2 A@2 C@2 ~@8 D E F G D H D I J K@2 L M N@2 O J P@2 Q M R@2 S ~@2 T@8 ~@8 U@2 V@4 W@2 X@2 Y@2 Z@2 AA@2 AB@2
  AC@2 AD@2 AE@2 AF ~@11 A@2 B@2 A@2 C@2 ~@8 D E F G D H D I J K@2 L M N@2 O J P@2 Q M R@2 S J K@2 L M N@2 O J P@2 Q M
  R@2 AG@2 ~@3
>`.pickRestart({
  A: "[[c3,g3]@31 ~]/2", B: "[[f2,c3]@29 ~@3]/2", C: "[[f2,c3]@7 ~]/2", D: "[a#3,d#4]@15 ~",
  E: "f4@2 c4 f4 a#4 a4 f4 c4, c4@3 ~@13", F: "[a#3,d#4]", G: "[c4,f4], d#4 ~@15",
  H: "[c4,f4]@4 c4@2 f4@2 a#4@2 a4@2 f4@2 c4 ~", I: "[c4,f4]@2 c4 f4 a#4 a4 f4 g4", J: "[g3,d4]",
  K: "[~@4 [d4,a4]@4 [a3,f#4]@3 ~ [f#3,d4]@16 ~@4]/2", L: "[f#3,d4]@2 ~ [e3,c4] ~ [d3,b3]@2 ~", M: "[g3,d4]@15 ~",
  N: "[~@4 [d4,a4]@4 [a3,f#4]@3 ~ [f#3,d4]@18 ~@2]/2", O: "[f#3,d4]@5 ~ [e3,c4]@2 ~@2 [d3,b3]@5 ~",
  P: "[~@4 [d4,a4]@4 [a3,f#4]@4 [f#3,d4]@17 ~@3]/2", Q: "[f#3,d4]@2 ~ [e3,c4] ~ [d3,b3]@3",
  R: "[~@4 [d4,a4]@4 ~@4 [f#3,d4]@19 ~, ~@8 [a3,f#4]@7 ~@17]/2", // D5 D
  S: "[e4,c5]@2 ~ [d4,b4]@2 ~ [b3,g4]@2 [a3,f4]@7 ~, f#3@3 ~@13", // C G Em Dm
  T: "[~@8 [c3,g3]@31 ~ [f2,c3]@29 ~@3 [c3,g3]@31 ~ [f2,c3]@24]/8", // C5 F5 C5 F5
  U: "[~@8 [a#3,d#4]@15 ~ f4@4 c4@2 f4@2, ~@24 c4@3 ~@5]/2", // D#5
  V: "[a#4@2 a4@2 f4@2 c4@2 [a#3,d#4]@16 [c4,f4]@16 [a#3,d#4]@15 ~ [c4,f4]@4 c4@2 f4@2, ~@24 d#4 ~@39]/4", // D#5 F5 D#5 F5
  W: "[a#4@2 a4@2 f4@2 c4 ~ [a#3,d#4]@15 ~ [c4,f4]@4 c4@2 f4@2]/2", X: "[a#4 a4 f4 g4 [g3,d4]@8 ~@2 [d4,a4]@2]/2",
  Y: "[[a3,f#4]@3 ~ [f#3,d4]@16 ~@4 [f#3,d4]@4 ~@2 [e3,c4]@2]/2", Z: "[~@2 [d3,b3]@4 ~@2 [g3,d4]@15 ~@5 [d4,a4]@4]/2",
  AA: "[[a3,f#4]@3 ~ [f#3,d4]@18 ~@2 [f#3,d4]@5 ~ [e3,c4]@2]/2", AB: "[~@2 [d3,b3]@5 ~ [g3,d4]@16 ~@4 [d4,a4]@4]/2",
  AC: "[[a3,f#4]@4 [f#3,d4]@17 ~@3 [f#3,d4]@4 ~@2 [e3,c4]@2]/2", AD: "[~@2 [d3,b3]@6 [g3,d4]@15 ~@5 [d4,a4]@4]/2",
  AE: "[~@4 [f#3,d4]@19 ~ [e4,c5]@2 ~ [d4,b4]@2 ~ [b3,g4]@2, [a3,f#4]@7 ~@17 f#3@3 ~@5]/2", AF: "[a3,f4]@7 ~@9",
  AG: "[[e4,c5]@2 ~ [d4,b4]@2 ~ [b3,g4]@2 [a3,f4]@15 ~@9, f#3@3 ~@29]/2", // C G Em Dm
})).s("gm_overdriven_guitar").gain(0.46)

// chords · electric guitar muted · "Muted Guitar"
const electric_guitar_muted = note(`<
  ~@15 A B C D E F D C ~@34 G H I J K L M N O ~@43 A B C D E F D C ~@44
>`.pickRestart({
  A: "[c3,g3] c3 g3 c3 g3 c3 g3 c3 g3 ~@7", B: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~@7",
  C: "[f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~@7", D: "[f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,g2,c3] ~ [f2,c3] ~@7",
  E: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3]!2 ~@7 c3", F: "g3 c3 g3 [c3,g3] ~ [c3,g3] ~ c3 g3 ~@7",
  G: "~@8 [c3,g3] c3 g3 c3 g3 c3 g3 c3", H: "g3 ~@7 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~",
  I: "[c3,g3] ~@7 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~", J: "[f2,c3] ~@7 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,g2,c3] ~",
  K: "[f2,c3] ~@7 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3]!2", L: "~@7 c3 g3 c3 g3 [c3,g3] ~ [c3,g3] ~ c3",
  M: "g3 ~@7 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,g2,c3] ~", N: "[f2,c3] ~@7 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~",
  O: "[f2,c3] ~@15", // F5
})).s("gm_electric_guitar_muted").gain(0.41)

// other · electric guitar clean · "Bridge Guitar (fifths)"
const electric_guitar_clean = note("<~@90 A@2 B@2 C@2 D@3 ~@59 E@3>".pickRestart({
  A: "[f4@4 g4@3 a#4@8 ~]/2", B: "[f4@8 g4@6 c5@17 ~]/2", C: "[f4@6 g4@8 ~ a#4@7 g#4@8 ~@2]/2",
  D: "[c5@7 ~ a#4@6 g4@34]/3", E: "[c4@3 d4@4 g4@17]/3",
})).s("gm_electric_guitar_clean").gain(0.36)

// other · bagpipe · "Bridge Guitar (solo)"
const bagpipe = note("<~@91 A B C D E F@3 ~@62>".pickRestart({
  A: "~@3 c5@5 ~@2 c5@6", B: "~ g4@13 ~@2", C: "~@3 g5@5 ~@2 g5@5 ~", D: "d5 f5 d5@10 ~@4",
  E: "d5 a#4 ~@3 d#5 [b4,d5] ~@2 e5 d#5 c5@3 ~@2, c#5 ~@7", F: "[g5@7 ~ g5@2 ~ g5@2 ~@2 g5@32 ~]/3",
})).s("gm_bagpipe").gain(0.41)

// drums · kick
const kick = s("bd").struct("<~ A@46 B C@41 D E ~ E ~ E D F ~@2 A@58 ~@4>".pickRestart({
  A: "x ~@6 x", B: "~ x", C: "~@3 x!2 ~@3", D: "~@3 x ~@4", E: "x ~@2 x ~@3 x", F: "x ~@3 x ~@2 x",
})).gain(0.41)

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

// drums · low tom
const low_tom = s("lt").struct("<~@38 A ~@42 B ~@14 C ~@35 A ~@15 A ~@12>".pickRestart({
  A: "~@12 x!3 ~", B: "~@4 x!3 ~@9", C: "~@3 x",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@38 A ~@42 B ~@14 C ~@35 A ~@15 A ~@12>".pickRestart({
  A: "~@8 x!3 ~@5", B: "x!3 ~@13", C: "~@5 x ~@2",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<~ [x!7 ~]!46 [~@4 x!4] [x!3 ~ x!4]!41 [x!3 ~@5] ~@9 [x!7 ~]!58 ~@4>").gain(0.26)

// drums · high tom
const high_tom = s("ht").struct("<~@96 [x ~@3 x ~@2 x] ~@64>").gain(0.41)

// drums · crash
const crash = s("cr").struct("<~@90 [x ~@13 x!2] ~ [x ~@6 x ~@6 x ~] ~ [x ~@2 x ~@4]!2 [x ~@3 x ~@2 x] ~@64>")
  .gain(0.46)

// drums · ride
const ride = s("rd").struct("<~@90 [x!4]!7 ~@64>").gain(0.41)

stack(
  synth_strings_1, synth_strings_1_soft, bass, overdriven_guitar, electric_guitar_muted, electric_guitar_clean, bagpipe,
  kick, snare, low_tom, mid_tom, open_hat, high_tom, crash, ride
)

More by Billy Joel