Strudelify

Love Machine, Part 1

Supermax

KeyD minorTempo132 bpm
0:00/0:00
// Love Machine, Part 1 — Supermax
// 132 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 139 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(132/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.

// bass · electric bass finger
const bass = note(`<
  A B C D A B C ~ A B C D A B C ~ A B C D A B C ~ A B C D A B C ~ A B C D A B C ~ A B C D A B C ~ A B C D A B C ~ A B C
  D A B C ~ A B C D A B C ~ E F G@2 H I J K A B C D A B C ~ A B C D A B C ~ A B C D L@4 M@2 N D O@2 P@2 M@2 N D O@2 P@2
  M@2 N D O@2 P@2 M@2 N D O@2 P@2 A B C
>`.pickRestart({
  A: "c2 d2 ~@6", B: "~@3 a1 c2 ~ c2 ~", C: "c2@2 d2@3 ~@11", D: "~@7 a1", E: "g2@4 ~@2 g2 ~ g2@4 ~@2 g2 ~",
  F: "g2@4 ~@2 g2 ~ g2@5 ~ g2 ~", G: "a2@4 ~@2 a2 ~ a2@4 ~@2 a2 ~", H: "bb2@4 ~@2 bb2 ~ bb2@4 ~@2 bb2 ~",
  I: "bb2@4 ~@2 bb2 ~ bb2@5 ~ bb2 ~", J: "c3@4 ~@2 c3 ~ c3@4 ~@2 c3 ~", K: "a2@7 ~@9", L: "[c3@14 bb2@16 a2@31 ~@3]/4",
  M: "[c2@2 d2@2 ~@2 c3 d3 f3@3 [c3,d3] d3 ~ f3@4 ~@4 a1@2 c2@2 ~@2 c2@2 ~@2]/2", // Csus2
  N: "c2@2 d2@3 ~ c3 d3 f3@3 d3 c3 d3 f3@2",
  O: "[c2@2 d2@2 ~@2 d3 c3 g3@3 d3 c3 d3 f3@4 ~@4 a1@2 c2@2 ~@2 c2@2 ~@2, ~@8 d3 ~@23]/2",
  P: "[c2@2 d2@3 ~ d3 c3 g3@3 d3 c3 d3 f3@4 ~@14, ~@8 d3 ~@23]/2",
})).s("gm_electric_bass_finger").gain(0.4)

// other · string ensemble 1
const string_ensemble_1 = note("<~@72 A@2 B@2 C@2 D E ~@59>".pickRestart({
  A: "[d5@18 e5@3 f5@3 a5@8]/2", B: "[e5@11 c5@2 a4@2 c5@16 ~]/2", C: "[d5@18 e5@3 f5@2 a5@9]/2", D: "g5", E: "a5@7 ~",
})).s("gm_string_ensemble_1").gain(0.37)

// bass · piano
const bass_2 = note("<~@8 A@4 B@4 A@4 B@4 ~@56 A@4 B@4 A@4 B@4 A@4 ~@39>".pickRestart({
  A: "[d2@7 ~]/4", B: "[d2@29 ~@3]/4",
})).s("gm_piano").gain(0.4)

// other · acoustic guitar steel
const acoustic_guitar_steel = note("<~@40 [d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~]!32 ~@67>")
  .s("gm_acoustic_guitar_steel").gain(0.34)

// chords · brass section
const brass_section = note(`<
  ~@24 A B A ~ C D C ~ A B A ~ C D C ~ A B A ~ C D C ~ A B A ~ C D C ~ A B A ~ C D C ~ A B A ~ C D C ~ E@2 F G H@2 I J
  ~@20 K@3 L ~ M N ~@6 M N ~@6 M N ~@6 M N ~@6 O P
>`.pickRestart({
  A: "[c5,e5] ~ [d5,f5] ~@13", B: "~@6 [g4,c5] ~ [c5,e5] ~@3 [c5,e5] ~@3", C: "[d5,f5] ~ [e5,g5] ~@13",
  D: "~@6 [a4,d5] ~ [d5,f5] ~@3 [d5,f5] ~@3", E: "[g4@18 a4@3 bb4@3 a5@7 ~]/2", F: "e5@10 c5@3 a4@2 ~", G: "c5@7 ~",
  H: "[bb4@18 c5@3 d5@3 a5@7 ~]/2", I: "g5", J: "a5@7 ~", K: "[e4@7 ~ f4@4 e4@2 f4@9 ~ g4@4 f4@2 g4@18]/3", L: "a4",
  M: "~@4 a5@2 ~@4 g5@3 ~@3", N: "f5@3 ~@3 d5@2 c5@2 d5@2 ~@4", O: "~@6 c4 ~ e4@2 ~@2 e4@2 ~@2", P: "e4 f4 ~@6",
})).s("gm_brass_section").gain(0.29)

// chords · overdriven guitar
const overdriven_guitar = note("<~@56 A@2 B ~ C@4 A@2 B ~ C@4 ~@67>".pickRestart({
  A: "[[a3,d4,f4]@23 ~ [g3,c4,e4]@2 ~@2 [g3,c4,e4]@2 ~@2]/2", B: "[g3,c4,e4] [a3,d4,f4] ~@6",
  C: "[[b3,e4,g4]@57 ~@7]/4", // Em
})).s("gm_overdriven_guitar").gain(0.38)

// chords · pad warm
const pad_warm = note(`<
  A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 C@2 D@2 E@2 F G A@4 B@4 A@4 B@4 A@4 H@4 A@4
  B@4 A@4 B@4 A@4 B@4 A@4 B@4 I@3
>`.pickRestart({
  A: "[[a3,d4,f4]@63 ~]/4", B: "[[b3,e4,g4]@61 ~@3]/4", C: "[g3,bb3,d4,f4]/2", D: "[a3,c4,e4,g4]/2",
  E: "[bb3,d4,f4,a4]/2", F: "[c4,e4,g4,c5]", G: "[e4,g4,a4]",
  H: "[[c4,e4]@7 [f3,bb3,d4]@8 [e3,a3,db4]@16 ~, g3@3 ~@13]/4", I: "[[a3,d4,f4]@3 ~]/3",
})).s("gm_pad_warm").gain(0.22)

// drums · kick
const kick = s("bd").struct("<[x!4]!100 [x ~@3 x ~@2 x] [~@4 x ~@2 x] [~ x!3] [x!4]!35 [x!2 ~@6]>").gain(0.31)

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

// drums · low tom
const low_tom = s("lt").struct("<~@79 [~@5 x!3] ~@59>").gain(0.31)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@79 [~@3 x!2 ~@3] ~@59>").gain(0.31)

// drums · open hat
const open_hat = s("oh").struct("<~@72 [~ x ~@3 x ~@2]!8 ~@59>").gain(0.31)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@24 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@8 B ~@59
>`.pickRestart({
  A: "~@2 x!2", B: "~ x!2 ~@5",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@72 A ~@27 B C ~@2 D ~@7 D ~@7 D ~@7 D ~@7 D ~ D>".pickRestart({
  A: "x", B: "x ~@6 x", C: "~@7 x", D: "x!2 ~@6",
})).gain(0.31)

stack(
  bass, string_ensemble_1, bass_2, acoustic_guitar_steel, brass_section, overdriven_guitar, pad_warm, kick, snare,
  low_tom, hihat, mid_tom, open_hat, high_tom, crash
)