Strudelify

All I Want (For Christmas)

Liam Payne

KeyB♭ majorTempo70 bpm
0:00/0:00
// All I Want (For Christmas) — Liam Payne
// 70 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5878017; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 58 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(70/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.

// chords · piano
const piano = note(`<
  A B C D C D C D C E F G F H I J I K I J L M A B C D C D C D C E F G F H I J I K I J L M A N A O I J L M A P@5
>`.pickRestart({
  A: "~@4 a5@2 ~@5 f5@5, [bb2,d3,f3,bb3,bb4]@3 [c3,eb3,g3,bb3]@5, ~ bb5@2 f5@2 d5@3, ~@7 g5@9", // Bb Cm7
  B: "~@4 a5@2 ~@5 f5@5, [g2,d3,g3,bb4]@3 [eb2,bb2,eb3]@5, ~ bb5@2 f5@2 d5@3, ~@7 g5@9", // Gm Eb5
  C: "[bb2,f3,bb3,d4]@6 [c3,g3,bb3,eb4]@9 ~", D: "[g2,d3,g3,bb3,d4]@6 [eb2,bb2,eb3,g3,bb3,f4]@9 ~",
  E: "[g2,d3,g3,bb3,d4]@3 f4@3 eb4@2, ~@6 [eb2,bb2,eb3,g3,bb3]@9 ~", // Gm Eb
  F: "[c4,eb4] g3 [c4,eb4] g3 [c4,eb4] g3 [c4,eb4] g3, c3@15 ~", // Cm
  G: "[bb3,d4] g3 [bb3,d4] g3 [a3,c4] f3 [a3,c4,f4] f3, g2 f2", H: "[bb3,d4] g3 [bb3,d4] g3 [f2,f3,a3,c4]@4, g2 ~",
  I: "[bb3,d4] f3 [bb3,d4] f3 [bb3,eb4] g3 [bb3,eb4] g3, [bb1,bb2] [c2,c3]", // Bb Eb5 Bb C
  J: "[bb3,d4,f4] g3 [bb3,d4,f4] g3 [g3,bb3,eb4] eb3 [g3,bb3,eb4] eb3, [g1,g2] [eb2,bb2]", // Bb Eb G Eb5
  K: "[bb3,d4,f4] g3 [bb3,d4,f4] g3 [g3,bb3,eb4] eb3 [g3,bb3,eb4] eb3, [g1,g2]!2", // Bb Eb G
  L: "[g3,c4,eb4]@2 [g3,c4,eb4]@2 [c4,eb4] g3 [d4,f4,bb4] bb3, [c2,c3]@11 ~ [d2,d3]@4", // Cm Bb C D
  M: "[eb4,g4] ~ [eb4,g4]@2 [f2,f3,c4,f4,a4]@4, [eb2,eb3] ~, ~ bb3@3 ~@4", // Eb F Eb
  N: "~@2 a5 ~@4 bb4, [g2,d3,g3,bb4]@3 [eb2,bb2,eb3]@5, ~ bb5@2 f5@2 d5@3, ~@7 g5@9, ~@11 f5@5", // Gm Eb5
  O: "~@3 f5@2 bb4 ~@8 bb4@2, [g2,d3,g3,bb4]@3 [eb2,bb2,eb3]@3 c5@2, ~ c5@5 c5@4 f5@6, ~@2 d5@4 ~ d5@9, ~ g5", // Gm Eb5
  P: "[~@5 a5@2 ~@8 bb4@2 ~@5 a5@2 ~@5 f5@5 ~@5 a5@2 ~@6 f5@6 [bb2,d3,f3,bb3,bb4,bb5]@18 ~@9, [g2,d3,g3,bb4]@6 ~ [eb2,bb2,eb3]@11 ~@10 d5@7 ~@11 d5@7 ~@27, ~@3 bb5@4 f5@4 d5@6 [bb2,d3,f3,bb3,bb4]@7 [c3,eb3,g3,bb3]@11 [g2,d3,g3,bb4]@7 [eb2,bb2,eb3]@11 ~@27, ~@8 g5@10 ~@2 bb5@4 ~ g5@10 ~@2 bb5@5 ~ g5@10 ~@27, ~@12 f5@5 ~@7 f5@5 ~@13 f5@5 ~@33]/5", // Bb Gm Eb5 Bb Cm7 Gm Eb5
})).s("gm_piano").gain(0.2)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@28 A B C D E F E G H I H J H I K L ~@4 H I K L ~@6>".pickRestart({
  A: "d4@3 [c3,eb4]@5", B: "[g2,d3,d4]@3 [eb2,bb2,eb3,g4]@5", C: "[bb2,d4]@3 [c3,eb4]@5",
  D: "[g2,d3,d4]@3 g4@3 f4@2, ~@3 [eb2,bb2,eb3]@5", E: "[c3,c4,eb4]", F: "g2@2 ~ g4, [bb3,d4]@3 ~, ~ f2",
  G: "[g2,bb3,d4] ~", H: "[bb1,bb2,bb3,d4] [c2,c3,bb3,eb4]", I: "[g1,g2,d4,f4] [eb2,bb2,bb3,eb4]",
  J: "[g1,g2,d4,f4] [g1,g2,bb3,eb4]", K: "[g3,c4,eb4]@2 [c4,eb4] [d2,d3,d4,f4,bb4], [c2,c3]@3 ~",
  L: "[eb4,g4] ~ [eb4,g4]@2 [f3,a4]@4, [eb2,eb3] ~, ~ bb3@3 ~@4", // Eb F Eb
})).s("gm_string_ensemble_1").gain(0.15)

stack(piano, string_ensemble_1)