Strudelify

Lilywhite Lilith

Genesis

KeyE♭ majorTempo80 bpm
0:00/0:00
// Lilywhite Lilith — Genesis
// 80 bpm, 4/4, key D# 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 (2/4 at bar 1, 4/4 at bar 2, 2/4 at bar 5, 4/4 at bar 6, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 59 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · fretless bass · "Bass"
const bass = note(`<
  A@4 B@3 C D E F@3 G H I J B@2 C K@7 E L M N O P@2 Q@2 R S T U V W X Y Z AA AB AC@2 AD AE@7 ~@2
>`.pickRestart({
  A: "[~@19 f1@3 g1@3 ab1@3 a1@3 bb1@36 f1@3 g1@3 ab1@3 a1@3 bb1@36 f1@3 g1@3 ab1@3 a1@3 bb1@48 ab1@4 ~ ab1@2 ~ ab1@8 ~]/4",
  B: "bb1@12 f1 g1 ab1 a1", C: "bb1", D: "ab1@4 ~@2 ab1@2 ~ ab1@9 ~@6 bb1@23 ~", E: "~@2 bb1@23 ~@3 bb1@20",
  F: "[~@6 bb1@23 ~@3 bb1@23 ~@3 bb1@23 ~@3 bb1@23 ~@3 bb1@23 ab1@3 bb1@3 ~@5]/3",
  G: "~@8 ab1@3 bb1@3 ~@23 ab1@3 ~ bb1@3 ~@4", H: "~@9 ab1@3 bb1@3 ~@26 ab1@3 ~ bb1@3",
  I: "~@13 ab1@3 bb1@3 ~@26 ab1@3", J: "bb1@3 ~@14 ab1@3 bb1@3 ~@13 f1@3 g1@3 ab1@3 a1@3",
  K: "[ab1@4 ~@2 ab1@2 ~ ab1@9 bb1@36 f1@3 g1@3 ab1@3 a1@3 bb1@36 f1@3 g1@3 ab1@3 a1@3 bb1@36 f1@3 g1@3 ab1@3 a1@3 bb1@48 ab1@4 ~@2 ab1@2 ~ ab1@9 ~@6 bb1@23 ~@3 bb1@23 ~@3 bb1@23 ~@3 bb1@23 ~]/7",
  L: "~@6 bb1@23 ~@3 bb1@16", M: "~@4 ab2@6 f2@3 ab2@6 f2@3 bb2@13 d3@4 eb3@3 e3@3 f3@3",
  N: "gb3@12 eb2@6 eb3@18 ~ d3@3 eb3@3 e3@3 f3@2", O: "~ gb3@36 d3@3 eb3@3 e3@3 f3@2",
  P: "[~ gb3@12 ~ eb2@6 eb3@18 d3@3 eb3@3 e3@3 f3@3 gb3@36 ~ eb3@3 e3@3 f3@3]/2",
  Q: "[gb3@3 g3@35 eb3@3 e3@3 f3@3 gb3@2 g3@35 ~ eb3@3 ~@2 f3@3 gb3@3, ~@22 e3 ~]/2",
  R: "eb2@3 eb2@3 ~@13 eb2@3 eb2@3 ~@23", S: "~@3 eb2@3 eb2@3 ~@13 eb2@3 eb2@3 ~@20",
  T: "~@5 eb2@3 ~ eb2@3 ~@12 eb2@3 eb2@3 ~@18", U: "~@8 eb2@3 eb2@3 ~@13 eb2@3 eb2@3 ~@15",
  V: "~@10 eb2@3 ~ eb2@3 ~@12 eb2@3 ~ eb2@3 ~@12", W: "~@13 eb2@3 eb2@3 ~@13 eb2@3 eb2@3 ~@10",
  X: "~@15 eb2@3 ~ eb2@3 ~@12 eb2@3 ~ eb2@3 ~@7", Y: "~@18 eb2@3 eb2@3 ~@13 eb2@3 eb2@3 ~@5",
  Z: "~@21 eb2@3 eb2@3 ~@12 eb2@3 ~ eb2@3 ~@2", AA: "~@23 eb2@3 eb2@3 ~@13 eb2@3 eb2@3",
  AB: "~@26 eb2@3 eb2@3 ~@13 eb2@3", AC: "[eb2@3 ~@25 eb2@3 eb2@3 ~@13 eb2@3 eb2@3 ~@26 eb2@3 eb2@3 ~@11]/2",
  AD: "~@2 eb2@3 eb2@3 ~@27 eb2@3 eb2@3 ~@7", AE: "[~@6 eb2@3 eb2@3 ~@26 c2@295 ~@3]/7",
})).s("gm_fretless_bass").gain(0.48).pan(0.6)

// other · electric guitar clean · "Clean Guit"
const electric_guitar_clean = note("<~@8 A B C D@2 ~@12 E@2 F G ~@30>".pickRestart({
  A: "~@11 f4", B: "~@2 c4@19 ~ g4@6 bb3@19 ~", C: "c5@6 eb4@13 bb3@6 ~ d5@6 f4@16",
  D: "[~@4 c5@3 a4@3 f4@19 ~ c5@3 ab4@3 eb4@19 ~ g4@3 eb4@3 bb3@19 ~@15]/2",
  E: "[~@14 f4@6 c4@19 ~ g4@6 bb3@19 ~ c5@6 eb4@13 bb3@6 ~ d5@4]/2", F: "~@2 f4@19 ~ c5@3 a4@3 f4@19 ~",
  G: "c5@3 ab4@3 eb4@19 ~ g4@3 eb4@3 bb3@16",
})).s("gm_electric_guitar_clean").gain(0.35).pan(0.2)

// other · overdriven guitar · "Lead Guita"
const overdriven_guitar = note("<~@13 A@4 ~@42>".pickRestart({
  A: "[~@24 db5@6 ~ c5@6 f4@45 ~@7 c5@36 ~@3 c5@4 ~ db5@4 c5@4 eb5@25 ~ f5@18 ~@7]/4",
})).s("gm_overdriven_guitar").gain(0.43).pan(0.3)

// other · distortion guitar · "Fuzz Guita"
const distortion_guitar = note(`<
  A@4 B@3 C D ~@3 E F G H I B@2 C J@6 ~@3 K L M N@2 O@2 P Q R S T U V W X Y Z AA@2 AB AC@3 ~@6
>`.pickRestart({
  A: "[~@19 f2@3 g2@3 ab2@3 a2@3 bb2@36 f2@3 g2@3 ab2@3 a2@3 bb2@36 f2@3 g2@3 ab2@3 a2@3 bb2@48 ab2@4 ~ ab2@2 ~ ab2@8 ~]/4",
  B: "bb2@12 f2 g2 ab2 a2", C: "bb2", D: "ab2@4 ~@2 ab2@2 ~ ab2@9 bb2@26 ~@4", E: "~@37 ab2@3 bb2@3 ~@5",
  F: "~@8 ab2@3 bb2@3 ~@23 ab2@3 ~ bb2@3 ~@4", G: "~@9 ab2@3 bb2@3 ~@26 ab2@3 ~ bb2@3",
  H: "~@13 ab2@3 bb2@3 ~@26 ab2@3", I: "bb2@3 ~@14 ab2@3 bb2@3 ~@13 f2@3 g2@3 ab2@3 a2@3",
  J: "[ab2@4 ~@2 ab2@2 ~ ab2@9 bb2@36 f2@3 g2@3 ab2@3 a2@3 bb2@36 f2@3 g2@3 ab2@3 a2@3 bb2@36 f2@3 g2@3 ab2@3 a2@3 bb2@48 ab2@4 ~@2 ab2@2 ~ ab2@9 bb2@26 ~@34]/6",
  K: "~@4 ab2@6 ab2@2 ~ ab2@5 ~ ab2@3 bb2@14 b2@3 c3@3 db3@3 d3@3", L: "eb3@36 ~ b2@3 c3@3 db3@3 d3@2",
  M: "~ eb3@36 b2@3 c3@3 db3@3 d3@2",
  N: "[~ eb3@18 ~ eb3@12 ~@6 b2@3 c3@3 db3@3 d3@3 eb3@18 eb3@12 ~@7 b2@3 c3@3 db3@3]/2",
  O: "[d3@3 eb3@17 eb3@12 ~@6 b2@3 c3@3 db3@3 d3@2 eb3@17 ~ eb3@12 ~@6 b2@3 c3@2 db3@3 d3@3]/2",
  P: "eb3@3 eb3@3 ~@13 eb3@3 eb3@3 ~@23", Q: "~@3 eb3@3 eb3@3 ~@13 eb3@3 eb3@3 ~@20",
  R: "~@5 eb3@3 ~ eb3@3 ~@12 eb3@3 eb3@3 ~@18", S: "~@8 eb3@3 eb3@3 ~@13 eb3@3 eb3@3 ~@15",
  T: "~@10 eb3@3 ~ eb3@3 ~@12 eb3@3 ~ eb3@3 ~@12", U: "~@13 eb3@3 eb3@3 ~@13 eb3@3 eb3@3 ~@10",
  V: "~@15 eb3@3 ~ eb3@3 ~@12 eb3@3 ~ eb3@3 ~@7", W: "~@18 eb3@3 eb3@3 ~@13 eb3@3 eb3@3 ~@5",
  X: "~@21 eb3@3 eb3@3 ~@12 eb3@3 ~ eb3@3 ~@2", Y: "~@23 eb3@3 eb3@3 ~@13 eb3@3 eb3@3",
  Z: "~@26 eb3@3 eb3@3 ~@13 eb3@3", AA: "[eb3@3 ~@25 eb3@3 eb3@3 ~@13 eb3@3 eb3@3 ~@26 eb3@3 eb3@3 ~@11]/2",
  AB: "~@2 eb3@3 eb3@3 ~@27 eb3@3 eb3@3 ~@7", AC: "[~@6 eb3@3 eb3@3 ~@26 [c3,g3,c4]@76 ~@30]/3",
})).s("gm_distortion_guitar").gain(0.57).pan(0.4)

// chords · rock organ · "Hammond"
const rock_organ = note("<A@4 B C D E ~@9 C D E F@5 ~@11 G@2 H I J@2 K L M@2 N@7 O@6>".pickRestart({
  A: "[~@31 [bb4,d5,f5]@24 [db5,f5,ab5]@24 [bb4,eb5,g5]@24 [bb4,d5,f5]@24 [db5,f5,ab5]@24 [c5,eb5,g5]@24 ~@17]/4", // Bb Db Eb Bb Db Cm
  B: "[bb4,d5,f5]", C: "[bb4,d5,f5] [db5,f5,ab5]", D: "[bb4,eb5,g5] [bb4,d5,f5]", E: "[db5,f5,ab5] [c5,eb5,g5]",
  F: "[~@3 [bb4,d5,f5]@8 [bb4,d5,f5]@4 [db5,f5,ab5]@4 [bb4,eb5,g5]@4 [bb4,d5,f5]@4 [db5,f5,ab5]@4 [c5,eb5,g5]@4 ~@5]/5", // Bb Db Eb Bb Db Cm
  G: "[bb4@17 b4@15, [eb5,g5]]/2", H: "~@5 eb5@38 d5@5, ~@5 [b4,gb5]@43", I: "~ [bb4,eb5,g5]@5",
  J: "[~@10 bb4@51 b4@35, ~@5 [eb5,g5]@43]/2", K: "~@15 eb5@25 ~ d5@7, ~@5 [b4,gb5]@11", L: "~@3 [bb4,eb5,g5]@5",
  M: "[~@21 bb4@25 [db5,db6]@25 [b4,eb5,ab5,b5]@25, ~@7 [eb5,g5,bb5]@17 ~@8]/2", // Db Abm Eb
  N: "[~@13 [bb4,bb5]@13 bb4@25 [db5,db6]@25 [b4,b5]@38 [bb4,bb5,db6]@13 bb4@26 [db5,db6]@26 [c5,eb5,ab5,c6]@38 [bb4,d5,f5,bb5]@13 [c5,e5,g5,c6]@87 ~ f5@18, ~@26 [eb5,g5,bb5]@50 [eb5,ab5]@51 [eb5,g5,bb5]@52 ~@157]/7", // Bb Db B Bbm Db Ab Bb C …
  O: "[~@42 e5@74 f5@73 e5@74 ~@25]/6",
})).s("gm_rock_organ").gain(0.24).pan(0.6)

// chords · rock organ · "Hammond" · soft notes
const rock_organ_soft = note("<~@39 A@2 ~@2 B@2 ~@5 C@6 D@3>".pickRestart({
  A: "[~@8 g4@51 ~@37]/2", B: "[~@6 g4@17 ~@9]/2",
  C: "[~@126 bb5@30 ab5@15 bb5@15 ~@55 c6@18 ~ bb5@28, ~@38 c3@203 ~@47, ~@93 g5@37 ~@14]/6",
  D: "[~@8 ab5@18 ~ bb5@18 g5@74 ~@25]/3",
})).s("gm_rock_organ").gain(0.12).pan(0.6)

// chords · piano
const piano = note("<~@8 A@2 B@3 ~@4 C D E F@8 G@2 ~@29>".pickRestart({
  A: "[~@24 [bb1,bb2]@12 ~ [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7, ~@18 [f4,bb4,d5]@24 ~@2 [f4,a4,c5]@24 ~@2 [eb4,g4,bb4]@23 ~@3]/2", // Bb F Eb
  B: "[~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@10 ~@3 [bb1,bb2]@7 ~@6 [bb1,bb2]@12 ~ [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@19 ~@2, [eb4,ab4,c5]@21 ~@5 [f4,bb4,d5]@22 ~@4 [f4,a4,c5]@21 ~@5 [eb4,ab4,c5]@23 ~@3 [eb4,g4,bb4]@39 ~]/3", // Bb Ab Bb F Ab Eb
  C: "[bb3,d4,f4] [db4,f4,ab4]", D: "[bb3,eb4,g4] [bb3,d4,f4]", E: "[db4,f4,ab4] [c4,eb4,g4]",
  F: "[[ab3,c4,eb4]@6 [ab1,ab2]@3 [ab3,c4,eb4]@6 [ab1,ab2]@3 [bb1,bb2,bb3,d4,f4]@36 ~@12 [bb3,d4,f4]@24 [db4,f4,ab4]@24 [bb3,eb4,g4]@24 [bb3,d4,f4]@24 [db4,f4,ab4]@24 [c4,eb4,g4]@24 [ab3,c4,eb4]@6 [ab1,ab2]@3 [ab3,c4,eb4]@6 [ab1,ab2]@3 ~@6 [bb1,bb2]@12 ~ [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@7 ~@6 [bb1,bb2]@10 ~@3 [bb1,bb2]@7, ~@228 [f4,bb4,d5]@24 ~@2 [f4,a4,c5]@24 ~@2 [eb4,g4,bb4]@23 ~@3 [eb4,ab4,c5]@21 ~@5 [f4,bb4,d5]@22 ~@4 [f4,a4,c5]@21 ~@5]/8", // Ab Bb Db Eb Bb Db Cm Ab …
  G: "[~@6 [bb1,bb2]@12 ~ [bb1,bb2]@7 ~@6 [bb1,bb2]@11 ~@2 [bb1,bb2]@6 ~ [ab3,c4,eb4]@5 ~ [ab1,ab2]@3 [ab3,c4,eb4]@5 ~ [ab1,ab2]@3 [bb3,d4,f4]@26, [eb4,ab4,c5]@23 ~@3 [eb4,g4,bb4]@26 ~@44]/2", // Bb Ab Bb Ab Eb
})).s("gm_piano").gain(0.48).pan(0.8)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note("<~@30 A@6 ~@16 B@7>".pickRestart({
  A: "[[b3,b4]@49 [bb3,bb4]@48 [a3,a4]@49 [bb3,bb4]@49 [b3,g4,b4]@93, eb4, gb4@97 ~@47]/6", // B Bb A Bb Em
  B: "[~@8 [e4,g4,c5]@22 bb4@30 ab4@15 bb4@15 ~@55 c5@18 ~ bb4@36 ab4@18 ~ bb4@18 [e4,g4]@74 ~@25, ~@15 f4@30 [e4,g4]@37 f4@37 ~@49]/7", // C Em
})).s("gm_string_ensemble_1").gain(0.12).pan(0.6)

// chords · church organ · "Church org. 1"
const church_organ = note("<~@12 A@5 ~@42>".pickRestart({
  A: "[~@59 eb4@26 [bb4,f5]@52 ab4@26 [eb4,gb4]@26 [f4,ab4]@26 [eb4,g4,bb4]@25, ~@17 f4@65 ~@38, ~@34 [ab4,c5]@52 ~@51 c5@52 eb5@51]/5", // Bb5 Ebm Fm Eb Ab
})).s("gm_church_organ").gain(0.24).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z I J K AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT
  AU AV ~@8
>`.pickRestart({
  A: "~@31 x ~@16", B: "~@4 x ~@14 x ~@11 x ~@16", C: "~@7 x ~@8 x ~@20 x ~@5 x ~@4", D: "~@7 x ~@8 x ~@31", E: "x",
  F: "x ~@3 x!3 ~", G: "x!2 ~@2 x!2 ~@2", H: "x ~@2 x ~@4 x ~ x ~@5", I: "~ x", J: "~ x ~@12 x ~@9",
  K: "~@3 x ~@12 x ~@7", L: "~@5 x ~@12 x ~@5", M: "~@7 x ~@9 x ~@6", N: "~@8 x ~@28 x ~@10",
  O: "~@9 x ~@2 x ~@28 x ~@6", P: "~@13 x ~@2 x ~@28 x ~@2", Q: "~@17 x ~@2 x ~@9 x ~@17", R: "x ~@7 x ~@2 x ~@4",
  S: "x ~@7 x ~ x!2 ~@4", T: "x ~ x ~ x ~@3 x ~@2 x ~@4", U: "~@3 x ~@4", V: "~@3 x ~@3 x", W: "x!2 ~ x ~@3 x",
  X: "x ~@2 x!2 ~@2 x", Y: "~ x ~@12 x ~", Z: "~@10 x ~@12 x", AA: "~@3 x ~@15 x ~@2 x ~@13 x ~@11", AB: "x ~@2 x ~@4",
  AC: "~ x ~@14 x ~@11 x ~@19", AD: "~ x ~@18 x ~@11 x ~@11 x ~@3", AE: "~@5 x ~@2 x ~@3",
  AF: "~@3 x ~@16 x ~@11 x ~@15", AG: "~ x ~@17 x ~@14 x ~@13", AH: "x ~@18 x ~@2 x ~@25",
  AI: "~@3 x ~@2 x ~@15 x ~@2 x ~@22", AJ: "~@5 x ~@3 x ~@14 x ~@2 x ~@20", AK: "~@8 x ~@2 x ~@15 x ~@2 x ~@17",
  AL: "~@10 x ~@3 x ~@14 x ~@3 x ~@14", AM: "~@10 x ~@2 x ~@2 x ~@15 x ~@2 x ~@12", AN: "~@15 x ~@3 x ~@14 x ~@3 x ~@9",
  AO: "~@18 x ~@2 x ~@15 x ~@2 x ~@7", AP: "~@21 x ~@2 x ~@14 x ~@3 x ~@4", AQ: "~@23 x ~@2 x ~@15 x ~@2 x ~@2",
  AR: "~@26 x ~@2 x ~@15 x ~@2", AS: "x ~@27 x ~@2 x ~@15 x", AT: "~@2 x ~@28 x ~@2 x ~@13",
  AU: "~@2 x ~@2 x ~@22 x ~@6 x ~@2 x ~@9", AV: "~@6 x ~@2 x ~@12 x ~@9 x ~@5 x ~@9",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@47 [~@15 x ~@6 x ~@25] ~@11>").gain(0.3)

// drums · snare
const snare = s("sd").struct(`<
  A B C D E F@2 G H I J K L M N O P G Q G R S T U V W H I J X Y Z AA AB ~ AC AD AE AF AG AH J AI AJ AK AL AA AM H AN AO
  ~@8
>`.pickRestart({
  A: "~@19 x ~@2 x ~@20 x ~@4", B: "~@4 x ~@14 x ~@23 x ~@4", C: "~@19 x ~@8 x ~@14 x ~@4",
  D: "~@4 x ~@14 x ~@11 x ~@16", E: "~@12 x!2 ~@2", F: "~@4 x ~@7 x ~@2 x", G: "~@4 x ~@2 x ~@4 x ~@3",
  H: "~@9 x ~@12 x ~", I: "~@11 x ~@12", J: "x ~@12 x ~@10", K: "~@2 x ~@12 x ~@8", L: "~ x ~@4",
  M: "~@2 x ~@22 x ~@22", N: "~ x ~@12 x ~@9", O: "~@3 x ~@12 x ~@7", P: "~@10 x ~@19 x ~@5 x ~@2 x ~@8",
  Q: "~@4 x ~@2 x ~@4 x ~@2 x", R: "x", S: "~@5 x ~@2", T: "~@2 x ~@2 x ~@4 x ~@2 x ~@2", U: "~@2 x ~@7 x ~@2 x ~@2",
  V: "~ x ~@4 x ~", W: "~@7 x ~@12 x ~@3", X: "~ x ~@7 x ~@2", Y: "~@12 x ~@15 x ~@8 x ~@8 x ~",
  Z: "~@19 x ~@11 x ~@5 x ~@10", AA: "~@19 x ~@4", AB: "~@2 x ~ x!2 ~@33 x ~@8", AC: "~@13 x ~@23 x ~@10",
  AD: "~@13 x ~@24 x ~@9", AE: "~@15 x ~@25 x ~@6", AF: "~@18 x ~@24 x ~@4", AG: "~@21 x ~@24 x ~", AH: "~@23 x ~@24",
  AI: "~@3 x ~@24 x ~@19", AJ: "~@5 x ~@25 x ~@16", AK: "~@11 x ~@4", AL: "~@5 x ~@18", AM: "~@41 x ~@6",
  AN: "~@22 x ~@24 x", AO: "~@25 x ~@22",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@10 A ~@2 B C A ~@14 D ~@6 E ~ F G ~@4 H ~@3 I ~@9>".pickRestart({
  A: "~@29 x ~@18", B: "~@47 x", C: "~@25 x ~@22", D: "~@31 x ~@2 x ~@13", E: "~@17 x ~ x ~@4",
  F: "~@14 x ~@2 x ~@21 x ~@3 x ~@4", G: "~@15 x", H: "~@3 x", I: "~@11 x",
})).gain(0.1)

// drums · low tom
const low_tom = s("lt").struct("<A ~@2 B C ~@3 D ~@7 C ~@3 E F ~@2 G ~@8 H I ~@24>".pickRestart({
  A: "~@25 x ~@2 x ~@19", B: "~@12 x!2 ~@2", C: "~@14 x!2", D: "x", E: "~@3 x ~ x ~@10", F: "~@5 x ~@10",
  G: "~@6 x ~@2 x ~ x ~@4", H: "~@11 x ~ x!2 ~@33", I: "~@7 x ~@16",
})).gain(0.45)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A B ~@11 C D ~@2 E ~@4 F ~@2 G H I ~@9 J ~@14>".pickRestart({
  A: "~@46 x!2", B: "~@2 x!2 ~@12", C: "~ x!2 ~@13", D: "~@3 x!2 ~@11", E: "~@16 x!2 ~@6 x ~@23",
  F: "~@12 x!2 ~@28 x ~@2 x ~@2", G: "~@13 x ~@34", H: "~@7 x!2 ~ x ~@37", I: "~@7 x ~@2 x ~@31 x ~@3 x ~",
  J: "~@7 x ~@16",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A B C ~ D ~@3 E ~@16 F ~@2 G ~@4 H I J ~@11>".pickRestart({
  A: "~@9 x ~@6", B: "~@31 x ~@16", C: "~@19 x ~@4", D: "~@2 x ~@2 x ~@18", E: "~@7 x", F: "~@47 x", G: "~ x ~@10",
  H: "~@17 x ~@30", I: "~@19 x ~@28", J: "~@5 x ~@10",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@21 [~ x ~@6] ~@7 [~@10 x ~@28 x ~@8] ~@2 [~@7 x ~@16] ~@26>").gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  A B@2 C D E F G H ~@3 I ~@3 J K F G H L M@2 N ~@4 O P Q R S T U ~@8 V ~@5 W ~@8
>`.pickRestart({
  A: "~@31 x ~@11 x ~@4", B: "~@7 x ~@11 x ~@11 x ~@11 x ~@4", C: "~@7 x ~@11 x ~@5 x ~@22", D: "x", E: "x!2 ~ x",
  F: "x!4", G: "x ~ x ~ x ~ x!2", H: "~@3 x ~@4", I: "~@17 x ~@6", J: "~@17 x ~@2 x ~@27", K: "x!3 ~ x ~ x ~",
  L: "~@3 x!3 ~ x", M: "~ x ~ x ~ x ~ x", N: "~ x!2 ~@3 x ~", O: "~@11 x ~@12", P: "x ~@2 x ~@4", Q: "~ x ~@46",
  R: "~ x ~@18 x ~@17 x ~@9", S: "~@20 x ~@18 x ~@8", T: "~@5 x ~@6", U: "~ x ~@17 x ~@17 x ~@10", V: "~@7 x ~@16",
  W: "~@19 x ~@4",
})).gain(0.35)
// … 29 more lines

More by Genesis