Strudelify
Endless Love cover art

1992 · Back To Front

Endless Love

Lionel Richie

KeyB♭ majorTempo80 bpm
0:00/0:00
// Endless Love — RICHIE LIONEL
// 80 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · epiano1 · "Piano"
const epiano1 = note(`<
  A@2 B@2 C D A@2 B@2 E F G H I J K L M N O P Q R S T U V W U A@2 B@2 A@2 I X Y@2 Z@2 E X AA AB U AC AD AE U X AF AG AH
  J AI AJ Q AK AL AM A@2 C R K AN AO AP AQ AG E AR AS AT AH AU I AV I AW AX U AY AZ@2
>`.pickRestart({
  A: "[~@6 bb3@4 bb3@2 ~@2 d4@2 bb3@6 bb3@2 bb3@3 ~@3 d4 f4, [bb3,d4,f4]@6 f4@10 f4@8 f4@7 ~, ~ bb2@7, ~@3 d4@4 ~ d4@6 bb3@2, ~@12 bb3@4 ~@11 f3@5]/2", // Bb
  B: "[~@14 d4 ~, bb2@13 bb3@2 ~, bb4@6 bb3 d4@2 f3@6 ~, [d4,f4]@2 bb3@3 f3@2 bb4@3 bb3 d4 bb4@3 ~, bb3 f3@2 [d4,f4]@4 f4@8 ~]/2", // Dm
  C: "~@10 eb4@4 g4 ~, [g4,bb4]@15 ~, eb4@5 ~@3, eb3!2, ~@6 eb2@9 ~", D: "[bb3,eb4,g4]@6 g4 bb4 [c4,eb4,f4,a4]@8",
  E: "~@5 bb4 g4 eb4, [g3,bb3,eb4]@3 ~", F: "[g3,bb3,eb4] [c4,eb4,f4,a4]",
  G: "[a3,c4,f4]@2 ~@2 [a3,c4,f4]@2 ~@2 [bb3,d4,f4]@6 d4 f4, ~ bb2@2 ~@5", H: "f4@5 f4 d4 bb3, [bb3,d4]@3 ~",
  I: "[eb4,g4,bb4]@7 eb4@2 ~@3 g4@2 bb4 ~, eb2@7 ~, ~@7 bb4@7 ~@2, ~@7 g4@5 ~@4, ~@5 eb4@2 ~", // Eb
  J: "[g3,bb3,eb4]@6 g4 bb4 f4@2 ~@2 a4@2 c5 ~, ~@8 [c4,eb4]@7 ~, ~@2 a4 ~, ~@10 f4@5 ~", // Eb Cm
  K: "[f3,bb3,d4]@4 [a3,c4,f4] ~ [a3,c4,f4] ~, ~@5 f3@2 ~", // Bb F
  L: "[g3,bb3,d4]@2 ~@2 [g3,bb3,d4]@2 ~@2 d4@2 ~@2 f4@2 a4 ~, ~@2 g2@4 ~@2 a3@7 ~, ~@2 f4 ~, ~@10 d4@5 ~", // Gm
  M: "[g3,bb3,eb4]@3 ~@3 bb4 eb5, ~@3 eb3@5, ~ eb4, ~@5 g4@3", // Eb
  N: "[g3,bb3,eb4]@8 f4@2 ~@2 a4@2 c5 ~, ~@8 [c4,eb4]@7 ~, ~@2 a4 ~, ~@10 f4@5 ~", // Eb Cm
  O: "[bb3,d4,f4]@3 ~@3 f4 bb4, ~@3 bb2@5, ~ bb3, ~@5 d4@3", // Bb
  P: "[ab3,c4,eb4]@7 ab3@2 ~@3 c4@2 eb4 ~, bb1@7 ~, ~@7 eb4@7 ~@2, ~@7 c4@5 ~@4, ~@5 ab3@2 ~", // Ab
  Q: "[g3,bb3,eb4]@12 eb4 g4 bb4 eb5", R: "[g3,bb3,eb4]@6 g4 bb4 [c4,eb4,f4,a4]@8",
  S: "[a3,c4,f4]@2 [bb3,d4,f4] [a3,c4,f4]", // F Bb F
  T: "g3@2 ~@2 bb3@2 d4 ~ [a3,d4,f4]@2 ~@2 [a3,d4,f4]@2 ~@2, d4@3 ~@5, bb3 ~@3, ~@2 g3@5 ~@3 d3@4 ~@2", // Dm
  U: "[g3,bb3,eb4]@7 ~", V: "[c4,d4,f4,a4]@12 d4 f4 a4 d5", W: "[bb3,c4,eb4,g4]@12 c4 eb4 g4 c5",
  X: "[bb3,eb4,g4]@4 [c4,eb4,f4,a4] ~ [c4,eb4,f4,a4] ~, ~@5 f3@2 ~", // Eb F7
  Y: "[~@26 bb3@2 bb3@2 d4 ~, bb2@31 ~, bb3@15 bb4@16 ~, [d4,f4,bb4]@8 [d5,f5]@23 ~, ~@7 bb5@8 f4 d4@6 bb3@2 [d4,f4]@6 ~@2]/2", // Bb Dm
  Z: "[~@16 bb3@6 ~@2 bb4@3 ~@3 d4 ~, bb4@14 f4@14 bb4@3 ~, f4@12 d4@4 d4@13 f4@2 ~, d4@10 bb3@6 bb4@6 bb3@5 bb3@5, bb3@6 bb2@25 ~]/2",
  AA: "[a3,c4,f4]@4 [bb3,d4,f4] ~ [bb3,d4,f4] ~, ~@5 bb2@2 ~", // F Bb
  AB: "~@10 bb3@4 d4 ~, [d4,f4]@15 ~, bb3@5 ~@3, bb2!2, ~@6 bb1@9 ~", // Dm
  AC: "[g3,bb3,eb4]@6 g4 bb4 [c4,eb4,f4,a4]@6 a4 c5", // Eb F7
  AD: "[bb3,d4,f4]@6 d4 f4 [a3,c4,f4]@2 ~@2 [a3,c4,f4]@2 ~@2, ~@5 f3@2 ~", // Bb F
  AE: "[g3,bb3,d4]@6 bb3 d4 [a3,d4,f4]@2 ~@2 [a3,d4,f4]@2 ~@2, ~@5 d3@2 ~", AF: "~@5 f4 d4 bb3, [f3,bb3,d4]@3 ~",
  AG: "[ab3,c4,eb4]@9 ~ bb1@2 [ab3,c4,eb4]@3 ~", AH: "[g3,bb3,eb4]@9 ~ eb3@2 [g3,bb3,eb4]@3 ~",
  AI: "[a3,c4,f4]@3 ~@3 c5 f5, ~@3 bb2@5, ~ f4, ~@5 a4@3", AJ: "[d4,g4,bb4]@4 [a3,d4,f4] ~ [a3,d4,f4] ~, ~@5 d3@2 ~",
  AK: "[c4,d4,f4,a4]@7 ~@5 f4@2 a4 ~, d2@7 ~, ~@7 a4@7 ~@2, ~@7 f4@3 d4@4 ~@2, ~@7 d4 c4@6 ~@2", // Dm7
  AL: "[bb3,c4,eb4,g4]@7 ~", // Cm7
  AM: "[eb4,g4,bb4]@7 eb4@2 ~@3 g4@2 bb4 ~, f2@7 ~, ~@7 bb4@7 ~@2, ~@7 g4@5 ~@4, ~@5 eb4@2 ~", // Eb
  AN: "[g3,bb3,d4]@6 bb3 d4 d4@2 ~@2 f4@2 a4 ~, ~@8 a3@7 ~, ~@2 f4 ~, ~@10 d4@5 ~", // Gm
  AO: "[bb3,eb4,g4]@3 ~@3 bb4 eb5, ~@3 eb3@5, ~ eb4, ~@5 g4@3", AP: "[g3,bb3,eb4]@8 [c4,eb4,f4,a4]@6 a4 c5",
  AQ: "[bb3,d4,f4]@12 bb3 d4 f4 bb4", // Bb
  AR: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [c4,eb4,f4,a4] ~ [c4,eb4,f4,a4] ~, ~ f3@2 ~@2 f3@2 ~", // Eb F7
  AS: "~@10 f4@4 a4 ~, [a4,c5]@15 ~, f4@5 ~@3, bb2!2, ~@6 bb1@9 ~", // Am
  AT: "[d4,g4,bb4] ~ [d4,g4,bb4] ~ [a3,d4,f4] ~ [a3,d4,f4] ~, ~ g2@2 ~@2 d3@2 ~", // Gm Dm
  AU: "[c4,d4,f4,a4]@3 ~@3 a4 c5, ~@3 d3@5, ~ d4, ~@5 f4@3", // Dm7
  AV: "[d4,f4,a4]@7 d4@2 ~@3 f4@2 a4 ~, d2@7 ~, ~@7 a4@7 ~@2, ~@7 f4@5 ~@4, ~@5 d4@2 ~", AW: "[a3,d4,f4]@7 ~",
  AX: "[bb3,c4,eb4,g4]@9 ~ c3@2 [bb3,c4,eb4,g4]@3 ~", // Cm7
  AY: "[bb3,d4,f4]@7 bb3@2 ~@3 d4@2 f4 ~, bb1@7 ~, ~@7 f4@7 ~@2, ~@7 d4@5 ~@4, ~@5 bb3@2 ~", // Bb
  AZ: "[[bb3,d4,f4,bb4]@21 ~ bb2@2 [bb3,d4,f4,bb4]@4 ~@4]/2", // Bb
})).s("gm_epiano1").gain(0.18)

// chords · pad warm · "Warm Pad"
const pad_warm = note(`<
  ~@14 A B C D A E F G H I J K L M N O P@2 ~@14 A E Q R O E F S A E T U L M V L P@2 L W C X H W F Y O E Z X O AA A T L M
  AB O F AC@2
>`.pickRestart({
  A: "[g5,eb6]", B: "[bb5,eb6] [a5,eb6]", C: "[f5,d6] [f6,a6]", D: "[g6,bb6] [f6,a6]", E: "[g5,eb6] [a5,eb6]",
  F: "[f5,d6]", G: "~ eb6, [ab6,c7]", H: "~ bb5, [eb6,g6]", I: "[g5,eb6] [eb6,a6]", J: "[c6,f6]@2 [f5,d6] [a5,f6]",
  K: "[bb5,g6] [a5,f6]", L: "g5 bb5, g6", M: "~ d6, [f6,a6]", N: "[eb6,g6]", O: "[eb6,bb6]", P: "[~ f5, [d6,f6]]/2",
  Q: "[f5,d6] [a5,f6]", R: "[bb5,g6] [d6,f6]", S: "[c6,ab6]", T: "[f6,a6]", U: "[d6,g6] [f6,d7]", V: "[bb5,eb6]",
  W: "[eb6,bb6] [a5,eb6]", X: "[g6,bb6] [a5,f6]", Y: "[ab6,c7]", Z: "[a5,f6]", AA: "[c6,f6]", AB: "~ c6, [eb6,g6]",
  AC: "[[f5,d6]@5 ~ [f5,d6] ~]/2", // Dm
})).s("gm_pad_warm").gain(0.1)

// bass · acoustic bass
const bass = note(`<
  A B C@2 D E A B F G H E I C J K L M N O P Q R S T U V W X Y Z AA AB AC A B D E C@2 F G D E I AD J S L AE N AF Q AG R S
  AH AI AJ AK AL Y AM AN AO AP L M AQ AR Q AS AT S AU AE AJ AV AW AV AX AY AZ BA BB BC BD
>`.pickRestart({
  A: "bb1@5 ~ bb1 ~ bb1@7 ~", B: "~@6 bb1 ~ bb1@5 ~ bb1 ~", C: "bb1@4 ~@2 bb1 ~ bb1@5 ~ bb1 ~",
  D: "eb2@6 eb2 ~ eb2 ~ eb2@3 ~ eb2 ~", E: "f2@5 ~ f2 ~ f2@5 ~ f2 ~", F: "bb1@5 ~ bb1 ~ bb1@6 f1 g1",
  G: "bb1@5 ~ bb1 ~ bb1@4 ~@2 bb1 ~", H: "eb2@4 ~@2 eb2 ~ eb2@5 ~ eb2 ~", I: "bb1@5 ~ bb1 ~ bb1@5 ~ bb1 ~",
  J: "eb2@6 ~ eb2 eb2@5 ~ eb2!2", K: "eb2@6 ~ eb2 f2@6 a1 f2", L: "bb1@7 bb1 f2@6 f2!2", M: "g2@6 ~ f2 d2@6 d2!2",
  N: "eb2@6 ~ eb2 eb2@5 ~ c2 d2", O: "f2@6 ~ f2 f2@6 c2 f2", P: "bb1@4 ~@3 bb1 bb1@5 ~@2 f2", Q: "bb1@5 ~@3 bb1@6 ~ f2",
  R: "eb2@5 ~@3 eb2@6 ~ d2", S: "f2@7 f2 f2@6 f2!2", T: "bb1@6 ~ d2 bb1@3 ~ f2@3 ~", U: "g2@6 ~ g2 d2@6 e2 d2",
  V: "eb2@6 ~ eb2 eb2@5 ~ e2 db2", W: "d2@6 ~ d2 d2@5 ~ d2 db2", X: "c2@6 ~ c2 c2@5 ~ f2 d2", Y: "f2@5 ~@3 f2@6 ~ d2",
  Z: "bb1@6 ~ bb1 bb1@5 ~ f1 g1", AA: "bb1@6 ~ bb1!2 ~ bb1@3 ~ bb1 ~", AB: "bb1@4 ~@2 bb1 ~ bb1@6 f1@2",
  AC: "bb1@6 ~ bb1!2 ~ bb1@3 ~ bb1@2", AD: "bb1@6 bb1 ~ bb1 ~ bb1@3 ~ bb1 ~", AE: "g2@7 g2 d2@6 d2!2",
  AF: "f2@6 ~ ab2 f2@6 c2 f2", AG: "bb1@5 ~@3 bb1@6 ~ bb0", AH: "bb1@5 ~@3 bb1@6 ~ bb2", AI: "g2@6 ~ bb1 d2@6 d2!2",
  AJ: "eb2@4 ~@3 eb2 eb2@5 ~@2 e2", AK: "d2@4 ~@3 d2 d2@5 ~@2 db2", AL: "c2@6 ~ c2 c2@5 ~ e2 c2",
  AM: "bb1@6 ~ bb1!2 ~ bb1@4 f1 g1", AN: "bb1@6 ~ bb1 bb1@5 ~ d2 bb1", AO: "eb2@4 ~@3 eb2 eb2@5 ~@2 g2",
  AP: "eb2@7 eb2 f2@6 f2!2", AQ: "eb2@5 ~@3 eb2@6 ~ c2", AR: "f2@6 ~ g2 f2@6 f1 f2", AS: "bb1@4 ~@3 bb1 bb1@5 ~@2 bb0",
  AT: "eb2@5 ~@3 eb2@6 ~ f2", AU: "bb1@5 ~@3 bb1@6 ~ bb1", AV: "d2@5 ~@3 d2@6 ~ e2", AW: "eb2@4 ~@3 eb2 eb2@5 ~@2 db2",
  AX: "eb2@5 ~@3 eb2@6 ~ eb2", AY: "d2@5 ~@3 d2@6 ~ f2", AZ: "c2@4 ~@3 c2 c2@5 ~@2 d2", BA: "f2@5 ~@3 f2@6 ~ c2",
  BB: "bb1@6 ~ bb1 bb1@5 ~ d2 c2", BC: "bb1@5 ~ bb1 ~ bb1@5 ~ f1 g1", BD: "bb1@5 ~ bb1 ~ bb1@8",
})).s("gm_acoustic_bass").gain(0.27).pan(0.6)

// bass · acoustic bass · soft notes
const bass_soft = note(`<
  ~ A ~@5 A ~@13 B C ~@6 C ~@5 A ~@16 D B C ~ E ~@4 C ~@6 C ~ D ~ C ~ E ~@2 F ~ F C F ~ C ~@3
>`.pickRestart({
  A: "bb1@5 ~@11", B: "~@7 eb2 ~@8", C: "~@7 bb1 ~@8", D: "~@7 f1 ~@8", E: "~@7 c2 ~@8", F: "~@7 a1 ~@8",
})).s("gm_acoustic_bass").gain(0.18).pan(0.6)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A@8 C@3 D C D C B C@3 D C@3 D C A@2 B A@3 B A@5 B A E C D C D C D C A C D C@5 B C@5 D C@3 E C@3 D C@3 D C
  D C@2 A F G
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!3 ~ x", C: "x ~@6 x!2 ~@5 x ~", D: "x ~@6 x!2 ~ x ~@3 x ~", E: "x ~@4 x ~@5 x ~@4",
  F: "x ~@2 x!2 ~@3", G: "x ~@2 x ~@4",
})).gain(0.3).pan(0.3)

// drums · rim
const rim = s("rim").struct("<A@13 B ~@7 B ~@9 B A@13 ~@8 B ~@7 B ~@22 B ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.4).pan(0.3)

// drums · snare
const snare = s("sd").struct("<~@13 A B@7 C B@9 A ~@13 D B@7 E B@7 C B@9 D B@12 E B F>".pickRestart({
  A: "~@10 x!3 ~@3", B: "~ x ~ x", C: "~@6 x!2", D: "~ x ~@2", E: "~@10 x ~ x ~ x!2", F: "~ x!2 ~",
})).gain(0.4).pan(0.3)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@23 A ~@21 B ~@11 A ~@13 B ~ A ~ A ~@3 A ~ A ~@5>".pickRestart({
  A: "~@7 x ~@8", B: "~@3 x ~@5 x ~@6",
})).gain(0.15).pan(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A C A B A@7 D E@2 F E@3 F D E G H I E@2 H G H D A B A@3 B A@7 ~ E G E G E@3 J E G F G E@2 H D E@2 H E F I F E H ~
  E G H K E@2 H K H K H E J A L
>`.pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", C: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", D: "x!7 ~",
  E: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", F: "x ~ x!3 ~ x!3 ~ x ~ x ~ x!2", G: "x ~ x!3 ~ x ~ x ~ x!3 ~ x!2",
  H: "x ~ x!3 ~ x!3 ~@3 x ~ x!2", I: "x ~ x!3 ~ x!3 ~ x!3 ~ x ~", J: "x!5 ~@3", K: "x ~ x!3 ~ x ~ x ~ x!3 ~ x ~",
  L: "x!2 ~@6",
})).gain(0.3).pan(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@45 [~@6 x!2] ~@25 [~@6 x!2] ~@15>").gain(0.45).pan(0.3)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@45 [~@5 x ~@2] ~@25 [~@5 x ~@2] ~@15>").gain(0.4).pan(0.3)

// drums · crash
const crash = s("cr").struct("<A ~@13 A ~@7 A ~@9 A ~@13 A ~@7 A ~@7 A ~@9 A ~@12 A B>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.35).pan(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@45 [~@3 x ~@4] ~@25 [~@3 x ~@4] ~@15>").gain(0.4).pan(0.3)

stack(
  epiano1, pad_warm, bass, bass_soft, kick, rim, snare, snare_soft, hihat, low_tom, open_hat, mid_tom, crash, high_tom
)

More by Lionel Richie