Strudelify

mary did you know

Cee Lo Green

KeyB majorTempo95 bpm
0:00/0:00
// mary did you know — Cee Lo Green
// 95 bpm, 4/4, key B 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) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5874659; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 86 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(95/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@2 D@2 E F G@2 E F H@2 I J K L M@2 N O P Q R@2 S T U V W X Y Z AA@2 AB AC ~ AD@2 AE@2 AF AG AH AI AJ AK AL AM AN
  AO AP AQ AR@3 ~@6 AS@2 AT AU AV@2 AW@8 AX@4 ~@4
>`.pickRestart({
  A: "~@4 b4 c#5 d5 e5", B: "~ f#4 [b4,d5] [d5,f#5], f#5@15 ~ [b3,f#4]@15 ~",
  C: "[[c#5,e5]@2 b4@2 [a4,d5] c#5 b4 a4 b4@2 c#5@2 d5@2 [g4,e5]@2, f#5@61 ~@3, [a3,e4]@15 ~ [f#3,d4]@15 ~ g3@30 ~@2, ~@32 a4@23 ~@9]/2", // C#m D5 C A5 D
  D: "[~ a#4@3, [f#3,f#4,b4,c#5,f#5]]/2", E: "b1@8 b1@8 b2@15 ~, [d4,f#4,d5]@15 ~",
  F: "a1@8 a1@8 a2@15 ~, [c#4,e4,c#5]@15 ~", // C#m
  G: "[e2@8 e2@8 e3@15 ~ f#2@8 f#2@8 [f#4,f#5]@8 [e4,e5]@8, [b3,d4,g4]@46 ~@2 f#3@15 ~]/2", // F# E G
  H: "[e2@8 e2@8 e3@15 ~ f#2@8 f#2@8 [f#4,a#4,f#5]@8 [e4,a#4,e5]@8, [b3,d4,g4]@46 ~@2 f#3@15 ~]/2", // F# Edim G
  I: "[d4,d5]@4 g4@4 b4@4 ~@4 e3@15 ~, e2!2 ~@2, ~@12 d5@19 ~", // D
  J: "c#4@4 e4@4 a4@4 ~@4 a2@15 ~, a1!2 ~@2, ~@12 c#5@19 ~", K: "f#4 a4 d5 f#5 e5 a4 c#5 d5, d2@15 ~ c#2@15 ~",
  L: "d5 f#5 b5 d6 c#6 f#5 a4 c#5, b1@15 ~ a1@15 ~",
  M: "[d5 g4 b4 ~@2 g4 b4 ~@2 g4 b4 ~@2 g4 b4 d5, e2@8 e2@8 e3@15 ~ e2@8 e2@8 e3@15 ~, ~@3 d5@2 ~@2 d5@2 ~@2 d5@2 ~@3]/2",
  N: "[e4,b4,c#5] ~@7, f#2 ~@3", O: "~@4 b3 c#4 d4 e4",
  P: "[b1,b2,f#3]@11 ~ [b1,b2]@4 [b1,b2]@15 ~, [b3,d4]@15 ~, ~@12 f#3@19 ~", // B5 B Bm
  Q: "[a1,a2]@11 ~ [a1,a2]@4 e4@8 a4@8, [e3,a3,c#4]@15 ~ [a1,a2,a3]@15 ~", // A
  R: "[[g1,g2,d4]@11 ~ [g1,g2]@4 ~@4 e4@8 ~@4 f#2@4 c#3@4 f#3@4 ~@12 f#2@8, [b3,g4]@34 ~@2 [a#3,c#4,f#4]@11 ~ [f#4,f#5]@15 ~, ~@12 d4@8 ~@8 d4@8 ~@8 c#3@19 ~, ~@16 [g1,g2]@15 ~@33]/2", // G5 G Em F# G
  S: "d5 f#4 b4 ~@4 b2, b2@8 b1@8 b3@11 ~@5, ~@12 d5@8 b4@11 ~",
  T: "c#5@4 e4@4 a4@4 ~@8 a4@11 ~, a2@8 a1@8 a3@15 ~, ~@3 c#5@2 ~@3",
  U: "b4 g4 a4 ~@4 e2, e2@8 e1@8 e3@11 ~@5, ~@12 b4@8 g4@11 ~",
  V: "b4 g4 b4 c#5 [f#4,a#4,f#5]@2 [e4,a#4,e5]@2, f#2@8 f#1@8 f#3@15 ~", // F# Edim
  W: "[d4,b4,d5] e4 g4 ~@2 e4 ~ [e1,e2], [e1,e2]@15 ~ [e2,e3]@11 ~@5, ~@3 b4@2 ~ g4@2", // G E
  X: "c#5 e4 a4 ~@2 e4 a4@2, [a1,a2]@15 ~ [a2,a3]@15 ~, ~@3 c#5@2 ~@3", // A
  Y: "a4 d4 f#4 ~@2 c#4 e4 [c#2,c#3,a4], [d2,d3]@15 ~ [c#2,c#3]@11 ~@5, ~@3 a4@2 ~@3", // F#m D C#
  Z: "d5 f#4 b4 ~@2 f#4 b4@2, [b1,b2]@15 ~ [b2,b3]@15 ~, ~@3 d5@2 ~@3", // B
  AA: "[d5 g4 b4 ~@2 g4 b4 ~@2 g4 b4 ~@2 g4 b4 d5, [e1,e2]@8 [e1,e2]@8 [e2,e3]@15 ~ [e1,e2]@8 [e1,e2]@8 [e2,e3]@15 ~, ~@3 d5@2 ~@2 d5@2 ~@2 d5@2 ~@3]/2", // E
  AB: "[f#1,f#2] [c#2,c#3] g4 ~@3 g4@2, [b3,e4]@15 ~, f#4@8 f#2@23 ~, ~@8 f#3@8 f#3@15 ~, ~@12 f#4@11 ~@9", // F# C# E5
  AC: "f#4 ~@3",
  AD: "[~ [f#5,d6]!2 ~@2 [e5,c#6] [d5,b5] ~@3 [d5,b5]@2 [c#5,f#5]@2 [b4,d5]@2, [b0,b1]@15 ~ [a1,a2]@15 ~, ~@8 f#2@8 c#3@15 ~@5 f#3@27 ~, ~@12 [f#5,d6]@8 ~@8 [e5,c#6]@11 ~ d4@23 ~]/2", // D C#m G F#5 Bm B A D …
  AE: "[~ [f#4,d5]!2 ~@2 [e4,c#5] [d4,b4] ~@3 [g3,d4,b4]@2 ~ c#3 [f#3,a#4]@2, [g1,g2]@30 ~@2 [e1,e2]@15 ~ [f#1,f#2,c#4,f#4]@15 ~, ~@8 d3@8 b3@15 ~@5 b2@11 ~@17, ~@12 [f#4,d5]@8 ~@8 [e4,c#5]@11 ~@9 b4@8 ~@8]/2", // D C#m G F# G E F#5 D …
  AF: "b2@2 ~@2 b3 c#4 d4 e4, f#3@23 ~ f#3@8, [d4,b4]@15 ~@17, ~@8 b1@23 ~", // G
  AG: "a2@2 ~@2 b4 c#5 d5 e5, d3@23 ~ f#3@8, [b3,f#4]@15 ~@17, ~@8 a1@23 ~", // B5
  AH: "~@6 e5 f#5 e5@2 d5@2 c#5@2 b4@2, [e1,e2]@15 ~, a4@15 ~ g4@8 e4@8, f#5@8 g3@23 ~, ~@4 b2@27 ~", // E
  AI: "~@7 f#2, [a#3,c#5]@4 b3 f#3 c#3@2, f#2@3 c#4@5, c#3 a#4@3, [f#3,c#4,a#4] b4@7", // A#m F#
  AJ: "g1!2 [g4,b4] d4 c#5 d4 d5 d4, [d4,g4,b4] [g1,g2]!3", // G
  AK: "a1!2 a4 c#4 b4 c#4 [e4,a4,c#5] c#4, [e4,a4,c#5] [a1,a2]!3", // A
  AL: "b1!2 b4 f#4 c#5 f#4 d5 f#4, [d4,f#4,b4] [b1,b2] [a1,a2]!2", // Bm B A
  AM: "g1!2 d5 f#4 c#5 f#4 [g1,g2,d4,b4]@2, [d4,f#4,b4] [g1,g2]!2 ~", // G Bm G
  AN: "~ b2 e3 g3@2 e3 [e2,d4,g4,b4]@2, [e1,e2]@23 ~@9, [d4,g4,b4]@11 ~ [d4,g4,b4]@11 ~@9", // Em7 E G
  AO: "~@2 a4 c#4 b4 c#4 [e4,a4,c#5] c#4, a2@11 ~@21, [e4,a4,c#5] ~@3, ~@4 e3@8 a3@11 ~ e3@8", // A
  AP: "b1!2 [f#4,b4,d5] f#4 [b4,d5] f#4 [b4,d5] f#4, [f#4,b4,d5]@8 b2@8 a2@15 ~", // Bm
  AQ: "~@17 [a4,c#5]@4 [b4,d5]@4 [c#5,e5]@7, ~@17 f#3@15", AR: "[~ [f#1,f#2,f#4,a#4,c#5]@64 ~@31]/3",
  AS: "[~@6 e4@8 e5@16 ~ f#4@8 f#4@8 [f#4,a#4,f#5]@8 ~ [e4,a#4,e5]@8, ~@47 f#3@16 ~]/2", // F# Edim
  AT: "[d4,d5] g4 b4 ~ [e2,e3]@4, [e1,e2]!2 ~@2, ~@3 d5@5", // D E
  AU: "~ c#4@4 e4@4 a4@4 ~@4 [a2,a3]@15, ~ [a1,a2]@8 [a1,a2]@8 ~@15, ~@13 c#5@19", // A
  AV: "[~@2 f#5@4 a4@4 d5@4 [d2,d3,f#5]@4 e5@4 ~ a4@4 c#5@4 [c#2,c#3,e5]@4 d5@4 f#4@4 b4@4 [b1,b2,d5]@4 c#5@4 ~ f#4@4 a4@4, ~@2 [d2,d3]@12 ~@4 [c#2,c#3]@12 ~@5 [b1,b2]@12 ~@4 [a1,a2]@12 ~]/2", // D C#m Bm D C# B A
  AW: "[[a1,a2,c#5]@4 d5@4 g4@4 b4@4 ~@9 g4@4 b4@4 ~@8 g4@4 b4@4 ~@9 g4@4 b4@4 d5@4 f#5@4 b4@4 c#5@4 ~@8 b4@4 c#5@4 ~@4 [f#1,f#2]@3 [f#1,f#2]@4 [f#1,f#2]@3 ~ [f#1,f#2]@3 [f#1,f#2]@3 ~ [f#1,f#2]@3 ~ [f#1,f#2]@3 [f#1,f#2]@3 ~ [b1,b2]@7 [b1,b2]@3 [b1,b2]@3 ~@4 c#4@3 ~ [b1,b2,d4]@3 [b1,b2,e4]@3 ~ [f#4,b4]@3 f#4@3 ~ [a1,a2,f#4]@3 [a1,a2,b4]@3 ~ [a2,a3]@7 [a1,a2]@3 [a1,a2,e4]@3 ~ [g1,g2]@7 [g1,g2]@3 [g1,g2]@3 ~ [g2,g3]@7 [g1,g2]@3 [g1,g2]@3 ~ [f#1,f#2,c#4]@7 [f#1,f#2]@3 ~ [f#1,f#2]@3 b3@3 ~ c#4@3 d4@3 ~ e4@3 [b1,b2]@7 [b1,b2]@3 ~ [b1,b2]@2, ~@4 [e1,e2]@8 [e1,e2]@8 [e2,e3]@16 ~ [e1,e2]@8 [e1,e2]@8 ~ [e2,e3]@16 [f#1,f#2]@8 [f#1,f#2,f#3,b3]@8 [f#1,f#2,b3,d4]@7 ~ [f#1,f#2,d4,f#4]@7 ~ [c#4,f#4]@28 ~ d4@13 ~ [b2,b3]@7 ~@7 [a1,a2]@7 ~@63 [f#2,f#3,f#4,b4]@7 [f#1,f#2,a#4]@7 ~@13, ~@16 d5@8 ~@9 d5@8 ~@8 d5@8 ~@25 f#5@7 ~@9 f#5@11 ~@64 f#4@10 ~@4 [d4,f#4]@27 ~@8 [d4,f#4]@7 ~@14 [d4,f#4,b4]@13, ~@102 a#4@7 [a#4,f#5]@7 [a#4,f#5]@7 ~ [a#4,f#5]@7 [f#4,b4]@27 ~@15 b4@40 ~@43]/8", // A F# B Bm E5 B5 D Asus2 …
  AX: "[~ f#4@3 ~ e4@3 [b1,b2,d4]@3 ~ [b1,b2,c#4]@3 d4@3 ~ c#4@3 [a1,a2,b3]@3 ~ [a1,a2,a3]@3 [a2,a3]@7 [a1,a2]@3 ~ [a1,a2]@3 [g1,g2,b3,d4]@7 [g1,g2]@3 ~ [g1,g2]@3 ~ [g2,g3,d4,f#4]@7 [g1,g2]@3 [g1,g2]@3 ~ [f#1,f#2]@7 [f#1,f#2]@7 [f#1,f#2]@7 [f#1,f#2]@7 ~@28, ~ b4@13 ~ [e4,f#4]@27 ~ f#4@13 ~@2 b4@13 ~ b4@13 ~ a#4@13 ~@29, ~ [b2,b3]@7 ~@7 [a1,a2]@7 ~@7 b3@13 ~@8 [c#4,e4]@7 ~@8 [d4,g4]@7 [c#4,f#4]@27 ~@29]/4", // Bm Bsus2 Asus2 A G Gmaj7 G F# …
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft = note("<~@57 A@4 B@5 ~@15 C D@4>".pickRestart({
  A: "[~@23 b3@8 ~ b3@8 b4@16 a3@8 ~ a3@8 a4@16 ~ e4@8 e4@8 e5@16 ~ f#4@5, ~@23 [d5,f#5,d6]@31 ~@2 [c#5,e5,c#6]@31 ~@3 [b4,d5,g5]@38]/4", // D C#m G
  B: "[~@3 f#4@8 [f#5,f#6]@8 [e5,e6]@8 ~ b3@8 b3@8 b4@16 ~ a3@8 a3@8 a4@16 ~ [b4,d5,g5]@47 ~@19, ~@11 f#4@16 ~ [d5,f#5,d6]@31 ~@2 [c#5,e5,c#6]@31 ~@2 e4@8 ~@58]/5", // F# E G D C#m
  C: "~@27 [b2,b3,b4]@5", // B
  D: "[~ [c#3,c#4,c#5]@6 [d3,d4,d5]@6 [e3,e4,e5]@6 f#3@23 [f#2,c#3,f#3]@64 ~@22, ~@19 [f#4,f#5]@64 ~@45]/4", // C# D E F#5 F#
})).s("gm_piano").gain(0.2)

stack(piano, piano_soft)