Strudelify

Love Rollercoaster

Ohio Players

KeyC majorTempo120 bpm
0:00/0:00
// Love Rollercoaster — Ohio Players
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 74 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.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · brass section · "Horns"
const brass_section = note(`<
  ~@11 A B C D E B C D E B C D E B C D F G H I J G H I K L M L M L M L M ~@4 A B C D E B C D F N O P Q N O P Q N O P Q N
  O P R S
>`.pickRestart({
  A: "~@6 g4 a4", B: "c5 a4 ~@4 d#5 d5", C: "~ c5 a4@2 ~@8 g4@2 a4@2", D: "c5 a4 ~@5 [c5,e5]",
  E: "[e5,g5]@3 ~ [d5,f5]@3 ~ [c5,e5]@3 ~ g4@2 a4@2", F: "[e5,g5]@3 ~ [d5,f5]@3 ~ [c5,e5]@3 ~@5",
  G: "g5@2 f4@2 g4 ~ f4 ~ [g4,g5]@3 ~@3 g4 ~", H: "a#4 ~ a4 ~ g4 ~ f4 ~ a#4 d5 e5@2 g5@2 a5@2, ~@10 a4 ~ g4 ~ a4 ~",
  I: "[g4,g5]@2 f4 ~ g4 ~ f4 ~ g5@3 ~@5, ~@8 g4 ~@7", // G
  J: "~@2 f5 e5 f5 e5 d5@2 ~@2 [f4,a4] [e4,g4] [f4,a4] [e4,g4] [d4,f4]@2", // F Em F Em Dm
  K: "~@2 [b4,d5]@3 [c5,d#5]@2 ~ [c#5,e5]@6 ~@2", L: "g5 ~ g5 ~ f5 ~ f5 ~ e5 ~@7",
  M: "e5 ~ e5 f5 ~ f5 g5 ~@3 [e5,c6] [d#5,a#5] [e5,c6] [d#5,a#5] [e5,c6] ~", // C D#5 C D#5 C
  N: "d5@2 f4@2 f5@2 f4 ~ [g4,g5]@3 ~@3 g4 ~, ~@4 g4 ~@11", // G
  O: "a#4 ~ a4 ~ d5@2 f4 c5 [a#4,d5] c5 a#4@2 g4@2 a4 ~, ~@4 g4 ~@5 a4 ~@5", // A#
  P: "[g4,d5]@2 f4 ~ f5@2 f4 ~ g5@3 ~@5, ~@4 g4 ~@3 g4 ~@7", Q: "~@4 d5@2 ~ c5 d5 c5 a#4@2 g4@3 ~",
  R: "~@2 d5@2 [a#4,d5] [a4,c5] a#4@2 ~@2 d5@2 [a#4,d5] [a4,c5] a#4@2, ~@2 a#4 ~@3 g4 ~@3 a#4 ~@3 g4 ~", // A# Am A# Am
  S: "d5@2 [g4,d5] [f4,f5]@2 [f4,f5] [g4,g5]@2 ~@8, g4 ~@15", // G5 F G
})).s("gm_brass_section").gain(0.45)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@12 A B A B A B A B A B A B A B A B C ~ C ~ C ~ C ~ A B A B A B A B ~@5 A B A B A B A B C ~ C ~ C ~ C ~ C ~ C ~ C ~
  C@2 ~
>`.pickRestart({
  A: "c3 c4 a#2 a#3 a2 a3 ~@2", B: "a2 a3 a#2 a#3 c3 ~@3", C: "g2!2 ~@2 g2!2 ~@2",
})).s("gm_electric_bass_finger").gain(0.14)

// bass · electric bass finger · "Bass" · soft notes
const bass_soft = note(`<
  ~@13 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ B ~ B ~ C ~ A ~ A ~ A ~ A ~@6 A ~ A ~ A ~ A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@2 D
>`.pickRestart({
  A: "~@5 c4 ~@2", B: "g2@2 g2@2 ~@4 d3@3 ~ a#2 a2 g2@2", C: "~@2 d3@3 d#3@2 ~ e3@6 ~@2", D: "g2@2 g2 f2@2 f2 g2@2 ~@8",
})).s("gm_electric_bass_finger").gain(0.08)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@11 [~@11 x ~@4] ~@15 [~@9 x ~@2 x ~ x ~] ~@46>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@7 ~ B@15 ~ B@6 ~@2 B@8 ~ C@4 B@7 D B@16 ~>".pickRestart({
  A: "x!16", B: "~ x ~ x", C: "x!4 ~@4", D: "~ x ~@2",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 [~@9 x!2 ~@5] ~@23 [~@14 x!2] ~@38>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@11 A B@15 C ~@8 B@8 ~@5 B@8 ~@17>".pickRestart({
  A: "x!3 ~@13", B: "~ x ~@6", C: "~ x!2 ~@5",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@11 [~@8 x!2 ~@6] ~@62>").gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@28 [x ~@2 x!13]!7 [x!9 ~@7] ~@21 [x ~@2 x!13]!16 ~>").gain(0.5)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@28 [~ x!2 ~@13]!7 ~@22 [~ x!2 ~@13]!16 ~>").gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@35 [~@3 x ~@4] ~@38>").gain(0.3)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@7 [~@14 x!2] [x ~@13 x!2]!20 ~@8 [x ~@13 x!2]!8 ~@5 [x ~@13 x!2]!8 ~@17>")
  .gain(1.9)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct(`<
  ~@8
  [~@2 x ~ x ~ x!2 ~@8]!4
  [~@2 x ~ x ~ x!2 ~ x ~ x ~@4]!16
  ~@8
  [~@2 x ~ x ~ x!2 ~ x ~ x ~@4]!8
  ~@5
  [~@2 x ~ x ~ x!2 ~ x ~ x ~@4]!8
  ~@17
>`).gain(1.9)

stack(
  brass_section, bass, bass_soft, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, tambourine, tambourine_soft,
  crash, agogo_bells, agogo_bells_2
)