Strudelify

Chain Reaction

Ross

KeyB majorTempo130 bpm
0:00/0:00
// Chain Reaction — Ross
// 130 bpm, 4/4, key B major. 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 129 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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(`<
  ~@2 A B A C D@2 E@2 F@2 G H I J K L M@2 N@2 O P Q L R P S T U@2 V@2 Q W X@2 Y@2 Z@2 AA AB AC AD AE@2 AC AF AG AH@2 F@2
  G H I J K L M@2 N@2 O P Q L R P S T U@2 V@2 Q W X@2 Y@2 Z@2 AI AB AJ AK AL AM AN AO AP AQ@2 AM AR AS AT AU AV AW AX AY
  AZ BA@2 BB BC BD BE AM AR AS AT BF AV AW AX AY AZ BG BA BH BI@4
>`.pickRestart({
  A: "[d#4,f#4,b4]@3 [c#4,e4,a4]", B: "[b3,e4,g#4]@3 [c#4,f#4,a#4]", C: "[b3,e4,g#4]",
  D: "~ [c#2,f4,g#4,c#5] [d#2,g4,a#4,d#5]@2", // C# D#
  E: "[~@4 [e2,g#4,b4,e5]@4 f#2@8 f#2@4 f#3@2 ~ f#2 f#3@4 f#2@4, ~ [a#4,c#5,f#5]@2 ~]/2", F: "b1@4 b1@4 b1@4 b1@2 ~ b2",
  G: "[d#4,f#4,b4]", H: "[c#4,e4,g#4]@3 c#4", I: "[c#4,e4,g#4]", J: "[c#4,f#4,a#4] [f#3,a#3,c#4]", K: "[f#3,a#3,d#4]",
  L: "[g#3,b3,d#4]", M: "[[g#3,b3,e4]@3 [g#3,b3,e4]]/2", N: "[[b3,e4,g#4]@7 [b3,e4,g#4]]/2", O: "[g#3,c#4,e4]",
  P: "[a#3,c#4,f#4]", Q: "[a#3,d#4,f#4]", R: "[g#3,b3,e4]", S: "[c#4,f4,g#4]@14 ~ c#4", T: "g#4 a#4 g#4 a#4, [c#4,f4]",
  U: "[[b3,d#4,f#4]@7 ~ [d#4,f#4]@8, ~@15 b3@17]/2", // B D#m
  V: "[[a#3,d4,f4]@14 ~@2 f4@8 g#4@2 ~ f#4 f4@4, ~@15 a#3@17, ~ d4]/2", W: "[g#3,c4,d#4]",
  X: "[[a3,d4,f#4]@7 ~ [d4,f#4]@8, ~@15 a3@17]/2", Y: "[[g3,c4,e4]@7 ~ [c4,e4]@8, ~@15 g3@17]/2", Z: "[a3,b3,d#4]",
  AA: "[g3,e4]", AB: "[g3,a#3,d4]", AC: "[a3,d4,f#4]@7 ~ [a3,c#4,e4]@7 ~", AD: "[g3,b3,d4]@14 ~ g3",
  AE: "[[a3,d4,f#4]@11 ~ [a3,d4,f#4]@3 ~ [d4,f#4]@15 ~, ~@15 a3@16 ~]/2", AF: "[g3,b3,d4]@15 ~", AG: "[a3,d4,f#4]@15 ~",
  AH: "[[a3,d4,f#4] ~@3 [g#3,b3,e4]@4 a#3@8 a#3@15 ~, ~@8 [c#4,f#4]@23 ~]/2", AI: "[g3,b3,e4]",
  AJ: "[a3,d4,f#4] [a3,c#4,e4]", AK: "[g3,b3,d4]", AL: "[a3,d4,f#4]", AM: "[g#3,c#4,f4]@14 ~ g#3", AN: "[f#3,b3,d#4]",
  AO: "[a#3,d4,f4]", AP: "[a#3,d4,f4]@4 [a#3,d4,f4]@4 [a#3,d4,f4]@4 [a#3,d4,f4]@2 ~ a#3", AQ: "[a#3,d#4,g4]",
  AR: "[g#3,c#4,f4]@7 ~", AS: "[g3,c4,e4]@14 ~ g3", AT: "[g3,c4,e4]@7 ~", AU: "[g#3,c4,f4]@5 ~ [g#3,c4,f4]@2",
  AV: "[a#3,d4,f4]@7 ~", AW: "[g#3,b3,e4]@14 ~ g#3", AX: "[g#3,b3,e4]@7 ~", AY: "[f#3,a3,d4]@14 ~ f#3",
  AZ: "[f#3,a3,d4]@7 ~", BA: "[f3,g#3,c#4]@7 ~", BB: "[a3,c#4,f#4]@7 ~", BC: "[a3,d4,f#4]@7 ~", BD: "[a#3,d#4,g4]@7 ~",
  BE: "[a#3,d#4,g4]@5 ~ [a#3,d#4,g4]@2", BF: "[g#3,c4,f4]@7 ~", BG: "[f3,g#3,c#4]@14 ~ f3", BH: "[f#3,a3,c#4]@7 ~",
  BI: "[[f#3,a3,d4]@9 [b2,g#3,e4]@19 ~@4]/4", // D E
})).s("gm_piano").gain(0.3).pan(0.7)

// bass · synth bass 1
const bass = note(`<
  ~@2 A B A C D@3 E F@2 G H I J K L M N O P I Q K R S T U I G V W X K Y Z AA AB AC F AD AE AF AG AH AI AJ AK AH AL AM S
  F@2 G H I J K L M N O P I Q K R S T U I G V W X K Y Z AA AB AC F AD AE AF AN AO AI H AP AQ AR AS K U I AB AT AU AV AW
  AX Z AY AZ BA Q AY AS K U I AB AT AU AV AW AX Z AY AZ BA Q BB BC@3
>`.pickRestart({
  A: "b1@3 a1", B: "e2@3 f#1", C: "e2@6 ~ b2 e3@4 e2@4",
  D: "[~@4 c#2@4 d#2@4 d#2@2 ~ d#2@5 c#2@4 d#2@4 d#2@2 ~ d#2@5 e2@4 f#2@4 f#2@2 ~ f#2]/3",
  E: "f#2@4 f#3@2 ~ f#2 f#2@4 f#2@4", F: "b1@4 b1@4 b1@4 b1@2 ~ b2", G: "b1!4", H: "c#2@4 c#2@4 c#2@4 c#2@2 ~ g#1",
  I: "c#2@4 c#2@4 c#2@4 c#2@2 ~ c#2", J: "f#1@4 f#1@4 f#1@4 f#1@2 ~ c#2", K: "d#2@4 d#2@4 d#2@4 d#2@2 ~ d#2",
  L: "g#1@4 g#1@4 g#1@4 g#1@2 ~ f1", M: "f#1!4", N: "f#1@4 f#1@4 f#1@4 f#1@2 ~ f#2", O: "e2@4 e2@4 e2@4 e2@2 ~ b1",
  P: "e2@4 e2@4 e2@4 e2@2 ~ d#2", Q: "f#2@4 f#2@4 f#2@4 f#2@2 ~ e2", R: "g#2@4 g#2@4 g#2@4 g#2@2 ~ f2", S: "f#2!4",
  T: "f#2@4 f#2@4 f#2@4 f#2@2 ~ f#2", U: "c#2!4", V: "b1@4 b1@4 f#2@4 f#2@2 ~ b1", W: "a#1!4",
  X: "a#1@4 a#1@4 a#1@4 a#1@2 ~ a#1", Y: "g#2@4 g#2@4 g#2@4 g#2@2 ~ g#2", Z: "d2!4", AA: "d2@4 d2@4 d2@4 d2@2 ~ a1",
  AB: "c2!4", AC: "c2@4 c2@4 c2@4 c2@2 ~ c2", AD: "b1!3 f#2", AE: "e2@4 e2@4 e2@4 e2@2 ~ f#2",
  AF: "g2@4 g2@4 g2@4 g2@2 ~ c2", AG: "d2@4 d2@4 d2@4 d2@2 ~ f#2", AH: "g2@4 g2@2 ~ g2 d2@4 g2@2 ~ c#2",
  AI: "d2@4 d2@2 ~ d2 a1@4 d2@2 ~ a1", AJ: "d2@4 d2@2 ~ a1 f#1@4 a1@2 ~ c#2", AK: "d2@4 d2@2 ~ d2 a1@4 d2@2 ~ f#2",
  AL: "d2@4 d2@2 ~ d2 a1@4 a1@2 ~ a1", AM: "d2 ~@3 e2@4 f#2@4 f#2@2 ~ f#2", AN: "d2@4 d2@2 ~ d2 a2@4 a2@2 ~ a2",
  AO: "g2@4 g2@2 ~ g2 d2@4 e2@2 ~ c#2", AP: "b1@4 b1@4 b1@4 b1@2 ~ b1", AQ: "a#1@4 a#1@4 a#1@4 a#1@2 ~ f1",
  AR: "a#1 a#2@2 ~ a#2@4 a#2@4 a#2@2 ~ a#2", AS: "d#2@4 d#2@4 d#2@4 d#2@2 ~ a#2", AT: "c2@4 c2@4 c2@4 c2@2 ~ g2",
  AU: "f2@4 f2@4 f2@4 f2@2 ~ f2", AV: "a#1@4 a#1@4 a#1@2 ~ a#1 a#1@2 ~ a#1", AW: "e2!4", AX: "e2@4 e2@4 e2@4 b1@2 ~ e2",
  AY: "d2@4 d2@4 d2@4 d2@2 ~ d2", AZ: "c#2@4 c#2@4 c#2@4 c#2@2 ~ g#2", BA: "c#2@4 c#2@4 c#2@2 ~ c#2 c#2@2 ~ c#2",
  BB: "d2@4 d2@4 d2@4 ~ d2@3", BC: "[d2 e2@19 ~@4]/3",
})).s("gm_synth_bass_1").gain(0.4).pan(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@2 A@2 B C D@4 E@2 ~ F ~ G ~@4 H@3 I@2 J I@2 K@2 L@4 M@2 N@2 O@4 P Q R S T U@2 V R W@2 E@2 ~@7 X Y@2 Z@2 AA AB AC AD
  AE AF AG@2 AH AI T AE AJ AK AL@2 AM@2 AN@2 AO V AP AQ AR AS AT AU@2 AV@2 AW@2 AE AX AY AZ BA@2 BB BC BD@2 AU@2 AV@2
  AW@2 AE BE AY AZ BA@2 BB BC BF@5
>`.pickRestart({
  A: "[b3@7 c#4]/2", B: "d#4", C: "e4",
  D: "[~@2 [f4,c#5]@2 [g4,d#5]@5 ~ [f4,c#5]@2 [g4,d#5]@5 ~ [g#4,e5]@2 [a#4,f#5]@11 ~]/4", E: "b3/2",
  F: "e4@2 d#4 ~ d#4@2 c#4 ~", G: "f#4@2 e4 ~ d#4@2 c#4 ~", H: "e4/3", I: "f#4/2", J: "g#4", K: "[g#5@5 a#5 g#5 a#5]/2",
  L: "g#5/2", M: "f#5/2", N: "[a5@5 b5 a5 b5]/2", O: "a5/2", P: "g5 a5", Q: "a#5 d6", R: "a5", S: "g5", T: "f#5",
  U: "[d5@3 a5]/2", V: "g5 b5", W: "[~ g#4 a#4@6]/2", X: "~@4 b3@2 ~ a#3 b3@4 e4@2 ~ d#4", Y: "[e4@5 g#3 b3 d#4]/2",
  Z: "[c#4@5 a#3 a#4 g#4]/2", AA: "f#4", AB: "b3@2 g#3 d#4", AC: "b3 g#3 b3 g#3", AD: "b3", AE: "g#5", AF: "c#6",
  AG: "[g#5@5 f#5 f5 d#5]/2", AH: "d5", AI: "g#5@8 g#5@2 ~ f#5 f5@4", AJ: "d6 e6", AK: "a5 d6",
  AL: "[c6@5 g6 f#6 e6]/2", AM: "[a5@24 a5@2 ~ g5 f#5@4]/2", AN: "g5/2", AO: "d5 a5", AP: "a5 f#5", AQ: "f5",
  AR: "d#5@2 g#5 b5", AS: "a#5", AT: "a#4 d5 f5 a#5", AU: "d#6/2", AV: "c#6/2", AW: "[c6@24 a#5@2 ~ g#5 g5@2 ~ a#5]/2",
  AX: "a#5@2 c#5 f5", AY: "e5 g#5 f#5 e5", AZ: "b5", BA: "[a5@6 g#5 f#5]/2", BB: "f5@4 g#5@4 f5@2 ~ f#5 g#5@4",
  BC: "c#5@8 b5@2 ~ a#5 g#5@4", BD: "[a5 f#5@3]/2", BE: "a#5@2 d5 f5", BF: "[a5@4 f#5@13 g#5@19 ~@4]/5",
})).s("gm_string_ensemble_1").gain(0.2)

// bass · synth brass 1
const bass_2 = note("<~@6 A@4 B@2 ~@41 B@2 ~@32 C@2 ~@40>".pickRestart({
  A: "[~@2 c#2 ~ d#2@5 ~ c#2 ~ d#2@5 ~ e2 ~ f#2@12]/4", B: "b1/2", C: "d2/2",
})).s("gm_electric_bass_finger").gain(0.7)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@2 A B A C D@2 E F G@3 H@2 I J K L@4 M N J O P N Q@2 G@2 R@2 J S T@2 U@2 G@2 V W X Y T Z X Y AA AB AC G@3 H@2 I J K
  L@4 M N J O P N Q@2 G@2 R@2 J S T@2 U@2 G@2 V W AD Y AE AF AG AH AI AJ@2 AF@2 AK@2 AL R AM@2 AE@2 AF AN AO T AJ@2 AF@2
  AK@2 AL R AM@2 AE@2 AF AN AO AP AQ@3
>`.pickRestart({
  A: "[d#4,f#4,b4]@3 [c#4,e4,a4]", B: "[b3,e4,g#4]@3 [c#4,f#4,a#4]", C: "[b3,e4,g#4]",
  D: "~ [f4,g#4,c#5] [g4,a#4,d#5]@2", E: "~@2 [g#3,b3,e4] ~ [a#3,c#4,f#4] ~ [a#3,c#4,f#4] ~",
  F: "[a#3,c#4,f#4]@2 ~@2 [a#3,c#4,f#4]@2 ~ [a#3,c#4,f#4] [a#3,c#4,f#4]@2 ~@2 [a#3,c#4,f#4]@2 ~@2", // F#
  G: "[d#4,f#4,b4]@2 ~@2 [d#4,f#4,b4]@2 ~@2 [d#4,f#4,b4]@2 ~@2 [d#4,f#4,b4]@2 ~ [d#4,f#4,b4]", // B
  H: "[c#4,e4,g#4]@2 ~@2 [c#4,e4,g#4]@2 ~@2 [c#4,e4,g#4]@2 ~@2 [c#4,e4,g#4]@2 ~ [c#4,e4,g#4]", // C#m
  I: "[c#4,f#4,a#4]@2 ~@2 [c#4,f#4,a#4]@2 ~@2 [c#4,f#4,a#4]@2 ~@2 [c#4,f#4,a#4]@2 ~ [c#4,f#4,a#4]", // F#
  J: "[d#4,f#4,a#4]@2 ~@2 [d#4,f#4,a#4]@2 ~@2 [d#4,f#4,a#4]@2 ~@2 [d#4,f#4,a#4]@2 ~ [d#4,f#4,a#4]", // D#m
  K: "[d#4,g#4,b4]@2 ~@2 [d#4,g#4,b4]@2 ~@2 [d#4,g#4,b4]@2 ~@2 [d#4,g#4,b4]@2 ~ [d#4,g#4,b4]", // G#m
  L: "[e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~ [e4,g#4,b4]", // E
  M: "[e4,g#4,c#5]@2 ~@2 [e4,g#4,c#5]@2 ~@2 [e4,g#4,c#5]@2 ~@2 [e4,g#4,c#5]@2 ~ [e4,g#4,c#5]", // C#m
  N: "[f#4,a#4,c#5]@2 ~@2 [f#4,a#4,c#5]@2 ~@2 [f#4,a#4,c#5]@2 ~@2 [f#4,a#4,c#5]@2 ~ [f#4,a#4,c#5]", // F#
  O: "[d#4,g#4,b4] ~ [d#4,g#4,b4] ~ [d#4,g#4,b4] ~ [d#4,g#4,b4] ~", // G#m
  P: "[e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~ [g#4,b4]", // E G#m
  Q: "[f4,g#4,c#5]@2 ~@2 [f4,g#4,c#5]@2 ~@2 [f4,g#4,c#5]@2 ~@2 [f4,g#4,c#5]@2 ~ [f4,g#4,c#5]", // C#
  R: "[d4,f4,a#4]@2 ~@2 [d4,f4,a#4]@2 ~@2 [d4,f4,a#4]@2 ~@2 [d4,f4,a#4]@2 ~ [d4,f4,a#4]", // A#
  S: "[d#4,g#4,c5]@2 ~@2 [d#4,g#4,c5]@2 ~@2 [d#4,g#4,c5]@2 ~@2 [d#4,g#4,c5]@2 ~ [d#4,g#4,c5]", // G#
  T: "[d4,f#4,a4]@2 ~@2 [d4,f#4,a4]@2 ~@2 [d4,f#4,a4]@2 ~@2 [d4,f#4,a4]@2 ~ [d4,f#4,a4]", // D
  U: "[e4,g4,c5]@2 ~@2 [e4,g4,c5]@2 ~@2 [e4,g4,c5]@2 ~@2 [e4,g4,c5]@2 ~ [e4,g4,c5]", // C
  V: "[e4,g4,b4]@2 ~@2 [e4,g4,b4]@2 ~@2 [e4,g4,b4]@2 ~@2 [e4,g4,b4]@2 ~ [e4,g4,b4]", // Em
  W: "[d4,g4,a#4]@2 ~@2 [d4,g4,a#4]@2 ~@2 [d4,g4,a#4]@2 ~@2 [d4,g4,a#4]@2 ~ [d4,g4,a#4]", // Gm
  X: "[d4,f#4,a4] ~ [d4,f#4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~", // D A
  Y: "[b3,d4,g4]@2 ~@2 [b3,d4,g4]@2 ~@2 [b3,d4,g4]@2 ~@2 [b3,d4,g4]@2 ~ [b3,d4,g4]", // G
  Z: "[d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~", // D
  AA: "[a3,d4,f#4] ~ [a3,d4,f#4] ~ [a3,d4,f#4] ~ [a3,d4,f#4] ~", // D
  AB: "[a3,d4,f#4]@2 ~@2 [b3,e4,g#4]@2 ~@2 [c#4,f#4,a#4]@2 ~@2 [c#4,f#4,a#4]@2 ~ [c#4,f#4,a#4]", // D E F#
  AC: "[c#4,f#4,a#4] ~ [c#4,f#4,a#4] ~ [c#4,f#4,a#4] ~ [c#4,f#4,a#4] ~", // F#
  AD: "[d4,f#4,a4]@2 ~@2 [d4,f#4,a4]@2 ~@2 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4]@2 ~ [c#4,e4,a4]", // D A
  AE: "[a3,d4,f#4]@2 ~@2 [a3,d4,f#4]@2 ~@2 [a3,d4,f#4]@2 ~@2 [a3,d4,f#4]@2 ~ [a3,d4,f#4]", // D
  AF: "[c#4,f4,g#4]@2 ~@2 [c#4,f4,g#4]@2 ~@2 [c#4,f4,g#4]@2 ~@2 [c#4,f4,g#4]@2 ~ [c#4,f4,g#4]", // C#
  AG: "[b3,d#4,f#4]@2 ~@2 [b3,d#4,f#4]@2 ~@2 [b3,d#4,f#4]@2 ~@2 [b3,d#4,f#4]@2 ~ [b3,d#4,f#4]", // B
  AH: "[a#3,d4,f4] ~ [a#3,d4,f4] ~ [a#3,d4,f4] ~ [a#3,d4,f4] ~", // A#
  AI: "[a#3,d4,f4]@2 ~@2 [a#3,d4,f4]@2 ~@2 [a#3,d4,f4]@2 ~@2 [a#3,d4,f4]@2 ~ [a#3,d4,f4]", // A#
  AJ: "[d#4,g4,a#4]@2 ~@2 [d#4,g4,a#4]@2 ~@2 [d#4,g4,a#4]@2 ~@2 [d#4,g4,a#4]@2 ~ [d#4,g4,a#4]", // D#
  AK: "[c4,e4,g4]@2 ~@2 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@2 ~ [c4,e4,g4]", // C
  AL: "[c4,f4,g#4]@2 ~@2 [c4,f4,g#4]@2 ~@2 [c4,f4,g#4]@2 ~@2 [c4,f4,g#4]@2 ~ [c4,f4,g#4]", // Fm
  AM: "[b3,e4,g#4]@2 ~@2 [b3,e4,g#4]@2 ~@2 [b3,e4,g#4]@2 ~@2 [b3,e4,g#4]@2 ~ [b3,e4,g#4]", // E
  AN: "[c#4,f4,g#4] ~ [c#4,f4,g#4] ~ [c#4,f4,g#4] ~ [c#4,f4,g#4] ~", // C#
  AO: "[c#4,f#4,a4]@2 ~@2 [c#4,f#4,a4]@2 ~@2 [c#4,f#4,a4]@2 ~@2 [c#4,f#4,a4]@2 ~ [c#4,f#4,a4]", // F#m
  AP: "[d4,f#4,a4]@3 ~ [d4,f#4,a4]@3 ~ [d4,f#4,a4]@3 ~@2 [d4,f#4,a4]@3", AQ: "[~ [d4,f#4,a4] [e4,g#4,b4]@38 ~@8]/3",
})).s("gm_electric_guitar_clean").gain(0.2)

// drums · kick
const kick = s("bd").struct(`<
  [x!4]!87
  [x ~@3 x ~@2 x!2 ~@3 x ~@2 x]!3
  [x ~@3 x ~@3 x ~@3 x ~@2 x]!3
  [x!4]!32
  [x ~@3 x ~@3 x ~@4 x ~@2]
  [~ x ~@6]
  ~@2
>`).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  A B A@7 B A B A@7 B A@7 B A@11 B A@11 C A@10 B A B A B A@3 ~ A@3 ~ A B A B A B A B A@10 ~ A@3 ~ A ~ A B A ~ A ~ A@3 B
  A@3 ~ A ~ A B A B A B A@3 B D ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~ x!3", D: "~ x ~@6",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@9 A ~ A ~@8 B ~@14 C ~@3 D ~@11 B ~ E ~@10 A ~ A ~@3 F ~@3 G ~ A ~ H ~ A ~ D ~@10 F ~@3 I ~ I ~ A B J ~@5 A ~@3 I ~
  I ~ A B ~@2 C ~@3 K ~@3
>`.pickRestart({
  A: "~@3 x", B: "x", C: "~@15 x", D: "~@7 x!2 ~@2 x ~@3 x", E: "~ x ~@2", F: "~@8 x!2 ~ x ~ x ~ x",
  G: "~@8 x ~@3 x!2 ~@2", H: "~@9 x ~ x ~@3 x", I: "~@4 x ~@10 x", J: "~@3 x ~@12", K: "~@13 x ~@2",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct(`<
  A@2 B A@25 B A B A B A B C B A B A B A D B A@7 E A@11 B A@7 B A B A B A@3 B A B A B A D B A@7 B A@3 B A B@3 A B A B A
  D B@2 A@3 B A B@3 A B C B A D F G ~@2
>`.pickRestart({
  A: "x ~@3 x ~@2 x!2 ~@3 x ~@2 x", B: "~@4 x ~@2 x!2 ~@3 x ~@2 x", C: "x!4", D: "~@4 x ~@2 x ~@4 x ~@2 x",
  E: "x ~@3 x ~@2 x ~@4 x ~@2 x", F: "~@4 x ~@2 x!2 ~@4 x ~@2", G: "x",
})).gain(0.2)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~ A ~@17 B ~@7 A ~@7 C ~@3 D ~@22 A ~@7 E ~@3 F ~@3 G ~@3 D ~@10 E ~@3 H ~ I ~@3 J ~ K ~@3 B ~@3 H ~ I ~@3 A ~ L ~@3 H
  ~@3
>`.pickRestart({
  A: "~@8 x!2 ~ x ~@4", B: "~@11 x ~@4", C: "~@7 x ~@8", D: "~@4 x ~@8 x ~@2", E: "x!2 ~ x ~@12", F: "~ x ~@6",
  G: "~@2 x!2", H: "~@3 x", I: "~@11 x ~ x ~@2", J: "~@11 x!3 ~ x", K: "~@4 x!2 ~ x!3 ~ x ~@4", L: "~@3 x ~@8 x ~@3",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@25 A ~ A ~ A ~ A ~ A ~ A ~ A ~ B A ~@7 C ~@11 A ~@7 A ~ A ~ A ~@3 A ~ A ~ A ~ B A ~@7 A ~@3 A ~ A@3 ~ A ~ A ~
  B A@2 ~@3 A ~ A@3 ~ A ~ A ~ B A D ~@2
>`.pickRestart({
  A: "x", B: "x!2", C: "~ x", D: "~ x ~@6",
})).gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct("<A B A@25 B C@22 A@20 B C@54 D E ~@2>".pickRestart({
// … 10 more lines

More by Ross