Strudelify

Empire of Angels

Thomas Bergesen

KeyF majorTempo120 bpm
0:00/0:00
// Empire of Angels — Thomas Bergesen
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5858174; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 122 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/4)

// 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.

// chords · piano
const piano = note(`<
  ~@8 A B C D@2 E F ~ G H I J K L M N O P Q R S T@2 U V W X@3 Y Z AA AB AC@2 AB@2 AD Z AB@2 AE AF AG AH AI AJ AK AL AA
  AB AM AN AB@2 AO AP AQ@2 AR AS AT@3 AU ~@16 AV@4 AW AX AY@2 AZ BA BB@2 BC AX AY@2 AZ BD BE@2 BF@2 BG BH BI BJ BK BL
  BM@2 BN@2 BO
>`.pickRestart({
  A: "~@6 d4 c4", B: "[a2,d4]@2 a4@2 a4@3 g4", C: "f3 c3 a2 c3 a4 c5 a4 f4, a4 ~",
  D: "[g4@6 f4@2 e4@19 ~ d4@2 f4@2, c3 ~@7]/2", E: "g4@4 g4 a4 g4 f4, g2 ~@3",
  F: "[g3,d4]@2 f4@2 e4 d4 c4@2, ~@2 bb3 ~", G: "~@8 f4!2 ~@2 g4!2 ~@2", H: "f4!2 ~@2 f4!2 ~@2 f4!2 ~@2 g4!2 ~@2",
  I: "f4!2 ~@2 f4!2 ~@2 f4!2 ~@2 g4!2 e4!2", J: "f4 ~ d4 ~ f4 ~ d4 ~ f4 ~ d4 ~ f4 ~ d4 ~",
  K: "a4@2 c4 ~ a4@2 c4 ~ a4@2 c4 ~ a4@2 c4 ~, f4 ~@3 f4 ~@3 f4 ~@3 f4 ~@3",
  L: "g4@2 c4 ~ g4@2 c4 ~ g4@2 c4 ~ g4@2 c4 ~, f4 ~@3 f4 ~@3 f4 ~@3 f4 ~@3",
  M: "e4 ~ c4 ~ e4 ~ c4 ~ f4 ~ e4 ~ d4 ~ c4 ~", N: "d4@2 bb3 ~ d4@2 bb3 ~ d4@2 bb3 ~ d4@2 bb3 ~",
  O: "f4@2 bb3 ~ f4@2 bb3 ~ f4@2 bb3 ~ f4@2 bb3 ~, d4 ~@3 d4 ~@3 d4 ~@3 d4 ~@3",
  P: "e4 ~ c4 ~ e4 ~ c4 ~ e4 ~ c4 ~ e4 ~ c4 ~", Q: "e4 ~ c4 ~ e4 ~ c4 ~ f4 ~ e4 ~ d5@2 c5@2, ~@12 d4 ~ c4 ~",
  R: "f4 ~ d4 ~ f4 ~ d4 ~ f4 ~ d4 ~ f4 ~ d5@2, d5@4 f5@4 e5@6 d4 ~", S: "f4 ~ c4 ~ f4 ~ c4 ~@3 c4 ~@3 c4 ~, a4 g4 f4!2",
  T: "[g4@4 g4@4 g4@4 ~@4 e4 ~ c4 ~ e4 ~ c4 ~ f4 ~ e4 ~ bb4@2 a4@2, ~@12 g4@11 ~ c5@4 d4 ~ c4 ~]/2",
  U: "d4 ~ bb3 ~ d4 ~ bb3 ~ d4 ~ bb3 ~ d4 ~ bb3 ~, g4@11 ~ a4@4",
  V: "d4 ~ bb3 ~ d4 ~ bb3 ~ d4 ~ bb3 ~ d4 ~ bb3 ~, bb4 c5",
  W: "f4!2 ~ e4 f4!2 d4 ~ f4!2 d4 ~ g4!2 e4!2, d3, d4@2 d4@4 ~ d4@3 ~ d4@5",
  X: "f4!2 d4 e4 f4!2 d4!2 f4!2 d4!2 g4!2 e4!2, a3@2 a3!2", Y: "f4 d4 f4 d4 f4 d4 f4 d4, a3@2 a3!2",
  Z: "c4 e4 f4 e4 c4 e4 f4 e4 c4 e4 f4 e4 c4 e4 f4 e4, f2@2 f2!2",
  AA: "c4 e4 f4 e4 c4 e4 f4 e4 g4@2 e4@2 g4@2 e4@2, g2@2 g2!2",
  AB: "g4@2 e4 f4 g4@2 e4 f4 g4@2 e4@2 g4 f4 e4@2, g2@2 g2!2",
  AC: "d4 f4 d4@2 d4@2 d4@2 d4 f4 d4@2 d4@2 d4@2, d2@2 d2!2", AD: "f4 d4 f4 d4 f4 d4 f4 d4, d2@2 d2!2",
  AE: "g4@2 g4@2 g4 a4 g4 d4, d2@2 d2!2", AF: "f4@2 f4@2 e4 d4 [f2,c4]@2, f2@2 f2 ~",
  AG: "f3@2 d3 e3 f3@2 d3@2 f3@2 d3@2 g3 f3 e3@2, [d4,a4] e5", AH: "f3@2 d3 e3 f3@2 d3@2 f3@2 d3@2 g3 f3 e3@2, f5 g5",
  AI: "f3@2 d3 e3 f3@2 d3@2 f3@2 d3@2 g3 f3 e3@2, a5 bb5", AJ: "f3@2 d3 e3 f3@2 d3@2 f3@2 d3@2 g3 f3 e3@2, c6 d6",
  AK: "f4 d4 f4 d4 f4 d4 f4 d4, d3@2 d3!2", AL: "c4 e4 f4 e4 c4 e4 f4 e4 c4 e4 f4 e4 c4 e4 f4 e4, c3@2 c3!2",
  AM: "d4 f4 d4@2 d4@2 d4@2 d4 f4 d4@2 d4@2 d4@2, d3@2 d3!2",
  AN: "d4 f4 d4@2 d4@2 d4@2 d4 f4 d4@2 d4@2 d4@2, g2@2 g2!2", AO: "f5@2 d5@2 f5@2 d5@2 f5@2 d5@2 g5 f5 e5@2, f3@2 f3!2",
  AP: "a5@2 f5 g5 a5@2 f5 g5 a5@2 f5@2 a5 g5 f5@2, c3@2 c3!2",
  AQ: "g5@2 e5 f5 g5@2 e5 f5 g5@2 e5@2 g5 f5 e5@2, g2@2 g2!2",
  AR: "d5@2 bb4 c5 d5@2 bb4 c5 d5@2 bb4@2 d5 c5 bb4@2, d3@2 d3!2",
  AS: "f5@2 d5 e5 f5@2 d5 e5 f5@2 f5@2 e5 d5 c5@2, g3@2 g3!2",
  AT: "f5@2 d5 e5 f5@2 d5 e5 f5@2 d5@2 g5 f5 e5@2, d2@2 d2!2", AU: "f5@2 d5 e5 f5@2 d5 e5 ~@8, d2 ~",
  AV: "[f5@8 ~@8 a5 f5 ~@30 [a5,bb5]!16, a2@61 ~@3, ~@8 g5@37 ~@19]/4", // Bbmaj7
  AW: "f3!2 d3 e3 f3!2 d3!2 f3!2 d3!2 g3!2 e3!2, a5@2 f6@2 e6@3 d6",
  AX: "c3 e3 f3 e3 c3 e3 f3 e3 c3 e3 f3 e3 c3 e3 f3 e3, a5 g5 f5@2",
  AY: "[g3@2 e3 f3 g3@2 e3 f3 g3@2 e3@2 g3 f3 e3@2 g3@2 e3 f3 g3@2 e3 f3 g3@2 e3@2 g3 f3 [e3,a5]@2, g5@8 c5@11 ~ c5@4 c6@4 bb5@2 ~@2]/2", // A5
  AZ: "d3 f3 d3@2 d3@2 d3@2 d3 f3 d3@2 d3@2 [d3,f5]@2, g5@2 g5@2 g5@3 ~", // Dm
  BA: "d3 f3 d3@2 d3@2 d3@2 d3 f3 d3@2 d3@2 d3@2, d5@2 d5!2",
  BB: "[d3 f3 d3@2 d3@2 d3@2 d3 f3 d3@2 d3@2 d3@2 g3@2 e3 f3 [g3,c6]@2 e3 f3 g3@2 e3@2 g3 f3 [e3,e6]@2, f5@8 e5@11 ~@3 d6@2 e6@4 f6@2 ~@2]/2", // C5 E
  BC: "g3@2 e3 f3 g3@2 e3 f3 g3@2 e3@2 g3 f3 [e3,d6]@2, d6@2 f6@2 e6@3 ~", // E7
  BD: "d3 f3 d3@2 d3@2 d3@2 d3 f3 d3@2 d3@2 d3@2, f5 g5",
  BE: "[f5@2 d5 e5 f5@2 d5 e5 f5@2 d5@2 g5 f5 e5@2 f5@2 d5 e5 f5@2 d5 e5 f5@2 d5@2 g5 f5 e5@2, [d3,d4]@15 ~]/2", // D
  BF: "f5@2 d5 e5 f5@2 d5 e5 f5@2 d5@2 g5 f5 e5@2",
  BG: "[bb3,f5] [bb3,f5]@3 ~@4 [bb3,f5] [bb3,f5]@2 [c4,e5] ~ [c4,d5] ~ [f3,c5]", // Bb5 C Csus2 F5
  BH: "[bb3,f5] [bb3,f5]@3 ~@4 [bb3,f5] [bb3,f5]@2 [c4,g5] ~ [c4,f5] ~ [c4,e5]", // Bb5 C5 F5 C
  BI: "[bb3,f5] [bb3,f5]@3 ~@4 [bb3,f5] [bb3,f5]@2 [c4,e5] ~ [c4,c5] ~ [c4,a5]", // Bb5 C F
  BJ: "a5 bb5 c6 f5 g5 a5 d5 e5 f5 bb4 c5 d5 f5 g5 a5 bb5, a3@3 bb3@3 d3@3 e3@3 f3@2 a3@2",
  BK: "[c4,c6] [c4,c6]@3 ~@2 [c4,c6] [c4,c6]@2 [c4,c6] ~ [bb3,bb5] ~ [a3,a5] ~ [f3,f5]", // C Bb A F
  BL: "[g3,g5] [g3,g5]@3 ~@2 [g3,g5] [g3,g5]@2 [a3,a5] ~ [f3,f5] ~ [f3,f5] ~ [e3,e5]", // G A F E
  BM: "[[f3,d5]@2 ~ [f3,e5]@2 ~ [f3,f5]@2 ~ [f3,f4]@2 ~ [f3,g4]@2 ~ [f3,a4]@3 [f3,f5]@2 ~ [f3,d5]@2 ~ [f3,c5]@2 ~ f3@2 ~ f3 ~, ~@27 c4@5]/2", // Dm Fmaj7 F Fsus2 F Dm F5
  BN: "[f3 f3@3 f3 ~@2 f3@3 f3@3 f3@3 f3 f3@3 f3 f3@3 f3 f3@3 f3 f3@3, c4@15 ~]/2",
  BO: "[f2,f4] [f2,f4]@2 ~@5 [f2,f4] [f2,f4]@2 ~@5", // F
})).s("gm_piano").gain(0.4)

// chords · piano · soft notes
const piano_soft = note("<A B C D@2 E F G@2 ~@6 H I J K ~@53 L M@2 N@2 O@2 P@2 Q@2 R@2 S@2 T@2 ~@33>".pickRestart({
  A: "~@6 a3 c4", B: "[d3,d4]@2 a4@2 a4@3 g4", C: "a4@4 a4 c5 a4 f4, f3 ~@3",
  D: "[g4@6 f4@2 e4@19 ~ d4@2 f4@2, c3 ~@7]/2", E: "[g2,g4]@2 g4@2 g4@3 f4", F: "g4@4 g4 a4 g4 f4, bb2 ~@3",
  G: "[g4@6 f4@2 e4@19 ~@5, c3 ~@7]/2", H: "f4!2 d4!2 f4!2 d4!2 f4!2 d4!2 g4!2 e4!2, d2 ~",
  I: "f4!2 d4!2 f4!2 d4!2 ~@2 d4!2 a2@2 e4!2, a2@11 ~@3 g2@2", J: "~@2 d4!2 ~@2 d4!2 ~@2 d4!2 ~@2 e4!2, a2@15 ~",
  K: "~@2 d4!2 ~@2 d4!2 ~@2 d4!2 ~@4, d3@15 ~", L: "~@8 f5@2 d5@2 g5 f5 e5@2, ~@2 d2!2",
  M: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, d7@15 ~]/2",
  N: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, c7@15 ~]/2",
  O: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, a6@15 ~]/2",
  P: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, e6@15 ~]/2",
  Q: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, d2@15 ~]/2",
  R: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, g2@15 ~]/2",
  S: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, c3@15 ~]/2",
  T: "[f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2 f4@2 d4 e4 f4@2 d4 e4 f4@2 d4@2 g4 f4 e4@2, [c3,d3,f3]@15 ~]/2", // Dm7
})).s("gm_piano").gain(0.15)

stack(piano, piano_soft)