Strudelify

What About Love

Heart

KeyC majorTempo88 bpm
0:00/0:00
// What About Love — Heart
// 88 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 pad halo (copy of ch 5 electric bass finger); ch 6 overdriven guitar (copy of ch 4 distortion guitar)
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/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.

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  A@2 B@2 C@2 D@2 E F G H I H J@2 ~@8 K L K M K N O C@2 D@2 ~@8 K L K M K P@2 ~@8 K L K M K Q ~@8
>`.pickRestart({
  A: "[[d3,f3,a3,d4]@7 ~@3 [c6,c7] [a#5,a#6] [a5,a6]@2 [g5,g6]@2, [d6,d7]@5 ~@3, ~@7 [d3,e3,g3,c4]@9]/2", // Dm C A# A G D C
  B: "[a#3@4 a#3@3 [g5,g6]@5 [f5,f6]@2 [e5,e6]@2, [d3,f3,d4,a5,a6]@7 [d3,e3,g3,c4]@9]/2", // G F E Dm C
  C: "[[d3,f3,a3,d4]@7 ~@3 [c5,c6] [a#4,a#5] [a4,a5]@2 [g4,g5]@2, [d5,d6]@5 ~@3, ~@7 [d3,e3,g3,c4]@9]/2", // Dm C A# A G D C
  D: "[[d3,f3,a#3,d4,a4,a5]@7 [d3,e3,g3,c4,g4,g5]@6 ~@3]/2", E: "[a3,d4]@3 [a#3,d4]@5", F: "[c4,f4]@3 [c4,e4]@3 ~@2",
  G: "[a3,d4]@3 [a#3,d4]@3 ~@2", H: "[c4,f4]@3 [c4,e4]@5", I: "[d4,f4]@3 [d4,f4]@5",
  J: "[d4@8 c4@5 ~@3, [a#3,f4]@13 ~@3]/2", K: "[c4,f4] [d4,f4]", L: "[c4,e4] [c4,e4,g4]@2 [c4,e4]",
  M: "[c4,e4]@2 [c4,f4,a4] [c4,e4,g4]", N: "[c4,e4]@13 ~@3", O: "[a#2,d3,a#3,d4]@13 ~@3",
  P: "[[c4,e4]@3 ~ [c4,e4,g4,a4]@25 ~@3]/2", Q: "[c4,e4]@5 ~@3",
})).s("gm_string_ensemble_2").gain(0.48)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~@16 A B A C A B D E F G F H F I ~@5 A B A J A B D E F G F H F K@2 L M N O P Q R S F G F H F T U V U V U V U V
>`.pickRestart({
  A: "[a2,d3,a3,d4]@3 [a#2,d3,a#3,d4]@5", B: "[c3,f3,c4,f4]@3 [c3,e3,c4,e4]@5",
  C: "[c3,f3,c4,f4]@3 ~@2 [g4,a4] g4 f4, ~@3 [c3,e3,c4,e4]@5", D: "[a#2,d3,a#3,d4]", E: "[e3,g3,e4,g4]@5 ~@3",
  F: "[c3,f3,c4,f4]@3 ~ [d3,f3,d4,f4]@3 ~", G: "[c3,e3,c4,e4]@3 ~ [c3,e3,g3,c4,e4,g4]@6 ~@2 [c3,e3,c4,e4]@3 ~",
  H: "[c3,e3,c4,e4]@2 [a2,f3,c4,f4,a4] [c3,e3,g3,c4,e4,g4]", I: "[c3,e3,c4,e4]@13 ~@3",
  J: "[c3,f3,c4,f4]@6 ~@4 [g4,a4] ~ g4@2 f4@2, ~@3 [c3,e3,c4,e4]@5", K: "[[c3,e3,c4,e4]@3 ~ [c3,e3,c4,e4]@25 ~ c5!2]/2",
  L: "c5@13 ~ c5!2, [d3,f3,d4,f4]", M: "g5 c5 c5@11 ~@2 c5, [g3,c4], g4@7 g4",
  N: "[a#2,f3,a#3,f4,d5]@2 a#4 f4, ~ [a#2,d3,a#3,d4]", O: "[g3,e4,g4]@5 ~ c4 d4 e4@3 f4@3 e4 c4, c3, ~@5 g3@11",
  P: "[f3,a#3]@5 ~@2 g3 a3@4 a#3@4, [d3,d4,f4]@13 ~@3, ~@5 f3@8 ~@3", // A#5 Dm
  Q: "c4 e4 a#4 a4 g4 f4 e5 d5 [e4,c5]@6 a4 c5, [c3,g3]@13 ~@3", // C C5
  R: "[d3,f3,d4,f4,d5]@6 d5 [a4,c5] [d4,g4] d4@6 ~, ~@4 [d3,g3]@3 ~, ~@9 f4 ~@6", // Dm Am G5
  S: "e4 g4 c5 g4 c5 e5 c5 e5 [g4,g5]@3 ~@5, [c3,g3,c4]@5 ~@3", T: "[c3,e3,c4,e4]@12 [c3,e3,c4,e4]@3 ~",
  U: "[d3,g3,b3] [e3,g3,c4]", V: "[d3,f#3,a3,d4]",
})).s("gm_distortion_guitar").gain(0.31)

// bass · electric bass finger
const bass = note(`<
  ~@16 A B A B A B C D E F E F E G ~@5 A B A B A B C D E F E F E H I J K J K J K L M E F E F E G N@6 O ~
>`.pickRestart({
  A: "d2@3 a#1@5", B: "f2@3 c2@5", C: "a#1@4 a#1 a#1@3", D: "c2@4 c2 ~@3", E: "a1 a2 a#1 a#2", F: "c2@2 c3@2 c2!2 c3@2",
  G: "c2@3 ~ c3@3 ~ c2@2 c2@2 c3@3 ~", H: "c2@13 ~@3", I: "c2@2 c2@2 ~ c2@2 ~ c2@2 ~ c2 c2@3 ~",
  J: "a#1@3 ~ a#2@2 ~ a#1 a#1@2 a#1@2 a#2@3 ~", K: "c2@2 c2@2 c3@3 ~ c2@2 c2@2 c3@3 ~",
  L: "d2@3 ~ d3@3 ~ d2@2 d2@2 d3@3 ~", M: "c2@3 ~ c3@3 ~ c2@3 ~@5",
  N: "d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3", O: "d2 d3 d2 d3 ~@12",
})).s("gm_electric_bass_finger").gain(0.35)

// bass · electric bass finger · soft notes
const bass_soft = note(`<
  ~@70
  [~@4 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3]
  [d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3 d2 d3]
>`).s("gm_electric_bass_finger").gain(0.06)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@23 [~@6 x!2 ~@8] ~@18 [~@6 x!2 ~@8] ~@6 [~@11 x!2 ~@3] ~@22>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<[~ x ~ x]!7 ~ [~ x ~ x]!6 ~@58>").gain(0.48)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@49 [~@5 x ~@2 x ~@7] ~@22>").gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@6 A ~@9 B@7 C B@7 D ~@3 B@7 C B@6 D B@7 C B@14>".pickRestart({
  A: "~@7 x", B: "x!4", C: "x!3 ~", D: "x",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@49 [~ x ~@6] ~@22>").gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@16 A ~@3 A ~@2 B A ~ A ~ A ~ A@2 ~@3 A ~@3 A ~@2 B A ~ A ~ A ~ A@2 ~@6 B A ~ A ~ A ~@9
>`.pickRestart({
  A: "x", B: "~ x",
})).gain(0.48)

stack(
  string_ensemble_2, distortion_guitar, bass, bass_soft, kick, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat,
  high_tom, crash
)

More by Heart