Strudelify

Between Sun & Moon

Rush

KeyD minorTempo120 bpm
0:00/0:00
// Between Sun & Moon — Rush
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 119 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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
const piano = note(`<
  A B@2 C@2 A B@2 C@2 A B@2 C@2 A B@2 C@2 A B@2 C@2 D E@2 F@2 G H@4 D E@2 I J@3 K@2 L@5 J@3 M@2 ~ A N@2 O@2 A P@2 C@2 A
  B@2 C@2 A B@2 C@2 D E@2 F@2 G H@4 D E@2 I J@3 K@2 L@5 J@3 M@2 ~ A N@2 O@2 A P@2 C@2 A B@2 Q
>`.pickRestart({
  A: "~@7 f4@7 ~@6 f4@7 ~@5", B: "[~ e4@7 ~@7 e4@7 ~@6 f4@7 ~@6 f4@7 ~@7 e4@7 ~@2]/2",
  C: "[~@4 e4@7 ~@6 f4@7 ~@7 f4@7 ~@6 e4@7 ~@6 e4@7]/2", D: "~@7 f4@6 e4@7 f4@3 ~@9",
  E: "[~ f4@7 e4@7 f4@3 ~@10 d4@7 d4@6 d4@3 ~@11 a4@5 a4 a4@3]/2", F: "[~@17 f4@7 e4@7 f4@3 ~@10 f4@7 e4@6 f4@3 ~@4]/2",
  G: "~@7 d4@6 d4@7 d4@3 ~@9",
  H: "[~ a4@5 a4@2 a4@3 ~@17 f4@7 e4@6 f4@3 ~@11 f4@6 e4@7 f4@3 ~@10 d4@7 d4@7 d4@3 ~@10 a4@5 a4@2 a4@3 ~@10]/4",
  I: "~@7 a3@25", J: "[~@2 g3@27 e3@26 f3@27 c4@13 ~]/3", K: "[~@13 g3@26 e3@25]/2",
  L: "[~@2 f3@27 c4@13 ~@13 g3@27 e3@27 f3@26 c4@13 ~@12]/5", M: "[~@13 g3@27 ~@24]/2",
  N: "[~ e4@7 ~@7 e4@7 ~@6 f4@7 ~@6 f4@7 ~@7 e4@6 f4@3]/2", O: "[~ g4@3 a4@3 ~@10 f4@7 ~@7 f4@7 ~@6 e4@7 ~@6 e4@7]/2",
  P: "[~ e4@7 ~@7 f5@3 ~@10 f4@7 ~@6 f4@7 ~@7 e4@7 ~@2]/2", Q: "~@4 e4@7 ~@21",
})).s("gm_piano").gain(0.46)

// other · piano
const piano_2 = note(`<
  A B@2 C@2 A B@2 C@2 A B@2 C@2 A B@2 C@2 A B@2 C@2 D E@2 F@2 G H@4 D E@2 I J K@3 ~ L@3 M@2 J ~ N@3 ~ A O@2 P@2 A Q@2
  C@2 A B@2 C@2 A B@2 C@2 D E@2 F@2 G H@4 D E@2 I J K@3 ~ L@3 M@2 J ~ N@3 ~ A O@2 P@2 A R@2 C@2 A B@2 S
>`.pickRestart({
  A: "~@7 c4@7 ~@6 c4@7 ~@5", B: "[~ c4@7 ~@7 c4@7 ~@6 c4@7 ~@6 c4@7 ~@7 c4@7 ~@2]/2",
  C: "[~@4 c4@7 ~@6 c4@7 ~@7 c4@7 ~@6 c4@7 ~@6 c4@7]/2", D: "~@7 d4@6 c4@7 d4@3 ~@9",
  E: "[~ d4@7 c4@7 d4@3 ~@10 c4@7 b3@6 c4@3 ~@11 f4@5 f4 f4@3]/2", F: "[~@17 d4@7 c4@7 d4@3 ~@10 d4@7 c4@6 d4@3 ~@4]/2",
  G: "~@7 c4@6 b3@7 c4@3 ~@9",
  H: "[~ f4@5 f4@2 f4@3 ~@17 d4@7 c4@6 d4@3 ~@11 d4@6 c4@7 d4@3 ~@10 c4@7 b3@7 c4@3 ~@10 f4@5 f4@2 f4@3 ~@10]/4",
  I: "~@7 f3@25", J: "~@2 d3@27 ~@3", K: "[~@23 c3@27 a3@27 d3@19]/3", L: "[~@2 c3@27 a3@26 d3@27 ~@14]/3",
  M: "[~@13 c3@26 a3@25]/2", N: "[~@6 a3@9 d3@9 ~@8]/3", O: "[~ c4@7 ~@7 c4@7 ~@6 c4@7 ~@6 c4@7 ~@7 c4@6 d4@3]/2",
  P: "[~ e4@3 f4@3 ~@10 c4@7 ~@7 c4@7 ~@6 c4@7 ~@6 c4@7]/2", Q: "[~ c4@7 ~@7 c5@3 ~@10 c4@7 ~@6 c4@7 ~@7 c4@7 ~@2]/2",
  R: "[~ c4@7 ~@7 e5@3 ~@10 c4@7 ~@6 c4@7 ~@7 c4@7 ~@2]/2", S: "~@4 c4@7 ~@21",
})).s("gm_piano").gain(0.46)

// other · piano
const piano_3 = note("<~@5 A B@5 C ~@41 D@2 ~@48 D@2 ~@14>".pickRestart({
  A: "~@7 c4@13 b3@7 a3@3 g3@2",
  B: "[~ a3@3 ~ g3@3 a3@3 f4@3 ~ d4@13 c4@13 b3@7 a3@3 g3@3 ~ d2@26 c4@13 ~ b3@6 a3@3 ~ g3@3 d3@3 e3@3 ~ d3@20 c4@13 b3@7 ~@5]/5",
  C: "~ d4@27 ~@4", D: "[~@7 [e3,g3,b3]@53 ~@4]/2",
})).s("gm_piano").gain(0.51)

// bass · piano
const bass = note("<~@4 A@7 B@4 C D@2 E@2 F@5 ~@29 G@4 H@2 I@5 C D@2 E@2 F@5 ~@29 G@4 H@2 J@5 K@3 L>".pickRestart({
  A: "[~@22 g2@3 a2@3 ~ d2@36 d2@3 ~ d2@20 d2@3 d2@27 d2@3 d2@13 f2@3 ~ g2@3 d2@30 d2@27 d2@25]/7",
  B: "[~ d2@10 g2@3 ~ a2@3 d2@10 d2@27 d2@26 d2@37 g2@3 a2@3 ~ d2@3]/4", C: "d2",
  D: "[~ d2@3 ~ d2@13 d2@3 d2@27 d2@3 d2@13]/2", E: "[~ f2@3 g2@3 d2@30 d2@3 ~ d2@20 d2@3]/2",
  F: "[d2@27 d2@3 d2@13 f2@3 ~ g2@3 d2@30 d2@3 d2@20 d2@3 ~ d2@26 d2@3 ~ d2@13 ~@10]/5",
  G: "[~@29 d2@30 d2@3 d2@20 d2@3 d2@27 d2@3 d2@10 d2@3]/4", H: "[~ d2@3 ~@3 d2@30 d2@3 ~ d2@20 d2@3]/2",
  I: "[d2@27 d2@3 d2@10 d2@3 d2@3 ~@4 d2@3 d2@7 d2@27 d2@26 d2@37 g2@3 a2@3 ~ d2@3]/5",
  J: "[d2@27 d2@3 d2@10 d2@3 d2@3 ~@4 d2@30 d2@3 d2@20 d2@3 ~ d2@26 d2@3 ~ d2@10 d2@3 d2@3 ~@4 d2@3]/5",
  K: "[d2@27 d2@3 d2@20 d2@3 d2@27 d2@3 d2@10 d2@3]/3", L: "~ d2@3 ~@3 d2@3 ~@22",
})).s("gm_piano").gain(0.51)

// other · epiano1
const epiano1 = note("<~@4 A@7 B@4 C D@2 E@2 F@6 ~@27 G@5 H@2 I@5 C D@2 E@2 F@6 ~@27 G@5 H@2 J@5 K@3 L>".pickRestart({
  A: "[~@22 g3@3 a3@3 ~ d3@36 d3@3 ~ d3@20 d3@3 d3@27 d3@3 d3@13 f3@3 ~ g3@3 d3@3 d3@27 d3@27 d3@25]/7",
  B: "[~ d3@10 g3@3 ~ a3@3 d3@10 d3@27 d3@26 d3@27 d3@10 g3@3 a3@3 ~ d3@3]/4", C: "d3",
  D: "[~ d3@3 ~ d3@13 d3@3 d3@27 d3@3 d3@13]/2", E: "[~ f3@3 g3@3 d3@30 d3@3 ~ d3@20 d3@3]/2",
  F: "[d3@27 d3@3 d3@13 f3@3 ~ g3@3 d3@30 d3@3 d3@20 d3@3 ~ d3@26 d3@3 ~ d3@13 f3@3 g3@3 ~ d3@7 ~@28]/6",
  G: "[~@14 e2@3 e2@3 ~ e2@3 e2@3 e2@3 ~ e2@3 e2@3 e2@3 ~ e2@3 e2@3 e2@3 ~ e2@3 e2@3 e2@3 ~ d3@30 d3@3 d3@20 d3@3 d3@27 d3@3 d3@10 d3@3]/5",
  H: "[~ d3@3 ~@3 d3@30 d3@3 ~ d3@20 d3@3]/2",
  I: "[d3@27 d3@3 d3@10 d3@3 d3@3 ~@4 d3@3 d3@7 d3@27 d3@26 d3@27 d3@10 g3@3 a3@3 ~ d3@3]/5",
  J: "[d3@27 d3@3 d3@10 d3@3 d3@3 ~@4 d3@30 d3@3 d3@20 d3@3 ~ d3@26 d3@3 ~ d3@10 d3@3 d3@3 ~@4 d3@3]/5",
  K: "[d3@27 d3@3 d3@20 d3@3 d3@27 d3@3 d3@10 d3@3]/3", L: "~ d3@3 ~@3 d3@3 ~@22",
})).s("gm_epiano1").gain(0.46)

// other · epiano2
const epiano2 = note(`<
  ~@11 A@4 B C@2 D@2 E F G H I ~@3 J@2 K L@2 M@2 N O@2 P ~@2 Q@2 R S@2 T@2 U V W@3 X@3 ~@5 A@4 B C@2 D@2 E F G H I ~@3
  J@2 K L@2 M@2 N O@2 P ~@2 Q@2 R S@2 T@2 U V W@3 X@3 ~@13
>`.pickRestart({
  A: "[~@31 f4@3 ~ d5@3 d5@3 c5@3 ~ c5@3 a4@7 g4@3 f4@3 a4@7 g4@3 f4@3 ~@17 f4@3 ~ f4@3 g4@7 f4@10 ~@13]/4",
  B: "~@13 f5@3 ~ f5@3 f5@3 g5@7 f5@2", C: "[~ d5@7 ~@10 a5@7 g5@3 g5@3 f5@3 ~ g5@3 g5@7 f5@10 ~@9]/2",
  D: "[~@21 a4@3 d5@3 d5@3 ~ c5@3 c5@3 a4@7 g4@3 f4@3 ~ a4@6 g4@3 ~ f4@3]/2", E: "~@13 f5@2 f5@2 f5@6 g5@3 ~ d5@3 d5@2",
  F: "~ c5@7 ~@24", G: "~@3 f5@3 f5@3 f5@3 ~ g5@6 f5@7 ~@6", H: "~@7 a5@7 g5@3 g5@3 ~ f5@3 g5@3 g5@5", I: "~ f5@5 ~@10",
  J: "[~@21 a4@3 d5@3 c5@3 ~ a4@3 d5@3 d5@3 ~ c5@10 ~@3 a4@3 f4@3 ~ g4@3]/2",
  K: "g4@3 g4@3 ~ g4@3 g4@3 g4@3 ~ a4@7 ~@8", L: "[~@28 f5@7 f5@3 e5@3 d5@3 ~ d5@3 d5@3 d5@7 c5@3 a4@3]/2",
  M: "[~@4 a4@3 d5@7 c5@7 a4@3 d5@7 c5@3 a4@7 g4@3 ~@20]/2", N: "~@13 g5@3 ~ g5@3 g5@3 f5@3 ~ g5@3 f5@2",
  O: "[~ a5@10 g5@3 ~ f5@3 g5@7 g5@3 f5@3 a5@3 ~ g5@7 ~@9 g5@7 g5@6]/2", P: "~ g5@6 f5@3 ~ e5@3 d5@10 ~@8",
  Q: "[~@21 c5@3 ~ a4@3 f4@3 c5@3 ~ d5@3 e5@3 d5@10 ~@13]/2", R: "~@7 b4@7 b4@7 e5@6 e5@5",
  S: "[~@2 c5@3 a4@7 ~@10 a4@3 b4@3 ~ c5@6 c5@7 g5@7 e5@6 d5@9]/2",
  T: "[~@11 d5@7 b4@7 b4@3 b4@3 d5@7 e5@7 c5@10 ~@9]/2", U: "~ c5@3 c5@3 c5@7 c5@7 g5@3 g5@3 e5@5",
  V: "~@2 e5@3 d5@7 ~@10 d5@7 d5@3",
  W: "[b4@3 b4@7 a4@7 d5@6 c5@7 c5@7 c5@6 d5@7 c5@10 ~@3 c5@3 ~ d5@3 e5@7 d5@6 d5@7 ~@6]/3",
  X: "[~ d5@6 d5@3 ~ b4@3 b4@23 ~@14 b4@3 b4@3 b4@3 ~ b4@6 a4@10 ~@19]/3",
})).s("gm_epiano2").gain(0.51)

// bass · harpsichord
const bass_2 = note(`<
  ~ A B C@2 D E F G@2 D H F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F I@2 D E F
  G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F G@2 D E F I@2 D E F G@2 D E F G@2 D E
  F J
>`.pickRestart({
  A: "~@28 a1@3 ~", B: "~@9 a1@3 ~@11 a1@3 ~@6", C: "[~@4 a1@3 ~@10 a1@3 ~@11 a1@3 ~@10 a1@3 ~@7 a1@3 a1@3 ~ a1@3]/2",
  D: "~@7 e1@3 ~@10 e1@3 ~@9", E: "~ e1@3 ~@11 e1@3 ~@10 e1@3 ~", F: "~@9 e1@3 ~@11 e1@3 ~@6",
  G: "[~@4 e1@3 ~@10 e1@3 ~@11 e1@3 ~@10 e1@3 ~@10 e1@3 ~@4]/2", H: "~ e1@3 ~@7 e1@3 ~ e1@3 e1@3 ~@7 e1@3 ~",
  I: "[~@4 e1@3 ~@7 e1@3 e1@3 ~ e1@3 e1@3 e1@3 ~ e1@3 e1@3 e1@3 ~ e1@3 e1@3 e1@3 ~ e1@3 e1@3 e1@3 ~ e1@3]/2",
  J: "~@4 e1@3 ~@25",
})).s("gm_harpsichord").gain(0.46)

// bass · piano
const bass_3 = note(`<
  ~@24 A@2 B@2 C D@2 E@2 F@2 G H@2 I@3 J@4 K L@5 M N O@8 ~@13 A@2 B@2 C D@2 E@2 F@2 G H@2 P Q@8 R@4 S@3 ~@15
>`.pickRestart({
  A: "[~@22 f2@3 g2@3 ~ d2@6 d2@3 ~@4 d2@3 d2@3 ~ d2@3 ~@3 d2@7 d2@2]/2",
  B: "[~@5 d2@3 d2@3 d2@3 ~@4 d2@7 d2@3 ~@3 d2@3 ~ d2@3 e2@3 d2@3 ~ a1@6 a1@3 ~@4 a1@3 a1@3]/2",
  C: "~ f2@3 e2@3 d2@7 d2@3 ~@4 d2@3 d2@3 d2@3 ~@2",
  D: "[~@2 d2@7 d2@3 ~@3 d2@3 ~ d2@3 d2@3 ~@4 c2@6 c2@3 ~@4 c2@3 c2@3 ~ d2@3 c2@3 g1@7 g1@2]/2",
  E: "[~@5 g1@3 g1@3 f2@3 ~ e2@3 d2@7 d2@3 ~@3 d2@3 ~ d2@3 d2@3 ~@4 d2@6 d2@3 ~@4 d2@3 d2@3]/2",
  F: "[~ d2@3 ~@3 c2@7 c2@3 ~@4 c2@3 c2@3 d2@3 ~ c2@3 g1@7 g1@3 ~@3 g1@3 ~ g1@3 f2@3 e2@3 ~ d2@3]/2",
  G: "d2@3 d2@3 ~@4 d2@3 d2@3 ~ d2@3 ~@3 d2@7 d2@2",
  H: "[~@5 d2@3 d2@3 d2@3 ~@4 c2@7 c2@3 ~@3 c2@3 ~ c2@3 d2@3 c2@3 ~ g1@6 g1@3 ~@4 g1@3 g1@3]/2",
  I: "[~ g1@3 g1@3 f1@10 f1@7 f1@7 f1@3 g1@10 g1@7 g1@6 g1@3 ~ e1@10 e1@6 e1@7 e1@3 f1@9]/3",
  J: "[~ f1@7 f1@7 f1@6 f1@7 f1@7 f1@6 f1@3 ~ g1@10 g1@6 g1@7 g1@3 e1@10 e1@7 e1@7 e1@3 f1@10 f1@7 f1@6 f1@7]/4",
  K: "f1@7 f1@6 f1@7 f1@3 g1@9",
  L: "[~ g1@7 g1@7 g1@3 e1@10 e1@7 e1@6 e1@3 ~ f1@10 f1@6 f1@7 f1@7 f1@6 f1@7 f1@7 f1@3 g1@10 g1@7 g1@6 g1@3 ~ e1@10 e1@6 e1@7 e1@3 f1@9]/5",
  M: "~ f1@7 f1@7 f1@6 f1@7 f1@4", N: "~@3 f1@6 f1@3 ~ g1@10 g1@6 g1@3", O: "[~@4 g1@3 e1@249]/8",
  P: "~ g1@3 g1@3 f1@10 f1@7 f1@7 f1",
  Q: "[~@2 g1@10 g1@7 g1@6 g1@3 ~ e1@10 e1@6 e1@7 ~@3 f1@10 f1@7 f1@7 f1@6 f1@7 f1@7 f1@6 f1@3 ~ g1@10 g1@6 g1@7 g1@3 e1@10 e1@7 e1@7 ~@3 f1@10 f1@7 f1@6 f1@7 f1@7 f1@6 f1@7 f1@3 g1@10 g1@7 g1@7 g1@3 e1@10 e1@4, ~@52 e1@83 ~@24 e1@83 ~@14]/8",
  R: "[~@3 e1@6 ~@4 f1@10 f1@6 f1@7 f1@7 f1@6 f1@7 f1@7 f1@3 g1@10 g1@7 g1@6 g1@3 ~ e1@10 e1@6 e1@10 f1@9, ~@9 e1@84 ~@35]/4",
  S: "[~ f1@7 f1@7 f1@6 f1@7 f1@7 f1@6 f1@3 ~ g1@10 g1@6 g1@7 g1@3 ~@25]/3",
})).s("gm_piano").gain(0.51)

stack(piano, piano_2, piano_3, bass, epiano1, epiano2, bass_2, bass_3)

More by Rush