Strudelify
KeyF majorTempo110 bpm
0:00/0:00
// Mary Did You Know — Richard Kaufmaned. Caitlin Murray
// 110 bpm, 4/4, key F major. 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 (2/4 at bar 1, 4/4 at bar 2, 2/4 at bar 12, 4/4 at bar 12, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5840842; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/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@5 C@4 D@2 E F G H I J G K L@2 M N O@2 P Q R S T U V W X Y@3 Z@2 AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ
  AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK@5
>`.pickRestart({
  A: "~@13 c4@2 d4",
  B: "[~@2 eb4 ~ f4@2 ~@10 [c4,eb4]@9 ~ d4@9 ~ eb4@2 d4@2 ~ c4@2 bb3@2 ~ ab3@9 ~ [ab3,c4]@4 [ab3,d4]@5 [ab3,eb4,f4]@9 ~ c4@2 ~ d4@2, ~@7 g4@19 g4@20 ~@34, ~@26 bb3@17 ~@3 [f3,g4]@19 bb3@15]/5", // Cm Ab Abdim Fm7 Fsus2
  C: "[eb4@2 f4@2 ~@6 g3@5 [c3,g3,c4,f4]@5 [c3,g3,eb4,g4]@4 [bb2,f3,d4]@5 [bb2,f3,c4]@5 eb4@2 ~ d4@2 c4@2 ~ bb3@2 ~@5 d4@5 eb4@5 [ab2,ab3,c4,f4]@5, ~@5 g4@15 ~@4 g4@20 g4@20, ~@24 f4@10 [g2,eb3]@9 ~ [ab2,bb3,c4]@14 ~@6, ~@34 bb3@7 ~@23]/4", // Csus4 Cm Bb Bbsus2 Fm Cm Ab
  D: "[[g2,g3,c4]@9 [g2,g3,b3]@14 ~@9, [d4,g4]@23 ~@9]/2", E: "~@3 [eb3,c4]@3 ~ g3, g3 g3@2 ~, ~ c4@2 ~@5",
  F: "~@3 [d3,bb3]@3 ~ f3, f3 f3@2 ~, ~ bb3@2 ~@5", G: "~@3 [ab3,c4]@3 ~ eb3, eb3 eb3@2 ~, ~ ab3@2 ~@5",
  H: "~@3 [ab3,g4]@3 ~ d3, d3 d3@2 ~, ~ g4@2 ~@5", I: "~@3 [c4,eb4]@3 ~ g3, g3 g3@2 ~, ~ c4@2 ~@5",
  J: "~@3 [bb3,d4]@3 ~ f3, f3 f3@2 ~, ~ bb3@2 ~@5", K: "~@3 [c4,g4]@3 ~ d3, d3 d3@2 ~, ~ g4@2 ~@5",
  L: "[~@5 bb2 c3 eb3 ~@2 ab2 [f2,bb3,d4]@3 ~ [f2,f3], eb3@2 eb3@4 ~ bb2@3 ~@6, ~ ab3@2 [ab3,c4]@3 ~@2 f3@2 f3@4 ~@2, ~@9 bb3@2 ~@5]/2", // Bb F Ab
  M: "~ bb3 [eb2,bb3,eb4] [bb3,f4] ~ bb3 [bb3,eb4] [g2,bb3,f4], eb3 d3, eb2@2 ~ eb2@2 g2@2 ~", // Eb5 Bb5 Eb5 Gm7
  N: "~ g4 [c4,g4] [eb4,g4] ~@2 [eb4,g4]@2, c3 ~, g2 ~@3", O: "[f4@15 ~ f4@8 [c4,eb4]@8, c4@23 ~@9]/2",
  P: "[c4,d4]@15 ~", Q: "[b3,d4] ~", R: "~@3 eb4@2 ~ eb4@2, [c3,eb3]@15 ~, g3 g3@2 ~, ~ c4@2 ~@5",
  S: "~@3 d4 ~@2 [d4,eb4]@2, [bb2,d3]@15 ~, d4 f3@2 ~, ~ bb3@2 ~@5", // Ebmaj7 Bb
  T: "eb4 ~@2 c4@2 ~ [c4,eb4]@2, [ab2,c3]@15 ~, c4 eb3@2 ~, ~ ab3@2 ~@5", U: "c4 g3, [g2,b2]@15 ~, d4 ~@3",
  V: "~@3 eb4@2 ~ [eb4,g4]@2, [c3,eb3]@15 ~, g3 g3@2 ~, ~ c4@2 ~@5", // Eb Cm
  W: "[d4,f4]@2 ~ [d4,f4] [eb4,g4] [d4,f4] [c4,eb4] [bb3,d4], bb2 g2", // Dm Eb Dm Cm Bb
  X: "[ab3,eb4]@2 ~ [ab3,c4]@3 [c4,eb4]@2, [ab2,c3]@15 ~", // Ab5 Ab Cm Ab
  Y: "[[g3,c4]@4 ~ [g3,c4] eb4@2 eb4@2 ~@3 [eb3,d4,eb4] [g3,eb4,g4] d4 d4@2 [eb3,c4,eb4] d3@4 [c4,f4], [g2,b2]@15 ~ [ab2,c3]@15 ~ bb2@15 ~, ~@6 c4@4 ~@5 [f3,f4]@3 ~ d4@3 ~@2, ~@16 d3@3 bb3 ~@4]/3", // C5 Ebmaj7 Cm F5 G Ab F
  Z: "[[bb3,eb4]@4 [bb3,eb4]@4 [bb3,eb4]@2 [d4,f4]@4 eb4@2 [c3,g3]@8 ~@6 [ab3,a3] [bb3,b3,c4,db4], eb3@4 [d3,f3]@4 eb4@2 ~@2 [bb2,ab3]@3 bb2, ~@7 g4@3 ~@4 [bb3,d4]@2]/2", // Eb5 Dm C5 Amaj7 Dm Bb7 Bb
  AA: "[ab2,c4,eb4]@15 ~, d4 ~@15", AB: "ab2@3 ~@3 ab2@2, [c4,eb4]!2, ~@3 ab2@3 ~@2",
  AC: "g2@3 ~@3 g2@2, [c4,f4]!2, ~@3 g2@3 ~@2", AD: "[g2,g3,b3]@4 c4 g3!2 c4",
  AE: "[eb3,c4,eb4]@4 c3 [d3,d4] [eb3,eb4] [g3,g4], g4@7 ~, ~@8 c4@7 ~", // Cm D Eb G
  AF: "~@4 bb4 ab4 [eb3,eb4,g4] [d3,d4,bb4], bb3@15 ~, [f3,f4]@11 ~@5", // Eb Gm F
  AG: "[c3,ab3,c4,ab4]@4 ab4 g4 f4 ab4, ~@2 [eb3,c4,eb4] [c3,c4]", AH: "b4@4 c5 g4!2 c5, [d3,d4]@15 ~",
  AI: "eb4 d4 c4 bb3 [c3,c4] [d3,c4,d4] [eb3,c4,eb4] [c3,g3,c4,g4], c5@15 ~", // C D7 Cm C5
  AJ: "bb2 ab2 g2 f2 bb4 ab4 g4 bb4, f3@15 ~, [bb3,c4,f4] bb3, ~@2 g2 eb2", // Bbsus2
  AK: "[ab2,ab3,c4,eb4]@2 [ab2,ab3,d4]@2 ab4 g4 f4 ab4, ab4@2 [ab2,ab3,c4,eb4] [ab2,ab3,c4]", // Ab Abdim Ab
  AL: "[g2,g3,b3,d4] [b3,f4], g4@15 ~", AM: "ab2!4, [c4,eb4]@15 ~", AN: "bb2!4, [d4,f4]@15 ~",
  AO: "c3!4, [eb4,g4]@15 ~", AP: "c3@2 c3@2 eb4 [d4,f4] [c4,eb4] [bb3,d4], [eb4,g4]@2 bb2!2",
  AQ: "gb2@2 gb2@2 [bb3,db4] [c4,eb4] [gb2,db4,f4]@2, [bb3,db4]@2 gb2 ~", // Bbm Cm Gbmaj7 Bbm
  AR: "ab2@2 ab2@2 [c4,eb4] [db4,f4] [ab2,ab3,eb4]@2, [c4,eb4]@2 ab2 ~", AS: "[f2,bb3,f4]!4",
  AT: "[f2,c4,f4] [f3,db4,bb4]", AU: "[f2,c4,a4] ~@3", AV: "b1!2", AW: "db2!2", AX: "bb1!2", AY: "eb2 db2",
  AZ: "[b1,b2,gb3]@15 ~", BA: "[ab1,ab2,gb3]@15 ~",
  BB: "[bb2,bb3] eb3 [eb3,gb3,eb4] [bb2,gb3,gb4], bb1@15 ~, ~@4 bb3@11 ~, ~ bb2@2 ~", BC: "[bb1,bb2,f3,d4,f4]@15 ~",
  BD: "[eb2,eb3]@2 [eb2,eb3]@2 eb4 [f3,f4] gb3 [ab3,ab4], bb3@15 ~, gb4@3 ~, ~@2 [eb2,eb3] [eb2,eb3,gb4]", // Eb F Ab Eb Ebm
  BE: "[eb2,eb3]@2 [eb2,eb3]@2 [eb2,eb3]@2 ~ [ab3,db4,ab4], [bb3,eb4,bb4]@3 [eb2,eb3]", // Eb Db5 Eb5 Eb
  BF: "[b1,b2]!4, [gb3,bb3,gb4]@15 ~", // B Gb
  BG: "[bb1,bb2]@2 [bb1,bb2,gb3,bb3]@2 eb3 f3 [gb3,ab3] ab3, f3@2 [bb1,bb2,bb3,eb4] [bb1,bb2,d4]", // Bb Ebm Gbsus2 Eb5 Bb
  BH: "gb4 db4!2 gb4 bb3 ab3 gb3 bb3, [eb2,eb3]!2 gb4@2, ~@2 [eb2,eb3]!2", // Eb
  BI: "[gb3,ab4] [f3,gb4] [db3,eb3,f4] [db3,eb4] [db2,db3]@2 [db2,db3]@2, ab3@15 ~, db4 [eb3,db4,f4], [db2,db3] db2 ~@2", // Gbsus2 Gbmaj7 Db Dbsus2 Db
  BJ: "[b1,b2,eb3,gb3]@4 [b1,b2,f3,ab3]@4 [b1,b2,f3]@4 ~ [b1,b2,f3]@3, db4 [bb3,gb4]", // B Fdim Bdim Ebm
  BK: "[~ [eb3,gb3]@18 [d3,f3]@17 [eb1,eb3,gb3,bb3,eb4]@33 ~@11, ~ bb1@69 ~@10, ~ bb3@33 ~@46]/5", // Ebm Dm Ebm
})).s("gm_piano").gain(0.2)

stack(piano)