Strudelify

I Know I'll Never Love This Way Again

Cheryl Ladd

KeyE♭ majorTempo65 bpm
0:00/0:00
// I Know I'll Never Love This Way Again — Cheryl Ladd
// 65 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 71 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(65/4)

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

// chords · piano · "Piano LH"
const piano = note(`<
  ~ A B C D A E F G H I J K L M N O L M N O A P A E F G H I J K L M N O L M N O L Q F G H I J K L M N O L M N O L M N O
  L M N O L M N ~@5
>`.pickRestart({
  A: "[bb3,eb4,g4]!2 [c4,eb4,g4]!2", B: "[c4,eb4,f4,ab4]!2 [d4,f4,bb4] [d4,f4,g4,b4]",
  C: "[c4,eb4,g4]!2 [c4,eb4,f4,a4]!2", D: "[d4,f4,bb4]!2 [bb3,d4,f4,ab4] [d4,f4,bb4]",
  E: "[c4,eb4,ab4]!2 [bb3,eb4,g4]!2", F: "[c4,eb4,ab4]!2 [d4,f4,ab4,bb4]!2", G: "[d4,g4,bb4]!2 [eb4,g4,c5]!2",
  H: "[c4,f4,ab4]!2 [d4,g4,bb4]!2", I: "[c4,eb4,ab4]!4", J: "[d4,f4,ab4,bb4]!4",
  K: "[bb3,eb4,g4]!2 [d4,g4,bb4] [d4,f4,bb4]", L: "[eb4,g4,bb4]!2 [eb4,g4,c5]!2",
  M: "[f4,ab4,c5]!2 [f4,bb4,d5] [f4,g4,b4,d5]", N: "[eb4,g4,c5]!2 [eb4,f4,a4,c5]!2",
  O: "[d4,f4,bb4] [d4,f4,ab4] [d4,f4,bb4] [d4,f4,ab4,bb4]", P: "[c4,eb4,f4,ab4]!2 [d4,f4,bb4] [d4,f4,g4,bb4]",
  Q: "[f4,ab4,c5]!2 [f4,bb4,d5]!2", // Fm Bb
})).s("gm_piano").gain(0.27)

// chords · piano · "Piano LH" · soft notes · Bb Ddim Bb Bb7 Eb Cm Fm Bb …
const piano_soft = note(`<
  [~ c-1 ~@14]
  ~@65
  [[d4,f4,bb4] [d4,f4,ab4] [d4,f4,bb4] [d4,f4,ab4,bb4]]
  [[eb4,g4,bb4]!2 [eb4,g4,c5]!2]
  [[f4,ab4,c5]!2 [f4,bb4,d5] [f4,g4,b4,d5]]
  [[eb4,g4,c5]!2 [eb4,f4,a4,c5]!2]
  [[d4,f4,bb4] [d4,f4,ab4] ~@2]
>`).s("gm_piano").gain(0.09)

// other · piano · "Piano RH"
const piano_2 = note("<~ A B C D E ~@6 F ~@8 A G ~@7 F H ~@39>".pickRestart({
  A: "g5 eb5 g5 eb5 g5 eb5 g5 eb5", B: "eb5 c5 f5 eb5 g5 f5 d5 f5", C: "g5 eb5 c5 g4 a4 f4 eb5 c5",
  D: "d5 bb4 ab4 bb4 ab4 bb4 ab4 bb4", E: "g4 ~@3", F: "~@12 ab5 f5 d5 bb4",
  G: "eb5@2 c5@2 f5@2 eb5@2 f5@2 d5@2 ab5 f5 bb4 d5", H: "bb4@3 ~@13",
})).s("gm_piano").gain(0.32).pan(0.7)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@9 A B ~ C D E F G D E F G ~ H I J K L A M N C D E F G D E F G D O K L A M N C D E F G D E F G D E F G D E F G D E P
  ~@5
>`.pickRestart({
  A: "f2@8 g2@7 ~", B: "ab2@13 ~ ab2@2", C: "eb2@6 f2 gb2 g2@4 bb2@3 ~", D: "eb2@5 ~ eb2@2 c3@6 c3 ~",
  E: "f2@7 ~ bb2@4 b2@4", F: "c3@5 ~ c3@2 f2@8", G: "bb2@6 bb2@2 ab2@4 bb2@3 ~", H: "~@7 bb2", I: "eb3@7 ~ c3@7 ~",
  J: "ab2@7 ~ eb2@7 ~", K: "ab2@7 ~ ab2@3 ~ bb2@3 ~", L: "g2@3 ~ c3@3 ~", M: "ab2@5 ~ ab2 ~ ab2@6 ~@2",
  N: "bb2@5 ~ bb2 ~ bb2@7 ~", O: "f2@7 ~ bb2@4 ~@2 bb2!2", P: "c3@5 ~@11",
})).s("gm_acoustic_bass").gain(0.26)

// bass · acoustic bass · "Bass" · soft notes
const bass_soft = note("<~@11 A ~@9 B ~@43 C D E F G H>".pickRestart({
  A: "bb2@7 ~", B: "eb2@5 ~@3", C: "~@3 c3 f2@4", D: "bb2@6 bb2@2 ab2@4 bb2@3 ~", E: "eb2@5 ~ eb2@2 c3@6 c3 ~",
  F: "f2@7 ~ bb2@4 b2@4", G: "c3@5 ~ c3@2 f2@8", H: "~@2 ab2 ~",
})).s("gm_acoustic_bass").gain(0.11)

// chords · synth strings 1 · "String Section"
const synth_strings_1 = note(`<
  ~@13 A B C D A B C E ~@10 A B C D A B C E A F G H I J K L A B C D A B C D A B C D A B C E A B M ~@5
>`.pickRestart({
  A: "[bb4,eb5] [c5,eb5]", B: "[c5,eb5]@2 [bb4,d5] [b4,d5]", C: "[c5,eb5]!2", D: "[bb4,d5]@2 [ab4,d5] [bb4,d5]",
  E: "[bb4,d5]@2 [ab4,d5] ~", F: "[c5,eb5] [bb4,d5]", G: "ab4@3 bb4", H: "g4", I: "ab4 bb4", J: "c5 ab4", K: "bb4",
  L: "eb5 d5", M: "[c5,eb5] ~",
})).s("gm_synth_strings_1").gain(0.1).pan(0.3)

// chords · synth strings 1 · "String Section" · soft notes
const synth_strings_1_soft = note("<~@20 A ~@17 A ~@23 A ~@2 B C D E F C>".pickRestart({
  A: "~@3 [bb4,d5]", B: "~ [c5,eb5]", C: "[bb4,d5]@2 [ab4,d5] [bb4,d5]", D: "[bb4,eb5] [c5,eb5]",
  E: "[c5,eb5]@2 [bb4,d5] [b4,d5]", F: "[c5,eb5]!2",
})).s("gm_synth_strings_1").gain(0.03).pan(0.3)

// other · distortion guitar · "Guitar"
const distortion_guitar = note("<~@38 A B C D E ~@3 F G ~@23>".pickRestart({
  A: "~@7 bb3", B: "bb4@5 ~ bb3@2 bb4@5 ~ bb3@2", C: "bb4@2 c5@2 ab4@8 ~@3 eb5",
  D: "bb4@2 eb5 ~ eb5@2 c5 ab4 c5@2 eb5 ~ f5@3 ~", E: "g5 f5 eb5 d5 f5 eb5 d5 bb4@7 ~@2", F: "~@12 ab5 f5 d5 bb4",
  G: "g4",
})).s("gm_distortion_guitar").gain(0.4).pan(0.6)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@65
  [x ~@2 x!2 ~@2 x]
  [x ~@5 x ~ x ~ x ~ x!3 ~]
  [x ~@2 x!2 ~@2 x]!3
  [x ~@2 x!2 ~@3]
>`).gain(0.11)

// drums · snare
const snare = s("sd").struct("<~@13 [~ x ~ x]!8 ~@10 [~ x ~ x]!33 [~ x ~@2] ~@6>").gain(0.39)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@64 [~@3 x] [~ x ~ x]!6>").gain(0.06)

// drums · clap
const clap = s("cp").struct("<~@21 A@11 ~@15 A ~@7 A ~@7 A ~@7>".pickRestart({
  A: "~ x ~ x",
})).gain(0.33)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@13
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!8
  [x!8]!10
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!36
  [x ~ x!3 ~ x!2 ~@8]
  ~@3
>`).gain(0.28)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@67 [~@8 x ~ x!3 ~ x!2] [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!2 [x ~ x!3 ~ x!3 ~ x!3 ~@3]>")
  .gain(0.06)

stack(
  piano, piano_soft, piano_2, bass, bass_soft, synth_strings_1, synth_strings_1_soft, distortion_guitar, kick,
  kick_soft, snare, snare_soft, clap, hihat, hihat_soft
)