Strudelify

Roll Over Beethoven

Chuck Berry

KeyC majorTempo173 bpm
0:00/0:00
// Roll Over Beethoven — BERRY CHUCK
// 173 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 87 bars on a 24-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): OVERDRIVE.
setcpm(173/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@5 A B C@2 D@2 E F E@4 G@2 C@2 D@2 E F E@4 G@2 C@2 D@2 E@6 G@2 C@2 D@2 E@6 G@2 C@2 D@2 E F E@4 G@2 C@2 D@2 E@6 G@2
  C@2 D@2 H I@2 ~
>`.pickRestart({
  A: "f2@2 f2 d3@2 f2 c3@3 d3@3", B: "f2@2 f2 d3@2 f2 c3@2 c3 d3@2 f2", C: "c2@2 c2 a2@2 c2 a#2@2 c2 a2@2 c2",
  D: "d3@2 g2 e3@2 g2 f3@2 g2 e3@2 g2", E: "c2@2 g2 a2@2 c2 a#2@2 c2 a2@2 c2", F: "c2@2 g1 g1@2 g1@5 ~ g1",
  G: "f2@2 f2 d3@2 f2 d#3@2 c3 d3@2 f2", H: "c2@7 ~@17", I: "[~@9 c2@37 ~@2]/2",
})).s("gm_acoustic_bass").gain(0.33)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@5 A B C D E F G H G I@2 G A B C D E F G J K L M N K O P Q R S T U@2 V M N W O P Q R S T X G@2 I G A Y C D E F I Z ~
  AA M AB ~ AC P Q R S T U@2 V M N W O P Q R S AD ~@3
>`.pickRestart({
  A: "[c5,f5,c6] ~@2 [c5,f5,c6] ~@2 [c5,f5,c6] ~@2 [c5,f5] ~@2 [c5,f5,c6]@2 ~ [c5,f5,c6]@2 ~ [c5,f5,c6] ~@2 [c5,f5] ~@2, ~@9 c6@2 ~@10 c6@2 ~", // F5
  B: "[c5,f5,c6]@2 ~ [c5,c6]@2 ~ [c5,f5,c6] ~@2 [c5,f5] ~@2 [c5,c6]@2 ~ [c5,f5] ~@2 [f5,c6]@2 ~ [f5,c6]@2 ~, ~@3 f5 ~@5 c6@2 ~ f5 ~@2 c6@2 ~ c5 ~@2 c5 ~@2", // F5 C F5 C F5
  C: "[c5,g5,c6]@2 ~ [c5,g5] ~@2 [c5,g5,c6]@2 ~ [g5,c6]@2 ~ [g5,c6]@2 ~ [c5,g5] ~@2 [c5,g5] ~@2 [c5,g5] ~@2, ~@3 c6@2 ~@4 c5 ~@2 c5 ~@2 c6@2 ~ c6@2 ~ c6@2 ~", // C5
  D: "[c5,g5] ~@2 [c5,g5] ~@2 [c5,g5] ~@2 [c5,g5] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [g5,c6] ~@2, c6@2 ~ c6@2 ~ c6@2 ~ c6@2 ~@10 c5@2 ~", // C5
  E: "[d5,g5]@2 ~ [d5,d6] ~@2 [d5,d6] ~@2 [d5,d6] ~@2 [g5,d6]@2 ~ [d5,d6] ~@2 [d5,d6] ~@2 [d5,d6] ~@2, d6 ~@2 g5@2 ~ g5@2 ~ g5@2 ~ d5 ~@2 g5@2 ~ g5@2 ~ g5@2 ~", // G5 D G5 D
  F: "[d5,g5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6] ~@2", // G5
  G: "[c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [c5,c6] ~@2 [c5,g5] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2, ~@9 g5@2 ~ c6@2 ~@10", // C5 C C5
  H: "[d5,d6] ~@2 [d5,d6] ~@2 [d5,g5]@2 ~ [d5,d6] ~@2 [d5,d6] ~@2 [d5,d6] ~@2 [d5,g5,d6] ~@2 [d5,g5,d6]@2 ~, g5@2 ~ g5@2 ~ d6 ~@2 g5@2 ~ g5@2 ~ g5@2 ~@7", // D G5 D G5
  I: "[c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [c5,c6] ~@2 [c5,g5] ~@2 [c5,g5,c6] ~@2 [c5,g5,c6] ~@2 [g5,c6] ~@2, ~@9 g5@2 ~ c6@2 ~@7 c5@2 ~", // C5 C C5
  J: "[d5,d6] ~@2 [d5,d6] ~@2 [d5,g5]@2 ~ [d5,d6] ~@2 [d5,d6] ~@2 [d5,d6] ~@2 d#6@2 e6@2 g6 ~, g5@2 ~ g5@2 ~ d6 ~@2 g5@2 ~ g5@2 ~ g5@2 ~@7", // D G5 D
  K: "[g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~ [g6,c7] ~", // C5
  L: "[g6,c7] ~@3 a#6@2 g6@4 [f6,c7]@3 ~@3 [f#6,c7]@2 f6@4 [c6,c7] ~", M: "[d#6,c7] ~ [e6,c7] [f6,c7]@2 ~@6 c6",
  N: "[d#6,c7]@4 [e6,c7]@2 [f6,c7]@4 [d#6,c7]@2 [e6,c7]@4 [c6,c7]@2 d#6@2 e6@2 g6 ~", // Cm C F5 Cm C
  O: "[g6,c7] ~@3 a#6@2 f6@4 c6@2 [d#6,c7]@3 ~ e6@2 [f6,c7]@4 ~@2", // C5 Cm F5
  P: "~@6 c6 ~@3 [d#6,f#6]@2 ~@4 c6@3 ~@3 c6@2, ~@4 [f6,a6]@5 ~@3 [e6,g6]@6 ~@6", // D#m F Em
  Q: "d#6@3 ~ e6@2 a6@4 [d#6,f#6]@2 [e6,g6]@4 c6@3 ~@5, ~@3 f6 ~@8", R: "[d6,g6]@3 g5 ~ [d6,g6]@3 ~@3 g5",
  S: "c6 ~@5 g5@2 ~@2 c#6@2 [d6,f6]@4 [g5,g6]@3 ~@5, ~ [d6,g6] ~@4", // Dm G G5
  T: "[g5,c6]@2 ~@2 [g5,c6]@3 ~@9 [f5,c6]@4 ~@2 d#5@2", // C5 F5
  U: "[[e5,c6]@4 [c5,c6]@5 ~@3 g5@3 ~ g5@5 ~ g6@5 ~ d6@2 [d#6,f#6]@3 ~ [d#6,f#6]@2 [e6,g6]@3 ~ c6 ~ [d#6,f#6]@3 ~ [e6,g6]@2]/2", // C D#m Em D#m Em
  V: "c7@3 ~ a#6@2 g6@4 [f6,c7]@3 ~@3 [f#6,c7]@2 f6@4 [c6,c7] ~, g6 ~@23", // F5 F#dim C
  W: "[g6,c7]@4 g6@2 a#6@3 ~ [g6,c7]@2 f6@2 ~@4 [g6,c7]@4 [g6,a#6]@2", X: "[e5,c6]@4 [c5,c6]@5 ~@15",
  Y: "[c5,f5,c6]@2 ~ [c5,c6]@2 ~ [c5,f5,c6] ~@2 [c5,f5] ~@2 [c5,c6]@2 ~ [c5,c6]@2 ~ [f5,c6]@2 ~ [f5,c6]@2 ~, ~@3 f5 ~@5 c6@2 ~ f5 ~@2 f5 ~@2 c5 ~@2 c5 ~@2", // F5 C F5 C F5
  Z: "[d5,d6] ~@2 [d5,d6] ~@2 [d5,g5]@2 ~ [d5,d6] ~@2 [d5,d6] ~@2 [d5,d6] ~@2 d6@2 ~@4, g5@2 ~ g5@2 ~ d6 ~@2 g5@2 ~ g5@2 ~ g5@2 ~@7", // D G5 D
  AA: "~@4 a#6@2 g6@4 [f6,c7]@3 ~@3 [f#6,c7]@2 f6@4 [c6,c7] ~", // F5 F#dim C
  AB: "[d#6,c7]@4 [e6,c7]@2 [f6,c7]@4 [d#6,c7]@2 [e6,c7]@4 [c6,c7]@3 ~@5", // Cm C F5 Cm C
  AC: "~@4 a#6@2 f6@4 c6@2 [d#6,c7]@3 ~ e6@2 [f6,c7]@4 ~@2", AD: "[g5,c6]@13 ~@11",
})).s("gm_piano").gain(0.21).pan(0.3)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  A B C D@2 E@2 F G H@2 I J ~@35 K L@2 M@2 N@2 O P@2 Q@2 R ~@21 S T U@2 ~
>`.pickRestart({
  A: "~@5 e4 g4 a4", B: "[g4,c5]@3 [g4,c5]@2 ~ [g4,c5]@3 [g4,c5]@2 ~ [g4,c5]@3 [g4,c5]@2 ~ [g4,c5]@3 [g4,c5]@2 ~",
  C: "[g4,c5]@3 a#4@3 a4@3 d#4@3 e4@3 c4@2 ~ c4@3 c4@3", // C5
  D: "[g4@6 g4@3 g4@6 g4@2 ~ g4@6 g4@3 g4@6 g4@2 ~ [g4,c5]@6 [g4,c5]@6, ~@9 c5@8 ~ c5@9 c5@8 ~@13]/2", // C5
  E: "[[g4,c5]@6 [g4,c5]@6 g4@6 g4@3 g4@6 g4@2 ~ g4@6 g4@3 g4@2 ~ g4@3 f4@3, ~@12 c5@9 c5@8 ~ c5@9 ~@9]/2", // C5
  F: "[e4,c5]@2 [g4,c5]@2 [g4,c5]!2 [f4,a4] d#4", G: "e4@2 [g4,c5]@2 [g4,c5]!2 [f4,a4] e4",
  H: "[g4@6 g4@3 g4@6 g4@2 ~ g4@6 g4@3 g4@6 g4@2 ~ [d4,g4]@6 f4@3 e4@3, d4@9 d4@8 ~ d4@9 d4@8 ~@13]/2", // G5
  I: "c4@2 [g4,c5]@2 [g4,c5]!2 [f4,a4] d#4", J: "e4 [g3,d4]@2 [g3,d4]@4 ~",
  K: "~@3 g4@2 ~ g4@3 g4@2 ~ g4@3 g4@2 ~ g4@3 g4@2 ~",
  L: "[g4 ~@5 g4@3 g4@6 g4@2 ~ g4@6 g4@3 g4@6 g4@2 ~ [g4,c5]@3 [g4,c5]@3 f4@3 d#4@3, ~@9 c5@8 ~ c5@9 c5@8 ~@7 c5@6]/2", // C5
  M: "[e4@3 c4@9 g4@6 g4@3 g4@6 g4@2 ~ g4@6 g4@3 g4@6 g4@2 ~, c5@6 ~@15 c5@8 ~ c5@9 c5@8 ~]/2",
  N: "[[g4,c5]@6 [g4,c5]@6 [g4,c5]@6 [g4,c5]@3 [g4,c5]@6 [g4,c5]@2 ~ [g4,c5]@6 [g4,c5]@3 [g4,c5]@3 f4@3 d#4@3, ~@7 c5]/2", // C5
  O: "e4@3 c4@3 c5@3 c5@2 ~ c5@3 d#4@3 e4@3 c4@3, c5 ~@3",
  P: "[c5@3 c5@2 ~ c5@3 d#4@3 e4@3 c4@3 c5@12 [a4,c5]@6 [f4,a4]@3 [e4,g4]@3 e4@3 c4@3]/2", // Am F Em
  Q: "[[a4,c5]@2 [a4,c5]!2 [f4,a4] [e4,g4] e4 c4@3 [g4,c5]!2 a4 g4 d#4 e4]/2", R: "c4 g3@2 g3@2 ~@3", S: "~@21 c4@2 ~",
  T: "[g4,c5]@6 a#4@3 a4@2 ~ [f#4,c5]@3 g4@2 ~ [c4,g4]@6", // C5 F#dim C5
  U: "[[c4,g4]@3 [c4,g4]@2 ~ [b3,g4]@3 ~ [g4,c5]@38, ~@9 [a#3,e4]@38 ~]/2", // C5 Em C5 A#dim
})).s("gm_electric_guitar_clean").gain(0.29).pan(0.6)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@25 A@3 B C@2 D@2 E@2 A B A@3 B C@2 D@2 E@2 A B ~@12 A@3 B C@2 D@2 E@2 A B A@3 B C@2 D@2 E F G H@2 ~
>`.pickRestart({
  A: "a#3@2 ~ a#3@2 ~ a#3@2 ~ a#3@2 ~", B: "a#3@4 a#3@5 ~ a#3@5 ~ a#3@2 a#3@4 ~@2", C: "~@3 c4@2 ~@4 c4@2 ~",
  D: "[a#3@4 ~@2 a#3@4 ~@2 a#3@4 a#3@4 ~@2 a#3@6 ~@2 a#3@4 ~@2 a#3@9 ~@3]/2", E: "~@6 d4@5 ~@7 d4@5 ~",
  F: "~@6 d4@5 ~@10 c4@2 ~, ~@18 d4@5 ~", G: "~@6 a#4@3 a4@2 ~ [f#4,c5]@3 g4@2 ~ [c4,g4]@6",
  H: "[[c4,g4]@3 [c4,g4]@2 ~ [b3,g4]@3 ~ [g4,c5]@38, ~@9 [a#3,e4]@38 ~]/2", // C5 Em C5 A#dim
})).s("gm_overdriven_guitar").gain(0.14).pan(0.6)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean_2 = note(`<
  ~@5 A@2 B@2 C@2 B D B@4 A@2 B@2 C@2 B D B@4 A@2 B@2 C@2 B@6 A@2 B@2 C@2 B@6 A@2 B@2 C@2 B D B@4 A@2 B@2 C@2 B@6 A@2
  B@2 C@2 E ~@3
>`.pickRestart({
  A: "[f3,c4]@2 [f3,c4] [f3,d4]@2 [f3,d4] [f3,c4]@2 [f3,c4] [f3,d4]@2 [f3,d4]", // F5 Dm F5 Dm
  B: "[c3,g3]@2 [c3,g3] [c3,a3]@2 [c3,a3] [c3,g3]@2 [c3,g3] [c3,a3]@2 [c3,a3]", // C5 F C5 F
  C: "[g3,d4]@2 [g3,d4] [g3,e4]@2 [g3,e4] [g3,d4]@2 [g3,d4] [g3,e4]@2 [g3,e4]", // G5 C G5 C
  D: "[d3,g3]@2 [d3,g3] [d3,g3]@2 [d3,g3] [d3,g3]@2 [d3,g3] [d3,g3]@2 [d3,g3]", E: "[c3,g3]@7 ~@17",
})).s("gm_electric_guitar_clean").gain(0.2).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~@5 [x!2]!78 x [~@3 x ~@4] ~ x>").gain(0.45)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@4 A ~@7 A ~@11 B ~@3 A ~@7 C ~@11 C D E F ~@8 C ~@11 A ~@9 A ~@4>".pickRestart({
  A: "~@16 x!2 ~@6", B: "~@4 x!2 ~@4 x!2 ~@4 x!2 ~@6", C: "~@4 x!2 ~@13 x ~@4", D: "~@2 x", E: "~@5 x ~@6",
  F: "~@2 x ~@8 x",
})).gain(0.28)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@86 x>").gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@52 [~@16 x!3 ~@5] ~@34>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@25 A ~@11 A ~@11 A ~@3 A ~@7 A ~@22 B C ~>".pickRestart({
  A: "x", B: "~@9 x ~@6 x ~ x!2 ~ x!2 ~", C: "x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~@11",
})).gain(0.11)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@84 [~@13 x ~ x ~@8] [~@13 x ~ x!2 ~ x!2 ~@4] ~>").gain(0.06)

// drums · ride
const ride = s("rd").struct("<~@4 A B@7 C B@11 D E B@10 F E B@10 D E B@3 E B@6 F E B@10 C B@9 C D ~@3>".pickRestart({
  A: "~@11 x", B: "x ~ x!2 ~ x!2 ~ x!2 ~ x", C: "x ~ x!2 ~ x!2 ~@5", D: "x", E: "~@2 x!2 ~ x!2 ~ x!2 ~ x", F: "x!2 ~@4",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [x ~ x!2 ~ x!2 ~ x!2 ~ x]!78 x ~@3>").gain(0.23)

stack(
  bass, piano, electric_guitar_clean, overdriven_guitar, electric_guitar_clean_2, kick, snare, snare_soft, pedal_hat,
  mid_tom, crash, crash_soft, ride, tambourine
)

More by Chuck Berry