Strudelify

Have Yourself a Merry Little Christmas

John Lagunas

KeyE♭ majorTempo66 bpm
0:00/0:00
// Have Yourself a Merry Little Christmas — John Lagunas
// 66 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (1/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5902637; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 64 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(66/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.

// other · trombone
const trombone = note(`<
  ~@5 A B C D E F G ~ A B C D H I J@2 K L M N O P Q D ~@3 R@4 S@5 ~@3 T@5 ~@3 U@4 V@8
>`.pickRestart({
  A: "~@2 eb3 g3 bb3@3 eb4", B: "bb3@2 ab3@4 g3 f3 eb3@4 f3@4", C: "~@2 eb3 g3 bb3@2 eb4@2", D: "bb3",
  E: "~@2 g3 bb3 eb4@3 g4", F: "f4 eb4 d4 c4 bb3@2 ab3@2", G: "g3", H: "~ g3@2 bb3 eb4@2 g4@2",
  I: "f4 eb4 d4 c4 b3@2 d4@2", J: "[eb4@12 ~ eb4 f4 gb4]/2", K: "g4@2 g4@2 g4@2 f4 eb4", L: "d4 eb4 f4@4 eb4 d4",
  M: "c4 d4 eb4@4 d4@2", N: "d4@5 ~ g3 bb3", O: "eb4@2 eb4@2 eb4@2 d4 c4", P: "bb3 c4 d4@4 bb3 c4",
  Q: "d4 eb4 f4@4 ~ f3", R: "[~@31 g3@4 bb3@4 eb4@8 g4@8 ab4@8 ab4@2 g4@2 f4@2 eb4@2 d4@12 f4@4 g4@32 ~@9]/4",
  S: "[~@15 g4@8 g4@12 ab3@4 c4@8 eb4@8 g4@4 f4@4 eb4@4 d4@4 c4@8 d4@8 eb4@48 ~@25]/5",
  T: "[~@11 g3@4 bb3@4 c4@4 eb4@8 eb4@8 eb4@8 d4@4 c4@4 bb3@4 c4@4 d4@12 ~@4 bb3@4 c4@4 d4@4 eb4@4 f4@20 f4@4 bb4@32 ~@9]/5",
  U: "[~@11 g3@2 bb3@2 eb4@4 g4@4 ab4@4 ab4 g4 f4 eb4 d4@6 f4@2 g4@24 ~]/4",
  V: "[~@3 g4@4 g4@6 ab3@2 c4@4 eb4@4 g4@4 f4@4 eb4@4 d4@4 c4@14 ~@2 d4@16 eb4@48 ~@9]/8",
})).s("gm_trombone").gain(0.3)

// chords · trombone
const trombone_2 = note(`<
  A B C D E F G H I J K L M N G O P N Q R S T U V W X Y Z AA AB@2 AC AD AE@4 AF@2 AG@3 AH@8 AI@7 AJ@4 AK@3
>`.pickRestart({
  A: "~@6 [d3,ab3]!2", B: "[f3,bb3]@2 [eb3,ab3]@2 [d3,g3]@2 [eb3,f3]!2", C: "[e3,g3]@2 [db3,e3]@3 ~ [e3,g3]!2",
  D: "eb3@4 d3@2 [d3,ab3]!2, ab3@3 ~", E: "[c3,ab3] [d3,g3] [eb3,ab3] [f3,bb3]", F: "f3 eb3, g3",
  G: "~ [eb3,ab3] eb3 d3, ~ ab3", H: "[eb3,f3]@2 [c3,e3] [e3,gb3]", I: "~ [eb3,bb3] [f3,c4] [eb3,g3] [d3,ab3]@4",
  J: "[d3,bb3] [c3,ab3] [eb3,g3] [eb3,f3] [eb3,g3]@4", K: "~ [c3,f3] [bb2,d3]@2",
  L: "~ [f3,bb3] [f3,ab3] [f3,g3] [e3,g3] [g3,bb3] [e3,g3]@2", M: "~ [a2,e3]!2 [e3,gb3] [f3,ab3]@2 [f3,ab3]@2",
  N: "[f3,g3] [eb3,g3]", O: "[eb3,g3]@2 [c3,e3] [e3,gb3]", P: "~ [d3,ab3] [f3,bb3] [eb3,ab3] [eb3,ab3]@2 [d3,ab3]@2",
  Q: "[c3,gb3] [b2,f3]", R: "~@2 [eb3,g3]@5 [eb3,g3]", S: "[eb3,ab3] [eb3,ab3]@3 ~ [bb2,g3] [f3,ab3] [b2,g3]",
  T: "[c3,f3]@2 [c3,f3]@2 [b2,f3]@3 [b2,f3]", U: "[d3,f3]@3 [d3,f3] [c3,d3]@4", V: "[eb3,f3]@4 [d3,g3]@3 [bb2,gb3]",
  W: "f3@2 ~ d3 f3 eb3 d3@2", X: "~ [d3,g3] [bb2,gb3]@2", Y: "[d3,g3]@3 [d3,g3] [d3,gb3]@4",
  Z: "[bb2,eb3]@3 [bb2,eb3] [bb2,eb3]@4", AA: "~ [eb3,ab3] [d3,g3] [c3,f3] [bb2,eb3]@2 [ab2,d3]@2",
  AB: "[~@15 bb3@15 bb3@3 ab3@4 g3@4 f3@4 [eb3,ab3]@7 [d3,f3]@7 ~@5, eb3@15 ~@49, ~@7 g3@15 ~@8 c4@15 ~@19]/2", // Ab5 Dm
  AC: "~@3 eb3@4 [d3,f3]@3 [d3,g3]@4 [db3,bb3]@11 ~@4 c3@3", AD: "~ d3@3 eb3@4 e3@7 ~ f3@7 [eb3,f3]@8 ~",
  AE: "[~@7 [eb3,g3]@16 [f3,ab3]@12 [c3,f3]@4 [b2,f3]@16 ~@8 [c3,eb3]@20 [c3,eb3]@4 [db3,g3]@32 [c3,f3]@8 ~]/4", // Eb Fm F5 Bdim Cm Dbdim F5
  AF: "[~@15 [c3,eb3]@8 [c3,eb3]@16 [c3,eb3]@8 [d3,f3]@8 [eb3,f3]@8 ~]/2", // Cm Dm Ebsus2
  AG: "[~@3 [f3,bb3]@4 [eb3,ab3]@12 [d3,g3]@2 [c3,f3]@2 [bb2,eb3]@16 ~@24 [ab3,c4]@8 [ab3,b3]@16 [g3,bb3]@8 ~]/3", // Bb5 Ab5 G5 F5 Eb5 Ab Abm Gm
  AH: "[~@3 [g3,bb3]@4 [gb3,a3]@16 [f3,ab3]@16 [gb3,a3]@16 f3@8 eb3@16 ~@16 [d3,g3]@8 [bb2,gb3]@16 [d3,g3]@12 [d3,g3]@4 [d3,gb3]@16 [bb2,eb3]@12 [bb2,eb3]@4 [bb2,eb3]@16 ~@4 [eb3,ab3]@4 [d3,g3]@4 [c3,f3]@4 [g2,d3]@8 [ab2,f3]@8 ~@15 bb3@15 bb3@3 ab3@4 g3@4, ~@55 g3@24 ~@136 eb3@15 ~@26, ~@222 g3@15 ~@8 c4@11]/8", // Gm Gbm Fm Gbm G5 Ebm G5 D …
  AI: "[f3@4 [eb3,ab3]@7 [d3,f3]@7 ~@8 eb3@4 [d3,f3]@3 [d3,g3]@4 [db3,bb3]@11 ~@4 c3@4 d3@3 eb3@4 e3@7 ~ f3@7 [eb3,f3]@8 ~@8 [eb3,g3]@16 f3@12 [c3,f3]@4 [b2,f3]@16 ~@8 [c3,eb3]@20 [c3,eb3]@4 [db3,g3]@32 [f3,bb3]@12 ~@6]/7", // Ab5 Dm G5 Gb Ebsus2 Eb F5 Bdim …
  AJ: "[~@6 [c3,eb3]@8 [c3,eb3]@8 [bb2,d3]@8 [ab2,c3]@8 [g2,eb3]@8 [c3,eb3]@28 ~@4 [ab2,g3]@16 [g2,gb3]@16 [eb3,g3]@2 ~@4 [f3,bb3] ~ [eb3,g3]@2 ~@2 [d3,f3]@2 ~@2 [c3,eb3]@2]/4", // Cm Bb Ab Cm Abmaj7 Gmaj7 Eb Bb5 …
  AK: "[~ [d3,f3] ~ [eb3,g3]@2 [eb3,g3]@2 [c3,eb3]@4 [b2,e3]@4 [eb3,ab3]@4 [e3,ab3]@4 [eb3,g3]@16 ~@9]/3", // Dm Eb Cm E5 Ab5 E Eb
})).s("gm_trombone").gain(0.2)

// bass · tuba
const bass = note(`<
  A B C D E F G F H I G J K F G F L F M N O P Q R S T Q U V W@2 X@2 Y@4 Z@2 AA@8 AB@4 AC@6 AD@2 AE AF@4
>`.pickRestart({
  A: "~@6 e2!2", B: "eb2@6 db2!2", C: "c2@2 e2@3 ~ e2!2", D: "f2@6 f2!2", E: "bb1@3 e2", F: "eb2 c2", G: "~ f2 bb1@2",
  H: "~ f2 g2 f2 bb1@4", I: "eb2@2 eb2 d2 c2@4", J: "~ db2!3 c2@4", K: "b1@2 bb1 e2", L: "~ f2 g2 f2 bb1@2 e2@2",
  M: "ab1 g1", N: "~ c2@3", O: "bb1@4 ~ eb2 bb1 a1", P: "ab1@4 db2@3 db2", Q: "g2@3 g2 gb2@4", R: "f2 bb1", S: "eb2",
  T: "~ a1 d2@2", U: "f2@3 f2 f2@4", V: "~ bb1@7", W: "[eb3@7 d3@7 ~ c3@7 bb2@7 ~ f2@15 bb1@15 ~@4]/2",
  X: "[~@3 eb3@4 bb2@3 g2@4 gb2@11 f2@15 bb1@15 eb2@8 ~]/2",
  Y: "[~@7 c2@16 d2@12 ab1@4 g1@16 ~@8 c2@20 c2@4 eb2@32 ab1@8 ~]/4", Z: "[~@15 ab2@4 g2@4 f2@16 bb1@16 eb2@9]/2",
  AA: "[~@3 eb2@4 ab2@12 g2@2 f2@2 eb2@16 ~@4 bb2@4 c3@4 eb3@4 g3@8 g3@8 g3@8 f3@4 eb3@4 d3@4 eb3@4 f3@16 eb3@4 d3@4 c3@4 d3@4 eb3@16 d3@8 d3@24 ~@16 a2@8 d2@16 g2@12 g2@4 gb2@16 f2@9]/8",
  AB: "[~@3 f2@4 f2@16 ~@4 bb1@28 eb3@7 d3@7 ~ c3@7 bb2@7 ~ f2@15 bb1@15 ~@7 eb3@4 bb2@2]/4",
  AC: "[~ g2@4 gb2@11 f2@15 bb1@15 eb2@8 ~@8 c2@16 d2@12 ab1@4 g1@16 ~@8 c2@20 c2@4 eb2@32 ab1@12 ~@6]/6",
  AD: "[~@3 ab2@2 g2@2 f2@4 g2@4 ab2@4 a2@4 bb2@6 bb2 ~ bb2]/2", AE: "~ bb2@6 ~@2 bb1@4 bb1 ~ bb1",
  AF: "[~ bb1@6 eb2@16 ab1@4 gb1@4 f1@4 e1@4 eb1@16 ~@9]/4",
})).s("gm_tuba").gain(0.2)

stack(trombone, trombone_2, bass)