Strudelify

All My Life

K-Ci & JoJo

KeyA♭ majorTempo125 bpm
0:00/0:00
// All My Life — K-Ci & JoJo
// 125 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(125/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 · electric bass finger
const bass = note(`<
  ~@10 A B C D A B C E A F C G H C I J K L M N K O P Q R S T H U V A H U V W B X D W B X E A F C G H C I Y K L M N K O P
  Q R S T H U V A H U V Z AA AB AC Z AA AB AC Z AA AB AC Z AA AB H U J A H U J A AD K L M N K O P Q ~@13
>`.pickRestart({
  A: "db2 c2", B: "bb1", C: "gb1", D: "ab1", E: "ab1@3 f2 eb2 db2 bb1 ab1", F: "bb1@7 ab1", G: "ab1@6 gb1 ab1",
  H: "bb1 ab1", I: "eb1", J: "ab1@3 bb1 c2@4", K: "eb2 db2", L: "c2", M: "db2@5 c2@3", N: "bb1@6 c2 db2",
  O: "c2@6 bb1 c2", P: "db2@5 f1@3", Q: "bb1@7 ~ bb1@2 c2@2 db2@2 bb1@2", R: "eb2@8 db2@7 ~", S: "c2@6 c2 bb1",
  T: "a1 c2", U: "gb1@3 ab1@2 bb1@3", V: "ab1@3 bb1 c2@2 ab1 c2", W: "db2@3 f1", X: "gb1@3 bb1", Y: "ab1@2 bb1 c2@5",
  Z: "eb2@5 bb1 eb2 db2", AA: "c2@4 c1@2 c2 c1", AB: "f1 a1", AC: "bb1 d2", AD: "bb1@3 bb1 d2 bb1 d2 f2",
})).s("gm_electric_bass_finger").gain(0.72)

// chords · epiano2
const epiano2 = note(`<
  A B@2 C D E F G H I J@2 K L J@2 K L ~@8 M N O P M Q R S M N T U V W X U Y W J@2 K L J@2 K L ~@8 M N O P M Q R S M N T
  U V W R U Y W Z AA AB AC Z AA AB AC Z AA AB AC Z AA AB AD V W R U V W R AE M N O P M Q R S ~@13
>`.pickRestart({
  A: "[eb5,ab5]@2 [f5,bb5] [db5,f5]@2 [eb5,ab5] [c5,eb5]@2", // Ab5 Bb5 Db Ab5 Cm
  B: "[[db5,f5]@2 [bb4,db5]@4 [c5,eb5]@2 [ab4,c5]@4 [bb4,db5]@2 ~@2 gb5@2 ~@2 eb5@2 gb5@2 f5@2 ~@2 db5@2 f5 ~, ~@7 gb4@8 ~, ~@14 bb4@4 bb4@13 ~, ~@2 [eb3,eb4] [db3,db4], ~@26 ab4@5 ~]/2", // Db Bbm Cm Ab Bbm Eb Db
  C: "[ab4,eb5]@3 ~ ab5@2 db5 eb5, [ab3,c4], c5@5 ~@3, ~@6 ab4@9 ~", // Ab5 Ab
  D: "f5 ~ db5 f5 eb5 ~@2 eb5, [db3,db4] [c3,c4], ~ ab4@3 ~ ab4@3, ~@3 c5", // Db C
  E: "db5@4 ~ db5 eb5 f5, [bb2,bb3,f4], ab4@3 ~", // Bb5
  F: "gb5@2 bb4@2 eb5@2 gb5@2 f5@2 ~@2 db5@2 f5 ~, [eb3,eb4] [db3,db4], ~@10 ab4@5 ~", // Eb Db
  G: "eb5@9 ~@3 eb5@2 ab4@2, [ab3,c4,c5], ab4@3 ~, ~@10 ab5@5 ~", // Ab
  H: "f5 ~ db5 f5 eb5 ~@2 eb5, [db3,db4]@7 ~ [c3,c4]@8, ~ ab4@3 ~ ab4@3, ~@3 c5", I: "[bb2,bb3,f4,ab4,db5]@15 ~",
  J: "[db3@8 c3@8 bb2@15 ~, ab3@31 ~]/2", K: "~ gb3@3, gb2, ~@2 db3@13 ~", L: "~@4 ab3@11 ~, ab2, ~ eb3@7",
  M: "[eb3,bb3] [db3,ab3]", N: "[c3,ab3]@15 ~", O: "[db3,ab3]", P: "[bb2,f3]", Q: "[c3,ab3]", R: "[db3,ab3] [c3,ab3]",
  S: "[bb2,f3]@4 db3 eb3 f3 db3", T: "[c3,a3]", U: "[bb2,f3] [ab2,eb3], bb3",
  V: "[gb2,gb3]@6 [ab2,ab3]@4 [bb2,bb3]@5 ~", W: "[ab2,ab3]@6 [bb2,bb3]@2 [c3,c4]@7 ~", X: "[db3,ab3]@8 [c3,ab3]@7 ~",
  Y: "[gb2,gb3]@3 [ab2,ab3]@2 [bb2,bb3]@3", Z: "[eb2,eb3]", AA: "[ab2,eb3]", AB: "[f2,f3]", AC: "[bb2,bb3]",
  AD: "[bb2,bb3]@7 ~ [ab2,ab3]@8", AE: "[bb2,f3,bb3]",
})).s("gm_epiano2").gain(0.78)

// chords · reed organ
const reed_organ = note(`<
  ~@17 A B ~@14 C D@2 E F G H I J K L M@2 N@2 O@2 P@2 ~@8 Q@2 ~@3 R S@2 T@2 U V G W X Y G L ~@8 Z AA AB AC AD AE AF AG
  AH AI X AJ AK AL X AM ~@8 AN AO AP@2 AQ AR@2 AS ~@5
>`.pickRestart({
  A: "~@2 [gb4,bb4]!2", B: "[db4,f4]@13 ~@3", C: "~@14 ab4 ~", D: "[bb5@8 ab5@4 bb5@2 ab5@9 ~@7 f5 ~]/2",
  E: "ab5 ~ ab5 ~ ab5 ~ ab5@4 f5@2 eb5@4", F: "f5@3 ~ [db5,f5]@2 [c5,eb5]@2", G: "[bb4,db5]@3 [c5,eb5]@2 [db5,f5]@2 ~",
  H: "[c5,eb5]@3 ~ [c5,eb5]@2 [db5,f5]@4 [eb5,gb5]@6", I: "[db5,f5] f5 ~ bb5, ~ ab5@2 ~, ~ eb5",
  J: "[db5,f5]@6 ~@2 [db5,f5]@3 ~ [c5,eb5]@4", K: "[bb4,db5]@6 [c5,eb5]@4 [db5,f5]@5 ~",
  L: "[c5,eb5]@6 [db5,f5]@4 [eb5,gb5]@5 ~", // Cm Db Ebm
  M: "[[f4,f5] [gb4,gb5] [f4,f5] [eb4,eb5] [db4,db5]@3 [f4,f5]@2 [gb4,gb5] [f4,f5] [eb4,eb5] [db4,db5]@3 ~, ~@14 ab5@15 ~@3]/2", // F Gb F Eb Db F Gb F …
  N: "[[f4,f5] [gb4,gb5] [f4,f5] [eb4,eb5] [db4,db5]@2 f5 db4@2 eb4 ab3@4 ~@2, ~@14 eb5@9 ~@9]/2", // F Gb F Eb Db
  O: "[[f4,f5]@2 [gb4,gb5]@2 [f4,f5]@2 [eb4,eb5]@2 [db4,db5]@3 ~ bb5@2 ~@4 [gb4,gb5]@2 [f4,f5]@2 [eb4,eb5]@2 [db4,db5]@4 ~@4, ~@6 [f4,f5]@3 ~@7, ~@14 ab5@11 ~@7]/2", // F Gb F Eb Db Gb F Eb …
  P: "[[f4,f5]@2 [gb4,gb5]@2 [f4,f5]@2 [eb4,eb5]@2 [db4,db5]@4 f5@2 db4@4 eb4@2 ab3@9 ~@3, ~@14 eb5@11 ~@7]/2", // F Gb F Eb Db
  Q: "[~@6 bb5@2 f5@4 eb5@8 ~@4 db5@2 bb4@2 db5@2 bb4 ~]/2", R: "~@2 ab4@2 db6@2 c6@4 bb5@2 ab5@3 ~",
  S: "[bb5@2 ab5 ~ ab5@16 ~@10 ab4 ~]/2", T: "[bb5@8 ab5@4 bb5@2 ab5@9 ~@9]/2",
  U: "[a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5]@3 ~ [a4,c5]@6", V: "[bb4,db5]@7 ~ [db5,f5]@4 [c5,eb5]@4",
  W: "[c5,eb5]@3 ~ [c5,eb5]@2 [db5,f5]@4 [eb5,gb5]@5 ~", X: "db5 ~@2 bb5, f5 eb5, ~ ab5@2 ~",
  Y: "[db5,f5]@8 [db5,f5]@4 [c5,eb5]@3 ~", // Db Cm
  Z: "[eb5,gb5,bb5]@3 [db5,f5,ab5]@2 [eb5,gb5]@2 ~ [eb5,gb5,bb5]@3 [db5,f5,ab5]@2 [bb4,eb5,gb5]@2 ~, ~@5 bb5 ~@10", // Ebm Db Ebm Db Ebm
  AA: "[f5,ab5]@2 ~ [db5,f5]@2 [f5,ab5]@2 [f5,ab5]@2 ~ [db5,f5]@2 ~ eb5@2 ~, ~@13 c5 ~@2", // Fm Db Fm Db
  AB: "~@2 [c5,f5,ab5] ~ [c5,f5,ab5] ~ [f5,ab5,bb5]@2 [f5,bb5,db6] ~ [db5,f5,bb5] ~ [db5,f5,bb5] ~ [c5,eb5,ab5] ~, ~@6 eb6 ~@9", // Fm Bb7 Bbm Ab
  AC: "[db5,f5,ab5]@8 [bb5,db6] ~ [bb5,db6]@3 ~ [f5,bb5] ~", // Db Bbm Bb5
  AD: "[bb4,eb5,gb5]@2 ~ [ab4,db5,f5]@2 [bb4,gb5] ~@2 [bb4,eb5,gb5]@2 ~ [ab4,db5,f5]@2 [gb4,bb4,eb5]@2 ~, ~@5 eb5@2 ~@9", // Ebm Db Ebm Db Ebm
  AE: "[gb5,bb5,db6]@2 ~ [eb5,gb5,bb5]@2 [gb5,bb5,db6]@2 ~ [gb5,bb5,db6]@2 ~ [eb5,gb5,bb5]@2 [db5,f5,ab5]@2 ~", // Gb Ebm Gb Ebm Db
  AF: "~@2 [c5,eb5,ab5] ~ [eb5,ab5] ~ [gb5,bb5,eb6] ~ [f5,ab5,db6] ~ [db5,f5,bb5] ~ [db5,f5] ~ [c5,ab5] ~, ~@2 c5 ~@3 bb5 eb5", // Ab Ab5 Ebm Db Bbm Db Fm
  AG: "[db5,f5,bb5]@7 ~ [db5,f5,bb5]@4 [c5,eb5,ab5]@3 ~", AH: "[gb4,bb4,db5]@5 ~ [ab4,c5,eb5]@4 [bb4,db5,f5]@5 ~",
  AI: "[ab4,c5,eb5]@4 [ab4,c5,eb5]@2 [bb4,db5,f5]@4 [c5,eb5,gb5]@5 ~", AJ: "[db5,f5]@2 [bb4,db5,f5] [ab4,c5,eb5]",
  AK: "[gb4,bb4,db5]@3 [ab4,c5,eb5]@2 [bb4,db5,f5]@2 ~", AL: "[ab4,c5,eb5]@5 ~ [bb4,db5,f5]@4 [c5,eb5,gb5]@6",
  AM: "[db5,f5]@7 ~@9", AN: "[eb5,gb5,bb5]@7 ~ [db5,f5,ab5]@6 [c5,eb5,bb5]@2", AO: "~@2 [c5,eb5,ab5]@8 ~@4 f5 ~",
  AP: "[[c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5]@3 ~ [ab4,c5,eb5]@4 [bb4,db5,f5]@9 ~ [db5,f5]@4 [c5,eb5]@4]/2", // Ab Bbm Db Cm
  AQ: "[gb4,bb4,db5]@5 ~ [ab4,c5,eb5]@4 [bb4,db5,f5]@4 ~@2", // Gb Ab Bbm
  AR: "[[ab4,c5,eb5]@6 [bb4,db5,f5]@4 [c5,eb5,gb5]@5 ab4@4 ~@5 [c5,eb5]@8, ~@15 [db5,f5]@9 ~@8, ~@5 ab5@3]/2", // Ab Bbm Cdim Cm Db
  AS: "[bb4,db5,f5]@5 ~@3", // Bbm
})).s("gm_reed_organ").gain(0.71)

// chords · reed organ · soft notes
const reed_organ_soft = note("<~@118 A B C@2 ~>".pickRestart({
  A: "[eb5,gb5,bb5]@7 ~ [db5,f5,ab5]@6 [c5,eb5,bb5]@2", B: "~@2 [c5,eb5,ab5]@8 ~@4 f5 ~",
  C: "[[c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5]@3 ~ [ab4,c5,eb5]@4 [bb4,db5,f5]@9 ~@9]/2", // Ab Bbm
})).s("gm_reed_organ").gain(0.29)

// chords · accordion
const accordion = note("<~@16 A B C ~@5 D E ~@18 F G ~@5 H@2 ~ I J ~@2 D E ~@63>".pickRestart({
  A: "~@14 ab4 ~", B: "f5@2 eb5 db5 f5 eb5 db5 bb4", C: "ab4@5 ~@11",
  D: "[eb4,ab4] [f4,bb4] [eb4,ab4] [f4,bb4] [eb4,ab4] [f4,bb4] [eb4,ab4] [f4,bb4]", // Ab5 Bb5 Ab5 Bb5 Ab5 Bb5 Ab5 Bb5
  E: "[eb4,ab4]@2 [f4,bb4]@2 [eb4,ab4]@2 [f4,bb4]@2 [eb4,ab4]@2 [f4,bb4]@2 [eb4,ab4]@3 ~", // Ab5 Bb5 Ab5 Bb5 Ab5 Bb5 Ab5
  F: "db5 eb5 db5 eb5 db5 eb5 db5 eb5", G: "db5@2 eb5@2 db5@2 eb5@2 db5@2 eb5@2 db5@3 ~", H: "[~@8 ab4@23 ~]/2",
  I: "ab5@6 gb5 f5", J: "eb5@13 ~@3",
})).s("gm_accordion").gain(0.57).pan(0.3)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@10 A B C D E F G H A B C I J K@2 L M N O P Q R S T M N U V W X Y Z AA AB A B C D E F G H A B C I J K@2 L M N O P Q R
  S T M N U V W X Y Z AA AB AC AD AE AF AC AD AE AF AC AD AE AF AC AD AE AG W X Y Z W X Y AH M N O P Q R S T ~@13
>`.pickRestart({
  A: "~@3 db4 ~@3 c4, db4 ab3 c4 ab3, ~ f3@3 ~ f3@3", B: "~@3 bb3@2 ~ ab3 bb3, bb3@4 f3@5 ~ f3@6, ~ db3@7",
  C: "~@7 bb3, gb2, ~@2 db3@7 ~ db3@5 ~, ~@2 gb3@3 ~ gb3@2, ~@3 bb3@3 ~@2",
  D: "~@3 db4, ab2, ~ c3@7, ~@4 eb3@5 ~ eb3@5 ~, ~@3 ab3@5", E: "db4 f3 ab3 db4 eb4 ~ c4 eb4, db3 c3, ~@5 ab3@3",
  F: "f4 ~@4 db4 ab3 db4, bb2, ~ ab3@4 ~@3, ~ db4 ~@2, ~@3 f4@5",
  G: "~@3 db4@2 ~ bb3 db4, gb2, ~ db3@6 ~, ~@4 gb3@5 ~ gb3@5 ~", H: "db4 gb3 bb3 eb4@2 ab3 c4 eb4, ab2",
  I: "~@3 c4, ab2, ~ c3@7, ~@4 eb3@5 ~ eb3@5 ~, ~@3 ab3@5",
  J: "~@6 c4 ab3, bb2 ab2, ~@2 f3@6 ~@2 eb3@5 ~, ~ db4 ~@2, ~@3 bb3@2 ~@3",
  K: "[~@3 db4@2 ~@6 db4@2 ~ gb3 db4, gb2 ~, ~@2 gb3@7 ~ gb3@6 eb3@9 ~ eb3@6, ~@4 bb3@6 ~@2 bb3@6 gb3@7 ~@7, ~@14 db4@4 ~@2 bb3@11 ~]/2",
  L: "[ab3,c4]@3 [bb3,db4] [c4,eb4]@2 c4 ab3, ab2@11 ~@5", M: "~@3 gb4 ~@3 f4, eb3 db3, ~ bb3 ~ ab3",
  N: "~@3 ab3, c3, ~ ab3@4 ~@3, ~@4 c4@5 ~ c4@6, ~@3 eb4@5", O: "~@2 db4 f4 eb4 ab3 db4 eb4, db3@15 ~, ~ ab3@3 ~@4",
  P: "~@7 f3, bb2, ~ f3@2 db4, ~ bb3", Q: "~@4 db4 ~ bb3 db4, eb3, ~@4 gb3@4 ~@2 gb3@5 ~, ~@3 bb3@2 ~@3",
  R: "~ ab3 eb4 ~@2 ab4@3, c3@15 ~, ~@6 ab3@9 ~, ~ eb4", S: "~@2 f4 db4 eb4 ab3 c4 eb4, db3 c3, ~ ab3@2 ~@5",
  T: "db4@2 ~@2 bb3@2 db4@3 ~ [c4,eb4]@2 [db4,f4]@4, bb2@9 ~@7, ~@2 f3@7 ~@7", // Cm Db
  U: "~@3 c4@2 f3 a3 c4, c4@2 a3@3 ~@3, ~@2 f3@7 ~@7", V: "~@6 db4@6 [eb3,c4]@3 ~, db4 bb3@2 ~, ~ f3@5 ~@2",
  W: "bb3 ~ bb3 [eb3,c4]@2 [f3,db4]@3, ~ db3@2 ~@5", X: "c4 ~ ab3 [f3,db4]@2 [gb3,eb4]@3, ~ eb3@2 ~@5",
  Y: "~@2 db4 f4 ~@2 c4 eb4, f4 ~ eb4 ~, ~@2 ab3@7 ~ ab3@5 ~",
  Z: "~@4 bb3@2 db4 ~@5 ab3@2 c4@2, db4 ~ db4 ~, ~@2 f3@7 ~ f3@6", AA: "bb3 ~ gb3 [eb3,c4]@2 [f3,db4]@3, ~ db3@2 ~@5",
  AB: "c4@2 ~@2 ab3 ~ [f3,db4]@4 [gb3,eb4]@6, ~ eb3@2 ~@5", // Db Ebm
  AC: "~@6 bb3 eb4, eb4@2 bb3@3 ~@3, ~ gb3@3 ~ gb3@3, ~@3 eb4@3 ~@2",
  AD: "c4 ~@2 c4@2 ~@2 c4, ~@2 eb3@7 ~ eb3@6, ~@2 ab3@3 ~ ab3@2",
  AE: "~@3 eb4@2 ~@2 eb4, c4@2 a3@3 ~ a3@2, ~@2 f3@7 ~ f3@6", AF: "~@3 db4 ~@2 ab3 d4, db4 bb3 d4 ~, ~@2 f3@7 ~ f3@6",
  AG: "~@3 db4 ~@2 ab3 db4, db4 bb3 db4 ~, ~@2 f3@7 ~ f3@6",
  AH: "~@4 bb3@2 db4 ~@5 ab3@2 d4 ~, db4 ~ d4 ~, ~@2 f3@7 ~ f3@6",
})).s("gm_acoustic_guitar_steel").gain(0.64).pan(0.6)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@8 A B ~@8 C@2 D E F G@2 H I@2 J@2 K L M N I@2 O@2 P Q R S T U ~@2 V W ~@4 C@2 D E F G@2 H I@2 J@2 K L M N I@2 O@2 P
  Q R S T U X@2 Y@2 Z@2 Y@2 Z@2 Y@2 Z@2 AA@2 AB Q R S AC Q R AD I@2 J@2 K L M N I@2 O@2 P Q R S I@2 AE@2 ~
>`.pickRestart({
  A: "db3 [c3,ab3]", B: "[bb2,db3,bb3]@5 ~@3", C: "[[f3,db4] [c4,eb4] ~ ab4, ab3@3 ~, ~ [db4,f4]]/2",
  D: "[gb3,bb3,db4]", E: "eb4@5 f4 gb4 ab4, [ab3,c4]", F: "[f3,bb3,db4] [ab3,c4,eb4]", G: "[bb3,db4,gb4]/2",
  H: "[ab3,c4]@3 [bb3,db4] [c4,eb4]@4", I: "[[eb4,gb4,bb4]@4 [db4,f4]@4 ~@5 bb4 ab4@2, ~@4 ab4@9 ~@3, ~ [c4,eb4]]/2",
  J: "[[db4,f5]@6 [c4,eb5]@2 [bb3,db5]@6 [c4,eb5] [db4,f5], ab4]/2", K: "[gb4,bb4,db5]", L: "eb5@5 f5 eb5@2, [ab4,c5]",
  M: "[db4,f4] [c4,eb4], ab3", N: "[f3,bb3,db4]@4 [bb2,bb3] [c3,c4] [db3,db4] [bb2,bb3]",
  O: "[a4@4 ~ db6@3, f5@5 ~@3, c5@7 ~ [bb4,db5]@8]/2", P: "gb4@3 [ab4,c5]@2 [bb4,db5]@3, bb5",
  Q: "[ab4,c5,c6]@3 [bb4,db5,db6]@2 [c5,eb5,eb6]@3", R: "[db4,f5] [c4,eb5]", S: "[bb3,db5]",
  T: "[gb3,bb4]@3 [ab3,c5]@2 [bb3,db5]@3", U: "[ab3,c5]@3 [bb3,db5]@2 [c4,eb5]@3",
  V: "ab5 bb5 ab5 [ab5,bb5] bb5 [ab5,bb5] ab5 bb5 [ab5,bb5] ab5 bb5 [ab5,bb5]!2 ab5 bb5 [ab5,bb5]", // Absus2
  W: "ab5 bb5 [ab5,bb5] ab5!2 ~ ab5 ~ bb5@3 ~@5, ~@3 bb5@4 ab5@2 ~@7", X: "[[bb3,eb4]@8 c4@5 eb4 f4 gb4, gb4@13 ~@3]/2",
  Y: "[~@4 eb4@4 db4@4 d5 eb5 f5 bb4, f4, ~@3 d4]/2", Z: "[[bb3,eb4]@8 c4@5 eb4 f4 gb4, gb4@13 ~@3, gb5@13 ~@19]/2",
  AA: "[~ eb4 db4@2, f4]/2", AB: "[gb4,bb4]@3 [ab4,c5]@2 [bb4,db5]@3, bb5", AC: "[gb4,bb4]@3 [ab4,c5]@2 [bb4,db5]@3",
  AD: "[bb3,db5] [bb3,d5]", AE: "[a4 [bb4,db5], f5@5 ~@3, c5@7 ~@9]/2",
})).s("gm_string_ensemble_1").gain(0.64)

// drums · kick
const kick = s("bd").struct(`<
  ~@10 A ~ B C A ~ D ~ A ~ B C A ~ D ~ A ~ B C A ~ D ~ A ~ B C A ~ D ~ A ~ A ~ B C A ~ D ~ A ~ B C A ~ D ~ A ~ B C A ~ D
  ~ A ~ B C A ~ D ~ A ~ A ~ B C A ~ B C A ~ B C A ~ D ~ A ~ B C A ~ B C A ~ B C A ~ D ~@14
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "x ~@6 x", C: "x", D: "x ~@4 x ~ x",
})).gain(0.62)

// drums · rim
const rim = s("rim").struct("<~@9 [~ x]!101 ~@13>").gain(0.62)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@10 A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A B A C A B A C A B A C A B A C A B A C A B A
  C A B A C A B A C A B A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~@13
>`.pickRestart({
  A: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~", B: "x!3 ~ x!4", C: "x!3 ~ x!3 ~",
})).gain(0.54)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@11 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B
  ~ A ~ B ~ A ~ B ~ A ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@13
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@3 x ~@3 x",
})).gain(0.62)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@13
>`.pickRestart({
  A: "~ x",
})).gain(0.62)

// drums · splash
const splash = s("cr").struct("<~@26 A ~@7 A ~@9 A ~@23 A ~@7 A ~ A ~@44>".pickRestart({
  A: "x",
})).gain(0.62)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@13 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@13
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.79)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  ~@10 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@5 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@5 B A@3 B A@3 B
  A@3 B A@3 B A@3 B A@3 B A@3 B ~@13
>`.pickRestart({
  A: "~@3 x!2 ~@3", B: "~@2 x!8 ~@6",
})).gain(4.05)

// … 4 more lines