Strudelify

I Touch Myself

Divinyls

KeyF majorTempo110 bpm
0:00/0:00
// I Touch Myself — Divinyls
// 110 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 16, 4/4 at bar 16, 2/4 at bar 25, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: ch 8 "ELEC GUITAR" named as a guitar, played on electric guitar clean (its lead 8 bass lead patch is not one)
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/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 · lead 1 square · "MELLOW SYNTH"
const lead_1_square = note("<~@80 A@32 B>".pickRestart({
  A: "[[f5,bb5]@3 ~ [f5,bb5]@3 ~ [f5,bb5] ~ [f5,bb5]@3 ~ [f5,a5]@6 [f5,a5]@4 [f5,a5] ~ [f5,a5]@3 ~ [f5,bb5]@5 ~ [f5,bb5]@4 [f5,bb5] ~ [f5,bb5]@4 [f5,a5]@6 [f5,a5]@4 [f5,a5] ~ [f5,a5]@6]/4", // Bb5 F Bb5 F
  B: "[f5,bb5]@2 c6!2 ~@4, ~@6 f5 ~@9", // Bb5
})).s("gm_lead_1_square").gain(0.25)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@2 A B C D E@8 F G@2 H@2 I@4 J K L M N O P Q R@8 F G@2 H@2 S@3 T U V W@2 X@2 Y Z AA AB AC AD AE AB AF AG AH AI AJ AK
  AL AM AN@2 AO@2 AP@2 AQ@2 AR@2 AS@2 AT@2 AS@2 AU@2 AS@2 AU@2 AS@2 AT@2 AS@2 AU@2 AS@2 AT@2 AS@2 AU@2 AS@2 AU@2 AV
>`.pickRestart({
  A: "~@4 c3!4", B: "c3@2 c3@2 c3@2 c3@2 c3@2 c3@2 c3 ~ c3 ~", C: "c3 ~ c3@2 c3@2 c3@2 c3 ~ c3@2 c3@2 c3@2",
  D: "c3@2 c3@2 c3@2 c3@2 c3 ~ c3 ~ c3@2 c3 ~",
  E: "[c3@2 c3 ~ e3@4 c3@6 d3@8 a2@2 bb2@6 c3@8 bb2@2 a2@2 c3@2 db3@2 d3@8 a2@2 bb2@6 c3@4 c3@6 c3@2 g2@2 c3@2 d3@4 d3@4 a2@2 bb2@6 c3@6 c3@2 bb2@2 a2@2 c3@2 db3@2 d3@8 bb2@2 bb2@8]/8",
  F: "c3@2 c3@2 c3!3 a2", G: "[bb2@4 c3@3 f3@3 e3@2 d3@2 c3 a2]/2", H: "[bb2@4 c3@3 f3@3 e3@2 d3 c3 f2 g2]/2",
  I: "[bb2@4 c3@3 a2@5 bb2@6 a2 bb2@3 d3 c3@3 c3@2 c3@2 c3@2]/4", J: "c3@4 c3@4 c3@2 c3 ~ c3 ~ c3 ~",
  K: "c3@2 c3 ~ c3 ~ c3 ~ c3@2 c3 ~ c3@2 c3 ~", L: "c3@2 g2@2 bb2@2 c3@2 eb3@2 eb3@2 eb3@2 eb3 ~",
  M: "eb3@2 eb3@2 eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~", N: "eb3@2 eb3 ~ eb3 ~ f2@4 f2 ~ f2 ~ f2 ~",
  O: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~", P: "f2 ~ f2 ~ f2 ~ ab2@4 ab2 ~ ab2 ~ ab2 ~",
  Q: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~",
  R: "[ab2 ~@3 c3@3 d3@4 a2 bb2@3 c3@4 bb2 a2 c3 db3 d3@4 a2 bb2@3 c3@2 c3@3 c3 g2 c3 d3@2 d3@2 a2 bb2@3 c3@3 c3 bb2 a2 c3 db3 d3@4 bb2 bb2@4]/8",
  S: "[bb2@3 bb2 c3@3 a2@5 bb2@6 a2 bb2@3 d3 c3]/3", T: "c3!8", U: "c3 ~ c3 ~ c3@2 c3 ~ c3 ~ g2@2 bb2@2 c3@2",
  V: "~@2 c3@2 c3@2 c3@2 c3@2 c3@2 c3@2 c3 ~",
  W: "[c3 ~ c3 ~ c3@2 c3 ~ c3 ~ g2@2 bb2@2 c3@4 c3@2 c3 ~ c3 ~ c3@2 c3 ~ c3@2 c3 ~]/2",
  X: "[c3 ~ c3 ~ c3@2 c3@2 c3 ~ g2@2 bb2@2 c3@4 c3@2 c3@2 c3 ~ c3@2 c3 ~ c3@2 c3 ~]/2",
  Y: "c3 ~ c3 ~ c3 ~ c3@2 c3 ~ c3@2 c3 ~ c3 ~", Z: "c3@3 d3@4 a2", AA: "bb2@3 c3@2 c3@2 bb2", AB: "a2 c3 db3 d3@4 a2",
  AC: "bb2@6 c3@4 g2@2 c3 ~ g2@2", AD: "c3@3 d3@2 d3@2 a2", AE: "bb2@3 c3@4 bb2", AF: "bb2!2 c3!2",
  AG: "c3@3 ~ c3@4 c3@2 c3@2 c3@2 c3@2", AH: "c3@2 c3 ~ e3@4 bb2@6 bb2@2", AI: "c3@3 f3@3 e3@2",
  AJ: "d3@2 c3 a2 bb2@3 bb2", AK: "c3@3 f3@2 f3 e3@2", AL: "d3@2 c3@2 d3@2 f3@2 bb2@5 ~ bb2@2", AM: "c3@6 a2@5 ~ a2@4",
  AN: "[bb2@2 a2 bb2@3 a2 bb2@3 d3 c3@5]/2", AO: "[c4@14 f4@6 eb4 e4@3 d4@4 c4@4]/2",
  AP: "[bb3@3 c4@4 f4@2 f4 e4@2 d4@2 c4 a3]/2", AQ: "[bb3@2 e4 c4@3 e4 f4@3 e4@2 d4@2 c4@2]/2",
  AR: "[bb3@6 bb3@2 c4@2 c4@4 f4@4 f4@2 e4@2 e4@2 d4@3 ~ d4@2 a2@2]/2", AS: "[bb2@3 bb2 c3@3 f3@3 e3@2 d3@2 c3 a2]/2",
  AT: "[bb2@3 bb2 c3@3 f3@2 f3 e3@2 d3 e3 f3 c3]/2", AU: "[bb2@3 bb2 c3@3 f3@2 f3 e3@2 d3 c3 f2 g2]/2",
  AV: "bb2!2 ~ f2 ~@4",
})).s("gm_acoustic_bass").gain(0.35)

// chords · drawbar organ · "ELEC ORGAN"
const drawbar_organ = note(`<
  ~@15 A@2 B C D@5 ~@16 A@2 B C E@3 F@4 G@2 H@2 ~@9 I@6 J@2 ~@8 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C K
>`.pickRestart({
  A: "[bb5@7 a5@9, [f5,c6]@31 ~]/2", B: "[f5,bb5,c6]", C: "[f5,a5,c6]",
  D: "[[f5,c6]@13 ~ [f5,a5,c6]@10 [d5,f5,bb5]@22 [e5,g5,c6]@26 ~@8, bb5@7 ~@33]/5", // F5 F Bb C
  E: "[[f5,c6]@13 ~ [f5,a5,c6]@10 [d5,f5,bb5]@24, bb5@7 ~@17]/3", F: "[[e5,c6] [eb5,bb5], g5]/4", G: "[f5,a5,c6]/2",
  H: "[[eb5,ab5,c6]@15 ~]/2", // Ab
  I: "[~@8 bb5@14 a5@18 [f5,bb5,c6]@16 [f5,a5,c6]@16 [f5,bb5,c6]@16 [a4,c5,f5]@7 ~, ~@8 [f5,c6]@31 ~@57]/6", // Fsus4 F Fsus4 F F5
  J: "[[bb4,f5]@3 [e5,g5], c5]/2", K: "[f5,bb5,c6] ~ [f5,bb5,c6] ~ [f5,bb5,c6] ~ [f5,a5,c6]@2 ~@8",
})).s("gm_drawbar_organ").gain(0.2)

// chords · acoustic guitar nylon · "RHYTHM GUITAR"
const acoustic_guitar_nylon = note(`<
  ~@2 A B@3 C@8 D E@2 F@2 G@5 B H I J K L M N@8 O E@2 F@2 P@3 Q R S T U V W X Y Z AA Z Y AB AA AC AD AE@6 AF@2 AG AH AG
  AI AJ AK AL@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 F@2 AM
>`.pickRestart({
  A: "~@8 [c3,g3]@2 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", // C5
  B: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", // C5
  C: "[[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3]@6 [d3,a3]@10 [bb2,f3]@6 [c3,g3]@9 ~ [a2,e3]@2 [c3,g3]@2 [db3,ab3]@2 [d3,a3]@10 [bb2,f3]@6 [c3,g3]@9 ~ [c3,g3]@6 [d3,a3]@10 [bb2,f3]@6 [c3,g3]@10 [a2,e3]@2 [c3,g3]@2 [db3,ab3]@2 [d3,a3]@10 [bb2,f3]@8]/8", // C5 D5 Bb5 C5 A5 C5 Db5 D5 …
  D: "[c3,g3]@2 [c3,g3]!2", E: "[[bb3,c4,f4]@13 ~ [a3,c4,f4]@17 ~]/2", F: "[[bb3,c4,f4]@13 ~ [a3,c4,f4]@18]/2",
  G: "[[bb3,c4,f4]@13 ~ [a3,c4,f4]@8 ~@2 [bb2,f3,bb3]@13 ~ [bb2,f3,bb3]@7 ~ [c3,g3,c4]@26 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~]/5", // Bbsus2 F Bb5 C5
  H: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [eb3,bb3]@2 [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~", // C5 Eb5
  I: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~", // Eb5
  J: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~", // Eb5 F5
  K: "[f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~", // F5
  L: "[f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [f3,c4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~", // F5 Ab5
  M: "[ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~ [ab3,eb4] ~", // Ab5
  N: "[[ab3,eb4] ~ bb2@2 b2@4 [c3,g3]@6 [d3,a3]@10 [bb2,f3]@6 [c3,g3]@9 ~ [a2,e3]@2 [c3,g3]@2 [db3,ab3]@2 [d3,a3]@10 [bb2,f3]@6 [c3,g3]@9 ~ [c3,g3]@6 [d3,a3]@10 [bb2,f3]@6 [c3,g3]@10 [a2,e3]@2 [c3,g3]@2 [db3,ab3]@2 [d3,a3]@10 [bb2,f3]@8]/8", // Ab5 C5 D5 Bb5 C5 A5 C5 Db5 …
  O: "[c3,g3]@4 [c3,g3]@2 [c3,g3] ~", // C5
  P: "[[bb3,c4,f4]@13 ~ [a3,c4,f4]@8 ~@2 [bb2,f3,bb3]@13 ~ [bb2,f3,bb3]@7 ~ [c3,g3,c4]@2]/3", // Bbsus2 F Bb5 C5
  Q: "[g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4]@2 [g3,c4,e4] ~", // C
  R: "[g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~", // C
  S: "[g3,bb3,eb4]@2 [g3,bb3,eb4] ~ [g3,bb3,eb4]@2 [g3,bb3,eb4] ~ [g3,bb3,eb4]@2 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~", // Eb
  T: "[g3,bb3,eb4]@2 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4]@2 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~", // Eb
  U: "[a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4]@2 [a3,c4,f4] ~ [a3,c4,f4]@2 [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~", // F
  V: "[a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4]@2 [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~", // F
  W: "[c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4]@2 [c4,eb4,ab4] ~ [c4,eb4,ab4]@2 [c4,eb4,ab4] ~", // Ab
  X: "[c4,eb4,ab4]@2 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~", // Ab
  Y: "[c3,g3]@3 [d3,a3]@5", Z: "[bb2,f3]@6 [c3,g3]@9 ~", AA: "[a2,e3] [c3,g3] [db3,ab3] [d3,a3]@5",
  AB: "[bb2,f3]@3 [c3,g3]@5", AC: "[bb2,f3,bb3]@3 ~ [bb2,f3,bb3]@3 ~ [c3,g3,c4]@4 [c3,g3,c4]@3 ~",
  AD: "[c3,g3,c4]@3 ~ [c3,g3,c4]@3 ~ [c3,g3,c4]@2 [c3,g3,c4]@2 [c3,g3,c4]@2 [c3,g3,c4] ~", // C5
  AE: "[[c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4]@2 [c3,g3,c4]@2 [bb3,c4,f4]@13 ~ [a3,c4,f4]@17 ~ [bb3,c4,f4]@13 ~ [a3,c4,f4]@18 [bb3,c4,f4]@16 [a3,c4,f4]@7 ~]/6", // C5 Bbsus2 F Bbsus2 F Bbsus2 F
  AF: "[[bb3,d4,f4]@23 ~ [g3,c4,e4]@8]/2", AG: "[g3,c4,e4] ~@3 [g3,c4,e4] ~@2 [g3,c4,f4]",
  AH: "~@2 [g3,c4,e4] ~ [g3,c4,d4] ~ [g3,c4,f4] ~", AI: "~@4 [g3,c4,e4] ~@3 [g3,c4,d4] ~@3 [g3,c4,f4]@2 ~@2",
  AJ: "[g3,c4,e4]@2 ~@6 [g3,c4,e4]@2 ~@4 [g3,a3,c4,f4] ~", AK: "~@4 [g3,c4,e4] ~@3 [g3,c4,d4] ~@3 [g3,c4,f4] ~@3",
  AL: "[[g3,c4,e4]@2 ~@6 [g3,c4,e4] ~@5 [g3,c4,f4]@4 [g3,c4,f4] ~ [g3,c4,f4]@2 [g3,c4,f4] ~ [g3,c4,f4]@2 [g3,c4,f4]@2 [g3,c4,f4]@2 [g3,c4,f4]@2]/2", // C Csus4
  AM: "[bb3,f4] ~ [bb3,f4] ~ [c4,f4] ~ [a3,c4,f4]@2 ~@8", // Bb5 F5 F
})).s("gm_acoustic_guitar_nylon").gain(0.4)

// chords · electric guitar clean · "ELEC GUITAR"
const electric_guitar_clean = note(`<
  ~@2 A B@3 C D E D F D E G H I@5 J@5 K@2 L@4 M D E D F D E N O P@7 Q@7 R S T U T S T U V W X Y Z Y AA AB AC@2 ~@4 AD AE
  AF AG AH@32 AI
>`.pickRestart({
  A: "~@4 [eb5,ab5] [d5,g5] [g4,c5] [eb5,ab5]", // Ab5 G5 C5 Ab5
  B: "[d5,g5] [g4,c5] [eb5,ab5] [d5,g5] [eb5,ab5] [d5,g5] [g4,c5] [eb5,ab5]", // G5 C5 Ab5 G5 Ab5 G5 C5 Ab5
  C: "[d5,g5]@2 [g4,c5]@2 [eb5,ab5]@2 [d5,g5]@2 ~@4 [c4,e4,g4] ~@3", // G5 C5 Ab5 G5 C
  D: "~@2 [f4,a4,d5]@4 ~@6 [bb3,c4,f4]@2 [bb3,c4,f4] ~", E: "~@2 [c4,e4,g4]@4 ~@6 [c4,e4,a4] ~@3",
  F: "~@2 [c4,e4,g4]@4 ~@6 [c4,e4,g4] ~@3", G: "~@2 [f4,a4,d5]@4 ~@6 [bb3,c4,f4]@3 ~",
  H: "[g3,c4,e4]@4 [g3,c4,e4]@3 ~ [g3,c4,e4]@3 ~ [g3,c4,e4]@4", // C
  I: "[[bb3,f4]@3 ~ [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4 [a3,f4]@2 [a3,g4]@4 [bb3,f4]@5 ~ [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4 [a3,f4]@2 [a3,g4]@4 [bb3,f4]@6 [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@4 [a3,f4]@2]/5", // Bb5 Bbdim Dm A7 Bb5 Bbdim Dm A7 …
  J: "[~@4 [a3,f4]@4 [bb3,f4]@13 ~ [bb3,f4]@8 [c4,g4]@26 [g3,c4,e4]@23 ~]/5", // Dm Bb5 C5 C
  K: "[~@2 [c4,e4,g4] ~@3 [bb3,eb4,g4]@26]/2", // C Eb
  L: "[~@2 [bb3,eb4,g4] ~@3 [c4,eb4,a4]@27 ~ [c4,eb4,a4] ~@3 [c4,eb4,ab4]@18 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4]@2 ~@2]/4", // Eb Adim Ab
  M: "~@12 [c4,e4,g4] ~@3", N: "~ [f4,a4,d5]@2 ~@3 [bb3,c4,f4] ~",
  O: "[g3,c4,e4]@4 [g3,c4,e4]@3 ~ [g3,c4,e4]@4 [g3,c4,e4]@2 ~@2", // C
  P: "[[bb3,f4]@3 ~ [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4 [a3,f4] ~ [a3,g4]@4 [bb3,f4]@5 ~ [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4 [a3,f4] ~ [a3,g4]@4 [bb3,f4]@6 [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@4 [a3,f4]@5 ~ [a3,f4]@4 [bb3,f4]@13 ~ [bb3,f4]@8 [c4,g4]@2]/7", // Bb5 Bbdim Dm A7 Bb5 Bbdim Dm A7 …
  Q: "c3!16", R: "c3!9 ~@7", S: "~@4 [c4,e4,g4] ~@5 [f4,a4,d5]@4 ~@2",
  T: "~@4 [bb3,c4,f4]@2 [bb3,c4,f4] ~@3 [c4,e4,g4]@4 ~@2", U: "~@4 [c4,e4,a4] ~@5 [f4,a4,d5]@4 ~@2",
  V: "[bb3,d4,f4] ~ [bb3,d4,f4] ~@3 [c4,e4,g4] ~", W: "~@2 [c4,e4,g4] ~@3 [c4,e4,g4] ~",
  X: "~@4 [c4,e4,g4]@2 ~@2 [bb3,f4]@3 ~ [bb3,f4]@3 ~", Y: "[bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4",
  Z: "[a3,f4] ~ [a3,g4]@4 [bb3,f4]@5 ~ [bb3,f4]@3 ~", AA: "[a3,f4] ~ [a3,g4]@4 [bb3,f4]@6 [bb3,f4]@3 ~",
  AB: "[bb3,f4]@2 [bb3,e4]@5 ~ [a3,f4]@7 ~", // Bb5 Bbdim Dm
  AC: "[[bb3,f4]@4 [a3,f4]@2 [bb3,f4]@6 [a3,f4]@2 [bb3,f4]@5 ~ [d3,bb3,d4]@2 [c3,g3,c4]@10]/2", // Bb5 Dm Bb5 Dm Bb5 Gm C5
  AD: "c3@2 c3 ~ c3@2 c3@2 c3@2 c3@2 c3@2 c3 ~", AE: "c3@2 c3 ~ c3@2 c3@2 c3@2 c3@2 c3@2 c3@2", AF: "c3!8",
  AG: "c3@2 c3@2 c3@2 c3@2 c3@2 c3@2 c3@2 c3 ~",
  AH: "[[bb3,f4]@3 ~ [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4 [a3,f4]@2 [a3,g4]@4 [bb3,f4]@5 ~ [bb3,f4]@3 ~ [bb3,f4]@2 [bb3,e4]@3 ~ [a3,f4]@5 ~ [a3,f4]@4 [a3,f4]@2 [a3,g4]@4 [bb3,f4]@2]/4", // Bb5 Bbdim Dm A7 Bb5 Bbdim Dm A7 …
  AI: "[f3,bb3,f4] ~ [f3,bb3,f4] ~ [f3,c4,f4] ~ [f3,c4,f4]@2 ~@8", // Bb5 F5
})).s("gm_electric_guitar_clean").gain(0.3)

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

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@6 [~@3 x ~@4] ~@7 [~@13 x ~@2] ~@39 [~@5 x ~ x] ~@58>").gain(0.4)

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

// drums · high tom
const high_tom = s("ht").struct("<~@10 A ~@20 A ~@7 B ~@18 B ~@28 C ~@15 C ~@9>".pickRestart({
  A: "~@3 x ~@4", B: "~@7 x", C: "~@14 x!2",
})).gain(0.5)

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

// drums · ride
const ride = s("rd").struct("<~@80 A B@7 A B@7 A B@7 A B@7 ~>".pickRestart({
  A: "~ x!3", B: "x!4",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@6 [~@3 x] [~ x ~ x]!105 [x ~@2 x ~@4]>").gain(0.5)

// drums · shaker
const shaker = s("sh").struct("<~@47 [x!4]!8 ~@25 [~ x ~ x ~ x ~ x]!32 ~>").gain(0.45)

stack(
// … 3 more lines