Strudelify
I Should Have Known Better cover art

A Hard Day's Night

I Should Have Known Better

The Beatles

KeyC majorTempo132 bpm
0:00/0:00
// I Should Have Known Better — The Beatles
// 132 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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(`<
  A@2 B@2 C@2 B@2 D@2 E F C@6 G H I J K L M N O@2 P Q R S T U E V W@2 C@2 B@2 D@2 E F C@4 B@2 D@2 E F C@6 G H I J K L M
  N O@2 P Q R S T U E V W@8 X@2 ~@2
>`.pickRestart({
  A: "[c3@3 ~ c3@4 g2 ~ g2 ~ b2 ~ c3@5 ~ c3@3 ~ g2 ~ g2@2 a2 ~ b2 ~]/2",
  B: "[c3@3 ~ c3@3 ~ g2 ~ g2 ~ b2 ~ c3@5 ~ c3@3 ~ g2 ~ g2 ~ a2 ~ b2 ~]/2",
  C: "[c3@3 ~ c3@3 ~ g2 ~ g2 ~ b2 ~ c3@5 ~ c3@4 g2 ~ g2 ~ a2 ~ b2 ~]/2",
  D: "[c3@3 ~ c3@3 ~ g2 ~ g2 ~ b2@2 a2@5 ~ a2@4 a3@2 a2@2 e3@2 a2@2]/2", E: "f3@3 ~ f3@3 ~ f3@2 e3@2 f3@2 f#3 ~",
  F: "g3@3 ~ g3@3 ~ d3@3 ~ d3@3 ~", G: "c3@3 ~ c3@3 ~ g2 ~ g2 ~ c3@3 ~", H: "a2@3 ~ a2@3 ~ e3@3 ~ e3@2 a2@2",
  I: "f3@3 ~ f3@3 ~ f3@2 e3@2 f3@2 c3 ~", J: "e3@3 ~ e3@4 b2@3 ~ b2@2 ~@2", K: "a3@3 ~ a3@3 ~ e3@3 ~ a3@2 e3 ~",
  L: "f3@3 ~ f3@3 ~ c3@4 f3@3 ~", M: "c3@3 ~ c3@4 g2@3 ~ c3 ~ c3@2", N: "e3@3 ~ e3@3 ~ e3 ~ d3@2 c3 ~ b2@2",
  O: "a3@3 ~ a3@4 e3@4 a3@2 e3@2", P: "c4@3 ~ c4@4 g3@3 ~ c4@2 g3@2", Q: "c4@3 ~ a#3@4 a3@4 g3@3 ~",
  R: "f3@3 ~ f3@4 c3@3 ~ f3@2 f#3@2", S: "g3@3 ~ g3@4 d3@4 g3@4", T: "c3@3 ~ c3@4 c4@3 ~ b3@3 ~",
  U: "a3@3 ~ a3@3 ~ e3@4 a3@2 e3@2", V: "g3@3 ~ g3@4 d3@3 ~ d3@3 ~",
  W: "[c3@3 ~ c3@3 ~ g2 ~ g2 ~ b2 ~ c3@5 ~ c3@3 ~ g2 ~ g2 ~ a2@2 b2 ~]/2", X: "c3/2",
})).s("gm_acoustic_bass").gain(0.27)

// chords · harmonica
const harmonica = note("<A@4 ~@8 B@2 ~@22 B@2 ~@8 B@2 C@4 D E F@2 B@2 ~@22 B@2 C@2 D G C@2 H@3 ~>".pickRestart({
  A: "[[e5,g5,c6,e6,g6]@4 [e5,g5,c6,e6,g6]@4 [d6,f6,a6]@2 [e6,a#6]@2 [d6,f6,a6] ~ [e5,g5,c6,e6,g6]@6 [e5,g5,c6,e6,g6]@4 [f6,a6]@2 [a#5,e6,a#6]@2 [a5,d6,a6]@2 [e5,g5,c6,e6,g6]@6 [e5,g5,c6,e6,g6]@4 [f6,a6]@2 [e6,g6,a#6] ~ [d6,f6,a6] ~ [e5,g5,c6,e6,g6]@6 [e5,g5,c6,e6,g6]@4 [a5,d6,f6] ~ [a#5,e6,g6,a#6]@2 [a5,d6,f6,a6]@2 [e5,g5,c6,e6,g6]@2, ~@8 f5 ~ g6 ~ a5@2 ~@10 [a5,d6] ~ g6 ~ [f5,f6] ~@11 d6 ~@15 a6@2 ~@2 f5 ~@3]/4", // C Dm Edim Dm C F A#dim D5 …
  B: "[[e5,g5,c6,e6,g6]@4 [e5,g5,c6,e6,g6]@4 [d6,f6,a6]@2 [e6,a#6]@2 [d6,f6,a6] ~ [e5,g5,c6,e6,g6]@6 [e5,g5,c6,e6,g6]@4 [f6,a6]@2 [a#5,e6,a#6]@2 [a5,d6,a6]@2 [e5,g5,c6,e6,g6]@2, ~@8 f5 ~ g6 ~ a5@2 ~@10 [a5,d6] ~ g6 ~ [f5,f6] ~@3]/2", // C Dm Edim Dm C F A#dim D5 …
  C: "[[e5,g5,c6,e6,g6]@3 ~ [e5,g5,c6,e6,g6]@4 [d6,f6,a6]@2 [e6,a#6]@2 [d6,f6,a6] ~ [e5,g5,c6,e6,g6]@6 [e5,g5,c6,e6,g6]@4 [f6,a6]@2 [a#5,e6,a#6]@2 [a5,d6,a6]@2 [e5,g5,c6,e6,g6]@2, ~@8 f5 ~ g6 ~ a5@2 ~@10 [a5,d6] ~ g6 ~ [f5,f6] ~@3]/2", // C Dm Edim Dm C F A#dim D5 …
  D: "[e5,g5,c6,e6,g6]@3 ~ [e5,g5,c6,e6,g6]@4 [d6,f6,a6]@2 [e6,a#6]@2 [d6,f6,a6] ~ [e5,g5,c6,e6,g6]@2, ~@8 f5 ~ g6 ~ a5@2 ~@2", // C Dm Edim Dm C
  E: "[c5,e5,g5]@3 ~ [c5,e5,g5]@3 ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~", // C
  F: "[[c5,f5,a5]@4 [c5,f5,a5]@3 ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [d5,g5,b5]@6 [d5,g5,b5]@2 ~@2 [d5,g5,b5] ~ [d5,g5,b5] ~ [d5,g5,b5] ~ [d5,g5,b5] ~]/2", // F G
  G: "[e5,g5,c6,e6,g6]@2 [e5,g5,c6,e6,g6]@2 [f6,a6] [a#5,e6,a#6] [a5,d6,a6] [e5,g5,c6,e6,g6], ~@8 [a5,d6] ~ g6 ~ [f5,f6] ~@3", // C F A#dim D5 C D5 F
  H: "[[e5,g5,c6] ~@15, c5@37 ~@11]/3", // C
})).s("gm_harmonica").gain(0.42)

// chords · harmonica · soft notes
const harmonica_soft = note(`<
  A B C D ~@8 A B ~@22 A B ~@8 A B A B A B A ~@3 A B ~@22 A B A B A B A B ~@4
>`.pickRestart({
  A: "~@4 a5 [g5,a#5] f5 ~", B: "~@8 f5 ~ g5 ~@5", C: "~@4 a5 [g5,a#5] a5 ~, ~@8 f5 ~@3 f5 ~@3", D: "~@8 f5 ~ g5@2 ~@4",
})).s("gm_harmonica").gain(0.24)

// chords · acoustic guitar steel · "RHYTHM GTR"
const acoustic_guitar_steel = note(`<
  A@2 B@4 C@2 D@4 E@2 F@2 G@2 H@2 I J K L M N O@2 P Q R S T U V W X@2 Y@2 C@2 D@4 E@2 Y@2 C@2 D@4 E@2 F@2 G@2 H@2 I J K
  L M N O@2 P Q R S T U V W X@8 Z@4
>`.pickRestart({
  A: "[[c4,e4,g4]@2 [c4,e4,g4]@2 [b3,d4,g4]!3 [c4,e4,g4]@3 [c4,e4,g4]@2 ~@3 c3, c3@4 g3@3 c3@5 [b3,d4,g4]@2 [b3,d4,g4]@2, ~@13 g3@3]/2", // C G C G
  B: "[[c3,c4,e4,g4]@2 [c3,c4,e4,g4]@2 ~@2 [b3,d4,g4] [c4,e4,g4]@3 [c4,e4,g4]@2 [b3,d4,g4]@2 [b3,g4]@2 [c4,e4,g4]@2 g4@2 ~@2 [b3,d4,g4] ~@4 g3 ~@3 c3, ~@4 [b3,d4,g4]@2 ~@6 g3@4 c3@4 [b3,d4,g4]@2 ~ [c4,e4,g4]@3 [c4,e4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4]@2, ~@10 g3@4 c3@11 ~@3 d4@6 ~@2 [c4,e4]@6 g3@4 ~@2 c3@8 ~@2 g3@6]/4", // C G C G Em C G C …
  C: "[[c4,e4,g4]@2 g4!2 [b3,d4,g4]!3 ~@3 [c4,e4,g4]@2 [b3,d4,g4]!2 ~ g3, c3@4 ~@3 [c4,e4,g4]@3 ~@2 g3@3 ~, ~@4 [c4,e4]@4 g3@7 ~ c3@8 ~@4 [b3,d4,g4]@4]/2", // C G C G C G
  D: "[[c4,e4,g4]@2 ~ c3 [b3,d4,g4] [b3,d4,g4]@2 [a3,c4,e4]@3 ~@4 [a3,c4,e4] ~ [f4,a4]@2 ~@2 [c4,f4,a4]!2 ~ [b3,d4,g4]@3 ~ g3 [b3,d4,g4] ~ g3 [b3,d4,g4], ~@2 [c4,e4,g4]@2 ~@6 [a3,c4,e4]@2 [a3,c4,e4]@2 ~ f3@4 f3@3 f3@4 [b3,d4,g4]@2 ~ [b3,d4,g4]@2 ~, ~@22 e3@4 e3@5 ~@5 [f4,a4]@4 ~@24]/4", // C G Am F G C Am G …
  E: "[[c4,e4,g4]@2 [c4,e4,g4]@2 [b3,d4,g4]!3 [c4,e4,g4]@3 ~ c3 ~@2 [b3,d4,g4]@2, c3@4 g3@3 c3@4 ~@2 g3@2 ~, ~@5 [c4,e4,g4] [b3,d4,g4] ~]/2", // C G C G C G
  F: "[[c4,e4,g4]@2 [c4,e4,g4]@2 ~@2 [b3,d4,g4] ~@4 c3 ~@3 c3, c3@4 [b3,d4,g4]@2 ~ [c4,e4,g4]@3 [c4,e4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4]@2, ~@5 g3@2 ~@2 c3@2 ~@2 g3@3]/2", // C G C G
  G: "[[c4,e4,g4]@2 [c4,e4,g4]@2 [d4,g4] [b3,d4,g4]!2 [c4,e4,g4]@3 ~ c3 ~@2 [b3,d4,g4]@2, c3@8 g3@7 ~@5 [c4,e4,g4]@4 [b3,d4,g4]@4 ~@4, ~@8 b3 ~@5 c3@8 ~@4 g3@6]/2", // C G5 G C G C G
  H: "[[c4,e4]@2 ~ c3 [b3,d4,g4]!3 ~@2 e3 [a3,c4,e4]@2 ~@2 [a3,c4,e4]@2, g4 ~@3, c3@3 ~@10 e3@3, ~@2 [c4,e4]@2 ~@3 [a3,c4,e4]@3 ~@2 [a3,c4,e4]@2 ~@2]/2", // C G Am C Am
  I: "[c4,f4,a4]@4 ~@4 [c4,f4,a4] ~@5 [f4,a4]@2, f3@3 f3@3 f3@2, ~@4 [c4,f4,a4]@4 ~@2 [c4,f4,a4]@3 c4@3", // F
  J: "[e4,g#4,b4]@4 ~@4 [e4,g#4,b4] ~@5 [e4,g#4,b4] ~, e3@3 e3@3 e3@2, ~@2 [e4,g#4,b4]@2 ~ [e4,g#4,b4]@2 ~", // E
  K: "[a3,c4,e4]@3 ~ [a3,c4,e4]@2 ~@4 [a3,c4,e4]@2 ~@2 f3@2, ~@3 a2@3 [a3,c4,e4]@4 ~@2 [a3,c4,e4]@4, ~ a2", // Am
  L: "[c4,f4,a4]@3 [c4,f4,a4] [c4,f4,a4]@2 [c4,f4,a4]@2 ~@4 [c4,f4,a4]@2 [c4,f4,a4]@2, f3@5 f3@3, ~@2 [c4,f4,a4] ~", // F
  M: "[c4,e4,g4]@3 [c4,e4,g4] [c4,e4,g4]@2 ~@8 [c4,e4,g4]@2, c3@2 c3!2, ~@3 [c4,e4,g4]@2 [c4,e4,g4]@2 ~", // C
  N: "[e4,g#4,b4]@3 [e4,g#4,b4] [e4,g#4,b4]@2 [e4,g#4,b4]@2 [e4,g#4,b4]@2 [e4,g#4,b4]@2 ~@2 e3@2, e3@7 ~, ~@3 [e4,g#4,b4]", // E
  O: "[a3,c4,e4]@3 ~@9 [a3,c4,e4]@4, ~@3 a2@3 a2@4 a2@6, ~ [a3,c4,e4]!2 ~", // Am
  P: "[c4,e4,g4]@3 ~ [c4,e4,g4]@2 [c4,e4,g4]@2 ~@4 [c4,e4,g4]@2 [c4,e4,g4]@2, ~@3 c3@5 [c4,e4,g4]@4 ~@4, ~@5 c3@3", // C
  Q: "[a#3,e4,g4]@2 [a#3,e4,g4]!6, c3@3 c3", // Edim
  R: "[c4,f4,a4]@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~ f3, f3@3 [c4,f4,a4]@2 ~ [c4,f4,a4]@2, ~@4 f3@3 ~", // F
  S: "[b3,d4,g4]@3 ~ [b3,d4,g4]@2 ~@4 [b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4]@2, ~@3 g3@3 [b3,d4,g4]@4 ~@6, ~ g3", // G
  T: "[c4,e4,g4]@2 [c4,e4,g4] ~@4 [a3,c4,e4], c3@3 [c4,e4,g4]@2 g4@3, ~@2 c3!2, ~@5 [c4,e4]@2 ~", // C Am C
  U: "[a3,c4,e4]@3 [a3,c4,e4] [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2", // Am
  V: "[f3,c4,f4,a4]@3 ~ [c4,f4,a4]@2 ~@8 [c4,f4,a4]@2, ~@3 f3@3 [c4,f4,a4]@4 [c4,f4,a4]@4 ~@2, ~@2 f3!2", // F
  W: "[g3,d4,g4,b4]@3 ~@11 g3@2, ~@3 g3@3 g3@4 g3@4 ~@2, ~ [d4,g4,b4]!3", // G
  X: "[[c4,e4,g4]@2 [c4,e4,g4]@2 [d4,g4] ~ g3 [c4,e4,g4]@3 ~ g3 ~ g3 ~ g3, ~@2 g3 ~@5, ~@8 b3 ~ [b3,d4,g4]@5 ~@5 [c4,e4,g4]@4 [b3,d4,g4]@4 [b3,d4,g4]@4]/2", // C G5 C G C G
  Y: "[[c4,e4,g4]@2 g4@2 ~@2 [b3,d4,g4] ~@4 g3 ~@3 c3, c3@4 [b3,d4,g4]@2 ~ [c4,e4,g4]@3 [c4,e4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4]@2, ~@2 [c4,e4]@3 g3@2 ~ c3@4 ~ g3@3]/2", // C G C G C
  Z: "[[c3,g3,c4,e4,g4,c5]@49 ~@15]/4", // C
})).s("gm_acoustic_guitar_steel").gain(0.24)

// chords · acoustic guitar nylon · "LEAD GTR"
const acoustic_guitar_nylon = note("<~@21 A@4 B@5 C@6 ~@12 D E F G H I J@2 K ~@8 A@4 B@5 C@6 ~@12>".pickRestart({
  A: "[~@8 c5@6 ~@2 c5@7 ~ c5@7 ~, ~@15 [e4,a4]@14 ~@2 [f4,a4]@14 ~@2 e4@16 ~, ~@47 g4@14 ~@3]/4", // A5 F
  B: "[[e4,g#4,b4]@12 ~@4 c5@13 ~@3 c5@13 ~@2 [e4,g4,c5]@15 ~@3 c5 ~@13 f4, ~@15 [e4,a4]@14 ~@2 [e4,a4]@14 ~@18 [e4,g4]@12 ~@5]/5", // E C A5 Em
  C: "[a4@12 ~@4 g4@12 ~@4 c5@14 ~@3 c5@11 ~@5 a4@12 ~@3 b4@13 ~@3, ~@15 [d4,b4]@13 ~@3 [e4,g4]@15 ~ [e4,a4]@13 ~@3 [c4,f4]@13 ~@3 [d4,g4]@14 ~@3]/6", // G Em A5 F5 G5
  D: "[g4,g5]@5 ~@3", E: "~@6 [a4,a5] ~@3 [g4,g5] ~ [g4,g5]@2 [e4,e5]@2",
  F: "[g4,g5]@2 ~@2 [g4,g5]@2 [e4,e5] ~ [g4,g5] ~ [g4,g5]@2 ~@2 [a4,a5]@2", G: "~@10 [g4,g5] ~ [g4,g5] ~ [e4,e5] ~",
  H: "[g4,g5]@2 ~@2 [g4,g5]@2 [e4,e5] ~ [g4,g5] ~ [e4,e5] ~ [g4,g5] ~ [a4,a5]@2", // G E G E G A
  I: "~@10 [g4,g5]@2 [g#4,g#5] ~ [a4,a5]@2", // G G# A
  J: "[~@10 [f4,g#4,f5,g#5]@2 [f4,a4,f5,a5] ~ [g4,g5]@10 ~@2 [f#4,a4,f#5,a5]@2 [g4,b4,g5,b5]@2 ~@2, ~@7 [b4,b5]@4 ~@5]/2", // Fm F G F#m G B
  K: "[e5,e6], [a4,a5]@13 ~@3", // E A
})).s("gm_acoustic_guitar_nylon").gain(0.4)

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

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!87 [~@4 x ~ x ~ x ~ x ~@3 x!2] x [~@14 x!2] ~@2>").gain(0.47)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!88 ~@4>").gain(0.47)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<[~ x ~ x ~ x ~ x]!88 ~@4>").gain(0.14)

// drums · crash
const crash = s("cr").struct("<x ~@87 x ~@3>").gain(0.47)

// drums · ride
const ride = s("rd").struct("<A@4 ~@8 A@2 ~@22 A@2 ~@8 A@12 ~@22 A@8 ~@4>".pickRestart({
  A: "x!4",
})).gain(0.47)

stack(
  bass, harmonica, harmonica_soft, acoustic_guitar_steel, acoustic_guitar_nylon, kick, snare, hihat, hihat_soft, crash,
  ride
)

More by The Beatles