Strudelify
End of the Road cover art

Motown: A Journey Through Hitsville, USA

End of the Road

Boyz II Men

KeyE♭ majorTempo75 bpm
0:00/0:00
// End of the Road — Boyz II Men
// 75 bpm, 12/8, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 74 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(75/6)

// 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.

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A B C D E F G H E F I J K L M D N O P Q R O P Q E F I S E F G J K L M D N O P Q R O P Q T U V S W X Y Z AA L M D AB
  AC AD AE AB AC AD AE AB AC ~@7
>`.pickRestart({
  A: "eb1@4 eb2 bb1 eb1@2 g1@2 bb1@2", B: "c2@7 ~ g1@4 c2@6 g1@2 c2@2 c2@2", C: "ab1@3 eb2 eb1 f1 g1@2 c2@2 eb1 g1",
  D: "f1@2 g1@2 ab1 a1 bb1 f1 bb1 c2 bb1 g1", E: "eb1@10 eb1 ~ eb1@2 eb2@7 ~ bb1@2", F: "c2@11 ~ c2@4 g1@4 c2@2 c2@2",
  G: "ab1@11 ~ g1@4 c2@4 eb1@2 g1@2", H: "f1 g1 bb1 g1", I: "ab1@6 g1@2 c2@2 eb1 g1", J: "f1@3 g1@3 bb1@3 g1@2 bb1",
  K: "c2@4 g1 c2 b1@3 g1 b1 g1", L: "bb1@6 g1@2 bb1@2 f1@2 a1@7 eb2 a1@2 f1@2", M: "ab1@3 eb2 ab1 eb1 g1@2 c2@2 eb1 e1",
  N: "eb1@8 eb2@2 bb1@2 eb1@2 eb1!2 g1@6 bb1@2", O: "c2@4 g1 bb1 c2@2 g1@2 c2!2", P: "ab1@4 g1 ab1 g1@2 c2@2 eb1 e1",
  Q: "f1@3 g1@3 bb1 f1 bb1 bb1@2 g1", R: "eb1@8 eb2@2 bb1@2 eb1@2 eb1!2 g1@4 bb1@4", S: "f1@3 g1@3 bb1@3 bb1@2 g1",
  T: "eb1@4 eb2 bb1 eb1 eb2 g1@2 bb1@2", U: "c2@10 c2 g1 c2@4 g1@4 ab1@2 c2@2",
  V: "ab1@8 eb1@2 ab1@2 g1@4 c2@4 eb1@2 g1 ~",
  W: "~@3 eb2!2 ~ eb2 ~ eb2 ~ [eb1,eb2] ~ bb1@3 eb2 eb2@4 g1@2 bb1@2, eb1@5 ~@7", X: "c2@11 ~ c2@4 g1@4 c2@2 bb1@2",
  Y: "ab1@8 eb1@2 ab1@2 g1@4 c2@4 eb1@2 g1!2", Z: "f1 c2 f1@2 g1 ab1 bb1 f1 bb1 g1@2 bb1",
  AA: "c2 g1 c2 c2@3 b1 g1 b1 d2@2 c2", AB: "eb1@4 eb2 bb1 eb1 eb2 g1@2 g1 bb1",
  AC: "c2@2 g1!2 c2@2 g1 ~ g1@2 bb1@2 c2@4 g1@4 c2@2 c2@2", AD: "ab1@3 eb2 ab1!2 g1 d2 db2 c2 eb1 e1",
  AE: "f1@2 g1@2 g1 ab1 bb1 f1 bb1 bb1@2 g1",
})).s("gm_fretless_bass").gain(0.33)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~ A@2 B C A D E F A@2 B F G H I J D@2 E K D@2 L F A D M K A@2 N F G H I J D@2 O P D@2 Q F A D R S A@2 T S G H I J D@2
  B U D@2 R S D@2 ~@7
>`.pickRestart({
  A: "~@2 bb2 ~ c3 ~ eb3 ~@7 bb2 ~ c3 ~ eb3 ~@5", B: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 ~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2",
  C: "~@2 bb2 ~ c3 ~ g3 ~ f3 ~ eb3@2 ~@12", D: "~@2 bb2 ~ c3 ~ eb3 ~@7 bb2 ~ c3 ~ eb3 ~ f3 ~ g3 ~",
  E: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 ~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3 ~",
  F: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 bb2 ~@5 bb2 ~ c3 ~ eb3 ~",
  G: "~@2 c3 ~ d3 ~ eb3 ~ d3 ~ c3 ~@3 d3 ~ eb3 ~ f3 ~ eb3 ~ d3 ~",
  H: "~@2 eb3 ~ f3 ~ g3 ~ f3 ~ eb3 ~@3 g3 ~ bb3 ~ c4 ~@5",
  I: "~@2 [g3,c4,eb4] ~ [f3,bb3,d4] ~ [eb3,c4,eb4] ~@7 [f3,bb3,d4] ~ [g3,c4] ~ [bb3,d4] ~@5", // Cm Bb Cm Bb C5 Bb
  J: "~@2 [g3,c4,eb4] ~ [f3,bb3,d4] ~ [g3,c4,eb4] ~@5 g3 ~@5 g3 ~ [c3,g3] ~ [eb3,g3] ~", // Cm Bb Cm C5 Eb
  K: "~@2 bb2 ~ c3 ~ g3 ~ f3@2 eb3@2 bb2 ~@5 bb2 ~ c3 ~ eb3 ~",
  L: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 ~@2 bb2 ~ c3 ~ g3 ~ f3 ~ eb3 ~",
  M: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3 ~@3 bb2 ~ c3@2 g3 ~ f3@2 eb3@2",
  N: "~@2 bb2 ~ c3 ~ g3 ~ f3@2 eb3 ~@3 bb2 ~ c3@2 g3 ~ f3@2 eb3 ~",
  O: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 ~@2 bb2 ~ c3 ~ g3 ~ f3@2 eb3@2",
  P: "~@2 bb2 ~ c3 ~ g3 ~ f3 ~ eb3 ~ bb2 ~@5 bb2 ~ c3 ~ eb3 ~",
  Q: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3 ~@3 bb2 ~ c3@2 g3 ~ f3 ~ eb3@2",
  R: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 ~@2 bb2 ~ c3@2 g3 ~ f3 ~ eb3 ~",
  S: "~@2 bb2 ~ c3@2 g3 ~ f3 ~ eb3@2 bb2 ~@5 bb2 ~ c3 ~ eb3 ~",
  T: "~@2 bb2 ~ c3@2 g3 ~ f3@2 eb3@2 ~@2 bb2 ~ c3 ~ g3 ~ f3@2 eb3 ~",
  U: "~@2 bb2 ~ c3@2 g3 ~ f3 ~ eb3 ~ bb2 ~@5 bb2 ~ c3 ~ eb3 ~",
})).s("gm_electric_guitar_muted").gain(0.14).pan(1)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A B C D E F C D E G C D H I J K L M C D E N C D E G C D E G C D H I J K E O C D E G C D E F C D L F C D H I J K L F
  C D E F C D E P ~@7
>`.pickRestart({
  A: "g4@9 ~ g4@2 [eb4,ab4,bb4]@6 [eb4,g4,bb4]@5 ~, [g3,bb3,eb4] ~", B: "[bb3,d4,g4]@6 [bb3,c4,eb4]@5 [c4,eb4]",
  C: "[ab3,bb3,eb4]@12 [g3,bb3,d4]@11 ~", D: "[ab3,c4] [bb3,c4,eb4]",
  E: "[g3,bb3,eb4,g4]@12 [eb4,ab4,bb4]@6 [eb4,g4,bb4]@5 ~", F: "[bb3,d4,g4]@12 [bb3,c4,eb4]@10 [bb3,eb4] ~, ~@11 c4",
  G: "[bb3,d4,g4]@6 [bb3,c4,eb4]@5 [bb3,c4,eb4]", H: "[eb4,g4]@10 c4 ~ [b3,d4,f4]@9 ~ [b3,d4,f4]@2, c4@3 ~@5",
  I: "[bb3,eb4,g4]@9 ~ [bb3,eb4,g4] ~ a3@9 ~ a3@2, ~ [eb4,g4]", J: "[ab3,c4,eb4]@11 ~ [g3,bb3,d4]@12",
  K: "[ab3,c4,eb4]@6 [eb3,c4,eb4]@5 ~", L: "[bb3,eb4,g4]@12 [eb4,ab4,bb4]@6 [eb4,g4,bb4]@5 ~",
  M: "[bb3,d4,g4]@6 [bb3,c4]@5 [bb3,c4,eb4], ~@3 eb4@2 ~", N: "[bb3,d4,g4]@6 [bb3,c4,eb4]@5 [bb3,c4], ~@22 eb4 ~",
  O: "[bb3,d4,g4]@12 [bb3,c4,eb4]@9 ~ [c4,eb4]@2, ~@22 bb3 ~", // Gm Cm7 Cm
  P: "[bb3,d4,g4]@12 [bb3,c4,eb4]@9 ~ [bb3,eb4] ~, ~@11 c4", // Gm Cm7 Eb5
})).s("gm_epiano2").gain(0.19)

// other · glockenspiel · "GLOCKENSPL"
const glockenspiel = note(`<
  ~ A B C D A B C D A B C D E F G H A B C D A B C D A B C D A B C D E F G H A B C D A B C D A B C D A B C D E F G H A B
  C D A B C D A B ~@7
>`.pickRestart({
  A: "g6 ~@7 g6 ~ g6 ~ ab6 ~@5 g6 ~@5", B: "f6@7 ~ f6 ~ f6 ~ c6@6 f6 ~@3 c6 ~",
  C: "eb6 ~@7 c6 ~ eb6 ~ d6 ~@7 c6 ~ d7 ~", D: "c7 ~@7 f7 ~ c7 ~ g6 ~@5 f7 ~@5",
  E: "c7 ~@5 eb7 ~ d7 ~ c7 ~ [b6,d7] ~@5 [b5,b6] ~@5", F: "[bb5,bb6] ~@5 bb6 ~ g6 ~ f6 ~ eb6 ~@5 bb6 ~ g6 ~ c6 ~",
  G: "d6 ~@4 bb6 g6 ~ d6 ~ bb5 ~ c6 ~ c6 ~ c6 ~ c6 ~ c6 ~ c6 ~",
  H: "eb6 ~ eb6 ~ eb6 ~ eb6 ~ eb6 ~ eb6 ~ g6 ~ g6 ~ g6 ~ g6 ~ g6 ~ g6 ~",
})).s("gm_glockenspiel").gain(0.1)

// other · vibraphone
const vibraphone = note(`<
  ~@2 A B ~@2 A B ~@2 A B ~@6 A B ~@2 A B ~@2 A B ~@2 A B ~ C D E F ~ A B ~@2 A B ~@2 A B ~@2 A B ~ C D E F ~ A B ~@2 A
  B ~@2 A ~@7
>`.pickRestart({
  A: "~@10 c5@2 f5@5 ~ f5@2 ~@2 c5@2", B: "eb5@6 ~@6 d5@5 ~ f5@5 ~", C: "c5@8 ~@4 b4@9 ~@3", D: "bb4@9 ~@3 a4@10 ~@2",
  E: "ab4@11 ~ f4@8 ~@4", F: "eb4@8 ~@4 bb4@5 ~ bb4@5 ~",
})).s("gm_vibraphone").gain(0.07)

// other · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~ A B C D A B C D A B C D ~@4 A B C D A B C D A B C D A B C D ~@4 A B C D A B C D A B C D A B C D ~@4 A B C D A B C D
  A B ~@7
>`.pickRestart({
  A: "eb6@2 [eb5,ab6] [eb5,g6]", B: "f6@11 ~ c5@6 ~@6", C: "eb5@8 ~@4 d5@7 ~@5", D: "c5@8 ~@2 bb4@2 g4@7 ~@5",
})).s("gm_epiano1").gain(0.18)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@17 A@2 B C@2 D B E ~@8 F G H I A@2 B C@2 D B E ~@8 F G J I A@2 B C@2 D B K@3 ~@7
>`.pickRestart({
  A: "[g4@12 eb4@12 f4@12 g4@11 ~, bb3@47 ~]/2", B: "[ab3,eb4]@11 ~ [g3,d4]@11 ~",
  C: "[ab3@11 ~@13 g4@12 eb4@12, c4 ~, ~ bb3@2 ~]/2", D: "f4@12 g4@11 ~", E: "ab3@11 ~ bb3@12, c4",
  F: "~@5 eb5 d5@3 f5@3, c5 b4", G: "eb5 f5 g5 bb5, bb4@12 a4@11 ~",
  H: "[c5,c6]@4 [bb4,bb5] [g4,g5] f5@4 [g4,g5] [bb4,bb5], ~@2 f4 ~", I: "g5@5 ~ bb5@5 ~ g5@2 bb5@4 g5@2 bb5@4, g4@23 ~",
  J: "[c5,c6]@4 [bb4,bb5] [g4,g5] f5@4 g4 [bb4,bb5], ~@12 f4@6 ~@2 g5 ~@3", // C Bb G Bb
  K: "[ab3@11 ~@13 g5@8 f5@2 g5@2 ab5@6 ~@6 [f4,d6]@12 [g4,c6]@12, c4@2 g4 eb4 ~@2, ~@2 bb3@4 ~ bb5@5]/3", // Dm C5
})).s("gm_string_ensemble_2").gain(0.2)

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

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!52 ~@21>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@52 [~@3 x] [~ x ~ x]!14 ~@7>").gain(0.25)

// drums · clap
const clap = s("cp").struct("<~@52 [~@3 x] [~ x ~ x]!3 [~ x ~@2] [~ x ~ x]!15 [~ x ~@2] ~>").gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@15 A ~@3 A ~@15 B ~@13>".pickRestart({
  A: "~@11 x", B: "~@21 x!2 ~",
})).gain(0.25)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B@6 C B@3 C A B@2 D A B@2 C B@3 C B@8 A B@3 A B@2 C B@3 C A B@7 A B A B A B@2 E A B@3 A F ~@7
>`.pickRestart({
  A: "~ x ~ x!9", B: "x!2 ~ x!9", C: "x!2 ~ x!6 ~@3", D: "x!2 ~ x!3 ~@2 x ~@3", E: "x!2 ~ x!3 ~ x!2 ~@3",
  F: "x ~ x!2 ~@2 x ~ x ~ x ~@13",
})).gain(0.2)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ [~ x ~@3 x ~@2]!65 [~@12 x ~ x!3 ~ x ~ x ~ x ~] ~@7>").gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@7 A ~@3 A ~@3 B ~@3 A ~@3 A ~@15 A ~@3 A ~@15 C ~@13>".pickRestart({
  A: "~@9 x!2 ~", B: "~@6 x ~@2 x!2 ~", C: "~@10 x ~ x ~@5 x!3 ~@3",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~ [~ x ~@4]!66 ~@7>").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~ A ~@11 A ~@3 A ~@15 A ~@3 A ~@7 A ~@7 A ~ A ~ A ~@3 A ~@3 A ~@8>".pickRestart({
  A: "x",
})).gain(0.2)

// drums · shaker
const shaker = s("sh").struct("<~@66 [~ x!2 ~ x!8] ~@7>").gain(0.1)

stack(
  bass, electric_guitar_muted, epiano2, glockenspiel, vibraphone, epiano1, string_ensemble_2, kick, rim, snare, clap,
  low_tom, hihat, hihat_soft, mid_tom, open_hat, crash, shaker
)

More by Boyz II Men