Strudelify

Grand Designs

Rush

KeyD majorTempo143 bpm
0:00/0:00
// Grand Designs — Rush
// 143 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "Synth" pad poly (copy of ch 6 "Synth" pad new age)
// note: Full arrangement: all 127 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(143/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.

// other · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@8 A B A B C@10 D E D E D E D F D G H I J@4 K L K L K L K L K L K L J@4 C@10 D E D E D E D F D G H M N M N M N M N M
  N M N J@4 K L K L K L K L K L K L K L K L K L K L K L K L K L K L K L K L K L K O
>`.pickRestart({
  A: "[e4,g4,a4,d5] d4 [e4,g4,a4,d5] d4 [e4,g4,a4,d5] d4 [e4,g4,a4,d5] d4 ~@8", // Em7
  B: "~@8 [e4,g4,a4,d5] d4 [e4,g4,a4,d5] d4 [e4,g4,a4,d5] d4 ~@2", C: "[~ b4@3, a3, ~ d4@7]/2",
  D: "~ [f#3,a3,d4] ~ [b3,d4,g4]", E: "~@2 [d3,f#3,b3]@2 ~@2 [e3,a3,c#4]!2",
  F: "~@2 [d3,f#3,b3]@2 [e3,a3,c#4] b3 [e3,a3,c#4]@2", G: "[d3,f#3,b3]!2 [d3,f#3,b3]@2 [e3,a3,c#4]!2 [e3,a3,c#4]@2",
  H: "[f#3,a3,d4]!2 [f#3,a3,d4]@2 [b3,d4,g4]!4", I: "c#4 ~@5 b4@2, ~ d4@3, ~ g4",
  J: "[[g4,a4,d5,e5]@2 [g4,a4,d5,e5] e4 [g4,a4,d5,e5] e4 [g4,a4,d5,e5] e4 [g4,a4,d5,e5]@24]/2", // Gsus2
  K: "a4 d4 g4 d4 a4 d4 g4 d4", L: "e4 d4 a4 d4 e4 d4 d5 d4", M: "a4 a3 d4 a3 g4 a3 d4 a3 g4 a3 d4 a3 g4 a3 d4 a3",
  N: "e4 a3 d4 a3 e4 a3 d4 a3 e4 a3 d4 a3 e4 a3 d4 a3", O: "e4 ~@7",
})).s("gm_distortion_guitar").gain(0.28).pan(0.3)

// bass · lead 8 bass lead · "Synth Bass"
const bass = note(`<
  A@8 ~@26 B@4 C@2 D@2 C@2 E@2 F@2 G@2 ~@25 C@2 D@2 C@2 D@2 F@2 G@2 B@4 H I H I H I H I H I H I H I H I H I H I H I H I
  H I H I H I J ~@5
>`.pickRestart({
  A: "[d2!2 e1@6]/2", B: "[~ e1@3]/2", C: "[[e1,e2] [e1,e2]@7]/2", D: "[[d1,d2] [d1,d2]@7]/2",
  E: "[[d1,d2]@2 [d1,d2]@11 e2 d2 c#2]/2", F: "[a1,a2]/2", G: "[b1,b2]/2", H: "d2!2 c#2 d2 g1!2 f#1 g1",
  I: "b1!2 a1 b1 c#2!2 b1 a1", J: "d2!2 c#2 ~@5",
})).s("gm_lead_8_bass_lead").gain(0.32).pan(0.7)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  A@8 B C B C B C B C B C B C B C D E D E D E D E D E F G A@4 H@2 I@2 H@2 J@2 K@2 L@2 B C B C B C B C B C B C B C D E D
  E D E D E D E F H@2 I@2 H@2 I@2 K@2 L@2 A@4 M E M E M E M E M E M E M E M E M E M E M E M E M E M E M E M E M E N ~
>`.pickRestart({
  A: "[d2!2 e1@6]/2", B: "d2!2 c#2 d2 e2!2 d#2 e2", C: "g1!2 f#1 g1 ~ g1 f#1 g1", D: "d2!2 c#2 d2 g2!3 a1",
  E: "b1!2 a1 b1 c#2!2 b1 a1", F: "d2!2 c#2 d2 g2!4", G: "a2 ~@7", H: "[[e1,e2] [e1,e2]@7]/2",
  I: "[[d1,d2] [d1,d2]@7]/2", J: "[[d1,d2]@2 [d1,d2]@11 e2 d2 c#2]/2", K: "[a1,a2]/2", L: "[b1,b2]/2",
  M: "d2!2 c#2 d2 g1!2 f#1 g1", N: "d2 ~@7",
})).s("gm_electric_bass_finger").gain(0.8).pan(0.7)

// other · pad new age · "Synth"
const pad_new_age = note(`<
  A B A B A B A B ~@30 A B A B A B A B A B A B ~@25 C D C D C D C D C D C D ~@4 A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A E ~@2
>`.pickRestart({
  A: "a4 d4 g4 d4 a4 d4 g4 d4", B: "e4 d4 a4 d4 e4 d4 d5 d4", C: "a4 a3 d4 a3 g4 a3 d4 a3 g4 a3 d4 a3 g4 a3 d4 a3",
  D: "e4 a3 d4 a3 e4 a3 d4 a3 e4 a3 d4 a3 e4 a3 d4 a3", E: "e4 d4 a4 d4 e4 d4 ~@2",
})).s("gm_pad_new_age").gain(0.4).pan(0)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@5 A ~ B ~@13 C ~@15 D ~@11 C ~@24 C ~@9 E ~@13 C ~@11 E ~@7 C ~@3 F ~@4
>`.pickRestart({
  A: "x", B: "~@8 x!8", C: "~@15 x", D: "~@13 x!2 ~", E: "~@14 x!2", F: "~ x",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@13 B A@11 ~ A@29 B A@11 C@12 A@38 D ~>".pickRestart({
  A: "x!8", B: "x!6 ~@2", C: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", D: "x",
})).gain(0.8)

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

// drums · open hat
const open_hat = s("oh").struct("<~@75 [~ x ~ x ~ x ~ x]!12 ~@40>").gain(0.8)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~ A B A ~@5 B ~@16 C ~@4 A ~ A D E ~ E ~ E ~ E ~ E ~ E ~@5 B ~@16 C ~@4 B@2 ~@2 B E B@2 ~ B ~@36 F ~@4
>`.pickRestart({
  A: "x!3 ~", B: "x", C: "~@4 x!3 ~", D: "x ~@3 x!2 ~@10", E: "x!2 ~@2", F: "~@15 x",
})).gain(0.8)

// drums · ride
const ride = s("rd").struct("<~@34 [~ x ~@2] ~@92>").gain(0.8)

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

More by Rush