Strudelify

Rock 'n' Roll Is King

Electric Light Orchestra

KeyA majorTempo160 bpm
0:00/0:00
// Rock 'n' Roll Is King — Electric Light Orchestra
// 160 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 12 "MELO TOM 1" (melodic tom patch on one pitch) is played as the kit's tom
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): OVERDRIVE.
setcpm(160/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.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@4 A@10 B C D@2 A@3 C A@8 B C D@2 A@3 C A E F G H E I G J K ~ A@6 B C D@2 A@3 C A@6 D@2 A@2 D@2 A L A C A E F G H E I
  G J K ~ A@6 B C D@2 A@3 C A@3 C M ~ A C M ~ A C M ~ A C N O@2
>`.pickRestart({
  A: "a1 c#2 e2 f#2", B: "e2 g#2 b2 c#3", C: "e2 d2 c#2 b1", D: "d2 f#2 a2 b2", E: "a1!2 b1 c#2",
  F: "d2@3 ~ d2@3 ~ d2@4 d2@4", G: "a1!4", H: "e2!4", I: "d2@3 ~ d2@4 d2@4 d2@4", J: "b1!4", K: "e2 ~@3",
  L: "f#2!2 c#2 a1", M: "a1 ~@3", N: "a1 c#2 d2 d#2", O: "[e2@2 f#2@2 g#2@3 a2@21 ~@4]/2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@24 A@6 B@2 C@2 A@3 B A D E F G H E F I J ~ A@6 B@2 C@2 A@3 B A@6 C@2 A@2 C@2 A K A B A D E F G H E F I J ~ A@6 B@2
  C@2 A@3 B A@3 B L ~ A B L ~ A B L ~ A B M N ~
>`.pickRestart({
  A: "[c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~", // A
  B: "[e5,g#5,b5] ~ [e5,g#5,b5] ~ [e5,g#5,b5] ~ [e5,g#5,b5] ~ [e5,g#5,b5] ~ [e5,g#5,b5] ~ [e5,g#5,b5] ~ [e5,g#5,b5] ~", // E
  C: "[d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~", // D
  D: "[c#5,e5,a5]@3 ~ [c#5,e5,a5]@3 ~ [d5,f#5,b5]@3 ~ [e5,a5,c#6]@3 ~", E: "[f#5,a5,d6]@15 ~", F: "[e5,a5,c#6]@15 ~",
  G: "[b4,e5,g#5]@15 ~", H: "[c#5,e5,a5]@15 ~", I: "[d#5,f#5,b5]@15 ~", J: "[b4,e5,g#5]@3 ~@13",
  K: "[c#5,f#5,a5] ~ [c#5,f#5,a5] ~ [c#5,f#5,a5] ~ [c#5,f#5,a5] ~ [c#5,f#5,a5] ~ [c#5,f#5,a5] ~ [c#5,f#5,a5] ~ [c#5,f#5,a5] ~", // F#m
  L: "[c#5,e5,a5] ~@15", M: "[c#5,e5,a5] ~@3 [c#5,e5,a5]@4 [d5,f#5,a5]@4 [d5,f#5,a5]@4",
  N: "[b4,e5,g#5]@2 [b4,e5,g#5]@2 [b4,e5,g#5]@3 [c#5,e5,a5]@5 ~@4", // E A
})).s("gm_piano").gain(0.29).pan(0.6)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@65 A B A C ~@6 D E ~@46>".pickRestart({
  A: "[a4,b4,d5] [a4,c#5,e5] [a4,c#5,e5]@2 [a4,b4,d5] [a4,c#5,e5] [a4,c#5,e5]@2", // Bm7 A Bm7 A
  B: "[a4,b4,d5] [a4,c#5,e5] [a4,c#5,e5]@2 [a4,b4,d5] [a4,c#5]@3", // Bm7 A Bm7 A
  C: "[a4,b4,d5] [a4,c#5,e5] [a4,c#5,e5]@2 [a4,b4,d5] [a4,c#5]@2 ~", D: "[b4,e5] [c#5,e5]!3 [b4,e5] [c#5,e5]!3",
  E: "[b4,f#5] [c#5,a5] [c#5,f#5] [c#5,e5] [b4,f#5] [c#5,e5] [a4,c#5]@2", // B5 F#m F#5 C#m B5 C#m A
})).s("gm_string_ensemble_1").gain(0.4).pan(0.6)

// chords · overdriven guitar · "OVERDRIVE" · C5 A5
const overdriven_guitar = note(`<
  ~@69
  [[g4,c5] ~ [g4,c5]!2 ~ [g4,c5]!2 ~]
  [~ [g4,c5]!2 ~ [g4,c5] ~@3]
  ~@2
  [e4@2 e4@2 e4@2 e4@2 e4@2 e4@3 ~@3]
  [e4@2 e4@2 [a3,e4,a4]@2 [a3,e4,a4]@2 e4@3 ~@5]
  ~@48
>`).s("gm_overdriven_guitar").gain(0.19).pan(0.6)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@2 A@6 B@2 C B@3 D E F G B@3 D A@2 B@2 C B@3 D E F G B@3 D A H I J K J I J L M ~ B@2 C B@3 D E F G B@3 D B@4 C B F G
  B@2 F G B N B D A H I J K J I J L M ~ B@2 C B@3 D E F G B@3 D B@3 D O ~ B D O ~ B D O ~ B D P Q@2
>`.pickRestart({
  A: "[a2,e3]@2 [a2,e3] [a2,e3]@2 [a2,e3]!3", B: "[e3,a3]!8", C: "[e3,a3] [e3,a3,c#4] [e3,a3]!2 [e3,a3,c#4] [e3,a3]!3",
  D: "[b2,e3]!8", E: "[b2,e3]!7 [d3,a3]", F: "[d3,a3]!8", G: "[a3,d4]!2 [b3,d4]!2 [a3,d4]!2 [b3,d4]!2",
  H: "[a2,e3]!2 [b2,e3] [c#3,e3]", I: "[a2,d3]!2 [d3,a3]!2 [a2,d3]!2 [d3,a3]!2",
  J: "[a2,e3]!2 [e3,a3]!2 [a2,e3]!2 [e3,a3]!2", K: "[b2,e3]!2 [e3,b3]!2 [b2,e3]!2 [e3,b3]!2",
  L: "[b2,f#3]!2 [f#3,b3]!2 [b2,f#3]!2 [f#3,b3]!2", M: "[b2,e3]@3 ~@13", N: "[f#3,a3]!8", O: "[e3,a3] ~@7",
  P: "a2 c#3 d3 d#3", Q: "[~@2 c#3@2 b2@2 ~ [a3,c#4]@21 ~@4, e3@4 ~@2 [a2,e3]@21 ~@5]/2",
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.8)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean_2 = note(`<
  ~@4 A@10 B@2 C@2 A@3 B A@2 D@6 E@2 F@2 D@3 E D G H I J I H I K L ~ A@6 B@2 C@2 A@3 B A@2 D@4 F@2 D@2 F@2 D M D E D G H
  I J I H I K L ~ A@6 B@2 C@2 A@3 B A@3 B N ~ A B N ~ A B N ~ A B O@3
>`.pickRestart({
  A: "[a2,e3]!2 [a2,f#3]!2 [a2,e3]!2 [a2,f#3]!2", B: "[e2,b2]!2 [e2,c#3]!2 [e2,b2]!2 [e2,c#3]!2",
  C: "[a2,d3]!2 [b2,d3]!2 [a2,d3]!2 [b2,d3]!2", D: "[e2,a2]!2 [a2,c#3]!2 [a2,e3]!2 [a2,f#3]!2",
  E: "[e2,b2]!2 [e2,g#2]!2 [e2,b2]!2 [e2,c#3]!2", F: "[a2,d3]!2 [d3,f#3]!2 [d3,a3]!2 [d3,b3]!2",
  G: "[e2,a2]!4 [e2,b2]!2 [a2,c#3]!2", H: "[a2,d3]!2 [d3,a3]!2 [a2,d3] [d3,a3] [d3,a3]@2",
  I: "[a2,e3]!2 [e3,a3]!2 [a2,e3] [e3,a3] [e3,a3]@2", J: "[e2,b2]!2 [b2,e3]!2 [e2,b2] [b2,e3] [b2,e3]@2",
  K: "[f#2,b2]!2 [b2,f#3]!2 [f#2,b2] [b2,f#3] [b2,f#3]@2", L: "[e2,b2] ~@7",
  M: "[f#2,a2]!2 [a2,c#3]!2 [a2,e3]!2 [a2,f#3]!2", N: "[a2,e3] ~@7",
  O: "[[a2,e3]@2 a4@2 c#4@2 a4@2 d4@2 a4@2 d#4@2 ~@2 e3@2 f#3@2 g#3@2 ~ [e4,a4]@21 ~@4, a3@2 ~@5 a4@2 ~@2 [a3,c#4]@11 ~@2]/3", // A5 A
})).s("gm_electric_guitar_clean").gain(0.18).pan(0.2)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean_3 = note("<~@71 A B ~@4 C D E@2 ~@42>".pickRestart({
  A: "~ [a3,c#4]@2 f#4", B: "a4@2 f#4@4 a4@7 ~@3", C: "~@2 f#4@3 c#4@3, a2", D: "~@2 e4@2 d4 e4@3, e2@13 ~@3",
  E: "[~@4 c#4@4 ~@2 f#4@3 ~ f#4@9 ~@9, a2 ~, ~@4 a3@5 ~@7]/2",
})).s("gm_electric_guitar_clean").gain(0.48).pan(0.3)

// other · tinkle bell · "TINKLEBELL"
const tinkle_bell = note("<A@8 ~@39 A@2 ~@39 A@2 ~@18 A@2 ~@2 A@2 ~@9>".pickRestart({
  A: "~@4 e6 ~ e6 ~@5 e6 ~@3",
})).s("gm_tinkle_bell").gain(0.18).pan(0.8)

// drums · kick
const kick = s("bd").struct("<A@4 B@104 A@2 B@2 A@2 B@2 A ~ B@2 C D ~>".pickRestart({
  A: "x", B: "x!2", C: "x ~@3 x!2 ~@2", D: "x ~@6 x ~@8",
})).gain(0.53)

// drums · snare
const snare = s("sd").struct("<A@4 B@43 A@2 B@15 C B@23 A@2 B@15 C B@2 A@2 B@2 A@2 B@2 ~@2 B@3 D ~>".pickRestart({
  A: "~@2 x!2 ~@2 x ~", B: "~ x ~ x", C: "~ x!2 ~@2 x!3", D: "~ x!2 ~@5",
})).gain(0.47)

// drums · hihat
const hihat = s("hh").struct("<A B@3 A B@17 A B@16 C B@24 C B@15 ~ B@24 C A B@3 A B@3 A B D ~ A B@2 ~@2>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!2 ~@6", D: "x",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@39 A ~@24 B ~@40 B ~@15 C ~>".pickRestart({
  A: "~ x ~@2", B: "~@2 x ~@2 x!3", C: "x",
})).gain(0.35)

// drums · mid tom
const mid_tom = s("mt").struct("<~@41 A ~ A ~ A ~@36 A ~ A ~ A ~@36>".pickRestart({
  A: "~ x!2 ~",
})).gain(0.59)

// drums · crash
const crash = s("cr").struct("<A ~@3 A ~@17 A ~@16 B ~@40 C ~@25 A ~@3 A ~@3 A ~@3 A ~@2 D ~>".pickRestart({
  A: "x", B: "~@2 x!2", C: "x!4", D: "~@7 x ~@8",
})).gain(0.24)

// drums · ht
const ht = s("ht").struct("<A B A B ~@104 A B ~@2 A B ~@2 C ~@6>".pickRestart({
  A: "x!2 ~@2 x ~@3", B: "x!2 ~@2 x!2 ~@2", C: "x",
})).gain(0.24)

stack(
  bass, piano, string_ensemble_1, overdriven_guitar, electric_guitar_clean, electric_guitar_clean_2,
  electric_guitar_clean_3, tinkle_bell, kick, snare, hihat, open_hat, mid_tom, crash, ht
)

More by Electric Light Orchestra