Strudelify

Trail Of Angels

Chen Yue

KeyF majorTempo56 bpm
0:00/0:00
// Trail Of Angels — Chen Yue
// 56 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/1751176; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 74 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(56/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// 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 D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB ~@46>".pickRestart({
  A: "[d4,d6]@2 [a4,bb4]@2 a5@2 d6@9 ~, ~@4 a4@11 ~", B: "d6@2 bb4@2 a5@2 d6@9 ~, d4@15 ~",
  C: "d6@2 bb4@2 a5@2 d6@9 ~, [bb3,f4,a4]@15 ~", D: "d6@2 bb4@2 a5@2 d6@9 ~", E: "d3 a3 d4 e4 f4@2 a4@2, [d5,a5]",
  F: "g2 g3 bb4 a4 bb4@2 f5@2, bb4@4 bb3@11 ~", G: "[bb2,bb3] f3 bb3 c4 d4@2 f4@2, bb4 d5 f5@2",
  H: "d2 d3 ~ e5 f3 e4 d4@2, [a4,d5]@3 ~ f5@4, ~ f3 ~@2", I: "bb2 e3 ~ d5 d4@2 f4@2, bb4@3 ~ d5@4, ~ bb3 ~@2",
  J: "c2 c3 e3 d4 e4 c4 g4@2, e5@15 ~", K: "f2 c3 g3 a3 g4@2 f4@2", L: "f2 c3 f3 g3 a3@2 c5@2",
  M: "d2 d3 f3 a3 d4 e4 [f4,a4]@2, d5@2 f5 ~", N: "g2 g3 ~ a4 bb4@2 f5@2, bb4@3 ~@5, ~ bb3 bb3@2",
  O: "[bb2,bb3] f3 c4 d4!2 a4 [a4,f5]@2, bb4 d5@2 ~", P: "d2 d3 e3 f3 a3@2 d4@2, d5@15 ~",
  Q: "bb2 f3 bb3 c4 d4@2 [f4,f5]@2, f5@11 ~@5", R: "c2 c3 e3 g3 c4 e4 [g4,g5]@2, e5@2 c5 ~",
  S: "d2 d3 e3 f3 e4 a3 f4@2, [d5,f5,a5]", T: "d2 d3 e3 f3 e4 a3 [d4,f4] a4",
  U: "bb2 f3 a3 d4 f4 a4 bb4 a3, [d4,f4,bb4] [bb4,d5,f5] d5@2", // Bb
  V: "a2@2 e3@2 a3@2 c4@2 [c4,a4,c5,e5]@2 ~ c5 g4@2 f5@2, [a4,c5,e5]@8 ~@2 f4@2 c5 ~@3", // Am
  W: "bb1 bb2 [d3,bb4] [f3,f5] bb3 d4 f4@2, d5 ~ f5@2", X: "d2 d3 e3 f3!2 a3 [d4,f5]@2, [a4,f5]@2 e5 ~",
  Y: "bb1 bb2 f3 bb3 [d4,c5]@2 d5 c5, d5 f4 ~ d4", Z: "c2 c3 ~ d4 e3 g3 g4@2, c5@3 ~@5, ~ e3 [c4,e4]@2",
  AA: "bb2 f3 [bb3,d4] ~ c3 g3 [d4,e5]@2, [g4,c5] g4@2 ~, ~@3 d4@3 ~@2", AB: "d2 d3 e3 f3 a3@2 d4@2, [a4,d5,f5]",
})).s("gm_piano").gain(0.4)

// chords · piano
const piano_2 = note(`<
  ~@28 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO ~ AP AQ AR AS
>`.pickRestart({
  A: "d3 a3 d4 e4 f4@2 g4@2", B: "f3 a3 ~ g5 [e4,a5]@2 d5 f5, a5@3 ~@5, ~ d4 ~ f4",
  C: "g2 g3 a3 bb3 ~@2 a5 g5, [c5,g5]@11 ~@5, ~ d4", // C5
  D: "bb2@2 f3 bb3 [bb3,g5]@2 [c4,a5]@2 d4@2 f4@2 f5@2 g5 f5, f5 ~ g5 ~", E: "c3 a3 d4 e4 f4 a4 c5 a4, d5@2 ~ d4",
  F: "a2 f3 ~ f4 c4 d4 a4 c5, g4@3 ~ g4@2 ~@2, ~ bb3 ~ d4", G: "c2 c3 ~ f4 e3 g3 a4 c5, g4@3 ~ g4@2 ~@2, ~ e3 ~ g3",
  H: "f2 c3 f3 g3 a3@2 c4@2, a4@15 ~", I: "f2 c3 f3 g3 a3 c4 f4 g4 a4 c5 f4 f3!2 a3 [a3,g5]@2, ~@6 f5 ~",
  J: "d3 a3 d4 e4 f4 ~@2 e4!2 f4@2 g3 d5@2 f5@2, [d5,a5]@5 d4@2 ~@5 g3@4, ~@3 g5 a5@2 ~@2", // D5
  K: "g2@2 g3@2 a3@2 c4@2 d4@2 f4 g3!2 d4 [d4,g5]@2, [bb4,d5,f5]@6 a5 ~", // G5 Bb
  L: "bb2@2 f3 bb3!2 c4 [d4,a5]@2 d4 f4 a4@2 a4 bb3 g5 f5, f5@2 g5 ~ g5@2 f5 bb3", // D5
  M: "d2 d3 e3 f3 a3 d4 e4 f4 a3 d4 e4 f4!2 a3 [a3,a4]@2, e5@11 ~ c5@2 ~@2", // A
  N: "bb2 f3 bb3 c4 d4 ~@2 bb3 bb3@2 c4 d4 a4@2 c5@2, f4@5 f3@2 ~@9, ~@3 f4 g4@2 d4@2",
  O: "c2@2 c3@2 ~@2 f4@2 c4@2 e4 g3!2 c4 [c4,c5]@2, g4@3 ~ g4@2 a4 ~, ~ e3 ~@2", // C
  P: "d2 d3 e3 f3 e4 a3 f4 f3, [d4,a4,d5]", Q: "d2 bb2 c3 d3 a3 d4 e4 f4 a4 d5 e5 f5 d4 bb2 g3!2, [f4,a4,d5] ~",
  R: "bb2@2 f3@2 bb3@2 d4@2 d5@2 f4 a4 d5@2 f5@2, d5 d4", S: "a2 f3 a3 c4!2 e4 [g4,g5]@2, e5 c5 e5 ~",
  T: "bb2 f3 [bb3,d5] [c4,bb4] [d4,bb4] f5 f5@2, f5@2 ~@4 f4 ~", // Bb C7 Gm
  U: "d3 a3 [d4,d6] [e4,c6] g5 ~@2 f5, ~@2 f4 a4, ~@5 a5@2 ~", // D C
  V: "bb1 bb2 [d3,bb4,d5] [f3,c5,f5] bb3 d4 [f4,c5,f5]@2, [d5,f5] ~ [bb4,d5] ~", // Gm F5 Dm Bb
  W: "c2 c3 e3 g3 c4@2 c5 e5, e5@11 ~ e4@4",
  X: "[bb2,bb4,f5] [f3,f4] [bb3,bb4] [d4,d5] c2 c3 e3 a2, ~@2 [g4,e5] [c4,e4,g4]", // Bb5 F Bb D C
  Y: "d2@2 d3@2 f3@2 a3 ~ e4 d3 f3 a3 ~@2 a4@2, a4@7 ~, f4@3 f4, d4@7 d4@6 d4@3",
  Z: "~ bb2 d3 f3 bb3 d4 [f4,bb4,d5,f5]@2, [bb3,d4,f4] ~@3, bb1 ~@7, ~ a4@3 [bb4,d5,f5]@4 [d5,f5,a5]@4 ~@4", // Bb Dm
  AA: "a1 a2 e3 a3 c4 e4 [e4,a5]@2, [a4,c5,e5] [e4,c5] g5 ~", // A5 Am C
  AB: "bb2@2 f3 bb3!2 c4 d4@2 f4@2 a4@2 [bb4,f5]@4, f5 bb4 d5 ~", // Bb5
  AC: "d2 d3 f3 a3 d4 ~@2 f4 d6@2 c6@2 [d5,f5,g5]@2 [d4,a5]@2, c5@2 c5 d6 ~@4, ~@5 e4@2 ~ a4@4 ~@4", // G7 D5
  AD: "bb2 f3 [bb3,c5,f5] [c4,d5] d4 f4 [a4,c5] [f4,e5], f5 ~ [bb4,f5] ~", // Bbsus2 Csus2 Am Fmaj7 Bb5
  AE: "c2 c3 ~ c4 e3 g3 [g3,g4]@2, [g4,c5,e5]@3 ~ e4@2 ~@2, ~ e3 ~@2", // G C
  AF: "[bb2,bb4,f5] [f3,f4] [bb3,bb4] [d4,d5] c2 c3 e3 g3, ~@2 [g4,e5] [c4,e4,g4]", // Bb5 F Bb D C
  AG: "d2 d3 f3 ~ e4@2 f4@2, d4, f4@3 ~, a3@3 a3@5", AH: "f3 a3 d4 e4 f4@2 g4@2",
  AI: "d3 a3 d4 e4 f4 a4 [a4,f5]@2, d5@11 ~@5", AJ: "g2 g3 bb3 d4 a4@2 bb4@2, bb4 d4",
  AK: "bb2@2 f3 bb3 bb3@2 c4@2 d4@2 f4@2 [f4,a5]@4, f5 d5 f5 ~", AL: "d3 a3 d4 e4 e6 f6 d6 a5, ~@2 f4 a4",
  AM: "bb2 f3 [bb3,c5,f5] [c4,bb4,d5] [d4,c5,f5]@2 [f4,a5]@2, f5 ~@3", AN: "c2 c3 e3 g3 c4 d4 g5 d5, g5 e5 c5 e4",
  AO: "bb2 f3 bb3 d4 c3 g3 c4 e4, f5 [f4,e5]", AP: "[a3,d6] [e4,d5] a5 d6 d6@4, ~@4 e4@11 ~",
  AQ: "d6 d5 a5 d6 d6@4, d4@15 ~", AR: "d6 d5 a5 d6 d6@4, [bb3,f4,a4]@15 ~", AS: "d6 d5 a5 d6 d6@4",
})).s("gm_piano").gain(0.48)

stack(piano, piano_2)