Strudelify

Let It Rain

East 17

KeyA minorTempo130 bpm
0:00/0:00
// Let It Rain — East 17
// 130 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 · piano · "A.PIANO 3"
const piano = note("<~@49 A B C D E F G H ~@24 A B C D E F G H ~@8 A B C D E F G H ~@3>".pickRestart({
  A: "~@4 c6 a5 e5 c5 a4 e4 c4 a3 e3 c3 a2 e2", B: "~@4 c6 g5 e5 c5 g4 e4 c4 g3 e3 c3 g2 e2",
  C: "~@4 c6 a5 f5 c5 a4 f4 c4 a3 f3 c3 a2 f2", D: "~@4 d6 a5 f5 d5 a4 f4 d4 a3 f3 d3 a2 f2",
  E: "~@4 c6 a5 e5 c5 a4 e4 c4 a3 e3 c3 a2 ~", F: "~@4 c6 g5 e5 c5 g4 e4 c4 g3 e3 c3 ~@2",
  G: "~@4 c6 a5 f5 c5 a4 f4 c4 a3 f3 ~@3", H: "~@4 d6 a5 f5 d5 a4 f4 d4 a3 f3 ~@3",
})).s("gm_piano").gain(0.16).pan(0.4)

// other · piano · "A.PIANO 3" · soft notes
const piano_soft = note("<~@53 A B C D ~@28 A B C D ~@12 A B C D ~@3>".pickRestart({
  A: "~@15 e2", B: "~@14 g2 e2", C: "~@13 c3 a2 f2", D: "~@13 d3 a2 f2",
})).s("gm_piano").gain(0.08).pan(0.4)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@17 A ~@2 B C ~ D E F G F G F G F G H ~ I J H ~ K J L M N O L M N O L P Q R L P Q R F G F G F G F G H ~ I J H ~ K J L
  M N O L M N O A ~@2 B C ~ D E F G F G F G F G L P Q R L P Q R ~@3
>`.pickRestart({
  A: "a1@3 ~@13", B: "~@2 d1 ~@2 c1 c2 g1", C: "a1@5 ~@11", D: "~@15 c1", E: "d1@15 ~",
  F: "a1@3 ~ a1@2 ~ a1 ~ a1!2 ~ a1@2 g1@2", G: "a1@3 ~ a1@2 ~ a1 ~ a1!4 ~ g1@2", H: "a1@3 ~ a1@3 ~@3 a1@2 ~@2 a1@2",
  I: "~@10 a1@3 ~ a1@2", J: "~@7 g1", K: "a1@2 ~@2 a1@3 ~@3 a1@2 ~@2 a1@2", L: "a1!2 a1@2 a1 ~@2 a1 ~ a1!6 ~",
  M: "a1!3 ~ a1 ~ a1!2 ~ a1!6 ~", N: "d2!2 d2@2 d2 ~@2 d2 ~ d2!6 ~", O: "g1!3 ~ g1 ~ g1!2 ~ g1!6 ~",
  P: "c2!3 ~ c2 ~ c2!2 ~ c2!6 ~", Q: "f1!2 f1@2 f1 ~@2 f1 ~ f1!6 ~", R: "d2!3 ~ d2 ~ d2!2 ~ d2!6 ~",
})).s("gm_synth_bass_1").gain(0.6)

// bass · lead 2 sawtooth · "SAW WAVE"
const bass_2 = note(`<
  ~@21 A B C D ~@8 E F@2 G F H F I ~@8 J K L M J K L M ~@8 E F@2 G F H F I ~@8 N ~ O ~ N ~ O ~@9 J K L M J K L M ~@3
>`.pickRestart({
  A: "a2 ~ a2@2 ~@2 a2 ~@3 a2@2 ~ a2 ~@2", B: "c3 ~ c3@2 ~@2 c3 ~@3 c3@2 ~ c3 ~@2",
  C: "f2 ~ f2@2 ~@2 f2 ~@3 f2@2 ~ f2 ~@2", D: "d2 ~ d2@2 ~@2 d2 ~@3 d2@2 ~ d2 ~@2", E: "a1@3 ~ a1@3 ~@3 a1 ~@5",
  F: "~@2 a1 ~@3 a1 ~@3 a1 ~@3 a1 ~", G: "~@2 g1 ~@3 g1 ~@3 g1 ~@3 g1 ~", H: "~@2 a1 ~@3 a1 ~@3 a1@2 ~@2 a1 ~",
  I: "~@2 g1@3 ~ g1@2 ~@2 g1@2 ~@2 g1@2", J: "a1 ~ a1 ~ a1@2 ~ a1 ~ a1 ~ a1 ~ a1!2 ~",
  K: "c2 ~ c2 ~ c2@2 ~ c2 ~ c2 ~ c2 ~ c2!2 ~", L: "f1 ~ f1 ~ f1@2 ~ f1 ~ f1 ~ f1 ~ f1!2 ~",
  M: "d2 ~ d2 ~ d2@2 ~ d2 ~ d2 ~ d2 ~ d2!2 ~", N: "~@9 a1 a2 a3 a2 c2 ~ c2", O: "~@9 a1 a2 a3 a2 d2 ~ d2",
})).s("gm_lead_2_sawtooth").gain(0.15).pan(0)

// bass · lead 2 sawtooth · "SAW WAVE" · soft notes
const bass_soft = note("<~@33 A B@2 C B@3 D ~@24 A B@2 C B@3 D ~@35>".pickRestart({
  A: "~@8 a1 ~@3 a1 ~ a1 ~", B: "a1 ~@3 a1 ~@3 a1 ~@3 a1 ~@3", C: "a1 ~@3 g1 ~@3 g1 ~@3 g1 ~@3", D: "a1 ~@15",
})).s("gm_lead_2_sawtooth").gain(0.05).pan(0)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~ A@8 B@8 C D E F C D E F G@3 H G@3 H ~@8 I@3 J I@3 J K@8 G@3 H G@3 H ~@8 I@3 J I@3 J L M N O L M N P G@3 H G@3 H K@8
  Q@3
>`.pickRestart({
  A: "a1/4", B: "[[a3,a4]@16 [g4,g5]@16 ~@16 [d4,d5]@15 ~, a1, [c4,c5]@47 ~@17, [e4,e5]@32 [f4,a4,f5,a5]@31 ~]/4",
  C: "[a3,c4,e4]", D: "[c4,e4,g4]", E: "[f3,a3,c4]", F: "[d3,f3,a3]", G: "[a3,c4,e4]@9 ~@7", H: "[a3,c4,e4] ~",
  I: "[[c4,e4,c6,e6]@2 [d4,f4,d6,f6], [a3,a5]]/3", J: "[g3,b3,d4,g5,b5,d6]",
  K: "[[a3,a4]@16 [g4,g5]@16 ~@16 [d4,d5]@15 ~, [c4,c5]@47 ~@17, [e4,e5]@32 [f4,a4,f5,a5]@31 ~]/4", L: "[a2,a3,c4,e4]",
  M: "[c3,c4,e4,g4]", N: "[f2,f3,a3,c4]", O: "[d2,d3,f3,a3]", P: "[d3,f3,a3], d2@3 ~", Q: "[~ [a1,a2]@11]/3",
})).s("gm_string_ensemble_1").gain(0.3)

// other · percussive organ · "ORGAN 2"
const percussive_organ = note("<~@33 A@3 B A@3 B ~@24 A@3 B A@3 B ~@35>".pickRestart({
  A: "~@2 a4 ~ a5 a4 ~ a3 a4 ~ a4!2 a5 a4 ~@2", B: "~@2 g3 ~ g4 ~ g3 g4 g5 g3 g4 g5 g3 g4 g5 ~",
})).s("gm_percussive_organ").gain(0.25).pan(0.3)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~@9 A@8 B ~@2 C B ~ D E ~@8 F ~@2 G H ~ F I B ~@2 J F ~@2 I B ~@2 K L ~@11 F ~@2 G H ~ F I B ~@2 J F ~@2 I B ~@2 C B ~
  D E ~@8 B ~@2 K L ~@3 M@3
>`.pickRestart({
  A: "[a2@63 ~]/4", B: "a2@3 ~@13", C: "~@2 d2 ~@2 c2 c3 g2", D: "~@15 c2", E: "d2", F: "a2@3 ~ a2@3 ~@9", G: "~@15 g2",
  H: "a2@3 ~ a2@4 ~@8", I: "~ g2 ~ g2 ~ g2 ~ g2", J: "~@5 g2 ~ g2", K: "~ d2 g2 g#2", L: "a2 ~@3", M: "[~ a2@11]/3",
})).s("gm_distortion_guitar").gain(0.37).pan(0.4)

// other · lead 8 bass lead · "BASS&LEAD" · A D C A C A C D …
const lead_8_bass_lead = note(`<
  ~@5
  [[a5,a7] [d6,d8] [c6,c8] [a5,a7] [c6,c8] [a5,a7] [c6,c8] [d6,d8] [a5,a7] [d6,d8] [c6,c8] [a5,a7] [c6,c8] [a5,a7] [c6,c8] [d6,d8]]!20
  ~@24
  [[a5,a7] [d6,d8] [c6,c8] [a5,a7] [c6,c8] [a5,a7] [c6,c8] [d6,d8] [a5,a7] [d6,d8] [c6,c8] [a5,a7] [c6,c8] [a5,a7] [c6,c8] [d6,d8]]!8
  ~@40
  [[a5,a7] [d6,d8] [c6,c8] [a5,a7] [c6,c8] [a5,a7] [c6,c8] [d6,d8] [a5,a7] [d6,d8] [c6,c8] [a5,a7] [c6,c8] [a5,a7] [c6,c8] [d6,d8]]!8
  ~@3
>`).s("gm_lead_8_bass_lead").gain(0.08).pan(0.6)

// other · orchestra hit · "ORCH.HIT"
const orchestra_hit = note(`<
  ~ A ~@2 B ~@3 B ~@3 B ~@3 C D ~@7 E F E G E F E H ~@15 I J@2 ~@6 E F E G E F E H ~@15 I D ~@7 E F E G E F E K J@2 ~@6
  L@2 ~
>`.pickRestart({
  A: "a4@3 ~@5", B: "~@14 [a3,a4] ~", C: "~@7 [g3,g4]", D: "[a3,a4]@15 ~", E: "a4 ~@2 a4 ~@2 a4 ~@2 a4!2 ~ c5 ~ g4 ~",
  F: "a4 ~@2 a4 ~@2 a4 ~@2 a4!3 c5 ~ g4 ~", G: "a4 ~@2 [f2,g2,a2,b2,c3] [d3,e3,f3] ~@11, ~@4 [a3,a4]@9 ~@3",
  H: "a4 ~@2 [d2,e2,f2,g2,a2,b2] [a3,a4]@3 [g2,a2,b2,c3] [a3,a4]@5 ~@3, ~@4 [c3,d3] ~@3 [d3,e3] ~@7", // Em7 A Cmaj7 A Csus2 Dsus2
  I: "~@2 g4 ~@3 [g3,g4] ~@3 g4 ~@3 [g3,g4] ~", J: "[[a3,a4]@19 ~@13]/2",
  K: "a4 ~@2 [d2,e2,f2,g2,a2,b2] [a3,a4]@3 [g2,a2,b2,c3,d3] [a3,a4]@5 ~@3, ~@4 [c3,d3] ~@3 e3 ~@7", // Em7 A G A Csus2
  L: "[~@4 [a1,a2]@27 ~, [a3,a4]@13 ~@19]/2", // A
})).s("gm_orchestra_hit").gain(0.5).pan(0.4)

// other · orchestra hit · "ORCH.HIT" · soft notes
const orchestra_hit_soft = note("<~ A ~@26 B ~@3 C ~@15 D ~@11 B ~@3 C ~@15 D ~@11 E ~@3 C ~@11>".pickRestart({
  A: "a3@3 ~@5", B: "~ [g1,a1] [b1,c2,d2] e2 ~@12", C: "~@2 [f1,g1,a1,b1,c2] ~@3 [g1,a1,b1,c2] [d2,e2,f2] ~@8",
  D: "~@2 g3 ~@7 g3 ~@5", E: "~ [g1,a1] [b1,c2,d2,e2] ~@13",
})).s("gm_orchestra_hit").gain(0.25).pan(0.4)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  ~@24 A B ~@15 C D E@2 F G H ~@8 A ~@16 C D E@2 F G H ~@8 A B ~@14 A ~@3
>`.pickRestart({
  A: "~@7 g6@2 e6 c6 a5 e6 c6 a5 g5", B: "a5 ~@7", C: "~@14 c5 d5", D: "e5 ~@3 d5 ~@3 c5@2 ~@2 d5 ~ e5 ~",
  E: "~@8 a5 ~@3 g5 ~ a5 ~", F: "~@4 a5 ~@3 a6 ~@2 g6 ~@2 f6 ~", G: "e6@8 ~@2 d6 c6 b5 ~ a5 ~",
  H: "~@6 a5 ~ d6 ~@3 d6 ~ a5 ~",
})).s("gm_string_ensemble_1").gain(0.36).pan(0.7)

// bass · lead 8 bass lead · "BASS&LEAD"
const bass_3 = note("<~ [~@2 a1@2 ~ a1@2 ~ a1@2 ~ a1@2 ~ g1@2]!16 ~@91>").s("gm_lead_8_bass_lead").gain(0.29).pan(0.6)

// chords · synth brass 2 · "SYNBRASS 2"
const synth_brass_2 = note("<~@25 A B A B A B A B ~@24 A B A B A B A B ~@24 A B A B A B A B ~@11>".pickRestart({
  A: "[a4,c5,e5]@2 ~ [a4,c5,e5]@2 ~ [a4,c5,e5]@2 ~ [a4,c5,e5]!2 ~ [c5,e5,g5] ~ [g4,b4,d5] ~", // Am C G
  B: "[a4,c5,e5]@2 ~ [a4,c5,e5]@2 ~ [a4,c5,e5]@2 ~ [a4,c5,e5]!3 [c5,e5,g5] ~ [g4,b4,d5] ~", // Am C G
})).s("gm_synth_brass_2").gain(0.22).pan(0.3)

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

// drums · snare
const snare = s("sd").struct("<~@16 A ~@7 A B@56 ~@7 A B@16 ~@3>".pickRestart({
  A: "x!16", B: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x",
})).gain(0.43)

// drums · clap
const clap = s("cp").struct("<~@25 [~ x ~ x]!56 ~@8 [~ x ~ x]!16 x ~@2>").gain(0.71)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A ~@3 A ~@3 A ~@3 A ~@2 B A ~@10 C ~@3 D ~@23 E ~@3 C ~@3 D ~@16 A ~@6 F ~@3 C ~@3 D ~@7 E G ~@2
>`.pickRestart({
  A: "x", B: "~ x!3", C: "~ x ~@2", D: "~ x!2 ~", E: "~@8 x!2 ~ x!2 ~ x ~", F: "~@11 x!2 ~ x ~", G: "~@3 x!2 ~@11",
})).gain(0.64)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@4 A ~@3 A ~@3 A ~@3 B ~@91>".pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.43)

// drums · hihat
const hihat = s("hh").struct("<~@17 [x!4]!88 ~@3>").gain(0.57)

// drums · mid tom
const mid_tom = s("mt").struct("<~@56 [~@3 x ~@4] ~@31 [~@8 x!2 ~@6] ~@15 [~@3 x ~@4] [x!2 ~@6] ~@2>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@17 [~ x ~ x ~ x ~ x]!88 ~@3>").gain(0.57)

// drums · crash
const crash = s("cr").struct(`<
  A B ~@2 C B ~@2 D B ~@2 D B ~@2 E ~@7 B@2 ~@2 F B ~@2 G B ~@7 B ~@3 B ~@3 B ~@3 B ~@2 B@2 ~@2 F B ~@2 G B ~@7 B ~@3 B
  ~@10 B@2 ~@2 F B ~@2 G B ~@3 B ~@2 B@2 ~@2
>`.pickRestart({
  A: "~@9 x ~@6", B: "x", C: "~ x", D: "~@7 x", E: "x!4", F: "~ x ~ x", G: "~ x!2 ~",
})).gain(0.57)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@8 A ~@3 A ~@10 B ~@63 B ~@20>".pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.29)

// drums · ride
const ride = s("rd").struct("<~@25 [x!2]!56 ~@8 [x!2]!16 ~@3>").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@26 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: "~@7 x",
})).gain(0.5)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@17 A B C D E F G H A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D E F G H A B C D A B C D A B C D A B C D ~@3
>`.pickRestart({
  A: "x ~ x!3 ~@2 x!3 ~ x!3 ~ x", B: "x ~@2 x!3 ~ x!9", C: "x!2 ~ x!3 ~ x!2 ~@2 x!3 ~ x",
  D: "x ~@2 x!2 ~ x!4 ~ x!3 ~ x", E: "x ~ x!14", F: "x ~ x!3 ~ x!10", G: "x!5 ~ x!10", H: "x ~@2 x!2 ~@2 x!9",
})).gain(0.36)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~@17 A B C D E F G H A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D E F G H A B C D A B C D A B C D A B C D ~@3
>`.pickRestart({
  A: "~ x ~@3 x!2 ~@3 x ~@3 x ~", B: "~ x!2 ~@3 x ~@9", C: "~@2 x ~@3 x ~@2 x!2 ~@3 x ~",
  D: "~ x!2 ~@2 x ~@4 x ~@3 x ~", E: "~ x ~@14", F: "~ x ~@3 x ~@10", G: "~@5 x ~@10", H: "~ x!2 ~@2 x!2 ~@9",
})).gain(0.21)
// … 6 more lines

More by East 17