Strudelify

My Love Is Your Love

Whitney Houston

KeyC majorTempo80 bpm
0:00/0:00
// My Love Is Your Love — Whitney Houston
// 80 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · synth bass 2
const bass = note(`<
  ~ A@5 B C D E F A@4 B C D E F A@4 G H G H G H G I A@4 B C D E F A@4 B C D E F A@3 G H G H G H G I J K L M L N L O P H
  G H G H G I G H G H A@4 ~
>`.pickRestart({
  A: "c2@2 c2!2 c2@4 g1@2 g1@2 g1@4", B: "a1@2 a1!2 a1@4 a1@2 a1@6", C: "d2@2 d2!2 d2@4 c2@2 c2@2 c2@4",
  D: "b1@2 b1!2 b1@4 g1@2 g1@6", E: "c2@2 c2!2 c2@4 b1@2 b1@2 b1@4", F: "a1@2 a1!2 a1@4 f1@2 f1@2 f1@4",
  G: "c2@2 a1 g1 c2@4 g1@2 g1@2 ~@2 g1@2", H: "a1@2 a1 e1 a1@4 f1@2 f1@2 ~@2 f1@2",
  I: "a1@2 a1!2 a1@2 a1!2 f1@2 f1!2 f1@2 f1@2", J: "g1@2 g1!2 c2@2 e2@2 b1@2 b1 d2 ~ d2 f2@2",
  K: "c2@2 c2!2 e2@2 g2@2 c3@3 g2 c2@4", L: "g#1@2 g#1!2 c2@2 d#2@2 a#1@2 a#1 d2 ~ d2 f2@2",
  M: "c2@2 c2!2 c2@2 c2!2 c2@2 c2!2 c2@2 c2!2", N: "c2@2 c2!2 e2@2 g2@2 d3@2 ~ c3@3 g2@2, ~@8 c3 ~@7",
  O: "g1@2 g1!2 g1@2 g1!2 g1@2 g1!2 g1@2 g1!2", P: "c2@2 c2 g1 c2@4 g1@2 g1@2 ~@2 g1@2",
})).s("gm_synth_bass_2").gain(0.45).pan(0.6)

// chords · epiano2
const epiano2 = note(`<
  ~ A@5 B C D E F G A@3 B C D E F G A@3 H I H I H I H I A@4 B C D E F G A@2 J K C D E F G A@2 H L H L H L H I M N O P O
  N O Q H L H R H L H S H L H L A@5
>`.pickRestart({
  A: "[g3,c4,e4]@2 [g3,c4,e4]!2 [g3,c4,e4]@4 [g3,a#3,d4]@2 [g3,a#3,d4]@2 [g3,d4]@4, ~@6 a#3 ~", // C Gm G5
  B: "[a3,c4,e4]@2 [a3,c4,e4]!2 [a3,c4,e4]@4 [c4,e4,a4]@2 [c4,e4,a4]@4 [e3,e4]@2", // Am E
  C: "[d3,a3,d4,f4]@2 [d3,a3,d4,f4]!2 [d3,a3,d4,f4]@4 [g3,c4,e4]@2 [c3,g3,c4,e4]@2 [c3,g3,c4,e4]@3 c3", // Dm C
  D: "[b2,g3,b3,d4]@2 [b2,g3,b3,d4]!2 [b2,g3,b3,d4]@4 ~@2 a3 [c4,e4] [b3,d4]@4, ~@2 [g2,g3,d4] ~", // G C Bm G5
  E: "[c3,g3,c4,e4]@2 [c3,g3,c4,e4]!2 [c3,g3,c4,e4]@4 [g3,b3,d4]@2 [g3,b3,d4]@2 [b2,g3,b3,d4]@4", // C G
  F: "[a2,e3,a3,c4]@2 [a2,e3,a3,c4]!2 [a2,e3,a3,c4]@4 [f2,f3,a3,c4]@2 [f2,f3,a3,c4]@2 [f2,f3,a3,c4]@4", // Am F
  G: "[c3,g3,c4,e4]@2 [c3,g3,c4,e4]!2 [c3,g3,c4,e4]@4 [g3,b3,d4]@2 [g3,b3,d4]@2 [g3,d4]@4, ~@6 b3 ~", // C G G5
  H: "[e3,g3,c4]@2 [e3,g3,c4]!2 [e3,g3,c4]@4 [d3,g3,b3]@2 [d3,g3,b3]@2 [d3,g3,b3]@2 [d3,g3,b3]@2", // C G
  I: "[e3,a3,c4]@2 [e3,a3,c4]!2 [e3,a3,c4]@4 [e3,a3,c4]@2 [e3,a3,c4]@2 [e3,a3,c4]@4", // Am
  J: "[g3,c4,e4]@2 [g3,c4,e4]!2 [g3,c4,e4]@4 [g3,b3,d4]@2 [g3,b3,d4]@2 [g3,d4]@4, ~@6 b3 ~", // C G G5
  K: "[a3,c4,e4]@2 [a3,c4,e4]!2 [a3,c4,e4]@4 [c4,e4,a4]@2 [c4,e4,a4]@4 ~ e2, ~@7 [e3,g4]", // Am Em
  L: "[e3,a3,c4]@2 [e3,a3,c4]!2 [e3,a3,c4]@4 [f3,a3,c4]@2 [f3,a3,c4]@2 [f3,a3,c4]@4", // Am F
  M: "[g#3,c4,d#4]!2 [g#3,c4,d#4]@2 [a#3,d4,f4]!2 [d4,f4]@2, ~@6 a#3 ~", // G# A# Dm
  N: "[g3,c4,d#4]!2 [g3,c4,d#4]@2 [g3,c4,d#4]!2 [g3,c4,d#4]@2", // Cm
  O: "[g#3,c4,d#4]!2 [g#3,c4,d#4]@2 [a#3,d4,f4]!2 [a#3,d4,f4]@2", // G# A#
  P: "[g3,c4,e4]!2 [g3,c4,e4]@2 [g3,c4,e4]!2 [g3,c4,e4]@2", Q: "[f3,c4,d4,f4]!2 [g3,c4,d4,f4]!2 [a3,c4,d4,f4]!4",
  R: "[e3,a3,c4]@2 [e3,a3,c4]!2 [e3,a3,c4]@4 [f3,a3,c4]@2 [f3,a3,c4]@2 c4@2 c4@2, ~@3 [f3,a3]", // Am F
  S: "[e3,a3,c4]@2 [e3,a3,c4]!2 [e3,a3,c4]@4 [e3,a3,c4]@2 [e3,a3,c4]@2 c4@2 c4@2, ~@3 [e3,a3]", // Am A5
})).s("gm_epiano2").gain(0.26)

// other · string ensemble 1
const string_ensemble_1 = note("<~@23 A ~@4 A ~@23 A ~@4 A ~@5 B C D E D F ~@4 G H ~@2 I@8 ~>".pickRestart({
  A: "g4 f4 g4 f4 g4 f4 g4 f4 g4 f4 g4 f4 g4 f4 g4 f4", B: "e4 d4", C: "c4", D: "d#4 d4", E: "d#4",
  F: "[g3,f4]!4 [g3,a4]!4", G: "f4 g4 f4 g4 f4 g4 f4 g4 f4 g4 f4 g4 f4 g4 f4 g4", H: "f4 ~@15", I: "c5/8",
})).s("gm_string_ensemble_1").gain(0.21).pan(0.8)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@5 A ~@2 B@2 ~@2 C@2 A D E F@2 ~@2 G@2 ~@10 H@2 ~@2 I ~ J ~ K@2 L M@2 N@2 ~@2 O ~@3 P@2 ~@14 Q@2 ~@14
>`.pickRestart({
  A: "c5 c5@7 ~@8, ~ d5@3 ~@12", B: "[~@16 g4@9 ~@7, ~@7 g4 ~@8, ~@15 a4@4 ~@13]/2",
  C: "[~@16 [e4,c5]@9 ~@7, ~@13 [f4,d5]@5 ~@14]/2", D: "~@8 c5@3 d5@3 e5@2",
  E: "e5!2 ~@2 e5@4, f5@2 e5 ~@5, ~@5 f5@5 ~@6", F: "[d5@9 ~@7 g4@9 ~@7, ~@7 g4 ~@8, ~@15 a4@4 ~@13]/2",
  G: "[~@16 [g4,c5]@11 ~@5, ~@13 [g4,a4,c5,d5]@2 [a4,d5]@3 ~@14, ~@7 [g4,c5] ~@8]/2", // C5 Gsus4 D5 C5
  H: "[~@7 g4@2 g4@11 ~@12, ~@5 [g4,c5]@2 ~@25, ~@6 d5@9 ~@17, ~@3 a4@2 ~@11]/2", // C5
  I: "~@3 e5@2 ~ f5@7 ~@3, ~ d5@4 e5@2 ~@9", J: "e5@2 e5 ~@2 c5@3 d5@6 ~@2, ~ f5 d5 ~@5, ~@3 e5@3 ~@10",
  K: "[~@10 g4 [g4,a4]@3 a4@6 ~ c5 c5@7 ~@3, ~@7 g4 ~@3 d5 ~@4]/2", L: "~@5 c5 c5@7 ~@3, ~@3 d5 ~@4",
  M: "[~ c5@4 c5 d5@2 ~@3 d5@10 ~@8 c5@3, ~ g4@8 ~@23, ~@6 c5@7 ~@19]/2",
  N: "[d5@3 e5@2 e5@2 e5@2 ~@4 e5@8 d5@9 ~@2, ~@5 f5@4 e5@2 ~@21, ~@10 f5@5 ~@17]/2", O: "~@9 g3@3 ~@4",
  P: "[~@7 a3@2 ~@7, ~@7 g3 ~@8]/2", Q: "[~@7 g3@5 ~@4]/2",
})).s("gm_electric_guitar_jazz").gain(0.1).pan(0.8)

// chords · piano
const piano = note("<~@25 A@2 ~@2 B C ~@7 D ~@8 E ~@38>".pickRestart({
  A: "[~@12 g5 ~ g5 ~@3 c5@11 ~@3, ~@12 c5@5 e5@12 ~@3, ~@13 a5@2 g5@14 ~@3]/2", B: "~@14 g5 a5",
  C: "g5@2 ~ c5@11 ~@2, ~ e5@6 ~", D: "~@5 g5 c6 ~ g5@2 ~ e5@3 ~@2",
  E: "~@8 [g5,b5] d5 g5 [a4,d6,a6,c7]@2 [d6,g6,b6] ~@2, ~@8 [g6,b6]@2 ~@3 b4@2 ~", // G D7 G
})).s("gm_piano").gain(0.34).pan(0.3)

// chords · epiano2
const epiano2_2 = note(`<
  ~@4 A ~@6 B C D ~@6 B C D ~@10 A ~@7 B E D ~@6 B C D ~ F G ~ H F I@3 ~@5 J@2 K L@3 H ~@4 M@2 ~@6
>`.pickRestart({
  A: "~@6 [e4,a4,c5]@2 [g4,a#4] ~ [a#3,g4]@2 [d4,f4] ~@3, ~@10 e4 ~@5", B: "~@5 [c4,e4,g4]@7 ~@4",
  C: "~@5 [g3,a#3,d4]@7 ~@4", // Gm
  D: "~@5 e4 [a4,c5]@2 [g4,a#4] ~ [a#3,e4,g4]@2 [d4,f4] ~@3, ~@5 [g3,c4]@7 ~@4, ~@3 e4@2 ~@3", // Am Gm Edim Dm C5
  E: "~@6 [e4,a4,c5]@2 [g4,a#4] ~ [a#3,g4]@2 [d4,f4] ~@3, ~@5 [g3,d4]@7 ~@4, ~@5 a#3@5 e4 ~@5", // Am Gm D# Dm G5
  F: "~@7 g3 a3@2 [c3,g3]@2 ~ [c3,a3]@2 ~, ~@7 c3@3 ~@6", G: "[c3,g3]@5 ~@11", H: "~@12 c5 ~@3, ~@11 [e4,a4,d5]@3 ~@2",
  I: "[[c3,g3]@5 ~@5 b5@2 c6@2 d6 c6@2 a5@2 g5@3 ~ a5@3 c6 b5@2 a5@2 [d#5,g#5,c6]@7 ~@10]/3", // C5 G#
  J: "[~@16 [c4,d4] [f3,f4] ~@2 [c4,d4] [g3,f4] ~@2 c4 a3 ~@2 c4 a3@2 ~, ~@7 [c4,d4] ~ [c4,d4] ~ [c4,d4] d4 [c4,d4] d4 ~, ~@15 [f3,f4]@2 ~@2 [g3,f4]@2 ~@2 [a3,f4]@2 f4@2 [a3,f4]@2 f4 ~@2]/2", // Csus2 F Csus2 G7 Csus2 F G7 Dm
  K: "~@3 e6@4 d6@2 ~ d6@2 c6@2 ~@2",
  L: "[~ b5 c6 b5@4 g3 a3@2 [c3,g3]@2 ~ b5 c6 ~@3 g5@4 ~@4 b5@2 c6@2 d6 c6@2 g5@3 ~@12, ~@7 c3@3 ~@3 [c3,a3]@2 b5@2 ~@31, ~@16 [c3,g3]@5 ~@27]/3", // C5 F C5
  M: "[~@6 g3 a3@2 [c3,g3]@2 ~ [c3,a3]@2 ~ [c3,g3]@5 ~@10 c6@2, ~@6 c3@3 ~@23]/2", // C5 F C5
})).s("gm_epiano2").gain(0.14).pan(0.3)

// other · pan flute
const pan_flute = note(`<
  ~ A B A C ~@7 A@2 ~@7 A@3 D E F G D E F G A@4 ~@6 A@2 ~@7 A@2 D E F G D E F G ~@8 D E F G D E F G D E F G D E F G ~
>`.pickRestart({
  A: "~@2 c5 ~ c5@2 a#4@4 g4@2 a#4@4", B: "~@2 c5@2 c5 ~ a#4@4 g4@2 a#4@4", C: "~@2 c5 ~ c5@2 a#4@4 g4@2 a#4@3 ~",
  D: "c5@2 ~ g4@2 ~ c5@2 d5@3 c5@3 d5 ~", E: "c5@2 ~ c5@2 ~ d5 ~ a4@3 g4@3 ~@2",
  F: "~@2 d5 e5!4 d5 ~ d5@2 d5 b4@2 a4@2", G: "~@2 c5 a4 c5 a4 c5 a4 c5@2 c5 a4 g4@2 a4 ~",
})).s("gm_pan_flute").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~ A@22 B A@28 B A@8 C@8 A@16 ~>".pickRestart({
  A: "x ~ x!2 ~@4 x ~ x ~@5", B: "x ~ x!2 ~ x ~ x!2 ~ x!2 ~@4", C: "x ~ x!2 ~@4 x ~ x!2 ~@2 x ~",
})).gain(0.61).pan(0.4)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@23 A B@8 ~@20 A B@8 C@8 B@16 ~>".pickRestart({
  A: "~ x ~@4 x ~@2 x ~@4 x ~", B: "~@3 x ~@3 x", C: "~@6 x ~@6 x ~@2",
})).gain(0.2).pan(0.4)

// drums · rim
const rim = s("rim").struct("<~ A@61 B A B A C A B A@16 D>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@5 x!2 ~@3 x", C: "~@4 x ~@5 x!2 ~@2 x!2", D: "~@3 x",
})).gain(0.61).pan(0.4)

// drums · clap
const clap = s("cp").struct("<~@77 [~ x ~ x]!8 ~>").gain(0.41).pan(0.4)

// drums · snare
const snare = s("sd").struct("<[~@3 x] ~@85>").gain(0.61).pan(0.4)

// drums · hihat
const hihat = s("hh").struct("<A B@22 C@8 D B@20 C@8 E F@8 G C@6 E G C@7 ~>".pickRestart({
  A: "x ~ x ~ x ~ x!2", B: "x!8", C: "~@2 x!2 ~@2 x!2", D: "~ x!7", E: "~@4 x ~ x ~@5 x ~ x!2",
  F: "x ~ x!3 ~ x!3 ~ x ~ x ~ x!2", G: "x ~ x!2 ~@2 x!2",
})).gain(0.41).pan(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~@61 [~ x ~ x ~@5 x ~ x ~@4]!8 ~@17>").gain(0.27).pan(0.4)

// drums · shaker
const shaker = s("sh").struct("<~ [x ~ x!3 ~@3 x ~ x ~ x ~@3]!59 [x!4]!25 [~@3 x]>").gain(0.61).pan(0.4)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@60 [~@2 x!2 ~@6 x ~@5]!25 ~>").gain(0.41).pan(0.4)

stack(
  bass, epiano2, string_ensemble_1, electric_guitar_jazz, piano, epiano2_2, pan_flute, kick, kick_soft, rim, clap,
  snare, hihat, tambourine, shaker, shaker_soft
)

More by Whitney Houston