Strudelify

I'm Doing Fine Now

The Pasadenas

KeyB♭ majorTempo115 bpm
0:00/0:00
// I'm Doing Fine Now — The Pasadenas
// 115 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 21, 4/4 at bar 21, 2/4 at bar 28, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level. 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 · [...]/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 · piano
const piano = note(`<
  A B A B C D E F A B A B C D G F H@3 I@3 J K@3 L@3 M N A B A B A B A B H@3 I@3 J K@3 L@3 M N A B A B A B A B A B A B A
  B A B H@3 I@3 J K@3 L@3 M N A B A B A B A B A B A B A B A B A B A B A O G P Q
>`.pickRestart({
  A: "[d4,f4,bb4]@5 ~ [f4,bb4,d5]@3 ~ [f4,bb4,d5]@2 [g4,bb4,eb5]@4", // Bb Eb
  B: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [eb4,g4,bb4]@2 [eb4,g4,bb4]@5 ~", // Eb Bb Eb
  C: "[d4,f4,bb4]@5 ~ [f4,bb4,d5]@2 ~@2 [f4,bb4,d5]@2 [g4,bb4,eb5]@4", // Bb Eb
  D: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [eb4,g4,bb4]@2 [eb4,g4,bb4]@3 ~ [g4,bb4,eb5]@2", // Eb Bb Eb
  E: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [eb4,g4,c5]@2 [d4,f4,bb4]@2 ~@2 [g4,bb4,eb5]@2", // Eb Bb Cm Bb Eb
  F: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [g4,bb4,eb5]@2 [a4,c5,f5]@5 ~", // Eb Bb Eb F
  G: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [eb4,g4,c5]@2 [d4,f4,bb4]@3 ~ [g4,bb4,eb5]@2", // Eb Bb Cm Bb Eb
  H: "[[bb3,d4,f4]@13 ~ bb3@8 [bb3,eb4,g4]@2 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4]@2 [bb3,eb4,g4]@7 ~ [bb3,eb4,g4]@2 [bb3,eb4,g4]@7 ~, ~@14 [d4,f4]@13 ~@21]/3", // Bb Eb Dm
  I: "[[bb3,eb4,g4]@2 [bb3,d4,f4]@3 ~ [g3,bb3,eb4]@15 ~ [g3,bb3,eb4]@15 ~ [f3,bb3,d4]@10]/3", // Eb Bb Eb Bb
  J: "~ [g3,bb3,eb4] [f3,bb3,d4] [g3,bb3,eb4]@5", // Eb Bb Eb
  K: "[~@2 [g3,bb3,eb4]@2 [g3,bb3,eb4]@2 [f3,bb3,d4]@17 ~ [f3,bb3,d4]@6 [g3,bb3,eb4]@5 ~@3 [g3,bb3,eb4]@2 [g3,bb3,eb4]@5 ~ [g3,bb3,eb4]@2]/3", // Eb Bb Eb
  L: "[[g3,bb3,eb4]@7 ~ [g3,bb3,eb4]@2 [f3,bb3,d4]@3 ~ [g3,bb3,eb4]@13 ~ [g3,bb3,eb4]@2 [eb4,g4,bb4]@17 ~]/3", // Eb Bb Eb
  M: "[a3,c4,f4]@7 ~ [a3,c4,f4]@7 ~", N: "[a3,c4,f4]@7 ~ [a3,c4,f4]@3 ~ [a3,c4,f4]@3 ~",
  O: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [eb4,g4,bb4]@2 [eb4,g4,bb4]@2 ~@2 [g4,bb4,eb5]@2", // Eb Bb Eb
  P: "~@2 [g4,bb4,eb5]@2 [f4,bb4,d5]@3 ~ [g4,bb4,eb5]@2 [a4,c5,f5]@4 ~@2", Q: "~@2 [d4,f4,bb4] ~@5",
})).s("gm_piano").gain(0.4)

// bass · acoustic bass
const bass = note(`<
  A B C B C D E F A B C B C D E F G H@2 I J K L M N O P@2 Q R S A B C B A B C B G T@2 I J U V W X@2 Y@3 R S A B C B A B
  C B A B C B A B C B G T@2 I J U V W X@2 Y@3 R S A B C B A B C B A B C B A B C B A B C B A Z AA AB AC
>`.pickRestart({
  A: "bb1 a1 bb1 d2@2 bb1 eb2@2", B: "~@2 eb2@2 d2@4 f2 ~ f1@5 ~", C: "bb1@2 a1@2 bb1@2 d2@3 ~ bb1@2 eb2@4",
  D: "~ eb2 d2@2 f2 f1@2 eb2", E: "~ eb2 d2@2 c2 bb1 ~ eb2", F: "~@2 eb2@2 d2@3 ~ eb2@2 f2@5 ~", G: "d2@3 d2 d2@3 d2",
  H: "[f2!2 d2!2 eb2!3 eb2@4 eb2 eb2@3 eb2]/2", I: "eb2 g1@2 c2@4 c2", J: "c2@3 c2 c2@3 c2", K: "eb2 g1 c2 d2@4 d2",
  L: "d2 c2 d2 eb2@4 eb2", M: "eb2!3 d2 d2@3 d2", N: "d2@3 d2 f2!2 d2 eb2", O: "eb2@3 eb2 eb2@3 eb2",
  P: "[eb2@3 eb2!2 g1@2 c2@4 c2 c2@3 c2]/2", Q: "c2@3 c2!2 d2 eb2 g2", R: "f2@3 f2 f2@2 c2 d2",
  S: "f2@6 ~ f2 c2@2 d2@2 eb2@2 f2@2", T: "[d2!3 eb2!4 eb2@4 eb2 eb2@3 eb2]/2", U: "c2!3 d2@4 d2", V: "d2!3 eb2@4 eb2",
  W: "eb2!3 d2@4 d2", X: "[d2@6 d2@2 d2@2 d2@2 eb2@2 eb2@5 ~@3 eb2@2 eb2@6 eb2@2]/2",
  Y: "[eb2@3 eb2!2 g1@2 c2@4 c2 c2@3 c2@4 c2!2 d2 eb2 g2]/3", Z: "~@2 eb2@2 d2@4 f2 ~ f1@4 eb2@2",
  AA: "~@2 eb2@2 d2@4 c2 ~ bb1@4 eb2@2", AB: "~@2 eb2@2 d2@4 eb2 ~ f2@6", AC: "~@2 bb1 ~@5",
})).s("gm_acoustic_bass").gain(0.45)

// other · harpsichord
const harpsichord = note("<A B C B C D E F ~@102>".pickRestart({
  A: "bb2 a2 bb2 d3@2 bb2 eb3@2", B: "~@2 eb3@2 d3@4 bb2 ~ f2@5 ~", C: "bb2@2 a2@2 bb2@2 d3@3 ~ bb2@2 eb3@4",
  D: "~@2 eb3@2 d3@4 bb2 ~ f2@4 eb3@2", E: "~ eb3 d3 ~ c3 bb2 ~ eb3", F: "~@2 eb3@2 d3@2 ~@2 eb3@2 f3@5 ~",
})).s("gm_harpsichord").gain(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A B A B A C D E A B A B A C D E F@3 G@7 H@3 I J A B A B A B A B F@3 G@7 H@3 I J A B A B A B A B A B A B A B A B F@3
  G@7 H@3 I J A B A B A B A B A B A B A B A B A B A B K@4 L
>`.pickRestart({
  A: "d4@5 ~ f4@3 ~ d4@2 g4@4", B: "~@2 g4@2 f4@3 ~ f4@2 f4@5 ~", C: "~@2 g4@2 f4@3 ~ f4@2 f4@3 ~ g4@2",
  D: "~@2 g4@2 f4@3 ~ eb4@2 d4@2 ~@2 g4@2", E: "~@2 g4@2 f4@3 ~ g4@2 a4@5 ~",
  F: "[[bb3,d4,f4]@7 bb3@4 [bb3,eb4,g4] [bb3,eb4,g4]@2 [bb3,eb4,g4] [bb3,eb4,g4]@4 [bb3,eb4,g4] [bb3,eb4,g4]@4, ~@7 [d4,f4]@7 ~@10]/3", // Bb Eb Dm
  G: "[[bb3,eb4,g4]@2 [bb3,d4,f4]@4 [g3,bb3,eb4]@16 [g3,bb3,eb4]@16 [f3,bb3,d4]@12 [g3,bb3,eb4]@2 [f3,bb3,d4]@2 [g3,bb3,eb4]@12 [g3,bb3,eb4]@2 [g3,bb3,eb4]@2 [f3,bb3,d4]@18 [f3,bb3,d4]@6 [g3,bb3,eb4]@5 ~@3 [g3,bb3,eb4]@2 [g3,bb3,eb4]@6 [g3,bb3,eb4]@2]/7", // Eb Bb Eb Bb Eb Bb Eb Bb …
  H: "[[g3,bb3,eb4]@4 [g3,bb3,eb4] [f3,bb3,d4]@2 [g3,bb3,eb4]@7 [g3,bb3,eb4] [eb4,g4,bb4]@9]/3", I: "[a3,c4,f4]!2",
  J: "[a3,c4,f4]@2 [a3,c4,f4]!2", // F
  K: "[d4@6 f4@3 ~ d4@2 g4@6 g4@2 f4@3 ~ f4 ~ f4@3 ~ g4@4 g4 ~ f4@4 eb4 ~ d4@3 ~ g4@4 g4@2 f4@3 ~ g4 ~ a4@6]/4",
  L: "~@2 bb3 ~@5",
})).s("gm_electric_guitar_clean").gain(0.25)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@11 A B@2 C D ~@13 E F G@2 H@2 I@2 J@2 K@2 L M@6 N O@3 P Q G@2 H@2 R@2 S@2 T@2 U@2 T@2 V@2 ~@15 G@2 H@2 R@2 S@2 G@2
  H@2 R@2 S@2 G@2 H@2 W@2 X D Y
>`.pickRestart({
  A: "~@14 g5 a5", B: "[bb5@6 d6@6 eb6@8 d6@4 bb5 ~ f5@3 ~ eb6@2]/2", C: "~@2 eb6@2 d6@4 c6 ~ bb5@3 ~ eb6@2",
  D: "~@2 eb6@2 d6@3 ~ eb6 ~ f6@6", E: "~@12 bb5 c6 d6 eb6", F: "f6@6 ~ f5", G: "[d6@6 f6@6 g6@19 ~]/2",
  H: "[bb5@6 f5@6 bb5@13 ~ bb5 ~ bb5@2 a5@2]/2", I: "[d6@3 f6@3 g6@9 ~]/2",
  J: "[bb5@6 f5@5 ~ bb5@13 ~ bb5 ~ bb5@2 a5 ~]/2", K: "[f5@10 d5@2 f5@2 a5@4 bb5@2 a5@2 f5@2 f5@3 ~@3 g5 ~]/2",
  L: "g5@6 f5 g5 c6@4 bb5@4",
  M: "[c6 d6 c6 bb5 f5 ~ g5@15 ~ bb5@8 eb6@8 f6@12 eb6@2 f6 ~ g6@12 f6@2 eb6@2 f6@18 ~@2 bb5@2 a5@2 f6@2, ~@22 a5 ~]/6",
  N: "f6@3 ~@3 g6@7 ~ f5 g5", O: "[c6@4 bb5@4 c6 d6 c6 bb5 f5 ~ g6@34]/3", P: "f6@12 bb5 c6 d6 eb6", Q: "f6@14 f4 ~",
  R: "[d6@3 f6@3 g6@10]/2", S: "[bb5@6 f5@6 bb5@13 ~ bb5 ~ bb5@2 a5 ~]/2", T: "[bb5@6 f5@6 g5@17 ~ eb6@2]/2",
  U: "[d6@2 bb5 ~ bb5 ~ f5@4 bb5 ~ bb5@13 ~ bb5 ~ bb5@2 a5@2]/2",
  V: "[d6@2 bb5 ~ bb5 ~ f5@4 bb5 ~ bb5@13 ~ f5@2 bb5@2 a5 ~]/2", W: "[bb5@6 d6@6 eb6@7 ~ d6@4 bb5 ~ f5@4 eb6@2]/2",
  X: "~@2 eb6@2 d6@3 ~ c6 ~ bb5@3 ~ eb6@2", Y: "~@2 [bb5,bb6] ~@5",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.3)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@11 A B@2 C D ~@13 E F G@2 H@2 I@2 J@2 K@2 L M@6 N O@3 P Q R@2 S@2 G@2 S@2 T@2 U@2 T@2 V@2 ~@15 R@2 S@2 G@2 S@2 R@2
  S@2 G@2 S@2 R@2 S@2 W@2 X Y Z
>`.pickRestart({
  A: "~@14 g5 a5", B: "[bb5@6 d6@6 eb6@8 d6@4 bb5 ~ f5@3 ~ eb6@2]/2", C: "~@2 eb6@2 d6@4 c6 ~ bb5@3 ~ eb6@2",
  D: "~@2 eb6@2 d6@3 ~ eb6 ~ f6@6", E: "~@12 bb4 c5 d5 eb5", F: "f5@3 ~", G: "[d4@6 f4@6 g4@19 ~]/2",
  H: "[bb4@6 f4@6 bb4@13 ~ bb4 ~ bb4@2 a4@2]/2", I: "[d4@6 f4@5 ~ g4@19 ~]/2",
  J: "[bb4@6 f4@5 ~ bb4@13 ~ bb4 ~ bb4@2 a4@2]/2", K: "[f4@10 d4@2 f4@2 a4@4 bb4@2 a4@2 f4@2 f4@6 g4 ~]/2",
  L: "g4@6 f4 g4 c5@4 bb4@4",
  M: "[c5 d5 c5 bb4 f4 ~ g4@15 ~ bb3@8 eb4@8 f4@12 eb4@2 f4 ~ g4@12 f4@2 eb4@2 f4@18 a4@2 bb4@2 a4@2 f4@2]/6",
  N: "f4@6 g4@8 f4 g4", O: "[c5@4 bb4@4 c5 d5 c5 bb4 f4 ~ g4@34]/3", P: "f4@12 bb3 c4 d4 eb4", Q: "f4@7 ~",
  R: "[d4@3 f4@3 g4@9 ~]/2", S: "[bb4@6 f4@6 bb4@13 ~ bb4 ~ bb4@2 a4 ~]/2", T: "[bb4@6 f4@6 g4@17 ~ eb5@2]/2",
  U: "[d5@2 bb4 ~ bb4 ~ f4@4 bb4 ~ bb4@13 ~ bb4 ~ bb4@2 a4@2]/2",
  V: "[d5@2 bb4 ~ bb4 ~ f4@4 bb4 ~ bb4@13 ~ f4@2 bb4@2 a4 ~]/2", W: "[bb4@6 d5@6 eb5@7 ~ d5@4 bb4 ~ f4@4 eb5@2]/2",
  X: "~@2 eb5@2 d5@3 ~ c5 ~ bb4@3 ~ eb5@2", Y: "~@2 eb5@2 d5@3 ~ eb5 ~ f5@6", Z: "~@2 [bb4,bb5] ~@5",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.7)

// other · celesta
const celesta = note(`<
  ~@8 A ~ A ~ B@2 C ~@16 A ~ A ~ A ~ A ~@16 A ~ A ~ A ~ A ~@24 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ D ~ E ~ F
>`.pickRestart({
  A: "bb6@2 ~ d7@2 ~ eb7@2", B: "[bb6@2 ~ d7@2 ~ eb7@3 ~@7]/2", C: "~@8 c8 ~ bb7@2 ~@4", D: "bb5@2 ~ d6@2 ~ eb6@2",
  E: "~@8 c7 ~ bb6@2 ~@4", F: "~@4 bb6 ~@11",
})).s("gm_celesta").gain(0.4)

// chords · trombone
const trombone = note(`<
  ~@8 A B A C D@2 E F ~@13 G H A B A C A B I@2 ~@13 G H A B A C A B I@2 A B A C A B I@2 ~@13 G H A B A C A B I@2 A B A C
  A B I@2 A B A C J E K F L
>`.pickRestart({
  A: "[d4,f4]@5 ~ [f4,bb4]@5 ~ [g4,bb4]@4", B: "~@2 [g4,bb4] ~ [f4,bb4]@3 ~ [eb4,g4] ~ [bb3,eb4]@4 ~@2",
  C: "~@2 [g4,bb4] ~ [f4,bb4]@3 ~ [eb4,g4] ~ [bb3,eb4]@5 ~", // Gm Bb5 Eb Eb5
  D: "[[d4,f4]@5 ~ [f4,bb4]@5 ~ [g4,bb4]@8 ~@10 [g4,bb4]@2]/2", // Dm Bb5 Gm
  E: "~@2 [g4,bb4] ~ [f4,bb4]@3 ~ [eb4,g4] ~ [eb4,g4]@3 ~ [g4,bb4]@2", // Gm Bb5 Eb Gm
  F: "~@2 [g4,bb4] ~ [f4,bb4]@3 ~ [g4,bb4] ~ [a4,c5]@6", G: "[a4,c5]@5 ~ [a4,c5] ~ [a4,c5]@5 ~ [a4,c5] ~",
  H: "~@2 [a4,c5] ~ [a4,c5]@8 [a4,c5] ~ [a4,c5] ~", // Am
  I: "[[d4,f4]@5 ~ [f4,bb4]@5 ~ [g4,bb4]@9 ~@3 [eb4,g4] ~ [eb4,g4] ~ [eb4,g4]@2 ~@2]/2", // Dm Bb5 Gm Eb
  J: "[d4,f4]@4 ~@2 [f4,bb4]@5 ~ [g4,bb4]@4", K: "~@2 [g4,bb4] ~ [f4,bb4]@3 ~ [eb4,g4] ~ [d4,f4]@3 ~ [g4,bb4]@2",
  L: "~@2 [d5,f5] ~@5", // Dm
})).s("gm_trombone").gain(0.4).pan(0.3)

// other · baritone sax
const baritone_sax = note(`<
  ~@8 A@4 B C D E ~@13 F G A@6 H@2 ~@13 F I A@6 H@2 A@6 H@2 ~@13 F I A@6 H@2 A@6 H@2 A@4 J K D L M
>`.pickRestart({
  A: "[bb2@2 a2@2 bb2@2 d3@3 ~ bb2@2 eb3@6 eb3@2 d3@3 ~ bb2 ~ f2@5 ~]/2", B: "bb2@2 a2@2 bb2@2 d3@3 ~ bb2@2 eb3@4",
  C: "~@2 eb3@2 d3@3 ~ bb2 ~ f2@4 eb3@2", D: "~@2 eb3 ~ d3@3 ~ c3 ~ bb2@3 ~ eb3@2", E: "~@2 eb3@2 d3@3 ~ eb3 ~ f3@5 ~",
  F: "f2@5 ~ f2 ~ f2@5 ~ f2 ~", G: "~@2 f2 ~ f2 ~@11",
  H: "[bb2@2 a2@2 bb2@2 d3@3 ~ bb2@2 eb3@6 eb3@2 d3@3 ~ f2 ~ f2 ~ f2@3 ~]/2", I: "~@2 f2 ~ f2@8 ~@4",
  J: "bb2@2 a2@2 bb2 ~ d3@3 ~ bb2 ~ eb3@4", K: "~@2 eb3 ~ d3@3 ~ bb2 ~ f2@3 ~ eb3@2", L: "~@2 eb3 ~ d3@3 ~ eb3 ~ f3@6",
  M: "~@2 bb2 ~@5",
})).s("gm_baritone_sax").gain(0.45).pan(0.7)

// other · alto sax
const alto_sax = note(`<
  ~@16 A@3 B C D@3 E@2 ~ F@3 G H@2 I@2 J@2 K@2 L@3 B M N@3 O P ~ Q@3 R H@2 I@2 J@2 K@2 S T S U S V S U W@3 X Y Z AA@2 AB
  AC ~ AD AE AF@2 H@2 I@2 J@2 AG@2 H@2 I@2 J@2 AG@2 H@2 I@2 AH@2 AI@2 ~
>`.pickRestart({
  A: "[~@6 f3@2 f3@2 g3@2 a3@2 a3@4 a3 ~ a3 ~ g3 ~ g3@13 ~@11]/3", B: "~@7 g3", C: "bb3@2 bb3@3 ~ eb4@6 d4@4",
  D: "[bb3@3 c4@2 f3@4 f3 g3 bb2@7 ~@5 f3]/3", E: "[f3@2 g3@2 a3@3 ~ a3 ~ a3@3 ~ g3@8 ~@10]/2",
  F: "[~@6 g3@2 bb3@3 ~ bb3 ~ eb4@4 d4@2 d4@2 c4@2 bb3@2 c4@2 d4@2 c4@18]/3", G: "~ c4@2 bb3@2 bb3!2 a3",
  H: "[bb3@3 f3@3 g3@7 ~@2 eb4]/2", I: "[d4@2 bb3@4 f3@4 bb3@2 bb3@11 ~@3 bb3@2 bb3@2 a3@2]/2",
  J: "[bb3@2 c4@2 d4@2 bb3 c4@3 d4@2 bb3@9 ~@9 eb4@2]/2", K: "[d4 ~ bb3@4 f3@4 bb3@2 bb3@12 ~@8]/2",
  L: "[~@6 f3@2 f3@2 g3@2 a3@2 a3@4 a3 ~ a3@2 g3 ~ g3@15 ~@9]/3", M: "bb3@3 ~ bb3@2 eb4@4 d4@2 d4@2 c4@2",
  N: "[bb3@3 ~ bb3@2 c4@4 f3@8 f3@2 g3@2 bb2@18 ~@6 f3@2]/3", O: "f3@2 g3@2 a3@2 a3@4 a3 ~ a3@2 g3 ~", P: "g3@13 ~@3",
  Q: "[~@6 g3@2 bb3@2 bb3@4 eb4@4 d4 ~ d4@2 c4@2 bb3@2 c4@2 d4@2 c4@8 d4 c4 f4@4 g4@4]/3",
  R: "~@2 g4@4 f4@4 bb3 ~ bb3@2 a3@2", S: "~@7 f3", T: "g3@2 g3@2 f3@3 ~ g3@2 bb3@3 ~@3",
  U: "g3 ~ g3@2 f3 ~ f3@2 g3@2 bb3@2 ~@4", V: "g3@2 g3 ~ f3@4 g3@2 bb3@2 ~@4",
  W: "[~@6 d4@2 g4@2 f4@2 d4@2 g4@4 d4 ~ c4 ~ bb3 ~ c4 d4 bb3@13 ~@9]/3", X: "~@3 g4",
  Y: "f4@2 d4@2 d4@4 bb3@3 ~ bb3@2 g3@2", Z: "bb3@2 ~ c4@2 f3@3", AA: "[~ f3 g3 bb2@6 ~@6 d4]/2",
  AB: "g4 f4 d4 g4 ~ d4 c4 bb3", AC: "c4 d4 bb3@13 ~", AD: "~@3 g4 bb4 g4 g4@2",
  AE: "~@2 f4 ~ f4@2 d4@2 ab4 g4@2 f4@3 d4@2", AF: "[g4@6 f4@2 d4@2 c4@2 c4@13 ~ bb3@2 bb3@2 a3@2]/2",
  AG: "[d4 ~ bb3@4 f3@4 bb3@2 bb3@12 ~@2 bb3@2 bb3@2 a3@2]/2", AH: "[bb3@2 c4@2 d4 ~ bb3 c4@3 d4@2 bb3@13 ~@5 eb4@2]/2",
  AI: "[~@2 eb4 ~ d4@3 ~ c4 ~ bb3@3 ~ eb4@4 eb4 ~ d4@3 ~ eb4 ~ f4@5 ~]/2",
})).s("gm_alto_sax").gain(0.78)

// drums · kick
const kick = s("bd").struct("<[x!2 ~@2 x!2 ~@2]!109 [~ x ~@2]>").gain(0.45)

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

// drums · hihat
const hihat = s("hh").struct("<[x!8]!109 ~>").gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@92 [~@5 x ~@2] ~@16 [~ x ~@6]>").gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@92 [~ x ~@6] ~@16 [~ x ~@14]>").gain(0.45)

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

// drums · high tom
const high_tom = s("ht").struct("<~@109 x>").gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B A B A B A B A B A B A B A B A C D@7 A@5 E A B A B A B A B A C D@7 A@5 E A B A B A B A B A B A B A B A B A C D@7
  A@5 E A B A B A B A B A B A B A B A B A B A B A B A B F
// … 18 more lines