Strudelify

The Loner

Gary Moore

KeyG minorTempo88 bpm
0:00/0:00
// The Loner — Gary Moore
// 88 bpm, 4/4, key G minor. 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: duplicate parts dropped: ch 7 synth strings 1 (copy of ch 12 epiano1, 0.104 beats early); ch 3 distortion guitar (copy of ch 1 overdriven guitar)
// note: Full arrangement: all 104 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 31.
setcpm(88/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 · epiano1
const epiano1 = note(`<
  ~ A@2 B@3 C@3 D@3 E@3 F@3 G@3 H@3 I@3 J@3 K@6 L@3 M@3 N@3 O@3 P@3 Q@3 R@3 S@3 T@3 U V@2 W@30 X@3 Y@5
>`.pickRestart({
  A: "[~@4 bb3@3 a3@3 bb3@3 a3@3, ~@2 d4@3 d4@3]/2", B: "[bb3 a3 [bb3,d4] ~ [g3,bb3,d4]@2 [g3,c4,eb4]@2, d4 ~@3]/3",
  C: "[[f3,a3,c4] [f3,bb3,d4] [bb3,eb4,g4] [c4,eb4,g4]]/3", // F Bb Eb Cm
  D: "[[c4,eb4,g4]@2 [a3,d4,g4] [a3,d4,gb4] [bb3,eb4,g4]@2 [a3,c4,f4]@2]/3", // Cm Dsus4 D Eb F
  E: "[[bb3,d4,g4] [g3,c4,g4] [bb3,eb4,g4] [a3,c4,f4]]/3", // Gm C5 Eb F
  F: "[[bb3,d4,g4] [a3,c4,f4] [g3,bb3,d4] [f3,a3,c4] [g3,bb3,d4]@2 [g3,c4,eb4]@2]/3", // Gm F Gm F Gm Cm
  G: "[bb3 a3 [f3,a3,bb3,d4]@2 [bb3,eb4,g4]@2 [c4,eb4,g4]@2, [f3,c4] ~@3]/3", // Bbmaj7 Eb Cm F5
  H: "[[c4,eb4,g4]@2 [a3,c4,g4] [a3,c4,gb4] [bb3,eb4,g4]@2 [a3,c4,f4]@2]/3", // Cm Am7 Gbdim Eb F
  I: "[[a3,d4,f4] [g3,bb3,d4] [g3,bb3,d4,eb4] [g3,bb3,eb4]]/3", // Dm Gm Ebmaj7 Eb
  J: "[[g3,c4,eb4]@2 [a3,d4,g4] [a3,d4,gb4] [g3,bb3,d4]@2 [f3,a3,c4]@2]/3", // Cm Dsus4 D Gm F
  K: "[[g3,bb3,d4]@2 [g3,bb3,d4] [f3,a3,c4]]/3", L: "[[f3,bb3,d4] [f3,a3,c4] [g3,bb3,d4] [f3,a3,d4]]/3",
  M: "[[g3,bb3,eb4] [f3,bb3,d4] [g3,c4,eb4] [a3,c4,f4]]/3", N: "[[bb3,d4,f4] [f3,c4,f4] [bb3,d4,g4] [a3,d4,f4]]/3",
  O: "[[bb3,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4,g4]@2 [a3,d4,g4] [a3,d4,gb4]]/3", // Eb Cm Dsus4 D
  P: "[[bb3,eb4,g4] [a3,c4,f4] [a3,c4,f4] [bb3,d4,g4]]/3", // Eb F Gm
  Q: "[[bb3,eb4,g4]@2 [bb3,eb4,g4]@2 [c4,eb4,g4]@2 [a3,d4,g4] [a3,d4,gb4]]/3", // Eb Cm Dsus4 D
  R: "[[bb3,g4] [a3,c4,f4] [bb3,d4,g4] [g3,c4,g4]]/3", S: "[[bb3,eb4,g4] [a3,c4,f4] [bb3,d4,g4] [bb3,d4,g4]]/3",
  T: "[[bb3,eb4,g4] [a3,c4,f4] [bb3,d4,g4] [c4,e4,g4]]/3", U: "[bb3,eb4,g4]@7 ~", V: "[~ [c4,f4,a4]@3]/2",
  W: "[[d4,g4,bb4,d5] [c4,f4,a4,c5] [d4,g4,bb4,d5] [c4,a4,c5,f5] [d4,g4,bb4,d5] [c4,f4,a4,c5] [d4,g4,bb4,d5] [c4,a4,c5,f5]]/3", // Gm F Gm F Gm F Gm F
  X: "[[d4,g4,bb4,d5] [d4,f4,a4,d5]]/3", // Gm Dm
  Y: "[bb3@6 a3@6 bb3@6 a3@6 bb3@7 a3@7 [bb3,d4]@28 ~@14, d4@6 d4@6 d4@7 ~@21]/5", // Bb
})).s("gm_epiano1").gain(0.25).pan(0.4)

// other · pizzicato strings
const pizzicato_strings = note("<~@36 A B C D E F A B C G H I ~@56>".pickRestart({
  A: "bb3 ~ d4 ~ f4 ~ bb4 ~ f4 ~ d4 ~ a3 ~ c4 ~", B: "f4 ~ a4 ~ f4 ~ c4 ~ g3 ~ bb3 ~ d4 ~ g4 ~",
  C: "d4 ~ bb3 ~ a3 ~ d4 ~ f4 ~ a4 ~ f4 ~ d4 ~", D: "g3 ~ bb3 ~ eb4 ~ g4 ~ eb4 ~ bb3 ~ f3 ~ bb3 ~",
  E: "d4 ~ f4 ~ d4 ~ bb3 ~ g3 ~ c4 ~ eb4 ~ g4 ~", F: "eb4 ~ c4 ~ a3 ~ c4 ~ f4 ~ a4 ~ f4 ~ c4 ~",
  G: "g3 ~ bb3 ~ eb4 ~ g4 ~ eb4 ~ bb3 ~ g3 ~ c4 ~", H: "eb4 ~ g4 ~ eb4 ~ c4 ~ a3 ~ c4 ~ eb4 ~ g4 ~",
  I: "eb4 ~ c4 ~ a3 ~ d4 ~ g4 ~ gb4 ~ d4 ~ a3 ~",
})).s("gm_pizzicato_strings").gain(0.39).pan(0.4)

// other · ocarina
const ocarina = note("<~@53 A@2 ~@24 B@2 ~@23>".pickRestart({
  A: "[~@6 gb6@3 ~ [c6,d6] bb5 f5@6 ~@14, ~@12 g5 ~@19]/2", B: "[~@6 c5 ~@2 c5@2 bb4 g4@15 ~@5]/2",
})).s("gm_ocarina").gain(0.22).pan(0.4)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~ A@2 B ~@18 C@2 D@3 E@3 F G@2 H@2 ~@7 I@4 J@2 K@6 L@3 M@3 N@3 O@2 ~@7 P@3 Q@6 R@3 P@3 S@6 T@3 U@3 V@5
>`.pickRestart({
  A: "[~@4 [bb4,d5]@3 [a4,c5]@3 [bb4,d5]@3 [c5,f5]@3]/2", B: "[bb4,d5]@6 [a4,c5]@6 [bb4,d5]@3 ~",
  C: "[~@2 d5@3 c5@3]/2", D: "[c5 d5 d5 eb5]/3", E: "[g5@2 g5 gb5 g5@2 f5@2]/3", F: "g4@7 c5",
  G: "[d5 g5 d5 c5 d5@6 c5@6]/2", H: "[d5@5 ~@3]/2", I: "[~ d5 eb5 f5@10 bb4 c5 d5@10 g4 a4 bb4@4 c5]/4",
  J: "[d5 eb5@4 eb5 f5 g5@2 a5 g5@3 gb5@3]/2", K: "[[bb3,bb4]@2 [c4,c5]@4 [d4,d5]@4 [eb4,eb5]@2 [g4,g5]@3 [gb4,gb5]]/6",
  L: "[g5@6 f5@6 d5@6 g4 c5 d5 g5 d5 c5]/3", M: "[d5 c5 d5@2]/3",
  N: "[g5@6 f5@6 ~@3 g5 c6 d6 [g4,g5] [c5,c6] [d5,d6] [g5,g6] [d5,d6] [c5,c6], ~@12 d5@5 ~@7]/3", O: "[[d5,d6]@15 ~]/2",
  P: "[g4 f4 d4@2]/3", Q: "[g4 f4 g4@3 f4 d4@2]/6", R: "[g4 f4 g4@2]/3", S: "[g4@5 d4 d4@2]/6",
  T: "[g5@6 f5@6 g5@11 d5]/3", U: "[g5 f5]/3",
  V: "[[bb4,d5]@6 [a4,c5]@6 [bb4,d5]@6 [c5,f5]@6 [bb4,d5]@7 [a4,c5]@7 [bb4,d5]@30 ~@12]/5", // Bb Am Bb F5 Bb Am Bb
})).s("gm_string_ensemble_2").gain(0.28).pan(0.7)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@4 A@2 B@3 C@6 D E@2 F@3 G@3 H@3 I@3 J@3 K@3 L@5 M N@3 O@6 P@8 Q R@3 S@6 T@2 ~ U@3 V@3 W@2 X Y Z AA@2 AB AC AD@2 AE
  AF@3 AG@3 AH@7 ~
>`.pickRestart({
  A: "[~@9 d3 ~ g3 a3 a3@8 d3@2 eb3@4 bb3@5]/2",
  B: "[~@2 c3 f3 g3 g3@8 c3@2 c3@10 bb2@2 eb3 f3 g3@8 bb2@2 g2@4 g3@5]/3",
  C: "[~ g3 a3 a3@6 a3@4 g3@2 g3@12 c4@10 bb3@2 g3@8 g3@2 f3@2 c3@6 g3@18 c4@9 ~ bb3@2 g3@8 [g2,d3,g3]]/6", // G5
  D: "~ f3 ~ f3@12 [g2,g3]", E: "[~@5 d4@2 ~@4 g4 a4 ~ a4@7 d4@2 d4@4 bb4@5]/2",
  F: "[~@2 c4 f4 g4 ~ g4@7 c4@2 c4@10 bb3 ~ eb4 f4 ~ f4@7 bb3@2 g3@4 g4@5]/3",
  G: "[~ [g3,d4,g4] a4 a4@6 a4@4 g4@2 g4@11 c4 g4 a4 ~ a4@7 c4@6 a4@5]/3", // G5
  H: "[~@2 bb3 f4 g4 g4@8 bb3@10 ~@2 [a3,c4] bb3 eb4 f4 ~ f4@7 bb3@2 g3@4 g4@5]/3", // Am
  I: "[~ g4 a4 a4@10 g4@2 c5@11 ~ c5@10 bb4@2 g4@9]/3",
  J: "[~ f4@2 c4@4 g3@15 ~@3 g4 c5@11 bb4@2 g4@6 ~ g3 [d4,g4], ~@7 bb3 ~@40]/3", K: "[~ f4@2 f4@36 ~@6 d5@3]/3",
  L: "[~ eb5@2 f5@8 d5@4 c5@7 ~ bb4@2 c5@2 c5@10 bb4 c5 a4@6 ~ g3 [d4,g4]@2 a4@2 a4@10 g4@2 f4@8 d4@4 c4@5, ~@39 bb4 ~@40]/5", // G5
  M: "~@3 bb3 g3 c4 c4@7 ~@3", N: "[~ d5 eb5 f5@8 d5@4 c5@6 ~@2 bb4@2 c5@2 c5@10 bb4 [bb4,c5] a4@6 ~@3]/3",
  O: "[g3 [d4,g4] a4 a4@10 g4@2 gb5@7 ~@2 [g5,a5] gb5 g5 g5@8 g5@4 g5@6 c5@6 g5 a5 ~ a5@7 c5@6 a5@6 ~ c5 f5 g5 ~ a5@5 bb4@6 ~ bb4@6]/6", // G5 Gsus2
  P: "[~ a4 bb4 eb5 f5 ~ g5@6 ~ a4@6 g5@5 ~ g5 a5 a5@4 bb5@4 b5@4 c6@12 c6@10 bb5@2 a5@7 ~ g5@2 f5@2 c5@4 g5@18 ~@2 c6@11 bb5 a5@6 ~@2 g5@2 f5@2 f5@5, bb4 ~@63]/8",
  Q: "~@3 g5 [d5,f5] c5 [d5,f5] c5 [c5,d5] ~ [g4,bb4] ~@2 g4@2 ~", // Dm Csus2 Gm
  R: "[~@3 c6@10 bb5@2 g5@10 f5@2 c5@4 g4@8 ~ g3 [bb3,d4] a3!3 a3@3]/3", // Bb
  S: "[~@3 c6@20 bb5@4 a5@16 ~@2 f5@6 f5@44 ~]/6", T: "[~ c4 f4 c4@27 ~@2]/2",
  U: "[~@2 d3 g3 a3 a3@7 ~ c4 ~ c4@9 ~ c4 ~ bb3 g3@15 ~@5]/3", V: "[~@2 d4 g4 a4 a4@8 c4@9 ~ g4@24 ~]/3",
  W: "[~@3 f4 g4 a4@22 ~@4 [f4,g4]]/2", X: "bb4", Y: "~ f4 ~ bb4!3 ~ bb4 g4@2 ~@6",
  Z: "~@7 c4 bb3 g3 [bb3,c4] [c4,f4] [bb3,c4] c4!2 bb3", AA: "[g3@10 ~@5 f4@2 g4@2 eb5@13]/2",
  AB: "~ eb5 ~@2 eb5 ~ eb5 ~ eb5!2 ~ eb5!2 ~ eb5@2", AC: "~ g4@4 f4 g4 ab4@8 f4",
  AD: "[bb4 c5 [d5,f5] f5@6 ~@2 f4 [g4,bb4] c5 [d5,f5] g5@6 ~@2 f4 ~ c5 [d5,f5] bb5 [g5,a5] g5 [d5,f5] f5]/2", // Dm Gm Dm Gsus2 Dm
  AE: "[c5,d5]@2 [g4,bb4] bb4 ~ f5 [g5,bb5] bb5@7 bb5@2", // Csus2 Gm
  AF: "[bb5!2 c6@8 ~ c6@3 ~ c6@10 bb5@4 g5@17 ~@2, ~@7 d6 ~@16]/3", AG: "[~ d5 ~ g5 a5 ~ a5@7 c5@10 g5@22 ~@3]/3",
  AH: "[~ d4 ~ g4 a4 a4@17 ~ c4@21 ~ g4@58 ~@9]/7",
})).s("gm_overdriven_guitar").gain(0.16).pan(0.4)

// other · overdriven guitar · soft notes
const overdriven_guitar_soft = note("<~@25 A ~@5 B ~@9 C ~@9 D ~@7 E F ~@20 G H ~@4 I J K ~@14>".pickRestart({
  A: "~@9 bb3 ~@6", B: "~@9 bb4 ~@6", C: "~@2 f3 ~@13", D: "c5 ~@7", E: "~@12 [d4,f4] ~@2 f4", F: "d4 ~@7",
  G: "~@7 [f4,g4] ~@2 f4 ~@5", H: "~@7 [f4,g4] ~ c4 ~@6", I: "g4 ~@15", J: "~@8 [g4,bb4] ~@7", K: "~@4 [b4,c5] ~@11",
})).s("gm_overdriven_guitar").gain(0.1).pan(0.4)

// bass · electric bass finger
const bass = note(`<
  ~ A B C D E F@2 G H@2 I J@2 K L M N O@2 P Q@2 R S@2 G T@2 I U@2 I V@2 W X@2 Y Z@2 AA AB@2 AC AD@2 AE AF@2 AG AH@2 AI
  AJ@3 AK@3 AJ@3 AL@3 AM@3 AN@3 AO@2 AP AQ@2 AP AQ@2 AP AQ@2 AP AQ@2 AP AQ@2 AP AQ@2 AP AR@2 AS AT@3 AU@2 AV@2 ~
>`.pickRestart({
  A: "~@4 g1@3 ~", B: "~@2 g1 ~ g1@6 ~@4 g1 ~", C: "g1@6 ~@4 g1 ~ g1@2 ~@2", D: "~ g1", E: "~ g1 c2@5 ~",
  F: "[f1@8 ~@2 f1@2 bb1@8 ~@4 eb1@7 ~]/2", G: "~ eb1 c2@3 ~ c2 bb1", H: "[a1@7 ~@3 a1@2 d1@9 ~@3 eb1@8]/2",
  I: "~@2 eb1@2 f1@11 ~", J: "[g1@7 ~ g1@2 f1@2 e1@10 ~@2 eb1@8]/2", K: "~ eb1 f1@5 ~", L: "g1@8 ~@2 g1 ~ g1@2 ~@2",
  M: "~@8 g1@7 ~", N: "~@2 g1@2 c2@9 ~@3", O: "[f1@9 ~ f1@2 bb1@10 ~@2 eb1@8]/2", P: "~@2 eb1@2 c2@7 ~ c2@2 bb1@2",
  Q: "[a1@9 ~ a1@2 d1@10 ~@2 eb1@8]/2", R: "~@2 eb1 ~ eb1@11 ~", S: "[d1@9 ~ d1@2 g1@6 f1@6 eb1@8]/2",
  T: "[a1@4 ~ a1 d1@3 d2@3 eb1@4]/2", U: "[g1@9 ~ g1@2 e1@10 ~@2 eb1@8]/2", V: "[g1@9 ~ g1@2 g1@9 ~ g2@2 g1@8]/2",
  W: "~ g1 f1@2 f2@4", X: "[bb1@9 ~ bb1@2 f1@11 ~ g1@8]/2", Y: "~@2 g1@2 d1@11 ~",
  Z: "[eb1@8 ~@2 eb1@2 bb1@11 ~ c2@6 ~@2]/2", AA: "d2@2 eb2@2 f2@4 f1@7 ~", AB: "[bb1@8 ~@2 bb1@2 a1@11 ~ g1@7 ~]/2",
  AC: "a1 bb1 d2@4 ~@2", AD: "[eb2@6 ~@2 eb2@2 d2@2 c2@9 ~ bb1@2 a1@6 ~@2]/2", AE: "bb1@2 c2@2 d2@9 ~@3",
  AF: "[eb1@9 ~ eb1 ~ eb1@8 eb2@2 eb1@2 d1@6 ~@2]/2", AG: "f1 ~ d1 ~ g1@4 g1@2 f1@4 f1@2",
  AH: "[eb1@4 eb2 d2 c2@4 c2 bb1 a1@4]/2", AI: "c2 db2 d2@3 d1@3", AJ: "[eb1@5 eb1 f1@6 g1@5 g1 e1@6]/3",
  AK: "[eb1@5 eb1 f1@6 g1@5 g1 g1@3 f1@3]/3", AL: "[eb1 d1]/3", AM: "[g1@5 g1 g1@4 d1 f1 g1@5 g1 g1@4 d1 f1]/3",
  AN: "[eb1@5 eb1 eb1@4 f1 eb1 g1@5 g1 g1@4 d1 f1]/3", AO: "[eb1@5 eb1 d1@3 d2@3 g1@4]/2", AP: "d1 f1 g1@3 f1@3",
  AQ: "[eb1@4 eb2 eb1 d1@3 d2@3 g1@4]/2", AR: "[eb1@4 bb1 eb2 d2@3 d1@3 g1@4]/2", AS: "f2 g2 g2@3 f2@3",
  AT: "[eb2 d2]/3", AU: "[g1@6 ~@4 g1 ~ g1@6 ~@4 g1 ~ g1@7 ~]/2", AV: "[~@4 g1 ~ g1@26]/2",
})).s("gm_electric_bass_finger").gain(0.5)

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

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

// drums · hihat
const hihat = s("hh").struct(`<
  A B C D E C B F C B F C B F C G H C B F C B F B@2 F C I B C B F J K L M B F C I F C B@2 N B F C B F C B F O B F C I F
  J I F J K L P B F C I F N Q F C B F C B F C B F C I F C B F C B F C B F C R L P B S T ~@2
>`.pickRestart({
  A: "~@6 x!2", B: "x!8", C: "x!7 ~", D: "x!5 ~ x ~", E: "~@4 x!4", F: "x!3 ~ x!4",
  G: "x ~ x ~ x ~ x ~ x ~ x ~@2 x ~@2", H: "~@3 x!5", I: "x!5 ~ x!2", J: "x ~ x!5 ~", K: "~@3 x ~@2 x ~",
  L: "~ x ~@2 x ~@2 x", M: "~ x ~@2", N: "x ~ x!6", O: "x!4 ~ x!2 ~", P: "~@2 x ~@2 x ~@2", Q: "~ x!7",
  R: "x ~@2 x ~@2 x ~", S: "x ~ x ~ x ~@3 x ~ x ~ x ~@2 x", T: "~ x ~@14",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@16 A ~@5 A ~@5 B ~@3 C D E F ~@5 C ~@5 C G H I G H J ~@5 K ~@2 L ~@2 C ~@8 C ~@5 C ~@11 M ~@2 N ~@2 C ~ O P ~@2
>`.pickRestart({
  A: "~@3 x ~@4", B: "~ x ~ x ~@4", C: "~@7 x", D: "x ~@2 x", E: "~@3 x!2 ~@3", F: "~@2 x ~@2 x ~ x",
  G: "x ~@2 x ~@2 x ~", H: "~ x ~@2 x ~@2 x", I: "~@2 x ~@2 x!3", J: "~@2 x!4 ~ x", K: "~@7 x!2 ~ x!2 ~ x!3",
  L: "~@6 x!2", M: "~@4 x ~@2 x", N: "~@3 x!5", O: "~@11 x!2 ~@3", P: "x!2 ~@2 x ~@11",
})).gain(0.4)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@41 [~@5 x!2 ~] ~@11 [~ x ~@6] ~@5 [~@3 x ~@4] ~@44>").gain(0.25)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@16 A ~@5 B ~@5 B ~@3 C ~ D E ~@5 F ~@5 G H I D H I J ~@5 K ~@2 L ~@2 M ~@8 M ~@5 M ~@11 N ~@2 O ~@2 F ~ P Q ~@2
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@2 x!2 ~@4", C: "~@7 x", D: "~ x", E: "~@2 x ~@3 x!2", F: "~@5 x!3", G: "~@6 x ~@3 x ~ x!3 ~",
  H: "~ x ~@2", I: "x ~@2 x", J: "~@4 x ~ x!2", K: "~@4 x!4 ~ x!7", L: "~@5 x!2 ~", M: "~@6 x!2",
  N: "~@6 x ~ x ~ x!3 ~ x ~", O: "~@3 x!5", P: "~@8 x!2 ~ x ~ x ~@2", Q: "x!2 ~@2 x ~@11",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ B A ~@5 A ~@5 A ~@5 A ~@5 A ~@4 C ~ D C ~@5 C ~@4 E C ~@4 D C ~@5 C ~@5 C ~@8 C ~@5 C ~@2 C ~@2 F G ~ C ~@2 C
  ~@2 C ~ H C ~ I ~@2
>`.pickRestart({
  A: "~ x", B: "~@3 x", C: "x", D: "~@5 x ~@2", E: "~@3 x ~ x ~@2", F: "x ~@2 x", G: "~@3 x!2 ~@3", H: "~@7 x",
  I: "~@3 x ~@4",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@22 A ~@5 B ~@6 C ~@5 D ~@5 E ~@5 F ~@5 G ~@2 H ~@2 F ~@8 F ~@17 I ~@5 J ~ K ~@3
>`.pickRestart({
  A: "~ x ~@2", B: "~ x!2 ~@5", C: "~@5 x!2 ~", D: "~@5 x!3", E: "~@12 x!2 ~@2", F: "~@3 x",
  G: "~@4 x!2 ~@2 x!2 ~@2 x ~@3", H: "~@5 x ~ x", I: "~@6 x ~@3 x!2 ~@4", J: "~@5 x ~@2", K: "~@8 x!2 ~@6",
// … 156 more lines

More by Gary Moore