Strudelify
The Groove Line cover art

1978 · Central Heating

The Groove Line

Heatwave

KeyG majorTempo120 bpm
0:00/0:00
// The Groove Line — Heatwave
// 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 146 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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@8 A B C D A D E F G H E D I J K L M N O P E Q G H E D I J K L M N O P E Q R@3 S@2 T S U G H E D I J K L M N O P E Q
  C H O D I J K L M N V W J X Y Z AA AB W@2 X@2 Y L AA AC G P AD Q R@3 S@2 AE S U E P G P V AF AG@2 M AH W@2 X@2 Y AI AJ
  AB AK W X@2 Y L AJ AB W@2 X@2 AL AM AN AB W@2 X@2 AO Z AN AP
>`.pickRestart({
  A: "e2@3 c#3@3 d3@2", B: "a2 a#2 b2 g2@4 ~", C: "e2@6 c#3@6 d3@3 ~", D: "a2 ~ a#2 ~ b2@2 g2@9 ~",
  E: "e2@6 c#3@5 ~ d3@4", F: "a2 ~ a#2 ~ b2@2 g2@10", G: "e2@5 ~ c#3@5 ~ d3@3 ~", H: "a2 ~ a#2 ~ b2@2 g2@8 ~@2",
  I: "c3@2 ~@5 c3 c3@2 ~@6", J: "b2@2 ~@5 b2!2 ~@7", K: "g3@5 ~@5 c#3@2 ~ c#3 f#3 c#3, ~@3 f#3@4 ~",
  L: "f3@5 ~ e3@8 ~@2", M: "d3@5 ~ c3@9 ~", N: "~@10 b3 ~@2 b3 ~@2, b2@15 ~", O: "e2@5 ~ c#3@5 ~ d3@4",
  P: "a2 ~ a#2 ~ b2 ~ g2@8 ~@2", Q: "a2 ~ a#2 ~ b2 ~ g2@9 ~", R: "a2@6 ~ a2 e3 ~ e3 ~ g3!2 g#3 a3",
  S: "a2@7 a2 e3 ~ e3 ~ g3!2 g#3 a3", T: "a2@6 ~ a2 e3 ~ e3 ~ g3!2 g#3 a3, b2 ~@15", U: "a2@7 a2 e3!2 d3 ~ c3 ~ g2@2",
  V: "c3@2 ~@5 c3!2 ~@7", W: "c3 ~@6 c3!2 ~@7", X: "b2 ~@6 b2!2 ~@7", Y: "g3@5 ~ f#3@8 ~@2", Z: "f3@5 ~ e3@9 ~",
  AA: "d3@4 ~@2 c3@9 ~", AB: "b2@7 ~", AC: "b2@15 ~", AD: "e2@6 c#3@5 ~ d3@3 ~",
  AE: "a2@7 a2 e3 ~ e3 ~ g3!2 g#3 a3, b2 ~@15", AF: "b2 ~@7 b2 ~@7",
  AG: "[g3@5 ~ f#3@7 c#3 ~ c#3 f3@4 ~@2 e3@8 ~@2, ~@7 f#3@4 ~@5]/2", AH: "b2", AI: "f3@2 ~ e3@4 ~", AJ: "d3@2 ~ c3@4 ~",
  AK: "~ c3 ~@5 c3!2 ~@7", AL: "g3@5 ~ f#3@9 ~", AM: "f3@4 ~@2 e3@9 ~", AN: "d3@5 ~ c3@8 ~@2", AO: "g3@2 ~ f#3@4 ~",
  AP: "b2@11 ~ b2@2 e3@2",
})).s("gm_acoustic_bass").gain(0.7)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A@3 ~ B@12 C@4 ~@6 C@8 ~@6 C@4 D@7 E C@4 ~@6 C@4 F G H I J K ~@3 L M N M O P Q R S T@2 U@2 V Q R S W@3 X D@7 E Y@3 Z
  AA S P Q R AB AC AD AE AF V Q R AG AH@2 AI@2 V Q R AJ AK@2 AL@2 P Q R AM AN@2 AO@2 P Q R AP
>`.pickRestart({
  A: "[[e2,e3]@43 ~@5]/3", B: "[d6,g6] ~ [d6,g6]!2 ~ [d6,g6]!2 ~ [d6,g6] ~ [d6,g6] ~ [b5,e6] ~@3",
  C: "~@2 [g3,b3,d4]@3 ~ [g3,b3,d4] ~@9", D: "~@2 [a4,a5,a6] ~@3 [a4,a5,a6] ~@9", E: "~@2 [a4,a5,a6] ~@13",
  F: "~@2 [b4,b5] ~ [a#4,a#5] a4@2 ~ [g4,g5]@2 ~ [e4,e5]@2 ~ [b3,b4] ~, ~@5 a5 ~@10", // B A# G E B
  G: "[d4,d5]@2 ~ [d#4,d#5]@2 ~ [e4,e5]@3 ~ [g4,g5]@2 ~ [e5,a5] e4 ~, ~@10 d5 ~@2 a4@2 ~", // D D# E G A5
  H: "~@2 [b4,b5]@2 [a#4,a#5] [b4,b5] [a#4,a#5] [b4,b5] [g4,g5] ~ [e4,e5]@3 b3@3, ~@13 b4 ~@2", // B A# B A# B G E
  I: "[d4,d5]@2 ~ [d#4,a#4] ~@2 [e4,e5]@3 ~ [e2,e3,e4,e5]@2 [d#2,d#3,d#4,d#5] ~ [d3,d4,d5] ~, a4 ~@2 d#5@2 ~ b4 ~@7 d2@2", // D D#5 E D# D
  J: "[c2,c3]", K: "[b1,b2] ~@15", L: "~@14 g4 ~", M: "f#4@3 ~ g4@3 ~ e4@3 ~ g4@3 ~",
  N: "f#4@2 g4@3 ~ e4@3 ~ g4@3 ~ e4 ~", O: "f#4 g4 g4@2 ~@2 e4@6 ~@4", P: "[g3,b3,d4]@4 ~@2 [f#3,a3,c#4]@9 ~",
  Q: "[f3,a3,c4]@5 ~ [e3,g3,b3]@9 ~", R: "[d3,f#3,a3]@5 ~ [c3,e3,g3]@8 ~@2", S: "[b2,a3,c#4,e4]@7 ~",
  T: "[[c3,e3,g3,b3]@7 ~]/2", U: "[[b2,a3,c#4,e4]@15 ~]/2", V: "[g3,b3,d4]@5 ~ [f#3,a3,c#4]@9 ~", W: "[g3,b3,d4]@15 ~",
  X: "[g3,b3,d4]@13 ~@3", Y: "~ [g3,b3,d4]@7", Z: "~ [g3,b3,d4]@5 ~@2", AA: "[c3,e3,g3,c4]@7 ~",
  AB: "[b2,a3,c#4,e4]@13 ~@3", AC: "~@4 [g3,g4]@4 [e3,e4]@3 ~ [g3,g4]@3 ~",
  AD: "[f#3,f#4]@2 [g3,g4]@3 ~ [e3,e4]@4 [g3,g4]@3 ~ [e3,e4] ~", // F# G E G E
  AE: "[f#3,f#4]@3 ~ [g3,g4]@3 ~ [e3,e4]@3 ~ [g3,g4]@3 ~", AF: "[f#3,f#4] ~ [g3,g4]@3 ~ [e3,e4]@8 ~@2",
  AG: "[b2,a3,c#4,e4]@7 g3, ~@14 g4 ~", // A
  AH: "[[g3,f#4]@4 [g3,g4]@4 e4@3 ~ [g3,g4]@3 ~ [f#3,f#4] ~ [g3,g4]@3 ~ [e3,e4]@3 ~ [g3,g4]@2 g3 ~ [e3,e4] ~, [c3,b3]@29 ~@3, e3!2 ~@2]/2", // Gmaj7 G F# G E G E Cmaj7
  AI: "[[f#3,f#4]@3 ~ [g3,g4]@3 ~ e3@2 ~@2 [g3,g4]@3 ~ [f#3,f#4]@2 [g3,g4]@3 ~ [e3,e4]@8 ~@2, [b2,a3,c#4]@15 ~, e4!2 ~@2]/2", // F# G F# G E F#m
  AJ: "[b2,a3,c#4,e4]@7 g4, ~@14 g3 ~", // A
  AK: "[~ f#3@3 [g3,g4]@4 e4@3 ~ [g3,g4]@3 ~ [f#3,f#4] ~ [g3,g4]@3 ~ [e3,e4]@3 ~ [g3,g4]@3 ~ [e3,g3,e4] ~, [c3,b3]@15 ~, e3!2 ~@2, [g3,f#4] ~@7]/2", // G F# G E G Em Cmaj7 Gmaj7
  AL: "[~ f#3@2 ~ [g3,g4]@3 ~ e3@3 ~ [g3,g4]@3 ~ [f#3,f#4] ~ [g3,g4]@3 ~ e3@8 ~@2, [b2,a3,c#4]@15 ~, e4@4 e4@4 ~@3 e4@3 ~@2, f#4@3 ~@29]/2", // G F# G F#m
  AM: "[a3,c#4,e4]@14 [g3,g4] ~, b2@13 ~@3", // A G
  AN: "[[f#3,g3,f#4]@4 [g3,g4]@4 e4@3 ~ [g3,g4]@3 ~ [f#3,f#4] ~ [g3,g4]@3 ~ [e3,e4]@3 ~ [g3,g4]@3 ~ [e3,e4] ~, [c3,b3]@15 ~, e3!2 ~@2]/2", // Gmaj7 G F# G E G E Cmaj7
  AO: "[[f#3,f#4]@3 ~ [g3,g4]@3 ~ e3@3 ~ [g3,g4]@4 [f#3,f#4] ~ [g3,g4]@3 ~ [e3,e4]@8 ~@2, [b2,a3,c#4]@15 ~, e4!2 ~@2]/2", // F# G F# G E F#m
  AP: "[a3,c#4,e4]@13 ~ [e3,g3]@2, b2@10 ~@4 b3 ~", // A Em
})).s("gm_piano").gain(0.72)

// other · melodic tom · "MELO TOM 1"
const melodic_tom = note("<A B@15 ~@46 C@4 ~@11 D ~ E ~@34 F G H I ~@12 J K L M ~@4 J K L M ~@4>".pickRestart({
  A: "[e2,e3] ~ [e1,e2] ~ [e1,e2] ~ [e1,e2] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~", // E
  B: "[e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~ [e1,e2,e3,e4] ~", // E
  C: "[d6,g6] ~ [d6,g6]!2 ~ [d6,g6]!2 ~ [d6,g6] ~ [d6,g6] ~ [b5,e6] ~@3", D: "~@2 e4 ~ d4 ~ e4 ~ b3!2 a3 ~ g3 ~ e3@2",
  E: "~@2 e4 ~ d4 ~ e4 ~ a3 b3 g3 ~ f#3 ~ e3 ~", F: "~@4 g3@3 ~ e3@3 ~ g3@3 ~", G: "f#3@2 g3@3 ~ e3@3 ~ g3@3 ~ e3 ~",
  H: "f#3@3 ~ g3@3 ~ e3@3 ~ g3@3 ~", I: "f#3 ~ g3@3 ~ e3@8 ~@2", J: "~@4 e4 ~@3", K: "~@6 e4@3 ~@7", L: "~@8 e4@3 ~@5",
  M: "~@3 e4@3 ~@2",
})).s("gm_melodic_tom").gain(0.46)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note("<~@15 A B ~@12 C ~@13 C ~@7 D B ~@12 C ~@37 D B ~@40 E>".pickRestart({
  A: "~@8 g#4 c5 f5 a#4 d#5 g#5 c#5 g5", B: "b5 ~@15", C: "~@12 a5 a#5 b5 ~", D: "~@8 g#4 d5 f5 a#4 d5 g#5 d5 g5",
  E: "~@7 [e5,b5,e6]", // E5
})).s("gm_synth_brass_1").gain(0.59)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@16 A@4 B C D E F G A@8 B C D E F G A@4 H I H I H I J K A@4 B C D E F G A@8 B C D E F G ~@4 L M F N O@2 P@2 Q E F N
  R@4 H I H I H I H K S@4 T U Q E V W X@2 Y@2 Q E V Z AA@2 AB@2 Q E F AC AD@2 AE@2 Q E V AF ~@2 AG@2 Q E V AH
>`.pickRestart({
  A: "[[b3,d4,g4,b4,d5,g5]@63 ~]/4", B: "[e4,g4,b4]@7 ~", C: "[f#4,a4,c#5]@15 ~",
  D: "[g4,b4,d5]@5 ~ f#4 ~ f#4@7 ~, ~@6 [a4,c#5]@9 ~", E: "[f4,a4,c5]@5 ~ [e4,g4,b4]@9 ~",
  F: "[d4,f#4,a4]@5 ~ [c4,e4,g4]@9 ~", G: "[f#4,a4,c#5]@7 ~", H: "[e4,a4,c5]@15 ~", I: "[d4,f#4,a4]@15 ~",
  J: "[a4,c5]@15 ~", K: "[d4,f#4,a4]@7 ~@9", L: "[g4,b4,d5]@3 ~@3 [f#4,a4,c#5]@9 ~", M: "[f4,a4,c5]@5 ~ [e4,g4,b4]@10",
  N: "[a3,c#4,e4]@15 ~", O: "[[b3,e4,g4,b4,e5,g5]@31 ~]/2", P: "[[a3,c#4,e4,a4,c#5,e5]@15 ~]/2",
  Q: "[g4,b4,d5]@5 ~ [f#4,a4,c#5]@9 ~", R: "[[b3,e4,g4]@27 ~@5 [e4,g4,b4]@16 [d4,g4,b4]@16, d5@63 ~, b4 ~]/4",
  S: "[[g4,b4,d5]@31 ~]/4", T: "[c4,e4,g4,c5]@15 ~", U: "[b3,a4,c#5,e5]@15 ~", V: "[d4,f#4,a4]@5 ~ [c4,e4,g4]@8 ~@2",
  W: "[b3,f#4,a4,c#5]@15 ~", X: "[[c4,e4,g4,b4]@29 ~@3]/2", Y: "[[a3,c#4,e4]@15 ~]/2", Z: "[f#4,a4]@15 ~, b3@13 ~@3",
  AA: "[[c4,e4,g4,b4]@15 ~]/2", AB: "[[b3,a4,c#5]@31 ~]/2", AC: "b3@7 ~", AD: "[[c4,e4,g4]@31 ~, b4@7 ~]/2",
  AE: "[[f#4,a4,c#5]@31 ~]/2", AF: "[b3,a4,c#5,e5]", AG: "[[b3,a4,c#5,e5]@31 ~]/2", AH: "[b3,a4,c#5,e5]@13 ~@3",
})).s("gm_rock_organ").gain(0.41)

// chords · lead 7 fifths · "5THSAWWAVE"
const lead_7_fifths = note(`<
  ~@5 A B C D E F ~ G H I ~@47 J@4 K L M N ~@6 O P Q R S T U V W X Y Z ~@4 AA AB AC AD ~@18 AE AF AG AH ~@4 AI AJ AK AL
  ~@3 AM AN AO AP AQ ~@3 AR AN AO AP AQ ~@4
>`.pickRestart({
  A: "~@12 e6@3 ~", B: "e6 ~@15", C: "~@4 e6@3 ~ e6 d6 b5 a#5 a5 e5 g5@2", D: "b5@3 a5@2 b5@2 ~ a5@3 b5@2 a5@3",
  E: "b5@3 a5@2 b5@2 ~ d6@4 b5@2 a5@2", F: "b5@15 ~",
  G: "[g5,b5,d6]@3 [f#5,a5,c#6]@2 [g5,b5,d6]@3 [f#5,a5,c#6]@3 [g5,b5,d6]@2 [f#5,a5,c#6]@3", // G F#m G F#m G F#m
  H: "[g5,b5,d6]@3 [f#5,a5,c#6]@2 [g5,b5,d6]@3 [b5,d6,f#6]@4 [g5,d6]@2 [f#5,a5,c#6]@2, ~@3 b5", I: "[g5,b5,d6]@7 ~",
  J: "[d6,g6] ~ [d6,g6]!2 ~ [d6,g6]!2 ~ [d6,g6] ~ [d6,g6] ~ [b5,e6] ~@3", // G5 E5
  K: "~@2 [b4,b5] ~ [a#4,a#5] a4@2 ~ [g4,g5]@2 ~ [e4,e5]@2 ~ [b3,b4] ~, ~@5 a5 ~@10", // B A# G E B
  L: "[d4,d5]@2 ~ [d#4,d#5]@2 ~ [e4,e5]@3 ~ [g4,g5]@2 ~ [e5,a5] e4 ~, ~@10 d5 ~@2 a4@2 ~", // D D# E G A5
  M: "~@2 [b4,b5]@2 [a#4,a#5] [b4,b5] [a#4,a#5] [b4,b5] [g4,g5] ~ [e4,e5]@3 b3@3, ~@13 b4 ~@2", // B A# B A# B G E
  N: "[d4,d5]@2 ~ [d#4,a#4] ~@2 [e4,e5]@3 ~ [e2,e3,e4,e5]@2 [d#2,d#3,d#4,d#5] ~ [d3,d4,d5] ~, a4 ~@2 d#5@2 ~ b4 ~@7 d2@2", // D D#5 E D# D
  O: "~@12 [d5,d6]@2 [e5,e6] ~, ~@4 [g5,g6]@11 ~, ~@5 [e5,e6]@2 ~", P: "g4 f#4 ~@14",
  Q: "~@4 [a5,a6]@6 [e5,e6]@2 [d5,d6] ~ [e5,e6] ~", R: "[g4,a4] a4 ~@14", S: "~@2 e6 ~@3 e6@3 e6 d6 ~ e6 ~ d6 ~",
  T: "~@2 b5 d6 b5 ~ a5@3 ~ b5 ~ a5 ~ g5@2", U: "~@2 f#5@2 e5 ~ f#5 ~ g5@3 ~ f#5@2 e5 ~",
  V: "d5@4 e5@3 ~ c#5 ~ b4 ~@2 g4 ~@2, ~@6 a4 ~", W: "~@8 d5@6 e5 ~", X: "~@2 g5 ~@3 a5@3 ~ a5 ~ b5 a5 b5 ~",
  Y: "~@4 d6@8 b5@2 a5 ~", Z: "~@2 b5 ~ b5 a5 g5 a5 g5@2 f#5@2 e5@2 d5 ~", AA: "~@2 g6@4 e6 ~@3 e6 ~ d6@2 e6 ~",
  AB: "~@2 e6 ~ e6 ~ e6 ~ e6 d6 e6 ~ e6@2 b5 ~", AC: "~@4 b5 a5 ~ a5 g5@4 a5 ~ g5 ~, ~@3 b5 ~@4",
  AD: "~@2 e5@2 g5 e5 ~@2 d5@2 e5 ~ d5@2 e5 ~", AE: "~@8 e6 d6 b5 ~ d6 ~ b5 ~",
  AF: "a5@2 b5 ~ a5 ~ g5@2 a5@2 g5 ~ f#5@2 e5 ~", AG: "~@4 e6@7 ~ g6 ~ e6 ~", AH: "g6 ~ g6@6 e6@2 d6@2 e6 ~@3",
  AI: "~@2 e6@2 d6@2 e6 ~ d6@2 e6 ~ d6@2 b5@2", AJ: "~@2 e6@4 d6 ~ e6@4 d6@2 b5 ~",
  AK: "d6@2 b5@2 d6@2 b5@2 e6@4 d6@2 b5 ~", AL: "d6 ~ b5 ~ a5 ~ b5 ~ a5 g5@2 f#5 ~ e5 ~@2",
  AM: "~@2 g5@2 a5 ~ b5 ~ d6@3 ~ e6@2 [g4,d5,g5,b5,b6] ~", // G
  AN: "[f#4,d5,f#5,a5,a6]@3 ~ [g4,d5,g5,b5,b6]@3 ~ [c5,e5,g5,g6]@3 ~ [g4,d5,g5,b5,b6]@3 ~", // D G C G
  AO: "[f#4,b4,f#5,a5,a6] ~ [g4,d5,g5,b5,b6]@3 ~ [c5,e5,g5,g6]@3 ~ [g4,d5,g5,b5,b6]@2 ~@4", // B7 G C G
  AP: "[e5,f#5,a5,a6]@3 ~ [g4,e5,g5,b5,b6]@3 ~ [c#5,e5,g5,g6]@3 ~ [g4,e5,g5,b5,b6]@3 ~, f#4 ~@15", // F#m7 Em C#dim Em
  AQ: "[f#4,c#5,f#5,a5,a6] ~ [g4,e5,g5,b5,b6]@3 ~ [c#5,e5,g5,g6]@7 ~@3", AR: "~@14 [g4,d5,g5,b5,b6] ~",
})).s("gm_lead_7_fifths").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@5 x!2 [x ~@6 x] [x ~@6 x!2 ~@7]!137 [x ~@6 x!2 ~@3 x ~ x ~]>").gain(0.66)

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A B@3 C B@7 D B@5 E B C B@11 E B C B@9 D B@9 E B@3 D B@9 E B@7 E B@7 E B@11 D B@9 E B@7 E B@7 D B@7 D B@7 F
>`.pickRestart({
  A: "~@10 x!2 ~@2 x!2", B: "~ x ~ x", C: "~@4 x ~@7 x ~ x!2", D: "~@4 x ~@7 x!4", E: "~@2 x ~@2 x!2 ~",
  F: "~@4 x ~@7 x!3 ~",
})).gain(0.66)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@7 A ~@3 B ~@7 C ~@7 B ~@13 B ~@9 C ~@13 C ~@29 B ~@7 C ~@25 C ~@7 C ~@7 C
>`.pickRestart({
  A: "~@8 x!2 ~@2 x!2 ~@2", B: "~@10 x!2 ~@4", C: "~@8 x!4 ~@4",
})).gain(0.2)

// drums · clap
const clap = s("cp").struct("<~@8 [~ x ~ x]!137 [~@2 x ~@3 x!2]>").gain(0.66)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@5 A@3 ~@11 B ~@5 B ~@13 B ~@11 C ~@9 B ~@3 B ~@9 B ~@7 B ~@7 B ~@3 D ~@7 C ~@9 B ~@7 B ~@7 E ~@7 E ~@7 F
>`.pickRestart({
  A: "x", B: "~@14 x!2", C: "~ x", D: "~@3 x", E: "~@10 x ~ x ~ x!2", F: "~@2 x ~@4 x",
})).gain(0.66)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@8 A@14 ~@4 A@10 ~@4 A@4 ~@8 A@6 ~@4 A@10 ~@4 A@4 ~@4 A@4 ~@4 A@4 ~@8 A@6 ~@4 A@4 ~@4 A@4 ~@4 A@4 ~@4 A@4 ~@4
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
})).gain(0.2)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@11 A ~@10 B@4 ~ A ~@8 B@4 ~ A ~@2 B@8 ~@6 B@4 ~@10 B@4 ~@4 B@4 ~@4 B@4 ~@4 B@8 ~@6 B@4 ~@4 B@4 ~@4 B@4 ~@4 B@4 ~@4
  B@4
>`.pickRestart({
  A: "~@5 x ~@2", B: "x!4",
})).gain(0.66)

// drums · high tom
const high_tom = s("ht").struct("<~@11 A ~@7 B ~@7 A ~@13 A ~@9 C ~@13 B ~@37 C ~@25 D ~@7 D ~@7 B>".pickRestart({
  A: "~@5 x ~@2", B: "~@8 x!2 ~@6", C: "~ x ~@6", D: "x!2 ~@6",
})).gain(0.66)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@3 A ~@3 A ~ A ~ A ~@7 A ~@5 A ~@7 A ~@9 A ~@3 A ~@5 A ~ A ~ A ~@9 A ~@7 A ~@7 A ~@15 A ~@5 A ~@7 A ~@7 A ~@7 A
  ~@7
>`.pickRestart({
  A: "x",
})).gain(0.66)

// drums · ride
// … 30 more lines

More by Heatwave