Strudelify
And I Love Her cover art

1964 · A Hard Day's Night

And I Love Her

The Beatles

KeyB♭ majorTempo89 bpm
0:00/0:00
// And I Love Her — The Beatles
// 89 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "piano" named as a piano, played on piano (its acoustic guitar nylon patch is not one)
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(89/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 · acoustic bass · "bass"
const bass = note(`<
  ~@2 A@2 B@2 A C A D A D E F B G A D A D A D H I B@2 J K J L M N O P A C A D A D E F B G Q R Q S Q S T U V W Q S Q S Q
  S X Y V@2 Z AA Z AB AC AD AE AF Q R Q S Q S T U V W Q@2 V@2 Q@2 AG@2 ~
>`.pickRestart({
  A: "db2@5 ~ db2 ~ db2@8", B: "b1@5 ~ b1 ~ b1@7 ~", C: "ab2@4 ~@2 ab2 ~ ab2@5 ~ ab2@2", D: "ab2@4 ~@2 ab2 ~ ab2@8",
  E: "e2@5 ~ e2 ~ e2@6 e2@2", F: "gb2@4 ~@2 gb2 ~ gb2@5 ~ gb2@2", G: "b1@5 ~ b1 ~ b1@4 eb2@2 gb2@2",
  H: "e2@5 ~ e2 ~ e2@8", I: "gb2@4 ~@2 gb2 ~ gb2@8", J: "ab2@5 ~ ab2 ~ ab2@4 ab2@3 ~", K: "gb2@5 ~ gb2 ~ gb2@3 ~ gb2@4",
  L: "eb2@5 ~ eb2 ~ eb2@3 ~ eb2@4", M: "ab2@5 ~ ab2 ~ ab2@3 ~ ab2@3 ~", N: "eb2@5 ~ eb2 ~ eb2@3 ~ eb2@3 ~",
  O: "gb2@5 ~ gb2 ~ gb2@3 ~ gb2@3 ~", P: "gb2@5 ~ gb2 ~ gb2@3 ~ ab2@4", Q: "d2@5 ~ d2 ~ d2@8",
  R: "a2@4 ~@2 a2 ~ a2@5 ~ a2@2", S: "a2@4 ~@2 a2 ~ a2@8", T: "f2@5 ~ f2 ~ f2@6 f2@2", U: "g2@4 ~@2 g2 ~ g2@5 ~ g2@2",
  V: "c2@5 ~ c2 ~ c2@7 ~", W: "c2@5 ~ c2 ~ c2@4 e2@2 g2@2", X: "f2@5 ~ f2 ~ f2@8", Y: "g2@4 ~@2 g2 ~ g2@8",
  Z: "a2@5 ~ a2 ~ a2@4 a2@3 ~", AA: "g2@5 ~ g2 ~ g2@3 ~ g2@4", AB: "e2@5 ~ e2 ~ e2@3 ~ e2@4",
  AC: "a2@5 ~ a2 ~ a2@3 ~ a2@3 ~", AD: "e2@5 ~ e2 ~ e2@3 ~ e2@3 ~", AE: "g2@5 ~ g2 ~ g2@4 g2@3 ~",
  AF: "g2@5 ~ g2 ~ g2@4 a2@4", AG: "a2/2",
})).s("gm_acoustic_bass").gain(0.6)

// chords · piano
const piano = note(`<
  ~@2 A@2 B@2 C@8 D@7 E@2 F G@2 H I H J H J K L M N@7 O@2 P@8 Q@7 R@2 S T@2 U V U W U W X Y Z AA@7 AB@2 AC@4 AD AE AF@2
  ~
>`.pickRestart({
  A: "[db3@2 [e3,ab3,b3]@2 db3 ~ db3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 [e3,ab3,b3], ~@10 [e3,ab3,b3]@4 [e3,ab3,b3]@5 ~@13]/2", // E
  B: "[b2@2 [eb3,ab3,b3]@2 b2 [eb3,ab3,b3] b2 ~ b2@2 [eb3,ab3,b3]@2 b2 [eb3,ab3,b3] b2 [eb3,ab3,b3], ~@7 [eb3,ab3,b3]@3 ~@6]/2", // Abm
  C: "[db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 e3 eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 e3 eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 e3 eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ e3@2 [e3,ab3,b3]@2 e3 [e3,ab3,b3] e3 ~ gb2@2 [bb3,db4]@2 gb2 [e3,bb3,db4] gb2 [e3,db4], ~@14 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 e3@11 ~@7, ~@110 [ab3,b3]@5 ~@11 bb3 ~]/8", // E Abm E Abm E Abm E Bbm …
  D: "[b2@2 [eb3,ab3,b3]@2 b2 [eb3,ab3,b3] b2 ~ b2@2 [eb3,ab3,b3]@2 b2 [eb3,ab3,b3] ~ eb3 db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] ~ e3 eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 e3 eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 [e3,ab3,b3], ~@7 [eb3,ab3,b3]@3 ~@4 b2@2 ~@6 db3@2 ~@32, ~@30 [ab3,b3]@4 ~@12 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@13]/7", // Abm E Abm E Abm E Abm
  E: "[eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~@3 [ab3,b3]@2 e3 [ab3,b3] ~ [ab3,b3], ~@14 [ab3,b3]@5 ~@13, ~@16 e3@7 ~@5 e3@4]/2", // Abm
  F: "~@2 [bb3,db4]@2 gb2 [e3,bb3,db4] gb2 [e3,bb3,db4], gb2@7 ~@9, ~@4 e3@3 ~@9", // Bbm Bbdim
  G: "[~@2 [ab3,b3]@2 b2 [eb3,ab3,b3] b2 ~@3 [ab3,b3]@2 [b2,eb3] ~@2 [eb3,ab3,b3], b2@7 ~@7 [ab3,b3]@5 ~@7 [ab3,b3]@4 ~@2, ~@4 eb3@3 ~@7 eb3@9 ~@9, ~@16 b2@7 ~@5 b2@4]/2", // Abm B Abm
  H: "[eb3,ab3,b3]@11 ~ [eb3,ab3,b3]@3 ~", I: "[db3,gb3,bb3]@11 ~ [db3,gb3,bb3]@3 ~",
  J: "[eb3,gb3,bb3]@11 ~ [eb3,gb3,bb3]@3 ~", K: "[gb3,bb3]@7 ~, db3", L: "[db3,e3,bb3]@7 ~",
  M: "~@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 [e3,ab3,b3], db3@3 ~@5", // E
  N: "[~@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] db3 e3 eb3@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~ db3@2 [e3,ab3,b3]@2 db3 [e3,ab3,b3] ~ e3 ~@2 [ab3,b3]@2 eb3 [ab3,b3] eb3 ~@3 [ab3,b3]@2 e3 [ab3,b3] e3 ~ gb2@2 [e3,bb3,db4]@2 gb2 [e3,bb3,db4] ~ [e3,bb3,db4], eb3@6 ~@8 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@9 db3@4 eb3@6 ~@10 e3@7 ~@21 gb2@4, ~@62 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@11 [ab3,b3]@5 ~@13]/7", // Abm E Abm E Abm Bbdim Abm
  O: "[~@4 [eb3,ab3,b3]@5 ~ [eb3,ab3,b3]@3 ~ eb3@2 ~@4 [ab3,b3]@6 [ab3,b3]@4 [eb3,ab3,b3]@2, b2 b2, ~@14 [ab3,b3]@5 ~ eb3@4 ~@2 eb3@2 ~@4]/2", // Abm
  P: "[d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] ~ f3 e3@2 [a3,c4]@2 e3 [a3,c4] e3 ~ d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] ~ f3 e3@2 [a3,c4]@2 e3 [a3,c4] e3 ~ d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] ~ f3 e3@2 [a3,c4]@2 e3 [a3,c4] ~@2 f3@2 [f3,a3,c4]@2 f3 [f3,a3,c4] f3 ~ g2@2 [b3,d4]@2 g2 [f3,b3,d4] g2 [f3,d4], ~@12 d3@4 ~@28 d3@4 ~@28 d3@4 ~@12 e3@4 ~@14 f3@11 ~@7, ~@14 [a3,c4]@5 ~@11 [a3,c4]@6 ~@10 [a3,c4]@5 ~@11 [a3,c4]@6 ~@10 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 b3 ~]/8", // F Am F Am F Am F Bm …
  Q: "[c3@2 [e3,a3,c4]@2 c3 [e3,a3,c4] c3 ~ c3@2 [e3,a3,c4]@2 c3 [e3,a3,c4] ~ e3 d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 f3 ~@2 [a3,c4]@2 e3 [a3,c4] e3 ~ d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 f3 e3@2 [a3,c4]@2 e3 [a3,c4] e3 ~ d3@2 [f3,a3,c4]@2 d3 ~@2 [f3,a3,c4], ~@7 [e3,a3,c4]@3 ~@4 c3@2 ~@8 e3@3 ~@26 [f3,a3,c4]@2 ~, ~@30 [a3,c4]@4 ~@12 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@6 ~@8 d3@4]/7", // Am F Am F Am F Am F …
  R: "[~@2 [a3,c4]@2 e3 [a3,c4] e3 ~@3 [a3,c4]@2 f3 [a3,c4] ~ [a3,c4], e3@6 ~@8 [a3,c4]@5 ~@13, ~@16 f3@7 ~@5 f3@4]/2", // Am
  S: "~@2 [b3,d4]@2 g2 [f3,b3,d4] g2 [f3,b3,d4], g2@7 ~@9, ~@4 f3@3 ~@9", // Bm Bdim
  T: "[~@2 [a3,c4]@2 c3 [e3,a3,c4] c3 ~@3 [a3,c4]@2 [c3,e3] ~@2 [e3,a3,c4], c3@7 ~@7 [a3,c4]@5 ~@7 [a3,c4]@4 ~@2, ~@4 e3@3 ~@7 e3@9 ~@9, ~@16 c3@7 ~@5 c3@4]/2", // Am C Am
  U: "[e3,a3,c4]@11 ~ [e3,a3,c4]@3 ~", V: "[d3,g3,b3]@11 ~ [d3,g3,b3]@3 ~", W: "[e3,g3,b3]@11 ~ [e3,g3,b3]@3 ~",
  X: "[g3,b3]@7 ~, d3", Y: "[d3,f3,b3]@7 ~", Z: "~@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 [f3,a3,c4], d3@3 ~@5",
  AA: "[~@2 [a3,c4]@2 e3 [a3,c4] e3 ~ d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 f3 ~@2 [a3,c4]@2 e3 [a3,c4] e3 ~ d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] ~ f3 ~@2 [a3,c4]@2 e3 [a3,c4] e3 ~@3 [a3,c4]@2 f3 [a3,c4] f3 ~ g2@2 [f3,b3,d4]@2 g2 [f3,b3,d4] ~ [f3,b3,d4], e3@6 ~@8 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@5 ~@11 [a3,c4]@5 ~@13, ~@32 e3@6 ~@22 d3@4 e3@6 ~@10 f3@7 ~@21 g2@4]/7", // Am F Am F Am Bdim Am
  AB: "[~@4 [e3,a3,c4]@5 ~ [e3,a3,c4]@3 ~ e3@2 ~@4 [e3,a3,c4]@5 ~ [a3,c4]@4 [e3,a3,c4]@2, c3 c3, ~@14 [a3,c4]@5 ~@7 e3@2 ~@4]/2", // Am
  AC: "[~@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 ~ d3@2 [f3,a3,c4]@2 d3 a3 d3 f3 c3@2 [e3,a3,c4]@2 c3 [e3,a3,c4] c3 ~@3 [e3,a3,c4]@2 c3 [e3,a3,c4] c3 [e3,a3,c4], d3@6 ~@8 [f3,a3,c4]@5 ~@7 [f3,c4]@4 c4@4 ~@14 c3@6 ~@10, ~@30 a3 ~@15 [e3,a3,c4]@4 ~@14]/4", // F Am F F5 Am
  AD: "d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 [f3,a3,c4]", AE: "d3@2 [f3,a3,c4]@2 d3 [f3,a3,c4] d3 [f3,a3], ~@14 c4 ~",
  AF: "[e3,a3,db4]/2", // A
})).s("gm_piano").gain(0.41).pan(0.8)

// chords · acoustic guitar nylon · "nylon rhythm guitar"
const acoustic_guitar_nylon = note(`<
  ~@16 A B A C D B E F G@2 H@8 A B A C D B E F G@2 I J I K L J M N O@2 I J I K L J M N O@2 P@8 I J I K L J M N O@2 ~@5
  Q@3 ~
>`.pickRestart({
  A: "db4 e4 ab4 e4 db4 e4 ab4 e4", B: "b3 eb4 ~ eb4 ~ eb4 ~ eb4, ~ ab4 b3 ab4",
  C: "b3 eb4 ab4 eb4 ~ eb4 ~ eb4, ~@2 b3 ab4", D: "db4 e4 ab4 e4 db4 e4 ~ e4, ~@3 ab4",
  E: "~ e4 ~ e4 ~ e4 ~ e4, b3@2 ab4@3 ~ ab4@2, ~@8 b3@5 ~@3", F: "db4 gb4 bb4 gb4 db4 gb4 bb4 gb4",
  G: "~ eb4 ~ eb4 b3 eb4 ab4 eb4, b3 ab4 ~@2",
  H: "[~ [ab3,b3]@14 ~ [gb3,bb3]@15 ~@2 b3@14 ~ [eb3,gb3,bb3]@15 ~ [eb3,ab3,b3]@14 ~@2 [eb3,gb3,bb3]@14 ~@3 bb3@14 ~ [e3,bb3]@13 ~@3, [ab2,eb3]@15 gb2@16 ab2@16 bb2@15 ~ ab2@15 ~ bb2@14 ~@2 bb2@14 ~@2 [bb2,db3]@14 ~@3, ~@15 db3@14 ~@3 [eb3,ab3]@15 ~@49 [db3,gb3]@14 ~@18]/8", // Abm Gb Ebm Abm Ebm Edim Ab5 Bbm …
  I: "d4 f4 a4 f4 d4 f4 a4 f4", J: "c4 e4 ~ e4 ~ e4 ~ e4, ~ a4 c4 a4", K: "c4 e4 a4 e4 ~ e4 ~ e4, ~@2 c4 a4",
  L: "d4 f4 a4 f4 d4 f4 ~ f4, ~@3 a4", M: "~ f4 ~ f4 ~ f4 ~ f4, c4@2 a4@3 ~ a4@2, ~@8 c4@5 ~@3",
  N: "d4@2 g4@2 b4@2 g4@2 d4@2 g4@2 b4@2 g4 ~", O: "~ e4 a4 e4 c4 e4 a4 e4, c4 ~@3",
  P: "[~ [a3,c4]@14 ~ [g3,b3]@15 ~@2 c4@14 ~ [e3,g3,b3]@15 ~ [e3,a3,c4]@14 ~@2 [e3,g3,b3]@14 ~@3 b3@14 ~ [f3,b3]@13 ~@3, [a2,e3]@15 g2@16 a2@16 b2@15 ~ a2@15 ~ b2@14 ~@2 b2@14 ~@2 [b2,d3]@14 ~@3, ~@15 d3@14 ~@3 [e3,a3]@15 ~@49 [d3,g3]@14 ~@18]/8", // Am G Em Am Em Fdim A5 Bm …
  Q: "[~@17 e4@31, ~@15 e3@32 ~, ~ [a3,db4]@2]/3", // A
})).s("gm_acoustic_guitar_nylon").gain(0.37).pan(0.3)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note(`<
  ~@16 A@8 B@2 C D C E C F@3 A@8 B@2 ~@10 G@8 H@2 I J I K I L@3 G@8 H@2 M@6 ~@3
>`.pickRestart({
  A: "[db4 eb4 e4 eb4 db4 eb4 ~ [db4,bb4], ab4@7 ~, ~@3 e4]/8", B: "[b3,eb4,ab4]/2", C: "[b3,eb4,ab4]",
  D: "[bb3,db4,gb4]", E: "[db4,gb4,bb4]", F: "[gb4@2 e4, [db4,bb4]]/3",
  G: "[d4 e4 f4 e4 d4 e4 ~ [d4,b4], a4@7 ~, ~@3 f4]/8", H: "[c4,e4,a4]/2", I: "[c4,e4,a4]", J: "[b3,d4,g4]",
  K: "[d4,g4,b4]", L: "[g4@2 f4, [d4,b4]]/3", M: "[d4 [e3,c4] [f3,d4], a3, f3@5 ~@11]/6",
})).s("gm_string_ensemble_1").gain(0.28)

// other · electric guitar jazz · "lead clean elec. gtr"
const electric_guitar_jazz = note(`<
  ~ A B@4 C ~@8 A C ~@16 A D@2 ~@8 E@3 F@4 G@3 H@2 ~@15 I J@2 ~@7 I K@6 L@2 ~
>`.pickRestart({
  A: "~@5 gb3 b3 bb3", B: "[ab3@13 gb3 b3 bb3]/2", C: "ab3", D: "[ab3@19 ~@13]/2",
  E: "[~@3 d4 e4 f4@2 b4@2 a4@2 c5@7 d4@2 e4@2 f4@2]/3",
  F: "[b4@4 a4@16 d4@4 e4@2 f4@4 b4@4 a4@4 c5@13 ~ c5@4 a4@4 f4@4]/4",
  G: "[e4@4 d4@6 a3@2 g3@2 a3@4 e4@19 ~ g3@4 e3@2 d3@2 c3@2]/3", H: "[d3@19 ~@13]/2", I: "~@5 g3 c4 b3",
  J: "[a3@3 ~]/2", K: "[a3@13 g3 c4 b3]/2", L: "[a3@5 ~@3]/2",
})).s("gm_electric_guitar_jazz").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@2
  [x ~@2 x!2 ~@2 x]!24
  [x ~@2 x!2 ~ x ~]!7
  [x ~@2 x!2 ~@2 x]!31
  [x ~@2 x!2 ~ x ~]!7
  [x ~@2 x!2 ~@2 x]!17
  ~@3
>`).gain(0.44)

// drums · rim
const rim = s("rim").struct("<~@2 A@31 B A@9 B A@27 B A@16 ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct("<[x!2] [x ~@2 x!2 ~ x ~ x ~@3 x ~@3] [x!8]!42 [~ x ~ x ~ x ~ x]!10 [x!8]!34 ~@3>")
  .gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@33 [~@5 x ~@2] ~@9 [~@7 x] ~@27 [~@5 x ~@2] ~@19>").gain(0.44)

// drums · mid tom
const mid_tom = s("mt").struct("<~@33 [~@7 x] ~@9 [~@5 x ~@2] ~@27 [~@7 x] ~@19>").gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@6 A ~@9 A ~@9 A ~@7 A ~@9 A ~@9 A ~@9 A ~@7 A ~@9 A ~@5 A ~@2>".pickRestart({
  A: "x",
})).gain(0.22)

// drums · high tom
const high_tom = s("ht").struct("<~@33 [~@3 x] ~@37 [~@3 x] ~@19>").gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@44 [x!8]!10 ~@37>").gain(0.35)

// drums · bongos
const bongos = s("bongo:4").struct("<~@2 [~ x]!86 ~@3>").gain(0.81)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@2 [~@2 x!2 ~ x!3]!86 ~@3>").gain(0.81)

// drums · congas
const congas = s("conga:13").struct("<~@2 [x!2 ~@6]!86 ~@3>").gain(1.26)

stack(
  bass, piano, acoustic_guitar_nylon, string_ensemble_1, electric_guitar_jazz, kick, rim, hihat, low_tom, mid_tom,
  crash, high_tom, ride, bongos, bongos_2, congas
)

More by The Beatles