Strudelify

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: 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 W X T C J E F C K
  E U C J E F C K E Y C K E Y C K E Y Z@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: "[a4,c5,e5,a5] [g4,c5,e5,g5]", X: "[e4,ab4,b4,d5], e2@7 ~",
  Y: "[g4,bb4,eb5,g5]@7 ~@5 g5@3 ~, ~@8 [g4,bb4,eb5]@7 ~", Z: "[[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 M N K L M O P Q R S E T U V K L M N K L M W K L M N K L M O P Q R S E T U V K L M N K L
  M W K L M N K L M X K L M X K L M Y Z@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@5 ~ g1 ~ g1 ~ g1@3 ~ g1@2", F: "g1@5 ~ g1@2 g1 ~ g1@4 eb1 e1",
  G: "f1@5 ~ f1 ~ f1 ~ f1@3 ~ f1 ~", H: "e1@5 ~ e1@2 e1 ~ 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: "g1@6 g1 ~ g1@2 g1@3 ~ g1 ~", N: "g1@5 ~ g1 ~ g1@2 g1@3 ~ eb1 e1", O: "a1@5 ~ a1 ~ ab1@5 ~ ab1 ~",
  P: "g1@5 ~ g1@2 g1 ~ g1 a1 c2@2 b1 a1", Q: "g1@5 ~ g1!2 g1@2 gb1@2 g1@2 ab1 ~", R: "a1@5 ~ a1 ~ a1 ~ a1@3 ~ a1@2",
  S: "a1@5 ~ a1@2 a1 ~ a1@4 f1 gb1", T: "a1@5 ~ a1@2 g1 ~ g1@3 ~ f1 ~", U: "e1@5 ~ e1 ~ e1@2 e1@3 ~ e1 ~",
  V: "f1@5 ~ f1 gb1 g1@2 g1@2 eb1 ~ eb1 e1", W: "eb1@5 ~ eb1 ~ eb1@2 eb2 ~ e2@2 e1 ~",
  X: "g1@5 ~ g1 ~ g1 ~ g1@2 eb1 ~ e1 ~", Y: "eb1@5 ~ eb1 ~ eb1 ~ eb1@2 eb1 ~ g1 ~", Z: "[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 C B ~@7 D ~@6 E B ~@6 F G ~@7 H I J K L ~@2 E G ~@6 F B ~@17>".pickRestart({
  A: "~@8 [a3,f4]@4 [g3,e4]@3 ~", B: "[f3,bb3,d4]@7 ~", C: "~@8 [a3,f4]@3 ~ [g3,e4]@3 ~", D: "[g3,c4,e4]@7 ~",
  E: "~@4 [a3,f4]@4 [a3,f4]@4 [g3,eb4]@3 ~", F: "~@4 [a3,f4]@4 [a3,f4]@4 [g3,e4]@3 ~", G: "[f3,d4]@7 ~",
  H: "[g3,e4]@12 [g3,e4] ~@3", I: "[g3,e4]@13 ~ [g3,e4] ~", J: "[a3,c4,e4]@11 ~ [a3,c4,e4] ~@3", K: "[a3,c4,f4]@7 ~",
  L: "[g3,e4]@7 ~ [g3,e4]@3 ~ [g3,e4]@2 ~@2", // C
})).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 L M N A B C D A B C O A B C D A B C G P I Q R S L M N T U V@2 T U C O T
  B C D A B C D T B W D T B C D X@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]@15 ~", K: "[c5,f5,a5]@15 ~", L: "[c5,e5,a5]@7 ~", M: "[b4,d5,ab5]@7 ~",
  N: "[c5,f5,a5]@7 ~ [d5,g5,bb5]@4 [eb5,g5,bb5]@3 ~", O: "[bb4,db5,g5]@7 ~ [bb4,db5,g5]@4 [e5,g5,bb5]@3 ~",
  P: "[c5,g5]@15 ~", Q: "[c5,e5]@15 ~", R: "[f5,a5]@15 ~", S: "[e5,g5]@7 ~", T: "[bb4,f5]@15 ~", U: "[a4,f5]@7 ~",
  V: "[bb4,g5]@15 ~", W: "[bb4,d5]@15 ~", X: "[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 N O ~ A B C D E F P Q R S T U V W X Y Z AA K AB AC AD O ~ A AE AF AG AH AI AJ AK AL B
  AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ ~@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: "e4@3 ~ e4 ~ e4 ~ e4@2 d4 ~ c4@3 ~", O: "d4@6 c4@7 ~@3",
  P: "~@4 d4@2 f4 ~ d4@3 ~ c4 ~ bb3 ~", Q: "db4 ~ db4@3 ~ c4 ~ bb3@4 c4 ~@3", R: "~@2 bb3 ~ d4@2 f4 ~ d4@2 ~@4 bb3 ~",
  S: "d4@2 f4 ~ d4 ~ g4@3 ~ f4@3 ~ g4 ~", T: "~@2 bb3 ~ [f4,g4] ~ f4 ~ d4@2 c4 ~ d4@2 ~@2",
  U: "d4@3 ~ d4@3 ~ c4@2 bb3 ~ bb3@2 c4 ~", V: "~@2 bb3 ~ d4@3 ~ d4@3 ~@3 bb3 ~", W: "bb3@2 d4 ~ f4 ~ g4@3 ~ f4@4 g4 ~",
  X: "~@4 d4@2 f4 ~ d4@3 ~ c4@2 bb3 ~", Y: "d4@3 ~ d4@3 ~ c4@3 ~ bb3@2 c4 ~", Z: "~@2 c4 ~ c4@2 d4 ~ c4@3 ~ c4 ~ d4 ~",
  AA: "e4@5 ~ g4 ~ e4@3 ~ d4@2 c4 ~", AB: "e4@3 ~ e4@3 ~ d4@3 ~ c4@2 d4 ~", AC: "e4@3 ~ e4 ~ e4 ~ e4 ~ d4 ~ c4@3 ~",
  AD: "e4@4 e4 ~ g4 ~ e4 ~ d4 ~ c4@3 ~", AE: "d4@5 ~ f4 ~ d4@3 ~ c4 ~ bb3 ~", AF: "~@2 g4 ~ g4@2 f4 ~ d4@2 c4 ~ d4@3 ~",
  AG: "d4 ~ d4@3 ~ c4 ~ bb3@3 ~ c4 ~@3", AH: "~@2 d4 ~ d4@2 f4 ~ d4 ~ c4 ~ bb3@3 ~",
  AI: "d4 ~ f4 ~ d4 ~ g4@3 ~ f4@3 ~ g4 ~", AJ: "~@4 d4 ~ f4 ~ d4@2 c4 ~ bb3@3 ~",
  AK: "db4@3 ~ db4@3 ~ c4@2 bb3 ~ bb3@2 ~@2", AL: "~@2 bb3 ~ bb3@2 c4 ~ bb3@3 ~ bb3 ~ c4 ~",
  AM: "~@2 g4 ~ g4@2 f4 ~ d4@2 c4 ~ d4@2 c4 ~", AN: "d4@3 ~ d4@3 ~ c4@3 ~ bb3@2 ~@2",
  AO: "d4@3 ~ d4 ~ d4@2 d4@2 c4 ~ bb3@3 ~", AP: "d4@3 ~ d4@2 f4 ~ d4 ~ c4 ~ bb3@3 ~",
  AQ: "d4@3 ~ d4@2 d4@2 d4 ~ c4 ~ bb3 ~ c4 ~", AR: "d4@4 d4@3 ~ d4 ~ c4 ~ bb3@2 ~@2",
  AS: "f4@3 ~ f4@2 f4 ~ f4@2 eb4 ~ d4@2 eb4 ~", AT: "f4@3 ~ f4 ~ f4@2 f4 ~ eb4 ~ d4@2 ~@2",
  AU: "f4@3 ~ f4 ~ g4 ~ d4 ~ c4 ~ bb3@3 ~", AV: "d4@2 ~@2 d4@3 ~ d4 ~ c4 ~ bb3 ~ c4 ~",
  AW: "~@2 f4 ~ f4@3 ~ f4@2 eb4 ~ d4 ~ eb4 ~", AX: "f4@3 ~ f4@2 g4 ~ d4 ~ c4 ~ bb3@2 c4 ~",
  AY: "d4@3 ~ d4@2 g4 ~ d4 ~ c4 ~ bb3@2 g3 ~", AZ: "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