Strudelify
What Becomes of the Broken Hearted cover art

Sings Top Ten

What Becomes of the Broken Hearted

Jimmy Ruffin

KeyD minorTempo98 bpm
0:00/0:00
// What Becomes of the Broken Hearted — Jimmy Ruffin
// 98 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(98/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 · piano · "Ac Piano"
const piano = note(`<
  ~@2 A@3 B C D E F G H I@2 C J E F C K E L M N O P Q R S T C J E F C K E U C J E F C K E L M N O P V R W T C J E F C K
  E U C J E F C K E X C K E X C K E X Y@2
>`.pickRestart({
  A: "f2@3 f2 f2@4", B: "f2@3 f2 [d2,a4,d5,f5,a5]@2 [e2,g4,db5,e5,g5]@2",
  C: "[f4,bb4,d5,f5]@2 [d4,f4,bb4,d5] [f4,bb4,d5,f5]", D: "[a4,d5,f5,a5]", E: "[d4,g4,bb4,d5]@2 [d4,g4,bb4]!2",
  F: "[eb4,g4,bb4]", G: "[d5,f5,bb5,d6]@2 [f5,bb5,d6,f6] [d5,f5,bb5,d6]",
  H: "[g4,bb4,db5,g5]@5 [db4,g4,bb4,db5] [bb3,g4,bb4] [g3,bb3,db4,g4]", // Gdim Eb Gdim
  I: "[~@4 [eb5,g5,bb5,db6]@3 ~ [eb5,g5,bb5,db6]@6 ~@2 [eb5,g5,bb5,db6]@8 [a4,d5,f5,a5]@4 [g4,db5,e5,g5]@4, eb2@14 eb2@9 ~@9]/2", // Eb7 Dm Dbdim
  J: "[a4,d5,f5,a5]@5 ~@2 [d5,f5,a5,d6] [d5,f5,a5,d6]@2 [a4,d5,f5,a5]!2 [a4,d5,f5,a5]@2 [a4,d5,f5]@2, f2@13 ~@3", // Dm
  K: "[a4,d5,f5,a5]@5 ~@3 [d5,f5,a5,d6]@2 [a4,d5,f5,a5]@2 [a4,d5,f5,a5]@2 [a4,d5,f5]@2, f2@13 ~@3", // Dm
  L: "[d5,gb5,a5,d6]@4 [d5,gb5,a5,d6]@3 ~ [d5,f5,ab5,d6]@3 ~ [d5,f5,ab5,d6]@3 ~", // D Ddim
  M: "[g4,c5,e5,g5]@2 [e4,g4,c5,e5] [g4,c5,e5,g5]", N: "[b4,e5,g5,b5]", O: "[e4,a4,c5,e5]@2 [e4,a4,c5]!2",
  P: "[f4,a4,c5]", Q: "[e5,g5,c6,e6]@2 [g5,c6,e6,g6] [e5,g5,c6,e6]", R: "[a4,c5,e5,a5]@7 ~ [g4,c5,e5,g5]@7 ~",
  S: "[e2,e4,ab4,b4,d5]@7 ~", T: "[f5,a5,c6,eb6]@8 [g4,bb4,d5]@4 [eb4,g4,bb4]@3 ~",
  U: "[bb4,db5,g5,bb5]@7 ~ [bb4,db5,g5,bb5]@4 [e4,g4,bb4]@3 ~", V: "[e5,g5,c6,e6]@2 [g5,b5,e6,g6] [e5,g5,b5,e6]",
  W: "[e4,ab4,b4,d5], e2@7 ~", X: "[g4,bb4,eb5,g5]@7 ~@5 g5@3 ~, ~@8 [g4,bb4,eb5]@7 ~", Y: "[[d5,f5,bb5]@27 ~@5]/2",
})).s("gm_piano").gain(0.36)

// chords · piano · "Ac Piano" · soft notes
const piano_soft = note("<~@15 A ~@3 B ~@11 A ~@3 B ~@3 A ~@3 B ~@11 A ~@3 B ~@3 A ~@3 B ~@3 B ~@3 B ~@4>".pickRestart({
  A: "~@6 [d5,f5,a5,d6] ~@9", B: "~@3 [d5,f5,a5,d6] ~@4",
})).s("gm_piano").gain(0.2)

// bass · fretless bass · "El Bass"
const bass = note(`<
  ~@2 A@3 B C D E F G H I J K L E F K L E M N O P Q E R H S K L E F K L E T K L E F K L E M N O P Q E R H S K L E F K L
  E T K L E F K L E U K L E U K L E V W@2
>`.pickRestart({
  A: "f2@5 ~ f2 ~ f2@7 ~", B: "f2@5 ~ f2 ~ d2@4 e2@2 e1@2", C: "f1@4 ~@2 f1 ~ f1 ~ f1@3 ~ f1 ~",
  D: "f1@6 f1!2 f1@2 e1@2 f1@2 gb1 ~", E: "g1@6 g1 ~ g1@2 g1@3 ~ g1 ~", F: "g1@5 ~ g1 ~ g1@2 g1@3 ~ eb1 e1",
  G: "f1@5 ~ f1 ~ f1 ~ f1@3 ~ f1 ~", H: "e1@5 ~ e1 ~ e1@2 e1@3 ~ e1 ~", I: "eb1@5 ~ eb1 ~ eb1 ~ eb1@3 ~ eb1 ~",
  J: "eb1@4 eb2@3 ~ d2@3 e1 e2@2 e1 ~", K: "f1@5 ~ f1@2 f1@2 f1 g1 bb1 ~ a1 g1", L: "f1@5 ~ f1 ~ f1@2 e1@2 f1@2 gb1 ~",
  M: "a1@5 ~ a1 ~ ab1@5 ~ ab1 ~", N: "g1@5 ~ g1@2 g1 ~ g1 a1 c2@2 b1 a1", O: "g1@5 ~ g1!2 g1@2 gb1@2 g1@2 ab1 ~",
  P: "a1@5 ~ a1 ~ a1 ~ a1@3 ~ a1@2", Q: "a1@5 ~ a1@2 a1 ~ a1@4 f1 gb1", R: "a1@5 ~ a1@2 g1 ~ g1@3 ~ f1 ~",
  S: "f1@5 ~ f1 gb1 g1@2 g1@2 eb1 ~ eb1 e1", T: "eb1@5 ~ eb1 ~ eb1@2 eb2 ~ e2@2 e1 ~",
  U: "g1@5 ~ g1 ~ g1 ~ g1@2 eb1 ~ e1 ~", V: "eb1@5 ~ eb1 ~ eb1 ~ eb1@2 eb1 ~ g1 ~", W: "[bb1@29 ~@3]/2",
})).s("gm_fretless_bass").gain(0.49)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@10 A B@3 ~@7 C D E F G H I J K ~@15 C D E F G H I J K ~@10 L M N O P Q N O P Q N O P Q R@2
>`.pickRestart({
  A: "~ f4, [f2,f3,bb3,d4]", B: "[[e2,g3,db4]@16 [eb2,db4,bb4]@23 ~ [d4,f4,a4]@4 [db4,e4,g4]@3 ~, g4@19 ~@5]/3",
  C: "~@3 c6", D: "g5@2 e6@4 d6 c6", E: "b5", F: "c6 b5 a5 c7@3 b6@2", G: "a6 g6 c6 d6", H: "g6@8 e6@2 c6@2 g5@2 e5 ~",
  I: "a5@4 g5@3 f5", J: "[b3,ab4,e5]@5 e5 e7 d7", K: "c7@3 ~@5", L: "[bb4,d5,g5]@15 ~", M: "[bb4,eb5,g5]@15 ~",
  N: "[d5,f5]@3 ~@3 [d6,f6]@2 ~@2 [bb5,d6] ~@3 [f5,bb5] ~", O: "[d5,f5]@3 ~@3 [d6,f6]@2 ~@2 [a5,d6]@2 ~@2 [f5,a5] ~",
  P: "[d5,g5]@4 ~@2 [d6,g6] ~@3 bb5@2 ~@2 [g5,bb5]@2, ~@10 d6 ~@5", // G5 Gm
  Q: "~ eb5@3 ~@2 [eb6,g6]@2 ~@2 [bb5,eb6]@2 ~@2 g5@2, g5@3 ~@11 bb5 ~", R: "[[f4,d5,bb5]@29 ~@3]/2",
})).s("gm_string_ensemble_1").gain(0.22).pan(0.2)

// chords · brass section · "Brass"
const brass_section = note("<~@5 A B ~@6 A B ~@7 C ~@6 D B ~@6 E F ~@7 G H I J K ~@2 D F ~@6 E B ~@17>".pickRestart({
  A: "~@8 [a3,f4]@4 [g3,e4]@3 ~", B: "[f3,bb3,d4]@7 ~", C: "[g3,c4,e4]@7 ~", D: "~@4 [a3,f4]@4 [a3,f4]@4 [g3,eb4]@3 ~",
  E: "~@4 [a3,f4]@4 [a3,f4]@4 [g3,e4]@3 ~", F: "[f3,d4]@7 ~", G: "[g3,e4]@12 [g3,e4] ~@3", H: "[g3,e4]@13 ~ [g3,e4] ~",
  I: "[a3,c4,e4]@11 ~ [a3,c4,e4] ~@3", J: "[a3,c4,f4]@7 ~", K: "[g3,e4]@7 ~ [g3,e4]@3 ~ [g3,e4]@2 ~@2",
})).s("gm_brass_section").gain(0.28)

// chords · vibraphone · "Vibes"
const vibraphone = note(`<
  ~@6 A B C D A E D F A B C D A B C G H I J K H J L M A B C D A B C N A B C D A B C G O I P Q R J L M S T U@2 S T C N S
  B C D A B C D S B V D S B C D W@2
>`.pickRestart({
  A: "[bb4,d5,f5]@15 ~", B: "[a4,d5,f5]@7 ~", C: "[bb4,d5,g5]@15 ~", D: "[bb4,eb5,g5]@15 ~", E: "[bb4,db5,g5]@7 ~",
  F: "[bb4,eb5,g5]@7 ~@9", G: "[a4,d5,gb5]@8 [ab4,d5,f5]@7 ~", H: "[c5,e5,g5]@15 ~", I: "[b4,e5,g5]@7 ~",
  J: "[c5,e5,a5]@7 ~", K: "[c5,f5,a5]@15 ~", L: "[b4,d5,ab5]@7 ~", M: "[c5,f5,a5]@7 ~ [d5,g5,bb5]@4 [eb5,g5,bb5]@3 ~",
  N: "[bb4,db5,g5]@7 ~ [bb4,db5,g5]@4 [e5,g5,bb5]@3 ~", O: "[c5,g5]@15 ~", P: "[c5,e5]@15 ~", Q: "[f5,a5]@15 ~",
  R: "[e5,g5]@7 ~", S: "[bb4,f5]@15 ~", T: "[a4,f5]@7 ~", U: "[bb4,g5]@15 ~", V: "[bb4,d5]@15 ~",
  W: "[bb4@3 ~ bb5@2 ~@2, ~@12 f5@13 ~@7]/2",
})).s("gm_vibraphone").gain(0.25)

// other · tenor sax · "Sax"
const tenor_sax = note(`<
  ~@14 A B C D E F G H I J K L M@2 N ~ A B C D E F O P E F Q R S T O U V J K W M X N ~ A B Y D Z F AA AB AC B AD AE AF
  AG AH AI AJ AK AL AM AN AO AP AQ ~@2
>`.pickRestart({
  A: "~@2 bb3 ~ bb3@2 c4 ~ bb3@6 c4 ~", B: "d4@5 ~ f4 ~ d4@3 ~ c4@2 bb3 ~", C: "~@4 g4 ~ f4 ~ d4 ~ c4 ~ d4@3 ~",
  D: "d4 ~ d4@3 ~ c4 ~ bb3@4 c4 ~@3", E: "~@2 bb3 ~ d4 ~ f4 ~ d4@2 ~@4 bb3 ~", F: "d4 ~ f4 ~ d4 ~ g4@3 ~ f4@4 g4 ~",
  G: "~@2 bb3 ~ d4 ~ f4 ~ d4@3 ~ c4 ~ bb3 ~", H: "d4@3 ~ d4@3 ~ d4@4 c4@2 bb3 ~", I: "~@4 c4 ~ d4 ~ c4@3 ~ c4@2 d4 ~",
  J: "e4@6 g4 ~ e4@3 ~ d4@2 c4 ~", K: "~@4 a4 ~ g4 ~ e4 ~ d4 ~ e4@3 ~", L: "e4@3 ~ e4@3 ~ d4@2 c4 ~ c4@2 d4 ~",
  M: "e4@3 ~ e4 ~ e4 ~ e4@2 d4 ~ c4@2 ~@2", N: "d4@6 c4@7 ~@3", O: "~@4 d4@2 f4 ~ d4@3 ~ c4 ~ bb3 ~",
  P: "db4 ~ db4@3 ~ c4 ~ bb3@4 c4 ~@3", Q: "~@2 bb3 ~ [f4,g4] ~ f4 ~ d4@2 c4 ~ d4@2 ~@2",
  R: "d4@3 ~ d4@3 ~ c4@2 bb3 ~ bb3@2 c4 ~", S: "~@2 bb3 ~ d4@3 ~ d4@3 ~@3 bb3 ~", T: "bb3@2 d4 ~ f4 ~ g4@3 ~ f4@4 g4 ~",
  U: "d4@3 ~ d4@3 ~ c4@3 ~ bb3@2 c4 ~", V: "~@2 c4 ~ c4@2 d4 ~ c4@3 ~ c4 ~ d4 ~", W: "e4@3 ~ e4@3 ~ d4@3 ~ c4@2 d4 ~",
  X: "e4@4 e4 ~ g4 ~ e4 ~ d4 ~ c4@3 ~", Y: "~@2 g4 ~ g4@2 f4 ~ d4@2 c4 ~ d4@3 ~",
  Z: "~@2 d4 ~ d4@2 f4 ~ d4 ~ c4 ~ bb3@3 ~", AA: "~@4 d4 ~ f4 ~ d4@2 c4 ~ bb3@3 ~",
  AB: "db4@3 ~ db4@3 ~ c4@2 bb3 ~ bb3@2 ~@2", AC: "~@2 bb3 ~ bb3@2 c4 ~ bb3@3 ~ bb3 ~ c4 ~",
  AD: "~@2 g4 ~ g4@2 f4 ~ d4@2 c4 ~ d4@2 c4 ~", AE: "d4@3 ~ d4@3 ~ c4@3 ~ bb3@2 ~@2",
  AF: "d4@3 ~ d4 ~ d4@2 d4@2 c4 ~ bb3@3 ~", AG: "d4@3 ~ d4@2 f4 ~ d4 ~ c4 ~ bb3@3 ~",
  AH: "d4@3 ~ d4@2 d4@2 d4 ~ c4 ~ bb3 ~ c4 ~", AI: "d4@4 d4@3 ~ d4 ~ c4 ~ bb3@2 ~@2",
  AJ: "f4@3 ~ f4@2 f4 ~ f4@2 eb4 ~ d4@2 eb4 ~", AK: "f4@3 ~ f4 ~ f4@2 f4 ~ eb4 ~ d4@2 ~@2",
  AL: "f4@3 ~ f4 ~ g4 ~ d4 ~ c4 ~ bb3@3 ~", AM: "d4@2 ~@2 d4@3 ~ d4 ~ c4 ~ bb3 ~ c4 ~",
  AN: "~@2 f4 ~ f4@3 ~ f4@2 eb4 ~ d4 ~ eb4 ~", AO: "f4@3 ~ f4@2 g4 ~ d4 ~ c4 ~ bb3@2 c4 ~",
  AP: "d4@3 ~ d4@2 g4 ~ d4 ~ c4 ~ bb3@2 g3 ~", AQ: "bb3",
})).s("gm_tenor_sax").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A B A@3 B A@7 B A@3 B A@3 B A@7 B A@3 B A@3 B A@3 B A@3 B A@7 B A@3 B A@3 B A@3 B A@3 B A@3 B A@2 C ~
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x!2", C: "x",
})).gain(0.54)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<~@2 [~ x ~ x]!3 [~@4 x ~@5 x ~ x!2 ~@2] [~ x ~ x]!72 ~@2>").gain(0.6)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4] ~@78>").gain(0.54)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct(`<
  ~@2 A B A ~ A B A ~ A ~ A ~ A B A ~ A B A ~ A B A ~ A ~ A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A ~ A ~ A B A ~ A
  B A ~ A B A ~ A B A ~ A B A ~ A B A ~@3
>`.pickRestart({
  A: "~@3 x ~ x ~ x", B: "~ x ~ x ~@4",
})).gain(0.12)

// drums · high tom
const high_tom = s("ht").struct("<~@5 A ~@15 A ~@23 A ~@23 A ~@3 A ~@3 A ~@2>".pickRestart({
  A: "~@7 x",
})).gain(0.6)

// drums · crash
const crash = s("cr").struct("<~@78 x ~>").gain(0.42)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 [~ x ~ x]!76 ~@2>").gain(0.54)

// drums · congas
const congas = s("conga:33").struct("<~@2 [x ~@2 x!2 ~@3]!76 ~@2>").gain(1.92)

stack(
  piano, piano_soft, bass, string_ensemble_1, brass_section, vibraphone, tenor_sax, kick, kick_soft, snare, hihat,
  open_hat, open_hat_soft, high_tom, crash, tambourine, congas
)

More by Jimmy Ruffin