Strudelify

Sonata in G for Descant recorder and Piano

James Hook

KeyG majorTempo144 bpm
0:00/0:00
// Sonata in G for Descant recorder and Piano — James Hook
// 144 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/6389276; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(144/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 · "Grand Piano"
const piano = note(`<
  A B C D A B E F G H I J G H K L M N O P M N Q R S@2 T U V W@2 X Y Z AA AB AC ~@8 G H I J G H K L AD ~ AE ~ AF ~@3 AD ~
  AE ~ AF AG ~@12 AH@3 AI AJ AK AJ AK AL AM ~@8 G H I J G H K AN AO@3 AP AQ AR AS AT AU AR AS AV AW AX AY AZ BA BB
>`.pickRestart({
  A: "g3 d4 b3 d4 g3 d4 b3 d4, g4@2 g4!2", B: "f#3 d4 a3 d4 f#3 d4 a3 d4, a4!2 d5@2",
  C: "g3 d4 b3 d4 a3 d4 g3 d4, b4 d5 c5 b4", D: "b4 a4 g4 f#4 e4 d4 e4 f#4, d3 ~",
  E: "c5 b4 c5 a4 [d4,g4]@2 [d3,f#4]@2, g3 c4 ~@2", F: "g3 d3 [g2,b3,g4] ~, [c4,a4] ~",
  G: "g3@2 d4@2 b3@2 d4@2 f#5 ~ d4@2 f#5 ~ d4@2, g5@4 g3 ~ b3 ~, ~@9 g5@3 ~ g5@3",
  H: "g#5 ~ d4@2 g#5 ~ d4@2 f#3@2 d4@2 a3@2 d4@2, f#3 ~ a3 ~@5, ~ a5@3 ~ a5@3 d6@8",
  I: "g3 d4 b3 d4 a3 d4 g3 d4, b5 d6 c6 b5", J: "b5 a5 g5 f#5 e5 d5 e5 f#5, d3 ~",
  K: "c6 b5 c6 a5 [d4,g5]@2 [d3,f#5]@2, g3 c4 ~@2", L: "g3 d3 [g2,b4,g5] ~, [c5,a5] ~",
  M: "g3 d4 b3 d4 g3 e4 c4 e4, d5!2 e5!2", N: "g3 d4 b3 d4 [g3,c5] [d4,b4] [b3,a4] [d4,g4], d5 ~",
  O: "g3 d4 b3 d4 [g3,e5] [e4,f#5] [c4,g5] [e4,e5], d5!2 ~@2", P: "g3 d4 b3 d4 g3 d4 b3 d4, d5 ~",
  Q: "e5 f#5 g5 e5 f#5 d5 e5 c#5, g3 e3 a3 a2", R: "d3@2 d2@2 e5 a4 c#5 a4, d5@2 ~ g4",
  S: "d5 a4 f#5 d5 e5 a4 c#5 a4, f#4 d4 ~ g4", T: "d5 a4 f#5 d5 e5 a4 g5 a4, f#4 d4 c#4 a3",
  U: "f#5 d5 g5 e5 f#5 d5 e5 c#5, d4 g3 a3 a2", V: "d3@2 d2@2 e5 a4 c#5 a4, d5@2 ~ g3",
  W: "d5 a4 f#5 a4 e5 a4 c#5 a4, f#3 d3 ~ g3", X: "d5 a4 f#5 a4 e5 a4 g5 a4, f#3 d3 c#3 a2",
  Y: "f#5 d5 g5 e5 f#5 d5 e5 c#5, d3 g3 a3 a2", Z: "d5 e5 d5 c#5 d5 e5 d5 c#5, d3 ~@3", AA: "d5 e5 d5 c#5 d5 e5 d5 c#5",
  AB: "d5 e5 d5 b4 c5 d5 c5 a4, d3 ~ d4 ~", AC: "b4 c5 b4 g4 a4 b4 a4 f#4, d3 ~ d4 ~", AD: "b4 ~", AE: "c5 ~",
  AF: "g5 ~", AG: "a5 ~",
  AH: "[~@6 d5@2 g4@2 c5@2 f#4@2 b4@2 e4@2 f#4 e4 d4@2 [b3,g4]@2, ~@3 f#4@2 e4@2 d4@2 c4@2 ~]/3", // Em
  AI: "f#4 g4 a4 b4 c5 a4 b4 g4, a3@2 f#3 g3", AJ: "f#4 a4 d4 e4 f#4 g4 a4 b4, d3 ~",
  AK: "c5 a4 d5 c5 b4 d5 b4 g4, f#3 g3", AL: "f#4 a4 d4 e4 f#4 g4 a4 f#4, d3 ~", AM: "d4 e4 f#4 g4 a4 b4 c5 a4, d3 ~",
  AN: "g3 d4 b3 d4 [g3,e5] [e4,g5] [c4,e5] [e4,c5], g5 ~", // C Em C
  AO: "[g3,b4] [d4,d5] [b3,b4] [d4,g4] [g3,e5] [e4,g5] [c4,e5] [e4,c5]", AP: "b4 d5 c5 a4 b4 g4 a4 f#4, g3 c4 d4 d3",
  AQ: "[g3,g4]@4 d4 ~ d4 ~", AR: "g4 ~ g4 ~ [d3,b4] ~ [d3,b4] ~", AS: "g3 ~ g3 ~ b3 ~ [b3,c5] b4, d5@11 ~@5",
  AT: "a4@2 a4@2 b4 a4 g4 a4, d4 d3", AU: "b4@2 g4@2 d4 ~ d4 ~, g3 ~", AV: "a4@2 a4@2 a4 g4 a4 b4, d4 d3",
  AW: "g3@2 d4@2 d5 c5 b4 a4, g4@2 f#3 d4", AX: "[g3,g4]@2 [d4,g4]@2 b4 a4 g4 a4, ~@2 d3 d4",
  AY: "[g3,b4]@2 [d4,g4]@2 d5 c5 b4 a4, ~@2 f#3 d4", AZ: "[g3,g4]@2 [d4,g4]@2 a4 g4 a4 b4, ~@2 d3 d4",
  BA: "[g3,g4] [g2,g3,b4,g5]", BB: "[g2,g3,b4,g5] ~",
})).s("gm_piano").gain(0.3)

// chords · piano · "Grand Piano" · soft notes
const piano_soft = note(`<
  ~@37 A B C D A B E F ~@8 G H I J K L M N G H I J O P Q R S T U V W X Y Z AA AB AC ~@9 A B C D A B E F ~@26
>`.pickRestart({
  A: "g3 d4 b3 d4 g3 d4 b3 d4, g4@2 g4!2", B: "f#3 d4 a3 d4 f#3 d4 a3 d4, a4!2 d5@2",
  C: "g3 d4 b3 d4 a3 d4 g3 d4, b4 d5 c5 b4", D: "b4 a4 g4 f#4 e4 d4 e4 f#4, d3 ~",
  E: "c5 b4 c5 a4 [d4,g4]@2 [d3,f#4]@2, g3 c4 ~@2", F: "g3 d3 [g2,b3,g4] ~, [c4,a4] ~",
  G: "g3 d4 b3 d4 [g3,c5] [d4,b4] [b3,a4] [d4,g4]", H: "[a3,c5] d4 [c4,a4] d4 [a3,f#4] d4 c4 d4",
  I: "f#3 d4 a3 d4 [f#3,d5] [d4,c5] [a3,b4] [d4,a4]", J: "[g3,d5] d4 [b3,b4] d4 [g3,g4] d4 b3 d4",
  K: "g3 d4 b3 d4 [g3,a5] [e4,g5] [c4,f#5] [e4,e5]", L: "[g3,d5] d4 [b3,d5] d4 [g3,e5] [d4,d5] [b3,c5] [d4,b4]",
  M: "[f#3,a4] [d4,c5] [g3,b4] [d4,d5] [a3,c5] d4 [g3,b4] d4", N: "d3 d4 c#4 d4 c4 d4 a3 d4, b4@2 a4 ~",
  O: "g3 e4 b3 e4 [g3,a5] [e4,g5] [b3,f#5] [e4,e5]", P: "f#3 d4 a3 d4 [f#3,g5] [d4,f#5] [a3,e5] [d4,d5]",
  Q: "e5 f#5 g5 e5 f#5 d5 e5 c#5, g3 e3 a3 a2", R: "d5@2 d4@2 d4@2 e4 f#4, d3 ~",
  S: "~@2 g3@2 g3@2 a3 b3, g4@11 ~ f4@4", T: "e4@2 e4@2 e4@2 f#4 g#4, c4@11 ~ b3@4",
  U: "a3@2 a3@2 a3@2 b3 c#4, a4@11 ~ g4@4", V: "f#4@2 f#4@2 f#4@2 g#4 a#4, d4@11 ~ c#4@4",
  W: "b3@2 b3@2 b3@2 c#4 d#4, b4@11 ~ a4@4", X: "g4@2 g4@2 g4@2 a4 b4, e4@11 ~ d4@4",
  Y: "c4@2 c4@2 c4@2 d4 e4, c5@11 ~ b4@4", Z: "a4@2 a4@2 a4@2 b4 c#5, f#4@11 ~ e4@4",
  AA: "d4@2 d4@2 d4@2 e4 f#4, d5@11 ~ c5@4", AB: "[g4,b4]@2 [d4,d5]@2 [f#4,a4]@2 d5 c5, ~@3 d4",
  AC: "b4@2 c5 b4 a4@2 ~@2, g4@11 ~@5",
})).s("gm_piano").gain(0.2)

stack(piano, piano_soft)