Strudelify
KeyG majorTempo113 bpm
0:00/0:00
// Rain — The Beatles
// 113 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 22, 4/4 at bar 22) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(113/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.

// chords · alto sax · "chorus"
const alto_sax = note(`<
  ~@15 A B@2 C@5 D E F@2 G ~ D E H@2 I ~@3 J K J L@2 M@2 D E F@2 G ~ D E H@2 I ~@3 J K J L@2 M@2 ~@7 N@2 ~@2 N@2 ~@6 N@2
  ~@2 N@2 ~@3
>`.pickRestart({
  A: "~@6 [d5,g5] [e5,a5]", B: "[[d5,g5]@2 [b4,d5]@2 [c5,e5]@8 ~@2 [d5,g5] [e5,a5]]/2",
  C: "[[d5,g5]@2 [b4,d5]@2 [c5,e5]@14 ~@2 [b4,d5]@7 [g4,b4]@2 [g4,b4]@7 ~@4]/5", D: "g5!2", E: "g5@3 [e5,g5] e5@2 c5@2",
  F: "[e5@12 e5 d5@2 d5]/2", G: "b4", H: "[e5@11 c5 e5 d5@2 d5]/2", I: "g4",
  J: "~@2 [d5,g5] [e5,a5] [d5,g5]@2 [b4,d5]@2", K: "[c5,e5]@3 ~", L: "[[c5,e5]@14 [g4,b4]!2]/2",
  M: "[[b4,g5]@9 [b4,d5]@3 ~@4]/2", N: "[~ [b5,d6]@7]/2",
})).s("gm_alto_sax").gain(0.44).pan(0.9)

// chords · distortion guitar · "guitar"
const distortion_guitar = note(`<
  A@2 B@7 C@2 D@7 C@2 E@3 F G@2 H@3 F I@2 J@3 K@8 L F I@2 H@3 F I@2 M@3 K@8 L N@7 O@4 P@8 O@4 Q@5
>`.pickRestart({
  A: "[~@15 b3, ~@2 g2@3 ~@3, ~@4 g3@4 ~@2 g3@2 ~ g3@2 ~, ~@6 b3@2 ~ b3@2 ~@3 c4@2, ~@7 c4@4 d4@4 ~]/2",
  B: "[~@20 g2@4 [g2,g3]@16 b3@4 ~@12 c4@4 ~@12 g2@4 [g2,g3,b3]@2 [g2,g3,b3]@4 b3@2 ~@2 c4@6 ~ [a3,d4] a3@6 ~@10 [g3,b3]@2, b3@2 ~ b3@2 ~ b3@2 ~ b3@2 ~@11 b3@2 ~ b3@2 b3@2 ~@3 a3@4 ~@7 g3@6 ~ [a3,c4]@4 ~@2, ~ g3@3 g2@6 ~@10 g2@6 g2@2 ~@13 [g2,g3]@2 ~@11 d2@2, ~@4 g3@4 ~@12 g3@8 ~@2 [g3,c4]@4 ~ b3@2 ~@5 b3@2 ~@3 d4@6 ~@3, ~@7 c4@4 ~@12 c4@4 ~@7 c4@4 ~@8 c4@3 ~@3 [g3,b3]@3 ~]/7", // G D5 G Am G C5 G
  C: "[~ [g3,b3]@2 g3 ~@3 [g3,c4]@3 ~@3 [g3,c4]@2 [g3,c4], ~@3 b3@2 ~ d2@2 ~@4 g2@2 ~@2, ~@4 [g3,c4]@3 ~@3 [g3,c4]@3 ~@3]/2", // G C5
  D: "[[g3,c4]@4 g3@4 ~@6 [g3,b3]@4 [g3,b3]@4 ~@10 d2@2 d2@4 ~@2 b3@4 ~@12 c4@4 g3@3 ~@9 g2@4 [g2,g3,b3]@2 [g2,g3,b3]@4 b3@2 ~@2 [g3,c4]@6 ~@2 a3@6 ~@10 [g3,b3]@2, ~@4 c4@8 d2@4 ~@8 g2@4 ~@10 d2@4 ~@2 b3@4 ~@2 b3@4 b3@4 ~@5 g3@5 ~@2 b3@4 ~@10 b3@4 ~@4 [g3,c4]@6 ~@2 [a3,c4]@8 d2@4, ~@4 [g3,b3]@3 ~@4 [g3,b3]@2 [g3,b3]@6 ~ [g2,g3]@4 ~@2 g2@2 ~@4 a3@4 ~@5 [g2,g3]@2 ~@9 [g3,b3]@3 ~, ~@23 c4@4 ~@3 c4@4 c4@4 ~@9 d4@6 ~@3]/7", // C5 G C5 G C5 Am G
  E: "[[g3,c4]@2 g3@2 [g2,g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3] [g3,b3]@2 ~@3 [g3,b3]@2 [g3,b3] g3 g3@2, ~@2 c4@4 g2@4 ~@5 [g3,b3]@2 ~@4 b3@2 ~, ~@8 g2@2 g2 ~]/3", // C5 G
  F: "[d2,g2,g3,b3]!2", // G
  G: "[[d2,g2,g3,b3]@8 [d2,g2,g3]@7 ~ [g3,d4]@2 [g3,d4]@6 [g3,d4]@2 [g3,d4]@6, ~ b3@2 ~, ~@15 c4@2 ~@15, ~@4 [d2,g2]@2 [d2,g2] ~]/2", // G G5
  H: "[[g3,d4]@2 [g3,d4]@6 [g3,d4]@2 g3@6 [g2,g3,b3]@4 [g2,g3,b3]@2 [g2,g3,b3]@4 b3@2 ~@17 g3@3, [d2,g2]@2 ~@2 [d2,g2]@2 ~@2 d2@4 ~ [g2,g3]@2 c4@4 ~@5, ~@10 d4@12 ~@6 b3@4 ~@2 g3@4 ~@2 g3@5 ~@3, ~@36 b3@7 b3@5]/3", // G5 G G5 G
  I: "[[d2,g2,g3,b3]@4 [d2,g2,g3]@4 [g3,d4] [g3,d4]@3 [g3,d4] [g3,d4]@3, ~ b3@2 ~, ~@4 [d2,g2]@2 [d2,g2] ~]/2", // G G5
  J: "[[g3,d4]@2 [g3,d4]@6 [g3,d4]@2 g3@6 [g3,b3]@4 b3@3 ~@23 b3@2, [d2,g2]@2 ~@2 [d2,g2]@2 ~@2 [d2,g2]@4 c4@2 ~@5 d4@4 ~, ~@10 d4@12 ~ b3@3 b3@4 b3@8 ~@6 c4@4, ~@10 g3@4 g3@2 ~ g3@4 g3@2 ~]/3", // G5 G G5
  K: "[~@7 [g3,c4]@3 c4@2 [a3,c4]@2 ~@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]!2 g3 c4 c4@2 c4@2 [a3,c4]@2 ~@2 [g2,g3,b3]@2 [g2,g3,b3]@2 [g2,g3,b3] [g2,g3,b3]@2 [g2,g3,b3]@2 ~@13 c4 ~ [g2,g3,b3]@2 [g2,g3,b3]!4 [g2,g3,b3]@2, [g2,g3,b3]@2 c4 ~@4 c4@3 ~ b3 ~@3 c4@3 ~@3 d4@2 d4 ~ d4 ~@6, ~@2 d2@4 ~@39 g3@2 ~@2 g3@2 g3@2 g3@2 ~@9, ~@5 b3@4 ~ g3@4 a3@4 ~@5 g3@3 g3@4 a3@4 ~@7 g3@2 ~ c4@2 ~ c4@4 ~ c4@2 ~ c4@2 ~@7]/8", // C5 Am G Am G
  L: "[g2,g3,b3]@2 [g2,g3,b3]!4 [g2,g3,b3]@2", // G
  M: "[[g3,d4] [g3,d4]@3 [g3,d4] g3@3 [g3,b3]@2 ~@13 b3, [d2,g2] ~ [d2,g2] ~ [d2,g2]@2 ~@6, ~@5 d4@6 ~ c4@2 ~@5 d4@4 ~, ~@10 g3@4 g3@2 ~ g3@4 g3@2 ~, ~@10 b3@3 b3@2 b3@4 ~@3 c4@2]/3", // G5 G G5
  N: "[g2@26 ~@11 g3 ~@15 g3 g3@2, d4@48 ~@3 c4@4 ~, b3@33 b3@15 ~ b3@4 ~@3, g3@30 g2@12 g2@3 d2 g2@2 ~@8, ~@26 g2@3 d2@2 g3@4 c4@3 g3@9 g3@4 ~@5]/7",
  O: "[~@13 g3 ~@2 g2@2 g2@3 ~@9 g2!2, ~@2 g2@4 g2@2 ~ b3@4 ~ g3@4 g3@4 g3@2 ~ c4@4 g3@2 ~, ~@5 d2@2 g3@4 c4@4 ~@3 b3@5 b3@4 b3@4 ~, ~@21 g2@3 ~@8]/4",
  P: "[g2@2 [g2,g3,b3]@2 g3@2 ~@10 g2@2 [g2,g3,b3]@2 g3@2 ~@7 c4 c4@4 ~@11 g3 g3@4 ~@11 g3 g3@2, ~@4 g2@4 ~@12 [g2,b3]@4 ~ [d2,g2,g3]@4 ~@5 g2@4 g2@2 ~ b3@4 ~@8 d2@2 ~@9, ~@4 b3@3 b3@4 d4@4 ~@8 c4@4 d4@4 ~@8 g3@4 c4@4 ~@8 g3@4 c4@4 ~, ~@6 g3@2 ~ c4@4 ~ b3@4 ~@4 g3@2 ~@13 d2@2 ~@11 g2@4 g2@2 ~ b3@4 ~@3]/8", // G G5
  Q: "[g2@2 [g2,g3,b3]@2 g3@2 ~@10 g2@2 [g2,g3,b3]@2 g3@2 ~@7 c4 c4@4 ~@6, ~@4 g2@4 ~@12 [g2,b3]@4 ~ [d2,g2,g3]@4 ~@11, ~@4 b3@3 b3@4 d4@4 ~@8 c4@4 d4@4 ~@9, ~@6 g3@2 ~ c4@4 ~ b3@4 ~@4 g3@2 ~@16]/5", // G G5
})).s("gm_distortion_guitar").gain(0.32).pan(0.3)

// bass · electric bass finger · "bass"
const bass = note(`<
  A B@2 C A D E D F D G H I J D E D F D G K L M N@4 O@2 N@4 O P Q R S T S U V W X Y@4 Z O Y@4 Z P Q R S T S U V W AA
  AB@2 AC AD AE AF AG AF AG AF AH AF AI AJ AK AD AE AF AG AF AG AF AH AF AI AJ AK ~
>`.pickRestart({
  A: "~@8 g2@4 g3@3 g3", B: "c3 d3 f3 g3 f3@4 g2@4 g3@3 g3", C: "c3 d3 f3 g3 f3@4 g2@4 ~@4",
  D: "c3 d3 f3 g3 f3@4 c3@4 c3@4", E: "c3 d3@3 d3@4 g2@4 g3@3 g3", F: "c3 d3 d3@4 f#2@2 g2@4 g3@3 g3",
  G: "g2@2 g2@4 a#2 b2 c3@4 c3@4", H: "g2@2 g2@2 b2 d3@3 g2@4 g2@4", I: "c3 d3 c3 d3@3 d3@2 g2@4 g2@4",
  J: "c3 d3 c3 d3@3 d3@2 g2@4 g3@3 g3", K: "g2@2 g2@2 b2 d3@3 g2 f2 g2@6", L: "g2@2 g2@2 d2 d2@2 d2",
  M: "g2@4 g2@3 g2 d2@2 d2@6", N: "[g2,g3]!4, f3 ~@3 f3 ~@3 f3 ~@3 f3 ~@3", O: "g2@4 g3@3 g3 c3 d3 f3 g3 f3@4",
  P: "g2@4 g3@3 g3 c3 d3 f3 g3 g3@4", Q: "g2@4 g2@4 c3 d3 f3 d3 c3 a#2 g2@2", R: "c3@4 c3@3 c3!2 d3 f3@4 d3@2",
  S: "g2@4 g2@3 g2 c3 d3 f3@4 d3@2", T: "c3@4 c3@3 c3 d3@3 d3@3 d3@2", U: "c3@4 c3@4 g2@2 g2@4 a#2 b2",
  V: "c3@4 c3@3 c3 g2@2 g2@2 b2 c3!2 d3", W: "g2@4 g2@3 g2 d2@2 d2@4 f2 g2",
  X: "g2@4 g2@3 c2 d2@2 c2 c3 ~ c3 d3@2, ~@5 d2 d3 ~", Y: "g3@3 d3@3 g2@2 g3@3 d3@3 g2@2, f3 ~@7 f3 ~@7",
  Z: "g3@4 g3@3 g3 c3 d3 f3 g3 f3@4", AA: "g2@4 g2@3 c2 d2@2 d2@2 ~@4, ~@10 c2 ~@5",
  AB: "[g3@2 g3@4 g3!2, f3 ~@7 f3 ~@15 f3 ~@3 f3 ~@3]/2", AC: "g3@4 ~@4 c3 d3 g3 c3 d3 g3 c3 d3, f3 ~@15",
  AD: "g2@4 g3@3 g3@3 g3@2 g3@2 d3@2", AE: "g2@4 g3@3 g3 c3 d3 f3 c3 d3 f3 c3 d3", AF: "g2@4 g3@3 g3 c3 d3 f3@4 d3@2",
  AG: "g2@4 g3@3 g3 c3 d3 g3 c3 d3 g3 c3 d3", AH: "g2@4 g3@3 g3 d3!6 d3@2", AI: "g2@4 g3 g3@2 g3!7 g3@2",
  AJ: "g2@4 g3@3 g3 c3 d3 g3@4 d3@2", AK: "g2@4 g3@3 g3 d3!2 c#3 c3 ~@2 b2@2",
})).s("gm_electric_bass_finger").gain(0.44).pan(0.3)

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

// drums · snare
const snare = s("sd").struct(`<
  A B@2 C D B E B F G H I B J B E B F G H K B@2 ~@3 L B M ~@3 N B O B@3 P B@3 Q G ~@3 L B M ~@3 N B O B@3 P B@3 Q B R S
  T B M B U B M B M B V B G B M B U B M B M B V B G ~
>`.pickRestart({
  A: "x!2 ~@2 x!3 ~@5 x ~@3", B: "~ x ~ x", C: "~@4 x ~@7 x!4", D: "x!5 ~ x ~@5 x ~@3", E: "x!3 ~@9 x ~@3",
  F: "~ x!2 ~ x!2 ~@6 x ~@3", G: "~ x ~@2", H: "x!5 ~@7 x!4", I: "x!2 ~ x ~@2 x ~", J: "x!4 ~@2 x ~@5 x ~@3",
  K: "x ~ x ~@3 x ~@4 x!4 ~", L: "~@5 x!8 ~ x ~", M: "~@4 x ~@3 x!3 ~@5", N: "x!13 ~ x ~", O: "~@4 x ~@4 x ~@3 x ~@2",
  P: "x!5 ~@5 x!2 ~@2 x ~", Q: "~@4 x ~@7 x!3 ~", R: "~@4 x!3 ~@9", S: "~@8 x!2 ~@2 x!2 ~@2", T: "x ~@7 x!4 ~ x ~@2",
  U: "~@4 x ~@3 x!2 ~@6", V: "~@4 x ~@3 x!2 ~ x ~ x ~@2",
})).gain(0.48).pan(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@2 C D B D B E B ~ D B D B D B E B ~@2 F B ~@4 F G ~@4 F G H@3 ~ H@3 I F ~@4 F G ~@4 F G H@3 ~ H@3 I J K ~@2 H L H
  M H L H L H N H N H L H M H L H L H N H N ~
>`.pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x!5 ~@3", D: "~@5 x!3", E: "x ~@2 x ~@2 x ~@3 x ~ x ~ x ~", F: "~ x!7", G: "x!4 ~@4",
  H: "~ x!15", I: "x!6 ~@2", J: "x!13 ~ x ~", K: "x", L: "x!7 ~@9", M: "x!7 ~@7 x ~", N: "x!8 ~@8",
})).gain(0.48).pan(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@77 [~@7 x] ~@11 [~@7 x] ~@3>").gain(0.64).pan(0.3)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@6 A ~@2 B C D ~ E ~ A ~@2 B C F ~@7 G ~@5 H ~@3 I ~@10 G ~@5 H ~@3 I ~@7 J ~ G ~ K ~ G ~ G ~ L ~ M ~ G ~ K ~ G ~ G ~
  L ~ M ~
>`.pickRestart({
  A: "~@3 x!4 ~@9", B: "~@3 x", C: "~@6 x!5 ~@5", D: "~ x ~@2", E: "~@4 x!2 ~@10", F: "~@4 x ~@3 x!3 ~@5",
  G: "~@11 x!4 ~", H: "~@4 x ~ x!2", I: "~@6 x!4 ~@2 x!2 ~@2", J: "~@6 x!2", K: "~@10 x ~@2 x ~@2", L: "~@5 x!2 ~",
  M: "~@8 x!7 ~",
})).gain(0.48).pan(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~ A ~ A ~@2 A ~ A ~ A ~ A ~@3 B ~@5 B ~ B ~@3 B ~ B@3 ~ B@3 ~ B ~@4 B ~ B ~@3 B ~ B@3 ~ B@3 ~@2 A ~@2 B ~ B ~ B
  ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@2
>`.pickRestart({
  A: "~ x", B: "x",
})).gain(0.48).pan(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@23 A@3 ~@3 A@3 ~@12 A@3 ~@3 A@3 ~@40>".pickRestart({
  A: "~ x ~ x",
})).gain(0.64).pan(0.3)

stack(alto_sax, distortion_guitar, bass, kick, snare, hihat, low_tom, mid_tom, crash, tambourine)

More by The Beatles