Strudelify

Midnight at the Oasis

Maria Muldaur

KeyE♭ majorTempo105 bpm
0:00/0:00
// Midnight at the Oasis — Maria Muldaur
// 105 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 5 "Marimba" marimba (copy of ch 8 "Clavinet" clavinet)
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 · fretless bass · "Fretless Bas"
const bass = note(`<
  ~@2 A B C D E D F G A B C D E D F G H D I D I D J K L M N M N M G E O A P A D Q K A R E D E D F S T R I U H V W X L M
  L Y L M G E P I R E R Q X Z AA AB AA AC AD AB AE AF AG@2 ~@7
>`.pickRestart({
  A: "eb2@6 bb2 ~ bb2@6 a2 ~", B: "ab2@3 d2 db2@3 e2", C: "eb2@4 ~@2 eb2@2 bb2@6 eb2 ~",
  D: "ab2@5 ~ ab2@2 db2@5 ~ db2@2", E: "eb2@6 bb2 ~ bb2@6 g2 ~", F: "gb2@6 c2@2 b1@5 ~ b1@2",
  G: "ab2@5 ~ ab2@2 bb1@5 ~ bb1@2", H: "eb2@5 ~ eb2 ~ eb2@6 eb2 ~", I: "eb2@3 bb2 bb2@3 eb2",
  J: "gb2@5 ~ gb2@2 b1@5 ~ b1@2", K: "ab2@6 b1@2 bb1@5 ~ bb1@2", L: "e2@5 ~ e2@2 gb2@6 c2@2",
  M: "b1@5 ~ b1@2 db2@5 ~ db2@2", N: "e2@5 ~ e2@2 gb2@5 ~ gb2@2", O: "ab2@6 d2@2 db2@4 ab2@2 ab1 ~",
  P: "ab2@6 d2@2 db2@5 ~ db2@2", Q: "gb2@5 ~ gb2@2 b1@6 a2@2", R: "ab2@5 ~ ab2@2 db2@4 ab2@2 ab1 ~",
  S: "ab2@5 ~ ab2@2 bb1@6 e2@2", T: "eb2@5 ~ eb2@2 bb2@6 eb2 ~", U: "ab2@5 ~ ab2@2 db2@6 e2@2",
  V: "ab2@5 ~ ab2@2 db2@6 g2@2", W: "gb2@3 c2 b1@3 a2", X: "ab2@3 b1 bb1@3 f2", Y: "b1@4 gb2@2 gb1 ~ db2@5 ~ db2@2",
  Z: "f2@6 bb1@2 ab2@5 ~ ab2@2", AA: "g2@6 e2@2 eb2@5 ~ eb2@2", AB: "eb2@6 a2@2 ab2@5 ~ ab2@2",
  AC: "eb2@5 ~ eb2@2 ab2@6 ab2@2", AD: "g2@3 e2 eb2@3 e2", AE: "g2@5 ~ g2@2 eb2@6 e2@2",
  AF: "eb2@5 ~ eb2@2 eb2@5 ~ bb2 ~", AG: "[bb2 bb1 eb2@4 ~@2]/2",
})).s("gm_fretless_bass").gain(0.38)

// chords · epiano1 · "Rhodes Piano"
const epiano1 = note(`<
  ~@2 A B A C D E F G A B A C D E F G H I D J H K L M N O P O Q R S D T D U H V W X H U H I Y Z L AA H AB AC AD H AE AF
  AG AH AI AJ AK AH AL AM Y AN D AO D AP AQ AR@2 AS AT AU AV AW AT AX AY AZ ~@8
>`.pickRestart({
  A: "[g3,bb3,d4,f4]@7 ~", B: "[ab3,c4,eb4]@3 ~ [f3,ab3,b3,eb4]@3 ~", C: "~@2 [ab3,c4,eb4]@5 ~ [f3,b3,eb4,bb4]@6 ~@2",
  D: "~@6 bb4@3 ~ [d4,bb4]@2 ~@4, g3@8 ~@2 [g3,f4] ~@5, ~@2 d4@7 ~@7, ~ f4 ~@2", // Gm G7
  E: "~@2 [ab3,c4,eb4]@5 ~@3 [f3,b3,eb4,bb4]@5 ~", F: "~@2 [gb3,bb3,db4,gb4]@5 ~ [a3,eb4,ab4,db5]@6 ~@2",
  G: "[c4,eb4,ab4]@6 ~@4 [d4,ab4,c5,g5]@5 ~", H: "[d4,g4,bb4,f5]@7 ~", I: "[c4,ab4,eb5]@3 ~ [b3,f4,bb4,eb5]@3 ~",
  J: "[c4,eb4,ab4]@6 ~@4 [b3,f4,ab4,eb5]@5 ~", K: "[c4,eb4,ab4]@6 ~@4 [b3,f4,bb4,eb5]@5 ~",
  L: "[bb3,gb4,db5]@6 ~@4 [a3,eb4,ab4,db5]@5 ~", M: "[ab3,c4,eb4]@6 ~@4 [ab3,bb3,d4,f4]@5 ~",
  N: "~@2 [ab3,b3,e4]@5 ~ [e3,bb3,eb4,ab4]@6 ~@2", O: "~@2 [a3,e4,ab4,db5]@5 ~ [b3,eb4,gb4,bb4]@6 ~@2",
  P: "[ab3,e4,b4]@3 ~ [bb3,e4,ab4,db5]@3 ~", Q: "[ab3,b3,e4]@3 ~ [bb3,e4,gb4,db5]@3 ~",
  R: "[a3,e4,gb4,db5]@6 ~@4 [b3,gb4,bb4,eb5]@5 ~", S: "~@2 [db4,f4,gb4,bb4]@5 ~ [eb4,ab4,c5,g5]@6 ~@2",
  T: "~@2 [c4,e4,gb4,a4]@5 ~ [b3,f4,bb4,eb5]@6 ~@2", U: "[c4,ab4,eb5]@3 ~ [b3,f4,ab4,eb5]@3 ~",
  V: "~@2 [c4,ab4,eb5]@5 ~ [b3,eb4,f4,bb4]@6 ~@2", W: "[bb3,db4,gb4]@6 ~@4 [a3,eb4,ab4,db5]@5 ~",
  X: "[c4,eb4,ab4]@3 ~ [d4,ab4,c5,g5]@3 ~", Y: "[d4,f4,g4,bb4]@7 ~", Z: "~@2 [c4,ab4,eb5]@5 ~ [b3,f4,bb4,eb5]@6 ~@2",
  AA: "[ab3,c4,eb4,ab4]@3 ~ [ab3,d4,f4,bb4]@3 ~", AB: "[ab3,c4,eb4]@6 ~@4 [f3,b3,eb4,ab4]@5 ~",
  AC: "[g3,d4,f4,bb4]@7 ~", AD: "~@2 [ab3,c4,eb4,ab4]@5 ~@3 [f3,b3,eb4,ab4]@5 ~",
  AE: "[ab3,c4,eb4]@3 ~ [f3,bb3,b3,eb4]@3 ~", AF: "[gb3,bb3,db4,gb4]@3 ~ [a3,eb4,gb4,db5]@3 ~",
  AG: "[c4,ab4,eb5]@6 ~@4 [d4,ab4,c5,g5]@5 ~", AH: "[e4,ab4,b4]@6 ~@4 [bb3,e4,ab4,eb5]@5 ~",
  AI: "[a3,db4,e4,ab4]@3 ~ [b3,eb4,gb4,ab4]@3 ~", AJ: "~@2 [ab3,e4,b4]@5 ~ [e3,bb3,db4,gb4]@6 ~@2",
  AK: "[a3,e4,ab4,db5]@6 ~@4 [b3,gb4,bb4,eb5]@5 ~", AL: "[a3,db4,e4,ab4]@3 ~ [b3,eb4,gb4,bb4]@3 ~",
  AM: "~@2 [db4,gb4,bb4,f5]@5 ~@3 [eb4,g4,ab4,c5]@5 ~", AN: "[c4,eb4,ab4]@3 ~ [b3,eb4,f4,ab4]@3 ~",
  AO: "[c4,eb4,ab4]@3 ~ [b3,f4,bb4,eb5]@3 ~", AP: "[c4,ab4,eb5]@6 ~@4 [b3,f4,ab4,eb5]@5 ~",
  AQ: "[bb3,db4,gb4]@3 ~ [a3,eb4,gb4,db5]@3 ~", AR: "[~@2 [ab3,c4,eb4]@5 ~ [ab3,c4,d4,g4]@14 ~@2 [c4,ab4,eb5]@6 ~@2]/2",
  AS: "[b3,g4,d5]@3 ~ [g3,eb4,bb4]@3 ~", AT: "[g3,db4,f4,c5]@3 ~ [ab3,c4,eb4,ab4]@3 ~",
  AU: "[g3,b3,d4,g4]@3 ~ [g3,bb3,eb4]@3 ~", AV: "~@2 [g3,db4,f4,c5]@5 ~ [ab3,c4,eb4,ab4]@6 ~@2",
  AW: "[g3,b3,d4]@3 ~ [g3,bb3,eb4]@3 ~", AX: "~@2 [g3,b3,d4]@5 ~@3 [g3,bb3,eb4]@5 ~",
  AY: "~@2 [g3,db4,f4,bb4]@5 ~ [g3,bb3,db4,f4]@2 ~@2 [g3,bb3,db4,f4]@2 ~@2", // Gm7b5
  AZ: "g4@2 bb4 ~ db5 ~ f5 ~ [g3,bb3,db4,f4]@8", // Gm7b5
})).s("gm_epiano1").gain(0.3)

// chords · acoustic guitar nylon · "Acoustic Guitar(Nylon)"
const acoustic_guitar_nylon = note(`<
  ~@2 A B A C D B E F A B A C D B E F A C D C D B E G H I J K H L M D N A O P B Q R P C D O D S T R P U P B A O Q G V I
  W K W L X A B A B A S Q Y Z AA AB AC AB AA AD AA AE AF@2 ~@7
>`.pickRestart({
  A: "~@2 [g3,d4]@5 ~ [g3,d4]@2 ~@2 [g3,d4]@2 ~@2", B: "[c4,ab4]@2 ab2@2 [c4,ab4]@3 ~ [b3,f4]@2 db3@2 [b3,f4]@3 ~",
  C: "~@2 [c4,ab4]@6 [b3,f4]@2 db3@2 [b3,f4]@3 ~", D: "[g3,d4] ~ [g3,d4] ~@2 [g3,d4] ~@2",
  E: "[bb3,gb4] ~ [bb3,gb4] ~@2 [a3,eb4]@3", F: "[c4,ab4]@2 ab2@2 [c4,ab4]@3 ~ [ab3,d4]@2 bb2@2 [ab3,d4]@3 ~",
  G: "~ [c4,ab4]@3 ~ [ab3,d4]@3", H: "[ab3,e4]@2 e2@2 [ab3,e4]@3 ~ [bb3,e4]@2 gb2@2 [bb3,e4]@3 ~",
  I: "~ [a3,e4]@3 ~ [b3,gb4]@3", J: "[ab3,e4] ~ [ab3,e4] ~@2 [bb3,e4]@3",
  K: "~@2 [a3,e4]@6 [b3,gb4]@2 db3@2 [b3,gb4]@3 ~", L: "[a3,e4]@2 b2@2 [a3,e4]@3 ~ [b3,gb4]@2 db3@2 [b3,gb4]@3 ~",
  M: "~@2 [db4,gb4]@6 [ab3,eb4]@2 bb2@2 [ab3,eb4]@3 ~", N: "[c4,gb4] ~ [c4,gb4] ~@2 [b3,f4]@3",
  O: "[c4,ab4] ~ [c4,ab4] ~@2 [b3,f4]@3", P: "~@2 d4 f4@2 d4 ~ g3, ~@2 g3@9 ~ bb3@4",
  Q: "[bb3,gb4]@2 gb2@2 [bb3,gb4]@3 ~@3 [a3,eb4]@6", R: "[c4,ab4]@2 ab2@2 [c4,ab4]@3 ~@3 [ab3,d4]@6",
  S: "~ [c4,ab4]@3 ~ [b3,f4]@3", T: "[bb3,gb4]@2 gb2@2 [bb3,gb4]@3 ~ [a3,eb4]@2 b2@2 [a3,eb4]@3 ~",
  U: "[c4,ab4]@2 ab2@2 [c4,ab4]@3 ~@3 [b3,f4]@6", V: "[ab3,e4]@2 e2@2 [ab3,e4]@3 ~@3 [bb3,e4]@6",
  W: "~ [ab3,e4]@3 ~ [bb3,e4]@3", X: "[db4,gb4]@2 ab2@2 [db4,gb4]@3 ~ [ab3,eb4]@2 bb2@2 [ab3,eb4]@3 ~",
  Y: "~@2 [c4,ab4]@6 ~@2 [ab3,d4]@5 ~", Z: "[ab3,d4] ~ [ab3,d4] ~@2 [c4,ab4]@3",
  AA: "[b3,g4]@2 g2@2 [b3,g4]@3 ~@3 [g3,eb4]@6", AB: "~@2 [g3,db4]@6 [c4,ab4]@2 ab2@2 [c4,ab4]@3 ~",
  AC: "~ [b3,g4]@3 ~ [g3,eb4]@3", AD: "~ [g3,db4]@3 ~ [c4,ab4]@3", AE: "~@2 [g3,db4]@6 [db4,g4] ~@3 [db4,g4]@2 ~@2",
  AF: "[~@2 [db4,g4] ~@5 [db4,g4]@12 ~@12]/2", // Dbdim
})).s("gm_acoustic_guitar_nylon").gain(0.29)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@26 A@3 B@5 C D C D C ~@18 A@3 B@5 C D C D C ~@10 E@3 ~@7>".pickRestart({
  A: "[[ab3,b3,e4]@3 [e3,bb3,eb4]@5 [a3,e4,db5]@3 [b3,eb4,gb4,bb4]@4 [ab3,b4]@4 [bb3,ab4,db5]@5, ~@3 ab4@8 ~@4 e4@9]/3", // E Eb A Bmaj7 Abm Bbm7
  B: "[[a3,e4,ab4,db5]@3 [eb4,bb4]@4 ab3@4 bb3@4 a3@3 [a3,e4,gb4,db5]@2 [b3,eb5]@4 [db4,f4,gb4]@3 ~@4 g3@9, ~@3 gb4@15 ~@22, ~@3 b3@8 db5@7 ~@2 bb4@7 ~@13, ~@7 e4@11 ~@9 [eb4,ab4,c5,g5]@5 ~@8]/5", // Amaj7 Eb5 Gbm7 B Gbmaj7 Abmaj7
  C: "gb3 eb3", D: "g3", E: "[~@8 f6@3 ~@5, ~@4 [g5,db6]@13 ~@7]/3",
})).s("gm_string_ensemble_1").gain(0.25)

// chords · vibraphone
const vibraphone = note(`<
  ~@2 A B A B A B C D E F G H I J K L M N O P E Q R S T U V W T X Y@2 Z AA H AB Q AC AD AE F AF H AG AH AI AJ AK AL AM
  AN AO AP AQ AR T AS V W T AT AU@2 Z AV AW AX Q AC AD AY AZ AY AZ AY AZ AY AZ ~@10
>`.pickRestart({
  A: "[eb4,g4,bb4,d5]", B: "[eb4,ab4,c5]@3 [db4,f4,ab4,b4,d5]@4 ~", C: "[gb4,bb4,db5]@3 [b4,eb5,gb5,a5,db6]@5",
  D: "[eb4,ab4,c5]@3 [bb4,d5,f5,ab5]@5", E: "~@8 c5@2 bb4@2 g4 f4 eb4@2, [d4,g4]@5 ~ bb3@2",
  F: "[c4,eb4,ab4]@5 ~ [b3,eb4,f4,ab4]@8 ~@2", G: "~@8 c5@2 bb4@2 g4@2 eb4 g4, d4@3 bb3, bb4@5 ~@3",
  H: "f4 eb4@3 [f3,b3]@2 ~@2, [ab3,c4] ~", I: "~@8 c5@2 bb4 ~ g4 f4 eb4 ~, d4@3 bb3, bb4@5 ~@3",
  J: "[c4,eb4,ab4]@5 ~ [b3,eb4,f4,ab4]@5 ~@5", K: "[bb3,db4,gb4]@5 ~ [bb3,db4,eb4,gb4]@5 ~ gb4@4",
  L: "f4@2 f4@2 ab4@2 ab4@2 bb4@7 ~, [c4,eb4]@6 [d4,f4]@9 ~", M: "~@8 c5 ~ bb4 ~ g4 f4 eb4 ~, [d4,g4]@11 ~ bb3@4",
  N: "[c4,eb4,ab4]@2 ~ [b3,eb4,f4,ab4]@4 ~", O: "[d4,g4]@7 ~ eb5@2 c5@2 bb4@2 c5@2, ~@8 g4@7 ~",
  P: "gb4 f4 eb4@5 ~ [f3,b3]@4 ~@4, [ab3,c4]@7 ~@9", Q: "[c4,eb4,ab4]@5 ~ [b3,eb4,f4,ab4]@9 ~",
  R: "[bb3,db4,gb4]@5 ~ [bb3,db4,eb4,gb4]@7 ~ gb4@2", S: "f4@2 f4!2 ab4!2 [d4,f4,ab4,bb4]@9 ~, [c4,eb4]@3 ~@5",
  T: "[e4,ab4,b4]@5 ~ bb4@3 ~ ab4@2 gb4@3 ~, ~@6 [db4,e4]@9 ~", // E Dbm
  U: "a4@2 gb4@2 b4@2 [b3,eb4,gb4,b4]@9 ~, [db4,e4]@3 ~@5", V: "[e4,ab4,b4]@6 bb4@3 ~ ab4@2 gb4@3 ~, ~@6 [db4,e4]@9 ~",
  W: "[db4,e4,a4] [b3,eb4,gb4]", X: "a4@2 gb4@2 b4@2 b4@2 ab4@7 ~, [db4,e4]@6 [b3,eb4,gb4]@9 ~",
  Y: "[gb4@2 gb4@2 ab4@2 ab4@2 f4@11 ~ [g3,d4]@4 g4@2 bb4@2 g4@2 bb4@2, [bb3,db4]@6 [ab3,c4,eb4]@9 ~@9 [bb3,d4]@8]/2", // G5 Bbm Ab Bb
  Z: "[c4,eb4,gb4]@5 ~ [f3,b3,eb4]@6 ~@4", AA: "~@8 bb4@2 g4 ~ f4@2 eb4@2, [eb4,g4]@5 ~ b3@2",
  AB: "~@2 eb4@2 c5 bb4 g4 eb4, [g3,d4]@2 [d4,g4] b3", AC: "[db4,gb4,bb4]@5 ~ [bb3,db4,eb4,gb4]@5 ~ gb4@3 ~",
  AD: "f4@2 f4@2 ab4@2 ab4@2 [d4,f4,bb4]@7 ~, [c4,eb4]@3 ~@5", // Bb Cm
  AE: "[d4,g4]@6 bb3@2 [d4,g4,c5]@2 bb4@2 g4 f4 eb4@2, ~@12 bb3@3 ~", AF: "[d4,g4]@3 bb3 c5 bb4 g4!2, ~@2 [d4,g4] bb3",
  AG: "[d4,g4]@6 bb3@2 c5@2 bb4@2 g4@2 f4 eb4, ~@2 [d4,g4] bb3", AH: "[b3,eb4,ab4]@5 ~ [b3,eb4,f4,ab4]@5 ~ ab4@2 ab4@2",
  AI: "[bb3,db4,gb4]@5 ~ [bb3,db4,eb4,gb4]@8 gb4@2", // Gb Ebm7
  AJ: "f4@2 f4 ~ ab4@2 ab4@2 bb4@8, [c4,eb4]@3 [d4,f4]@5, ~@3 f4@3 ~@10", AK: "[d4,g4]@3 eb4 g4!3 eb4, ~@8 bb3@7 ~",
  AL: "f4 eb4!2 f4 [b3,eb4]@4, [ab3,c4]@3 ~@5", AM: "[d4,g4]@3 eb4 eb5 c5 bb4 c5, ~@2 [g4,bb4] [d4,g4]",
  AN: "g4 eb4 ~@2 [f3,b3]@2 ~@2, [ab3,c4] ~", AO: "[d4,g4]@3 bb3 c5 bb4 g4 eb4, ~@2 [d4,g4] bb3",
  AP: "[c4,eb4,ab4]@3 [b3,eb4,f4,ab4]@5", AQ: "[bb3,db4,gb4]@6 [bb3,db4,eb4,gb4]@6 gb4 gb4@3",
  AR: "f4!2 ab4!2 bb4@4, [c4,eb4]@3 [d4,f4]@5", AS: "a4@2 gb4@2 b4@2 [b3,eb4,gb4]@9 ~, [db4,e4]@3 b4 ~@4",
  AT: "a4@2 gb4@2 b4 ~ b4 ~ ab4 ~@7, [db4,e4]@6 [b3,eb4,gb4]@9 ~", // Dbm B
  AU: "[gb4@2 gb4@2 ab4@2 ab4@2 f4@11 ~ [g3,d4]@4 g4 ~ bb4 ~ g4 ~ bb4 ~, [bb3,db4]@6 [ab3,c4,eb4]@9 ~@9 [bb3,d4]@8]/2", // G5 Bbm Ab Bb
  AV: "~@8 bb4@2 g4 ~ f4 ~ eb4 ~, [eb4,g4]@5 ~ b3@2", AW: "f4 ~ eb4 ~@5 [f3,b3]@4 ~@4, [ab3,c4] ~",
  AX: "~@4 eb4@4 c5 ~ bb4 ~ g4 ~ eb4 ~, [g3,d4]@2 [d4,g4] b3", AY: "~@2 [c4,eb4]@2 ~ g4@2 f4, ~ [b3,d4]",
  AZ: "g4 f4 eb4@6 [g3,db4,f4]@8, bb3 ~", // Gm7b5
})).s("gm_vibraphone").gain(0.57)

// drums · kick
const kick = s("bd").struct("<~@2 [x ~@2 x!2 ~@2 x]!23 [x ~@2 x!2 ~@3] [x ~@2 x!2 ~@2 x]!55 [x ~@2 x!2 ~@3] ~@8>")
  .gain(0.5)

// drums · rim
const rim = s("rim").struct(`<
  A B C D C D C D C D C D C D C D C D C D C D C D C ~ C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D ~ C D
  C D C D ~ C D C D C D C E F G F G F G F H I J ~@8
>`.pickRestart({
  A: "x!2", B: "x!4", C: "x ~@2 x ~@2 x ~", D: "~@2 x ~@2 x ~@2", E: "~@2 x ~ x ~@2 x", F: "~ x ~ x",
  G: "~ x ~@2 x ~@2 x", H: "~ x ~@6", I: "~@4 x ~@2 x", J: "~ x ~@2",
})).gain(0.44)

// drums · snare
const snare = s("sd").struct("<~@25 A ~@30 B ~@6 B ~@16 C ~@9>".pickRestart({
  A: "~@5 x ~@2", B: "x ~@2 x ~@2 x!2", C: "x",
})).gain(0.44)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@56 [~ x!2 ~ x!2 ~@2] ~@6 [~ x!2 ~ x!2 ~@2] ~@26>").gain(0.19)

// drums · low tom
const low_tom = s("lt").struct("<~@25 [~@6 x!2] ~@53 [~@3 x] [~@3 x ~@4] ~@9>").gain(0.5)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~@9 A ~ A ~@5 A B A ~@7 A B A ~ A B ~@2 A ~@4 A B A B ~ B ~@3 A ~ A ~ A ~@7 C ~@11
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@7 x", C: "~ x ~@6",
})).gain(0.37)

// drums · high tom
const high_tom = s("ht").struct("<~@25 A ~@5 B ~ B ~@9 B ~@3 B ~@5 B ~@20 C ~@5 D ~@9>".pickRestart({
  A: "~ x ~@2", B: "~@3 x ~@4", C: "~@7 x", D: "x",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@7 A ~@15 A ~@30 A ~@6 A ~@16 B ~@8>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.25)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 [~ x ~ x ~ x ~ x]!79 [~ x ~ x ~@4] ~@8>").gain(1.26)

// drums · shaker
const shaker = s("sh").struct("<~@2 [x!4]!79 [x!2 ~@2] ~@8>").gain(0.37)

stack(
  bass, epiano1, acoustic_guitar_nylon, string_ensemble_1, vibraphone, kick, rim, snare, snare_soft, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash, cabasa, shaker
)