Strudelify
Celebration cover art

1986 · Celebrate!

Celebration

Kool & The Gang

KeyA♭ majorTempo120 bpm
0:00/0:00
// Celebration — Kool & The Gang
// 120 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 84 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · "A.PIANO 3"
const piano = note(`<
  ~@16 A B A B A B A B A B A B A B A B C D E F G H ~@14 A B A B A B A B A B A B A B A B ~@16
>`.pickRestart({
  A: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~@3 ab2 ~@3, [bb3,db4,gb4]@15 ~", // Gb
  B: "ab2 ~ ab2 ~ ab2 ~ [ab2,ab3,c4,eb4]@9 ~, [ab3,db4,f4]@5 ~@11", C: "[db2,db3,ab3,bb3,eb4,f4]",
  D: "g4@10 ~@3 [bb3,bb4]@3, [c2,c3,eb4,f4], [bb3,bb4]@13 ~@3, ~@5 g4@3", E: "[f1,f2,bb3,eb4,g4,bb4], gb4 ~@15",
  F: "[f1,f2,c4,f4,a4]", G: "[bb1,bb2,ab3,bb3,db4,f4]@15 ~",
  H: "[eb2,eb3,ab3,db4,f4]@3 ~ [eb2,eb3,ab3,db4,f4]@4 [eb2,eb3,ab3,db4,f4] ~ [eb2,eb3,ab3,db4,f4] ~ [eb2,eb3,ab3,db4,f4] ~@3", // Db
})).s("gm_piano").gain(0.22).pan(0.4)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  A B@2 C@12 D E F G F G F G F H F H F H F G F I J K L M N A B@2 C@10 D E F G F G F G F H F H F H F G F A B@2 C@12 O
>`.pickRestart({
  A: "~@2 f1 ~ f1 ~ gb1 ~ gb1@2 ~@2 f1@2 ~@2",
  B: "[gb1@2 ~ f1 ~@2 ab1@3 ~ ab1 ~ ab1 ~ ab1 ab1@2 ~ f1 ~ f1 ~ gb1 ~ gb1 ~@3 f1@2 ~@2]/2",
  C: "[gb1@2 ~ f1 ~@2 ab1@3 ~ ab1 ~ ab1 ~ ab1 ab1@2 ~ f1 ~ f1 ~ gb1 ~ gb1@2 ~@2 f1@2 ~@2]/2",
  D: "gb1@2 ~ f1 ~@2 ab1@3 ~ ab1 ~ ab1 ~ ab1!2", E: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~@3 ab1 ~@3",
  F: "ab1 ~ ab1 ~ ab1 ~ ab1 ab1@4 ~@5", G: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~@3 ab1@2 ~@2",
  H: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1@2 ~@2 ab1@2 ~@2", I: "db2 ~ db2 ~ db2 ~ db2 ~ db2@2 ~@2 db2@2 ~@2",
  J: "c2 ~ c2 ~ c2 ~ c2 c2@2 ~@7", K: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~@3 f1@2 ~@2", L: "f1 ~ f1 ~ f1 ~ f1 f1@2 ~@7",
  M: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1@2 ~@2 bb1@2 ~@2", N: "eb2@2 ~@2 eb2@2 ~@2 eb2 ~ eb2 ~ eb2@2 ~@2",
  O: "gb1@2 ~ f1 ~@2 ab1@3 ~ ab1 ~ ab1@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.29)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B@2 C A B@2 C A B@2 C A B@2 C ~@22 A B@2 C A C A B@2 C A B@2 C ~@16 A B@2 C A B@2 C A B@2 C A B@2 D
>`.pickRestart({
  A: "~@2 [ab3,db4,f4] ~ [ab3,db4,f4] ~ [bb3,db4,gb4] ~ [bb3,db4,gb4] ~@3 [ab3,db4,f4] ~@3", // Db Gb Db
  B: "[[bb3,db4,gb4] ~@2 [ab3,db4,f4] ~@2 [ab3,c4,eb4]@12 [ab3,db4,f4] ~ [ab3,db4,f4] ~ [bb3,db4,gb4] ~ [bb3,db4,gb4] ~@3 [ab3,db4,f4] ~@3]/2", // Gb Db Ab Db Gb Db
  C: "[db4,gb4] ~@2 [ab3,db4,f4] ~@2 [ab3,c4,eb4]@10, bb3 ~@7", // Gb5 Db Ab
  D: "[db4,gb4] ~@2 [ab3,db4,f4] ~@2 [ab3,c4,eb4]@6 ~@4, bb3 ~@7", // Gb5 Db Ab
})).s("gm_epiano2").gain(0.17).pan(0.6)

// chords · piano · "A.PIANO 3"
const piano_2 = note(`<
  ~@3 A@2 ~@2 B C D@3 E F@2 G H I J K L M N O P Q@2 R S T U V W@2 X Y ~@5 Z@2 B C D@3 E F@2 AA AB@2 AC@2 AD@2 AE AF AG
  AH@3 AI@2 AJ@2 AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ
>`.pickRestart({
  A: "[~@2 ab4 ~ [bb4,eb5] c5 [db5,f5] ~ bb4 b4 c5 ab4@17 ~@4, ~@4 eb5 ~@11]/2", // Eb5 Db
  B: "~@2 ab4@2 [bb4,eb5] c5 [db5,f5] ~ bb4 [b4,c5] ~ ab4@3 ab4@2, ~@4 eb5 ~@3", C: "~@2 gb5@4 f5 ~",
  D: "[gb5@2 ~ [gb5,ab5] f5 ~@3 eb5 ~@3 [ab4,ab5] ~ [ab4,ab5]@19 ~ ab4 ~ [bb4,eb5] c5 [db5,f5] ~ eb5@2 c5 ab4@2 ~ ab4@2, ~@40 bb4 ~@7]/3", // Gbsus2 Ab Eb5 Db
  E: "~@4 gb5@7 ab5 f5@2 ~@2, ~@12 gb5 ~@3",
  F: "[gb5@3 ab5 f5@2 ~@2 eb5@2 ~@2 [ab4,ab5]@2 [ab4,ab5]@17 ~, ~@4 gb5 ~@27]/2", // Ab
  G: "bb4 b4 bb4 ~ ab4 ~ eb5@6 eb5 f5 eb5 ~, eb5@5 ~ ab4@9 ~",
  H: "ab5 ~ [eb5,e5,ab5] f5 [eb5,ab5]@2 ~@2 [bb4,eb5] b4 ~@2 ab4@2 f4 ~", // Emaj7 Ab5 Eb5
  I: "ab4@2 ~ ab4@2 ~ ab4@4 f4 ~ ab4 bb4 ~ [bb4,eb5]", J: "~ [bb4,eb5]@8 ~ bb4 b4 ab4@2 f4 ~, ~@12 bb4 ~@3",
  K: "ab4@2 eb4 f4@2 ~ [eb4,ab4]@5 ~ eb5 f5 eb5 ~, ~@2 ab4@3 ~@11", // Ab5
  L: "ab5@2 eb5 f5@2 ~@7 eb5 [e5,f5] eb5 ~, ~@2 ab5@4 ~@6 ab5@3 ~", // Fmaj7
  M: "eb5 [e5,f5] ~ eb5 f5 ~ [eb5,ab5]@10, ab5@3 ab5@2 ~@11", // Fmaj7 Ab5
  N: "~@2 ab4 ~ [bb4,eb5] c5 [db5,f5] ~ [bb4,eb5] b4 [ab4,bb4] ~ ab4@2 f4 ~", O: "ab4 ~ ab4 ~@3 ab4@6 ab4@2 eb4 ~",
  P: "[bb4,db5]@11 ~ [bb4,db5]@2 ~@2", Q: "[[db5,f5]@6 [c5,eb5]@12 ~@2 bb4 b4@2 ~ bb4 ab4 ~ ab4@2 ~ f4 eb4]/2",
  R: "ab4@2 ~@2 ab4 ~ [eb4,e4] f4@2 ~ [eb4,ab4]@3 ~@3, ~@6 ab4@3 ~@7", S: "[bb4,db5]@6 [bb4,db5] ~",
  T: "[db5,f5]@3 [c5,eb5]@5", U: "~@2 eb5 ~ bb4 b4 ~ [ab4,eb5] ~@2 f4 ~ ab4@2 f4 ~, ~@2 eb5 ~@5",
  V: "[bb4,eb5] ~ [bb4,eb5] ~ [ab4,eb5] ~ [ab4,eb5]@9 ~", // Eb5 Ab5
  W: "[~@2 ab4 ~ [bb4,eb5] c5 bb4 c5@3 [bb4,eb5] ~ [ab4,bb4] ~@7 eb5 ~ eb5@4 bb4 c5@5, ~@3 eb5@2 ~@2 bb4@4 ~@5]/2", // Eb5 Absus2
  X: "~@2 bb4 ~ c5@2 bb4 c5 ~@6 f4 ~", Y: "eb5 f5@2 ~ eb5@3 ~ c5 db5 c5 ~ ab4@4",
  Z: "[~@2 ab4 ~ [bb4,eb5] c5 [db5,f5] ~ bb4 b4 c5 ab4@20 ~, ~@4 eb5 ~@11]/2", // Eb5 Db
  AA: "bb4 b4 bb4 ~ ab4 ~ [ab4,eb5]@9 ~, eb5@5 ~@11", // Ab5
  AB: "[bb4@2 bb4 ~ bb4 ~ db5 ~ eb5@2 c5 ~ ab4@2 f4 ab4@2 ~@8 eb4 f4 eb4 ab4!2 ~ ab4, ~@8 bb4 ~@23]/2",
  AC: "[~@9 eb4 f4 ~ ab4 ~ eb4 f4@2 ~ eb4@7 ~@7, ~@14 ab4@3 ~@15]/2",
  AD: "[bb4@2 bb4 ~ bb4 ~ db5 ~ bb4 b4 bb4 ~ [ab4,eb5]@2 f4 ab4@3 ~@7 eb4 ~ eb4 ab4!2 ~ [bb4,eb5], ~@4 eb5 ~@11]/2", // Ab5 Eb5
  AE: "~ [bb4,eb5]@3 ~@4 [ab4,eb5] bb4 f4 ~ ab4@2 ab4@2, ~@12 eb5 ~@3", AF: "~@4 eb4 f4 [eb4,ab4]@6 ~@4, ~@2 ab4 ~@5",
  AG: "bb4@2 bb4 ~ bb4 ~ db5 ~ [bb4,eb5] b4 ~@2 ab4 ~ f4 ab4", // Eb5
  AH: "[~@9 eb4 f4 ~ ab4!2 ~ ab4@2 ~@8 eb4 f4 ~ ab4 ~ ab4@7 ~ [eb4,ab4]@6 ~@4, ~@30 eb4 ~@17]/3", // Ab5
  AI: "[bb4@2 bb4 ~ bb4 ~ db5 ~ [bb4,eb5] ~ c5 ~ [ab4,eb5] ~ f4 ab4@2 ~@8 eb4 f4 ~ ab4 ~ bb4 [bb4,eb5]]/2", // Eb5 Ab5 Eb5
  AJ: "[~ [bb4,eb5]@2 ~@5 ab4 ~@3 ab4 ~ eb4 f4@2 ~ [eb4,ab4]@10 ~@4, ~@14 ab4@3 ~@15]/2", AK: "~@4 gb5@7 ~ f5@3 ~",
  AL: "gb5@2 ~@2 eb5 e5 f5 ~ eb5@3 ~ [ab4,ab5]@3 ~, ~@4 ab5@3 ~@9", // Ab
  AM: "[ab4,ab5]@3 ~@5 bb4 c5 [db5,f5] ~ eb5@2 ~ ab4, ~@12 bb4 ~@3", // Ab Db
  AN: "~ ab4 f4 ~ ab4@2 f4 eb4 b4 c5 db5 d5 eb5 ab4 b4 c5", AO: "ab4 ~@3 gb5@8 f5@3 ~",
  AP: "gb5@3 ~ eb5 f5@2 ~ eb5@3 ~ [ab4,ab5]@3 ~, ~@4 ab5@3 ~@9, ~@5 e5 ~@10", // Ab
  AQ: "[ab4,ab5]@5 ~ ab5@2 [bb5,b5,eb6] c6 [db6,f6] ~ eb6@2 c6 ab5, ~@12 bb5 ~@3", // Ab Bmaj7 Db
  AR: "~ ab5 f5 ~ [eb5,b5] ~@2 b5 ~ c6 ab5 f5 ab5@2 ab5 f5", AS: "~@4 gb5@7 ~ eb5 f5@2 ~",
  AT: "gb5@3 ~ eb5 f5@2 ~ eb5@2 ~@2 [ab4,ab5]@3 ~, ~@4 ab5@3 ~@9", // Ab
  AU: "ab5@2 ~@2 b5 c6 [db6,f6] ~ [b5,eb6] c6 ~ ab5 ~ ab5 f5 eb5, ab4 ~@3 eb6@2 ~@10", // Db B
  AV: "~@4 [db6,d6] ~ [db6,eb6] b5 c6 ab5 f5 eb5 d5 db5 b4 c5, ~@2 ab6 ~@5", // Dmaj7 Dbsus2
  AW: "ab4@2 ~@2 gb5@7 ~ [eb5,e5] f5@2 ~, ~@12 ab5@3 ~", // Emaj7
  AX: "gb5@2 ~@2 eb5 [e5,f5] ~@2 eb5@2 ~@2 [ab4,ab5]@3 ~, ~@2 ab5 ~@5", // Fmaj7 Ab
  AY: "ab5@8 [eb5,ab5] f5 ab4@2 eb5 f5 eb5 ab4, ab4@10 ab5 ~ ab5@2 ~@2", // Ab5
  AZ: "bb4 c5 [ab4,bb4] ~ f4@2 [eb4,ab4]@4 ~@6, eb5 ~@7", // Absus2 Ab5
})).s("gm_piano").gain(0.42)

// chords · piano · "A.PIANO 3" · soft notes
const piano_soft = note(`<
  ~@3 A ~@3 A ~@3 B ~@4 C ~ D E F ~ G ~@3 H I ~@3 J K ~@8 A ~ A ~@3 B ~@4 L ~ M N O P Q R ~ S T@2 L S Q ~@3 U V ~@2 W ~
  X Y ~@4 Z AA
>`.pickRestart({
  A: "~@5 b4 ~@10", B: "~@9 b4 ~@6", C: "~@3 e5 ~@2 ab4@2 ~@8", D: "b4 ~@10 eb5 ~@4", E: "~@3 e4 ~@12",
  F: "~@3 e5 ~@2 ab5 ~@9", G: "~@15 eb4", H: "~@2 ab4 ~@13", I: "~@2 eb4 ~@13", J: "~ b4 ~@14",
  K: "~@7 b4 ~@3 [b4,c5] eb5 ~@3", L: "~@9 b4 bb4 ~@5", M: "~@15 e4", N: "~@2 ab4@7 ~@7", O: "~@10 c5 ~@5",
  P: "~@10 f4 ~@5", Q: "b4 ~@15", R: "~@5 e4 ~@10", S: "~@11 eb4 ~@4", T: "[~@11 eb4 ~@3 f4@7 ~@10, ~@15 e4 ~@16]/2",
  U: "~@6 ab4@2 ~ [b4,eb5] ~@3 b4 c5 ~", V: "~@3 eb4 ~@12", W: "~@13 b5 ~@2", X: "~@12 e5 ~@3", Y: "~@5 e5 ~@10",
  Z: "~@9 e5 ~@3 e5 ~@2", AA: "~ b4 ~@8 eb4 ~@5",
})).s("gm_piano").gain(0.24)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~ A B ~ C D B ~@17 E F ~@2 G H ~@6 I J ~ A B ~ B ~@17 E F ~@2 G H ~@3 A B ~ C D B ~@8 K
>`.pickRestart({
  A: "~@3 [c5,ab5]", B: "[c5,ab5]@3 ~@13", C: "[bb4,gb5] ~@3 [ab4,f5] ~@3 [gb4,eb5] ~@3 [f4,db5] ~@3",
  D: "[eb4,c5]@2 [f4,db5] ~ [gb4,eb5] ~@7 [c5,ab5]@4, ~@3 [eb4,ab4]@5", E: "[gb4,db5,bb5]@6 [gb4,db5] ~, ~@12 bb5 ~@3",
  F: "[bb4,f5,db6]@3 [ab4,eb5,c6]@4 ~", G: "[gb4,db5,bb5]@11 ~ [gb4,db5,bb5]@2 ~@2",
  H: "[bb4,f5,db6]@5 ~ [ab4,eb5,c6]@8 ~@2", I: "[db4,db5,db6]@2 [c4,c5,c6]@2 [ab3,ab4,ab5]@2 [f3,f4,f5] ~",
  J: "[db4,db5,db6]@4 [c4,c5,c6]@3 ~ [ab3,ab4,ab5] ~ [ab3,ab4,ab5] ~ [ab3,ab4,ab5] ~@3", K: "~@6 [ab3,ab4,ab5,ab6] ~",
})).s("gm_brass_section").gain(0.31).pan(0.6)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  A B C D A B C D A B C D A B C D ~@8 E ~ E ~ E ~ E ~@7 A B C D C D A B C D A B C D ~@8 E ~ E ~ E ~ E ~ A B C D A B C D
  A B C D A B C F
>`.pickRestart({
  A: "[eb4,g4,ab4] [eb4,ab4] eb4 [eb4,ab4] ~ [eb4,ab4]!11", // Abmaj7 Ab5
  B: "[eb4,ab4]!4 ~ [eb4,ab4]!5 ~ [eb4,ab4] [eb4,g4,ab4] [eb4,ab4]!3", C: "[eb4,ab4]!4 ~ [eb4,ab4]!11",
  D: "[eb4,g4,ab4] [eb4,ab4]!3 ab4 [eb4,ab4]!11", // Abmaj7 Ab5
  E: "[eb4,g4,ab4] [eb4,ab4] ~ [eb4,ab4] ~ eb4 [eb4,ab4]!2 ~ [eb4,ab4] ~ eb4 [eb4,g4,ab4] [eb4,ab4] ~@2", // Abmaj7 Ab5 Abmaj7 Ab5
  F: "[eb4,g4,ab4] [eb4,ab4]!3 ab4 [eb4,ab4]!8 ~@3", // Abmaj7 Ab5
})).s("gm_electric_guitar_clean").gain(0.07).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@8 ~@24 B C D E F G A@8 ~@22 A@8 ~@8>".pickRestart({
  A: "ab6/8", B: "[db5,f5,c6]@15 ~", C: "[c5,eb5,bb5]@15 ~", D: "[bb4,eb5,g5]", E: "[c5,f5,a5]@15 ~",
  F: "[bb4,db5,f5,ab5]", G: "[ab4,db5,f5,ab5]@3 ~",
})).s("gm_string_ensemble_2").gain(0.07).pan(0.6)

// drums · kick
const kick = s("bd").struct("x!4").gain(0.35)

// drums · clap
const clap = s("cp").struct("~ x ~ x").gain(0.31)

// drums · snare
const snare = s("sd").struct("<A@15 B A@15 B A@19 B A@15 C A@7 B A@5 B A@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@4 x ~@5 x ~ x ~ x!2",
})).gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@83 [~@3 x]>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!37 [x!7 ~] [x!8]!45 [x!7 ~]>").gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct("<~@83 [~@11 x ~@4]>").gain(0.31)

// drums · high tom
const high_tom = s("ht").struct("<~@83 [~@5 x ~@2]>").gain(0.31)

// drums · crash
const crash = s("cr").struct("<A ~@15 A ~@15 A ~@5 B ~@13 A ~@7 B ~@3 B ~@3 C ~@3 B ~@3 B ~@3 B ~ B ~>".pickRestart({
  A: "x", B: "~ x ~@2", C: "x!2 ~@2",
})).gain(0.24)

stack(
  piano, bass, epiano2, piano_2, piano_soft, brass_section, electric_guitar_clean, string_ensemble_2, kick, clap, snare,
  low_tom, hihat, mid_tom, high_tom, crash
)

More by Kool & The Gang