Strudelify

Kiss the Rain

Billie Myers

KeyA majorTempo88 bpm
0:00/0:00
// Kiss the Rain — Billie Myers
// 88 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 98 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.

// other · soprano sax · "Echo 1"
const soprano_sax = note(`<
  ~@8 A B ~ C A D E C F G H@2 I J K ~ K ~ K ~ L ~ K ~ K ~ K ~ K@3 ~@3 A D M N A D O P@2 Q R S I J K ~@8 K ~ K ~ K ~ K ~
  K ~ K ~ K ~ K@3 ~@12 A B ~ D
>`.pickRestart({
  A: "b3 a3 ~@6", B: "~@10 a3!2 c#4@2 b3@2", C: "~@2 a3!2 c#4@2 a3 a3@2 a3 b3@3 ~@3", D: "~@2 a3!2 c#4@2 b3@2 ~@8",
  E: "~@2 a3!2 c#4@2 a3 a3@2 a3 a3@3 ~@3", F: "b3 a3 ~@4 c#4 b3", G: "~ c#4 a3!2 ~@3 e3",
  H: "[b3 a3 ~@3 c#4 b3 a3@2 c#4 a3!2 ~@3 e3]/2", I: "c#4 b3 ~ e3 c#4 b3 ~ e3", J: "c#4 b3 ~ e3 c#4 b3 ~@2",
  K: "b4 a4 ~@6", L: "~@2 b4 a4 ~@4", M: "~@3 a3 c#4@2 a3 a3@2 a3 a3@3 ~@3", N: "~ a3!3 c#4@2 a3 a3@2 a3@2 b3@3 ~@2",
  O: "~@2 a3!2 c#4@2 a3 a3@2 a3 a3@2 ~@4",
  P: "[~@3 a3 c#4@2 b3@2 a3@2 a3!2 c#4@2 a3 a3@2 c#4@2 b3@2 ~@5 c#4@2 b3@2 a3@2]/2", Q: "b3 c#4 a3!2 ~@3 e3",
  R: "c#4 b3 ~@3 c#4 b3 a3", S: "d4 c#4 a3!2 ~@3 e3",
})).s("gm_soprano_sax").gain(0.09)

// other · soprano sax · "Echo 2"
const soprano_sax_2 = note(`<
  ~@8 A B C D@2 E F G@2 H I J K@2 L ~ L ~ L ~ M ~ L ~ L ~ L ~ L@3 ~@3 A E N@3 E F O P Q R S K@2 L ~@8 L ~ L ~ L ~ L ~ L
  ~ L ~ L ~ L@3 ~@12 A B C E
>`.pickRestart({
  A: "~@2 b3 a3 ~@4", B: "~@14 a3!2", C: "c#4 b3 ~@6", D: "[~@6 a3!2 c#4@2 a3 a3@2 a3 b3@4 ~@2 b3@2 a3@2 ~@8]/2",
  E: "~@6 a3!2 c#4@2 b3@2 ~@4", F: "~@6 a3!2 c#4@2 a3 a3@2 a3 a3@2", G: "[~@6 a3!2 c#4@2 a3 a3@2 a3 b3@4 ~@14]/2",
  H: "c#4 b3 ~ c#4 a3!2 ~@2", I: "~ e3 b3 a3 ~@3 c#4", J: "b3@2 a3@3 ~ c#4@2 a3@2 a3@2 ~@4",
  K: "~ e3 c#4 b3 ~ e3 c#4 b3", L: "~@2 b4 a4 ~@4", M: "~@4 b4 a4 ~@2",
  N: "[~@7 a3 c#4@2 a3 a3@2 a3 a3@4 ~@3 a3!3 c#4@2 a3 a3@2 a3@2 b3@4 ~ b3@2 a3@2 ~@8]/3",
  O: "~@7 a3 c#4@2 b3@2 a3@2 a3!2", P: "c#4@2 a3 a3@2 c#4@2 b3@2 ~@5 c#4@2", Q: "b3 a3 b3 c#4 a3!2 ~@2",
  R: "~ e3 c#4 b3 ~@3 c#4", S: "b3 a3 d4 c#4 a3!2 ~@2",
})).s("gm_soprano_sax").gain(0.02)

// other · distortion guitar · "Lead Guitar"
const distortion_guitar = note("<~@56 A@2 B C A B D E F ~@16 A@2 G H A@2 I J A@2 B K ~@5>".pickRestart({
  A: "~@6 a3@3 b3@3 a3@3 ~", B: "~@6 a3@3 b3@3 a3@2 c#4!2", C: "c#4 a3!2 a3@2 a3!2 b3!2 a3!2 a3@5",
  D: "c#4 a3!2 a3@2 a3!2 b3!2 a3!2 a3@3 b3!2", E: "b3 a3!2 a3@2 b3!4 a3!2 a3@2 ~ a3 b3",
  F: "b3 a3 a3@2 b3 a3@2 b3 a3@2 b3 a3@2 b3 a3!2", G: "~@6 a3@3 b3@3 a3@2 c#4@2",
  H: "c#4 a3!2 a3@3 a3 b3!2 a3!2 a3@4 ~", I: "~@6 a3@3 b3@3 a3@2 d4!2",
  J: "d4 c#4!2 c#4@2 c#4!2 b3!2 a3!2 a3@2 a3 b3 a3", K: "c#4 a3!2 a3@2 a3!2 b3!2 a3!2 a3@4 ~",
})).s("gm_distortion_guitar").gain(0.6)

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note("<A B C@2 D ~@11 E@5 F G@8 H@8 ~@12 E@5 F ~@42>".pickRestart({
  A: "a2@11 ~ c#3@2 a2@2, e3", B: "[e2,b2]@15 ~", C: "[c#3@7 ~@3 e3@2 f#2@2 ~@2 a2@16, f#3 ~, ~@7 d3@9]/2",
  D: "[a2,e3]@7 ~, [g#3,d4] ~@15", E: "~@4 [d3,b3]@3 ~@5 [d3,b3]@3 ~",
  F: "d2@2 d3@2 [d3,b3]@3 ~ [d3,b3]@3 ~ [d3,b3]@3 ~, b3 ~@3", // G
  G: "[~ e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 a3, a2 c#3 d3 e2 a2 c#3 d3 e2, ~@7 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@7]/8",
  H: "[~ e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 a3, a2@8 c#3@8 d3@8 f#2@3 e2@5 a2@8 c#3@8 d3@8 e2@8, ~@7 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@7]/8",
})).s("gm_acoustic_guitar_steel").gain(0.35)

// chords · acoustic guitar steel · "Guitar" · soft notes
const acoustic_guitar_steel_2 = note("<~@46 [~ e3 e4 b3 ~ e3 e4 b3]!4 ~@48>").s("gm_acoustic_guitar_steel").gain(0.2)

// other · distortion guitar · "Guitar"
const distortion_guitar_2 = note(`<
  ~@56
  [c#3@2 d3@2 e3@11 ~]!3
  [e3@7 ~ e3@3 ~ e3@2 e3!2]
  [c#3@2 d3@2 e3@11 ~]!2
  [e3@7 ~ e3@3 ~ e3@2 e3!2]
  [e3@5 ~ e3@9 ~]
  [e3@15 ~]
  ~@33
>`).s("gm_distortion_guitar").gain(0.52)

// chords · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note("<~@65 A@8 B@8 C@3 D C@3 D C@3 E F ~@4>".pickRestart({
  A: "[~ e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 a3, a2 c#3 d3 e2 a2 c#3 d3 e2, ~@7 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@7]/8",
  B: "[~ e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 ~@2 e3 e4 b3@2 e3 b3 a3, a2@8 c#3@8 d3@8 f#2@3 e2@5 a2@8 c#3@8 d3@8 e2@8, ~@7 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@7]/8",
  C: "c#3@2 d3@2 e3@11 ~", D: "e3@7 ~ e3@3 ~ e3@2 e3!2", E: "e3@7 ~ e3@3 ~ e3@3 ~", F: "e3@15 ~",
})).s("gm_acoustic_guitar_nylon").gain(0.42)

// other · piano
const piano = note("<~@4 A@2 B@2 ~@30 A@2 B@2 ~@56>".pickRestart({
  A: "[~@4 a5@2 e5@4 c#5@4 a4@17 ~]/2", B: "[~@4 e5@2 c#5@4 a4@4 f#4@17 ~]/2",
})).s("gm_piano").gain(0.19)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  A@2 B C D E B C A@2 B C A@2 B C D F G H I J ~@16 A@2 B C A@2 B C A@2 B C D F G H I J A@2 B C A@2 B K@2 ~@16 A@2 B C
  A@2 B C A@2 B C A@2 B C L
>`.pickRestart({
  A: "[~@16 b2@15 ~, e3@31 ~]/2", B: "c#3@15 ~", C: "[a2,d3]@15 ~", D: "e3@15 ~", E: "b2@15 ~", F: "f#3@15 ~",
  G: "g#3@15 ~", H: "a3@15 ~", I: "[e3,g#3]@15 ~", J: "[d3,a3]@15 ~", K: "[[a2,d3]@31 ~]/2", L: "[e2,c#3]@15 ~",
})).s("gm_string_ensemble_1").gain(0.13)

// bass · electric bass finger · "Bass Guitar"
const bass = note(`<
  A B C D A B E F A B C D A B C D G C G C G H A I F J A I F B A I F K A I F@2 L G M N A B C D A B C D G C O C G F A B C
  D A B E F P A Q F R L I D R A I F S T I U@2 A B C D L G E D A B C D A B C D A
>`.pickRestart({
  A: "a1@15 ~", B: "e1@11 ~ e1@3 ~", C: "f#1@15 ~", D: "d2@11 ~ d2@3 ~", E: "f#1@11 ~ f#1@3 ~", F: "d2@15 ~",
  G: "e1@15 ~", H: "d1@7 c#1 d1@7 ~", I: "c#2@15 ~", J: "e1@7 ~ e1@3 ~ e1@2 f#1 g#1", K: "f#1@5 ~ e1@9 ~",
  L: "a1@11 ~ a1@3 ~", M: "f#1@11 ~ a1@3 ~", N: "d1@15 ~", O: "g#1@15 ~", P: "d2!16", Q: "c#2@11 ~ c#2@3 ~",
  R: "e1@7 ~ c#1 d1 e1 f#1 g#1 b1 a1 e1", S: "f#3@5 ~ g#3@3 g#3 e3 c#3 e3 b2 f#2 f#1", T: "a1@14 a1 b1",
  U: "[d2@5 ~ d2@5 ~ d2@6 d2@5 ~ d2@3 ~ d2@3 ~]/2",
})).s("gm_electric_bass_finger").gain(0.32)

// drums · kick
const kick = s("bd").struct("<A@59 B A@3 C D A@3 E A@3 F A@3 G A@3 H A@3 I A@6 J K A@4 L>".pickRestart({
  A: "x ~@2 x", B: "x ~@5 x!2", C: "x ~@3 x ~ x!2", D: "x!4 ~ x!3", E: "x ~@11 x!2 ~@2", F: "x ~@9 x ~ x!2 ~@2",
  G: "x ~@9 x!3 ~ x!2", H: "x ~@6 x ~@2 x ~ x!2 ~ x", I: "x ~@11 x ~ x!2", J: "x ~@8 x ~@2 x ~ x ~",
  K: "x ~@2 x ~ x ~ x ~ x ~@2 x ~ x ~", L: "x",
})).gain(0.27)

// drums · rim
const rim = s("rim").struct("<~@59 [~@6 x!2] ~@3 [~@4 x ~ x!2] [~@11 x ~@4] ~@26 [~@9 x ~@2 x ~ x ~] ~@6>").gain(0.27)

// drums · snare
const snare = s("sd").struct("<[x!16]!97 ~>").gain(0.24)

// drums · clap
const clap = s("cp").struct(`<
  [~@4 x ~@2 x ~ x ~@2 x ~@3]!55
  ~
  [~@4 x ~@2 x ~ x ~@6]!37
  [~@4 x ~@2 x ~ x ~@2 x ~@3]!4
  ~
>`).gain(0.24)

// drums · hihat
const hihat = s("hh").struct("<[x!7 ~]!97 ~>").gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct("<~@59 A ~@4 B ~@3 C ~@3 D ~@7 E ~@3 F ~@6 A B ~@5>".pickRestart({
  A: "~@13 x!2 ~", B: "~@3 x ~ x ~@3 x ~@4 x!2", C: "~@7 x", D: "~@11 x ~@4", E: "~@11 x ~ x!3", F: "~@12 x!3 ~",
})).gain(0.27)

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

// drums · high tom
const high_tom = s("ht").struct("<~@68 [~@3 x] ~@23 [~@10 x ~ x!2 ~@2] ~@5>").gain(0.27)

// drums · crash
const crash = s("cr").struct(`<
  ~@22 A ~@7 A ~@25 A ~@2 B A ~@3 C A ~@2 D ~@2 A E A ~@2 F A ~@2 G A H I H I H J H K H@2 L A ~@4
>`.pickRestart({
  A: "x", B: "~@12 x ~@2 x", C: "~@2 x ~ x ~ x ~@3 x ~ x!2 ~@2", D: "~@6 x!2", E: "~@10 x ~@2 x ~ x",
  F: "~@10 x ~ x ~@2 x", G: "~@7 x ~@2 x ~ x ~ x ~", H: "~ x ~ x", I: "x!2 ~ x", J: "~ x ~@4 x ~", K: "~ x!2 ~@3 x ~",
  L: "~ x!3 ~ x!3",
})).gain(0.27)

// drums · tambourine
const tambourine = s("tb").struct("<~@38 [x!16]!18 ~@42>").gain(0.24)

// drums · ride
const ride = s("rd").struct("<~@92 [~@13 x ~@2] ~@5>").gain(0.27)

stack(
  soprano_sax, soprano_sax_2, distortion_guitar, acoustic_guitar_steel, acoustic_guitar_steel_2, distortion_guitar_2,
  acoustic_guitar_nylon, piano, string_ensemble_1, bass, kick, rim, snare, clap, hihat, mid_tom, open_hat, high_tom,
  crash, tambourine, ride
)