Strudelify

christmas medley

Doris Li

KeyC majorTempo120 bpm
0:00/0:00
// christmas medley — Doris Li
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5900796; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 87 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 · pizzicato strings
const pizzicato_strings = note("<~@77 [c2 g2@2 g2 c2 g2@2 g2]!3 [c2 f2@2 a2 c3@4] ~@6>")
  .s("gm_pizzicato_strings").gain(0.3)

// other · cello
const cello = note(`<
  ~@9 A@2 B@2 C@2 D E F G H G I J K L M N O P Q R S@2 T U@2 V W X Y@2 Z@2 AA@2 AB@2 AC@2 AD AE AD AF AG AH ~@2 AI AJ ~@2
  AK AL AM AN AO AP AQ@2 AR AS AT AU AR AS AV AW AK AL AM AX AY AZ BA BB BC BD
>`.pickRestart({
  A: "[c4,e4] [c4,e4]@2 [c4,e4]!2 [c4,e4]@2 [c4,e4]", B: "[a3,c4] [a3,c4]@2 [a3,c4]!2 [a3,c4]@2 [a3,c4]",
  C: "[f3,a3] [f3,a3]@2 [f3,a3]!2 [f3,a3]@2 [f3,a3]", D: "[g3,b3] [g3,b3]@2 [g3,b3]!2 [g3,b3]@2 [g3,b3]",
  E: "[g3,b3]!2 [f3,a3]!2 [e3,g3]!2 [d3,f3]!2", F: "~@2 d4!3 c4@2 c4", G: "b3 c4 b3 c4 b3@2 c4@2", H: "d4@2 d4 c4@4 c4",
  I: "e4@3 d4 c4@2 d4@2 ~@2 c4@2 c4@2 c4@2", J: "e4@3 d4 c4@2 d4@2 ~@2 c4@2 c4@2 b3@2", K: "c4@2 b3 c4@2 b3 c4 b3",
  L: "c4 b3 c4 d4@5", M: "d5@3 d5@2 c5@2 g4", N: "d5!2 e5 c5@3 a4 c5", O: "d5!2 e5@2 c5@3 c5", P: "b4 c5 b4 a4@5",
  Q: "e5@3 d5@4 a4", R: "e5 f5 e5 d5@4 c5",
  S: "[b4@2 b4@2 b4@2 b4@4 c5@4 b4@4 g4@8 ~@2 g3!2 ~ [g2,g#2,a2,a#2,b2,c3,c#3,d3,d#3,e3,f3,f#3,g3]]/2",
  T: "[c#2,d2,d#2,e2,f2,f#2] ~@3 [c2,g2]@2 [c2,g2]@4 c3@2 g3@2 c3@2, [c2,g2] ~@3", // C5
  U: "[c2,g2]@2 [c2,g2] [c2,g2]@2 c3 g3 c3", V: "[c2,g2]@2 [c2,g2] [c2,g2]@2 c3 e3 g3",
  W: "f3 [f2,a2]!2 [f2,a2]@2 a2 c3 f3", X: "[f2,a2]@2 [f2,a2] [f2,a2]@2 f3 e3 f3",
  Y: "[[f2,g#2]@2 [f2,g#2] [f2,g#2]@2 g#2 c3 d#3 d#3!2 c3!2 g#2!2 d#2!2, g#3]/2", // Fm
  Z: "[d4@2 c4@2 c4@2 b3 c4@2 b3@2 a3 g3@3 ~]/2", AA: "[c3@2 e3@2 g3@2 b3 c4@2 b3@2 a3@2 g3@2 ~]/2",
  AB: "[~@2 e4!2 e4@2 d4 e4@2 a4@2 d4@2 c4@2 ~]/2", AC: "[f3@2 g#3 c4@2 d4@2 d#4@2 d4@2 c4 g#3@2 c3 g#2]/2",
  AD: "[c2,g2] e3 [c2,g2] e3 [c2,g2] e3 [c2,g2] e3", AE: "[e2,c3] e3 [e2,c3] e3 e2 b2 e3 g#3, a3@4 g#3@3 ~",
  AF: "a2 c3 a2 c3 e2 b2 e3 g#3", AG: "g2@2 a2@2 c3 g3@2 g3", AH: "f3 ~", AI: "~@3 e3 g3 c4 e4 g4", AJ: "e4@3 d4@4 ~",
  AK: "c4@3 c4 c4@4 b3@3 b3 b3@4", AL: "a3@3 b3 a3@2 e3@8 ~@2", AM: "a3@3 b3 a3@2 e3@6 g3@4",
  AN: "a3@3 b3 a3@2 f3@8 ~@2", AO: "d3@2 e3@4 f3@2 g3@3 a3 g3@4", AP: "d3@3 e3 f3@2 g3@8 ~@2",
  AQ: "[~@2 a3!2 b3@2 g3 c4@5 ~@2 c4 a3]/2", AR: "f3@3 f3 a3@2 c4@2 ~@2 a3@2 c4@2 a3@2",
  AS: "f#3@3 f#3 a3@2 c4@2 ~@2 a3@2 c4@2 a3@2", AT: "~ g3 b3 g3 c4 g3 e3 g3", AU: "e3 c3 e3 g3 ~@4",
  AV: "~@4 e4@3 e4 f4@3 e4 f4@3 e4", AW: "f4@2 f4@4 e4@4 ~@2 g4 [f4,f#4] [d#4,e4] [c#4,d4]", AX: "a3@3 ~",
  AY: "a3@4 c4@4 d4@3 d4 c4@3 c4", AZ: "g#3@3 g#3 c4@2 d4@8 ~@2", BA: "~@2 c3@4 a2@2 b2@3 a2 g2@4", BB: "[c2,g2] ~@7",
  BC: "~@2 c4@4 a3@2 b3@3 c4 d4@4", BD: "c4 ~",
})).s("gm_cello").gain(0.3)

// other · pizzicato strings
const pizzicato_strings_2 = note(`<
  [c3 e3 c3 e3 g3 e3 c3 g2]!3
  [a2 c3 a2 c3 e3 c3 a2 e2]
  [a2 c3 a2 c3 a2 c3 d3 e3]
  [f3 a2 c3 a2 f3 a2 c3 a2]
  [f2 a2 c3 a2 f3 a2 c3 a2]
  [g2 b2 g2 b2 g3 d3 b2 g2]
  [g3 ~]
  ~@78
>`).s("gm_pizzicato_strings").gain(0.3)

stack(pizzicato_strings, cello, pizzicato_strings_2)