Strudelify
Blonde Over Blue cover art

1993 · River Of Dreams

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, A@4 for four bars: edit a riff to change every repeat.

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

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@7 A@2 B@2 C@2 B@2 D E F G H I J K L M N O P E L M Q R S T Q R D U V R E W X Y Z AA ~@2 AB@6 AC@7 AD AE AF AG@7 AH@6
  AI@4 AJ@6 AK AL ~@11 A@2 B@2 C@2 B@2 D E F G H I J K L M N O P E L M Q R S T Q R D U V R E W X Y Z AA Q R S T Q R D U
  V R E W X Y Z AM@2 ~@3
>`.pickRestart({
  A: "[c2@15 ~]/2", B: "[f1@29 ~@3]/2", C: "[c2@7 ~]/2", D: "c2@13 ~ c2 ~", E: "c2", F: "f1@13 ~ f1 ~", G: "f1",
  H: "c2 ~ c2 ~@3 c2 ~ c2 ~ c2 ~@5", I: "c2@2 c2@2 ~@3 c2 c2@2 c2@2 ~@4", J: "f1 ~ f1@2 ~@2 f1 ~ f1@2 f1@2 ~@4",
  K: "f1 ~ f1@2 ~@2 f1 ~ f1 ~ f1@4 ~@2", L: "d#2@15 ~", M: "f2", N: "g2", O: "a2", P: "a#1", Q: "g2@13 ~ g2@2",
  R: "d2@7 d2", S: "c2@13 ~ c2@2", T: "g2@2 ~ g2@4 d2", U: "c2@5 ~ f2@6 f2@4", V: "g2@6 ~ g2 ~ g2@7",
  W: "g2@5 ~ g2@4 d2@2 g2@2 d2 ~", X: "g1@7 g2", Y: "d2", Z: "c2@7 ~ c2@7 ~", AA: "c3@2 b2@3 g2@3 f2@7 ~",
  AB: "[~@8 c2@30 ~@2 f1@29 ~@3 c2@24]/6",
  AC: "[~@8 f1@29 ~@3 c2@13 ~ c2 ~ c2@16 f1@13 ~ f1 ~ f1@16 c2 ~ c2 ~@3 c2 ~]/7", AD: "c2 ~ c2 ~@5 c2@2 c2@2 ~@3 c2",
  AE: "c2@2 c2@2 ~@4 f1 ~ f1@2 ~@2 f1 ~", AF: "f1@2 f1@2 ~@4 f1 ~ f1@2 ~@2 f1 ~",
  AG: "[f1 ~ f1@4 ~@2 d#2@15 ~ f2@16 g2@16 a2@16 a#1@16 c2@16 d#2@8]/7",
  AH: "[~@8 f2@16 g2@13 ~ g2@2 d2@13 ~ d2@2 c2@13 ~ c2@2 g2@4 ~@2 g2@8 d2@2 g2@8]/6",
  AI: "[~@6 g2@2 d2@13 ~ d2@2 c2@13 ~ c2 ~ c2@5 ~ f2@6 f2@4 g2@6 ~ g2]/4",
  AJ: "[~ 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", AK: "c2@7 ~ c3@2 b2@3 g2@3",
  AL: "f2@7 ~@9", AM: "[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 B@2 ~@8 C D C E C D C F G H@2 I G J@2 I G H@2 K G L@2 M ~@2 N@8 ~@8 O@2 P@4 Q@2 R@2 S@2 T@2 U@2 T@2
  S@2 V@2 W@2 X ~@11 A@2 B@2 A@2 B@2 ~@8 C D C E C D C F G H@2 I G J@2 I G H@2 K G L@2 M G H@2 I G J@2 I G H@2 K G L@2
  Y@2 ~@3
>`.pickRestart({
  A: "[[c3,g3]@31 ~]/2", B: "[[f2,c3]@29 ~@3]/2", C: "[a#3,d#4]@15 ~", D: "f4@2 c4 f4 a#4 a4 f4 c4, c4@3 ~@13",
  E: "[c4,f4], d#4 ~@15", F: "[c4,f4]@2 c4 f4 a#4 a4 f4 g4", G: "[g3,d4]",
  H: "[~@4 [d4,a4]@4 [a3,f#4]@3 ~ [f#3,d4]@16 ~@4]/2", I: "[f#3,d4]@2 ~ [e3,c4] ~ [d3,b3]@2 ~",
  J: "[~@4 [d4,a4]@4 [a3,f#4]@3 ~ [f#3,d4]@18 ~@2]/2", K: "[f#3,d4]@2 ~ [e3,c4] ~ [d3,b3]@3",
  L: "[~@4 [d4,a4]@4 ~@4 [f#3,d4]@19 ~, ~@8 [a3,f#4]@7 ~@17]/2", // D5 D
  M: "[e4,c5]@2 ~ [d4,b4]@2 ~ [b3,g4]@2 [a3,f4]@7 ~, f#3@3 ~@13", // C G Em Dm
  N: "[~@8 [c3,g3]@31 ~ [f2,c3]@29 ~@3 [c3,g3]@31 ~ [f2,c3]@24]/8", // C5 F5 C5 F5
  O: "[~@8 [a#3,d#4]@15 ~ f4@4 c4@2 f4@2, ~@24 c4@3 ~@5]/2", // D#5
  P: "[a#4@2 a4@2 f4@2 c4@2 [a#3,d#4]@16 [c4,f4]@16 [a#3,d#4]@15 ~ f4@4 c4@2 f4@2, ~@24 d#4 ~@31 c4@3 ~@5]/4", // D#5 F5 D#5
  Q: "[a#4@2 a4@2 f4@2 c4 ~ [a#3,d#4]@15 ~ f4@4 c4@2 f4@2, ~@24 c4@3 ~@5]/2", // D#5
  R: "[a#4 a4 f4 g4 [g3,d4]@8 ~@2 [d4,a4]@2]/2", S: "[[a3,f#4]@3 ~ [f#3,d4]@16 ~@4 [f#3,d4]@4 ~@2 [e3,c4]@2]/2",
  T: "[~@2 [d3,b3]@4 ~@2 [g3,d4]@15 ~@5 [d4,a4]@4]/2", U: "[[a3,f#4]@3 ~ [f#3,d4]@18 ~@2 [f#3,d4]@4 ~@2 [e3,c4]@2]/2",
  V: "[~@2 [d3,b3]@5 ~ [g3,d4]@16 ~@4 [d4,a4]@4]/2", // G G5 D5
  W: "[~@4 [f#3,d4]@19 ~ [e4,c5]@2 ~ [d4,b4]@2 ~ [b3,g4]@2, [a3,f#4]@7 ~@17 f#3@3 ~@5]/2", X: "[a3,f4]@7 ~@9",
  Y: "[[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 G L M N ~@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: "g3 ~@7 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,g2,c3] ~",
  M: "[f2,c3] ~@7 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~", N: "[f2,c3] ~@15",
})).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