Strudelify

It's Too Late

Quartz

KeyA minorTempo110 bpm
0:00/0:00
// It's Too Late — Quartz
// 110 bpm, 4/4, key A 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: Full arrangement: all 111 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/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(`<
  ~@13 A@2 B@2 C@3 D E@6 F G H@2 I@7 J K L M N@2 O@2 P@3 Q@8 R ~@7 S@4 T@2 U@3 ~@3 V@6 W X Y@8 Z@6 AA AB AC@6 AD@4
>`.pickRestart({
  A: "[~@3 [g3,c4,e4]@4 ~@2 [g3,c4,e4]@2 ~@2 [f#3,a3,d4]@18 ~]/2", // C D
  B: "[~@6 [g3,c4,e4]@4 ~@8 [g3,c4,e4]@4 ~@5 [f#3,a3,d4]@36 ~]/2", // C D
  C: "[~@7 [c4,e4,g4]@4 ~@8 [c4,e4,g4]@4 ~@4 [a#3,d4,f4]@16 [a#3,d4,f4]@16 [a#3,d4,f4]@4 [a3,c4,e4]@12 ~ [a3,c4,e4]@2 ~@2 [a3,c4,e4]@12 [a3,c4,e4]@2 ~@2]/3", // C A# Am
  D: "[a3,c4,e4]!2 ~ [a3,c4,e4]@4 ~", E: "[[a3,d4,f4]@3 [a3,d4,f4]@4 [a3,c4,e4]@4 [a3,c4,e4]@5]/2",
  F: "[a3,c4,d4,f4]@3 [a3,c4,d4,f4]@5", G: "[a3,b3,d4,e4]",
  H: "[~@8 [g3,c4,e4]@8 ~@4 [g3,c4,e4]@4 ~@5 [f#3,a3,d4]@35]/2", // C D
  I: "[~@9 [a3,c4,e4]@8 ~@5 [a3,c4,e4]@4 ~@4 [a3,d4,f#4]@36 ~@8 [g3,c4,e4]@8 ~@5 [g3,c4,e4]@4 ~@4 [f#3,a3,d4]@36 ~@8 [g3,c4,e4]@4 ~@8 [g3,c4,e4]@4 ~@4 [f#3,a3,d4]@36 ~@9 [c4,e4,g4]@4 ~@8 [c4,e4,g4]@4 ~@4]/7", // Am D C D C D C
  J: "[a#3,d4,f4]!2", K: "[a#3,d4,f4]@2 [a3,c4,e4]@6 [a3,c4,e4] ~ [a3,c4,e4]@6",
  L: "[a3,c4,e4]@2 ~@2 [a3,c4,e4]@4 [a3,c4,e4]@4 ~@5 [a3,c4,e4]@15", M: "~@5 [a3,d4,f4]@12 [a3,d4,f4]@15",
  N: "[~ [a3,c4,e4]@16 [a3,c4,e4]@20 [a3,d4,f4]@12 [a3,d4,f4]@15]/2", // Am Dm
  O: "[~ [a3,c4,e4]@8 [a3,c4,e4]@10 [a3,d4,f4]@6 [a3,d4,f4]@7]/2", // Am Dm
  P: "[~@2 [a3,c4,e4]@16 [a3,c4,e4]@20 [a3,c4,d4,f4]@12 ~ [a3,c4,d4,f4]@20 [b3,d4,g4]@8 [b3,d4,g4]@8 [b3,d4,g4]@5 [b3,d4,g4]@4]/3", // Am Dm7 G
  Q: "[~@2 [b3,d4,g4]@5 [b3,e4,g4]@28 ~ [a3,c4,e4]@32 [a3,d4,f4]@36 ~ [g3,c4,e4]@20 [g3,c4,e4]@8 [a#3,d4,f4]@16 ~ [a#3,d4,f4]@16 [a3,c4,e4]@16 [a3,c4,e4]@16 ~ [c4,d4,f4]@16 [c4,d4,f4]@16 [c4,d4,f4]@4 [a3,b3,d4,e4]@2 ~@2 [a3,b3,d4,e4]@2 ~@6 [a3,b3,d4,e4]@8 ~]/8", // G Em Am Dm C A# Am Dm7 …
  R: "[a3,b3,d4,e4]@3 ~@5", // Asus4
  S: "[~@10 [a3,d4]@12 [a3,e4,g4]@24 [a3,d4,f#4]@12 ~ [a3,d4,f#4]@15 ~ [a3,d4]@12 [a3,e4,g4]@12 [a3,e4,g4]@12 [a3,d4,f#4]@12 [a3,d4,f#4]@4 ~, ~@37 f#4@6 ~@21]/4", // D5 A7 D D5 A7 D
  T: "[~@3 [a3,d4,f#4]@4 ~@4 [a3,d4,f#4]@12 [a3,e4,g4]@12 [a3,e4,g4]@12 ~ [a3,d4,f#4]@16]/2", // D A7 D
  U: "[~ [a3,d4,f#4] ~ [a3,d4,f#4]@3 [a3,e4,g4]@3 [a3,e4,g4] ~ [a3,d4,f#4]@7 ~@6]/3", // D A7 D
  V: "[~@27 [g3,c4,e4]@8 ~@4 [g3,c4,e4]@4 ~@4 [f#3,a3,d4]@36 ~@9 [g3,c4,e4]@8 ~@5 [g3,c4,e4]@4 ~@4 [f#3,a3,d4]@36 ~@8 [c4,e4,g4]@8 ~@5 [c4,e4,g4]@4 ~@4 [a#3,d4,f4]@14]/6", // C D C D C A#
  W: "~ [a#3,d4,f4]@8 [a#3,d4,f4]@2 [a3,c4,e4]@5", // A# Am
  X: "~@3 [a3,c4,e4]@2 ~@2 [a3,c4,e4]@12 [a3,c4,e4]@2 ~@2 [a3,c4,e4]@4 [a3,c4,e4]@2 ~@3", // Am
  Y: "[~@3 [a3,c4,e4]@12 ~@9 [a3,d4,f4]@12 [a3,d4,f4]@16 [a3,c4,e4]@16 [a3,c4,e4]@20 [a3,d4,f4]@12 [a3,d4,f4]@16 ~ [a3,c4,e4]@16 [a3,c4,e4]@20 [a3,d4,f4]@12 [a3,d4,f4]@16 [a3,c4,e4]@16 [a3,c4,e4]@20 [a3,c4,d4,f4]@32 ~ [b3,d4,g4]@6]/8", // Am Dm Am Dm Am Dm Am Dm7 …
  Z: "[~@2 [b3,d4,g4]@8 [b3,d4,g4]@8 [b3,d4,g4]@8 [g3,b3,e4]@28 [c4,e4,g4]@16 [c4,e4,g4]@16 ~ [a3,d4,f4]@16 [a3,d4,f4]@12 [a3,d4,f4]@4 [a3,c4,e4]@4 ~@4 [a3,c4,e4]@28 [a#3,d4,f4]@12 [a#3,d4,f4]@4 [a#3,d4,f4]@4 [a#3,d4,f4]@4 ~@4 [a#3,d4,f4]@4 [a3,c4,e4]@4 ~]/6", // G Em C Dm Am A# Am
  AA: "[a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4]@2 [a#3,d4,f4]@2", AB: "[a#3,d4,f4]!3 [c4,d4,g4]",
  AC: "[[c4,d4,g4]@8 [b3,d4,g4]@8 [b3,d4,g4]@12 [g3,b3,e4]@20 ~ [g3,b3,e4]@8 [f3,a3,c4]@36 ~ [g3,b3,e4]@20 [g3,b3,e4]@8 [f3,a3,c4]@36 ~ [g3,b3,e4]@12 [g3,b3,e4]@2 ~@2 [g3,b3,e4]@12 [g3,b3,e4]@2 ~@2 [g3,b3,e4]]/6", // Csus2 G Em F Em F Em
  AD: "[~@3 [g3,b3,e4]@8 ~ [g3,b3,e4]@85 ~@31]/4", // Em
})).s("gm_piano").gain(0.4)

// bass · synth bass 2
const bass = note(`<
  ~@8 A@2 B@2 C@2 D@6 ~ E F G H G H I J K@2 L@2 M@5 N O P Q R S@6 T@4 U V W@2 X@2 Y@2 Z@2 AA@2 AB AC@8 AD AE AF AG AH AI
  AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW@4 AX@3 AY AZ@6 BA@4
>`.pickRestart({
  A: "[~@7 a1@2 ~@3 c2 a1 d2@2]/2", B: "[~@9 a1@4 d2@4 e2@4 c2@8 a1@8 ~@12 c2@4 a1@4 d2@7]/2",
  C: "[~@15 a1@4 ~@6 c2@2 a1@2 d2@3]/2",
  D: "[~@10 a1@4 d2@4 e2@4 c2@8 a1@8 ~@12 c2@4 a1@4 ~ d2@8 ~@8 a1@4 d2@4 e2@4 c2@8 a1@8 ~@4 a1@4 a1@4 a1@4 ~@4 a1@4 g1@4 g1@4 ~@4 g1@4 a#1@4 a#1@4 d2@4 e2@4 f2@12 ~ f2@4 f2@12 f2@4]/6",
  E: "a#1@5 ~ a#1@2 a#1@3 a#1 a#1@2 c2@2", F: "f1@4 ~@2 f1@2 f1@3 f1 f1@2 a1@2",
  G: "a#1@4 ~@2 a#1@2 a#1@3 a#1 a#1@2 c2@2", H: "f1@4 ~@2 f1@2 f1@3 f1 f1@2 f1@2", I: "d1@4 ~@2 d1@2 f1@3 f1 f1@4",
  J: "e1", K: "[a1@8 ~@12 c2@4 a1@4 ~ d2@8 ~@27]/2", L: "[~ a1@8 ~@13 c2@4 a1@4 d2@8 ~@16 d3@10]/2",
  M: "[~@2 a1@8 ~@13 c2@4 a1@4 d2@8 ~@8 a1@4 d2@4 e2@4 c2@8 a1@8 ~@12 c2@4 a1@4 d2@8 ~@8 a1@4 d2@4 e2@4 c2@8 ~ a1@8 ~@4 a1@4 a1@4 a1@4 ~@4]/5",
  N: "a1 g1!2 ~ g1 a#1!2 d2", O: "e2 f2@3 f2 f2@3", P: "f2 ~@7", Q: "~@5 a#1@8 ~@4 a#1@4 a#1@6 a#1@2 a#1@3",
  R: "~ c2@4 f1@8 ~@4 f1@4 f1@6 f1@2 f1@3",
  S: "[~ a1@4 a#1@8 ~@4 a#1@4 a#1@6 a#1@2 ~ a#1@4 c2@4 f1@8 ~@4 f1@4 f1@6 f1@2 f1@4 f1@4 a#1@8 ~@4 a#1@4 a#1@6 a#1@2 a#1@4 c2@4 f1@8 ~@4 f1@4 f1@6 f1@2 f1@4 f1@4 d1@8 ~@5 d1@4 d1@6 d1@2 d1@4 d1@4 g1@8 g1@8 g1@5 g1@4]/6",
  T: "[~@2 g1@5 c1@28 ~ f1@32 a#1@36 ~ a1@4 ~@4 a1@4 ~@4 a1@4 ~@3]/4", U: "~ a1@4 ~@4 g1@8 ~@5 g1@4 c1@6",
  V: "~@3 c1@2 f1@4 ~@2 f1@2 f1@3", W: "[f1@2 f1@4 ~ f1@4 d1@8 ~@4 d1@4 f1@8 f1@8 e1@16 ~@5]/2",
  X: "[e2@2 e3 a1@10 ~ e3@2]/2", Y: "[g2@8 a2@4 a1@40 ~@5 e3@7]/2", Z: "[~ g2@8 a2@4 a1@40 ~@4 e3@7]/2",
  AA: "[~ g2@8 a2@4 ~ a1@40 ~@4 e3@6]/2", AB: "~ g2@4 a2@2 a1@9",
  AC: "[~@2 e2@4 a2@4 d2@15 ~@2 e3@8 a2@4 d2@4 e2@4 a1@20 e2@4 a2@4 d2@15 ~ e3@8 a2@4 d2@4 e2@4 a1@20 e2@4 a2@4 ~ d2@15 ~ e3@8 a2@4 d2@4 e2@4 a1@20 e2@4 a2@4 d2@16 e3@20 ~ g1@8 ~@7]/8",
  AD: "~@5 b1@4 c2@4 d2@8 ~@11", AE: "~@9 a1@4 ~@3", AF: "~@3 c2@2 a1@2 d2@4 ~@5", AG: "~@19 a1@8 ~@5",
  AH: "~@7 c2@4 a1@4 d2@8 ~@9", AI: "a1 d2 e2 c2@2 a1@2 ~", AJ: "~@9 c2@4 a1@4 d2@8 ~@7",
  AK: "~ a1@4 d2@4 e2@4 c2@8 a1@8 ~@3", AL: "~ a1@2 a1@2 a1@2 ~@2 a1@2 g1@2 g1@2 ~",
  AM: "~ g1@2 a#1@2 a#1@2 d2@2 e2@2 f2@5", AN: "~@3 f2@4 f2@12 f2@4 ~@9", AO: "~@3 a#1",
  AP: "~@2 a#1@2 a#1@3 a#1 a#1@2 c2@2 f1@4", AQ: "~@2 f1@2 f1@3 f1 f1@2 a1@2 a#1@4",
  AR: "~@4 a#1@4 a#1@6 a#1@2 a#1@4 ~ c2@4 f1@7", AS: "~@5 f1@4 f1@6 f1@2 f1@4 f1@4 a#1@7",
  AT: "~@5 a#1@4 a#1@6 a#1@2 a#1@4 c2@4 f1@7", AU: "~@5 f1@4 f1@6 f1@2 f1@4 f1@4 d1@7",
  AV: "~@3 d1@2 d1@3 d1 d1@2 d1@2 a1@3", AW: "[~@2 g1@6 ~@2 g1@6 ~@2 g1@6 ~@2 c1@28 f1@32 ~ a#1@36 a1@4 ~]/4",
  AX: "[~@3 a1@4 ~@4 a1@4 ~@4 a1@4 ~@4 g1@8 ~@4 g1@4 c1@8 ~@4 c1@4 f1@8 ~@5 f1@4 f1@8 ~@4 f1@4 g1@4]/3", AY: "g1!4",
  AZ: "[g1@8 g1@8 g1@12 c2@20 ~ c2@8 f1@24 f2@8 c2@24 ~ c2@8 f1@24 f2@12 ~ c1@8 ~@4 c1@4 c1@8 ~@4 c1@4 c1]/6",
  BA: "[~@3 c1@8 ~ c1@85 ~@31]/4",
})).s("gm_synth_bass_2").gain(0.45).pan(0.4)

// other · marimba
const marimba = note("<~@4 A B C D C D E F ~@17 G H I@2 ~@28 J K L M L N@2 O@2 P Q R ~@38>".pickRestart({
  A: "~@27 a2@4 ~", B: "~@15 c3@4 a2@4 d3@4 ~@5", C: "~@7 a2", D: "~@4 c3 a2 d3 ~", E: "~@9 c3@4 d3@4 d3@4 ~@8 a2@3",
  F: "~@17 c3@4 a2@4 d3@4 ~@3", G: "a2@4 ~@16 c3@4 a2@4 ~ d3@3", H: "~@13 c3@4 d3@4 d3@4 ~@7",
  I: "[~ a2@4 ~@17 c3@4 a2@4 d3@4 ~@12 c3@4 d3@4 d3@4 ~@6]/2", J: "~@13 a2@4 ~@15", K: "~ c3@4 a2@4 d3@4 ~@19",
  L: "~@7 a2@2 ~@7", M: "~ c3@2 a2@2 d3@2 ~@9", N: "[~@2 c3@4 a2@4 d3@4 ~@13 c3@4 d3@4 d3@4 ~@8 a2@4 ~@13]/2",
  O: "[~@3 c3@4 a2@4 d3@4 ~@12 c3@4 d3@4 d3@4 ~@8 a2@4 ~@13]/2", P: "~@3 c3@4 a2@4 ~ d3@4 ~@12 c3@4",
  Q: "d3!2 ~@2 a2 ~@3", R: "~ c3 a2 d3 ~@4",
})).s("gm_marimba").gain(0.45)

// chords · string ensemble 2
const string_ensemble_2 = note("<A@6 B@4 ~@97 C@4>".pickRestart({
  A: "[~@27 [g3,b3,c4,d4,e4]@30 a3@7, ~@57 f#3@4 ~@3]/2", B: "[~@14 [g3,b3,c4,d4,e4]@15 [f#3,a3]@3]/2",
  C: "[~@6 [c3,g3,b3,e4]@43 ~@15]/4", // Cmaj7
})).s("gm_string_ensemble_2").gain(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@21 A B A B A B C D E F G H ~@8 I@3 J@6 K@8 ~@11 L@2 E@2 ~@8 M H N ~ O@8 P@8 Q@6 R@4
>`.pickRestart({
  A: "[a#3,d4,f4,a4]", B: "[a3,c4,e4,g4]", C: "[a3,c4,d4,f4]", D: "[a3,b3,d4,e4]", E: "a5 ~ a5 ~ a5 ~ a5 ~",
  F: "~ a5@4 ~@4 a5@4 ~@4 a5@4 ~@4 a5@4 ~@3", G: "~ a5@4 ~@4 a5@4 ~@4 a5@4 ~@5 a5@4 ~@2",
  H: "~ a5@2 ~@2 a5@2 ~@2 a5@2 ~@2 a5@2 ~", I: "[~@5 [a#3,d4,f4,a4]@32 [a3,c4,e4,g4]@32 [a#3,d4,f4,a4]@27]/3",
  J: "[~@6 [a3,c4,e4,g4]@32 [a#3,d4,f4,a4]@32 [a3,c4,e4,g4]@32 [a3,c4,d4,f4]@32 ~ [b3,d4,g4]@32 [b3,e4,g4]@25]/6", // Am7 A#maj7 Am7 Dm7 G Em
  K: "[~@8 [a3,c4,e4]@32 [a3,d4,f4]@32 ~ [g3,c4,e4]@32 [a#3,d4,f4]@32 ~ [a3,c4,e4]@32 ~ [a3,c4,d4,f4]@32 [g3,b3,d4,e4]@32 ~@21]/8", // Am Dm C A# Am Dm7 Em7
  L: "[~@15 a5@4 ~@4 a5@4 ~@4 a5@4 ~@4 a5@4 ~@5 a5@4 ~@4 a5@4 ~@4]/2", M: "~@17 a5@4 ~@4 a5@4 ~@3",
  N: "~ a5@2 ~@2 a5@2 ~@9",
  O: "[~@24 [a#3,d4,f4,a4]@32 [a3,c4,e4,g4]@32 [a#3,d4,f4,a4]@32 ~ [a3,c4,e4,g4]@32 [a#3,d4,f4,a4]@32 [a3,c4,e4,g4]@32 [a3,c4,d4,f4]@32 ~ [b3,d4,g4]@6]/8", // A#maj7 Am7 A#maj7 Am7 A#maj7 Am7 Dm7 G
  P: "[~@26 [g3,b3,e4,g5]@32 [f3,a3,c4,c5]@32 ~ [a3,a#3,d4,f4]@32 [g3,a3,c4,e4]@32 [g3,a#3,d4,f4]@32 [a3,c4,e4,g4]@32 ~ [a#3,d4,f4,g4]@32 [c4,d4,g4]@4]/8", // Em F A#maj7 Am7 Gm7 Am7 Gm7 Csus2
  Q: "[~@12 b3@16 [g3,b3,e4]@32 ~ [f3,a3,c4]@32 ~ [g3,b3,e4]@32 [f3,a3,c4]@32 ~ [g3,b3,e4]@10 ~@2 [g3,b3,e4]@2 ~@2 [g3,b3,e4]@12 [g3,b3,e4]@2 ~@2 [g3,b3,e4]]/6", // Em F Em F Em
  R: "[~@3 [g3,b3,e4]@7 ~@2 [g3,b3,e4]@86 ~@30]/4", // Em
})).s("gm_string_ensemble_1").gain(0.35)

// other · acoustic guitar nylon
const acoustic_guitar_nylon = note("<~@49 A@2 B@2 C@2 D@4 ~@34 E@6 F G H@6 I@4>".pickRestart({
  A: "[~@7 g4@20 f4@4 e4@4 ~ f4@8 e4@4 d4@4 c4@8 d4@4]/2", B: "[e4@4 e4@8 d4@4 c4@4 d4@8 ~ e4@8 c4@8 a3@19]/2",
  C: "[~@9 c4@4 d4@4 ~ e4@4 f4@4 e4@4 f4@4 g4@4 a4@8 e4@8 e4@10]/2",
  D: "[~@7 e4@4 f4@4 e4@4 d4@4 c4@8 d4@4 e4@4 e4@19 ~ b4@16 ~ a4@40 ~@12, ~@59 a#4@3 ~@66]/4",
  E: "[~@14 a4@12 g4@20 f4@4 e4@4 g4@8 a4@8 c4@12 ~@11 g4@2 a4@4 c5@2 ~@4 a4@6 g4@8 a4@16 e4@6 c4@2 a3@2 ~@10 c4@4 d4@4 e4@4 f4@4 e4@4 f4@4 e4@4 d4@8 ~]/6",
  F: "c4@2 a3@2 a3 c4 d4@2", G: "d4@2 d4@2 c4 d4 e4@2",
  H: "[d4@8 d4@8 c4@4 d4@8 e4@28 ~ c4@32 e4@32 ~ c4@36 ~ e4@8 ~@4 e4@4 e4@8 ~@4 e4@4 e4]/6",
  I: "[~@3 e4@8 ~ e4@85 ~@31]/4",
})).s("gm_acoustic_guitar_nylon").gain(0.7)

// other · lead 3 calliope
const lead_3_calliope = note("<~@20 A@2 B ~@18 C@2 ~@42 D@3 ~@23>".pickRestart({
  A: "[~@7 c5@2 c5@2 c5@2 a4 a4@2]/2", B: "g4 g4@2 e4@3 ~@2", C: "[~ c5@8 c5@8 c5@8 a4@4 a4@8 g4@4 g4@8 e4@12 ~@3]/2",
  D: "[~@5 c5@2 c5@2 c5@2 a4 a4@2 g4 g4@2 e4@3 ~@4]/3",
})).s("gm_lead_3_calliope").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A B C D@3 E@2 F G@2 H I@3 J K@8 L K M N O P B@3 D@3 Q E@2 R G@3 S I T U V M W O X B D@3 E@3 Y G@2 H I@3 J K@2 Z M
  AA AB B C D AC E G H I J K@2 V M@3 O@3 P B@3 D@3 AC R G AD ~@5
>`.pickRestart({
  A: "~@27 x ~@4", B: "~@3 x ~@7 x ~@7 x ~@7 x ~@4", C: "~@3 x ~@7 x ~@8 x ~@7 x ~@3", D: "~ x ~ x ~ x ~ x",
  E: "~@5 x ~@7 x ~@7 x ~@7 x ~@2", F: "~@5 x ~@7 x ~@8 x ~@7 x ~", G: "~@3 x ~@3 x ~@3 x ~@3 x",
  H: "~@6 x ~@7 x ~@7 x ~@8 x", I: "~@7 x ~@7 x ~@7 x ~@7 x", J: "~@7 x ~@8 x ~@7 x ~@7", K: "x!4", L: "x",
  M: "~ x ~@7 x ~@7 x ~@7 x ~@6", N: "~ x ~@7 x ~@7 x ~@8 x ~@5", O: "~ x ~@3 x ~@3 x ~@3 x ~@2",
  P: "~@2 x ~@7 x ~@8 x ~@7 x ~@4", Q: "~@4 x ~@7 x ~@8 x ~@7 x ~@2", R: "~@5 x ~@7 x ~@7 x ~@8 x ~",
  S: "~@6 x ~@8 x ~@7 x ~@7 x", T: "~@15 x ~@7 x ~@7 x", U: "~ x!3", V: "x ~@7 x ~@7 x ~@8 x ~@6",
  W: "~ x ~@7 x ~@8 x ~@7 x ~@5", X: "~@2 x ~@8 x ~@7 x ~@7 x ~@4", Y: "~@5 x ~@8 x ~@7 x ~@7 x ~",
  Z: "~@17 x ~@7 x ~@6", AA: "~ x ~@8 x ~@7 x ~@7 x ~@5", AB: "~@2 x ~@7 x ~@7 x ~@8 x ~@4",
  AC: "~@4 x ~@8 x ~@7 x ~@7 x ~@2", AD: "~@6 x ~@7 x ~@8 x ~@7 x",
})).gain(0.45)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B C D E F G@2 H I@2 J K@3 L M N@7 O P Q R S T U@3 V W@2 X Y Z AA AB@3 AC AD@2 AE AF AG AH AI AJ AK AL AM F G@3
  AN I@2 J K@3 L N M AO Q AP AQ U AR W AS Z AB AT AD AU AV@2 AW AG@3 AI@3 AX AY@3 AM@3 AZ BA I BB ~@5
>`.pickRestart({
  A: "~@27 x ~@3 x", B: "~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x",
  C: "~@3 x ~@3 x ~@3 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3", D: "x!8", E: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2",
  F: "~@4 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~@2 x", G: "~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x",
  H: "~@5 x ~@3 x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x ~", I: "x ~@2 x ~ x!4 ~@2 x ~ x!3",
  J: "x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@4 x ~ x ~ x", K: "~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x",
  L: "~ x ~@5 x ~@4 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~", M: "x!2 ~@2 x ~ x!3 ~ x ~ x ~ x ~",
  N: "x!2 ~@2 x ~ x!4 ~@2 x ~ x!2", O: "x", P: "x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@4 x ~ x",
  Q: "~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x", R: "~ x ~ x ~@5 x ~@3 x ~ x ~ x ~@2 x ~@5 x ~@3 x ~",
  S: "x!3 ~@2 x ~ x!4 ~@2 x ~ x", T: "x ~ x ~ x ~@5 x ~@3 x ~ x ~@2 x ~ x ~@5 x ~@3 x",
  U: "~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x", V: "~ x!3 ~@2 x ~ x!4 ~@2 x ~", W: "x!4 ~@2 x ~ x!4 ~@2 x ~",
  X: "x ~ x ~ x ~ x ~@5 x ~@4 x ~ x ~ x ~@3 x ~@3 x ~@2", Y: "~ x ~@3 x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@2",
  Z: "~ x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@2", AA: "~ x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@6 x ~",
  AB: "~ x!4 ~@2 x ~ x!4 ~@2 x", AC: "~@2 x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x ~ x ~@5 x",
  AD: "~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x", AE: "~@2 x!4 ~@2 x ~ x!4 ~@2",
  AF: "x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~@2 x ~ x ~@4", AG: "~ x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@4",
  AH: "~ x ~@3 x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x ~ x ~@3", AI: "~ x ~ x!4 ~@2 x ~ x!4 ~",
  AJ: "~@2 x ~@4 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@2", AK: "~@3 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~@4",
  AL: "x ~ x ~ x ~ x!2 ~@2 x ~ x!4", AM: "~@2 x ~ x!4 ~@2 x ~ x!4",
  AN: "~@5 x ~@3 x ~ x ~@2 x ~ x ~@5 x ~@3 x ~ x ~ x ~", AO: "~@17 x ~ x ~@5 x ~@3 x ~ x",
  AP: "~ x ~@2 x ~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~", AQ: "x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@6 x ~@3 x",
  AR: "~ x ~ x ~ x ~@5 x ~@3 x ~@2 x ~ x ~ x ~@5 x ~@3", AS: "x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x ~ x ~@5 x ~@2",
  AT: "~@2 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~@2 x ~@5 x", AU: "~@3 x ~ x ~ x ~@3 x ~@4 x ~@3 x ~@3 x ~ x ~@5",
  AV: "x ~ x!4 ~@2 x ~ x!4 ~@2", AW: "x ~@3 x ~ x ~ x ~ x ~@5 x ~@4 x ~ x ~ x ~ x ~@4",
  AX: "~@2 x ~@3 x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x ~ x ~@2", AY: "~@3 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x ~@2",
  AZ: "~@4 x ~@4 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~ x ~ x", BA: "~@5 x ~@3 x ~ x ~ x ~ x ~@5 x ~@3 x ~ x ~@2 x ~",
  BB: "x ~@5 x ~@3 x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
// … 28 more lines