Strudelify

hark the herald angels sing

Felix Mendelssohn & William H. Cummings

KeyG majorTempo110 bpm
0:00/0:00
// hark the herald angels sing — Felix Mendelssohn & William H. Cummings
// 110 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5886427; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 41 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.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · recorder
const recorder = note(`<
  A B C A@2 D E F G H I J K L M N O P Q R A B C A@2 D E F G H I J K L M N O P Q S T
>`.pickRestart({
  A: "~ e6 d6 c6 b5 a5 g5 f#5", B: "g5 a5 b5@2 b5 c6 d6@2", C: "g6@2 d6@2 e6 f#6 g6@2", D: "g5 f#5 g5@2 e6@4",
  E: "d6@2 e6@2 f#6 e6 d6 c#6", F: "b5 c#6 d6@2", G: "d6@2 d6@2 d6@2 c6 b5", H: "a5@2 b5 a5 g5@2 f#5@2",
  I: "g5 a5 b5 c6 b5 c6 d6 e6", J: "d6 e6 f#6 g6 d6@2 f#6@2", K: "e6 d6 c6 b5 c6@2 d6@2", L: "e6@2 b5@2 a5@3 e6",
  M: "a5@2 d6@2 g6@2 f#6 e6", N: "d6@3 c6 b5 c6 d6@2", O: "e6@2 a5 b5 c6@2 d6@2", P: "e6 f6 e6 d6 c6 b5 a5@2",
  Q: "d6 c6 b5 a5 g5 a5 b5 c6", R: "d6 e6 f#6@2 g6@4", S: "g6 f#6", T: "g6 ~",
})).s("gm_recorder").gain(0.3)

// other · recorder · "Alto Recorder"
const recorder_2 = note(`<
  A B C D A E F G H I H I J K L M N K O P A B C D A E F G H I H I J K L M N K O Q R
>`.pickRestart({
  A: "d5@2 d5@2 d5@3 d5", B: "d5 g5!2 f#5", C: "g5 f#5 e5 a5", D: "g5 f#5 g5@2", E: "b4 g5 g5@2",
  F: "f#5@2 e5@2 f#5@3 d5", G: "d5 c#5 d5@2", H: "d5!3 g5", I: "a5 g5!2 f#5", J: "c6!3 b5", K: "a5 g#5 a5@2",
  L: "f#5@4 g5@3 d5", M: "d5 f#5 g5@2", N: "c6@3 c6 c6@2 b5@2", O: "d5@2 f#5@2 g5@3 d5", P: "d5!2 d5@2", Q: "d5!2",
  R: "d5",
})).s("gm_recorder").gain(0.3)

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

// other · recorder · "Bass Recorder"
const recorder_4 = note(`<
  A B C D A E F G H I H I J K L M N O P M A B C D A E F G H I H I J K L M N O P Q R
>`.pickRestart({
  A: "g4@3 d4", B: "b3 g3 d4@2", C: "b3 c4", D: "d4 g4", E: "e4 d4 a3@2", F: "b3 c#4 d4 f#4", G: "g4 a3 d4@2",
  H: "d4@3 b4", I: "f#4 g4 d4@2", J: "c4", K: "c4 e4 a4@2", L: "d4 c4 b3 g3", M: "d4!2 g4@2", N: "c5@3 c5 c5@2 b4@2",
  O: "a4 g#4 a4 g4", P: "f#4 c5 b4 g4", Q: "d4!2", R: "g3",
})).s("gm_recorder").gain(0.3)

stack(recorder, recorder_2, recorder_3, recorder_4)