Strudelify

Black Betty

Ram Jam

KeyB minorTempo118 bpm
0:00/0:00
// Black Betty — Ram Jam
// 118 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 11 electric guitar clean (copy of ch 6 overdriven guitar)
// note: Full arrangement: all 116 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 28.
setcpm(118/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 · distortion guitar
const distortion_guitar = note(`<
  ~ A B C@2 D@4 E F G H I@2 J@2 K ~ L@5 M N C@2 D@4 E F G H O K ~ L@5 P Q ~ R ~ S ~ T@2 U ~@2 V ~@3 W X Y Z AA@5 AB@7
  AC@8 AD ~@7 AE AF AG AH AI ~@2 AJ AK ~@7 AL@5 AM@2 AN
>`.pickRestart({
  A: "~@7 [a2,e3]", B: "[b2,f#3]@3 ~ c3 ~@9 [a2,e3]@2", C: "[[b2,f#3]!2 [d3,a3]@27 ~ [a2,e3]@2]/2",
  D: "[b2,f#3]@2 [b2,f#3] ~@3 [a3,d4,f#4]@2 ~ [b3,e4,g#4]@3 [a3,d4,f#4] ~ [a2,e3]@2", // B5 D E D A5
  E: "[b2,f#3] ~ [b2,f#3]@2 ~@2 [b2,f#3]@2 ~@2 [b2,f#3]@2 ~ [e3,b3]@3", // B5 E5
  F: "[b2,f#3] ~ [b2,f#3]@2 ~@2 [b2,f#3]@2 ~@2 [b2,f#3] ~ [d3,a3,f#4] [d3,a3,f#4]@2 ~", // B5 D
  G: "[b2,f#3]@2 [b2,f#3]@2 ~@2 [b2,f#3]@2 ~@2 [b2,f#3]@2 [e3,b3,e4] [e3,b3,e4]@2 ~", // B5 E5
  H: "[b2,f#3] ~ [b2,f#3] ~ [b2,f#3] ~ [b2,f#3] ~ [d3,a3,d4]@8", I: "[[b2,f#3,b3]@28 [b2,f#3,b3]@2 ~ [b2,f#3,b3]]/2",
  J: "[b2,f#3,b3]/2", K: "[b2,d#3,f#3,a3,d4]@2 [d3,e3,g3] [g2,a2,b2,c#3] [c#2,e2,f#2] ~@11",
  L: "~@3 [b2,f#3,a3,d4] ~@4", M: "~@3 [b2,f#3,a3,d4] ~@3 [a2,e3]", N: "[b2,f#3]@3 [e3,f#3] [b2,c3] ~@9 [a2,e3]@2",
  O: "[b2,f#3,b3]@7 ~", P: "~@6 [b2,f#3,a3,d4]@2 ~@6 [d3,a3] ~",
  Q: "[d3,a3] ~ [d3,a3] ~ [d3,a3]@3 [e3,b3]@3 [d3,a3] ~@5", // D5 E5 D5
  R: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3]@3 [e3,b3]@3 [d3,a3] ~@3", S: "[a3,d4]@2 [c3,d3,e3,f3,g3] [g2,a2,b2] ~@12",
  T: "[~@6 [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3]@3 [e3,b3]@3 [d3,a3] ~@13]/2", // D5 E5 D5
  U: "~@6 [a3,d4]@2 [c3,d3,e3,f3,g3] [g2,a2,b2] ~@6", // D5 C G
  V: "~@2 [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3]@3 [e3,b3]@3 [d3,a3] ~", W: "~@12 [d3,a3]!2 d3 [d3,a3]",
  X: "[d3,a3]@4 [d3,a3]!2 d3 [d3,a3] [d3,a3]@4 [d3,a3]!2 d3 [d3,a3]", Y: "[d3,a3]@4 [d3,a3] d3!3 [d3,a3]@4 [g2,d3]@3 ~",
  Z: "[g2,d3] g2@3 [g2,d3]@3 ~ [g2,d3] g2@2 ~ [d3,a3]@3 ~", // G5 D5
  AA: "[[d3,a3] d3@3 [d3,a3]@3 ~ [d3,a3] d3@2 ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [g2,d3]@3 ~]/5", // D5 B5 D5 G5
  AB: "[[g2,d3] g2@3 [g2,d3]@3 ~ [g2,d3] g2@2 ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]]/7", // G5 D5 B5 D5 B5
  AC: "[~@2 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [d3,a3]!2 d3 [d3,a3]@4 ~ [d3,a3] d3!2 d3@4 ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]@3 [b2,f#3] ~ [b2,f#3]@3 [b2,f#3]]/8", // B5 D5 B5 D5 B5
  AD: "~@2 [b2,f#3] ~ [b2,f#3] ~@11", AE: "~@12 [b3,d#4] d4 [f#3,g3] [g2,a2,b2,c#3,d3]", AF: "f#2 ~@15",
  AG: "~@12 [d3,a3] ~ [d3,a3] ~", AH: "[d3,a3] ~ [d3,a3]@3 [e3,b3]@3 [d3,a3] ~@7",
  AI: "~@12 [a3,d4]@2 [c3,d3,e3,f3,g3] [g2,a2,b2]", AJ: "~@8 [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3]@2",
  AK: "~ [e3,b3]@3 [d3,a3] ~@11", AL: "[b2,f#3,a3,d4] ~@7",
  AM: "[[b2,f#3,a3,d4]@2 [b2,f#3,a3,d4]@2 ~@2 [b2,f#3,b3]@21 ~@5]/2", // Bm7 B5
  AN: "~@10 [b2,f#3]@2 f3 [f2,g2,a2] [d2,e2] ~, ~@10 [a3,b3] ~@5", // B5 F Dsus2 Asus2
})).s("gm_distortion_guitar").gain(0.41).pan(0.4)

// chords · distortion guitar · soft notes
const distortion_guitar_soft = note(`<
  ~@2 A ~@6 B ~@15 C ~@6 B ~@27 D E F G H ~ D I J K J ~ D I J ~ D I J ~ D I J ~@9 L ~@22 M
>`.pickRestart({
  A: "~@3 [e3,f3,f#3] [a2,b2,d3] ~@11", B: "~@13 e4@3", C: "~@3 f3 [a2,d3] ~@11", D: "~@14 a3 ~", E: "~@6 a3 ~@7 a3 ~",
  F: "~@5 a3!3 ~@8", G: "~ d3@3 ~@5 d3@2 ~@5", H: "~ a3@3 ~@5 a3@2 ~@5", I: "~@5 a3!2 a3@4 ~@3 a3 ~",
  J: "~@5 a3!2 a3@4 ~@5", K: "~ d3@3 ~@5 d3@2 ~@3 a3 ~", L: "~@14 [e3,a3] ~", M: "~@12 [c3,d3,d#3,e3] ~@3",
})).s("gm_distortion_guitar").gain(0.24).pan(0.4)

// chords · distortion guitar · F#5 D#m7 F#5 D#m7 F#5 D#m7 F#5 D#m7 …
const distortion_guitar_2 = note(`<
  ~@5
  [~ [c#3,f#3] ~ [c#3,f#3]!2 [c#3,d#3,f#3] ~ [c#3,f#3]!2 ~ [c#3,f#3]!2 ~ [c#3,f#3]!3]!7
  [~ [c#3,f#3] ~ [c#3,f#3]!2 [c#3,d#3,f#3] ~ [c#3,f#3] ~@2 [c#3,f#3]!2 ~ [c#3,f#3]!3]
  ~@15
  [~ [c#3,f#3] ~ [c#3,f#3]!2 [c#3,d#3,f#3] ~ [c#3,f#3]!2 ~ [c#3,f#3]!2 ~ [c#3,f#3]!3]!7
  [~ [c#3,f#3] ~ [c#3,f#3]!2 [c#3,d#3,f#3] ~ [c#3,f#3] ~@2 [c#3,f#3]!2 ~ [c#3,f#3]!3]
  ~@80
>`).s("gm_distortion_guitar").gain(0.49).pan(0.6)

// bass · fretless bass
const bass = note(`<
  ~@5 A B@3 C D E F G@4 H ~ I@6 ~@3 A B@3 C D E F J H ~ I@5 K L M N O ~@2 P@3 ~@2 Q R S@2 T U V W X Y Z U V W X Y Z U X
  Y Z U X Y Z U X Y AA AB AC AD AE AB AC AD AF ~ AG AH AI ~@2 AJ AK AL AM AN@3 ~@2 H@5 AO ~ AP
>`.pickRestart({
  A: "~@7 a1", B: "b1@2 b1 ~@11 a1@2", C: "b1@2 b1@2 ~@2 b1@2 ~@2 b1@2 ~ e2@2 ~",
  D: "b1@2 b1@2 ~@2 b1@2 ~@2 b1 ~ d2 d2@2 ~", E: "b1 ~ b1 ~@3 b1@2 ~@2 b1 ~ e2 e2@3", F: "b1 d2", G: "b1/4",
  H: "b1 ~@15", I: "~@6 b1 ~@9", J: "b1@7 ~", K: "~@6 b1 ~@7 d2 ~", L: "d2 ~ d2 ~ d2@3 e2@3 d2@2 e2@2 f#2@2",
  M: "a2@2 b2 d2@3 b1@4 ~@6", N: "d2 ~ d2 ~ d2 ~ d2@3 e2@3 d2@2 e2@2", O: "f#2@2 a2@2 b2 d2@3 b1@4 ~@4",
  P: "[~@6 d2 ~ d2 ~ d2 ~ d2@3 e2@3 d2@2 e2@2 f#2@2 a2@2 b2 d2@3 b1@8 ~@10]/3", Q: "~@2 d2 ~ d2 ~ d2 ~ d2@3 e2@3 d2@2",
  R: "e2@2 f#2@2 a2@2 b2 d2@3 b1@6", S: "b1 ~@3 b1 ~@3", T: "~@6 b1@2 c#2@2 d2@2 d2!2 b1 a1",
  U: "d2@2 f2 f#2 d2!2 b1 a1 d2@2 f2 f#2 d2!2 b1 a1", V: "d2@2 f2 f#2 d2!2 b1 a1 d2@2 b1 g1!3 d2 e2",
  W: "g1!2 d2 e2 g1!5 b1 c2 c#2 d2!2 b1 a1", X: "d2@2 f2 f#2 d2!2 b1 a1 d2@2 b1 g1 b1!2 e2 f#2",
  Y: "b1!6 e2 f#2 b1!6 e2 f#2", Z: "b1!6 e2 f#2 b1!4 d2!2 b1 a1", AA: "b1!4 b2 a2 ~ f#2 f2 e2 ~ d2 b1@2 ~@2",
  AB: "b2@3 e2 f#2 a2@2 e2 f#2 a2@3 b1@2 ~@2", AC: "b2@3 e2 f#2 a2@2 d2 e2 d2@3 b1@2 ~@2",
  AD: "b2@3 e2 f#2 a2@2 e2 f#2 a2@3 a1@3 c2", AE: "c#2 e2 f#2 ~ a2@3 ~ a2 d2@3 b1@2 ~@2",
  AF: "c#2 e2 f#2 ~ a2@3 ~ a#1@4 b1 ~@3", AG: "~@12 d2 ~ d2 ~", AH: "d2 ~ d2@3 e2@3 d2@2 e2@2 f#2@2 a2@2",
  AI: "b2 d2@3 b1@8 ~@4", AJ: "~@8 d2 ~ d2 ~ d2 ~ d2@2", AK: "~ e2@3 d2@2 e2@2 f#2@2 a2@2 b2 d2@3",
  AL: "b1@3 b1 ~@3 b1", AM: "~@3 b1 ~@3 b1", AN: "[~@5 b1@16 ~@3]/3", AO: "b1 ~ d3@3 d3 b2@10", AP: "~@5 b1 ~@2",
})).s("gm_fretless_bass").gain(0.37)

// other · overdriven guitar
const overdriven_guitar = note("<~@15 A@2 ~@30 B C D ~@2 E@2 ~@3 F@2 ~@57>".pickRestart({
  A: "[~ [b3,d#4]@31, [b2,f#3]]/2", B: "~@7 e3", C: "f#3 ~ a3 ~ b3 d4@3 b3@8", D: "g3 f3 ~@14",
  E: "[~@4 e3@2 f#3 ~ a3 ~ b3 d4@3 b3@8 g3 f3 ~@8]/2", F: "[e3@2 f#3 ~ a3 ~ b3 d4@3 b3@8 ~@14]/2",
})).s("gm_overdriven_guitar").gain(0.68).pan(0.6)

// other · overdriven guitar · soft notes
const overdriven_guitar_soft = note("<~@49 [a3 e3 ~@14] ~@3 [~@6 a3 e3 ~@8] ~@62>")
  .s("gm_overdriven_guitar").gain(0.41).pan(0.6)

// other · overdriven guitar
const overdriven_guitar_2 = note("<~@84 A B C D E F G D H I ~@22>".pickRestart({
  A: "~@6 b3 ~", B: "d#4@2 ~ g#3 a3 c#4@2 g#3 a3 c#4@3 b3@2 ~@2", C: "d#4@2 ~ g#3 a3 c#4@2 a3 g#4 f#4@2 ~ b3@2 ~@2",
  D: "d#4@2 ~ g#3 a3 c#4@2 g#3 a3 c#4@3 c#3@3 e3", E: "f#3 a3 b3 ~ c#4@3 a3 [a3,d4] a3@2 ~ f#3@3 ~",
  F: "f#4@3 b3 c#4 e4@2 ~ c#4 e4@3 f#3@3 ~", G: "f#4@3 b3 c#4 e4@2 ~ c#4 a4@3 b3@2 ~@2",
  H: "f#3 a3 b3 a3 c#4@3 ~ d4@3 ~ [b3,d#4] d4 [f#3,g3] [g2,a2,b2,c#3,d3]", I: "f#2 ~@15",
})).s("gm_overdriven_guitar").gain(0.44).pan(0.6)

// other · overdriven guitar · soft notes · A5
const overdriven_guitar_soft_2 = note("<~@89 [~@7 b3 ~@8]!2 ~ [~@14 [e3,a3] ~] ~@23>")
  .s("gm_overdriven_guitar").gain(0.25).pan(0.6)

// other · rock organ
const rock_organ = note("<~@16 A B C D E F G H I ~@11 A B C D E F G H I ~@60 J K@2 L M N O@3 ~@2>".pickRestart({
  A: "~@7 f#6, ~@14 f6 ~", B: "e6@2 d6@2 b5!2 ~@2 b5@2 a5 b5@2 ~ f#6@2, ~@14 f6 ~",
  C: "e6@2 d6@2 b5 b5@2 ~ b5@2 a5 b5@2 b5@2 b5", D: "b5!4 d6@3 ~ b5 ~ a5 b5 ~ a5 b5@2",
  E: "b5 ~ b5 ~ b5@2 ~@2 b5@2 a5 b5@2 ~ b5 a5", F: "d6@2 b5 a5 d6@2 ~@2 b5@2 a5 b5 ~ b5!3",
  G: "b5 ~ b5 ~ b5 ~@3 b5@2 a5 b5@3 f#6@2", H: "e6@2 d6@2 b5 b5@2 ~ b5@2 a5 b5@2 ~ f#6@2",
  I: "e6@2 d6@2 b5 b5@2 ~ b5@2 a5 b5@2 ~@3", J: "~@8 f#6@2 e6@2 d6@2 b5!2, ~@8 f6 ~@7",
  K: "[~@2 b5@2 a5 b5@2 ~ f#6@2 e6@2 d6@2 b5 b5@2 ~ b5@2 a5 b5@2 b5@2 b5!5 d6@2, ~@8 f6 ~@23]/2",
  L: "~@2 b5 ~ a5 b5 ~ a5 b5@2 b5 ~ b5 ~ b5@2", M: "~@2 b5@2 a5 b5@2 ~ b5 a5 d6@2 b5 a5 d6@2",
  N: "~@2 b5@2 a5 b5 ~ b5!4 ~ b5 ~ b5 ~",
  O: "[~@2 b5@2 a5 b5@3 f#6@2 e6@2 d6@2 b5 b5@2 ~ b5@2 a5 b5@2 ~ f#6@2 e6@2 d6@2 b5 b5@2 ~ d6@2 ~ d6 f#6@7 ~@3]/3",
})).s("gm_rock_organ").gain(0.45)

// drums · kick
const kick = s("bd").struct(`<
  A@44 B C D E F G H I J K L M N O P@2 Q R@23 S T@3 U T@3 V W X Y Z AA AB AC AD AE AF AG AH@9 AI AJ AK
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~ x ~ x ~@2 x!3 ~ x!2 ~ x ~", D: "x!2 ~ x!2 ~@3 x ~ x ~@5",
  E: "x ~ x ~ x ~ x ~@2 x!3 ~ x!2 ~", F: "x ~ x!2 ~ x!2 ~ x ~ x!2 ~@3 x", G: "x!4 ~@4 x!4 ~@4", H: "x!8 ~ x!3 ~@4",
  I: "~@3 x!2 ~ x ~ x ~ x ~ x ~@2 x", J: "x!2 ~ x!2 ~ x ~ x ~@2 x!2 ~ x ~", K: "x!2 ~@4 x!4 ~@4 x!2",
  L: "x!2 ~ x!2 ~ x!5 ~ x!2 ~@2", M: "x!2 ~@14", N: "~@2 x ~ x ~ x ~ x ~@2 x!3 ~ x",
  O: "x ~ x ~ x ~@2 x!2 ~ x ~ x!2 ~@2", P: "x!2", Q: "~@12 x ~@2 x", R: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x",
  S: "x ~@2 x!2 ~@7 x ~@3", T: "~@4 x ~@2 x ~ x ~@2 x ~@3", U: "x ~@3 x ~ x!2 ~ x ~@2 x ~@3",
  V: "x ~@3 x ~@3 x ~@3 x!4", W: "~@4 x!4 ~@4 x!4", X: "x!4 ~@2 x ~@2 x!2 ~ x ~ x ~",
  Y: "x ~ x ~@2 x!3 ~ x!2 ~ x ~ x ~", Z: "~ x!2 ~ x ~ x!2 ~@4 x!4", AA: "~@4 x!4 ~ x!2 ~ x!4",
  AB: "x ~ x!2 ~@2 x!2 ~@8", AC: "~@4 x!4", AD: "~ x!3 ~ x!2 ~ x ~ x ~@2 x!2 ~", AE: "x ~ x!2 ~@2 x ~@7 x ~",
  AF: "~@3 x ~@3 x", AG: "~@5 x ~ x", AH: "~ x ~ x ~ x ~ x", AI: "~@2 x ~ x!3 ~@9", AJ: "~@2 x ~@6 x!2 ~@3 x!2",
  AK: "~@2 x ~@2 x ~@4 x ~@5",
})).gain(0.51)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@52 A B ~@3 B ~@3 C@23 D ~@9 B E F ~@3 F ~@12 G H I>".pickRestart({
  A: "~@9 x ~@6", B: "~@5 x ~@10", C: "~ x ~@7 x ~@6", D: "~ x ~@14", E: "~@15 x", F: "~@11 x ~@4", G: "~@3 x ~@12",
  H: "~@2 x!2", I: "~ x ~@2",
})).gain(0.28)

// drums · snare
const snare = s("sd").struct(`<
  ~@45 A B C D E F G H I J K L M N@2 G O P Q R O@5 S O@10 T U O V N@2 W ~ N@2 W X Y Z AA N Y AB ~ AC AD AE ~@10 AF ~ AG
>`.pickRestart({
  A: "~@3 x ~ x!2 ~", B: "~@2 x ~@3 x ~@4 x!4 ~", C: "~@4 x ~ x!2", D: "~ x ~ x", E: "~@4 x ~@2 x ~@4 x ~@2 x",
  F: "~@2 x ~ x ~ x!2", G: "~@7 x", H: "~ x!2 ~@2 x ~@2", I: "~@2 x ~@7 x ~@2 x ~@2", J: "~@2 x ~@2 x ~@5 x ~@2 x!2",
  K: "~@4 x!3 ~@9", L: "~@5 x ~ x", M: "x ~@4 x ~@2 x!5 ~@3", N: "x!2", O: "~ x ~ x ~ x ~ x",
  P: "~@2 x!2 ~ x!5 ~@4 x ~", Q: "~@2 x ~@3 x ~@3 x!2 ~@2 x ~", R: "~@3 x!7 ~@4 x ~", S: "~ x ~ x!3 ~ x",
  T: "~ x ~@2 x ~@2 x ~@2 x ~@3 x ~", U: "~ x ~@2 x ~@3 x ~ x ~@3 x ~", V: "~@2 x ~ x!2 ~ x!2 ~@2 x ~@4",
  W: "x ~@7 x ~@6 x", X: "~@2 x!3 ~@11", Y: "x ~@2 x ~@4 x ~@2 x ~@4", Z: "x ~ x!2 ~@4", AA: "~@2 x ~ x!2 ~@2",
  AB: "~ x ~@2 x!2 ~@4 x!3 ~@3", AC: "x ~@3 x ~ x ~@4 x ~@2 x!2", AD: "x!3 ~@3 x ~@7 x ~", AE: "~@3 x ~@3 x",
  AF: "~ x ~@6", AG: "~@3 x ~ x ~@2",
})).gain(0.51)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@55 A ~@8 B ~@19 C ~@7 D ~@5 E ~@17>".pickRestart({
  A: "~ x!3 ~@12", B: "~ x ~@6", C: "~@9 x ~@6", D: "x!2 ~@14", E: "~@7 x!3 ~@6",
})).gain(0.28)

// drums · low tom
const low_tom = s("lt").struct("<~@55 [~@7 x] x ~@42 [~@2 x!2 ~@4] ~@14 [~@5 x!11] [x!2 ~@14]>").gain(0.17)

// drums · hihat
const hihat = s("hh").struct("<~@5 A@20 ~@3 A@17 ~@5 B ~@7 C@2 ~@41 D@2 ~@3 E F@6 ~@3>".pickRestart({
  A: "x!4", B: "~@7 x", C: "x!2", D: "~@3 x ~@3 x", E: "~@3 x ~ x ~ x", F: "~ x ~ x ~ x ~ x",
})).gain(0.23)

// drums · mid tom
const mid_tom = s("mt").struct("<~@46 A ~@4 B ~@3 C ~ D ~@4 E ~ E ~@29 F ~@3 G H ~ I ~@11 J K ~>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@12", C: "x ~@10 x ~ x ~@2", D: "~@14 x!2", E: "~@10 x!2 ~@4", F: "~@9 x ~@6",
  G: "~@3 x ~@4", H: "~ x ~ x ~@12", I: "~@4 x!2 ~@10", J: "~@11 x!5", K: "x!2 ~@14",
})).gain(0.4)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@113 [~@7 x!4 ~@5] ~@2>").gain(0.17)

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

// drums · high tom
const high_tom = s("ht").struct("<~@54 A@2 ~ B ~@30 C ~@8 D@2 ~@2 E ~@14>".pickRestart({
  A: "~@8 x!2 ~@6", B: "~@13 x ~@2", C: "~ x ~@2 x!2 ~ x!2 ~@7", D: "~@14 x!2", E: "~@3 x ~@12",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  A ~@3 A ~ A@8 ~ A ~ A ~@9 A ~ A@9 ~@6 B C ~ D ~@3 E F ~ G ~ H A ~@2 I ~ I@3 ~@5 I ~@11 I ~ I A J ~ K A J ~ G ~ L M ~ B
  ~ N O ~@2 P ~@9 Q R P
>`.pickRestart({
  A: "x", B: "~@7 x", C: "x!3 ~@3 x ~", D: "x!4 ~@3 x", E: "~@3 x!4 ~", F: "~ x ~@2", G: "~ x", H: "~ x!4 ~@3",
  I: "~@3 x", J: "x!2", K: "~@2 x!2", L: "~@6 x!2", M: "x!2 ~@3 x ~@2", N: "~@4 x!4", O: "~@3 x ~@4", P: "~@5 x ~@2",
  Q: "~ x ~ x ~@4", R: "~ x ~@6",
// … 23 more lines