Strudelify

Before and After

Rush

KeyA majorTempo180 bpm
0:00/0:00
// Before and After — Rush
// 180 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 133 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(180/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 B A B A B A B A B A C D@4 A B A B E F G H A B A B A B A B A B A C D@4 A B A B E F G I J ~@3 J ~@3 J ~@3 J ~@3 J ~@3
  J@4 A B A B A B A B A B A C D@4 A B A K E F G H A B A B A B A B A B A C D@4 A B A K E F G H L M L M A N A N A N A N O
>`.pickRestart({
  A: "[e3,a3]!4 [e3,a3]@2 ~@2", B: "~@2 [d3,g3]@2 ~ [a3,d4]@2 ~", C: "~@2 [d3,g3]@2 ~ [a3,d4]@2 [a2,d3]",
  D: "[[b2,e3] [b3,e4]@3]/2", E: "[g3,c4]@4 [g3,c4]@3 [g3,c4]", F: "[g3,c4] e3@2 f3@2 f#3@2 g3", G: "[a3,d4]!2",
  H: "[f3,a#3]!2", I: "[f3,a#3]", J: "f2 f#2 g2 a#2@3 g2@2", K: "~@2 [d3,g3]@2 ~ [a3,d4] ~ [g3,c4]", L: "[e3,a3]!2",
  M: "~@2 [g3,d4] e4 [a3,d4,f#4]@4", N: "~ [a3,d4,f#4]", O: "[e3,a3] ~@3",
})).s("gm_distortion_guitar").gain(0.4).pan(0.7)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A@12 B C B D A@2 E@2 F G H I A@12 B C B D A@2 E@2 F G H I J ~@3 J ~@3 J ~@3 J ~@3 J ~@3 J@4 A@12 B C B D A@2 E@2 F G H
  I A@12 B C B D A@2 E@2 F G H I K L K L M ~ M ~ M ~ M N O
>`.pickRestart({
  A: "[a1!4 a2 g2 ~ g2@2 a1 d2 e2 g2 e2 d2 c2]/2", B: "e2!4 e3@2 ~ e2", C: "a2 b2 d3 b2 d3 b2 g2@2",
  D: "a2 b2 d3 b2 d3 b2 g2 e2", E: "[a1!4 a2 g2 ~ g2@2 a1 d2 e2 g2 e2 ~ b1]/2", F: "c2@2 c2@2 c2@3 c2",
  G: "c2 e2@2 f2@2 f#2@2 g2", H: "d2!4", I: "a#1!4", J: "f1 f#1 g1 a#1@3 g1@2", K: "a1@3 a1 a2@3 a2",
  L: "g2@3 g1 d2@3 d2", M: "a1!4 a2 g2 ~@2", N: "a1 b1 c2 c#2 d2 e1 g1 g#1", O: "a1 ~@3",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.3)

// other · overdriven guitar · "Solo"
const overdriven_guitar = note("<~@49 A B C ~ D E F@2 G H I ~ J K L ~ M N O@2 ~@64>".pickRestart({
  A: "d5 c5 a4 a#4 d5 g5@2 ~", B: "a#5 [a5,a#5] [d#5,f5,g5] d5 [a#4,c5] ~ a4@2 g4@2 g5@2 a#5@2 g5@2",
  C: "d5 f5 d5 g5 d5 a5 d5 a#5", D: "~@4 a#5 g5 d#4 g4, f5", E: "~@4 g5 ~ g5 d#5, d#5@5 d#5@2 ~",
  F: "[~@8 d#4@2 g4@2 a#4@2 d5 f5@16 ~, c5 ~]/2", G: "~@4 [d4,g4,c5]!4", H: "d4 g4 a#4 g4 c5 a4 d5!2",
  I: "f5@2 d5@2 c5@2 c5!2 d5@2 d#5@2 d5@2 f5@2", J: "d5 c5 a#4@2 c5 d5 a#4@2 d5 f5 d#5@2 c5 d5 c5@2",
  K: "a#4 a4 g4 a4 f4@2 g4@2 a4@2 a#4@2 a4 g4 f4 d#4", L: "~@2 f4 g5 d4 d#5 d#4 f5, d3",
  M: "~ [d6,d#6] [a#5,c6] ~ a5@2 f5@2 a5@2 a#5@2 f5@2 d5@2, g6 ~@3", N: "f5@2 d#5!2 d5@2 d5!2 c5@2 c5!2 f5 g5 f5!2",
  O: "[f5 g5 f5 g5 f5 g5 f5 g5 f5 g5 f5 g5@2 a5 a#5 f5@16 ~]/2",
})).s("gm_overdriven_guitar").gain(0.28).pan(1)

// drums · kick
const kick = s("bd").struct("<[~@2 x!2 ~@4]!48 ~@20 [~@2 x!2 ~@4]!64 ~>").gain(0.8)

// drums · snare
const snare = s("sd").struct("<A@48 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 A@2 C D A@44 E F G H A@11 I ~>".pickRestart({
  A: "~ x", B: "~ x ~ x", C: "~@4 x!2 ~@2", D: "~@8 x ~ x ~ x!4", E: "~@7 x!2 ~@7", F: "~@8 x ~@6 x",
  G: "x ~@7 x ~@6 x", H: "x!2", I: "~@8 x ~ x!6",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!48 ~@20 [x!8]!63 [x!5 ~@3] ~>").gain(0.8)

// drums · open hat
const open_hat = s("oh").struct("<~@48 A B@3 A B@3 A B@3 A B@3 A B@3 ~@65>".pickRestart({
  A: "x!8", B: "x!4",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~@20 A ~ B@3 ~@19 A ~ B@3 ~@3 B ~@3 B ~@3 B ~@3 B ~@6 C ~@20 A ~ B@3 ~@23 B ~@11 B
>`.pickRestart({
  A: "~ x", B: "x", C: "~@6 x!2",
})).gain(0.8)

// drums · ride
const ride = s("rd").struct("<~@71 [~@13 x ~ x] ~@61>").gain(0.8)

stack(distortion_guitar, bass, overdriven_guitar, kick, snare, hihat, open_hat, crash, ride)

More by Rush