Strudelify
Love Train cover art

1973 · Back Stabbers

Love Train

The O'Jays

KeyC majorTempo120 bpm
0:00/0:00
// Love Train — The O'Jays
// 120 bpm, 4/4, key C major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// 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(120/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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D E F C G E F C G H I J K L M J K N O P Q R S T U E F C G E F C G H I J K L M J K N O P Q R S T U E F C G E F C
  G V@2 W X V Y Z AA E F C G E F C G E F C G E F C G AB@3
>`.pickRestart({
  A: "c3@5 ~ c3 ~ c3 ~ c3 ~ c3@2 c#3@2", B: "d3@3 ~ d3@3 ~ d3 ~ d3@3 ~ d3 ~",
  C: "f3@3 ~ f3@2 f2@2 f3@2 f2@2 f3@2 f#3@2", D: "g3@3 ~ g3@2 g2@2 g3@2 g2@2 g3@2 g2@2",
  E: "c3@3 ~ c3@3 ~ c3 ~ c3@3 ~ c3 ~", F: "d3@3 ~ d3 ~ d3 ~ d3 ~ d3@3 ~ e3@2", G: "g3@3 ~ g3@2 g2@2 g3@2 g2@2 g3@3 ~",
  H: "g2@4 g3@3 g2 g3 ~ g3@2 g2@2 g3@2", I: "g2@4 g3@3 g2 g3@3 ~ g3@2 g2@2", J: "f3@3 ~ f3@3 f2 f3 ~ f3@4 f2@2",
  K: "f3@3 ~ f3@3 f2 f3@2 f2@2 f3@2 f#3@2", L: "g3@3 ~ g3@3 g2 g3 ~ g3 ~ g3 d3 g2@2",
  M: "g2@3 ~ g3@3 g2 g3@2 g2@2 g3@2 g2@2", N: "g3@3 ~ g3@3 g2 g3 ~ g3@4 d3@2", O: "g2@4 g3@3 g2 g3@2 g2@2 g3@2 g#3@2",
  P: "a3@3 ~ a3@4 e3 ~ e3@3 ~ g3@2", Q: "a3@3 ~ a3@3 a2 a3@2 a2@2 a3@2 a2@2", R: "d3@3 ~ d3@3 a2 d3 ~ d3@4 a2@2",
  S: "d3@3 ~ d3@3 a2 d3@2 a2@2 d3@2 a2@2", T: "g3@3 ~ g3@3 ~ f3@3 ~ f3@3 ~", U: "e3@3 ~ e3@3 ~ d3@3 ~ g2@3 ~",
  V: "d#3@3 ~ d#3@3 a#2 d#3 ~ d#3@4 a#2@2", W: "c3@4 c3@3 g2 c3 ~ c3@4 g2@2", X: "c3@2 e3@2 g3@2 e3 c3",
  Y: "d#3@3 ~ d#3@3 a#2 d#3 ~ d#3@3 ~ d#3 ~", Z: "g3@3 ~ g3@3 ~ g3@3 ~ g3@2 d3@2",
  AA: "g2@3 ~ g2@3 ~ g2 ~ g2 ~ g2 ~ g2@2", AB: "[c3@11 ~@5]/3",
})).s("gm_acoustic_bass").gain(0.57)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  A B C D E B F G E B F G H@2 I@2 J@2 K@2 L M N@2 O@2 P Q E B F G E B F G H@2 I@2 J@2 K@2 L M N@2 O@2 P Q E B F G E B F
  G R S@3 T@2 U V E B F G E B F G E B F G E B F G W@3
>`.pickRestart({
  A: "[c3,e3,g3,c4,e4]@9 ~ [c3,e3,g3,c4]!3 ~ [c3,e3,g3]@2", B: "[f#3,a3,d4]@9 ~ [d3,f#3,a3,d4] ~@3 [f#3,a3,d4] ~",
  C: "[f2,c3,f3,a3,c4]@9 ~ [f2,c3,f3,a3,c4]!3 ~ [f3,a3,c4] ~", D: "[g2,f3,a3,c4]@9 ~ [g2,f3,a3,c4] ~@3 [f3,a3,c4] ~",
  E: "[c3,e3,g3]@9 ~ [c3,e3,g3,c4] ~@5", F: "[f2,c3,f3,a3,c4]@10 [f3,a3,c4] [f2,c3] [f3,a3,c4] ~ [f3,a3,c4] ~",
  G: "[g2,f3,a3,c4]@9 ~ [g2,g3,b3,d4] ~@3 [g2,g3,b3,d4] ~", // F G
  H: "[[g2,d3,b3,d4,g4]@4 [b3,d4,a4]@2 [g2,d3] ~ [b3,d4,g4] ~ [b3,d4,g4]@2 [g2,d3] ~ [d4,g4]@4 b3 ~ [b3,d4,a4]@3 [g2,d3] [b3,d4,g4]@2 [g2,d3] ~ [b3,d4,g4]@2 ~@2, ~@14 [g2,d3]@7 ~@11, ~@14 b3@3 ~@15]/2", // G Bm7 G5 G G5 Bm7 G5 G …
  I: "[[a3,c4,f4]@3 ~ [a3,c4,g4]@2 [f2,c3] ~ [a3,c4,f4] ~ [a3,c4,f4]@2 [f2,c3] ~ [a3,c4,f4]@4 [f2,c3]@2 [a3,c4,g4]@2 [f2,c3]@2 [a3,c4,f4] ~ [a3,c4,f4]@2 [f2,c3] ~ [a3,c4,f4] ~, [f2,c3] ~@7]/2", // F Am7 F5 F F5 F F5 Am7 …
  J: "[[b3,d4,g4]@3 ~ [b3,d4,a4]@2 [g2,d3] ~ [b3,d4,g4] ~ [b3,d4,g4]@2 [g2,d3] ~ b3@2 ~@2 b3 ~ [b3,d4,a4]@2 ~ d3 [b3,d4,g4]@2 [g2,d3] ~ [b3,d4,g4] ~ [b3,d4,g4] ~, [g2,d3]@4 ~@10 [d4,g4]@5 ~@13, ~@16 [g2,d3]@5 ~ g2@2 ~@8]/2", // G Bm7 G5 G G5 Bm7 G G5 …
  K: "[[a3,c4,f4]@3 ~ [a3,c4,g4]@2 [f2,c3] ~ [a3,c4,f4] ~ [a3,c4,f4]@2 [f2,c3] ~ a3@2 ~@2 a3 ~ [a3,c4,f4]@2 ~ c3 [a3,c4,f4]@2 [f2,c3] ~ [a3,c4,f4]@2 ~@2, [f2,c3]@4 ~@10 [c4,f4]@5 ~@13, ~@16 [f2,c3]@5 ~ f2@2 ~@8]/2", // F Am7 F5 F F5 F F5 F …
  L: "[b3,d4,g4]@3 ~ [b3,d4,a4]@2 [g2,d3] ~ [b3,d4,g4] ~ [b3,d4,g4]@2 ~@2 [b3,d4,g4]@2, [g2,d3] ~@2 [g2,d3]", // G Bm7 G5 G G5
  M: "~@2 [b3,d4,g4] ~@3 [b3,d4,a4] ~ [b3,d4,g4]@3 ~ [b3,d4,g4] ~@3", // G Bm7 G
  N: "[[a3,c4,e4]@3 ~ [a3,c4,e4]@3 ~ [g3,b3,d4]@2 g2 ~ [g3,b3,d4] ~ [a3,c4,e4]@4 ~@2 [a3,c4,e4]@2 e3 ~ [a3,c4,e4] ~ [a3,c4,e4]@2 [a2,e3] ~@3, a2@6 ~@8 a2@3 ~ a2@8 ~@6]/2", // Am G Am A5
  O: "[[a3,f4]@4 [c4,f4,a4]@3 a3 [c4,f4,a4] ~ [c4,f4,a4]@2 ~@2 [d4,f4,a4] ~ [c4,f4,a4]@3 ~ [c4,f4,a4]@3 [f3,a3] [c4,f4,a4]@2 [d3,f3]@2 [c4,f4,a4] ~@3, [d3,f3]@8 ~@4 [d3,f3]@9 ~@2 d3@2 ~@7, [c4,a4]@3 ~@9 a3@6 ~@8 a3 ~@5]/2", // Dm F Dm F Dm F Dm F
  P: "[g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [f3,b3,d4]@3 ~ [f3,b3,d4]@3 ~, g2@6 ~@2 f2 ~@7", // G Bdim
  Q: "[e3,b3,d4]@3 ~ [e3,b3,d4]@3 d3 [g3,b3,d4]@2 d3@2 [g3,b3,d4]@2 d3 ~", // E7 G
  R: "[d#3,a#3,d#4,g4]@3 g4 g4@2 g4@2 [d4,g4]@4 ~@2 g3@2, g3@3 [d4,g4], ~@3 d#3@13, ~@3 a#3@3 a#3@10, ~ d#4@3", // D# G5
  S: "[[c4,g4]@4 g4@3 ~ [d4,g4]@4 [d4,g4]@3 ~ [c4,e4]@4 c4@4 g3@2 [c3,e3,g3,d4,g4]@4 [c3,e3,g3,d4,g4]@4 g3@2 ~@8 c4@3 ~, d#3@15 c3@11 ~@8 [c3,e3]@6 c4@4 ~@4, ~@4 c4@12 g3@8 c4@10 g4@4 g3@4 [c3,e3,g3]@5 ~, ~@7 g3@9 e3@10 ~@8 d4@13 ~, ~@20 e4@6 e4@9 ~ c4@4 [e4,g4]@7 ~]/3", // C5 G5 C Em
  T: "[[a#3,d#4,g4]@4 [a#3,d#4,g4]@3 ~ [d4,g4]@4 [d4,g4]@3 ~ [c4,g4]@4 [c4,g4]@3 ~ [d4,g4]@4 [d4,g4]@4, [d#3,g3]@7 [d#3,g3]@8 d#3@17, ~@16 g3@6 ~ g3@9]/2", // D# G5 C5 G5 D#
  U: "[f3,a3,c4]@2 [f3,a3,c4] [g2,f3,a3,c4]@2 [g2,f3,a3,c4]@2 [g2,f3,a3,c4], g2@3 ~@5", // F
  V: "[g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4] ~", // G
  W: "[[c3,g3,c4,e4,g4]@17 ~@7]/3", // C
})).s("gm_epiano1").gain(0.4)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  A B C D E F G H I J K L ~@16 E F G H I J K L ~@16 E F G H I J K L M N O@2 P Q R@2 E F G H I J K L E F G H I J K L S@3
>`.pickRestart({
  A: "[g4,c5,e5] ~@9 [g4,c5,e5] ~@5", B: "[f#4,a4,d5] ~@9 [f#4,a4,d5] ~@3 [f#4,a4,d5] ~",
  C: "[f4,a4,c5] ~@9 [f4,a4,c5] ~@3 [f4,a4,c5] ~", D: "[f4,a4,c5] ~@5 [f4,a4,c5] ~@3 [f4,a4,c5] ~@3 [f4,a4,c5] ~",
  E: "[g4,c5,e5] [c5,e5] ~@2 [g4,c5,e5]@2 g4 ~ [c5,e5,g5]@2 ~@6, ~ g4@2 ~@13", F: "~@2 [c5,e5,a5]@2 [a4,c5,e5] ~@3",
  G: "~@4 [a4,c5,e5] ~ [a4,c5,e5]@2 [c5,e5,a5]@4 [a4,c5,e5]@3 ~", H: "~@2 [c5,e5,a5]@2 [a4,e5] ~@3, ~@2 c5 ~",
  I: "[g4,c5,e5] [c5,e5]@4 ~ [c5,e5]@2 [c5,e5,g5]@3 ~@5, ~ g4@2 ~@3 g4 ~@9", // C
  J: "~@4 [c5,e5,a5]@3 ~ [a4,e5]@2 ~@6, ~@2 c5 ~", // Am A5
  K: "~@4 [a4,c5,e5] ~ [a4,c5,e5] ~ [c5,e5,a5]@3 ~ e5@4, ~@6 c5 ~, ~@12 a4 ~@3", // Am
  L: "~@4 [c5,e5,a5]@3 ~ [c5,e5]@3 ~@5, ~@8 a4 ~@7", M: "[a#4,d#5,g5]@8 [d5,g5]@7 ~",
  N: "[c5,g5]@7 ~ g5@7 ~, ~@8 d5@5 ~@3", O: "[[c5,e5,g5]@25 ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~]/2",
  P: "[a#4,d#5,g5]@7 ~ [a#4,d5,g5]@7 ~", Q: "[a#4,c5,g5]@7 ~ [a#4,d5,g5]@6 ~@2", R: "[~@16 d5@15 ~, [g4,g5]@31 ~]/2",
  S: "[[g4,c5,e5]@11 ~@5]/3", // C
})).s("gm_brass_section").gain(0.39)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  A B C D A B C D A B C D E F@2 G@2 F@2 H@2 I J K L@2 M N A B C D A B C D E F@2 G@2 F@2 H@2 I J K L@2 M N A B C D A B C
  D O@3 P Q R S T A B C D A B C D A B C D A B C D U@2 ~
>`.pickRestart({
  A: "~@4 [c4,c5]@3 ~ [d4,d5]@6 ~@2", B: "~@4 [d4,d5]@3 ~ [c4,c5]@7 ~",
  C: "~@4 [c4,c5] ~ [c4,c5] ~ [d4,d5]@3 ~ [c4,c5]@4", D: "~@4 [d4,d5]@2 ~@2 [c4,c5]@5 ~@3",
  E: "[g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3", // G
  F: "[[g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [f3,a3,c4]@5 ~ [f3,a3,c4] ~@3 [f3,a3,c4] ~@3 [f3,a3,c4] ~@3]/2", // G F
  G: "[[f3,a3,c4] ~@3 [f3,a3,c4] ~ c4 ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [g3,b3,d4]@5 ~ [g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3]/2", // F G
  H: "[[f3,a3,c4] ~@3 [f3,a3,c4] ~@3 [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [g3,b3,d4]@5 ~ [g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3]/2", // F G
  I: "[g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~ [g3,b3,d4] ~@3 [g3,b3,d4] ~", // G
  J: "[a3,c4,e4] ~@3 [a3,c4,e4] ~@7 [g3,b3,d4] ~@3", K: "[a3,c4,e4] ~@3 [a3,c4,e4] ~@5 [a3,c4,e4] ~ [a3,c4,e4] ~@3",
  L: "~@4 [d3,a3,d4,f4,a4] ~@7 [d3,a3,d4,f4,a4] ~@3", M: "[g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [f3,b3,d4]@3 ~ [f3,b3,d4]@3 ~",
  N: "[e3,g3,b3,d4]@3 ~ [e3,g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@2 ~@2, ~@4 d3@3 ~", // Em7 G
  O: "[[a#3,d#4,g4]@4 [a#3,d#4,g4]@4 [d4,g4]@4 [d4,g4]@2 ~@2 [c4,g4]@4 [c4,g4]@2 ~@6 [d4,g4]@3 ~ [c4,e4,g4]@3 ~ [c4,e4,g4]@3 g3 [b3,e4,g4] ~@3 g3@2 [c4,e4,g4] ~, [d#3,g3]@8 [d#3,g3]@6 d#3@8 d#3@9 c3@16 ~, ~@15 g3@2 ~@6 g3@2 ~ g3@5 ~@17, ~@12 [d4,g4]@2 ~@7 [b3,e4,g4]@2 ~]/3", // D# G5 C5 G5 C Em C D# …
  P: "[c4,e4,g4]@3 ~ [c4,e4,g4]@3 g3 [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4]@3 ~, c3@15 ~", // C
  Q: "[a#3,d#4,g4]@3 ~ [a#3,d#4,g4]@3 ~ [a#3,d4,g4]@3 ~ [a#3,d4,g4]@4, [d#3,g3]@7 ~ [d#3,g3]@8", // D# Gm D#
  R: "[c4,g4]@3 ~ [c4,g4]@3 [d#3,g3] [d4,g4]@4 [d4,g4]@3 ~", // C5 D# G5
  S: "~@2 [d3,f3,a3] ~ [d3,f3,a3] ~ [d3,f3,a3] ~ [d3,f3,a3] ~ [d3,f3,a3] ~ [d3,f3,a3] ~ [d3,f3,a3] ~", // Dm
  T: "[g3,b3] ~ [g3,b3] ~ [g2,d3,g3,b3,d4] ~ [g2,d3,g3,b3,d4] ~ [g2,d3,g3,b3,d4] ~ [g2,d3,g3,b3,d4] ~ [g2,d3,g3,b3,d4] ~ [g2,d3,g3,b3,d4] ~", // G
  U: "[[c3,e3,g3,c4,e4]@29 ~@3]/2", // C
})).s("gm_acoustic_guitar_nylon").gain(0.4)

// drums · kick
const kick = s("bd").struct("<A@12 B@16 A@8 B@16 A@8 B@7 C A@16 D ~@2>".pickRestart({
  A: "x ~@2 x!3 ~ x", B: "x!2", C: "x ~ x!6", D: "x",
})).gain(0.62)

// drums · snare
const snare = s("sd").struct("<A@11 B A@15 C A@7 B A@15 C A@7 B A@6 ~ D A@7 E A@7 B ~@3>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@9 x!2", C: "~@4 x ~@5 x ~@3 x!2", D: "~ x!3 ~ x!3", E: "~@4 x ~@7 x ~ x!2",
})).gain(0.62)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@11 A ~@15 B ~@7 A ~@15 B ~@7 A ~@6 C D ~@15 A ~@3>".pickRestart({
  A: "~@10 x!4 ~@2", B: "~@6 x ~ x ~@3 x!2 ~@2", C: "~ x!7", D: "x ~@7 x!2 ~@3 x ~ x",
})).gain(0.19)

// drums · low tom
const low_tom = s("lt").struct("<~@27 [~@6 x!2] ~@23 [~@6 x!2] ~@15 [~@5 x!3] ~@19>").gain(0.62)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B ~@3
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.19)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 [~@3 x!3 ~@2] ~@23 [~@3 x!3 ~@2] ~@15 [~@2 x!3 ~@3] ~@19>").gain(0.62)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B ~@2
>`.pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.62)

// drums · crash
const crash = s("cr").struct(`<
  A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "x",
})).gain(0.62)

// drums · ride
const ride = s("rd").struct("<~@84 x ~@2>").gain(0.62)

// drums · cowbell
const cowbell = s("cb").struct("<[x!4]!12 ~@16 [x!4]!8 ~@16 [x!4]!8 ~@8 [x!4]!16 ~@3>").gain(0.62)

// drums · congas
const congas = s("conga:18").struct("<A@12 B@15 C A@8 B@15 C A@8 B@6 ~@2 A@16 ~@3>".pickRestart({
  A: "~@3 x!2 ~@5 x!2 ~@4", B: "~@2 x!3 ~@5 x!2 ~@4", C: "~@2 x!3 ~@6 x ~@4",
})).gain(1.99)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A B A B A B A B A ~ A B A B A B A
  B A B A B A B ~@2 A B A B A B A B A B A B A B A B ~@3
>`.pickRestart({
  A: "~@3 x", B: "~@6 x!2",
})).gain(1.99)

stack(
  bass, epiano1, brass_section, acoustic_guitar_nylon, kick, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, crash, ride, cowbell, congas, congas_2
)

More by The O'Jays