Strudelify

There'll Be Sad Songs (To Make You Cry)

Billy Ocean

KeyB♭ minorTempo70 bpm
0:00/0:00
// There'll Be Sad Songs (To Make You Cry) — Ocean Billy
// 70 bpm, 4/4, key A# minor. 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) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 52 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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.

// other · electric bass pick · "bass"
const electric_bass_pick = note(`<
  A B A C D E F G H I J K L M L M N O P Q R S D E F G H I J K L M L M N O T U V W X L M L M Y@2 Z@5
>`.pickRestart({
  A: "bb3 ab3", B: "gb3@3 ab3", C: "gb3@3 [ab2,eb3]", D: "bb2 f3 bb3@2 ab2 f3 bb3@2", E: "gb2 db3 bb3@2 gb3@2 f3@2",
  F: "[eb4,gb4] eb3 ab3!2", G: "db4@2 f4 f3", H: "bb3 f4 bb4@2 ab3 f4 bb4@2", I: "gb3 db4 bb4@2 gb4@2 [f4,ab4]@2",
  J: "[eb4,gb4] eb3 [eb4,gb4] eb3", K: "f3 c4 f4@2 [f4,a4,c5]@2 f3@2", L: "bb3 f4 bb4 c5 d5@2 bb3@2",
  M: "eb3 [gb4,bb4,db5] ab3 [ab4,c5,eb5]", N: "db4 [ab4,c5,f5] [gb4,bb4,db5,f5]@2", O: "[f4,bb4,c5] a3",
  P: "bb3 bb4 ab4@2", Q: "gb4@3 ab4", R: "bb4 ab4", S: "gb4@3 [ab3,eb4]", T: "bb3 bb4 bb3 ab3", U: "gb3 gb4 gb3 gb4",
  V: "f3 f4 db3 [f4,ab4,db5]", W: "eb3 [gb4,bb4,db5] f3 [f4,ab4,db5]", X: "gb3 [gb4,bb4,db5] ab4 ab3",
  Y: "[db3 [ab4,c5,f5] [gb4,bb4,db5,f5]@4 [f4,bb4,c5]@2]/2", Z: "[f3@14 bb3@3 bb4@3 ab4@6 gb4@9 ab4@3 bb4@12 ~@10]/5",
})).s("gm_electric_bass_pick").gain(0.2)

// chords · piano
const piano = note(`<
  A B C D E F G H I J K L M N O@2 P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI ~@5 AD AE AF AG ~@7
>`.pickRestart({
  A: "[bb2,ab3,bb3,db4,f4]@23 ~ gb4 ~@11 ab3@6 ab2@6, ~@12 [db4,f4]@11 ~, ~@3 ab2@2 ~", // Bbm7 Db
  B: "~ gb2@35 ~ bb2 ~@4 ab2@5 ~, [bb3,f4]@9 [c4,eb4]@2 ~, [gb3,db4]@32 ~@5 ab3@9 ~@2", // Bb5 Cm Gb5
  C: "[ab3,f4]@4 ~@4 [ab3,f4]@4 f4@2 ab3 ~, bb2 ab2, [bb3,db4]@15 ab3@5 db4@22 ~@6, ~@12 f4@6 bb3@5 ~ bb3@19 ~@5, ~@24 gb4 ~@23", // Db Bbm
  D: "[gb2,ab3,f4]@35 ~ [ab3,c4,eb4]@7 ~@5, [bb3,db4]@31 ~@5 ab2@12", // Db Ab Bbm
  E: "[bb2,ab3,db4,f4,ab4]@23 ~ [ab2,f4,ab4]@24, ~@6 [ab3,db4]@5 ~", // Bbm7 Db Db5
  F: "[gb2,f4,ab4]@35 ~ [f2,ab3,eb4,f4]@8 ~@4, [gb3,db4]@31 ~@17", // Db Fm7 Gb5
  G: "gb3@12 bb2@3 ~@3 gb3@4 ~@2 c4@11 ~ [ab3,c4,eb4]@6 ab2@6, [eb2,f4,ab4]@22 ab4@15 ~@11, db4@15 eb3@9 ab2@16 ~@8", // Ab Fm7
  H: "[db2,ab3,db4,f4]@19 ~@5 [f2,c3,g3,bb3,c4,db4,eb4,f4]@10 ~@2 [g3,a3,c4,f4]@7 ~@5, ~@36 [f2,c3,eb4]@11 ~", // Db Cm7 F F7
  I: "~ bb2@22 ~ [db4,f4,ab4]@19 ~@5, [ab3,db4,f4,ab4]@22 ~@2 [ab2,ab3]@23 ~", // Db Ab
  J: "[gb2,db3,ab3,bb3,db4,f4]@34 ~@2 [f2,ab3,db4,f4]@7 ~@5", // Gbmaj7 Db
  K: "[eb2,gb3]@35 ~@3 eb2@5 ~@2 c3@2 ~, f4@47 ~, [eb3,db4]@42 ~ eb3@4 ~, ab4@32 ~@3 ab4@9 ~@4", // Ebm Eb7
  L: "~@18 bb4@3 ~@3 a4@9 ~@3 a4@6 f3@2 ~@4, [f2,c3,f4]@23 ~ f2@22 ~@2, [bb3,eb4,bb4]@19 ~@29, ~@12 f3@10 ~@2 [c3,f3,a3,c4,f4]@17 ~ e3 ~@5", // F5 Eb5 F
  M: "[f4,bb4,d5]@29 [f3,f5]@3 c4@4 f5 ~ bb4@2 ~ d5@2 ~ bb2@3 ~, [bb2,f5]@25 ~@11 f4@5 ~@7", // Bb F Bb5
  N: "gb4@12 ~@3 gb4@3 [db5,ab5] ~@2 bb2@2 ~ [ab2,ab4,c5,eb5]@12 [ab4,c5,eb5,ab5]@3 ab2@5 ~@4, [eb2,eb3]@23 ~@25, [db5,f5]@17 ~@31, ab5@8 ~@4 ab5@5 ~@7 ab5@9 ~@15", // Db5 Ab Eb Db
  O: "[bb2@7 ~@7 bb2@2 ~ f3@2 ~ d4@2 ~ c4@12 ~ [bb3,bb4,f5]@5 bb5 ~@6 gb3@12 ab4@3 gb3@3 ab4@2 ~ bb2@2 ~ [ab3,c4,eb4]@9 ~@6 ab2@5 ~@4, [bb4,d5,f5,bb5]@34 ~ d5@6 ~@6 ab4@8 ~@41, ~@4 [eb2,eb3]@2 ab2 ~, ~@48 [db4,f4]@17 ~@19 [ab3,c4,eb4]@8 ~@4]/2", // Bb5 Ab Bb Eb Db Ab
  P: "[ab3,db4,f4]@11 ~@2 [ab3,db4,f4]@7 ~@2 ab2 ~ [bb3,db4,gb4]@10 ~@2 [bb3,db4,gb4]@7 gb2@2 ~@3, db2@21 db3@2 ~ gb2@17 ~@7", // Db Gb
  Q: "~ c4@9 ~@2 [g3,bb3,c4,eb4]@10 ~@2 [g3,a3,c4,eb4]@10 ~@3 [g3,a3,c4,eb4]@5 ~@6, [g3,bb3,eb4]@5 ~@19, ~ f2@22 ~ f2@21 ~@3", // Cm7 Am7b5 Eb
  R: "~ bb2@11 ~@6 bb2@6 [ab3,bb3,db4,f4]@10 ~@2 [ab3,bb3,db4,f4]@7 ab2@5, [ab3,bb3,f4]@9 ~@3 [ab3,bb3,db4,f4]@10 ~@2 ab2@17 ~@7, ~ db4@9 ~@38", // Bbm7 Bb7 Bbm7
  S: "~ gb2@28 ~ gb2@6 [ab3,c4,eb4]@6 ab2@6, [gb3,bb3,db4,f4]@8 ~ ab2 ~@2", // Ab Gbmaj7
  T: "[bb3,f4]@11 ~ [ab3,bb3,db4,f4]@6 bb2@6 [ab3,bb3,db4,f4]@9 ~@3 [ab3,bb3,db4,f4]@6 ab2@6, bb2 ~@3", // Bb5 Bbm7
  U: "[gb3,bb3,db4]@31 ~@5 [ab2,ab3]@12, [gb2,f4]@3 ~, gb4 ~@35 [c4,eb4]@7 ~@5", // Gb Ab Gbmaj7 Cm
  V: "[bb2,ab3,bb3,db4,f4]@12 [ab3,bb3,db4,f4]@5 ~ [ab3,bb3,db4,f4]@3 ab2@3, ~@24 ab2@17 ~@7", // Bbm7
  W: "ab3@12 gb2@3 ~@5 ab3@2 ~@2 [bb3,db4,f4]@6 ab3@3 db3@3 [f2,ab3,bb3,db4,f4]@6 c3@2 bb2@2 ~@2, [bb3,db4,f4]@17 gb3@16 ~@15, gb2@10 ~@5 db3@8 ~@25", // Bbm Bbm7 Bbm
  X: "ab4@9 ~@9 db4@2 ~@4 [gb3,db4]@7 ~@5 [ab2,ab3,eb4]@12, eb2@35 ~@13, [gb3,db4,f4]@15 gb3@5 ~@4 ab4@11 ~@13, ~@6 ab4@3 ~ f4@5 ~@3 c4@4 ~@2", // Gb5 Ab5 Gbmaj7
  Y: "~ [ab3,db4,f4]@10 ~@5 ab2@4 db3@2 ~@3 [f2,g3,bb3,f4]@5 ~@6 [f2,c4,f4,a4]@7 a3@3 bb2 ~, ~ db2@16 ~@31, ~@12 db4@7 ~@5 [c4,eb4]@6 ~@3 f3@8 ~@7, ~@13 [ab3,f4]@9 ~@8 c3@5 ~ a3@5 ~@7", // Db Gm7 F Cm Db
  Z: "~ db2 ~@10 [ab3,bb3,db4,f4]@6 bb2 ~@5 [ab3,bb3,db4,f4]@9 ~@3 [ab3,bb3,db4,f4]@6 ab2@4 ~@2, ~@3 ab2@2 ~", // Bbm7
  AA: "[gb3,bb3,db4,f4]@9 ~@3 [gb3,bb3,db4,f4]@7 ~@2 gb2 ~@2 [gb2,gb3,bb3,db4,f4]@6 gb2@4 ~@2 [f2,ab3,c4,db4]@7 ~@5, gb2@16 ~@19 f4@7 ~@6", // Gbmaj7 Dbmaj7
  AB: "ab4@11 ~ ab4@9 ~@15 [db4,f4,ab4]@5 eb3@2 ~@5, [eb2,gb3,db4,f4]@33 eb2@8 ~@7, eb3@16 ~@5 eb3@6 ~@3 eb3@9 ~@9, ~@24 ab4@10 ~@2 gb3@3 ~@9", // Db Ebm7
  AC: "[eb4,eb5]@12 ~@3 eb4@5 f3@3 ~ f3 ~@5 [eb4,f4,a4,c5]@12 ~@6, [f2,g4,bb4]@22 ~@2 f2@17 ~@7, ~@6 eb5@5 ~@13", // Eb F7 Gm7
  AD: "[f4,bb4,d5]@9 f5 ~@2 [f4,bb4,d5,f5]@9 ~@3 [f4,bb4,d5,f5]@9 ~@3 f4@3 f3@2 ~ f4@2 bb2@2 ~@2, bb2@19 ~@2 bb2@11 ~@16, ~@21 f3@5 ~@10 [bb4,d5,f5]@5 ~@7, ~@24 bb3 ~@8 bb3@6 ~@9", // Bb
  AE: "[f4,gb4,bb4,db5]@11 ~ [f4,gb4,bb4,db5]@6 ~@3 bb2@3 [ab2,ab3,c4]@12 ab3@3 ab2@3 a2@5 ~, [eb2,eb3]@24 eb4@8 ~@4 [c4,eb4]@6 ab3@3 ~@3", // Gbmaj7 Ab Eb Cm
  AF: "[bb3,d4,f4]@12 ~@2 bb3@3 ~@6 bb3@9 ~@4 gb4 ~@2 f3 ~@8, bb2@5 ~, ~ f3 ~@2, ~@18 d4@14 ~@4 [bb3,d4,f4]@5 ~@7, ~@20 f4@13 ~@15", // Bb
  AG: "eb2@6 bb2@3 eb2 ~@5 [db4,ab4]@6 eb3@2 ~ [ab3,c4,eb4,ab4]@9 ~@3 [ab3,c4,eb4,ab4]@3 ab2@4 ~@5, [gb3,db4,f4,ab4]@13 ~@2 [gb3,f4]@4 ~@29, ~@9 eb3@10 ~@5 ab2@12 ~@12", // Db5 Ab Db Gbmaj7
  AH: "~@3 [f3,bb3,eb4,ab4] ~@6 [f3,bb3,eb4,ab4]@5 ab2@2 ~ [bb3,eb4,ab4]@2 ~@8 [ab3,db4,f4,ab4] ~@7 [ab3,db4,f4,ab4]@6 [gb2,gb3]@3 ~@3, db2@18 ~@6 gb2@17 ~@7, ~@10 g3@2 ~@6 [f3,g3] ~@15 db3@8 ~@6", // Fm7 Ebsus4 Db Gb Fsus2
  AI: "eb4@9 ~@3 eb4@3 g3@3 bb3@2 c4@3 ~ [g3,a3,c4,eb4]@10 ~@2 [g3,a3,c4,db4,eb4]@6 ~ f3@3 ~@2, f2@21 ~@3 f2@22 ~@2, [g3,bb3,c4] ~@2", // Am7b5 C7
})).s("gm_piano").gain(0.4)

// chords · piano · soft notes
const piano_soft = note(`<
  A ~ B C ~@2 D E ~@3 F G ~ H I J K ~@2 L ~ M N O P ~@2 Q R S T U V W X ~@5 S T U V ~@7
>`.pickRestart({
  A: "~@25 gb3@6 ~@17, ~@8 bb3@7 ~", B: "gb4 ~@44 bb3 ~@2", C: "~@44 gb4 ~@3", D: "~@25 eb4@10 ~@13, ~@12 ab3@5 ~@7",
  E: "~@20 db4 ~@27", F: "~@21 a3 ~@22 c3@2 ~@2, ~@44 db3 ~@3", G: "~@42 bb4 ~@5", H: "~@18 gb3 ~@29",
  I: "~@45 ab2@2 ~", J: "~ gb4 ~@46", K: "~ db4@2 ~@34 db4@3 ~@3 c3@4 ~", L: "~ gb4 ~@22 ab2@15 ~@9, [ab3,db4]@5 ~@19",
  M: "gb4 ~@35 gb4 ~@11", N: "~@18 gb2 ~@2 gb2@8 ~@3 gb2@2 ~@2 gb4 ~@11", O: "~@19 eb3 ~@28",
  P: "~@13 gb4 ~@7 c3@3 ~@9 a3 ~@14", Q: "~@44 c3@3 ~", R: "~@26 gb4 ~@21", S: "~@9 d5 ~@23 bb2@8 ~@7",
  T: "~@20 db4 ~@25 db4 ~", U: "~ gb4 ~@22 gb4 ~@7 f3@4 ~@6 bb2 ~@5", V: "~@13 eb2 ~@2 eb2@5 ab3 ~@26",
  W: "~@44 db3 ~ db4 ~", X: "~ db4 ~@17 f3@4 ~@2 db4 ~@19 c3@2 ~",
})).s("gm_piano").gain(0.08)

// chords · piano · "chords"
const piano_2 = note("<~@36 A B C D E ~@4 F@2 G@5>".pickRestart({
  A: "~@37 [ab2,ab3,ab4,c5,eb5,ab5]@8 ~@3", // Ab
  B: "~@2 [gb2,gb3]@15 ~@2 [ab4,ab5]@17 ~@3 ab4@2 ~ c5@2 eb5@2 ~@2, ~ [gb4,bb4,db5,gb5]@14 ~@4 gb2@28 ~, ~@19 [gb3,c5,eb5]@21 ~@2 gb3@5 ~, ~@36 ab5@5 ~@7", // Gb Ab Gb Cdim
  C: "[f2,f3,ab4,f5,ab5]@12 [ab4,db5,f5,ab5]@3 ab2@2 ~@2 [db2,f4,bb4,c5,eb5]@17 ~@4 db2@2 ~ db2 ~ eb2 ~@2, [db5,d5]@2 ~@16 db3@18 c5@5 ~@7, ~@37 [f4,bb4,eb5]@5 db3@4 ~@2", // Fm Db Bbm Dmaj7 Ebsus2
  D: "~ eb2@11 ~@6 [eb2,db4]@2 f4@3 ~@22 ab4@2 ~, eb3@22 ~@2 [f2,f4,ab4]@15 eb4@7 ~@2, [gb3,db4]@15 gb3@6 ~@3 [ab3,eb4]@9 g3@9 f4@5 ~, [f4,ab4]@11 ~ [f4,ab4]@5 ~@13 c3@13 ~@5, ~@12 ab3@3 ~", // Eb7 Fm Gb5 Ab5 Fm
  E: "[bb3,eb4,f4,ab4]@12 ~@6 gb3@5 ~ [gb3,db4,f4,ab4]@11 ~ [f4,ab4]@6 ab2@2 ~ ab2@2 ~, [gb2,gb3]@3 ~ ab2@2 ~@2, ~@13 [bb3,eb4,f4,ab4]@11 ~@12 [gb3,db4]@5 ~@7", // Bbsus4 Db Fm Gb Bbsus4 Gb5
  F: "[[c4,eb4,f4,ab4]@11 ~@4 ab2@3 db3@5 ~ eb4@34 ~@2 eb4@6 ~ db3@4 ~@2 [g3,c4,eb4,f4]@11 ~@6 f3@3 f2@2 ~, db2@12 [c4,eb4,f4,ab4]@5 ~@7 [f3,bb3,db4]@44 ~@4 bb3@11 ~ [c4,eb4]@7 ~@5, ~@24 [gb2,db3]@40 ~@2 gb2@4 ~@3 f2@14 c3@7 ~@2, ~@85 [bb3,f4]@10 ~, ~@85 g3@6 ~@5]/2", // Fm7 Cm Fm7 Bbm Cm Gb5 Bb5
  G: "[~ [d4,eb4]@19 ~@23 f3@8 ~@25 c5@3 ~@19 f4@3 ab4@2 ~ [db4,f4,gb4,bb4]@11 ~@7 gb3@5 ~ [db4,f4,gb4,bb4]@10 ~@3 [db4,f4,gb4,bb4]@6 ab3 ~@24 a5@17 ~@2 [f3,a3,g4,c5,f5]@14 ~@35, ~ [f2,c3]@40 ~@15 bb2@21 ~@3 [ab2,c5]@20 ~@4 gb2@19 ~@5 ab2@23 ~@3 bb2@51 ~@35, ~ a3@24 ~@5 [a3,d4,eb4,g4]@21 ~@17 [ab4,c5]@8 ~@17 ab3@7 ~@140, ~ [f3,f4]@15 ~@55 ab3@9 ~@7 eb3@10 ~@143, ~ c4@11 ~@56 [db4,f4]@12 [db4,f4,ab4]@16 db4@5 ~@16 [db4,f4,gb4,bb4]@9 ~@28 [a4,c5,f5]@36 ~@50]/5", // Ebmaj7 Gbmaj7 F F5 Ab Dsus4 Ab F …
})).s("gm_piano").gain(0.3)

// chords · piano · "chords" · soft notes
const piano_soft_2 = note("<~@37 A B ~ C ~@4 D E F@2 G ~@2>".pickRestart({
  A: "~@42 ab4 ~@5", B: "~@19 db5 ~@28", C: "~@6 gb2 db3 ~@8", D: "~@21 gb2@2 ~@25",
  E: "~@21 c3@3 ~@21 a3@2 ~, ~@21 g3 ~@26", F: "[~@22 g4@4 ~@17 f2@6 c3@4 ~@43, ~@6 f3@7 ~@19]/2", G: "~@6 db3 ~@41",
})).s("gm_piano").gain(0.15)

stack(electric_bass_pick, piano, piano_soft, piano_2, piano_soft_2)

More by Billy Ocean