Strudelify

Cat Scratch Fever

Ted Nugent

KeyA minorTempo123 bpm
0:00/0:00
// Cat Scratch Fever — Ted Nugent
// 123 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(123/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
const overdriven_guitar = note(`<
  A@2 B C D E F G H E F G H E F G I@2 J K L@2 J K M E F G I@2 J K L@2 J K M E F G H E F G N@8 O@2 E F G H E F G P@4 F G
  I@2 J K L@2 J K M E F G H E F G H Q@2 R@3 S@7
>`.pickRestart({
  A: "[~@14 [a2,e3]@4 a2@2 [b2,f#3]@2 a2@2 [c3,g3] ~ [c3,g3]@5 ~]/2", B: "[a2,e3] [b2,f#3] a2 [c3,g3]@5",
  C: "[a2,e3] ~ a2@2 [b2,f#3]@2 a2@2 [c3,g3]@2 [c3,g3]@5 ~", D: "[c3,g3]@2 [b2,f#3]@2 [a2,e3] ~ [a2,e3]@9 ~",
  E: "[a2,e3] ~ a2@2 [b2,f#3]@2 a2@2 [c3,g3] ~ [c3,g3]@6", F: "[a2,e3] [b2,f#3] a2 [c3,g3]@2 e2 g2 g#2",
  G: "[a2,e3] ~ a2@2 [b2,f#3]@2 a2@2 [c3,g3] ~ [c3,g3]@5 ~", // A5 B5 C5
  H: "[c3,g3]@2 [b2,f#3]@2 [a2,e3] ~ [a2,e3]@4 e2@2 g2@2 g#2@2", // C5 B5 A5
  I: "[[c3,g3]@2 [b2,f#3]@2 [a2,e3] ~ [a2,e3]@4 [a2,e3] ~ [a2,e3] ~ [a2,e3]@4 [a2,e3]@2 [c3,g3]@2 [c3,g3]@2 [a2,e3]@2 [a2,e3]@2 [c3,g3]@2 [c3,g3]@2]/2", // C5 B5 A5 C5 A5 C5
  J: "[a2,e3]@2 [c3,g3]@2 ~@2 [a2,e3]@3 ~ a2@2 c3@2 d3 ~", // A5 C5 A5
  K: "[g2,d3]@2 [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~", // G5 D5
  L: "[[a2,e3] ~ [a2,e3] ~ [c3,g3] ~ [a2,e3]@3 ~ [a2,e3] ~ [a2,e3] ~ [a2,e3]@4 [a2,e3]@2 [c3,g3]@2 [c3,g3]@2 [a2,e3]@2 [a2,e3]@2 [c3,g3]@2 [c3,g3]@2]/2", // A5 C5 A5 C5 A5 C5
  M: "[a2,e3] ~ [a2,e3] ~ [c3,g3] ~ [a2,e3]@3 ~ e2@2 g2@2 g#2@2", // A5 C5 A5
  N: "[[c3,g3]@2 [b2,f#3]@2 [a2,e3] ~ [a2,e3]@4 [d#3,a#3] ~ [d#3,a#3] ~ [d#3,a#3]@4 ~@2 [d#3,a#3]@4 [d#3,a#3] ~ [d#3,a#3]@4 [c3,g3]@4 ~@2 [c3,g3]@4 [c3,g3] ~ [c3,g3]@4 [d#3,a#3]@4 ~@2 [d#3,a#3]@4 [d#3,a#3] ~ [d#3,a#3]@4 [c3,g3]@4 f4@2 e4@2 c4@2 f4@2 e4@2 c4@2 [d#3,a#3]@4 ~@2 [d#3,a#3]@4 [d#3,a#3] ~ [d#3,a#3]@4 [c3,g3]@4 ~@2 [c3,g3]@4 [c3,g3] ~ [c3,g3]@4 [d#3,a#3]@4 ~@2 [d#3,a#3]@4 [d#3,a#3] ~ [d#3,a#3]@4 [e3,b3]@2]/8", // C5 B5 A5 D#5 C5 D#5 C5 D#5 …
  O: "[~@2 [e3,b3]@2 [e3,b3] ~ [e3,b3]@4 [e3,b3]@2 [e3,b3] ~ [e3,b3]@4 [e3,b3]@2 [e3,b3] ~ [e3,b3]@4 e2@2 g2@2 g#2@2]/2", // E5
  P: "[[c3,g3]@2 [b2,f#3]@2 [a2,e3] ~ [a2,e3]@4 e2@2 g2@2 [d3,a3]@5 ~ [d3,a3]@3 ~ [e3,b3] ~ [e3,b3]@3 ~ [c3,g3]@5 ~ [c3,g3]@2 ~@2 [d3,a3] ~ [d3,a3]@2 ~@2 [a2,e3]@4 a2@2 [b2,f#3]@2 a2@2 [c3,g3] ~ [c3,g3]@6]/4", // C5 B5 A5 D5 E5 C5 D5 A5 …
  Q: "[[a2,e3]@2 ~@2 [b2,f#3]@2 ~@2 [c3,g3]@3 ~ c3@15 ~@3 [a2,e3]@2, ~@11 g3@15 ~@6]/2", // A5 B5 C5 A5
  R: "[[a2,e3]@2 ~ [c3,g3]@3 ~ [c3,g3]@12 ~@2 [a2,e3] ~ [a2,e3]@2 ~ [c3,g3]@4 ~ [c3,g3]@10 ~@3 [a2,e3] ~ [a2,e3]@2]/3", // A5 C5 A5 C5 A5
  S: "[~ [c3,g3]@3 ~@2 [c3,g3]@20 ~ [a2,e3]@43 ~ [a2,e3]@5 ~@2 [a2,e3]@5 ~ [a2,e3]@2 ~ [a2,e3]@18 ~ [a3,e4]@3 ~@3]/7", // C5 A5
})).s("gm_overdriven_guitar").gain(0.31)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@5 A@3 B C D C D C D C@3 E F G C E F H C D C@3 E F G C E F H C D C D C D C I J K J K J K L M N C D C D C D C O P Q C
  D C@3 E F G C E F H C D C D C D C D R@2 S@3 T@7
>`.pickRestart({
  A: "a1/3", B: "~@5 e1 g1 g#1", C: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  D: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ e1 ~ g1 ~ g#1 ~", E: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ c2 ~ d2 ~",
  F: "g1 ~ g1 ~ g1 ~ g1 ~ d2 ~ d2 ~ d2 ~ d2 ~", G: "a1 ~ a1 ~ c2 ~ a1@3 ~ a1 ~ a1 ~ a1 ~",
  H: "a1 ~ a1 ~ c2 ~ a1@3 ~ e1@2 g1@2 g#1@2", I: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ d#2 ~ d#2 ~ d#2 ~",
  J: "d#2 ~ d#2 ~ d#2 ~ d#2 ~ d#2 ~ d#2 ~ d#2 ~ c2 ~", K: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ d#2 ~",
  L: "d#2 ~ d#2 ~ d#2 ~ d#2 ~ d#2 ~ d#2 ~ d#2 ~ e2 ~", M: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~",
  N: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e1 ~ g1 ~ g#1 ~", O: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ e1 ~ g1 ~ d2 ~",
  P: "d2 ~ d2 ~ d2 ~ d2 ~ e2 ~ e2 ~ e2 ~ c2 ~", Q: "c2 ~ c2 ~ c2 ~ c2 ~ d2 ~ e1 ~ g1 ~ g#1 ~",
  R: "[a1@2 ~@2 b1@2 ~@2 c2@3 ~ c2@15 ~@3 a1@2]/2",
  S: "[a1 ~@2 c2@3 ~ c2@12 ~@2 a1 ~ a1 ~@2 c2@4 ~ c2@10 ~@3 a1 ~ a1 ~]/3",
  T: "[~ c2@3 ~@2 c2@20 ~ a1@43 ~ a1@5 ~@2 a1@5 ~ a1@2 ~ a1@18 ~ a1@3 ~@3]/7",
})).s("gm_acoustic_bass").gain(0.31)

// drums · kick
const kick = s("bd").struct(`<
  ~@5 A ~@3 B C B C B C B C B C B C B C B D B C B D B C B C B C B D B C B C B C B E F G@2 H G@3 I J B C B C B C B D K@2
  B C B C B C B C B C B D B C B C B C B C L H M N O P Q R S T U V
>`.pickRestart({
  A: "x", B: "x!2 ~@2 x!2 ~@2", C: "x!2 ~ x ~ x ~@2", D: "x!2 ~ x ~@4", E: "x!2 ~@5 x", F: "x!2 ~@2 x ~@2 x",
  G: "~ x ~@2 x ~@2 x", H: "~@7 x", I: "~@3 x ~@3 x", J: "~ x ~ x ~@2 x!2", K: "x!2 ~@3 x ~ x", L: "x!4",
  M: "x ~@2 x ~@3 x ~@8", N: "~@5 x ~ x ~@2 x ~@4 x", O: "~@6 x!2", P: "~ x ~@4 x ~@9", Q: "~@11 x ~@4",
  R: "~@4 x ~@3 x ~@3 x ~@2 x", S: "~ x ~@2 x ~ x ~@2 x ~@2 x ~ x ~", T: "~ x ~@5 x ~@6 x ~", U: "~@4 x ~@2 x ~@8",
  V: "~@7 x ~@2 x ~@5",
})).gain(0.31)

// drums · snare
const snare = s("sd").struct(`<
  ~@5 A ~@2 B C@15 D C@3 E C@7 D C@7 F G@3 H G@3 I J C@7 E K@2 C@11 D C@3 L C@4 M N O P Q R S ~@2 T U V
>`.pickRestart({
  A: "x", B: "x!8", C: "~ x ~ x", D: "~@4 x ~@5 x ~ x!3 ~", E: "~@2 x ~@2 x!3", F: "~@2 x!5 ~", G: "~@2 x ~@2 x!2 ~",
  H: "~ x!6 ~", I: "~ x!2 ~@2 x!2 ~", J: "~@2 x ~ x!2 ~@2", K: "~ x!3", L: "~@2 x ~@3 x!2", M: "x!4", N: "~@7 x",
  O: "x ~@2 x ~@3 x ~@8", P: "~@5 x ~ x ~@2 x ~@4 x", Q: "~@6 x!2", R: "~ x ~@4 x ~@9", S: "~@11 x ~@4",
  T: "~@7 x ~@6 x ~", U: "~@4 x ~@2 x ~@8", V: "~@5 x ~@2",
})).gain(0.31)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@91
  [~@3 x ~@3 x ~@3 x ~@2 x ~]
  [~ x ~ x ~@2 x ~ x ~@4 x ~@2]
  [x ~@2 x ~@12]
  ~
  [~@7 x ~@8]
>`).gain(0.31)

// drums · hihat
const hihat = s("hh").struct("<A ~@8 B C@34 D@8 E F B C@6 D C G C@20 ~@12>".pickRestart({
  A: "x!3 ~", B: "~ x!7", C: "x!8", D: "x!7 ~", E: "x!3 ~ x!3 ~", F: "x!3 ~ x!4", G: "x!4 ~ x!3",
})).gain(0.31)

// drums · mid tom
const mid_tom = s("mt").struct("<~@91 [~@2 x ~@3 x!2 ~@2 x ~@2 x ~@2] [x ~ x!2 ~ x ~ x!2 ~ x ~@5] ~@2 [~@3 x ~@4]>")
  .gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@5 A ~@3 A ~@34 B@8 C D A ~@6 B ~ E ~@20 F B G H I J K ~@2 L M N>".pickRestart({
  A: "x", B: "~@7 x", C: "~@3 x ~@3 x", D: "~@3 x ~@4", E: "~ x", F: "x ~@3 x ~@3 x ~@2 x ~@4", G: "x ~@2 x ~@3 x ~@8",
  H: "~@5 x ~ x ~@2 x ~@4 x", I: "~@6 x!2", J: "~ x ~@4 x ~@9", K: "~@11 x ~@4", L: "~@7 x ~@6 x ~",
  M: "~@4 x ~@2 x ~@8", N: "~@5 x ~@2",
})).gain(0.31)

stack(overdriven_guitar, bass, kick, snare, low_tom, hihat, mid_tom, crash)