Strudelify
I Wanna Be Your Lover cover art

Prince

I Wanna Be Your Lover

Prince

KeyB majorTempo116 bpm
0:00/0:00
// I Wanna Be Your Lover — Prince
// 116 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 7 piano (copy of ch 6 piano)
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(116/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass
const bass = note(`<
  ~ A B C@2 A B D@2 A B C@2 A B C@2 A B C@2 A B C@2 E@2 F G A B C@2 A B C@2 A B H@2 A B C@2 A B C@2 A B C@2 A B C@2 E@2
  F G A B C@2 A B C@2 A B H@2 A B C@2 A B C@2 A B H@2
>`.pickRestart({
  A: "e1 ~@6 e1@3 d#1@2 e1@2 ~@2", B: "e1@2 ~ e1@3 d#1@10", C: "[e1@2 d#1@2 e1@2 ~@8 f#1@11 ~ f#1@3 g#1@3]/2",
  D: "[e1@2 d#1@2 e1@2 ~@8 f#1@13 ~ f#1@2 e1 ~, ~@28 g#1 ~@3]/2", E: "[e1@14 d#1@17 ~]/2",
  F: "f#1 ~ g#1@2 f#1@2 g#1@2 f#1@2 g#1@2 f#1@2 g#1@2", G: "f#1@2 g#1@2 f#1@2 g#1@2 f#1 ~@7",
  H: "[e1 d#1 e1 ~@4 f#1@4 ~@5]/2",
})).s("gm_fretless_bass").gain(0.51)

// other · epiano2
const epiano2 = note("<~ A@3 ~ A@3 ~@21 A@3 ~ A@3 ~ A@3 ~@21 A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~>".pickRestart({
  A: "f#5 ~@3 f#5 ~@3 f#5@2 ~@2 f#5 ~@3",
})).s("gm_epiano2").gain(0.51)

// chords · piano
const piano = note(`<
  ~ A B C@2 A B D@2 A B C@2 A B C@2 A B C@2 A B C@2 E@4 A B C@2 A B C@2 A B D@2 A B C@2 A B C@2 A B C@2 A B C@2 E@4 A B
  C@2 A B C@2 A B D@2 A B C@2 A B C@2 A B D@2
>`.pickRestart({
  A: "[g#3,b3,e4]@2 ~@5 [g#3,b3,e4]@3 [f#3,d#4] ~ [g#3,b3]@2 ~@2, ~@10 b3@2 e4 ~@3", // E D#m G#m
  B: "[g#3,b3,e4]@2 ~ [g#3,b3,e4]@2 ~ [f#3,b3,d#4]@10", // E B
  C: "[[g#3,d#4,e4] ~ [f#3,d#4] ~ [g#3,b3,d#4,e4] ~@9 [b3,c#4,f#4,f#5]@11 ~ [b3,d#4,g#4]@3 [b3,d#4,f#4]@2 ~, b3!2 ~@14]/2", // Emaj7 D#m Emaj7 Bsus2 G#m B
  D: "[[g#3,d#4,e4] ~ [f#3,d#4] ~ [g#3,b3,d#4,e4] ~@9 [b3,c#4,f#4,f#5]@11 ~@7, b3!2 ~@14]/2", // Emaj7 D#m Emaj7 Bsus2
  E: "[[e2,g#3,b3,e4]@14 [f#3,a#3]@18 [f#2,f#3,a#3,c#4]@24 [f#2,f#3,a#3,c#4] ~@7, ~@7 [d#2,d#4]@16 ~@9]/4", // E F# D#
})).s("gm_piano").gain(0.51)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A B C D A B C D ~@3 E ~@3 E ~@3 E ~@3 E ~@4 A B C D A B C D A B C ~@4 E ~@3 E ~@3 E ~@3 E ~@4 A B C D A B C D A B C
  ~ A B C D A B C D A B C ~
>`.pickRestart({
  A: "~@2 [c#4,d#4] ~ [c#4,d#4] ~@2 [c#4,d#4] ~@8", B: "~@2 [b3,c#4] ~@3 [b3,c#4] ~@9",
  C: "~@2 [b3,d#4] ~ f#4 ~@2 f#4 ~@2 g#4 ~ b4 ~@3", D: "~@2 f#3 ~ g#3 ~ b3 g#3 ~@8", E: "~@2 f#3 ~@13",
})).s("gm_electric_guitar_clean").gain(0.41)

// other · tremolo strings
const tremolo_strings = note("<~@25 A B C@2 ~@28 A B C@2 ~@24>".pickRestart({
  A: "b4", B: "f#4 g#5", C: "[f#5@25 ~@7]/2",
})).s("gm_tremolo_strings").gain(0.2)

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

// drums · snare
const snare = s("sd").struct(`<
  A B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@7 C B@3 C B@3 A B@3 C B@3 C B@3 C B@3 C B@7 C B@3 C B@3 A B@3 C B@3 C B@3 A
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@2 x ~@4 x ~@3",
})).gain(0.51)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@3 B A@3 C A@3 B A@3 B A@3 B A@3 B A@3 C A@3 B A@3 B A@3 ~ A@3 B A@3 B A@3 B A@3 B A@3 C A@3 B A@3 B A@3 ~ A@3 B
  A@3 B A@3 ~
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!4 ~@4",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@7 A ~@3 A ~@3 A ~@3 A ~@2 B C ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@2 B C ~@3 A ~@3 A ~@7 A ~@3 A ~@4
>`.pickRestart({
  A: "~@7 x", B: "~ x ~@3 x ~@2", C: "~ x ~@5 x",
})).gain(0.36)

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

stack(bass, epiano2, piano, electric_guitar_clean, tremolo_strings, kick, snare, hihat, open_hat, crash)

More by Prince