Strudelify

My Wave

Soundgarden

KeyE minorTempo120 bpm
0:00/0:00
// My Wave — Soundgarden
// 120 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 5/4 at bar 7, 4/4 at bar 32, 5/4 at bar 36, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 141 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): gt harmonics.
setcpm(120/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 · "bass gt"
const bass = note(`<
  ~@5 A B C D E F G H D E I J K L M I G H D E N G H D E O P@3 Q G R D E S J K L M I G H D E N G H D E O P@2 T U V@2 W X
  V@2 W Y@3 W Z AA@4 AB AC AD AE AF AG AH AI@2 AJ AK AL AM@2 AN AK AL AM@2 AO@3 AP AQ@3 AR AQ@3 AS@3 AQ AT@3 AQ AR AQ AU
  AV@8 AW@3 AX@11 AY ~@2
>`.pickRestart({
  A: "~@3 e1", B: "~ g1 ~ g1 e1 g1 a1!2", C: "e1@2 ~ g1 ~ g1 e1 g1", D: "a1 d2 [e1,e2]@2 ~ g1 ~ g1",
  E: "e1 g1 a1 d2 [e1,e2]@2 ~ g1", F: "~ g1 ~ g1 a1!2 e1@2", G: "~ g1 ~ g1 e1 g1 a1 d2", H: "[e1,e2]@2 ~ g1 ~ g1 e1 g1",
  I: "~ g1 e1 g1 a1 d2 [e1,e2]@2", J: "~ g1 ~ g1 ~ g1 a1!2", K: "e1@2 ~ g1 ~ g1 ~ g1", L: "a1!2 e1@2 ~ g1 ~ g1",
  M: "~ g1 a1!2 e1@2 ~ g1", N: "~ g1 e1 g1 a1!2 e1@2", O: "~ g1 e1 g1 a1!2 ~@2", P: "~@3 g1 a1!2 ~@2",
  Q: "~@3 g1 a1!2 e1@2", R: "[e1,e2]@2 ~ g1 e1!2 g1 e1", S: "~ g1 ~ g1 a1 d2 [e1,e2]@2", T: "~@3 g1 a1 a1@2 ~",
  U: "~@6 a1@4 a1@4 e2!2", V: "e2!2 e2@2 ~@2 a1@4 a1@4 e2!2", W: "e2!2 e2@2 ~@2 a1@4 e1@4 a1!2",
  X: "a1!2 a1@2 ~@2 a1@4 a1@4 e2!2",
  Y: "[a1!2 a1@2 ~@4 g1@6 g1@4 g1@2 g1@2 g1@2 a#1@4 g#2@2 f#2@4 d#2@2 d2@2 a1@4 a1@4 e2!2]/3",
  Z: "a1!3 ~@5 a1@3 a1!2 ~ a1 ~", AA: "[~@2 a1 ~@3 e1@50 e3@4 a2@4]/4", AB: "e2 e1 e3!2 a2@2 e2 e1",
  AC: "e3@2 a2@2 e2 e1 e3!2", AD: "a2@2 e2 e1 e3@2 a2 e2", AE: "e1!2 e3!2 a2@2 e2 e1", AF: "~ [e1,e2]@2 ~ g1 ~ g1 ~",
  AG: "g1 a1!2 e1@2 ~ g1 ~", AH: "g1 ~ g1 a1!2 e1@2 ~", AI: "[g1 ~ g1 ~ g1 a1!2 e1@2 ~ g1 ~ g1 e1 g1 a1]/2",
  AJ: "d2 [e1,e2]@2 ~ g1 ~ g1 e1", AK: "g1 a1 d2 [e1,e2]@2 ~ g1 ~", AL: "g1 e1 g1 a1 d2 [e1,e2]@2 ~",
  AM: "[g1 ~ g1 e1 g1 a1 d2 [e1,e2]@2 ~ g1 ~ g1 e1 g1 a1]/2", AN: "a1 e1@2 ~ g1 ~ g1 e1", AO: "a1 ~@5 g1 a1",
  AP: "a1 ~@2 a1", AQ: "a1@4 e2!4 e2@2 ~@2 a1@4", AR: "e1@4 a1!4 a1@2 ~@2 a1@4",
  AS: "[e1@4 a1!4 a1@2 ~@4 g1@6 g1@4 g1@2 g1@2 g1@2 a#1@4 g#2@2 f#2@4 d#2@2 d2@2 a1@4]/3",
  AT: "[e1@4 a1!5 ~@5 g1@6 g1@4 g1@2 g1@2 g1@2 a#1@4 g#2@2 f#2@4 d#2@2 d2@2 a1@4]/3", AU: "e1@4 a1!4 a1@2 ~@4 a1@2",
  AV: "[~ a1!2 ~ a1 ~@3 a1 ~@3 e1@34 ~@32 e3@32 e2@18, ~@23 e2@32 ~@9]/8", AW: "[~@14 e3@31 ~ b1@2]/3",
  AX: "~@2 a1@2 ~@2 e2!2 e2@2 e2@2 ~@2 b1@2", AY: "~@2 a1@2 ~@2 e2!2 e2@2 e2@2 ~@4",
})).s("gm_electric_bass_finger").gain(0.45).pan(0.4)

// chords · overdriven guitar · "overdrive gt"
const overdriven_guitar = note(`<
  A@2 B@4 C D E F G C D E F G C D E F G C D E F G C D E F H@5 C D E F G C D E F G C D E F G C D E F I@4 J K@2 L M K@2 L
  N@3 L O P@4 Q R S@3 T U V@2 W T U V@2 W X Y Z@2 AA AB@2 AC AD@3 AE AD@3 AF@3 AD AF@3 AD AG AD AH AI@3 ~@22
>`.pickRestart({
  A: "~@3 [g2,d3] [a2,e3]!2 ~@2", // G5 A5
  B: "[~@3 [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 [e2,b2,b3]@2]/4", // G5 A5 G5 A5 G5 A5 G5 A5 …
  C: "~ [g2,d3] ~ [g2,d3] ~ [g2,d3] [a2,e3]!2", D: "[e2,b2,b3]@2 ~ [g2,d3] ~ [g2,d3] ~ [g2,d3]",
  E: "[a2,e3]!2 [e2,b2,b3]@2 ~ [g2,d3] ~ [g2,d3]", F: "~ [g2,d3] [a2,e3]!2 [e2,b2,b3]@2 ~ [g2,d3,d4]",
  G: "~ [g2,d3,d4] ~ [g2,d3,d4] [e3,e4]!2 [e2,b2,b3]@2", // G5 E E5
  H: "[~ [g2,d3,d4] ~ [g2,d3,d4] [e3,e4]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 [e2,b2,b3]@2]/5", // G5 E G5 A5 G5 A5 G5 A5 …
  I: "[~ [g2,d3,d4] ~ [g2,d3,d4] [e3,e4]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~ d4@3 ~ [g2,d3] [a2,e3]!2 ~@2]/4", // G5 E G5 A5 G5 A5 G5 A5
  J: "~@6 [b2,f#3,f#4]@4 [a2,e3,e4]@4 e2!2", K: "e2!2 e2@2 b2@2 [b2,f#3,f#4]@4 [a2,e3,e4]@4 e2!2",
  L: "e2!2 e2@2 b2@2 [b2,f#3,f#4]@4 e2@4 [a2,e3,a4]!2", M: "[a2,e3,a4]!3 ~@3 [b2,f#3,f#4]@4 [a2,e3,e4]@4 e2!2",
  N: "[[a2,e3,a4]!3 ~@5 [g2,d3]@6 e4@4 e4@2 d4@4 [a#2,f3]@6 g4@4 g4@2 f4@2 [b2,f#3,f#4]@4 [a2,e3,e4]@4 e2!2, ~@19 e4 ~@4]/3", // A5 G5 A#5 B5 A5
  O: "[a2,e3,a4]!3 ~@5 [a2,e3,a4]@3 [a2,e3,e4]!2 ~ [a2,e3,a4]@2", // A5
  P: "[~@2 [a2,e3,a4]@2 ~@2 [e2,b2,g#3]@17 ~ d4@2 e4@4 e4@4 ~@2 d4@2 ~@2 d4@4 d4@2 e4@4 e4@4 ~@2 d4@2 ~@2 d4@4]/4", // A5 E
  Q: "d4 e4@2 e4@2 ~ d4 ~", R: "d4@2 d4 e4@2 e4@2 ~",
  S: "[d4 ~ d4@2 d4 e4@2 e4@2 ~ d4 ~ d4@2 d4 e4@2 [e2,a#2,b2]@2 ~ g2 ~ g2@2]/3", T: "g2 a2 d3 e3@2 ~ g2 ~",
  U: "g2@2 g2 a2 d3 e3@2 ~", V: "[g2 ~ g2@2 g2 a2 d3 e3@2 ~ g2 ~ g2@2 g2 a2]/2", W: "d3 e3@2 ~ g2 ~ g2@2",
  X: "g2 a2!2 e2@2 ~ g2 ~", Y: "g2 ~ g2 a2!2 e2@2 ~", Z: "[g2 ~ g2 ~ g2 a2!2 e2@2 ~ g2 ~ g2 ~ g2 a2]/2",
  AA: "a2 ~ d4@3 ~ [g2,d3] [a2,e3]", AB: "[a2,e3] ~ d4@3 ~ [g2,d3] [a2,e3]", AC: "[a2,e3] ~@5 [b2,f#3,f#4]@2",
  AD: "[a2,e3,e4]@4 e2!4 e2@2 b2@2 [b2,f#3,f#4]@4", AE: "e2@4 [a2,e3,a4]!5 ~@3 [b2,f#3,f#4]@4",
  AF: "[e2@4 [a2,e3,a4]!5 ~@5 [g2,d3]@6 e4@4 e4@2 d4@4 [a#2,f3]@6 g4@4 g4@2 f4@2 [b2,f#3,f#4]@4, ~@22 e4 ~]/3", // A5 G5 A#5 B5
  AG: "e2@4 [a2,e3,a4]!5 ~ b2@2 [b2,f#3,f#4]@4", AH: "e2@4 [a2,e3,a4]!5 ~@5 [a2,e3,a4]@2",
  AI: "[~ [a2,e3,e4]!2 ~ [a2,e3,a4]@2 ~@2 [a2,e3,a4]@2 ~@2 [e2,b2,g#3]@34 ~@2]/3", // A5 E
})).s("gm_overdriven_guitar").gain(0.33).pan(0.7)

// other · distortion guitar · "distortion gt"
const distortion_guitar = note(`<
  A@2 B@4 C D E F G C D E F G C D E F G C D E F G C D E F H@5 C D E F G C D E F G C D E F G C D E F I@5 J@7 K@3 J L M@2
  ~@6 N O P Q@2 R O P Q@2 R O P Q@2 S T@2 U V@7 W@3 V W@3 V@3 X Y@3 Z@19 AA ~@2
>`.pickRestart({
  A: "~@3 g3 a3!2 ~@2",
  B: "[~@3 g3 a3!2 ~ d4@3 ~ g3 a3!2 ~ d4@3 ~ g3 a3!2 ~ d4@3 ~ g3 a3!2 [b2,b3]@2, ~@14 c#4 ~@15 c#4 ~@15 c#4 ~@17]/4", // B
  C: "~ [d3,d4] ~ [d3,d4] ~ [d3,d4] [e3,e4]!2", D: "[b2,b3]@2 ~ [d3,d4] ~ [d3,d4] ~ [d3,d4]",
  E: "[e3,e4]!2 [b2,b3]@2 ~ [d3,d4] ~ [d3,d4]", F: "~ [d3,d4] [e3,e4]!2 [b2,b3]@2 ~ [g2,d3,d4]",
  G: "~ [g2,d3,d4] ~ [g2,d3] [a2,e3]!2 [b2,b3]@2, ~@12 f#4 ~@3", // G5 A5 B
  H: "[~@2 [g2,d3,d4]@2 ~@2 [g2,d3]@2 [a2,e3]@2 [a2,e3]@2 f#4 ~ d4@6 ~@2 g3@2 a3@2 a3@2 ~@2 d4@6 ~@2 g3@2 a3@2 a3@2 ~@2 d4@6 ~@2 g3@2 a3@2 a3@2 ~@2 d4@6 ~@2 g3@2 a3@2 a3@2 [b2,b3]@4, ~@14 c#4 ~@15 c#4 ~@15 c#4 ~@15 c#4 ~@17]/5", // G5 A5 B
  I: "[~@2 [g2,d3,d4]@2 ~@2 [g2,d3]@2 [a2,e3]@2 [a2,e3]@2 f#4 ~ d4@6 ~@2 g3@2 a3@2 a3@2 ~@2 d4@6 ~@2 g3@2 a3@2 a3@2 ~@2 d4@6 ~@2 g3@2 a3@2 a3@2 ~@2 d4@8 e4@2 d#4@2 ~@6, ~@14 c#4 ~@15 c#4 ~@15 c#4 ~@33]/5", // G5 A5
  J: "c#4 ~@2 e4 d#4 ~@3", K: "[c#4 ~@3 [g2,d3]@3 e4@2 e4 d4@2 [a#2,f3]@3 g4@2 g4 f4 e4 d#4 ~@3]/3",
  L: "c#4@2 ~@6 [a2,e3,a4]@3 [a2,e3,e4]!2 ~ [a2,e3,a4]@2", M: "[~ [a2,e3,a4] ~ [e2,b2,g#3]@12 ~]/2",
  N: "~ [b2,b3]@2 ~ [d3,d4] ~ [d3,d4] ~", O: "[d3,d4] [e3,e4]!2 [b2,b3]@2 ~ [d3,d4] ~",
  P: "[d3,d4] ~ [d3,d4] [e3,e4]!2 [b2,b3]@2 ~", // D E B
  Q: "[[d3,d4] ~ [d3,d4] ~ [d3,d4] [e3,e4]!2 [b2,b3]@2 ~ [g2,d3,d4] ~ [g2,d3,d4] ~ [g2,d3] [a2,e3]]/2", // D E B G5 A5
  R: "[a2,e3] [b2,b3]@2 ~ [d3,d4] ~ [d3,d4] ~, ~@2 f#4 ~@13", S: "[a2,e3]@2 f#4 ~ d4@6 ~@2 g3@2 a3@2, ~@4 c#4 ~@11",
  T: "a3 ~ d4@3 ~ g3 a3, ~@4 c#4 ~@11", U: "a3 ~ d4@4 e4 d#4", V: "~@3 c#4 ~@2 e4 d#4",
  W: "[~@3 c#4 ~@3 [g2,d3]@3 e4@2 e4 d4@2 [a#2,f3]@3 g4@2 g4 f4 e4 d#4]/3", X: "~@3 c#4 ~@3 [a2,e3,a4]",
  Y: "[~ [a2,e3,e4]!2 ~ [a2,e3,a4]@2 ~@2 [a2,e3,a4]@2 ~@2 [e2,b2,g#3]@34 e4@2]/3", Z: "d#4 ~@3 c#4 ~@2 e4",
  AA: "d#4 ~@3 c#4 ~@3",
})).s("gm_distortion_guitar").gain(0.33).pan(0.3)

// other · guitar harmonics · "gt harmonics"
const guitar_harmonics = note("<~@57 A@2 ~@38 B ~@43>".pickRestart({
  A: "[~@7 d4@3 ~@6]/2", B: "~@2 d4@3 ~@3",
})).s("gm_guitar_harmonics").gain(0.19).pan(0.6)

// other · distortion guitar · "distortion gt"
const distortion_guitar_2 = note("<~@58 A@8 B ~ C D E ~@27 F@7 G ~ H I@2 ~ H J K F G ~@3 L@16 M@6>".pickRestart({
  A: "[~@5 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3 b3@3 b3!3]/8",
  B: "~ b3!3 ~@4", C: "~@3 b3 ~@2 b3!2", D: "b3@2 b3 b3@3 b3!2", E: "b3!4 ~@4", F: "b3!2 b3@2 b3 b3@3",
  G: "b3!2 b3@2 b3!3 ~", H: "~@6 b3 ~", I: "[~ b3!2 b3@2 b3 b3@3 b3!6 ~]/2", J: "~ b3!2 b3@2 b3 ~@2",
  K: "b3!2 b3@2 b3!2 ~@2",
  L: "[~ b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3@4 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3@4 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3@4 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3@3]/8",
  M: "[~ b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3@4 b3!2 b3@2 b3 b3@3 b3!2 b3@2 b3@16 ~@3]/6",
})).s("gm_distortion_guitar").gain(0.22).pan(0.7)

// bass · synth bass 1 · "synth bass 3"
const bass_2 = note(`<
  ~@74
  [~@2 e3 a2]
  [e2 e1 e3!2 a2@2 e2 e1]
  [e3@2 a2@2 e2 e1 e3!2]
  [a2@2 e2 e1 e3@2 a2 e2]
  [e1!2 e3!2 a2@2 e2 e1]
  ~@62
>`).s("gm_synth_bass_1").gain(0.2).pan(0.6)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@5 A B C D E F B C G E H G C G E I B C G E F B C G E J G@3 K L C D E M G C G E I B C G E F B C G E J G@3 N O@7 P Q R
  O S T ~@2 A U V W X Y Z AA AB AC Y AD AA AB AE AF AD AA AB AG AH Y@2 AI AJ@7 AK AL AM AJ AN AL AM AJ@3 AK AO ~@2 C@6
  AP C@13 ~@2
>`.pickRestart({
  A: "~ x", B: "x ~ x!2", C: "~ x ~ x", D: "x ~@2 x ~@4 x ~@7", E: "x!2 ~ x", F: "~@4 x!2 ~@2 x ~@2 x ~@4", G: "x!2",
  H: "~@4 x ~@3 x ~ x!2 ~@4", I: "~ x!2 ~", J: "~@2 x!4 ~@2", K: "x ~@5 x ~ x ~ x ~@3 x!2", L: "x ~@2 x!2 ~ x ~",
  M: "~@4 x ~@3 x ~@2 x ~@4", N: "x ~ x ~ x ~@3 x ~@4 x ~@2", O: "x ~@7 x ~@4 x ~@2", P: "x ~ x!3 ~@3 x ~@5 x ~",
  Q: "~@4 x ~@2 x", R: "~@4 x ~@8 x ~@2", S: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~", T: "~ x ~@6", U: "~ x!3 ~@4 x ~ x ~ x ~@3",
  V: "x ~ x ~@4 x", W: "~@2 x ~@6 x ~@4 x ~", X: "x ~@2 x ~ x ~ x", Y: "~@3 x ~@3 x", Z: "~@5 x ~@2",
  AA: "~ x ~ x ~@3 x", AB: "~@3 x ~ x ~@2", AC: "~ x ~@3 x ~ x", AD: "~ x ~@3 x ~@2", AE: "~@2 x ~@7 x!2 ~@2 x ~",
  AF: "~ x ~@4 x ~@7 x ~", AG: "~ x ~@3 x!3", AH: "x ~@2 x ~@3 x", AI: "~@3 x!3 ~ x", AJ: "~@3 x ~@2 x ~@7 x ~",
  AK: "~@3 x ~@2 x ~ x!3 ~@3 x ~", AL: "~@2 x ~@4 x", AM: "~@2 x ~@2 x ~@2", AN: "~@3 x ~@2 x ~@3 x ~@3 x ~",
  AO: "~ x!2 ~ x ~@3 x ~@7", AP: "~@2 x ~@2 x!2 ~",
})).gain(0.5)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@19 A B ~@2 A ~@19 A B ~@2 A ~@9 C ~ D E D E D E D F ~@2 D E ~@6 C ~@4 G H ~@2 G ~@10 I J K J K J K J L ~@2 J K ~@2 J
  K J L ~@7 H@3 ~ H ~ H ~ H ~ H ~ H ~ H ~@3
>`.pickRestart({
  A: "x", B: "~ x ~@2", C: "~@6 x!2", D: "~@3 x ~@12", E: "~@2 x!2 ~@12", F: "~ x ~@6", G: "~@3 x ~@4", H: "~@5 x ~@2",
  I: "~ x!2 ~@5", J: "~@9 x ~@6", K: "~@8 x!2 ~@6", L: "~ x",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@10 A ~@5 B C D@2 A B C ~ D A E C E D B C@4 ~@4 F B C D@2 A B C ~ D A E C E D B C@2 ~ G ~@7 H ~@3 I ~@3 J K L H M N O
  P Q R N O@2 Q R N ~ S Q N O@3 T ~@7 U ~@3 V ~@5 U ~@25
>`.pickRestart({
  A: "~ x ~@2", B: "~@2 x!2", C: "~@3 x", D: "x", E: "~ x", F: "~ x!2 ~", G: "x!2 ~@2", H: "~@7 x ~@8",
  I: "~@5 x!2 ~@9", J: "~@15 x", K: "~@9 x ~@6", L: "~ x ~@3 x ~@2", M: "~ x ~@4 x ~@5 x ~@3", N: "~@7 x", O: "~ x ~@6",
  P: "~ x ~ x ~@4", Q: "~@3 x ~@4", R: "~@5 x ~@2", S: "~ x ~@5 x", T: "~@3 x ~ x ~@2", U: "~@13 x ~@2",
  V: "~@11 x!2 ~@3",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@15 A B@19 C ~@3 A B@17 D ~@13 E F@2 G ~@4 F@18 ~@21 H ~@22>".pickRestart({
  A: "~@3 x", B: "x!4", C: "x!2 ~@2", D: "x!3 ~", E: "~@5 x ~ x", F: "~ x ~ x ~ x ~ x", G: "~ x ~ x!2 ~@3",
  H: "~@2 x!2",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@16 A ~@2 B C A ~ D B C A ~ D B ~@9 B A ~@2 B C A ~ D B C A ~ D B ~@12 E ~@3 F ~@3 G H C I ~@2 J ~ K L ~ J E K L ~ J
  E K ~@12 A ~@3 M ~@5 A ~@25
>`.pickRestart({
  A: "~@3 x", B: "~ x ~@2", C: "~ x", D: "x", E: "~@3 x ~@4", F: "~@5 x ~@10", G: "~@15 x", H: "~ x ~@7 x ~@6",
  I: "~@8 x!3 ~@5", J: "~ x ~@6", K: "~@5 x ~@2", L: "~@7 x", M: "~@11 x ~@4",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@5 A B@4 C B@4 D ~@19 B@4 E ~@101>".pickRestart({
  A: "~@3 x", B: "x!4", C: "x ~@2 x", D: "x!3 ~", E: "x",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A B C D E B@2 C D E F ~@18 A B C D E B ~@18 G ~@7 H@2 G ~@2 G ~@2 B H I J K L ~@17 A ~@7 M@2 A ~ M@2 A ~@4 A ~ M
  ~@7 M@3 L M L M@3 N@2 O L ~@2
>`.pickRestart({
  A: "~@3 x", B: "~@2 x!2", C: "x ~@2 x", D: "x!2 ~@2", E: "x!3 ~", F: "~ x!3", G: "~@3 x ~@4", H: "~ x", I: "x!2 ~ x",
  J: "x ~ x!2", K: "~ x!2 ~", L: "~ x ~@6", M: "~@7 x", N: "x!2 ~@5 x", O: "~ x ~@5 x",
// … 17 more lines

More by Soundgarden