Strudelify

Oh My Love

John Lennon

KeyF♯ minorTempo60 bpm
0:00/0:00
// Oh My Love — Lennon John
// 60 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 45 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(60/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.

// chords · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note(`<
  A B C D E F G H I J K L M N O P Q@3 R S T U V W X Y Z W AA AB AC AD@2 U AE@3 U AF AG AH AI AJ@2
>`.pickRestart({
  A: "~ [f#3,a4], b2, ~ f#3@3 ~@4, ~ b3@3, ~@3 [d4,f#4]@5", B: "~ [g#3,b3,g#4], c#3, ~ g#3@3 ~@4, ~ c#4@3, ~@3 e4@5",
  C: "~@3 d4, b2@15 ~ [b2,a3,f#4]@16, ~ f#3@7, ~ b3@3, ~@11 d4@13 ~@8", // B7
  D: "~@13 d4@3 c#4@16, a2@3 a2@5, ~ e3@3 ~@4, ~@8 a3@9 ~@15, ~@3 c#4 ~@4",
  E: "~ [f#3,a4], d3, ~ f#3@3 ~@4, ~ d4@3, ~@3 a3@5", F: "~@3 c#4, c#3, ~ g#3@3 [g#3,g#4]@4, ~ c#4@2 ~, ~@3 e4@5",
  G: "~@2 b3 [b3,g#4], b2, ~ f#3@7, ~ b3 a4@2, ~@3 d4@5", // E
  H: "~@7 d4 c#4@8, a2@3 a2@5, ~@4 e3@13 ~@15, ~@8 a3@9 ~@15, ~@3 c#4 ~@4",
  I: "~@16 d3@15 ~, d3 ~, ~@4 f#3@27 ~, ~@8 b3@23 ~, ~@11 d4@20 ~",
  J: "~ [g#3,g#4], c#3, ~ g#3@3 ~@4, ~ c#4@3, ~@3 e4@5", K: "~ [f#3,f#4], b2, ~ f#3@3 ~@4, ~ b3@3, ~@3 d4@5",
  L: "~@4 a3@2 c#4 d4 c#4@8, a2@3 a2@5, ~@2 e3@5 ~@9", M: "~@16 d3@15 ~, d3 ~, ~@4 f#3@27 ~, ~@8 b3@23 ~, ~@3 d4@5",
  N: "~@15 g#4@8 [c#4,g#4]@9, c#3, ~ g#3@7, ~@7 c#4@8 b3@17, ~@11 e4@21", // C#5
  O: "~@3 f#4 [b3,d4,a4]@2 [b3,e4,g#4]@2, b2@17 ~@15, ~ b3@3 ~@4, ~ [d4,a4] ~@2", // Bm7 E D5
  P: "~@4 a3@2 c#4 d4 c#4@7 ~, a2@12 a2@19 ~, ~@4 e3@9 ~@19",
  Q: "[~@3 c#4@4 ~@4 [b3,g#4]@5 ~@16 [g#3,f4]@2 ~@2 b3@27 ~ [a3,d4]@32, f#2@35 ~@61, f#4@16 ~@12 c#4@7 g#4@29 ~@32, ~@7 [c#4,a4]@9 [a3,f#4]@18 [a3,f#4]@2 ~@27 [d3,f#4]@33]/3", // E C# D5 F#m D
  R: "~@3 c#4 ~@3 c#3, a2@4 ~ b3@3, ~ e3@3 c#3@3 ~, ~ a3 f4@2, ~@3 g#3",
  S: "~ c#4 ~ [b3,g#4] ~@3 c#4, f#4 ~, ~ [c#4,a4] [a3,f#4]@2", T: "~@3 [b3,g#4]@29, [g#3,f4] a3 ~@14, ~ f#4@2 ~@29",
  U: "[d3,a3,d4,f#4]", V: "~@7 e3, a2!2, ~ a3@2 a3@3 a3@2, ~@2 e3@5 ~, ~@5 c#4@3",
  W: "~@16 d3@15 ~, d3 ~, ~@4 f#3@27 ~, ~@8 b3@23 ~, ~@12 d4@19 ~",
  X: "~ [g#3,g#4], c#3, ~ g#3@3 ~@4, ~ c#4@3, ~@11 e4@20 ~", // G#
  Y: "~@3 d4 [f#3,f#4]@4, b2@17 ~@15, ~ f#3@3 ~@4, ~@8 b3@9 ~@15", // F#
  Z: "~@16 c#4@15 ~, a2@12 a2@19 ~, ~@3 e3@28 ~, ~@7 a3@24 ~, ~@12 c#4@2 d4@17 ~",
  AA: "~@2 g#4 [c#4,g#4], c#3, ~ g#3@3 g#3@4, ~ c#4@2 ~, ~@3 e4@5", // C#5
  AB: "~@2 [b3,d4,a4] [b3,e4,g#4], b2@25 ~@7, ~ b3@3 ~@4, ~ [d4,a4] ~@2, ~@12 f#4@13 ~@7", // Bm7 E D5
  AC: "~@13 d4@3 c#4@16, a2@11 c#4@4 ~@17, ~@4 e3@13 ~@15, ~@8 a3@9 ~@15, ~@3 a2@5",
  AD: "[~@2 c#4@2 ~@2 [b3,g#4]@2 ~@8 [g#3,f4] ~ b3@14, [f#2,f#4]@16 ~@12 c#4@7 g#4@29, ~@4 [c#4,a4]@4 [a3,f#4]@9 [a3,f#4] ~@14]/2", // E C# F# F#m D
  AE: "[~@12 c#4@4 ~@11 c#3@4 ~@4 c#4@4 ~@4 [b3,g#4]@4 ~@13 c#4@4 [g#3,f4]@2 ~ [b3,g#4]@29, a2@16 ~@4 b3@11 f#4@16 ~@49, ~@4 e3@12 c#3@11 ~@4 f#2@34 ~@31, ~@8 a3@8 f4@16 ~@7 [c#4,a4]@9 ~@48, ~@23 g#3@9 ~@15 [a3,f#4]@18 ~ [a3,f#4]@2 ~@28]/3", // E C# E F#m D
  AF: "~@3 a3 ~@3 e3, a2!2, ~ a3@2 ~@2 c#4@3, ~@8 e3@9 ~@7 a3@8",
  AG: "~@3 d4 d3@4, d3 ~, ~@4 f#3@13 ~@15, ~@8 b3@9 ~@15",
  AH: "~@2 [b3,g#4] [c#4,g#4], c#3@3 ~, ~ g#3@5 ~@2, ~ c#4@2 ~, ~@12 e4@13 ~@7", // E C#5
  AI: "~@2 b3 [b3,e4,g#4], b2, ~ b3@3 ~@4, ~ [d4,a4] [d4,a4]@2, ~@3 f#4@5", // E D5
  AJ: "[~@8 a3@4 ~ d4@2 c#4@43 ~@6, a2@6 a2@23 ~@3, ~@2 e3@4 c#4 ~@25]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.26)

// chords · epiano1 · "Electric Piano"
const epiano1 = note("<~@8 A@7 B ~@8 C@7 D ~@8 E@2 F G ~>".pickRestart({
  A: "[[d4,f#4]@4 a3@4 d4@4 f#4@4 ~ f#4@2 c#4@4 d4@4 f#4@4 [e4,g#4]@4 c#4@2 d#4@2 e4@2 d#4@2 c#4@4 g#4@4 c#4@4 e4@4 g#4@4 [d4,f#4]@5 b3@2 c#4@2 ~ e4@2 f#4@4 ~@2 f#4@2 ~ d4@3 [e4,a4]@4 d4@4 [c#4,a4]@4 a3@4 [e3,c#4]@2 [f#3,d4]@2 [e3,c#4]@2 [d3,b3]@3 [e3,c#4]@7 [a3,c#4]@2 [b3,d4]@2 [c#4,e4]@3 ~@2 d4@3 a3@5 d4@4 f#4@4 ~ f#4@2 d4@4 [f#4,a4]@4 d4@4 [e4,g#4]@4 c#4@4 e4@4 c#4@2 a4@2 g#4@4 c#4@4 [e4,g#4]@2 [d4,f#4]@2 [c#4,e4]@4 [d4,f#4]@4 b3@2 c#4@2 d4@2 e4@2 f#4@4 ~ [e4,a4]@2 f#4@2 d4@3 [e4,a4] ~ [e4,a4]@3 d4@4, ~@16 [e4,a4]@2 ~@54 d4@2 ~@6 [e4,a4]@2 ~@45 f#4@4 ~@13 [e4,a4]@2 ~@78]/7", // D E D A5 F#m C#m D C#m …
  B: "[e4,a4]@4 a3@4 [e3,c#4]@2 ~@2 c#4@2 [d3,b3]@2 [e3,c#4]@15 ~, ~@5 [f#3,d4] ~@10, ~@11 e3@2 ~@19", // A5 C#m G C#m D
  C: "[[d4,f#4]@4 a3@4 d4@4 f#4@3 ~@2 f#4@2 a3@4 d4@4 f#4@3 ~ [e4,g#4]@4 c#4@2 d#4@2 e4@2 d#4@2 c#4@4 g#4@4 c#4@4 e4@4 g#4@3 ~ [d4,f#4]@4 ~@2 c#4@2 d4@2 e4@2 f#4@4 a4@4 f#4@4 e4@4 d4@4 [c#4,a4]@5 a3@4 ~@3 [e3,c#4]@2 [d3,b3]@3 [e3,c#4]@6 ~ [c#4,a4]@4 a3@4 [d4,f#4]@5 a3@2 d4@2 ~ f#4@2 ~ d4@4 a4@4 a3@3 d4@4 f#4@4 [e4,g#4]@4 c#4@4 e4@4 c#4@4 g#4@4 ~ c#4@3 ~@2 [d4,f#4]@2 [c#4,e4]@4 ~ d4@4 b3@2 c#4@2 d4@2 e4@2 f#4@3 ~ [e4,a4]@2 f#4@2 d4@4 [e4,a4]@4 d4@4, ~@15 e4@3 ~@50 b3@2 ~@34 [e3,c#4]@2 d4@2 ~@28 e4@2 ~@45 g#4@2 ~@6 f#4@4 ~@29, ~@16 a4@2 ~@87 f#3@2 ~@77 e4@2 ~@38]/7", // D E D F#m C#m G C#m F#m …
  D: "[c#4,a4]@4 a3@4 [e3,c#4]@2 [f#3,d4]@2 [e3,c#4]@2 [d3,b3]@2 [e3,c#4]@15 ~", // F#m C#m D C#m G C#m
  E: "[[d4,f#4]@4 a3@4 d4@4 f#4@3 [e4,a4]@2 f#4@2 ~ d4@4 ~ f#4@2 a4@4 ~ e4@4 c#4@4 e4@4 c#4@4 e4@4 c#4@4 e4@2 [d4,f#4]@2 [c#4,e4]@4, ~@24 e4@2 ~@5 g#4@4 ~@21 g#4 ~@7]/2", // D A5 D C#m
  F: "[d4,f#4]@5 ~ c#4@2 d4@2 e4@2 f#4@4 [e4,a4]@2 f#4@2 d4@4 [e4,a4]@2 f#4@2 e4@2 d4@2, ~@5 b3@2 ~@25", // D A5
  G: "[c#4,a4]@15 ~", // F#m
})).s("gm_epiano1").gain(0.14)

// bass · acoustic bass · "Bass"
const bass = note("<~@4 A B C@2 D@2 E@2 F@3 G@5 H I@3 J K@2 L M N O P Q@2 R@2 S@2 T@2 M B U V@2>".pickRestart({
  A: "d2", B: "c#2", C: "[b1@31 a1@33]/2", D: "[d2@31 c#2@33]/2", E: "[b1@31 a1@30 ~@3]/2",
  F: "[d2@30 ~ c#2@29 ~@3 b1@15 ~ e1@16 ~]/3",
  G: "[a1@23 ~@8 f#2@4 ~ c#3@3 a3 ~@3 g#3 ~@3 f#3@10 ~@2 c#3@2 ~@2 f3@2 f#3@2 g#3@8 c#3 ~@3 c#3@7 ~@2 c#3@7 d2@32 a1@17 c#2@15 ~]/5",
  H: "f#2@4 c#3@4 a3 ~@3 g#3 ~@3 f#3@10 ~@2 c#3@3 ~",
  I: "[~ f#3@2 g#3@8 c#3 ~@3 c#3@7 ~@2 c#3@7 d2@30 ~@2 a1@15 ~@2 a1@14 ~@2, f3 ~@47]/3", J: "d2@15 ~",
  K: "[c#2@30 ~ b1@30 ~@3]/2", L: "a1@29 ~@3", M: "d2@31 ~", N: "c#2@15 ~", O: "b1@15 ~ e1@15 ~", P: "a1@7 ~",
  Q: "[f#2@4 c#3@4 a3 ~@2 g#3 ~@4 f#3@10 ~@2 c#3@2 ~ f3@2 f#3@2 g#3@8 c#3 ~@3 c#3@6 ~@3 c#3@7 ~]/2",
  R: "[d2@29 ~@2 a1@17 c#2@16]/2",
  S: "[f#2@3 c#3@4 a3 ~@3 g#3 ~@3 f#3@10 ~@2 c#3@2 ~@2 f3@2 f#3@2 g#3@8 c#3 ~@3 c#3@6 ~@2 c#3@7 ~@2, ~@31 f#3 ~@32]/2",
  T: "[d2@30 ~ a1@14 ~@3 a1@14 ~@2]/2", U: "~ b1@29 ~@2", V: "[a1@37 ~@27]/2",
})).s("gm_acoustic_bass").gain(0.2)

stack(acoustic_guitar_nylon, epiano1, bass)

More by John Lennon