Strudelify

Rock & Roll, Part 2

Gary Glitter

KeyE majorTempo142 bpm
0:00/0:00
// Rock & Roll, Part 2 — Gary Glitter
// 142 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 98 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(142/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.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@3 A B C B C B C B C D@8 E F G H I J K J K J K B C B C D@8 E F G H I J K J K J K B C B C B C B C B C B C B C B C J K
  J K J K B C B C B C B C B C B C B C B C B C B C B L
>`.pickRestart({
  A: "~@16 b1@2 c#2@3 ~ b1@2", B: "e1@2 ~@2 e1 ~ e1@2 ~@2 e1 ~ e1@2 ~@2 e1@2 e1@2 ~@2 e1 ~",
  C: "e1@2 ~@2 e1 ~ e1@2 ~@2 e1 ~ e1@2 ~@2 b1@2 c#2@3 ~ b1@2", D: "e1@3 ~ e2@3 ~@3 e2@3 ~@3 e2@3 ~@3 b1@2",
  E: "g1@3 ~ g1@4 ~@2 g1@4 ~@2 g1@4 ~@2 g1@2", F: "a1@3 ~ a1@4 ~@2 a1@4 ~@2 a1@4 ~@2 a1@2",
  G: "b1@3 ~ b1@4 ~@2 b1@3 ~@3 b1@4 ~@2 b1@2", H: "b1@2 ~@2 b1@4 ~@2 b1@3 ~@3 b1@4 ~@2 b1@2",
  I: "~@4 b1@4 ~@2 b1@3 ~@3 b1@4 ~@2 b1@2", J: "e2@3 ~ e2@2 e2@3 ~ d2@4 ~@2 d2@4 ~@2 d2@2",
  K: "a1@3 ~ a1@2 a1@2 ~@2 b1@4 ~@2 b1@5 ~ b1@2", L: "e1@2 ~@2 e1 ~ e1@2 ~@16",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@3 A@8 B ~@7 C@6 D E D E D F@5 ~@7 C@6 D E D E D G@8 H@2 I J K L@2 M@2 D E D E D N@8 O@8 P Q R Q R L S
>`.pickRestart({
  A: "[~@22 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@2]/8", // E5
  B: "~@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@9", // E5
  C: "[~@22 d4@22 ~ d4@22 ~@2 e4@22 ~@2 e4@42 ~ [c#3,g#3,c#4]@8]/6", D: "[e3,b3,e4]@12 [d3,a3,d4]@5 ~@7",
  E: "~@4 [a2,e3,a3]@6 [b2,f#3,b3]@5 ~ [c#3,g#3,c#4]@8", // A5 B5 C#5
  F: "[~@4 [a2,e3,a3]@6 [b2,f#3,b3]@11 ~ [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@9]/5", // A5 B5 E5
  G: "[~@4 [a2,e3,a3]@6 [b2,f#3,b3]@11 ~ [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@3 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@3 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@3 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@5 ~ [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@4 ~@2 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@5 ~ [e3,b3] ~@3 [e3,b3,e4]@2]/8", // A5 B5 E5 G5 E5 D5 E5 G5 …
  H: "[~@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@4 ~@2 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@6 [g3,d4,g4]@5 ~]/2", // E5 D5 E5 G5
  I: "[e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@6 [d3,a3,d4]@3 ~@3", // E5 D5
  J: "[e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@4 ~@2 [g3,d4,g4]@5 ~", // E5 G5
  K: "[e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 [d3,a3,d4]@3 [d3,a3,d4]@3 ~@3", // E5 D5
  L: "[e3,b3,e4]@2 [e3,b3,e4] [g3,d4,g4]@2 ~ [e3,b3,e4]@2 [e3,b3,e4] [d3,a3,d4]@2 ~", // E5 G5 E5 D5
  M: "[e3,b3,e4]@2 [e3,b3,e4] [e3,b3,e4]@2 [e3,b3,e4] [e3,b3,e4]@2 [e3,b3,e4] [e3,b3,e4]@2 [e3,b3,e4]", // E5
  N: "[~@4 [a2,e3,a3]@6 [b2,f#3,b3]@11 ~ [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@7 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@3 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@3 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@3 ~@3 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@5 ~ [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@4 ~@2 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@5 ~ [e3,b3] ~@3 [e3,b3,e4]@2]/8", // A5 B5 E5 D5 E5 D5 E5 G5 …
  O: "[~@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@4 ~@2 [e3,b3] ~@3 [e3,b3,e4]@6 [e3,b3,e4]@2 [d3,a3,d4]@4 ~@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@4 [e3,b3,e4]@6 [e3,b3,e4]@2 [g3,d4,g4]@4 ~@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@4 [e3,b3,e4]@6 [e3,b3,e4]@2 [d3,a3,d4]@4 ~@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@4 [e3,b3,e4]@6 [e3,b3,e4]@2 [g3,d4,g4]@4 ~@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@4 [e3,b3,e4]@6 [g3,d4,g4]@2 [e3,b3,e4]@4 d3@2 [e3,b3,e4]@4 [g3,d4,g4]@2 [e3,b3,e4]@4 [e3,b3,e4]@6 [d3,a3,d4]@2 [e3,b3,e4]@4 d3@2 [e3,b3,e4]@4 [d3,a3,d4]@2 [e3,b3,e4]@4 [e3,b3,e4]@6 [d3,a3,d4]@2 [e3,b3,e4]@4 d3@2 [e3,b3,e4]@4 [d3,a3,d4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2]/8", // E5 G5 E5 D5 E5 D5 E5 G5 …
  P: "~@2 [g3,d4,g4] [e3,b3,e4]@2 d3 [e3,b3,e4]@2 [g3,d4,g4] [e3,b3,e4]@2 [d3,a3]", // G5 E5 G5 E5 D5
  Q: "[e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [g3,d4,g4]@3 ~@3 [e3,b3,e4]@3 ~ [d3,a3]@2", // E5 G5 E5 D5
  R: "[e3,b3,e4]@4 [e3,b3,e4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d3,a3,d4]@3 ~@3 [e3,b3,e4]@3 ~@3", // E5 D5 E5
  S: "[e3,b3,e4]@2 [e3,b3,e4] [g3,d4,g4]@2 ~@7", // E5 G5
})).s("gm_overdriven_guitar").gain(0.27).pan(0.3)

// other · tenor sax
const tenor_sax = note("<~@55 A@8 B@2 C D@2 ~@2 E F E F E G@8 H@8 I J K J L D M>".pickRestart({
  A: "[~@22 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 d3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 d3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@3 g3@3 ~@3]/8",
  B: "[e3@4 e3@2 e3@4 e3@2 e3@3 ~@3 d3@3 ~ e3@6 e3@2 e3@4 e3@2 e3@3 ~@3 g3@3 ~@3]/2",
  C: "e3@4 e3@2 e3@4 e3@2 e3@3 ~@3 d3@3 ~@3", D: "e3@2 e3 g3@2 ~ e3@2 e3 d3@2 ~", E: "e3@2 e3 e3@2 e3 d3@2 ~@4",
  F: "~@4 a2@2 a2@3 ~ b2@2 b2@3 ~@3 b2@3 ~@3",
  G: "[~@4 a2@2 a2@3 ~ b2@2 b2@3 ~@3 b2@3 ~ e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 e3@3 ~@7 e3@6 e3@2 e3@4 e3@2 d3@3 ~@7 e2@6 e2@2 e2@4 e2@2 d2@3 ~@7 e3@6 e3@2 e3@4 e3@2 g3@3 ~@7 e2@2]/8",
  H: "[~@4 e2@2 e2@4 e2@2 g2@3 ~@7 e3@6 e3@2 d3@4 ~@2 e2@4 e2@2 d2@3 ~ e3@6 e3@2 g3@4 ~@2 e2@4 e2@2 g2@3 ~ e3@6 e3@2 d3@4 ~@2 e2@4 e2@2 d2@3 ~ e3@6 e3@2 g3@4 ~@2 e2@4 e2@2 g2@3 ~ e3@6 g3@2 e3@4 ~@2 e2@4 g2@2 e2@3 ~ e3@6 d3@2 e3@4 ~@2 e2@4 d2@2 e2@3 ~ e3@6 d3@2 e3@4 ~@2 e2@4 d2@2 e2@3 ~ e3@2]/8",
  I: "~@4 g3@2 e3@4 ~@2 e2@4 g2@2 e2@3 ~@3", J: "e3@4 e3@2 e3@4 e3@2 g3@3 ~@3 e3@3 ~@3",
  K: "e3@6 e3@4 e3@2 d3@3 ~@3 e3@3 ~@3", L: "e3@4 e3@2 e3@4 e3@2 d3@3 ~@3 e3@2 ~@4", M: "e3@2 e3 g3@2 ~@7",
})).s("gm_tenor_sax").gain(0.37).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A@3 B A B A B A B A@3 B A B A B A B A@2 B A@3 B A B A B A B A@3 B A B A B A B A@2 B A@3 B A@3 B
  A@3 B A@2 B A B A B A@2 B A@3 B A@3 B A@3 B A B A B A B A B
>`.pickRestart({
  A: "x!2", B: "x ~@2 x!2 ~",
})).gain(0.5)

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

// drums · crash
const crash = s("cr").struct("<~@90 [~ x ~ x]!2 [~@3 x] [~ x ~@2] [~ x ~ x] [~@3 x] ~@2>").gain(0.22)

// drums · ride
const ride = s("rd").struct("<~@25 A@5 B ~@17 A@5 B ~@16 A@5 B ~@22>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~ x!2 ~ x!2 ~@2",
})).gain(0.39)

// drums · congas
const congas = s("conga:33").struct(`<
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]!91
  [x ~ x!2 ~ x!2 ~ x!2 ~@2]
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]!3
  [x ~ x!2 ~ x!2 ~ x!2 ~@2]
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]
  [x ~ x!2 ~ x!2 ~ x ~@3]
>`).gain(1.07)

stack(bass, overdriven_guitar, tenor_sax, kick, snare, crash, ride, congas)

More by Gary Glitter