Strudelify

Saturday Night and Sunday Morning

Phil Collins

KeyF majorTempo116 bpm
0:00/0:00
// Saturday Night and Sunday Morning — Collins Phil
// 116 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 130 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(116/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 · lead 2 sawtooth · "Choppy Synth Piano"
const lead_2_sawtooth = note(`<
  ~@3 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 I@8 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 I@8 A@2 B@2
  C@2 D@2 J@2 B@2 K@2 L@2 I@4 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 J@2 B@2 C@2 D@2 J@2 B@2 C@2 D@2 ~@4 J@2 B@2 C@2 M
>`.pickRestart({
  A: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,f5,a5]@3 ~ [c5,f5,a5]@2 ~ [bb4,d5,f5]@16 ~]/2", // C F Bb
  B: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,f5,a5]@3 ~ [c5,f5,a5]@2 ~ [bb4,d5,f5]@6 ~@3 [d5,f5,bb5]@3 ~ [c5,f5,a5]@3 [c5,e5,g5]]/2", // C F Bb F C
  C: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5]@3 ~ [c5,f5,a5]@3 [bb4,d5,f5]@16 ~]/2", // C F Bb
  D: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,f5,a5]@3 ~ [c5,f5,a5]@2 ~ [bb4,d5,f5]@7 ~@2 [d5,f5,bb5]@3 ~ [c5,f5,a5]@2 ~ [c5,e5,g5]]/2", // C F Bb F C
  E: "[~@8 [c4,e4]@2 ~@4 [c4,f4,a4]@17 ~, ~@8 g4 ~@23]/2", F: "[~@8 [d4,g4,bb4]@2 ~@4 [c4,f4,a4]@17 ~]/2",
  G: "[~@4 [c4,e4,g4] ~@2 [c4,f4,a4]@9]/2", H: "[~@4 [d4,g4,bb4] ~@2 [c4,f4,a4]@8 ~]/2",
  I: "[[a4,c5,e5]@8 [g4,b4,d5]@6 ~ [f4,a4,c5,e5]@16 ~]/2", // Am G Fmaj7
  J: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5]@3 ~ [c5,f5,a5]@2 ~ [bb4,d5,f5]@16 ~]/2", // C F Bb
  K: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,f5,a5]@3 ~ [c5,f5,a5]@3 [bb4,d5,f5]@16 ~]/2", // C F Bb
  L: "[~@4 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,f5,a5]@3 ~ [c5,f5,a5]@2 ~ [bb4,d5,f5]@7 ~@2 [d5,f5,bb5]@3 ~ [c5,f5,a5]@3 ~]/2", // C F Bb F
  M: "~@4 [c5,e5,g5] ~ [c5,e5,g5] ~@9", // C
})).s("gm_lead_2_sawtooth").gain(0.24).pan(0.9)

// bass · synth bass 2
const bass = note(`<
  ~@2 A@4 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@8 A@4 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@8 A@4 ~@2 A@2 ~@2
  A@2 ~@2 A@2 ~@4 A@4 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@4 A@4 ~@2 A@2
>`.pickRestart({
  A: "[~@15 c2@4 ~@13]/2",
})).s("gm_synth_bass_2").gain(0.38)

// chords · electric guitar clean · "Rhythm Guitar"
const electric_guitar_clean = note(`<
  ~@7 A B A C ~@4 D E F G H ~@3 D E F G I J K@2 L M N O A B A C A B A C ~@4 D E F G H ~@3 D E F G I J K@2 L M N O A B A
  C A B A C P ~@7 I J Q R A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~@4 A B A C A S ~
>`.pickRestart({
  A: "[c4,e4,g4] c4 e4 c4 [c4,e4,g4] ~@5 [c4,e4,g4] ~@5", // C
  B: "[bb3,d4,f4,g4] ~ [bb3,d4,g4] ~ [bb3,d4,f4,g4] ~@5 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~@2", // Gm7 Gm Gm7 Bb
  C: "[bb3,d4,f4,g4] bb3!3 [bb3,d4,f4,g4] ~@4 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@2", D: "c4@2 c4 ~@3 c4 ~ c4!3 ~@3 c4 ~",
  E: "c4 ~ c4 ~@2 c4!2 ~ c4 ~ c4 ~ c4 ~ c4 ~", F: "c4 ~ c4 ~ c4 ~ c4 ~ c4 ~ c4 ~@2 c4!2 ~",
  G: "c4 ~ c4 ~ c4 ~ c4 ~ d4@2 ~@2 d4@2 ~@2", H: "[c4,e4,g4] ~@3 [c4,e4,g4] ~@2 [c4,e4,g4] ~@8", I: "~@8 g3 ~@3 g3 ~@3",
  J: "f3 ~, a3 ~@3", K: "[[a3,a4] a3 ~ a3 ~ a3 ~@2 g3 ~@3 g3@3 [f3,a3,c4]@10 ~@7]/2", L: "a3@4 ~@4 g3 ~@3 g3 ~@3",
  M: "f3@9 ~@7", N: "[a3,a4] a3 ~ a3 ~@2 a3 ~ a3 ~@3 g3 ~@2 g3", O: "f3 ~", P: "[c4,e4,g4] c4 e4 c4 [c4,e4,g4] ~@11",
  Q: "[a3,a4] a3 ~ a3 ~ a3 ~@2 g3 ~@3 g3@3 g3", R: "f3@5 ~@3", S: "[bb3,d4,f4,g4] ~ [bb3,d4,g4] ~ [bb3,d4,f4,g4] ~@11",
})).s("gm_electric_guitar_clean").gain(0.28).pan(0.2)

// chords · electric guitar clean · "Rhythm Guitar" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@7 A B A C ~@7 D E ~@6 D ~@2 F ~@3 F ~ A B A C A B A C ~@7 D E ~@6 D ~@2 F ~@3 F ~ A B A C A B A C A ~@9 F ~ A B A C
  A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~@4 A B A C A G H
>`.pickRestart({
  A: "~@2 g4 ~@13", B: "~ bb3 ~ bb3 ~@12", C: "~@2 d4 ~@8 bb3 ~@4", D: "~@10 c4 ~@3 c4 ~",
  E: "~ c4 [e4,g4] c4 ~ c4 [e4,g4] ~@9", F: "~@2 a3 ~@13", G: "~ bb3 ~ bb3 ~@6 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~@2",
  H: "[c4,e4,g4] c4 [e4,g4] c4 [c4,e4,g4] ~@11", // C Em C
})).s("gm_electric_guitar_clean").gain(0.16).pan(0.2)

// other · electric guitar muted · "Mute Guitar"
const electric_guitar_muted = note(`<
  ~@15 A B C D ~@4 A B C D ~@2 E ~ F ~@15 A B C D ~@4 A G C D ~@2 E ~ F ~@19 F ~ E ~@44
>`.pickRestart({
  A: "~@3 c4!2 ~@2 c4!2 ~@3 c4 ~@3", B: "~@2 c4 c4@2 c4 ~ c4 ~ c4 ~@4 c4 ~", C: "~@7 c4 ~ c4 ~ c4 ~ c4 ~ c4",
  D: "~ c4 ~@2 c4 ~ c4!3 ~ c4!3 ~ c4!2", E: "~ a3!3 ~@12", F: "c4 ~@3", G: "~@2 c4!2 ~ c4 ~ c4 ~ c4 ~@4 c4 ~",
})).s("gm_electric_guitar_muted").gain(0.2).pan(0.2)

// other · electric guitar muted · "Mute Guitar" · soft notes
const electric_guitar_muted_2 = note("<~@15 A B C ~@5 A B C ~@21 A B C ~@5 A B C ~@72>".pickRestart({
  A: "~@5 c4 ~@3 c4 ~@5 c4", B: "~@15 c4", C: "~ c4 ~@14",
})).s("gm_electric_guitar_muted").gain(0.1).pan(0.2)

// other · trumpet
const trumpet = note(`<
  ~@2 A ~ A B C D E@2 F ~@16 G ~ H I ~@2 J K ~@2 L M ~@2 N O ~ A ~@2 P Q R A ~ S@2 ~ T@2 ~@2 G ~ J U ~@2 J K ~@2 L M ~@2
  N O V W V W V X V Y G ~ J K ~@2 Z AA ~@2 N O AB AC AB AC AB AC AB AC V W ~@2 V W ~@2 V W ~@2 V W ~@2 AD AE AD AE AD AE
  AD AE AD AE AF
>`.pickRestart({
  A: "~@15 c6", B: "[a5,b5] [d5,e5,f5,g5] ~@14", C: "~@12 c6 ~ d6 c6", D: "~@12 c6 ~@3",
  E: "[~@10 c6 a5 c6!2 a5 c6@2 d6 e6 ~@13]/2", F: "~@4 c6 ~ c6 ~ c6 ~ d6 c6 ~ d6 c6 ~", G: "a5 ~@15", H: "~@15 g5",
  I: "a5 ~ a5 ~ g5 a5 ~ a5 ~@4 g5 a5 ~ a5", J: "~@15 a5", K: "~ e5 g5!2 ~ g5 ~ a5 ~@4 bb5 b5 ~ c6",
  L: "~@9 c6 a5!2 c6 ~ a5 c6", M: "~ c6 a5 ~ c6 ~ c6 ~ a5 c6 ~@2 c6!2 ~ c6", N: "~@11 c5 e5 g5 a5 ~",
  O: "bb5 g5 a5 bb5 ~@4 c6 ~ c6@2 ~ c6!3", P: "~@11 c6 ~@4", Q: "c6 ~ c6!2 ~@4 c6!2 a5 g5 c6!2 a5 g5",
  R: "c6 ~ c6!2 ~@12", S: "[~@15 c6@2 a5 ~@14]/2", T: "[~@8 f5 ~ f5@2 ~ f5!2 f5@2 e5 c5 ~@13]/2",
  U: "~@2 e5 ~ g5 a5 ~ a5 ~@2 e5 ~ g5 a5 ~ a5", V: "~@3 c6 ~ c6 a5 g5 c6!2 ~@5 c6",
  W: "~ c6 a5 g5 c6!2 a5 g5 c6 g5 a5 c6 ~ c6 ~ c6", X: "~ c6 a5 g5 c6!2 ~@2 c6 ~@2 c6 ~ c6 ~ c6",
  Y: "~ c6 a5 g5 c6!2 ~@2 c6 ~@2 c6 ~ c6 ~@2", Z: "~@9 c6 a5 g5 c6 ~ a5 c6",
  AA: "~ c6 a5 ~ c6 ~ c6 ~ c6!2 ~@2 c6!2 ~ c6", AB: "~ c6 ~@2 c6 ~ c6 ~@2 c6 ~@2 c6 ~ c6 ~", AC: "~ c6 ~@2 c6@2 c6 ~@9",
  AD: "~ c6 ~ c6 ~ c6 a5 g5 c6!2 ~@6", AE: "~@8 c6 ~ c6 ~@2 c6!3", AF: "~ c6 ~ c6 ~ c6 ~@10",
})).s("gm_trumpet").gain(0.49).pan(0)

// other · brass section
const brass_section = note(`<
  ~@2 A B A ~ C D E@2 F ~@16 G ~ H I ~@2 J K@2 ~ L M ~@2 N O ~ A B ~ P Q R A B S@2 ~ T@2 ~@2 G ~ J U ~@2 J K@2 ~ L M ~@2
  N O V W V W X Y X Z G ~ J K@2 ~ L AA ~@2 N O AB AC AB AC AB AC AB AC V W ~@2 V W ~@2 V W ~@2 V W ~@2 AD AE AD AE AD AE
  AD AE AD AE ~
>`.pickRestart({
  A: "~@15 c5", B: "[a4,b4] g4 ~@14", C: "~@12 c5 ~ d5 c5", D: "~@12 c5 [a4,b4] g4 ~",
  E: "[~@10 c5 a4 c5!2 a4 c5@2 d5 e5 d5 ~@12]/2", F: "~@4 c5 ~ c5 ~ c5 ~ d5 c5 ~ c5@2 ~", G: "a4 [gb4,ab4] e4 ~@13",
  H: "~@15 g4", I: "a4 ~ e4 ~ g4 a4 ~ a4 ~@4 g4 a4 ~ a4", J: "~@15 a4",
  K: "[~ e4 g4!2 ~ g4 ~ a4 ~@4 bb4 b4 ~ c5@2 ~@15]/2", L: "~@9 c5 a4 ~ c5 ~ a4 c5",
  M: "~ c5 a4 ~ c5 ~ c5 ~ a4 c5 ~@2 c5!2 ~ c5", N: "~@11 c4 e4 g4 a4 ~", O: "bb4 g4 a4 bb4 ~@4 c5 ~ c5@2 ~@2 c5!2",
  P: "~@11 c5 [a4,b4] g4 ~@2", Q: "c5 ~ c5!2 ~@4 c5!2 a4 g4 c5!2 a4 g4", R: "c5 ~ c5!2 ~@12",
  S: "[~@15 c5@2 a4 ~@14]/2", T: "[~@8 f4 ~ f4@2 ~ f4!2 f4@2 e4 c4 ~@13]/2",
  U: "~@2 e4 ~ g4 a4 ~ a4 ~@2 e4@2 g4 a4 ~ a4", V: "~@3 c5 ~ c5 a4 g4 c5!2 ~@5 c5",
  W: "~ c5 a4 g4 c5!2 a4 g4 c5 g4 a4 c5 ~ c5 ~ c5", X: "~@3 c5 ~ c5 a4 g4 c5!2 ~ d4 e4 g4 a4 g4",
  Y: "bb4 g4 a4 g4 c5!2 a4 ~ c5 g4 a4 c5 ~ c5 ~ c5", Z: "bb4 g4 a4 g4 c5!2 a4 ~ c5 g4 a4 c5 ~ c5 ~@2",
  AA: "~ c5 a4 ~ c5 ~ c5 ~ c5!2 ~@2 c5!2 ~ c5", AB: "~ c5 ~@2 c5 ~ c5 ~@2 c5 ~@2 c5 ~ c5 ~", AC: "~ c5 ~@2 c5 ~ c5 ~@9",
  AD: "~ c5 ~ c5 ~ c5 a4 g4 c5!2 ~ d4 e4 g4 a4 g4", AE: "bb4 g4 a4 g4 bb4!2 a4 g4 c5 g4 a4 c5 ~ c5!3",
})).s("gm_brass_section").gain(0.49).pan(0.9)

// other · brass section · soft notes
const brass_section_soft = note(`<
  ~@3 A ~@3 B ~ C ~@17 D ~@7 E ~ F ~@4 G ~@2 A ~ H ~@3 A ~@7 D ~@7 E ~ F ~@4 G ~@5 I ~ I D ~@3 E ~ J ~@4 G ~@34 K
>`.pickRestart({
  A: "~ [d4,e4,f4] ~@14", B: "~@14 [d4,e4,f4] ~", C: "~@3 c5 [g4,a4,b4] f4 ~@10", D: "~@2 [b3,db4,d4] ~@13",
  E: "[a4,b4] [e4,f4,g4] [c4,d4] ~@13", F: "~@11 a4 ~@4", G: "~@13 c5 ~@2", H: "~@13 [d4,e4,f4] ~@2", I: "~@7 g4 ~@8",
  J: "~@11 g4 ~@4", K: "~ c5 ~ c5 ~@12",
})).s("gm_brass_section").gain(0.27).pan(0.9)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  ~@3 A B A B A B A B A B A B A B A B A B A B A B A B C D C E C D C F A B A B A B A B A B A B A B A B A B A B A B A B C
  D C E C D C F A B A B A B A B A B A B A B A B C D C E A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  ~@4 A B A B A B G
>`.pickRestart({
  A: "~@3 c2 ~ c2 a1 g1 c2!2 ~@5 c2", B: "~ c2 a1 g1 c2!2 a1 g1 c2 g1 a1 c2 ~ c2 ~ c2",
  C: "a1@2 ~@2 a1@2 ~@2 a1@2 ~@2 a1@3 a1", D: "a1@2 ~@2 a1@2 ~@2 a1 ~ a1 ~ a1@4",
  E: "a1@2 ~@2 a1@2 ~@2 a1@2 ~@2 g1 a1@2 a1", F: "a1@2 ~@2 a1@2 ~@2 a1 ~@3 [c2,c3]@3 ~", G: "~@3 c2 ~ c2 ~@10",
})).s("gm_electric_bass_finger").gain(0.33)

// chords · fretless bass · "Synth Sound"
const fretless_bass = note(`<
  ~@3 A B C D A B C D ~@24 A B C D A B C D ~@24 A B C D A B C D ~@12 A B C D A B C D A B C D A B C D A B C D A B C D A B
  C D A B C D ~@4 A B C D A B E
>`.pickRestart({
  A: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4] ~@2 [c4,f4,a4] ~@4, ~@4 g4 ~@3", // C F
  B: "~@4 [bb3,d4,g4] ~ [bb3,d4,g4] ~ [bb3,d4] ~@3 [bb3,d4,a4]@2 ~ [c4,e4,g4], ~@4 g4 ~@3", // Gm Bb Bbmaj7 C
  C: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,f4,a4]@3 [c4,f4,a4] ~@4", // C F
  D: "~@4 [bb3,d4,g4] ~ [bb3,d4,g4] ~ [bb3,d4,g4] ~@3 [bb3,d4,a4]@3 [c4,e4,g4]", E: "~@4 [c4,e4,g4] ~@11",
})).s("gm_fretless_bass").gain(0.34).pan(0.3)

// other · glockenspiel · "Bell"
const glockenspiel = note("<~@28 A ~@3 A ~@27 A ~@3 A ~@19 A ~@45>".pickRestart({
  A: "f6@2 ~@2 e6 ~@3 c6 ~@3 d6@3 e6",
})).s("gm_glockenspiel").gain(0.52).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B C
>`.pickRestart({
  A: "x!2", B: "x ~@3 x!2 ~@2", C: "x",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!128 [~ x ~@2]>").gain(0.36)

// drums · low tom
const low_tom = s("lt").struct("<~ [~@15 x]!128 ~>").gain(0.28)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!129 [x!2 ~@2]>").gain(0.28)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@13 x ~@2",
})).gain(0.32)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@13 x ~@2",
})).gain(0.32)

stack(
  lead_2_sawtooth, bass, electric_guitar_clean, electric_guitar_clean_2, electric_guitar_muted, electric_guitar_muted_2,
  trumpet, brass_section, brass_section_soft, bass_2, fretless_bass, glockenspiel, kick, snare, low_tom, hihat, mid_tom,
  high_tom
)

More by Phil Collins