Strudelify

A Groovy Kind of Love

Phil Collins

KeyA majorTempo78 bpm
0:00/0:00
// A Groovy Kind of Love — Phil Collins
// 78 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 11 "elec piano" piano (copy of ch 1 "piano" piano); ch 4 "strings2" string ensemble 2 (copy of ch 3 "strings" string ensemble 1); ch 13 "choir" choir aahs (copy of ch 3 "strings" string ensemble 1); ch 9 "cello" cello (copy of ch 8 "synth strings" synth strings 1)
// note: Full arrangement: all 62 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(78/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("<A B@2 C D E@2 F G H I J K L M N O P Q F R S@8 T U@7 V@3 W X@8 Y Z@6 AA@4 ~@2>".pickRestart({
  A: "[d4,g4]@3 ~@2 b4@3, [g2,g3], b4@5 ~@3, ~@3 [d4,g4,a4]@5", // G5 G Dsus4
  B: "[d4@3 ~@5 d4@3 ~@4 d4, [g2,f#4]@15 g4@7 [g4,a4]@10, g3@3 g3 g2@4, a4@5 a4@3 b4@3 d4@3 g3@2, ~@3 [d4,g4]@4 d4 g3@5 b4@3]/2", // Gmaj7 Gsus2 G5
  C: "~@7 c5, [g2,g3,d4,f#4], a4@5 a4@3, ~ g4, ~@3 b4", D: "g3@2 ~@5 g4, [g2,d5]@3 a4, b4 c5, g4@3 g4@2 b4@3, ~ g3@3",
  E: "[g3@4 ~@10 f#4@2 [b3,d4,g4]@6 ~@9 b3, [g2,d4] [g2,b3,d4,g4] g2@2, [a3,f#4]@6 a3@10 ~@6 b3@4 b3@5 ~, ~@2 g3@2 g3@8 g3@3 g3, ~@3 f#4@2 f#4 e4@2 ~@3 [d4,g4]@3 [d4,g4]@2]/2", // G G5 G D G5
  F: "[c4,e4,a4]@3 ~@2 c4 ~ g3, g2, g3@4 g3@3 ~, ~@3 [e4,a4]@3 ~@2, ~@3 c4@2 ~ [c4,e4,a4]@2", // Am A5 Am
  G: "~@3 [g4,c5] ~@3 a3, a2@5 a3 b4@2, [g4,c5,e5]@3 e5@5, ~ e3@7, ~ a3 [e4,g4,c5,d5]@2", // C5 C
  H: "~@7 b4, b2@3 a4 [g4,c5] b4 a4@2, [f#4,a4,d5]@3 [f#4,d5]@5, ~ f#3@7, ~ b3@3", // C5 D
  I: "~@3 [e4,g4] ~@3 c4, c3@5 c4 b4@2, [e4,g4,d5]@3 d5@5, ~ g3@7, ~ c4 [e4,g4,c5]@2", // Em Em7 C
  J: "~@7 c5, [d3,f#4]@4 g4 a4 b4@2, a4@3 e4@5, d4 d4@3, ~ a3@7", // D
  K: "~@6 d4@4 ~@5 g4, [g2,d5]@5 d4 g3 d4, ~ d3@7, ~@2 g3@3 b4@3, ~@3 [g4,a4]@5", // G5 Gsus2
  L: "[a3,f#4]@6 a3@3 ~ a3@2 ~@2 g3@2, g2, g3@9 g3@5 ~@2, b3 ~@5 [d4,f#4]@6 [a3,d4,f#4]@4", // D
  M: "[d4,g4]@3 ~@4 g3, g2, b4@2 g3 g4, g3@3 g4@2 b4@3, ~@3 [d4,a4]@5", // G5 D5
  N: "g3@2 ~@5 c5, [g2,f#4]@5 a4 b4@2, a4 g4, [d2,d4]@3 [d2,d4]@5, ~ g3@3", // Gmaj7 D
  O: "~@7 g4, [g2,d5]@3 a4, b4 c5, g4@3 g4@2 b4@3, ~ g3@3", // G5
  P: "g3 ~@13 f#4@2, f#4@5 f#4@2 ~, [g2,d4] [g2,g3,b3,d4,g4], a3@3 a3@5, ~ g3 ~ e4", // G5 G
  Q: "~@7 g3, g2, [b3,d4,g4]@3 [d4,g4]@3 [d4,g4]@2, ~ g3@3 g3@3 ~, ~@3 b3@2 b3@3", // G G5
  R: "~@6 b4!2, a2@3 c5 d5 c5@3, [g4,c5,e5]@3 [g4,e5]@5, ~ e3@7, ~ a3@3", // C
  S: "[~@4 b3@2 ~@16 e4@2 ~@6 a4@2 ~@38 a3@2 ~@8 g3@4 ~@22 d4@2 ~@3 e4 ~@14 a3@2, b2@6 a4 b4 [c3,d5]@8 [d3,a4] a3@7 d5@8 [a3,d4,f#4] d3@13 g4@10 [a2,e4,a4,c#5] e3 a3 [e4,a4,b4] a3 c#5 a4@2, [f#4,a4,d5]@2 d5@2 [e4,c5] b4 f#4@2 [e4,g4] g3@9 d4 e4@8 [d4,g4] g3 b4@5 g3 f#4 a3@11 g3 g2@16, ~ f#3@9 c4@2 c5@2 b4@2 f#4@8 [g2,g4,b4] d3 g3 a4@12 f#4 [g2,d4,g4,b4]@2 g3 [d4,g4,a4] g3 b4@9 a4 g3@9, ~@2 [f#4,a4] b3@9 [e4,g4] c4@7 g4 a4 b4 c5@7 g4 g3 g2@4 [d4,g4] f#4 e4@10 [d4,f#4,a4]@2 g3 [d4,f#4,a4] g3@2 [d4,f#4]@10]/8", // Csus2 D5 D A Esus4 D C Em …
  T: "~@5 e4 ~ a3, a2, [e4,g#4,b4]@3 [g#4,b4]@3 [e4,g#4,b4]@2, ~ e3@7, ~@2 a3 e4 a3@3 ~", // E G#m E
  U: "[~@11 [b3,e4] ~@43 a4, a2@3 [a4,c#5] d5@8 [e4,a4] g#4@3 [a2,c#4,a4] e3@2 c#4@5 [d4,f#4,b4] e3@9 b3 d4@5 [c#4,e4,g#4,b4] g#2@5 [e4,g#4,b4]@2 [d3,f#4] a3 [d4,a4] [f#4,e5] [d4,a5] c#5 a3@2, [a4,c#5,e5]@3 e5@4 a4 [a2,b3,e4,g#4] e3 a3 g#4 b3@11 a4@3 a3 [d4,f#4,b4] a3@7 a4 [b3,f#4]@2 a4@4 c#3 [c#4,e4,g#4,b4] c#3@12, ~ e3@4 c#5@10 e4@9 a2@6 f#4@2 b2@6 e4 b3@6 c#4@11, ~@2 a3@4 b4@8 f#4@4 a3 a4 b4 a4 g#4@7 d4 b4@3 f#3@7 c#2@16]/7", // E5 A A5 A Bm C#m7 E D …
  V: "[~@6 c#5@2 ~@3 a4 ~@7 b3 ~@3 g#4, d3@8 [a2,a4,c#5,e5] e3 a3@2 a4 c#5@3 [b3,e4,g#4] e3 a3 g#4 [b3,e4,a4] g#4 f#4@2, ~ a5@11 [d5,e5]@12, ~ a3@2 a4@2 d4@9 b4@10, ~@2 d4 f#4 b4 a3 f#4@9 a4 a2@8]/3", // A E Esus4 Dsus2
  W: "~@3 c#4 ~@3 a4, [a2,e4]@5 a4 g#4@2, [c#4,a4]@3 a4 [c#4,b4]@4, ~ e3@7, ~ a3@3", // A5 F#m C#7
  X: "[~@6 d4@2 b4@2 ~@4 d5@2 ~@38 [f#4,a4]@2 ~@22 g#4@2 ~@22 b3@2 ~@18 c#4@2 ~@3 c#4, a2@5 b4 c#5@2 b2@3 [a4,d5] e5 d5 c#5 d5 c#3@3 [b4,e5] d5 c#5 b4 c#5 d3@4 a4 d4 c#5@4 e4 g#4@2 a4 e4@2 [g#4,b4,e5] e3@2 b4 d5@8 a4 g#4 f#4@2 [c#4,a4] e3 a3 [c#4,a4] a3@2 [c#4,a4] a3, [f#4,b4]@4 [d4,f#4]@7 f#5@8 g#4@9 [f#4,d5]@4 [e3,b4] b3@9 a3@3 c#5@10 g#4@9, d4@2 a3@8 b3@8 c#4@8 d4 e5@4 d4@9 a2@3 e5@4 a4 [a2,b3,e4] e3 a3 f#4 b3@12, ~ e3@7 [a4,d5,f#5] f#3@7 [g#4,b4,e5] g#3@7 [f#4,a4,e5] a3@7 d#3@11 g#4@3 b4@10 [a2,e4]@8]/8", // F#m D5 E5 E F#m B5 D E5 …
  Y: "~@7 e3, a2, [b3,e4]@3 e4@2 b3@3, ~ e3@5 e4@2, ~@2 a3 b3 a3@4", // E5
  Z: "[~@13 b3 ~@5 [d4,f#4,a4]@2 d4 ~@9 f#4 [e4,f#4,a4]@3 ~@5 [d4,e4,a4]@3 ~@4 e3, a2@6 c#4@8 e4 a3@9 e2@8 f#3@3 [e4,f#4,a4]@2 f#3 f#4@2 e3@3 [d4,e4,a4]@2 e3 [d4,e4,a4]@2, [c#4,e4,a4]@3 e4@3 a4@2 [b3,e4] e3@7 [d4,e4,f#4,a4]@2 f#3 e4@2 [f#4,a4] f#3@5 [d4,e4]@2 e3@9 [e4,a4] f#3@9, ~ e3@6 a3 a2@8 f#2@14 d4@10 e2@8, ~@4 a3@2 [c#4,a4]@2 a3@2 b4@10 a3@2 [b3,e4]@2 a3@4 b3@17 d4 e4 f#4 [d4,e4,a4]@4 e3@2 a4@7 e4@3 f#2@32]/6", // D F#m7 Dsus2 F#m7 Dsus2 A E5 D …
  AA: "[[d4,e4,f#4,a4]@3 ~@5 [d4,e4,a4]@3 ~@2 d4 ~@2 [a1,a2,a3,c#4,e4]@16, f#2@8 e3@3 a4@16 ~@5, f#3@5 f#3@2 f#3@8 e3@16 ~, ~@3 [d4,e4,f#4,a4]@3 f#4@5 [d4,e4] e3@2 [b3,d4]@16 ~@2, ~@3 [d4,e4,a4] e2@8 ~@4]/4", // D Dsus2 A D Dsus2 Bm Dsus2
})).s("gm_piano").gain(0.48)

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@16 A@3 B C D E F G@3 H I J@2 K J I L M N O P@2 Q R L S T U J@2 V W V X Y Z AA AB Y AC AD@3 ~
>`.pickRestart({
  A: "g1@5 ~ g1@9 ~", B: "g1@6 g1@7 ~ g1 ~", C: "a1@5 ~ a1@8 a1@2", D: "b1@7 ~ b1 ~ b1@4 d2@2", E: "c2@6 c2 ~ c2@8",
  F: "d2@6 e2 c2", G: "g1@6 g1@9 ~", H: "g1@5 ~ g1@3 ~ g1 ~ g1 ~ g1@2", I: "a1@5 ~ a1@10", J: "a1@5 ~ a1@9 ~",
  K: "a1@6 a1@9 ~", L: "b1@5 ~ b1@7 ~ b1@2", M: "c#2@5 ~ c#2@8 c#2@2, ~@14 b1 ~", N: "d2@5 ~ d2@9 ~",
  O: "d2@5 ~ d2@6 e2@2 c#2@2", P: "a1@5 ~ a1@6 ~@2 a1 ~", Q: "a1@5 ~ a1@7 ~ a1 ~", R: "a1@5 ~ a1@6 ~@2 a1@2",
  S: "c#2@5 ~ c#2@7 ~ c#2@2", T: "d2@5 ~ d2@7 ~ d2@2", U: "e2@5 ~ e2@3 ~ e2@2 d2@2 c#2@2", V: "a1@4 ~@2 a1@9 ~",
  W: "a1@4 ~@2 a1@3 ~ a1@2 ~@2 a1 ~", X: "a1@4 ~@2 a1@2 ~@2 a1 ~ a1@2 a1@2, ~@14 b1 ~", Y: "f#1@5 ~ f#1@7 ~ f#1@2",
  Z: "e1@5 ~ e1@3 ~ e1@2 ~@2 e1 ~", AA: "f#1@5 ~ f#1@3 ~ f#1@3 ~ f#1@2", AB: "e1@5 ~ e1@3 ~ e1@2 ~@2 e1@2",
  AC: "e1@5 ~ e1@10", AD: "[a1@11 ~@5]/3",
})).s("gm_electric_bass_finger").gain(0.48)

// other · string ensemble 1 · "strings"
const string_ensemble_1 = note("<~@29 A B C D E F G H I ~@24>".pickRestart({
  A: "~@4 a5 b5 c#6 d6", B: "e6@4 d6 c#6 b5 a5", C: "g#5@4 a5 g#5 f#5 g#5", D: "a5@4 b5 a5 g#5 a5, g#5 ~@15",
  E: "b5@7 ~ [b4,b5]@2 [c#5,c#6]@2 [d5,d6]@2 [e5,e6]@2", F: "[f#5,f#6]@4 [g#5,e6] [f#5,d6] e5 [d5,b5], ~@3 c#6",
  G: "[g#5,e6]@4 [f#5,d6] [e5,c#6] [d5,b5] [e5,c#6]", H: "[f#5,e6]@2 [d5,d6] [c#5,c#6]", I: "[b4,b5] ~",
})).s("gm_string_ensemble_1").gain(0.32)

// other · cello
const cello = note(`<
  ~@4 A@3 B C D E F A@3 F G@2 ~ B C D E F H@2 B@2 I C@2 I@2 C D J K@2 L@2 C@2 D J F M C@2 I C I C N O P O P Q R@3 ~
>`.pickRestart({
  A: "g2/3", B: "g2", C: "a2", D: "b2", E: "c3", F: "d3", G: "g2/2", H: "[g3@31 ~]/2", I: "a2@15 ~", J: "c#3",
  K: "d3/2", L: "a2/2", M: "e3@6 d3 c#3", N: "f#2@15 ~", O: "e2", P: "f#2", Q: "e2@7 ~", R: "[[a1,a2]@11 ~@5]/3",
})).s("gm_cello").gain(0.32)

// chords · synth strings 1 · "synth strings"
const synth_strings_1 = note("<~@48 A B A C D E D F G@2 H@3 ~>".pickRestart({
  A: "~@6 [c#5,a5] ~ [c#5,a5] ~ [c#5,a5] ~ [c#5,a5] ~ [c#5,a5] ~", B: "[g#4,e5]@15 ~", C: "[g#4,e5]@13 ~@3",
  D: "[f#5,a5] ~ [f#5,a5] ~ [f#5,a5] ~ [f#5,a5] ~ [f#5,a5] ~ [f#5,a5] ~ [f#5,a5] ~ [f#5,a5] ~", // F#m
  E: "[e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~", // A5
  F: "[e5,a5] ~ [e5,a5] ~ e5 ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~ [e5,a5] ~", // A5
  G: "[~ a5 g#5 e5 a5 g#5 e5@8 d5@2]/2", H: "c#5/3",
})).s("gm_synth_strings_1").gain(0.32)

// other · cello
const cello_2 = note("<~@56 A@2 B ~@3>".pickRestart({
  A: "[~ a3 g#3 e3 a3 g#3 e3@8 d3@2]/2", B: "c#3",
})).s("gm_cello").gain(0.16)

// drums · kick
const kick = s("bd").struct("<~@16 [x ~@2 x ~@4]!11 [x!2 ~ x ~@4] [x ~@2 x ~@4]!30 x ~@3>").gain(0.48)

// drums · rim
const rim = s("rim").struct("<~@16 [~@3 x]!12 ~@34>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@28 [~ x ~ x]!30 ~@4>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@30 x ~@23 x ~@7>").gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@15 A ~@11 B ~@9 C ~@13 D ~@4 E F ~@4>".pickRestart({
  A: "~@5 x!3", B: "~@7 x ~ x ~ x ~ x!3", C: "~@12 x ~@2 x", D: "~@12 x ~ x!2", E: "~@15 x", F: "~@7 x ~@4 x ~ x ~",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@29 [~@7 x] ~@23 [~@7 x] ~@8>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@11 B ~@9 C ~@13 C ~@4 C D ~@4>".pickRestart({
  A: "~@9 x ~@6", B: "~@2 x!2 ~@4", C: "~@5 x!2 ~", D: "~ x",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct("<~@16 A ~@10 B A ~@9 A ~@13 A ~@5 A ~@3>".pickRestart({
  A: "x", B: "~ x ~@6",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@27 A ~@9 B ~@13 B ~@4 C ~@5>".pickRestart({
  A: "~ x ~@2", B: "~@9 x ~@6", C: "~@5 x ~@2",
})).gain(0.56)

// drums · ride
const ride = s("rd").struct("<~@28 [x!4]!5 [~ x!3]!2 [x!4]!23 ~@4>").gain(0.4)

stack(
  piano, bass, string_ensemble_1, cello, synth_strings_1, cello_2, kick, rim, snare, hihat, low_tom, open_hat, mid_tom,
  crash, high_tom, ride
)

More by Phil Collins