Strudelify

Rock My Heart

Haddaway

KeyF minorTempo127 bpm
0:00/0:00
// Rock My Heart — Haddaway
// 127 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(127/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · "SYN BASS 1"
const bass = note(`<
  ~@5 A B A C A B A C A B A C A B A C D E D F D E D G A B A C A B A C A B A C A B A C D E D F D E D G A B A C A B A C A
  B A C A B A C A B A C H I J K H I J K H I J K H I J K H I J L A M A N A M A O A B A C A B A C A B A C A B A C A B A C
>`.pickRestart({
  A: "db2 ~@2 db2 ~@2 db2 ~ eb2!2 ~ eb2!2 ~ eb2 ~", B: "c2 ~@2 c2 ~@2 c2 ~ f2!2 ~ f2!2 ~ f2 ~",
  C: "f2 ~@2 f2 ~@2 eb2 ~ f2!2 ~ f2!2 ~ f2 ~", D: "db2 ~ db2!2 ~ db2!2 ~ eb2!2 ~ eb2!4 ~",
  E: "eb2 ~ eb2!2 ~ eb2!2 ~ f2!2 ~ f2!4 ~", F: "eb2 ~ eb2!2 ~ eb2!2 ~ db2!2 ~ db2!4 ~", G: "eb2 ~ eb2!2 ~ eb2!2 ~@9",
  H: "f2 ~ f2!2 ~ f2 c2 ~ f1!6 c2 ~", I: "f1 ~ f1!2 ~ f1 ab1 ~ db2!6 c2 ~",
  J: "f2 ~ f2!2 ~ f2 c2 ~ f1 ~ f1!2 ~ f1 c2 ~", K: "f1!6 ab1 ~ db2 ~ db2!2 ~ db2 c2 ~", L: "f1 ~@15",
  M: "eb2 ~@2 eb2 ~@2 eb2 ~ f2!2 ~ f2!2 ~ f2 ~", N: "eb2 ~@2 eb2 ~@2 eb2 ~ db2!2 ~ db2!2 ~ db2 ~",
  O: "eb2 ~@2 eb2 ~@2 eb2 ~@9",
})).s("gm_synth_bass_1").gain(0.35)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note(`<
  ~ A B A C A B A C A B A C A B A C A B A C ~@8 A B A C A B A C A B A C A B A C ~@8 A B A C A B A C A B A C A B A C A B
  A C ~@8 D@12 ~@8 A B A C A B A C A B A C A B A C A B A C
>`.pickRestart({
  A: "db3 ~ db4 ~ db3 ~ db4 ~ eb3 ~ eb4 ~ eb3 ~ eb4 ~", B: "eb3 ~ eb4 ~ eb3 ~ eb4 ~ f3 ~ f4 ~ f3 ~ f4 ~",
  C: "f3 ~ f4 ~ f3 ~ f4 ~ f3 ~ f4 ~ f3 ~ f4 ~", D: "f3!2 f4 f3!2 f4 f3!2 f4 f3!2 f4 f3!2 f4 ~",
})).s("gm_synth_brass_1").gain(0.24)

// other · brass section · "BRASS 1"
const brass_section = note(`<
  ~@17 A@4 ~@7 B@2 ~@2 B@2 ~@6 B@2 ~@10 B@2 ~@2 B@2 ~@6 C@2 D E@3 D F@2 ~@11 G@2 H@2 G@2 H@2 ~@8 C@2 D I@3 ~@2 B@2 ~@2
  B@2 ~@7
>`.pickRestart({
  A: "[~@6 ab4@2 g4@3 f4@3 eb4@6 ~@2 ab4@2 g4@3 f4@9 ~@2 ab4@2 g4@3 eb4@3 f4@11 ~@7]/4",
  B: "[~@12 eb5 ~ c5 eb5@3 f5 ~@13]/2", C: "[~@12 eb5 ~ c5 eb5@3 f5 ~@3 [ab4,db5]@2 [g4,c5]@8]/2",
  D: "[ab4,c5] ~ [ab4,c5] [g4,bb4] ~ [g4,bb4] [f4,ab4]@2 [eb4,g4]@2 [f4,ab4]@2 ~@4", // Ab Gm Fm Eb Fm
  E: "[~@6 [ab4,db5]@2 [g4,c5]@4 [eb4,bb4]@2 [f4,c5]@10 ~@4 eb5 ~ c5 eb5@3 f5 ~@3 [ab4,db5]@2 [g4,c5]@8]/3", // Db5 C5 Eb5 F5 Db5 C5
  F: "[~@3 [ab4,db5] [g4,c5]@2 [eb4,bb4] [f4,c5]@5 ~@4]/2", // Db5 C5 Eb5 F5
  G: "[~@8 ab4 ~ ab4 ~ bb4@2 ab4 c5@4 ~ c5!3 ~ c5!3 ~ c5!3 ~]/2",
  H: "[c5!3 ~ c5!3 ~ c5 ~ c5 ~ bb4@2 ab4 f4@3 ab4 ~@13]/2",
  I: "[~@6 [ab4,db5]@2 [g4,c5]@4 [eb4,bb4]@2 [f4,c5]@10 ~@4 eb5 ~ c5 eb5@3 f5 ~@13]/3", // Db5 C5 Eb5 F5
})).s("gm_brass_section").gain(0.6)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@13 A B A C A B A C D E D F D E D ~@9 A B A C A B A C D E D F D E D ~@9 A B A C ~@16 G H G H G H G H G H G ~ I J I K
  I J I L ~@8 A B A M ~@8
>`.pickRestart({
  A: "db4 ~ db4 f4 ~ f4 db4 f4 eb4 ~ eb4 g4 ~ g4 eb4 g4", B: "c4 ~ c4 g4 ~ g4 c4 g4 f4 ~ f4 ab4 ~ ab4 f4 ab4",
  C: "f4 ~ f4 ab4 ~ ab4 f4 ab4 f4 ~ f4 c5 ~ c5 f4 c5", D: "~@2 [db3,ab3] ~@3 [db3,ab3] ~@3 [eb3,bb3] ~@3 [eb3,bb3] ~",
  E: "~@2 [eb3,bb3] ~@3 [eb3,bb3] ~@3 [f3,c4] ~@3 [f3,c4] ~", // Eb5 F5
  F: "~@2 [eb3,bb3] ~@3 [db3,ab3] ~@3 [db3,ab3] ~@3 [db3,ab3] ~", G: "f3@2 c4@2 f3@2 c4 db4 ~ db4 ~ db4 bb3 ~ bb3 ~",
  H: "f3@2 c4@2 f3@2 c4 db4 ~ db4 ~ db4 bb3 ~ c4 ~",
  I: "[db3,ab3]!2 ~ [db3,ab3]!3 [db3,ab3]@2 [eb3,bb3] ~@2 [eb3,bb3] ~@2 [eb3,bb3] ~", // Db5 Eb5
  J: "[eb3,bb3]!2 ~ [eb3,bb3]!3 [eb3,bb3]@2 [f3,c4] ~@2 [f3,c4] ~ [f3,c4] [f3,c4]@2", // Eb5 F5
  K: "[eb3,bb3]!2 ~ [eb3,bb3]!3 [eb3,bb3]@2 [db3,ab3] ~@2 [db3,ab3] ~ [db3,ab3] [db3,ab3]@2", // Eb5 Db5
  L: "[eb3,bb3] ~@2 [eb3,bb3] ~@2 [eb3,bb3] ~@2 [eb3,bb3] ~@6", M: "f4 ~ f4 ab4 ~ ab4 f4 ab4 f4 ~ f4 c5 ~ c5 f4 ~",
})).s("gm_lead_2_sawtooth").gain(0.48)

// other · percussive organ · "ORGAN 2"
const percussive_organ = note("<~@21 A B A C A B A ~@93>".pickRestart({
  A: "db3 ~ ab3 ~ db3 ~ ab3 ~ eb3 ~ bb3 ~ eb3 ~ bb3 ~", B: "eb3 ~ bb3 ~ eb3 ~ bb3 ~ f3 ~ c4 ~ f3 ~ c4 ~",
  C: "eb3 ~ bb3 ~ eb3 ~ ab3 ~ db3 ~ ab3 ~ db3 ~ ab3 ~",
})).s("gm_percussive_organ").gain(0.3).pan(0.2)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth_2 = note(`<
  ~@45
  [~@2 f5 c5 f4 f3 ~ f4 f3 ~ f4 f3 ~@2 bb4 ~]
  [c5@2 eb5 ~ c5@2 eb5 ~@9]
  ~@2
  [~@2 f5 c5 f4 f3 ~ f4 f3 ~ f4 f3 ~@2 bb4 ~]
  [c5@2 eb5 ~ c5@2 eb5 ~@9]
  ~@70
>`).s("gm_lead_2_sawtooth").gain(0.36).pan(0.3)

// other · lead 2 sawtooth · "SAW WAVE" · soft notes
const lead_2_sawtooth_soft = note("<~@46 [~@8 c5@2 eb5 ~ c5@2 eb5 ~] ~@3 [~@8 c5@2 eb5 ~ c5@2 eb5 ~] ~@70>")
  .s("gm_lead_2_sawtooth").gain(0.24).pan(0.3)

// other · agogo
const agogo = note("<~@4 A@17 ~@8 A@16 ~@8 A@20 ~@20 A@27 B>".pickRestart({
  A: "bb4!16", B: "bb4!15 ~",
})).s("gm_agogo").gain(0.24)

// drums · rim
const rim = s("rim").struct(`<
  ~@5
  [~ x ~ x ~ x ~ x]!68
  [~@2 x ~@3 x ~@3 x ~@3 x!2]
  [x!3 ~@3 x ~@3 x ~@3 x!2]!19
  ~@4
  [x!3 ~@3 x ~@3 x ~@3 x!2]!4
  [~ x ~ x ~ x ~ x]!20
>`).gain(0.42)

// drums · kick
const kick = s("bd").struct("<~@5 A@3 B A@19 C A@23 C A@11 B A@28 ~@4 A@24>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x",
})).gain(0.6)

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

// drums · hihat
const hihat = s("hh").struct("<~@5 [x!4]!76 [x ~ x ~ x!3 ~]!12 ~@4 [x!4]!24>").gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A ~@15 B ~@23 B ~@19 A ~@19 C ~@7 D ~@20>".pickRestart({
  A: "~@9 x ~@2 x ~@2 x", B: "~@9 x ~@3 x ~@2", C: "~@10 x ~@2 x ~@2", D: "~@9 x ~@2 x ~@3",
})).gain(0.42)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5
  [~ x ~ x ~ x ~ x]!76
  [~@2 x ~@3 x!2 ~ x ~ x ~@2 x ~]!12
  ~@4
  [~ x ~ x ~ x ~ x]!24
>`).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@28 [~@2 x!2] ~@23 [~@2 x!2] ~@24 [x ~@2 x ~@2 x ~@3 x ~@2 x ~@2]!4 ~@40>")
  .gain(0.24)

// drums · ride
const ride = s("rd").struct("<~@73 [x!8]!20 ~@28>").gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct("<~@9 A@12 ~@8 A@16 ~@8 A@20 ~@28 A@19 B>".pickRestart({
  A: "x!16", B: "x!15 ~",
})).gain(0.24)

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A ~@3 A ~@15 A ~@7 A ~@15 A ~@7 A ~@3 A ~@7 A ~@4 A ~@2 A ~@3 A@2 ~@2 A@2 ~@10 A ~@7 A ~@7 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.24)

// drums · congas
const congas = s("conga:18").struct("<~@77 [x ~@2 x ~@2 x ~@3 x ~@2 x ~@2]!4 ~@40>").gain(1.34)

// drums · shaker
const shaker = s("sh").struct("<~@77 [x!16]!16 ~@28>").gain(0.3)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@77 [~@2 x ~@2 x ~@2 x ~@2 x ~@2 x!2]!16 ~@28>").gain(0.52)

stack(
  bass, synth_brass_1, brass_section, lead_2_sawtooth, percussive_organ, lead_2_sawtooth_2, lead_2_sawtooth_soft, agogo,
  rim, kick, snare, hihat, mid_tom, open_hat, high_tom, ride, tambourine, crash, congas, shaker, woodblocks
)

More by Haddaway