Strudelify

Lady in Black

Bad Boys Blue

KeyE majorTempo120 bpm
0:00/0:00
// Lady in Black — Bad Boys Blue
// 120 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
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 · slap bass 2 · "SLAP BASS"
const bass = note(`<
  ~@7 A B C D E F G H I J K L M J K N O P Q R S T U V R T L V R S W A F X Y Z J AA L Z AB AA AC R AD Q R S AE AF AG R AE
  AF V R AH AI AG R AE AF V R K@2 ~@8 AJ AK AL AM AN AO L V R AE L V R T L V R AP L V R AQ L V R AE L V R T N V R T AF
  AG R W AR ~@8
>`.pickRestart({
  A: "f#1@2 ~@2 f#1@2 ~@2 f#1@2 ~@2 c#1 e1 f#1 ~", B: "f#1@2 ~@2 f#1@2 ~@2 f#1@2 ~@2 c#1@2 ~ f#1",
  C: "e1@2 ~@2 e1@2 e2 ~ e1@2 ~@2 e1@2 ~@2", D: "e1@2 e2 ~ e1@2 e2 ~@3 b1 ~ a1 g#1 e1@2",
  E: "f#1@3 ~ f#1@2 ~@2 f#1@2 ~@2 c#1 e1 f#1@2", F: "f#1@2 ~@2 f#1@2 ~@2 f#1@2 ~@2 f#1@2 ~ f#1",
  G: "e1 ~ e2 ~ e1 ~ e2 ~ e1@2 ~@2 e1 ~@2 e2", H: "e1 ~ e2 ~ e1 ~ e1 ~ e1 ~ b1@2 a1 g#1 e1@2",
  I: "f#1 ~ f#2 ~ f#1 ~ f#2 ~ f#1 ~ f#2 ~ f#1@2 a1@2", J: "c#1@2 c#2 ~ c#1@2 c#2 ~ c#1@2 c#2 ~ c#1 ~ c#1 d#1",
  K: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~", L: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1 ~ b1 c#2",
  M: "f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 a1 ~", N: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~",
  O: "a1@2 a2 ~ a1@2 a2 ~ a1 ~ a2 ~ a1 ~ a2 ~", P: "e1@2 e2 ~ e1 ~ e2 ~ e1@2 e2 ~ e1 ~ f#1 g#1",
  Q: "d1@2 d2 ~ d1@2 d2 ~ d1@2 d2 ~ d1@2 d2 ~", R: "a1@2 a2 ~ a1@2 a2 ~ a1@2 a2 ~ a1 ~ a1 b1",
  S: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1 ~ d1 d#1", T: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e2 d2 c#2 a1",
  U: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1@2 b1 c#2", V: "f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 f#2 ~ f#1 ~ f#1 g#1",
  W: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ b1 a1 g#1 e1", X: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1@2 d1 d#1",
  Y: "e1@2 e2 ~ e1@2 e2 ~ e1@2 b1 ~ a1 g#1 e1@2", Z: "f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 a1@2",
  AA: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1 ~ e1 f#1", AB: "c#1@2 c#2 ~ c#1@2 c#2 ~ c#1@2 c#2 ~ c#1@2 c#2 d#1",
  AC: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ d2 c#2 b1 ~", AD: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1@2 f#1 g#1",
  AE: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ d2 c#2 b1 a1", AF: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 c#2",
  AG: "f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 f#2 g#1", AH: "e1@2 e2 ~ e1 ~ e2 ~ e1@2 e2 ~ d2 c#2 b1 a1",
  AI: "b1@2 b2 ~ b1@2 b2 ~ b1 ~ b2 ~ b1 ~ b2 ~", AJ: "a1@12 ~@2 b1 c#2", AK: "e1@11 ~@3 f#1 g#1", AL: "d1@13 ~ b1 c#2",
  AM: "a1@12 b1 a1 g#1@2", AN: "e1@14 b1 c#2", AO: "e1@9 ~ e2 ~ d2 c#2 a1 ~",
  AP: "e1@2 e2 ~ e1@2 e2 ~ e1 ~ f2@2 e2 d2 a1@2", AQ: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ d2 c#2 a1@2",
  AR: "f#1 ~ f#1 f#2 e1 ~ f#1@9 ~",
})).s("gm_slap_bass_2").gain(0.41)

// other · vibraphone
const vibraphone = note(`<
  ~@30 A ~@3 B ~@22 B ~@3 B ~@3 B ~@3 B ~@18 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@2 C ~@8
>`.pickRestart({
  A: "~@10 f#4@2 a4@2 c#5 ~", B: "~@10 f#4 ~ a4 ~ c#5 ~", C: "f#4 ~@5 f#4 ~@9",
})).s("gm_vibraphone").gain(0.26).pan(0.7)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@3 A B C D ~@16 E@7 ~@8 F G H I ~@8 J@7 ~@16 K@2 L M N O C P Q R@6 ~@40
>`.pickRestart({
  A: "~@5 f#3 a3 c#4 f#4 c#4 a3 f#3 ~@4", B: "~@5 c#4 a3 f#3 ~@8, ~@2 f#4 ~@5",
  C: "~@5 e3 g#3 b3 ~ b3 g#3 e3 ~@4, ~@4 f#4 ~@3", D: "~ b3 g#3 e3@2 ~@11, f#4 ~@7",
  E: "[d5@5 c#5@7 e5@15 c#5@4 d5@14 [c5,c#5] ~ e5@37 f#5@3 g#5@4 e5@4 b4@6 ~@11]/7", // C#maj7
  F: "~@10 f#3 ~ c#4 ~ c#4 a3, ~@11 a3@2 f#4@2 ~", G: "~ f#3 ~@14",
  H: "~@10 e3 ~@3 b3 g#3, ~@11 g#3@2 f#4@2 ~, ~@6 b3 ~", I: "e3 ~@15",
  J: "[d5@5 c#5@5 e5@17 c#5@4 d5@12 c#5@4 e5@37 f#5@3 g#5@4 e5@4 b4@7 ~@10]/7",
  K: "[~@12 f#3 a3 c#4 ~ c#4 a3 f#3 ~@13, ~@15 f#4@2 ~@15]/2", L: "~@9 e3 g#3 b3 ~ b3 g#3 e3, ~@6 f#4 ~",
  M: "~@9 b3 g#3 e3 ~@4, ~@4 f#4 ~@3", N: "~@13 f#3 a3 c#4", O: "f#4 c#4 a3 f#3 ~@12", P: "~@4 e3 g#3 b3 f#4 ~@8",
  Q: "~ a2", R: "[e3@11 c#3@4 d3@16 a2@16 ~@16 e4@5 f#4@3 g#4@4 e4@4 [b3,b4]@5 ~@12, ~@47 e3@29 ~@20]/6",
})).s("gm_string_ensemble_1").gain(0.2).pan(0.3)

// other · orchestra hit · "ORCH.HIT"
const orchestra_hit = note("<~@6 A B ~@2 C D ~ E F ~@25 G D ~@30 H D ~@45 I ~@8>".pickRestart({
  A: "~@7 c#5", B: "f#5@11 ~@5", C: "~@3 c#5", D: "f#5@5 ~@11", E: "~@14 c#5 e5", F: "f#5 ~ f#5@2 ~@12", G: "~@7 e5",
  H: "~@12 e5@3 ~", I: "f#5 ~@3 e5 ~ f#5@2 ~@8",
})).s("gm_orchestra_hit").gain(0.36)

// chords · pad poly · "POLYSYNTH"
const pad_poly = note("<~@3 A@8 B@4 ~@12 C@2 ~@9 D@4 ~@12 E@2 ~@17 F@4 G@4 ~@4 C@2 ~@32 H ~@8>".pickRestart({
  A: "[~@32 e3@29 ~@3, [f#2,f#3]@61 ~@3]/4", B: "[~@8 e3@7 ~, [f#2,f#3]@15 ~]/4", C: "[~@3 e4@5, e2, ~@3 e3@13]/2",
  D: "[~@16 e3@15 ~, [f#2,f#3]@63 ~]/4", E: "[~@7 e4@9, ~@3 e2@13, ~@5 e3@11]/2", F: "[~@16 e3@15 ~, [f#2,f#3]@31 ~]/4",
  G: "[~@32 e3@31 ~, [f#2,f#3]]/4", H: "[f#2,f#3] ~@2 [e2,e3] ~@2 [f#2,f#3]@3 ~@7",
})).s("gm_pad_poly").gain(0.26)

// chords · piano · "A.PIANO"
const piano = note(`<
  ~@3 A@2 B@2 C@2 D@2 E@2 F@2 ~@13 G H I J K L M N O@2 P@2 Q@2 ~@13 R S T U V W X Y V W Z Y V W T Y AA AB AC@2 AD@2 AE@2
  AD@2 AF AG AH@2 AI@2 AJ Z AK AL AM Z U AN AO Z Y AN AM AP Y V W T AQ V AM Z Y AR AM T Y V W T AK AS AT ~@8
>`.pickRestart({
  A: "[f#1@15 ~]/2", B: "e1/2", C: "[[f#2,a3,c#4]@31 ~, f#3@29 ~@3]/2",
  D: "[[b3,e4]@7 ~@4 f#4@4 ~, e2@29 ~@3, g#3@4 e3@3 ~, ~@9 g#3@6 ~, ~@20 b3@11 ~]/2", // E5
  E: "[[f#2,c#4,f#4]@15 ~, a3@7 ~]/2", F: "[[g#3,b3,f#4]@29 ~@3, [e2,e3]@13 ~@3]/2",
  G: "~@8 b3@7 ~, ~@2 e2@13 ~, ~@4 e3@9 ~@3, ~@6 g#3@7 ~@3, ~@8 e4@5 ~@3", H: "[b2,b3,d4,f#4]@15 ~",
  I: "[f#3,a3,c#4,f#4]@15 ~", J: "[c#4,e4]@7 ~, a3@3 ~", K: "[e3,b3]@15 ~, [g#3,e4]@13 ~@3", L: "[b2,b3,d4,f#4]@7 ~",
  M: "[f#3,a3,c#4]@15 ~, e4@5 ~@11", N: "[a3,c#4,e4]@7 ~", O: "[[g#3,b3,e4]@29 ~@3, e3@27 ~@5]/2",
  P: "[[f#2,f#3]@25 ~@7]/2", Q: "[[e2,e3,g#3,b3,f#4]@31 ~]/2", R: "~ [e2,g#3,b3,e4], ~@3 e3@4 ~",
  S: "[b3,d4,f#4]@15 ~, b2@13 ~@3, a3 ~@3", T: "[f#3,a3,c#4]@7 ~", U: "[e3,a3,c#4]@15 ~", V: "[e3,g#3,b3]@7 ~",
  W: "[f#3,b3,d4]@15 ~", X: "[a3,c#4]@15 ~, f#3@13 ~@3", Y: "[e3,a3,c#4]@7 ~", Z: "[f#3,a3,c#4]@15 ~",
  AA: "[e3,g#3,b3]@3 ~", AB: "[e3,g#3,b3,e4]@3 ~", AC: "[[f#2,f#3]@27 ~@5]/2", AD: "[[e2,e3,g#3,b3,f#4]@29 ~@3]/2",
  AE: "[[f#2,f#3,a3,c#4]@7 ~]/2", AF: "~@6 b3 c#4, [a2,e4]@15 ~, [a3,c#4]@10 a3@5 ~, ~@8 e3@7 ~",
  AG: "[e3,g#3]@4 ~@2 b3 e4, e4@3 ~, b3@5 g#3@3, ~@4 e3@3 ~", // E
  AH: "[~@4 e4 ~@3 e4 ~@4 a4@3, d3@7 ~@2 a2@5 ~@2, ~@2 f#3@12 ~@6 e3@9 ~@3, ~@4 a3@10 c#4@5 ~@3 b3@10, ~@3 d4@2 f#4@3 ~@4 c#4@4]/2",
  AI: "[~@15 g#4, e3@10 f#4@13 g#3@5 f#4@4, ~ f#3@2 b3@8 e3@3 ~@2, ~@2 g#3@4 g#4@7 e4@3, ~ e4@2 b3]/2",
  AJ: "~@2 d4@5 ~, b2@5 ~@3, ~ d3@9 ~@6, ~ f#3@6 ~, ~@3 b3@11 ~@2", AK: "[e3,c#4]@15 ~, a3@13 ~@3",
  AL: "[g#3,b3,e4]@13 ~@3", AM: "[f#3,b3,d4]@7 ~", AN: "[e3,g#3,b3]@13 ~@3", AO: "[b3,d4]@13 ~@3, f#3@15 ~",
  AP: "[f#3,a3,c#4]@13 ~@3", AQ: "[e3,a3,c#4]@7 ~, d3 ~@15", AR: "[g#3,b3]@13 ~@3, e3@11 ~@5", AS: "[e3,g#3,b3]@11 ~@5",
  AT: "[f#2,f#3]@2 ~@2 [e2,e3] ~ f#2@10, ~@6 f#3@5 ~@5", // F# E
})).s("gm_piano").gain(0.36)

// other · clavinet
const clavinet = note(`<
  ~@42 A B@2 C D E A F G H I J K L ~@8 M N@2 O P Q N O R ~@22 M N@2 S M Q N O M N@2 S M N@2 T M N@2 U M V N W X ~@8
>`.pickRestart({
  A: "~@2 f#3 ~@2 f#3 ~@2 f#3 ~@2 e4@3 f#4 ~", B: "~@2 f#3 ~@2 f#3 ~@2 f#3 ~@2 f#4@3 e4 ~",
  C: "~@2 f#3 ~@2 f#3 ~@2 f#3 ~@3 f#3 ~ f#4 ~, ~@11 e4@3 ~@2", D: "~@2 f#3 ~@2 f#3 ~ f#3 ~@3 e4@3 f#4 ~",
  E: "~@2 f#3 ~@2 f#3 ~@2 f#3 ~@2 f#4 f#4@2 e4 ~, ~@12 f#3 ~@3", F: "~@2 f#3 ~@2 f#3 ~@2 f#3 ~@2 e4 ~ e4 f#4 ~",
  G: "~@5 e4 ~@2 e4 ~@2 f#4 ~ f#4 e4 ~", H: "~@2 e4 ~ e3 e4 ~@2 e4 ~ e4 e3 ~ e3 e4!2",
  I: "~@2 e4 ~@3 f#4 ~ f#4 ~@2 e4@2 ~ f#4 ~, ~@11 f#4 ~@4", J: "~@5 e4 ~ e4 e3 ~ e4 ~ e4 ~ e4!2",
  K: "e3!2 e4 ~@3 e4 ~ e3 ~ e4 e3 ~ e3 e4!2", L: "e3 ~ e4 ~@2 e4 ~@2 e4 ~@2 e3 d4 c#4 b3 a3",
  M: "d5 ~@2 d5 ~@2 d5 ~@3 b4 ~ c#5!2 b4 ~", N: "c#5 ~@2 c#5 ~@2 c#5 ~@3 a4 ~ b4!2 a4 ~",
  O: "b4 ~@2 b4 ~@2 b4 ~@3 a4 ~ b4!2 a4 ~", P: "d5 ~@2 d5 ~@2 d5 ~@5 c#5!2 b4 ~",
  Q: "c#5 ~@2 c#5 ~@2 c#5 ~@3 b4 ~ c#5!2 b4 ~", R: "b4 ~@2 b4 ~@2 b4 ~@3 d4 c#4 [b3,c4] a3 b3 ~",
  S: "b4 ~@2 b4 ~@2 b4 ~@3 a4 ~ b4 ~ a4 ~", T: "b4 ~@2 b4 ~@2 b4 ~@3 b4 ~ c#5 b4 a4 ~",
  U: "b4 ~@2 b4 ~@2 b4 ~@2 a4 ~ a4 b4 ~ a4 ~", V: "c#5 ~@2 c#5 ~@2 c#5 ~@3 a4 ~@3 a4 ~",
  W: "b4 ~@2 b4 ~@2 b4 ~@3 a4 ~@5", X: "f#3 ~ f#3!2 e3 ~ f#3 ~@9",
})).s("gm_clavinet").gain(0.1).pan(0.9)

// other · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note(`<
  ~@15 A B C D E F G H I J K L M N ~@13 O P Q R S T U V W X Y Z AA AB ~@17 AC ~ AD ~@2 AE AF AG AH AI AJ AK AL AM ~@41
>`.pickRestart({
  A: "a5 ~@3 a5 ~@2 a5 ~ a5!7", B: "g#5!6 ~ g#5 ~ g#5!6 ~", C: "g#5 ~ g#5 ~ g#5 ~ g#5!2 ~ g#5 ~ g#5!2 ~ g#5!2",
  D: "f#5!8 ~ f#5!7", E: "a5 ~ a5 ~ a5 ~@2 a5 ~ a5!7", F: "g#5!6 ~ g#5 ~ g#5!7", G: "g#5 ~ g#5 ~ g#5 ~ g#5!2 ~ g#5!7",
  H: "f#5 ~ f#5!6 ~ f#5!7", I: "f#5!3 ~ f#5!3 e5 ~@2 e5 ~ e5!4", J: "e5 ~ e5!4 ~ e5 ~ e5!7",
  K: "f#5!3 ~ f#5!2 ~ f#5 ~ f#5!7", L: "f#5 e5!2 ~ e5 ~ e5!2 ~ e5 ~ e5!2 ~ e5 ~",
  M: "e5 ~ e5 ~ e5 ~@2 e5 ~ e5 ~ e5!2 ~ e5 ~", N: "e5 ~ e5!2 ~ e5!2 ~ e5!8", O: "a5!5 ~ a5!2 ~ a5 ~ a5!5",
  P: "a5!2 ~@2 g#5!4 ~ g#5 ~ g#5 ~ g#5!3", Q: "g#5!5 ~ g#5!6 ~ g#5!3", R: "g#5!2 f#5!14",
  S: "f#5!2 ~@2 a5 ~ a5!3 ~ a5!2 ~ a5!3", T: "a5 ~ g#5!3 ~ g#5 ~ g#5 ~@2 g#5 ~ g#5!3",
  U: "g#5 ~ g#5 ~ g#5 ~ g#5!3 ~ g#5!2 ~ g#5!2 ~", V: "g#5 f#5!2 ~ f#5 ~ f#5!6 ~ f#5!3",
  W: "f#5!3 ~ e5 ~ e5 ~ e5 ~ e5!2 ~ e5!3", X: "e5 ~ e5 ~ e5 ~@2 e5!2 ~ e5!6", Y: "e5 ~ f#5 ~ f#5 ~ f#5!10",
  Z: "f#5 ~ e5!3 ~ e5!6 ~ e5!2 ~", AA: "f#5 ~ e5 ~ e5 ~ e5!10", AB: "f#5 e5 ~@3 e5!11",
  AC: "~@8 f#5 c#5 a4 f#4 c#4 f#4 c#5 f#5", AD: "~@8 f#5 e5 b4 g#4 e4 g#4 b4 f#5",
  AE: "f#5 c#5 a4 f#4 c#4 f#4 ~ c#5 f#5 ~@7", AF: "~@12 f#5 e5 b4 g#4", AG: "e4 g#4 b4 f#5 ~@12", AH: "~@6 a4 ~",
  AI: "~@8 a5 ~ g#5@2 f#5@2 ~@2", AJ: "~@8 f#5@2 d5@3 ~@3", AK: "~@2 a4 c#5 f#5 e5 ~@2", AL: "e4 g#4 ~@4 g#4 ~",
  AM: "~ g#4 b4 ~ g#4 b4 ~ g#5 b4 ~ g#5 ~@2 g#5 ~ e6",
})).s("gm_pizzicato_strings").gain(0.15).pan(0.1)

// other · pizzicato strings · "PIZZICATO" · soft notes
const pizzicato_strings_soft = note(`<
  ~@15 A ~ B ~ A ~ C D E F G H I J ~@13 K L M ~ N O P Q R S T U V W ~@25 X Y Z AA AB AC ~@41
>`.pickRestart({
  A: "~ a5 ~ a5 ~ a5!2 ~@9", B: "~ g#5 ~ g#5 ~ g#5 ~@7 g#5 ~@2", C: "~ g#5 ~ g#5 ~ g#5 ~@10", D: "~@8 f#5 ~@7",
  E: "~@3 f#5 ~@4 e5!2 ~ e5 ~@4", F: "~ e5 ~@4 e5 ~@9", G: "~@3 f#5 ~@2 f#5 ~ f#5 ~@7",
  H: "~@3 e5 ~ e5 ~@4 e5 ~@2 e5 ~ e5", I: "~@3 e5 ~@2 e5 ~@3 e5 ~@2 e5 ~ e5", J: "~ e5 ~@5 e5 ~@8", K: "~@5 a5 ~@10",
  L: "~@12 g#5 ~@3", M: "~@5 g#5 ~@6 g#5 ~@3", N: "~@2 a5!2 ~ a5 ~@3 a5 ~@2 a5 ~@3", O: "~ a5 ~@3 g#5 ~ g#5 ~@8",
  P: "~ g#5 ~ g#5 ~ g#5 ~@3 g#5 ~@5 g#5", Q: "~@3 f#5 ~ f#5 ~@6 f#5 ~@3", R: "~@5 e5 ~ e5 ~@4 e5 ~@3",
  S: "~ e5 ~@3 e5!2 ~@2 e5 ~@6", T: "~ e5 ~ f#5 ~ f#5 ~@10", U: "~@5 e5 ~@9 e5", V: "~ e5 ~ e5 ~ e5 ~@10",
  W: "~@2 e5!3 ~@11", X: "~@2 e4 ~ a4 ~ c#5@4 ~@4 c#5 ~", Y: "~@2 e4@2 b4 ~@9 e5 ~", Z: "~@2 d4 a4 ~@4",
  AA: "~@2 e4@3 ~@7 c#5@2 a4 ~", AB: "~@2 b4 e5@2 e4 ~ b4", AC: "e4 ~@2 e5 ~@2 e5 ~@2 e5 ~ b5 e5 ~ b5 ~",
})).s("gm_pizzicato_strings").gain(0.05).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~@7 [x!4]!112 [x ~ x!2 ~@2 x ~@9] ~@8>").gain(0.51)

// drums · rim
const rim = s("rim").struct(`<
  ~@29
  [~@2 x ~ x ~ x ~ x ~@2 x ~@2 x ~]!9
  ~@18
  [~@2 x ~ x ~ x ~ x ~@2 x ~@2 x ~]!17
  ~@14
  [~@2 x ~ x ~ x ~ x ~@2 x ~@2 x ~]!32
  ~@9
>`).gain(0.26)

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A@7 B A@7 B A@14 B A@3 C A@13 D A@11 B A@4 B ~@13 E A@7 B A@7 B A@7 B A@8 F ~@8
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x ~@2 x ~@3", C: "~@2 x ~@2 x!3", D: "~@4 x ~@7 x ~ x!2", E: "~@12 x!3 ~", F: "~ x ~@2",
})).gain(0.51)

// drums · low tom
const low_tom = s("lt").struct("<~@14 A ~@13 A ~@26 A ~@16 B ~@13 A ~@3 B ~@7 B ~@7 B ~@7 B ~@4 C ~@8>".pickRestart({
  A: "~@12 x!3 ~", B: "~@14 x!2", C: "~@3 x ~@4",
})).gain(0.26)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@3
  [~ x ~ x]!4
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!66
  ~@8
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!38
  x
  ~@8
>`).gain(0.26)

// drums · mid tom
const mid_tom = s("mt").struct("<~@14 A ~@13 B ~@26 A ~@16 C ~@13 D ~@3 C ~@7 C ~@7 C ~@7 C ~@4 E ~@8>".pickRestart({
  A: "~@4 x!2 ~@2", B: "~@8 x!3 ~@5", C: "~@3 x", D: "~@3 x!3 ~@2", E: "~@3 x ~@12",
})).gain(0.26)

// drums · open hat
const open_hat = s("oh").struct("<~@7 [~ x ~ x ~ x ~ x]!66 ~@8 [~ x ~ x ~ x ~ x]!38 [~@3 x ~@4] ~@8>").gain(0.26)

// drums · high tom
const high_tom = s("ht").struct("<~@14 A ~@12 B C ~@26 A ~@16 D ~@13 E ~@3 F ~@7 G ~@7 D ~@7 H ~@4 I ~@8>".pickRestart({
  A: "~@2 x!5 ~@9", B: "~@14 x!2", C: "x!5 ~ x ~@9", D: "~@6 x!5 ~@5", E: "x!3 ~ x ~@11", F: "~@5 x ~@2",
  G: "~@10 x!2 ~@4", H: "~@8 x!3 ~@5", I: "x",
// … 17 more lines