Strudelify

Angel Eyes

Wet Wet Wet

KeyG majorTempo98 bpm
0:00/0:00
// Angel Eyes — Wet Wet Wet
// 98 bpm, 4/4, 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: pitch bends are ignored
// note: Full arrangement: all 125 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/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(`<
  A@3 B C D E B F G H I J K L I M N K I M K O I M P L Q R S T U V U V U W X Y I M K L I M K L I M K L I M K T U V U V U
  W X Z I M K L I M K L I M K L I M K L AA AB AC AD AA AB AC AE AF AG AH AI AJ T U V U V U W X Z I M K L I M K L I M K L
  I AK AL AK AL AK AM@6
>`.pickRestart({
  A: "[[g3,c4,e4] [g3,b3,d4] [g3,c4,e4] [a3,c4,e4]@5]/3", B: "[g3,b3,d4]@5 ~ [g3,b3,d4] ~ [g3,b3,d4]@7 ~",
  C: "[f#3,b3,d4]@6 [f#3,b3,d4] ~ [f#3,b3,d4]@3 ~ [f#3,b3,d4]@3 ~", D: "[g3,c4,e4]@6 [g3,c4,e4] ~ [g3,c4,e4]@7 ~",
  E: "[a3,c4,e4]@6 [a3,c4,e4] ~ [a3,c4,e4]@4 [a3,c4,e4]@4", F: "[f#3,b3,d4]@6 [f#3,b3,d4] ~ [f#3,b3,d4]@7 ~",
  G: "[g3,c4,e4]@6 [g3,c4,e4]@5 ~ [g3,c4,e4]@4", H: "~@2 [c4,e4,g4] ~ [c4,e4,g4]@12",
  I: "[g3,b3,d4]@3 [g3,b3,d4]@3 [g3,b3,d4]@2", J: "[b3,d4,f#4]@3 [b3,d4,f#4]",
  K: "[g3,c4,e4]@3 [g3,c4,e4]@3 [g3,c4,e4]@2", L: "[a3,c4,e4]@3 [a3,c4,e4]@3 [a3,c4,e4]@2",
  M: "[f#3,b3,d4]@3 [f#3,b3,d4]@3 [f#3,b3,d4]@2", N: "[g3,c4,d4,e4]@3 [g3,c4,d4,e4] [c4,d4] ~ e4@2, ~ g3, ~@5 c4@3",
  O: "[a3,c4,d4]@3 [g3,c4,e4]", P: "[e3,g3,c4]@3 [e3,g3,c4]@3 [e3,g3,c4]@2",
  Q: "[g3,b3,d4]@3 [g3,b3,d4]@3 [b3,d4,g4]@2", R: "[b3,d4,f#4]@3 [b3,d4,f#4]@3 [b3,d4,f#4]@2",
  S: "[c4,e4,g4]@3 [c4,e4,g4]@2 [c4,e4,g4]@2 [c4,e4,g4]", T: "[g3,c4,e4] [f#3,b3,d4] [g3,a3,c4,e4] [a3,d4,f#4]",
  U: "[a#3,c#4,d#4,g#4] ~@2 [a#3,c#4,d#4,g#4] ~@2 [a#3,c#4,d#4,g#4] ~", // A#m7
  V: "[a#3,c#4,d#4,g4] ~@2 [a#3,c#4,d#4,g4] ~ a#3 [g#3,c4] g3, ~@3 [d#4,g#4]", // D#7 G# G#5
  W: "[a#3,c#4,d#4,g4] ~@2 [a#3,c#4,d#4,g4]@5", X: "[g3,a3,c4,d4]@3 [g3,a3,c4,d4]@3 [g3,a3,c4,d4]@2",
  Y: "[a3,b3,d4,f#4]@3 [a3,b3,d4,f#4]@3 [a3,b3,d4,f#4]@2", Z: "[a3,b3,d4,e4]@3 [a3,b3,d4,e4]@3 [a3,b3,d4,e4]@2",
  AA: "[b3,e4,g4] ~@5 [b3,e4,g4]@10", AB: "[a3,d4,f#4] ~@5 [a3,d4,f#4]@10", AC: "[g3,c4,e4] ~@2 [g3,c4,e4]@5",
  AD: "[g3,c4,e4]@8 [a3,d4,f#4]@7 ~", AE: "[a3,d4,f#4]@12 [d4,f#4,b4]@3 ~", AF: "[g3,c4,e4]@3 [g3,c4,e4]",
  AG: "[a3,d4,f#4]@3 [a3,d4,f#4]", AH: "[c4,e4,g4]@3 [c4,e4,g4]", AI: "[d4,f#4,a4]@3 [f#4,a4,d5]",
  AJ: "[g4,c5,e5]@3 [g4,c5,e5]@5", AK: "[g3,c4,e4]@3 [f#3,b3,d4]@5", AL: "[g3,b3,d4]@3 [g3,b3,d4]@5",
  AM: "[~ d#4@18 ~@8 d#4@2 ~@3 f#4@2 ~ g#4@5 ~ [g#4,b4]@43 ~@12, [e3,g#3,b3]@19 f#3@21 [e3,d#4]@43 ~@13, ~@5 [a3,c#4]@5 ~@14, ~@10 e4@5 e4@5 ~@28]/6", // G#m E Emaj7 A
})).s("gm_piano").gain(0.4)

// bass · electric bass finger
const bass = note(`<
  A@3 B C D E F G H I J K L M F K L N O P Q I R P S T U V Q W X Y X Y X Z AA AB AC@2 L AD AE P AF AG AH G AI AJ AK AL AM
  W X Y X Y X Z AA AB AC@2 L AD AE P AN AO AP@2 AQ AD AR@2 AS AT AU AV AW AX AY AV AZ BA BB BC BD BC BE W X Y X Y X BF
  BG BH BI@2 BJ AD BK@2 BL BM BN@2 BL BO BP BQ BR BS BT BS BU@3 BV@3
>`.pickRestart({
  A: "[c3 b2 a2 d2@5]/3", B: "g1@6 g1 ~ g1@8", C: "b1@5 ~ b1 ~ b1@8", D: "c2@5 ~ c2 ~ c2@8", E: "d2@6 d2 ~ d2@6 d2 b1",
  F: "g1@3 g1 g1@3 g1", G: "b1@3 b1 b1@3 b1", H: "c2@3 c2 c2@4", I: "~@2 d2 ~ d2@12", J: "g1@3 g1 g1@4",
  K: "b1@6 b1@2 b1@6 a1 b1", L: "c2@6 c2@2 c2@6 b1 c2", M: "d2@6 d2@2 d2@6 d2 b1", N: "d2@6 d2@2 d2@2 d2 e2 g2@2 g2 d2",
  O: "g1@5 ~ g1@2 g1@6 g1 a1", P: "b1@6 b1@2 b1@6 b1 a1", Q: "c2@2 d2 e2 g2 ~ c3@4 b2@6",
  R: "g1@6 g1@2 g1@2 g2@4 g2 d2", S: "c2@6 c2 ~ c2@6 c2@2", T: "d2@6 d2!3 ~ g2@4 e2 d2", U: "g1@6 g1 ~ g1@6 g1@2",
  V: "b1@5 ~ b1 ~ b1@6 b1 a1", W: "a1 b1 c2 d2", X: "d#2@4 d#2@5 ~@3 a#1 c2 ~ a#1",
  Y: "d#2@2 d#2@2 f2 ~ d#2@4 a#1@4 c2 ~", Z: "d#2@2 d#2@2 f2 ~ d#2@4 d#2 f2@5", AA: "a1@3 a1!2 a2!2 a1",
  AB: "b1@3 b1 d2 e2 g2@2", AC: "[g1@6 g1@2 g1@2 a1@2 a#1@2 b1@8 b1@2 b1@6 a1 b1]/2", AD: "d2@3 d2!2 e2 g2 g1",
  AE: "g1@3 g1!2 a1 a#1 b1", AF: "c2@6 c2@2 c2@6 c2 b1", AG: "d2@3 d2 d2@2 b2@2", AH: "g1@6 d2 e2 g2 ~ g2@4 g2 d2",
  AI: "c2@3 c2 c2@3 c2", AJ: "d2 g2 a2 e2@2 d2@2 d2", AK: "g1@2 b2 d3 g2@2 g2@4 d2 g2 g2@2 e2 d2", AL: "b1@6 b1 ~ b1@8",
  AM: "c2 e2 g2 a2@2 g2@3", AN: "c2@5 ~ c2@6 g2@2 e2 c2", AO: "d2@7 d2 d2@2 e2@2 g2@2 g1@2",
  AP: "[g1@6 g1@2 g1@2 a1@2 a#1@2 b1@8 b1@8 b1 a1]/2", AQ: "c2@6 c2@7 ~ c2 a1",
  AR: "[g1@6 g1@2 g1@2 a1@2 a#1@2 b1@8 b1@2 b1@6 b1 a1]/2", AS: "c2@4 d2@2 e2@2 a2@3 g2@3 e2 c2",
  AT: "d2 ~ d2 ~ d2@4 d2 ~ d2@6", AU: "e1@4 g1@2 e1@2 b1@2 b1@4 a1 b1", AV: "b1@6 b1 ~ b1@3 a1 b1@2 b1@2",
  AW: "c2@4 b1@4 a1 ~ g1@5 g1", AX: "a1@6 g1 a1 b1@4 b1 c2 d2@2", AY: "g1@4 e1@2 g1@2 b1@2 b1@4 a1 b1",
  AZ: "c2@4 b1@4 a1 ~ g1@6", BA: "b1@3 b1 b1@2 b1!2", BB: "a1@3 a1 a1@3 a1", BC: "b1@6 b1@2 b1@6 b1 g1",
  BD: "a1@6 a1 ~ a2@3 g2@3 e2@2", BE: "a1@6 a1@2 a1@4 a1 b1@3", BF: "d#2@2 d#2@2 f2 ~ d#2@4 f2@6",
  BG: "a1@4 a2 e2 a1@4 a2@3 e2 a1!2", BH: "b1@3 b1 d2 e2 g2 g1",
  BI: "[g1@6 g1@2 g1@2 a1@2 a#1@2 b1@8 b1@2 b1@5 ~ b1 a1]/2", BJ: "c2@6 c2@2 c2@5 ~ c2 a1",
  BK: "[g1@5 ~ g1@2 g1@2 a1@2 a#1@2 b1@8 b1@2 b1@5 ~ b1 a1]/2", BL: "c2@6 c2@8 c2 a1",
  BM: "d2@6 d2 ~ d2@2 e2@2 g2@2 g1@2", BN: "[g2@4 e2@2 d2@2 g1@2 a1@2 a#1@2 b1@8 b1@2 b1@6 b1 a1]/2",
  BO: "d2@6 d2@2 d3!2 b2 g2 d3@2 b2 g2", BP: "g2!2 e2 d2 g2 g1 a1 g1", BQ: "c2@6 b1@4 d2 c2 b1@2 a1 g1",
  BR: "g1@6 g1 ~ g1@2 a1@2 b1@2 g1@2", BS: "c2@3 b1@3 a1 g1", BT: "g2!2 e2 d2 g2 g1 a1 b1",
  BU: "[e2@19 ~ f#2@20 ~@8]/3", BV: "[b2@35 ~@13]/3",
})).s("gm_electric_bass_finger").gain(0.45)

// other · electric guitar clean
const electric_guitar_clean = note(`<
  ~@5 A@2 ~@12 B@2 C@2 D E F G H I@2 ~@2 J K L K M N O P Q R S P Q R T P Q R U P Q R ~@2 J K L K M V O P Q R S P Q R T P
  Q R W P Q R X ~ Y Z ~@2 AA AB@2 ~@7 J K L K M V O P Q R W P Q R T P Q R W P AC@4 AD AE@5 ~
>`.pickRestart({
  A: "[~@2 d4@2 g4 d4 ~ d4@8 ~]/2", B: "[~ g3 a3 g3 d4 a3 g3 a3@9]/2", C: "[~ c4 d4 g3 g4 d4 c4 d4@6 ~@3]/2",
  D: "~ g3 a3 b3!2 g3!2 a3", E: "a3@5 ~ a3@6 a3@4", F: "~ g3 d4 b3 e4 d4 b3 d4", G: "a3@3 a3@3 a3@2",
  H: "~@2 g3@2 b3@2 d4@2 a3!2 a3@2 b3@2 d4@2", I: "[~ g4 e4 d4!2 e4 f#4 g4@9]/2",
  J: "[d#4,d#5]@2 a#4 [d#4,d#5] ~@2 [d#4,d#5]@4 a#4@2 c5!2 g4 ~", K: "~@10 [d#4,d#5]@3 [d#4,d#5]!2 ~",
  L: "d#4@3 [d#4,d#5] ~@2 d#4 ~@3 d#4 ~ [d#4,d#5]!2 ~@2", M: "d#4@3 [d#4,d#5] ~@2 d#4 ~ d#4 ~ d#4@2 [d#4,d#5]!2 ~@2",
  N: "~@2 g3@2 a3 ~ [c4,e4]@4 a3@2 c4@2 e4 ~", O: "[b3,d4,f#4]@6 [b3,d4,f#4] ~ [b3,d4,f#4]@8",
  P: "d4 a3 b3 d4!2 a3 b3 d4", Q: "d4 f#3 a3 d4!2 f#3 a3 d4", R: "d4 g3 d4 e4 d4 g3 b3 d4", S: "d4 g3 a3 d4@5",
  T: "~@3 e4@5, g3, ~ a3@7, ~ c4@3", U: "d4 g3 a3 d4 ~@4", V: "~ g3 a3 [c4,e4]@2 a3 c4 e4",
  W: "d4 ~@2 d4@5, ~ g3@7, ~ a3@3", X: "~ g5 e5 g5@5", Y: "~@8 [e4,e5]!2 ~@2 [e4,e5]@2 [e4,e5] ~",
  Z: "[e4,e5]@3 ~ [e4,e5]@3 ~ [e4,e5] [e4,e5]@2 ~ [e4,e5]@3 ~", AA: "~@8 [e4,e5]!2 ~@2 [e4,e5] ~ [e4,e5] ~",
  AB: "[[e4,e5]@3 ~ [e4,e5]@3 ~ [e4,e5]!2 ~@2 e5@16 ~@4]/2", // E
  AC: "[g3@2 b3@2 c4@2 g3@2 b3@2 c4 b3 a3@2 g3@4 g3@2 a3@2 b3@2 c4@4 a3@2 g3@2]/2",
  AD: "g3@2 b3@2 c4@2 g3@2 b3@2 c4 b3 a3@2 g3@2", AE: "[[g#3,b3,e4]@19 ~ [f#3,a3,c#4]@20 [e3,g#3,b3]@38 ~@2]/5",
})).s("gm_electric_guitar_clean").gain(0.35)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A@3 ~@4 B@2 C D@2 ~@15 E F G H ~@5 I J@3 ~@2 K@2 ~@7 L@2 M H ~@3 N O P Q@3 R S@3 R T@3 R U@3 R V@2 ~@3 W X ~@2 Y Z Y Z
  AA AB H ~@3 N O P Q@3 AC U@3 R U@3 AC S@3 AD AE AD AE AD AF@6
>`.pickRestart({
  A: "[[g3,c4,e4] [g3,b3,d4] [g3,a3,c4] [a3,c4,e4]@5]/3", B: "[~@6 a3 ~ a3 ~ b3@3 ~ a3@18]/2", C: "g3",
  D: "[~@2 [e4,g4] ~ e4@12 d4@16, ~ b3@7]/2", E: "a3@2 b3@3 ~ b3@10", F: "a3@2 b3@13 ~", G: "~@4 d4@3 ~ e4@7 ~, g3",
  H: "[g3,c4,e4] [b3,d4,f#4] [c4,e4,g4] [d4,f#4,a4]", I: "~@10 g4 [a4,b4] a4 [b4,c5] b4 [c5,c#5]",
  J: "[d5@23 ~ d4@2 e4@2 g4 ~ g3@18]/3", K: "[~@8 d4@2 e4@2 g4 ~ g3@18]/2", L: "[~ b3 a3@6]/2", M: "[c4,e4]",
  N: "~@10 g5 g#5 a#5@2 g#5 g5", O: "d#5@6 c#5 a#4 c#5 ~ d#5@4 d#5 a#4", P: "d#5@6 c#5 a#4 c#5 ~ d#5@5 ~",
  Q: "[g4@8 f#4@4 d4 e4 g4 g3@9, [a4,d5] ~]/3", R: "f#3", S: "[g3@23 ~ d4@2 e4@2 g4 ~ g3@18]/3",
  T: "[g3@24 d4@2 e4@2 g4 ~ g3@18]/3", U: "[g3@23 ~ d4@2 e4@2 g4@2 g3@18]/3", V: "[g3@31 ~]/2",
  W: "[e4,g4,c5] [f#4,a4,d5]", X: "[g4,b4,e5] ~@15", Y: "[a3,d4,f#4]", Z: "[c4,e4,g4]", AA: "[d4,f#4,a4]",
  AB: "[c4,e4,g4]@15 ~", AC: "f#3@15 ~", AD: "[g3,c4,e4]@3 [f#3,b3,d4]@5", AE: "[g3,b3,d4]",
  AF: "[[g#3,b3,d#4]@19 ~ [f#3,a3,c#4,e4]@20 [g#3,b3,d#4,b4]@43 ~@13]/6", // G#m F#m7 G#m
})).s("gm_string_ensemble_1").gain(0.4).pan(0.3)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  A@3 ~@3 B@4 C@2 ~@14 D@3 E F G ~ H ~ H I J@3 ~@2 K@2 ~@6 L@3 E M G ~ H ~ H I J@3 ~@2 K@2 ~@2 K@2 ~@2 K@2 ~@2 N O ~@2 P
  O ~@3 Q R S T U V G ~ H ~ H I J@3 ~@2 K@2 ~@2 K@2 ~@2 K@2 W ~ X ~ W Y@6
>`.pickRestart({
  A: "[e5 g5 c5 e5@5]/3", B: "[e4@10 d4@2 e4@2 d4@27 ~ d4@2 a4@2 g4@18]/4", C: "[~@2 b4 ~ g4@28]/2",
  D: "[d4@9 ~ d4@2 e4@2 d4@23 ~ d4@2 e4@2 g4@2 a4@4]/3", E: "g4",
  F: "c5@4 d5@4 e5@4 [f#5,g5] [g#5,a5] [a#5,b5,c6] [c#6,d6]", G: "[d#5,d#6] ~@3 [d#5,d#6] ~@5 [d#5,d#6] ~@5",
  H: "[d#5,d#6] ~@3 [d#5,d#6] ~@11", I: "~@10 g5 [a5,b5] a5 [b5,c6] b5 [c6,c#6]", J: "[d6@23 ~ d5@2 e5@2 g5 ~ g4@18]/3",
  K: "[~@8 d5@2 e5@2 g5 ~ g4@18]/2", L: "[e4@5 d4 e4 d4@17]/3", M: "~@6 a5 b5 c6@2 b5 c6 d6@2 c6 d6",
  N: "~@10 [d#5,e5] [f5,f#5] [g5,g#5] [a5,a#5] [b5,c6] [c#6,d6]", O: "e6 ~@15", P: "c6 d6",
  Q: "b5@3 g5@3 e5@6 g5@2 b5@2", R: "a5@2 a5 f#5@2 f#5 d5@3 c#5 d5 c#5 d5 e5 f5 f#5", S: "g5@3 e5@3 c5@6 e5@2 g5@2",
  T: "f#5@4 a5@6 [b4,c5] [c#5,d5] [d#5,e5] [f5,f#5] [g5,g#5] [a5,a#5]", U: "b5@3 g5@3 e5@7 ~@3",
  V: "a5@2 g5 a5 b5@2 a5 b5 c6@2 b5 c6 d6@2 c6 d6", W: "e5@3 d5@5", X: "e5@5 ~ d5@10",
  Y: "[d#5@19 ~ c#5@20 b5@43 ~@13]/6",
})).s("gm_string_ensemble_1").gain(0.45).pan(0.7)

// other · pizzicato strings
const pizzicato_strings = note("<~@2 A B C@6 D ~@22 E F ~@17 G H I ~@70>".pickRestart({
  A: "g5 ~ e5 ~ c5 ~@11", B: "~@4 g5 ~ f#5 ~ g5 ~ d6 ~ g5 ~ f#5 ~", C: "g5 ~ d5 ~ g5 ~ f#5 ~ g5 ~ d6 ~ g5 ~ f#5 ~",
  D: "~@2 [g5,b5] ~ [g5,b5]@5 ~@7", E: "~@15 c7", F: "[c#7,d#7] ~@15", G: "~@2 d4!3 ~ d4 ~@7 d4 ~",
  H: "e4 ~ e4 ~ e4 ~ e4 ~@5 d4 ~ e4 ~", I: "g4 ~@2 e4 f#4 ~ d4 ~ g4 ~ e4 ~ a4 ~@3",
})).s("gm_pizzicato_strings").gain(0.45)

// other · pad new age
const pad_new_age = note(`<
  A B ~@8 C ~@7 D ~@23 E F G H E ~@18 E I F ~ E@2 ~@3 E ~ J E ~@22 K ~@2 L@2 M ~ L@2 ~@2 L@2 M ~@7 N ~@3
>`.pickRestart({
  A: "e5 ~@2 g5 ~@2 c5 ~", B: "~ e5 ~@6", C: "~@5 g6 ~@2", D: "g6!2 e6!2 c6 ~ a5 g5", E: "g6 ~@2 g6 ~@4", F: "g6 ~@7",
  G: "f#6 ~@7", H: "e6 ~@4 g6 ~@2", I: "a6 ~@2 a6 ~@4", J: "~@6 a6 ~", K: "~ f#5 d5 g5 a5 ~@3", L: "g5 ~@2 g5 ~@4",
  M: "g5 ~@7", N: "~@4 b6 ~@3",
})).s("gm_pad_new_age").gain(0.4)

// other · drawbar organ
const drawbar_organ = note("<A@4 ~@14 B@2 ~@26 C D ~@77>".pickRestart({
  A: "g4/4", B: "[d5!2 b4!2 g4@2 e4 d4@9]/2", C: "~ [e4,g4,c5]", D: "[d4,g4,b4]@13 ~@3",
})).s("gm_drawbar_organ").gain(0.4)

// chords · pad poly
const pad_poly = note("<~@79 A B C D A B C E ~@38>".pickRestart({
  A: "~@3 [g4,b4]", B: "[f#4,a4]", C: "[e4,g4]", D: "e4 f#4, a4", E: "[d4,f#4] ~",
})).s("gm_pad_poly").gain(0.35)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A@6 B C A@19 D E@7 F A@16 E@7 F A@7 G A@7 H A@7 I A@13 J A@13 K A K A L ~@6
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!2 ~ x ~", C: "x!3 ~@5", D: "x ~@2 x!2 ~@2 x", E: "x!2", F: "x ~@6 x ~@8",
  G: "x ~@6 x ~@2 x ~@4 x", H: "x", I: "x!4", J: "x ~@6 x!2 ~@7", K: "x ~@2 x ~@2 x ~", L: "x ~@2 x ~@4",
})).gain(0.45)

// drums · rim
const rim = s("rim").struct("<~@19 A@3 ~ A@3 B A@3 C ~@16 A@3 D A@3 C ~@70>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "~ x ~@2", D: "~@2 x ~@2 x!3",
})).gain(0.45)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@10 A ~@11 A ~@15 A ~@23 A ~@15 B ~@3 A ~@3 C ~@5 A ~@7 A ~@16 D A ~@6>".pickRestart({
  A: "~@7 x", B: "~@2 x!4 ~@2", C: "~@2 x!6", D: "~@15 x",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@18 A ~@15 A ~ B ~@2 A@2 ~ A ~ A ~ A ~@11 A ~ B ~@2 A@2 ~ A ~ A ~@5 A ~@3 C ~@12 B ~@12 A ~@2 A ~@4 A ~@6 D@5 E
>`.pickRestart({
  A: "~@7 x", B: "~@3 x", C: "~ x", D: "x!16", E: "x!4 ~@12",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@10 A ~@11 A ~@15 A ~@23 A ~@15 B ~@3 C ~@9 C ~@7 A ~@16 D A ~@6>".pickRestart({
  A: "~@3 x", B: "~@15 x", C: "~@13 x ~@2", D: "~@7 x",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  ~@31 A ~@5 A B ~@16 A ~@5 A B ~@16 A ~@7 A ~@4 A@2 ~@6 B ~@8 A ~@5 A ~ A C ~@6
// … 21 more lines

More by Wet Wet Wet