Strudelify

Carol of the Bells

Caleb and David Schmurr

KeyG majorTempo120 bpm
0:00/0:00
// Carol of the Bells — Caleb and David Schmurr
// 120 bpm, 6/8, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5366797; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 42 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/3)

// 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@2 C@3 D@2 E F G H ~@6 I J K L M N O P M N O Q R S T U V W X Y Z J AA AB>".pickRestart({
  A: "[e3,e4] ~@7 [d3,d4] ~@7", B: "[c3,c4] ~@7 [b2,b3] ~@7",
  C: "[[a2,a3] ~@7 g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, ~@4 e2@19 ~]/3", // A
  D: "[g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [e1,e2]@15 ~]/2", // E
  E: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, e2 f#2", F: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, g2 a2",
  G: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, b2 c3", H: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, d3 d#3",
  I: "[e3,b3,e4] ~@2 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, g5@3 ~@13", J: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3",
  K: "g5@5 g5@3 g5@5 g5@3, e3!2", L: "e5@5 b4@3 [e3,e4]@5 [e2,e3,e4]@3, b2 ~",
  M: "[e2,e3]@3 [e2,e3]@2 [e2,e3,b4]@3 [e2,e3]@3 [e2,e3]@2 [e2,e3,a4]@3, e4@5 ~@3 b4@5 ~@3", // E E5 E A5
  N: "[e2,e3]@3 [e2,e3]@2 [e2,e3,f#4]@3 [e2,e3]@3 [e2,e3]@2 [e2,e3,d4]@3, g4@5 ~@3 e4@5 ~@3", // E Esus2 E E7
  O: "[c2,c3]@3 [c2,c3]@2 [c2,c3,f#4]@3 [c2,c3]@3 [c2,c3]@2 [c2,c3,a4]@3, e4@5 ~@3 g4@5 ~@3", // C Cdim C F
  P: "[b1,b2,b4]@5 b1@3 d#2@3 f#2@2 [b2,e4]@3", Q: "[b3,d#4,f#4,b4]@3 f#4@2 d#4@3 b3@8, [b1,b2]@15 ~",
  R: "a4@3 e4@2 c4@3 ~@3 c4@2 e4@3, [a2,e3]@15 ~, a3@8 a3@7 ~", // A5
  S: "g4@3 d4@2 b3@3 ~@3 b3@2 d4@3, [g2,d3]@15 ~, g3@8 g3@7 ~", // G5
  T: "e4@3 b3@2 g3@3 ~@3 g3@2 b3@3, [e2,b2]@15 ~, e3@8 e3@7 ~", U: "f#4@3 e4@2 d4@3 a3@3 d4@2 f#4@3, [d2,a2,d3]@15 ~",
  V: "[g2,g3] ~", W: "[b2,b3]@5 [b2,b3]@3 [b2,b3]@5 [b2,b3]@3",
  X: "[e3,e4] ~@2 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, g5@3 ~@13", // E
  Y: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [e2,b2,e3] [b2,e3,b3]", Z: "g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [e3,b3,e4] ~",
  AA: "[b1,b2]@5 [b1,b2]@3 [b1,b2]@5 [b1,b2]@3, [e3,b3,e4]@15 ~", // B E5
  AB: "[a1,a2]@3 [g1,g2]@2 [f#1,f#2]@3 [e1,e2]@4 ~@4, [e3,b3,e4]@15 ~", // A G F# E E5
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes · C A5 E5 B5
const piano_soft = note(`<
  ~@12
  [g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, e3@15 ~]
  [g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, a2 e3]
  [g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [g2,e3]@15 ~]
  [g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [a2,e3] [e2,b2,e3]]
  [g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [b2,f#3] b2]
  [g5@3 f#5 g5 e5@3 g5@3 f#5 g5 e5@3, [f#2,b2,f#3] [b2,f#3,b3]]
  ~@24
>`).s("gm_piano").gain(0.2)

stack(piano, piano_soft)