Strudelify

we wish you a merry christmas

Erik Johnson

KeyD majorTempo192 bpm
0:00/0:00
// we wish you a merry christmas — Erik Johnson
// 192 bpm, 3/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 3/4 at bar 2) are rendered on a constant 3/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/31522; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(192/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  A B C D E F G H B I J K B L M N B@2 C D E F O H P ~ A Q R S T U V W X Y Z AA AB AC AD W X Q R S T U V W AE AF AG AH AI
  AJ AK AL AM AN AO AP AQ AR AS AT AM AN AG AH AI AJ AK AL AM P
>`.pickRestart({
  A: "~@11 c4@5", B: "c4@11 c4@5", C: "c4@5 a#3@5 ~ c4@5", D: "b3@11 d4@5", E: "d4@5 c4@5 ~ c4@5", F: "c#4@11 e4@5",
  G: "e4@5 d4@5 ~ c4@2 c4@3", H: "a#3@5 d4@5 ~ c4@5", I: "c4@11 d4@5", J: "d4@5 c4@5 ~ c#4@5", K: "d4@5 c4@5 ~ b3@5",
  L: "c4@5 c4@5 ~ b3@5", M: "c4@5 c4@5 ~ c4@2 c4@3", N: "d4@5 d4@5 ~ c4@5", O: "f4@3 e4@2 d4@5 ~ c4@2 c4@3",
  P: "c4@11 ~@5", Q: "f4@5 f4@3 g4@3 f4@2 e4@3", R: "d4@5 d4@5 ~ d4@5", S: "g4@5 g4@3 a4@3 g4@2 f4@3",
  T: "e4@5 c4@5 ~ c4@5", U: "a4@5 a4@3 a#4@3 a4@2 g4@3", V: "f4@5 d4@5 ~ c4@2 c4@3", W: "d4@5 g4@5 ~ e4@5",
  X: "f4@11 c4@5", Y: "f4@5 f4@5 ~ f4@5", Z: "e4@11 e4@5", AA: "f4@5 e4@5 ~ d4@5", AB: "c4@11 g4@5",
  AC: "a4@5 g4@5 ~ f4@5", AD: "c5@5 c4@5 ~ c4@2 c4@3", AE: "f4", AF: "f4@11 g3@5", AG: "c4@5 c4@3 d4@3 c4@2 b3@3",
  AH: "a3@5 a3@5 ~ a3@5", AI: "d4@5 d4@3 e4@3 d4@2 c4@3", AJ: "b3@5 g3@5 ~ g3@5", AK: "e4@5 e4@3 f4@3 e4@2 d4@3",
  AL: "c4@5 a3@5 ~ g3@2 g3@3", AM: "a3@5 d4@5 ~ b3@5", AN: "c4@11 g3@5", AO: "c4@5 c4@5 ~ c4@5", AP: "b3@11 b3@5",
  AQ: "c4@5 b3@5 ~ a3@5", AR: "g3@11 d4@5", AS: "e4@5 d4@5 ~ c4@5", AT: "g4@5 g3@5 ~ g3@2 g3@3",
})).s("gm_alto_sax").gain(0.4)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  A B C D E F G H I J K L F M N H I B O D P Q R H S T U V W X Y Z AA AB AC AD AE AF L AG AA AB U V W X Y Z AA AH@2 AB U
  V W X Y Z AA AB AC AD AE AF L AG AA AB U V W X Y Z AA AI
>`.pickRestart({
  A: "~@11 c4@5", B: "a3@11 f3@5", C: "f3@11 f#3@5", D: "f3@11 g3@5", E: "g3@5 e3@5 ~ e3@5", F: "e3@11 g3@5",
  G: "f3@11 f3@5", H: "f3@5 a#3@5 ~ a#3@5", I: "a3@11 c4@5", J: "a3@11 g#3@5", K: "g3@11 g3@5", L: "a3@5 g3@5 ~ f3@5",
  M: "f3@5 g3@5 ~ g3@5", N: "e3@5 f3@5 ~ a3@5", O: "f3@3 g3@2 f3@5 ~ f#3@5", P: "g3@3 f3@2 e3@5 ~ e3@5",
  Q: "e3@11 a3@5", R: "a3@5 f3@5 ~ g3@2 f3@3", S: "a3@11 ~@5", T: "~@11 c3@5", U: "f3@5 f3@3 g3@3 f3@2 e3@3",
  V: "d3@5 d3@5 ~ d3@5", W: "g3@5 g3@3 a3@3 g3@2 f3@3", X: "e3@5 c3@5 ~ c3@5", Y: "a3@5 a3@3 a#3@3 a3@2 g3@3",
  Z: "f3@5 d3@5 ~ c3@2 c3@3", AA: "d3@5 g3@5 ~ e3@5", AB: "f3@11 c3@5", AC: "f3@5 f3@5 ~ f3@5", AD: "e3@11 e3@5",
  AE: "f3@5 e3@5 ~ d3@5", AF: "c3@11 g3@5", AG: "c4@5 c3@5 ~ c3@2 c3@3", AH: "f3", AI: "f3@11 ~@5",
})).s("gm_tenor_sax").gain(0.4)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note(`<
  A B C D E F G H I J K L M N O P I B C D Q F R H S T U V W X Y Z S AA AB AC AD AE AF Z S T U V W X Y Z AG@3 AH AI AJ AK
  AL AM AN AO AP AQ AR AS AT AU AV AO AP AI AJ AK AL AM AN AO AW
>`.pickRestart({
  A: "~@11 c3@5", B: "f2@11 a2@5", C: "a#2@11 a2@5", D: "g2@11 b2@5", E: "c3@11 a#2@5", F: "a2@11 c#3@5",
  G: "d3@11 a2@5", H: "g2@11 c3@5", I: "f2@11 c3@5", J: "f2@5 a2@5 ~ b2@5", K: "c3@11 a2@5", L: "d3@5 g2@5 ~ g2@5",
  M: "c3@11 e3@5", N: "f3@5 e3@5 ~ d3@5", O: "c3@5 a2@5 ~ f2@5", P: "a#2@5 g2@5 ~ c3@5", Q: "c3@11 c3@2 a#2@3",
  R: "d3@3 c3@2 a#2@5 ~ a2@5", S: "f2@11 c2@5", T: "f2@5 f2@3 g2@3 f2@2 e2@3", U: "d2@5 d2@5 ~ d2@5",
  V: "g2@5 g2@3 a2@3 g2@2 f2@3", W: "e2@5 c2@5 ~ c2@5", X: "a2@5 a2@3 a#2@3 a2@2 g2@3", Y: "f2@5 d2@5 ~ c2@2 c2@3",
  Z: "d2@5 g2@5 ~ e2@5", AA: "f2@5 f2@5 ~ f2@5", AB: "e2@11 e2@5", AC: "f2@5 e2@5 ~ d2@5", AD: "c2@11 g2@5",
  AE: "a2@5 g2@5 ~ f2@5", AF: "c3@5 c2@5 ~ c2@2 c2@3", AG: "f2", AH: "f2@11 e2@5", AI: "a2@5 a2@3 b2@3 a2@2 g#2@3",
  AJ: "f#2@5 f#2@5 ~ f#2@5", AK: "b2@5 b2@3 c#3@3 b2@2 a2@3", AL: "g#2@5 e2@5 ~ e2@5",
  AM: "c#3@5 c#3@3 d3@3 c#3@2 b2@3", AN: "a2@5 f#2@5 ~ e2@2 e2@3", AO: "f#2@5 b2@5 ~ g#2@5", AP: "a2@11 e2@5",
  AQ: "a2@5 a2@5 ~ a2@5", AR: "g#2@11 g#2@5", AS: "a2@5 g#2@5 ~ f#2@5", AT: "e2@11 b2@5", AU: "c#3@5 b2@5 ~ a2@5",
  AV: "e3@5 e2@5 ~ e2@2 e2@3", AW: "a2@11 ~@5",
})).s("gm_baritone_sax").gain(0.4)

stack(alto_sax, tenor_sax, baritone_sax)