Strudelify

Witch Hunt

Rush

KeyG minorTempo120 bpm
0:00/0:00
// Witch Hunt — Rush
// 120 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 13, 4/4 at bar 14, 2/4 at bar 15, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 115 bars on a 16-step grid, each part at one level. 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 · overdriven guitar · "TremGrt    (gm21)"
const overdriven_guitar = note(`<
  A@6 B C@4 D E F G C@2 D E F H I@2 J@2 I@2 J@2 I@2 K@2 I@2 J@2 I@2 J@2 I@2 J@2 I@2 J@2 I@2 L@2 M@2 N@2 O P@2 Q@2 R S@4
  T U V W X@3 Y Z AA AB S@2 AC U AD AE AF@2 AG@2 AH@2 AI@2 AJ AF@2 AG@2 AH@2 AI@2 AJ AF@2 AG@2 AK@2 AL@2 AJ AM@2 AN@2
>`.pickRestart({
  A: "[~@4 [g4,d5]@13 ~@3 [d4,g4,d5]@12]/6", B: "f3@5 ~ [g3,c4,d4] ~ bb3 ~ c4 ~ bb3 ~ [g3,bb3,d4]@2, ~@2 [g3,d4] ~",
  C: "~@2 g3 ~@3 [g3,c4,d4] ~ bb3 ~ c4 ~ bb3 ~ [g3,bb3,d4]@2, ~@2 [g3,d4] ~", // Gsus4 Gm G5
  D: "~@2 g3 ~@3 [g3,c4,d4] ~ [g3,bb3,d4,g4]@3 ~ [a3,d4,f4]@3 ~", // Gsus4 Gm Dm
  E: "b3 ~ a3 ~ b3 ~ a3@3 ~ b3 ~@3 a3 ~, [db4,gb4]@11 ~@5", // Gb5
  F: "b3 ~ a3 ~ b3 ~@3 [f3,a3,c4] ~ [f3,a3,c4]@3 ~ [f3,a3,c4] ~, [db4,gb4] ~@3", // F Gb5
  G: "~@2 [f3,a3,c4] ~@3 [g3,c4,d4] ~ bb3 ~ c4 ~ bb3 ~ [g3,bb3,d4]@2, ~@2 [g3,d4] ~", // F Gsus4 Gm G5
  H: "~@2 [f3,a3,c4] ~@3 [g3,bb3,db4,g4] ~ [g3,bb3,d4,g4] ~ [g3,bb3,d4,g4] ~@3 [bb3,d4,f4,bb4] ~", // F Gdim Gm Bb
  I: "[[bb3,d4,f4,bb4]@20 ~@2 [d4,f4,a4,d5] ~ [d4,f4,a4,d5]@3 ~@3 [c4,eb4,g4,c5] ~]/2", // Bb Dm Cm
  J: "[[c4,eb4,g4,c5]@20 ~@2 [g3,bb3,d4,g4] ~ [g3,bb3,d4,g4]@3 ~@3 [bb3,d4,f4,bb4] ~]/2", // Cm Gm Bb
  K: "[[c4,e4,g4,c5]@20 ~@2 [g3,bb3,d4,g4] ~ [g3,bb3,d4,g4]@3 ~@3 [bb3,d4,f4,bb4] ~]/2", // C Gm Bb
  L: "[[c4,eb4,g4,c5]@20 ~@2 [f3,a3,c4,f4] ~ [f3,a3,c4,f4]@3 ~@3 [g3,bb3,d4,g4] ~]/2", // Cm F Gm
  M: "[[g3,bb3,d4,g4]@20 ~@2 [d4,f4,a4,d5] ~ [d4,f4,a4,d5]@3 ~@3 [c4,e4,g4,c5] ~]/2", // Gm Dm C
  N: "[[c4,e4,g4,c5]@21 ~@3 c4 ~ bb3 ~@3 [f3,bb3]@2, ~@30 c4 ~]/2", // C Bb5
  O: "~@2 [g3,c4]@3 ~ [f3,a3,c4,f4]@2 [f3,a3,c4,f4]@6 [g3,bb3,d4,g4]@2", // C5 F Gm
  P: "[[bb3,d4]@6 [bb3,d4,f4,bb4]@2 [bb3,d4,f4,bb4]@20 ~@2 [d4,f4,a4,d5] ~, [g3,g4]@15 ~@17]/2", // Bb Dm G
  Q: "[[d4,f4,a4,d5]@4 ~@2 [g4,c5,d5,eb5,g5] ~ [g4,c5,d5,eb5,g5]@11 ~@5 [g3,c4] ~ [f3,bb3] ~ [g3,c4] ~ [f3,bb3]@2]/2", // Dm Cm C5 Bb5 C5 Bb5
  R: "~@2 [a3,d4]@4 ~@2 g3 f3 ~ g3 ~@2 [f3,bb3,d4,g4]@2, ~@2 [bb3,d4] ~", // D5 Gm7 Bb
  S: "~ g3 ~@4 g3 ~ g3 f3 ~ g3 ~@2 [f3,bb3,d4,g4]@2, ~@2 [bb3,d4] ~", // Gm7 Bb
  T: "~ g3 ~@4 g3 ~ [g3,bb3,d4]@3 ~ [a3,d4,f4,a4]@3 ~", // Gm Dm
  U: "[gb3,eb4,gb4] ~ [e3,db4] ~ [gb3,eb4] ~ [e3,db4]@3 eb4 gb3 ~@3 [e3,db4] ~", // Ebm Dbm Ebm Dbm
  V: "[gb3,eb4] ~ [e3,db4] ~ [gb3,eb4] ~ [e3,db4]@3 eb4 gb3 ~@3 [e3,db4] ~", // Ebm Dbm Ebm Dbm
  W: "[f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4]@3 ~ [f3,a3,c4]@3 ~ [g3,bb3,d4] ~", // F Gm
  X: "g3 f3 ~ g3 ~@2 [f3,bb3,d4,g4]@3 g3 ~@4 g3 ~, [bb3,d4] ~@3", // Gm7 Bb
  Y: "[g3,bb3,d4]@3 ~ [a3,d4,f4,a4]@3 ~ [gb3,eb4,gb4] ~ [e3,db4] ~ [gb3,eb4] ~ [e3,db4]@2", // Gm Dm Ebm Dbm Ebm Dbm
  Z: "~ eb4 gb3 ~@3 [e3,db4] ~ [gb3,eb4] ~ [e3,db4] ~ [gb3,eb4] ~ [e3,db4]@2", // Dbm Ebm Dbm Ebm Dbm
  AA: "~ eb4 gb3 ~@3 [e3,db4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4]@2", // Dbm F
  AB: "~@2 [f3,a3,c4]@3 d4 [g3,bb3] ~ g3 f3 ~ g3 ~@2 [f3,bb3,d4,g4]@2, ~@2 [bb3,d4] ~", // F Gm Gm7 Bb
  AC: "~ g3 ~@4 g3 ~ [g3,bb3,d4]@3 ~ [a3,d4,gb4,a4]@3 ~", // Gm D
  AD: "[gb3,eb4] ~ [e3,db4] ~ eb4@3 ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4] ~, ~@4 gb3 ~@11", // Ebm Dbm F
  AE: "~@2 [f3,a3,c4] ~@3 [g3,bb3,d4,g4] ~ [g3,bb3,d4,g4]@4 ~@2 [bb3,d4,f4,c5] ~", // F Gm Bb
  AF: "[[bb3,d4,f4,bb4]@20 ~@2 [d4,f4,a4,d5] ~ [d4,f4,a4,d5]@4 ~@2 [c4,e4,g4,c5] ~]/2", // Bb Dm C
  AG: "[[c4,e4,g4,c5]@20 ~@2 [f3,a3,c4,f4] ~ [f3,a3,c4,f4]@4 ~@2 [g3,bb3,d4,g4] ~]/2", // C F Gm
  AH: "[[g3,bb3,d4,g4]@4 ~@2 [bb3,d4,f4,bb4] ~ [bb3,d4,f4,bb4]@20 ~@2 [d4,f4,a4,d5] ~]/2", // Gm Bb Dm
  AI: "[[d4,f4,a4,d5]@4 ~@2 [c4,e4,g4,c5] ~ [c4,e4,g4,c5]@20 ~@2 [f3,a3,c4,f4] ~]/2", // Dm C F
  AJ: "[f3,a3,c4,f4]@4 ~@2 [g3,bb3,d4,g4] ~ [g3,bb3,d4,g4]@4 ~@2 [bb3,d4,f4,bb4] ~", // F Gm Bb
  AK: "[[g3,bb3,d4,g4]@4 ~@2 [bb3,d4,f4,c5] ~ [bb3,d4,f4,bb4]@20 ~@2 [d4,f4,a4,d5] ~]/2", // Gm Bb Dm
  AL: "[[d4,f4,a4,d5]@4 ~@2 [c4,e4,g4,c5] ~ [e4,g4,c5]@20 ~@2 [f3,a3,c4,f4] ~, ~@4 c4@11 ~]/2", // Dm C F
  AM: "[[bb3,d4,f4,bb4]@20 ~@2 [d4,f4,a4,d5] ~ [d4,f4,a4,d5]@4 ~@2 [g4,c5,d5,eb5,g5] ~]/2", // Bb Dm Cm
  AN: "[[g4,c5,d5,eb5,g5]@27 ~@5]/2", // Cm
})).s("gm_overdriven_guitar").gain(0.56).pan(0.3)

// bass · electric bass pick · "FrtlsBass (gm84)"
const bass = note(`<
  A B C D E F G@4 H I J K L@3 I J K M N@2 O@2 N@2 O@2 N@2 O@2 N@2 O@2 N@2 O@2 N@2 O@2 N@2 O@2 N@2 P@2 Q@2 R@2 S T@2 U V
  W X Y X Y Z AA AB AC AD AE AD AF AG AH AI AJ@2 Z AA AK AL AM AN AO AP AQ AR AS AT AU AM AN AO AP AQ AR AS AT AU AV AW
  AX AY AQ AR AS AT AU AZ@2 BA@2
>`.pickRestart({
  A: "~@8 g2@5 ~@3", B: "db3@5 ~@3 d3@3 ~ d3@3 ~", C: "a2@5 ~@3 bb2@5 ~@3", D: "gb2@5 ~@3 [g1,g2]@3 ~ [g1,g2]@3 ~",
  E: "[db2,db3]@5 ~@3 [d2,d3]@5 ~@3", F: "[a1,a2]@5 ~@3 [bb1,bb2]@3 ~ [bb1,bb2]@3 ~",
  G: "[[gb1,gb2]@5 ~@3 [g1,g2]@55 ~]/4", H: "~@8 g2@7 ~", I: "~@8 g2@3 ~ d3@3 ~",
  J: "gb3 ~ e3 ~ gb3 ~ e3@3 ~ gb3 ~@3 e3 ~, b2@7 ~@9", K: "gb3 ~ e3 ~ gb3 ~@3 f2@4 ~@2 [f1,f2] ~, b2 ~@3",
  L: "[~@2 [f1,f2] ~@3 [g1,g2]@29 ~@5 g2@7 ~]/3", M: "~@2 [f1,f2] ~@5 g1 ~ g1 ~@3 d2 ~",
  N: "[bb1@18 ~@4 g1 ~ g1@3 ~@3 c2 ~]/2", O: "[c2@22 g1 ~ g1@3 ~@3 bb1 ~]/2", P: "[c2@22 f1 ~ f1@3 ~@3 g1 ~]/2",
  Q: "[g1@20 ~@2 d2 ~ d2@3 ~@3 c2 ~]/2", R: "[c2@23 ~ c2 ~ d2 ~ c2@2 bb1 ~]/2", S: "~@2 c2@3 ~ f1 ~ f1@4 ~@2 g1 ~",
  T: "[g1@4 ~@2 bb1 ~ bb1@20 ~@2 d2 ~]/2", U: "d2@4 ~@2 c2 ~ c2@7 ~", V: "~@8 c2 ~ bb1 ~ c2 ~ bb1@2",
  W: "~@2 d2@3 ~ f1 ~ g1 ~ f1 ~ g1 ~ f1@2", X: "~@2 g1 ~@3 f1 ~ g1 ~ f1 ~ g1 ~ bb1@2",
  Y: "~@2 g1 ~@3 g1 ~ g1 ~ f1 ~ g1 ~ f1@2", Z: "~@2 g1 ~@3 f1 ~ g1@3 ~ d2@3 ~", AA: "b1 ~ a1 ~ b1 ~ a1@3 ~ b1 ~@3 a1 ~",
  AB: "b1 ~ a1 ~ b1 ~ a1@3 ~ b1 ~@4 b1", AC: "f1 ~ f1 ~ f1 ~ f1@3 ~ f1@3 ~@2 f1",
  AD: "g1 ~ f1 ~ g1 ~ f1@3 ~ g1 ~@3 f1 ~", AE: "g1 ~ f1 ~ g1 ~ bb1@3 ~ g1 ~@3 g1 ~",
  AF: "g1@3 ~ d2@3 ~ b1 ~ a1 ~ b1 ~ a1@2", AG: "~@2 b1 ~@3 a1 ~ b1 ~ a1 ~ b1 ~ a1@2",
  AH: "~@2 b1 ~@4 b1 f1 ~ f1 ~ f1 ~ f1@2", AI: "~@2 f1@3 ~@2 f1 g1 ~ f1 ~ g1 ~ f1@2",
  AJ: "~@2 g1 ~@3 f1 ~ g1 ~ f1 ~ g1 ~ f1@2", AK: "b1 ~ a1 ~ b1@3 ~ f1 ~ f1 ~ f1 ~ f1@2",
  AL: "~@2 f1@3 ~@2 f1 g1@4 ~@2 bb1 ~", AM: "bb1@8 ~@4 bb1@3 ~", AN: "bb1@4 ~@2 d2 ~ d2@4 ~@2 c2 ~",
  AO: "c2@8 ~@4 c2@3 ~", AP: "c2@4 ~@2 f1 ~ f1@4 ~@2 g1 ~", AQ: "g1@4 ~@2 bb1 ~ bb1@8",
  AR: "~@4 bb1@3 ~ bb1@4 ~@2 d2 ~", AS: "d2@4 ~@2 c2 ~ c2@8", AT: "~@4 c2@3 ~ c2@4 ~@2 f1 ~",
  AU: "f1@4 ~@2 g1 ~ g1@4 ~@2 bb1 ~", AV: "bb1 ~ d2 ~ f2 ~ c3@3 ~ bb2 ~ g3@3 ~", AW: "f3@4 ~@2 d2 ~ d2@4 ~@2 c2 ~",
  AX: "c2@2 ~ c3@2 d3@2 ~ eb3@2 ~ d3@2 c3@2 ~", AY: "c3 d3 c3@3 ~ f1 ~ f1@4 ~@2 g1 ~",
  AZ: "[bb1@20 ~@2 d2 ~ d2@4 ~@2 c2 ~]/2", BA: "[c2@23 ~@9]/2",
})).s("gm_electric_bass_pick").gain(0.48).pan(0.7)

stack(overdriven_guitar, bass)

More by Rush