Strudelify

I Wish It Would Rain Down

Phil Collins

KeyA♭ majorTempo64 bpm
0:00/0:00
// I Wish It Would Rain Down — Collins Phil
// 64 bpm, 4/4, key G# 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: Full arrangement: all 84 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B C D E F G H I J K L I J M N O P Q R S T U V I J K L I J M N O P Q R S T U V W X Y Z W X Y Z I J K L I J M N O P
  Q R S T U AA I J K L I J M N I J K L I J M N AB@2 ~
>`.pickRestart({
  A: "ab1@2 ab2 eb2", B: "g2@7 ~ g2 ab2 g2@3 g1 g2 ~", C: "f2@9 f1 ~ f1@3 ~ f1", D: "f2@9 f1 f2@2 g2@4",
  E: "ab2@6 ~ ab2 ab1@4 eb2@3 ~", F: "g2@7 f2 g2 ab2 g2@4 f2 ~", G: "f2@7 f1 f1@3 ~@2 c2 eb2 ab2",
  H: "f2@6 ~ f2!2 f1 f2@4 g2 ~", I: "ab1@7 ab2 ab2@4 eb2@4", J: "g2@7 g1!2 g2@6 ~", K: "f2@6 ~ f2 f2@5 c2 eb2 g2",
  L: "f2@6 ~ f2!2 f1 f2@2 g2@2 ~@2, ~@12 f2 ~@3", M: "f2@4 ~@5 c2 f2 b2 bb2 ab2 f2 eb2",
  N: "ab2 f2@2 f1 f2@2 f1 f1@5 g1@2 g2 ~", O: "db2@4 ~ db2 ab1 db1 db2@5 db2@3",
  P: "eb2@4 ~ eb2 bb1@2 eb1@5 eb1 bb1 eb2", Q: "db2@7 bb1 db2@5 ab1 db2@2", R: "eb2@5 eb2 db2 eb2 eb1@2 ~ eb1@3 eb2@2",
  S: "db2@7 ab1 db2@4 ~ db2 c2 db2", T: "eb2@6 ~ eb2 eb1@4 ~ eb1 bb1 eb2", U: "db2@7 c2 db2@5 db2 c2 ~",
  V: "eb2@3 ~ f2@4 g2@4 ab2@2 bb2 ~", W: "ab1@5 ~ ab2@6 eb2@4", X: "ab2@6 eb3 d3 f2@7 ~", Y: "ab2@7 ~ ab2@4 eb2@4",
  Z: "ab1@11 bb1 c2 bb1 ab1 eb1", AA: "eb2@2 g2 ~ f2@2 ~@2 g2@2 ab2 g2@2 c3 bb2 ~", AB: "ab1/2",
})).s("gm_acoustic_bass").gain(0.72)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A B C D A B C D A B C D A B C D E F G H I J K L A B C D A B C D E F G H I J K L M N O M@2 N O P A B C D A B C D E F
  G H I J K Q A B C D A B C D A B C D A B C D R@2 ~
>`.pickRestart({
  A: "[c4,eb4]@3 [c4,eb4,ab4], [ab2,eb3,ab3]", B: "[eb3,bb3,eb4,g4,bb4]@3 [bb3,eb4,g4]",
  C: "[f2,c3,f3,c4,f4]@12 ~ [f2,c3,f3,bb3,eb4] ~@2", // F5 Fsus4
  D: "~@8 [c4,eb4,g4]@4 [f3,g4]@3 ~, [f2,ab3]@3 ~, [f3,c4,eb4]@7 f3@5 ~@4, ~@3 c3@3 ~@2", // Cm Fsus2 Fm F7
  E: "[db3,ab3]@3 [db3,ab3,eb4,ab4], [db4,f4]", F: "[eb4,g4,ab5,bb5]@2 eb4 [eb4,bb4], [eb3,bb3], ~ [ab4,g5,bb5]",
  G: "[db3,ab3,db4,f4,ab4]@13 ab4@3, ~@13 eb4 ~@2", // Db
  H: "bb5@2 ~ [eb2,bb3,eb4,g4], [eb3,ab5], [bb3,eb4,g4]@3 ~, ~ [g5,bb5]", I: "[db3,ab3,f4,ab4]@3 [db3,ab3,eb4,ab4]",
  J: "[eb4,g4,ab5,bb5]@8 [eb4,ab4,bb4] [eb4,g4,bb4]@7, [eb3,bb3], ~ [g5,bb5]", // Eb Ebsus4 Eb Eb5 Gm
  K: "[db4,f4]@2 [eb4,ab4] [db3,ab3,db4,f4], [db3,ab3]@3 ~", // Db Ab5 Db Db5
  L: "[eb4,eb5]@3 ~ [f4,f5]@3 ~ [g4,g5]@3 ~ [bb4,bb5]@3 ~, [eb3,bb3]@15 ~", // Eb F G Bb Eb5
  M: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3", // Ab
  N: "[bb4,d5,f5] ~@3 [bb4,d5,f5] ~@3 [bb4,d5,f5] ~@3 [bb4,d5,f5] ~@3", // Bb
  O: "[db5,f5,ab5] ~@3 [db5,f5,ab5] ~@3 [db5,f5,ab5] ~@3 [db5,f5,ab5] ~@3", // Db
  P: "[c5,eb5,ab5] ~@3 [c5,eb5,ab5] ~@3 [c5,eb5,ab5] ~@3 [c5,eb5,ab5] ~@3", // Ab
  Q: "eb3@2 g3 ~ f3@2 ~@2 g3@2 ab3 g3@2 c4 bb3 ~", R: "[ab2,eb3,c4,eb4,ab4]/2",
})).s("gm_epiano2").gain(0.56)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~ A B C@2 D E@2 F G ~@7 H I H I H I J K G ~ L@2 ~@2 M ~ H I H I H I J K N O P Q N R P S G T L@2 U V M W H I H I H I J
  K G T L@2 U V M W G T L@2 U V M W X@3
>`.pickRestart({
  A: "bb4@10 ~ bb4@2 bb4 ab4 ~", B: "eb5@6 bb4@3 ab4 ~ bb4 ~ bb4@3",
  C: "[ab4@3 ~ f4@8 ~@3 bb4@4 ab4 f4@5 ~@2 f4 eb4 g4 f4 ab4]/2", D: "bb5@11 ~ bb5@3 ab5",
  E: "[ab5@11 ~ f5@14 ~ eb5 ~ gb5@3]/2", F: "f5@8 ~@2 f5 ab5 bb5@4", G: "ab5@7 ~@9", H: "[db3,ab3]@15 ~",
  I: "[eb3,bb3]@7 ~", J: "[db3,ab3]@7 ~", K: "[eb3,bb3]@15 ~", L: "[~@2 f4 [g4,ab4,bb4] c5@5 bb4 ab4 ~ ab4@12 ~@8]/2",
  M: "~@4 f5@11 ~", N: "[ab2,eb3,ab3]@7 ~", O: "[bb2,f3,bb3]@7 ~", P: "[db3,ab3,db4]@3 ~",
  Q: "[ab2,eb3,ab3]@5 ~@2 bb4 bb4@6 ~@2", R: "[bb2,f3,bb3]@13 ~@3",
  S: "[ab2,eb3,ab3]@9 [ab2,eb3,ab3]@3 [ab2,eb3]@3 ~, ~@12 ab3 ~@3", T: "~ bb4@4 ab4 bb4 ~ bb4@7 ~",
  U: "~ eb5 ~ eb5 eb5@6 eb5@6", V: "~@3 f5@5 eb5@7 ~", W: "~@2 ab5@3 ab5 ~ ab5 ab5@5 ~@3",
  X: "[[ab2,eb3,ab3]@11 ~@5]/3", // Ab5
})).s("gm_distortion_guitar").gain(0.58)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~ A B C D A B C D A B E@2 A B E@2 F G F H F I F J A B E@2 A B E@2 F G F H F I F K L M N O@2 P N Q A B E@2 A B E@2 F G
  F H F I F K R S T@2 R S U@2 R S T@2 R S T@2 V@2 ~
>`.pickRestart({
  A: "[ab4,c5,eb5]", B: "[g4,bb4,c5,eb5]", C: "[f4,ab4,c5]@15 ~", D: "[f4,ab4,c5,eb5]@3 [g4,bb4,eb5], ~@12 d5 ~@3",
  E: "[ab4@3 ~@25 [g4,bb4]@3 ~, eb5@31 ~]/2", F: "[f4,ab4,db5]", G: "ab4 g4, [eb4,bb4]",
  H: "[eb4,ab4,bb4] [eb4,g4,bb4]", I: "[eb4,ab4] [eb4,g4], bb4", J: "eb5@4 f5@4 g5@4 bb5@3 ~, [eb4,bb4]@15 ~",
  K: "ab4@4 g4@4 f4@4 g4@3 ~, [eb4,bb4]@15 ~", L: "[ab3,c4,eb4,ab4,c5]", M: "~@8 d4@7 ~, [bb3,f4,bb4,d5]",
  N: "~@8 db4@7 ~, [f4,ab4,db5]", O: "[ab3,eb4,ab4,c5]/2", P: "[bb3,d4,bb4,d5,f5]", Q: "[ab3,eb4,ab4,c5]@15 ~",
  R: "[ab4,c5,eb5,ab5,c6]", S: "[g4,bb4,c5,eb5,g5,bb5]", T: "[[f5,ab5]@7 [g4,bb4,g5,bb5], eb5@31 ~, ab4@3 ~@29]/2",
  U: "[ab4@3 ~@25 [g4,bb4]@3 ~, [eb5,f5,ab5]]/2", V: "[[c4,eb4,ab4]@9 ~@7, [ab5,c6]]/2",
})).s("gm_string_ensemble_2").gain(0.24)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note(`<
  ~@3 A ~@3 A ~@3 B@2 ~@2 B@2 ~@10 B@2 ~@2 B@2 ~@18 B@2 ~@2 B@2 ~@10 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@3
>`.pickRestart({
  A: "~@3 eb5@5", B: "[~@16 ab4@11 ~@5, [f3,c4]@7 ~, ~@3 g4@10 ~@19, ~@11 f4@16 ~@5]/2",
})).s("gm_string_ensemble_2").gain(0.12)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@48 [~@4 x ~@6 x ~@2 x!2] ~@31 [~@4 x ~@6 x ~@2 x!2] ~@3>").gain(0.71)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!80 ~@3>").gain(0.71)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B ~@3
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
})).gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct("<~@48 [~ x ~ x ~@3 x ~ x ~@3 x ~@2] ~@31 [~ x ~ x ~@3 x ~ x ~@3 x ~@2] ~@3>").gain(0.71)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~@2
>`.pickRestart({
  A: "~@15 x", B: "x",
})).gain(0.71)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@3 A ~@7 A ~ A ~ A ~ A ~ A ~@7 A ~ A ~ A ~ A ~ A ~@3 A ~@3 B A ~@2 A ~ A ~ A ~ A ~ A ~ A C B A ~@2 B A@2 ~
  B A@2 ~ B A ~@2 A ~@2
>`.pickRestart({
  A: "x", B: "x ~@2 x", C: "~@10 x ~@2 x ~@2",
})).gain(0.71)

// drums · ride
const ride = s("rd").struct("<~@41 A B A B A B A B ~@30 A B C ~@2>".pickRestart({
  A: "x ~@5 x ~ x ~@2 x ~ x ~ x", B: "x ~@5 x!2 ~ x ~@2 x!2 ~ x", C: "x",
})).gain(0.71)

stack(
  bass, epiano2, distortion_guitar, string_ensemble_2, string_ensemble_2_soft, kick, snare, low_tom, hihat, hihat_soft,
  mid_tom, open_hat, crash, ride
)

More by Phil Collins