Strudelify

Close to the Borderline

Billy Joel

KeyD majorTempo180 bpm
0:00/0:00
// Close to the Borderline — Billy Joel
// 180 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 178 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(180/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 · rock organ
const rock_organ = note(`<
  A@2 B C A@2 B C D@2 E@2 F G B H D@2 E@2 F G I J K L M@2 N L M@2 N L O P@2 Q R S T D U V D@2 U V D@2 E@2 F G B H D@2
  E@2 F G I J K L M@2 N L M@2 N L W X@2 Q Y S T D U V D@2 U V Z@2 AA@2 Z@2 AB@2 Z@2 AC@2 AD@2 AB@2 D@2 E@2 F G B H D@2
  E@2 F G I J K L M@2 N L M@2 N L AE AF@2 Q Y S T D U V D@2 U V A@2 B V A@2 B V A@2 B V A@2 B V A@2 B V A@2 B V A@2 B V
  A@2 B V AG@2
>`.pickRestart({
  A: "~@3 [e4,a4] ~@4 [e4,a4]@8", B: "~@3 [a4,d5] ~@4 [a4,d5]@8", C: "[b4,d5]@4 [a4,d5]@3 ~ [b4,d5]@4 [a4,d5]@3 ~",
  D: "~@3 [a4,c#5] ~@4 [a4,c#5]@8", E: "~@3 [c5,e5] ~@4 [c5,e5]@8", F: "~@3 [g5,b5] ~@4 [g5,b5]@8",
  G: "~@3 [d5,g5] ~@4 [b4,d5]@8", H: "[b4,d5]@4 [a4,d5]@3 ~ [b4,d5]@4 [d5,f#5]@4", I: "~@3 [a4,d5] ~@4 [d4,a4]@8",
  J: "[b4,d5]@4 [a4,d5]@3 ~ [b4,d5]@4 [d5,f#5]@3 ~", K: "[b4,g#5]@3 [b4,g#5] ~@12", L: "[c#5,f#5]@3 [c#5,f#5] ~@12",
  M: "[[d5,f#5]@3 [d5,f#5] ~@11 [d5,f#5]@5 ~@4 [c#5,e5]@8]/2", N: "[e5,g#5]@3 [e5,g#5] ~@12", O: "a5 g#5, e5",
  P: "[[d5,f#5] [f#4,d5]@2 ~]/2", Q: "~@3 [a5,c#6] ~@4 [a5,c#6]@8", R: "~@3 [d5,f#5] ~@4 [d4,a4]@8", S: "[e5,g#5] ~@3",
  T: "~@3 [c#5,e5] ~@4 [c#5,e5]@8", U: "~@3 [d5,f#5] ~@4 [d5,f#5]@8",
  V: "[d5,g5]@4 [d5,f#5]@3 ~ [d5,g5]@4 [d5,f#5]@3 ~", W: "[e5,a5] [e5,g#5]", X: "[[d5,f#5] [d4,f#4]@2 ~]/2",
  Y: "~@3 [d5,f#5] ~@4 [a4,d5]@8", Z: "[c#4,e4]/2", AA: "[[d4,f#4]@3 [d4,f#4]]/2", AB: "[e4,g#4]/2", AC: "[c#4,f#4]/2",
  AD: "[d4,f#4]/2", AE: "[a5,c#6]!2", AF: "[[f#5,a5] [d5,f#5]@2 ~]/2", AG: "[~@3 [e4,a4] ~@4 [e4,a4]@24]/2",
})).s("gm_rock_organ").gain(0.44).pan(0.7)

// chords · piano
const piano = note(`<
  A@2 B C A@2 B C D@2 E F G H I J D@2 E F G H I J K L M@2 N O P@2 N O Q R@2 S T U V A B C A@2 B C D@2 E F G H I W D@2 E
  F G H I X K L M@2 N O P@2 N O Q R@2 S T U V A B C A@2 B C Y@2 Z@2 Y@2 AA AB Y@2 AC@2 AD@2 AE@2 AF AG AH AI AJ AK AL AM
  AN@2 AO AI AJ AP AQ J K L M@2 N O P@2 N O AR AS@2 S T U V A B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B
  C A@2 B C A@2 B C AT@2
>`.pickRestart({
  A: "a1@3 [a2,e3,a3,c#4] ~@4 a2@4 f#2@4, ~ [e3,a3,c#4]", B: "d2@3 [d3,a3,d4,f#4] ~@4 d3@4 b2@4, ~ [a3,d4,f#4]",
  C: "[b3,d4,g4]@4 [a3,d4,f#4]@3 ~ [b3,d4,g4]@4 [a3,d4,f#4]@3 ~, [g1,g2] [d2,d3]", // G D G D G D
  D: "a1@3 [a2,a3,c#4] ~@4 a2@4 f#2@4, ~ [a3,c#4]", E: "c2@3 [c3,c4,e4] ~@4 [c3,c4,e4]@8",
  F: "c2@3 [c3,g3,c4,e4] ~@4 [c3,g3,c4,e4]@8", G: "g1@3 [g2,g4,b4] ~@4 [g4,b4]@4 ~@4, ~ g2",
  H: "g1@3 [g2,d4,g4] ~@4 [g2,b3,d4]@8", I: "d2@3 [d3,a3,d4] ~@4 [d2,a3]@8",
  J: "[b3,d4,g4]@4 [a3,d4,f#4]@3 ~ [b3,d4,g4]@4 [a3,d4,f#4]@4, [g1,g2] [d2,d3]", // G D G D G D
  K: "[e1,e3,b3,g#4]@3 [e1,e3,b3,g#4] ~@12", L: "[f#1,f#3,c#4,f#4]@3 [f#1,f#3,c#4,f#4] ~@12",
  M: "[[d2,d3,d4,f#4]@3 [d2,d3,d4,f#4] ~@11 [d1,d3,d4,f#4]@5 [e1,e3]@4 [a1,a3,c#4,e4]@8]/2", // D E A
  N: "[e1,e3,b3,e4,g#4]@3 [e1,e3,b3,e4,g#4] ~@12", O: "[f#1,f#2,f#3,c#4,f#4]@3 [f#1,f#2,f#3,c#4,f#4] ~@12",
  P: "[[d2,d3,d4,f#4]@3 [d2,d3,d4,f#4] ~@11 [d1,d2,d3,d4,f#4]@5 [e1,e2,e3]@4 [a1,a2,a3,c#4,e4]@8]/2", // D E A
  Q: "[f#1,f#2,f#3] [e1,e2,e3], [e4,a4] ~ e4 ~", R: "[[d4,f#4] f#3@2 ~, [d1,d2,d3]@3 ~]/2",
  S: "a1@3 [a2,f#4,a4,c#5] ~@4 [a2,a4,c#5]@8", T: "d2@3 [d3,d4,f#4] ~@4 [d3,a3]@8", U: "[e2,e3,b3,e4,g#4] ~@3",
  V: "a1@3 [a2,a3,c#4,e4] ~@4 a2@4 f#2@4, ~ [a3,c#4,e4]", // A
  W: "[b3,d4,g4]@4 [a3,d4,f#4]@3 ~ [b3,d4,g4]@4 [d4,f#4]@4, [g1,g2] [d2,d3]", // G D G D G D
  X: "[b3,d4,g4]@4 [a3,d4,f#4]@3 ~ [b3,d4,g4]@4 [d4,f#4]@3 ~, [g1,g2] [d2,d3]", Y: "[c#2,c#3,g#3]/2",
  Z: "[[d2,d3,d4]@3 [d2,d3,d4]]/2", AA: "[e2,e3]", AB: "[e1,e2,e3]", AC: "[[f#1,f#3] [e1,e3], a3]/2",
  AD: "[d1,d2,d3]/2", AE: "[e2,e3,b3]/2",
  AF: "[a1,a4]@3 [a2,a3,c#4] ~@4 [a2,a4]@4 [f#2,f#4]@4, g#4 ~@2 a4@5 [a3,c#4]@8", // A F# A
  AG: "g#4 a4@2 [a2,a3,c#4,a4] a4@4 [a2,a4]@3 a4 [f#2,f#4]@4, a1@3 ~@5 [a3,c#4]@8", // A F# A
  AH: "b4 c5@2 [c3,c4,e4] c5@3 ~ [c3,c4,e4]@8, c2@3 ~@4 c5@9", AI: "c2@3 [c3,g3,c4,e4] ~@4 [c3,g3,c4,e4]@7 a4",
  AJ: "[g1,e5]@3 [g2,g4,b4] d5@4 [g4,b4,d5]@4 a#4@3 a#4, d#5 ~@7 g2@8", // C G
  AK: "[g1,a#4]@3 [g2,d4,g4] a4@4 g4@4 e4@4, ~ [g2,b3,d4]", AL: "[d2,a4]@3 [d3,a3,d4] f4@3 f4 f4@4 d4@4, ~ [d2,a3]",
  AM: "[b3,d4,g4]@4 [a3,d4,f#4]@3 ~ [b3,d4,g4]@4 [a3,d4,f#4,a4]@4, [g1,g2] [d2,d3]", // G D G D G D
  AN: "[a1,a4]@3 [a2,a3,c#4] a4@4 [a2,a4]@3 a4 [f#2,f#4]@3 e4, ~ [a3,c#4]", // A F# A
  AO: "[c2,b4]@3 [c3,c4,e4] c5@3 ~ [c3,c4,e4]@8, ~@7 c5@9", AP: "[g1,a#4]@3 [g2,d4,g4] a4@4 g4@4 e4@3 e4, ~ [g2,b3,d4]",
  AQ: "[d2,f4]@3 [d3,a3,d4] f4@3 f4 f4@4 d4@4, ~ [d2,a3]", AR: "[f#1,f#2,f#3,a4,c#5] [e1,e2,e3,a4,c#5]",
  AS: "[[f#4,a4] [d4,f#4]@2 ~, [d1,d2,d3]@3 ~]/2", AT: "[a1@3 [a2,e3,a3,c#4] ~@4 [a2,e3,a3,c#4]@24]/2",
})).s("gm_piano").gain(0.64).pan(0.3)

// bass · electric bass finger · "Elec Bass (Fingered)"
const bass = note(`<
  A@2 B C A@2 B C A@2 D@2 E@2 F C A@2 D@2 E@2 F C G H I@2 G H I@2 G H J K@2 L M N A@2 B C A@2 B C A@2 D@2 E@2 F C A@2
  D@2 E@2 F C G H I@2 G H I@2 G H J K@2 L M N A@2 B C A@2 B C O@2 P@2 O@2 Q@2 O@2 R Q S@2 T@2 A@2 D@2 E@2 F C A@2 D@2
  E@2 F C G H I@2 G H I@2 G H J K@2 L M N A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B
  C U@2
>`.pickRestart({
  A: "a1@3 a2 ~@4 a2@4 f#2@4", B: "d2@3 d3 ~@4 d3@4 b2@4", C: "g1 d2", D: "c2@3 c3 ~@4 c3@8", E: "g1@3 g2 ~@4 g2@8",
  F: "d2@3 d3 ~@4 d2@8", G: "e2@3 e2 ~@12", H: "f#2@3 f#2 ~@12", I: "[d2@3 d2 ~@11 d2@5 e2@4 a1@8]/2", J: "f#2 e2",
  K: "[d2@3 ~]/2", L: "a1@3 a2 ~@4 a2@8", M: "d2@3 d3 ~@4 d3@8", N: "e2 ~@3", O: "c#2/2", P: "[d2@3 d2]/2", Q: "e2",
  R: "f#2", S: "d2/2", T: "e2/2", U: "[a1@3 a2 ~@4 a2@24]/2",
})).s("gm_electric_bass_finger").gain(0.54)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B ~@13 A B ~ A B A B A B A B A B A B A B A B A B A B A B A B ~@13 A B ~
  A B A B A B A B C D C E C D C@3 F G H I J D C A B A B A B A B A B A B A B A B ~@13 A B ~ A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B C ~
>`.pickRestart({
  A: "x ~@6 x ~@4 x ~@3", B: "x ~@6 x ~@4 x ~@2 x", C: "x", D: "x ~@14 x", E: "x!2", F: "x ~@2 x", G: "x ~@2 x!2 ~@11",
  H: "x ~@6 x ~@3 x!2 ~@3", I: "x ~@3 x ~@2 x ~@4 x ~@2 x", J: "~@4 x ~@10 x",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@88 A B A C A B A@3 D A E D B@2 F ~@74>".pickRestart({
  A: "~@8 x ~@3 x ~@2 x", B: "~@2 x!2", C: "~@12 x ~@2 x", D: "~ x", E: "~@8 x ~@6 x", F: "~@7 x!2 ~@3 x ~@2 x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  A@24 B@2 C D B@2 C E B@2 ~@3 A@2 F A@24 B@2 C D B@2 C E B@2 ~@3 A@2 F A@8 ~@16 A@16 B@2 C D B@2 C E B@2 ~@3 A@2 F A@40
  ~@2
>`.pickRestart({
  A: "~ x", B: "x ~@2 x ~@12", C: "x ~@2 x ~@11 x", D: "~ x ~@2", E: "~ x!2 ~", F: "x",
})).gain(0.45)

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

// drums · low tom
const low_tom = s("lt").struct("<~@27 A ~@3 A ~@35 A ~@3 A ~@51 A ~@3 A ~@50>".pickRestart({
  A: "~@15 x",
})).gain(0.45)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A ~@3 B ~@35 A ~@3 B ~@51 A ~@3 B ~@50>".pickRestart({
  A: "~@3 x", B: "~@12 x!2 ~@2",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  A ~ A B A ~ A B A ~ A ~ A ~ A B A ~ A ~ A ~ A B C@2 D E C@2 D E C@2 B A ~ A ~ A@2 ~ A B A ~ A B A ~ A ~ A ~ A B A ~ A
  ~ A ~ A B C@2 D E C@2 D E C@2 B A ~ A ~ A@2 ~ A B A ~ A B A ~ A F A ~ A@3 ~ A@3 ~ A ~ A ~ A ~ A ~ A B A ~ A ~ A ~ A B
  C@2 D E C@2 D E C@2 B A ~ A ~ A@2 ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~
>`.pickRestart({
  A: "x", B: "x!2", C: "x ~@2 x ~@12", D: "x ~@2 x ~@11 x", E: "~ x!2 ~", F: "~ x",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@27 A ~@3 B ~@35 A ~@3 B ~@51 A ~@3 B ~@50>".pickRestart({
  A: "~@8 x ~@2 x ~@4", B: "~@11 x ~@4",
})).gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@88 A B A C A B A@3 B A@3 B A B ~@74>".pickRestart({
  A: "~ x", B: "x!2", C: "x",
})).gain(0.4)

stack(rock_organ, piano, bass, kick, rim, snare, hihat, low_tom, open_hat, mid_tom, crash, high_tom, ride)

More by Billy Joel