Strudelify
The Long and Winding Road cover art

Let It Be

The Long and Winding Road

The Beatles

KeyE♭ majorTempo84 bpm
0:00/0:00
// The Long and Winding Road — The Beatles
// 84 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 62 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(84/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(`<
  ~@2 A B C D E F G H I J K L A M N D I F O P Q F R S T S U L A M N D I F O P Q F R V W X Y L A M N D I F O P Q F Z AA
  AB@4
>`.pickRestart({
  A: "~ bb1 bb1@2 bb1 bb1@3", B: "eb2@3 ~ db2@2 ~@2", C: "ab1@3 ~", D: "ab1 ~ g1 ~", E: "c2 ~@3", F: "f1 ~ bb1 ~",
  G: "eb2@3 [d2,e2,f2] g2@3 [gb2,g2,ab2] bb2@3 [ab2,a2,b2] db3@2 ~@2, ~@4 gb2 ~@3 a2 ~@3 c3 ~@3", H: "ab2@3 ~ g2@3 ~",
  I: "c2", J: "f1@3 ~ bb1@2 ~@2", K: "eb2", L: "c3", M: "eb2 ~ db2 ~", N: "ab1 ~@3",
  O: "eb2@3 [db2,d2,eb2] f2@2 ~@2 bb2@2 ~@2 db3@2 ~@2, ~@4 e2 ~@11", P: "ab2 ~ g2 ~", Q: "c2@3 ~", R: "eb2 ~",
  S: "bb2 ~ ab2 ~", T: "g2 ~ f2 bb1", U: "g2 ~ f2 bb2", V: "bb2@2 bb2@2 ab2@2 ~ ab2", W: "g2@2 ~ g2 f2@2 bb2 ~",
  X: "bb2@2 bb2 ~ ab2@2 ab2 ~", Y: "g2@2 g2 ~ f2@2 bb2@2", Z: "eb2@3 ~", AA: "~ bb1 bb1@2 bb1 bb1@2 ~", AB: "eb2/4",
})).s("gm_fretless_bass").gain(0.32).pan(0.6)

// chords · piano · "Piano 1"
const piano = note(`<
  ~ A@3 B C D E F G H I J A@3 B K L M N O P Q R S T S T A@3 B K L M N O P Q R S T S T A@3 B K L M N O P Q U@2 V@4
>`.pickRestart({
  A: "[~@4 [bb3,bb4] [g3,g4]@2 [c4,eb4,ab4,c5]@2 [bb1,bb2,c4,eb4,ab4,c5] [bb1,bb2,c4,eb4,ab4,c5]@2 [bb1,bb2,c4,eb4,ab4,c5] [eb4,ab4,c5]@2 ~@8 g4, c2@8 ~@5 [bb1,bb2,c4]@3 [eb2,eb3]@4 [db2,db3,eb4]@4, eb4@2 d4@2 ~@11 eb4@5 ~@4, ~ c3@2 c3@5 ~@7 bb4@4 bb4@3 bb4@2, ~@15 g4@3 g4@3 g4@2 ~]/3", // Bb G Ab Bbsus2 Eb Dbsus2
  B: "ab4@2 ~@5 eb4, [ab1,ab2,c4], eb4@4 eb4@3 ~, ~@2 ab4@3 g4@3, ~@3 bb4", // Ab
  C: "eb4@2 ~ ab4 [f4,g4,bb4,d5]@2 [f4,g4,bb4,d5]@2, [ab1,ab2,c5,eb5] [g1,g2], ab4@3 ~@5, ~ eb4 ~@2", // Gm7 Ab G
  D: "bb4@2 eb5 ~@4 c4, eb4@3 eb4, g4@5 g4@3, [c2,c3,c5]!2, ~@3 d5@4 ~", // C
  E: "[c4,eb4,f4,ab4]!2 [d4,f4,ab4,bb4]!2, [f1,f2] [bb1,bb2]", F: "[db4,f4,ab4,bb4]!4, [eb2,eb3]!2",
  G: "[eb4,ab4,c5]!2 [d4,f4,g4,bb4]!2, [ab1,ab2] [g1,g2]", // Ab Gm7 Ab G
  H: "[eb4,g4]@2 c5@2 ~@3 c4, c4@7 ~, [c2,c3] [c2,c3,c5], ~ eb4@2 eb4, ~@2 g4@3 g4@3", // Eb C
  I: "[c4,eb4,f4,ab4]@2 [eb4,f4,ab4]@2 ~@3 bb3, [f1,f2] [bb1,bb2], ~@2 c4@3 bb3@2 ~, ~@2 [d4,f4,bb4]!2", // Fm7 F Bb
  J: "[bb3,eb4,g4]@2 [bb3,eb4,g4]@2 [bb3,eb4,g4]@2 eb4 d4, [eb2,eb3], ~@3 [bb3,g4]", // Eb
  K: "ab4 ~@2 ab4 [d4,f4,g4,bb4]@2 [d4,f4,g4,bb4]@2, [ab1,ab2,c5,eb5] [g1,g2], ~ ab4@2 ~@5, ~ eb4 ~@2", // Gm7 Ab G
  L: "c4 ~ eb4!2 g4!4, [c2,c3], [eb4,g4] [g4,c5] [c5,eb5]!2, ~ c4@7", // C Eb C5 Cm
  M: "f4!8, [f1,f2] [bb1,bb2], [ab4,c5]!2 [ab4,bb4,d5]!2", N: "db4!8, [eb2,eb3]!2, [f4,ab4,bb4]!4",
  O: "c4 ~@2 ab4 [d4,f4,g4,bb4]@2 [d4,f4,g4,bb4]@2, [ab1,ab2] [g1,g2], ab4@3 ~@5, eb4!2 ~@2, ~ c4@3 ~@4", // Gm7 Ab G
  P: "[c4,eb4,g4]@2 ~@5 c4, [c2,c3], ~ c4@2 eb4, ~@2 eb4@3 g4@3, ~ g4 c5@2", // Cm C
  Q: "~ f4!3 ~@3 bb3, [f1,f2] [bb1,bb2], [c4,eb4,ab4] [eb4,ab4,c5] [d4,f4,bb4]!2, ~@5 bb3@2 ~", // F Bb Ab Bb
  R: "eb3 ~@6 eb3, eb2, [bb3,eb4,g4,bb4]!4, ~ eb3@2 eb3@2 eb3@2 ~", // Eb
  S: "bb3 ~@2 bb3 ab3 ~@2 ab3, bb2 ab2, [eb4,g4,bb4]@2 [eb4,g4,bb4]@2 ~ ab3@2 ~, ~ bb3@2 ~ [c4,eb4,ab4]@2 [c4,eb4,ab4]@2", // Eb Ab
  T: "g3 ~@2 g3 f3!2 bb3!2, g2@2 [f2,c4,f4,ab4] [bb2,d4,f4,ab4,bb4], [bb3,eb4,g4]!2 ~@2, ~ g3@2 ~@5", // Fm Bb7 Eb
  U: "[[eb4,eb5]@2 [d4,d5]@2 [bb3,bb4] [g3,g4]@2 [bb1,bb2,c4,eb4,ab4,c5]@2 [bb1,bb2,c4,eb4,ab4,c5] [bb1,bb2,c4,eb4,ab4,c5]@2 [bb1,bb2,c4,eb4,ab4,c5] [bb1,bb2,c4,eb4,ab4,c5]@3, [eb2,eb3]@7 ~@9]/2", // Eb D Bb G Ab Eb
  V: "[eb2,eb3,eb4,g4,bb4]/4", // Eb
})).s("gm_piano").gain(0.54).pan(0.6)

// chords · string ensemble 1 · "Strings 1"
const string_ensemble_1 = note(`<
  ~@2 A B C D E F G H I J K L M B N O P Q R S T N U V W X Y Z M B N O P Q R S T N U V W X Y Z M B N O P Q R S T AA AB AC
  AD@4
>`.pickRestart({
  A: "~@2 [eb4,ab4,c5] ~ [eb4,ab4,c5]@4 [eb4,ab4,c5] ~ [eb4,ab4,c5]@4 ~@2", B: "[eb4,g4,bb4]", C: "c4@2 bb3 g3, c5",
  D: "[c4,c5] [bb3,eb5]", E: "c4 d4 c4@2, g5", F: "[eb4,ab4] [d4,f4,c5]", G: "[eb4,g4,bb4]@2 [eb4,f4,ab4] [eb4,g4,bb4]",
  H: "[eb4,ab4,c5] [f4,bb4]", I: "g5@2 d5 f5 c5 eb5 g4 bb4, c4", J: "[eb4,ab4,c5] [f4,ab4,d5]",
  K: "~ g3 f4 eb4 d4 c4 [bb3,d5] [g3,g5], eb5@3 ~", L: "c6",
  M: "~@2 [eb4,ab4,c5] ~ [eb4,ab4,c5]@4 [eb4,ab4,c5] ~ [eb4,ab4,c5]@6", N: "c5", O: "c5 eb5", P: "g5", Q: "ab4 c5",
  R: "bb4 g4 ab4 bb4", S: "c5 bb4", T: "g5@2 d5 f5 c5 eb5 g4 bb4", U: "bb4", V: "bb4 d4 eb4 bb4 c5 d4 eb4 c5",
  W: "d5 d4 eb4 d5 eb5 ab4 c5 eb5", X: "bb5 d5 eb5 bb5 c6 c5 eb5 c6", Y: "d6 d5 eb5 d6 eb6 ab5 eb6 f6", Z: "g6",
  AA: "c6 d6", AB: "eb6", AC: "~@2 [eb4,ab4,c5,eb6] ~ [eb4,ab4,c5,eb6]@4 [eb4,ab4,c5,eb6] ~ [eb4,ab4,c5,eb6]@6",
  AD: "[eb4,g4,bb4,eb6]/4", // Eb
})).s("gm_string_ensemble_1").gain(0.25).pan(0.7)

// other · string ensemble 1 · "Strings 2"
const string_ensemble_1_2 = note("<~@2 A B C D E F G H I J K ~@28 L M N M ~@17>".pickRestart({
  A: "~@2 [bb1,bb2] ~ [bb1,bb2]@4 [bb1,bb2] ~ [bb1,bb2]@4 ~@2", B: "[eb2,eb3] [db2,db3]", C: "[ab2,eb3]",
  D: "[ab2,eb3] [g2,f3]", E: "[c2,eb3]", F: "[f2,ab3] [bb2,ab3]", G: "[eb2,eb3]", H: "[ab2,ab3] [g2,d3,bb3]",
  I: "[c2,g2,eb3]", J: "[f2,f3] [bb2,ab3]", K: "[eb2,bb2,g3]", L: "g3@7 ~ ab3@8, f3 ~@15", M: "g3@2 f3 bb3",
  N: "g3 ab3",
})).s("gm_string_ensemble_1").gain(0.32).pan(0.4)

// other · trumpet
const trumpet = note(`<
  ~@2 A B C ~@9 D E F ~@2 G H I F J K ~@5 D E F ~@2 G H I F J K ~@5 D E F ~@2 G H I F L M@2 N@4
>`.pickRestart({
  A: "~@2 c5 ~ c5@4 c5 ~ c5@4 ~@2", B: "bb4 ~", C: "c5", D: "~@2 c5 ~ c5@4 c5 ~ c5@6", E: "bb4", F: "c4",
  G: "ab4@2 eb4 d4", H: "db4!3 eb4", I: "c4@4 d4 eb4@3", J: "ab4!2", K: "g4", L: "c5!2",
  M: "[eb5@2 d5@2 bb4 g4@2 c5@9]/2", N: "bb4/4",
})).s("gm_trumpet").gain(0.49).pan(0.4)

// other · trombone
const trombone = note("<~@2 A B C ~@9 D B E ~@6 F G ~@5 D B E ~@6 F G ~@5 D B E ~@6 H I@2 J@4>".pickRestart({
  A: "~@2 ab4 ~ ab4@4 ab4 ~ ab4@4 ~@2", B: "g4", C: "c4", D: "~@2 ab4 ~ ab4@4 ab4 ~ ab4@6", E: "ab3", F: "eb4 f4",
  G: "eb4", H: "ab4!2", I: "[eb4@2 d4@2 bb3 g3@2 c4@9]/2", J: "g4/4",
})).s("gm_trombone").gain(0.49).pan(0.3)

// other · trombone
const trombone_2 = note("<~@2 A B ~@10 C B D ~@6 E F ~@5 C B D ~@6 E F ~@5 C B D ~@6 G ~@2 H@4>".pickRestart({
  A: "~@2 eb4 ~ eb4@4 eb4 ~ eb4@4 ~@2", B: "eb4", C: "~@2 eb4 ~ eb4@4 eb4 ~ eb4@6", D: "eb3", E: "c4@2 d4 bb3",
  F: "bb3", G: "eb4 d4", H: "eb4/4",
})).s("gm_trombone").gain(0.49).pan(0.2)

// other · trombone
const trombone_3 = note("<~@16 A B C D E ~@11 A B C D E ~@11 A B C D E ~@5 F@4>".pickRestart({
  A: "~ ab4 g4 eb4", B: "c4 eb4", C: "g4@2 c5 d5", D: "eb5 c5", E: "bb4 g4 ab4 bb4", F: "bb3/4",
})).s("gm_trombone").gain(0.49).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A@6 B ~ A@2 B ~ A C D A@7 E F A@2 B ~ A C D A@11 B ~ A C D A@5 D B G ~@4
>`.pickRestart({
  A: "x!2", B: "x", C: "x ~@3 x ~@2 x", D: "x!4", E: "x ~ x!2", F: "x!3 ~", G: "~ x!2 ~ x!2 ~ x",
})).gain(0.32)

// drums · snare
const snare = s("sd").struct("<~@2 A B@9 C ~ A B@10 D E B F G A B@10 H I H F G A B@9 ~ A ~@4>".pickRestart({
  A: "~ x!2 ~ x!2 ~@2", B: "~ x ~ x", C: "~@3 x", D: "~@4 x ~@2 x ~@4 x ~@3", E: "~@4 x ~@6 x!4 ~",
  F: "~@4 x ~@3 x!2 ~@2 x!2 ~ x", G: "x", H: "~@4 x ~@2 x ~@4 x ~@2 x", I: "~@4 x ~@2 x ~@3 x!2 ~ x ~",
})).gain(0.29)

// drums · hihat
const hihat = s("hh").struct("<~@9 [~ x ~ x] [~ x ~@2] ~@51>").gain(0.29)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A ~@5 A ~@2 A ~@2 A ~@5 A ~@5 A ~@3 A ~@5 A ~@5 A ~@3 A ~@5 A ~ B ~ C ~@4
>`.pickRestart({
  A: "x", B: "x!4", C: "~@7 x",
})).gain(0.29)

// drums · ride
const ride = s("rd").struct(`<
  ~@3 A B C D E F ~ G H ~@3 I F J H K H A L F@3 M N O ~@2 I F J H K H A L F@3 M N O ~@2 I F J H K H A L ~@7
>`.pickRestart({
  A: "~ x!3", B: "x ~ x ~ x!4", C: "x!7 ~", D: "x ~@3 x ~ x ~ x ~ x ~ x!3 ~", E: "x!4", F: "x!8",
  G: "~@9 x!2 ~ x ~ x ~", H: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", I: "~@2 x ~@3 x!2", J: "x ~ x ~ x ~ x!2",
  K: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", L: "x ~@3 x ~ x!3 ~ x ~ x ~ x ~", M: "x!6 ~@2", N: "~ x!7", O: "x!4 ~@4",
})).gain(0.29)

stack(
  bass, piano, string_ensemble_1, string_ensemble_1_2, trumpet, trombone, trombone_2, trombone_3, kick, snare, hihat,
  crash, ride
)

More by The Beatles