Strudelify
Rain cover art

1992 · Erotica

Rain

Madonna

KeyB♭ majorTempo92 bpm
0:00/0:00
// Rain — Madonna
// 92 bpm, 4/4, key A# 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 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(92/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 · "tk2"
const bass = note(`<
  ~ A@4 B@4 C@2 D E C@2 D E C@2 D E C@2 D E F D F D F D G@2 C@2 D E C@2 D E H@3 E C@2 D E F D F D F D G@2 C@2 D E C@2
  I@2 ~@2 J D J D J D K E L@2 E F L@2 E F M E M N M E O@2 C@2 D E C@2 D E C@2 D E P@4 L@2 E F L@2 E F L@2 E F ~@2
>`.pickRestart({
  A: "[c2@63 ~]/4", B: "c2/4", C: "bb1/2", D: "eb1", E: "f1", F: "g1", G: "f1/2", H: "[bb1@2 eb1]/3", I: "[eb1@7 f1]/2",
  J: "db1", K: "f1@15 ~", L: "c2/2", M: "a1", N: "f1@7 ~", O: "g1/2", P: "[bb1@16 eb1@15 f1]/4",
})).s("gm_synth_bass_2").gain(0.3)

// chords · pad warm · "tk3"
const pad_warm = note("<~ A@8 B@4 C@4 D@8 E@8 D@8 E@8 D@8 E@8 ~@2 F@8 G@8 ~@4 H@4 I@16 J@12 ~@2>".pickRestart({
  A: "[[eb4,f4,bb4]@63 ~]/4", B: "[~ c4, [bb3,f4]@63 ~]/4", C: "[~@32 c4@31 ~, bb3@31 ~]/4", D: "[[c4,f4]@127 ~]/8",
  E: "[[bb3,c4,f4]@63 ~]/8", F: "[[ab3,eb4]@96 [c4,f4]@31 ~, bb3@63 ~]/8", G: "[~ d4 ~ d4, [c4,g4]]/8",
  H: "[[c4,d4,g4]@31 ~]/4", I: "[~@16 c4@15 ~, [bb3,f4]@31 ~]/4", J: "[~@16 d4@15 ~, [c4,g4]@31 ~]/4",
})).s("gm_pad_warm").gain(0.2)

// chords · pad warm · "tk3" · soft notes
const pad_warm_soft = note("<~ A@4 B@4 ~@4 C@4 D@8 ~@8 D@8 ~@8 D@8 ~@64>".pickRestart({
  A: "[d4@63 ~]/4", B: "[d4@31 ~]/4", C: "[f4@31 ~]/4", D: "[bb3@127 ~]/8",
})).s("gm_pad_warm").gain(0.15)

// other · pad poly · "tk6"
const pad_poly = note("<~@65 A@2 B ~@53>".pickRestart({
  A: "[eb2,eb3,eb4]/2", B: "[db1,db2]",
})).s("gm_pad_poly").gain(0.35)

// chords · epiano2 · "tk7"
const epiano2 = note("<~@67 A B A C D@2 E@2 ~@8 F@3 G F G H@2 I@4 J@2 K@2 I@4 J@2 K@2 L@4 M@2 N@2 ~@6>".pickRestart({
  A: "[db3,ab3,db4,eb4,ab4]", B: "[eb3,bb3,eb4,g4]", C: "[eb3,bb3,eb4,g4,ab4]",
  D: "[[db3,ab3] [eb3,g4,ab4], eb4@29 ~@3, [db4,ab4]@15 ~ bb3@14 ~@2]/2", E: "[[f3,c4,f4]@15 ~]/2", F: "[g3,c4,e4]",
  G: "[g3,c4,d4]", H: "[~@8 g4@7 ~, [g3,c4,d4]@15 ~]/2",
  I: "[[bb3,c4,f4]@11 [d3,c4,a4]@5 ~@8 [f3,a3,c4]@8, ~@22 f4@41 ~, ~@22 bb3@25 ~@17]/4", // Bbsus2 D7 F
  J: "[[f3,bb3,c4,f4]@21 ~ [bb3,c4,f4,a4]@10, ~@11 f3@4 ~]/2", K: "[[eb3,bb3]@8 f3@7 ~, [c4,f4]@15 ~]/2",
  L: "[[c4,d4,g4]@11 [e3,d4,b4]@5 ~@8 [g3,b3,d4]@8, ~@22 g4@41 ~, ~@22 c4@25 ~@17]/4", // Csus2 E7 G
  M: "[[g3,c4,d4,g4]@21 ~ [c4,d4,g4,b4]@10, ~@11 g3@4 ~]/2", N: "[[f3,c4]@8 g3@7 ~, [d4,g4]@15 ~]/2",
})).s("gm_epiano2").gain(0.25)

// chords · epiano2 · "tk7" · soft notes
const epiano2_soft = note("<~@68 A ~@24 B ~@7 B ~@7 C ~@11>".pickRestart({
  A: "ab4@15 ~", B: "[eb3,c4]", C: "[f3,d4]",
})).s("gm_epiano2").gain(0.15)

// other · string ensemble 1 · "tk8"
const string_ensemble_1 = note(`<
  ~@58 A ~ B ~ A ~ B ~@10 C D E F C G H D ~@9 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B H@2 G I J K L M ~@6
>`.pickRestart({
  A: "~@9 f5 bb5 f5 bb5 ~ f6 ~", B: "~@2 f5 ~ bb5 ~ f6 ~ eb6 ~ d6 ~ c6 ~ bb5 ~",
  C: "~@2 [g5,g6]!2 ~@2 [g5,g6] ~@3 [g5,g6] g6 ~@2 [g5,g6] ~", // G
  D: "~@2 [g5,g6]!2 ~@2 [g5,g6] ~@3 [g5,g6]!2 ~@2 [g5,g6] ~", // G
  E: "~@2 [g5,g6] g6 ~@2 [g5,g6] ~@3 [g5,g6]!2 ~@2 [g5,g6] ~", // G
  F: "~@2 g6@2 ~@2 [g5,g6] ~@3 [g5,g6] g6 ~@2 [g5,g6] ~, ~@2 g5 ~@13", // G
  G: "~@2 [g5,g6] ~@3 [g5,g6] ~@3 [g5,g6] g6 ~@2 [g5,g6] ~", // G
  H: "~@2 [g5,g6] g6 ~@2 [g5,g6] ~@3 [g5,g6] g6 ~@2 [g5,g6] ~", I: "~@2 [g5,g6] ~@3 [g5,g6] ~@3 [g5,g6] ~@3 [g5,g6] ~",
  J: "~@2 [g5,g6] g6 ~@2 [g5,g6] g6 ~@2 [g5,g6] ~@3 g5 ~", K: "~@2 [g5,g6] ~@3 [g5,g6]!2 ~@2 [g5,g6] ~@3 [g5,g6]!2",
  L: "~@2 [g5,g6] g5 ~@2 [g5,g6] ~@3 [g5,g6]!2 ~@2 [g5,g6] ~", // G
  M: "~@2 [g5,g6] g6 ~@2 [g5,g6] ~@3 [g5,g6] ~@3 [g5,g6] ~", // G
})).s("gm_string_ensemble_1").gain(0.07)

// other · string ensemble 1 · "tk8" · soft notes
const string_ensemble_1_soft = note("<~@75 A ~ B C A D C ~@25 C@2 D E F ~ G H ~@6>".pickRestart({
  A: "~@11 g5 ~@4", B: "~@3 g5 ~@12", C: "~@3 g5 ~@7 g5 ~@4", D: "~@3 [g5,g6] ~@7 g5 ~@4",
  E: "~@3 [g5,g6] ~@7 [g5,g6] ~@4", F: "~@3 g5 ~@3 g5 ~@6 g6 [g5,g6]", G: "~@3 g6 ~@12", H: "~@3 g5 ~@7 [g5,g6] ~@4",
})).s("gm_string_ensemble_1").gain(0.05)

// other · synth brass 2 · "tk9"
const synth_brass_2 = note(`<
  ~@9 A B C B D@2 E F ~@16 A B C B D@2 E F ~@16 A B C B D@2 E F ~@10 G@7 H ~@8 A B C B D@2 E F A B C B D@2 E F I J K J
  L@2 M N ~@6
>`.pickRestart({
  A: "f4@3 ~ bb3@4 c4@6 ~@2", B: "f4 ~ bb3 ~ c4@3 ~", C: "f4@2 ~@2 bb3@3 ~ c4@7 ~", D: "f4@2 ~@2 bb3@3 ~ c4@8",
  E: "f4 ~ bb3@2 c4@4", F: "f4@3 ~ bb3@4 c4@7 ~", G: "g4 c4 d4@2", H: "g4@4 c4@4 d4@7 ~", I: "g4@3 ~ c4@4 d4@6 ~@2",
  J: "g4 ~ c4 ~ d4@3 ~", K: "g4@2 ~@2 c4@3 ~ d4@7 ~", L: "g4@2 ~@2 c4@3 ~ d4@8", M: "g4 ~ c4@2 d4@4",
  N: "g4@3 ~ c4@4 d4@7 ~",
})).s("gm_synth_brass_2").gain(0.16)

// drums · kick
const kick = s("bd").struct(`<
  ~@5 A ~ A ~ B@25 C B C B C B C B@17 C B C B C B C B@27 C B C B C B C B C B C B C B C B C B C B C B C B@4 ~@2
>`.pickRestart({
  A: "x ~ x ~ x!5 ~@2 x ~@4", B: "x!2 ~@4 x!4 ~@6", C: "x!3 ~ x!6 ~ x ~@4",
})).gain(0.25)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@5 A ~ A ~@26 B ~ B ~ B ~ B ~@17 B ~ B ~ B ~ B ~@27 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@6
>`.pickRestart({
  A: "~@3 x ~@5 x!2 ~@5", B: "~@3 x ~@6 x ~@5",
})).gain(0.15)

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@7 B ~@7 C ~@15 B ~@7 D ~@72>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@14 x!2", D: "~@9 x ~@6",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C
  D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D
  C ~@2
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!9 ~", C: "x!16", D: "x!15 ~",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@7 B ~@7 C ~@15 B ~@7 D ~@16 E F ~@54>".pickRestart({
  A: "~@2 x ~ x ~@2 x ~ x!2 ~@5", B: "~ x ~@2 x ~@3 x ~ x ~ x!2 ~@2", C: "~@4 x ~@3 x ~ x!4 ~@2", D: "~@4 x!5 ~@7",
  E: "~ x ~@2 x ~ x!2 ~@2 x ~ x!2 ~@2", F: "x ~ x ~ x!3 ~ x ~ x!5 ~",
})).gain(0.3)

// 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 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~@3
>`.pickRestart({
  A: "~@15 x",
})).gain(0.15)

// drums · high tom
const high_tom = s("ht").struct("<~@82 [~@3 x] ~@38>").gain(0.2)

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A ~@7 A ~@6 B A ~@6 B A ~@7 A ~@6 C A ~@6 B A ~@25 A ~@6 B A ~@6 B A ~@6 B A ~@7 A ~@5
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@6 x!2",
})).gain(0.25)

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A B@3 C B D B E B@3 E B@3 E B@3 E B@3 E B@3 E B@3 E D B D E D B D E B@3 E B@3 E B@3 E B@3 E D B D E D B D E B@3 E
  B@3 E B@3 E B@3 E B@3 E B@3 E B@2 D E D B D E D B D E D B D E D B D E D B D E D B@2 E B ~@2
>`.pickRestart({
  A: "~@9 x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", C: "~@3 x!9 ~ x ~ x", D: "~ x ~ x!9 ~ x ~ x",
  E: "~@3 x ~ x ~ x ~ x ~ x ~ x ~ x",
})).gain(0.25)

stack(
  bass, pad_warm, pad_warm_soft, pad_poly, epiano2, epiano2_soft, string_ensemble_1, string_ensemble_1_soft,
  synth_brass_2, kick, kick_soft, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, shaker
)

More by Madonna