Strudelify
KeyE majorTempo86 bpm
0:00/0:00
// Roll Right — Rage Against the Machine
// 86 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 55, 4/4 at bar 56) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Staff-2.
setcpm(86/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · "Staff-3"
const distortion_guitar = note(`<
  ~@8 A B C B C B C B ~@16 A B C B C B C B ~@24 D E F G H I J K@8 L@5 ~ M@8
>`.pickRestart({
  A: "a5@15 ~", B: "a5@7 ~ f#5@7 ~", C: "f#5@3 ~ a5@11 ~", D: "~@9 a5 f#6 a5 g#5 g#6 g#5 c#6",
  E: "d#6 d#5 d6 d5 ~ d5 a5 ~@9", F: "~@8 c#5 f#5 c#6 c#5 c#6 c#5 d6 g5", G: "d#5 a4 f5 g#5 c#5 d#6 e6 c5 ~@8",
  H: "~@9 e5 b5 c#6 f#5 c#6 c5 b4", I: "g#5 c6 f5 ~ f5 e6 g5 ~@9", J: "~@8 d#6 f5 g6 f5 g#6 b5 a6 f#5",
  K: "[a6 f#5 f6@2 d#6@2 [d4,g4,b4,e5]@2 e3@12 e3@2 ~@2 e3@12 e3@2 ~@2 e3@12 e3@2 ~@2 e3@12 e3@2 ~@2 e3@12 e3@2 ~@2 e3@12 e3@2 ~@2 e3@12 e3@2 ~@2 e3@8]/8", // Em7
  L: "[~@2 e3 ~ e3@6 e3 ~ e3@6 e3 ~ e3@6 e3 ~ e3@6 e3 ~@5]/5",
  M: "[~@8 e3@3 ~ d4 e4 e3 g3@3 e3@2 d4@3 ~ e3@3 ~ d4 e4 e3 g3@3 e3@2 d4@3 ~ e3@3 ~ d4 e4 e3 g3@3 e3@2 d4@3 ~ e3@3 ~ d4 e4 e3 g3@3 e3@2 d4@3 ~ e3@3 ~ d4 e4 e3 g3@3 e3@2 d4@3 ~ e3@3 ~ d4 e4 e3 g3@3 e3@2 d4@3 ~ e3@14 [e3,a3,d4,g4]@4 ~@6]/8", // Em7
})).s("gm_distortion_guitar").gain(0.72)

// bass · electric bass pick · "Staff-4"
const bass = note("<~@4 A B A B C@16 A B A B A B A B C@16 A B A B A B A D E@15 F ~@3 G@8 H@8 I@2>".pickRestart({
  A: "c#2 e1 c#3 d2 b2 d2 g#2 a1 g2 a1 f#2 a1 e2 a1 b1 e1", B: "b1 c#2 ~@14",
  C: "b1 c#2!2 ~ c#2!2 ~ e2 ~@2 d#2 ~@2 d2 ~@2", D: "b1 c#2 ~@6 b1 c#2!2 ~ c#2!2 ~ e2",
  E: "~@2 d#2 ~@2 d2 ~@2 b1 c#2!2 ~ c#2!2 ~ e2", F: "~@2 d#2 ~@2 d2 ~@10",
  G: "[~@8 e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1]/8",
  H: "[~@2 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1@3 e1@2 d2@3 ~ e1@3 ~ d2 e2 e1 g1]/8",
  I: "[~@2 e1@2 d2@3 ~ e1@15 ~ e1@2 ~@6]/2",
})).s("gm_electric_bass_pick").gain(0.72)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@79 [~@2 x!2]!4 [~@8 x ~@3 x ~@2 x] [~@2 x ~ x ~@3 x ~@3 x ~@2 x]!7 [~ x!2 ~@5] ~>")
  .gain(0.4)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@76
  [x!4 ~@12]!3
  [x!4 ~@8 x ~@2 x]
  [~@3 x ~@8 x ~@2 x]!3
  [~@3 x ~@8 x ~@3]
  [~ x ~ x]!7
  [~ x ~@2]
  ~
>`).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@3 A B@11 C B@7 D ~@8 B@7 E B@7 D ~@7 F ~@7 G H@7 I@5 J@3 K ~@13>".pickRestart({
  A: "x!4", B: "x!5 ~ x!2", C: "x ~ x ~ x ~ x ~ x ~@4 x ~@2", D: "x!5 ~@3", E: "x!5 ~ x ~", F: "x!2 ~@2", G: "~@4 x!4",
  H: "x ~ x!6", I: "x!2 ~ x", J: "~ x ~ x", K: "~ x ~@2",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct("<~@4 A@11 B A@7 ~@9 A@7 B A@7 ~@17 C@7 D ~@21>".pickRestart({
  A: "~@5 x ~@2", B: "~@5 x ~ x", C: "~ x ~@6", D: "~ x ~ x ~@4",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~@3 B ~@2 C D@8 A ~@3 A ~@2 A ~@4 B ~@2 C D@7 E D@7 F G@16 H@3 I D@7 F G
>`.pickRestart({
  A: "x", B: "~ x ~@2", C: "~@8 x ~ x ~ x!2 ~@2", D: "x!8", E: "x ~@3 x!4", F: "x!5 ~@3", G: "~ x", H: "x!3 ~",
  I: "x ~ x ~ x!4",
})).gain(0.72)

// drums · ride
const ride = s("rd").struct("<~@55 A B@7 C ~@15 A B@3 C ~@9>".pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x!4 ~@4",
})).gain(0.72)

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

More by Rage Against the Machine