Strudelify

Fastlove

Michael George

KeyA♭ majorTempo108 bpm
0:00/0:00
// Fastlove — Michael George
// 108.1 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 141 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108.1/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(`<
  ~@3 A@8 B@4 C@8 D@8 E@5 F@2 G@2 H I H J H I H K H I H J H I H J H I H J H I H J F@2 L@2 F@2 G@2 H I H J H I H M H I H
  J H I H M N ~ O P Q R Q S Q R Q S Q R Q S Q R Q S Q R Q S T@2 U@2 V@2 U@2 V@2 W@2 X@8 Y@8 ~
>`.pickRestart({
  A: "[~@11 eb2@20 eb1@12 eb1@20 bb1@28 db2@2 eb2@2 eb1@12 eb1@16 ab1@4 bb1@3 ~ bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1]/8",
  B: "[~@3 bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1]/4",
  C: "[~@3 bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ~@2 bb1@4 db2@2 ~@2 db2@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1]/8",
  D: "[~@3 bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@3 ~ bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4 eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4 bb1]/8",
  E: "[~@3 bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2 bb1@3 ~@5 bb1@3 ~@3 bb1@2 bb1@4 ab1@4 f1@4 gb1@11 ~ gb2@4 gb1@4 ~@4 gb1@4 gb2@4 gb1@4 bb1@3 ~@6 bb1@3 ~@3 bb1@2 bb1@4 ab1@4 f1@4 eb1@7 ~ eb1@3 ~ eb2@4 eb1@4 ~@4 eb2@4 eb1@4 ab1@4]/5",
  F: "[bb1@3 ~@5 bb1@3 ~@3 bb1@2 bb1@4 ab1@4 f1@4 gb1@11 ~ gb2@4 gb1@4 ~@4 gb1@4 gb2@4 gb1@4]/2",
  G: "[f1@8 f2@3 ~@3 eb2@2 f2@4 bb1@4 f1@4 eb1@7 ~ eb1@3 ~ eb2@4 ~@2 db2@2 eb2@2 ~@2 bb1@4 ab1@4 bb1@4]/2",
  H: "eb1@4 ~@4 eb1@4 ~@2 bb1@2 db2@3 ~ eb2@4 eb1@3 ~ ab1@4",
  I: "bb1@4 ~@4 bb1@4 ~@2 ab1@2 bb1@2 ab1@2 f1@3 ~ ab1@4 bb1@4",
  J: "bb1@3 ~ bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 eb2@3 ~ eb2@2 ~@2",
  K: "bb1@3 ~ bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 db2@2 bb1 ~ eb2@4",
  L: "[bb1@3 ~@5 bb1@3 ~@3 bb1@2 bb1@4 ab1@4 f1@4 eb1@7 ~ eb1@3 ~ eb2@4 eb1@4 ~@4 eb2@4 eb1@4 ab1@4]/2",
  M: "bb1@3 ~ bb1@2 ~@2 c2@3 ~ c2@2 ~@2 db2@3 ~ db2@2 ~@2 db2@3 bb1 eb2@4", N: "bb1 ~@7",
  O: "~@10 ab1@2 b1 ~ ab1@6 b1 ~@11", P: "~@2 ab1@2 b1 ~ ab1@6 b1 ~@3 ab1@4 b1 ~@3 a1@4 c2 ~@3",
  Q: "bb1@2 ~@5 gb1@3 ~@2 gb1@3 gb1", R: "ab1@2 ~@2 ab1@3 f1!2 ~ f1 ~@5", S: "ab1@2 ~@2 ab1@3 f1!2 ~ f1 ~ f1@2 ~@2",
  T: "[bb1@4 ~@11 gb1@6 ~@4 gb1@6 gb1@2 ab1@4 ~@4 ab1@6 f1@2 f1@2 ~@2 f1@2 ~@9]/2",
  U: "[~ bb1@4 ~@10 gb1@6 ~@4 gb1@6 gb1@2 ab1@4 ~@4 ab1@6 f1@2 f1@2 ~@2 f1@2 ~@2 f1@4 ~@3]/2",
  V: "[~ bb1@4 ~@10 gb1@6 ~@4 gb1@6 gb1@2 ab1@4 ~@4 ab1@6 f1@2 f1@2 ~@2 f1@2 ~@9]/2",
  W: "[~ bb1@4 ~@10 gb1@6 ~@4 gb1@6 gb1@2 ab1@4 ~@4 ab1@6 f1@2 f1@2 ~@2 f1@2 ~@2 ab1@4 bb1@3]/2",
  X: "[~ bb1@64 bb1@64 bb1@64 bb1@63]/8", Y: "[~ bb1@64 bb1@64 bb1@127]/8",
})).s("gm_electric_bass_finger").gain(0.35)

// bass · slap bass 1
const bass_2 = note(`<
  ~@8 A B A ~ A B A ~ A B A B A B A ~ A B A ~ A B A ~@9 C D C ~ C D C ~ C D C ~ C D C ~ C D C ~ C D C ~@9 C D C ~ C D C
  ~ C D C ~ C D C ~@5 E F E F E F E F E F E F E F E F E F E F G H@10 ~@18
>`.pickRestart({
  A: "~@3 eb3@2 ~@27", B: "~@3 bb3@2 ~@27", C: "~@2 eb3 ~@13", D: "~@2 bb3 ~@13", E: "~@2 bb2 ~@7 gb3 ~@5",
  F: "~@14 ab2 bb2", G: "~@4 bb2@2 ~@15 gb3@2 ~@9", H: "[~@29 ab2@2 bb2@2 ~@4 bb2@2 ~@14 gb3@2 ~@9]/2",
})).s("gm_slap_bass_1").gain(0.32)

// chords · synth strings 1
const synth_strings_1 = note("<A@7 B@24 C@5 D@4 E@24 D@8 E@16 ~@4 E@20 F@2 G@8 H@2 I@8 ~@9>".pickRestart({
  A: "[[bb3,db4,f4]@31 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4,ab4]@32 [ab3,c4,eb4], ab4@63 ab4@64 ab4@64 ~@33]/7", // Bbm Ab Bbm Ab Bbm Ab Bbm7 Ab
  B: "[~@31 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4,ab4]@32 [ab3,c4,eb4], ~@31 ab4@64 ab4@64 ab4@64 ~@33]/8", // Bbm Ab Bbm Ab Bbm Ab Bbm7 Ab
  C: "[~@31 [ab3,c4,eb4]@32 [gb3,bb3,db4]@32 [ab3,c4,eb4]@32 ~ [gb3,bb3,db4]@32, ~@31 f3@64 f3@64 ~]/5", // Ab Gb Ab Gb
  D: "[[ab3,c4,eb4] [gb3,bb3,db4], f3]/2", E: "[[bb3,db4,f4] [ab3,c4,eb4], ab4]/2",
  F: "[[bb3,db4,f4]@32 ~ [ab3,c4,eb4]@31, ab4]/2", // Bbm Ab
  G: "[~ [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@32 [bb3,db4,f4]@32 [ab3,c4,eb4]@31, ~ ab4@64 ab4@64 ab4@64 ab4@63]/8", // Bbm Ab Bbm Ab Bbm Ab Bbm Ab
  H: "[~ [bb3,db4,f4]@32 [ab3,c4,eb4]@31, ~ ab4@63]/2", I: "[~ [bb2,bb3,db4,f4,bb4]@255]/8",
})).s("gm_synth_strings_1").gain(0.05)

// chords · epiano1
const epiano1 = note(`<
  ~@23 A@8 B@4 C D E D E ~@16 F ~ F ~ F ~ F ~ D C D C D E D E ~@36 G H G H G I J I J I J I J I J I K@8 ~@9
>`.pickRestart({
  A: "[~@31 [db5,f5,ab5,bb5]@8 ~@25]/2", B: "[~@31 [c5,eb5,f5,ab5]@32 [gb4,bb4,db5,f5]@32 [c5,eb5,f5,ab5]@32 ~]/4",
  C: "[gb4,bb4,db5,f5]", D: "[c5,eb5,f5,ab5]", E: "[bb4,db5,f5]", F: "[db5,f5,ab5,bb5] ~@3", G: "[ab4,bb4,db5,f5]",
  H: "[ab4,c5,eb5]", I: "~ [ab4,c5,eb5]@31", J: "~ [ab4,bb4,db5,f5]@31",
  K: "[~ [ab4,bb4,db5,f5]@64 [ab4,bb4,db5,f5]@64 [ab4,bb4,db5,f5]@64 [ab4,bb4,db5,f5]@63]/8", // Bbm7
})).s("gm_epiano1").gain(0.1)

// chords · electric guitar clean
const electric_guitar_clean = note("<A ~ B ~ A ~ B ~@17 A ~@14 C ~@16 D ~@14 C ~@8 D ~ E ~ D ~ E ~@54>".pickRestart({
  A: "~@11 [bb4,db5,f5]@4 ~@17", B: "~@11 [bb4,db5,f5]@2 ~@2 [bb4,db5,f5]@4 ~@13", C: "~@5 [bb4,db5,f5] ~@2",
  D: "~@3 [bb4,db5,f5] ~@4", E: "~@6 [bb4,db5,f5] ~ [bb4,db5,f5]@2 ~@6",
})).s("gm_electric_guitar_clean").gain(0.2)

// other · electric guitar muted
const electric_guitar_muted = note("<~@32 A@2 B C@5 ~@24 C@8 ~@60 D ~@8>".pickRestart({
  A: "~@3 f4 ~@3 f4@4 eb4@2 f4 ~@18", B: "~@3 f4 ~@4 f4@4 eb4@2 f4 ~@17", C: "~@4 f4 ~@3 f4@4 eb4@2 f4 ~@17",
  D: "~@9 f4@3 ~@9 f4@3 ~@5 f4@3",
})).s("gm_electric_guitar_muted").gain(0.14)

// other · electric guitar muted · soft notes
const electric_guitar_muted_2 = note("<~@133 A B A B A B A ~>".pickRestart({
  A: "~@9 f4@3 ~@9 eb4@3 ~@5 eb4@3", B: "~@9 f4@3 ~@9 f4@3 ~@5 f4@3",
})).s("gm_electric_guitar_muted").gain(0.05)

// other · lead 1 square
const lead_1_square = note(`<
  ~@18 A@3 ~ B C D@8 ~@19 E@2 ~ F G@2 H I H I H I H ~@60 J K L M K L M K L M K L ~@5
>`.pickRestart({
  A: "[~@31 f4@4 ~@4 f4@4 ~@4 f4@4 ab4@4 f4@2 ~@2 f4@32 ~@5]/3", B: "~@27 eb4@2 ~@2 f4",
  C: "~@7 f4@4 ~@4 f4@4 ab4@4 f4@4 bb4@5", D: "[~@31 bb5@32 bb4@32 bb5@32 bb4@32 bb5@32 bb4@32 bb5@32 ~]/8",
  E: "[f4@2 ~@2 f4@2 ~@2 f4@2 ab4@2 f4 ~ f4@16 ~@2]/2", F: "~@14 eb4 ~", G: "[f4 ~ f4 ~ f4 ab4 f4 bb4@8 ~]/2", H: "bb5",
  I: "bb4",
  J: "~ ab4 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6",
  K: "eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6",
  L: "ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4",
  M: "ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6",
})).s("gm_lead_1_square").gain(0.08)

// other · lead 1 square · soft notes
const lead_1_square_soft = note(`<
  ~@136
  [ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6]
  [eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6]
  [ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4]
  [ab4!2 bb4 db5 eb5 ab5 bb5 db6 eb6 ab6 bb6 db7 eb7!2 db7 bb6 ab6 eb6 db6 bb5 ab5 eb5 db5 bb4 ab4!2 bb4 db5 eb5 ab5 bb5 db6]
  [eb6 ~@31]
>`).s("gm_lead_1_square").gain(0.04)

// other · lead 1 square
const lead_1_square_2 = note("<A@6 B@2 ~@72 C D E F G D H F ~@40 I@4 ~@9>".pickRestart({
  A: "[bb5@4 ~@3 bb5@12 ~@4 f6@8 eb6@32 c6@32 ab5@8 c6@4 ab5@4 ~@4 ab5@4 ~@8 bb5@4 ~@4 bb5@16 f6@8 eb6@32 ~]/6",
  B: "[~@3 c6@28 ab5@8 c6@4 ab5@4 ~@4 ab5@4 ~@9]/2", C: "bb5 ~ bb5@3 ~ f6@2", D: "eb6", E: "c6",
  F: "ab5@2 c6 ab5 ~ ab5 ~@2", G: "bb5 ~ bb5@4 f6@2", H: "~ c6@7", I: "[~ ab4@124 ~@3]/4",
})).s("gm_lead_1_square").gain(0.08)

// other · lead 1 square · soft notes
const lead_1_square_soft_2 = note("<~@132 A@4 B@5>".pickRestart({
  A: "[~ ab4@124 ~@3]/4", B: "[~ [bb2,f3,bb3]@128 ~@31]/5",
})).s("gm_lead_1_square").gain(0.04)

// other · muted trumpet
const muted_trumpet = note("<~@23 A ~@56 B@8 ~@28 C@3 D C@3 D C@3 D E ~@12>".pickRestart({
  A: "~@15 db5 ~@3 db5 ~@12", B: "eb5 ~ eb5 ~ eb5 ~ eb5@2 ~@6 eb5 ~ eb5@2 ~@6 f5@6 ~@2",
  C: "~ f4 ~ f4 ~ f4 ~ f4 ~@3 f4@2 eb4 ~@3 eb4 ~@3 eb4@5 ~@6", D: "~ f4 ~ f4 ~ f4 ~ f4 ~@3 f4@2 eb4 ~@7 f4@4 eb4@6 ~",
  E: "~ f4 ~ f4 ~ f4 ~@26",
})).s("gm_muted_trumpet").gain(0.35)

// other · muted trumpet · soft notes
const muted_trumpet_soft = note(`<
  ~@128
  [~@7 f4 ~@3 f4@2 eb4 ~@3 eb4 ~@3 eb4@5 ~@6]
  [~ f4 ~ f4 ~ f4 ~ f4 ~@3 f4@2 eb4 ~@3 eb4 ~@3 eb4@5 ~@6]!2
  [~ f4 ~ f4 ~ f4 ~ f4 ~@3 f4@2 eb4 ~@7 f4@4 eb4@6 ~]
  ~@9
>`).s("gm_muted_trumpet").gain(0.15)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@3 A@14 ~@6 A@2 ~@15 B@6 C@2 D ~@15 E F E F E G@2 H B@6 C@2 ~@8 D ~@3 D ~@7 D ~@3 D ~@3 D ~@3 D ~@3 I ~@3 I ~@20
>`.pickRestart({
  A: "[~@31 eb6@3 ~@30]/2", B: "[ab5@3 bb5]/2", C: "[ab5@7 bb5]/2", D: "eb6@3 ~@29", E: "eb6", F: "db6",
  G: "[f6@5 eb6 db6 c6@9]/2", H: "bb5", I: "~ eb6@3 ~@28",
})).s("gm_string_ensemble_1").gain(0.13)

// other · orchestra hit
const orchestra_hit = note(`<
  ~@3 A@14 ~@6 A@2 ~@23 B ~@39 B ~@3 B ~@7 B ~@3 B ~@3 B ~@3 B ~@3 C ~@3 C ~@20
>`.pickRestart({
  A: "[~@31 eb5@3 ~@30]/2", B: "eb5@3 ~@29", C: "~ eb5@3 ~@28",
})).s("gm_orchestra_hit").gain(0.16)

// drums · kick
const kick = s("bd").struct("<A B C D ~ D E F G@26 H I@53 J@4 I@20 K L@10 M ~@17>".pickRestart({
  A: "~@11 x ~@19 x", B: "~@19 x ~@11 x", C: "~@19 x ~@7 x ~@3 x", D: "~@31 x", E: "~@29 x ~ x",
  F: "~@15 x ~@3 x ~@9 x ~ x", G: "~@13 x ~ x ~@3 x ~@9 x ~ x", H: "~@7 x!2 ~ x ~@4 x", I: "x ~@6 x!2 ~ x ~@4 x",
  J: "x!4", K: "x ~@14 x ~ x ~@3 x ~@9 x", L: "~ x ~@13 x ~ x ~@3 x ~@9 x", M: "~ x ~@13 x ~ x ~@3 x ~@7 x ~@2",
})).gain(0.51)

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

// drums · clap
const clap = s("cp").struct("<~@4 A ~ B@28 C@54 ~@4 C@20 D@12 ~@17>".pickRestart({
  A: "~@7 x ~@24", B: "~@7 x ~@15 x ~@8", C: "~ x ~ x", D: "~@9 x ~@15 x ~@6",
})).gain(0.51)

// drums · low tom
const low_tom = s("lt").struct("<~@89 [~@15 x]!3 ~@49>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<A B C D ~ E F@28 G H@77 I J@11 ~@17>".pickRestart({
  A: "~@15 x ~@3 x ~@3 x ~@3 x ~@3 x", B: "~@15 x ~@3 x ~@7 x ~@3 x", C: "~@7 x ~@7 x ~@7 x ~@3 x ~@3 x",
  D: "~@7 x ~@7 x ~@7 x ~@8", E: "~@31 x", F: "~@3 x ~@7 x ~@3 x ~@3 x ~@7 x ~@3 x",
  G: "~@3 x ~@8 x ~@3 x ~@3 x ~@7 x ~@3", H: "x!2 ~ x!3 ~ x", I: "x ~@3 x ~@8 x ~@3 x ~@3 x ~@7 x ~@2",
  J: "~ x ~@3 x ~@7 x ~@3 x ~@3 x ~@7 x ~@2",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@88 [~@15 x] ~@52>").gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~ A ~ B ~@2 C@28 D@78 E@12 ~@17>".pickRestart({
  A: "~@7 x ~@24", B: "~@19 x ~@12", C: "~@7 x ~@15 x ~@8", D: "~ x ~ x", E: "~@9 x ~@15 x ~@6",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@7 A ~@7 A ~@7 A ~@24 B ~@7 B ~@31 B ~@3 B ~@7 B ~@7 B ~@3 B ~@2 C@2 ~@3 C ~@2 D ~@17
>`.pickRestart({
  A: "~@31 x", B: "x", C: "~ x ~@30", D: "~@21 x ~@10",
})).gain(0.51)

// drums · bongos
// … 44 more lines

More by Michael George