Strudelify

Stille Nacht heilige Nacht H.145

Franz Gruber

KeyB♭ majorTempo85 bpm
0:00/0:00
// Stille Nacht heilige Nacht H.145 — Franz Gruber
// 85 bpm, 3/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: Transcription provider: pdmx. https://musescore.com/score/1322656; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 113 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(85/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.

// other · violin
const violin = note(`<
  ~@32 A B A B C D E F G@2 H I G@2 H J D K B L M N O ~ A B A B C D E F G@2 H I G@2 H J D K B L M N O ~ P Q P Q R S T U
  V@2 W X V@2 W Y S Z Q AA AB AC AD AE AF@7 ~@2
>`.pickRestart({
  A: "f4@3 g4 f4@2", B: "bb4", C: "c5@2 c5", D: "a4@2 a4", E: "bb4@4 d5 f5", F: "bb4@4 bb4 a4", G: "eb5@2 c5",
  H: "d5@2 bb4", I: "f5@2 f5", J: "f5@2 bb4", K: "c5@3 c5 a4@2", L: "f4", M: "bb4@2 f4 g4 a4@2", N: "f4@3 g4 a4 c5",
  O: "d5", P: "g4@3 a4 g4@2", Q: "c5", R: "d5@2 d5", S: "b4@2 b4", T: "c5@4 e5 g5", U: "c5@4 c5 b4", V: "f5@2 d5",
  W: "e5@2 c5", X: "g5@2 g5", Y: "g5@2 c5", Z: "d5@3 d5 b4@2", AA: "g4", AB: "c5@2 g4 a4 b4@2", AC: "g4@3 a4 b4 d5",
  AD: "e5", AE: "~@19 c5@5", AF: "[b4@5 c5@11 g4@6 a4@6 b4@11 g4@19 b4@6 d5@12 f5@41 e5@41 ~@10]/7",
})).s("gm_violin").gain(0.3)

// other · soprano sax · "Soprano Saxophone"
const soprano_sax = note(`<
  ~@15 A B C D E B C D F G H I J K L M ~ D M D J N O P E B C D E B C D F G H I J K L M ~ D M D J N O P E B C D E B C D F
  G H I J K L M ~ Q R Q S T U V W G X Q W G X Q Y Z AA AB S AC AD R AE AF@7 ~@2
>`.pickRestart({
  A: "~@2 d4", B: "eb4@2 eb4", C: "g4@3 f4 eb4@2", D: "d4@3 eb4 d4@2", E: "bb3@2 d4", F: "bb3@2 bb3", G: "f4@2 f4",
  H: "eb4@3 f4 eb4@2", I: "d4", J: "f4", K: "f4 d4 bb3", L: "d4@3 c4 a3@2", M: "bb3", N: "c4 d4 eb4@2 eb4 d4",
  O: "c4 eb4 f4@2 f4 eb4", P: "c4@2 a3", Q: "e4@3 f4 e4@2", R: "c4", S: "g4", T: "d4 e4 f4@2 f4 e4",
  U: "d4 f4 g4@2 g4 f4", V: "d4@2 b3", W: "c4@2 e4", X: "a4@3 g4 f4@2", Y: "c4@2 c4", Z: "g4@2 g4", AA: "f4@3 g4 f4@2",
  AB: "e4", AC: "g4 e4 c4", AD: "e4@3 d4 b3@2", AE: "~@19 g4@5",
  AF: "[f4@5 g4@11 e4@11 ~ c4@11 e4@19 d4@6 b3@12 f4@27 d4@14 e4@41 ~@10]/7",
})).s("gm_soprano_sax").gain(0.3)

// chords · piano
const piano = note(`<
  A B C D E F G H I J I J K L M N O P I J O P I J Q R C D E F G H I J I J K L M N O P I J O P I J Q R C D E F G H I J I
  J K L M N O P I J O P I J Q R C D E F G S T U T U V W X Y Z AA T U Z AA T U AB AC AD AE AF AG AH AI@4 AJ@6
>`.pickRestart({
  A: "f2 c3 f3 a3 c4 a3, [f4,a4,c5]@15 ~ [f4,a4,c5]@8", // F
  B: "f2 c3 f3 [a3,eb4,a4,c5] ~ a3, [f4,c5,eb5]@11 ~@5 [c4,f4,a4]@8", // Adim F7 F
  C: "bb1 f2 d3 f3 ~ f3, [d4,f4,bb4]@23 ~, bb3@16 bb3@7 ~", D: "bb1 f2 d3 f3 bb3 f3, [d4,f4,bb4,d5]@23 ~",
  E: "bb1 f2 [d3,f3] f3!3, [d4,f4,bb4] [bb3,d4,f4] [bb3,d4]", F: "f2 c3 a3!4, [f3,a3,c4,f4] [f3,c4,eb4] [eb3,f3,c4]",
  G: "bb1 f2 ~@3 f3, bb3@16 bb3@7 ~, f3@3 f3@2 ~, d3@8 d3@15 ~", H: "bb1 f2 d3 f3 bb3 d4, [d3,f3,bb3] ~@2",
  I: "bb1 f2 d3 [f3,eb4,g4] bb3 f3, [f3,bb3,d4,f4]@11 ~@5 [d4,f4]@8", // Cm Bb Dm
  J: "bb1 f2 d3 ~@2 f3, d4@23 ~, bb3@16 bb3@7 ~, f3@3 f3@2 ~",
  K: "f2 c3 f3 a3 c4 a3, bb3@23 ~, [d4,f4,bb4]@15 ~ [d4,f4,bb4]@8", // Bb
  L: "f2 c3 ~ a3 c4 a3, [bb3,d4,f4]@23 ~, f3@8 f3@15 ~", M: "bb1 f2 d3 f3 ~ f3, [bb3,eb4,g4]@2 [bb3,eb4,g4]",
  N: "bb1 f2 d3 ~@2 f3, [d4,f4]@23 ~, bb3@16 bb3@7 ~, f3@3 f3@2 ~", // Dm
  O: "eb2 bb2 eb3 g3 ~ g3, [bb3,eb4,g4]@15 ~ [bb3,eb4,g4]@8", // Eb
  P: "eb2 bb2 eb3 [g3,bb3,f4,a4] ~ g3, [bb3,eb4,g4,bb4]@11 ~@5 [bb3,eb4,g4]@8", // Gm7 Eb
  Q: "f2 c3 f3 a3 c4 a3, [eb4,f4,a4,c5]@15 ~ [eb4,f4,a4,c5]@8", // F7
  R: "f2 c3 f3 [a3,eb4,f4,a4,c5] ~ a3, [f4,a4,c5,eb5]@11 ~@5 [c4,eb4,f4,a4]@8", // F7
  S: "f3 ~@2 f3 g2!2, d3@15 ~ [d3,gb3]@8, bb3@8 bb3@7 ~@9, ~ f3@2 ~@3", // D
  T: "c2 g2 e3 [g3,f4,a4] c4 g3, [g3,c4,e4,g4]@11 ~@5 [e4,g4]@8", // Dm C Em
  U: "c2 g2 e3 ~@2 g3, e4@23 ~, c4@16 c4@7 ~, g3@3 g3@2 ~",
  V: "g2 d3 g3 b3 d4 b3, c4@23 ~, [e4,g4,c5]@15 ~ [e4,g4,c5]@8", W: "g2 d3 ~ b3 d4 b3, [c4,e4,g4]@23 ~, g3@8 g3@15 ~",
  X: "c2 g2 e3 g3 ~ g3, [c4,f4,a4]@2 [c4,f4,a4]", Y: "c2 g2 e3 ~@2 g3, [e4,g4]@23 ~, c4@16 c4@7 ~, g3@3 g3@2 ~",
  Z: "f2 c3 f3 a3 ~ a3, [c4,f4,a4]@15 ~ [c4,f4,a4]@8", // F
  AA: "f2 c3 f3 [a3,c4,g4,b4] ~ a3, [c4,f4,a4,c5]@11 ~@5 [c4,f4,a4]@8", // Am7 F
  AB: "g2 d3 g3 b3 d4 b3, [f4,g4,b4,d5]@15 ~ [f4,g4,b4,d5]@8", // G7
  AC: "g2 d3 g3 [b3,f4,g4,b4,d5] ~ b3, [g4,b4,d5,f5]@11 ~@5 [d4,f4,g4,b4]@8", // G7
  AD: "c2 g2 e3 g3 ~ g3, [e4,g4,c5]@23 ~, c4@16 c4@7 ~", AE: "c2 g2 e3 g3 c4 g3, [e4,g4,c5,e5]@23 ~",
  AF: "c2 g2 [e3,g3] g3!3, [e4,g4,c5] [c4,e4,g4] [c4,e4]", AG: "g2 d3 b3!4, [g3,b3,d4,g4] [g3,d4,f4] [f3,g3,d4]",
  AH: "c2 g2 ~@3 g3, c4@16 c4@7 ~, g3@3 g3@2 ~, e3@8 e3@15 ~",
  AI: "[c2@5 g2@5 e3@5 g3@4 c4@5 g3@5 c3@3 g3@3 c4@3 d4@2 ~@9 d5@3 e5@3 d5@2 c5@3 g4@3 g2@3 d3@3 g3@3 a3@3 ~ b3@3 d4@3 f4@3 g4@3 b4@3 g4@3 f4@2, [e4,g4,c5,e5]@28 ~ c5@17 c5@11 ~@6 [c5,e5,g5,c6]@33, ~@29 g4@14 g4@17 ~@36, ~@29 e4@11 e4@21 ~@35]/4", // C
  AJ: "[~ d4@3 c3@3 ~ g3@3 e4@3 g4@3 ~@4 d5@3 ~@14 e6@3 ~@18 e6@3 b5@3 g6@3 ~ e6@3 [c5,c6]@13 ~ [g2,e3,c4,e4,g4,c5]@39 ~@19, ~@4 c6@27 c6@10 ~ c6@10 c6@20 ~@72, ~@4 g5@24 g5@7 g5@10 g5@10 g5@26 ~@63, ~@4 e5@20 ~ e5@23 e5@33 ~@63, ~@2 c5@7 c5@27 ~@36]/6", // C
})).s("gm_piano").gain(0.3)

// bass · tuba
const bass = note(`<
  A B C D C A C@6 A@2 C@2 E@2 C@2 E@2 C@2 A B C D C A C@6 A@2 C@2 E@2 C@2 E@2 C@2 A B C D C A C@6 A@2 C@2 E@2 C@2 E@2
  C@2 A B C D C A C F G@4 H@2 G@2 A@2 G@2 A@2 G@2 H I G J G H G K@4 L@6
>`.pickRestart({
  A: "f2", B: "c3", C: "bb1", D: "d2", E: "eb2", F: "bb2@2 b2", G: "c2", H: "g2", I: "d3", J: "e2",
  K: "[e2@29 c3@34 g2@33]/4", L: "[~@4 c2@41 c2@41 c2@41 ~@17]/6",
})).s("gm_tuba").gain(0.22)

stack(violin, soprano_sax, piano, bass)