Strudelify
Let 'em In cover art

At the Speed of Sound

Let 'em In

Paul McCartney

KeyB♭ majorTempo88 bpm
0:00/0:00
// Let 'em In — Paul McCartney
// 88 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 2, 4/4 at bar 3, 2/4 at bar 4, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/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 · piano
const piano = note(`<
  ~@3 A B A C D E A C A B A C D E A C F B A C D E A C A B A C D E A G H I J K L M N O P Q@8 R@8 S T U C V C D E A C A B
  A C D E A W
>`.pickRestart({
  A: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2, [a3,d4]", B: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2, [g3,d4]",
  C: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2, [g3,d4]@15 ~", D: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2, [a3,eb4]@15 ~",
  E: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2, [g3,eb4]@15 ~", F: "bb1 bb2 bb1 bb2 ~ bb2 bb1 bb2, [a3,d4]",
  G: "bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 [bb1,b1] [c2,db2,d2,eb2,e2] [f2,gb2,g2,ab2,a2,bb2] [b2,c3,db3,d3,eb3,e3,f3,gb3,g3], [g3,d4]@3 ~", // Bmaj7 G5
  H: "[a3,bb3] ~ f2 ~ [f1,c4]@2 f2 ~ f1@2 f2 ~ f1@2 f2 ~, [f3,ab3], c4@4 f4 ~ f4@6 ~@4, f1@2 ~@5 eb4@9, ~@5 c4@3", // Bbmaj7 F5 Fm
  I: "bb1@2 bb2!2 [bb1,f4]@2 [bb2,f4] bb2 bb1@2 bb2 ~ bb1@2 bb2 ~, ~ ab3@3, ~@7 [f3,d4]@9", // Bb5 Dm
  J: "f1@2 f2 ~ f1@2 f2 ~ f1@2 f2 ~ f1@2 f2 ~, ~@4 [ab3,c4]@5 ~ [f3,ab3,c4]@6, ~@4 f4 ~ f4@6 ~@4, ~@7 eb4@9", // Ab Fm
  K: "bb1@2 bb2 ~ [bb1,f4]@2 [bb2,ab3,f4] bb2 bb1@2 bb2 ~@3 bb2 ~, ~@4 ab3 ~@2 f3@9, ~@7 [ab3,d4]@5 bb1@2 ~@2, ~@13 [ab3,d4]@3", // Bb5 Bb7 Abdim
  L: "f1@2 f2 ~ [ab3,c4,f4] ~ [f2,f4] f2 f1@2 f2 ~ f1@2 f2 ~, ~@4 f1@2 [ab3,c4]@4 [f3,ab3,c4]@5 ~, ~@7 eb4@3 ~@6", // Fm F Ab Fm
  M: "bb1@2 bb2 ~ [ab3,bb3,f4] ~ [bb2,f4] bb2 bb1@2 bb2 ~ bb1@2 bb2 ~, ~@4 bb1@2 [ab3,bb3]@9 ~, ~@7 [f3,d4]@7 ~@2", // Bb7 Bb5 Absus2 Dm
  N: "f1@2 f2 ~ [f3,ab3,c4,f4] ~ [f2,f4] f2 f1@2 f2 ~ f1@2 f2 ~, [f3,ab3,c4]@4 f1@2 f3@9 ~, ~@3 [ab3,c4]@2 [ab3,c4]@2 ~, ~@7 eb4@8 ~", // Fm F Fm Ab
  O: "[a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~", // F
  P: "[a4,c5,e5] ~ [a4,c5,e5] ~ [a4,c5,e5] ~ [a4,c5,e5] ~ [a4,c5,eb5]@7 ~", // Am Adim
  Q: "[[f4,a4,d5]@4 [f4,a4,c5]@3 ~ bb1@2 bb2@2 [a3,d4] ~ bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2, ~@8 [a3,d4]@4 bb1@2 [a3,d4]@9 ~ [g3,d4]@16 [a3,d4]@16 [g3,d4]@15 ~ [a3,eb4]@15 ~ [g3,eb4]@15 ~ [a3,d4]@16 [g3,d4]@8]/8", // Dm F D5 G5 D5 G5 Adim Cm …
  R: "[bb1@2 bb2@2 [bb1,b1] [c2,db2,d2,eb2,e2] [f2,gb2,g2,ab2,a2,bb2] [b2,c3,db3,d3,eb3,e3,f3,gb3,g3] [a3,bb3] ~ f2 ~ [f1,c4]@2 f2 ~ f1@2 f2 ~ f1@2 f2 ~ bb1@2 bb2!2 [bb1,f4]@2 [bb2,f4] bb2 bb1@2 bb2 ~ bb1@2 bb2 ~ f1@2 f2 ~ f1@2 f2 ~ f1@2 f2 ~ f1@2 f2 ~ bb1@2 bb2 ~ [bb1,f4]@2 [bb2,ab3,f4] bb2 bb1@2 bb2 ~@3 bb2 ~ f1@2 f2 ~ [ab3,c4,f4] ~ [f2,f4] f2 f1@2 f2 ~ f1@2 f2 ~ bb1@2 bb2 ~ [ab3,bb3,f4] ~ [bb2,f4] bb2 bb1@2 bb2 ~ bb1@2 bb2 ~ f1@2 f2 ~ [f3,ab3,c4,f4] ~ [f2,f4] f2 f1@2 f2 ~ f1@2 f2 ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~, ~@8 [f3,ab3]@16 ~@4 ab3@12 ~@4 [ab3,c4]@5 ~@11 ab3 ~@2 [ab3,d4]@5 bb1@2 ~@6 f1@2 ~@14 bb1@2 ~@14 f1@2 ~@18, ~@8 c4@4 f4 ~ f4@6 ~@24 f4 ~ f4@6 ~@27 eb4@3 ~@29 eb4@8 ~@9, ~@8 f1@2 ~@5 eb4@9 ~@23 eb4@9 ~@13 [ab3,d4]@3 ~@6 [ab3,c4]@4 ~@12 [ab3,bb3]@9 ~@7 [ab3,c4]@4 [ab3,c4]@4 ~@10, ~@18 c4@6 ~@7 [f3,d4]@9 ~@10 [f3,ab3,c4]@6 ~@7 f3@9 ~@10 [f3,ab3,c4]@5 ~@8 [f3,d4]@7 ~@2 [f3,ab3,c4]@4 ~@2 f3@9 ~@9]/8", // Bmaj7 Bbmaj7 F5 Bb5 Bb7 Fm F Bb7 …
  S: "[a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,e5] ~ [a4,c5,e5] ~ [a4,c5,e5] ~ [a4,c5,e5] ~", // F Am
  T: "[a4,c5,eb5]@7 ~ [f4,a4,d5]@4 c5 d5 c5 a4, ~@3 [f4,a4]", // Adim Dm F
  U: "bb1@2 bb2@2 [a3,d4] ~ bb2@2 ~@2 bb2@2 bb1@2 bb2@2, f4, ~@2 bb1 [a3,d4]@5", // D5
  V: "[a3,d4] ~ bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2, bb1 [a3,d4]@6 ~", // D5
  W: "bb1 bb2 bb1 bb2 bb1 bb2 ~@2, [g3,d4]@3 ~", // G5
})).s("gm_piano").gain(0.44).pan(0.6)

// bass · electric bass finger
const bass = note("<~@3 A@32 B A C A B A B D E@2 A@7 F G H I J G H K@2 L A@15 M>".pickRestart({
  A: "bb1@3 ~ bb1@3 ~ bb1@3 ~ bb1@3 ~", B: "f1@3 ~ f1@3 ~ f1@3 ~ f1@3 ~", C: "f1@3 ~ f1@3 ~ f1@3 ~ f1@4", D: "f2@7 ~",
  E: "[c3@8 [f2,f3]@16 bb1@3 ~ bb1@3 ~]/2", F: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ f1@3 ~ f1@3 ~",
  G: "f1@3 ~ f1@3 ~ bb1@3 ~ bb1@3 ~", H: "bb1@3 ~ bb1@3 ~ f1@3 ~ f1@3 ~", I: "f1@3 ~ f1@4 bb1@3 ~ bb1@3 ~",
  J: "bb1@3 ~ bb1 ~ bb1@2 f1@3 ~ f1@3 ~", K: "[f1@3 ~ f1@3 ~ f2@14 ~@2 c3@8]/2", L: "f2@3 f1",
  M: "bb1@3 ~ bb1@3 ~ bb1@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.38)

// other · trumpet
const trumpet = note("<~@55 A B A C@2 ~@18>".pickRestart({
  A: "~@3 bb4 g5 ~ gb5 f5@6 ~@3", B: "~@3 f4 bb4 ~ a4 ab4@6 ~@3", C: "[~@3 f4 bb4 ~ a4 ab4@17 ~@8]/2",
})).s("gm_trumpet").gain(0.36).pan(0.7)

// other · lead 3 calliope
const lead_3_calliope = note("<~@19 A B C D ~@15 E ~@3 F@2 ~@11 G@2 ~@2 H@3 ~@16>".pickRestart({
  A: "~@4 f4 ~ f4@2 f4 d4 f4 d4 f4 bb4@2 ~", B: "~@4 f4!2 ~ f4!2 eb4 d4 f4@3 ~@2",
  C: "~@4 f4@2 f4 ~ f4 d4 f4 d4 f4 bb4@2 ~", D: "~@4 f4 f4@2 f4!2 eb4 d4 f4@3 ~@2", E: "~@4 bb4 bb4@2 f4@5 ~@4",
  F: "[a4@2 g4@2 bb4@6 ~@14 f4@7 ~, ~@10 a4@21 ~, ~@16 c5@15 ~]/2", G: "[~@12 bb4 bb4@2 f4@5 ~@12]/2",
  H: "[~@4 a4 g4 bb4@3 ~@7 f4@3 ~@5, ~@9 a4@10 ~@5, ~@12 c5@7 ~@5]/3",
})).s("gm_lead_3_calliope").gain(0.25).pan(0.6)

// other · trombone
const trombone = note("<~@55 A B C D@2 ~@18>".pickRestart({
  A: "~@3 c4 g4 ~ gb4 f4@6 ~@3", B: "~@3 bb3 d4 ~ db4 c4@6 ~@3", C: "~@3 f4 bb4 ~ a4 ab4@6 ~@3",
  D: "[~@3 bb3 g4 ~ gb4 f4@17 ~@8]/2",
})).s("gm_trombone").gain(0.36).pan(0.3)

// other · trombone
const trombone_2 = note("<~@44 A B C D E F G@3 ~@25>".pickRestart({
  A: "~@12 d4@2 d4 ~", B: "d4 ~ d4 ~ d4 f4@4 ~@3 d4 ~ d4 ~", C: "d4@2 c4 d4@4 ~@5 d4@2 d4 ~",
  D: "d4 ~ d4 c4 d4 f4@3 ~@4 d4 ~ d4 ~", E: "d4@2 c4 d4@3 g3@10", F: "~@3 d4@5", G: "[~@4 g3 ~ bb3@7 ~ f3@22 ~@12]/3",
})).s("gm_trombone").gain(0.44)

// other · piccolo
const piccolo = note("<~@31 A B C D ~@39 A B C D>".pickRestart({
  A: "eb6@2 ~ f6 g6 ~@2 a6 bb6@2 ~ a6 g6@2 ~ f6", B: "eb6@2 ~ f6 g6@2 ~ a6 bb6 ~@2 a6 g6@2 ~ f6",
  C: "d6 ~@2 f6 g6@2 ~ a6 bb6@2 ~ a6 g6@2 ~ f6", D: "d6 f6@6 ~",
})).s("gm_piccolo").gain(0.24).pan(0.6)

// chords · alto sax
const alto_sax = note("<~@53 A B C D E F@2 ~@18>".pickRestart({
  A: "~@3 c4 g4 ~ gb4 f4@6 ~@3", B: "~@3 f3 bb3 ~ a3 ab3@6 ~@3", C: "~@3 bb3 g4 ~ gb4 f4@6 ~@3",
  D: "~@3 [f3,bb3] [bb3,g4] ~ [a3,gb4] [ab3,f4]@6 ~@3", E: "~@3 [f4,bb4] [bb4,d5] ~ [a4,db5] [ab4,c5]@6 ~@3",
  F: "[~@3 bb4 [d5,f5] ~ [db5,e5] [c5,eb5]@17 ~@8]/2", // Dm Dbm Cm
})).s("gm_alto_sax").gain(0.28)

// other · taiko drum
const taiko_drum = note(`<
  ~@70
  [~@5 b1@2 ~@9]!2
  [~@5 b1@2 ~@7 b1@2]
  [~@5 b1@2 ~@9]
  [~@5 b1 ~@8 b1 ~]
  [~@5 b1 ~@7 b1!2 ~]
  [~@5 b1 ~@7 b1 ~ b1]
  [~@5 b1 ~@10]
>`).s("gm_taiko_drum").gain(0.14)

// chords · vibraphone
const vibraphone = note("<A@3 ~@75>".pickRestart({
  A: "[~ a4 ~ d5, gb5@3 ~ gb5@2, ~ d5@5 a4@6, ~@2 e5@4 ~ e5@5]/3",
})).s("gm_vibraphone").gain(0.22)

// other · lead 3 calliope
const lead_3_calliope_2 = note("<~@62 A B A B A B C ~@9>".pickRestart({
  A: "f4@3 bb4", B: "g4@3 a4", C: "f4@7 ~",
})).s("gm_lead_3_calliope").gain(0.25).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@3 A@39 B ~ C A@14 D ~@2 A@15 D>".pickRestart({
  A: "x!4", B: "x", C: "~@2 x!2", D: "x!3 ~",
})).gain(0.44)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@28 A ~ B C D E F ~@36 A ~ B C D E G>".pickRestart({
  A: "~@13 x ~ x", B: "~@11 x ~ x ~@2", C: "~@13 x ~@2", D: "~@3 x ~@2 x ~@4 x ~ x ~ x", E: "~@3 x ~@3 x ~@5 x ~@2",
  F: "~@7 x ~@3 x ~ x ~@2", G: "~@7 x ~@3 x ~@4",
})).gain(0.11)

// drums · hihat
const hihat = s("hh").struct("<~@3 A@32 B C@2 D C D E ~@2 F G@7 H E@6 I ~@2 A@15 J>".pickRestart({
  A: "~ x!7", B: "~ x!6 ~", C: "x!7 ~", D: "x ~ x!5 ~", E: "x!8", F: "~@5 x!3", G: "x!4 ~ x!3", H: "x!3 ~@2 x!3",
  I: "x!3 ~@5", J: "~ x!5 ~@2",
})).gain(0.22)

// drums · open hat
const open_hat = s("oh").struct("<~@35 [~@7 x]!6 ~@37>").gain(0.49)

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

stack(
  piano, bass, trumpet, lead_3_calliope, trombone, trombone_2, piccolo, alto_sax, taiko_drum, vibraphone,
  lead_3_calliope_2, kick, snare, snare_soft, hihat, open_hat, crash
)

More by Paul McCartney