Strudelify

Keep It Comin' Love

KC and The Sunshine Band

KeyF majorTempo112 bpm
0:00/0:00
// Keep It Comin' Love — KC and The Sunshine Band
// 112 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 3 "Piano Base" named as a piano, played on piano (its electric bass pick patch is not one)
// note: duplicate parts dropped: ch 9 "Staff-7" synth bass 1 (copy of ch 13 "Staff-10" lead 2 sawtooth)
// note: Full arrangement: all 53 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(112/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano · "Piano Base"
const piano = note(`<
  ~ A B@2 C@2 D@2 E F G H I F G H I F G H I F G H I F G H I F G H I F G H I F G J K@2 D@2 I F G H I F G ~@2
>`.pickRestart({
  A: "~@10 eb2@4 ab2 ~", B: "[bb2@7 ~]/2", C: "[ab2@28 eb2@2 ab2 ~]/2", D: "[bb2@14 f2 bb2]/2",
  E: "ab2!2 ~ ab2@4 ~ ab2 ~ ab2@2 ab2@4", F: "ab2!2 ~ ab2 ab2@3 ab2 ~ ab2 ~ ab2 eb2@2 ab2@2",
  G: "bb2!2 ~@4 bb2!2 ~ bb2 ~ bb2@3 bb2 ~", H: "bb2!2 ~@4 bb2!2 ~ bb2 bb2@2 f2@2 bb2@2",
  I: "ab2 ~ ab2 eb2 ~@2 ab2@2 ab2 ~@2 ab2 ~ ab2 eb2@2", J: "bb2!2 ~@4 bb2!2 ~ bb2 bb2@2 f2@4", K: "[ab2@14 eb2 ab2]/2",
})).s("gm_piano").gain(0.56).pan(0.4)

// chords · piano · "Staff-4"
const piano_2 = note(`<
  A@2 B@2 C@2 D E C@2 D@2 C@2 D@2 F@2 D@2 F@2 D G C@2 D@2 C@2 D@2 F@2 D@2 F@2 D G F@2 D@2 F@2 D@2 F@2 D ~@2
>`.pickRestart({
  A: "[c4,eb4,g4,ab4]/2", B: "[d4,f4,g4,bb4]/2",
  C: "[c4,eb4,g4,ab4]@8 [c4,eb4,g4,ab4] [c4,eb4,g4,ab4]@4 [c4,eb4,g4,ab4] [c4,eb4,g4,ab4]@2", // Abmaj7
  D: "[d4,f4,g4,bb4]@8 [d4,f4,g4,bb4] [d4,f4,g4,bb4]@2 [d4,f4,g4,bb4] [d4,f4,g4,bb4]@4", // Gm7
  E: "[d4,f4,g4,bb4]@8 [c7,d7] [ab6,bb6] [f6,g6] [d6,eb6] [bb5,c6] [g5,ab5] [eb5,f5] [c5,d5]", // Gm7 Csus2 Absus2 Fsus2 Ebmaj7 Bbsus2 Abmaj7 Ebsus2 …
  F: "[[c4,eb4,g4,ab4]@7 [c4,eb4,g4,ab4]]/2", G: "[d4,f4,g4,bb4]@8 [d4,f4,g4,bb4] [d4,f4,g4,bb4]@2 [d4,f4,g4,bb4] ~@4",
})).s("gm_piano").gain(0.4).pan(0.9)

// chords · synth bass 1 · "Staff-5"
const synth_bass_1 = note(`<
  A@2 B C A@2 B D A@2 B@2 A@2 B E A@2 B E A@2 B F A@2 B@2 A@2 B E A@2 B E A@2 B F A@2 B F A@2 B F A@2 B ~@2
>`.pickRestart({
  A: "[g4,bb4] ~ [g4,bb4] ~ [f4,ab4]@3 [g4,bb4] ~ [g4,bb4] ~ [g4,bb4] [f4,ab4] f4 [f4,ab4] f4", // Gm Fm Gm Fm
  B: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~ [g4,c5] ~ [g4,c5] [f4,bb4] f4 [f4,bb4] f4", // C5 Bb5 C5 Bb5
  C: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~@2 [g4,c5] ~ [g4,c5] ~ [g4,c5] ~", // C5 Bb5 C5
  D: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~@8", // C5 Bb5 C5
  E: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~ [g4,c5] ~ [g4,c5] [f4,bb4]@2 ~@2", // C5 Bb5 C5 Bb5
  F: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~ [g4,c5] ~ [g4,c5] ~@4", // C5 Bb5 C5
})).s("gm_synth_bass_1").gain(0.48).pan(0.7)

// chords · brass section · "Staff-6"
const brass_section = note(`<
  ~@4 A B C D E@2 F@2 E@2 F G ~@2 F H ~@2 F I E@2 F@2 E@2 F G ~@2 F J ~@2 F K ~@4 A L C M A@2 N ~@2
>`.pickRestart({
  A: "[eb4,g4,bb4] ~ [eb4,g4,bb4] ~ [c4,f4,ab4]@3 [eb4,g4,bb4] ~ [eb4,g4,bb4] ~ [eb4,g4,bb4] [c4,f4,ab4] ~ [c4,f4,ab4]@2", // Eb Fm Eb Fm
  B: "[eb4,g4,bb4] ~ [eb4,g4,bb4] ~ [c4,f4,ab4]@2 [eb4,g4,bb4]!2 ~ [eb4,g4,bb4]@2 [c4,f4,ab4] ~ [c4,f4,ab4] [c4,f4,ab4]@2", // Eb Fm Eb Fm
  C: "[d4,g4,c5] ~ [d4,g4,c5] ~ [d4,f4,bb4]@3 [g4,c5,d5] ~ [g4,c5,d5] ~ [g4,c5,d5] [bb4,d5,f5] ~@3", // Csus2 Bb Gsus4 Bb
  D: "[d4,g4,c5] ~ [d4,g4,c5] ~ [d4,f4,bb4]@2 [d4,f4,bb4] [d4,g4,c5] ~@8", // Csus2 Bb Csus2
  E: "~@2 [ab4,c5,f5]@3 ~ eb5@2 [ab4,c5,eb5] [ab4,c5,eb5]@2 [ab4,c5,eb5] [ab4,c5,eb5]@3 ~", // Fm Ab
  F: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~ [g4,c5] ~ [g4,c5] [f4,bb4] f4 [f4,bb4] f4", // C5 Bb5 C5 Bb5
  G: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~ [g4,c5] ~ [g4,c5] [f4,bb4]@2 ~@2", // C5 Bb5 C5 Bb5
  H: "[g4,c5] ~ [g4,c5] ~ [f4,bb4]@3 [g4,c5] ~ [g4,c5]@5 ~@2", // C5 Bb5 C5
  I: "[d4,g4,c5] ~ [d4,g4,c5] ~ [d4,f4,bb4]@3 [d4,g4,c5] ~@2 [c5,d5,g5]@2 [c5,d5,g5] ~@3", J: "[d4,f4,g4,bb4]@13 ~@3",
  K: "[d4,g4,c5] ~ [d4,g4,c5] ~ [d4,f4,bb4]@3 [d4,g4,c5] ~@2 [c5,d5,g5] ~@5", // Csus2 Bb Csus2
  L: "[eb4,g4,bb4] ~ [eb4,g4,bb4] ~ [eb4,g4,bb4] [c4,f4,ab4]@3 [eb4,g4,bb4]!2 ~ [eb4,g4,bb4] [c4,f4,ab4] ~ [c4,f4,ab4]@2", // Eb Fm Eb Fm
  M: "[d4,g4,c5] ~ [d4,g4,c5] ~ [d4,f4,bb4]@2 [d4,f4,bb4] [d4,g4,c5] ~@2 [c5,d5,g5]@2 [c5,d5,g5] ~ [c5,d5,g5]@2", // Csus2 Bb Csus2
  N: "[d4,g4,c5] ~ [d4,g4,c5] ~ [d4,f4,bb4]@3 [d4,g4,c5] ~ [d4,g4,c5] ~ [d4,g4,c5] [d4,f4,bb4] ~ [d4,f4,bb4]@2", // Csus2 Bb Csus2 Bb
})).s("gm_brass_section").gain(0.48).pan(0.4)

// chords · pad sweep · "Staff-8"
const pad_sweep = note("<A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 A@2 B@2 ~@9>".pickRestart({
  A: "[c4,eb4,g4,ab4]/2", B: "[d4,f4,g4,bb4]/2",
})).s("gm_pad_sweep").gain(0.56).pan(1)

// chords · synth strings 2 · "Staff-9"
const synth_strings_2 = note("<~@8 A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 ~@12 A@2 B@2 A@2 B@2 ~>".pickRestart({
  A: "[c4,eb4,g4,ab4]/2", B: "[d4,f4,g4,bb4]/2",
})).s("gm_synth_strings_2").gain(0.56)

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

// drums · snare
const snare = s("sd").struct("<~@8 [~ x ~ x]!24 ~@8 [~ x ~ x]!11 ~@2>").gain(0.56)

// drums · hihat
const hihat = s("hh").struct("<A@3 B A@3 C A D A@3 D A D A@3 D A@3 E A D A@3 D A D A@7 E ~@4 A@7 ~@2>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", B: "x!2 ~@2 x!2 ~@2 x!3 ~@5", C: "x!2 ~@2 x!2 ~@10",
  D: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x ~@3", E: "x!2 ~@2 x!2 ~@2 x!2 ~@6",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<A@3 B A@3 B A C A@3 C A C A@7 D A C A@3 C A C A@7 D ~@4 A@7 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4", C: "~@2 x ~@3 x ~@3 x ~@2 x ~@2", D: "~ x ~ x ~ x ~@2",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct("<~@8 A ~ A ~ A ~@3 A ~@2 B ~@4 A ~ A ~ A ~@3 A ~@3 A ~@7 A ~@3 A ~@4>".pickRestart({
  A: "x", B: "~@7 x",
})).gain(0.56)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@16 A@7 B C B C B C B C B ~@4 A@3 D ~@13>".pickRestart({
  A: "~@4 x ~ x ~@5 x ~@2 x", B: "~@4 x ~ x ~@5 x!4", C: "~@2 x ~@4 x ~@5 x ~@2", D: "~@2 x!2 ~@4",
})).gain(2.55)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~@16 A@8 B A B A B A B A ~@4 A@4 ~@13>".pickRestart({
  A: "x ~ x!2 ~@3 x ~ x ~ x ~@4", B: "~@8 x!2 ~ x ~@4",
})).gain(2.55)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<A@3 B A@3 ~ C D C@5 D C@3 E C@3 F C D C@5 D C@7 F C@11 ~@2>".pickRestart({
  A: "x!16", B: "x!10 ~@6", C: "x!15 ~", D: "x!14 ~@2", E: "x!13 ~@3", F: "x!12 ~@4",
})).gain(0.81)

stack(
  piano, piano_2, synth_bass_1, brass_section, pad_sweep, synth_strings_2, kick, snare, hihat, open_hat, crash,
  agogo_bells, agogo_bells_2, cabasa
)

More by KC and The Sunshine Band