Strudelify

Green Sleeves - Theme and Variations (Quartet)

Louis Fleury

KeyA minorTempo120 bpm
0:00/0:00
// Green Sleeves - Theme and Variations (Quartet) — Louis Fleury
// 120 bpm, 6/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/5473338; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 83 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/6)

// 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 · recorder
const recorder = note(`<
  ~ A B C D E F G H I J K L M N G O P Q R S T Q U V W X@3 Y@2 Z@2 AA@2 AB@2 AC@2 AD@2 AE@2 AF@3 AG AH AI AJ AK AL AM AN
  AO AP AQ AR AS AT AU@2 AV AW AX AY AZ BA BB BC BD@2 BE BF@8 BG@2
>`.pickRestart({
  A: "e6!2", B: "g6 b5", C: "c6 e6", D: "e6 b5", E: "e6@3 c6 e6 g6", F: "b5@4 d6@2 b5@3 a5 g5@2",
  G: "c6@4 e6@2 d6@3 c6 b5@2", H: "c6@2 c6 c6@3", I: "a6 g6", J: "g6@6 b5@3 a5 b5@2", K: "c6@4 c6@2 e6@3 d6 e6@2",
  L: "e6@2 e6 b5@2 b5", M: "c6@4 c6@2 c6 b5 c6 d6 c6@2", N: "b5@3 c6 b5@2 g5 f#5 g5 a5 b5@2",
  O: "c6@3 d6 b5@2 c6@4 e6 f6", P: "e6@4 d6@2 c6@3 d6 c6@2", Q: "b5@3 c6 b5@2 b5@3 c6 d6@2",
  R: "e6@3 d6 e6@2 c6@3 b5 c6@2", S: "b5@2 b5!2 c6 d6", T: "e6@3 f6 e6@2 c6 b5 c6 d6 c6@2",
  U: "e6@3 d6 c6@2 b5 c6 b5 a5 b5@2", V: "c6@3 d6 b5@2 c6@4 ~@2", W: "e6@15 f6@7 e6@11 d6@4 c6@7 ~@4",
  X: "[~@4 d6@7 e6@7 f6@7 ~ b5@15 a5@14 b5@7 ~ c6@11 b5@4 a5@7 b5@15 a5@7 g#5@15 e6@4 f6@3 e6@15]/3",
  Y: "[f6@7 e6@11 d6@4 c6@7 ~@8 d6@7 b5@7 ~ g5@22 e6@7 d6@7 ~ c6@7]/2",
  Z: "[b5@7 b5@15 a5@7 ~ c6@7 e6@7 a5@22 c6@4 d6@4 e6@7 c6@7 ~ e6@7]/2",
  AA: "[e6@7 c6@7 ~ b5@3 c6@4 d6@7 ~ b5@7 d6@7 d6@7 ~ b5@7 c6@4 d6@3 e6@7 ~ c6@7 e6@7 ~ e6@7]/2",
  AB: "[c6@7 g#5@4 a5@4 b5@7 g#5@7 ~ e5@7 b5@7 g#5@7 ~ e6@3 f6@4 g6@7 e6@7 ~ c6@7 g6@7 ~ e6@7]/2",
  AC: "[b5@4 c6@3 d6@7 ~ b5@7 g5@7 ~ d6@7 b5@7 c6@7 ~ e6@7 a6@7 g#6@7 ~ e6@7 g#6@7 ~ a6@7]/2",
  AD: "[c6@4 d6@3 e6@7 ~ a5@15 a5@7 c6@15 d6@7 e6@15 c6@7 d6@15]/2",
  AE: "[b5@7 g5@22 ~ a5@11 b5@3 c6@7 ~ d6@7 e6@7 c6@7 ~ b5@15 g#5@7]/2",
  AF: "[e5@22 c6@15 d6@7 e6@11 f6@4 e6@7 d6@15 b5@7 ~ g5@11 a5@3 b5@7 ~ c6@11 b5@4 a5@7 g#5@11]/3",
  AG: "f#5@4 g#5@7 a5@15 a5@7 a5@15", AH: "~@7 a5@7 c6@3 ~ b5@3 c6@3 ~ d6@3 e6@7 d6@7 c6@6",
  AI: "~ d6@6 d6@3 ~ c6@3 b5@3 ~ a5@3 b5@14 b5@7 a5@6",
  AJ: "~ a5@3 b5@3 c6@3 ~ d6@3 e6@7 d6@7 c6@7 b5@3 c6@3 ~ b5@3 a5@3", AK: "~ g#5@6 g#5@21 c6@7 c6@3 b5@3 ~ c6@3 d6@3",
  AL: "~ e6@6 d6@7 c6@7 b5@7 b5@3 a5@3 ~ b5@3 c6@3 ~ d6@6", AM: "~ d6@6 g6@7 e6@10 ~ d6@3 c6@7 b5@3 c6@3 ~ b5@3 a5@3",
  AN: "~ b5@6 a5@7 c6@7 e6@7 a5@14 ~@6", AO: "~ c6@6 e6@3 ~ d6@3 c6@7 ~@7 c6@3 d6@3 ~ e6@7 b5@6",
  AP: "~ d6@3 b5@3 g5@7 ~@7 b5@3 ~ c6@3 d6@7 c6@7 e6@3 d6@3", AQ: "~ c6@7 ~@6 c6@3 ~ d6@3 e6@7 g#5@7 b5@3 a5@3 ~ g#5@6",
  AR: "~@7 g#5@3 ~ a5@3 b5@7 e6@7 g6@3 f6@3 ~ e6@7 ~@6", AS: "~ e6@3 f6@3 g6@7 b5@7 d6@3 ~ c6@3 b5@7 ~@7 b5@3 c6@3",
  AT: "~ d6@6 c6@7 e6@3 ~ d6@3 c6@7 ~@7 g#5@3 a5@3 ~ b5@6",
  AU: "[~ a5@6 c6@7 e6@7 a6@14 ~@7 c6@13 d6@7 e6@14 e6@7 d6@13]/2", AV: "~ g5@6 g5@21 a5@10 b5@3 ~ c6@6",
  AW: "~ d6@6 e6@7 c6@7 b5@14 g#5@7 e6@3 f6@3", AX: "~ e6@3 d6@3 c6@3 ~ b5@3 c6@14 d6@7 e6@10 d6@3",
  AY: "~ c6@6 d6@14 b5@7 g5@10 a5@3 ~ b5@6", AZ: "~ c6@10 b5@3 c6@7 b5@10 a5@3 ~ b5@7 a5@6",
  BA: "~ c6@6 e6@7 a6@14 ~@7 g6@13", BB: "~ g6@6 g6@7 f#6@7 e6@7 d6@14 b5@6", BC: "~ g5@6 a5@7 b5@7 c6@14 a5@7 a5@6",
  BD: "[~ b5@6 c6@7 b5@14 g#5@7 e5@20 g6@14 g6@7 g6@7 f#6@7 e6@6]/2", BE: "~ d6@13 b5@7 g5@7 a5@7 b5@7 c6@6",
  BF: "[~ b5@6 a5@7 g#5@7 f#5@7 g#5@7 a5@34 ~@8 e6@24 e6@24 g6@24 b5@24 c6@24 e6@24 e6@24 b5@24 e6@16 d6@8 c6@8 e6@8 g6@8 b5@16 d6@8 b5@12 a5@4 g5@8 c6@16 e6@3]/8",
  BG: "[~@5 d6@12 c6@4 b5@8 c6@12 d6@4 b5@8 a5@24 ~@19]/2",
})).s("gm_recorder").gain(0.3)

// other · cello · "Violoncello"
const cello = note(`<
  ~ A B C D E F G H I B C D J K L M N F M D F@2 G O P@6 Q@6 R@6 S@4 T U@3 V@3 W@3 X@3 Y@3 Z@3 AA@3 AB@3 AC@8 AD@3
>`.pickRestart({
  A: "e3 a2", B: "g2!2", C: "a2!2", D: "e2!2", E: "a2 a3", F: "g3!2", G: "a3 e2", H: "a3@2 a3 a3@3", I: "a2 c3",
  J: "a2 g3", K: "d3 g2", L: "a2 e2", M: "a3!2", N: "c3 g3", O: "e3 f2",
  P: "[c3@22 g3@22 g2@22 g2@22 ~ e3@22 a2@22 e2@22 e2@22 g3@22 g3@22 ~ g2@22 d3@22 a3@22]/6",
  Q: "[e2@22 e3@22 e3@22 a3@22 ~ a3@22 g3@22 g3@22 a3@22 a3@22 e3@22 ~ e2@22 g3@22 g3@22]/6",
  R: "[g3@22 d3@22 a2@22 e2@22 ~ a2@22 a2@22 a2@22 c3@22 d3@22 d3@22 ~ e3@22 a3@22 e2@22]/6",
  S: "[e2@22 g3@22 c4@22 g3@22 ~ d3@22 a3@22 e3@22 e3@15 a2@7 a2@15]/4", T: "~@7 a2@21 a2@20",
  U: "[~ g2@20 g2@21 a2@20 a2@21 e2@20 e2@7 e3@7 e2@7 g3@20]/3",
  V: "[~ c3@20 g2@21 g2@20 a2@21 e2@20 a2@21 a2@14 ~@6]/3", W: "[~ a3@20 a2@21 g3@20 g2@21 a3@20 a2@21 e3@20]/3",
  X: "[~ e2@20 g3@21 c3@20 g3@21 g2@20 a3@21 e2@20]/3", Y: "[~ a2@20 a2@14 ~@7 a2@20 a2@21 g3@7 d3@13 g2@21 e3@20]/3",
  Z: "[~ a2@20 [e2,e3]@21 e2@20 c3@21 c4@20 g3@7 d3@14 d3@20]/3", // E
  AA: "[~ e3@6 e3@14 e3@7 e3@14 e3@20 a2@7 e2@7 a2@7 c3@20 c4@21 g3@7 d3@13]/3",
  AB: "[~ d3@20 e3@7 e3@14 e3@20 e3@7 e3@14 e3@20 g3@7 e3@14 c4@20]/3",
  AC: "[~ g3@6 d3@14 d3@21 a3@20 e2@21 a2@34 ~@8 a2@24 c3@24 g2@24 g2@24 a2@24 a2@24 e2@24 e2@24 c3@24 g3@24 g2@19]/8",
  AD: "[~@5 g3@24 a2@24 g#3@24 a3@24 a2@24 ~@19]/3",
})).s("gm_cello").gain(0.3)

// chords · piano
const piano = note(`<
  ~ A B C D E F G H I J K L M N O P Q R S T U V W X Y@6 Z@6 AA@6 AB@4 AC AD@3 AE@3 AF@3 AG@3 AH@3 AI@3 AJ@3 AK@3 AL@8
  AM@3
>`.pickRestart({
  A: "~ e5@11 ~ e5@11, [a2,e3,a4] [a2,g4], ~ c5@23 ~ c5@23", B: "~ g5@11 ~ b4@11, [g2,g4] [g2,d4], ~ b4@23 ~ g4@23",
  C: "~ c5@11 ~ e5@11, [a2,e4] [a2,a4], ~ a4@23 ~ c5@23", D: "~ e5@11 ~ b4@11, [e2,g#4] [e2,e4], ~ b4@23 ~ g#4@23",
  E: "[a2,a4,c5,e5]@23 ~ c5@8 e5@8 g5@8, ~@24 [c3,e3,a3]@23 ~", // Am
  F: "b4@15 ~ d5@8 b4@15 ~ g4@8, [g2,d3,g3]@23 ~ [g2,d3,g3]@23 ~", // G5
  G: "[a2,e3,a3,c5]@23 ~ d5@8 c5@8 b4@8, ~@24 [e2,g#4]@23 ~", // Am E
  H: "[a2,e3,a3,c5]@15 ~ [a2,e3,a3,c5]@8 [a2,e3,a3,c5]@23 ~", I: "[a2,c5,e5]@23 ~ [c3,g4,c5,g5]@23 ~",
  J: "[g2,g4,b4,g5]@23 ~ [g4,b4]@15 ~ [g4,b4]@8, ~@24 g2@23 ~", // G
  K: "[e4,a4,c5]@15 ~ [e4,a4,c5]@8 [a4,c5,e5]@15 ~ [a4,c5,e5]@8, a2@23 ~ a2@23 ~", // Am
  L: "[g#4,b4,e5]@15 ~ [g#4,b4,e5]@8 [e4,g#4,b4]@15 ~ [e4,g#4,b4]@8, e2@23 ~ e2@23 ~", // E
  M: "[e4,a4,c5]@15 ~ [e4,a4,c5]@8 [g4,c5]@15 ~ [g4,c5]@8, a2@23 ~ [c3,e3,g3]@23 ~", // Am C5 C
  N: "[g4,b4]@15 ~ [g4,b4]@8 [d4,g4]@15 ~ [g4,b4]@8, [g2,d3]@23 ~ g2@23 ~", // G G5 G G5
  O: "[e4,a4,c5]@15 ~ [a4,c5,e5]@8 [g#4,d5]@15 ~ [g#4,b4]@8, a2@23 ~ e2@23 ~", // Am G#dim G#m
  P: "c5@15 ~ [a4,b4]@8 [a2,e3,a3,c5]@23 ~, [a2,e3,a3]@23 ~@25", // Asus2 Am A5
  Q: "[g4,e5]@15 ~ d5@8 c5@15 ~ [g4,c5]@8, c3@23 ~ [c3,e3,g3]@23 ~", // C C5 C
  R: "b4@15 ~ [g4,b4]@8 b4@15 ~ [g4,d5]@8, [g2,d3,g3]@23 ~ [g2,d3,g3]@23 ~", // G G5
  S: "e5@15 ~ [c5,e5]@8 c5@15 ~ [a4,c5]@8, [a2,a3]@23 ~ [a2,a3]@23 ~", // C Am A
  T: "[e2,e4,g#4,b4]@23 ~ b4@8 c5@8 d5@8, ~@24 e2@23 ~", U: "e5@15 ~ e5@8 c5@15 ~ c5@8, [c3,g3]@23 ~ [c3,e3,g3]@23 ~",
  V: "b4@15 ~ b4@8 b4@15 ~ d5@8, [g2,d3,g3]@23 ~ [g2,d3,g3]@23 ~", // G5
  W: "e5@15 ~ c5@8 [g#4,b4]@15 ~ b4@8, [a2,a3]@23 ~ e2@23 ~", // G#m A
  X: "[a4,c5]@15 ~ [a4,b4]@8 ~@2 c5@14 ~@8, [a2,e3]@23 ~ f2@23 ~, ~@3 e4@2 ~, ~@25 a4@15 ~@8", // Am Asus2 A5
  Y: "[~@2 e5@13 f5@7 e5@14 ~ c5@7 ~@8 d5@7 e5@7 f5@7 ~ [g4,b4]@14 ~ a4@14 b4@7 ~ c5@14 ~ a4@7 [g#4,b4]@14 ~ a4@7 [e2,e4,g#4]@21 ~ e5@14 ~ f5@7 e5@14 ~ c5@7 ~@8 d5@7 b4@7 ~ [g2,d3,g4]@21 ~ [c5,e5]@7 d5@7 ~ c5@7, c3@21 ~ [c3,g3]@21 ~ g2@21 ~ g2@21 ~@2 [a2,e3]@21 ~ a2@21 ~ e2@21 ~@23 [c3,g3]@21 ~ [c3,g3]@21 ~@2 g2@21 ~@23 [a2,a3]@21 ~, g4@5 ~@91, ~ c5@14 ~@273]/6", // G G#m E G5 C C5 A5 C5 …
  Z: "[[a4,b4]@7 [g#4,b4]@14 ~ a4@7 ~ c5@7 e5@7 [a2,e3,a4]@21 ~ c5@7 ~ e5@7 c5@7 ~ e5@7 e5@7 c5@7 ~ b4@7 d5@7 ~ b4@7 d5@14 ~ b4@7 c5@7 e5@7 ~ c5@7 e5@14 ~ c5@7 g#4@7 ~ b4@7 g#4@7 ~ e4@14 g#4@7 ~ e5@7 g5@7 e5@7 ~ c5@14 ~ e5@7, e2@21 ~ [a2,e3]@21 ~@23 [a2,a3]@21 ~@2 [a2,a3]@21 ~ [g2,g3]@21 ~ [g2,g3]@21 ~ [a2,a3]@21 ~ [a2,a3]@21 ~ [e2,e3]@21 ~@2 e2@21 ~ [c3,g3]@21 ~ [c3,g3]@21 ~]/6", // Asus2 G#m A5 A G A E C5
  AA: "[b4@7 d5@7 ~ b4@7 g4@14 ~ b4@7 [a4,c5]@7 ~ e5@7 a5@7 g#5@14 ~ g#5@7 ~ a5@14 e5@7 ~ [a2,a4]@21 ~ [e4,a4,c5]@15 d5@7 [g4,e5]@15 c5@7 [g4,d5]@15 b4@7 [g2,d3,g4]@21 ~@2 a4@14 c5@7 ~ d5@7 e5@7 c5@7 ~ [g#4,b4]@15 g#4@7, [g2,g3]@21 ~ [g2,d3]@21 ~ a2@21 ~ e2@21 ~@2 a2@21 ~@23 a2@21 ~ c3@21 ~ [g2,d3]@21 ~@24 [a2,e3]@21 ~ [a2,e3,a3]@21 ~ e2@21 ~]/6", // Am A Am C G5 G#m G G5 …
  AB: "[[e2,e4]@21 ~ c5@15 d5@7 e5@15 e5@7 d5@15 b4@7 ~ g4@14 b4@7 ~ c5@15 a4@7 g#4@15 g#4@7 [a2,e3,a4]@15 [a2,a4]@7 [a2,a4]@14 ~, ~@22 [c3,e3,g3]@21 ~ [c3,g3,c4]@21 ~ [g2,d3,g3]@21 ~@2 [g2,d3]@21 ~ [a2,e3,a3]@21 ~ [e2,e3]@21 ~@38]/4", // E A5 A C C5 G5 A5 E
  AC: "~@7 a4@7 c5@7 d5@7 e5@7 d5@7 c5@6, ~@7 a2@20 ~ a2@20",
  AD: "[~ d5@6 c5@7 b4@7 [g4,b4]@13 ~ [g4,b4]@7 a4@7 b4@6 c5@7 e5@7 d5@7 c5@7 b4@7 a4@7 g#4@6 e2@7 e3@7 e2@7 ~@7 c5@7 d5@6, ~ g2@20 g2@20 ~ a2@20 a2@20 ~ e2@20 g#4@20 ~ c3@20, ~@124 c5@7 ~@13, ~@125 e3@19, ~@7 g3]/3", // G
  AE: "[~ e5@6 d5@7 c5@7 b4@7 b4@7 c5@7 d5@7 d5@6 g5@7 e5@7 d5@7 c5@7 b4@7 a4@7 b4@6 a4@7 c5@7 e5@7 [a2,a4]@13 ~@7, ~ c3@20 g2@20 ~ g2@20 a2@20 ~ e2@20 a2@20 ~@21]/3", // A
  AF: "[~ c5@6 e5@7 c5@7 ~@7 c5@7 e5@7 b4@7 d5@6 g4@7 ~@7 b4@7 d5@7 c5@7 e5@7 c5@6 ~@7 c5@7 e5@7 g#4@7 b4@7 g#4@6, ~ [a2,a3]@20 a2@20 ~ [g2,g3]@20 g2@20 ~ [a2,a3]@20 a2@20 ~ [e2,e3]@20]/3", // A G A E
  AG: "[~@7 g#4@7 b4@7 e5@7 g5@7 e5@7 ~@7 e5@6 g5@7 b4@7 d5@7 b4@7 ~@7 b4@7 d5@6 c5@7 e5@7 c5@7 ~@7 g#4@7 b4@6, ~ e2@20 [c3,g3]@20 ~ c3@20 [g2,g3]@20 ~ g2@20 [a2,a3]@20 ~ e2@20]/3", // C5 G A
  AH: "[~ a4@6 c5@7 e5@7 [a2,c5,e5,a5]@13 ~@8 [e4,a4,c5]@13 d5@7 [g4,c5,e5]@13 ~ e5@7 [g2,g3]@7 ~@7 g4@6 [g2,d4,g4]@20 ~ a4@13 ~ c5@6, ~ a2@20 ~@21 a2@20 a2@20 ~ d5@13 ~@48, ~@90 d3@13 ~@21 [a2,e3]@20]/3", // Am C G G5 A5
  AI: "[~ [a4,d5]@6 e5@7 c5@7 [g#4,b4]@13 ~ g#4@7 e4@3 f4@3 ~ e4@3 d4@3 c4@3 ~ b3@3 [e4,g4,c5]@13 ~ d5@7 e5@7 d5@7 c5@6 [g2,g3]@7 ~@7 b4@7 g4@7 a4@7 b4@6, ~ a2@20 [e2,e3]@20 ~ e2@20 c3@20 ~ [c3,g3,c4]@20 d5@13 ~@28, ~@110 d3@13 ~ [g2,d3]@20]/3", // D5 G#m C G E C5 G5
  AJ: "[~ [a2,e3,a4,c5]@6 b4@7 c5@7 [e2,e3,g#4,b4]@7 a4@7 b4@7 a4@7 c5@6 e5@7 a2@7 e2@7 a2@7 [g4,c5,g5]@13 ~ g5@6 g5@7 f#5@7 e5@7 [g2,g3]@7 ~@7 b4@6, ~@7 e3@13 ~@8 e3@13 ~ [a2,e3]@20 [c5,e5,a5]@13 ~@8 c3@20 [c3,g3,c4]@20 ~ d5@13 ~@7, ~@131 d3@13]/3", // Am E C5 G A5 Am C5
  AK: "[~ g4@6 a4@7 b4@7 [a2,e3]@7 ~@7 a4@7 a4@7 b4@6 c5@7 [e2,e3]@7 ~@7 g#4@7 [e2,e3,e4]@20 [c3,g3]@7 ~@7 g5@7 g5@7 f#5@7 e5@6, ~ [g2,d3]@20 [a4,c5]@13 ~@28 [g#4,b4]@13 ~@28 [c5,g5]@13 ~@28, ~@28 e3@13 ~ [a2,e3]@20 ~@7 e3@13 ~@28 e3@13 ~ [c3,g3,c4]@20]/3", // A5 E C5 G5 Am G#m C5 A5 …
  AL: "[~ [g2,g3]@6 ~@7 b4@7 g4@7 a4@7 b4@7 c5@7 b4@6 a4@7 [e4,g#4]@7 f#4@7 g#4@7 [a2,e4,a4]@33 ~@11 e5@22 ~@2 e5@22 ~@2 g5@22 ~@2 b4@22 ~@2 c5@22 ~@2 e5@22 ~@2 e5@22 ~@2 b4@22 [g4,c5,e5]@15 ~ d5@8 c5@8 e5@8 g5@8 [d4,g4,b4]@15 ~ d5@3, ~ d5@13 ~@112 c5@23 ~ c5@23 ~ b4@23 ~ g4@23 ~ a4@23 ~ c5@23 ~ b4@23 ~ g#4@23 ~@67, ~@7 d3@13 ~ [g2,d3]@20 ~ [a2,e3,a3]@20 e2@20 ~@43 [a2,a4]@24 [c3,g4]@24 [g2,g4]@24 [g2,d4]@24 [a2,e4]@24 [a2,a4]@24 [e2,g#4]@24 [e2,e4]@24 c3@23 ~ [c3,e3,g3]@23 ~ g2@19]/8", // G E A5 C G G5 A5 A …
  AM: "[~@5 b4@11 ~ a4@4 g4@8 [e4,a4,c5]@15 ~ e5@8 d5@11 ~ c5@4 b4@8 c5@11 ~ d5@4 b4@8 ~@2 a4@22 ~@19, ~@5 [g2,d3,g3]@23 ~ a2@23 ~ [e2,g#3]@23 ~ [a2,e3,a3]@23 ~ [a2,a3]@24 ~@19, ~@102 [e3,e4]@23 ~@19]/3", // Am G5 E A5 A E
})).s("gm_piano").gain(0.3)

stack(recorder, cello, piano)