Strudelify

The Necromancer

Rush

KeyG majorTempo140 bpm
0:00/0:00
// The Necromancer — Rush
// 140 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 169 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/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 · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@4 A@4 ~ B C D@2 E@2 F B ~ A@4 ~ B G D@2 E@2 F B ~ A@4 ~ B G D@2 E@2 F B ~ A@4 ~ B ~@7 H@2 I@2 H@2 I@2 H@2 J@2 K L
  M@2 H@2 I@2 H@2 I@2 H@2 I@2 H@2 I@2 H@2 N@2 K O P@2 K Q@7 R@7 S ~ T U T U T U T U T U T U T U T U V W V W V W V W V W
  V W V W V W V W V W V W V W V W V W V W V W V W V X ~
>`.pickRestart({
  A: "[~@14 [d4,g4,b4]@14 ~@14 [b3,d4]@3 [a3,d4,f#4]@7 ~@18 [d4,g4,b4]@14 ~@12, ~@41 g4@3 ~@52]/4", // G Bm D G
  B: "~@3 [d4,g4,b4]@7 ~@2", C: "~@10 [b3,d4,g4]@3 ~ [d4,f#4]@7 ~@3, ~@13 a3@7 ~@4", D: "[~@7 [d4,g4,b4]@7 ~@10]/2",
  E: "[~@11 [d4,g4,b4]@7 ~@6]/2", F: "~@2 [b3,d4]@3 ~ f#4@7 ~@11, ~ g4@3 ~ [a3,d4]@7 ~@12",
  G: "~@10 [b3,d4]@3 ~ f#4@7 ~@3, ~@9 g4@4 [a3,d4]@7 ~@4", H: "[~@7 e3@3 [e1,e2]@2 e3!2 ~@2]/2",
  I: "[~@7 e3@3 [e1,e2]@2 e3 d3 ~@2]/2", // E
  J: "[~@4 d4@9 ~@2 a3@6 e3@9 [e1,e2]@6 e3@3 d3@3 ~@6, ~@3 a3@9 ~@2 d4@6 ~@28]/2", K: "~ g2 a2 a#2 b2 d3 d#3 e3",
  L: "e2@2 e2@2 e3!2 ~@2", M: "[~@7 e2@3 [e1,e2]@2 e3 d3 ~@2]/2",
  N: "[~ [a3,d4]@3 ~ [a3,d4]@2 e3@3 [e1,e2]@2 e3 d3 ~@2]/2", O: "~ e2@5 e2@6 e3@3 e3@3 ~@6",
  P: "[~ [a3,d4]@3 ~ [a3,d4]@2 e2@3 [e1,e2]@2 e3 d3 ~@2]/2", // D5 E
  Q: "[g3@2 e3@2 d3 d#3 e3 e2@3 e3@2 d3 d#3 e3 g3@3 e3@2 d3 e3 d3 g2@2 ~@2 a2@2 ~@2 g3@3 e3@2 d3 d#3 e3 e2@3 e3@2 d3 d#3 e3 g3@3 e3@2 d3 e3 d3 g2]/7",
  R: "[~@9 a2@6 ~@6 g3@9 e3@6 d3@3 d#3@3 e3@3 e2@9 e3@6 d3@3 d#3@3 e3@3 g3@9 e3@6 d3@3 e3@3 d3@3 g2@6 ~@6 a2@6 ~@6 g3@8 f#3@6 ~ e2@3 e2@3 ~@3 g3@8 f#3@6 ~ e2@3 e2@3 ~@6]/7",
  S: "~ b3@23, [e3,e4]", T: "e4 ~ e4 b3!2 ~ e4 b3, ~ g#4@3 ~ d#4@3", U: "a3 ~ e4 b3!2 ~ e4 b3, ~ c#4@3 ~ d#4@3",
  V: "[b3,e4,g#4]@5 ~@2 b3@2 ~ b3@3 ~@2 [b3,d#4]@3 [b3,d#4,f#4]@6, ~@5 g#4@3 ~@6 f#4@3 ~@7, ~@2 e4 [e4,g#4] ~@4", // E B E
  W: "~ a3@5 [a3,c#4,e4]@3 [a3,c#4,e4]@3 ~@3 [b3,d#4,f#4]@3 [b3,d#4,f#4]@6, [c#4,e4] ~@3", // A B C#m
  X: "~ a3@5 [c#4,e4]@3 [a3,c#4,e4]@3 ~@3 [b3,d#4,f#4]@3 [b3,d#4,f#4]@6, [c#4,e4] ~@3", // C#m A B C#m
})).s("gm_distortion_guitar").gain(0.32).pan(0.6)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@4 A@7 B@2 C@5 D@7 B@2 E@5 F@7 G H I@5 J@6 ~@7 K@2 L@2 K@2 L@2 K@2 M@2 N O P@2 K@2 L@2 K@2 L@2 K@2 L@2 K@2 L@2 K@2
  Q@2 N O R@2 N S@7 T@7 U ~ V@16 W X Y Z AA Z AB AC Y AD AA AE AF AG AH AI AJ AK AL AM AN AO AP AQ AN AO AP AQ AN AO AP
  AQ AN AO AR ~@2
>`.pickRestart({
  A: "[e2@28 e2@28 e2@28 ~@3 e3@4 g3@3 ~@4 b2@3 d3@4 ~@3 a2@4 e2@28 e2@28, ~@84 c3@10 g2@11 f#2@7 ~@56]/7",
  B: "[e2@28 ~@3 e3@3 ~ g3@3 ~@4 b2@3 d3@3, ~@14 c3@5 g2@5]/2",
  C: "[~@5 a2@3 e2@28 e2@28 e2@28 ~@3 e3@3 ~ g3@3 ~@4 b2@3 d3@3 ~@5 a2@3, ~ f#2@7 ~@84 c3@10 g2@11 f#2@7]/5",
  D: "[e2@28 e2@28 e2@28 ~@3 e3@4 g3@3 ~@4 b2@3 d3@4 ~@3 a2@3 ~ e2@28 e2@28, ~@84 c3@10 g2@11 f#2@7 ~@56]/7",
  E: "[~@4 a2@3 ~ e2@28 e2@14 e3@3 d3@7 b2@4 e2@14 e3@14 ~@3 e3@3 ~ g3@3 ~@4 b2@3 d3@3 ~@4 a2@4, ~ f#2@7 ~@84 c3@10 g2@11 f#2@7]/5",
  F: "[e2@14 e3@14 e2@14 e3@3 d3@7 ~ b2@3 e2@14 e3@7 a2@3 b2@3 ~@4 e3@4 g3@3 ~@4 b2@3 d3@4 ~@3 a2@4 e2@14 e3@14 e2@14 e3@3 d3@7 ~ b2@3, ~@84 c3@10 g2@11 f#2@7 ~@56]/7",
  G: "e2@14 e3@7 a2@3", H: "b2@4 ~@3 e3@3 ~ g3@3 ~@4 b2@3 d3@3, ~@2 c3@5 g2@5",
  I: "[~@4 a2@4 e2@14 e3@14 e2@14 e3@3 d3@7 b2@4 e2@14 e3@7 a2@3 b2@3 ~@4 e3@3 ~ g3@3 ~@4 b2@3 d3@3 ~@5 a2@3, ~ f#2@7 ~@84 c3@10 g2@11 f#2@7]/5",
  J: "[e2@14 e3@14 e2@14 e3@3 d3@7 ~ b2@3 e2@14 e3@7 a2@3 b2@3 ~@4 e3@4 g3@3 ~@4 b2@3 d3@4 ~@3 a2@3 ~ e2@7 e3@7 e2@14 ~@4, ~@84 c3@10 g2@11 f#2@7 ~@32]/6",
  K: "[~@7 [e2,e3]@3 [e1,e2]@2 [e2,e3]!2 ~@2]/2", L: "[~@7 [e2,e3]@3 [e1,e2]@2 [e2,e3] [d2,d3] ~@2]/2",
  M: "[~@4 [g2,d4]@9 ~@2 [g2,a3]@6 [e2,e3]@9 [e1,e2]@5 ~ e3@3 ~ d2@3 ~@5, ~@3 a3@9 ~@2 d4@6 ~@15 e2@3 ~ d3@3 ~@6]/2", // G5 Gsus2 E
  N: "~@3 g1@3 ~ a1@2 a#1@3 b1@3 d2@3 d#2@3 e2@3", O: "e1@2 e1@2 e2!2 ~@2",
  P: "[~@21 e1@9 [e1,e2]@5 ~ e3@3 ~ d2@3 ~@5, ~@35 e2@3 ~ d3@3 ~@6]/2", // E
  Q: "[~@2 g2@9 ~@4 g2@6 [e2,e3]@9 [e1,e2]@6 [e2,e3]@3 [d2,d3]@3 ~@6]/2", // E D
  R: "[~@3 g2@9 ~@3 g2@6 ~ e2@8 [e1,e2]@5 ~ e3@3 ~ d2@3 ~@5, ~@35 e2@3 ~ d3@3 ~@6]/2", // E
  S: "[g2@6 e2@6 d2@3 d#2@3 e2@3 ~ e1@8 e2@6 d2@3 d#2@3 e2@3 g2@9 e2@6 d2@3 e2@3 d2@3 g1@6 ~@6 a2@6 ~@6 g2@9 e2@6 d2@3 d#2@3 e2@3 ~ e1@8 e2@6 d2@3 d#2@3 e2@3 g2@9 e2@6 d2@3 e2@3 d2@3 g1@3]/7",
  T: "[~@9 a2@6 ~@6 g2@9 e2@6 d2@3 d#2@3 e2@3 ~ e1@8 e2@6 d2@3 d#2@3 e2@3 g2@9 e2@6 d2@3 e2@3 d2@3 g1@6 ~@6 a2@6 ~@6 g2@9 f#2@6 e1@3 e1@3 ~@3 g2@9 f#2@6 e1@3 e1@3 ~@6]/7",
  U: "[e1,e2]", V: "~@2 e4 b3 ~@2 e4 b3", W: "e2@18 ~ b1@5", X: "a1@12 ~@4 a2@2 f#2@3 g#2@3",
  Y: "~ e2@11 e2@3 ~@4 b1@5", Z: "~ a1@6 ~@2 a2@6 b2@3 f#2@3 g#2@3", AA: "~ e2@12 ~@2 b1@3 e2@3 b1@3",
  AB: "~ e2@6 ~@2 e2@6 b1@3 e2@3 b1@3", AC: "~ a1@6 ~@2 a1@6 b1@6 f#2@3", AD: "~ a1@6 ~@2 a2@5 g#2@6 ~ f#2@3",
  AE: "~ a1@6 ~@2 b2@6 a2@6 g#2@3", AF: "~ e2@12 ~@2 b1@3 e2@2 b1@3 ~", AG: "~ a1@6 ~@2 b1@6 ~ f#2@5 c#2@3",
  AH: "~ e2@6 ~ f#3@6 ~ e3@3 c#3@3 b2@3", AI: "c#3 b2 g#2 f#2 g#2 b2 g#2 f#2",
  AJ: "~ e2@5 e3@2 e2@3 ~@4 e2@3 ~ b1@2 e2@3", AK: "~ a1@6 ~@2 a2@6 g#2@3 f#2@3 e2@3",
  AL: "~ e2@6 ~@2 b2@6 b2@3 b2@3 a2@3", AM: "~@3 g#2@3 a2@3 g#2@2 f#2@3 ~ e2@3 f#2@3 c#2@3",
  AN: "~ e2@5 e3@3 b2@3 ~@3 b2@3 e3@3 b2@3", AO: "a2@2 e3 a2!2 g#2 f#2 e2", AP: "e2@6 b1@3 e2@6 b1@3 ~ e2@2 b1@3",
  AQ: "a1@5 e2@3 ~ a1@6 b1@3 f#2@3 c#2@3", AR: "e2@6 b1@3 e2@6 b1@3 ~ e2@3 ~@2",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A B C D E F G A B C D E F G A B C D E F G A B C D E F G A B C D E F G A B C D E F G A B C D E ~@50 H@12 ~@18 I@37
  ~@2
>`.pickRestart({
  A: "~@5 x ~ x ~@4", B: "~@7 x ~ x ~@2", C: "~@9 x ~ x", D: "~@11 x", E: "~ x ~@10", F: "~ x ~ x ~@8",
  G: "~@3 x ~ x ~@6", H: "~@4 x!2 ~@2", I: "~@2 x!2 ~@4",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A ~ B C D E F G ~ B C D E F G ~ B C D E F G ~ B C D E F G ~ B C D E F G ~ B C D E F G ~ B C H I ~@48 J@12 K L ~@10
  M@42 ~@3
>`.pickRestart({
  A: "x ~@6 x", B: "~ x ~@22", C: "~@5 x ~@18", D: "~@3 x ~@4", E: "~@13 x ~@10", F: "~@17 x ~@6", G: "~@7 x",
  H: "~@18 x ~ x!2 ~ x", I: "~ x ~ x!2 ~@19", J: "~@3 x", K: "~@4 x!2 ~ x", L: "x ~ x ~ x!2 ~@2", M: "~ x",
})).gain(0.8)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@49 A B ~@2 C D C D C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E F ~@31 G ~@37
>`.pickRestart({
  A: "~@12 x ~@10 x", B: "~@9 x ~@6 x ~@7", C: "~@7 x", D: "~ x ~@2", E: "~@5 x ~@6 x ~@2 x ~@8",
  F: "~@3 x!2 ~ x!2 ~@16", G: "~@11 x",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C ~@51 D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ E@13 F ~@4 G@13
  H G@34 I ~@2
>`.pickRestart({
  A: "~@6 x ~@4 x", B: "~@13 x ~@2 x ~@7", C: "~ x ~@10", D: "~@7 x", E: "~ x ~ x ~ x ~ x", F: "~ x ~ x ~ x ~@2",
  G: "x!4", H: "x!3 ~", I: "x!2 ~@2",
})).gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@49 A B ~@3 C ~ C D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E F ~@13 G ~@17 H
  ~@37
>`.pickRestart({
  A: "~@16 x ~@2 x ~@4", B: "~@2 x ~@10 x ~@10", C: "~@4 x!2 ~@2", D: "~@7 x", E: "~@5 x ~@6 x ~@2 x ~@8",
  F: "~@9 x ~ x!3 ~ x ~ x!3 ~@4", G: "~@6 x!2", H: "~@19 x ~ x ~@2",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct(`<
  A B C D E F G H I J K L F G H I J K L F G H I J K L F G H I J K L F G H I J K L F G H I J K L F G H M ~@3 N ~ N ~ N ~
  N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ N ~ O P@12 Q ~@6 R@11 S R@34 S ~@2
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@5 x", C: "~@6 x ~@16 x", D: "~@3 x ~@3 x ~@2 x ~", E: "~@3 x ~@7 x ~@5 x ~@6",
  F: "x ~@6 x ~@6 x ~@6 x ~@2", G: "~@4 x ~@6 x ~@6 x ~@5", H: "~ x ~@6 x ~@6 x ~@6 x ~", I: "~@5 x ~@6 x ~@6 x ~@4",
  J: "~@2 x ~@6 x ~@6 x ~@6 x", K: "~@6 x ~@6 x ~@6 x ~@3", L: "~@3 x ~@6 x ~@6 x ~@6", M: "~@5 x ~@6 x ~@11",
  N: "~@3 x", O: "~ x!3", P: "x!4", Q: "x!3 ~", R: "~ x ~ x ~ x ~ x", S: "~ x ~ x ~@4",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@50 A ~@2 B C ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D E F ~@30 G ~@37
>`.pickRestart({
  A: "~ x ~@2", B: "~@5 x", C: "~@2 x ~ x!2 ~@2", D: "~@4 x!2 ~@2", E: "~@21 x!2 ~", F: "x", G: "~@5 x!2 ~",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct("<~@51 [~ x ~@2] ~@48 x ~@13 [x!2 ~@22] ~@54>").gain(0.8)

stack(distortion_guitar, bass, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash)

More by Rush