Strudelify

Carol of the Bells for Percussion Ensemble

Peter Bell

KeyG majorTempo100 bpm
0:00/0:00
// Carol of the Bells for Percussion Ensemble — Peter Bell
// 100 bpm, 3/8, key G 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 (3/8 at bar 1, 12/8 at bar 68, 3/8 at bar 74, 5/8 at bar 122, ...) are rendered on a constant 3/8 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5452056; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 224 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/1.5)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · glockenspiel
const glockenspiel = note(`<
  ~@13 A@3 ~@2 A@3 ~@6 B C ~@3 B C ~@6 D@2 ~@3 D@2 E F@4 G@4 ~@2 H@4 I J@2 K@2 ~@23 L M L M L M N O P Q R S T U N O L M
  N V L M N W ~ L X Y Z AA AB AC ~@3 AD AE AF ~@3 AG AH AI AJ ~@2 AK@2 ~@5 AL ~@7 AL ~@7 AL ~@16 AK@3 AM ~ AK AN AO ~
  AK@2 AM ~ AK AN AO ~@4 AK@2 AP AQ AR AS ~@3 AT AU AV AW ~@3 AD AE AF AX ~ AY AZ BA BB BC BD
>`.pickRestart({
  A: "[~@11 g6@9 f#6@4 g6@4 e6@9 ~@11]/3", B: "g6@9 f#6@4 g6@3", C: "~@2 e6@9 ~@5", D: "[~@5 g6@9 f#6@4 ~ g6@4 e6@9]/2",
  E: "b6@9 b6@7", F: "[~@2 b6@9 b6@9 b6@8 b6@9 b6@9 d7@9 g6@4 ~ a6@4]/4", G: "[b6@27 g6@9 f#6@4 g6@4 e6@9 ~@11]/4",
  H: "[~@11 g6@9 f#6@4 g6@4 e6@9 c7@9 c7@9 c7@9]/4", I: "c7@4 b6@4 ~ b6@7", J: "[~@2 b6@4 b6@4 ~ d7@9 d7@8 b6@4]/2",
  K: "[~ a6@4 g6@27]/2", L: "~@11 b6@5", M: "a6@3 b6@2 g6@5 ~@6", N: "~@11 e6@5", O: "f#6@5 g6@5 ~@6", P: "~@11 c7@5",
  Q: "b6@3 c7@2 a6@5 ~@6", R: "~@11 f#6@5", S: "e6@5 d6@5 ~@6", T: "~@11 a6@5", U: "g6@3 a6@2 f#6@5 ~@6",
  V: "f#6@5 d6@5 ~@6", W: "e6@5 e6@5 ~@6", X: "a6@3 b6@2 g6@5 ~ b6@5", Y: "a6@3 b6@2 g6@5 ~ e7@5",
  Z: "e7@3 e7@2 d7@3 c7@3 b6@5", AA: "b6@3 b6@2 a6@3 g6@3 a6@5", AB: "a6@3 a6@2 b6@3 a6@3 e6@5",
  AC: "e6@3 e6@2 e6@5 ~@6", AD: "b5@3 c#6@2 d6@3 e6@3 f#6@2 g6@3", AE: "a6@3 b6@3 ~@2 b6@3 c7@2 b6@3",
  AF: "a6@3 b6@2 a6@3 g6@3 f#6@5", AG: "~@11 b5@2 c#6@3", AH: "d6@3 e6@2 f#6@3 g6@3 a6@2 b6@3",
  AI: "~@3 b6@2 c7@3 b6@3 a6@2 b6@3", AJ: "a6@3 g6@2 f#6@5 ~ e6@5", AK: "b6@5 a6@3 b6@3 g6@5", AL: "[b6,e7]",
  AM: "g6!2 ~ g6!3 ~ g6!3 ~ g6!3 ~ g6", AN: "g6@5 f#6@3 g6@3 e6@5", AO: "e6!2 ~ e6!3 ~ e6!3 ~ e6!3 ~ e6",
  AP: "e7@5 e7@3 e7@3 d7@2 c7@3", AQ: "b6@5 b6@3 b6@3 a6@2 g6@3", AR: "a6@5 a6@3 a6@3 b6@2 a6@3",
  AS: "e6@5 e6@3 e6@3 e6@5", AT: "~@5 b5@3 c#6@3 d6@2 e6@3", AU: "f#6@3 g6@2 a6@3 b6@3 ~@2 b6@3",
  AV: "c7@3 b6@2 a6@3 b6@3 a6@2 g6@3", AW: "f#6@5 ~@11", AX: "e6@5 ~@11", AY: "~@5 b6@5 ~ a6@2 b6@3",
  AZ: "g6@5 b6@5 ~ a6@2 b6@3", BA: "g6@5 c7@5 ~@6", BB: "~@5 d7@5 ~@6", BC: "~@5 e6 ~ e6!3 ~ e6!3 ~ e6",
  BD: "e6!2 ~ e6!2 e7@5 ~@6",
})).s("gm_glockenspiel").gain(0.48)

// other · xylophone
const xylophone = note(`<
  ~@17 A B@3 ~@9 C@2 A D@4 E F@3 ~@2 G@4 H I@4 H J ~@3 A K@4 E L@4 ~@14 M N M N M N M N M O@6 P Q R@3 S T@3 U O@2 V W N
  M V X ~ M O Y Z AA AB AC AD AE ~ AF AG ~ AH AI ~ AJ AD AK AL AM@36 ~ AM ~ AM@5 AN AO AM@2 AP AQ AM@2 AN AO AM@2 AP AQ
  ~@4 AM@2 AR AS AT AU AF AV ~ AH AW ~ AJ AD AE ~ AF AX AY AZ@4 X BA BB BC
>`.pickRestart({
  A: "g6@9 f#6@4 g6@3", B: "[~@2 e6@9 g6@9 f#6@4 g6@4 e6@9 ~@11]/3", C: "[~@5 g6@9 f#6@4 ~ g6@4 e6@9]/2",
  D: "[~@2 e6@9 c6@9 c6@4 c6@4 c6@9 a5@9 a5@4 ~ a5@4 a5@9]/4", E: "a5@9 a5@4 a5@3",
  F: "[~@2 a5@9 b5@9 b5@4 b5@4 b5@9 ~@11]/3", G: "[~@11 g6@9 f#6@4 g6@4 e6@9 g6@9 f#6@4 ~ g6@4 e6@9]/4",
  H: "e6@9 e6@4 e6@3", I: "[~@2 e6@9 e6@9 e6@4 e6@4 e6@9 e6@9 e6@4 ~ e6@4 e6@9]/4", J: "~@2 e6@9 ~@5",
  K: "[~@2 e6@9 g6@9 f#6@4 g6@4 e6@9 c6@9 c6@4 ~ c6@4 c6@9]/4",
  L: "[~@2 a5@9 a5@9 a5@4 a5@4 a5@9 b5@9 b5@4 ~ b5@4 b5@9]/4", M: "~@11 g5@5", N: "f#5@3 g5@2 e5@5 ~@6",
  O: "f#5@3 g5@2 e5@5 ~ g5@5", P: "f#5@3 g5@2 e5@5 ~ f#5@5", Q: "g5@5 a5@5 ~ a5@5", R: "g5@3 a5@2 f#5@5 ~ a5@5",
  S: "g5@5 f#5@5 ~ f#5@5", T: "e5@3 f#5@2 d5@5 ~ f#5@5", U: "g5@5 a5@5 ~ g5@5", V: "f#5@3 g5@2 e5@5 ~ e5@5",
  W: "f#5@5 d5@5 ~ g5@5", X: "e5@5 e5@5 ~@6", Y: "f#5@3 g5@2 e5@5 ~ e6@5", Z: "e6@3 e6@2 d6@3 c6@3 b5@5",
  AA: "b5@3 b5@2 a5@3 g5@3 a5@5", AB: "a5@3 a5@2 b5@3 a5@3 e5@5", AC: "e5@3 e5@2 e5@5 ~ b4@2 c#5@3",
  AD: "d5@3 e5@2 f#5@3 g5@3 a5@2 b5@3", AE: "a5@3 ~@13", AF: "b4@3 c#5@2 d5@3 e5@3 f#5@2 g5@3", AG: "a5@3 b5@3 ~@10",
  AH: "~@5 b4@3 c#5@3 d5@2 e5@3", AI: "f#5@3 g5@2 a5@3 b5@3 a5@3 ~@2", AJ: "~@11 b4@2 c#5@3",
  AK: "~@3 b5@2 c6@3 b5@3 a5@2 b5@3", AL: "a5@3 g5@2 f#5@5 ~ e5@5", AM: "g5@5 f#5@3 g5@3 e5@5",
  AN: "b6@5 a6@3 b6@3 g6@5", AO: "g6!2 ~ g6!3 ~ g6!3 ~ g6!3 ~ g6", AP: "g6@5 f#6@3 g6@3 e6@5",
  AQ: "e6!2 ~ e6!3 ~ e6!3 ~ e6!3 ~ e6", AR: "e6@5 e6@3 e6@3 d6@2 c6@3", AS: "b5@5 b5@3 b5@3 a5@2 g5@3",
  AT: "a5@5 a5@3 a5@3 b5@2 a5@3", AU: "e5@5 e5@3 e5@3 e5@5", AV: "a5@3 b5@2 a5@3 ~@8", AW: "f#5@3 g5@2 a5@3 b5@3 ~@5",
  AX: "a5@3 b5@3 ~@2 b5@3 c6@2 b5@3", AY: "a5@3 b5@2 a5@3 g5@3 f#5@5", AZ: "e5@5 g5@5 ~ f#5@2 g5@3",
  BA: "~@5 f#5@5 ~@6", BB: "~@5 e5 ~ e5!3 ~ e5!3 ~ e5", BC: "e5!2 ~ e5!2 g5@5 ~@6",
})).s("gm_xylophone").gain(0.48)

// other · tubular bells
const tubular_bells = note(`<
  ~@19 A@3 B C@4 D ~@5 E@4 F G@4 ~@4 H D I@4 D J@2 ~@4 K@3 L M@4 N@5 O@2 ~@11 P@6 ~@24 Q@4 ~@2 R@2 S@2 T@3 S@2 U@3 V@2
  ~@7 W X Y Z AA AB ~@10 W X Y Z AA AB ~@15 AC AD ~@2 AC ~@3 AC ~@3 AC ~@5 AE@3 ~@3 T@3 S@2 T@3 S@2 AF@3 ~@6 AG@2
>`.pickRestart({
  A: "[~@4 e4@3 e4@6 b4@3]/3", B: "b4", C: "[~@2 a4@9 g4@17 f#4@9 e4@18 d4@9]/4", D: "e4",
  E: "[~@2 d4@9 c4@17 g4@9 g4@18 g4@9]/4", F: "a4", G: "[~@2 b4@9 a4@17 f#4@9 e4@18 ~@9]/4", H: "~@7 e4@9",
  I: "[~@2 b4@9 b4@17 a4@9 g4@18 f#4@9]/4", J: "[~@2 d4@9 e4@18 ~@3]/2", K: "[~@4 d4@3 c4@6 g4@3]/3", L: "g4",
  M: "[~@2 g4@9 a4@17 b4@9 a4@18 f#4@9]/4", N: "[e4@27 e4@26 e4@27]/5", O: "[e4@27 ~@5]/2",
  P: "[~@5 e4@5 ~ e4@10 b4@5 ~ b4@10 a4@5 ~ g4@10 f#4@5 ~ e4@10 d4@5 ~ e4@11 ~@10]/6",
  Q: "[~@11 e5@16 e5@16 e5@16 ~@5]/4", R: "[~@11 b4@21]/2", S: "[~@5 b4@21 ~@6]/2", T: "[b4@7 ~@2 b4@7]/3",
  U: "[b4@7 ~@2 c5@7]/3", V: "[~@5 d5@21 ~@6]/2", W: "~@11 e4@5", X: "e4@11 b4@5", Y: "b4@11 a4@5", Z: "g4@11 f#4@5",
  AA: "e4@11 d4@5", AB: "e4@11 ~@5", AC: "g4@5 f#4@3 g4@3 e4@5", AD: "e4@5 ~@11", AE: "e5", AF: "[c5@7 ~@2 d5@7]/3",
  AG: "[~@5 e4@16 e4@5 ~@6]/2",
})).s("gm_tubular_bells").gain(0.48)

// other · distortion guitar · "Electric Guitar [Tablature]"
const distortion_guitar = note(`<
  ~@121 A@2 B@2 C@3 B@2 D@3 E@2 ~@4 F@2 G@2 H@4 F@2 I@2 J@4 K L@2 M N O@2 P K I@2 Q R S T M@2 ~ M ~ M@4 ~ U V M W ~ X W
  ~ U V M W ~ X W ~@8 C@3 B@2 C@3 B@2 Y@3 ~@6 Z@2
>`.pickRestart({
  A: "[~@11 b3@21]/2", B: "[~@5 b3@21 ~@6]/2", C: "[b3@7 ~@2 b3@7]/3", D: "[b3@7 ~@2 c4@7]/3", E: "[~@5 d4@21 ~@6]/2",
  F: "e3/2", G: "f#3/2", H: "c3/4", I: "b3/2", J: "[a3@59 b3@5]/4", K: "c4@5 g3@5 ~ c4@5", L: "e4/2", M: "f#4",
  N: "f#4@11 g4@2 f#4@3", O: "[e4@27 ~@5]/2", P: "~@11 b3@5", Q: "a3", R: "b3", S: "c4", T: "d4", U: "e4", V: "b4",
  W: "g4", X: "a4", Y: "[c4@7 ~@2 d4@7]/3", Z: "[~@5 e4@16 ~@6 e5@5]/2",
})).s("gm_distortion_guitar").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@73 A@3 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B D ~ A B E ~@2 A F ~ D A G C G E ~ G
  C ~ H A ~@2 I J H A I A H A I J H A I A H A I J H A I A H A I J H A I A H A I J ~ K ~ K@3 I J G H I H G H I H G H I H
  G H I H ~@2 I J ~@3 L G A ~ E A E C ~ D A G D G@2 ~ M C E D@3
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@3 x ~@7 x ~@4", C: "~@5 x ~@5 x ~@4", D: "~@5 x ~@10", E: "x ~@4 x ~@10",
  F: "x ~@2 x ~ x ~@5 x ~@4", G: "x", H: "x ~@10 x ~@4", I: "x!2", J: "x ~@4 x ~@5 x ~@4", K: "x ~@7 x ~@2 x ~@4",
  L: "x ~@4 x ~@2 x ~@2 x ~@4", M: "~@5 x ~@7 x ~@2",
})).gain(0.48)

// drums · rim
const rim = s("rim").struct(`<
  ~@74 A ~ A ~ A ~@2 B A ~ A ~ A ~@2 B A ~@2 B A ~ A ~ A ~@2 B A ~ A ~ A ~@2 B A ~ A ~@67 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B
  ~@27 C ~
>`.pickRestart({
  A: "~@11 x ~@4", B: "x", C: "~@5 x ~@10",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  ~@73 A B C D E B C F G B C D E B C F G B C F G B C D E B C F G B C D E B C F G B C D B ~ H I J ~@2 K L M N O P E Q R S
  P L M N O ~@2 T U ~ V ~ W ~ V T O ~ V ~ W ~ V T O ~ V ~ W ~ V T O ~ V ~ W ~ V T O ~ T ~ T@4 O X Y T Y X Y T Y X Y T Y
  X Y T Y ~@2 T O ~@3 Z P E Q R S P L M N O P E Q X ~ AA AB J AC AD AE
>`.pickRestart({
  A: "~@11 x!3 ~ x", B: "x!2 ~ x!3 ~@2 x ~@7", C: "x!2 ~ x!3 ~@2 x ~@2 x ~ x ~@2", D: "~@3 x ~@4 x ~@7",
  E: "x!2 ~ x!3 ~@2 x ~@2 x!3 ~ x", F: "~@3 x ~@4 x ~@2 x ~@4", G: "~@5 x ~@5 x!3 ~ x", H: "~@11 x ~ x ~@2",
  I: "~@3 x ~@4 x ~@2 x ~ x ~@2", J: "x ~@2 x ~ x ~@10", K: "~@11 x ~@4", L: "x ~@2 x ~ x ~@5 x!3 ~ x",
  M: "x ~@4 x ~@2 x ~@2 x!3 ~ x", N: "x ~@2 x ~ x ~ x!3 ~ x ~@4", O: "x ~@2 x ~ x ~@2 x ~@2 x ~@4",
  P: "x!2 ~ x!3 ~@5 x ~ x ~@2", Q: "x ~@4 x ~@2 x ~@2 x ~ x ~@2", R: "x ~@4 x ~ x!3 ~ x ~@4",
  S: "x ~@2 x ~ x ~ x!3 ~ x ~ x ~@2", T: "x ~@2 x ~@4 x ~@4 x ~@2", U: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", V: "x!2",
  W: "x ~@4 x ~@2 x ~@7", X: "x", Y: "x ~@4 x ~ x!3 ~ x ~ x ~@2", Z: "x ~@4 x ~@2 x ~@2 x ~@4",
  AA: "~@5 x ~@2 x ~@4 x ~@2", AB: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2", AC: "~@5 x ~@10", AD: "~@5 x ~ x!3 ~ x!3 ~ x",
  AE: "x!2 ~ x!3 ~@10",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@121 [~@11 x ~@4] [x ~@4 x ~@5 x ~@4]!13 ~@68 [x ~@4 x ~@5 x ~@4]!13 x ~@7>").gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@73 A B C D B@2 C D E B C D B@2 C D E B C D E B C D B@2 C D E B C D B@2 C D E B C D F ~ G H I ~@2 A J G K L M N O P Q
  R J Q S T ~@2 U B ~@6 U B ~@6 U B ~@6 U B ~@6 U B ~ U ~ U@4 B R O U O R O U O R O U O R O U O ~@2 U B ~@3 V R W G P B
  N J G K L M X Y R ~ Q Z P AA AB AC
>`.pickRestart({
  A: "~@11 x ~@4", B: "x ~@2 x ~ x ~@2 x ~@2 x ~@4", C: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", D: "~@3 x ~@4 x ~@2 x ~@4",
  E: "x ~@4 x ~@5 x ~@4", F: "x ~@2 x ~ x ~@2 x ~@7", G: "~@11 x ~ x ~@2", H: "~@3 x ~@4 x ~@2 x ~ x ~@2",
  I: "x ~@2 x ~ x ~@10", J: "x ~@2 x ~ x ~@5 x ~@4", K: "~@3 x ~ x ~@10", L: "~@5 x ~@2 x ~@2 x ~@4",
  M: "x ~@10 x ~ x ~@2", N: "x ~@2 x ~ x ~@5 x ~ x ~@2", O: "x ~@4 x ~@2 x ~@2 x ~ x ~@2", P: "x ~@4 x ~@10",
  Q: "~@5 x ~@2 x ~@4 x ~@2", R: "x", S: "x ~@7 x ~@2 x ~@4", T: "~@3 x ~ x ~@2 x ~@2 x ~@4",
  U: "x ~@2 x ~@4 x ~@4 x ~@2", V: "x ~@4 x ~@2 x ~@2 x ~@4", W: "x ~@2 x ~@4 x ~@2 x ~@4", X: "~@3 x ~ x ~@7 x ~@2",
  Y: "x ~@7 x ~@2 x ~ x ~@2", Z: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2", AA: "~@5 x ~@10", AB: "~@5 x ~ x!3 ~ x!3 ~ x",
  AC: "x!2 ~ x!3 ~@10",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@139 A@32 ~ A ~ A@5 B A@3 B A@3 B A@3 B A@3 ~@25 C@2 ~ C>".pickRestart({
  A: "x ~@4 x ~@5 x ~@4", B: "x", C: "~@5 x ~@10",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@121 A B C D E C B C D E C B C D ~@2 F G ~@6 F G ~@6 F G ~@6 F G ~@6 F G ~ F ~ F@4 G H I F G H I F G H I F G H I F G
  ~@8 E C B C D E C B C D E C B H ~ J K L M@3
>`.pickRestart({
  A: "~@11 x ~@4", B: "x ~@4 x ~@2 x ~@2 x ~@4", C: "x ~@4 x ~@5 x ~@4", D: "x ~@2 x ~ x ~@5 x ~@4",
  E: "x ~@4 x ~@5 x ~ x ~@2", F: "x ~@2 x ~@4 x ~@4 x ~@2", G: "x ~@2 x ~ x ~@2 x ~@2 x ~@4", H: "x",
  I: "x ~@2 x ~ x ~@5 x ~ x ~@2", J: "~@5 x ~@2 x ~@4 x ~@2", K: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2", L: "x ~@4 x ~@10",
  M: "~@5 x ~@10",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@69 A B A B C ~@42 D E ~@4 F ~ G H ~ G ~ G H ~ F H ~@3 I D ~@6 J K ~@6 J K ~@6 J K ~@6 J K ~@6 I D ~@6 I D ~@10 I D
  ~@4 H ~ F ~ G F ~ F ~ G H ~ G ~@2 L D M ~@3
>`.pickRestart({
  A: "x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~", C: "x ~ x ~ x ~@6 x ~@4",
  D: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", E: "x!2 ~ x!3 ~ x!3 ~@6", F: "~@5 x ~@10", G: "x", H: "~@11 x ~@4",
  I: "~@5 x ~ x!3 ~ x!3 ~ x", J: "x ~@7 x ~@4 x ~@2", K: "x ~@10 x ~@4", L: "~@11 x!3 ~ x", M: "x!2 ~ x!2 ~@11",
})).gain(0.64)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@67 A B ~@46 C ~@21 D ~@39 D ~@7 D ~@7 E@2 ~@2 D ~@20 F ~ G@2 H I>".pickRestart({
  A: "x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~", C: "~@11 x!3 ~ x", D: "x!2 ~ x!2 ~@11",
  E: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", F: "~@5 x ~ x!3 ~@6", G: "~@5 x ~@10", H: "~@5 x ~ x!3 ~ x!3 ~ x",
  I: "x!2 ~ x!3 ~@10",
})).gain(0.32)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@121 A B C D E F B C D E F B C D ~@2 G H ~@6 G H ~@6 G H ~@6 G H ~@6 G H ~ G ~ G@4 H I F G H I F G H I F G H I F G H
  ~@8 E F B C D E F B C D E F B I ~ J K L M@3
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~@4", C: "x!2", D: "~@5 x ~@5 x ~@4", E: "~@3 x ~@12", F: "x ~@4 x ~@7 x ~@2",
  G: "x ~@2 x ~@4 x ~@4 x ~@2", H: "x ~@2 x ~ x ~@2 x ~@2 x ~@4", I: "x", J: "~@5 x ~@2 x ~@4 x ~@2",
  K: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2", L: "x ~@4 x ~@10", M: "~@5 x ~@10",
})).gain(2.35)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  A ~@72 B ~@48 C B ~ A ~ B@2 ~ A ~ C A@2 ~@45 A ~@3 A ~@3 A ~@3 A ~ A ~@8 A ~ C B ~@2 C@2 B ~ A B@2 ~@7 A
>`.pickRestart({
  A: "~@5 x ~@10", B: "~@11 x ~@4", C: "x",
})).gain(0.93)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  ~@83 A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@7 B C D E F@2 C D E F@2 C ~@4 G H ~@6 G H ~@6 G H ~@6 G H
  ~@6 G H ~ G ~ G@4 H ~ F G H ~ F G H ~ F G H ~ F G H ~@8 F@2 C D E F@2 C D E F A ~@3 I C A ~ D ~
>`.pickRestart({
  A: "x", B: "~@11 x ~@4", C: "~@5 x ~@5 x ~@4", D: "~@5 x ~@10", E: "x ~@4 x ~@10", F: "x ~@10 x ~@4", G: "x!2",
// … 18 more lines