Strudelify
Silly Love Songs cover art

At the Speed of Sound

Silly Love Songs

Paul McCartney

KeyF majorTempo125 bpm
0:00/0:00
// Silly Love Songs — Paul McCartney
// 125 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 146 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 · "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.

// other · blown bottle · "Staff-2"
const blown_bottle = note("<[~@4 c3@3 ~@5 c5@3 ~]!8 ~@138>").s("gm_blown_bottle").gain(0.4).pan(0.1)

// other · piano · "Staff-5"
const piano = note(`<
  A B C@2 A B C@2 ~@16 D@2 E@2 F@2 ~@26 D@2 E@2 F@2 ~@16 G@3 H I ~@19 J ~@3 J ~@3 J ~@3 J ~@3 J ~@3 J ~@23
>`.pickRestart({
  A: "c3", B: "e3", C: "f3/2", D: "[b3@8 b3@3 ~@3 e3@2, e3@7 ~, ~@11 b3@5]/2",
  E: "[e4@8 e4@3 ~@3 f3@2, f3@7 ~, ~@11 e4@5]/2", F: "[d4@8 ~ d4@2 ~ d4 ~@3, g3@3 ~]/2",
  G: "[a3@6 g3 a3@7 g3 a3@5 c4@4]/3", H: "g3!2", I: "g3!4", J: "f2@3 f2 f2@2 g2@2",
})).s("gm_piano").gain(0.48).pan(0.1)

// chords · piano · "Staff-6"
const piano_2 = note(`<
  A B C@2 D E C@2 F G H I J K@2 L J M@2 L J N@2 L O P Q R O S T U J K@2 L J K@2 L J K@2 L J K@2 L J K@2 L J K@2 L O P Q
  R O S T U J K@2 L J K@2 L ~ V W X Y V ~@5 J K@2 L J K@2 L J K@2 L J K@2 Z ~@24 J K@2 L J K@2 AA J K@2 L J M@2 L J N@2
  L ~@3
>`.pickRestart({
  A: "[e3,g3,c4]", B: "[g3,b3,d4]", C: "[a3,c4,e4]/2", D: "[g3,c4,e4]", E: "[b3,d4,g4]",
  F: "[e4,g4]@2 c4 [e4,g4]@2 c4 [e4,g4] c4", G: "[b3,d4]@2 g3 [b3,d4]@2 g3 [b3,d4] g3",
  H: "[a3,c4,e4]@2 f3 [a3,c4,e4]@5", I: "f3!2 ~@6", J: "[g3,c4,e4]@3 [g3,c4,e4]@5",
  K: "[[g3,b3,d4]@3 [g3,b3,d4]@4 [e3,a3]@4 [f3,a3,e4]@2 f3 [f3,a3,e4]@2]/2", // G A5 Fmaj7
  L: "f3 [e3,a3] f3 [f3,a3,e4]@3 [f3,a3,e4]@2", M: "[[g3,b3,d4]@3 [g3,b3,d4]@4 [e3,a3]@4 [f3,a3,e4]@3 [f3,a3,e4]@2]/2",
  N: "[[g3,b3,d4]@3 [g3,b3,d4]@4 [e3,a3]@4 [a3,e4]@2 f3 [f3,a3,e4]@2]/2", O: "g3", P: "g3@3 g3@4 g3", Q: "a3",
  R: "a3@3 a3@4 a3", S: "~ b3@2 g3 b3@4", T: "~ d3@2 e3@2 f3@2 gb3", U: "g3 ~@3",
  V: "[g3,b3]@2 [a3,c4] ~@3 [c4,e4] ~@3 [a3,c4]@4 ~@2", W: "[c4,f4] ~@7",
  X: "[g3,c4]@2 [e3,g3] [e3,g3,c4]@2 [g3,c4] [e3,g3,c4] [e3,g3]", Y: "[b3,d4,g4] ~@7",
  Z: "f3 [e3,a3] f3 [f3,a3,e4]@3 ~@2", AA: "[a3,e4]!2 ~@6",
})).s("gm_piano").gain(0.48).pan(0.9)

// bass · electric bass pick · "Staff-3"
const bass = note(`<
  ~@8 A B C D A B C E A B C E A B C E F@2 G@2 H@2 I J A B C K A B C L A B C L A B C M A B C L A B C L F@2 G@2 H@2 I J A
  B C N A B C O P Q R S T Q U@3 V W A B C L A B C L A B C L A B C X Y Z AA AB Y Z AA AB Y Z AA AB Y Z AA AB Y Z AA AB Y
  Z AA AB A B C N A B C D A B C E A B C E A B C E AC@3
>`.pickRestart({
  A: "c2!2 a1!2 g1!2 a1 g1", B: "e1@2 f1 gb1 g1@2 g1 gb1", C: "f1 f1@2 f1!2 f1@3", D: "f1!2 ~@4 g1@2",
  E: "a1 c2@3 d2 c2@3", F: "e2/2", G: "f2/2", H: "g2/2", I: "~ d2@2 e2@2 f2@2 gb2", J: "g2 ~@3 g1@12", K: "f1 c2 a1 f1",
  L: "a1 c2@3 a1@2 f1@2", M: "a1@2 c2@6 ~ d2@3 d2@2 c2@2", N: "a1 c2@3 d2 c2 c2@2", O: "a1@2 c2 a1 c2@2 a1@2",
  P: "[e2,b2,d3] ~@7", Q: "[g1,d2] [a1,e2]@2 [c2,g2]@2 [a1,e2]@2 ~", R: "[d2,a2] ~@7", S: "c2@2 a1!2 g1!2 a1@2",
  T: "[e2,g2] ~@7", U: "[d2@2 d2@2 d2@2 c2 d2@3 d2@2 d2@2 a1 d2@3 d2@2 d2@2 d2@2]/3", V: "g1!4", W: "g1!8",
  X: "a1@3 a1", Y: "c2@12 c2@2 d2 eb2, g2", Z: "[e2,d3]", AA: "c3 a2, f2", AB: "e2", AC: "e2/3",
})).s("gm_electric_bass_pick").gain(0.48)

// chords · brass section · "Staff-7"
const brass_section = note(`<
  ~@30 A B ~@16 C D E F C D E G ~@6 A B ~@3 H ~@15 I@2 J ~ I@2 K H I@2 J ~ I@2 K ~@25 I@2 J ~ I@2 K L ~@15
>`.pickRestart({
  A: "~ d4@2 e4@2 f4@2 gb4", B: "g4 ~@3 g3@12", C: "~@2 [g4,c5,e5]@6 [g4,c5,e5] ~@3 [g4,c5,e5]!2 ~@2",
  D: "~@2 [g4,b4,d5]@6 [g4,b4,d5] ~@3 [g4,b4,d5]!2 ~@2", E: "~@2 [f4,a4,e5]@6 [f4,a4,e5] ~@3 [f4,a4,e5]!2 ~@2",
  F: "~@2 [f4,a4,e5]@6 [f4,a4,e5] ~ [e4,e5] [f4,f5] [e4,e5] [c4,c5] [a3,a4] ~", G: "~@2 [f4,a4,e5]@6 [f4,a4,e5] ~@7",
  H: "~@10 [e4,e5] [f4,f5] [e4,e5] [c4,c5] [a3,a4] ~", // E F E C A
  I: "[~@4 [g4,d5,g5] ~ [g4,d5,g5] ~ [g4,g5] [f4,f5] [e4,e5] [f4,f5] [g4,d5,g5]@7 ~@3 [d4,g4]@2 b4 ~ b4 ~ b4 [g4,d5]@3]/2", // G5 G F E F G5
  J: "c5@2 [e4,a4]@13 ~", K: "[e4,a4]@15 ~", L: "[d5,g5] ~ [d5,g5] ~@13",
})).s("gm_brass_section").gain(0.4).pan(0.7)

// chords · string ensemble 1 · "Staff-8"
const string_ensemble_1 = note(`<
  ~@31 A B C D E F C G H F C G I F C G J F C G K F C G K ~@7 A B C D I F C G L ~@6 M@3 N@2 F C G I F C G L F C G I F C G
  I O P Q R O P Q R O P Q R O P Q R O P Q R O P Q R F C G H F C G ~@16
>`.pickRestart({
  A: "~@8 a5 g5 f5 d5 f5 d5 b4@2", B: "[e4,g4]", C: "[g4,b4,d5]", D: "[a4,c5,e5]",
  E: "g4 a4 ~@2 a4@4 g4 a4 ~ a4@3 c5@2, e4!2", F: "[g4,e5]", G: "[e4,a4,c5]", H: "[f4,a4]@10 e5 f5 e5 c5 a4@2",
  I: "e5 [a4,f5]@2 e5@2 c5 [e4,a4]@2", J: "g4 a4 ~@2 a4@4 a4 ~ e5 f5 e5 c5 a4@2, e4!2", K: "[f4,a4]",
  L: "[f4,a4]@10 e5 f5 e5 c5 a4 ~", M: "[[f4,c5]@12 e4 ~ [f4,c5]@14 [c4,e4] ~ [f4,c5]@10 a4@8]/3",
  N: "[~ a5, [a4,c5,f5]]/2", O: "e4", P: "g4", Q: "e4@3 f4@5", R: "a3@3 b3",
})).s("gm_string_ensemble_1").gain(0.48).pan(0.2)

// other · church organ · "Staff-9"
const church_organ = note("<~@48 A B C D E B F D ~@51 G H I ~ G H J ~ G H I ~ G H J G ~@23>".pickRestart({
  A: "c5@5 d5 e5 f5", B: "g5@5 f5 e5 d5", C: "c5 a4 a4@2 ~@3 g4", D: "c5!2 a4@2 ~@4", E: "~@4 c5 d5 e5 f5",
  F: "c5!2 a4@2 ~@3 c4", G: "g4", H: "d5", I: "e5", J: "c5",
})).s("gm_church_organ").gain(0.48).pan(0.2)

// other · vibraphone · "Staff-10"
const vibraphone = note("<~@115 A B C D E B F D ~@23>".pickRestart({
  A: "c5@5 d5 e5 f5", B: "g5@5 f5 e5 d5", C: "c5 a4 a4@2 ~@3 g4", D: "c5!2 a4@2 ~@4", E: "~@4 c5 d5 e5 f5",
  F: "c5!2 a4@2 ~@3 c4",
})).s("gm_vibraphone").gain(0.48).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  A@7 B C@3 D C@12 E F E F E F C@26 E F E F E F C@10 G H G H G H C@20 G I J K L I J K L I J K L I J K L I J K L M N O P
  C@7 D C@12 G ~@2
>`.pickRestart({
  A: "x!2", B: "x ~@3 x ~@2 x", C: "x!4", D: "x!6 ~@2", E: "x ~@2 x ~@2 x ~", F: "x ~ x!2 ~@2 x ~", G: "x",
  H: "x ~@3 x ~@3 x ~@3 x ~ x!2", I: "~@3 x ~@2 x!2", J: "~@6 x ~@3 x!3 ~ x ~", K: "~@3 x ~ x!3",
  L: "~@6 x ~@3 x!2 ~ x ~ x", M: "x ~@2 x ~@2 x!2", N: "x ~@5 x ~@3 x!3 ~ x ~", O: "x ~ x!2 ~ x!3",
  P: "x ~@3 x ~@3 x ~@3 x!4",
})).gain(0.56)

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

// drums · low tom
const low_tom = s("lt").struct("<x!8 ~@23 [~@7 x] ~@31 [~@7 x] ~@58 [~@12 x!2 ~@2] ~@23>").gain(0.48)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 A@6 ~ B ~@24 A@6 ~ B ~@58 C ~@23>".pickRestart({
  A: "~@3 x", B: "~@8 x ~ x ~ x!2 ~@2", C: "~@4 x ~ x ~ x!3 ~@5",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@7 A ~@5 A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ B ~ A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B C@4 ~@5 A ~ B ~ A ~ B ~ D ~ D ~ E ~
  A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ F ~ A ~@24 F@2 G D@3 G D@2 ~@2 A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@7 x", B: "~ x ~@5 x", C: "~@5 x ~@2", D: "~ x ~ x ~ x ~@2", E: "x!4", F: "~ x ~ x ~ x ~ x", G: "~ x ~@2 x ~@3",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@31 [~@3 x ~@4] ~@31 [~@3 x ~@4] ~@58 [~@3 x ~@12] ~@23>").gain(0.56)

// drums · ride bell
const ride_bell = s("rd").struct("<[x ~@7 x!3 ~@5]!8 ~@138>").gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<x!8 ~@138>").gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@22 B A ~@3 A ~@26 B A ~@3 A ~@6 A ~@2 A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~ A ~ A@3 ~@23 A ~@3 A ~@2 A ~@12 A ~@2
>`.pickRestart({
  A: "x", B: "~ x ~@2",
})).gain(0.4)

// drums · shaker
const shaker = s("sh").struct("<[~@3 x!2 ~@3]!8 ~@138>").gain(0.4)

stack(
  blown_bottle, piano, piano_2, bass, brass_section, string_ensemble_1, church_organ, vibraphone, kick, snare, low_tom,
  hihat, mid_tom, open_hat, high_tom, ride_bell, tambourine, crash, shaker
)

More by Paul McCartney