Strudelify

Watercolours in the Rain

Roxette

KeyG majorTempo96 bpm
0:00/0:00
// Watercolours in the Rain — Roxette
// 96 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 acoustic guitar steel (copy of ch 1 pad metallic); ch 5 acoustic guitar steel (copy of ch 2 pad metallic)
// note: Full arrangement: all 85 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · pad metallic
const pad_metallic = note(`<
  A B@2 C@2 B@2 D@2 E@2 F@2 G@2 H I@2 E@2 F@2 J@5 ~@9 K@6 L M@3 N@6 O@2 P@2 Q R@2 ~@17 S@2 T@2 U V W@3
>`.pickRestart({
  A: "~@4 [g3,b3] c4 b3 a3", // G
  B: "[[g3,c4]@3 [g3,c4,d4]@2 [g3,c4,d4]@2 [g3,c4,d4]@2 [g3,c4,d4]@2 [g3,c4,d4] [g3,c4,d4]@4]/2", // C5 Gsus4
  C: "[[g3,c4] d4@2 [g3,b3]@2 [g3,b3] [g3,b3]@4 [g3,b3]@2 [g3,b3] c4 b3 a3]/2", // C5 G
  D: "[[g3,c4] d4@2 [g3,b3]@2 [g3,b3] [g3,b3]@6 [d4,f4]@4]/2", // C5 G Dm
  E: "[c4@3 [c4,d4]@2 [c4,d4]@2 [c4,d4]@2 [c4,d4] [c4,d4]@2 [c4,d4]!2 [c4,d4]@2]/2", // Csus2
  F: "[[e4,a4]@2 ~ [e4,a4]@9 [d4,g4]@4]/2", G: "[c4@3 [c4,d4]@2 [c4,d4]@2 [c4,d4]@2 [c4,d4] [c4,d4]@2 [c4,d4]@4]/2",
  H: "[e4,a4]@3 [e4,a4]@5", I: "[d4@3 [c4,d4]@2 [c4,d4]@2 [c4,d4]@2 [c4,d4] [c4,d4]@2 [d4,g4]@4]/2",
  J: "[c4@12 [c4,d4]@8 [c4,d4]@8 [c4,d4]@8 [c4,d4]@4 [c4,d4]@8 [c4,d4]@15 [e4,a4]@12 [e4,a4]@20 d4@12 [c4,d4]@8 [c4,d4]@8 [c4,d4]@8 [c4,d4]@4 [c4,d4]@24 ~]/5", // Csus2 A5 Csus2
  K: "[~@11 [g3,b3]@4 c4@4 b3@4 a3@4 [g3,c4]@12 [g3,c4,d4]@8 [g3,c4,d4]@8 [g3,c4,d4]@8 [g3,c4,d4]@8 [g3,c4,d4]@4 [g3,c4,d4]@15 [g3,c4]@4 d4@8 [g3,b3]@8 [g3,b3]@4 [g3,b3]@24 ~@16 c4@12 [c4,d4]@8 [c4,d4]@7 [c4,d4]@8 [c4,d4]@3]/6", // G C5 Gsus4 C5 G Csus2
  L: "~ [c4,d4]@8 [c4,d4]@4 [c4,d4]@4 [c4,d4]@8 [e4,a4]@7", // Csus2 A5
  M: "[~@5 [e4,a4]@36 [d4,g4]@15 c4@12 [c4,d4]@8 [c4,d4]@8 [c4,d4]@8 [c4,d4]@4]/3", // A5 G5 Csus2
  N: "[[c4,d4]@8 [c4,d4]@16 [e4,a4]@12 [e4,a4]@19 d4@12 [c4,d4]@8 [c4,d4]@8 [c4,d4]@8 [c4,d4]@4 [c4,d4]@8 [d4,g4]@16 c4@12 [c4,d4]@8 [c4,d4]@7 [c4,d4]@8 [c4,d4]@4 [c4,d4]@8 [c4,d4]@4 [c4,d4]@4 [c4,d4]@8 [e4,a4]@8 ~@2]/6", // Csus2 A5 Csus2 G5 Csus2 A5
  O: "[~@2 [e4,a4]@36 [d4,g4]@15 c4@11]/2", // A5 G5
  P: "[~ [c4,d4]@8 [c4,d4]@8 [c4,d4]@8 [c4,d4]@4 [c4,d4]@8 [c4,d4]@16 [e4,a4]@11]/2", Q: "~ [e4,a4]@19 d4@12",
  R: "[[c4,d4]@2 [c4,d4]@2 [c4,d4]@2 [c4,d4] [c4,d4]@6 ~@3]/2", S: "[~@15 [g3,b3]@2 c4@2 b3@2 a3@2 ~@9]/2",
  T: "[~@29 [g3,c4,d4]@16 [g3,c4]@4 d4@8 [g3,b3]@7]/2", U: "~ [g3,b3]@4 [g3,b3]@15 [g3,b3]@8 [g3,b3]@4",
  V: "c4 b3 a3 [g3,c4]@3 [g3,c4,d4]@2", // C5 Gsus4
  W: "[[g3,c4,d4]@2 [g3,c4,d4]@2 [g3,c4,d4]@2 [g3,c4,d4] [g3,c4,d4]@4 [b3,d4,a4]@8 ~@5]/3", // Gsus4 Bm7
})).s("gm_pad_metallic").gain(0.46).pan(0.3)

// chords · pad metallic
const pad_metallic_2 = note(`<
  A B@2 C D B@2 C D E@2 F@2 E@2 G H@2 E@2 F@2 I@2 J@7 K@8 L@5 M@8 N@2 O@2 P Q@2 R@8 S@8 T ~ U@2 V@4 W@2
>`.pickRestart({
  A: "~ [g2,d3]", B: "[f3@3 e3@9 e3 f3 f#3@2]/2", C: "f3 e3@2 d3@5", D: "g2 [g2,d3]", E: "[[f3,g3]@3 [e3,g3]@12 g2]/2",
  F: "[a2@3 [a3,c4,d4]@2 [a3,c4,d4]@2 [a3,c4,d4]@2 [a3,c4,d4] [a3,c4,d4]@2 [g2,d3]@4]/2", // D7 G5
  G: "a2@3 [a3,c4,d4]@2 [a3,c4,d4] [a3,c4,d4]@2", H: "[[g2,d3,g3]@3 [g2,d3,g3]@9 [g2,d3]@4]/2",
  I: "[[f3,g3]@12 [e3,g3]@47 g2@4 a2]/2", // Fsus2 Em
  J: "[~@11 [a3,c4,d4]@8 [a3,c4,d4]@4 [a3,c4,d4]@8 [g2,d3,g3]@12 [g2,d3,g3]@51 [g3,b3,d4]@12 [g3,b3,d4]@8 [g3,b3,d4]@4 [g3,b3,d4]@8 [g3,a#3,d4,f4]@12 [g3,a#3,d4,f4]@8 [g3,a#3,d4,f4]@4 [g3,a#3,d4,f4]@8 [d3,f3,a3,d4]@12 [d3,f3,a3,d4]@7 [d3,f3,a3,d4]@4 [d3,f3,a3,d4]@8 [f3,g3,c4]@12 [f3,g3,c4]@8 [e3,g3,c4,d4]@4 [e3,g3,c4,d4]@8 [g3,b3,d4]@3]/7", // D7 G5 G Gm7 Dm Fsus2 C G
  K: "[~@9 [g3,b3,d4]@8 [g3,b3,d4]@4 [g3,b3,d4]@8 [g3,a#3,d4,f4]@12 [g3,a#3,d4,f4]@7 [g3,a#3,d4,f4]@4 [g3,a#3,d4,f4]@8 [d3,f3,a3,d4]@12 [d3,f3,a3,d4]@8 [d3,f3,a3,d4]@4 [d3,f3,a3,d4]@8 [c3,e3,g3,c4]@12 [c3,e3,g3,c4]@8 c4@4 g3@8 c3@31 g2@16 [g2,d3]@16 f3@12 e3@36 e3@4 f3@3 f#3@8 f3@4 e3@2]/8", // G Gm7 Dm C G5
  L: "[~@6 d3@20 g2@32 [f3,g3]@12 [e3,g3]@47 g2@4 a2@12 [a3,c4,d4]@8 [a3,c4,d4]@8 [a3,c4,d4]@8 [a3,c4,d4]@3]/5", // Fsus2 Em D7
  M: "[~ [a3,c4,d4]@8 [g2,d3]@15 [f3,g3]@12 [e3,g3]@47 ~ g2@4 a2@12 [a3,c4,d4]@8 [a3,c4,d4]@4 [a3,c4,d4]@7 [g2,d3,g3]@12 [g2,d3,g3]@36 [g2,d3]@16 [f3,g3]@12 [e3,g3]@47 g2@4 a2@10]/8", // D7 G5 Fsus2 Em D7 G5 Fsus2 Em
  N: "[~@2 [a3,c4,d4]@8 [a3,c4,d4]@8 [a3,c4,d4]@8 [a3,c4,d4]@4 [a3,c4,d4]@8 [g2,d3]@15 [f3,g3]@11]/2", // D7 G5 Fsus2
  O: "[~ [e3,g3]@47 ~ g2@4 a2@11]/2", P: "~ [a3,c4,d4]@8 [a3,c4,d4]@4 [a3,c4,d4]@7 [g2,d3,g3]@12",
  Q: "[[g2,d3,g3]@51 ~ [g3,b3,d4]@12]/2", // G5 G
  R: "[[g3,b3,d4]@8 [g3,b3,d4]@4 [g3,b3,d4]@7 [g3,a#3,d4,f4]@12 [g3,a#3,d4,f4]@8 [g3,a#3,d4,f4]@4 [g3,a#3,d4,f4]@8 [d3,f3,a3,d4]@12 [d3,f3,a3,d4]@8 [d3,f3,a3,d4]@4 [d3,f3,a3,d4]@8 [f3,g3,c4]@12 [f3,g3,c4]@8 [e3,g3,c4,d4]@4 [e3,g3,c4,d4]@7 [g3,b3,d4]@12 [g3,b3,d4]@8 [g3,b3,d4]@4 [g3,b3,d4]@8 [g3,a#3,d4,f4]@12 [g3,a#3,d4,f4]@8 [g3,a#3,d4,f4]@4 [g3,a#3,d4,f4]@8 [d3,f3,a3,d4]@12 [d3,f3,a3,d4]@8 [d3,f3,a3,d4]@4 [d3,f3,a3,d4]@7 [c3,e3,g3,c4]@12 [c3,e3,g3,c4]@8 c4@4 g3@8 c3@15]/8", // G Gm7 Dm Fsus2 C G Gm7 Dm …
  S: "[~@17 [g3,b3,d4]@12 [g3,b3,d4]@8 [g3,b3,d4]@4 [g3,b3,d4]@7 [g3,a#3,d4,f4]@12 [g3,a#3,d4,f4]@8 [g3,a#3,d4,f4]@4 [g3,a#3,d4,f4]@8 [d3,f3,a3,d4]@12 [d3,f3,a3,d4]@8 [d3,f3,a3,d4]@4 [d3,f3,a3,d4]@8 [f3,g3,c4]@12 [f3,g3,c4]@8 [e3,g3,c4,d4]@4 [e3,g3,c4,d4]@8 [g3,b3,d4]@11 [g3,b3,d4]@8 [g3,b3,d4]@4 [g3,b3,d4]@8 [g3,a#3,d4,f4]@12 [g3,a#3,d4,f4]@8 [g3,a#3,d4,f4]@4 [g3,a#3,d4,f4]@8 [d3,f3,a3,d4]@12 [d3,f3,a3,d4]@8 [d3,f3,a3,d4]@4 [d3,f3,a3,d4]@8 [c3,e3,g3,c4]@11 [c3,e3,g3,c4]@6]/8", // G Gm7 Dm Fsus2 C G Gm7 Dm …
  T: "~ c4@2 g3@4 c3@4 ~@5", U: "[~@14 [f3,g3,c4]@11 [e3,g3,c4,d4]@16 [e3,g3,c4,d4]@12 [e3,g3,c4,d4]@8 e3@3]/2",
  V: "[~ f3@4 f#3@8 f3@4 e3@8 d3@20 g2@15 [g2,d3]@16 f3@12 e3@36 e3@4]/4", W: "[f3 f#3@2 [g2,d3,g3]@8 ~@5]/2",
})).s("gm_pad_metallic").gain(0.46).pan(0.7)

// chords · synth strings 2
const synth_strings_2 = note(`<
  A B@2 C@2 B@2 C@2 B@2 D@2 B@2 E F@2 B@2 D@2 G@3 H@5 I@7 J@8 K@5 L@4 M@3 N@5 O@8 P Q@6 R@8
>`.pickRestart({
  A: "~ [g3,b3,d4]", B: "[[c4,f4,g4]@3 [c4,d4,e4,g4]@13]/2", C: "[[c4,f4,g4]@3 [g3,b3,d4]@13]/2",
  D: "[[a3,c4,d4,e4]@3 [g3,b3,d4]]/2", E: "[a3,c4,d4,e4]", F: "[[g3,b3,d4]@3 [c4,d4,f4,g4]@9 [g3,b3,d4]@4]/2",
  G: "[[c4,f4,g4]@12 [c4,d4,e4,g4]@51 [a3,c4,d4,e4]@32 [g3,b3,d4]]/3", // Csus4 C Am G
  H: "[~@11 [c4,d4,f4,g4]@51 [g3,b3,d4]@32 [g3,a#3,d4,f4]@32 [a3,d4,f4]@31 [c4,f4,g4]@3]/5", // Csus4 G Gm7 Dm Csus4
  I: "[~@17 [c4,d4,e4,g4]@12 [g3,b3,d4]@32 [g3,a#3,d4,f4]@31 [a3,d4,f4]@32 [c4,e4,g4]@63 [g3,b3,d4]@32 [c4,f4,g4]@5]/7", // C G Gm7 Dm C G Csus4
  J: "[~@7 [c4,d4,e4,g4]@51 [c4,f4,g4]@12 [g3,b3,d4]@51 ~ [c4,f4,g4]@12 [c4,d4,e4,g4]@51 [a3,c4,d4,e4]@47 ~ [g3,b3,d4]@15 [c4,f4,g4]@8]/8", // C Csus4 G Csus4 C Am G Csus4
  K: "[~@4 [c4,d4,e4,g4]@51 ~ [a3,c4,d4,e4]@31 [g3,b3,d4]@12 [c4,d4,f4,g4]@36 [g3,b3,d4]@16 [c4,f4,g4]@9]/5", // C Am G Csus4 G Csus4
  L: "[~@3 [c4,d4,e4,g4]@51 [a3,c4,d4,e4]@47 ~ [g3,b3,d4]@15 [c4,f4,g4]@11]/4", // C Am G Csus4
  M: "[~ [c4,d4,e4,g4]@51 ~ [a3,c4,d4,e4]@31 [g3,b3,d4]@12]/3", // C Am G
  N: "[[c4,d4,f4,g4]@51 ~ [g3,b3,d4]@31 [g3,a#3,d4,f4]@32 [a3,d4,f4]@32 [c4,f4,g4]@13]/5", // Csus4 G Gm7 Dm Csus4
  O: "[~@7 [c4,d4,e4,g4]@11 [g3,b3,d4]@32 [g3,a#3,d4,f4]@32 [a3,d4,f4]@31 [c4,e4,g4]@63 ~ [g3,b3,d4]@31 [g3,a#3,d4,f4]@32 [a3,d4,f4]@16]/8", // C G Gm7 Dm C G Gm7 Dm
  P: "~ [c4,f4,g4]", // Csus4
  Q: "[~@4 [c4,d4,e4,g4]@12 [g3,b3,d4]@31 [g3,a#3,d4,f4]@32 [a3,d4,f4]@32 [c4,e4,g4]@79 [g3,b3,d4]@2]/6", // C G Gm7 Dm C G
  R: "[~@14 [c4,f4,g4]@11 [c4,d4,e4,g4]@51 ~ [c4,f4,g4]@12 [g3,b3,d4]@51 [c4,f4,g4]@12 [c4,d4,e4,g4]@51 ~ [g3,a3,b3,d4]@32 ~@20]/8", // Csus4 C Csus4 G Csus4 C G
})).s("gm_synth_strings_2").gain(0.15)

// other · string ensemble 2
const string_ensemble_2 = note("<~@67 A@8 ~@10>".pickRestart({
  A: "[~ b4@4 c5@4 c5@8 c5@4 d5@39 e4@12 f4@4 c4@4 d4@24 d4@4 e4@4 f4@32 g3@23 g3@4 a3@4 a#3@32 a3@32 c4@17]/8",
})).s("gm_string_ensemble_2").gain(0.51)

// other · string ensemble 2
const string_ensemble_2_2 = note("<~@67 A@4 B@6 ~@8>".pickRestart({
  A: "[~@21 g3@20 g3@4 a3@3 a#3@32 ~@12 g4@12 a4@4 a4@20]/4",
  B: "[b4@4 c5@12 d5@43 e4@12 f4@4 c4@4 d4@24 g4@8 c5@23 g3@4 g3@4 c3@32 ~@18]/6",
})).s("gm_string_ensemble_2").gain(0.51)

// other · harpsichord
const harpsichord = note("<~@34 A@2 ~@12 B@2 ~@25 C@2 ~@8>".pickRestart({
  A: "[~@7 c7@8 ~]/2", B: "[~@27 d6@4 g6@4 d6@16 ~@13]/2", C: "[~@7 c7@16 ~@9]/2",
})).s("gm_harpsichord").gain(0.51)

// drums · tambourine
const tambourine = s("tb").struct("<~@58 A B C@2 D E@3 F G ~ H ~ H I J@2 K ~@9>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~@3 x ~@4", C: "~@11 x ~@20", D: "~@7 x ~@3 x ~@20", E: "~@5 x ~@10", F: "~@9 x ~@22",
  G: "~@5 x ~@3 x ~@22", H: "~ x ~@2", I: "~@3 x ~@3 x ~@24", J: "~@7 x ~@24", K: "~@3 x ~@12",
})).gain(0.41)

// drums · congas
const congas = s("conga:18").struct(`<
  ~@41 A B@2 C D@2 E F@2 G H@2 I J@2 K L@2 M N@2 O P@2 Q R@2 S T@2 U V@2 W X ~@9
>`.pickRestart({
  A: "~@2 x ~@14 x ~@14", B: "~ x ~@15 x ~@14", C: "~ x ~@14 x ~@15", D: "x!2", E: "x ~@15 x ~@14 x",
  F: "~@15 x ~@15 x", G: "~@15 x ~@14 x ~", H: "~@7 x ~@7 x", I: "~@14 x ~@14 x ~@2", J: "~@13 x ~@15 x ~@2",
  K: "~@13 x ~@14 x ~@3", L: "~@3 x ~@3 x", M: "~@12 x ~@14 x ~@4", N: "~@11 x ~@15 x ~@4", O: "~@11 x ~@14 x ~@5",
  P: "~@5 x ~@7 x ~@2", Q: "~@10 x ~@14 x ~@6", R: "~@9 x ~@15 x ~@6", S: "~@9 x ~@14 x ~@7", T: "~ x ~ x",
  U: "~@8 x ~@14 x ~@8", V: "~@7 x ~@15 x ~@8", W: "~@7 x ~@14 x ~@9", X: "~@3 x ~@12",
})).gain(1.64)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@40 A B C@2 D E@2 F G@2 H I@2 J K@2 L M@2 N O@2 P@3 Q@3 R@3 S T@2 U V ~@9
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@6 x ~@18 x ~@6", C: "~@5 x ~@19 x ~@6", D: "~@5 x ~@18 x ~@7", E: "~ x ~@4 x ~",
  F: "~@4 x ~@18 x ~@8", G: "~@3 x ~@19 x ~@8", H: "~@3 x ~@18 x ~@9", I: "~ x ~@9 x ~@4", J: "~@2 x ~@18 x ~@10",
  K: "~ x ~@19 x ~@10", L: "~ x ~@18 x ~@11", M: "x ~@4 x ~@2", N: "x ~@18 x ~@11 x", O: "~@19 x ~@11 x",
  P: "~@9 x ~@5 x", Q: "~@17 x ~@11 x ~@2", R: "~@4 x ~@2 x", S: "~@16 x ~@10 x ~@4", T: "~@15 x ~@11 x ~@4",
  U: "~@15 x ~@10 x ~@5", V: "~@7 x ~@8",
})).gain(1.64)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@41 A B A B C D E F E F G H I J I J K L M ~ M ~ N ~ O ~@3 P ~ Q ~ R ~ S ~@9
>`.pickRestart({
  A: "~@25 x ~@6", B: "~@5 x ~@26", C: "~@3 x", D: "~ x ~@6", E: "~@23 x ~@8", F: "~@3 x ~@28", G: "~@11 x ~@4",
  H: "~ x ~@14", I: "~@21 x ~@10", J: "~ x ~@30", K: "~@5 x ~@2", L: "x", M: "~@19 x ~@11 x", N: "~@9 x ~@5 x",
  O: "~@17 x ~@11 x ~@2", P: "~@4 x ~@2 x", Q: "~@16 x ~@10 x ~@4", R: "~@15 x ~@11 x ~@4", S: "~@7 x ~@8",
})).gain(1.56)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@41 A B A C D E F G H G I J K L M L N O P Q R Q S T U V@2 ~ W X Y Z AA Z AB ~@9
>`.pickRestart({
  A: "~@17 x ~@14", B: "~ x ~@15 x ~@14", C: "~ x ~@14 x ~@15", D: "~ x", E: "x!2", F: "~@16 x ~@14 x",
  G: "~@15 x ~@16", H: "~@15 x ~@15 x", I: "~@7 x ~@7 x", J: "~@7 x ~@8", K: "~@14 x ~@14 x ~@2", L: "~@13 x ~@18",
  M: "~@13 x ~@15 x ~@2", N: "~@3 x ~@3 x", O: "~@3 x ~@4", P: "~@12 x ~@14 x ~@4", Q: "~@11 x ~@20",
  R: "~@11 x ~@15 x ~@4", S: "~@5 x ~@7 x ~@2", T: "~@5 x ~@10", U: "~@10 x ~@14 x ~@6", V: "~@9 x ~@22", W: "~ x ~ x",
  X: "~ x ~@2", Y: "~@8 x ~@14 x ~@8", Z: "~@7 x ~@24", AA: "~@7 x ~@15 x ~@8", AB: "~@3 x ~@12",
})).gain(0.31)

stack(
  pad_metallic, pad_metallic_2, synth_strings_2, string_ensemble_2, string_ensemble_2_2, harpsichord, tambourine,
  congas, congas_2, cabasa, shaker
)

More by Roxette