Strudelify
Shaft cover art

2000 · Shaft 2000

Shaft

Isaac Hayes

KeyE minorTempo117 bpm
0:00/0:00
// Shaft — Isaac Hayes
// 117 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "CLAVINET" clavinet (copy of ch 11 "OBOE" oboe)
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117/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 1"
const piano = note(`<
  ~@5 A@2 B@2 C@2 D@2 A@2 B@2 C@2 E@2 A@2 B@2 C@2 D@2 A@2 B@2 F@3 ~@3 G H@2 I@2 J@2 H@2 I@2 J@2 K@2 ~@28 L M@2 N O P ~ Q
  ~ R S T@3
>`.pickRestart({
  A: "[[f1,f2]@31 ~]/2", B: "[[f1,f2]@15 ~]/2", C: "[[e1,e2]@15 ~]/2", D: "[[e1,e2]@13 ~ [d1,d2] [e1,e2], [e6,e7] ~]/2",
  E: "[[e1,e2]@13 ~ [d1,d2] [e1,e2], [e6,e7]@9 ~@7]/2", F: "[[e1,e2]@35 ~@13]/3", G: "d2 e2 g2@2 ~@4 d2 e2 g2@2 ~@4",
  H: "[d2 e2 g2@3 ~ g1@2 ~@2 a#3 b3@3 ~@2 d2 e2 g2@3 ~@3 d2 e2 g2@3 ~@3, ~@10 [g3,e4]@4 [f3,a3,c4,d4]@9 ~@9]/2", // C Dm7
  I: "[d2 e2 g2@3 ~ g1@3 ~ a#3 b3@3 ~@2 d2 e2 g2@2 ~@4 d2 e2 g2@2 ~@4, ~@10 [g3,e4]@3 ~ [f3,a3,c4,d4]@9 ~@9]/2", // C Dm7
  J: "[d2 e2 g2@2 ~@2 g1@3 ~ a#3 b3@3 ~@2 d2 e2 g2@2 ~@4 d2 e2 g2@2 ~@4, ~@10 [g3,e4]@3 ~ [f3,a3,c4,d4]@8 ~@10]/2", // C Dm7
  K: "[d2 e2 g2@2 ~@2 g1@3 ~ a#3 b3@3 [f3,a3,c4,d4]@8 ~@10, ~@10 [g3,e4]@3 ~@19]/2", L: "~@4 d2 e2 g2@2 ~@4 d2 e2 g2@2",
  M: "[~@4 d2 e2 g2@3 ~ g1@2 ~@2 a#3 b3@3 ~@2 d2 e2 g2@3 ~@3 d2 e2 g2@2, ~@14 [g3,e4]@4 [f3,a3,c4,d4]@9 ~@5]/2", // C Dm7
  N: "~@4 d2 e2 g2@3 ~@3 [c4,e4]!4", O: "c4@2 [c4,e4]!5 ~ [c4,e4]@3 ~ [c4,e4]!4, e4 ~@15",
  P: "[c4,e4]@2 [c4,e4]!5 ~ [c4,e4]@3 ~@5", Q: "~@6 [a4,c5,e5] ~", R: "~@12 [d4,g4,b4,d5]@3 ~",
  S: "~@8 [d4,g4,b4,d5]@3 ~@5", T: "[~@2 [d4,g4,b4,d5] ~@3 [f2,e3,a3,c4,e4]@16 ~@2]/3",
})).s("gm_piano").gain(0.35)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@5 A@4 B@2 C@2 A@4 B@2 D@2 A@4 B@2 D@2 A@4 E F@2 G H I J K J K J K J K J K J K J K J L M N O L P N O L P N O L M N O
  L M N O L M N O L P N O Q G H R S T ~ U ~ V W X@3
>`.pickRestart({
  A: "[f2@31 ~]/2", B: "[e2@31 ~]/2", C: "[e1@14 d2 e2]/2", D: "[e1@14 d1 e1]/2", E: "e2@15 ~",
  F: "[e1@18 ~@2 d2 e2 g2@2 ~@4 d2 e2 g2@2]/2", G: "~@4 d2 e2 g2@2 ~@2 g1@3 ~@3", H: "~@4 d2 e2 g2@2 ~@4 d2 e2 g2@2",
  I: "~@4 d2 e2 g2@2 ~@2 g1@2 ~@4", J: "d2 e2 g2@2 ~@4 d2 e2 g2@3 ~@3", K: "d2 e2 g2@2 ~@2 g1@3 ~@7",
  L: "f1 a1 c2 f1@2 a1@2 c2", M: "f1@2 a1@2 c2@2 f1@4 a1@3 ~ f1@2", N: "e1 ~ g1 ~ b1@2 e1@4 g1@3 ~ b1@2",
  O: "e1@2 g1@2 b1@2 e1@3 ~ g1@4 b1@2", P: "f1 a1 c2 f1@2 a1@2 f1", Q: "g2 d2 g1@2 d2 e2 g2@2 ~@4 d2 e2 g2@2",
  R: "~@4 d2 e2 g2@2 ~@4 f1!4", S: "f1@2 f1!5 ~ f1@3 ~ f1!4", T: "f1 ~ f1!5 ~ f1@3 ~@5", U: "~@2 d2 f1",
  V: "~@12 e1@3 ~", W: "~@8 e1@3 ~@5", X: "[~@4 e1@3 ~@5 f1@31 ~@5]/3",
})).s("gm_fretless_bass").gain(0.38)

// chords · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~@13 A@4 B@4 A@4 B@4 A@4 C@3 ~ D@2 ~@15 E@2 F@2 G@2 F@2 E@2 F@2 G@2 F@2 G@2 H@2 G@2 F@2 E@2 I@2 ~@14
>`.pickRestart({
  A: "[[c5,e5,a5]@63 ~]/4", B: "[[b4,d5,g5]@63 ~]/4", C: "[[b4,d5,g5]@35 ~@13]/3", D: "[~@4 g2@27 ~]/2",
  E: "[[a4,c5,e5]@31 ~]/2", F: "[[g4,b4,e5]@31 ~]/2", G: "[a4,c5,e5]/2", H: "[~ [g4,b4]@31, e5@31 ~]/2",
  I: "[g4,b4,e5]/2", // Em
})).s("gm_drawbar_organ").gain(0.09).pan(0.3)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note("<~@56 A ~@7 A ~@7 A ~@7 B C ~@14>".pickRestart({
  A: "~@8 [e4,g4,b4,e5]@3 ~@5", B: "~@3 d5", C: "e4 ~@3",
})).s("gm_epiano1").gain(0.4).pan(0.4)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@25 A@2 B@2 C@2 D@2 ~@2 E@3 ~@7 F G F G F G F H ~ I@2 J@2 K@2 L@2 M@2 N@2 M@2 O@2 I@2 J@2 K@2 L@2 M@2 P@2 ~@7 Q ~@3
  R@3
>`.pickRestart({
  A: "[[a4,a5]@2 [e5,e6]@2 ~@2 [e5,e6]@17 ~ [e5,e6]@3 [d5,d6]@3 [c5,c6]@2]/2", B: "[[d5,d6]@31 ~]/2",
  C: "[[e4,e5]@2 [b4,b5]@2 ~@2 [b4,b5]@16 [c5,c6]@2 [b4,b5]@3 [a4,a5]@3 [g4,g5]@2]/2", D: "[[a4,a5]@31 ~]/2",
  E: "[[d5,e5] [f#5,g5] [a5,b5] [c6,c#6] [d5,d6]@32 ~@12]/3", F: "g5!6 f5 g5!5 f5 g5!3",
  G: "g5!2 f5 g5!5 a#5 ~ a#5 ~ g5@3 ~", H: "g5!2 f5 g5!3 ~@10", I: "[g5@18 f5@3 e5@3 d5@3 c5@2 d5@2 ~]/2",
  J: "[e5@15 ~]/2", K: "[g5@18 f5@3 e5@2 ~ d5@6 c5 d5]/2", L: "[b5@30 a4 [b4,c5,d5,e5]]/2",
  M: "[g5@18 f5@3 e5@3 d5@3 c5@3 d5@2, f5 ~@31]/2", N: "[e5@7 g5 e5@22 a4 [b4,c5,d5,e5]]/2", O: "[b5@15 ~]/2",
  P: "[e5@7 g5 e5@22 ~@2]/2", Q: "~@12 [c5,e5,a5] ~@3", R: "[~@3 [a3,e4,a4,e5]@8 ~]/3",
})).s("gm_string_ensemble_1").gain(0.24).pan(0.4)

// chords · trombone
const trombone = note(`<
  ~@37 A@2 B ~@2 C D E ~ C D E F G H I@2 ~@3 J K L M@2 ~@4 N O P Q ~@3 R K L S@2 ~@7 T U V ~ W ~ X Y Z@3
>`.pickRestart({
  A: "[~@4 g3@25 ~ d4 f4]/2", B: "g4@3 ~@5, f#4 ~@15", C: "~@14 g4 ~", D: "a4!2 ~@2 g4!2 ~@2 f4!2 ~@2 g4!2 ~@2",
  E: "a4 ~ b4@4 f4@4 ~@6", F: "~@12 d3 ~ e3 ~", G: "f3@3 ~ e3 ~ d3@3 ~ e3 ~ f3@3 ~",
  H: "e3 ~ d3@3 ~ e3 ~ f3!2 e3 ~ d3@2 ~@2", I: "[~@6 g3@25 ~]/2", J: "~@5 [g4,b4] ~ [a4,c5]",
  K: "~ f3 g3 a3 ~ a#3 ~ c4", L: "~@2 a#3@2 ~@2 a3@2 ~@2 g3@2 ~@2 f3 ~",
  M: "[g3@2 ~@2 g3@3 ~ g3 ~ a3@4 e3@7 ~@5 [g4,b4]@2 ~@2 [a4,c5]@2]/2", // G Am
  N: "[a3,c4]@3 ~ [g3,a#3] ~ [f3,a3] ~ [a3,c4]@2 ~@4 [f3,a3] [g3,a#3]", // Am Gm F Am F Gm
  O: "[a3,c4] ~ [a3,c4] ~ [g3,a#3] [f3,a3] ~ [a3,c4]@4 ~ [f3,a3]@2 ~@2", // Am Gm F Am F
  P: "[g3,b3]@5 ~ [e3,g3]@2 ~@2 [d3,e3] ~ [g3,b3]@4", Q: "~@2 [e3,g3] ~@3 [d3,e3] ~ [e3,g3]@4 ~@4",
  R: "~@5 [d4,g4] ~ [c4,a4]", S: "[g3@2 ~@2 g3@3 ~ g3 ~ a3@4 e3@7 ~@5 b4@2 ~@2 [a4,c5]@2, ~@26 g4 ~@5]/2",
  T: "~@12 [e4,a4]!4", U: "[e4,a4] ~ [e4,a4]!5 ~ [e4,a4]@2 ~@2 [e4,a4]!4",
  V: "[e4,a4] ~ [e4,a4]!2 e4 [e4,a4]!2 ~ [e4,a4]@2 ~@6", W: "~@6 [e4,a4] ~", X: "~@6 [b3,d4] ~", Y: "~@4 [b3,d4] ~@3",
  Z: "[~@2 [b3,d4] ~@3 c4@16 ~@2]/3", // Bm
})).s("gm_trombone").gain(0.28).pan(0.7)

// chords · trombone
const trombone_2 = note(`<
  ~@21 A ~ B ~ C ~ D ~@9 E@2 F G H I H J H I H J K L M@2 ~@4 N ~@3 N ~@3 O ~@3 P ~@3 Q ~@3 R ~@7 S T U ~ V ~ W X Y@3
>`.pickRestart({
  A: "e4@2 ~@6 d4 ~ c4 ~@3 a3@2", B: "e4 ~@7 d4 ~ c4 ~@3 a3 ~", C: "d4 ~@7 b3 ~ a3 ~@3 g3 ~",
  D: "d4@2 ~@6 b3 ~ a3 ~@3 g3 ~", E: "[~@4 g2@25 ~ b3 c4]/2", F: "d4@3 ~@5, c#4 ~@15", G: "~@14 g4 ~",
  H: "f4!2 ~@2 e4!2 ~@2 d4!2 ~@2 e4!2 ~@2", I: "f4 ~ g4@3 ~ d4@4 ~@4 g4 ~", J: "f4 ~ g4@3 ~ d4@4 ~@6",
  K: "~@12 d3 ~ e3 ~", L: "f3@3 ~ e3 ~ d3@4 e3 ~ f3@3 ~", M: "[e3 ~ d3@3 ~ e3 ~ f3!2 e3 ~ d3@6 ~@2 [g3,g4]@3 ~@9]/2",
  N: "~@5 [b3,d4] ~ [c4,e4]", O: "~@5 [g4,b4,e5] ~ [f4,a4,e5]", P: "~@5 [g4,b4,e5] ~ [a4,c5,e5]",
  Q: "~@5 [b4,e5] ~ [c5,e5]", R: "~@10 [d4,b4] ~@3 [e4,c5]@2", S: "~@12 [f2,a3,c4]!4",
  T: "[f2,a3,c4] ~ [f2,a3,c4]!5 ~ [a3,c4]@2 ~@2 [f2,a3,c4]!4, ~@8 f2 ~@7", // F Am F
  U: "[f2,a3,c4] ~ [f2,a3,c4]!5 ~ [f2,a3,c4]@2 ~@6", V: "~@12 [f2,c4]@3 ~", W: "~@6 [e2,g3] ~", X: "~@4 [e2,g3] ~@3",
  Y: "[~@2 [e2,g3] ~@3 [f2,e3]@16 ~@2]/3", // Em Fmaj7
})).s("gm_trombone").gain(0.32)

// other · oboe
const oboe = note(`<
  ~@2 A B C D E D F D E D G D E D H I J K H L M N H O P Q H K R S T K U V W X Y Q Z AA AB AC AD AE AF AG AH AI AJ AK AL
  S AM AN AA AO AP AQ AR AS AT D G AU AV AW AX AY AZ D BA BB H@2 BC BD BE@2 H@2 A B F BF ~ BG BH G BI BJ BK BL ~@2
>`.pickRestart({
  A: "~@4 g2 g3!3 g2 g3!5 g2 g3", B: "g3!5 g2 g3!2 g2 g3!5 g2 g3", C: "g3 f2 g3!2 g2 g3!3 g2 g3!3 g2!2 g3!2",
  D: "g2 g3!3 g2 g3!5 g2 g3!5", E: "g3 g2 g3!2 g2 g3!5 g2 g3!2 f2 g3!2", F: "g3!8 g2 g3!7", G: "g3!6 g2 g3!9",
  H: "g3!16", I: "g2 g3!3 g2!4 g3 g2 g3!6", J: "g3 g2 g3!2 g2 g3!4 g2!2 g3!2 f2 g3!2", K: "g2 g3!3 g2 g3!9 g2 g3",
  L: "g2 g3!3 g2 g3!2 g2 g3!8", M: "g3!4 g2 g3!5 g2 g3!2 f2 g3!2", N: "g3!10 f3 g3!5",
  O: "g2 g3!3 g2 g3!2 g2 g3!2 g2!2 g3!2 f2 g3", P: "g3!4 g2 g3!5 g2!2 g3!2 f2 g3",
  Q: "g2 g3!3 g2 g3!2 g2 g3!2 g2 g3!3 g2 g3", R: "g3 g2 g3!2 g2 g3!9 f2 g3", S: "g2 g3!3 g2 g3!5 g2 g3!3 g2 g3",
  T: "g2!2 g3!4 g2!5 g3!3 g2 g3", U: "g3 g2 g3!2 g2 g3!2 g2 g3!2 g2 g3!3 g2 g3", V: "g3!8 g2 g3!3 g2 g3!2 g2",
  W: "g3!2 g2 g3!7 g2 g3!2 g2 g3 g2", X: "g3!2 g2 g3!13", Y: "g3!2 g2 g3!7 g2 g3!2 g2 g3!2",
  Z: "g3 g2 g3 g2 g3!5 g2 g3 g2 g3!2 g2 g3", AA: "g3!4 g2 g3!2 g2 g3!2 g2 g3!3 g2 g3", AB: "g3!9 g2 g3 g2 g3!2 g2 g3",
  AC: "g3 g2 g3!2 g2 g3!5 g2 g3!3 g2 g3", AD: "g3!5 g2 g3!4 g2 g3!2 g2 g3!2", AE: "g2 g3!3 g2 g3!2 g2 g3!6 g2 g3",
  AF: "g3!9 g2 g3!6", AG: "g3!4 g2 g3!5 g2 g3!5", AH: "g3 g2 g3 g2 g3 g2 g3!3 g2 g3 g2 g3!2 g2 g3",
  AI: "g3!4 g2 g3!5 g2 g3!3 g2 g3", AJ: "g3!4 g2 g3!2 g2 g3!6 g2 g3", AK: "g3 g2 g3!2 g2 g3!4 g2 g3!4 g2 g3",
  AL: "g3!6 g2 g3!3 g2 g3!5", AM: "g3!14 g2 g3", AN: "g3 g2 g3!4 g2 g3!2 g2 g3!4 g2 g3",
  AO: "g3 g2 g3 g2!2 g3!8 g2 g3!2", AP: "g2 g3!6 g2 g3!6 g2 g3", AQ: "g3 g2 g3!4 g2 g3!9",
  AR: "g2 g3!5 g2 g3 g2 g3!5 g2 g3", AS: "g2 g3!5 g2 g3!2 g2 g3!6", AT: "g3 g2 g3!2 [g2,g3] g3!5 g2 g3!5",
  AU: "g3!6 g2 g3!3 g2 g3!3 g2 g3", AV: "g3!10 g2 g3!3 g2 g3", AW: "g3 g2 g3!2 g2 g3!5 g2 g3!5", AX: "g3!10 g2 g3!5",
  AY: "g3!9 g2!2 g3!3 g2 g3", AZ: "g3 g2 g3!8 g2 g3!3 g2 g3", BA: "g3 g2 g3!2 g2 g3!2 g2 g3!2 g2 g3!2 g2 g3!2",
  BB: "g3 g2 g3!4 g2 g3!2 g2 g3!6", BC: "g2 g3!3 g2 g3!2 g2 g3!2 g2 g3!5", BD: "g3 g2 g3 g2 g3!3 g2 g3 g2 g3 g2 g3!4",
  BE: "g3!9 g2 g3!4 g2 g3", BF: "g3!2 g2 g3!2 g2 g3!2 g2 g3!3 ~@4", BG: "~@12 g2 g3!3",
  BH: "g2 g3!5 g2 g3!4 g2 g3!2 g2 g3", BI: "g2 g3!5 g2 g3!6 g2 g3!2", BJ: "g2 g3!5 g2 g3!2 f2 g3!6",
  BK: "g2 g3!5 g2 g3!9", BL: "g3!12 ~@4",
})).s("gm_oboe").gain(0.07).pan(0.7)

// other · flute
const flute = note(`<
  ~@13 A ~@7 B@4 ~@4 C@2 D@2 E@2 F@3 G H ~@5 I J I J I J I K ~ L@2 M@2 N@2 O@2 P@2 Q@2 R@2 S@2 L@2 M@2 N@2 O@2 P@2 T@2
  ~@3 U V W ~ X ~ Y Z AA ~@2
>`.pickRestart({
  A: "b4 d5 b4 a4@5", B: "[~@2 b4@3 ~ b4@20 a4@2 g4@2 a4@33 ~]/4", C: "[e4@2 b4@3 ~ b4@15 ~ c5@2 b4@3 a4@3 g4@2]/2",
  D: "a4/2", E: "[~ e4 ~ e4@12 ~]/2", F: "[[d5,e5] [f#5,g5] [a5,b5] [c6,c#6] d6@30 ~@14]/3", G: "~@14 b4 c5",
  H: "d5@3 ~@5, c#5 ~@15", I: "g5!6 f5 g5!5 f5 g5!3", J: "g5!2 f5 g5!5 a#5 ~ a#5 ~ g5@3 ~", K: "g5!2 f5 g5!3 ~@10",
  L: "[g5@18 f5@3 e5@3 d5@3 c5@3 d5@2]/2", M: "[e5@31 ~]/2", N: "[g5@18 f5@3 e5@3 d5@6 c5 d5]/2",
  O: "[b5@29 ~ a4 [b4,c5,d5,e5]]/2", P: "[g5@18 f5@3 e5@3 d5@3 c5@2 d5@2 ~, f5 ~@31]/2",
  Q: "[e5@7 g5 e5@22 a4 [b4,c5,d5]]/2", R: "[[e5,f5] ~@6 a5 g5@10 f5@3 ~ e5@2 d5@3 c5@3 d5@2, g5@7 ~@25]/2",
  S: "[e5@7 ~]/2", T: "[e5@7 g5 e5@22 ~@2]/2", U: "~@12 e6!4", V: "e6 ~ e6!5 ~ e6@2 ~@2 e6!4",
  W: "e6 ~ e6!5 ~ e6@3 ~@5", X: "~@6 e6 ~", Y: "~@6 [b5,d6] ~", Z: "~@4 [b5,d6] ~@3", AA: "~@2 [b5,d6] ~@5",
})).s("gm_flute").gain(0.24).pan(0.7)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@35 A B A B C D C D C D C D C D C D C D C ~@28 A B A E F G ~@8>".pickRestart({
  A: "~@4 g3 a3 b3 ~@5 g3 a3 b3@2", B: "~@4 g3 a3 b3@2 ~@2 d3 ~@5", C: "g3 a3 b3 ~@5 g3 a3 b3@2 ~@4",
  D: "g3 a3 b3@2 ~@2 d3 ~@9", E: "~@4 g3 a3 b3@2 ~@4 c4!4", F: "c4 ~ c4!5 ~ c4@3 ~ c4!4", G: "c4 ~ c4!4 c4@2 c4@2 ~@6",
})).s("gm_electric_guitar_muted").gain(0.35).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  ~@35 A B C B D E D E D E D E D E D E D E F G@14 H@10 I@4 A B C J K@2 A L ~ M N O ~@2
>`.pickRestart({
  A: "~@6 x!2", B: "~@2 x!2 ~ x ~@2", C: "~@2 x!2 ~@2 x!2", D: "x!2 ~@2 x!2 ~@2", E: "x!2 ~ x ~@4",
  F: "x!2 ~@2 x ~ x ~", G: "x ~ x ~ x!3 ~", H: "x!3 ~ x ~ x ~", I: "x!3 ~ x!3 ~", J: "~ x!3", K: "x!4",
  L: "~ x ~ x!2 ~ x ~", M: "~@3 x", N: "~ x", O: "~ x ~ x",
})).gain(0.44)

// drums · snare
const snare = s("sd").struct("<~@35 A ~@17 B C@7 D C@3 D E C@15 F ~@2 G H I ~@8>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~@10 x ~@2 x!2 ~", C: "x!4", D: "x ~@3 x ~@3 x ~@3 x ~ x!2", E: "~@2 x!2 ~@4 x ~@3 x ~@3",
  F: "x ~ x ~ x!3 ~@9", G: "~@12 x!4", H: "x ~ x!5 ~ x ~@3 x!4", I: "x ~ x!5 ~ x ~@7",
})).gain(0.44)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A@4 ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B@3 C D C E A F A F A F A F A F A F A F G ~@28 F D C E ~@2
  H@6 ~@2
>`.pickRestart({
  A: "~@7 x ~@3 x ~@3 x", B: "~@7 x ~@3 x ~@4", C: "~@3 x ~@7 x ~@3 x", D: "~@3 x ~@11 x", E: "~@3 x ~@12",
  F: "~@11 x ~@3 x", G: "~@7 x ~@8", H: "~@3 x ~@3 x ~@3 x ~@4",
})).gain(0.11)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ B ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C@2 ~@2 D ~ D ~ E ~ E ~ E ~ E ~ E ~ E ~ E ~ D@28 ~ D
  ~@3 D ~@4 F ~@3
>`.pickRestart({
  A: "~ x ~@6", B: "~ x ~ x ~ x ~ x", C: "~@7 x", D: "~@5 x ~@2", E: "~@3 x ~@4", F: "~@15 x",
})).gain(0.38)

// drums · crash
const crash = s("cr").struct("<~@39 x ~@53 [~@3 x] ~@2>").gain(0.33)

// drums · tambourine
const tambourine = s("tb").struct("<~@38 A B A B A B A B A B A B A B A C@28 ~ D E F G ~@10>".pickRestart({
// … 20 more lines

More by Isaac Hayes