Strudelify

Albachiara

Vasco

KeyC majorTempo119 bpm
0:00/0:00
// Albachiara — Vasco
// 119 bpm, 4/4, key C 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: duplicate parts dropped: ch 4 "MUTED GTR" electric guitar muted (copy of ch 3 "STEEL GTR" acoustic guitar steel)
// note: Full arrangement: all 98 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(119/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 · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@31 A B C@2 D E F@2 G H@2 I J@2 K L M@3 N@7 O@5 P@3 Q R S T U V W X Y Z AA AB@2 AC AD AE AF AG ~@2 AH AI@4 AJ AK@6 AL
>`.pickRestart({
  A: "~@25 c2@4 ~@3", B: "~@7 c2@5 ~@9 b1@4 ~@7", C: "[~@3 b1@4 ~@10 a1@5 ~@9 a1@4 ~@10 g1@4 ~@10 g1@5]/2",
  D: "~@9 f1@6 ~@8 f1@6 ~@3", E: "~@5 c2@5 ~@9 c2@5 ~@8", F: "[~ d2@6 ~@7 d2@7 ~@7 g1@7 ~@7 g1@6 ~@8 c2@3 ~@5]/2",
  G: "~@6 c2@5 ~@9 b1@3 ~@9", H: "[~@2 b1@4 ~@10 a1@5 ~@9 a1@4 ~@10 g1@4 ~@10 g1@5 ~]/2", I: "~@4 f1@3 ~@4 f1@3 ~@2",
  J: "[~@4 c2@5 ~@9 c2@5 ~@8 d2@6 ~@8 d2@7 ~@7 g1@5]/2", K: "~@9 g1@5 ~@9 d2 ~@3 d2@2 ~ d2 ~",
  L: "~@2 d2 ~@2 d2@4 c#2@3 c2@4 b1@3 ~@4 g2@2 ~ g2@2 ~ g2@2 ~",
  M: "[~ g2@3 f#2@3 ~ f2@3 ~@4 c2@12 ~@2 c2@10 g1@4 b1@28 a1@12 ~@2 a1@10 e1]/3",
  N: "[~@2 g1@28 f1@25 a1@3 c2@22 ~@3 c2@3 d2@28 g1@25 ~@3 c2@12 ~@2 c2@10 g1@4 b1@28 a1@13 a1@11 e1@2]/7",
  O: "[~ g1@28 f1@25 a1@3 c2@22 ~@3 c2@3 d2@28 g1@25 ~@3 c2@3 ~@16]/5",
  P: "[~@2 c2@3 b1@4 ~@21 b1@3 a1@4 ~@20 a1@4 g1@5 ~@19 g1@4 f1@5 ~@2]/3", Q: "~@17 f1@4 c2@4 ~@7",
  R: "~@9 c2@7 d2@3 ~@13", S: "~@5 d2@4 b1@3 g1@4 ~@16", T: "~ g2@4 g1@4 ~@3 c2@4 ~@16", U: "~ c2@3 b1@4 ~@20 b1@4",
  V: "a1 ~@5 a1 g1", W: "~@20 g1@4 f1@5 ~@3", X: "~@19 c2@4 ~@9, ~@16 f1@5 ~@11", Y: "~@8 c2@7 d2@3 ~@14",
  Z: "~@4 d2@4 b1@3 g1@4 ~@17", AA: "g2@4 g1@4 ~@3 c2@5 ~@16", AB: "[~@3 b1@3 ~@25 a1@4 ~@24 g1@3 ~@2]/2",
  AC: "~@23 f1@4 ~@5", AD: "~@9 c2@2 ~@5", AE: "~@14 d2@5 ~@13", AF: "~@5 g1@2 ~@9", AG: "~@9 c2@20 ~@3",
  AH: "~@25 f1@3 ~@4",
  AI: "[f1@4 ~@3 f1@4 ~@3 f1@3 c2@6 ~ c2@2 ~@2 c2@2 ~ c2@5 ~@2 c2@2 ~@2 c2@2 ~ c#2@2 ~@2 d2@13 ~ d2@14 g1@27 c2@12 ~@2 c2@10]/4",
  AJ: "~ g1@3 b1@28",
  AK: "[a1@13 ~ a1@10 e1@4 g1@28 f1@24 a1@3 ~ c2@23 ~ c2@4 d2@27 g1@26 ~@2 d2 ~@3 d2@2 ~ d2 ~@3 d2 ~@2 d2@4 c#2@3 c2@4]/6",
  AL: "b1@3 ~@4 g2@2 ~ g2@2 ~@2 g2@2 ~ g2@4 f#2@3 f2@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.54)

// chords · piano · "PRG.CHANGE"
const piano = note("<A@2 B@2 C@8 D@5 E F@7 G@3 H@3 I ~@41 J K L ~@6 M@2 N@6 ~@8>".pickRestart({
  A: "[~@59 b4@4 c5, ~@14 [f2,d5]@29 [f4,b4]@13 a4@8, ~@21 f3@43, ~@7 [a3,c5]@9, ~@35 c4@29]/2", // Dm Fdim Am
  B: "[~@2 d5@3 ~@28 g4@24 ~@5 f2@2, ~@5 [c3,e5]@56 [f4,a4]@3, ~@3 g3@13, ~@18 c4@39 g4@7, ~@18 g4@7 e4@39]/2", // C F
  C: "[~ [f4,a4]@3 ~ [f4,a4]@3 ~@3 [g4,b4]@4 [g4,b4]@3 [g4,b4]@4 ~@4 [a4,c5]@3 [a4,c5]@4 ~ a4@3 ~@4 [b4,d5]@4 ~ [b4,d5]@4 [b4,d5]@4 d5@5 [g4,b4]@4 [g4,b4]@4 [g4,b4]@4 ~@4 [a4,c5]@4 [a4,c5]@4 [a4,c5]@4 ~@9 [b4,d5]@4 [b4,d5]@5 ~@11 [c5,e5]@6 [c5,e5]@8 [c5,e5]@27 ~@2 [c4,c5,e5]@30 [b3,b4,d5]@31 [a3,a4,c5]@30 [g3,g4,b4]@6, ~@5 f3@36 a3@13 b4@4 ~ g2@41 d4@56 ~@100, ~@8 [f4,a4]@14 g4@15 [a4,c5]@24 ~@10 [g4,b4]@12 d4@4 a4@23 [c5,e5] b3@46 ~@99, ~@11 a3@15 f4@35 ~@14 b3@12 c5@4 [b4,d5] g4@64 ~@100, ~@18 c4@4 b4@11 c5 c4@28 ~@5 g3@38 [b4,d5]@52 ~@99]/8", // F G Am Bm G Am Bm C …
  D: "[~@9 [f#3,f#4,a#4]@16 [f3,f4,a4]@30 [c3,c4,e4,g4,c5]@31 [d2,d4,f#4,a4]@30 ~@23 [b4,d5]@7 ~ [c4,g4,c5,e5]@13, ~@116 g2@15 b4@4 [a4,c5]@11 ~@14, ~@116 [d4,g4,b4]@15 [d4,g4]@15 ~@14, ~@124 g3@23 ~@13, ~@128 b3@19 ~@13]/5", // F# F C D Bm C Am G …
  E: "~@10 c3@7 [b3,g4,b4,d5]@15, ~ [c4,g4,c5,e5]@8 ~@7", // G C
  F: "[[b3,g4,b4,d5]@16 [a3,a4,c5,e5]@15 [a3,a4,c5,e5]@15 ~@8 c5@4 ~@15 c4@4 ~@23 c4@3 c4@4 ~@23 g4@8 ~@28 d4@2 ~@27 b3@3 ~@16 [g4,c5,e5]@8 g4@2, ~@46 [g2,g3]@12 a4@7 f4@4 e4@8 f2@19 a4@4 f4@7 [c3,d5]@15 e4@16 d2@30 g2@23 [b4,d5]@7 ~@12 e4@14, ~@46 [c5,e5]@8 e5@23 f4@15 [g4,c5]@15 g4@12 c5@19 [d4,f#4,a4,d5]@15 [f#3,f#4,d5]@15 [g4,b4]@11 ~ g4@18 ~ [g4,c5,e5]@15 ~@10, ~@50 [d5,f5]@27 a4@11 a3@20 ~@3 e5@28 ~@14 [d4,a4]@4 c5@12 ~@7 b3@4 b4@3 d4@4 [a4,c5]@11 ~@8 c4@18, ~@58 c5@22 ~@4 f3@24 ~@7 c4@24 ~@6 d3@16 [a3,a4]@8 ~@3 g3@26 ~ c3@25]/7", // G Am C G Csus2 Bm C C5 …
  G: "[~@5 c5 ~@22 f4@8 ~@23 c4@7 ~@23 d4@7, ~@5 b2@31 a3@31 ~@7 g3@22, ~@5 [b4,d5]@15 ~ [b4,d5,f5]@15 [a4,c5,e5]@15 ~@15 g4@15 ~@15, ~@13 b3@24 ~@6 c4@15 ~@8 [g2,b4,d5]@30, ~@17 d4@20 ~@14 [e4,a4,c5,e5]@16 ~@15 [b3,g4,c5,e5]@14]/3", // Bm Bdim Am G Am Cmaj7
  H: "[~@24 [c4,c5]@7 c5@2 ~@25 d3@4 ~@30 [d4,g4,b4] ~@3, ~ [f2,a4]@30 g4@12 c5@7 g4@4 g3@7 ~@8 f#3@8 [d4,f#4]@4 a4@8 g3@5 ~@2, ~ c5@19 f4@11 c4@8 g3@8 c4@15 [d4,f#4]@11 a3@12 [f#3,d4,f#4]@7 ~@4, ~ f4@15 a3@15 g3@4 e5@26 ~ a4@15 d5@15 ~@4, ~@8 f3@23 [c3,d5]@30 ~ [d2,d3]@30 g2@2 ~@2]/3", // C G F D Csus2 D
  I: "[g2,g3,d4,g4,b4] ~@3 [g2,g3,d4,g4,b4] ~@3 [g2,g3,d4,g4,b4] ~@2 [g2,g3,d4,g4,b4] ~@3 [g2,g3,d4,g4,b4] ~@2 [g2,g3,d4,g4,b4]@2 ~@12", // G
  J: "~@19 [d5,d6] ~@2 [c5,c6] ~@3 [b4,b5] ~@2 [a4,a5] ~@2", // D C B A
  K: "~ [g4,g5] ~@2 [f4,f5] ~@3 [e4,e5] ~@2 [d4,d5] ~@3 [c4,c5] ~@2 [b3,b4] ~@3 [a3,a4] ~@2 [g3,g4] ~@3 [f3,f4] ~@2", // G F E D C B A G …
  L: "[e3,e4] ~@3 [d3,d4] ~@2 [c3,c4]@3 ~@22", // E D C
  M: "[~@10 [c4,g4,c5,e5]@13 ~@7 c3@7 [b3,g4,b4,d5]@14 [b3,g4,b4,d5]@13, ~@23 [c4,g4,c5,e5]@15 ~@26]/2", // C G C
  N: "[~ [a3,a4,c5,e5]@14 [a3,a4,c5,e5]@14 ~@7 c5@3 ~@14 c4@3 ~ [f3,a3,c4]@4 ~@3 [f3,c4]@3 ~@4 [f3,a3,c4]@4 ~@3 [f3,a3,c4]@3 ~ [g3,e4]@5 ~ [g3,c4,e4]@2 ~ [c4,e4]@2 ~@2 [g3,c4,e4]@5 ~ [g3,c4,e4]@2 ~@2 [g3,c4]@2 ~@2 g3 ~@2 [d2,d3,a3]@24 ~ a3 ~@5 g1@22 ~@27, ~@29 [g2,g3]@17 f4@4 e4@6 ~@7 a3@3 ~@15 c4@6 ~@4 g3 ~@13 e4 ~@2 [c4,e4]@3 ~ d4@54 ~@26, ~@29 [c5,e5]@7 e5@20 ~@136, ~@11 [d5,f5]@8 ~@45, ~@40 [a4,c5]@16 ~@26 [c2,c3]@29 ~ f#3@18 ~@6 [g2,g3,b3]@30 ~@26]/6", // Am F F5 F C C5 D5 G …
})).s("gm_piano").gain(0.52)

// other · pad new age · "PRG.CHANGE"
const pad_new_age = note("<~@38 A@3 B C D@3 E F ~@50>".pickRestart({
  A: "[~@28 f6@3 e6@4 c6@4 ~@13 e6@4 f6@3 e6@4 c6@4 ~@13 e6@4 f6@3 e6@3 ~ c6@4 ~]/3", B: "~@12 e6@3 f6@4 e6@3 c6@4 ~@6",
  C: "~@8 e6@3 f6@4 e6@3 c6@4 ~@10",
  D: "[~@4 e6@3 f6@4 e6@3 c6@4 ~@13 d6@2 ~@2 d6@2 ~ d6@2 ~@2 d6@2 ~@2 d6@3 c#6@3 c6@3 ~ b5@4 ~@3 g6@2 ~ g6@2 ~@2 g6@2 ~ g6@4 f#6@2 ~ f6@3 ~@4 d6@2 ~@2 d6@2 ~ d6@2]/3",
  E: "~@2 d6@2 ~ d6@4 c#6@3 c6@3 ~ b5@3 ~@4 g6@2 ~ g6@2 ~ g6@2 ~", F: "~ g6@2 ~@2 f#6@2 ~ f6@3 ~@21",
})).s("gm_pad_new_age").gain(0.52)

// chords · percussive organ · "PRG.CHANGE"
const percussive_organ = note("<~@48 A@2 B@7 C@5 ~@36>".pickRestart({
  A: "[~@11 b4@28 [a4,c5]@25]/2", // Am
  B: "[~@3 [g4,b4]@27 ~ [f4,a4]@28 [g4,e5]@27 [f#4,a4]@27 ~ b4@28 c5@28 b4@28 [a4,c5]@26, ~@31 c5@55 d5@56 e5@82, ~@114 g4@81 ~@29]/7", // G F C F#m Am
  C: "[~@2 [g4,b4]@27 ~ [f4,a4]@27 [g4,e5]@26 ~@2 [f#4,a4]@28 [g4,b4]@27 ~@20, ~@6 c5@11 d5@11 ~@4]/5", // G F C F#m G
})).s("gm_percussive_organ").gain(0.48)

// other · electric guitar muted · "PRG.CHANGE"
const electric_guitar_muted = note("<~@89 A B C@3 D ~@3>".pickRestart({
  A: "~@11 c4@2 d4@3", B: "e4@2 f4@3 g4@17 f4@6 e4@2 f4@2",
  C: "[e4@4 d4@4 c4@2 ~ e4@2 d4@4 ~ c4@4 d4@2 e4@2 b3@25 ~@4 f3@7 a3@7 c4@7 f4@7 e4@7 c4@6, ~@5 d4 ~@42]/3",
  D: "~ g3@12 ~@19",
})).s("gm_electric_guitar_muted").gain(0.71)

// drums · kick
const kick = s("bd").struct(`<
  ~@31 A B C D E F G H I J K L M D N ~ O P Q R S T U V W X Y A Z AA AB E AC AD H I J K AE C D E F AF P AG AH AI U V W N
  ~@4 AJ AK AL AM AN AO AP AQ P ~@2
>`.pickRestart({
  A: "~@25 x ~@6", B: "~@7 x ~@13 x ~@10", C: "~@3 x ~@13 x ~@13 x", D: "~@13 x ~@13 x ~@4", E: "~@9 x ~@13 x ~@8",
  F: "~@5 x ~@13 x ~@12", G: "~ x ~@12 x ~@13 x ~@3", H: "~@5 x ~@6 x ~@3", I: "~@3 x ~@6 x ~@5", J: "~ x ~@6 x ~@6 x",
  K: "~@6 x ~@6 x ~@2", L: "~@4 x ~@6 x ~@4", M: "~@4 x ~@13 x ~@12 x", N: "~@9 x ~@22", O: "~@15 x ~@16",
  P: "~@11 x ~@20", Q: "~@7 x ~@24", R: "~ x ~@13 x", S: "~@13 x ~@2", T: "~@11 x ~@4", U: "~@9 x ~@6", V: "~@7 x ~@8",
  W: "~@5 x ~@10", X: "~@3 x ~@12", Y: "~ x ~@27 x ~@2", Z: "~@21 x ~@10", AA: "~@20 x ~@6 x ~@4",
  AB: "~@2 x ~@10 x ~@13 x ~@4", AC: "~@2 x ~@6 x ~@6", AD: "x ~@6 x ~@6 x ~", AE: "~@8 x ~@12 x ~@10",
  AF: "~ x ~@13 x ~@13 x ~@2", AG: "~@3 x ~@27 x", AH: "~@27 x ~@4", AI: "~@23 x ~@8", AJ: "~@17 x ~@9 x ~@4",
  AK: "~@13 x ~@18", AL: "~ x ~@2", AM: "~ x ~@6", AN: "x ~@6 x", AO: "~@3 x", AP: "~@5 x ~@2", AQ: "~ x",
})).gain(0.66)

// drums · snare
const snare = s("sd").struct(`<
  ~@32 A ~ B ~ C D ~ E F ~ G H ~ I J K L A F M G N O P Q R S T U V W ~ X P ~ F ~ G H ~ I ~ R S ~@2 I ~@2 Y W ~@4 H Z AA
  AB AC AD V AE L AF X
>`.pickRestart({
  A: "~@21 x ~@10", B: "~@13 x ~@18", C: "~@5 x ~@26", D: "~@7 x", E: "~@5 x ~@2", F: "~ x", G: "~ x ~@2", H: "~@31 x",
  I: "~@23 x ~@8", J: "~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~@15", K: "~@29 x ~@2", L: "~@25 x ~@6", M: "~@3 x ~@4",
  N: "~ x ~@6", O: "x ~@6 x", P: "~@3 x", Q: "~@19 x ~@12", R: "~@15 x ~@16", S: "~@11 x ~@20", T: "~@7 x ~@24",
  U: "~@3 x ~@20 x ~@7", V: "~@3 x ~@12", W: "~@9 x ~@22", X: "x", Y: "~@17 x ~@14",
  Z: "~@9 x ~@6 x ~ x!2 ~@3 x ~@2 x ~@5", AA: "~@11 x ~@4", AB: "~@9 x ~@6", AC: "~@7 x ~@8", AD: "~@5 x ~@10",
  AE: "~@2 x ~@26 x ~@2", AF: "~@18 x ~@2 x ~@3 x ~@2 x ~@3",
})).gain(0.59)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@45 [~@23 x ~@3 x ~@2 x ~] ~@50 [~@7 x ~@3 x ~@2 x ~@17] ~>").gain(0.22)

// drums · low tom
const low_tom = s("lt").struct("<~@31 A ~@6 B ~@7 C ~@20 D E ~@6 F G ~ H ~ I ~ J ~@2 K L M ~ F ~@6 N O>".pickRestart({
  A: "x ~@3 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@9", B: "~@21 x ~@10", C: "~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~@15",
  D: "~@19 x ~@3 x ~@2 x ~@3 x ~", E: "~ x ~@3 x ~@2 x ~@23", F: "~@7 x ~@24", G: "~@27 x ~@4", H: "~@19 x ~@12",
  I: "~@11 x ~@20", J: "~@3 x ~@12", K: "~@23 x ~@8", L: "~@17 x ~@6 x ~@3 x ~@2 x", M: "~@3 x ~ x ~@10",
  N: "~@18 x ~@2 x ~@3 x ~@2 x ~@3", O: "x",
})).gain(0.59)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@45 [~@23 x ~@3 x ~@2 x ~] ~@50 [~@7 x ~@3 x ~@2 x ~@17] ~>").gain(0.22)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@31 A B C D E F G H I J K L M N O ~@15 P Q R S T U V W X Y Z AA AB AC ~ AD ~@21
>`.pickRestart({
  A: "~@25 x ~ x ~ x ~ x", B: "x ~ x ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~",
  C: "~ x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x",
  D: "~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x ~ x!2 ~",
  E: "x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x!2 ~ x ~ x ~ x!2",
  F: "~@3 x ~ x!2 ~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~ x ~ x!2 ~@3 x",
  G: "~ x!2 ~ x ~ x ~ x!2 ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~",
  H: "x ~ x!2 ~ x ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x ~ x!2",
  I: "~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2",
  J: "x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x ~",
  K: "x!2 ~ x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x",
  L: "~ x ~ x ~@2 x ~ x!2 ~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~ x ~ x!2 ~",
  M: "~@2 x ~ x!2 ~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~ x!2 ~ x ~@3 x!2",
  N: "~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x",
  O: "~ x!2 ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~@10", P: "~@13 x!2 ~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~",
  Q: "x ~ x!2 ~@3 x ~ x!2 ~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~ x ~ x!2",
  R: "~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@3 x",
  S: "x ~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~",
  T: "x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x",
  U: "~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2",
  V: "x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x!2 ~@3 x ~ x!2",
  W: "~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~ x ~ x!2 ~@3 x ~ x!2 ~ x ~ x",
  X: "~ x!2 ~@3 x ~ x!2 ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~",
  Y: "~@2 x!2 ~ x ~ x ~ x!2 ~ x ~@3 x!2 ~ x ~ x ~ x!2 ~ x ~@2 x ~ x",
  Z: "~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x",
  AA: "x ~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~",
  AB: "x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~@2 x", AC: "~ x!2 ~ x ~ x ~ x!2 ~@3 x ~@18",
  AD: "~@31 x",
})).gain(0.74)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 A ~@6 B ~@7 C D ~@19 E F ~@5 G H I ~ J ~ K L M ~@2 N O P Q R ~@7 S>".pickRestart({
  A: "x ~@3 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@9", B: "~@14 x ~@2 x ~@14", C: "~@23 x ~@2 x ~@2 x ~@2",
  D: "~ x ~@2 x ~@3 x ~@23", E: "~@19 x ~@3 x ~@2 x ~@3 x ~", F: "~ x ~@3 x ~@2 x ~@23", G: "~@29 x!2 ~",
  H: "x ~@3 x!2 ~@26", I: "~@5 x!2 ~", J: "~@9 x ~@9 x ~@12", K: "~@4 x ~@2 x ~@24", L: "~@21 x ~@4 x ~ x ~@2 x",
  M: "~ x ~@6", N: "~@23 x ~@8", O: "x ~@6 x ~@6 x ~@2 x ~@6 x ~@3 x ~@2 x", P: "~@6 x ~@3 x ~@2 x ~@18",
  Q: "~@13 x ~@2", R: "~@3 x ~@28", S: "~@7 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@7",
})).gain(0.74)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@32 A B C D E F G H I J A B K L ~@15 M D E F G N O J A B K P E Q ~ R ~@2 S T ~@17
>`.pickRestart({
  A: "~@2 x ~@6 x ~@6", B: "x ~@6 x ~@6 x ~", C: "~@9 x ~@13 x ~@8", D: "~@5 x ~@13 x ~@12", E: "~ x ~@13 x ~@13 x ~@2",
  F: "~@11 x ~@13 x ~@6", G: "~@7 x ~@13 x ~@10", H: "~@3 x ~@13 x ~@13 x", I: "~@13 x ~@12 x ~@5",
  J: "~@4 x ~@6 x ~@4", K: "~@5 x ~@6 x ~@3", L: "~@3 x ~@6 x ~@5", M: "~@23 x ~@8", N: "~@3 x ~@12 x ~@13 x ~",
  O: "~@6 x ~@6 x ~@2", P: "~@6 x ~@12 x ~@12", Q: "~@11 x ~@20", R: "~@3 x ~@27 x", S: "~@9 x ~@6", T: "~@7 x ~@8",
})).gain(0.52)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@31 A ~ B ~ C ~ D E F ~ G ~ H I ~ J K L ~@5 M N ~@5 O ~ H P ~ F ~ G ~ Q I ~ R S ~ F ~ T ~ H U C ~@2 A V O W X ~@7 Y
>`.pickRestart({
  A: "~@25 x ~@6", B: "~@17 x ~@14", C: "~@9 x ~@22", D: "~ x ~@30", E: "~@7 x ~@4 x ~@3", F: "~@5 x ~@2",
  G: "~@3 x ~@4", H: "~ x ~@6", I: "~@27 x ~@4", J: "~@23 x ~@2 x ~@2 x ~@2", K: "~ x ~@2 x ~@3 x ~@6 x ~@16",
  L: "~@11 x ~@20", M: "~@7 x ~@8", N: "~@5 x ~@10", O: "~@13 x ~@18", P: "~@7 x", Q: "~@3 x ~@28", R: "~@19 x ~@12",
  S: "~@9 x!3 ~@4", T: "~@5 x ~@10 x ~@15", U: "~@21 x ~@10", V: "x ~@6 x ~@6 x ~@17", W: "~@13 x ~@12 x ~ x ~@3",
  X: "x!2 ~@6 x ~@23", Y: "~@7 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@7",
})).gain(0.66)

// drums · crash
const crash = s("cr").struct("<~@77 [~@27 x ~@4] ~@3 [~@5 x ~@10] ~@16>").gain(0.74)

// drums · ride
const ride = s("rd").struct("<~@48 A B C D E F G H I E J K L M ~@25 N O P J K L C Q J R ~>".pickRestart({
  A: "~@25 x ~@2 x ~@3", B: "x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x",
  C: "~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~",
  D: "~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~",
  E: "~ x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@2",
  F: "~ x ~@2 x ~@3 x ~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3", G: "x ~@2 x ~@3 x ~@2 x ~@21", H: "~@24 x ~@2 x ~@3 x",
  I: "~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~",
  J: "~ x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2",
  K: "x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@2 x ~@3 x ~@2 x",
  L: "~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x", M: "~@2 x ~@3 x ~@2 x ~@22", N: "~@17 x ~@6 x ~@6 x",
  O: "~@3 x ~@12", P: "~@22 x ~@3 x ~@2 x ~@2", Q: "~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@2 x ~@2",
  R: "x!2 ~@6",
})).gain(0.44)

stack(
// … 3 more lines