Strudelify

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: edit a riff to change every repeat.

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

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

// chords · piano
const piano = note(`<
  ~ A B C@2 A D E@2 A D C@2 A D C@2 A B C@2 A D C@2 F@4 A D C@2 A B C@2 A D E@2 A D C@2 A B C@2 A D C@2 A D C@2 F@4 A B
  C@2 A D C@2 A D E@2 A D C@2 A B C@2 A D E@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]@2 ~ [f#3,b3,d#4]@10, ~@3 e4 ~@12", // E G#m 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,b3,e4]@2 ~ [g#3,b3,e4]@2 ~ [f#3,b3,d#4]@10", // E B
  E: "[[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
  F: "[[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