Strudelify
I Wish It Would Rain cover art

1968 · Wish It Would Rain

I Wish It Would Rain

The Temptations

KeyB♭ majorTempo88 bpm
0:00/0:00
// I Wish It Would Rain — The Temptations
// 88 bpm, 4/4, key Bb major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 62 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 · electric guitar clean · "I WISH IT WOULD RAIN            ;Norman Whitfield / Barrett Strong / Rodger Penzabene"
const electric_guitar_clean = note(`<
  ~@12 A@2 B C ~@2 A@4 C@2 A@2 B C D E F E ~@8 A@4 C@2 A@2 B C G E ~@10
>`.pickRestart({
  A: "~@4 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@5", B: "~@4 [eb4,a4,c5] ~@5 [eb4,a4,c5] ~@5",
  C: "~@4 [g4,bb4,eb5] ~@5 [g4,bb4,eb5] ~@5", D: "[d4,f4,bb4]@15 ~", E: "[eb4,g4,bb4]@15 ~", F: "[d4,f4,bb4]@13 ~@3",
  G: "[d4,f4,bb4]@7 ~", // Bb
})).s("gm_electric_guitar_clean").gain(0.38).pan(0.8)

// bass · fretless bass
const bass = note(`<
  A B A C D@6 E@2 D@2 F E G B D@4 E@2 D@2 H E G I G I J K L M L K N O D@4 E@2 D@2 H E G I J K L M J K L M J K
>`.pickRestart({
  A: "bb1@6 bb1@2 bb1@5 ~ bb1@2", B: "eb2@6 eb2@2 eb2 ~ eb2@2 d2@2 c2@2", C: "eb2@5 ~ eb2@2 eb2@2 eb2@2 d2@2 c2@2",
  D: "bb1@3 ~ bb1@2 bb1@2 bb1@2 bb1@2 ~@2 bb1@2", E: "eb2@3 ~ eb2@2 eb2@2 eb2@2 eb2@2 ~@2 eb2@2",
  F: "f2@3 ~ f2@2 f2@2 f2@2 f2@2 ~@2 f2@2", G: "bb1@15 ~", H: "f2@3 ~ f2@2 f2@2 f2@2 f2@3 ~ f2@2", I: "eb2@15 ~",
  J: "bb1@11 ~ bb2@4", K: "eb2@11 ~ eb2@4", L: "bb1@11 ~ bb2@3 ~", M: "eb2@11 ~ eb2@3 ~",
  N: "bb1@3 ~ bb1@4 bb1@3 ~ bb1@3 ~", O: "bb1@3 ~ bb1@3 ~ bb1@3 ~ bb1@3 ~",
})).s("gm_fretless_bass").gain(0.44)

// chords · piano
const piano = note("<A B C B D@2 ~@10 C B ~@10 A E A F ~@18 A E ~@10>".pickRestart({
  A: "~@8 [f3,bb3]@2 [d3,bb3,d4]@2 [c3,c4] [bb2,bb3] [c3,c4]@2, bb1@3 ~, ~ f3@3 [eb3,eb4]@2 ~@2, ~@2 bb3@2 ~ f3@3, ~@3 c4@3 ~@2", // Bb5 Gm C Bb C Eb
  B: "[eb2,g3,bb3,eb4,g4]@5 [eb2,g3,bb3,eb4,g4] [d2,f3,bb3,d4,f4] [c2,g3,c4,eb4]", // Eb Bb Cm
  C: "f3@2 ~@6 [f3,bb3]@2 [d3,bb3,d4]@2 [c3,c4] [bb2,bb3] [c3,c4]@2, bb1@3 ~, d4@5 f3@3, bb3@2 bb3 c4@3 ~@2, ~ f3@3 [eb3,eb4]@2 ~@2", // Bb5 Gm C Bb C Eb
  D: "[[bb1,f3,bb3,d4]@13 ~ [bb1,e3,db4]@2 [bb1,f3,d4]@15 ~, ~@14 bb3@17 ~]/2", // Bb Bbdim Bb
  E: "~@4 bb3@2 eb4 ~ [g3,bb3,eb4,g4]@2 [f3,f4]@2 [eb3,eb4] [bb2,bb3] [eb3,eb4]@2, eb2, eb4@3 ~@5, bb3 ~@3, ~ g3@3 ~@4", // Eb F Eb Bb Eb
  F: "~@4 bb3@2 eb4 ~ [g3,bb3,eb4,g4]@2 [f3,f4]@2 [eb3,eb4] [bb2,bb3]@3, eb2, eb4@3 ~@5, bb3 ~@3, ~ g3@3 ~@4", // Eb F Eb Bb
})).s("gm_piano").gain(0.32).pan(0.3)

// chords · epiano1 · A Bb Eb
const epiano1 = note(`<
  ~@4
  [~@7 [a2,bb3,db4,e4]]
  [[bb2,bb3,d4,f4]@7 ~]
  ~@38
  [[eb2,bb3,eb4,g4]@2 [eb2,bb3,eb4,g4]!2 [eb2,bb3,eb4,g4]@2 [eb2,bb3,eb4,g4] [eb2,bb3,eb4,g4]@3 [eb2,bb3,eb4,g4]@4 ~ [bb3,eb4,g4]]
  [[bb3,eb4,g4] [bb3,eb4,g4]@2 [bb3,eb4,g4] [bb3,eb4,g4]@2 [bb3,eb4,g4] [bb3,eb4,g4]@5 ~@4]
  ~@16
>`).s("gm_epiano1").gain(0.19).pan(0.4)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@4 A@2 ~@12 B@4 C@2 B@2 D C ~@4 E F E G H I H@2 B@4 C@2 B@2 D C ~@2 E F E G H I H I E F
>`.pickRestart({
  A: "~@4 bb3 f3 ~ bb3 ~ f3 ~@2 bb3 f3 ~@2", B: "~@2 f3!2 ~ f3!2 ~ f3 ~ f3 ~@5", C: "~@2 g3!2 ~ g3!2 ~ g3 ~ g3 ~@5",
  D: "~@2 a3!2 ~ a3!2 ~ a3 ~ a3 ~@5", E: "~@4 bb3!2 ~ bb3 ~ f3 bb3 ~ bb3 ~ [db4,d4] ~", F: "bb3@11 ~@5", G: "bb3@5 ~@3",
  H: "bb3!5 f3 ~ bb3 ~ f3 bb3 ~ bb3 ~ [db4,d4] ~", I: "bb3@13 ~@3",
})).s("gm_electric_guitar_muted").gain(0.33).pan(0.9)

// chords · pad warm
const pad_warm = note("<~@6 A@4 B@2 C@2 D E ~@2 A@4 B@2 C@2 D E ~@12 A@4 B@2 C@2 D E ~@12>".pickRestart({
  A: "[bb3,d4,f4]/4", B: "[bb3,eb4,g4]/2", C: "[bb3,d4,f4]/2", D: "[a3,c4,eb4]", E: "[g3,bb3,eb4]",
})).s("gm_pad_warm").gain(0.18)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@17 A B ~ C D E@2 F@2 ~@6 G H G I G H J@2 K ~ C D E@2 F@2 ~@4 L M L M L M L M L M
>`.pickRestart({
  A: "~@8 bb5 a5 ab5 g5 f5 eb5 d5 c5", B: "bb4@9 ~ f3!2 g3 bb3 ~@2", C: "~@10 [f3,f4]!2 [g3,g4] [bb3,bb4]!2 ~",
  D: "~@10 [f3,f5]!2 [g3,g5] [bb3,bb5] ~@2", // F G Bb
  E: "[bb3@9 ~ bb3 c4@2 bb3 g3 ~ [g3,bb3]@8 ~ [f3,f5] [g3,g5] [f3,f5] [g3,g5] [bb3,bb5] ~@2, eb4@3 ~, g3@7 ~@9]/2", // Gm F G F G Bb
  F: "[bb3,d4,f4]/2", // Bb
  G: "~@2 [d3,d4,bb4,bb5,d6] [eb3,eb4,c5,c6,eb6] [f3,f4,d5,d6,f6] ~ [d3,d4,bb4,bb5,d6] [eb3,eb4,c5,c6,eb6] [f3,f4,d5,d6,f6]@8", // Gm Cm Dm Gm Cm Dm
  H: "~@2 [eb6,g6] [bb5,f6] [g5,eb6]@2 [f5,bb5]@2 [eb5,g5]@2 [g5,bb5]@2 [bb5,eb6]@2 [bb5,g6]@2, [g3,bb3,eb4,g4]", // Eb Bb5 Cm Bb5 Eb Gm Eb5 Eb
  I: "~@2 [eb6,g6] [bb5,f6] [g5,eb6] ~ [eb6,g6] ~ [eb6,g6] [bb5,f6] [g5,eb6] ~ [g5,eb6]@2 [eb5,bb5] ~, [g3,bb3,eb4,g4]", // Eb Bb5 Cm Eb Bb5 Cm Eb5 Eb
  J: "[~@2 [d3,d4,bb4,bb5,d6] [eb3,eb4,c5,c6,eb6] [f3,f4,d5,d6,f6] ~ [d3,d4,bb4,bb5,d6] [eb3,eb4,c5,c6,eb6] [f3,f4,d5,d6,f6]@15 ~ [bb3,bb5] [ab3,a3,ab5,a5] [g3,g5] [f3,gb3,f5,gb5] [e3,e5] [d3,eb3,d5,eb5] [db3,db5] [b2,c3,b4,c5]]/2", // Gm Cm Dm Gm Cm Dm Bb Amaj7 …
  K: "[bb2,bb4]@9 ~ f3!2 g3 bb3 ~@2", L: "~@2 [bb3,bb5] ~ [bb3,bb5] [f3,f5] ~ [bb3,bb5]@9",
  M: "~@2 [bb3,bb5] ~ [bb3,bb5] ~ [g3,g5] [bb3,bb5] ~ [bb3,bb5] ~ [g3,g5] bb5!2 [g3,g5] ~, ~@6 bb3 ~", // Bb G Bb G
})).s("gm_string_ensemble_1").gain(0.33).pan(0.7)

// chords · flute
const flute = note("<~@16 A B C D E ~@3 F@2 G H I J I K@2 L ~@12 F@2 G H I M N O P Q R O S Q R O>".pickRestart({
  A: "~@2 f3@2 bb3@2 c4@2 eb4@2 d4@2 c4 bb3 c4 ~", B: "[bb3,eb4,g4]@9 ~ [eb4,g4,bb4]@2 [d4,f4,bb4]@2 [c4,eb4,g4]@2",
  C: "[bb3,d4,f4] ~", D: "~@10 f3!2 bb3@2 eb4@2", E: "[bb3,d4,f4,bb4] [f3,bb3,d4,f4]@3 ~@4",
  F: "[~@6 f4 ~@3 d4 ~@3 bb3@14 d4@2 eb4@2, ~ bb4 f4@5 ~, ~@3 d4@4 ~]/2", G: "f4@3 g4", H: "db4 c4 bb3@9 ~@5",
  I: "~@2 f3@2 bb3@2 c4@2 eb4@2 d4@2 c4 bb3 c4@2", J: "[bb3,eb4,g4]",
  K: "[[bb3,eb4,g4,bb4]@12 [d4,f4,bb4] [eb4,c5] ~ [f4,bb4,d5]@5 ~@8 [bb3,d4,f4] [bb3,f4]@2 ~, ~@13 g4@2 ~@14 d4 ~@2]/2", // Eb Bb Cm Bb Bb5
  L: "[bb3,eb4,g4]@3 ~", M: "[bb3,eb4,g4]@12 [d4,f4,bb4] [eb4,g4,c5]@2 [eb4,g4,c5]",
  N: "[f4,bb4,d5]@4 ~@8 [bb3,d4,f4,bb4] [bb3,d4,f4,bb4]@2 ~", O: "[bb3,eb4,g4]@10 ~@2 [bb3,eb4,g4] [bb3,eb4,g4]@2 ~",
  P: "bb4@2 ~@2 d4 d4@2 ~ d4@2 bb3@2 [bb3,d4,f4]@4, ~@2 f4@9 ~@5", // Bb
  Q: "[bb3,eb4,g4]@11 ~ [d4,f4,bb4] [eb4,g4,c5]@2 [eb4,g4,c5]", // Eb Bb Cm
  R: "[f4,bb4,d5]@4 ~@8 [bb3,d4,f4,c5] [bb3,d4,f4,bb4]@2 ~", S: "bb4 f4 ~ d4!2 bb3 [bb3,d4,f4]@2, ~ f4@2 ~",
})).s("gm_flute").gain(0.15).pan(0.8)

// chords · tremolo strings · F Eb F Eb
const tremolo_strings = note("<~@26 [[c5,f5,a5]] [[bb4,eb5,g5]] ~@20 [[c5,f5,a5]] [[bb4,eb5,g5]] ~@12>")
  .s("gm_tremolo_strings").gain(0.22).pan(0.7)

// other · vibraphone
const vibraphone = note(`<
  ~@6
  [f5 ~ f5 ~@5 f5 ~ f5 ~@5]!4
  [g5 ~ g5 ~@5 g5 ~ g5 ~@5]
  [g5 ~ g5 ~ g5 ~@3 g5 ~ g5 ~@5]
  [f5 ~ f5 ~@5 f5 ~ f5 ~@5]!2
  [f5 ~ f5 ~ f5 ~@3 f5 ~ f5 ~@5]
  [eb5 ~ eb5 ~ eb5 ~@3 eb5 ~ eb5 ~@5]
  ~@46
>`).s("gm_vibraphone").gain(0.11).pan(0.2)

// other · vibraphone · soft notes
const vibraphone_soft = note(`<
  ~@6
  [~@6 f5 ~@7 f5 ~]!4
  [~@6 g5 ~@7 g5 ~]!2
  [~@6 f5 ~@7 f5 ~]!3
  [~@6 eb5 ~@7 eb5 ~]
  ~@46
>`).s("gm_vibraphone").gain(0.05).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~@16 A ~ B@10 A ~@3 B@18 A ~ B@10>".pickRestart({
  A: "x", B: "x ~ x ~@2 x ~@2 x ~ x ~@5",
})).gain(0.44)

// drums · snare
const snare = s("sd").struct(`<
  ~@18
  [~ x ~ x]!10
  ~@3
  [~@10 x ~ x!2 ~@2]
  [~ x ~ x]!18
  ~
  [~@10 x ~ x!2 ~@2]
  [~ x ~ x]!10
>`).gain(0.55)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@4 [~ x ~ x] [~@4 x ~@5 x ~ x!2 ~@2] ~@56>").gain(0.22)

// drums · hihat
const hihat = s("hh").struct("<~@18 [x!4]!10 ~@4 [x!4]!18 ~@2 [x!4]!10>").gain(0.38)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@18
  [~ x ~ x ~ x ~ x]!9
  [~ x ~ x ~ x ~@2]
  ~@4
  [~ x ~ x ~ x ~ x]!17
  [~ x ~ x ~ x ~@2]
  ~@2
  [~ x ~ x ~ x ~ x]!10
>`).gain(0.16)

// drums · open hat
const open_hat = s("oh").struct("<~@5 [~@7 x] ~@56>").gain(0.27)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 [~@7 x] ~@19 [~@7 x] ~@10>").gain(0.49)

// drums · crash
const crash = s("cr").struct("<~@16 x ~@11 x ~@21 x ~@11>").gain(0.33)

// drums · ride
const ride = s("rd").struct("<x ~@5 x ~@55>").gain(0.44)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 [~ x ~ x]!8 ~@46>").gain(0.38)

stack(
  electric_guitar_clean, bass, piano, epiano1, electric_guitar_muted, pad_warm, string_ensemble_1, flute,
  tremolo_strings, vibraphone, vibraphone_soft, kick, snare, snare_soft, hihat, hihat_soft, open_hat, mid_tom, crash,
  ride, tambourine
)

More by The Temptations