Strudelify
KeyF majorTempo120 bpm
0:00/0:00
// O Holy Night — Adolphe AdamTrasc. D. Minoia
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 "Bb Trumpet" trumpet (copy of ch 3 "Alto Saxophone" alto sax)
// note: Transcription provider: pdmx. https://musescore.com/score/459696; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 56 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · trumpet · "Bb Trumpet"
const trumpet = note(`<
  ~@2 A B C D@2 E F G H ~@4 I J K L M I N O P Q R S ~@11 T I U V W M X ~ Y Z AA R S ~@2 AB S ~
>`.pickRestart({
  A: "g4@4 g4@3 g4 bb4@6 bb4@2", B: "c5@3 c5 ab4@3 c5 eb5@8", C: "bb4@3 bb4 g4@3 f4 eb4@4 g4@3 ab4",
  D: "[bb4@4 ab4@3 f4 eb4@16 g4@4 g4@3 ab4]/2", E: "bb4@6 bb4@2 c5@3 c5 ab4@3 c5", F: "eb5@8 bb4@2 bb4@2 a4@3 g4",
  G: "d5@4 bb4@3 c5 d5@4 eb5@3 d5", H: "g4", I: "eb5@12 d5@3 c5", J: "d5@15 d5", K: "f5@11 c5 c5@3 c5",
  L: "eb5@8 eb5@4 ~@3 eb5", M: "g5@8 f5@4 ~@3 bb4", N: "bb4@11 bb4 d5 c5@2 bb4", O: "bb4@8 ~@7 eb5", P: "f5@12 ~@3 bb4",
  Q: "g5@3 f5", R: "eb5@8 d5@4 eb5@3 f5", S: "eb5 ~", T: "~@9 g4 ~ ab4 bb4 c5 ~ d5", U: "d5@12 ~@3 d5",
  V: "f5@10 c5@2 c5@3 c5", W: "eb5@12 ~@3 eb5", X: "eb5@3 ~", Y: "~@15 eb5", Z: "f5@3 bb4",
  AA: "[g5,bb5]@5 [c5,ab5] g5 f5", AB: "~@8 [d5,eb5] d5 [d5,eb5]!2 d5 [d5,eb5] eb5 f5",
})).s("gm_trumpet").gain(0.33)

// other · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  A@2 B@3 C@3 D E F G H G I J K L M N O P Q R S T U V W X Y V Z AA AB G H G I AC AD AE AF P AG AH AI AJ AK AJ AL AM AN
  AK AO AP
>`.pickRestart({
  A: "eb4@3 eb4", B: "[eb4 eb4@2 eb4@2 c4 eb4@3 eb4@3]/3", C: "[d4@2 eb4 eb4@2 eb4@2 eb4@2 eb4@2 c4]/3",
  D: "eb4 eb4@2 db4", E: "d4!2", F: "g4 d4 g4@2", G: "d4 bb3 d4 bb3", H: "eb4 bb3 eb4 bb3", I: "eb4 bb3 eb4 ~",
  J: "~@4 eb4@3 eb4 g4@4 eb4@4", K: "~@4 d4@3 d4 g4@4 d4@4", L: "~@4 f4@3 f4 ab4@4 f4@4", M: "~@4 eb4@3 eb4 g4@4 ab4@4",
  N: "g4@2 f4!2", O: "g4@2 ab4!2", P: "g4 f4", Q: "g4@3 ~", R: "f4@3 f4 f4@2 f4@2", S: "g4 eb4",
  T: "g4@3 g4 f4@2 ab4@2", U: "g4@8 g4@4 g4@3 g4", V: "bb4@6 bb4@2 c5@3 c5 ab4@3 c5", W: "eb5@8 bb4@2 bb4@2 g4@3 f4",
  X: "eb4@4 g4@3 ab4 bb4@4 ab4@3 f4", Y: "eb4@8 g4@4 g4@3 g4", Z: "eb5@8 bb4@2 bb4@2 a4@3 g4",
  AA: "d5@4 bb4@3 c5 d5@4 eb5@3 d5", AB: "g4@5 g4 a4 bb4", AC: "~ g4 c5 g4", AD: "~ g4 bb4 g4", AE: "~ ab4 c5 ab4",
  AF: "~ g4 c5 ab4", AG: "eb4@12 d5@3 c5", AH: "bb4@10 bb4@2 c5@3 bb4", AI: "bb4@3 ~", AJ: "eb4 d4", AK: "bb3 d4",
  AL: "eb4@8 bb4@7 bb4", AM: "ab4@8 ab4@4 ab4@3 ab4", AN: "f4@2 eb4 c4", AO: "eb4@2 eb4!2", AP: "eb4",
})).s("gm_alto_sax").gain(0.34)

// other · alto sax · "Alto Saxophone"
const alto_sax_2 = note(`<
  A@2 B C@2 D@3 E F G H I H J K L M N O P Q J R S T U V W X Y V Z AA AB H I H J AC AD AE AF Q AG AH AI AJ AK AL AM AN AO
  AJ AP G
>`.pickRestart({
  A: "bb3@3 c4", B: "bb3 bb3@2 bb3", C: "[c4@8 bb3@12 bb3@8 bb3@3 c4]/2", D: "[d4@2 bb3 bb3@2 bb3@2 bb3@2 bb3 c4@2]/3",
  E: "bb3@4 bb3@8 a3@3 g3", F: "g3 gb3", G: "g3", H: "d4", I: "eb4", J: "eb4@3 ~", K: "eb4@3 eb4 eb4@4",
  L: "d4@3 d4 d4@4", M: "c4@6 c4@2 c4@4 c4@3 c4", N: "eb4@3 eb4 eb4@2 f4@2", O: "eb4@2 d4!2", P: "c4@3 eb4",
  Q: "eb4 d4", R: "d4@3 d4 d4@2 f4@2", S: "eb4!2", T: "eb4@3 eb4 d4@4", U: "eb4 g4", V: "g4@2 bb4 ab4",
  W: "bb4@4 ab4@4 g4@2 ~@2 g4@3 f4", X: "eb4@4 eb4@3 f4 g4@4 f4@4", Y: "eb4@2 eb4 f4 g4@4",
  Z: "bb4@4 ab4@4 g4@2 ~@2 a4@3 g4", AA: "g4 g4@2 gb4", AB: "g4@3 e4", AC: "~ eb4 g4 eb4", AD: "~ d4 g4 d4",
  AE: "~ f4 ab4 f4", AF: "~ eb4 g4 f4", AG: "c4@12 d4@3 c4", AH: "bb3@10 bb3@2 c4@3 bb3", AI: "bb3@3 ~", AJ: "bb3 ab3",
  AK: "g3 ab3", AL: "bb3!2", AM: "ab3@8 eb4@7 eb4", AN: "eb4@8 f4@4 f4@3 f4", AO: "f4@2 eb4 c4", AP: "g3@2 g3!2",
})).s("gm_alto_sax").gain(0.33)

// other · trombone
const trombone = note(`<
  A@2 B C D E@3 F G H I J I K L M N O P Q R S T U V W X Y Z AA X AB AC AD I J I K AE AF AG AH AI AJ AK AL AM AN AO AP AQ
  AR AM AS H
>`.pickRestart({
  A: "bb3@3 c4", B: "bb3 bb3@2 bb3", C: "c4 bb3", D: "bb3@4 bb3@8 bb3@3 c4",
  E: "[d4@2 bb3 bb3@2 bb3@2 bb3@2 bb3 c4@2]/3", F: "bb3@4 bb3@8 a3@3 g3", G: "g3 gb3", H: "g3", I: "d3", J: "eb3",
  K: "eb3@3 ~", L: "eb4@3 eb4 eb4@4", M: "d4@3 d4 d4@4", N: "c4@6 c4@2 c4@4 c4@3 c4", O: "eb4@3 eb4 eb4@2 f4@2",
  P: "eb4@2 d4!2", Q: "c4@3 eb4", R: "eb4 d4", S: "eb4@3 ~", T: "d4@3 d4 d4@2 f4@2", U: "eb4!2", V: "eb4@3 eb4 d4@4",
  W: "eb4 g3", X: "g3@2 bb3 ab3", Y: "bb3@4 ab3@4 g3@2 ~@2 g3@3 f3", Z: "eb3@4 eb3@3 f3 g3@4 f3@4",
  AA: "eb3@2 eb3 f3 g3@4", AB: "bb3@4 ab3@4 g3@2 ~@2 a3@3 g3", AC: "g3 g3@2 gb3", AD: "g3@3 e3", AE: "~ eb3 g3 eb3",
  AF: "~ d3 g3 d3", AG: "~ f3 ab3 f3", AH: "~ eb3 g3 f3", AI: "eb3 d3", AJ: "c4@12 d4@3 c4",
  AK: "bb3@10 bb3@2 c4@3 bb3", AL: "bb3@3 ~", AM: "bb3 ab3", AN: "g3 ab3", AO: "bb3!2", AP: "ab3@8 eb4@7 eb4",
  AQ: "eb4@8 f4@4 f4@3 f4", AR: "f4@2 eb4 c4", AS: "g3@2 g3!2",
})).s("gm_trombone").gain(0.3)

// other · tuba · "Euphonium"
const tuba = note(`<
  A@2 B C D E@3 F G H I J I K L M N O P Q R S T U V W X Y Z AA X Y AB AC I J I AD L M N AE P AF AG AH AI AJ W AK AL AM
  AN AO AP
>`.pickRestart({
  A: "~ g3 bb3 eb4 bb3 g3 c4 ab3", B: "g3 g3@2 g3", C: "ab3 g3", D: "g3@4 g3@8 g3@3 ab3",
  E: "[bb3@2 g3 g3@2 g3@2 g3@2 g3 ab3@2]/3", F: "g3@4 g3@8 a3@3 g3", G: "g3 gb3", H: "g3@8 ~@7 bb3", I: "bb3 c4 f3 bb3",
  J: "c4@3 bb3 eb4@3 g3 c4@4 bb3@3 bb3", K: "c4@3 bb3 eb4@3 g3 bb3@8", L: "c4@3 c4 c4@4", M: "bb3@3 bb3 bb3@4",
  N: "ab3@6 ab3@2 ab3@4 ab3@3 ab3", O: "c4@3 c4 c4@2 bb3@2", P: "bb3@2 bb3 ab3", Q: "~ eb3 g3 c4 eb4@2 c4@2",
  R: "~ eb3 g3 bb3 d4@2 f4@2", S: "eb4@3 g3 bb3@4", T: "~ f3 f4 d4", U: "eb4@3 g3 ab3@2 c4@2", V: "bb3@3 ab3",
  W: "bb3 bb2", X: "bb2 d3 c3 eb3", Y: "eb3@5 ~ bb2@2", Z: "c3@4 b2@4 bb2@4 bb2@3 ab2", AA: "g2 bb2", AB: "bb2@3 d3",
  AC: "bb2!3 db3", AD: "c4@3 bb3 eb4@3 g3 c4@4 bb3@4", AE: "c4@3 c4 c4@2 b3@2", AF: "~@2 eb3@2 g3@2 c4@2 eb4@4 d4@3 c4",
  AG: "bb3@10 bb3@2 c4@3 bb3", AH: "bb3 g3 bb3 [eb3,eb4]", AI: "bb3 ab3", AJ: "g3 ab3", AK: "eb3@8 eb3@7 d3",
  AL: "c3@8 c3@4 c3@3 c3", AM: "ab3@2 g3 f3", AN: "eb3 d3", AO: "eb3@2 g3!2", AP: "g3",
})).s("gm_tuba").gain(0.3)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note(`<
  A@2 B C D E F G F H I H F H J K L M N O P Q R S T S B U V W B U X Y Z AA AB AA AC AD AE AF AG O P Q R O P Q AH AI AJ Q
  AK@2
>`.pickRestart({
  A: "eb2@3 eb2 eb2@4", B: "eb2!2", C: "ab2 eb2", D: "eb3@3 d3 c3@3 b2", E: "bb2 eb3", F: "eb3!2", G: "eb3 ab2",
  H: "d3!2", I: "g2 d3 g2@2", J: "eb2@2 eb2 ~", K: "c3@3 c3 c3@4", L: "g2@3 g2 g2@4", M: "f2@3 f2 f2@4",
  N: "c3@3 g2 c3@2 d3@2", O: "bb2 ab2", P: "g2 ab2", Q: "bb2!2", R: "eb2 g2 bb2 eb3", S: "bb2@3 bb2 bb2@2 bb2@2",
  T: "eb2@3 g2 ab2@4", U: "g2@2 ab2 c3", V: "eb3@5 ~ bb2@2", W: "c3 b2 bb2@2", X: "eb3@4 eb2 ~ [eb2,eb3]@2",
  Y: "d3 db3 d3@2", Z: "d3!3 db3, g2", AA: "f2 bb2 d3 bb2", AB: "eb2 bb2 eb3 g2", AC: "eb2 bb2 eb3 d3",
  AD: "c3@3 c3 c3@2 c3@2", AE: "g2@3 g2 g2@2 g2@2", AF: "ab2@3 ab2 ab2@2 ab2@2", AG: "c3@3 g2 c3@2 b2@2", AH: "eb3 g2",
  AI: "ab2 f2", AJ: "d3@2 eb3 ab2", AK: "eb2",
})).s("gm_baritone_sax").gain(0.33)

// bass · tuba · "Bb Tuba"
const bass = note(`<
  A@2 B C D E B F B G H G B G I J K L M N O P Q R S R B T U V B W X Y Z AA AB AA AC AD AE AF AG N O P Q N O P AH AI AJ P
  AK@2
>`.pickRestart({
  A: "eb2@3 eb2 eb2@4", B: "eb2!2", C: "ab2 eb2", D: "eb3@3 d3 c3@3 b2", E: "bb2 eb2", F: "eb2 ab2", G: "d2!2",
  H: "g2 d2 g2@2", I: "eb2@2 eb2 ~", J: "c3@3 c3 c3@4", K: "g2@3 g2 g2@4", L: "f2@3 f2 f2@4", M: "c2@3 g2 c2@2 d2@2",
  N: "bb2 ab2", O: "g2 ab2", P: "bb2!2", Q: "eb2 g2 bb2 eb3", R: "bb2@3 bb2 bb2@2 bb2@2", S: "eb2@3 g2 ab2@4",
  T: "g1@2 ab1 c2", U: "eb2@5 ~ bb1@2", V: "c2 b1 bb1@2", W: "g2@2 ab2 c3", X: "eb3@4 eb2 ~ [eb2,eb3]@2",
  Y: "d2 db2 d2@2", Z: "d2!3 db2, g1", AA: "f2 bb2 d3 bb2", AB: "eb2 bb2 eb3 g2", AC: "eb2 bb2 eb3 d3",
  AD: "c3@3 c3 c3@2 c3@2", AE: "g2@3 g2 g2@2 g2@2", AF: "ab2@3 ab2 ab2@2 ab2@2", AG: "c3@3 g2 c3@2 b2@2", AH: "eb3 g2",
  AI: "ab2 f2", AJ: "d3@2 eb3 ab2", AK: "eb2",
})).s("gm_tuba").gain(0.3)

stack(trumpet, alto_sax, alto_sax_2, trombone, tuba, baritone_sax, bass)