Strudelify
Three Times A Lady cover art

1978

Three Times A Lady

Commodores

KeyA♭ majorTempo72 bpm
0:00/0:00
// Three Times A Lady — Commodores
// 72 bpm, 3/4, 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: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 85 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(72/3)

// 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.

// bass · fretless bass · "bass"
const bass = note("<~@18 A B C D E F G@6 H@6 I@3 ~ J@5 K@3 L@8 M@7 N@8 O@6 P@3 Q@5>".pickRestart({
  A: "~@27 eb2@5", B: "ab2@31 ~", C: "g2", D: "gb2@26 ~ gb2@5", E: "f2@26 ~ f2@5", F: "bb2",
  G: "[ab2@31 eb2@26 eb2@5 db2@25 ~ db2@5 ab2@31 ~ g2@31 gb2@25 ~ gb2@5 f2@5]/6",
  H: "[~@21 f2@5 bb2@31 ab2@30 eb2@25 ~ eb2@5 db2@25 db2@5 c2@25 c2@5 bb1@14]/6", I: "[~@12 ab1@5 ab1@61 ~@18]/3",
  J: "[~@9 eb2@5 ab1@55 ~ eb2@5 ab1@55 eb2@5 ab1@25]/5", K: "[~ ab1@5 ab1@25 eb2@5 ab1@25 ab1@5 eb2@25 ~ eb2@4]/3",
  L: "[~ ab1@25 ab1@5 ab1@25 eb2@5 ab1@25 ~ ab1@5 eb2@25 eb2@5 ab1@25 ab1@5 ab1@25 eb2@5 ~ ab2@25 ab2@5 eb3@25 eb2@5 ab2@13]/8",
  M: "[~@12 ab2@5 ~ ab2@25 eb2@5 ab2@25 ab2@5 eb3@25 eb2@5 ab2@25 ~ ab2@5 ab2@25 eb2@5 ab2@29 ~ ab3@19 c2@3 ~ db2@2]/7",
  N: "[~ eb2@3 ab1@9 ~ ab1@44 eb2@4 ~ ab1@9 ~ ab1@44 eb2@4 ~ ab1@9 ~ ab1@44 eb2@4 ~ ab1@62 ~@13]/8",
  O: "[~@14 eb2@5 ab1@30 g1@30 gb1@24 ~ gb1@5 f1@24 f1@5 bb1@30 ab1@24]/6",
  P: "[~ ab1@5 eb2@24 ~ eb2@5 db2@24 ~ db2@5 c2@25 c2@5]/3", Q: "[bb1@38 ~ ab1@93 ~@28]/5",
})).s("gm_fretless_bass").gain(0.64)

// other · music box · "vibe"
const music_box = note(`<
  ~@7
  [~@27 bb6@3 ~@2]
  [ab6@3 ~@29]
  ~@5
  [eb5@3 ~@8 c6@3 ~@18]
  [db6@3 ~@8 c6@3 ~@13 bb5@3 ~@2]
  [ab5@3 ~@29]
  ~@68
>`).s("gm_music_box").gain(0.48)

// chords · piano
const piano = note("<A@2 B C@8 D@4 E@8 F@8 G@5 H@6 I J@8 K@8 L@5 M@8 N@7 O@6>".pickRestart({
  A: "~@27 eb4@5, [ab2,ab4], ~@5 eb4@11 eb4@11 ~@5, ~@11 bb4@21, ~@21 eb5@11", // Ab
  B: "~@21 c5@5 ~ c5@5, ab2, c5 bb4, ~@5 eb4@27, ~@11 ab4@21",
  C: "[~@245 c5@5 ~ c5@5, [gb2,c5]@27 eb5@37 bb4@5 c4@48 ab4@27 eb4@37 bb4@6 f2@21 ab4@5 bb4@6 eb4@5 [ab2,c5]@5 eb4@6 ab4@5 bb4@16, ~@5 eb4@11 eb4@32 c4@5 ab4@6 f2@21 ab4@5 bb4@6 eb4@5 [ab2,c5]@5 eb4@6 c5@16 bb4@10 eb4@6 c5@37 ab4@16 e2@64, ~@11 gb4@21 [f2,ab4]@5 c4@6 f4@32 e4@53 [gb2,db5]@27 bb4@5 [f2,ab4]@5 c4@6 f4@32 e4@53, ~@21 db5@43 e2@48 eb4@11 ab2@26 gb4@43 bb4@5 c4@59]/8", // Gbdim Ab Fm Gb5 Fm
  D: "[~@27 eb5@5 ~@91 eb4@5, gb2@48 eb4@5 c5@6 eb4@5 [e2,bb4]@64, c5@32 f2@5 eb4@6 db5@48 eb4@5 ab2@32, ~@5 eb4@11 eb4@5 db5@11 eb5@43 ab4@21 c5@5 eb4@6 c5@21, ~@11 gb4@48 f2@53 eb4@5 ab4@11]/4", // Edim
  E: "[~@85 bb4@11 ~@155 db4@5, [gb2,db5]@27 bb4@5 [f2,ab4]@5 c4@6 f4@32 e4@48 eb4@5 c5@21 eb4@11 c5@53 bb4@6 db4@5 bb4@32, ~@5 eb4@11 eb4@37 bb4@6 f2@21 ab4@53 c4@6 [eb4,ab4]@5 c4@5 ab4@38 bb3@58 [f4,ab4]@11, ~@11 c5@37 ab4@16 e2@32 bb4@59 c4@37 [gb4,bb4]@5 db4@6 [gb4,bb4]@5 db4@5 gb4@43, ~@21 gb4@43 bb4@5 c4@54 eb2@42 bb3@6 [eb4,g4]@5 bb3@5 [eb4,g4]@43 f4@5 db4@6 [f4,ab4]@5 db4@11 ~@5]/8", // Gb5 Fm Ab5 Fm Gb Eb Fm
  F: "[~@250 [f4,ab4]@5 db4, [f4,ab4]@11 [f4,ab4]@10 f4@42 [eb4,g4]@5 bb3@6 [eb4,g4]@5 bb3@5 [eb4,g4]@10 [eb4,g4]@10 ~ [eb4,g4]@10 g4@42 [eb4,g4]@10 [eb4,g4]@10 [eb4,g4]@63 [f4,ab4]@10 ~@6, ~@5 db4@11 db4@11 db4@62 bb3@10 bb3@10 ~ bb3@10 bb3@41 ~ bb3@10 bb3@10 bb3@64 ~@10, ~@21 ab4@11 [eb4,ab4]@10 [eb4,ab4]@10 ~ ab4@62 eb4@10 [eb4,ab4]@10 ~ [eb4,ab4]@10 ab4@42 [gb4,bb4]@5 db4@5 [gb4,bb4]@5 db4@5 [gb4,bb4]@48, ~@37 c4@10 ~ c4@5 eb4@5 c4@64 ~@9 c4@10 c4@5 eb4@5 c4@63 db4@5 [f4,ab4]@5 db4@5 [f4,ab4]@5 db4@10 ~ db4@10 ~]/8", // Fm Eb Fm Ab5 Gb Fm
  G: "[~@39 [g4,bb4], ~@4 [f4,ab4]@10 ~ f4@40 [eb4,g4,bb4]@5 bb3@5 [eb4,g4] bb4@5 bb3@5 [eb4,g4,bb4]@10 [eb4,g4,bb4]@10 [eb4,g4,bb4]@10 [eb4,g4,bb4]@10 [eb4,g4,bb4]@10 eb4@34, ~@10 db4@10 db4@61 bb3@10 bb3@10 bb3@10 bb3@10 bb3@10 bb3@10 bb3@10 bb3@9, ~@15 ab4@15 ab4@10 ab4@10 ab4@64 ~@12 [g4,bb4]@10 [g4,bb4]@10 [g4,bb4]@10 ~@4, ~@25 [c5,eb5]@10 [c5,eb5]@10 [c5,eb5]@64 ~@51]/5", // Gm Fm Eb Gm Cm
  H: "[~@47 g3@5 ~@11 g3@5 g3@5 ~@5 f3@5 ~@22 f3@5 ~@78 eb4@4, ~ bb3@10 ~ bb3@5 c4@5 eb3@56 [ab3,db4]@5 f3@6 ab3@5 f3@11 ~@5 [f3,ab3,db4]@64 ~@18, ~@7 [g4,bb4]@25 bb3@5 c4@62 [ab3,db4]@11 ~@37 eb4@10 eb4@10 eb4@10 eb4@10 ~@5, ~@17 ab4@56 g3@64 ~@25 c5@10 [g4,c5]@10 ~ [g4,c5]@9, ~@17 eb4@10 ab3@20 [bb3,eb4]@5 g3@5 bb3@10 ~ [bb3,eb4]@64 ~@10 [ab4,c5]@10 [ab4,c5]@10 ab4@30]/6", // Db5 Db Gm Db5 C5 Eb5 Ab
  I: "~@26 db4@5 [f4,bb4], ~ [g4,c5]@31, ~@3 eb4@13, ~@11 [f4,bb4]@10 [f4,bb4]@10 ~, ~@8 db4@5 ~@3", // Bb5 C5 Bb5
  J: "[~@115 db4@5 ~@5 ab3@5 ~@122 [f4,bb4]@4, ~@4 db4@61 eb4@10 eb4@10 eb4@10 eb4@61 ab3@64 ~ [f4,bb4]@5 db4@5 [f4,bb4]@5 db4@10 ~ db4@9, ~@9 [f4,bb4]@10 [f4,bb4]@10 [f4,bb4]@64 ~@7 [f4,bb4]@5 db4@5 bb4@51 [ab4,c5]@5 eb4@5 [ab4,c5]@5 eb4@5 ab4@60 [f4,bb4]@10 ~@5, ~@14 eb4@10 eb4@10 eb4@10 eb4@10 ~ eb4@5 c5@10 [g4,c5]@10 [g4,c5]@10 [g4,c5]@50 db4@5 f3@36 c5@5 eb4@5 [g4,c5]@5 eb4@5 [g4,c5]@5 eb4@10 eb4@40, ~@39 [ab4,c5]@10 ~ [ab4,c5]@10 ab4@50 f4@10 [db4,f4]@10 [ab3,db4]@5 f3@5 ab3@11 [db4,f4]@60 [g4,c5]@45]/8", // Bb5 Ab Bb5 C5 Ab Db Db5 Db …
  K: "[~@253 eb4@3, ~ eb4@10 eb4@10 eb4@10 eb4@10 eb4@10 eb4@10 eb4@10 eb4@10 ~ eb4@40 eb4@10 eb4@10 eb4@10 eb4@10 eb4@5 c5@11 [g4,c5]@10 [g4,c5]@10 [g4,c5]@58, ~@6 [f4,bb4]@10 [f4,bb4]@64 ~@7 [f4,bb4]@5 db4@5 [f4,bb4]@5 db4@10 db4@60 eb4@10 ~ eb4@10 eb4@10 eb4@40 eb4@10 ~@3, ~@26 [ab4,c5]@10 [ab4,c5]@10 ab4@61 [f4,bb4]@10 [f4,bb4]@10 [f4,bb4]@10 [f4,bb4]@64 ~@7 [f4,bb4]@5 db4@5 [f4,bb4]@5 db4@10 db4@23, ~@46 c5@10 [g4,c5]@10 [g4,c5]@10 [g4,c5]@64 ~@7 [ab4,c5]@10 [ab4,c5]@10 ab4@61 [f4,bb4]@10 [f4,bb4]@10 [f4,bb4]@8]/8", // C5 Bb5 Ab Bb5 C5 Ab Bb5
  L: "[~@103 eb4@29 [eb4,ab4,c5]@10 [ab4,c5]@10 ~@5 eb4@3, ~@2 [f4,bb4]@61 g4@64 ~@15 eb4@15 ~@3, ~@7 eb4@10 eb4@10 ~ eb4@10 eb4@10 eb4@10 eb4@10 eb4@30 db4@62, ~@12 [ab4,c5]@11 [ab4,c5]@10 ab4@40 [f4,bb4]@5 db4@5 [f4,bb4]@5 db4@5 [f4,bb4]@10 [f4,bb4]@57, ~@33 c5@10 [g4,c5]@10 [g4,c5]@10 c5@69 ~@20 [ab4,c5]@8]/5", // Ab Bb5 Ab Bb5 C5 Ab
  M: "[~@31 [f4,ab4]@10 ~@49 [eb4,ab4,c5]@10 eb4@5 ~@44 [db4,f4,ab4]@10 ~ [db4,f4,ab4]@41 [db4,f4,ab4]@10 ~ ab4@31 ~@10 [ab4,c5,eb5]@3, ~@2 c5@19 c5@55 db4@4 ab4@5 db4@55 g4@64 ~@39 [ab4,c5,eb5]@10 ~@3, ~@2 g4@10 bb4@19 db4@10 [f4,ab4]@5 db4@5 [f4,ab4]@5 db4@5 [f4,ab4]@5 db4@5 f4@49 g4@5 eb4@5 bb4@64 ~@54 eb4@8, ~@7 eb4@9 eb4@10 eb4@64 ~@10 [ab4,c5]@5 eb4@5 ab4@34 eb4@64 ~@4 [db4,f4]@44, ~@12 g4@9 g4@50 bb4@39 c5@5 eb4@5 c5@10 g4@5 eb4@5 c5@103 ~@13]/8", // Fm Ab Db Ab Fm Ab Db
  N: "[~@82 db5@5 ~@134 eb4@3, ~@2 eb4@10 eb4@5 [g4,bb4]@5 eb4@5 [g4,bb4]@5 eb4@5 g4@30 [bb4,gb5]@49 [ab4,db5,f5]@5 f4@5 [db5,f5]@30 eb5@5 eb4@5 [g4,bb4,eb5]@5 eb4@5 [g4,bb4,eb5]@5 eb4@5 [g4,bb4,eb5]@10 [g4,bb4,eb5]@10 [g4,bb4,eb5]@10 [g4,bb4,eb5]@8, ~@7 c5@119 ab4@5 f4@60 eb4@10 eb4@10 eb4@10 ~@3, ~@7 ab4@30 bb4@5 eb4@30 f5@5 eb5@59 [ab4,c5,eb5]@5 eb4@5 [ab4,c5,eb5]@5 eb4@5 c5@68, ~@7 eb5@10 eb5@30 [gb4,bb4]@5 f5@5 [bb4,gb5]@5 gb4@15 [f4,ab4]@10 [f4,ab4,db5]@4 db4@5 f4 [ab4,db5]@5 db4@5 [f4,ab4,db5]@4 db4@45 ab4@64 ~@4]/7", // Gm Ebm Db Eb Ab Gb Ebm Fm …
  O: "[~@77 c7@5 ~@14, ~@2 [g4,bb4,eb5]@10 [bb4,eb5]@64 ~@5 ab3@21 ab4@21 ab5@5 bb5@5 c6@5 eb6@6 ab6@5 bb6@15 ~@28, ~@7 eb4@10 eb4@10 [eb4,g4]@64 ~ c4@20 c5@52 ~@28, ~@12 g4@15 c5@70 eb4@21 eb5@46 ~@28, ~@22 db5@64 bb3@21 bb4@57 ~@28]/6", // Eb Eb5 Eb
})).s("gm_piano").gain(0.54).pan(0.8)

// chords · acoustic guitar steel · "guitar"
const acoustic_guitar_steel = note("<~@19 A B C D E F@5 G@3 H I J@4 ~ K@2 ~@32 L@2 M@2 N@2 O P@5>".pickRestart({
  A: "~@5 c4@5 ~@6 c4@5 ~@6 c4@5, ab4@10 ~ eb4@10 ab4@10 ~", B: "~@5 bb3@5 ~@6 bb3@5 ~@6 bb3@5, g4@10 ~ eb4@10 g4@10 ~",
  C: "~@5 ab3@5 ~@6 ab3@5 ~@6 ab3@5, gb4@10 ~ eb4@10 gb4@10 ~",
  D: "~@5 ab3@5 ~@6 ab3@5 ~@6 ab3@5, f4@10 ~ db4@10 f4@10 ~",
  E: "~@5 bb3@5 ~@6 bb3@5 ~@6 bb3@5, f4@10 ~ db4@10 f4@10 ~",
  F: "[~@5 ab3@5 ~@6 ab3@5 ~@5 ab3@5 ~@5 bb3@5 ~@6 bb3@5 ~@5 bb3@5 ~@5 bb3@5 ~@6 bb3@5 ~@5 bb3@5 ~@6 c4@5 ~@5 c4@5 ~@5 c4@5 ~@6 bb3@5 ~@5 bb3@5 ~@5 bb3@5 ~@5, ab4@10 eb4@10 ~ ab4@10 g4@10 ~ eb4@10 g4@10 g4@10 ~ db4@10 g4@10 ab4@10 ~ eb4@10 ab4@10 ~ g4@10 eb4@10 g4@10 ~@5]/5",
  G: "[~ bb3@5 gb4@10 gb4@6 ~@5 f4@15 ~@6 [db4,f4]@10 [db4,f4]@10 [db4,f4]@10 ~ [db4,f4]@10 [c4,eb4]@5 ~@2]/3", // Db Cm
  H: "~@3 ab4@20 eb4@9", I: "~ g4@5 bb4@5 eb4@5",
  J: "[g4@10 bb4@10 eb4@10 g4@10 bb4@10 eb4@10 g4@10 ~ bb4@5 ~@5 [c4,eb4,ab4]@30 ~@17]/4", K: "[~@7 f5@16 ~@9]/2",
  L: "[~@15 gb4@5 bb3@5 eb4@5 bb3@5 gb4@5 bb3@5 f4@5 ab3@5 db4@4 ab3@5]/2",
  M: "[~ f4@5 ab3@5 f4@4 bb3@5 db4@5 bb3@5 f4@5 bb3@5 eb4@5 ab3@5 c4@5 ab3@5 eb4@4]/2",
  N: "[~ c4@5 eb4@9 ~ g4@10 bb4@10 eb4@9 ~ g4@10 bb4@8]/2", O: "~@2 eb4@10 g4@10 bb4@5 ~@5",
  P: "[~ eb5@12 [eb4,g4,bb4]@12 ~ [g3,bb3,eb4]@12 ~@32 ab4@62 ~@28, [g4,bb4]@6 ~@21 ab3@39 ~@14, ~@15 c4@18 ~@7, ~@65 eb4@67 ~@28]/5", // Eb Gm
})).s("gm_acoustic_guitar_steel").gain(0.11).pan(0.3)

// other · electric guitar jazz · "guitar"
const electric_guitar_jazz = note("<~@55 A@5 B@3 ~@7 C@2 ~@13>".pickRestart({
  A: "[~@19 eb5@30 ~ bb4@30 db5@30 f4@30 eb5@20]/5",
  B: "[~ eb5@5 eb5@5 eb5@5 db5@5 db5@5 c5@5 c5@5 bb4@5 [db4,f4,bb4]@29 ~@26]/3", // Bbm
  C: "[~@20 f5@9 eb5 f5@5 eb5@5 c5@5 ~ bb4@5 ~@13]/2",
})).s("gm_electric_guitar_jazz").gain(0.57).pan(0.3)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note(`<
  ~ A@2 ~@7 B@2 C D E ~ F@2 G ~@13 H@5 I@7 J@2 K@2 L@5 M@8 N@2 O@8 ~@8 P Q@5
>`.pickRestart({
  A: "[~@27 eb4@5 eb4@31 ~, eb6@63 ~]/2", B: "eb4@21 db4@5 ~ eb4@5", C: "ab4@10 ~ f4@10 ab4@10 ~",
  D: "bb4@5 e4@5 ~ db4@5 c4@5 bb3@5 ~ ab3@5", E: "eb3@31 ~", F: "[ab4@63 ~]/2", G: "ab5@31 ~",
  H: "[~@23 bb5@60 ~ c6@30 eb6@30 ~ ab5@14 ~]/5",
  I: "[bb5@4 ~ ab5@9 ~ eb4@20 ~ eb4@10 db4@21 db4@10 ~ db4@21 ~@11 ab4@30 g4@30 ~ [db4,f4]@53, ~@15 g5@30 ~ f5@63 ~ eb4@60 ~@54]/7", // Db
  J: "[~@7 ab4@30 ~ g4@26, ~@7 eb4@57]/2", K: "[~@2 f4@15 ab4@15, ~ db4@15]/2",
  L: "[~ c6@30 c6@9 ~ db6@9 ~ eb6@9 ~ bb5@25 ~ c6@4 ~ bb5@9 ~ eb5@20 [ab4,c6]@30 [g4,c6]@8, ~ eb4@60 [db4,f4]@60 ~ eb4@38, ~@31 g4@30 ~@99]/5", // Ab C5 Db
  M: "[~@2 db6@9 ~ eb6@4 ~@2 bb5@4 ~ bb5@30 eb6@17 ~ db6@2 c6@2 ~ bb5@2 ab5@2 ~ f5@2 bb5@4 ~ bb5@4 ~@22 g4@30 [db4,f4]@60 ~ ab4@30 g4@21, ~@23 db4@55 ~@5 eb4@60 ~@61 eb4@52, ~@23 f4@35 ~@35 ab5@45 ~@118, ~@53 ab4@60 ~@143]/8", // Db
  N: "[~@39 db6@9 c6@9 ~ db6@6, ~@9 [db4,f4]@34 ~@21]/2", // Db
  O: "[~@4 ab4@29 ~ g4@29 [db4,f4]@58 ~ ab4@29 ~ g4@29 [db4,f4,f6]@62 ~@13, ~@4 eb6@177 ~@75, ~@2 eb4@29 ~@30 eb4@29 ~@38]/8", // Db
  P: "~@15 f4, ~@2 eb4@5 eb4@5 eb4@5 eb4@5 bb5@10, ~@5 f4@5 f4@5 f4@5 f4@5 f4@5 ~@2, ~@22 eb4@5 eb4@5",
  Q: "[~ [eb4,eb6]@38 [eb5,ab5,c6]@114 ~@7]/5", // Eb Ab
})).s("gm_string_ensemble_1").gain(0.36).pan(0.3)

// other · pizzicato strings · "pizzic." · Ab Cm
const pizzicato_strings = note(`<
  ~@10
  [[ab4,c5]@3 ~@2 eb4@3 ~@3 [ab4,c5]@3 ~@2 eb4@3 ~@2 [ab4,c5]@3 ~@3 eb4@3 ~@2]
  [[c5,eb5]@3 ~@2 gb4@3 ~@3 [c5,eb5]@3 ~@2 gb4@3 ~@2 [c5,eb5]@3 ~@3 gb4@3 ~@2]
  [eb5@3 ~@2 eb4@3 ~@3 db5@3 ~@2 eb4@3 ~@2 c5@3 ~@3 eb4@3 ~@2]
  [~@11 db5@3 ~@2 c5@3 ~@2 bb4@3 ~@3 ab4@3 ~@2]
  ~@71
>`).s("gm_pizzicato_strings").gain(0.25)

// other · flute
const flute = note("<~ A B ~@13 C D E ~@28 F G ~@36>".pickRestart({
  A: "bb5@29 ~ [bb5,c6] db6", B: "eb6@31 ~", C: "~@16 ab5@5 bb5@10 ~", D: "bb5@15 ~ ab5@5 bb5@10 ~", E: "bb5@31 ~",
  F: "~@30 eb5 [f5,g5]", G: "bb5 eb6@30 ~",
})).s("gm_flute").gain(0.26)

// drums · kick
const kick = s("bd").struct(`<
  ~@19 A@2 B@2 A C D E F G H I J K L M N O ~@3 P ~ Q R S T U V W E X I Y Z AA AB O AC P AD Q R AE AF AG AH I AI AA ~@2
  AB AJ AK AL AM AN T U AO ~@5
>`.pickRestart({
  A: "x", B: "x ~@26 x ~@4", C: "x ~@30 x", D: "~@25 x ~@4 x ~", E: "~@24 x ~@4 x ~@2", F: "~@29 x ~@2", G: "~@7 x",
  H: "~@22 x ~@4 x ~@4", I: "~@21 x ~@4 x ~@5", J: "~@25 x ~@6", K: "~@23 x ~@8", L: "~@17 x ~@4 x ~@9",
  M: "~@15 x ~@4 x ~@11", N: "~@13 x ~@4 x ~@13", O: "~@12 x ~@4 x ~@14", P: "~@9 x ~@4 x ~@17", Q: "~@6 x ~@4 x ~@20",
  R: "~@4 x ~@4 x ~@22", S: "~@2 x ~@4 x ~@24", T: "~ x ~@4 x ~@24 x", U: "~@4 x ~@24 x ~@2", V: "~ x ~@12 x ~",
  W: "~ x ~@24 x ~@4 x", X: "~@23 x ~@4 x ~@3", Y: "~@19 x ~@4 x ~@7", Z: "~@17 x ~@5 x ~@8", AA: "~@16 x ~@4 x ~@10",
  AB: "~@14 x ~@4 x ~@12", AC: "~@11 x ~@4 x ~@15", AD: "~@7 x ~@4 x ~@19", AE: "~@7 x ~@24", AF: "~@2 x ~@4 x ~@8",
  AG: "~@26 x ~@4 x", AH: "~@9 x ~@22", AI: "~ x ~@6", AJ: "~@17 x ~@14", AK: "~@15 x ~@16", AL: "~@8 x ~@4 x ~@18",
  AM: "~@5 x ~@4 x ~@21", AN: "~ x ~@2", AO: "~ x ~@14",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct(`<
  ~@19 A ~ A ~ A ~ B ~ C ~ D ~ E F ~@7 G ~ H ~ I ~ J ~ A ~ K ~ E ~ L M N O G P H Q ~@9 M ~ R ~ S ~ T ~ U ~@5
>`.pickRestart({
  A: "~@11 x ~@20", B: "~@5 x ~@10", C: "~ x ~@2", D: "~@3 x ~@12", E: "~ x ~@6", F: "~@13 x ~@18", G: "~@3 x",
  H: "~@21 x ~@10", I: "~@17 x ~@14", J: "~@7 x ~@8", K: "~@7 x ~@24", L: "~ x ~@30", M: "~@29 x ~@2", N: "~@7 x",
  O: "~@13 x ~@2", P: "~@23 x ~@8", Q: "~@19 x ~@12", R: "~@25 x ~@6", S: "~@5 x ~@2", T: "~ x", U: "~@3 x ~@4",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  ~@62
  [~@7 x ~@8 x ~@15]
  [~@2 x ~@4 x ~@8]
  [~@2 x ~@28 x]
  [~@9 x ~@19 x ~@2]
  [~@13 x ~@2]
  [~ x ~@4 x ~]
  ~@17
>`).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@63 [~ x ~@30] ~@21>").gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@19 A B@4 C D E F G H I J K L M N O P Q R S T U E G V W T U E G V W T U X G V W T U E Y Z AA AB AC AD AE AF AG AH AI
  P K AJ AK V W AL ~@5
>`.pickRestart({
  A: "~@11 x ~@9 x ~@10", B: "x ~@10 x ~@9 x ~@10", C: "x ~@9 x ~@10 x ~@9 x", D: "~@5 x ~@4 x ~@4 x",
  E: "~@9 x ~@9 x ~@9 x ~@2", F: "~@8 x ~@9 x ~@10 x ~@2", G: "~@7 x ~@9 x ~@10 x ~@3", H: "~@6 x ~@9 x ~@10 x ~@4",
  I: "~@5 x ~@10 x ~@9 x ~@5", J: "~@4 x ~@10 x ~@9 x ~@6", K: "~@3 x ~@9 x ~@9 x ~@8", L: "~ x ~@10 x ~@9 x ~@9",
  M: "x ~@4 x ~@9 x", N: "~@2 x ~@4 x", O: "~@7 x ~@19 x ~@4", P: "~@5 x ~@9 x ~@9 x ~@6", Q: "~@4 x ~@20 x ~@6",
  R: "~@3 x ~@28", S: "~@3 x", T: "~@2 x ~@9 x ~@10 x ~@8", U: "~ x ~@9 x ~@9 x ~@9 x", V: "~@3 x ~@4 x ~@4 x ~@2",
  W: "~@2 x ~@4 x ~@4 x ~@3", X: "~@9 x ~@19 x ~@2", Y: "~@7 x ~@24", Z: "~@24 x ~@4 x ~@2",
  AA: "~@2 x ~@4 x ~@4 x ~@3 x ~@4 x ~@10", AB: "~@19 x ~@4 x ~@4 x ~@2", AC: "~@2 x ~@4 x ~@4 x ~@3 x ~@15",
  AD: "~@9 x ~@4 x ~@4 x ~@4 x ~@4 x ~@2", AE: "~@2 x ~@4 x ~@4 x ~@19", AF: "x ~@9 x ~@9 x ~@10 x", AG: "~@9 x ~@22",
  AH: "~@29 x ~@2", AI: "~@7 x ~@9 x ~@9 x ~@4", AJ: "x ~@4 x ~@4 x ~@4 x", AK: "~@4 x ~@4 x ~@4 x ~",
  AL: "~ x ~@4 x ~@4 x ~@4",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<~@62 [~@15 x] ~@22>").gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@18 A B ~@19 C D ~@21 E ~ F ~ G ~ H ~ I ~@14>".pickRestart({
  A: "~@3 x ~@4 x ~@4 x ~@5 x ~@4 x ~@4 x ~@2", B: "x", C: "~@14 x!2 ~ x!3 ~ x!3 ~ x!3 ~ x!3",
  D: "~ x!3 ~ x!3 ~ x!3 ~ x ~@18", E: "~@3 x ~@4", F: "~@13 x ~@2", G: "~@21 x ~@10", H: "~ x", I: "~@5 x ~@2",
})).gain(0.56)

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

// drums · crash
const crash = s("cr").struct("<~ A B ~@60 C D E F G H ~@13 I J ~>".pickRestart({
  A: "x!5 ~ x!9 ~ x!9 ~ x!5 ~", B: "x", C: "~@2 x ~@4 x ~@8", D: "~@31 x", E: "~@9 x ~@22", F: "~@13 x ~@2",
  G: "~ x ~@6", H: "~@21 x ~@10", I: "~@6 x!7 ~ x!12 ~ x!5", J: "x!7 ~ x!6 ~ x!2 ~ x ~ x ~ x ~ x ~@7",
})).gain(0.24)

// drums · ride
const ride = s("rd").struct("<~@18 [x!2 ~@2 x!2 ~ x ~ x ~ x!2 ~@2 x!3 ~@2 x!2 ~ x ~ x ~ x!2 ~@2 x] ~@66>").gain(0.56)

stack(
  bass, music_box, piano, acoustic_guitar_steel, electric_guitar_jazz, string_ensemble_1, pizzicato_strings, flute,
  kick, rim, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by Commodores