Strudelify

A Cruel Angel's Thesis

Hidetoshi Sato

KeyE♭ majorTempo240 bpm
0:00/0:00
// A Cruel Angel's Thesis — Hidetoshi Sato
// 240 bpm, 6/8, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5431090; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 163 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(240/3)

// 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 · epiano1 · "Piano"
const epiano1 = note(`<
  A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@3 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@4 R@2 S@2 T@2 U@2 V@4 W@2 X@2 Y@2 Z@2 AA@2 AB AC
  AD@2 AE@2 Q@4 R@2 S@2 T@2 U@2 V@4 W@2 X@2 Y@2 Z@2 AA@2 AF@2 AG@2 AH@2 AI@2 AJ@2 AK@2 AL@2 AM@2 AN@2 AO@2 AP AQ AI@2
  AJ@2 AK@2 AR@2 AS@2 AT@2 AU@2 AV@2 AW AX J@2 K@2 L@2 M@2 N@2 AY@2 AZ@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 BA@4
>`.pickRestart({
  A: "[~@16 eb5@15 ~, [g4,c5]@15 ~]/2", B: "[f5@13 eb5@8 f5@10 ~, [ab4,c5]@15 ~]/2",
  C: "[f5!2 bb5 ab5, [bb4,d5]@15 ~]/2", D: "[g5@5 f5@8 g5@18 ~, [bb4,eb5]@15 ~]/2",
  E: "[~@16 bb5@15 ~, [c5,eb5,g5]@15 ~]/2", F: "[f5@13 f5@8 eb5@10 ~, [c5,ab5,c6]@15 ~]/2",
  G: "[bb5@8 ~@13 bb5@10 ~, [bb4,d5]@15 ~, g5@15 ~ g5@15 ~, ~@8 bb5@13 ~@11]/2", // Bb
  H: "[bb5@13 c6@33 ~@2, [c5,eb5,ab5]@23 ~]/3", I: "[c5@15 ~ eb5@15 ~, [eb3,g3,bb3]@15 ~]/2",
  J: "[f5@13 eb5@8 f5@10 ~, [eb3,f3,ab3]@15 ~]/2", K: "[f5!2 bb5 ab5, [d3,f3,bb3]@15 ~]/2",
  L: "[g5@5 f5@8 g5@18 ~, [f3,g3,bb3]@15 ~]/2", M: "[g5@15 ~ bb5@15 ~, [eb3,g3,bb3]@15 ~]/2",
  N: "[c6@13 f5@8 eb5@10 ~, [eb3,f3,ab3]@15 ~]/2", O: "[bb5@8 bb5@8 g5@5 [d3,f3,b3,bb5]@10 ~, [d3,f3,bb3]@5 ~@3]/2",
  P: "[bb5@13 c6@18 ~, [eb3,g3,c4]@15 ~]/2", // Cm
  Q: "[~@16 eb5@8 bb4@5 ~@24 eb5@10 ~, [f3,g3,bb3]@29 bb4@23 ~@12, ~@16 [eb3,g3,d4]@15 ~]/4", // Gm7 Ebmaj7
  R: "[eb5@13 f5@10 ~ bb4@8, [bb2,d3,f3,bb3]@15 ~]/2", S: "[bb4@20 ~ b4@10 ~, [d3,f3,d4]@15 ~]/2",
  T: "[g5@13 ab5@10 ~ g5@8, [eb3,g3,c4]@15 ~]/2", U: "[f5@13 eb5@8 f5@10 ~, [d3,f3,g3]@15 ~]/2",
  V: "[g5@13 ab5@10 ~ g5@8 c5@23 ~ c5@5 d5@3, [c3,eb3,g3]@53 ~@3 [c3,eb3,g3]@8]/4", // Cm
  W: "[eb5@13 eb5@8 d5@10 ~, [bb2,eb3,ab3]@15 ~]/2", X: "[d5@23 ~ eb5@5 f5@3, [d3,f3,g3]@15 ~]/2",
  Y: "[ab5@13 g5@8 f5@10 ~, [eb3,g3,bb3]@15 ~]/2", Z: "[[eb3,eb5]@20 ~ [e3,g5]@10 ~, [g3,bb3]@15 ~]/2",
  AA: "[g5@13 f5@8 e5@10 ~, [d3,f3,c4]@15 ~]/2", AB: "[d3,f3,c4,f5]@15 ~", AC: "[d3,gb3,c4,c5]@15 ~",
  AD: "[c5@20 ~ d5@10 ~, [c3,f3,a3]@15 ~]/2", AE: "[[d3,f3,b3,d5]@15 ~]/2",
  AF: "[f5@13 ~@8 ab5@10 ~, [d3,f3,c4]@15 ~ [d3,gb3,c4]@15 ~, ~@13 g5@8 ~@11]/2", // Dm7 D7
  AG: "[[c3,a3,c4]@15 ~ [b2,g3,b3]@15 ~, g5@15 ~]/2", AH: "[[c3,a3,c4]@15 ~ [d3,b3,d4]@15 ~, d5@23 ~@9]/2",
  AI: "[eb5@13 eb5@8 d5@10 ~, [c3,eb3,g3]@15 ~]/2", AJ: "[eb5@13 eb5@8 d5@10 ~, [c3,eb3,ab3]@15 ~]/2",
  AK: "[f5@13 f5@8 eb5@10 ~, [d3,f3,bb3]@15 ~]/2", AL: "[d5@13 c5@8 d5@10 ~, [eb3,g3,bb3]@15 ~]/2",
  AM: "[eb5@13 eb5@8 d5@10 ~, [eb3,ab3,c4]@15 ~]/2", AN: "[f5@13 d5@8 c5@10 ~, [f3,ab3,c4]@15 ~]/2",
  AO: "[[f3,bb3,db4]@15 ~ [g3,bb3,d4]@15 ~, bb4@15 ~]/2", AP: "[f3,ab3]@15 ~", AQ: "[g3,bb3]@15 ~",
  AR: "[d5@13 eb5@8 f5@10 ~, [eb3,g3,bb3]@15 ~]/2", AS: "[g5@13 ab5@8 g5@10 ~, [f3,ab3,d4]@15 ~]/2",
  AT: "[f5@13 eb5@8 f5@10 ~, [f3,ab3,c4]@15 ~]/2", AU: "[[f3,ab3,c4,g5]@5 ~@3]/2",
  AV: "[[d3,g3,b3,g5]@13 [f3,a3,c4,a5]@8 [f3,d4,b5]@10 ~]/2", AW: "[c3,eb3,g3,c5] ~", AX: "[g3,bb3,d4,eb5]@15 ~",
  AY: "[d5@8 d5@8 c5@5 [d3,f3,b3,d5]@10 ~, [d3,f3,bb3]@5 ~@3]/2", AZ: "[f5@5 eb5@8 eb5@18 ~, [eb3,g3,c4]@15 ~]/2",
  BA: "[[eb3,g3,bb3,bb5]@13 [eb3,g3,c4,c6]@48 ~@3]/4", // Eb Cm
})).s("gm_epiano1").gain(0.3)

// bass · acoustic bass · "Contrabaixo"
const bass = note(`<
  ~@16 A B@2 C@2 D@2 E@2 B@2 C@2 F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@4 J@4 H@2 O@2 P@4 Q@2 R@2 H@2 I@2 J@2 K@2 L@2 M@2 N@4
  J@4 H@2 O@2 P@4 S T U V W@2 X@2 Y@2 B@2 Z@2 AA@2 AB AC AD AE W@2 X@2 Y@2 O@2 AF@2 AG@2 AH AI AJ@2 AK AL C@2 D@2 E@2
  B@2 C@2 F@2 G@2 B@2 C@2 D@2 E@2 B@2 C@2 F@2 AM AN@3
>`.pickRestart({
  A: "~@5 bb1@11", B: "[c2@21 eb2@11]/2", C: "[f2@21 c2@11]/2", D: "[bb1@21 d2@11]/2", E: "[eb2@21 d2@11]/2",
  F: "[bb1@21 b1@11]/2", G: "[c2@21 bb1@11]/2", H: "eb2/2", I: "[eb2@21 f2@11]/2", J: "bb1/2",
  K: "[bb1@13 f1@8 b1@11]/2", L: "[c2@21 c2@11]/2", M: "[bb1@21 bb1@11]/2", N: "[ab1@56 a1@3 ~@5]/4",
  O: "[c2@21 db2@11]/2", P: "d2/2", Q: "g2/2", R: "g1/2", S: "g1", T: "b1", U: "d2", V: "f2@5 g2@11",
  W: "[ab2@21 ab2@11]/2", X: "[ab1@3 eb2]/2", Y: "[g2@3 g2]/2", Z: "[f2@3 ab2]/2", AA: "[bb2@21 f2@11]/2",
  AB: "bb1@13 d2@3", AC: "f2@5 e2@11", AD: "eb2@13 g1@3", AE: "bb1@5 a1@11", AF: "[d2@3 ab2]/2", AG: "[d3@21 f2@11]/2",
  AH: "g2", AI: "g1@5 ~@11", AJ: "[g1@13 d2@8 f2@11]/2", AK: "g2 ~", AL: "c2@5 eb2@11", AM: "c2@13 c3@3", AN: "c3/3",
})).s("gm_acoustic_bass").gain(0.38)

// drums · kick
const kick = s("bd").struct(`<
  ~@16 A B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~
  B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B A C D B D B E B E B D B E B D C D C D B D B E B E B D B E B D B ~ C D B D B
  D B D B D B D B D B D F D B D B D B D B D B D B D ~@2 C ~@3
>`.pickRestart({
  A: "~@13 x ~@2", B: "x", C: "x ~@12 x ~@2", D: "~@5 x ~@10", E: "~ x", F: "~@5 x ~@7 x ~@2",
})).gain(0.17)

// drums · rim
const rim = s("rim").struct(`<
  ~@18 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~
  A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@6
>`.pickRestart({
  A: "x",
})).gain(0.17)

// drums · snare
const snare = s("sd").struct("<~@16 A ~@15 A ~@31 A ~@29 A ~ A ~@46 A ~@13 B ~@5>".pickRestart({
  A: "x", B: "x!2",
})).gain(0.17)

// drums · hihat
const hihat = s("hh").struct("<~@16 A B C@13 D ~ B C@29 D A B C@27 B C@2 D ~@66>".pickRestart({
  A: "~@13 x ~@2", B: "~@8 x ~@4 x ~@2", C: "x ~@7 x ~@4 x ~@2", D: "x",
})).gain(0.17)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A ~@15 B ~@30 C D ~@93 A ~@4>".pickRestart({
  A: "~@5 x ~@10", B: "~@5 x ~@2 x ~@7", C: "~@13 x ~@2", D: "~ x",
})).gain(0.17)

// drums · open hat
const open_hat = s("oh").struct("<~@17 A ~@15 A ~@31 A ~@27 A ~@33 A ~ A ~@33>".pickRestart({
  A: "x",
})).gain(0.17)

// drums · high tom
const high_tom = s("ht").struct("<~@15 A ~@15 B ~@31 C ~@94 D ~@4>".pickRestart({
  A: "~@13 x ~@2", B: "~@8 x ~@4 x ~@2", C: "~ x", D: "x",
})).gain(0.17)

// drums · ride
const ride = s("rd").struct("<~@97 A B@14 C A B@12 C ~@4 B@12 D E B@12 ~ D@2 ~@3>".pickRestart({
  A: "~@8 x ~@4 x ~@2", B: "x ~@7 x ~@4 x ~@2", C: "x", D: "~ x", E: "x!2",
})).gain(0.17)

// drums · china
const china = s("cr").struct("<~@97 A ~@14 B A ~@13 C B ~ A ~@28 D ~@3>".pickRestart({
  A: "x", B: "~@5 x ~@10", C: "~@13 x ~@2", D: "x ~@12 x ~@2",
})).gain(0.17)

stack(epiano1, bass, kick, rim, snare, hihat, mid_tom, open_hat, high_tom, ride, china)