Strudelify

Oh Holy Night

Kevin Buckner

KeyB♭ majorTempo120 bpm
0:00/0:00
// Oh Holy Night — Kevin Buckner
// 120 bpm, 12/8, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (6/8 at bar 1, 12/8 at bar 2) are rendered on a constant 12/8 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5866451; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 26 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/6)

// 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 · flute
const flute = note("<~@3 A B C D E F G H I J K L M N O P Q R S T U V W>".pickRestart({
  A: "bb4@11 ~ f5@11 ~", B: "bb4@11 ~@13", C: "bb5@6 bb5@4 bb5@2 d6@11 ~", D: "bb5@11 ~ c6@11 ~", E: "eb6@11 ~ f5@11 ~",
  F: "a5@11 ~ a5@11 ~", G: "d5@11 ~ a4@2 bb4@2 c5@2 c5@2 d5@2 eb5@2", H: "f5 g5 c5 f5",
  I: "bb5@3 d6@2 f5 bb5@3 a5@2 f5", J: "a5 bb5 eb5 a5", K: "bb5@4 a5@2 d6@4 f5@2 a5@11 ~", L: "d6@17 ~ c6@6",
  M: "a5@17 ~ c6@6", N: "eb6@15 ~ bb5@2 bb5@4 bb5@2", O: "d6@11 ~ d6@6 ~@4 d6@2", P: "f6@11 ~ eb6@11 ~",
  Q: "d6@17 ~ c6@4 bb5@2", R: "a5@15 ~ a5@2 bb5@4 a5@2", S: "a5@11 ~ a5@6 d6@6", T: "eb6@17 ~@5 a5@2",
  U: "f6@17 ~ eb6@6", V: "d6@11 ~ c6@6 bb5@4 c6@2", W: "bb5@23 ~",
})).s("gm_flute").gain(0.4)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note("<~@3 A B C D E F G H I H J K L M N O K P Q R S T U>".pickRestart({
  A: "g3 bb3", B: "g3@3 g3@2 g3 bb3@6", C: "~ f4", D: "d4 eb4", E: "g4@6 bb3@2 bb3 db4@2 f4",
  F: "f4@3 f4@2 eb4 d4@3 bb3@2 d4", G: "a3 ~", H: "f4 c4", I: "g3 d3", J: "eb4 d4", K: "g3@9 f3@2 eb3", L: "a3@3 a3",
  M: "eb4@8 g4 g4@2 g4", N: "g4@6 g4@3 ~@2 g3", O: "d3@6 c3@5 d3", P: "d3@8 d3 g3 eb3 d3", Q: "d3@3 g3",
  R: "a3@6 c4@3 ~@2 f3", S: "a4@3 g4", T: "f4@6 eb4@3 f4@2 g4", U: "f4",
})).s("gm_tenor_sax").gain(0.4)

// other · french horn · "Baritone Horn (Treble Clef)"
const french_horn = note("<A B C D E A B F G H I J I K L M N O P L Q R S T U V>".pickRestart({
  A: "~@6 d3@3 d3@2 d3", B: "f3@5 f3 g3@2 g3 eb3@2 g3", C: "bb3@6 f3@2 f3 d3@2 c3", D: "bb2@3 d3@2 eb3 f3@3 eb3@2 c3",
  E: "bb2 ~", F: "bb3@6 f3@2 f3 e3@2 d3", G: "a3@3 f3@2 g3 a3@3 bb3@2 a3", H: "d3@6 ~@5 f3", I: "f3 g3 c3 f3",
  J: "g3@2 f3 bb3@2 d3 g3@3 f3@2 f3", K: "g3@2 f3 bb3@2 d3 f3@6", L: "bb3@9 a3@2 g3", M: "a3@3 a3",
  N: "c4@8 g3 g3@2 g3", O: "bb3@6 bb3@3 ~@2 bb3", P: "d4@6 c4@5 f3", Q: "f3@8 f3 g3@2 f3", R: "f3@3 bb3",
  S: "c4@9 ~@2 f3", T: "d4@3 c4", U: "bb3@6 a3@3 bb3@2 c4", V: "bb3",
})).s("gm_french_horn").gain(0.4)

stack(flute, tenor_sax, french_horn)