Strudelify

Le Chateau Ambulant

Joe HASAISHI

KeyE♭ majorTempo120 bpm
0:00/0:00
// Le Chateau Ambulant — Joe HASAISHI
// 120 bpm, 3/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/3724286; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/3)

// 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
const piano = note(`<
  ~@4 A B C@2 ~@10 D E F G H I ~@8 J K L M N O P Q R ~@3 S T U V@2 W ~ X ~ Y Z AA AB AC AD AE ~@3 AF AG@2 AH@3 AI AJ@2
  AK@3 AL AM@2 AN AO@2 AP AQ@3 ~@4
>`.pickRestart({
  A: "~ [b5,d6], g5@15 ~", B: "g5 [b5,d6] g5 [b5,d6]", C: "[g5@15 ~]/2", D: "~@5 [d5,gb5]@5 ~ [gb5,a5]@5",
  E: "bb5@8 d5@3 ~@2 bb4@3, g5@11 g5@5", F: "~@13 a4@3, a4@13 ~@3, c5!2, ~@5 a5@11, ~@11 f5@5",
  G: "~@13 g4@3, bb4, g4@11 eb5@5, ~@5 g5@11, ~ c5", H: "~@13 a4@3, gb4, a4@11 gb5@5, ~@5 a5@11, ~ d5",
  I: "~@13 g4@3, d4, g4@11 d5@5, ~@5 g5@11, ~ bb4", J: "~@11 [bb4,bb6]@5, ~@5 [g4,g6]@11", K: "[d5,d7]@10 ~ [c5,c7]@5",
  L: "[bb4,bb6]@5 [a4,a6]@5 ~ [bb4,bb6]@5", M: "[c5,c7]@10 ~ [bb4,bb6]@5", N: "[a4,a6]@10 ~ [g4,g6]@5",
  O: "[f4,f6]@5 [eb4,eb6]@5 ~ [f4,f6]@5", // F Eb F
  P: "~@7 [a3,a5], [g4,g6]@7 [eb4,eb6]@2 [d4,d6]@2 [db4,db6] [c4,c6]@4, ~ [gb4,gb6]@7, ~ [f4,f6]@3, ~@5 [e4,e6]@11", // A G Eb D Db C Gb F …
  Q: "[g3,g5]@3 [bb3,bb5]@2 [d4,d6]@3 [g4,g6]@3 [bb4,bb6]@2 [d5,d7]@3", R: "[g5,g7]@3 ~@13",
  S: "~@13 eb4@3, ~@3 g5@13, ~@5 eb5@11, ~ c5, ~@11 g4@5", T: "[a4,a6]@11 [a4,a6]@5",
  U: "~@11 [c5,c7]@5, [a4,a6], ~@5 [bb4,bb6]@11", V: "[[d5,d7]@15 ~]/2",
  W: "~@13 g4@3, eb4, g4@11 eb5@5, ~@5 g5@11, ~ bb4",
  X: "[g4,g5]@3 [f4,f5]@2 [eb4,eb5]@3 [c4,c5]@3 [g3,g4]@2 [f3,f4]@3", Y: "[gb4,a4,d5,gb5,a5]@10 ~ [gb4,a4,d5,gb5,a5]@5",
  Z: "[gb4,a4,d5,gb5,a5]@5 [g4,bb4,e5,g5,bb5]@5 ~ [a4,c5,gb5,a5,c6]@5", AA: "~ bb4@15, [g4,d5,g5,bb5]",
  AB: "[f4,ab4,c5,f5,ab5] [f4,bb4,d5,f5,bb5]", AC: "[eb4,g4,bb4,eb5,g5]@15 ~", AD: "[f4,ab4,c5,d5,f5]@15 ~",
  AE: "[c4,eb4,g4,c5,eb5]@15 ~", AF: "[c4,f4,ab4,c5,f5]@15 ~",
  AG: "[[c4,f4,ab4,c5,eb5]@8 [c4,eb4,g4,c5,eb5]@15 ~ [b3,d4,g4,b4,d5]@8]/2", AH: "[[g3,c4,eb4,g4,c5]@23 ~]/3",
  AI: "[f4,ab4,c5,eb5,ab5]@15 ~", AJ: "[[f4,ab4,c5,eb5,g5]@8 [d4,g4,bb4,d5,g5]@15 ~ [d4,f4,bb4,d5,f5]@8]/2",
  AK: "[[eb4,g4,bb4,eb5,g5]@23 ~]/3", AL: "[eb4,g4,c5,eb5,a5]@15 ~",
  AM: "[[eb4,g4,c5,eb5,g5]@8 [d4,gb4,a4,c5,g5]@15 ~ [d4,gb4,a4,d5,gb5]@8]/2", AN: "[d4,g4,bb4,d5,a5]@15 ~",
  AO: "[[d4,g4,bb4,d5,g5]@8 [c4,f4,a4,c5,g5]@15 ~ [c4,f4,a4,c5,f5]@8]/2", AP: "[bb3,eb4,g4,bb4,f5]@15 ~",
  AQ: "[[bb3,eb4,g4,bb4,eb5]@8 [a3,d4,gb4,a4,eb5]@18 ~ [a3,d4,gb4,a4,d5]@10 ~@11]/3", // Eb D
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft = note("<~@12 A B C D ~ E F ~@5 G H I J K L M N O ~@27 P@2 ~@22 Q@5>".pickRestart({
  A: "eb5@5 c5@5 ~ [g4,c5]@5, g5, ~@5 eb5@11", B: "~@13 eb5@3, ~@5 [ab4,c5]@11, ~@5 ab5@5 ~ ab5@5, ~ f5",
  C: "~@13 ab5@3, ~@5 [d5,f5]@11, ~@5 d6@5 ~ d6@5, ~ bb5", D: "~@5 d6@3 bb5@3 d6@2 g5@3, ~@5 eb5@10 ~, ~@5 g5@8 ~@3",
  E: "[eb5,g5]@5 [d5,f5]@5 ~ [c5,eb5]@5", F: "[bb4,d5]@5 ~@11", G: "~@11 [eb4,eb6]@5, [g3,g5], ~@5 [c4,c6]@11",
  H: "[g4,g6]@10 ~ [g4,g6]@5", I: "[f4,f6]@5 [eb4,eb6]@5 ~ [d4,d6]@5", J: "[eb4,eb6]@15 ~",
  K: "~@11 [g4,g6]@5, [c4,c6], ~@5 [eb4,eb6]@11", L: "[c5,c7]@10 ~ [c5,c7]@5", M: "[c5,c7]@5 [bb4,bb6]@5 ~ [ab4,ab6]@5",
  N: "[bb4,bb6]@15 ~", O: "[d4,d6]", P: "[[b3,d4,g4,b4,d5]@23 ~@9]/2", Q: "[~@5 [g3,d4,g4,bb4,d5]@61 ~@14]/5",
})).s("gm_piano").gain(0.2)

// chords · piano
const piano_2 = note(`<
  A@8 ~@11 B C D E B ~@9 F E B C G H I J ~@4 K L M@2 N O P@2 Q@2 R S T U V ~@3 W@3 X@3 Y@3 Z@3 AA@3 AB@3 AC@4 ~@4
>`.pickRestart({
  A: "[~@24 g3@3 ~@13 f3@3 ~@13 [f3,ab3,c4]@3 ~@5 g3@38 ~@2 [g1,g2]@24, ~@11 c3@16 bb2@16 ab2@16 g2@32 ~@37, ~@13 g3@5 ~ g3@5 ~@5 f3@5 ~ f3@5 ~@5 eb3@8 c3@5 ~@3 d3@32 ~@35, ~@16 [c4,eb4,g4]@5 [c4,eb4,g4]@5 ~@6 [bb3,d4,f4]@5 [bb3,d4,f4]@5 ~@6 eb4@11 ~@5 [b3,d4]@61 ~@3, ~@48 [ab3,c4]@3 f2@8 ~@69]/8", // Fm G Cm Bb Bm Ab
  B: "~@5 [d3,bb3]@11, [g1,g2]", C: "~@5 [a3,eb4]@11, [f1,f2]", D: "~@5 [g3,eb4]@11, [c2,c3]",
  E: "~@5 [gb3,d4]@11, [d2,d3]", F: "~@5 [g3,eb4]@11, [a1,a2]", G: "~@5 [g3,db4]@11, [eb1,eb2]",
  H: "~@5 [gb3,c4]@11, [d1,d2]", I: "~@11 d2@5, [g1,g2], ~@5 [d3,bb3]@11", J: "g1@3 ~@13", K: "~@5 [c3,a3]@11",
  L: "~@5 [eb3,c4]@11, [f1,f2]", M: "[~@5 [d3,a3]@25 ~@2, [bb1,bb2]@15 ~]/2", N: "~@5 [eb3,bb3]@11, [eb1,eb2]",
  O: "~@13 g3@3, [eb1,eb2], ~@5 [bb2,g4]@11, ~@5 g3@6 eb4@5, ~ bb3", // Eb
  P: "[~@5 eb3@11 ~@13 [c2,c3]@3, a1@24 [g2,g3]@3 [eb2,eb3]@5, a2@19 c4@13, ~@5 c4@11 eb3@3 c3@2 [a2,a3]@11, ~ eb4]/2", // C G Eb A
  Q: "~@13 [a2,a3]@3, d2, d3@5 [d3,d4]@5 ~ [d3,d4]@5, ~@3 [a2,a3]@5 [a2,a3]@5 ~@3", // A D A
  R: "~@13 bb3@3, [g1,g2]@11 g3@5, ~@3 d2@13, ~@5 bb2@11, ~ d3", // G
  S: "~@5 ab3@3 ~@5 d4@3, [f1,f2] [bb1,bb2], ~@3 c3@5 ~@3 f3@5", T: "[eb1,eb2,bb2,eb3,bb3]", U: "[ab1,ab2,c3,f3,c4]",
  V: "[g1,g2,c3,g3,c4]", W: "[[f1,f2,ab2,c3,ab3]@23 ~ [g1,g2,b2,f3,b3]@23 ~]/3", X: "[[c1,c2,eb2,c3,eb3]@23 ~]/3",
  Y: "[[f1,f2,c3,f3,c4]@23 ~ [bb1,bb2,f3,bb3]@23 ~]/3", Z: "[[eb1,eb2,bb2,eb3,bb3]@23 ~]/3",
  AA: "[[a1,a2,c3,g3,c4]@23 ~ [d1,d2,a2,d3,a3]@23 ~]/3", AB: "[[g1,g2,bb2,g3,bb3]@23 ~ [f1,f2,a2,f3,a3]@23 ~]/3",
  AC: "[[f1,eb2,g2,eb3,g3]@23 ~ [d1,d2,gb2,d3,gb3]@28 ~@12]/4", // Cm D
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft_2 = note("<~@9 A B C@2 A D E@2 F G ~@6 A H I@2 A D E@2 ~@8 J K L@2 M ~@14 N@2 ~@22 O@5>".pickRestart({
  A: "~@5 [ab3,eb4]@11, [f1,f2]", B: "~@5 [g3,d4]@11, [g1,g2]", C: "[~@5 [g3,eb4]@27, [c2,c3]]/2",
  D: "~@5 [ab3,d4]@11, [bb1,bb2]", E: "[~@5 [g3,d4]@27, [eb1,eb2]]/2", F: "~@5 [g3,eb4]@11, [a1,a2]",
  G: "~@5 [gb3,d4]@11, [d2,d3]", H: "~@5 [f3,b3]@11, [g1,g2]", I: "[~@5 [c3,g3]@25 ~@2, [c1,c2]@15 ~]/2",
  J: "~@5 [f3,ab3]@5 ~ [f3,ab3,b3]@5, g2, b3@11 ~@5", K: "~@5 [f3,g3]@5 ~ [f3,g3,d4]@5, [g2,b3], ~@5 c4@11",
  L: "[~@5 [eb3,c4]@27, [c2,eb4]]/2", M: "[f1,f2]", N: "[[g1,g2,b2,f3,b3]@3 ~]/2", O: "[~@5 [g1,g2,bb2,d3]@61 ~@14]/5",
})).s("gm_piano").gain(0.2)

stack(piano, piano_soft, piano_2, piano_soft_2)