Strudelify

Piano Sonata No.30 Op.109

Ludwig van Beethoven

KeyG majorTempo258 bpm
0:00/0:00
// Piano Sonata No.30 Op.109 — Ludwig van Beethoven
// 258 bpm, 6/8, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/2596481; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 177 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(258/3)

// 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 · overdriven guitar · "Rhythm Guitar"
const overdriven_guitar = note(`<
  A B C D E F G H I J K L I J K L M N O@2 M N P@2 Q R S T ~ U V W@4 X Y Z@2 AA AB AC AD AE AF AG AH AI AJ AK AL AM AL AM
  AN AO AP@2 AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BF BM BN BO BP@2 BQ@2 BR BS BT BU@3 BV
  BW@7 BX BY BZ@8 CA@8 CB CC CD@2 ~@3 CE CF CG@5 CH@8 CI CJ@2 CK@2 CL@2 CM@8 CN CO CP@2 CQ@5 CR CS CT ~ CU@6 CV
>`.pickRestart({
  A: "[e3,b3,e4]", B: "[d3,b3,d4]", C: "[c3,e3,c4] [c3,e3,c4,c5]", D: "[b2,f#3,b3,f#4]", E: "[a2,e3,a3]",
  F: "[g2,e3,g3]", G: "[e3,b3,e4,e5] [b2,f#3,b3,d#5]", H: "[e3,b3,e4]@5 ~@11", I: "~@3 f#3@2 g3@3 a3@8",
  J: "~@3 g3@2 a3@3 b3@8", K: "[a3,f#4] [a#3,g4]", L: "[b3,f#4] [e3,g4]", M: "~@3 [f#3,f#4]@2 [g3,e4]@3 [a3,d#4]@5 ~@3",
  N: "~@3 [g3,g4]@2 [a3,f#4]@3 [b3,e4]@5 ~@3", O: "[~@19 f#4@5 [e3,g4]@8, a3 a#3 b3 ~, ~@3 f#4@8 g4@8 ~@13]/2",
  P: "[~@19 f#4@5 [e3,g4]@5 ~@3, a3 a#3 b3 ~, ~@3 f#4@8 g4@8 ~@13]/2", Q: "g3@5 f#3@3 d#3@5 e3@3", R: "b2@8 b2@5 b2@3",
  S: "b2@8 a2@5 b2@3", T: "c3 b2", U: "~@5 [f#4,a4]@3 [e4,g4]@5 [d#4,f#4]@3",
  V: "[e4,g4]@5 [d4,f#4]@3 [c#4,e4]@5 [b3,d4]@3", // Em D C#m Bm
  W: "[a#3@5 g3@3 f#3@5 f3@3 ~@3 f#4@2 a#4@3 a#3@3 b3@2 c#4@3 ~@3 f#4@2 b4@3 ~@3 c#4@2 d4@3 ~@8 a#4@5 b4@3, c#4@8 b4@11 ~@5 f#4@11 ~@5 f#4@16 ~@8, ~@16 f#3@8 ~@8 b3@11 ~@21]/4",
  X: "c#5@3 f#4@13", Y: "[f#3,c#5]@3 [a#3,a#4]@2 c#4@3 a#3@3 b3@2 c#4@3, ~@5 f#4@11",
  Z: "[[f#3,d5]@3 [b3,b4]@2 d4@3 b3@3 c#4@2 d4@3 f#3@3 c#4@2 d4@3 f#3@3 e4@2 d4@3, ~@5 f#4@16 ~@11]/2", // D B
  AA: "f#3@3 e4@2 f#4@3 f#3@3 g4@2 f#4@3", AB: "f#3@3 g4@2 a#4@3 [b3,f#4,b4]@3 b3@2 a#4@3",
  AC: "[b3,f#4,b4]@3 b3@2 a#4@3 [b3,f#4,b4]@5 f#5@3", AD: "f5@5 g#3@3 c#3@3 d#3@2 f3@3",
  AE: "c#3@3 a3@2 f#3@3 c3@3 f#3@2 d#3@3", AF: "b2@3 d#3@2 f#3@3 b2@3 c#3@2 d#3@3",
  AG: "b2@3 g3@2 e3@3 a#2@3 e3@2 c#3@3", AH: "a2@3 c#3@2 e3@3 a2@3 b2@2 c#3@3", AI: "a2@3 f3@2 d3@3 g#2@3 d3@2 b2@3",
  AJ: "g2@3 a2@2 b2@3 c3@3 d3@2 b2@3", AK: "g2@3 c3@2 e3@3 g2@3 b2@2 d3@3", AL: "f2@3 g2@2 b2@3 d3@3 b2@2 g2@3",
  AM: "e2@3 g2@2 c3@3 e3@3 c3@2 g2@3", AN: "b3@3 d4@2 c4@3 b3@3 a#3@2 b3@3", AO: "d4@3 b3@2 f#3@3 c#4@3 a#3@2 f#3@3",
  AP: "[c#3,f#3]@5 ~@3 [c#3,f#3]@5 ~@3", AQ: "[d3,f#3,d4] [c#3,f#3,c#4]",
  AR: "[b2,f#3,b3]@8 [a2,f#3,a3]@5 [b2,g3,b3]@3", AS: "[f#2,c#3,f#3,c#4]@3 g#2@2 a#2@3 b2@3 c#3@2 d3@3",
  AT: "e3@3 f#3@2 g#3@3 a#3@3 b3@2 c#4@3", AU: "d4@3 e4@2 f#4@3 g#4@3 a4@2 a#4@3",
  AV: "b4@3 a#4@2 b4@3 c#5@3 d5@2 e5@3", AW: "[f#4,f#5]@5 ~@3 [f#3,c#4,f#4]@5 ~@3", AX: "[f#3,b3,f#4]",
  AY: "[f#3,a3,f#4]", AZ: "[g3,b3,g4]@3 g3@2 g3@3 [e3,e4]@3 e3@2 e3@3", BA: "[f#3,f#4]@3 f#3@2 f#3@3 f#3@3 c#4@2 f#4@3",
  BB: "b4", BC: "a4", BD: "g4 e4", BE: "f#4", BF: "e4", BG: "d4", BH: "c4 a3", BI: "b3", BJ: "a3", BK: "g3",
  BL: "f3 d3", BM: "g#3", BN: "g3 e4", BO: "g#4 f4", BP: "[~ c5@2 b4]/2", BQ: "[b3 d4@2 c4]/2", BR: "~ f4", BS: "e4 c5",
  BT: "[d4,f4] [b3,d4]", BU: "[c4 f#4@2 e4@2 d#4]/3", BV: "b3!2",
  BW: "[a#3@20 [g4,b4]@16 [f#4,a4]@16 [e4,b4]@8 [g4,b4]@8 [f#4,a#4]@16 [g4,b4]@8 [e4,b4]@8 [f#4,a#4]@5 ~@7]/7", // G F#m E5 G F# G E5 F#
  BX: "~@4 [f#4,b4]@5 ~@7", BY: "~@4 [f#4,a#4]@5 ~@7",
  BZ: "[~ [e3,b3,e4]@4 [d3,b3,d4]@4 [c3,e3,c4]@2 [c3,e3,c4,c5]@2 [b2,f#3,b3,f#4]@4 [a2,e3,a3]@4 [g2,e3,g3]@4 [e3,b3,e4,e5]@2 [b2,f#3,b3,d#5]@2 [e3,b3,e4]@3]/8", // E5 G C B5 A5 C E5 B …
  CA: "[~@4 [d3,b3,d4]@16 [c3,e3,c4]@8 [c3,e3,c4]@8 [b2,f#3,b3]@16 [a2,e3,a3]@16 [g2,e3,g3]@16 [e3,b3,e4]@8 [b2,f#3,b3]@8 [e3,b3,e4]@8 [b2,d3,b3]@8 [c3,g3,c4]@5 ~@7]/8", // G C B5 A5 C E5 B5 E5 …
  CB: "~@9 [d4,f4]@3 [c4,e4]@4", CC: "~ [b3,d4]@3 [c4,e4]@5 [b3,d4]@3 [a3,c4]@4",
  CD: "[~ [g3,b3,d4]@3 [f#3,c4,d#4]@8 [g3,b3,d4]@8 ~@12]/2", CE: "~@4 c5@5 b4@3 g#4@4", CF: "~ a4@3 a4@8 a4@4",
  CG: "[~ a4@3 a4@32 ~@3 b4@2 d#5@3 d#4@3 e4@2 f#4@3 ~@3 b4@2 e5@3 ~@3 f#4@2 g4@3 b3@3 f#4@2 g4@3 [b3,d#5]@3 a4, ~@44 b4@11 ~@5 b4@16 ~@4, ~@52 e4@11 ~@17]/5", // B
  CH: "[~ [g4,e5]@3 [b3,f#5]@3 f#4@2 e4@3 b3@3 d#4@2 e4@3 [b3,f#5]@3 [d#4,d#5]@2 f#4@3 d#4@3 e4@2 f#4@3 [b3,g5]@3 [e4,e5]@2 g4@3 e4@3 f#4@2 g4@3 b3@3 f#4@2 g4@3 b3@3 a4@2 [g4,e5]@3 [b3,f#5]@3 f#4@2 e4@3 b3@3 d#4@2 e4@3 b3@3 f#4@2 g4@3 b3@3 a4@2 g4@3 b3@3 a4@2 b4@3 b3@3 c5@2 b4@3 b3@3 c5@2 d#5@3 [e4,b4,e5]@3 e4, ~@7 b4@13 ~@5 b4@11 ~@5 b4@19 d#5@5 ~@6 b4@19 ~@38]/8", // C B5 D# Em E C B5 E5
  CI: "~ d#5@3 [e4,b4,e5]@3 e4@2 d#5@3 [e4,b4,e5]@4", CJ: "[~ b4@3 a#4@5 g4@5 ~ f#4@2 e4@3 e4@5 c#4@3 d4@4]/2",
  CK: "[~ f5@8 f4@5 ~ e4@2 d4@3 d4@5 b3@3 c4@4]/2", CL: "[~ d#5@8 d#4@5 ~ d4@2 c4@3 c4@5 a3@3 a#3@4]/2",
  CM: "[~ a#5@3 c3@3 d3@2 e3@3 f3@3 g3@2 e3@3 c3@3 f3@2 a3@3 c3@3 e3@2 g3@3 a#2@3 c3@2 e3@3 g3@3 e3@2 c3@3 a2@3 c3@2 f3@3 a3@3 f3@2 c3@3 a#2@3 c3@2 e3@3 g3@3 e3@2 c3@3 a2@3 c3@2 f3@3 a3@3 f3@2 c3@3 e3@3 g3@2 f3@3 e3@3 d#3@2 e3@3 g3@3 f#3@2 e3@3 d#3@3 e3]/8",
  CN: "~ f#3@3 [f#2,b2]@5 ~@3 [f#2,b2]@4", CO: "~@4 [f#2,b2]@5 ~@3 [f#2,b2]@4",
  CP: "[~ [g2,b2,g3]@2 [f#2,b2,f#3]@2 [e2,b2,e3]@2 [b2,d3]]/2", // G B5 E5 Bm
  CQ: "[~ [e2,c3,e3]@3 [f#2,b2,f#3]@3 ~@5 e2@3 f#2@2 g2@3 a2@3 b2@2 c#3@3 d#3@3 e3@2 f#3@3 g3@3 a3@2 b3@3 c#4@3 d4@2 d#4@3 e4@3 d#4@2 e4@3 f#4@3 g4@2 a4@3 [b3,b4]@5 ~@3 [b2,f#3,b3]@4]/5", // C B5 B B5
  CR: "~@4 [e3,b3,e4]@5 ~@7", CS: "~@4 [a3,d#4]@5 ~@3 [a3,d#4]@4", CT: "~@4 g3@5 ~@7",
  CU: "[~@4 b4@8 b4@8 b4@8 a4@8 [g4,e5]@8 [g4,e5]@8 [e5,g5]@8 [e5,g5]@8 [c5,e5]@8 [b4,e5]@8 [a4,e5]@5 ~@3 [f#4,d#5]@4]/6", // C Em C E5 A5 D#m
  CV: "~@4 [g4,e5]@5 ~@7", // C
})).s("gm_overdriven_guitar").gain(0.22)

// bass · electric bass pick · "Bass Guitar"
const bass = note(`<
  A B C D E F G H I@2 J@2 I@2 J@2 I@2 J@2 I@2 K@2 L M N O P ~@2 Q R@2 S T R@2 S U V W X Y Z AA AB AC AD AE AF AG AF AG
  AH AI AJ@2 AK AL AM AN AO ~ AP D E AQ AR AS@9 AT@4 AU AV AW AX AY AZ BA BB BC BD AG BE BF BG@2 ~@7 BH@8 BI@8 ~@3 BJ BK
  BL@8 BM@2 BN@3 BM@3 BO BP BQ@6 BR@6 BS@3 BT BU@2 BV@4 BW BX BY BZ CA@7 CB
>`.pickRestart({
  A: "[e2,e3]", B: "[d2,d3]", C: "[c2,c3] [a1,a2]", D: "[b1,b2]", E: "[a1,a2]", F: "[g1,g2]", G: "[f#1,f#2] [b1,b2]",
  H: "[e2,e3]@5 ~@11", I: "b2", J: "b2/2", K: "[b2@24 e2@5 ~@3]/2", L: "g2@5 f#2@3 d#2@5 e2@3", M: "b1@8 b1@5 b1@3",
  N: "b1@8 a1@5 b1@3", O: "c2 b1", P: "e2@5 ~@11", Q: "a#3@5 g3@3 f#3@5 f3@3", R: "f#3",
  S: "f#3@3 c#4@2 d4@3 f#3@3 e4@2 d4@3", T: "f#3@3 c#4@2 b3@3 f#3@3 a#3@2 b3@3", U: "f#3@3 ~@5 f#3@3 ~@5",
  V: "f#3@3 ~@13", W: "~@13 b2@3", X: "c#3@3 f3@2 g#3@3 c#3@3 d#3@2 f3@3", Y: "c#3@3 a3@2 f#3@3 c3@3 f#3@2 d#3@3",
  Z: "b2@3 d#3@2 f#3@3 b2@3 c#3@2 d#3@3", AA: "b2@3 g3@2 e3@3 a#2@3 e3@2 c#3@3", AB: "a2@3 c#3@2 e3@3 a2@3 b2@2 c#3@3",
  AC: "a2@3 f3@2 d3@3 g#2@3 d3@2 b2@3", AD: "g2", AE: "g2 f2", AF: "f2", AG: "e2", AH: "[f1,f2]", AI: "[f#1,f#2]",
  AJ: "[f#2,f#3]@5 ~@3 [f#2,f#3]@5 ~@3", AK: "[d2,d3] [c#2,c#3]", AL: "[b1,b2]@8 [a1,a2]@5 [g1,g2]@3",
  AM: "[f#1,f#2]@3 g#2@2 a#2@3 b2@3 c#3@2 d3@3", AN: "e3@3 f#3@2 g#3@3 a#3@3 b3@2 c#4@3", AO: "d4@3 ~@13",
  AP: "~@8 [f#2,f#3]@5 ~@3", AQ: "[g1,g2] e2", AR: "f#2@8 g#2@5 a#2@3", AS: "b1@3 b2@2 b1@3 b2@3 b1@2 b2@3",
  AT: "c2@3 c3@2 c2@3 c3@3 c2@2 c3@3", AU: "c2 c3@14 ~", AV: "d3", AW: "[e3,g3]", AX: "[f#3,a3]", AY: "~ b2, g#3",
  AZ: "a2 c3, a3", BA: "~ g#3, b2", BB: "a3 e3, c3", BC: "d3 f3", BD: "d#3", BE: "f#2", BF: "g2 e2",
  BG: "[f#2@5 ~@3]/2",
  BH: "[~@4 [e2,e3]@16 [d2,d3]@16 [c2,c3]@8 [a1,a2]@8 [b1,b2]@16 [a1,a2]@16 [g1,g2]@16 [f#1,f#2]@8 [b1,b2]@8 g2@11 e2]/8", // E D C A B A G F# …
  BI: "[~ b2@3 b2@11 g2@2 e3@3 e3@5 f#3@3 g3@5 f#3@3 e3@8 d#3@8 c3@11 a2@2 e3@3 e3@11 b2@2 b3@3 b3@3 c4@2 b3@3 a3@3 g3@2 f#3@3 g3@3 a3@2 g3@3 f3@3 e3@2 d3@3 c3@5 ~@7, ~@28 c3@8 b2@16 ~@40 b2@5 ~@3 e3@5 ~@3 g2@5 ~@15]/8",
  BJ: "~@4 [e2,e3]@5 [d2,d3]@3 [b1,b2]@4", BK: "~ [c2,c3]@3 [g1,g2]@8 [g1,g2]@4",
  BL: "[~ [g1,g2]@3 [g1,g2]@16 [f#1,f#2]@16 [f3,a3]@16 [e3,a3,c4]@16 [d#3,f#3,b3]@16 [c3,e3,a3]@16 [b2,d#3,f#3,b3]@5 ~@3 b3@20]/8", // G F# F Am B Am B
  BM: "~@4 b3@3 ~@5 b3@3 ~", BN: "[~@4 b3@16 b3@16 b3@3 ~@5 b3@3 ~]/3", BO: "~@4 b3@3 ~@5 e4@3 ~",
  BP: "~@4 e4@3 ~@5 e4@3 ~",
  BQ: "[~ e3@3 f#3@3 a#3@2 c#4@3 f#3@3 g#3@2 a#3@3 f#3@3 d4@2 b3@3 f3@3 b3@2 g#3@3 e3@3 b3@2 g#3@3 e3@3 f#3@2 g#3@3 e3@3 c4@2 a3@3 d#3@3 a3@2 f#3@3 d3@3 f#3@2 a3@3 d3@3 e3@2 f#3@3 d3@3 a#3@2 g3@3 c#3@3 g3]/6",
  BR: "[~ e3@3 c3@16 c3@8 a#2@8 a#2@16 a2@16 a#2@16 a2@12]/6",
  BS: "[~@4 [a#1,a#2]@16 b2@3 a2@2 g2@3 f#2@3 e2@2 d#2@3 [b1,b2]@5 ~@3 [b1,b2]@4, ~@5 b1@4 ~@3]/3", // A# B
  BT: "~@4 [b1,b2]@5 ~@3 [b1,b2]@4", BU: "[~ [g1,g2]@2 [f#1,f#2]@2 [e1,e2]@2 d2]/2",
  BV: "[~ c2@3 b1@3 c#2@2 d#2@3 e2@3 f#2@2 g2@3 a2@3 b2@2 c#3@3 d#3@3 e3@2 f#3@3 g3@3 a3@2 b3@3 c#4@3 d4@2 d#4@3 e4@3 d#4@2 e4@3 ~@4]/4",
  BW: "~@4 [b2,b3]@5 ~@3 [b2,b3]@4", BX: "~@4 [e3,e4]@5 ~@7", BY: "~@4 b2@5 ~@3 b2@4", BZ: "~@4 e3@5 ~@7",
  CA: "[~@4 b2@8 b2@8 b2@8 b2@8 g2@8 f#2@8 e2@8 d2@8 c2@8 b1@8 a1@8 g1@8 [f#1,f#2]@5 ~@3 [b1,b2]@4]/7", // F# B
  CB: "~@4 [e2,e3]@5 ~@7", // E
})).s("gm_electric_bass_pick").gain(0.21)

// drums · kick
const kick = s("bd").struct(`<
  A@2 B A@3 B A B@16 A ~ A B A C A B@11 A@7 B@16 A@2 B@15 A ~ A ~ A ~ A ~ A ~@13 D@2 E D@3 E D@2 E D@3 E@2 D@3 E D@7
  E@13 D@7 E@16 D ~@2 E@7 D
>`.pickRestart({
  A: "x", B: "x!2", C: "~ x", D: "~ x ~@2", E: "~ x ~ x",
})).gain(0.2)

// drums · rim
const rim = s("rim").struct(`<
  ~@2 A ~@3 A ~@16 B ~@11 A@7 ~@12 C A ~@2 D E F@2 G H ~@3 A D ~@37 I J ~@2 I J ~ I J ~@2 I K J ~@14 K@9 J ~@11 L K J ~
  M N O F P Q J ~@11
>`.pickRestart({
  A: "~@3 x ~ x ~@5 x ~ x ~@2", B: "~ x", C: "~@5 x ~@5 x ~ x ~@2", D: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2",
  E: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", F: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", G: "~@5 x ~@2 x!2 ~ x!3 ~ x",
  H: "~@5 x ~@7 x ~@2", I: "~@7 x ~ x ~@5 x", J: "~ x ~@14", K: "~ x ~@5 x ~ x ~@5 x", L: "~@9 x ~@5 x",
  M: "~@7 x ~ x ~@2 x ~@2 x", N: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x", O: "~ x ~@2 x!2 ~ x!3 ~ x!3 ~ x",
  P: "x!2 ~ x ~@5 x ~@2 x!2 ~ x", Q: "x!2 ~ x ~@5 x ~@6",
})).gain(0.3)

// drums · rim · soft notes
const rim_soft = s("rim").struct(`<
  ~@32 A@3 ~@7 B@6 ~@2 C@4 D ~@14 C@14 ~@48 E F@2 ~@9 G@6 ~@2 H@4 I ~@21
>`.pickRestart({
  A: "~@3 x ~ x ~@5 x ~ x ~@2", B: "x!2", C: "x", D: "~@3 x ~@12", E: "~@7 x ~ x ~@5 x", F: "~ x ~@5 x ~ x ~@5 x",
  G: "~ x ~ x", H: "~ x ~@2", I: "~@7 x ~@8",
})).gain(0.2)

// drums · snare
const snare = s("sd").struct(`<
  A@2 ~ A@3 B A ~@29 A@2 ~@23 A B@2 A@2 ~@37 C@2 ~ C@3 D C@2 ~ C@3 D@2 ~@17 C@4 ~@23 C D@2 C ~@6 D@2 ~ C
>`.pickRestart({
  A: "x", B: "x!2", C: "~ x ~@2", D: "~ x ~ x",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@32 x!5 ~@94 [~ x ~@2]!5 ~@41>").gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@48 A B ~@5 C ~@2 A ~@90 D E F ~@4 G ~@2 D ~@17>".pickRestart({
  A: "x", B: "~@11 x ~ x ~@2", C: "x!2", D: "~ x ~@2", E: "~@15 x", F: "~ x ~@14", G: "~ x ~ x",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@16 A@8 ~@7 B C@7 A D ~ B@6 D ~ E@4 ~@4 C A ~@2 F G A ~ D ~ D H@13 D ~@48 I@9 J K ~ L M@5 N ~ O P@3 Q ~@3 I J ~@2 R@2
  S ~ J K ~@2 J@4 ~@2
>`.pickRestart({
  A: "x!2", B: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", C: "~ x", D: "x", E: "~@3 x ~ x ~@5 x ~ x ~@2", F: "~@5 x ~@10",
  G: "~@5 x ~@7 x ~@2", H: "x ~@4 x ~@2 x ~@4 x ~@2", I: "~@3 x", J: "~ x ~ x", K: "~ x ~@2",
  L: "~@4 x ~@2 x ~ x ~@2 x ~@2 x", M: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x", N: "~ x ~@2 x ~@11", O: "~@7 x ~ x ~@5 x",
  P: "~ x ~@5 x ~ x ~@5 x", Q: "~ x ~@14", R: "~@9 x ~@6", S: "~ x ~@2 x ~@7 x ~@3",
})).gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 A ~@38 A ~@15 B ~@10 C ~@37 D ~@6 D ~@28 D ~@15 E F ~@15 D ~>".pickRestart({
  A: "x!2", B: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", C: "x", D: "~ x ~ x", E: "~@4 x ~@2 x ~ x ~@2 x ~@2 x", F: "~ x ~@14",
})).gain(0.4)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@48 A B ~@4 C ~@94 D E ~@4 F ~@21>".pickRestart({
  A: "~@3 x ~ x ~@2 x ~@7", B: "~@5 x ~@2 x ~@7", C: "x!2", D: "~@7 x ~ x ~@2 x ~@3", E: "~@9 x ~@2 x ~@3",
  F: "~ x ~ x",
})).gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<~@50 A@4 ~@4 B ~@92 C@4 ~@4 D ~@17>".pickRestart({
  A: "~ x", B: "x", C: "~@3 x", D: "~ x ~@2",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@40 A ~@8 B ~@6 C ~@10 D ~@73 E ~@8 F ~@6 G H ~@18>".pickRestart({
  A: "~ x", B: "x ~@2 x ~@12", C: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", D: "x!2", E: "~@3 x", F: "~@4 x ~@2 x ~@8",
  G: "~@4 x ~@2 x ~ x ~@2 x ~@2 x", H: "~ x ~@14",
})).gain(0.4)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@48 [~@11 x ~ x ~@2] ~@100 [~@15 x] [~ x ~@14] ~@26>").gain(0.25)

// drums · crash
const crash = s("cr").struct(`<
  A@8 ~@29 B@2 C@3 ~@14 A ~@8 A ~ A ~@36 D@15 ~@17 E@4 F@3 ~@14 D ~@8 D ~@8 F D
>`.pickRestart({
  A: "x", B: "~ x", C: "x!2", D: "~ x ~@2", E: "~@3 x", F: "~ x ~ x",
})).gain(0.4)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@32 A@5 ~@82 B ~@11 C@5 ~@31 D B ~@8>".pickRestart({
  A: "~ x", B: "~ x ~@2", C: "~@3 x", D: "~ x ~ x",
})).gain(0.2)

// drums · ride
const ride = s("rd").struct("<~@82 A B@12 C D@2 E D E D@3 ~@73>".pickRestart({
  A: "~ x", B: "x!2", C: "x", D: "~ x ~@2", E: "~ x ~ x",
})).gain(0.2)

stack(
  overdriven_guitar, bass, kick, rim, rim_soft, snare, snare_soft, low_tom, hihat, mid_tom, mid_tom_soft, open_hat,
  high_tom, high_tom_soft, crash, crash_soft, ride
)

More by Ludwig van Beethoven