Strudelify

christmas medley

Andrew Yonkers

KeyC minorTempo85 bpm
0:00/0:00
// christmas medley — Andrew Yonkers
// 85 bpm, 3/4, key C minor. 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 1, 3/4 at bar 6, 4/4 at bar 11, ...) are rendered on a constant 3/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/2944911; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 30 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(85/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · clarinet · "B♭ Clarinet"
const clarinet = note("<A@3 B C ~@5 D@3 E@2 ~@9 F@2 G@2 ~@2>".pickRestart({
  A: "[~@13 bb4@36 g4@29 c4@14 ~@4]/3", B: "~@4 f4@7 ~ g4@3 g4@4 g4@7 g4@4 g4@2",
  C: "~ g4@7 ~ g4@3 bb4@4 eb4@5 f4@2 g4@7 ~@2",
  D: "[~ e4@4 e4@4 f4@4 g4@4 g4@4 ~ f4@4 e4@4 d4@4 c4@4 c4@4 d4@4 e4@4 e4@6 ~ d4@2 d4@8 e4@4 e4@4 f4@4 g4@4 g4@4 ~ f4@4 e4@4]/3",
  E: "[d4@4 c4@4 c4@4 d4@4 e4@4 d4@6 ~ c4@2 c4@8 ~@27]/2", F: "[~@28 g4@15 ~ f4@15 ~@5]/2", G: "[~@25 eb4@15 ~@24]/2",
})).s("gm_clarinet").gain(0.4)

// other · clarinet · "B♭ Clarinet" · soft notes
const clarinet_soft = note("<~@14 A B C D E F B C B ~@2 G@2 H@3>".pickRestart({
  A: "~@21 bb3@11", B: "eb4", C: "c4", D: "f4", E: "d4", F: "g4", G: "[~@27 eb4@15 d4@15 ~@7]/2",
  H: "[~@8 d4@15 c4@15 g3@15 g3@15 ~@28]/3",
})).s("gm_clarinet").gain(0.2)

// other · flute
const flute = note("<A@3 B C D@3 E@2 F G H I@2 J K L M N J K J ~@3 O@4>".pickRestart({
  A: "[~@13 bb4@34 ~@2 g4@28 ~ c4@14 ~@4]/3", B: "~@4 f4@7 ~ g4@3 g4@3 ~ g4@7 g4@3 ~ g4@2",
  C: "~ g4@7 ~ g4@3 bb4@3 ~ eb4@5 f4@2 g4@7 ~@2", D: "[~@6 g4@18 ~ a4@6 g4@12 ~ e4@25 ~@8 g4@18 ~]/3",
  E: "[a4@6 ~ g4@12 ~ e4@25 ~@19]/2", F: "~ e4@31", G: "~ c4@15", H: "~@3 e4@29", I: "[~@4 c4@31 ~@18 bb4@10 ~]/2",
  J: "eb4@15 ~", K: "c4@15 ~", L: "f4@15 ~", M: "d4@15 ~", N: "g4@15 ~",
  O: "[~@25 g4@14 ~ f4@14 ~ eb4@14 ~ d4@15 d4@14 ~@29]/4",
})).s("gm_flute").gain(0.25)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note("<A@2 B C D ~@9 E F G H I J K L M ~@5 N@2>".pickRestart({
  A: "[~@13 bb3@7 bb3@11 ab3@4 g3@7 g3@7 f3@7 ~ eb3@7]/2", B: "eb3@7 d3@7 c3@7 ~ bb2@7 ~@3",
  C: "~@4 f3@7 ~ g3@3 g3@4 g3@7 g3@4 g3@2", D: "~ g3@7 ~ g3@3 bb3@4 eb3@5 f3@2 g3@4 ~@5", E: "~@21 bb2@11",
  F: "eb3@11 eb3@5 f3@5 eb3@5 ~ d3@5", G: "c3@11 c3@10 c3@11", H: "f3@11 f3@5 g3@5 f3@5 ~ eb3@5",
  I: "d3@11 d3@10 d3@11", J: "g3@11 g3@5 ab3@5 g3@5 ~ f3@5", K: "eb3@11 c3@10 bb2@5 ~ bb2@5", L: "c3@11 f3@10 d3@11",
  M: "eb3", N: "[~@6 g4@15 g4@15 ~@28]/2",
})).s("gm_baritone_sax").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  [~@5 x ~ x]
  [~@3 x ~@6 x ~@6 x ~@7 x ~@6]
  [x ~@6 x ~@6 x ~@7 x ~@6 x ~@2]
  [~ x ~@6]
  ~@26
>`).gain(0.3)

// drums · rim
const rim = s("rim").struct("<~ A B C D ~@5 E F G H I J@8 K L M N O P ~>".pickRestart({
  A: "~@5 x ~@10", B: "~@7 x ~@24", C: "~@2 x ~@10 x ~@2", D: "~@23 x ~@8", E: "~@9 x ~@3 x ~@12 x ~@3 x ~",
  F: "~@10 x ~@3 x ~@12 x ~@3 x", G: "~@11 x ~@3 x ~@12 x ~@3", H: "x ~@11 x ~@3 x ~@12 x ~@2", I: "~ x ~@30",
  J: "~@11 x ~@9 x ~@10", K: "~@5 x ~@14 x ~@11", L: "~@3 x ~@14 x ~@13", M: "~ x ~@15 x ~@14", N: "x ~@14 x ~@14 x ~",
  O: "~@13 x ~@14 x ~@3", P: "~@11 x ~@14 x ~@5",
})).gain(0.3)

// drums · rim · soft notes
const rim_soft = s("rim").struct(`<
  ~@5
  [~@9 x ~@6]
  [~@6 x ~@18 x ~@6]
  [~@13 x ~@18]
  [x ~@4 x ~@2]
  [~@7 x ~@18 x ~@5]
  ~@20
>`).gain(0.15)

// drums · snare
const snare = s("sd").struct("<A B C D E F ~@4 G H I J K L@8 M N O P Q R S>".pickRestart({
  A: "~@5 x ~ x", B: "~@3 x ~@13 x ~@7 x ~@6", C: "x ~@13 x ~@7 x ~@6 x ~@2", D: "~@12 x ~@2 x ~@3 x ~@2 x ~@7 x ~",
  E: "~ x ~@3 x ~@3 x ~@2 x ~@3 x ~@2 x ~@7 x ~@2 x ~", F: "~ x ~@14", G: "~ x ~@3 x ~ x ~@9 x ~@4 x ~ x ~@7",
  H: "~@2 x ~@3 x ~ x ~@9 x ~@4 x ~ x ~@6", I: "~@3 x ~@3 x ~ x ~@9 x ~@4 x ~ x ~@5",
  J: "~@4 x ~@3 x ~ x ~@9 x ~@3 x ~@2 x ~@4", K: "~@21 x ~@10", L: "x", M: "x ~@9 x ~@4 x ~@9 x ~@4 x ~",
  N: "~@8 x ~@4 x ~@9 x ~@4 x ~@3", O: "~@7 x ~@4 x ~@9 x ~@4 x ~@4", P: "~@5 x ~@4 x ~@9 x ~@4 x ~@6",
  Q: "~@3 x ~@4 x ~@9 x ~@4 x ~@8", R: "~ x ~@4 x ~@9 x ~@4 x ~@9 x", S: "x!5 ~@27",
})).gain(0.3)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@5
  [~@6 x ~@2 x ~@2 x ~@12 x ~@2 x ~@2 x]
  [~@12 x ~@3 x ~@2 x ~@12]
  [x ~@2 x ~@2 x ~@12 x ~@2 x ~@3 x ~@5]
  [~@7 x ~@2 x ~@2 x ~@12 x ~@2 x ~@2]
  [~ x ~@12 x ~@2 x ~@2 x ~@11]
  ~@20
>`).gain(0.15)

stack(clarinet, clarinet_soft, flute, baritone_sax, kick, rim, rim_soft, snare, snare_soft)