Strudelify

Rainy Night House

Joni Mitchell

KeyD minorTempo120 bpm
0:00/0:00
// Rainy Night House — Joni Mitchell
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: ch 2 "Adlib Violin" named as a string part, played on violin (its choir aahs patch is not one)
// note: Full arrangement: all 73 bars on a 24-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.

// chords · piano · "Adlib Piano"
const piano = note(`<
  A B C D E F G H I F J K@2 L M N O P Q R S@2 T U V W X Y Z AA AB AC AD@2 AE AF AG AH AI AJ AK Q AL AM AN T U AO AP AQ
  AR AS AT AU@7 AV@2 AW@3 AX@8
>`.pickRestart({
  A: "g4@9 g4@2 ~ g4@6 g4@6", B: "g5@2 gb5@2 e5@2 a4 b4", C: "c5@2 [d4,g4] [c4,g4]", D: "[b3,g4]@3 [c4,g4] [c4,g4]@4",
  E: "~@4 d4 e4@2 [d4,f4]", F: "[d4,f4] f3 bb3@2", G: "~ c4!3 c4@2 a3 db4, ~ a3@3 ~@4",
  H: "db4@9 db4@3 db4@3 [db4,e4]@6 ~ d4@2", I: "d4@2 ~@2 d4 e4@2 [d4,f4]", J: "~ c4!2 d4 ~@2 c4 a3, ~ a3@3 ~@4",
  K: "[db4@3 db4@9 [db4,e4]@9 f4@2 ~ d4@12 d4@3 e4@6 [d4,f4]@3, ~@23 e4@2 ~@23]/2", L: "f4 g4 [b3,g4]@2, c4 ~",
  M: "~@2 c4@2 d4@2 [c4,e4]!2", N: "[c4,e4] [d4,f4] [a3,f4]@6", O: "~@6 bb3@6 c4@6 ~ d4@3 d4@2",
  P: "~ d4@3 [f4,a4]@9 [f4,a4]@2 g4@3 ~ f4@3 [e4,g4]@2", Q: "~ [e4,g4]@12 [c4,e4]@11", R: "~@7 [e4,g4]@6 [c4,e4]@6 ~@5",
  S: "[~ e4@3 g4@3 g4@3 c4@3 c4@3 c4@6 c4@3 ~@12 e4@6 d4@5, ~ c4@9 ~@6 e4@21 ~@11, ~@25 b3@23]/2", T: "~ [b3,d4]@23",
  U: "~@10 f4@3 f4@3 [f4,d5]@6 c5@2", V: "~ [c5,a5]@6 [b4,g5]@6 [a4,f5]@6 [g4,e5]@3 f4@2",
  W: "~ [f4,d5]@9 a4@3 ~ f5@8 c5@2, ~@13 a4@9 ~@2", X: "~ a5@3 b4@3 g5@3 a4@3 f5@3 g4@3 e5@3 f4@2",
  Y: "~ [f4,d5]@6 d4@3 d4@3 e4@6 [d4,f4]@5", Z: "~ [d4,f4]@12 bb3@6 bb3@5",
  AA: "~@4 c4@3 c4@3 c4@3 c4@3 a3@8, ~@4 a3@9 ~@11", AB: "~@7 db4@3 db4@2 db4@6 [db4,e4]@6", AC: "d4@3 [a4,d5,f5]",
  AD: "[[bb4,d5,g5]@21 [c5,a5]@2 ~ [a4,d5,e5]@24, ~@23 [bb4,g5]@2 ~@23]/2", AE: "[a4,db5,e5]",
  AF: "~@6 d4@6 e4@6 ~ [d4,f4]@3 [c4,f4]@2", AG: "~ f4@3 g4@3 ~@6 b3@11, ~ c4@12 ~@11, ~@7 g4@17",
  AH: "~@7 c4@3 c4@3 d4@3 [c4,e4]@6 [c4,e4]@2", AI: "~ [c4,e4]@9 [a3,f4]@3 [a3,f4]@11", AJ: "~@7 bb3@6 c4@6 d4@3 d4@2",
  AK: "~ d4@3 [f4,a4]@9 [f4,a4]@6 f4@5", AL: "~@7 [e4,g4]@6 [c4,e4]@11",
  AM: "~ e4@3 g4@3 g4@3 c4@3 c4@3 c4@6 c4@2, ~ c4@9 ~@6 e4@8", AN: "~ e4@12 e4@6 d4@5, ~ b3@23",
  AO: "~ a5@6 f5@3 d5@3 b5@3 e5@3 c6@3 f5@2", AP: "~ d6@3 a5@3 f6@6 g5@3 c5@3 a5@3 d5@2",
  AQ: "~ b5@6 e5@6 f5@6 [g4,e5]@5", AR: "~ [f4,d5]@12 d4@2 e4@6 [d4,f4]@3", AS: "[d4,f4]@4 [d4,f4] bb3 bb3@2",
  AT: "~@2 [a3,c4]!2 c4@3 a3, ~@4 a3 ~@3", // Am
  AU: "[~@6 db4@2 db4@3 [db4,e4]@6 [db4,e4]@6 d4@12 d4@3 d4@3 e4@3 f4@3 [d4,f4]@6 f3@3 f3@3 bb3@6 bb3@6 c4@3 [a3,d4]@9 [a3,c4]@9 a3@3 db4@15 db4@3 [db4,e4]@3 f4@3 d4@12 d4@3 e4@6 [d4,f4]@3 f4@3 g4@3 ~@12 g4@6 ~, ~@143 c4@12 b3@12 ~, ~@149 g4@12 ~@7]/7", // Dbm Dm D5 Am Dbm Dm
  AV: "[~@5 c4@3 c4@3 d4@6 [c4,e4]@3 [c4,e4]@3 [c4,e4]@9 [a3,f4]@3 [a3,f4]@2 [a3,f4]@9 ~@2]/2", // C Dm
  AW: "[~@5 bb3@6 c4@6 d4@3 d4@3 d4@3 [f4,a4]@6 [f4,a4]@3 [f4,a4]@6 f4@6 [e4,g4]@9 e4@3 [c4,e4]@12 ~]/3", // F Em C
  AX: "[~@5 [e4,g4]@6 [c4,e4]@11 ~ e4@3 g4@3 g4@3 c4@2 c4@12 ~@4 e4@3 d4@18 b3@12 [a3,c4]@12 b3@12 [g3,b3]@6 [g3,b3]@6 [f4,a4,d5]@9 ~ [f4,d5]@2 [e4,g4,c5]@12 [f4,a4,d5]@42 ~@7, ~@22 c4@9 ~@16 b3@24 d4@48 ~@9 [g4,e5]@2 ~@62]/8", // Em C Am G Dm C Dm C
})).s("gm_piano").gain(0.2)

// other · piano · "Adlib Piano"
const piano_2 = note(`<
  A B C@2 D E F C G E F H G I J K L M N O@2 P Q R S@3 T U V W X Y Z@2 AA AB AC AD AE M N O@2 P Q R S@3 AF E AG AH@8 AI@2
  AJ@7 AK@3
>`.pickRestart({
  A: "e3 b3 e4 b3 e3 b3 e4 b3", B: "e3 b3 e4 b3 e3 b3 e3 b2", C: "a2 e3 a3 e3 a2 e3 a3 e3",
  D: "d3 a3 d4 a3 d3 a3 d3 a2", E: "bb2 f3 bb2 f2 bb2 d3 f3 d3", F: "a2 e3 g3@2 a2 e3 g3 e3",
  G: "d3 a2 f3 a2 d3 a3 d3 a2", H: "a2 e3 a3 e3 a2 e3 a3@2", I: "g2 g3 d3 f3 g2 g3 d3 f3", J: "c3 g3 e3 g3 c3 g3 c3 g2",
  K: "f2 c3 f3 c3 f2 c3 f3 c3", L: "bb2@3 f3@3 bb2@3 f2@3 bb2@4 f3@3 bb2@3 f3@2",
  M: "~ d3@3 a3@3 d4@3 a3@3 d3@3 a3@3 d3@3 a3@2", N: "~ c3@3 g3@3 c4@3 g3@3 c3@3 g3@3 c3@3 g3@2",
  O: "~ a2@3 e3@3 a3@3 e3@3 a2@3 e3@3 a3@3 e3@2", P: "~ g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 g3@3 d3@2",
  Q: "~ g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 a3@3 g3@2", R: "~ d3@3 f3@3 a3@3 d4@3 d3@3 a3@3 d4@3 a3@2",
  S: "~ d3@3 a3@3 d4@3 a3@3 d3@3 a3@3 d4@3 a3@2", T: "~ d3@3 a3@3 d3@3 a2@3 d3@3 a3@3 d3@3 a2@2",
  U: "~ bb2@3 f3@3 bb2@3 f2@3 bb2@3 d3@3 f3@3 d3@2", V: "~ a2@3 e3@3 g3@3 e3@3 a2@3 e3@3 g3@3 e3@2",
  W: "~ a2@3 e3@3 g3@3 e3@2 a2@3 e3@3 g3@3 e3@3", X: "d3 a2 f3 a2 d3 a3 d4 a3", Y: "bb2 f3 bb3 f3 bb2 f3 bb3 f3",
  Z: "a2 e3 g3 e3 a2 e3 g3 e3", AA: "d3@3 a2@3 d3@3 a2@3 d3@4 a3@3 d3@3 a2@2",
  AB: "~ g2@3 g3@3 d3@3 g3@3 g2@3 g3@3 d3@3 g3@2", AC: "~ c3@3 g3@3 e3@3 g3@3 c3@3 g3@3 c3@3 g2@2",
  AD: "~ f2@3 c3@3 f3@3 c3@3 f2@3 c3@3 f3@3 c3@2", AE: "~ bb2@3 f3@3 bb2@3 f2@3 bb2@3 f3@3 bb2@3 f3@2",
  AF: "~ d3@3 a3@3 d4@3 a3@3 ~@2 a3@3 d3@3 a2@3, ~@13 d3@4 ~@7", AG: "a2 e3 g3 e3 a3 a2 g3 e3",
  AH: "[a2@3 e3@3 g3@2 e3@3 a2@3 e3@3 a3@3 e3@3 d3@3 a2@3 f3@3 a2@3 d3@3 a3@3 d3@3 a2@3 bb2@3 f3@3 bb2@3 f2@3 bb2@3 d3@3 f3@3 d3@3 a2@3 e3@3 g3@3 e3@3 a2@3 e3@3 g3@3 e3@3 a2@3 e3@3 g3@3 e3@3 a2@3 e3@3 a3@6 d3@3 a2@3 f3@3 a2@3 d3@3 g3@3 d3@3 a2@3 g2@3 g3@3 d3@3 g3@3 g2@3 g3@3 d3@3 g3@3 c3@3 g3@3 e3@3 g3@3 c3@3 g3@3 c3@3 g2@3 f2]/8",
  AI: "[~@2 c3@3 f3@3 c3@3 f2@3 c3@3 f3@3 c3@3 bb2@3 f3@3 bb2@3 f2@3 bb2@3 f3@3 bb2@3 f3@3 d3]/2",
  AJ: "[~@2 a3@3 d4@3 a3@3 d3@3 a3@3 d3@3 a3@3 c3@3 g3@3 c4@3 g3@3 c3@3 g3@3 c3@3 g3@3 a2@3 e3@3 a3@3 e3@3 a2@3 e3@3 a3@3 e3@3 a2@3 e3@3 a3@3 e3@3 a2@3 e3@3 a3@3 e3@3 g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 g3@3 d3@3 g2@3 d3@3 g3@3 d3@3 d2]/7",
  AK: "[~@2 a2@3 d3@3 a2@3 d2@3 a2@3 d3@3 a2@3 d2@42 ~@7]/3",
})).s("gm_piano").gain(0.2)

// chords · string ensemble 1 · "Adlib Strings" · Dm Gm F Eb Asus4 A
const string_ensemble_1 = note(`<
  ~@31
  [~@18 [a4,d5,f5]@5 ~]
  [[bb4,d5,g5]@20 ~ [c5,a5] ~ [bb4,g5]]
  [[a4,d5,e5]]
  [[a4,db5,e5]@23 ~]
  ~@38
>`).s("gm_string_ensemble_1").gain(0.31)

stack(piano, piano_2, string_ensemble_1)

More by Joni Mitchell