Strudelify

Rain and Tears

Aphrodite's Child

KeyF majorTempo69 bpm
0:00/0:00
// Rain and Tears — Aphrodite's Child
// 69 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 61 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(69/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D A B C E F G H I J K L M N O P Q J R L S F G H T J K L U N V N V J K L W X Y Z AA AB AC AD AE AF AC AD AG AF AC
  AD AG AF AC AD AG AH
>`.pickRestart({
  A: "bb2 a2", B: "g2 d2", C: "eb2 bb2", D: "c3 f2", E: "c3@4 f2@2 g2 a2", F: "bb2@5 ~ bb2@2 a2@5 bb2 a2@2",
  G: "g2@5 ~ g2@2 d3@2 a2 ~ d2@4", H: "eb2@5 ~ eb2@2 bb2@5 ~ bb2@2", I: "eb2@5 ~ eb2@2 f2@4 g2@2 a2@2",
  J: "bb2@5 ~ bb2 ~ a2@5 bb2 a2 ~", K: "g2@5 ~ g2 ~ d3@2 a2 ~ d2@4", L: "eb2@5 ~ eb2 ~ bb2@5 ~ bb2 ~",
  M: "eb2@3 ~ f2@2 a2@2 bb2@5 g2 f2 ~", N: "c3@5 ~ c3 ~ g2@5 ~ g2 ~", O: "d2@5 ~ d3 ~ d3@4 d2@4",
  P: "c2@5 ~ c3 ~ g2@5 ~ g2 ~", Q: "d2@5 ~ d2@2 f2@6 f2 ~", R: "g2@5 ~ bb2 ~ d2@5 ~ d2 ~",
  S: "eb2@3 ~ f2@2 a2@2 bb2@5 ~ f2 ~", T: "c2@5 ~ c2@2 f2@4 g2@2 a2@2", U: "eb2@3 ~ f2@2 a2@2 bb2@6 f2 ~", V: "d2@15 ~",
  W: "eb2@5 ~ f2@2 bb2@6 bb2 ~", X: "c3@5 ~ c3 ~ b2@5 c3 b2 ~", Y: "a2@5 ~ b2@2 e2@6 g2@2",
  Z: "f2@5 ~ f2 ~ c3@5 ~ c3 ~", AA: "f2@5 ~ f2@2 g2@6 g2 ~", AB: "c3@5 ~ c3 ~ b2@5 ~ b2 ~",
  AC: "a2@5 ~ c3 ~ e2@4 g2@2 e2 ~", AD: "f2@5 ~ g2 ~ c2@5 ~ c2 ~", AE: "f2@4 g2@4 c3@5 ~ g2 ~",
  AF: "c3@4 g2@2 c3 ~ b2@5 ~ b2 ~", AG: "d2@5 ~ d2 ~ g2@5 ~ g2 ~", AH: "c2 ~",
})).s("gm_acoustic_bass").gain(0.48)

// chords · harpsichord · "HARPSICHRD"
const harpsichord = note(`<
  A B C D A B E F G H E I G J K L M N M O G J K P Q R S T Q R S U V@4 G W X Y Z AA AB AC Z AA AB AD Z AA AB AE Z AA AB
  AE Z AA AB AE AF
>`.pickRestart({
  A: "~ f4 bb4 d5 c5 f4 a4 c5, bb3 a3, [bb4,d5] ~ a4 ~", B: "bb4 d4 g4 bb4 a4 d4 f4 a4, g3@8 f3@7 ~, g4 ~ f4 ~",
  C: "[eb4,g4] bb3 eb4 g4 f4 bb3 d4 f4, eb3@7 ~ bb2@8, ~@2 d4 ~", D: "e4 c4 bb4 e4 a4 f4 a4 c5, g3 c3 f3@2, ~@3 f4",
  E: "[eb4,g4]@2 bb3@2 eb4@2 f4 g4 f4@2 bb3@2 d4@2 f4@2, eb3@7 ~ bb2@8, ~@2 d4 ~", // Eb
  F: "e4@2 c4@2 bb4@2 a4 g4 a4@2 f4@2 a4@2 c5@2, g3 c3 f3@2, ~@3 f4",
  G: "~@2 f4@2 bb4@2 c5 d5 c5@2 f4@2 a4@2 c5@2, bb3 a3, [bb4,d5] ~ a4 ~", // Bb
  H: "bb4@2 d4@2 g4@2 a4 bb4 ~@2 g4@2 f4@2 a4@2, g3@8 [f3,a4]@7 ~, g4 ~ f4 ~", // F
  I: "eb4@2 bb3@2 [eb4,bb4]@2 a4 g4 a4@2 f4@2 a4@2 c5@2, [eb3,g3] ~ f3@2, ~@3 f4", // Eb5 Eb
  J: "bb4@2 d4@2 g4@2 a4 bb4 ~@2 g4@2 f4@2 f5@2, g3@8 [f3,a4]@7 ~, g4 ~ f4 ~", // F
  K: "[eb5,g5]@2 bb4@2 eb5@2 f5 g5 f5@2 bb4@2 d5@2 f5@2, eb4@7 ~ bb3@8, ~@2 d5 ~", // Eb
  L: "~@2 g4 ~ a5 [a5,bb5] [g5,a5] a5 d5@2 bb4 ~@3 bb4@2, [bb4,eb5,g5] [f4,c5,f5] [bb3,f4]@2, ~@3 a3@2 ~@3, ~@2 bb5 d5", // Bbmaj7 Gsus2 Eb F5 Bb5
  M: "~ eb4 g4 c5 d5 bb4 d5 bb4, c3 [bb2,g4,g5], [g4,c5] ~@3", // Eb C5
  N: "~ f4 a4 d5 ~ f5 [a4,f5] d5, d3 [f3,a5], [a4,d5]@5 ~@3 d5@4 ~@4", // Dm F D5
  O: "~@2 f4@2 a4@2 c5 d5 ~@6 a4@2, d3 [f3,c5], [a4,d5]@5 ~@3 a4@6 ~@2, ~@5 c4@3, ~@3 f4", // F5 D5
  P: "~@2 g4 ~ a5 [a5,bb5] [g5,a5] a5 [bb3,f4,d5,bb5]@7 bb4, [bb4,eb5,g5] [f4,c5,f5] ~@2, ~@3 a3@2 ~@3", // Bbmaj7 Gsus2 Bb Eb F5
  Q: "~@2 f4@2 d5 c5 bb4@2 c5@2 f4@2 a4 bb4 c5@2, bb3 a3, [d4,bb4] ~ a4 ~", // Gm
  R: "bb4@2 d4@2 g4 a4 bb4@2 ~@2 d4@2 f4@2 a4@2, g3@8 [f3,a4]@7 ~, g4 ~ f4 ~", // F
  S: "[eb4,g4]@2 ~@2 eb4 f4 g4@2 f4@2 bb3@2 d4@2 f4@2, eb3@7 ~ bb2@8, ~@2 bb3@5 ~ d4@4 ~@4", // Eb
  T: "e4@2 g4@2 bb4@2 a4 g4 a4@2 f4@2 a4@2 c5@2, c3 f3, g3 c4 ~ f4",
  U: "~@2 g4@2 a5 [a5,bb5] [g5,a5] a5 [d5,bb5]@2 bb4@2 ~@2 bb4@2, [bb3,eb4,g5] [f4,c5,f5] [bb3,f4]@2, ~@3 a3@2 ~ d5@2", // Bbmaj7 Gsus2 Gm Eb F5 Bb5
  V: "[~ eb4 g4 c5 d5 bb4 d5 ~ [f4,a4,d5]@8, c3@8 [bb2,g4,g5]@7 d3@16 ~, [g4,c5]@2 ~@5 bb4 ~@8]/2", // Dm Eb C5
  W: "bb4@2 d4@2 g4@2 a4 bb4 f4@2 f4@2 d4@2 f4@2, g3@8 [f3,a4]@7 ~, g4 ~@3", // F
  X: "[eb3,g4]@2 bb3@2 eb4@2 f4 g4 f4@2 ~@2 d5@2 f5@2, ~ [bb3,d4], ~@5 bb4@3", // Eb Bb
  Y: "g5@2 g4@2 a5 [a5,bb5] [g5,a5] a5 d5@2 bb4 ~@3 bb4@2, [bb4,eb5] [f4,c5,f5] [bb3,f4]@2, ~@3 a3@2 ~@3, ~@2 bb5 d5", // Bbmaj7 Gsus2 Eb5 F5 Bb5
  Z: "[c5,e5]@6 d5 e5 d5@5 ~ d5@2, [c4,g4] [b3,g4,b4]", AA: "c5 d5 c5@4 b4 c5 e4@6 e4@2, [a3,e4,a4] [g3,g4,b4]",
  AB: "a4@6 g4 a4 [c4,e4,g4]@8, [f3,c4,f4] ~", // C F5
  AC: "f3@2 c5@2 [g4,b4]@2 a4@2 [b3,b4,c5] b4@4 ~@3, c4 [g3,g4], f4@3 f4@3 ~@2, a4 ~@3", // G Cmaj7 G
  AD: "[f3,f4,a4]@4 b4 [b4,c5] [b3,a4,b4] b4 [c4,c5]@7 c4, ~ d4@3, ~@4 [g3,g4]@4 e4 ~@7", // F Cmaj7 B7 C G
  AE: "~@2 c5@2 [g4,b4]@2 [gb4,a4]@2 [b3,b4,c5] b4@4 ~@3, a3@7 ~, [d4,gb4] ~ [g3,g4]@2", AF: "[c4,e4,g4,c5]@3 ~",
})).s("gm_harpsichord").gain(0.18).pan(0.6)

// other · vibraphone
const vibraphone = note(`<
  ~@8 A B C D A B C E F G H I A B C J ~@8 F G K L A B C E M N O P M Q R S T U V ~@10
>`.pickRestart({
  A: "d5@2 bb4@2 f5@3 ~", B: "bb5@5 ~ g5@2 d5@5 ~ f5@2", C: "bb4@3 g5 bb4@3 d5",
  D: "eb5@2 d5@2 eb5@2 d5@2 f5@3 [d5,eb5] c5@2 ~@2", E: "eb5 d5 eb5 a4 bb4@2 ~@2", F: "c5@3 ~ c5@2 d5 g4@7 d5@2",
  G: "d5 ~", H: "c5@3 ~ c5@2 d5 g4@6 ~ d5@2", I: "d5@6 c5 d5 c5@5 ~@3", J: "eb5@2 d5@2 f5@2 ~ c5 d5@3 c5 bb4 ~@3",
  K: "c5@3 ~ c5@2 d5 bb4@6 ~ d5@2", L: "d5@5 ~@3", M: "e5@2 c5@2 g5@3 ~", N: "c6@5 ~ a5@2 e5@5 ~ g5@2",
  O: "c5@3 a5 c5@3 e5", P: "f5@2 e5@2 f5@2 e5@2 g5@2 f5 e5 d5@4", Q: "c6@6 a5@2 b5@2 a5 a5@3 ~@2, ~@11 g5 ~@4",
  R: "a5@3 f5 g5 ~@2 g5", S: "a5 g5 ~ e5 f5@2 d5 ~ e5 [c5,d5] d5 e5@2 ~@3", T: "c5 e5@2 g5 a5 g5 ~@2",
  U: "c6@4 d6@4 a5@2 g5@3 ~ e5@2", V: "c5@4 d5@4 c5@5 ~@3",
})).s("gm_vibraphone").gain(0.66)

// chords · rock organ · "0RGAN 3"
const rock_organ = note(`<
  A B C D A B C D E F G H E F G I J K J L E F G I E F G M E F G N J O J O E F G N P Q R S T U V W T U V X T U V X T U V
  X Y
>`.pickRestart({
  A: "[d5,bb5,bb6] [c5,a5,a6], f5", B: "[bb4,g5,g6] [a4,f5,f6], d5", C: "[eb5,g5,g6] [d5,f5,f6], bb4",
  D: "[e5,g5,g6] [f5,a5,a6], c5", E: "[d5,bb5] [c5,a5], f5", F: "[bb4,g5] [a4,f5], d5", G: "[eb5,g5] [d5,f5], bb4",
  H: "[g4,bb4,eb5] [a4,c5,f5]", I: "[g4,bb4,eb5] [a4,c5,f5] [bb4,d5,f5]@2", J: "[eb5,c6] [d5,bb5], g5", K: "[d5,f5,a5]",
  L: "[f5,a5,d6] [f5,a5,c6]", M: "[g4,c5,e5] [a4,c5,f5]", N: "[g4,bb4,eb5] [a4,c5,f5] [bb4,d5,f5,bb5]@2",
  O: "[d5,f5,a5]@13 ~@3", P: "[e4,c5] [b4,d5], g4", Q: "[a4,c5] [g4,b4], e5", R: "[a4,f5] [g4,e5], c5",
  S: "[a4,c5,f5] [b4,d5,g5]", T: "[e5,c6] [d5,b5], g5", U: "[c5,a5] [b4,g5], e5", V: "[f5,a5] [e5,g5], c5",
  W: "[a4,c5,f5] [b4,d5,g5] [c5,e5,g5]@2", X: "[a4,d5,gb5] [b4,d5,g5]", Y: "[g4,c5,e5]@3 ~",
})).s("gm_rock_organ").gain(0.14).pan(0.4)

// other · violin
const violin = note(`<
  ~@28
  [d5 bb4 f5@2]
  [bb5@2 g5@2 d5@3 f5]
  [bb4@6 g5@2 bb4@5 ~ d5@2]
  [eb5@2 d5@2 eb5@2 c5@2 bb4@7 ~]
  ~@29
>`).s("gm_violin").gain(0.27)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@4 A B C D E F G H I J K L M N O P E Q R S T U V W T U V X M Y O Z AA AB AC AD AE AF AG AH AI AJ AK AL AI AJ AK AM AI
  AJ AK AM AI AJ AK AM AN
>`.pickRestart({
  A: "bb4 a4", B: "g4 f4", C: "eb4 d4", D: "c4 f4", E: "[bb3,d6] [a3,c6]", F: "[g3,bb6] [f3,a6]",
  G: "[eb3,g6] [d3,bb5]", H: "[eb3,eb6] [f3,c6]", I: "[bb3,bb6] [a3,a6]", J: "[g3,g6] [f3,f6]", K: "[eb3,eb6] [d3,bb5]",
  L: "[eb3,eb6] [f3,f6] [bb2,bb5]@2", M: "c4 bb3", N: "a3", O: "g3", P: "f3", Q: "[g3,bb5] [f3,a5]",
  R: "[eb3,bb5] [d3,bb5]", S: "[eb3,bb5] [f3,a5] [bb2,bb5]@2", T: "bb3 a3", U: "g3 f3", V: "eb3 d3", W: "c3 f3",
  X: "eb3 f3 bb2@2", Y: "a3@11 ~@5", Z: "d3@11 ~@5", AA: "[bb3,bb5] [a3,a5]", AB: "[g3,g5] [f3,f5]",
  AC: "[eb3,g5] [d3,f5]", AD: "[eb3,eb5] [f3,f5] [bb2,bb4]@2", AE: "[c4,c6] [b3,d6]", AF: "[a3,e6] [g3,e6]",
  AG: "[f3,f6] [e3,e6]", AH: "[f3,c6] [g3,b5]", AI: "[c4,c6] [b3,b5]", AJ: "[a3,a5] [g3,e6]", AK: "[f3,c6] [e3,c6]",
  AL: "[f3,a5] [g3,b5] [c3,c6]@2", AM: "[d3,a5] [g3,b5]", AN: "[c3,c6]@3 ~",
})).s("gm_string_ensemble_2").gain(0.27)

// other · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note("<~@48 A B C D A B C D A B C D E>".pickRestart({
  A: "c4@2 e4@2 g4 ~ c4 ~ b3@2 e4@2 g4 ~ b3 ~", B: "a3@2 e4@2 g4@2 a3 ~ g3@2 b3@2 e4@2 b3 ~",
  C: "a3@2 a4@2 f4@2 c4 ~ e3@2 g3@2 c4@2 g3 ~", D: "d3@2 gb3@2 d4@2 gb3 ~ g3@2 b3@2 d4@2 b3 ~", E: "c4 ~@3",
})).s("gm_pizzicato_strings").gain(0.2).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A@5 B A@3 B A@5 C D A B E A B A@3 F A F A B A@3 B G H A@5 I G B A I G B A I G B F
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@5 x ~ x ~@4 x ~ x", C: "x ~@4 x ~ x!2 ~@5 x ~", D: "x ~@2 x!2 ~@3",
  E: "x!2 ~ x!2 ~@2 x", F: "x", G: "x!2 ~@2 x ~@2 x", H: "x ~@4 x ~ x!2 ~ x ~@4 x", I: "x ~@4 x ~ x!2 ~ x ~@3 x ~",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@8 A@7 B A@3 B A@7 C A@3 B A ~ A ~ A@3 B A@20 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@4 x ~@6 x!2 ~@3",
})).gain(0.4)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@3 A ~@11 A ~@7 A ~@3 B ~@3 A ~@7 C ~@5>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@7 x", C: "~@14 x!2",
})).gain(0.33)

// drums · crash
const crash = s("cr").struct("<~@16 A ~@2 B A ~@4 B ~@6 A@2 ~ A ~@4 A ~ C D A ~@3 A ~@3 A ~@3 A ~@3 A>".pickRestart({
  A: "x", B: "~ x", C: "~ x ~@2", D: "~@3 x",
})).gain(0.27)

// drums · ride
const ride = s("rd").struct(`<
  ~@8 A B@3 A B@3 A B@3 C B@3 A D B@2 A B@3 A ~ B ~ A B@3 C B E F C B@3 C B@3 C B@3 C B@3 ~
>`.pickRestart({
  A: "x ~ x!6", B: "x!8", C: "~@2 x!6", D: "x!4 ~ x!3", E: "x!2 ~ x!5", F: "x!6 ~ x",
})).gain(0.27)

// drums · ride · soft notes
const ride_soft = s("rd").struct(`<
  ~@8 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~@3 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@2
>`.pickRestart({
  A: "~ x ~@6", B: "~@13 x ~@2",
})).gain(0.13)

stack(
  bass, harpsichord, vibraphone, rock_organ, violin, string_ensemble_2, pizzicato_strings, kick, snare, low_tom,
  mid_tom, crash, ride, ride_soft
)