Strudelify

Words Of Love

The Beatles

KeyA majorTempo122 bpm
0:00/0:00
// Words Of Love — The Beatles
// 122 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 66 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122/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 · fretless bass
const bass = note(`<
  A B C D A B E ~ A B C D A B A B C F A B A B C D A B A B C D E ~ A B C D A B E ~ A B C G A B A B C D A B A B H I A B A
  B C D E ~ J ~
>`.pickRestart({
  A: "a1@3 ~ e2@3 ~", B: "d2@3 ~ e2@3 ~", C: "a1@12 ~@4 e2@13 ~@3", D: "d2@11 ~@5 e2@10 ~@6", E: "a1@11 ~@21",
  F: "d2@12 ~@4 e2@11 ~@5", G: "d2@11 ~@5 e2@11 ~@5", H: "a1@6 ~@2 e2@7 ~", I: "d2@6 ~@2 e2@5 ~@3", J: "~ a1@31",
})).s("gm_fretless_bass").gain(0.43).pan(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A@2 B@2 C@2 D E F G H I J K L@2 M N O P Q R S@2 T@2 U V W X Y Z AA@2 AB@2 AC@2 D E F AD AE I J AF AG@2 M N O P Q AH
  AI@2 AJ@2 U V W X Y AK AL ~
>`.pickRestart({
  A: "[[a3,c#4]@8 [a3,c#4,e4]@8 [e3,a3,c#4]@8 [e3,a3,c#4]@4 ~@16 a3@3 ~@5 d4@4 ~@4 g#3@2 ~@2, e3@16 e4@12 ~@2 e4@5 ~ f#4@10 ~@2 e4@7 ~@9, ~@8 d3@7 ~, ~@40 d4@12 ~@4 [b3,e4]@7 ~]/2", // A E5
  B: "[[e3,a3,c#4]@7 ~ [e3,a3,c#4]@8 [a3,c#4]@8 [a3,c#4]@5 ~@15 a3@3 ~@5 d4@4 [b3,e4]@4 g#3 ~@3, a2@28 ~@4 d3@31 ~, ~@16 e3@13 ~ e4@5 ~ f#4@10 ~@2 e4@7 ~@9, ~@40 d4@11 ~@13]/2", // A E5
  C: "[[e3,a3,c#4]@7 ~ [e3,a3,c#4]@8 [e3,a3,c#4]@8 [e3,a3,c#4]@5 ~@15 a3@4 ~@4 d4@4 ~@4 g#3@3 ~, ~@30 e4@5 ~ f#4@10 ~@2 g#3@11 ~@5, ~@32 d3@27 ~@5, ~@40 d4@11 ~@5 [b3,e4]@8, ~@48 e4@7 ~@9]/2", // A E5
  D: "[e4,a4]@4 g#4 [f#4,g4] [e4,f4]@2 e4@4 d#4 [c#4,d4]@2 ~ [c#4,e4]@5 [d4,d#4] e4 e4@9", // A5 Gmaj7 Fmaj7 Dmaj7 C#m D#maj7
  E: "~@12 a3@3 ~@5 d4@4 [b3,d4]@4 g#3@4, a3@11 ~@21, ~@2 f#4@5 ~ e4@4 ~@4, ~@7 d4@12 ~@13", // Bm
  F: "[a2,e3,a3,c#4]@9 ~@3 [a3,c#4]@8 ~@8 [g#3,c#4,f4]@4, ~@12 e3@11 ~@9", // A C#
  G: "[a3,d4,f#4]@7 ~@5 [e4,g#4]@8 [e4,g#4]@4 [b3,e4] ~@7, ~@3 b3@3 ~@2", // D E E5
  H: "[a2,e3,a3]@8 ~@12 c#4@3 ~@5 [g#3,c#4]@4, ~@12 [e3,a3]@11 ~@9", I: "[a3,d4]@7 ~@13 g#4@4 ~@8, ~@3 [b3,e4]@3 ~@2",
  J: "[e3,a3,c#4]@2 ~ [a3,c#4]@2 c#4 ~ [g#3,c#4], ~@3 e3@3 ~@2", // A C#5
  K: "[a3,d4,f#4]@8 ~@4 e4@8 [e4,g#4]@5 ~@7, ~@3 b3@3 ~@2", // D E
  L: "[[e3,a3,c#4]@8 ~@4 [a3,c#4]@7 ~ c#4@4 a3@3 ~@17 a3@4 ~@4 d4@3 ~ b3@4 g#3@2 ~@2, ~@12 [a2,e3]@14 ~@4 e4@4 ~@2 f#4@9 ~@3 e4@8 ~@8, ~@32 d3@31 ~, ~@40 d4@11 ~@13]/2", // A A5
  M: "[a2,a3]@8 a2@4 ~@8 c#4@4 [a2,e3] ~@3 [g#3,c#4]@4, [e3,c#4]@3 [e3,a3]@3 ~@2", // A A5 C#5 C#m A5
  N: "[a3,d4]@8 ~@4 [e4,g#4]@7 ~ [e4,g#4]@4 [b3,e4] ~@7, ~@12 b3@11 ~@9", // D5 E E5
  O: "[e3,a3,c#4]@2 ~ a3@2 c#4 ~ [g#3,c#4], ~@12 e3@11 ~@9", // A C#5
  P: "[a3,d4,f#4]@7 ~@13 g#4@4 [e4,g#4] ~@7, ~@3 [b3,e4]@3 ~@2", // D E E5
  Q: "[e3,a3]@9 ~@3 c#4@4 ~@4 c#4@4 ~@4 [g#3,c#4]@4, ~@12 [e3,a3]@11 ~@9", // A5 C#5 A5
  R: "[a3,d4,f#4]@8 ~@4 [e4,g#4]@7 ~ [e4,g#4]@4 [b3,e4] ~@7, ~@3 b3@3 ~@2", // D E E5
  S: "[[e3,a3,c#4]@8 [e3,a3,c#4]@8 [e3,a3]@8 [e3,a3]@4 ~@16 a3@3 ~@5 d4@3 ~ [b3,e4]@4 g#3@2 ~@2, ~@16 c#4@12 ~@2 e4@4 ~@2 f#4@9 ~@3 e4@7 ~@9, ~@16 d3@7 ~@9, ~@40 d4@11 ~@13]/2", // A A5 E5
  T: "[~@4 g#4 f#4 f4 ~ e4@5 [d4,d#4] c#4@2 [c#4,e4]@5 [d4,d#4] e4@2 e4@5 ~ f#4 [d4,f#4]@8 ~@4 [f#4,a4]@5 [e4,g#4]@6 ~ [g#4,b4]@8 ~, [e4,a4]@7 ~@57]/2", // D#maj7 C#m D#maj7 D F#m E G#m A5
  U: "[e4,a4]@4 [g4,g#4] [f4,f#4] e4 ~ e4@4 [d4,d#4] c#4@3 [c#4,e4]@5 [d4,d#4] e4 ~ e4@7 ~", // A5 G#maj7 F#maj7 D#maj7 C#m D#maj7
  V: "[d4,f#4]@8 ~@4 [f#4,a4]@4 ~ g#4@6 ~ b4@6 ~@2, ~@16 e4@5 ~@2 g#4@8 ~", // D F#m
  W: "[e4,a4]@4 [f#4,g#4] f4 e4 ~ e4@4 [d4,d#4] c#4@3 [c#4,e4]@4 d4 [d#4,e4]@2 ~ e4@5 ~@3", // A5 F#sus2 D#maj7 C#m Emaj7
  X: "[d4,f#4]@7 ~@5 a4@3 ~ [e4,g#4]@7 ~ [g#4,b4]@5 ~@3, ~@11 f#4@4 ~@17", // D E G#m
  Y: "e4@7 ~ [e4,a4]@6 ~@2 a4@2 [f#4,g#4] ~ e4@7 ~ b3@4, c#5@4 ~@10 e4@5 ~@13", // A5 F#sus2
  Z: "~@12 a3@3 ~@5 d4@3 ~ b3@4 b3@4, a3@11 ~@21, d4@8 d4@11 ~@13, ~@4 f#4@10 ~@2 e4@7 ~ e4@8",
  AA: "[[a3,c#4]@8 [a3,c#4,e4]@8 [e3,a3,c#4]@8 [e3,a3,c#4]@4 ~@16 a3@3 ~@5 d4@4 ~@4 g#3@2 ~@2, e3@16 e4@12 ~@2 e4@5 ~ f#4@10 ~@2 e4@8 ~@8, ~@8 d3@7 ~, ~@40 d4@12 ~@4 [b3,e4]@7 ~]/2", // A E5
  AB: "[[e3,a3,c#4]@7 ~ [e3,a3,c#4]@8 [a3,c#4]@8 [a3,c#4]@5 ~@15 a3@3 ~@5 d4@4 [b3,e4]@4 g#3 ~@3, a2@28 ~@4 d3@31 ~, ~@16 e3@13 ~ e4@5 ~ f#4@10 ~@2 e4@8 ~@8, ~@40 d4@11 ~@13]/2", // A E5
  AC: "[[e3,a3,c#4]@7 ~ [e3,a3,c#4]@8 [e3,a3,c#4]@8 [e3,a3,c#4]@5 ~@15 a3@4 ~@4 d4@4 ~@4 g#3@3 ~, ~@30 e4@5 ~ f#4@10 ~@2 g#3@12 ~@4, ~@32 d3@27 ~@5, ~@40 d4@11 ~@5 [b3,e4]@8, ~@48 e4@7 ~@9]/2", // A E5
  AD: "[a3,d4,f#4]@7 ~@5 [e4,g#4]@7 ~ [e4,g#4]@4 [b3,e4] ~@7, ~@3 b3@3 ~@2", // D E E5
  AE: "[a2,e3,a3]@9 ~@11 c#4@3 ~@5 [g#3,c#4]@4, ~@12 [e3,a3]@11 ~@9", // A5 C#5 A5
  AF: "[a3,d4,f#4]@8 ~@4 e4@7 ~ [e4,g#4]@5 ~@7, ~@3 b3@3 ~@2", // D E
  AG: "[[e3,a3,c#4]@8 ~@4 [a3,c#4]@8 c#4@4 a3@3 ~@17 a3@4 ~@4 d4@3 ~ b3@4 g#3@2 ~@2, ~@12 [a2,e3]@14 ~@4 e4@4 ~@2 f#4@9 ~@3 e4@7 ~@9, ~@32 d3@31 ~, ~@40 d4@11 ~@13]/2", // A A5
  AH: "[a3,d4,f#4]@8 ~@4 [e4,g#4]@8 [e4,g#4]@4 [b3,e4] ~@7, ~@3 b3@3 ~@2", // D E E5
  AI: "[[e3,a3,c#4]@8 [e3,a3,c#4]@7 ~ [e3,a3]@8 [e3,a3]@4 ~@16 a3@3 ~@5 d4@3 ~ [b3,e4]@4 g#3@2 ~@2, ~@16 c#4@12 ~@2 e4@4 ~@2 f#4@9 ~@3 e4@7 ~@9, ~@16 d3@7 ~@9, ~@40 d4@11 ~@13]/2", // A A5 E5
  AJ: "[[e4,a4]@4 g#4 f#4 f4 ~ e4@5 [d4,d#4] c#4@2 [c#4,e4]@5 [d4,d#4] e4 ~ e4@5 ~ f#4 [d4,f#4]@8 ~@4 [f#4,a4]@5 g#4@7 [g#4,b4]@8 ~, ~@12 e4 ~@3]/2", // A5 D#maj7 C#m D#maj7 D F#m G#m
  AK: "~@12 a3@3 ~@5 d4@4 b3@4 g#3@4, a3@11 ~@21, d4@8 d4@11 ~@13, ~@2 f#4@5 ~ e4@4 e4@4",
  AL: "~ [e3,a3]@31, ~ c#4@26 ~@5", // A5
})).s("gm_electric_guitar_clean").gain(0.43).pan(0.7)

// other · piano
const piano = note("<~@8 A@7 B C@6 D E F ~@9 G ~ H@3 ~ I@6 D J K@6 D L M B D B D N O ~@3>".pickRestart({
  A: "[~@9 a4@8 e4@8 a4@20 ~@4 g#4@8 f#4@4 g#4@8 e4@43 g#4@8 f#4@5 g#4@8 e4@37 ~@7 g#4@8 b4@6 c#5@32 ~]/7",
  B: "d5@3 c#5 b4 c#5 d5 b4",
  C: "[c#5@8 ~ a4@8 e4@8 a4@23 g#4@8 f#4@4 g#4@8 ~ e4@43 g#4@9 f#4@4 g#4@8 e4@40 ~@4 g#4@8 b4@7]/6", D: "c#5",
  E: "d5@11 c#5@5 b4@4 c#5@4 d5@4 ~ b4@3", F: "c#5@3 ~", G: "~ e5@7 ~@16 c#5@2 ~@6",
  H: "[~ c#5@8 a4@8 f#4@8 a4@5 ~@2 f4@2 ~@15 g#4@7 f#4@4 g#4@7 ~ e4@15 ~@13, ~@30 f#4@19 ~@47]/3",
  I: "[c#5@8 a4@9 e4@8 a4@3 f#4@20 g#4@8 ~ f#4@3 g#4@8 e4@44 g#4@8 f#4@4 g#4@8 ~ e4@43 g#4@8 b4@8]/6",
  J: "d5@12 c#5@4 b4@4 c#5@4 d5@5 b4@3",
  K: "[~ c#5@7 a4@8 e4@8 a4@21 ~@4 g#4@7 f#4@4 g#4@8 e4@45 g#4@8 f#4@4 g#4@8 e4@43 g#4@9 b4@7]/6",
  L: "d5@11 c#5@5 b4@4 c#5@4 d5@5 b4@3", M: "~ c#5@31", N: "d5@12 c#5@3 b4@5 c#5@4 d5@4 b4@4", O: "c#5@31 ~",
})).s("gm_piano").gain(0.39).pan(0.3)

// other · piano
const piano_2 = note("<~@8 A@2 B@4 C@2 D E@5 F@2 G ~@7 H@2 I@4 J ~ K@6 L@2 M@6 N@2 O@2 P@2 Q@2 R ~@3>".pickRestart({
  A: "[~ a4@7 e4@8 c#4@8 e4@18 ~@6 e4@4 c#4@4 b3@4 c#4@4]/2",
  B: "[~ a3@41 ~@6 e4@4 c#4@4 b3@4 c#4@7 ~ a3@37 ~@7 e4@9 g#4@7]/4", C: "[a4@12 g#4 a4 b4 g#4]/2",
  D: "a4@8 e4@8 c#4@7 ~ e4@8",
  E: "[~@16 e4@4 c#4@4 b3@4 c#4@8 ~ a3@41 ~@2 e4@4 c#4@4 b3@5 c#4@7 a3@38 ~@6 e4@9 g#4@7]/5",
  F: "[a4@49 g#4@4 a4@3 b4@4 g#4@4]/2", G: "a4@25 ~@7",
  H: "[~@8 a4@8 ~ e4@6 ~ c#4@5 d4@7 ~@12 e4@5 c#4@3 b3@4 c#4@4]/2",
  I: "[~@3 a3@40 ~@5 e4@5 c#4@4 b3@3 c#4@8 a3@38 ~@7 e4@8 g#4@7]/4", J: "a4@21 ~@11",
  K: "[a4@8 ~ e4@7 c#4@8 e4@4 ~ d4@20 e4@3 c#4@4 b3@5 c#4@8 a3@43 e4@4 c#4@4 ~ b3@3 c#4@8 ~ a3@39 ~@4 e4@9 g#4@7]/6",
  L: "[a4@12 g#4 a4 b4 g#4, g#4 ~@63]/2",
  M: "[~ a4@7 e4@9 c#4@7 e4@6 d4@14 ~@4 e4@4 ~ c#4@4 b3@4 c#4@7 a3@44 e4@4 ~ c#4@3 b3@4 ~ c#4@7 a3@41 ~@3 e4@9 g#4@7]/6",
  N: "[a4@48 g#4@4 a4@4 ~ b4@3 g#4@4]/2", O: "[~ a4@47 g#4@4 a4@4 b4@4 g#4@4]/2",
  P: "[a4@48 g#4@4 ~ a4@3 b4@4 g#4@4]/2", Q: "[a4@48 g#4@3 ~ a4@4 b4@4 g#4@4]/2", R: "a4",
})).s("gm_piano").gain(0.39).pan(0.7)

// other · electric guitar clean
const electric_guitar_clean_2 = note(`<
  ~@8 A@7 B C@6 D E F ~@9 G ~ H@3 ~ I@6 D J K@6 D L M B D B D N O ~@3
>`.pickRestart({
  A: "[~@9 a3@8 e3@8 a3@20 ~@4 g#3@8 f#3@4 g#3@8 e3@43 g#3@8 f#3@5 g#3@8 e3@37 ~@7 g#3@8 b3@6 c#4@32 ~]/7",
  B: "d4@3 c#4 b3 c#4 d4 b3",
  C: "[c#4@8 ~ a3@8 e3@8 a3@23 g#3@8 f#3@4 g#3@8 ~ e3@43 g#3@9 f#3@4 g#3@8 e3@40 ~@4 g#3@8 b3@7]/6", D: "c#4",
  E: "d4@11 c#4@5 b3@4 c#4@4 d4@4 ~ b3@3", F: "c#4@3 ~", G: "~ e4@7 ~@16 c#4@2 ~@6",
  H: "[~ c#4@8 a3@8 f#3@8 a3@5 ~@2 f3@2 ~@15 g#3@7 f#3@4 g#3@7 ~ e3@15 ~@13, ~@30 f#3@19 ~@47]/3",
  I: "[c#4@8 a3@9 e3@8 a3@3 f#3@20 g#3@8 ~ f#3@3 g#3@8 e3@44 g#3@8 f#3@4 g#3@8 ~ e3@43 g#3@8 b3@8]/6",
  J: "d4@12 c#4@4 b3@4 c#4@4 d4@5 b3@3",
  K: "[~ c#4@7 a3@8 e3@8 a3@21 ~@4 g#3@7 f#3@4 g#3@8 e3@45 g#3@8 f#3@4 g#3@8 e3@43 g#3@9 b3@7]/6",
  L: "d4@11 c#4@5 b3@4 c#4@4 d4@5 b3@3", M: "~ c#4@31", N: "d4@12 c#4@3 b3@5 c#4@4 d4@4 b3@4", O: "c#4@31 ~",
})).s("gm_electric_guitar_clean").gain(0.23).pan(0.8)

// drums · kick
const kick = s("bd").struct("<A@6 B ~ A@22 B ~ A@6 B ~ A@22 B ~ C ~>".pickRestart({
  A: "x!2", B: "x", C: "~ x ~@30",
})).gain(0.27)

// drums · rim
const rim = s("rim").struct(`<
  A@3 B A@2 ~@2 A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~@2 A@3 B A@2 ~@2 A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~@4
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x ~ x",
})).gain(0.27)

// drums · open hat
const open_hat = s("oh").struct("<A@6 ~@2 A@22 ~@2 A@6 ~@2 A@22 ~@2 B ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@30",
})).gain(0.27)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A@3 B A@2 ~@2 A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~@2 A@3 B A@2 ~@2 A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~@4
>`.pickRestart({
  A: "~@2 x!2 ~@2 x ~@3 x ~ x ~ x ~", B: "~@2 x!2 ~@2 x ~@5 x ~@3",
})).gain(0.27)

stack(bass, electric_guitar_clean, piano, piano_2, electric_guitar_clean_2, kick, rim, open_hat, mid_tom)

More by The Beatles