Strudelify
Easy cover art

1977 · Back To Front

Easy

Commodores

KeyA♭ majorTempo190 bpm
0:00/0:00
// Easy — Commodores
// 190 bpm, 12/8, key Ab major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "A.PIANO 1" piano (copy of ch 2 "A.PIANO 1" piano); ch 5 "OVERDRIVE" overdriven guitar (copy of ch 4 "OVERDRIVE" overdriven guitar)
// note: Full arrangement: all 97 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(190/6)

// 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 1"
const piano = note(`<
  A@2 B C@8 D@6 E@3 F@2 G H@8 I@4 J@5 K@2 L ~ M@4 N@8 O@2 P@2 ~ Q R S T Q U V W@2 U X Y Z U AA@2 AB@2 AC U X Y Z U X Y Z
  U X Y AD@6
>`.pickRestart({
  A: "[~@9 ab2@13 ~@13 c3@13, ~@11 [c4,eb4,ab4]@5 [c4,eb4,ab4]@5 ~@3, ~@26 ab2@9 ~@13]/2", // Ab
  B: "~@10 [c4,eb4,g4]@3 bb2@11, [c4,eb4,g4]@3 ~@5, ~ c3@3 ~@4", // Cm
  C: "[~@14 [eb2,eb3]@2 ~@24 ab2@13 ~@13 c3@13 ~@10 [c4,eb4,g4]@3 ~@12 [bb3,db4,f4]@26 ~@13 ab2@13 ~@13 c3@13 ~@3 c3@7, ~ [bb3,db4,f4,bb4]@9 ~@2 [bb3,db4,f4,bb4]@4 ~@11 [bb3,db4,eb4,g4,bb4]@10 [bb3,db4,eb4,g4,bb4]@10 ~@6 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@6 [c4,eb4,g4]@9 ~@68 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@6 [c4,eb4,g4]@8 ~@2, ~@5 bb2@9 ~@7 [eb2,eb3]@10 [eb2,eb3]@10 ~@16 ab2@9 ~@17 c3@9 bb2@39 ~@29 ab2@9 ~@23]/8", // Eb Cm Bbm Eb7 Ab Cm Ab Cm …
  D: "[~@2 bb2@13 ~@10 [bb3,db4,f4,bb4]@3 [eb2,eb3]@2 ~@23 ab2@13 ~@3 ab2@7 ~@2 c3@13 ~@10 [c4,eb4,g4]@3 ~@12 [bb3,db4,f4]@13 [g3,bb3,eb4]@3 [g3,bb3,eb4]@3 [g3,bb3,eb4]@3 [g3,bb3,eb4]@3 [g3,bb3,eb4]@3, [c4,eb4,g4]@4 ~@11 [bb3,db4,f4,bb4]@8 ~@17 [bb3,db4,eb4,g4,bb4]@10 [bb3,db4,eb4,g4,bb4]@10 ~@6 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@5 [c4,eb4,g4]@8 ~@45, ~@19 bb2@8 ~@7 [eb2,eb3]@10 [eb2,eb3]@10 ~@41 c3@8 ~ bb2@25 ~@15]/6", // Bbm Eb Cm Bbm Eb Cm Bbm Eb7 …
  E: "[~@3 ab2@19 ~@12 c3@12 ~@13 bb2@12 ~, ~@22 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@5 [c4,eb4,g4]@8 ~@2 [c4,eb4,g4]@4 ~@11, ~@26 ab2@8 ~@17 c3@8 ~@13]/3", // Ab Cm
  F: "[~@9 [bb3,db4,f4,bb4]@3 [eb2,eb3]@2 ~@23 ab2@11, [bb3,db4,f4,bb4]@4 ~@8 [bb3,db4,eb4,g4,bb4]@5 [bb3,db4,eb4,g4,bb4]@5 ~@2, ~@3 bb2@8 ~@7 [eb2,eb3]@10 [eb2,eb3]@10 ~@10]/2", // Bbm Eb Bbm Eb7 Eb
  G: "~@7 c3@5, ~ [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@3, ~@5 ab2@8 ~@11", // Ab
  H: "[~@27 [bb3,db4,f4]@12 ~@12 [bb3,db4,f4]@12 ~@13 [bb3,eb4,f4]@25 [bb3,eb4]@12 ab2@12 ~@13 c3@12 ~@10 [c4,eb4,g4]@3 ~@12 [bb3,db4,f4]@12 ~ eb3@2 ~@2, ~@2 [c4,eb4,g4]@8 ~@2 [c4,eb4,g4]@4 ~@110 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@5 [c4,eb4,g4]@8 ~@33, ~@6 c3@8 bb2@37 ~@13 eb3@37 ~@29 ab2@8 ~@16 c3@8 ~ bb2@25 ~@4]/8", // Bbm Bbsus4 Eb5 Cm Bbm Cm Ab Cm
  I: "[~@8 [g3,bb3,db4,eb4]@9 [g3,bb3,db4,eb4]@3 ~ ab2@12 ~@12 c3@12 ~@4 c3@7 ~@2 bb2@12 ~@10 [bb3,db4,f4,bb4]@3 [eb2,eb3], ~@2 eb3@19 ~@12 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@5 [c4,eb4,g4]@8 ~@2 [c4,eb4,g4]@4 ~@11 [bb3,db4,f4,bb4]@8 ~@5, ~@37 ab2@8 ~@41 bb2@8 ~@2]/4", // Eb7 Bbm Eb Ab Cm Bbm
  J: "[~@12 ab2@6 ~@6 c3@6 ~@6 bb2@6 ~@6 [eb2,eb3] ~@7 [eb2,eb3]@4, ~@5 [eb2,eb3]@10 [eb2,eb3]@10 ~@15 ab2@8 ~@16 c3@8 ~@16 bb2@8 ~@6 [eb2,eb3]@10 ~@8, ~@11 [bb3,db4,eb4,g4,bb4]@10 [bb3,db4,eb4,g4,bb4]@10 ~@5 [c4,eb4,ab4]@10 [c4,eb4,ab4]@10 ~@4 [c4,eb4,g4]@8 ~@2 [c4,eb4,g4]@4 ~@10 [bb3,db4,f4,bb4]@8 ~@2 [bb3,db4,f4,bb4]@4 ~@10 [bb3,db4,eb4,g4,bb4]@11 ~]/5", // Eb Eb7 Ab Cm Bbm Eb7
  K: "[[gb3,bb3,db4,gb4]@9 [f3,ab3,db4,f4]@9 [g3,bb3,db4,eb4]@2 [g3,bb3,db4,eb4]@4]/2", L: "[ab2,c4], eb4 ~@2",
  M: "[[gb2,gb3,bb3,db4,ab4,db5]@6 [gb3,bb3,db4,ab4,db5]@5 [gb3,bb3,db4,ab4,db5]@2 ~@2 [db4,ab4,db5]@5 ~@4 [gb3,bb3,eb4,gb4,bb4,eb5]@6 [gb3,bb3,eb4,gb4,bb4,eb5]@5 [bb3,eb4,gb4,bb4,eb5]@3 ~ [bb3,eb4,gb4,bb4,eb5]@5 ~@4, ~@11 gb2@8 ~ [f2,f3,ab3,db4,ab4,db5]@5 ~@23, ~@15 [gb3,bb3]@6 ~@3 eb2@9 ~@2 eb2@8 ~@5]/4", // Gb Db5 Ebm Db Gb
  N: "[[gb2,gb3,bb3,db4,ab4,db5]@6 [gb3,bb3,db4,ab4,db5]@5 [gb3,bb3,db4,ab4,db5]@2 ~@2 [db4,ab4,db5]@5 ~@4 [gb3,bb3,eb4,gb4,bb4,eb5]@6 [gb3,bb3,eb4,gb4,bb4,eb5]@5 [bb3,eb4,gb4,bb4,eb5]@3 ~ [bb3,eb4,gb4,bb4,eb5]@5 [db4,ab4,db5]@4 [gb2,gb3,bb3]@6 [gb3,bb3,db4,ab4,db5]@5 [gb3,bb3,db4,ab4,db5]@2 ~@2 [db4,ab4,db5]@5 ~@4 [gb3,bb3,eb4,gb4,bb4,eb5]@6 [gb3,bb3,eb4,gb4,bb4,eb5]@5 [bb3,eb4,gb4,bb4,eb5]@3 ~ [bb3,eb4,gb4,bb4,eb5]@9, ~@11 gb2@8 ~ [f2,f3,ab3,db4,ab4,db5]@5 ~@19 [f2,ab3,f4]@5 ~@10 gb2@8 ~ [f2,f3,ab3,db4,ab4,db5]@5 ~@23, ~@15 [gb3,bb3]@6 ~@3 eb2@9 ~@2 eb2@8 ~@5 [db4,ab4,db5]@4 ~@11 [gb3,bb3]@6 ~@3 eb2@9 ~@2 eb2@13]/8", // Gb Db5 Ebm Db5 Gb Db5 Ebm Db …
  O: "[[b2,gb3,b3,eb4,gb4]@3 [gb3,bb3,db4,gb4,bb4,db5]@5]/2", // B Gb
  P: "[[b2,gb3,b3,eb4,gb4]@3 [db3,ab3,db4,f4,ab4,db5,f5]@5]/2", Q: "ab2@3 ~ ab2@2, ~ [ab3,c4,eb4,ab4]",
  R: "c3@6 ~@5 [eb4,g4], ~ [g3,c4], ~@6 [eb4,g4]@5 ~, ~@2 c3", S: "bb2 [bb2,f3,bb3,db4,f4]",
  T: "eb3 ~@2 eb3@2 ~ [g3,bb3,eb4]@5 [g3,bb3,eb4]", U: "c3@6 ~@5 [g3,c4,eb4,g4], ~@6 [g3,c4,eb4,g4]@5 ~, ~@2 c3",
  V: "bb2 [f3,bb3,db4,f4]", // Bbm
  W: "[[eb3,g3,bb3,eb4]@3 [eb3,g3,bb3,eb4]@3 [eb3,g3,bb3,eb4]@3 [eb3,g3,bb3,eb4]@3 [eb3,g3,bb3,eb4]@3 ~@3 ab2@16 ~@12 [ab3,c4,eb4,ab4]@2, ~@18 [ab3,c4,eb4,ab4]@5 ~, ~@5 ab2]/2", // Eb Ab
  X: "bb2@6 ~@5 [f3,bb3,db4,f4], ~@6 [f3,bb3,db4,f4]@5 ~, ~@2 bb2", Y: "~@6 [eb3,g3,bb3,eb4]@5 [eb3,g3,bb3,eb4]",
  Z: "ab2@6 ~@5 [ab3,c4,eb4,ab4], ~@6 [ab3,c4,eb4,ab4]@5 ~, ~@2 ab2", // Ab
  AA: "[bb2 [bb2,f3,bb3,db4,f4]@2 [bb2,f3,bb3,db4,f4]]/2", AB: "[~ [eb3,g3,bb3,eb4]@2 ~]/2",
  AC: "~@11 [ab3,c4,eb4,ab4], ~@6 [ab3,c4,eb4,ab4]@5 ~, ~@2 ab2", // Ab
  AD: "[[gb3,bb3,db4,gb4]@18 [f3,ab3,db4,f4]@18 [g3,bb3,db4,eb4]@5 [g3,bb3,db4,eb4]@11 ~@30 eb4@6 ~@18 ab5@18 ~@20, ~@26 ab1@21 c5@7 ~@18, ~@52 ab2@18 ab3@43 ~@31, ~@13 c4@3 eb3@9 eb5@6 ~@5, ~@52 eb4@6 c3@18 c4@12 ab4@27 ~@29]/6", // Gb Db Eb7
})).s("gm_piano").gain(0.57).pan(0)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@61 A@2 B@2 C D E@2 F@2 G@2 H I J@2 K@2 ~@18>".pickRestart({
  A: "[c4@6 ab3@3 ab4@21 gb5@2 ~@16]/2", B: "[[c3,c4]@6 [ab2,ab3]@3 [ab2,ab3]@21 [gb1,gb2,gb3]@8 [eb5,eb6]@3 ~@7]/2",
  C: "c4@6 ab3@3 eb5@2 ~@4 c5@3 ~@3 ab4@3", D: "~@3 gb4@3 ~@3 f4@3 ~@3 eb4@7 c4@2", E: "[f4 c4@6 c4]/2",
  F: "[ab3@3 ab4@27 gb5@2 ~@16]/2", G: "[[c3,c4]@6 [ab2,ab3]@3 [ab2,ab3]@21 [gb1,gb2,gb3]@10 ~@8]/2",
  H: "c4@6 ab3@3 f5@2 ~@4 eb5@3 ~@3 f5@3", I: "~ bb4@3 eb5 ~ c5 ~", J: "[bb4@2 f4@10 f4 f4@3]/2",
  K: "[f4@17 eb5@24 bb3 g3 f3 db3 ab2 f2 ~]/2",
})).s("gm_overdriven_guitar").gain(0.64).pan(0)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note("<~@61 A@2 B@2 C D@5 E@2 F G H@4 I ~@17>".pickRestart({
  A: "[~@4 c4@6 ab3@3 ab4@21 gb5@2 ~@12]/2",
  B: "[~@4 [c3,c4]@6 [ab2,ab3]@3 [ab2,ab3]@21 [gb1,gb2,gb3]@8 [eb5,eb6]@3 ~@3]/2", // C Ab Gb Eb
  C: "~@4 c4@6 ab3@3 eb5@2 ~@4 c5@3 ~@2",
  D: "[~ ab4@3 ~@3 gb4@3 ~@3 f4@3 ~@3 eb4@7 c4@2 f4@6 c4@36 c4@6 ab3@3 ab4@27 gb5@2 ~@12]/5",
  E: "[~@4 [c3,c4]@6 [ab2,ab3]@3 [ab2,ab3]@21 [gb1,gb2,gb3]@10 ~@4]/2", F: "~@4 c4@6 ab3@3 f5@2 ~@4 eb5@3 ~@2",
  G: "~ f5@3 ~@3 bb4@9 eb5@3 ~@3 c5@2", H: "[~@4 bb4@6 f4@30 f4@3 f4@9 f4@17 eb5@24 bb3 g3 f3]/4", I: "db3 ab2 f2 ~@21",
})).s("gm_overdriven_guitar").gain(0.29)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@8 A@2 B@2 C@2 D@3 E@2 F@4 G@2 H@2 I@4 J@5 K L M N O@2 P Q R S T U V S T W X S T Y Z@2 AA@2 AB AC AD AE AF AG AH AI
  AJ@2 AK AL AM AN AO AP AQ AR AS AT AU AL AV AT AW AL AV AC L AX N AY@5 ~
>`.pickRestart({
  A: "[~@4 db2@6 ~@3 db2@8 ~@2 ab1@19 ~@4 ab1@2]/2", B: "[~ c2@19 ~@3 g1@3 bb1@19 ~@3]/2",
  C: "[bb1@3 eb2@3 ~@4 eb2@9 gb2@9 ~ ab1@19]/2",
  D: "[~@3 ab1@3 c2@13 ~@4 c2@2 eb2@4 g2@2 bb1@19 ~@5 bb1@2 eb2@3 eb2@3 eb2@3 eb2@3 eb2@3]/3",
  E: "[~@3 ab1@19 db2@9 ab1@3 c2@2 ~@12]/2",
  F: "[~@11 bb1@19 ~@4 bb1@2 eb2@3 ~@3 eb2@9 gb2@9 ~ ab1@19 ~@2 ab1@3 c2@11, ~@5 g1 ~@42]/4",
  G: "[~@6 c2@2 eb2@4 g2@2 bb1@25 ~@9]/2", H: "[~@13 eb2 eb2@2 eb2@25 ~@7]/2",
  I: "[~@5 f3@2 db3@2 bb2@2 g2@2 eb2@2 bb1@2 ab1@19 ~@3 ab1@3 c2@12 ~@5 c2@2 eb2@4 g2@2 bb1@19 ~@3 bb1@3 eb2@3 ~]/4",
  J: "[~@2 eb2@9 gb2@9 ab1@19 ~@3 ab1@3 c2@15 ~@2 c2@2 eb2@4 g2@2 bb1@19 ~@3 bb1@3 eb2@3 ~@3 eb2@9 gb2@9 ~]/5",
  K: "ab1@6 ~ ab1", L: "c2@15 ~ c2@2 eb2@4 g2@2", M: "bb1@6 ~ bb1", N: "eb2 ~ eb2@3 eb2@3",
  O: "[gb2@18 f2@18 eb2@4 eb2@7 ~]/2", P: "ab1", Q: "~@2 gb2 d2", R: "gb1@6 ~ db1", S: "gb1 ~ gb1@3 f1@3",
  T: "eb2@4 eb2@3 bb1", U: "eb2 ~ eb2@3 f2@3", V: "gb1@9 ~@2 db1", W: "eb2@4 f2@2 eb2@9 f2@9", X: "gb1@4 ~@3 db1",
  Y: "eb2@4 f2@2 eb2@9 eb2@9", Z: "[b1@8 bb1 gb1@12 ~@3]/2", AA: "[eb2@6 db2@9 ~]/2", AB: "~@3 gb2",
  AC: "ab1@9 ~@2 ab1", AD: "c2@3 ~@3 c2@9 ~@7 g1@2", AE: "bb1@8 ~@3 bb1", AF: "eb2@3 ~@3 eb2@8 ~@2 ab2@8",
  AG: "ab1@8 ~@3 ab1", AH: "c2 ~@2 c2@3 ~@2 c2 eb2@2 g2", AI: "bb1@6 bb1@5 bb1",
  AJ: "[eb2@3 eb2@3 eb2@3 eb2@3 eb2@2 ~ bb1@2 ~ ab1@16 ~@2 eb2@10 ab1@2]/2", AK: "c2@3 ~@3 c2@8 ~@8 g1@2",
  AL: "bb1@7 ~@4 bb1", AM: "eb2 ~ eb2@2 g2@2 ~@2", AN: "ab1@16 ~@6 ab1 ~", AO: "c2@3 ~@3 c2@6 ~@4 c2@2 eb2@4 g2@2",
  AP: "bb1", AQ: "~@22 eb2!2", AR: "eb2@11 ~", AS: "~@6 db3 bb2 g2 eb2 db2 bb1", AT: "ab1@6 ~@5 ab1",
  AU: "c2@6 ~@2 c2 eb2@2 ab2", AV: "eb2@3 ~@3 eb2@6 ~@4 gb2@8", AW: "c2@6 ~@2 c2 eb2@2 g2", AX: "bb1@9 ~@2 bb1",
  AY: "[gb2@18 f2@18 eb2@5 eb2@10 ~ ab1@61 ~@7]/5",
})).s("gm_electric_bass_finger").gain(0.72).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A ~ B C D E F G ~ H I J K L@2 M N O A P Q R ~ S T U A ~ V@3 W X Y V Q V Z V N V Z V AA V AB V Q X ~ X ~@2 V@3 AC
  V@3 AD ~ AC V@5 AE V ~ V@3 N V@3 X V X V ~ X Y AF ~@3
>`.pickRestart({
  A: "~@23 x", B: "~ x ~@22", C: "~ x ~@10", D: "~@3 x ~@6 x ~@8 x ~@4", E: "~@5 x ~@18", F: "~ x ~@2", G: "~@7 x ~@16",
  H: "~ x ~@6", I: "~@5 x ~@6", J: "~@11 x ~@12", K: "~@3 x!2 ~", L: "~@13 x ~@10", M: "~@7 x ~@4", N: "~@5 x ~@2",
  O: "~@2 x", P: "~@11 x ~@5 x ~@6", Q: "~@3 x", R: "~@19 x ~@4", S: "~@5 x", T: "~@7 x", U: "~@11 x", V: "x",
  W: "~@6 x ~@4 x", X: "x ~@2 x", Y: "~ x", Z: "x ~ x ~@2 x ~@2", AA: "~@4 x!2 ~@2", AB: "x ~@4 x ~@2", AC: "x!2 ~@2",
  AD: "~ x!4 ~ x ~", AE: "~ x ~ x ~@2", AF: "~ x ~@4",
})).gain(0.46)

// drums · snare
const snare = s("sd").struct(`<
  ~@9 A B C D E F G H I J@2 ~ K L M N O ~@2 P Q@2 R S T U V A W A X ~@4 A@3 Y A@2 Z P A@3 X ~@4 AA A@7 AB A@3 AC A W AD
  ~@3 A@3 Y A AD A@4 AD AE ~@6
>`.pickRestart({
  A: "~ x", B: "~@13 x ~@10", C: "~@5 x ~@2", D: "~@2 x", E: "~@17 x ~@6", F: "~@19 x ~@4", G: "~@5 x", H: "~@3 x!5",
  I: "~@11 x", J: "~@23 x", K: "x!2 ~@4", L: "~ x ~@22", M: "~ x ~@10", N: "~@3 x ~@15 x ~@4", O: "~@3 x ~@4 x ~@15",
  P: "~ x ~@2", Q: "~@7 x ~@16", R: "x!2 ~", S: "~@3 x ~@4", T: "~@5 x ~@6", U: "~@10 x ~@4 x ~@8",
  V: "~@11 x ~@3 x ~@8", W: "~@6 x ~@4 x", X: "~ x ~@4", Y: "~ x ~ x ~@2", Z: "~@6 x ~ x ~@2 x", AA: "~@3 x",
  AB: "x!5 ~@3", AC: "~@5 x ~@3 x ~ x", AD: "~@3 x!2 ~", AE: "~@6 x!4 ~@2",
})).gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<~@12 A ~ B C ~ D ~@2 E F G H ~ I J ~@4 K ~@32 L ~@16 M ~@3 M ~@11>".pickRestart({
  A: "~ x ~@14 x ~@5 x ~", B: "~@23 x", C: "~ x", D: "~@7 x ~@4", E: "~@5 x ~@2 x ~@2 x", F: "~@19 x ~@4", G: "~@5 x",
  H: "~@3 x ~@2 x ~@3 x ~", I: "~@3 x ~@18 x ~", J: "~ x ~@4", K: "~@2 x!2", L: "~@3 x", M: "x",
})).gain(0.41)

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@17 B C ~@5 D ~@5 E ~@11 A ~@3 F ~@20 F ~ G ~@18>".pickRestart({
  A: "~@11 x", B: "~@23 x", C: "~@11 x ~@3 x ~@8", D: "~@5 x", E: "~@16 x ~@6 x", F: "~@9 x ~ x", G: "~@2 x",
})).gain(0.46)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@18 B ~@11 C ~@11 D ~@3 E ~@20 F ~ G ~@18>".pickRestart({
  A: "~@3 x!2 ~@8 x ~@7 x ~@2", B: "~@3 x ~@4", C: "~ x", D: "~@15 x ~@4 x ~@3", E: "~@5 x ~@3 x ~@2",
  F: "~@2 x ~@2 x!2 ~ x ~@3", G: "~@3 x ~@4 x ~@3",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@9 A B C D E F G H I J K L M N O P Q ~@5 R ~@32 S ~@5 T ~ U ~@7 T ~@3 T ~@12
>`.pickRestart({
  A: "~@5 x ~@12 x ~@5", B: "~@7 x ~@12 x ~@3", C: "~@2 x ~@5 x ~@12 x ~@2", D: "~@3 x ~@6 x ~@9 x ~@3",
  E: "~@11 x ~@12", F: "x!2", G: "~ x ~@5 x ~@6 x ~@9", H: "~@7 x ~@16", I: "~@5 x ~@2 x ~@2 x",
  J: "~@4 x ~@5 x ~@6 x ~@6", K: "~@5 x ~@5 x ~@5 x ~@6", L: "~ x!3", M: "~@13 x ~@10", N: "~@7 x ~@5 x ~@10",
  O: "~@4 x ~@2 x ~@4", P: "~@3 x ~ x ~ x", Q: "~@5 x ~@6", R: "~@7 x ~@4", S: "~@8 x ~@2 x", T: "~@11 x", U: "~ x",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@51 [~ x] ~@45>").gain(0.46)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@4 B ~@3 C ~@7 D ~ E ~@3 F ~@3 E G ~@3 H I J K G L G L G L G M N L G ~ H ~ H ~ K G ~@6 K ~@4 G ~ G ~ G ~ G ~@2
  L G ~@3 G ~ G ~ O P Q ~@3
>`.pickRestart({
  A: "~@23 x", B: "~@5 x ~@18", C: "~ x ~@6", D: "~@2 x", E: "~@17 x ~@6", F: "~@5 x", G: "x", H: "x ~@2 x",
  I: "~@6 x!6", J: "x!4 ~@8", K: "~@3 x", L: "~@5 x ~@2", M: "~ x ~@2", N: "x!2", O: "x ~@8 x!2 ~", P: "~ x",
  Q: "~@4 x ~@2 x ~@16",
})).gain(0.41)

// drums · crash · soft notes
const crash_soft = s("cr").struct(`<
  ~@93
  [~ x!2 ~@7 x!2 ~ x!2 ~ x ~@2 x ~@2 x ~]
  [~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~]
  [~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@3 x]
  [~@2 x ~@2 x ~@18]
>`).gain(0.26)

// drums · ride
const ride = s("rd").struct(`<
  ~@16 A ~@9 B ~ C D E F G H I J K L@2 M N O P Q P Q P ~ P O ~@3 R P S T U T U Q V W X R W@3 ~ Y X Z AA V W AB S V S AC
  X AD AE V O Z@2 V AF P ~@7
>`.pickRestart({
  A: "~ x ~@10", B: "~@10 x ~@6 x ~@6", C: "x ~@2 x ~ x!2 ~ x!2 ~ x", D: "x ~@3 x ~@2 x ~@3 x ~ x ~@3 x ~ x ~@3 x",
  E: "~ x ~@3 x ~ x ~@3 x ~@2 x ~@3 x ~ x ~@3", F: "x!2 ~ x!2 ~@7", G: "~@3 x ~@3 x ~ x ~@3 x ~ x ~@3 x ~ x ~@2",
  H: "~ x ~ x ~@4 x ~ x ~@3 x ~ x ~@3 x ~ x ~", I: "~@2 x ~ x ~@3 x ~ x ~@4 x ~ x ~@3 x ~ x",
  J: "~@3 x ~ x ~@3 x ~ x ~@3 x ~@8", K: "~@3 x ~@2 x ~ x!2 ~ x", L: "x ~ x!2 ~ x!2 ~ x!2 ~ x", M: "x!2 ~@4", N: "~ x",
  O: "x!2 ~@2", P: "~ x!3", Q: "x!3 ~", R: "x ~ x!2 ~@2 x ~@5", S: "x", T: "~ x!2 ~", U: "x!4",
  V: "~@3 x ~@2 x ~@2 x ~ x", W: "x ~@2 x ~@2 x ~ x!2 ~@2", X: "x ~@2 x ~ x!2 ~@2 x ~@2", Y: "x ~ x!2 ~@2 x ~@2 x ~ x",
  Z: "x ~@2 x ~@2 x ~@2 x ~ x", AA: "x!2 ~ x", AB: "~@3 x ~@7 x", AC: "~@3 x ~ x!2 ~@2 x ~ x",
  AD: "~@2 x!2 ~@2 x ~@2 x ~ x", AE: "x ~ x!2 ~@8", AF: "x ~@2 x ~ x!2 ~@2 x ~ x",
})).gain(0.41)

stack(
  piano, overdriven_guitar, overdriven_guitar_2, bass, kick, snare, hihat, low_tom, mid_tom, open_hat, high_tom, crash,
  crash_soft, ride
)

More by Commodores