Strudelify

If I Can't Have You

Dinah Washington

KeyC majorTempo116 bpm
0:00/0:00
// If I Can't Have You — Washington Dinah
// 116 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 3/4 at bar 16, 4/4 at bar 18, 2/4 at bar 46, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(116/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 · synth bass 2
const bass = note(`<
  ~@4 A B C D E B C D E F@5 G H I H J I H I H K L M N O P Q R S T Q R S U V W X@3 Y@2 Z AA Z AA Z AB AC AD AC AD AC AE
  AF AG AH AI AF AG AH AI AJ@8 ~@3 AK B C D E AF AG AH AI AF AG AH AI AF AG AH AI AF AG AH AI AL@5
>`.pickRestart({
  A: "~@7 g1", B: "a1@2 ~@2 a1@3 a1!2 ~ a1@2 a1@2 c2@2", C: "g1@2 ~@2 g1@2 ~ g1!2 ~ a1@2 c2@2 g1@2",
  D: "e1@2 ~@2 e1@3 e1!2 ~ e1@2 g1@2 e1@2", E: "f1@2 ~@2 f1@3 f1!2 ~ f1@2 f1@2 g1@2",
  F: "[d2@6 c2@6 g1@12 a1@6 a#1@6 f1@29 ~@3 c2@2 ~@2 c2@3 c2!2 ~ c2@2]/5", G: "c2@2 g1@2 c2@2 ~@2 c2@3 c2!2 ~ g1@2",
  H: "f1@2 g1@2 c2 ~@3 c2@3 c2!2 ~ c2@2", I: "c2@2 g1@2 c2 ~@3 c2@3 c2!2 ~ g1@2",
  J: "c2@2 g1@2 c2 ~@3 c2@3 c2!2 ~ c2@2", K: "c2@2 g1@2 g1@2 ~@2 g1@2 ~ g1!2 ~ g1 ~",
  L: "g1@2 g1@2 f1 ~@3 f1@3 f1!2 ~ f1@2", M: "f1@2 f1@2 d1 ~@3 d1@3 d1!2 ~ d1@2",
  N: "d1@2 g1@2 f1 ~@3 f1@3 f1!2 ~ f1@2", O: "f1@2 f1@2 d1 ~@3 d1@3 d1 g1 ~ g1@2",
  P: "g1@2 g1@2 a1 ~@3 a1@3 a1!2 ~ a1@2", Q: "a1@2 c2@2 g1 ~@3 g1@3 g1!2 ~ a1@2",
  R: "c2@2 g1@2 e1 ~@3 e1@3 e1!2 ~ e1@2", S: "g1@2 e1@2 f1 ~@3 f1@3 f1!2 ~ f1@2",
  T: "f1@2 g1@2 a1 ~@3 a1@3 a1!2 ~ a1@2", U: "f1@2 g1@2 a#1 ~@3 a#1@3 a#1!2 ~ a#1 ~",
  V: "a#1@2 d2@2 a#1 ~@3 a#1@3 a#1!2 ~ a#1@2", W: "d2@2 a#1 ~ a1 ~@3 a1@3 a1!2 ~ a1 ~",
  X: "[a1@2 c2@2 d2 ~@3 d2@2 a1 c2 d2@6 c2@6 g1@12 a1@6 a#1@6]/3", Y: "[f1@29 ~@3]/2",
  Z: "c2 ~@3 c2@3 c2!2 ~ c2@2 c2@2 g1@2", AA: "c2 ~@3 c2@3 c2!2 ~ g1@2 f1@2 g1@2",
  AB: "g1@2 ~@2 g1@2 ~ g1!2 ~ g1 ~ g1@2 g1@2", AC: "f1 ~@3 f1@3 f1!2 ~ f1@2 f1@2 f1@2",
  AD: "d1 ~@3 d1@3 d1!2 ~ d1@2 d1@2 g1@2", AE: "d1 ~@3 d1@3 d1 g1 ~ g1@2 g1@2 g1@2",
  AF: "a1 ~@3 a1@3 a1!2 ~ a1@2 a1@2 c2@2", AG: "g1 ~@3 g1@3 g1!2 ~ a1@2 c2@2 g1@2",
  AH: "e1 ~@3 e1@3 e1!2 ~ e1@2 g1@2 e1@2", AI: "f1 ~@3 f1@3 f1!2 ~ f1@2 f1@2 g1@2",
  AJ: "a1 ~ c2@2 a1 ~@2 a1!2 ~ a1 ~ a1 a#1@3", AK: "~@11 f1@3 g1@2",
  AL: "[d2@6 c2@6 g1@12 a1@6 a#1@6 c2@29 ~@3 c2@2 ~@10]/5",
})).s("gm_synth_bass_2").gain(0.4)

// chords · piano
const piano = note(`<
  A B C D E B C D E B C D E ~@4 F@6 G H I J K L ~@3 M N O P Q N O P R S T U ~@3 V W X Y Z AA AB ~@5 AC AD AE AF AG AD AE
  AF AG AH@7 AI B AJ D E B C D E AD AE AF AG AD AE AF AG AD AE AF AG AD AE AF AG ~@5
>`.pickRestart({
  A: "~@12 [e6,f6,g6,a6] [g5,a5,b5,c6,d6] [b4,c5,d5,e5,f5] [e4,f4,g4,a4]", // Fmaj7 G Bdim Fmaj7
  B: "[a2,a3,c4,e4] ~@3 [a2,a3,c4,e4] ~@2 [a3,c4,e4]!2 ~ [a3,c4,e4] ~ a2 [a3,c4,e4] a2 ~, ~@7 a2@3 ~@6", // Am
  C: "[g2,g3,b3,d4] ~@5 [g3,b3,d4]!2 [g3,b3,d4]@2 ~ [g3,b3,e4]@2 ~ [g2,g3,b3,d4]@2, ~@11 g2 ~@4", // G Em G
  D: "[e2,e3,g3,b3] ~@3 [e2,e3,g3,b3] ~@2 [e3,g3,b3]!2 ~ [e2,e3,g3,b3] ~ [e3,g3,b3,e4] [e3,g3,b3,g4] [e3,g3,b3]@2, ~@7 e2@3 ~@4 e2 ~", // Em
  E: "[f3,a3,c4]@3 ~ [f3,a3,c4]@2 [f3,a3,c4,e4]!2 c4@3 ~@3 g3@2, f2 ~ [f3,a3,e4]@2, ~@11 c4@5", // F Fmaj7
  F: "[~@4 [g3,c4,e4]@15 ~ [g#3,c4,f4]@15 ~ [g3,c4,e4]@15 ~ [g3,b3,d4]@15 ~ [f3,a3,c4]@15 ~ [g3,c4,e4] ~@3 [g3,c4,e4] ~@2 [g3,c4,e4]!2 ~ [g3,c4,e4] ~]/6", // C Fm C G F C
  G: "~ [g3,c4,e4] ~@2 [g#3,c4,f4] ~@3 [g#3,c4,f4] ~@2 [g#3,c4,f4]!2 ~ [g#3,c4,f4] ~", // C Fm
  H: "~ [g#3,c4,f4] ~@2 [g3,c4,e4] ~@3 [g3,c4,e4] ~@2 [g3,c4,e4]!2 ~ [g3,c4,e4] ~", // Fm C
  I: "~ [g3,c4,e4] ~@2 [g3,b3,d4] ~@3 [g3,b3,d4] ~@2 [g3,b3,d4]!2 ~ [g3,b3,d4] ~", // C G
  J: "~ [g3,b3,d4] ~@2 [f3,a3,c4] ~@3 [f3,a3,c4] ~@2 [f3,a3,c4]!2 ~ [f3,a3,c4] ~", // G F
  K: "~ [f3,a3,c4] ~@2 [g3,b3,d4] ~@3 [g3,b3,d4] ~@2 [g3,b3,d4]!2 ~ [g3,b3,d4] ~", L: "~ [g3,b3,d4] ~@14",
  M: "[b6,c7,d7,e7] [d6,e6,f#6,g6,a6] [f#5,g5,a5,b5,c6] [b4,c5,d5,e5] [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4]!3 ~ [a3,c4,e4] ~", // Cmaj7 D F#dim Cmaj7 Am
  N: "[a3,c4,e4] ~ [a3,c4,g4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4]!3 ~ [g3,b3,d4]@2", // Am Am7 G
  O: "[g3,b3,e4]@2 [g3,b3,d4]@2 [e2,e3,g3,b3,e4] ~ [e3,g3,b3,e4] ~ [e2,e3,g3,b3,e4] ~ [e3,g3,b3,e4]!2 [e2,e3,g3,b3,e4] ~ [e2,e3,g3,b3,e4] ~", // Em G Em
  P: "[e2,e3,g3,b3,g4] ~ [e3,g3,b3,e4]@2 [f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4]@2 [f3,a3,c4]!3 ~ [f3,a3,c4]@2, ~@2 e2 ~ f2@5 ~@7", // Em F
  Q: "[f3,a3,c4]@2 [g3,b3,d4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4]!3 ~ [a3,c4,e4] ~", // F G Am
  R: "[f3,a3,c4]@2 [g3,b3,d4] ~@3 [f3,a3,a#3,d4]@2 ~ [f3,a3,d4] ~ [f3,a3,a#3,d4]!2 ~ [f3,a3,a#3,d4]@2, ~@9 a#3@2 ~@5", // F G A#maj7 Dm A#maj7
  S: "~@2 [f3,a3,a#3,d4]@2 [f3,a3,a#3,d4]@2 ~@2 [f3,a3,a#3,d4] ~@2 [f3,a3,a#3,d4]!2 ~ [f3,a3,a#3,d4]@2", // A#maj7
  T: "~@2 [a3,a#3]@2 ~@2 [f3,a3,c4,e4]@2 ~ [f3,a3,e4] ~ [f3,a3,c4,e4]!2 ~ [f3,a3,c4,e4]@2, ~@2 [f3,d4] ~@6 c4@2 ~@5", // A#maj7 Fmaj7 Dm
  U: "~ [f3,a3,c4,d4]@2 ~@5", V: "~@12 [g6,a6,b6] [a5,b5,c6,d6,e6,f6] [b4,c5,d5,e5,f5,g5] [c4,d4,e4,f4,g4,a4]",
  W: "[e3,f3,g3,a3,b3] ~@15, [c4,e4]@15 ~", X: "[g#3,c4,f4]@15 ~", Y: "[g3,c4,e4]@15 ~", Z: "[g3,b3,d4]@15 ~",
  AA: "[f3,a3,c4]@15 ~", AB: "[g3,b3,d4] ~@3 [g3,b3,d4] ~@2 [g3,b3,d4]!2 ~ [g3,b3,d4] ~@2 [g3,b3,d4] ~@2",
  AC: "~@12 [b6,c7,d7,e7] [d6,e6,f#6,g6,a6] [f#5,g5,a5,b5,c6] [b4,c5,d5,e5]", // Cmaj7 D F#dim Cmaj7
  AD: "[a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4]!3 ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,g4] ~", // Am Am7
  AE: "[g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4]!3 ~ [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2", // G Em G
  AF: "[e2,e3,g3,b3,e4] ~ [e3,g3,b3,e4] ~ [e2,e3,g3,b3,e4] ~ [e3,g3,b3,e4]!2 [e2,e3,g3,b3,e4] ~ [e2,e3,g3,b3,e4] ~ [e2,e3,g3,b3,g4] ~ [e3,g3,b3,e4]@2, ~@14 e2 ~", // Em
  AG: "[f3,a3,c4] ~ [f3,a3,c4] ~ [f3,a3,c4]@2 [f3,a3,c4]!3 ~ [f3,a3,c4]@2 [f3,a3,c4]@2 [g3,b3,d4] ~, f2@5 ~@11", // F G
  AH: "[a3,c4,e4] ~@3 [a3,c4,e4] ~@2 [a3,c4,e4]!2 ~ [a3,c4,e4]@2 ~ [a#3,d4,f4]@2 ~", // Am A#
  AI: "[a3,c4,e4] ~@3 [a3,c4,e4] ~@2 [a3,c4,e4]!2 ~ [a3,c4,e4]@2 ~@4", // Am
  AJ: "[g2,g3,b3,d4] ~@5 [g3,b3,d4]!2 [g3,b3,d4]@2 ~ [g3,b3,e4]@2 ~ [g3,b3,d4]@2, ~@11 g2 ~@2 g2 ~", // G Em G
})).s("gm_piano").gain(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A B C B D E F G H E F G H I@2 J@3 ~@5 K@5 L@2 M@4 N@2 O@2 N@2 P@3 Q@3 R@2 S T@2 U V W X@4 Y@2 Z AA AB AC Z AA AB AD
  ~@7 AE B C B D E F G H Z AA AB AC Z AA AB AD Z AA AB AC AF AA AB AD I@2 AG@3
>`.pickRestart({
  A: "[a4,a5]@4 [g4,g5]@4 [a4,a5]@4 a#5 b5@3, ~@3 b4", B: "[e5,e6] ~@3 [e5,e6] ~@2 [e5,e6]@2 ~@2 [g5,g6]@2 [e5,e6]@2 ~",
  C: "[d5,d6]@8 [g4,g5] [a4,a5] [b4,b5] ~ [b4,b5]@2 [d5,d6] ~, [d#5,d#6] ~@15", // D G A B D D#
  D: "[a5,a6]@8 [g5,g6] [g#5,a5,g#6,a6] [a5,a6] ~ [a5,a6]@2 ~@2, [g#5,g#6] ~@15", // A G Amaj7 A G#
  E: "e5@2 ~@2 e5 ~@2 e5!2 ~ a5@2 ~@2 e5 ~", F: "d5@13 ~@3", G: "e5 ~@3 e5 ~@2 e5!2 ~ g5@2 ~@2 e5 ~", H: "a5@3 ~",
  I: "[[f5,f6]@6 [e5,e6]@6 [d5,d6]@9 ~ [c5,c6] [d5,d6] [e5,e6]@2 [d5,d6]@2 [c5,c6]@2 [f5,f6]@2]/2", // F E D C D E D C …
  J: "[[e5,e6] [d5,d6] [c5,c6]@15 ~@7]/3", K: "[~ f6@4 g6@8 f6@4 g6@3]/5",
  L: "[g6 f6 e6 d6 c6@2 f6@2 e6@2 f6@2 e6@2 f6@4 d6@8 e6 d6 c6@4]/2",
  M: "[c6 d6 e6 f6 g6@2 f6@2 e6@2 f6@2 e6@2 f6@4 d6@8 e6 d6 c6@8 e5@2 ~@2 e5 ~@3 e5@2 ~ a5@2 e5@2 ~ d5@8 b4@2 c5@2]/4",
  N: "[b4@2 d5@2 e5@2 ~@2 e5 ~@3 e5@2 ~ g5@3 e5@2 a5@8 g5 a5!2 ~]/2",
  O: "[a5@2 ~@2 e5@2 ~@2 e5 ~@3 e5@2 ~ a5@2 e5@2 ~ d5@8 b4@2 c5@2]/2",
  P: "[a5@4 [g5,g6]@6 [f5,f6] [e5,e6] [f5,f6]@8 [e5,e6]@3 [f5,f6]@3 [g5,g6]@2 [a5,a6]@3 [g5,g6]@2 [f5,f6]@3 [e5,e6]@6 [c5,c6] [a4,a5] [c5,c6]@4]/3", // G F E F E F G A …
  Q: "[[g5,g6]@2 [f5,f6]@16 [e5,e6]@6 [d5,d6]@10 [c5,c6] [d5,d6] [e5,e6]@2 [d5,d6]@2 [c5,c6]@2 [f5,f6]@2 [e5,e6]@2 [d5,d6]@2]/3", // G F E D C D E D …
  R: "[[c5,c6]@15 ~]/2", S: "~@6 [c6,e6] [d6,f6] [e6,g6]@5 ~@3", T: "[[f6,g#6]@9 ~@7]/2", U: "g6@15 ~", V: "f6",
  W: "g6@12 g6 f6 e6 d6", X: "[c6@2 f6@2 e6@2 f6@2 e6@2 f6@4 d6@8 e6 d6 c6@4 c6 d6 e6 f6]/2",
  Y: "[g6@2 f6@2 e6@2 f6@2 e6@2 f6@4 d6@8 e6 f6 g6 ~ g6 ~ g6 ~@3]/2", Z: "e5@2 ~@2 e5@2 ~@2 e5@2 ~ a5@2 e5@2 ~",
  AA: "d5@4 b4 c5 b4 d5", AB: "e5@2 ~@2 e5@2 ~@2 e5@2 ~ g5@3 e5@2", AC: "a5@8 g5 a5!2 ~ a5@2 ~@2",
  AD: "a5@8 g5 a5!3 a5@4", AE: "a5 g5 a5 b5", AF: "e5@2 ~@2 e5@2 ~@2 e5@2 a5@2 ~ e5@2 ~",
  AG: "[[e5,e6] [d5,d6] [e5,c6]@15 ~ [c5,c6] ~@5]/3", // E D C
})).s("gm_string_ensemble_1").gain(0.3)

// other · flute
const flute = note("<~@50 A ~@17 B C D E B F@2 G ~@29>".pickRestart({
  A: "~@4 g5@2 e5 ~ g5@2 e5 ~ g5@2 e5 ~", B: "a4@3 ~ a4 ~@2 a4!2 ~ a4 ~ a4 a#4@2 ~",
  C: "a4@4 a4 ~@2 a4!2 ~ a4 ~ a4 a#4@3", D: "a4@3 ~ a4 ~@2 a4!2 ~ a4 ~ a4 a#4@3", E: "a4@3 ~ a4 ~@2 a4!6 a#4@3",
  F: "a4@4 a4 ~@2 a4!2 ~ a4 ~ a4 a#4@2 ~", G: "a4@4 a4 ~@2 a4!2 ~ a4 ~@5",
})).s("gm_flute").gain(0.25)

// other · french horn
const french_horn = note(`<
  ~@12 A B@4 C ~@3 D E@7 F@4 ~@10 G H@2 I@2 J@2 K L M N M O M O M P ~@39 Q R@2 S@3
>`.pickRestart({
  A: "~@14 a4 b4", B: "[d5@4 c5@2 a4@2 g4@2 e4@2 d4@10 c4 d4 e4@6 f4@6 a4@19 ~ a4 ~ a4 ~ a4 ~ a4 ~, c5 ~@63]/4",
  C: "a4 ~@15", D: "~@2 g3 c4", E: "[e4@4 g4@31 ~ e4@16 d4@16 c4@16 d4@16 ~@12]/7",
  F: "[~@11 e4 g4@23 ~ a3@8 g3@8 ~@12, ~@12 f4 ~@51]/4", G: "~@6 a4 b4 d5@8, ~@8 c5 ~@7",
  H: "[c5@2 a4@2 g4@2 e4@2 d4@10 c4 d4 e4@6 f4@6]/2", I: "[a4@19 ~ a4 ~ a4 ~ a4 ~ a4 ~ a4 ~@3]/2", J: "[g4@31 ~]/2",
  K: "e4", L: "d4", M: "c4", N: "~@7 [e4,f4] g4@2 f4@2 e4@2 d4@2", O: "a3@6 ~ [e4,f4] g4@2 f4@2 e4@2 d4@2", P: "a3 g3",
  Q: "~@14 a4 [b4,c5]", R: "[d5@4 c5@2 a4@2 g4@2 e4@2 d4@10 c4 d4 e4@2 d4@2 c4@2 f4@2]/2",
  S: "[e4@2 d4@2 a4@8 ~@12 c5!8 c5!4 e4@2 ~@10, ~@12 g4@23 ~@13]/3",
})).s("gm_french_horn").gain(0.4)

// other · lead 2 sawtooth
const lead_2_sawtooth = note("<~@13 A@5 ~@25 B@3 C@2 ~@52 D@5>".pickRestart({
  A: "[d3@3 c3@3 g2@6 a2@3 a#2@3 f2@16 ~@6]/5", B: "[~@2 d3 c3 g2@2 a2 a#2]/3", C: "f2/2",
  D: "[d3@3 c3@3 g2@6 a2@3 a#2@3 c3@16 ~@6]/5",
})).s("gm_lead_2_sawtooth").gain(0.35)

// other · trumpet
const trumpet = note(`<
  ~@9 A B@2 C ~@19 D E@2 D@2 E@2 D F@2 G H ~@16 A B@2 A@2 B@2 A ~@16 A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A ~@4 I
>`.pickRestart({
  A: "~@2 c5 ~@2 c5 ~ c5!2 ~@7", B: "~@2 d5 ~@2 d5 ~ d5!2 ~@7", C: "~@2 c5 ~@2 c5 ~ c5!2 ~@5 c5 ~",
  D: "~@6 c5 ~@2 c5 ~ c5!2 ~@3", E: "~@6 d5 ~@2 d5 ~ d5!2 ~@3", F: "~@6 f4 ~@2 f4 ~@2 f4 ~@3",
  G: "~@6 a4 ~@2 a4 ~@2 a4 ~@3", H: "a4 a4@3 ~@4", I: "~@2 [c4,e4,g4,c5] ~@5",
})).s("gm_trumpet").gain(0.4).pan(0.7)

// other · trumpet
const trumpet_2 = note(`<
  ~@9 A B@2 C ~@19 D E@2 D@2 E@2 F G@2 H I ~@16 A B@2 A@2 B@2 A ~@16 A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A ~@5
>`.pickRestart({
  A: "~@2 a4 ~@2 a4 ~ a4!2 ~@7", B: "~@2 b4 ~@2 b4 ~ b4!2 ~@7", C: "~@2 a4 ~@2 a4 ~ a4!2 ~@5 a4 ~",
  D: "~@6 a4 ~@2 a4 ~ a4!2 ~@3", E: "~@6 b4 ~@2 b4 ~ b4!2 ~@3", F: "~@9 a4 ~ a4!2 ~@3", G: "~@6 d4 ~@2 d4 ~@2 d4 ~@3",
  H: "~@6 e4 ~@2 e4 ~@2 e4 ~@3", I: "e4 f4@3 ~@4",
})).s("gm_trumpet").gain(0.4).pan(0.3)

// other · trombone
const trombone = note(`<
  ~@9 A B@2 C ~@19 D E@2 D@2 E@2 D F@2 G H ~@16 A B@2 A@2 B@2 A ~@16 A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A ~@5
>`.pickRestart({
  A: "~@2 e4 ~@2 e4 ~ e4!2 ~@7", B: "~@2 g4 ~@2 g4 ~ g4!2 ~@7", C: "~@2 e4 ~@2 e4 ~ e4!2 ~@5 e4 ~",
  D: "~@6 e4 ~@2 e4 ~ e4!2 ~@3", E: "~@6 g4 ~@2 g4 ~ g4!2 ~@3", F: "~@6 a#3 ~@2 a#3 ~@2 a#3 ~@3",
  G: "~@6 c4 ~@2 c4 ~@2 c4 ~@3", H: "c4 d4@3 ~@4",
})).s("gm_trombone").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@9 A@4 B C A@2 D A@26 E F A G A@28 ~@8 A@16 H I J ~ K>".pickRestart({
  A: "x!4", B: "x ~@2 x ~ x!2 ~", C: "x ~ x!3 ~ x ~", D: "~ x!3", E: "~ x ~ x!2 ~ x ~", F: "x!3 ~ x ~ x ~", G: "x!3 ~",
  H: "x ~@2 x!2 ~ x ~", I: "x ~ x!3 ~ x!2", J: "~ x!2 ~@5", K: "~ x ~@2",
})).gain(0.45)

// drums · clap
const clap = s("cp").struct("<~@9 A@4 ~@5 B@14 ~ B@10 C ~@4 A@11 ~ A@16 ~@29>".pickRestart({
  A: "~@3 x", B: "x", C: "x!2",
})).gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@23 B ~@7 C ~@18 D ~@7 E ~@15 A ~@7 E ~@7 E ~@4 F>".pickRestart({
  A: "~@14 x!2", B: "~ x ~@6", C: "x!2 ~@6", D: "~@7 x", E: "~@6 x!2", F: "~ x ~@2",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~ A@7 B A@34 C A@39 B A@18 D E ~>".pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x!2 ~@2", C: "x!2 ~ x", D: "x!2 ~@2", E: "~ x!3",
})).gain(0.4)

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

// drums · open hat
const open_hat = s("oh").struct("<~ A@3 B A@8 C@2 D C D@27 C@2 A C A@31 B A@20 C@2 E ~@2>".pickRestart({
  A: "~@2 x ~@3 x!2 ~@2 x ~@3 x ~", B: "~@2 x ~@3 x!2 ~@2 x ~@2 x!2 ~", C: "~ x ~ x ~ x ~ x",
  D: "~@2 x ~@3 x ~@3 x!2 ~@2 x ~", E: "~ x ~@6",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@8 A ~@22 B ~@7 C ~@19 D ~@7 E ~@15 A ~@7 E ~@7 E ~@5>".pickRestart({
  A: "~@7 x!3 ~@6", B: "~@12 x!2 ~@2", C: "~@7 x", D: "~@8 x!2 ~@6", E: "~@5 x ~@2",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@13 A B C ~@27 D E F G ~@53 A B C ~ C>".pickRestart({
// … 7 more lines

More by Dinah Washington