Strudelify

Good King Wenceslas

Piae Cantiones

KeyG majorTempo120 bpm
0:00/0:00
// Good King Wenceslas — Piae Cantiones
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5888011; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 51 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · recorder · "Soprano Recorder"
const recorder = note(`<
  A B C D A B C D E F C D G H E I J ~@12 G H E I J A B K D A B C D E F C D G H E L M
>`.pickRestart({
  A: "g5!3 a5", B: "g5!2 d5@2", C: "e5 d5 e5 f#5", D: "g5!2", E: "d6 c6 b5 a5", F: "b5 a5 g5@2", G: "d5!2 e5 f#5",
  H: "g5!2 a5@2", I: "g5 c6", J: "g5", K: "e5@3 d5 e5@2 f#5@2", L: "g5@2 b5@2 c6@2 e6 f#6", M: "g6",
})).s("gm_recorder").gain(0.3)

// other · recorder · "Alto Recorder"
const recorder_2 = note(`<
  A B C D A B C D E F G H I J K L M ~@8 N O P Q I J K L M R S T U R S V W X F V H I J K L M
>`.pickRestart({
  A: "b4 d5 e5 f#5", B: "d5 e5 a4@2", C: "c5 d5 c5@2", D: "d5!2", E: "g5 e5 g5 f#5", F: "g5 f#5 e5@2", G: "g5",
  H: "d5 e5 d5@2", I: "b4!2 c5 d#5", J: "e5!2 f#5@2", K: "g5 a5 g5 f#5", L: "e5 g5", M: "d5", N: "d5 c5 b4 a4",
  O: "b4 a4 g4@2", P: "e5@2 d5@2 e5@3 f#5", Q: "g5!2", R: "b4@2 e5 f#5", S: "g4 a4 b4 c5 a4@4", T: "c5@3 d5 c5@2 c5@2",
  U: "d5 e5 f#5 e5 d5@4", V: "g5@6 f#5 e5", W: "d5@4 d5@2 e5 f#5", X: "g5@3 f#5",
})).s("gm_recorder").gain(0.3)

// other · recorder · "Tenor Recorder"
const recorder_3 = note(`<
  A B C D A B C D E F G H I J K L M ~@4 N O P Q R S G H I T U L M V W C X V W Y Z E AA G H I T U L M
>`.pickRestart({
  A: "b4@3 d5", B: "g4 a4 g4 f#4", C: "g4@3 a4", D: "b4!2", E: "g4 a4 b4 c5", F: "d5 d#5 e5@2", G: "c5 d5 c5@2",
  H: "b4 c5 b4@2", I: "g4@3 b4", J: "b4 d5", K: "d5 e5 d5@2", L: "b4 c5", M: "b4", N: "g4!3 a4", O: "g4@3 g4 d4@4",
  P: "e4 d4 e4 f#4", Q: "g4!2", R: "g4@3 f#4", S: "g4 f#4 e4@2", T: "b4@2 e5 d5 c5@2 f#5 e5", U: "d5 e5 d5!2",
  V: "b4 a4 g4 f#4", W: "e4 f#4 g4 a4 g4@2 f#4@2", X: "b4 c5 d5 c5 b4@4", Y: "c5@6 d5 c5", Z: "b4@4 b4@2 g4 a4",
  AA: "d5@2 d#5@2 e5@3 d5",
})).s("gm_recorder").gain(0.3)

stack(recorder, recorder_2, recorder_3)