Strudelify
KeyD majorTempo120 bpm
0:00/0:00
// The Nutcracker (ballet) Op.71 — P. TchaikovskyAdapted for recorder quartet by CMJ Linden
// 120 bpm, 2/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/504041; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 42 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/2)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · recorder · "Soprano Recorder"
const recorder = note("<~@2 A B C ~@4 D E B F G H I J K L@5 M N@2 E B O G H@2 P Q E B F G H@2 R@2>".pickRestart({
  A: "d5 ~ c#5 ~ d5@2 c#5 ~ d5@2 ~@2 c#5@2 ~@2", B: "e5@2 ~@2 d5 f#5 a5 d6 f#6@8",
  C: "g6 ~ f#6 ~ g6 ~ f#6 ~ e6@2 d6@2 ~@4", D: "~@8 g6@4 e6 c#6 g5 e5", E: "d5 ~ c#5 ~ d5 ~ c#5 ~ d5@2 ~@2 c#5@2 ~@2",
  F: "g6 ~ f#6 ~ g6 ~ f#6 ~ e6@2 d6@2 a5 ~ f#5 ~", G: "d5@8 d6 c#6@7", H: "b5 ~ b5 ~ b5 ~ b5 ~ c#6 b5 ~@2 a5@2 ~@2",
  I: "d6 ~ d6 ~ d6 ~ d6 ~ e6 d6 ~@2 c#6@2 ~@2", J: "f#6 ~ f#6 ~ f#6 ~ f#6 ~ f#6 ~ e6 ~ f#6 ~ e6 ~",
  K: "a6 ~ g#6 ~ a6 ~ g#6 ~ b6 ~ a6 ~ b6 ~ a6 ~", L: "b5 ~ a5 ~ b5 ~ a5 ~ b5 ~ a5 ~ b5 ~ a5 ~",
  M: "b5 ~ a5 ~ b5 ~ a5 ~ b5 ~ a5 ~ b5 ~ c#6 ~", N: "a5 ~ b5 ~ c6 ~ c#6 ~ a5 ~ b5 ~ c6 ~ c#6 ~",
  O: "g6 ~ f#6 ~ g6 ~ f#6 ~ e6 ~ d6 ~ a5 ~ f#5 ~", P: "d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ c#6 ~ e6 ~ d6 ~",
  Q: "d6 ~ c#6 ~ b5 ~ a5 ~ g6@4 e6 c#6 g5 e5", R: "[a#5@2 ~@2 c#5 a#5 d6 e6 e6@2 ~@2 e6@8 d6@8 ~@4]/2",
})).s("gm_recorder").gain(0.4)

// other · recorder · "Soprano Recorder" · soft notes
const recorder_soft = note(`<
  ~@4
  [~@12 a5 ~ f#5 ~]
  [d5@8 d6 c#6@7]
  [b5 ~ b5 ~ b5 ~ b5 ~ c#6 b5 ~@2 a5@2 ~@2]!2
  [d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ c#6 ~ e6 ~ d6 ~]
  [d6 ~ c#6 ~ b5 ~ a5 ~@9]
  ~@32
>`).s("gm_recorder").gain(0.2)

// other · recorder · "Alto Recorder"
const recorder_2 = note("<~@2 A B C ~@4 D A B E F G H I J K L M@6 A B E F G@2 N O A B E F G@2 P@2>".pickRestart({
  A: "a4 ~ g4 ~ a4 ~ g4 ~ a4@2 ~@2 g4@2 ~@2", B: "a4@2 ~@2 a4 d5 f#5 a5 d6@8", C: "d6 ~ c#6 ~ d6 ~ c#6 ~ b5@2 a5@2 ~@4",
  D: "~@8 [e5,e6]@4 c#6 g5 e5 c#5", E: "d6 ~ c#6 ~ d6 ~ c#6 ~ b5@2 a5@2 f#5 ~ d5 ~", F: "a#4@8 a#5 a5@7",
  G: "g5 ~ g4 ~ g4 ~ g4 ~ g4 g#4 ~@2 a4@2 ~@2", H: "b5 ~ b4 ~ b4 ~ b4 ~ a#4 b4 ~@2 c#5@2 ~@2",
  I: "d6 ~ d5 ~ d5 ~ d5 ~ d#5 ~ e5 ~ d#5 ~ e5 ~", J: "f5 ~ e5 ~ f5 ~ e5 ~ f5 ~ e5 ~ f5 ~ e5 ~",
  K: "e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ g5 ~ g5 ~", L: "g5 ~ g5 ~ g5 ~ g5 ~ g5 ~ g5 ~ g5 ~ g5 ~",
  M: "g4 ~ g4 ~ g4 ~ g4 ~ g4 ~ g4 ~ g4 ~ g4 ~", N: "a#5 ~ a#4 ~ a#4 ~ a#4 ~ b4 ~ b4 ~ b4 ~ b4 ~",
  O: "g4 ~ g4 ~ g4 ~ g4 ~ e5@4 c#6 g5 e5 c#5", P: "[d5@2 ~@2 a#4 d5 e5 a#5 a#5@2 ~@2 a5@8 d5@8 ~@4]/2",
})).s("gm_recorder").gain(0.4)

// other · recorder · "Alto Recorder" · soft notes
const recorder_soft_2 = note(`<
  ~@4
  [~@12 f#5 ~ d5 ~]
  [a#4@8 a#5 a5@7]
  [g5 ~ g4 ~ g4 ~ g4 ~ g4 g#4 ~@2 a4@2 ~@2]!2
  [a#5 ~ a#4 ~ a#4 ~ a#4 ~ b4 ~ b4 ~ b4 ~ b4 ~]
  [g5 ~ g5 ~ g5 ~ g5 ~@9]
  ~@32
>`).s("gm_recorder").gain(0.2)

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

stack(recorder, recorder_soft, recorder_2, recorder_soft_2, recorder_3)