Strudelify

Ballad of John and Yoko

The Beatles

KeyE majorTempo125 bpm
0:00/0:00
// Ballad of John and Yoko — The Beatles
// 125 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 59, 4/4 at bar 59) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(125/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano
const piano = note(`<
  ~@24 A@2 ~@2 B C ~@18 D E F@6 G H ~@16 I J@3 K L@3 M N O J P Q R S T U V S T U V W@2
>`.pickRestart({
  A: "~ e5 ~ e5 ~ e5 ~ e5", B: "~@5 e5 ~ e5", C: "~ e5 ~ e5 ~ e5 ~@2",
  D: "~@2 [g5,g#5]!2 [f5,f#5]!2 [d#5,e5]!2 [d5,d#5]!2 [c5,c#5]!2 [g#4,a4]!2 [g4,g#4]!2", // G#maj7 F#maj7 Emaj7 D#maj7 C#maj7 Amaj7 G#maj7
  E: "[f3,f#3]!2 [e3,f3]!2 [d#3,e3]!2 [d3,d#3]!2 [c#3,d3]!2 [b2,c3,c#3] [c3,c#3] [b2,c3]!2 [a#2,b2]!2", // F#maj7 Fmaj7 Emaj7 D#maj7 Dmaj7 C#maj7 Cmaj7 Bmaj7
  F: "[c#4,e4,a4]!8", G: "[d#4,f#4,b4]!8", H: "[d#4,f#4,b4]!6 ~@2", I: "~@4 [g#4,b4,e5]!4", J: "[g#4,b4,e5]!8",
  K: "[g#4,b4,e5]!4 [g#4,b4,d5,e5]!4", L: "[g#4,b4,d5,e5]!8", M: "[g#4,b4,d5,e5]!4 [a4,c#5,e5]!4", N: "[a4,c#5,e5]!8",
  O: "[a4,c#5,e5]!4 [g#4,b4,e5]!4", P: "[g#4,b4,e5]!3 [g#4,b4,c5,e5] [f#4,b4,d#5]!4", Q: "[f#4,b4,d#5]!8",
  R: "[f#4,b4,d#5]!4 [b4,e5,g#5]!4", S: "[b4,e5,g#5]!8", T: "[b4,e5,g#5]!4 [b4,d#5,f#5]!4", U: "[b4,d#5,f#5]!8",
  V: "[b4,d#5,f#5]!4 [b4,e5,g#5]!4", W: "[[b4,e5,g#5]!4 [b4,c#5,e5,g#5]@8 ~@4]/2",
})).s("gm_piano").gain(0.32).pan(0.3)

// chords · electric guitar clean · "Guitar 1"
const electric_guitar_clean = note(`<
  ~@3 A ~ B ~@4 C D E F G H I J ~ A ~ B ~@4 C D E F G H I J ~ A ~ B ~@4 C D E F G H I K ~@9 L M N M ~@3 O@2 P@2 Q@2 R@2
  ~ L M N M ~@3 O@2 P@2 Q@2 R@2 S T ~ U V W X@3
>`.pickRestart({
  A: "~@6 e5@2 c#5 b4 ~@2 c#5 b4 ~@2", B: "~@2 e5@2 c#5 b4 ~@2 c#5 b4 ~@2 c#5 b4 ~@2",
  C: "~@3 [e4,c#5]@2 [d#4,b4]@2 [d4,b4]", D: "[c#4,a4] ~", E: "~@3 [b3,g#4]@2 [a#3,g4]@2 [a3,b3,f#4]", F: "[g#3,e4] ~",
  G: "~@3 [f#4,d#5]@2 [f4,d5]@2 [e4,c#5]", H: "[d#4,b4] ~", I: "~@3 [b3,g#4]@2 [a#3,g4]@2 [a3,f#4]", J: "[g#3,e4] ~@3",
  K: "[b3,e4] ~@3", L: "~@7 e5", M: "c#5 b4 ~@2 c#5 b4 ~@10", N: "~@10 e5@2 c#5 b4 ~@2",
  O: "[~@7 [e4,c#5]@2 [d#4,b4]@2 [d4,b4] [c#4,a4]@4]/2", P: "[~@7 [b3,g#4]@2 [a#3,g4]@2 [a3,b3,f#4] [g#3,e4]@4]/2",
  Q: "[~@7 [f#4,d#5]@2 [f4,d5]@2 [e4,c#5] [d#4,b4]@4]/2", R: "[~@7 [b3,g#4]@2 [a#3,g4]@2 [a3,f#4] [g#3,e4]@2 ~@2]/2",
  S: "~@7 [a3,f#4]", T: "[b3,g#4]@3 [a#3,g4]@2 [a3,f#4]@3 [b3,g#4]@8", U: "~@5 b2 c#3 d#3",
  V: "e3@2 f#3@2 g#3@2 a3@2 [b3,d#4]@3 [b3,d#4]@2 [b3,d#4]@3", // B
  W: "[b3,d#4]@3 [b3,d#4]@2 [b3,d#4]@3 [b3,d#4]@3 [a3,c#4]@2 [a3,c#4]@3", // B A
  X: "[[a3,c#4]@3 g#3@2 f#3@3 e3@4 e3@2 c#3@4 e3@2 c#3@2 ~@2 [b3,c#4,e4,g#4]@16 ~@8]/3", // A C#m7
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.7)

// chords · acoustic guitar steel · "Guitar 2"
const acoustic_guitar_steel = note(`<
  A B@2 C B C D@4 E@2 B@2 F@2 B G B C B C D@4 E@2 B@2 F@2 B G B C B C D@4 E@2 B@2 F@2 B@2 E@6 H I J B K B L D@3 M E N B
  O F P Q B@2 K B L D@3 M E N B O F P B O F P B O F P R@2
>`.pickRestart({
  A: "[e3,g#3,b3,e4]!2 [e3,g#3,b3,e4,f4] [e3,g#3,b3,e4]!5", B: "[e3,g#3,b3,e4]!8",
  C: "[e3,g#3,b3,e4]!4 [e3,g#3,b3,c4,e4] [e3,g#3,b3,e4]!3", D: "[e3,g#3,b3,d4,e4]!8", E: "[a3,c#4,e4,a4]!8",
  F: "[b2,d#3,f#3,a3,b3]!8", G: "[e3,g#3,b3,e4]!3 [e3,g#3,b3,e4,f4] [e3,g#3,b3,e4]!4", H: "[b2,d#3,f#3,b3]!8",
  I: "[b2,d#3,f#3,b3]!6 ~@2", J: "~@4 [e3,g#3,b3,e4]!4", K: "[e3,g#3,b3,c4,e4] [e3,g#3,b3,e4]!7",
  L: "[e3,g#3,b3,c4,e4] [e3,g#3,b3,e4]!3 [e3,g#3,b3,d4,e4]!4", M: "[e3,g#3,b3,d4,e4]!4 [a3,c#4,e4,a4]!4",
  N: "[a3,c#4,e4,a4]!4 [e3,g#3,b3,e4]!4", O: "[e3,g#3,b3,e4]!4 [b2,d#3,f#3,a3,b3]!4",
  P: "[b2,d#3,f#3,a3,b3]!4 [e3,g#3,b3,e4]!4", Q: "[e3,g#3,b3,e4]!7 [e3,g#3,b3,e4,f4]",
  R: "[[e3,g#3,b3,e4]!4 [g#3,b3,c#4,e4]@8 ~@4]/2", // E C#m7
})).s("gm_acoustic_guitar_steel").gain(0.25).pan(0.7)

// bass · electric bass pick · "Bass"
const bass = note(`<
  A@10 B@2 A@2 C@2 A@10 B@2 A@2 C@2 A@10 B@2 A@2 C@2 A@2 B@6 C D E@8 F@8 G@8 F@8 H@5 I J@3
>`.pickRestart({
  A: "e1@2 ~ g#1@2 b1 c#2 b1", B: "a1@2 ~ c#2@2 e2 f#2 e2", C: "b1@2 ~ d#2@2 f#2 g#2 f#2", D: "b1@2 ~ d#2@2 f#2 ~@2",
  E: "[~@4 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1]/8",
  F: "[~ b1 c#2 b1 a1@2 ~ c#2@2 e2 f#2 e2 a1@2 ~ c#2@2 e2 f#2 e2 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 b1@2 ~ d#2@2 f#2 g#2 f#2 b1@2 ~ d#2@2 f#2 g#2 f#2 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1]/8",
  G: "[~ b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1]/8",
  H: "[~ b1 c#2 g#1 b1@2 ~ d#2@2 f#2 g#2 f#2 b1@2 ~ d#2@2 f#2 g#2 f#2 e1@2 ~ g#1@2 b1 c#2 b1 e1@2 ~ g#1@2 b1 c#2 g#1 b1@2 ~ f#2]/5",
  I: "~ f#2 f#1@2 b1@2 ~ f#2", J: "[~ f#2 b1@2 e2@2 ~ c#2@2 b1 g#1@2 e1@8 ~@4]/3",
})).s("gm_electric_bass_pick").gain(0.36).pan(0.7)

// other · electric guitar muted · "Gtr Mute"
const electric_guitar_muted = note("<~@9 A ~@15 A ~@15 A ~@7 B ~@15 C ~@15 C ~@17>".pickRestart({
  A: "~@3 d#3 ~@4", B: "~@5 a3 f#3@2", C: "~@7 d#3",
})).s("gm_electric_guitar_muted").gain(0.45).pan(0.7)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x ~@4]!58 [~@4 x ~@2 x]!39 [~ x] ~>").gain(0.29)

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

// drums · low tom
const low_tom = s("lt").struct("<~ [~@3 x] ~@97>").gain(0.29)

// drums · hihat
const hihat = s("hh").struct("<A B A@47 C A@7 B D A@30 E D A@2 ~ D A@2 F ~>".pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "x", D: "~@4 x!4", E: "x!7 ~", F: "x!4 ~@4",
})).gain(0.29)

// drums · crash
const crash = s("cr").struct("<~@97 [~ x] ~>").gain(0.29)

// drums · high tom
const high_tom = s("ht").struct("<~ A ~@15 B ~@15 B ~@15 C ~@23 D E ~@14 F G ~@2 H I ~@4>".pickRestart({
  A: "~@5 x ~@2", B: "x!2 ~ x ~ x!2 ~", C: "~ x!7", D: "~@4 x!2 ~ x", E: "~ x!2 ~@5", F: "~@7 x", G: "x!2 ~@2",
  H: "~ x ~ x!2 ~@2 x", I: "~ x ~@2",
})).gain(0.29)

// drums · shaker
const shaker = s("sh").struct("<~@74 [~@8 x!8] [x!16]!22 [x!8 ~@8] ~>").gain(0.29)

stack(
  piano, electric_guitar_clean, acoustic_guitar_steel, bass, electric_guitar_muted, kick, snare, low_tom, hihat, crash,
  high_tom, shaker
)

More by The Beatles