Strudelify
KeyD majorTempo100 bpm
0:00/0:00
// Messiah HWV 56 — George Frideric Handel HMV 56
// 100 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/2850676; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · flute
const flute = note(`<
  A B C D E F G H I J K L M ~@2 N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ ~@6 AK AL AM AN AO@2 AP AO@2 AQ
  AR@3 AS@3 AT@3 AU@2 AV AW AB AX AY AZ BA BB BC BD BE BF BG BH BG BH BI BJ BK BL BM BN O BO BP BQ
>`.pickRestart({
  A: "d6@3 a5 b5 a5 ~@2", B: "d6@6 a5@2 b5@2 a5@2 ~@2 d6!2", C: "d6@2 d6@2 ~@2 d6!2 d6@2 d6@2 ~@2 d6@2",
  D: "c#6 d6@2 c#6 d6@2 ~@2", E: "e6@3 a5 f#6 e6 ~@2", F: "e6@6 a5@2 f#6@2 e6@2 ~@2 e6!2",
  G: "f#6@2 e6@2 ~@2 e6!2 f#6@2 e6@2 ~@2 e6@2", H: "f#6 e6 d6@2 c#6@2 ~@2", I: "a5@2 b5 c#6", J: "d6 d5 d6@3 d6 c#6@2",
  K: "b5@8 a5@4 ~@2 e6!2", L: "d6@2 c#6@2 ~@2 e6!2 d6@2 c#6@2 ~@2 e6!2", M: "f#6@2 e6@2 ~@2 e6!2 f#6@2 e6@2 ~@4",
  N: "~@14 d6!2", O: "d6@2 d6@2 ~@2 d6!2 d6@2 d6@2 ~@2 d6!2", P: "d6@2 d6@2 ~@2 d6!2 d6@2 d6@2 ~@4", Q: "d6@2 e6 f#6",
  R: "g6 g5 g6@3 g6 f#6@2", S: "e6@8 d6@4 ~@2 d6!2", T: "c#6@2 a5@2 ~@2 c#6!2 d6@2 d6!2 e6@2 e6@2",
  U: "a5@4 ~@2 d6 c#6 b5@2 b5@2 ~@2 e6@2", V: "d6@2 c#6@2 d6@2 e6 d6 c#6@2 c#6!2 e6@2 c#6@2",
  W: "~@2 a5!2 d6@2 a5@2 ~@2 c#6!2 e6@2 c#6@2", X: "~@2 a5!2 f#6@2 d6@2 ~@2 c#6!2 d6@2 a5@2",
  Y: "~@2 b5!2 e6@2 e6@2 ~@2 c#6!2 d6@2 d6!2", Z: "d6 c#6 d6!2", AA: "d6!2 d6@2", AB: "~@3 a5",
  AC: "a5@4 g5@4 f#5@4 e5@3 d5", AD: "d5@15 ~", AE: "~@8 f#5@4 e5@3 d5", AF: "d5@11 ~ f#6@4", AG: "e6 d6!2 c#6",
  AH: "d6@3 c#6 d6@2 d6@2", AI: "c#6@3 a5 b5@2 c#6@2", AJ: "d6 ~", AK: "~@3 d6", AL: "a6 c#6 f#6 a5",
  AM: "d6@4 c#6@2 b5@2 c#6@4 b5@3 a5", AN: "a5@2 a5!2", AO: "[a5@15 ~]/2", AP: "~ a5!3", AQ: "~@2 d6!2",
  AR: "[d6@17 ~ d6@2 e6@2 e6@2]/3", AS: "[e6@19 ~ f#6@2 f#6@2]/3", AT: "[f#6@18 ~ f#6 g6@2 g6@2]/3",
  AU: "[g6@11 g6 f#6 e6 f#6 g6]/2", AV: "e6@4 ~ c#6 d6 e6", AW: "a5 ~@3", AX: "d6 f#5 b5 d5",
  AY: "g5@4 f#5@2 e5@2 f#5@4 e5@3 d5", AZ: "d5 ~", BA: "~@3 d6 g6 f#6 ~ d6", BB: "g6 f#6 ~@6",
  BC: "~@6 d6!2 g6@2 f#6@2 ~@2 d6!2", BD: "g6 f#6 ~ a5 a5@2 d6@2", BE: "f#6@2 d6@2 d6@2 a5!2",
  BF: "c#6@2 d6!2 d6@2 c#6@2", BG: "d6 ~ a5!2", BH: "d6@2 ~ a5 a5@2 a5@2", BI: "d6 ~@2 a5", BJ: "d6 f#6 b5 d6",
  BK: "g6@2 f#6 e6 e6@4", BL: "d6 ~ d6!2", BM: "d6@2 ~ d6 d6@2 d6@2", BN: "d6@4 ~@2 d6!2 d6@2 d6@2 ~@2 d6!2",
  BO: "d6!2 ~@4 [d5,d6]@2", BP: "[d5,d6]@11 ~ [d5,d6]@4", BQ: "[d5,d6]@15 ~",
})).s("gm_flute").gain(0.2)

// other · flute
const flute_2 = note(`<
  A B C D E F G H I J K L M N O P Q R ~ S T U V@2 W N O X Y Z AA AB AC AD AE AF AG AH ~@4 AI AJ AK AL AM AN AO@2 AP AQ@3
  AR Q AS AT AU AV AW AX AY AZ BA AH BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BN BP BQ BR BS BT Q@2 BU BV BW
>`.pickRestart({
  A: "a5@3 a5 g5 f#5 ~@2", B: "a5@6 a5@2 g5@2 f#5@2 ~@2 a5!2", C: "b5@2 a5@2 ~@2 a5!2 b5@2 a5@2 ~@2 a5@2",
  D: "g5 f#5 e5!2 f#5@2 ~@2", E: "a5@3 a5!3 ~@2", F: "a5@6 a5@2 a5@2 a5@2 ~@2 a5!2",
  G: "a5@2 a5@2 ~@2 a5!2 a5@2 a5@2 ~@2 a5@2", H: "a5@3 g#5 a5@2 ~@2", I: "a5@2 b4 c#5", J: "d5!2 d5@3 d5 c#5@2",
  K: "b4@8 a4@4 ~@2 a5!2", L: "a5@2 a5@2 ~@2 a5!2 a5@2 a5@2 ~@2 a5!2", M: "a5@2 a5@2 ~@2 a5!2 a5@2 a5@2 ~@4",
  N: "d5@2 e5 f#5", O: "g5 g4 g5@3 g5 f#5@2", P: "e5@8 d5@4 ~@2 a5!2", Q: "b5@2 a5@2 ~@2 a5!2 b5@2 a5@2 ~@2 a5!2",
  R: "b5@2 a5@2 ~@2 a5!2 b5@2 a5@2 ~@4", S: "~@14 a5!2", T: "g5@2 e5!2 a5@2 a5@2 a5@2 a5!2 f#5@2 d5@2",
  U: "~@2 e5 d5 c#5@2 a4@2 ~@2 g5 f#5 e5@2 a5 g5", V: "[f#5@4 ~@2 b5 a5 g#5@2 e5@2 a5@8 g#5@4 a5@4 ~@2 e5!2]/2",
  W: "a5@2 f#5@2 ~@2 f#5!2 e5@2 c#5@2 ~@4", X: "e5@8 d5@2 a5!2 f#5@2 d5@2", Y: "~ b5!3 a5@4", Z: "~@3 f#5",
  AA: "e5 d5!2 c#5", AB: "d5@15 ~", AC: "~ d5@2 c#5", AD: "d5@11 ~ a5@4", AE: "a5@4 d5@4 f#5@4 e5@3 d5",
  AF: "d5@3 e5 f#5@2 g#5@2", AG: "a5@3 a5 g5@2 g5@2", AH: "a5 ~", AI: "~ a5 d6 f#5", AJ: "b5@2 d5@2 g5@2 f#5 e5",
  AK: "f#5@4 e5@3 d5 d5@2 a5@2 f#5@2 d5@2", AL: "~ e5 a5 e5 ~@3 c#5", AM: "d5 b5 a5@4 g#5@2", AN: "a5 e5 a5!2",
  AO: "[a5@15 ~]/2", AP: "~ a5!3", AQ: "[a5@19 ~@5]/3", AR: "~@3 a5 b5 a5 ~ a5", AS: "b5 a5 ~@6",
  AT: "~@3 e5 a5 g#5 ~ e5", AU: "a5@2 g#5@2 ~@2 e5!2 a5@2 g#5@2 ~@2 e5!2", AV: "a5 g#5 ~@6", AW: "~@3 f#5 b5 a#5 ~ f#5",
  AX: "b5@2 a#5@2 ~@2 f#5!2 b5@2 a#5@2 ~@2 f#5!2", AY: "b5 f#5 ~@2", AZ: "~@2 b5!2", BA: "a5@3 a5 a5@2 a5@2",
  BB: "~@5 f#5 g#5 a5", BC: "d5@2 c#5@2 d5@2 e5 d5 c#5@2 d5@2 a5@2 g5@2", BD: "f#5@3 e5 d5@3 d5",
  BE: "d5 c#5 d5!2 d5@2 c#5@2", BF: "d5@2 d5!2", BG: "d5@2 ~ a5 b5 a5 ~ a5", BH: "b5 a5 ~ d5 d5@2 d5@2",
  BI: "d5@4 ~@2 a5!2 b5@2 a5@2 ~@2 a5!2", BJ: "b5 a5 ~@4 a5@2", BK: "d6 f#5 b5 d5", BL: "g5@2 f#5 e5 e5@4",
  BM: "f#5@4 ~@4 f#5@4 f#5@3 g5", BN: "a5@4 ~@2 f#5@2 f#5@4 f#5@3 g5", BO: "a5 ~ f#5!2", BP: "a5 ~@2 f#5",
  BQ: "f#5!2 d5 a5", BR: "e5@2 a5!2 a5@4", BS: "a5@2 ~ a5 b5 a5 ~ a5", BT: "b5 a5 ~ a5 b5 a5 ~ a5",
  BU: "b5 a5 ~@4 [f#5,f#6]@2", BV: "[g5,g6]@11 ~ [g5,g6]@4", BW: "[f#5,f#6]@15 ~",
})).s("gm_flute").gain(0.2)

// other · flute
const flute_3 = note(`<
  A B C D E F G H I J K L M N O P Q R S T U I J V W N X Y Z AA AB AC AD AE AF AG AH AI ~ AA AJ AK AL AM AN AO AP AQ AR L
  AS AR L AS AT Q AU AV AW AX AY AZ BA BB BC BD BE@2 BF BG BH BI@2 BJ@2 BK BL BM BN BO BN BP BQ BR BS BT Q@2 BU BV BW
>`.pickRestart({
  A: "f#5@3 d5!3 ~@2", B: "f#5@6 d5@2 d5@2 d5@2 ~@2 d5!2", C: "g5@2 f#5@2 ~@2 d5!2 g5@2 f#5@2 ~@2 d5@2",
  D: "e5 a4@2 a4 a4@2 ~@2", E: "c#5@3 e5 d5 c#5 ~@2", F: "c#5@6 e5@2 d5@2 c#5@2 ~@2 e5!2",
  G: "d5@2 c#5@2 ~@2 e5!2 d5@2 c#5@2 ~@2 e5@2", H: "d5 e5 f#5 d5 e5@2 ~@2", I: "a4@2 b4 c#5", J: "d5 d4 d5@3 d5 c#5@2",
  K: "b4@8 a4@4 ~@2 a4!2", L: "f#5@2 e5@2 ~@2 e5!2 f#5@2 e5@2 ~@2 e5!2", M: "d5@2 c#5@2 ~@2 e5!2 d5@2 c#5@2 ~@4",
  N: "d5@2 e5 f#5", O: "g5 g4 g4@3 g4 f#4@2", P: "e4@8 d4@4 ~@2 d5!2", Q: "g5@2 f#5@2 ~@2 d5!2 g5@2 f#5@2 ~@2 d5!2",
  R: "g5@2 f#5@2 ~@2 d5!2 g5@2 f#5@2 ~@4", S: "~@6 d5!2 c#5@2 a4@2 ~@2 d5!2", T: "b4@2 b4@2 ~@2 e5!2 c#5@2 a4!2 d5@4",
  U: "d5@4 c#5@4 d5@2 f#5!2 a5@2 f#5@2", V: "b4@8 a4@2 e5!2 c#5@2 a4@2", W: "~@2 d5!2 f#5@2 d5@2 ~@2 e5!2 c#5@2 a4@2",
  X: "g5 g4 g5@3 g5 f#5@2", Y: "e5@4 d5@3 f#5", Z: "g5@3 g5 f#5@4", AA: "~@3 d5", AB: "a4@2 g4@2 a4@3 a4",
  AC: "a4@15 ~", AD: "~@8 a4@4 g4@3 f#4", AE: "f#4@11 ~ d5@4", AF: "e5@2 g5@2 a4@3 a4", AG: "a4@3 g4 a4@2 d5@2",
  AH: "e5@3 d5 d5@2 e5@2", AI: "f#5 ~", AJ: "a5 c#5 f#5 a4", AK: "d5@4 c#5@2 b4@2 c#5@4 b4@3 a4",
  AL: "a4@2 ~@3 a4 d5!2", AM: "d5@2 ~ b4 e5 c#5 d5!2", AN: "d5 c#5 d5 ~", AO: "~@5 d5 c#5 a4",
  AP: "f#5 e5@2 f#5 e5!2 ~ e5", AQ: "e5 c#5 ~@2", AR: "~@3 e5 f#5 e5 ~ e5", AS: "f#5 e5 ~@6", AT: "~@3 d5 g5 f#5 ~ d5",
  AU: "g5 f#5 ~@6", AV: "~@3 b4 c#5 b4 ~ b4", AW: "c#5@2 b4@2 ~@2 b4!2 c#5@2 b4@2 ~@2 b4!2", AX: "c#5 b4 ~@6",
  AY: "~@3 c#5 d5 c#5 ~ c#5", AZ: "d5@2 c#5@2 ~@2 c#5!2 d5@2 c#5@2 ~@2 c#5!2", BA: "d5!2 ~@2", BB: "~@2 d5!2",
  BC: "e5@3 e5 d5 c#5 d5 e5", BD: "c#5 ~", BE: "[~ a4 b4 c#5 f#4 a4 a4@4 g#4@2 a4@2 ~@2]/2", BF: "~ a4 d5 c#5 b4@3 a4",
  BG: "g4@2 a4 b4 a4@4", BH: "a4@2 d5!2", BI: "[d5@21 ~ d5@2 d5@4 d5@4]/2", BJ: "[d5@19 ~@3 f#5@2 f#5@4 d5@4]/2",
  BK: "d5@2 d5@2 b4@2 a4!2", BL: "g4@2 a4!2 a4@4", BM: "a4@4 ~@4 d5@4 d5@3 e5", BN: "f#5@4 ~@2 d5@2 d5@4 d5@3 e5",
  BO: "f#5 ~ d5!2", BP: "f#5 ~@2 d5", BQ: "d5 a4 b4 a4", BR: "c#5@2 d5!2 d5@2 c#5@2", BS: "f#5@2 ~ d5 g5 f#5 ~ d5",
  BT: "g5 f#5 ~ d5 g5 f#5 ~ d5", BU: "g5 f#5 ~@4 [a4,a5]@2", BV: "[b4,b5]@11 ~ [b4,b5]@4", BW: "[a4,a5]@15 ~",
})).s("gm_flute").gain(0.2)

stack(flute, flute_2, flute_3)