Strudelify
Love Song (long version) cover art

Never Stop That Feeling

Love Song (long version)

Mark 'Oh

KeyC majorTempo162 bpm
0:00/0:00
// Love Song (long version) — Mark 'Oh
// 162 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 14 "LOVESONG*Demixed 14" agogo (copy of ch 2 "LOVESONG*Demixed 02" synth bass 1); ch 5 "LOVESONG*Demixed 05" pad poly (copy of ch 6 "LOVESONG*Demixed 06" pad halo); ch 9 "LOVESONG*Demixed 09" lead 3 calliope (copy of ch 8 "LOVESONG*Demixed 08" lead 1 square)
// note: Full arrangement: all 120 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(162/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 · synth bass 1 · "LOVESONG*Demixed 02"
const bass = note(`<
  ~@17 A B@3 C D E F G B@3 C D E F G B@3 C D E F H I J K L M N O P I J K L M N Q H I J K L M N Q R S B@3 C D E B C D E F
  G B@3 C D E F G B@3 C D E F H I J K L M N Q H I J K L M N Q H I J K L M N Q R ~
>`.pickRestart({
  A: "~@8 g2 b2 c3 ~ g2 b2 c3 ~", B: "g2 b2 c3 ~ g2 ~ c3 ~ g2 b2 c3 ~ g2 ~ c3 ~",
  C: "g2 b2 c3 ~ g2 ~ c3 ~ c3 d3 e3 ~ c3 ~ e3 ~", D: "c3 d3 e3 ~ c3 ~ e3 ~ c3 d3 e3 ~ c3 ~ e3 ~",
  E: "c3 d3 e3 ~ c3 ~ e3 ~ g2 b2 c3 ~ g2 ~ c3 ~", F: "g2 b2 c3 ~ g2 ~ c3 ~ g2 b2 d3@2 ~@2 d3 ~",
  G: "d3 g2 d3 e3 g3@2 ~@2 g2 b2 c3 ~ g2 b2 c3 ~", H: "d3 g2 d3 e3 g3@2 ~@2 g2!2 c3 ~ g2 ~ c3 ~",
  I: "g2!2 c3 ~ g2 ~ c3 ~ g2!2 c3 ~ g2 ~ c3 ~", J: "g2!2 c3 ~ g2 ~ c3 ~ a2!2 d3 ~ a2 ~ d3 ~",
  K: "a2!2 d3 ~ a2 ~ d3 ~ a2!2 d3 ~ a2 ~ d3 ~", L: "a2!2 d3 ~ a2 ~ d3 ~ b2!2 d3 ~ b2 ~ d3 ~",
  M: "b2!2 d3 ~ b2 ~ d3 ~ b2!2 d3 ~ b2 ~ d3 ~", N: "b2!2 d3 ~ b2 ~ d3 ~ g2!2 c3 ~ g2 ~ c3 ~",
  O: "g2!2 c3 ~ g2 ~ c3 ~ g2!2 d3 ~ g2 ~ d3 ~", P: "g2 ~@7 g2!2 c3 ~ g2 ~ c3 ~",
  Q: "g2!2 c3 ~ g2 ~ c3 ~ g2!2 d3 ~ g2 ~ d3 g2", R: "d3 g2 d3 e3 g3@2 ~@10", S: "~@8 g2 b2 c3 ~ g2 ~ c3 ~",
})).s("gm_synth_bass_1").gain(0.43).pan(0.3)

// chords · string ensemble 1 · "LOVESONG*Demixed 03"
const string_ensemble_1 = note("<A@6 B@2 A@6 B@2 ~@25 C@6 D@16 E@3 ~@28 C@6 D@16 F@3 ~>".pickRestart({
  A: "[c2@3 e2 f2@3 e2 d2@3 [e2,e4], c4@2 d4, [g3,e4] a3@2, ~@4 f4@7 ~]/6", // E C
  B: "[c2@3 d2 [g1,b3,d4]@4, g3, [c4,e4] ~]/2", C: "[~ c2@3 e2 f2@3 e2 [d2,d4]@3, ~ c4@8 ~@3, ~ [g3,e4]@4 [a3,f4]@7]/6",
  D: "[[e2,e4]@2 c2@3 d2 [g1,b3,d4]@4 c2@6 e2@2 f2@6 e2@2 [d2,d4]@6, ~ g3@4 [g3,e4]@4 [a3,f4]@7, ~ [c4,e4]@2 ~@2 c4@8 ~@3]/8", // E G D C Dm C
  E: "[[e2,e4]@2 c2@3 d2 [g1,b3,d4]@4 ~@2, ~ g3@4 ~, ~ [c4,e4]@2 ~@3]/3", // E G C
  F: "[[e2,e4]@2 c2@3 d2 [g1,b3,d4]@6, ~ g3@5, ~ [c4,e4]@2 ~@3]/3", // E G C
})).s("gm_string_ensemble_1").gain(0.06).pan(0.2)

// chords · string ensemble 1 · "LOVESONG*Demixed 03" · soft notes · F5 G5 A5 Fdim C5 D5 E5 F5
const string_ensemble_1_soft = note(`<
  ~@14
  [c5 d5 e5 f5 d5 e5 [c5,f5] [d5,g5] e5 f5 [d5,g5] [e5,a5] f5 g5 [e5,a5] [f5,b5]]
  [g5 a5 [f5,b5] [g5,c6] a5 b5 [g5,c6] [a5,d6] b5 c6 [a5,d6] [b5,e6] c6 d6 [b5,e6] [c6,f6]]
  [d6 e6 c6 d6 e6 f6 ~@10]
  ~@103
>`).s("gm_string_ensemble_1").gain(0.03).pan(0.2)

// other · alto sax · "LOVESONG*Demixed 04"
const alto_sax = note(`<
  ~@7 A B C D E F@2 G@2 ~@33 H I J K L M N@2 H I J K L M N@2 ~@37 H I J K L M N@2 H I J K L M N@2 ~@2
>`.pickRestart({
  A: "~@12 [g1,g3]@3 ~", B: "[f2,f4]@5 ~ e4 ~ [e2,e4]@3 ~ [d2,d4]@4",
  C: "~@2 [d2,d4]@3 ~ [e2,e4] ~ [e2,e4]@3 ~ [g1,g3]@3 ~", D: "[f2,f4]@5 ~ e4 ~ [e2,e4]@3 ~ [d2,d4]@3 ~",
  E: "~@2 [d2,d4]@3 ~ e4 ~ [e2,e4]@3 ~ [g1,g3]@4", // D E G
  F: "[[f2,f4]@5 ~ e4 ~ [e2,e4]@3 ~ d4 ~ [d2,d4]@4 ~@6 [e2,e4]@2 d4 ~ c4 ~ [c2,c4] ~]/2", // F E D E C
  G: "[[e2,e4]@10 [f2,f4]@2 e4@2 [d2,d4]@7 ~@11]/2", H: "~@4 [g1,g3]@3 ~ [f2,f4]@5 ~ e4 ~",
  I: "[e2,e4]@3 ~ [d2,d4]@4 ~@2 [d2,d4]@3 ~ [e2,e4] ~", J: "[e2,e4]@3 ~ [g1,g3]@3 ~ [f2,f4]@5 ~ e4 ~",
  K: "[e2,e4]@3 ~ [d2,d4]@3 ~@3 [d2,d4]@3 ~ e4 ~", L: "[e2,e4]@3 ~ [g1,g3]@4 [f2,f4]@5 ~ e4 ~",
  M: "[e2,e4]@3 ~ d4 ~ [d2,d4]@4 ~@6", N: "[[e2,e4]@2 d4 ~ c4 ~ [c2,c4] ~ [e2,e4]@10 [f2,f4]@2 e4@2 [d2,d4]@7 ~@3]/2",
})).s("gm_alto_sax").gain(0.4)

// other · alto sax · "LOVESONG*Demixed 04" · soft notes
const alto_sax_soft = note(`<
  ~@8 A ~ A@2 B C D ~@34 E ~ E@3 F G H E ~ E@3 F G H ~@37 E ~ E@3 F G H E ~ E@3 F G H ~@2
>`.pickRestart({
  A: "~@6 e2 ~@9", B: "~@6 e2 ~@5 d2 ~@3", C: "~@10 d2 ~ c2 ~@3", D: "~@6 e2 ~", E: "~@14 e2 ~", F: "~@4 d2 ~@11",
  G: "~@2 d2 ~ c2 ~@11", H: "~@2 e2 ~@5",
})).s("gm_alto_sax").gain(0.24)

// other · pad halo · "LOVESONG*Demixed 06"
const pad_halo = note(`<
  ~@17 A B C B C D E F G B C B C D E F G B C B C D E F H ~@24 A B C B C B C B C D E F G B C B C D E F G I A I A J ~ I
  ~@26
>`.pickRestart({
  A: "~@7 [c2,c4]", B: "~@2 [c2,c4]@2 ~@2 [c2,c4]@2 ~@2 [c2,c4]@2 ~@2 [c2,c4] ~",
  C: "[c2,c4] ~ [c2,c4]@2 [g1,g3]@2 [f1,f3]@2 ~@6 [c2,c4]@2", // C G F C
  D: "~@2 [c2,c4]@2 ~@2 [c2,c4] ~ [c2,c4]@2 ~ [c2,c4]@2 ~ [c2,c4] ~", E: "[c2,c4] ~ [c2,c4]@2 [g1,g3]@2 [f1,f3]@2 ~@8",
  F: "~@2 [c2,c4]@2 ~@2 [c2,c4]@2 [g1,g3]@2 ~ [g1,g3]@2 ~ [g1,g3] ~", G: "[g1,g3] [c2,c4] [g2,g4] ~@4 [c2,c4]",
  H: "[g1,g3] [c2,c4] [g2,g4] ~@5", I: "~ [c2,c4] ~ [c2,c4] ~@4", J: "~@2 [c2,c4]@2 ~@2 [c2,c4] ~@9",
})).s("gm_pad_halo").gain(0.3)

// other · pad halo · "LOVESONG*Demixed 06" · soft notes
const pad_halo_soft = note(`<
  ~@17 A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~@26 A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~@27
>`.pickRestart({
  A: "~@5 [c2,c4] ~@2", B: "~@5 [c2,c4] ~ [c2,c4]",
})).s("gm_pad_halo").gain(0.2)

// other · lead 3 calliope · "LOVESONG*Demixed 11"
const lead_3_calliope = note("<~@47 A B C ~@13 A B C ~@34 A B C ~@13 A B C ~>".pickRestart({
  A: "~@8 c6 d6 e6 f6 d6 e6 f6 g6", B: "e6 f6 g6 a6 f6 g6 a6 b6 g6 a6 b6 c7 a6 b6 c7 d7",
  C: "b6 c7 d7 e7 c7 d7 e7 f7 ~@8",
})).s("gm_lead_3_calliope").gain(0.17)

// other · lead 3 calliope · "LOVESONG*Demixed 11" · soft notes
const lead_3_calliope_soft = note("<~@49 A ~@15 A ~@36 A ~@15 A ~>".pickRestart({
  A: "~@8 c7 d7 e7 f7 ~@4",
})).s("gm_lead_3_calliope").gain(0.11)

// other · piano · "LOVESONG*Demixed 12"
const piano = note("<A@4 B@2 C D E@4 F@2 G H I ~@30 J K L ~@13 J K L ~@34 J K L ~@13 J K L ~>".pickRestart({
  A: "[g4@18 ~@4 e5@2 ~@4 g4@2 ~@2 a4@18 ~@4 f5@2 ~@4 a4@2 c5 ~, [c2,c3]@31 ~ [f2,f3]@31 ~, e5@22 ~@2 g5@7 ~@19 a4@8 c5@4 ~@2, c5@20 c5@5 e5@7 f5@22 ~@2 a5@7 ~, ~@18 g4@8 c5@4 c5@22 c5@5 f5@6 ~]/4", // C F
  B: "[a4@18 a4@2 ~@2 f5@2 ~@4 a4@2 d5 ~, [d2,d3]@31 ~, f5@22 ~@2 a5@7 ~, d5@10 a4@3 d5@2 ~, ~@20 d5@5 f5@6 ~]/2", // D
  C: "g4@3 [g4,d5,f5], [c2,c3,c5,e5]@15 ~", D: "[g2,g3,g4,b4,d5]@7 ~",
  E: "[g4@18 ~@4 e5@2 ~@9 c#3 ~@20 f5@2 ~@4 a4@2 c5@2, [c2,c3]@30 c5@22 c5@5 f5@6 ~, e5@11 ~ g5@4 a4@9 a4@4 c5@2 ~, c5@20 c5@5 e5@7 f5@22 ~@2 a5@7 ~, ~@18 g4@8 c5@2 g4@4 [f2,f3]@31 ~]/4", // C F
  F: "[a4@9 ~@2 f5 ~@3 d5, [d2,d3]@3 [d2,d3,a5], f5@22 ~@3 f5@7, d5@10 d5@3 d5@2 ~, ~@9 a4@5 a4@2]/2", // D D5
  G: "~ c6 d6 e6 f6 d6 e6 f6 g6 e6 f6 g6 a6 f6 g6 a6", H: "b6 g6 a6 b6 c7 a6 b6 c7 d7 b6 c7 d7 e7 c7 d7 e7",
  I: "f7 ~@15", J: "~@8 c6 d6 e6 f6 d6 e6 f6 g6", K: "e6 f6 g6 a6 f6 g6 a6 b6 g6 a6 b6 c7 a6 b6 c7 d7",
  L: "b6 c7 d7 e7 c7 d7 e7 f7 ~@8",
})).s("gm_piano").gain(0.07)

// chords · piano · "LOVESONG*Demixed 13" · Em Fmaj7 Fsus2 Em F Fsus2 Gsus2 F …
const piano_2 = note(`<
  ~@14
  [~@4 c6 d6 e6 f6 d6 e6 f6 [e6,g6] [e6,f6] [f6,g6] [e6,g6] [f6,a6]]
  [[f6,g6] [g6,a6] [f6,a6] [g6,b6] [g6,a6] [a6,b6] [g6,b6] [a6,c7] [a6,b6] [b6,c7] [a6,c7] [b6,d7] [b6,c7] [c7,d7] [b6,d7] [c7,e7]]
  [[c7,d7] [d7,e7] [c7,e7] [d7,f7] e7 f7 ~@10]
  ~@103
>`).s("gm_piano").gain(0.18)

// chords · piano · "LOVESONG*Demixed 13" · soft notes
const piano_soft = note("<~@14 [~@6 c6 d6 e6 f6 d6 ~@5] ~@105>").s("gm_piano").gain(0.12)

// drums · kick
const kick = s("bd").struct(`<
  ~@25 A B C B@3 C B C B C B@3 C B D ~ E ~ F ~ G H I B C B@3 C B C B C B@3 C J K L ~ E ~ M B C B@3 C B C B C B@3 C B C B
  C B@3 C J N ~ E ~ F ~ G H I B C B@3 C B C B C B@3 C J K ~
>`.pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x ~ x!3 ~ x ~", D: "x ~ x!3 ~@3", E: "x ~@2 x ~@2 x ~ x ~@7", F: "x!2 ~ x!2 ~ x ~ x ~@7",
  G: "~@3 x!2 ~@2 x", H: "x ~@5 x ~ x ~@2 x ~@2 x ~", I: "x!5 ~ x ~ x ~@3 x ~@3", J: "x!2 ~ x ~ x!3",
  K: "x ~ x!2 ~@2 x ~@9", L: "~ x", M: "x!2 ~ x!2 ~ x ~ x ~@3 x ~@3", N: "x ~ x!2 ~@2 x ~ x ~@7",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<~@8 A B A C A D E F ~@104>".pickRestart({
  A: "x ~ x!3 ~ x!2", B: "x ~@3 x ~ x ~ x ~ x ~ x!4", C: "x ~@3 x ~ x ~ x!3 ~ x ~ x ~", D: "x ~@3 x ~ x ~ x!3 ~ x!4",
  E: "x ~@13 x!2", F: "x!16",
})).gain(0.24)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@14 [~ x!13 ~@2] ~@105>").gain(0.08)

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

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

// drums · crash
const crash = s("cr").struct(`<
  ~@17 A@8 B A@16 ~ C ~ D ~ E F G ~@13 A H I A@2 C A D A@22 H J ~ C ~ D ~ E F G ~@13 A H I ~
>`.pickRestart({
  A: "~ x", B: "~ x!2 ~", C: "x ~@2 x ~@2 x ~ x ~@7", D: "x!2 ~ x!2 ~ x ~ x ~@7", E: "~@3 x!2 ~@2 x",
  F: "x ~@5 x ~ x ~@2 x ~@2 x ~", G: "x!5 ~ x ~@9", H: "x ~ x!2", I: "x!2 ~@2", J: "x!3 ~",
})).gain(0.32)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@17 A B@23 C ~@24 A B@27 C ~@25>".pickRestart({
  A: "~@9 x ~@3 x ~@2", B: "~ x ~@3 x ~@3 x ~@3 x ~@2", C: "~ x ~@3 x ~@10",
})).gain(1.53)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~@17 A B@23 C ~@24 A B@27 C ~@25>".pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x!2 ~@2",
})).gain(1.53)

stack(
  bass, string_ensemble_1, string_ensemble_1_soft, alto_sax, alto_sax_soft, pad_halo, pad_halo_soft, lead_3_calliope,
  lead_3_calliope_soft, piano, piano_2, piano_soft, kick, snare, snare_soft, hihat, open_hat, crash, agogo_bells,
  agogo_bells_2
)

More by Mark 'Oh