Strudelify
Life cover art

The Album

Life

Haddaway

KeyC minorTempo129 bpm
0:00/0:00
// Life — Haddaway
// 129 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 136 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(129/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.

// other · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~ A@3 B A@3 C ~@25 A@3 B A@3 B A@3 B A@3 B ~@8 D E D E ~@8 A@3 B A@3 B A@3 B A@3 B ~@16 D E D E ~@8 A@3 B A@3 B A@3 B
  A@3 B ~@6
>`.pickRestart({
  A: "c4 ~ c4 ~ eb4 ~ c4 ~ f4 ~ c4 ~ eb4 ~ d4 ~", B: "c4 ~ c4 ~ eb4 ~ c4 ~ f4 ~ c4 ~ f4 ~ g4 ~",
  C: "c4 ~ c4 ~ eb4 ~ c4 ~ f4 ~ c4 ~@5", D: "~@15 [g3,c4]",
  E: "[bb3,eb4] [g3,c4] ~ [g3,c4] ~ [g3,c4] [c4,f4] [g3,c4] [bb3,eb4] [g3,c4] ~ [g3,c4] ~ [g3,c4] ~@2", // Eb5 C5 F5 C5 Eb5 C5
})).s("gm_pad_poly").gain(0.46)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@10 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A@3 E A B C D A B
  C D A B C D A B C D A B C D A B C D A B C D A B C D ~@8 A@3 E A B C D A B C D A B C D A B C D F G H I F G H I ~@6
>`.pickRestart({
  A: "c2@2 ~@2 c2 ~@3 c2@3 c2 c2@2 bb1@2", B: "eb2@2 ~@2 eb2 ~@3 eb2@3 eb2 eb2@2 eb2@2",
  C: "bb1@2 ~@2 bb1 ~@3 bb1@3 bb1 bb1@2 bb1@2", D: "f1@2 ~@2 f1 ~@3 f1@3 f1 g1@2 bb1@2",
  E: "c2@2 ~@2 c2 ~@3 c2@3 c2 c2@2 ~@2", F: "c2", G: "eb2", H: "bb1", I: "f2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  ~ A ~ B C A ~ B D@2 ~@8 E F G@2 H I J@2 E F G@2 H I K@2 L M@2 N L M@2 N O@8 ~@12 E F G@2 H I K@2 L M@2 N L M@2 N O@8
  ~@8 L M@2 N P Q@3 ~@6 R S P Q@3 L M@2 N L M@2 N A ~ B C A ~ B D@2 ~@5
>`.pickRestart({
  A: "~ c4 ~@2", B: "~@2 c4@2 ~ c4@2 ~", C: "eb4@2 c4@3 ~ bb3@3 ~ c4@5 ~",
  D: "[g4@2 f4@3 ~ g4@3 ~ f4@9 eb4@2 ~ f4@4 eb4@6]/2", E: "~@4 c4@5 ~ d4@5 ~", F: "c4 ~ bb3@4 g3@10",
  G: "[~@4 bb3@2 g3 ~ bb3@2 c4@4 a3@4 g3@2 f3@11 ~]/2", H: "~@4 c4@6 d4@5 ~", I: "c4 bb3@2 g3@5",
  J: "[~@4 bb3@2 g3@2 bb3@2 c4@4 c4@15 ~@3]/2", K: "[~@2 g3!2 eb4 d4@2 d4@2 c4@5 ~@2]/2", L: "~@4 eb4@6 d4@5 ~",
  M: "[f4 ~ eb4@4 d4@4 eb4@4 d4@5 ~ d4@6 eb4@6]/2", N: "d4@2 c4@13 ~",
  O: "[~@4 [eb4,g4] ~ [d4,f4]@2 [c4,eb4] ~ [d4,f4]@3 ~ [eb4,g4]@6 [d4,f4]@4 [c4,eb4]@2 [c4,eb4]@2 [eb4,g4]@2 [d4,f4]@11 ~@3 [eb4,g4]@2 [d4,f4]@8 [c4,eb4]@7 ~@3]/4", // Eb Dm Cm Dm Eb Dm Cm Eb …
  P: "~@3 [eb4,g4] [d4,f4] [c4,eb4]!2 [g3,bb3]", // Eb Dm Cm Gm
  Q: "[[bb3,d4]@2 [c4,eb4]@8 [eb4,g4]@2 [eb4,g4]@2 [d4,f4]@12 [eb4,g4] ~ [d4,g4]@2 [c4,f4]@4 [c4,f4] ~ [c4,f4]@2 [bb3,eb4]@2 [c4,f4] [bb3,eb4] [g3,c4]@2 [bb3,eb4]@2 [c4,f4]@2]/3", // Bb Cm Eb Dm Eb G5 F5 Eb5 …
  R: "~@2 c4@2 eb4@2 f4 eb4", S: "f4 g4 bb4 g4@3 ~@2",
})).s("gm_electric_guitar_jazz").gain(0.56)

// other · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@10 A B C D A B C A ~@32 A B C D A B C A ~@28 A B C D A B C A ~@12 A B C D A B C A ~@22
>`.pickRestart({
  A: "c5@2 ~@2 c5@2 ~@2 c5@2 g4 bb4 c5@2 eb5@2", B: "c5@2 ~@2 c5@2 ~@2 c5@2 g4 bb4 c5@2 f5@2",
  C: "c5@2 ~@2 c5@2 ~@2 c5@2 f4 bb4 c5@2 eb5@2", D: "c5@2 ~@2 c5@2 ~@2 eb5@2 f4 g4 bb4@2 c5@2",
})).s("gm_rock_organ").gain(0.56)

// other · rock organ · "ORGAN 3" · soft notes
const rock_organ_soft = note(`<
  ~@10 A@2 B@2 A@2 B@2 ~@32 A@2 B@2 A@2 B@2 ~@28 A@2 B@2 A@2 B@2 ~@12 A@2 B@2 A@2 B@2 ~@22
>`.pickRestart({
  A: "~ g4 ~ g4 ~@4", B: "~ f4 ~ f4 ~@4",
})).s("gm_rock_organ").gain(0.32)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@34 A B@2 A@2 B@2 A@2 C D@2 A C E@3 ~@19 A B@2 A@2 B@2 A@2 C D@2 A C E@3 ~@27 A B@2 A@2 B@2 A ~@14
>`.pickRestart({
  A: "c6", B: "[bb5@5 c6@2 bb5@9]/2", C: "eb6", D: "[bb5@5 c6 d6 c6@7 bb5@2]/2", E: "[bb5@10 c6@2 d6@2 c6@19 ~@15]/3",
})).s("gm_string_ensemble_1").gain(0.25)

// bass · synth bass 1 · "SYN BASS 1"
const bass_2 = note(`<
  ~ A B C A@2 B C A ~ A B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@6
  B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B D A ~@4 A B C A@6 B D A@2 B D A@2 B D A@2 B D A@2 B D A@2 B
  D E@6 ~
>`.pickRestart({
  A: "c3!16", B: "eb3!16", C: "d3!16", D: "bb2!16", E: "[c3!12 c3@76 ~@8]/6",
})).s("gm_synth_bass_1").gain(0.3)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  A@4 B C@3 D@2 E@3 F E@3 F ~@16 E@3 F E@3 F E@3 F E@3 F E@3 F E@3 F ~@12 E@3 F E@3 F E@3 F E@3 F E@3 F E@3 F G@3 B G@3
  B ~@4 E@3 F E@3 F E@3 F E@3 F G@3 B G@3 B H@5 ~
>`.pickRestart({
  A: "[~ [c4,g4] [eb3,g4] [d4,f4], [c2,c3] [bb2,bb3], ~ eb4@2 ~]/4", B: "[f2,c3,a3,c4,f4]",
  C: "[[c2,c3,c4,g4] [eb3,g4] [d3,d4,f4], eb4@2 ~, ~ [bb2,bb3]@2]/3", D: "[[c3,a3,c4,f4] ~, f2]/2",
  E: "[[c2,c4,g4] [eb2,g4] [bb1,d4,f4], eb4@2 ~, ~ bb3@2]/3", F: "[f2,a3,c4,f4]",
  G: "[[c2,c3,c4,g4] [bb2,eb3,g4] [bb2,d3,d4,f4], eb4@2 ~, ~ bb3@2]/3", // C5 Eb Bb
  H: "[~@41 g4@32 ~@7, c2@9 ~, ~@7 [c3,g3]@65 ~@8, ~@8 c4@65 ~@7, ~@24 f4@49 ~@7]/5", // C5
})).s("gm_synth_strings_2").gain(0.4)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~@26 A ~@3 A ~@2 B ~@7 C D ~@2 C D ~@15 A ~@3 A ~@10 C D ~@2 C D ~@19 A ~ A ~@16 C D ~@13
>`.pickRestart({
  A: "[c3,g3]@2 ~@2 [c3,g3]@3 ~@9", B: "~ [c3,g3]", C: "~@10 [f2,c3] [gb2,db3] [g2,d3]@2 [bb2,f3]@2",
  D: "[c3,g3]@3 ~@13", // C5
})).s("gm_distortion_guitar").gain(0.56)

// other · guitar harmonics · "GTHARMONIC"
const guitar_harmonics = note("<A ~@8 A ~@15 B ~@35 A ~@7 C ~@23 C ~@35 D@2 ~@5>".pickRestart({
  A: "[g3,g4]@11 c4@5", B: "~@2 [g2,g3]@11 c4@3", C: "[g3,g4]", D: "[~@15 d4@5 [g3,g4]@6 ~@6]/2",
})).s("gm_guitar_harmonics").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@10 A@3 B A@3 C A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 C A@3 B A@3 D A@3 B A@3 B A@3 B A@3 B
  A@3 B A@3 B E ~@7 A@3 C A@3 B A@3 B A@3 B A@3 B E F E ~ E F E ~@7
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x!3 ~", D: "x!2 ~@2", E: "x", F: "~@7 x",
})).gain(0.64)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@9 [~@8 x!5 ~@3] ~@59 [~@8 x!5 ~@3] ~@30 [~@14 x!2] [~@2 x!10 ~@4] ~@34>")
  .gain(0.24)

// drums · clap
const clap = s("cp").struct("<~@17 A ~@43 A B@2 ~@2 B@2 ~ A ~@31 A B@3 A ~@30>".pickRestart({
  A: "~@4 x ~@4 x ~@2 x ~@3", B: "~@5 x ~ x",
})).gain(0.4)

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

// drums · open hat
const open_hat = s("oh").struct("<~@5 A@4 ~ A@84 ~@4 A@7 B A@16 ~@6 A@8>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4",
})).gain(0.48)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@34 [x!4]!24 ~@12 [x!4]!24 ~@42>").gain(0.32)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@10 [~@14 x!2]!84 ~@8 [~@14 x!2]!20 ~@14>").gain(1.22)

// drums · shaker
const shaker = s("sh").struct("<~@5 A@4 ~ A@84 ~@4 A@7 B A@16 ~@6 C ~@7>".pickRestart({
  A: "x!16", B: "x!10 ~@6", C: "x!3 ~@13",
})).gain(0.4)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@10 [x!2 ~@14]!84 ~@8 [x!2 ~@14]!20 ~@14>").gain(0.24)

stack(
  pad_poly, bass, electric_guitar_jazz, rock_organ, rock_organ_soft, string_ensemble_1, bass_2, synth_strings_2,
  distortion_guitar, guitar_harmonics, kick, snare, snare_soft, clap, hihat, open_hat, crash, tambourine, cabasa,
  shaker, shaker_soft
)

More by Haddaway