Strudelify

Hey Lover

LL Cool J

KeyC minorTempo88 bpm
0:00/0:00
// Hey Lover — LL Cool J
// 88 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · epiano1
const epiano1 = note(`<
  ~ 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 A B A B A B A B A B A B A B A B A B ~@2
>`.pickRestart({
  A: "[c4,d4,e4,g4]@3 [c4,eb4,f4,ab4]@5", B: "[c4,eb4,f4,ab4]@3 [d4,f4,bb4]@5",
})).s("gm_epiano1").gain(0.3)

// other · woodblock
const woodblock = note(`<
  ~@8 A B C D E F G F G B C D E F G F G B C D E F G F G B C D E F G F G B C D E F G F G B C D E F G F G B C D E F G F G
  B C D E F G F G B C D E F G F G B C D E F G F G B C D E F G F G B C D E F G ~@2
>`.pickRestart({
  A: "~@14 b4 a4", B: "g4!3 ~ g4 e4 ~ e4!2 ~ e4!3 ~ e4!2", C: "e4 ~ e4!3 ~ e4 f4 g4 f4 e4 ~ e4 ~ e4 ~",
  D: "g4 ~ f4 e4 f4 ~ f4 e4 f4 e4 f4 ~ f4 e4 ~@2", E: "e4 ~ e4 a4 g4 ~ g4 ~ g4 a4 g4 f4 e4 ~ e4!2",
  F: "a4 ~ g4 ~ g4 ~ g4 f4 g4 ~ g4 f4 e4 ~ e4 ~", G: "e4 ~ g4 f4 g4 ~ g4 f4 g4 a4 b4 a4 g4 f4 ~ f4",
})).s("gm_woodblock").gain(0.3)

// chords · percussive organ · Em Ab5 Ab Bb
const percussive_organ = note("<~@7 [[e5,g5]@3 [eb5,ab5]@5, c5@15 ~] [[c5,eb5,ab5]@3 [d5,f5,bb5]@5] ~@96>")
  .s("gm_percussive_organ").gain(0.35)

// other · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~ 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 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~ c4 g4@2 ab4 c4@3",
})).s("gm_electric_guitar_jazz").gain(0.48)

// bass · piano
const bass = note(`<
  ~ 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 A B A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "c1@6 f1@9 ~", B: "f1@6 g1@9 ~",
})).s("gm_piano").gain(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A B@3 C B@7 C B@7 C B@7 C B@7 C B@7 C B@7 C B@7 C B@7 C B@7 C B@7 C B@7 C B@2 ~@2
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@8 [x ~ x!6]!94 ~@2>").gain(0.31)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@9 [~ x ~@6]!94 ~@2>").gain(0.12)

// drums · ride
const ride = s("rd").struct("<~ [x!8]!102 ~@2>").gain(0.31)

stack(epiano1, woodblock, percussive_organ, electric_guitar_jazz, bass, kick, snare, hihat, hihat_soft, ride)