Strudelify

Spring Waltz

New Age

KeyG majorTempo120 bpm
0:00/0:00
// Spring Waltz — New Age
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 116 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. 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
const piano = note(`<
  A@6 B C@8 D@8 E@6 F@4 G@8 H@5 I J@8 K@2 L@6 M@3 N@4 O@8 P@2 Q@3 R@8 S@4 T@7 U@5 V@8 ~
>`.pickRestart({
  A: "[~@83 d4@13, ~@6 g4@7 g5@37 g3@14, ~@23 d4@27 g3@21 a4@47 g4@21 d5@53, ~@28 a4@25 ~@2 d4@10 d4@18 d5@40 d4@11 b4@44 ~@14, ~@33 b4@20 ~@7 g4@47 g3@21 a4@27 d4@6 g4@31]/6",
  B: "~@11 d4@5, ~@7 d6@25, ~@17 g4@15",
  C: "[~@155 g5@10 ~@52 f#5@39, b5@17 d6@24 b5@17 [e3,d6]@27 b5@7 a5@7 g5@23 a#4@7 d5@36 a5@53 ~@38, ~@6 [b4,a5]@12 ~@4 c4@9 c4@15 [f3,a5]@13 ~@5 b3@10 b3@31 [d#3,d6]@62 ~@40 d6@49, ~@11 g5@25 a4@16 g5@28 a4@25 ~@12 g4@50 ~@10 d4@35 ~@44, ~@27 g4@32 ~@10 g4@36 ~@6 a#3@24 a#5@10 a5@20 d3@64 ~@27]/8", // E7 B7 F D#maj7
  D: "[~@117 g5@6 ~@44 g5@10 ~@15 a3@30 ~@34, ~@6 d6@23 b5@5 [b4,a5]@5 g5@23 a4@15 g5@24 a4@5 b5@5 [b4,a5]@12 ~@17 a#4@6 d5@32 ~@78, ~@11 d4@9 d4@24 [f3,d6]@38 [e3,d6]@41 [d#3,d6]@29 a#5@26 ~@78, ~@16 g4@28 ~@4 c4@9 c4@9 b5@6 [b4,a5]@11 ~@8 g4@32 ~@11 g4@25 a5@18 a5@70 ~@9, ~@24 a4@20 ~@9 g4@30 ~@4 b3@9 b3@28 ~@5 a#3@49 ~@78]/8", // B7 Dm E7 D#maj7 B7
  E: "[~@45 d3@5 ~@83 d3@6 ~@27 d4@26, ~@9 g2@41 g2@27 d4@8 a4@69 d3@38, ~@14 d3@10 d3@10 d3@5 b3@12 ~@20 a3@21 d5@66 ~ a3@33, ~@19 g3@31 ~@5 d3@10 d3@32 ~ g2@15 d3@5 a3@5 d3@5 b3@9 ~@6 d3@6 g3@43, ~@29 a3@22 ~@9 g3@37 ~@6 d3@6 g3@28 ~@2 g2@53]/6",
  F: "[~@31 g4, ~@2 d5@29 [d3,a4]@11 ~@4 c3@10 ~ c3@28 ~@5 b2@17 b3@5 b4@6 a4@10, ~@7 d3@9 d3@10 b4@16 ~@9 g3@17 b4@5 [b3,a4]@6 g4@21 g3@28, ~@11 g3@25 g4@26 a3@22 d5@44, ~@21 a3@20 [f2,d5]@43 ~ e2@43]/4", // D5 B7 Dm
  G: "[~@31 a#4@6 ~@8 g4@9 ~@198 [b3,a4]@4, ~@2 d4@8 a#2@5 g3@5 a#3@35 ~@5 a2@20 a3@6 c4@6 d4@30 ~@22 d4@20 d3@21 [f2,d5]@22 b4@10 g4@24 a3@5 b4@10, ~@3 g4@23 d4@30 ~@8 d3@6 e3@29 [d3,f#4]@50 ~ g2@18 a3@4 b4@5 [b3,a4]@9 ~@8 g3@28 [e2,d5]@34, ~@4 d#2@33 a4@17 a4@64 ~@28 g4@9 d3@5 g3@26 ~@4 c3@8 c3@13 b3 a4@11 ~@8 g3@25, ~@5 d5@35 ~@14 d2@21 g3@25 ~@10 a3@39 d5@32 g4@22 a3@20 ~@4 b2@9 b2@20]/8", // B7 Dm D B7 E7
  H: "[~@37 a#4@6 ~@8 g4@12 ~@38 a3@6 ~@11 a3@18 ~@8 f#3@16, ~ g4@42 [a#3,a4]@21 ~@5 a2@39 ~@52, ~@7 [d#2,d5]@38 ~@19 [d2,e4]@44 ~@52, ~@12 a#2@18 d4@34 ~@10 d3@5 e3@5 g3@11 c4@12 ~@30 a3@15 ~@8, ~@18 g3@27 ~@18 a4@44 f#4@53]/5", // A#maj7 D#maj7 Dsus2
  I: "~@7 b3, ~@9 d5@23, ~@14 d3@9 d3@9, ~@19 g3@13",
  J: "[~@9 d3@5 ~@42 d3@16 ~@112 b4@5 ~@31 g3@28 ~@5 c3@3, a3@12 ~@2 g2@34 d4@24 d5@23 b4@5 [a3,a4]@9 [f2,d5]@41 [e2,d5]@20 a3@4 b3@5 d4@10 e2@20 [b3,g4]@39 [f2,d5]@8, ~@5 d4@30 b3@38 ~@18 g3@20 ~@7 g3@33 ~@4 b2@10 b2@24 a4@14 ~ a4 b4@9 a3@36 ~@6, ~@19 d3@10 d3@12 a3@32 ~@8 f3@23 g4@30 b4@17 ~@9 g3@30 ~@4 b2@55 ~@7, ~@24 g3@48 ~@5 c3@9 c3@24 ~@4 c3@9 c3@5 a3@11 a4@6 g4@45 ~@9 g3@7 a4@43 ~@7]/8", // A Dm E7 Em Dm
  K: "[~@16 b4@5 a4 ~@35 b4@5 [c3,a4]@2, ~@2 g3@19 b4@2 ~@3 g4@37 ~, ~@6 c3@15 c3@10 [f2,d5]@33, ~@11 a3@11 a4@10 ~@4 c3@10 ~ c3@5 a3@12, ~@41 g3@22 ~]/2", // F Dm
  L: "[~@102 b2@10 ~@25 a#4@5 ~@41 [a#3,a4]@7 g4@2, a4@10 d5@27 a3@24 e2@33 g4@18 ~@10 g3@20 a3@3 a4@3 g4@24 a3@5 a#4@15, ~@5 g4@27 b2@11 b4@24 g4@7 b2@6 f#4@32 [d#2,d5]@41 [d#2,d5]@39, ~@10 e2@16 g3@30 a4@57 ~@19 a#3@11 a4 a#4@9 ~@10 g3@29, ~@15 b2@6 f#3@28 b3@64 ~@4 a#2@10 a#2@26 ~@4 a#2@10 a#2@25]/6", // A#maj7 D#maj7
  M: "[~@39 c4@12 ~@12 a3@20 ~@13, ~@3 a4@32 ~@13, ~@2 d2@15 [d3,f#4]@15, ~@11 a2@41 ~@44, ~@8 d3@3 e3@15 ~@22]/3", // D
  N: "[~@31 [c3,c4], ~@13 d5@24 b4@5 [b3,a4]@5 g4@25 a3@23 f2@14 c3@5 a3@5 b3@9, ~@18 d3@9 ~ d3@23 [e2,d5]@26 b4@18 ~@4 c3@5 g3@24, ~@23 g3@28 ~@5 b2@10 b2@16 [b3,a4]@6 g4@40, ~@32 a3@19 ~@10 g3@33 d5@34]/4", // C B7 E7 B7
  O: "[~ g4@5 ~@37 c3@8 ~@35 [b2,g4]@6 ~@40 g4@7 ~@87 d3@18 ~@6 b2@6, ~@6 f2@24 c3@6 a3@15 d5@24 b2@6 [e2,a4]@12 ~@20 a3@12 [c3,a4]@14 ~@6 d3@10 d3@5 a3@23 [g2,g4]@62 ~@11, ~@7 e4@45 ~@9 g3@32 ~@4 c3@10 c3@12 b4@20 d5@60 d3@6 a3@40 ~@11, ~@11 c3@9 c3@5 g3@26 ~@5 b2@10 b2@5 a3@22 ~@9 g3@37 ~@11 g3@27 d4@64 ~@15, ~@16 f3@35 e2@24 b4@17 [f2,d5]@47 ~ g2@26 d3@5 b3@17 d3@5 g3@51 [e2,d6]@12]/8", // Em A5 F G Dm E7
  P: "[~@23 b2@5 ~@22 b5@6 [g3,a5]@6 g5@2, e3@28 [e2,d6]@18 f#3@11 ~@7, ~@4 b2@10 b5@15 ~@8 e3@20 ~@7, ~@9 g3@14 g5@34 ~@7, ~@14 b2@5 [a3,a5]@10 ~@4 b2@8 b2@16 ~@7]/2", // Gsus2 E7 A
  Q: "[~@40 c3@5 ~@43 g5@8, ~@3 [f2,d6]@25 c3@5 b3 a5@11 d6@28 [c3,b5]@7 a5@16, ~@8 c3@10 c3@9 b5@12 g5@22 c3@6 a3@29, ~@6 g3@17 f2@25, ~@23 a3@24 ~@4 c3@5 g3@40]/3", // Dm Cmaj7
  R: "[~@79 b5@6 ~@104 g5@14 ~@32 g4@15 ~@6, ~@10 [e2,d6]@26 b2@5 [b3,a5]@27 b2@5 a3@12 b5 [b3,a5]@7 g5@40 d4@5 a#3@35 a#5@8 [a#4,a5]@22 e5@53, ~@16 b2@10 b2@10 b5@21 b2@5 g3@38 d6@22 a#3@5 d#3@40 d5@37 a5@52, ~@21 g3@25 g5@33 b2@21 d#2@17 a#2@38 a#4@5 g4@44 ~@11 d4@14 ~@27, ~@31 a3@15 b2@5 [e2,d6]@50 ~@5 a#2@5 g3@33 g4@5 d4@55 ~@6 a3@9 a3@37]/8", // E7 B7 A#maj7 E7
  S: "[~@6 a4@8 ~@7 d6@38 ~@36 d4@7 ~@21 a4@5, c5@16 ~ d5@42 d6@25 b5@18 d6@26, ~@18 f#5@42 g3@43 ~@5 c4@10 c4@10, ~@65 d4@9 d4@5 a4@24 ~@10 g4@15, ~@69 g4@15 d4@5 [b4,a5]@6 g5@33]/4", // B7
  T: "[~@104 g5@8 ~@66 f#5@27 ~@15 d4@4, [c4,b5]@15 [e3,d6]@39 g5@29 d#4@29 a5@31 g4@62 ~@10 g4@9, ~@5 [f3,a5]@11 ~@4 b3@11 ~@6 a4@23 ~@11 g4@41 d3@20 d4@5 e4@64 ~@9 d4@10 ~@4, ~@10 g5@38 [g4,a5]@12 ~@5 a#3@11 a#3@13 a#5@8 [a#4,a5]@16 ~@9 c4@26 a4@5 g5@51 ~ d6@19, ~@26 g4@16 [b3,b5]@18 [d#3,d6]@53 ~@4 a3@10 a3@27 c5@51 ~@19]/7", // Cmaj7 E7 F Gsus2 A#maj7 B D#maj7
  U: "[~@6 b5@4 ~@39 b5@4 ~@40 b5@5 ~@42 a#5@6 ~@9 g5@5, ~ a4@16 g5@36 a5 b5 a5@5 g5@22 g4@6 b4@10 a5 b5 a5@5 g5@41 a5@14, ~@5 d4@17 ~@5 c4@11 ~@5 a4@23 [e3,d6]@44 [d#3,d6]@37 [a#4,a#5]@13, ~@10 a5@2 a5@10 d6@44 ~@11 f#4@33 ~@12 g4@26 ~@12, ~@11 [b4,b5]@11 ~@11 g4@34 ~@4 b3@39 ~@6 a#3@12 a#4@6 d5@26]/5", // E7 D#maj7 A# B
  V: "[~@113 [d4,a5,a6]@29 ~@70 g7@44, ~@3 a5@38 a3@5 d5@29 [e4,c6]@23 g6@44 g6@20 d4@64 ~@30, ~@4 d3@25 a3@6 e4@11 d3@6 a3@7 d4@26 [a3,e6]@59 a6@30 b4@64 ~@18, ~@9 a3@10 a3@5 d4@16 c5@19 g5@8 a5@30 d3@47 ~@2 [g3,d7]@64 d7@46, ~@14 c4@38 e5@46 g5@47 ~@6 d4@5 g4@64 ~@36]/8", // D5 C A5 G5
})).s("gm_piano").gain(0.2)

// chords · piano · soft notes
const piano_soft = note(`<
  A@2 B@3 C@4 D@2 ~ E@5 ~@3 F@4 ~@4 G@3 H@3 ~@2 I@2 ~@3 J@2 K@5 ~ L@2 M ~@4 N@2 ~ O@2 ~@2 P@5 ~@8 Q@2 ~@4 R@2 ~@5 S@4 ~
  T@3 ~@2 U@6 ~@4 V ~ W@5
>`.pickRestart({
  A: "[~@13 d4@10 ~@41, ~@7 g3@43 ~@14]/2", B: "[~@24 d4@5 ~@19, ~@13 b4@57 ~@26]/3",
  C: "[~@18 b4@21 ~@5 d4@10 ~@5 a4@22 ~ f3@28 ~@18, ~@11 a4@28 g3@43 ~@46]/4", D: "[~@28 b4@13 ~@23]/2",
  E: "[~@29 a5@22 g3@19 ~@10, ~@11 a3@42 a4@49 ~@58, ~@23 g4@33 d5@46 ~@58, ~@29 a4@12 d5@11 d4@50 ~@58, ~@17 c5@32 ~@31]/5",
  F: "[~@55 c5@7 [d4,d5,f#5]@43 ~@23, ~@18 d3@45 ~@65, ~@23 a3@9 ~@6 e4@25 ~@65, ~@28 d4@21 a4@14 ~@65, ~@43 g4@20 ~@65]/4", // D
  G: "[~@22 b4@11 g2@40 ~@23, ~@13 a4@21 ~@62, ~@14 b3@21 ~@61]/3", H: "[~@9 d4@2 ~@5, ~@31 f#3@35 ~@30]/3",
  I: "[~@13 d4@11 ~@8]/2", J: "[~@24 a#3@19 ~@21]/2",
  K: "[~@26 a3@11 ~@11 f#3@12 ~@45 g2@36 ~@19, ~@43 d3@60 g4@38 ~@19, ~@43 d4@24 d4@34 d4@32 ~@27, ~@15 f#3@5 ~@2 a3@4 ~@14]/5",
  L: "[~@8 f2@37 ~@19]/2", M: "~@12 c3@11 ~@9", N: "[~@31 b4@2 ~@31]/2", O: "[~@23 g3@25 ~@16]/2",
  P: "[~@57 f#3@12 ~@29 a3@11 g2@38 ~@13, ~@27 g3@25 ~@17 f#3@21 f#3@19 ~@51, ~@33 a3@19 ~@31 a3@15 ~@62, ~@45 d4@31 d4@34 ~@50]/5",
  Q: "[~@26 b3@27 ~@11, ~@19 d3@15 ~@30]/2", R: "[~@24 c3@19 ~@21, ~@17 b3@26 ~@21]/2",
  S: "[~@58 g4@19 ~ a4@46 ~@4, ~@9 c5@44 a4@17 ~@58, ~@13 d3@64 ~@51, ~@33 e4@47 ~@48, ~@37 d4@40 d4@48 ~@3]/4",
  T: "[~@7 f3@30 ~@26 b3@11 ~@22]/3",
  U: "[~@50 d4@27 g3@41 ~@16 c4@11 ~@5 f3@12 ~@30, ~@31 a4@12 a4@34 ~@42 f3@31 ~@42, ~@37 e5@40 ~@68 c4@18 ~@29]/6",
  V: "~@3 a3@18 ~@11",
  W: "[~@103 g1@53 ~@4, ~@13 d6@64 ~ [a5,b5]@64 ~@18, ~@40 a4@39 d6@64 ~@17, ~@53 d5@28 a6@64 ~@15, ~@61 g5@64 ~@35]/5", // Asus2
})).s("gm_piano").gain(0.1)

stack(piano, piano_soft)