Strudelify
KeyA majorTempo130 bpm
0:00/0:00
// Jet — Paul McCartney
// 130 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (2/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 132 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar 3.
setcpm(130/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 · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  A@3 B@4 C@8 D@6 E@2 F@2 G@2 H@4 D@6 E@2 F@2 G@2 H@4 D@4 I J ~@2 I J ~@2 I J K@2 L M L M D@2 E@2 F@2 G@2 H@4 D@4 I J
  ~@2 I J ~@2 I J K@2 L M L M D@2 E@2 F@2 G@2 H@4 D@4 H@4 D@2 N@4 O@2 P@2 Q@3
>`.pickRestart({
  A: "[~@11 [b3,d4,f#4]@14 [b3,f#4,a4]@18 [b3,d4,f#4]@5]/3", // Bm B7 Bm
  B: "[~@10 [b3,f#4,a4]@18 [b3,e4,g#4,b4]@33 [b3,d4,f#4]@3]/4", // B7 E Bm
  C: "[~@11 [b3,f#4,a4]@18 ~ [b3,d4,f#4]@14 [b3,f#4,a4]@18 [b3,e4,g#4,b4]@33 [b3,d4,f#4]@14 ~ [b3,f#4,a4]@18]/8", // B7 Bm B7 E Bm B7
  D: "[a3,c#4,e4]/2", E: "[[a3,d4,f#4]@2 [a3,d4,f#4] [a3,d4,f#4]@2 [a3,c#4,e4]@11]/2", F: "[a3,c#4,e4]",
  G: "[[a3,d4,f#4]@15 ~]/2", H: "[[e4,g#4,b4]@15 [d4,f#4,c#5]@3 [d4,f#4,b4] [d4,f#4,b4]@4 [b3,f#4,a4]@9]/4",
  I: "~@7 [f#4,a4]", J: "[f#4,a4]!7 ~", K: "[[c#4,e4,a4]@3 [e4,a4,f#5]@2 [e4,a4,c#5]@9 ~@2]/2",
  L: "d5 c#5 ~@2 c5 b4 ~@2, [e4,a4] ~ [e4,a4] ~", M: "b5 a5 ~ [e4,a4,c#5,e5]@4 ~, [c#5,e5] ~@3",
  N: "[[b3,d4,f#4]@7 [b3,f#4,a4]@9]/2", O: "[b3,e4,g#4,b4]/2", P: "[b3,d4,f#4]/2", Q: "[[a3,c#4]@7 [a3,c#4]@37 ~@4]/3",
})).s("gm_distortion_guitar").gain(0.21)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A@3 B@4 C@8 D@4 E@3 D E@3 D F G H@2 I J E J E@3 D E@3 D F G H@2 I J E J K@3 L K@3 L K@2 D@2 E@7 D E@3 D F G H@2 I J E
  J K@3 L K@3 L K@2 D@2 E@7 D E@3 D F G M@2 I J E J F G M@2 I J N@4 O@2 E@2 P@2 ~
>`.pickRestart({
  A: "[~@11 b2@8 b2@4 c#3@2 d3@18 b2@5]/3", B: "[~@4 b2@4 c#3@2 d3@18 c#3@33 b2@3]/4",
  C: "[~@5 b2@4 c#3@2 d3@18 ~ b2@8 b2@4 c#3@2 d3@18 c#3@33 b2@8 b2@4 ~ c#3@2 d3@18]/8", D: "a2!8", E: "a2!4",
  F: "c#3!4", G: "c#3 ~ c#3 ~", H: "[b2@4 b2@2 c#3 d3@7 ~@2]/2", I: "a2 ~ a2@2 a2@2 a2@2", J: "a2!4, e3", K: "b2!8",
  L: "e2!8", M: "[b2@4 b2@2 c#3 d3@5 ~@4]/2", N: "[b2@4 b2@2 c#3 d3@9]/2", O: "c#3/2", P: "[a2@7 a2@25]/2",
})).s("gm_electric_bass_finger").gain(0.35)

// other · tenor sax · "Sax"
const tenor_sax = note("<~@127 A B C@3>".pickRestart({
  A: "~@2 a5@3 f#5@2 e5", B: "c#5@3 b4@2 a4@3 a4@3 b4@2 c#5@3", C: "[f#4@4 ~ f#4@2 f#4@5 e4@33 ~@3]/3",
})).s("gm_tenor_sax").gain(0.45)

// other · brass section · "Brass"
const brass_section = note(`<
  A@3 B@4 C@8 ~@14 D@2 ~@14 D@2 ~@7 E ~@3 E ~@2 F@2 ~@14 D@2 ~@7 E ~@3 E ~@2 F@2 ~@14 D@2 ~@6 D@2 ~@2 D@4 ~@7
>`.pickRestart({
  A: "[~@11 [b2,b3]@8 [b2,b3]@4 [c#3,c#4]@2 [d3,d4]@18 [b2,b3]@5]/3", // B C# D B
  B: "[~@4 [b2,b3]@4 [c#3,c#4]@2 [d3,d4]@18 [c#3,c#4]@33 [b2,b3]@3]/4", // B C# D C# B
  C: "[~@5 [b2,b3]@4 [c#3,c#4]@2 [d3,d4]@18 ~ [b2,b3]@8 [b2,b3]@4 [c#3,c#4]@2 [d3,d4]@18 [c#3,c#4]@33 [b2,b3]@8 [b2,b3]@4 ~ [c#3,c#4]@2 [d3,d4]@18]/8", // B C# D B C# D C# B …
  D: "[[b2,b3]@4 [b2,b3]@2 [c#3,c#4] [d3,d4]@9]/2", E: "e3@2 ~ f#3@2 ~@2 g#3@2 ~ a3@2 ~@2 a#3@2", F: "[c#4,e4,a4]/2",
})).s("gm_brass_section").gain(0.51)

// chords · electric guitar clean · "Guitar 2"
const electric_guitar_clean = note(`<
  A B C D E F G H I J K L@2 M N ~@12 O@2 P Q ~@12 O@2 P Q ~@16 R S ~@10 O@2 P Q ~@28 O@2 P Q ~@4 O@2 P Q ~@2 T N T N O@2
  N@2 ~@3
>`.pickRestart({
  A: "~@15 [d3,f#3,b3]", B: "~ [d3,f#3,b3] ~@5 [f#3,a3,b3] ~@7 [d3,f#3,a3]", C: "~ [d3,f#3,a3] ~@5 [d3,f#3,a3] ~@8",
  D: "[d3,f#3,b3] ~ [d3,f#3,b3] ~@5 [f#3,a3,b3] ~@7", E: "[d3,f#3,a3] ~ [d3,f#3,a3] ~@5 [d3,f#3,a3] ~@7",
  F: "[e3,g#3,b3] ~ [e3,g#3,b3] ~@5 [e3,g#3,b3] ~@7", G: "~ [e3,g#3,b3] ~ [e3,g#3,b3] ~@5 [e3,g#3,b3] ~@6",
  H: "~ [d3,f#3,b3] ~ [d3,f#3,b3] ~@5 [f#3,a3,b3] ~@6", I: "~ [d3,f#3,a3] ~@2 [d3,f#3,a3] ~@5 [d3,f#3,a3] ~@5",
  J: "~@2 [d3,f#3,b3] ~ [d3,f#3,b3] ~@5 [f#3,a3,b3] ~@5", K: "~@2 [d3,f#3,a3] ~ [d3,f#3,a3] ~@5 [d3,f#3,a3] ~@5",
  L: "~@3 [e3,g#3,b3] ~ [e3,g#3,b3] ~@5 [e3,g#3,b3] ~@4", M: "~@3 [d3,f#3,b3] ~ [d3,f#3,b3] ~@5 [f#3,a3,b3] ~@4",
  N: "~@4 [d3,f#3,a3] ~ [d3,f#3,a3] ~@5 [d3,f#3,a3] ~@3", O: "~@4 [e3,g#3,b3] ~ [e3,g#3,b3] ~@5 [e3,g#3,b3] ~@3",
  P: "~@4 [d3,f#3,c#4] ~ [d3,f#3,c#4] ~@5 [d3,f#3,c#4] ~@3", Q: "~@4 [f#3,a3,b3] ~ [f#3,a3,b3] ~@5 [f#3,a3,b3] ~@3",
  R: "d5 c#5@3 c5 b4@3, [e4,a4]!2", S: "b5 a5@3 [e4,a4,c#5,e5]@4, [c#5,e5] ~",
  T: "~@4 [d3,f#3,b3] ~ [d3,f#3,b3] ~@5 [f#3,a3,b3] ~@3", // Bm B7
})).s("gm_electric_guitar_clean").gain(0.57).pan(0.1)

// bass · lead 1 square · "FX1"
const bass_2 = note(`<
  A B@2 C@2 ~ D@5 ~ E@3 F@12 ~@2 G@2 F@12 ~@2 G@2 F@4 ~@10 F@14 ~@2 G@2 F@4 ~@10 F@14 ~@2 G@2 F@4 ~@2 G@2 F@2 G@4 ~@7
>`.pickRestart({
  A: "~@11 b1@5", B: "[~@3 b1@2 ~@2 c#2@2 d2@15 ~@3 b1@5]/2", C: "[~@4 b1@2 ~@2 c#2@2 d2@15 ~@7]/2",
  D: "[~@13 b1@6 ~@2 b1@2 ~@2 c#2@2 d2@15 ~@4 b1@6 ~@2 b1@2 ~@2 c#2@2 d2@15 ~@5]/5",
  E: "[~@15 b1@6 ~@2 b1@2 ~@3 c#2@2 d2@15 ~@3]/3", F: "a1/2", G: "[b1@3 ~ b1 ~ c#2 d2@7 ~@2]/2",
})).s("gm_lead_1_square").gain(0.5)

// chords · electric guitar clean · "Guitar 3"
const electric_guitar_clean_2 = note("<~@5 A@2 ~@4 B@2 ~@112 C@2 ~@5>".pickRestart({
  A: "[[g#4,b4,e5,g#5]@29 ~@3]/2", B: "[~@3 [g#4,b4,e5,g#5]@29]/2", C: "[~ [g#4,b4,e5,g#5]@7]/2",
})).s("gm_electric_guitar_clean").gain(0.45)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note("<~@27 A@2 ~@14 A@2 ~@30 A@2 ~@30 A@2 ~@6 A@2 ~@12 B@3>".pickRestart({
  A: "[[b3,e4,g#4]@15 ~]/2", B: "[[a2,a5]@7 [e3,e5]@40 ~]/3",
})).s("gm_string_ensemble_2").gain(0.53)

// other · viola
const viola = note(`<
  ~@51
  [b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~]!3
  [e2 ~@2 f#2 ~@3 g#2 ~@2 a2 ~@3 a#2 ~]
  [b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~]!3
  [e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~]
  [b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~]!2
  [a2 ~@15]
  ~@70
>`).s("gm_viola").gain(0.76)

// chords · piano
const piano = note("<~@64 A B C D ~@28 A B C D ~@32>".pickRestart({
  A: "~@12 [c#6,e6,a6]!4", B: "[c#6,e6,a6]!16", C: "[c#6,e6,a6]!13 [g6,a6] f6 [b5,c#6,e6]", D: "a5 ~@15",
})).s("gm_piano").gain(0.56).pan(1)

// other · lead 2 sawtooth · "Lead Synth"
const lead_2_sawtooth = note("<~@67 A B C@2 D B E F G ~@56>".pickRestart({
  A: "~@2 a5@3 f#5@2 e5", B: "c#5@3 b4@2 a4@3 a4@3 b4@2 c#5@3", C: "[f#4@2 f#4 f#4@2 e4@7 ~@4]/2",
  D: "a5@3 a5@2 a5@3 a5@3 f#5@2 e5@3", E: "f#4", F: "e4 f#4 e4 f#4 e4 f#4 e4 f#4 e4 f#4 e4 f#4 e4 f#4 e4 f#4", G: "e4",
})).s("gm_lead_2_sawtooth").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  A B A C D E F G H I J K L M N O P O P O P O P O P O P Q R S N O P O P O P O P O P O P Q R S N O P O P T@10 U N O P O P
  O P O P O P O P Q R S N O P O P T@10 U N O P O P O P O P O P O P Q R S N O P O P Q R S N O P S ~ S ~ Q V Q V W ~@2
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@7 x ~ x ~@6", C: "~@4 x!2 ~@2", D: "~@3 x", E: "~@11 x ~ x ~@2", F: "~@13 x ~@2",
  G: "~@9 x ~ x ~@4", H: "~@7 x", I: "~@5 x!2 ~", J: "~@15 x", K: "~@13 x ~ x", L: "~ x ~@13 x", M: "~@6 x!2",
  N: "~@2 x!2", O: "x ~@2 x!2 ~@3", P: "x ~@3 x!2 ~@2", Q: "x ~@6 x", R: "x!2 ~@6", S: "x ~@5 x!2", T: "x!4",
  U: "x!3 ~", V: "x", W: "x ~@6 x ~@4 x ~@3",
})).gain(0.61)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@51 A@2 B A@3 B A@3 C ~@21 A@2 B A@3 B A@3 C ~@38>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~", C: "x!6 ~@2",
})).gain(0.53)

// drums · crash
const crash = s("cr").struct(`<
  A B A C D ~ E A F D ~@2 G F ~ H@12 ~@2 I ~ H@12 ~@2 I ~ H@4 ~@2 F J ~@3 K ~@4 H@12 ~@2 I ~ H@4 ~@2 F J ~@3 K ~@4 H@12
  ~@2 F ~ H@4 ~@2 I ~ H@2 I ~ I ~@3 L ~ M ~@2
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@9 x ~@6", C: "~@5 x ~@2", D: "~@3 x", E: "~@13 x ~@2", F: "~@7 x", G: "~@15 x", H: "x!8",
  I: "x ~@6 x", J: "~ x ~ x ~@4", K: "x ~@2 x ~@4", L: "x", M: "x ~@6 x ~@4 x ~@3",
})).gain(0.31)

stack(
  distortion_guitar, bass, tenor_sax, brass_section, electric_guitar_clean, bass_2, electric_guitar_clean_2,
  string_ensemble_2, viola, piano, lead_2_sawtooth, kick, snare, hihat, low_tom, crash
)

More by Paul McCartney