Strudelify
Hot Stuff cover art

Bad Girls

Hot Stuff

Donna Summer

KeyG minorTempo118 bpm
0:00/0:00
// Hot Stuff — Summer Donna
// 118 bpm, 4/4, key G minor. Source: 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 8 harpsichord (copy of ch 7 synth brass 1)
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(118/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@2 B C D@2 E F D@2 E G H@2 E I D@2 E J D@2 K F L C L F L F M@2 N@2 O@2 P@2 Q@2 R@2 E G D@2 E J S@2 T J S@2 U V L W
  X F Y@2 Z@2 AA@2 AB@2 AC@2 AD@2 AE@2 AF@2 AG@2 AH@2 AE@2 AI@2 AJ@2 S@2 AK@2 T J S@2 T J L F X F L F M@2 AL@2 AM@2 AN@2
  AO@2 D@2 E J AK@2 AP AQ@4
>`.pickRestart({
  A: "[[g2,g3,bb3,d4]@31 ~]/2", B: "[f2,a3,c4,f4]@13 ~ [g3,bb3,d4] ~", C: "[g2,g3,bb3,d4]@15 ~",
  D: "[[g2,g3,bb3,d4]@15 ~]/2", E: "[f3,a3,c4,f4]@7 ~", F: "[g2,g3,bb3,d4]@7 ~", G: "[g3,bb3,d4,g4]@7 ~",
  H: "[[g3,bb3,d4,g4]@15 ~]/2", I: "[g2,bb3,d4,g4]@7 ~", J: "[g3,bb3,d4]@7 ~", K: "[f2,a3,c4,f4]@7 ~",
  L: "[c3,g3,c4]@7 ~ [d3,a3,d4]@7 ~", M: "[[c3,g3,c4]@11 ~@3 [d2,d3,a3,d4]@16 ~@2]/2",
  N: "[[g2,g3,bb3,d4]@2 ~@2 [g2,g3,bb3,d4]@4 ~@2 [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~]/2", // Gm Bb5 C5 D5
  O: "[[g2,g3,bb3,d4]@2 ~@2 [g2,g3,bb3,d4]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~]/2", // Gm Bb5 C5 D5
  P: "[[g2,d3,g3,bb3,d4]@2 ~@2 [g2,d3,g3,bb3,d4]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~]/2", // Gm Bb5 C5 D5
  Q: "[[g2,d3,g3,bb3,d4]@3 ~ [g2,d3,g3,bb3,d4]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~]/2", // Gm Bb5 C5 D5
  R: "[[g2,d3,g3,bb3,d4]@15 ~]/2", S: "[[g3,bb3,d4]@15 ~]/2", T: "[a3,c4,f4]@7 ~", U: "[f3,a3,c4]@7 ~",
  V: "[g3,bb3,d4]@9 ~ [g3,bb3,d4]@4 g3 ~", W: "[g2,d3,g3,d4]@7 ~", X: "[c3,g3,c4]@7 ~ [d3,a3,d4]@6 ~@2",
  Y: "[[c3,g3,c4]@7 ~ [a3,d4]@7 ~ [g2,g3,bb3,d4]@14 ~@2, ~@4 d3@11 ~]/2", // C5 D5 Gm
  Z: "[[c3,g3,c4]@13 ~ [d2,a3,d4]@16 ~@2, ~@7 d3@7 ~@2]/2", // C5 D5
  AA: "[[g2,g3,bb3,d4]@2 ~@2 [g2,g3,bb3,d4]@4 ~@2 [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@7 ~]/2", // Gm Bb5 C5 D5
  AB: "[[g2,g3,bb3,d4]@9 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@2 ~@2 [d3,a3,d4]@3 ~]/2", // Gm Bb5 C5 D5
  AC: "[[g2,g3,bb3,d4]@9 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~]/2", // Gm Bb5 C5 D5
  AD: "[[g2,g3,bb3,d4]@3 ~ [g2,g3,bb3,d4]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@2 ~@2 [d3,a3,d4]@2 ~@2]/2", // Gm Bb5 C5 D5
  AE: "[[g2,g3,bb3,d4]@29 ~@3]/2", AF: "[[g3,bb3,eb4]@29 ~@3]/2", AG: "[[a3,c4,f4]@15 ~]/2",
  AH: "[[g3,bb3]@29 ~@3, d4@27 ~@5]/2", AI: "[[g3,bb3,eb4]@15 ~]/2", AJ: "[[a3,c4,f4]@29 ~@3]/2",
  AK: "[[g3,bb3,d4]@29 ~@3]/2", // Gm
  AL: "[[g2,g3,d4]@2 ~@2 [g2,g3,bb3,d4]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@3 ~]/2", // G5 Gm Bb5 C5 D5
  AM: "[[g2,g3,bb3,d4]@2 ~@2 [g2,g3,bb3,d4]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@2 ~@2]/2", // Gm Bb5 C5 D5
  AN: "[[g2,g3,bb3,d4]@9 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@7 ~]/2", // Gm Bb5 C5 D5
  AO: "[[g2,g3,bb3,d4]@9 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@8 ~@2 [d3,a3,d4]@6 ~@2]/2", AP: "[f3,a3,c4,f4]@13 ~@3",
  AQ: "[[eb2,g3,bb3,eb4]@3 ~ [f2,f3,a3,c4] ~ [g2,g3,bb3,d4]@44 ~@14]/4", // Eb F Gm
})).s("gm_piano").gain(0.3).pan(0.3)

// bass · electric bass finger
const bass = note(`<
  ~ A@2 B C A@2 B D E@2 F E@3 F E@3 F E@3 F E G E H E H E I@2 J@2 K@2 L@2 M@2 E@2 F E@3 F E@3 F E@3 N O H E H E H E P@2
  L@6 M@2 E@18 F E@3 F Q G Q H Q H E R@2 L@8 E@2 F E@3 F S@3 T
>`.pickRestart({
  A: "g1/2", B: "f1", C: "g1", D: "g1@7 ~", E: "g1@2 g2!2 g1@2 g2!2 g1@2 g2!2 g1@2 g2!2",
  F: "f1@2 f2!2 f1@2 f2!2 f1@2 f2!2 f1@2 f2!2", G: "c2@2 c3!2 c2@2 c3!2 d2@2 d3!2 d2@2 d3!2",
  H: "c2@2 c3!2 c2@2 c3!2 d2@2 d3!2 d2 ~ d3!2", I: "[c2@14 d2@17 ~]/2",
  J: "[g1@2 g2!2 g1@2 g2!2 g1@2 bb1@2 ~@2 c2@4 c3!2 c2@2 c3!2 d2@2 d3!2 d2@2 d3!2]/2",
  K: "[g1@2 g2!2 g1@2 g2!2 g1 ~ bb1@4 c2@4 c3!2 c2@2 c3!2 d2@2 d3!2 d2@2 d3!2]/2",
  L: "[g1@2 g2!2 g1@2 g2!2 g1 ~ bb1@3 ~ c2@4 c3!2 c2@2 c3!2 d2@2 d3!2 d2@2 d3!2]/2",
  M: "[g1@2 g2!2 g1@2 g2!2 g1 ~ bb1@3 ~ c2@4 c3!2 c2@2 c3!2 d2@2 ~@2 d2@2 ~@2]/2",
  N: "f1@2 f2!2 f1 ~ f2!2 f1 ~ f2!2 f1@2 f2!2", O: "g1@2 g2!2 g1 ~ g2!2 g1@2 g2!2 g1@2 g2!2", P: "[c2@13 ~ d2@17 ~]/2",
  Q: "g1@2 g2!2 g1@2 g2!2 g1@2 g2!2 g1 ~ g2!2", R: "[c2@13 ~ d2@15 ~@3]/2", S: "[eb1@2 eb2!2 f1@2 g1@42]/3",
  T: "~ g1@2 ~@5",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  A B@2 C D E@2 C F G H I H G H I H G H I H G H I H J@6 K@2 L@8 G H I H G H I H G H I H G H I H J@6 K@2 L@8 M@2 N@2 O@2
  M@4 N@2 O@2 P Q G H I H G H I H J@6 K@2 L@8 G H I H G H I R@4
>`.pickRestart({
  A: "~@14 [g2,d3]!2", B: "[[g2,d3]@29 ~ [f2,c3]!2]/2", C: "[f2,c3]@13 ~ [g2,d3]!2", D: "[g2,d3]@13 ~ [g2,d3]!2",
  E: "[[g2,d3]@28 ~@2 [f2,c3]!2]/2", F: "[g2,d3]@15 ~", G: "[g2,d3,g3]@3 ~ [g2,d3,g3]@2 ~@10",
  H: "[g2,d3,g3] ~ [g2,d3,g3] ~@5", I: "[f2,c3,f3] ~ [f2,c3,f3] ~@5",
  J: "[[c3,g3,c4]@2 ~@2 [c3,g3,c4]@2 ~@2 [d3,a3,d4]@3 ~ [d3,a3,d4] ~ [g2,d3,g3]@15 ~@3]/2", // C5 D5 G5
  K: "[[c3,g3]@13 ~ [d3,a3]@17 ~]/2", // C5 D5
  L: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@2 ~@4 [bb2,f3,bb3]@2 ~@2 [c3,g3,c4]@9 ~ [d3,a3,d4]@3 ~ [d3,a3,d4]@4]/2", // G5 Bb5 C5 D5
  M: "[[g2,d3,g3]@31 ~]/2", N: "[[g2,eb3,g3]@31 ~]/2", O: "[[g2,c3,g3]@31 ~]/2", P: "[g2,d3,g3]@13 ~ [g2,d3,g3] ~",
  Q: "[g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~", // G5
  R: "[[g2,d3,g3] ~ [f2,c3,f3] [g2,d3,g3]@22 [g2,d3,g3]@2 ~@5]/4", // G5 F5 G5
})).s("gm_overdriven_guitar").gain(0.3)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  A B@2 C D E@2 C F G H I J K H I L M N O P Q R S T U V W X W Y Z@2 AA@2 AB@2 AC@2 AD@2 K N S AE Q K@2 AF Q R S AG K R
  AH AI U AJ AK X AL AM AN@2 AO@2 AP@2 AQ@2 AR@2 AS AT AU AV@3 AU AW AV@2 AX AV@2 AY AZ BA BB@2 BC@2 BD BE BF BG BH X BI
  Y BJ BK BL@2 BM@2 BN@2 AP@2 BO@2 BP R AH AE Q@2 AH BQ@4
>`.pickRestart({
  A: "~@14 [g2,d3,g3]!2", B: "[[g2,d3,g3]@24 ~@6 [f2,c3,f3]!2]/2", C: "[f2,c3,f3]@12 ~@2 [g2,d3,g3]!2",
  D: "[g2,d3,g3]@12 ~@2 [g2,d3,g3]!2", E: "[[g2,d3,g3]@27 ~@3 [f2,c3,f3]!2]/2", F: "[g2,d3,g3]@15 ~",
  G: "~@3 g4 ~@2 f3@2 g3 ~ f3 ~ g3 ~@3", H: "~@3 g4 ~@2 f3 ~ g3!2 f3 ~ g3 ~ f3 ~",
  I: "~@3 g4 ~@2 f3 ~ g3 ~ f3 ~ g3 ~ f3 ~", J: "g3 ~@3 [g4,bb4]!3 ~ [f4,a4]!3 ~ [d4,g4]!3 ~",
  K: "~@3 g4 ~@2 f3 ~ g3 ~ f3 ~ g3 ~@3", L: "g3 ~@2 [d4,g4] ~@4 [g4,bb4]!3 ~ [f4,a4]!3 ~",
  M: "[d4,g4] ~@2 [d4,g4] ~@2 f3 ~ g3 ~ f3 ~ g3 ~@3", N: "~@3 g4 ~@2 f3 ~ g3 ~ f3 ~ g3!2 ~@2",
  O: "~@3 f4 ~@2 f3 ~ g3 ~ f3 ~ g3 ~ f3 ~", P: "g3 ~@3 [d4,g4,bb4]!3 ~ [c4,f4,a4]!3 ~ [bb3,d4,g4]!3 ~",
  Q: "~@3 g3 ~@2 f3 ~ g3 ~ f3 ~ g3 ~@3", R: "~@3 [d4,g4] ~@2 f3 ~ g3 ~ f3 ~ g3 ~@3",
  S: "~@3 f4 ~@2 f3 ~ g3 ~ f3 ~ g3 ~@3", T: "~@4 [g4,bb4]!3 ~ [f4,a4]!3 ~ [f4,g4] ~@3",
  U: "[c3,g3] ~ [c3,g3] ~ [d3,a3]@2 ~@2", V: "[g2,d3,g3]@2 g2 ~ [g2,d3,g3]@9 ~ c3 ~",
  W: "[c3,g3,c4]@2 ~@2 [c3,g3,c4]@2 ~@2 [d3,a3]@5 ~@3", // C5 D5
  X: "[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [g2,d3,g3]@2 ~@2 [g2,d3,g3] ~", // G5
  Y: "[g2,d3,g3]@2 ~@2 [g2,d3,g3]@4 ~@2 [g2,d3,g3]@2 ~@2 [g2,d3,g3] ~", Z: "[[c3,g3]@10 ~@4 [d3,a3]@11 ~@7]/2",
  AA: "[[d3,g3] ~@3 [d3,g3]@2 ~@4 [f3,bb3]@2 ~@2 [c3,g3,c4]@7 ~@3 [d3,a3]@2 ~@2 [d3,a3]@2 ~@2]/2", // G5 Bb5 C5 D5
  AB: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [bb2,f3,bb3]@2 ~@2 [c3,g3,c4]@7 ~@3 [d3,a3,d4]@2 ~@2 [d3,a3,d4]@2 ~@2]/2", // G5 Bb5 C5 D5
  AC: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [bb2,f3,bb3]@2 ~@2 [c3,g3,c4]@8 ~@2 [d3,a3,d4]@2 ~@2 [d3,a3,d4] ~@3]/2", // G5 Bb5 C5 D5
  AD: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@3 ~@3 [bb2,f3,bb3]@3 ~ [c3,g3,c4]@8 ~@2 [d3,a3,d4]@2 ~@2 [d3,a3,d4]@2 ~@2]/2", // G5 Bb5 C5 D5
  AE: "~@2 [g4,bb4]!3 ~ [f4,a4]!3 ~ [d4,g4]!3 ~ [c4,f4] ~", // Gm F G5 F5
  AF: "~@2 [g4,bb4]!2 ~ [f4,a4]!2 ~ [d4,g4]!2 ~ [c4,f4]!2 ~ [bb3,d4] ~", AG: "~@4 [g4,bb4]!3 ~ [f4,a4]!3 ~ [d4,g4]!3 ~",
  AH: "~@3 [c4,f4] ~@2 f3 ~ g3 ~ f3 ~ g3 ~@3", AI: "~@2 [g4,bb4]!3 ~ [f4,a4]!3 ~ [d4,g4]!3 ~@3",
  AJ: "[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [g2,d3,g3]@3 ~ [g2,d3,g3] ~", AK: "[c3,g3]@3 ~ [c3,g3]@2 ~@2 [d3,a3]@4 ~@4",
  AL: "[c3,g3]@2 ~@2 [c3,g3]@3 ~ [d3,a3]@6 ~@2", AM: "[g2,d3,g3]@3 ~ [g2,d3,g3]@5 ~ [g2,d3,g3]@5 ~",
  AN: "[[c3,g3,c4]@6 ~ [d3,a3]@8 ~]/2", // C5 D5
  AO: "[[d3,g3]@2 ~@2 [d3,g3]@5 ~ [bb2,f3,bb3]@2 ~@2 [c3,g3,c4]@8 ~@2 [d3,a3]@3 ~ [d3,a3]@3 ~]/2", // G5 Bb5 C5 D5
  AP: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@8 ~@2 [d3,a3]@3 ~ [d3,a3]@3 ~]/2", // G5 Bb5 C5 D5
  AQ: "[[g2,d3,g3]@3 ~ [g2,d3,g3]@4 ~@2 [bb2,f3,bb3]@2 ~@2 [c3,g3,c4]@8 ~@2 [d3,a3]@2 ~@2 [d3,a3]@2 ~@2]/2", // G5 Bb5 C5 D5
  AR: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@4 ~@2 [bb2,f3,bb3]@3 ~ [c3,g3,c4]@8 ~@2 [d3,a3]@2 ~@2 [d3,a3] ~@3]/2", // G5 Bb5 C5 D5
  AS: "~@2 g3 ~ g3 ~ f3 ~ g3 ~@7", AT: "g3 ~@2 g3 ~ g3 f3 ~ g3 ~@5 f3 ~", AU: "g3 ~ f3 ~ g3 ~ f3 g3 ~@6 f3!2",
  AV: "g3 ~ f3 ~ g3 ~ f3 g3 ~@7 f3", AW: "g3 ~ f3 ~ g3 ~ f3 g3 ~ g3 f3 ~@5", AX: "g3 ~ f3 ~ g3 ~ f3 g3 ~ g3 ~@4 f3!2",
  AY: "g3!2 f3 ~ g3 ~ f3 g3 ~@7 f3", AZ: "g3 ~ f3 ~ g3 ~ f3 g3 ~@6 d3 f3", BA: "g3 ~ f3 ~ g3 ~ f3 g3 ~@8",
  BB: "[~@2 [g3,bb3,d4] ~@3 [d3,g3,bb3] ~@3 [d3,g3,bb3] ~@3 [d3,g3,bb3]@13 ~@5]/2", // Gm
  BC: "[~@2 [c3,f3,a3] ~@3 [c3,f3,a3] ~@3 [c3,f3,a3] ~@3 [g2,d3,g3]@5 ~ [g2,d3,g3]@2 ~@2 [g2,d3,g3] ~ [g2,d3,g3] ~@3 [g2,d3,g3] ~]/2", // F G5
  BD: "~@2 [g2,d3,g3] ~@3 [g2,d3,g3] ~@3 [g2,d3,g3] ~@3 [g2,d3,g3]@2", // G5
  BE: "~@2 [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~", // G5
  BF: "~@2 [f2,c3,f3] ~@3 [f2,c3,f3] ~@3 [f2,c3,f3] ~@3 [g2,d3,g3]@2", // F5 G5
  BG: "~@2 [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,g3] ~ [g2,g3] ~ bb2 ~ [g2,g3] ~", // G5 G
  BH: "[c3,g3,c4]@2 ~@2 [c3,g3,c4]@2 ~@2 [d3,a3]@7 ~", BI: "[c3,g3]@3 ~ [c3,g3]@3 ~ [d3,a3]@3 ~ [d3,a3]@2 ~@2",
  BJ: "[c3,g3]@2 ~@2 [c3,g3]@3 ~ [d3,a3] ~ [d3,a3]@3 ~ [d3,a3] ~", // C5 D5
  BK: "[g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~", // G5
  BL: "[[c3,g3]@13 ~ [d3,a3]@17 ~]/2", // C5 D5
  BM: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@8 ~@2 [d3,a3]@2 ~@2 [d3,a3]@2 ~@2]/2", // G5 Bb5 C5 D5
  BN: "[[g2,d3,g3]@2 ~@2 [g2,d3,g3]@5 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@8 ~@2 [d3,a3]@3 ~ [d3,a3]@2 ~@2]/2", // G5 Bb5 C5 D5
  BO: "[[g2,d3,g3]@3 ~ [g2,d3,g3]@4 ~@2 [bb2,f3,bb3]@2 ~@2 [c3,g3,c4]@9 ~ [d3,a3]@2 [d3,a3] ~ [d3,a3]@3 ~]/2", // G5 Bb5 C5 D5
  BP: "~@2 g3 ~@3 f3 ~ g3 ~ f3 ~ g3 ~@3", BQ: "[g4@2 f4@2 eb4 ~ [g3,d4,g4]@44 ~@14, [eb3,eb4]@5 ~@59]/4",
})).s("gm_electric_guitar_muted").gain(0.25).pan(0.7)

// other · distortion guitar
const distortion_guitar = note("<~@72 A B C D E F@2 G H I J K L M@2 N O ~@35>".pickRestart({
  A: "~@10 g5!3 ~ g5@2", B: "d6@3 ~ d6@2 ~@2 bb4 g4 ~ g4@5", C: "f4 g4 ~ g4@3 f4 d4 c4 bb3 a3 g3@5",
  D: "bb3 g3 ~ g3@2 f3 g3@2 bb3 g3 ~ g3@5", E: "~@2 db4 c4 bb3 g3 db4 c4 bb3 g3@6 ~",
  F: "[c5 bb4@2 ~ bb4 g4@3 c5 bb4 ~@2 bb4 g4@5 f4 g4 ~@2 c5 [bb4,d5] c5@5 ~ d5 [bb4,c5]]/2", // Bb Bbsus2
  G: "c5 g4@7 ~ bb4 g4 f4 g4 f4 d4 bb3, ~ bb4 ~@14", H: "g3@2 bb3 g3 d4 bb3 g3@6 g4 bb4 d5 g5",
  I: "f5@9 ~@3 c5 a4 f4 c5", J: "a4 f4 c5 a4 f4 d5@7 c5 bb4 [bb4,c5] g4", K: "g5 d5 ~ f5 c5 g5 ~ d5 f5 c5 ~ g5 d5 g5@3",
  L: "~@2 bb5 [f5,g5] g5 c5 gb5 b4 f5 bb4 e5 a4 eb5 ab4 d5 g4", // Fsus2
  M: "[db5 gb4 c5@4 d5 [bb4,c5] c5@10 d5 [bb4,c5] c5@2 bb4@2 g4 f4 g4 f4 d4 gb4 g4 d4]/2", N: "g4 g2@3, [g3,d4]",
  O: "[g2,d3,g3]", // G5
})).s("gm_distortion_guitar").gain(0.45)

// chords · french horn
const french_horn = note(`<
  ~ A@2 B C@3 B C@3 B C@3 B C@3 B C@3 B D E D E D E D F@2 G@8 A@2 B C@3 B C@3 B C@3 B D E D E D E D F@2 G@2 H@2 I@2 G@2
  A@2 J@2 K@2 L@4 M@2 K@2 N@4 B C@3 B D O@2 E D E D F@2 I@2 G@6 A@2 B C@3 B P@4
>`.pickRestart({
  A: "[[g3,bb3,d4]@31 ~]/2", B: "[f3,a3,c4]@15 ~", C: "[[g3,bb3,d4]@47 ~]/3", D: "[g3,bb3,d4]@15 ~",
  E: "[g3,c4,eb4]@7 ~ [gb3,a3,d4]@7 ~", F: "[[g3,c4,eb4]@13 ~ [d3,a3,d4]@17 ~]/2",
  G: "[[g3,bb3,d4]@9 ~ [f3,bb3,d4]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@7 ~]/2", // Gm Bb C5 D5
  H: "[g3@4 g3@5 ~ [f3,bb3,d4]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@7 ~, [bb3,d4]@9 ~@23]/2", // Bb C5 D5 Bb
  I: "[[g3,bb3,d4]@3 ~ [g3,bb3,d4]@5 ~ [f3,bb3,d4]@3 ~ [c3,g3,c4]@9 ~ [d3,a3,d4]@7 ~]/2", J: "[[g3,bb3,eb4]@31 ~]/2",
  K: "[[a3,c4,f4]@31 ~]/2", L: "[[bb3,d4,g4]@31 ~]/2", M: "[[bb3,eb4,g4]@31 ~]/2", N: "[[g3,bb3,d4]@63 ~]/4",
  O: "[[g3,c4,eb4]@7 ~ [gb3,a3]@7 ~ [g3,bb3]@15 ~, ~@8 d4@23 ~]/2", // Cm Gbm Gm
  P: "[[eb3,g3,bb3]@3 ~ [f3,a3,c4] ~ [g3,bb3,d4]@44 ~@14]/4", // Eb F Gm
})).s("gm_french_horn").gain(0.1)

// drums · kick
const kick = s("bd").struct("<~ A@30 B C A@30 B D A@38 B D A@15 E ~@2 F>".pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "~ x!2 ~ x ~ x ~", D: "~ x!2 ~@2 x ~ x", E: "x ~ x!2 ~@4", F: "~ x ~@6",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@9 A@22 ~@2 A@30 ~@2 A@38 ~@2 A@15 B ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct(`<
  A B@7 C B@7 C B@7 D B@6 E F B@7 G B@7 C B@7 D B@6 E F B@7 G B@15 H B@7 D B@6 E F B@7 I B@7 J ~@2 K
>`.pickRestart({
  A: "~@14 x!2", B: "~ x ~ x", C: "~@4 x ~@7 x ~ x!2", D: "~@2 x ~ x ~ x ~@5 x ~ x!2", E: "~@5 x!2 ~", F: "~@2 x!2",
  G: "~@4 x ~@3 x ~ x ~ x ~ x!2", H: "x!8", I: "~ x!7", J: "~ x!2 ~@5", K: "~ x!2 ~@13",
})).gain(0.4)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@8 B C B C D C B C B C B C B C B C E@6 F G E@7 H D C B C B C B I B C B J B C B C E@6 K L E@7 M B C B C B C B J B C
  B C B I B J N A@2 N A N A@2 E@6 M G O E@2 M E@3 A D C B P Q R S T ~@3
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x!2", C: "x ~ x ~ x ~ x!3 ~ x ~ x ~@3", D: "x ~ x!3 ~ x!3 ~ x ~ x ~ x!2",
  E: "x ~@3 x ~ x!3 ~@3 x ~ x!2", F: "x ~@3 x ~ x!3 ~ x ~ x ~ x ~", G: "~ x!4 ~ x ~", H: "x ~@3 x ~ x!2 ~@4 x ~ x ~",
  I: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", J: "x ~ x ~ x ~ x!3 ~@3 x ~@3", K: "x ~ x!5 ~", L: "~@2 x ~ x ~ x!3 ~ x ~ x ~@3",
  M: "x ~@3 x ~ x!3 ~@3 x ~@3", N: "x ~@3 x ~@3 x ~@3 x ~ x!2", O: "x ~@3 x ~ x!3 ~@3 x ~ x ~",
  P: "x ~ x ~ x ~ x!3 ~ x ~@3 x ~", Q: "x ~ x!3 ~ x ~ x ~ x!3 ~ x!2", R: "x ~ x ~ x ~ x!3 ~ x!3 ~ x ~",
  S: "x ~ x ~ x ~ x!3 ~ x!3 ~ x!2", T: "x!3 ~@5",
})).gain(0.3)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A@8 ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B C@6 D E C@8 ~ B ~ B ~ B ~@3 B ~ E ~ B ~ B C@6 F B C@7 G ~ B ~ B ~ B ~ E ~ B ~ B
// … 25 more lines

More by Donna Summer