Strudelify

Beneath, Between & Behind

Rush

KeyA majorTempo230 bpm
0:00/0:00
// Beneath, Between & Behind — Rush
// 230 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(230/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(`<
  A@4 B@2 C D E F E G E H I@2 E F E G E F ~ D E F E G E F ~ D J@6 ~@2 J@6 ~@4 K@2 L@2 M@2 N@2 K@2 L@2 M@2 O@2 P@4 Q@2
  A@4 B@2 I@2 R@6 S@2 R@6 T@2 J@6 ~@2 J@6 ~@2 U V U V U V W@4 X@2 Y@3 ~
>`.pickRestart({
  A: "[[e3,c#4]@3 [f#3,d4]@3 [g3,e4]@10]/2", B: "[[e3,c#4]@3 [f#3,d4]@3 [g3,e4]@3 [a3,f#4]@3 ~@2 a2@2]/2",
  C: "e3 d3 e3 e2@3 e2 ~", D: "[g#3,b3,e4]", E: "[e3,c#4]@2 c#4 [f#3,d4]@2 d4 [g3,e4]@2",
  F: "e4 [a3,f#4]@2 f#4 [g3,e4]@2 ~@2", G: "e4 [a3,f#4]@2 f#4 [b3,g4]@2 [c#4,a4]@2",
  H: "e4 [a3,f#4]@2 f#4 [g3,e4]@2 a2@2", I: "[e3 d3 e3 e2@3 ~@2 [g#3,b3,e4]@8, ~@3 e2@3 ~@2]/2",
  J: "[[a3,d4,f#4]@3 [b3,d4,g4]@3 [a3,d4,f#4]@3 [b3,d4,g4]@3 [a3,d4,f#4]@2 ~@2]/2", // D G D G D
  K: "[c3@3 e3@3 f3@3 g3@3 a3 a#3 c4@2]/2", L: "[d3@3 f#3@3 g3@3 a3@3 b3 c4 d4@2]/2",
  M: "[f3@3 a3@3 a#3@3 c4@3 d4 d#4 f4 a3]/2", N: "[g3@3 b3@3 c4@3 d4@7]/2", O: "[g3@3 b3@3 c4@3 d4@3 e4 f4 g4@2]/2",
  P: "[a2@3 c#3@3 d3@3 e3@3 f#3 g3 a3@2]/2",
  Q: "[[a3,d4,f#4]@3 [b3,d4,g4]@3 [a3,d4,f#4]@3 [b3,d4,g4]@3 [a3,d4,f#4]@4]/2", // D G D G D
  R: "[[e3,a3,c#4]@3 [e3,a3,c#4]@3 [e3,a3,c#4]@6 ~@4]/2", S: "[[a3,d4,f#4]@3 [a3,d4,f#4]@3 [a3,d4,f#4]@6 ~@4]/2",
  T: "[[a3,d4,f#4] [a3,d4,f#4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [b3,e4,g#4]@9]/2", // D E
  U: "[a3,d4,f#4]@2 f#4 [b3,d4,g4]@2 g4 [a3,d4,f#4]@2", V: "f#4 [b3,d4,g4]@2 g4 [a3,d4,f#4]@2 ~@2",
  W: "[~ e4 g4 ~ d4 g4 ~ c4 g4 ~ b3 g4 a3@2 b3@2, c4@3 b3@3 a3@3 g3@3 ~@4]/2",
  X: "[~ e4 g4 ~ d4 g4 ~ c4 g4 ~ b3 g4 a3@2 e3@2, c4@3 b3@3 a3@3 g3@3 ~@4]/2", Y: "[d2,a3,d4,f#4]/3",
})).s("gm_distortion_guitar").gain(0.36).pan(0.3)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A@4 B@2 C@2 D@2 E@4 C@2 D@2 E@4 C@2 D@2 E@4 F@2 G@2 H@2 G@2 I J G@2 H@2 G@2 I K L@2 M ~ N ~ O ~ P Q M ~ N ~ O ~ R@2 S
  ~ S ~ T@2 U V U W X Y C@2 Z AA AB@2 AC@2 AD@2 AB@4 AC@2 AE AF G@2 H@2 G@2 I J G@2 H@2 G@2 I K AG@2 AH@2 AG@2 AI@6 AJ@3
  ~
>`.pickRestart({
  A: "a2/2", B: "[a2@6 a2!2]/2", C: "[e3 d3 e3 e2@3 e2@6 e3@2 e2@2]/2", D: "[c#2@3 d2@3 d2@3 f#2@3 e2@2 d2@2]/2",
  E: "[c#2@3 d2@3 d2@3 f#2@3 g2@2 a2@2]/2", F: "[e3 d3 e3 e2@3 e2@6 ~@4]/2", G: "[d2@3 g2@3 d2@3 g2@3 f#2@2 e2@2]/2",
  H: "[d2@3 g2@3 d2@3 g2@3 a2@2 a1@2]/2", I: "c3 g2 c3 b2 g2 b2 a2 e2", J: "a2 g2 e2 g2 f#2@2 e2@2",
  K: "a2 g2 e2 g2 f#2@2 g2@2", L: "[a2@3 g2@3 f#2@3 e2@3 g2@2 e2@2]/2", M: "c2@3 e2 c2 e2 f2@2",
  N: "d2@3 f#2 d2 f#2 g2@2", O: "f2@3 a2 f2 a2 a#2@2", P: "g2@3 b2 g2 b2 c3@2", Q: "~ d3@3 e2@2 d2@2",
  R: "[g2@3 b2 g2 b2 c3@3 d3@3 e3 f3 g3@2]/2", S: "a1@3 c#2@3 d2@2", T: "[d2@3 g2@3 d2@3 g2@3 f#2@2 a2@2]/2",
  U: "a1 ~@3", V: "~@3 a2", W: "~@2 e2@2 e2!3 ~", X: "[a1,a2] ~@3", Y: "~@4 a2@2 a2 ~", Z: "a1@3 a1@3 a1 ~",
  AA: "~@2 g1!2", AB: "[a1@3 a1@3 a1@6 g1@2 g1@2]/2", AC: "[a1@3 a1@3 a1@6 g1@2 e1@2]/2", AD: "[d2@3 d2@3 e2@6 e1@4]/2",
  AE: "d2 d2@2 d2@2 d2@2 e2", AF: "e2 e1", AG: "[d2@3 g2@3 d2@3 g2@3 f#2@2 a1@2]/2",
  AH: "[d2@3 g2@3 d2@3 g2@3 a2 d3 a2@2]/2", AI: "[c3@3 b2@3 a2@3 g2@3 a2@2 b2@2]/2", AJ: "d2/3",
})).s("gm_electric_bass_finger").gain(0.8).pan(0.7)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@39 A ~@6 B C D E F ~ F ~ F ~ F ~@30 G ~@22 H I ~@6 J K J K J K ~@4>".pickRestart({
  A: "~ x!3", B: "~ x", C: "~@2 x ~ x!2 ~@2", D: "~@3 x", E: "~ x ~@2 x ~ x ~", F: "x", G: "~@7 x",
  H: "~ x ~ x ~ x ~ x", I: "~@14 x!2", J: "x ~@2 x!2 ~ x!2", K: "~@2 x ~ x ~@9 x!2",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@6 ~@2 A@15 B A@14 ~@12 A@7 C A@4 ~@10 D@6 E ~ D@8 A@14 ~@18>".pickRestart({
  A: "x!8", B: "x!4 ~@4", C: "x!7 ~", D: "x!4", E: "~@7 x",
})).gain(0.8)

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

// drums · open hat
const open_hat = s("oh").struct("<~@80 [~ x ~ x ~ x ~ x]!6 ~@2 [~ x ~ x ~ x ~ x]!8 ~@32>").gain(0.8)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@4 A B ~@8 C ~@16 D ~@14 E ~ F ~@2 G ~ G ~ G ~ H ~@21 I ~@7 J ~@7 A ~@15 K ~@4 L M ~@10
>`.pickRestart({
  A: "~@3 x", B: "~ x!2 ~@5", C: "~@8 x!4 ~@4", D: "~@8 x ~ x ~ x!2 ~@2", E: "x ~ x ~@2 x ~@2", F: "x!3 ~@13",
  G: "~ x ~@2 x!3 ~", H: "~ x ~@2 x!4", I: "~@4 x!2 ~@2", J: "~ x", K: "x!4 ~@4", L: "~@6 x!2", M: "~ x!4 ~@3",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~@7 A ~@6 B A ~@6 C ~@9 D ~ D ~ D ~ A E ~@6 A ~@20 F ~ G ~@16 E ~@37 A ~@3
>`.pickRestart({
  A: "x", B: "~ x ~ x ~@2 x!2", C: "x!2 ~@6", D: "x ~@2 x ~@4", E: "~@7 x", F: "~@4 x!3 ~", G: "~@4 x!4",
})).gain(0.8)

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

More by Rush