Strudelify

Feels So Good

Chuck Mangione

KeyF majorTempo115 bpm
0:00/0:00
// Feels So Good — Chuck Mangione
// 115 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(115/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · fretless bass · "Bass / Fretless bass"
const bass = note(`<
  ~ A B C D E F G H I J I K L M N O P Q R S T U R V W P X Y I Z AA AB AC AD AE AC AF AG J AC J AC AH P AI AJ Y AK Z R AL
  AM P AJ AN AO G AP E AQ AR AS I J AC M N K N AH AT AU AV Y AW P R V AX AD AY AZ BA ~
>`.pickRestart({
  A: "f2@2 ~ f2@4 c2 f2@3 f2@4 c2", B: "d2@2 ~ d2@3 a1@2 d2@3 d2@3 a1@2", C: "g2@3 g2@2 g1 d2@2 g2@3 g2@3 d2@2",
  D: "c2@2 ~ c2@3 g1@2 bb1@2 ~ bb1@3 f1@2", E: "a1@3 a1@2 a0 e1@2 a1@3 a1@3 e1@2",
  F: "d2@2 ~ d2@3 a1@2 d2@2 ~ d2@3 a1@2", G: "g2@2 ~ g2@3 d2@2 g2@2 ~ g2@3 d2@2", H: "e2@2 ~ e2@4 bb1 a1@2 ~ a1@3 e1@2",
  I: "d2@2 ~ d2@2 ~ d2@2 d2@3 d2@3 d2 ~", J: "eb2@2 ~ eb2@3 bb1@2 eb2@3 eb2@3 eb2 ~",
  K: "eb2@2 ~ eb2@2 eb1 bb1@2 eb2@2 ~ eb2@4 bb1", L: "d2@2 ~ d2@2 d1 a1@2 d2@3 d2@4 a1",
  M: "eb2@2 ~ eb2@3 bb1@2 eb2@3 eb2@3 bb1 ~", N: "d2@2 ~ d2@3 a1@2 d2@3 d2@3 a1 ~",
  O: "eb2!2 ~ eb2 bb1@2 eb2@2 d2@2 ~ d2@3 d2@2", P: "g2@2 ~ g2@3 d2@2 g2@3 g2@3 g2 ~",
  Q: "g2@2 ~ g2 a1@2 ~ a1 bb1@2 ~ bb1 b1@4", R: "c2@2 ~ c2@3 g1@2 c2@3 c2@3 c2 ~",
  S: "f2@2 ~ f2@2 ~ f2@2 f2@3 f2@3 f2 ~", T: "f2@4 eb2@4 d2@2 ~ d2 gb2@4", U: "g2@2 ~ g2@3 d2@2 g2@3 g2@3 d2 ~",
  V: "f2@2 ~ f2@2 ~ f2@2 f2@2 ~ f2@3 f2 ~", W: "f2@2 ~ f2 eb2@4 d2@2 ~ d2 gb2@4",
  X: "c2@2 ~ c2@2 ~ c2@2 c2@3 c2@3 c2 ~", Y: "f2@2 ~ f2@3 c2@2 f2@3 f2@3 f2 ~", Z: "g2@2 ~ g2@2 g1 d2@2 g2@2 ~ g2@4 d2",
  AA: "c2@2 ~ c2 g1@2 c2 ~ bb1@2 ~ bb1 f1@2 bb1 ~", AB: "a1@2 ~ a1@3 e1@2 a1@3 a1@3 a1 ~",
  AC: "d2@2 ~ d2@3 a1@2 d2@3 d2@3 d2 ~", AD: "g2@2 ~ g2@2 g1 d2@2 g2@3 g2@4 d2",
  AE: "e2@2 ~ e2@3 e2@2 a1@2 ~ a1@3 a1@2", AF: "eb2@2 ~ eb2@2 ~ eb2@2 eb2@3 eb2@3 eb2 ~",
  AG: "d2@2 ~ d2@2 ~ d2@2 d2@2 ~ d2@3 d2 ~", AH: "eb2@2 ~ eb2@3 eb2@2 d2@2 ~ d2@3 d2@2",
  AI: "g2@2 ~ g2 a1@2 ~ a1 bb1@4 b1@4", AJ: "c2@2 ~ c2@2 c1 g1@2 c2@3 c2@4 g1",
  AK: "f2@2 ~ f2 eb2@2 ~ eb2 d2@2 ~ d2 gb2@2 ~ gb2", AL: "f2@2 ~ f2@2 f1 c2@2 f2@3 f2@4 c2",
  AM: "f2@2 ~ f2 eb2@2 ~ eb2 d2@4 gb2@2 ~ gb2", AN: "f2@2 ~ f2@3 c2@2 f2@3 f2@3 c2@2",
  AO: "d2@2 ~ d2@4 d1 d2@3 d2@3 a1@2", AP: "c2@3 c2@2 c1 g1@2 bb1@2 ~ bb1@3 f1@2",
  AQ: "d2@3 d2@2 d1 a1@2 d2@3 d2@3 a1@2", AR: "g2@2 ~ g2@4 g1 g2@3 g2@3 d2@2", AS: "e2@2 ~ e2@3 bb1@2 a1@2 ~ a1@4 e1",
  AT: "g2@2 ~ g2@2 ~ g2@2 g2@3 g2@3 g2 ~", AU: "g2@4 a1@2 ~ a1 bb1@4 b1@4", AV: "c2@2 ~ c2@2 ~ c2@2 c2@2 ~ c2@3 c2 ~",
  AW: "f2@2 ~ f2 eb2@2 ~ eb2 d2@4 gb2@4", AX: "f2@2 ~ f2 eb2@4 d2@2 ~ d2 gb2@2 ~ gb2",
  AY: "c2@2 ~ c2@3 g1@2 c2@3 c2@3 g1 ~", AZ: "f2@6 c2@2 f2 ~ f2@2 c2 ~ c2 ~", BA: "f2 ~@5 c2 ~ f2 ~ f2 ~ c2 ~ c2 f2",
})).s("gm_fretless_bass").gain(0.29)

// chords · acoustic guitar nylon · "Guitar / Nylon string"
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F G H I J K L I M N O P Q R S T U@2 V T U W X K Y Z AA I U AB I M N AC K L N AD P AE W AF AG P R S AG P R
  A AH G AI AJ AK G AL AM M I U N M I AN W AE P AO AG U R S AP U W AQ AR ~
>`.pickRestart({
  A: "a3@5 ~@2 a3, [c4,e4,g4], ~@5 e3@3, ~@3 f3", B: "f4 ~@2 c4@5, c5, ~ a4@7, ~ f4@3",
  C: "bb3@5 ~@2 bb3, [d4,f4,g4], ~@5 f3@3, ~@3 g3", // G7
  D: "~@3 g4 ~ [a3,d4,f4,a4]@3, ~ bb3@3 ~@4, ~@3 d4@5 ~@8, ~@5 e4@3 ~@8", // Dm
  E: "g3@9 ~@4 a3@2 ~, [c4,e4]@15 ~, a3@3 ~, ~@10 g3@5 ~", F: "c4@5 ~@2 c4, [d4,f4,a4], ~@5 f3@3, ~@3 a3",
  G: "f4 ~@2 bb3@5, bb4, ~ g4@7, ~ f4@3", H: "~@3 e4 ~ [g3,db4,e4,g4]@3, ~ g3@3 ~@4, ~@3 bb3@5 ~@8, ~@5 d4@3 ~@8",
  I: "[c4,d4,f4,a4]@3 [c4,d4,f4,a4] ~@3 d3 [c4,d4,f4,a4]@2 ~ [c4,d4,f4,a4] ~@4", // Dm7
  J: "[g3,bb3,d4,f4]@3 [g3,bb3,d4,f4] ~@6 [d3,g3] ~@2 [d3,g3] ~@2", // Gm7 G5
  K: "[c4,d4,f4,a4]@3 [c4,d4,f4,a4] ~@10 d5 ~, ~@9 c4@6 ~, ~@11 f4@4 ~, ~@13 a4@2 ~", // Dm7
  L: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4] ~@3 eb2 [bb3,d4,f4,g4]@2 ~ [bb3,d4,f4,g4] ~@4", // Gm7
  M: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4] ~@10 bb4 ~, ~@9 g3@6 ~, ~@11 d4@4 ~, ~@13 f4@2 ~", // Gm7
  N: "[c4,d4,f4,a4]@2 ~ [c4,d4,f4,a4] ~@6 [c4,d4,f4,a4] ~@2 [c4,d4,f4,a4] ~@2", // Dm7
  O: "[db4,f4,g4,bb4]@2 ~ [db4,f4,g4,bb4]@2 eb3 [db4,f4,g4,bb4] ~ [c4,f4,gb4,b4]@2 ~ [c4,f4,gb4,b4]@2 d3 [c4,f4,gb4,b4] ~", // Gm7b5
  P: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4] ~@6 [f3,bb3] ~@2 [f3,bb3] ~@2", // Gm7 Bb5
  Q: "[bb3,d4,f4,g4] [c4,e4,g4,a4] [d4,f4,a4,c5] [d4,f4,ab4,b4]", // Gm7 Am7 Dm7 Ddim
  R: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4] ~@3 c3 [bb3,d4,f4,g4]@2 ~ [bb3,d4,f4,g4] ~@4", // Gm7
  S: "[c4,d4,g4,a4]@3 [c4,d4,g4,a4] ~@3 f2 [c4,d4,g4,a4]@2 ~ [c4,d4,g4,a4] ~@4", // Csus2
  T: "[c4,d4,f4,a4] [bb3,db4,f4,g4] [c4,d4,gb4,a4] [c4,eb4,gb4,a4]", // Dm7 Gm7b5 D7 Cdim
  U: "[bb3,d4,f4,g4]@2 ~ [bb3,d4,f4,g4] ~@6 [bb3,d4,f4,g4] ~@2 [bb3,d4,f4,g4] ~@2", // Gm7
  V: "[c4,d4,g4,a4]@2 ~ [c4,d4,g4,a4] ~@6 [c4,d4,g4,a4] ~@2 [c4,d4,g4,a4] ~@2", // Csus2
  W: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4] ~@10 d5 ~, ~@9 bb3@6 ~, ~@11 f4@4 ~, ~@13 g4@2 ~", // Gm7
  X: "[c4,e4,g4,a4]@3 [c4,e4,g4,a4] ~@10 c5 ~, ~@9 a3@6 ~, ~@11 e4@4 ~, ~@13 g4@2 ~", // Am7
  Y: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4] ~@3 g2 [bb3,d4,f4,g4]@2 ~ [bb3,d4,f4,g4] ~@4", // Gm7
  Z: "[bb3,d4,e4,g4]@2 ~ [bb3,d4,e4,g4]@2 c3 [bb3,d4,e4,g4] ~ [d4,f4,a4,c5]@8", // Em7b5 Dm7
  AA: "[g3,a3,c4,e4]@3 [g3,a3,c4,e4] ~@6 [c3,g3] ~@2 [c3,g3] ~@2", // Am7 C5
  AB: "~ [d4,e4,g4,bb4]@2 ~ [d4,e4,g4,bb4] ~ [d4,e4,g4,bb4] ~@2 [db4,e4,g4,a4]@2 ~ [db4,e4,g4,a4] ~ [db4,e4,g4,a4] ~", // Em7b5 A7
  AC: "[d4,f4,g4,bb4]@2 ~ [d4,f4,g4,bb4] ~@6 [d4,f4,g4,bb4] ~@2 [d4,f4,g4,bb4] ~@2", // Gm7
  AD: "~ [bb3,db4,f4,g4]@2 ~ [bb3,db4,f4,g4] ~ [bb3,db4,f4,g4] ~ [c4,f4,gb4,b4]@8", // Gm7b5
  AE: "[bb3,d4,f4,g4] [c4,e4,g4,a4] [d4,f4,a4,c5] [ab3,b3,d4,f4]", // Gm7 Am7 Dm7 Abdim
  AF: "[c4,d4,g4,a4]@3 [c4,d4,g4,a4] ~@10 c5 ~, ~@9 a3@6 ~, ~@11 d4@4 ~, ~@13 g4@2 ~", // Csus2
  AG: "[c4,d4,f4,a4] [db4,f4,g4,bb4] [c4,d4,gb4,a4] [c4,eb4,gb4,a4]", AH: "~@3 a4@5, c4, ~ d4@7, ~ f4@3",
  AI: "~@3 g4 ~@3 f4, ~ bb3@3 ~ a3@3, ~@3 d4@5 ~@3 bb3@5, ~@5 e4@3 ~@5 d4@3",
  AJ: "c4@10 ~@3 c4@3, [g3,e4,g4], ~@5 a3@3", AK: "c4@9 ~@4 d4@2 ~, [f4,a4]@15 ~, d4@3 ~, ~@10 c4@5 ~",
  AL: "~ [g3,d4,e4,g4]@3 ~@3 e4, ~@5 g3@3, ~@11 a3@5, ~@13 db4@3", // Em7
  AM: "[c4,d4,f4,a4]@3 [c4,d4,f4,a4] ~@6 [f3,c4] ~@2 [f3,c4] ~@2", AN: "[bb3,db4,f4,g4] [b3,c4,f4,gb4]",
  AO: "[a3,c4,d4,g4]@3 [a3,c4,d4,g4] ~@6 [d3,a3] ~@2 [d3,a3] ~@2", // Am7 D5
  AP: "[c4,d4,f4,a4] [bb3,db4,f4,g4] [a3,c4,d4,gb4] [c4,eb4,gb4,a4]", AQ: "[c4,d4,g4,a4]@15 ~",
  AR: "[c4,d4,g4,a4] ~@5 [c4,e4,g4] ~ [c4,d4,g4,a4] ~@3 [c4,e4,g4] ~ [c4,e4,g4] [c4,d4,g4,a4]", // Csus2 C Csus2 C Csus2
})).s("gm_acoustic_guitar_nylon").gain(0.2).pan(0.6)

// other · electric guitar jazz · "Solo / Jazz guitar"
const electric_guitar_jazz = note("<~@29 A B C D E F G H ~ I J K L M N O P Q R S T U V ~ W ~@31>".pickRestart({
  A: "g4 ~ g4 ~ g4@3 f4 g4 a4 ~ a4@4 ~", B: "g4 ~ g4 ~ g4@3 f4 g4 f4 ~ d4@4 ~",
  C: "~@4 f4 gb4 a4 ab4 g4 d4 c4 f4 d4 ~@3", D: "e4@2 g4 ~ d4 ~ c4@5 ~ a3@2 c4 ~", E: "eb4 e4@5 c4 ~ d4@6 ~@2",
  F: "~@10 g4 f4 g4@2 a4 ~", G: "e4@3 f4 d4@3 e4 db4 ~ e4 ~ g4 ~ bb4 ~", H: "a4@3 g4 f4@2 g4 ~ ab4 a4@6 ~",
  I: "~@2 f4 ~@2 f4 ~@2 f4@6 ~ e4", J: "[db4,d4] d4@3 eb4@2 ~ d4 c4@2 ~ bb3 g3@2 bb3 g3",
  K: "d3 ~ f3 e3 g3 e3 f3 d3 e3 f3 g3 a3 bb3 db4 d4 e4", L: "f4 bb4 g4 d4 c4 f4 d4 a3 ~ bb3 ~ bb3 g3 ~ c4!2",
  M: "e4 d4 ~ e4 ~ f4 ~ d4 ~@8", N: "~ c4 ~ bb3 a3@2 bb3 ~ d4@6 ab3 a3, ~@8 db4 ~@7", O: "c4 a3 bb3 a3 ~ g3 ~ a3 ~@8",
  P: "c4 b3 [a3,bb3] ~@2 c4 eb4 gb4 g4 bb4 c5 g4 f4 g4 ab4 bb4", // Bbmaj7
  Q: "a4 ab4 g4 f4 e4 f4 d4 bb3 a3 ~ c4 bb3 g3 ab3 a3 d3", R: "~ c3 d3 e3 f3 g3 a3 bb3 c4 d4 e4 d4 e4 d4 f4 e4",
  S: "~ f4 g4 a4 bb4 c5 db5 eb5 c5 ~@2 bb4 a4 ab4 gb4 ~", T: "g4 ~@2 d4 f4@3 g4 eb4 e4@2 g4 d4@3 ~",
  U: "~@2 c4 ~@2 c4 ~@2 c4@5 ~ bb3 c4", V: "ab3 a3 f3 c3 e3@2 f3 ~@9", W: "~@7 f3 g3 f3 ~@6",
})).s("gm_electric_guitar_jazz").gain(0.31).pan(0.7)

// chords · string ensemble 2 · "Strings / Slow strings"
const string_ensemble_2 = note(`<
  ~@9 A B C B C D C E F G H I J H F I J K F L C H M N O F P Q R O B C B O S F G T U J H@2 U J F K ~@8 Q B O R C B A V F
  G T I J T H I J K H ~@3
>`.pickRestart({
  A: "~ a6, [c6,f6]", B: "~ f6, [g5,d6]", C: "[c6,f6]", D: "[g5,d6]", E: "~ db6 ~ gb6, g5 c6", F: "[bb5,f6]",
  G: "[bb5,f6] [g5,c6] [a5,d6] [ab5,d6]", H: "f6, bb5 ~", I: "~ g6, [a5,d6]", J: "[a5,d6] [g5,db6] [c6,gb6] [a5,eb6]",
  K: "~ g6, [bb5,f6]", L: "e6, a5 ~", M: "[bb5,e6] [a5,f6]", N: "[g5,c6]", O: "f6@8 a6@4 f6@3 ~, c6@15 ~",
  P: "[g5,d6] [g5,e6]", Q: "f6, c6 ~", R: "d6, g5 ~", S: "~ db6 [c6,bb6]@2, g5 ~", T: "f6@8 g6@4 f6@3 ~, bb5@15 ~",
  U: "d6, a5 ~", V: "[g5,db6]@2 ~ gb6, ~ c6",
})).s("gm_string_ensemble_2").gain(0.12).pan(0.7)

// chords · string ensemble 2 · "Strings / Slow strings" · soft notes
const string_ensemble_2_soft = note(`<
  ~@19 A ~@2 A ~@5 B ~ A ~@5 A C ~@9 B ~ A@2 B ~@11 A ~@2 C ~@10 A ~@3 A ~@3
>`.pickRestart({
  A: "~ d6", B: "~ c6", C: "~ bb5",
})).s("gm_string_ensemble_2").gain(0.04).pan(0.7)

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

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

// drums · clap
const clap = s("cp").struct("<~@4 [~@8 x ~ x ~ x!2 ~ x] ~@53 [~@8 x ~ x ~ x!2 ~ x] ~@26>").gain(0.28)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@8 A ~ B ~ C ~ C ~ D ~@2 E ~ B ~@3 B ~ B ~ F@3 ~@2 F A ~@3 D ~ D ~ D ~@2 A ~ B ~@3 B ~ B ~@7 A ~ A ~ B ~ G ~ E ~@2 E
  ~ D ~ F@2 ~@2 B ~ C ~
>`.pickRestart({
  A: "~@3 x", B: "~@11 x!2 ~@3", C: "~@7 x", D: "~@13 x!2 ~", E: "~@5 x ~@4 x!2 ~@4", F: "~@15 x", G: "~@12 x!3 ~",
})).gain(0.36)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A@7 ~@21 B@3 ~@2 B ~@20 A C A@4 D ~@15 B@2 ~@3 A ~@2>".pickRestart({
  A: "~@5 x ~ x", B: "~@3 x ~@3 x ~@4 x ~@3", C: "~ x ~@8 x ~@3 x ~", D: "~@10 x!2 ~@2 x ~",
})).gain(0.16)

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

// drums · open hat
const open_hat = s("oh").struct("<~@5 A ~ B ~@21 C@3 D ~@24 B ~@3 E ~@6 F ~@3 D ~@4 G ~@7>".pickRestart({
  A: "~ x ~@3 x ~@10", B: "~@9 x ~@6", C: "~@11 x ~@4", D: "~@5 x ~@2", E: "~@5 x ~@9 x", F: "~@7 x",
  G: "~@9 x ~ x ~@4",
})).gain(0.28)

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

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A B A ~ A ~ A ~ A ~@2 A B A ~@3 A B A ~@7 A ~ A ~ A ~ A ~ A ~@2 A B A ~@3 A B A ~@7 A ~ A ~ A ~ A ~ A ~@2 A ~
  A ~@3 A B A ~@2
>`.pickRestart({
  A: "x", B: "~@15 x",
})).gain(0.32)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@9 A ~ A B A B A ~ A C ~ A ~ A D E ~ A ~ A F G H I J H ~ A ~ A ~ A ~ A ~ A I ~ A ~ A K L ~ A ~@9 A ~ A ~ A M A ~ A E
  ~ A ~ A N O ~ A ~@4
>`.pickRestart({
  A: "~@7 x ~@2 x ~ x!2 ~@2", B: "x ~@3 x ~ x ~@2 x ~@2 x ~ x!2", C: "x!2 ~@2 x!2 ~ x!2 ~@2 x ~ x!2 ~",
  D: "x ~@2 x!2 ~ x ~@2 x ~@2 x ~ x!2", E: "x!2 ~@2 x!2 ~ x!2 ~@2 x ~ x!3", F: "~@6 x ~@5 x!2 ~ x",
// … 28 more lines