Strudelify
I Love Rock 'n' Roll cover art

I Love Rock 'N' Roll

I Love Rock 'n' Roll

Jett

KeyE majorTempo95 bpm
0:00/0:00
// I Love Rock 'n' Roll — Jett
// 95 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 12 ms ahead of the beat; the grid follows it, so its parts stay together.
setcpm(95/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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass finger
const bass = note(`<
  ~ A B A C D E D E F G H I@3 ~ J K L M N O P Q P Q R S T@3 ~ U V W X W Y Z AA Z AA AB AC AD@4 ~@5 D AE H AE AF W X W AG
  L M N A S A AH
>`.pickRestart({
  A: "e2@2 e2@2 ~@4 e2@2 e2@2 ~ g2@3", B: "a1@2 a1@2 ~@4 b1@2 b1@2 ~ g2@3", C: "a1@2 a1@2 ~@4 b1@2 ~@2 e2 ~ e2@2",
  D: "~@6 e2!2", E: "~@4 d2@2 b1@2 a1 g1@3 e1@2 e1@2", F: "~@6 b1!2", G: "~@4 d2@2 b1@2 a1 g1@3 a1@2 a1@2",
  H: "~@2 b1!2 ~@2 e2!2", I: "[~ a1@8 ~@3]/3", J: "~@2 b1!6", K: "b1@2 b1@2 e2 ~ e2@2 ~@4 e2@2 e2@2",
  L: "~ g2@3 a1@2 a1@2 ~@4 b1@2 b1@2", M: "~@4 e2 ~ e2@2 ~@4 e2@2 e2@2", N: "~ g2@3 a1@2 a1@2 ~@4 b1@2 ~@2",
  O: "e2 ~ e2@2 ~@12", P: "e2@2 e2@2 ~@4 d2@2 b1 ~ a1 g1@3", Q: "e1!2 ~@6", R: "b1@2 b1@2 ~@4 d2@2 b1@2 a1 g1@3",
  S: "a1!2 ~@2 b1!2 ~@2", T: "[e2!2 ~@2 a1@16 ~@4]/3", U: "~@4 b1!4", V: "b1@2 b1@2 b1@2 b1@2 e2 ~ e2@2 ~@4",
  W: "e2@2 e2@2 ~ g2@3 a1@2 a1@2 ~@4", X: "b1@2 b1@2 ~@4 e2 ~ e2@2 ~@4", Y: "b1@2 ~@2 e2 ~ e2@2 ~@8",
  Z: "~@4 e2@2 e2@2 ~@4 d2@2 b1 ~", AA: "a1 g1@3 e1@2 e1@2 ~@8", AB: "~@2 b1!2 ~@2 d2 b1",
  AC: "a1 g1@3 a1@2 a1@2 ~@4 b1@2 b1@2", AD: "[~@2 e2!2 ~@2 a1@22 ~@4]/4", AE: "~@4 e2@2 e2@2 ~ g2@3 a1@2 a1@2",
  AF: "~@4 b1@2 ~@2 e2 ~ e2@2 ~@4", AG: "b1@2 ~@2 e2 ~ e2@2 ~@4 e2@2 e2@2", AH: "a1@2 a1@2 ~@4 b1@2 ~@2 e1@3 ~",
})).s("gm_electric_bass_finger").gain(0.5)

// other · overdriven guitar
const overdriven_guitar = note("<~@39 A B C D E F@3 ~@22>".pickRestart({
  A: "~@4 e2@8 g2 ~ f#2@2", B: "e2@3 ~ [e3,g#3,d4]@10 c#4@2", C: "e4 ~ f#4 ~ g#4@4 e5 ~ g#4@4 b4 ~",
  D: "[f#4,a#4]@2 [e4,b4] c#4 [f#4,b4]@6 b3!2 c#4@2 e4 ~", E: "b4@2 e4!2 a4@2 e4@2 d#4@2 c#4!2 b3@3 ~",
  F: "[a3@3 a3 g#3@4 f#3@2 e3 c#3 e3@32 ~@4]/3",
})).s("gm_overdriven_guitar").gain(0.61).pan(0.7)

// other · overdriven guitar
const overdriven_guitar_2 = note("<~@39 A B@3 C D E@2 ~@22>".pickRestart({
  A: "~ e2",
  B: "[g2 ~ f#2@2 e2@3 ~ [e3,g#3,d4]@10 c#4@2 e4 ~ f#4 ~ g#4@4 e5 ~ g#4@4 b4 ~ [f#4,a#4]@2 [e4,b4] c#4 [f#4,b4]@6 b3!2]/3", // E7 F# E5 B5
  C: "c#4@2 e4 ~ b4@2 e4!2 a4@2 e4@2 d#4@2 c#4!2", D: "b3@3 ~ a3@3 a3 g#3@4 f#3@2 e3 c#3", E: "e3/2",
})).s("gm_overdriven_guitar").gain(0.18).pan(0)

// chords · overdriven guitar
const overdriven_guitar_3 = note(`<
  ~ A B A C D E F E G H I J@3 ~ K L M N O P Q R S R T B U@3 ~ V W X Y X Z AA AB AC AB AD AE AF@3 ~@6 F AG AH AG AI X Y X
  AJ M N O A B A AK
>`.pickRestart({
  A: "[e2,b2,e3]!2 ~@2 [e2,b2,e3]!2 ~@2", B: "[a2,e3,a3]!2 ~@2 [b2,f#3,b3]!2 ~@2",
  C: "[a2,e3,a3]!2 ~@2 [f#3,b3] [e2,e3] [e3,b3,e4]!2, ~@2 b2 ~", D: "~@6 [e3,b3,e4]!2",
  E: "~@4 d3@2 b2 ~ a2 g2@3 [e2,b2,e3]@2 [e2,b2,e3]@2", F: "~@6 [e2,b2,e3]!2", G: "~@6 [b2,f#3,b3]!2",
  H: "~@4 d3@2 b2@2 a2 g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2", I: "~@2 [b2,f#3,b3]!2 ~@2 [e3,b3,e4]!2",
  J: "[~ [a2,e3]@8 ~@3, ~@2 a3@15 ~@7]/3", K: "~@2 [b2,f#3,b3]!6", L: "[b2,f#3,b3]!2 [e2,b2,e3]!2 ~@2 [e2,b2,e3]!2",
  M: "~@2 [a2,e3,a3]!2 ~@2 [b2,f#3,b3]!2", N: "~@2 [e2,b2,e3]!2 ~@2 [e2,b2,e3]!2",
  O: "~@2 [a2,e3,a3]!2 ~@2 [f#3,b3] [e2,e3], ~@3 b2", P: "[e3,b3,e4]!2 ~@6",
  Q: "[e3,b3,e4]@2 [e3,b3,e4]@2 ~@4 d3@2 b2 ~ a2 g2@3", R: "[e2,b2,e3]!2 ~@6",
  S: "[e2,b2,e3]@2 [e2,b2,e3]@2 ~@4 d3@2 b2@2 a2 g2@3", T: "[b2,f#3,b3]@2 [b2,f#3,b3]@2 ~@4 d3@2 b2@2 a2 g2@3",
  U: "[[e3,b3,e4]!2 ~@2 [a2,e3]@16 ~@4, ~@4 a3@15 ~@5]/3", V: "~@4 [b2,f#3,b3]!4", W: "[b2,f#3,b3]!4 [e2,b2,e3]!2 ~@2",
  X: "[e2,b2,e3]!2 ~@2 [a2,e3,a3]!2 ~@2", Y: "[b2,f#3,b3]!2 ~@2 [e2,b2,e3]!2 ~@2",
  Z: "[f#3,b3] [e2,e3] [e3,b3,e4]!2 ~@4, b2 ~@3", AA: "~@4 [e3,b3,e4]@2 [e3,b3,e4]@2 ~@4 d3@2 b2 ~",
  AB: "a2 g2@3 [e2,b2,e3]@2 [e2,b2,e3]@2 ~@8", AC: "~@2 [e2,b2,e3]!2 ~@2 d3 b2", AD: "~@2 [b2,f#3,b3]!2 ~@2 d3 b2",
  AE: "a2 g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2 ~@4 [b2,f#3,b3]@2 [b2,f#3,b3]@2", // A5 B5
  AF: "[~@2 [e3,b3,e4]!2 ~@2 [a2,e3]@16 ~@2, ~@2 a3@5 ~]/3", AG: "~@2 [e2,b2,e3]!2 ~@2 [a2,e3,a3]!2",
  AH: "~@2 [b2,f#3,b3]!2 ~@2 [e2,b2,e3]!2", AI: "~@2 [f#3,b3] [e2,e3] [e2,b2,e3]!2 ~@2, ~ b2 ~@2",
  AJ: "[f#3,b3] [e2,e3] [e2,b2,e3]!2 ~@2 [e2,b2,e3]!2, b2 ~@3", // B5 E E5
  AK: "[a2,e3,a3]@2 [a2,e3,a3]@2 ~@4 [f#3,b3]@2 [e2,e3]@2 [e2,b2,e3]@3 ~, ~@2 b2 ~", // A5 B5 E E5
})).s("gm_overdriven_guitar").gain(0.33).pan(0.1)

// chords · overdriven guitar
const overdriven_guitar_4 = note(`<
  ~ A B C D E F E F G H I J@3 ~ K@2 L M N O P O P O Q R S@3 ~ T U V W X Y Z AA Z AA AB AC AD@3 ~@6 AE AF AG AH AI V W X
  AJ L M N A R C AK
>`.pickRestart({
  A: "[e2,b2,e3]@2 [e2,b2,e3]@2 ~@4 [e2,b2,e3]@2 [e2,b2,e3] ~@2 g2@3", // E5
  B: "[a2,e3,a3]@2 [a2,e3,a3]@2 ~@4 [b2,f#3,b3]@2 [b2,f#3,b3]@2 ~ g2@3", // A5 B5
  C: "[e2,b2,e3]@2 [e2,b2,e3]@2 ~@4 [e2,b2,e3]@2 [e2,b2,e3]@2 ~ g2@3", // E5
  D: "[a2,e3,a3]!2 ~@2 [b2,f#3] [e2,b2] [e3,b3,e4]!2", E: "~@6 [e3,b3,e4]!2",
  F: "~@4 d5@2 b4@2 a4 g4@3 [e3,b3,e4]@2 [e3,b3,e4]@2", G: "~@6 [b2,f#3,b3]!2",
  H: "~@4 d5@2 b4 ~ a4 g4@3 [a2,e3,a3]@2 [a2,e3,a3]@2", I: "~@2 [b2,f#3,b3]!2 ~@2 [e3,b3,e4]!2",
  J: "[~ [a2,e3]@8 ~@3, ~@4 a3@29 ~@15]/3", // A5
  K: "[~@4 [f#3,b3]@2 [f#3,b3]@2 [f#3,b3]@2 [f#3,b3]@2 [b2,f#3,b3]@2 [f#3,b3]@2 [f#3,b3]@2 [b2,f#3,b3]@2 [e2,b2,e3]@2 [e2,b2,e3]@2 ~@4 [e2,b2,e3]@2 [e2,b2,e3] ~, ~@2 b2@4 ~ b2@2 ~@7]/2", // B5 E5
  L: "~ g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2 ~@4 [b2,f#3,b3]@2 [b2,f#3,b3]@2", M: "~@2 [e2,b2,e3]!2 ~@2 [e2,b2,e3]!2",
  N: "~ g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2 ~@4 [b2,f#3]@2 [e2,b2]@2", O: "[e3,b3,e4]!2 ~@6",
  P: "[e3,b3,e4]@2 [e3,b3,e4]@2 ~@4 d5@2 b4@2 a4 g4@3", Q: "[b2,f#3,b3]@2 [b2,f#3,b3]@2 ~@4 d5@2 b4 ~ a4 g4@3",
  R: "[a2,e3,a3]!2 ~@2 [b2,f#3,b3]!2 ~@2", S: "[[e3,b3,e4]!2 ~@2 [a2,e3]@16 ~@4, ~@8 a3@29 ~@11]/3",
  T: "~@4 [f#3,b3]!4, ~ b2", U: "[b2,f#3,b3] [f#3,b3]!2 [b2,f#3,b3] [e2,b2,e3]!2 ~@2, ~ b2@2 ~@5",
  V: "[e2,b2,e3]@2 [e2,b2,e3] ~@2 g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2 ~@4", W: "[b2,f#3,b3]!2 ~@2 [e2,b2,e3]!2 ~@2",
  X: "[e2,b2,e3]@2 [e2,b2,e3]@2 ~ g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2 ~@4", Y: "[b2,f#3] [e2,b2] [e3,b3,e4]!2 ~@4",
  Z: "~@2 [e3,b3,e4]!2 ~@2 d5 b4", AA: "a4 g4@3 [e3,b3,e4]@2 [e3,b3,e4]@2 ~@8",
  AB: "~@4 [b2,f#3,b3]@2 [b2,f#3,b3]@2 ~@4 d5@2 b4 ~", // B5
  AC: "a4 g4@3 [a2,e3,a3]@2 [a2,e3,a3]@2 ~@4 [b2,f#3,b3]@2 [b2,f#3,b3]@2", // A5 B5
  AD: "[~@2 [e3,b3,e4]!2 ~@2 [a2,e3]@16 ~@2, ~@12 a3@29 ~@7]/3", AE: "~@6 [e2,b2,e3]!2",
  AF: "~@4 [e2,b2,e3]@2 [e2,b2,e3] ~@2 g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2", AG: "~@2 [b2,f#3,b3]!2 ~@2 [e2,b2,e3]!2",
  AH: "~@4 [e2,b2,e3]@2 [e2,b2,e3]@2 ~ g2@3 [a2,e3,a3]@2 [a2,e3,a3]@2", AI: "~@2 [b2,f#3] [e2,b2] [e2,b2,e3]!2 ~@2",
  AJ: "[b2,f#3]@2 [e2,b2]@2 [e2,b2,e3]@2 [e2,b2,e3]@2 ~@4 [e2,b2,e3]@2 [e2,b2,e3] ~", // B5 E5
  AK: "[a2,e3,a3]!2 ~@2 [b2,f#3] [e2,b2] [e3,b3,e4] ~", // A5 B5 E5
})).s("gm_overdriven_guitar").gain(0.33).pan(0.9)

// drums · kick
const kick = s("bd").struct("<~ A@3 B C@11 D E C@3 A@11 F G A@3 H C@19 I A@3 H C@3 A@3 J>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2", B: "x!2 ~@2 x!4", C: "~@2 x!2 ~@2 x!2", D: "~ x!3", E: "x ~ x!2 ~@2 x!2", F: "x!2 ~@2 x ~ x ~",
  G: "x ~ x ~ x!2 ~@2", H: "x!4 ~@2 x!2", I: "~@2 x!4 ~@2", J: "x!2 ~@2 x!3 ~",
})).gain(0.59)

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

// drums · clap
const clap = s("cp").struct("<~ A@3 B C@16 A@16 D C@19 E A@3 D C@3 A@4>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "x!2", D: "~ x", E: "x ~@2 x",
})).gain(0.59)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@4 A ~ B ~ B ~@4 B ~@2 C ~@3 B ~@2 D ~@6 D E F ~@4 D ~ G ~@6 G B@2 ~@8 G ~@3 D ~@2 B ~@3 E
>`.pickRestart({
  A: "~ x ~@3 x ~@2", B: "~@7 x", C: "~@3 x ~ x ~@2", D: "~ x ~@6", E: "~@5 x ~@2", F: "~@5 x ~ x", G: "~@3 x ~@4",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@17 [~ x ~@2] ~@15 [~ x] ~@35>").gain(0.35)

stack(
  bass, overdriven_guitar, overdriven_guitar_2, overdriven_guitar_3, overdriven_guitar_4, kick, snare, clap, hihat,
  hihat_soft, crash
)

More by Jett