Strudelify

Goodnight My Love

The McGuire Sisters

KeyA♭ majorTempo64 bpm
0:00/0:00
// Goodnight My Love — The McGuire Sisters
// 64 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 8 "MUTED GTR" named as a guitar, played on electric guitar muted (its muted trumpet patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 43 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/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 · "A.PIANO 2"
const piano = note(`<
  A B C D E F@2 G H I J@2 K L M@2 N O P Q R S T U V W@2 X Y Z AA AB AC AD@3 AE@2 AF AG AH@3
>`.pickRestart({
  A: "~@5 [g2,d3,g3,b3,d4]", B: "[ab2,eb3,c4,eb4]", C: "~ eb4@11, [ab2,eb3,ab3,c4,f4]",
  D: "[ab2,eb3,ab3,c4,eb4,f4] [a2,a3,c4,eb4]", // Fm7 Adim
  E: "f4@3 ~ bb2@2 [eb2,ab3,bb3,db4]@3 [eb2,eb3,g3,bb3,db4,eb4]@3, [ab3,bb3,db4] ~, bb2 ~@2, ~ f4@2 ~", // Ebsus4 Eb7 Bbm7
  F: "[bb2,ab3,bb3,db4,f4] [eb2,eb3,g3,bb3,db4,eb4]", G: "[ab3,bb3,db4,f4] [g3,bb3,db4,eb4], bb2 ~ eb2 ~",
  H: "[ab2,eb3,ab3,c4,eb4,g4]@12 [ab2,ab3,c4,eb4]@4 [a2,a3]@2 [bb3,db4,f4] ~ [b2,gb3,b3,d4]@4, ~@16 [c4,e4] ~ bb2@2 ~@4", // Abmaj7 Ab A Bbm Bm C
  I: "~@11 g4, [c4,eb4], c3@5 c3, g3@2 g3, ~@6 g4@5 ~", // Cm
  J: "[ab3@6 ~@5 d4 [bb2,ab3,db4]@6 eb3@4 ~ eb4, f4@11 f4@7 eb4@5 ~, b2@3 b2 ~@2 [eb2,g3,bb3,db4]@2, ~@3 ab3@2 ab3 ~@5 eb3]/2", // Bbm7 Eb7
  K: "~ [eb3,gb3] [f2,eb3,f3,a3,c4] [a2,f3,a3,c4], eb4@3 ~, [gb2,bb3] ~", L: "~@11 f4, [bb2,ab3,c4], f4@11 ~, ~@3 bb3",
  M: "[~ c4@5 ~@6 bb2@8 ~@2 f4@2, [ab3,d4,g4]@4 ab3@3 ab3, bb2@5 bb2 ~@4 bb2@2, ~ c4 [c4,db4]@2, ~@6 f4@5 f4@11 ~@2]/2", // G Dbmaj7
  N: "~@4 e3@2 [eb2,g3,c4,f4]@3 [eb2,g3,bb3,db4,e4]@3, [e2,ab3,b3,d4,gb4] ~", // Cm Eb7 E7
  O: "[ab2,eb3,g3,ab3,c4,eb4] [ab2,eb3,ab3,c4,eb4,f4]", // Abmaj7 Fm7
  P: "[ab3,c4,f4]@3 ~ eb4@2 [ab3,c4,eb4,f4]@3 [ab3,c4,eb4,f4]@3, [ab2,eb3]!2, ~ [ab3,c4,f4] ~@2", // Fm Fm7 Ab5 Fm
  Q: "[ab3,c4,eb4,f4]@3 [ab3,c4,eb4,f4]@3 eb4@4 ~ a3, [ab2,eb3] [a2,c4], ~@6 a3@5 ~, ~@5 eb4", // Fm7 Ab5 Am
  R: "~@3 [bb3,db4]@3 ~@5 eb4, [bb2,f4] [eb2,bb3], ~ ab3@5 eb4@4 g3@2, ~@2 g3 eb3, ~@7 db4@5", // Bbm Bb5 Eb5
  S: "~@2 db4@4 ~@5 eb4, [bb2,ab3,f4] eb2, ~ bb3@5 eb4@4 g3@2, ~@2 g3 eb3, ~@7 bb3@5", // Bb7
  T: "~@5 f4 g3 ~ [g3,bb3,db4]@4, [ab3,db4]@6 ~ eb3@5, bb2@2 bb2 [eb2,eb4]@3, ~ bb3@5 ~@6, ~ f4@4 ~@7", // Gdim Db5 Eb
  U: "~@2 [bb3,db4]@4 eb3@3 ~@2 eb4, bb2@12 [eb2,eb4]@11 ~, ~ [ab3,f4]@5 [g3,bb3,db4]@4 [g3,bb3,db4]@2, ~@3 eb3", // Bbm Eb Db Gdim
  V: "~@2 [ab3,c4,f4] [e2,e3,ab3,b3,d4,e4], f2@3 ~, [c3,ab3,c4,f4] ~, ~ eb4 ~@2, ~@5 f3@4 ~@3", // Fm E7 Fm
  W: "[~@12 f4@4 ~ bb5 bb4@3 [c4,a4]@3, [gb3,bb3,db4,eb4]@2 [gb3,bb3,c4] [gb3,bb3], ~@9 bb5@8 ~@7, ~@8 f4 ~@3]/2", // F Ebm7 Cm7b5 Gb
  X: "~@3 db5, [f3,ab3,bb3,db4,ab4], ~@7 ab5@5", Y: "~@4 ab4@2 ~@3 gb4@3, [ab3,eb4,e4] [gb3,bb3,e4,bb4], ~ eb5@5",
  Z: "~@3 eb4@2 eb4, [g3,ab3,c4,eb4,f5] [f3,ab3,c4], ~ eb5@5", // Fm7 Fm
  AA: "~ ab4 ~ eb5@3, db3, ~ ab3@11, ~ [b3,eb4]@5, ~ bb4@2", AB: "~@11 eb6, [gb3,bb3,ab4,eb5], e4@5 e4, ~ ab5",
  AC: "~ eb4@3 ~@3 f3@2 f3 [eb4,a4,gb5]@2, f3@5 ab5@5 ~@2, ~ [db5,eb5]@9 ~@2, ~ a4@6 a4@3 ~@2, ~ ab5@3 eb4@6 ~@2", // Ebdim Dbsus2
  AD: "[db5@8 ~@12 [c4,db4]@4 ~@8 c5@6 [g3,c4,db4,f4,bb4,eb5]@6 f4@2 ~@2 [gb3,bb3,c4,eb4,gb4,c5]@8 [gb3,bb3,c4,eb4,gb4,bb4,eb5] ~@3 [gb3,bb3,c4,eb4,bb4,c5,gb5]@4 [bb3,c4,c5,gb5] ~@3 [gb3,bb3,c4,eb4,bb4,c5,gb5]@4, [ab3,f5]@8 c6@11 ~@17, [c4,db4]@7 [f4,bb5]@5 [g3,c4,db4,f4]@7 ~@3 [g3,c4,db4]@2 ~@12, f4@5 c5@7 ~@11 [bb4,eb5]@5 ~@8, ~@4 db5@8 ~@2 bb5@5 ~@17]/3", // Dbmaj7 Gm7b5 Cm7b5 Db Dbmaj7 Bb5 Csus4 C …
  AE: "[~@8 [g4,c5]@4 [f3,eb4,g4]@4 eb4@4 ~@4 [ab3,c4,db4,f4,c5,db5]@4 [ab3,c4,db4,f4,c5,db5,f5] ~@3 [ab3,c4,db4,f4,c5,f5,c6] ~@3 f4@8 ~@2 c6@2, [a4,d5,g5]@4 ~ eb4 ~@5 f4, [f3,eb4] c5 ~@2, ~@2 [c4,f5]@2 [f3,c4,g4,a4]@2 ~@3 [ab3,c4,db4,c5,f5]@3, ~@11 f5@3 ~@4 c6@5 ~]/2", // C5 Cm Dbmaj7 Dsus4 F7 F5 F Dbmaj7
  AF: "[f4,g5]@4 ~@5 [g3,c4,db4,f4,c5]@3, [g3,c4,db4,c5]@3 ~, ~ g5@2, ~@4 f4@5 ~@3, ~@5 f5@7", // Fsus2 Csus4 C
  AG: "[ab3,gb4,ab4,c5,eb5]@3 ~@9 [ab3,f4,ab4,bb4,eb5]@11 ~", // Ab7 Absus2
  AH: "[[eb3,f4,ab4,bb4,db5]@10 ~@20 bb6@23 ~@19, ~@10 [ab3,g4,ab4,c5]@43 ~@19, ~@15 eb5@38 ~@19, ~@18 g5@35 ~@19, ~@21 bb5@4 eb6@27 ~@20]/3", // Bbm7 Abmaj7
})).s("gm_piano").gain(0.38).pan(0.4)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D E F G H I J K F L M N O P Q R S T U@2 V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM@2 ~
>`.pickRestart({
  A: "~@5 g1", B: "ab1@12 ab1@11 ~", C: "ab1@11 ~ ab1@10 g1@2", D: "ab1 a1", E: "bb1@6 eb1@5 f2", F: "bb1 eb1",
  G: "bb1@12 eb1@9 ~ f2@2", H: "bb1@6 eb1@5 g2", I: "ab2@6 ab1@2 a1 bb1 b1@2", J: "c2@10 ~@2 c2@9 ~ c2@2",
  K: "b1@11 ~ b1@10 b1@2", L: "gb1@12 f1@6 a1@5 ~", M: "bb1@11 ~ bb1@11 ~", N: "bb1@6 bb1@5 f2", O: "bb1@11 ~ bb1@12",
  P: "e1@6 eb1@4 bb1 a1", Q: "ab1@11 ~ ab1@9 ~ g1@2", R: "ab1@11 ~ ab1@8 ~@2 g1@2", S: "ab1@12 a1@11 ~",
  T: "bb1@4 db2 eb2 eb1@6", U: "bb1@9 ~ bb1@2 eb2@10 f2@2", V: "bb1@9 ~ bb1@2 eb2@7 ~ eb2@2 e2@2",
  W: "f2@9 ~ e2@2 f2@4 a1@2 e2@4 a1@2", X: "eb2@6 eb2@5 ~ eb2@5 ~ eb2@4 gb2@2", Y: "ab2@3 eb2@3 ab1@2 eb2 ab2@2 eb2",
  Z: "db2@6 ab2@6 db3@5 ~ db3@2 ab2@2 f2@2", AA: "db2@6 ab2@5 ~ gb2@5 ~ gb2 ~ gb2@2 g2@2",
  AB: "ab2@5 ~ ab2@3 ~ eb2@2 ab1@4 ab2@2 eb2@4 d2@2", AC: "db2@6 db3@6 ab2@4 f2@2 db2@5 ~",
  AD: "gb2@6 db2@6 gb1@5 ~ gb1@4 e1@2", AE: "f1@5 ~ f1@4 c2@4 f2@2 c2@2 f1@2 ab1@2 c2@2",
  AF: "bb1@5 ~ bb1@4 c2@2 db2@6 d2@6", AG: "eb2@6 bb2@6 g2@4 eb2@2 d2@3 ~ db2@2", AH: "c2@3 d2@3 eb2@2 c2 gb2@2 c2",
  AI: "f2@6 c2@5 ~ a1@6 f1@4 a1@2", AJ: "bb1 c2 db2 bb1", AK: "eb2@4 eb2@5 ~ bb1@2 eb2@3 ~ eb2@5 ~@3",
  AL: "ab1@7 ~@3 ab1 ~ ab1@7 ~@3 ab1@2", AM: "[eb1@8 ~@2 ab1@33 ~@5]/2",
})).s("gm_acoustic_bass").gain(0.33)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~ A@2 B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM@3
>`.pickRestart({
  A: "[[c4,g4] ~@5 [c4,eb4]@3 ~@2 f3 [f3,ab3,eb4]@3 f3@2 ~ [ab3,eb4]@3 [ab3,eb4]@3, ~ ab3@2 [ab3,eb4] ~ [ab3,eb4] ~@2, ~ [c4,eb4] ~ c4@2 c4@3, ~@5 f3@6 ~@6 f3@7]/2", // C5 Cm Fm7 Ab5 Cm
  B: "[ab3,eb4]@6 [ab3,eb4]@6 [c4,eb4]@6 [c4,eb4]@5 ~, ~@12 a3@11 ~", // Ab5 Cm
  C: "[bb3,f4]@3 [bb3,f4]@3 ~@2 ab3 [bb3,eb4]@3, ~@2 [bb3,f4] ~", D: "f4 [bb3,f4] ~ db4, ab3 ~@11 [bb3,eb4]@12",
  E: "[bb3,f4] [ab3,bb3,f4] bb3 [bb3,db4], ~ eb4", F: "[ab3,db4]!2 [bb3,eb4] [g3,bb3,eb4]",
  G: "[ab3,eb4]@6 [ab3,eb4]@6 ~@4 [a3,c4]@2 [bb3,db4]@2 [b3,d4]@3 ~, g3@2 [ab3,eb4] ~", // Ab5 Am Bbm Bm Ab5
  H: "c4 ~ eb4!2, eb4 ~, ~ [c4,g4]@2 ~", I: "[ab3,b3,d4] d4@2 [b3,d4], ~ ab3@3",
  J: "[ab3,db4]@3 [ab3,db4]@3 [bb3,eb4]@3 ~@2 g3, ~@3 [bb3,eb4]", // Db5 Eb5
  K: "[bb3,eb4] [gb3,bb3,eb4] [a3,eb4] [a3,c4], gb3 ~@11", // Eb5 Ebm Adim Am
  L: "[ab3,d4]@3 [ab3,d4]@3 ~ f4@2 [d4,f4]@3, ~@12 [ab3,d4]@6 ab3 ~@5", // Abdim Dm Abdim
  M: "[c4,f4]@6 ~@4 ab3@2 [c4,f4]@6 [ab3,c4,f4]@5 ~, ~ [c4,f4] ~@2", N: "[ab3,db4,f4]!2 [ab3,db4]!2, ~ f4",
  O: "[ab3,b3,d4] [ab3,d4] [g3,bb3,db4] [bb3,db4,e4]", // Abdim Gdim Bbdim
  P: "[ab3,eb4]@3 [ab3,eb4]@3 f3@2 ~@3 f3, ~ c4, ~@2 ab3 [ab3,eb4], ~@8 f3@3 ~", // Ab5
  Q: "[ab3,eb4]@3 [ab3,eb4]@3 ~@2 f3 [f3,ab3,eb4]@3, f3@2 ~, ~@2 [ab3,eb4] ~", // Ab5 Fm7 Ab5
  R: "[ab3,eb4]@6 [ab3,eb4]@6 [c4,eb4]@6 [c4,eb4]@5 ~, f3 ~@11 a3@11 ~", // Ab5 Cm
  S: "[bb3,f4]@3 [ab3,bb3,f4]@3 [bb3,db4,eb4]@3 ~@2 g3, ~@3 [bb3,db4,eb4]", // Bb5 Bb7 Eb7
  T: "[ab3,bb3,f4] [bb3,f4] [bb3,eb4] [bb3,db4,eb4], ~@6 ab3 ~@17", // Bb7 Bb5 Eb5 Eb7
  U: "~@4 ab3@2 ab3 ~ ab3@4 [bb3,db4,eb4]@6 ~@4 g3@2, [bb3,f4]!2 ~ eb4", // Eb7 Bb5
  V: "ab3@2 ab3 ~@2 ab3 [bb3,eb4]@3 [bb3,db4,eb4]@3, f4@6 [bb3,f4]@6 ~@6 g3 ~@5", // Eb5 Eb7 Bb5
  W: "[ab3,f4] [ab3,c4] [ab3,f4] [b3,d4]", // Db Ab Db Bm
  X: "[bb3,eb4]@2 gb3@2 ~@2 [bb3,eb4]@5 ~ [bb3,eb4]@4 ~@2 [bb3,eb4]@4 ~@2, ~@6 gb3 ~@5 gb3 ~@5 gb3 ~@5", // Eb5
  Y: "[bb3,c4,f4]@3 ~@3 [bb3,f4]@4 ~@2 [gb3,bb3,c4,f4]@3 ~@3 [a3,c4,eb4]@4 ~@2, gb3 ~@5 c4@2 ~@16, ~@6 gb3 ~@17", // Bbsus2 Bb5 Gbmaj7 Adim
  Z: "[f3,bb3,eb4]@2 ~@4 [f3,bb3,eb4] ~@5 [f3,ab3]@2 ~@2 f3 ~ [ab3,bb3]@4 f3 ~, ~@6 bb3@2 ~ f3 ~@2", // Ebsus2 Fm Absus2
  AA: "[ab3,b3]@3 ~@3 [ab3,b3]@4 ~@2 [gb3,bb3]@3 ~@3 [gb3,bb3]@3 ~@3, e3 ~@23", // Abm Gb
  AB: "[ab3,c4]@4 ~@2 ab3@4 g3 ~ [f3,ab3]@6 [ab3,c4]@6, g3@3 ~ g3@4 ~@16, ~ c4@2 ~", // Ab Fm Ab
  AC: "~@3 [ab3,db4], db4@3 ~, ~@2 ab3@7 ~@3, ~ f4", // Db5
  AD: "e4@6 [gb3,bb3,e4]@6 [gb3,bb3,e4]@6 [gb3,bb3,e4]@5 ~, bb3 ~@5, gb3 ~@23", AE: "[a3,eb4] [a3,eb4]@2 [a3,eb4]",
  AF: "[ab3,db4,f4] ~@5 db4@3 ~ f3 ~ c4@2 ~@4 [ab3,db4]@4 f3 ~, ~@6 ab3@8 ~@4 f3 ~@5", // Db Db5
  AG: "db4@5 ~ [bb3,db4]@5 ~ db4@4 g3 ~ g3 ~@3 g3@2, g3@2 ~@10 bb3@3 ~@3 [bb3,db4]@6", // Bbm
  AH: "gb3@4 ~@2 [bb3,c4,eb4]@6 [bb3,c4]@6 [bb3,c4]@5 ~, [bb3,c4] ~@3, ~@4 gb3@8 gb3@2 ~@4 gb3 ~@5", // Cm7 Bbsus2
  AI: "[a3,c4]@6 [a3,c4]@6 [a3,c4]@6 [a3,eb4]@5 ~, ~@12 f3 ~@11", // Am Adim
  AJ: "[ab3,db4]@2 ~@4 db4@4 ab3 ~ [db4,f4]@6 [ab3,db4,f4]@6, ~@6 ab3@2 ~@4 ab3 ~@11", // Db5 Db
  AK: "[g3,db4,f4]@3 g3 ~ g3 [g3,db4,f4]@3 [g3,db4,f4]@3, ~ db4 ~@2", AL: "[gb3,c4,eb4] ~ [f3,ab3,bb3,db4]@2",
  AM: "[[f3,bb3,db4]@9 ~ [g3,ab3,eb4]@43 ~@19]/3", // Bbm Abmaj7
})).s("gm_acoustic_guitar_nylon").gain(0.2).pan(0.7)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note("<~@28 [~@4 ab3 a3 bb3@3 ~@2 bb3] [c4@7 ~@17] ~@13>")
  .s("gm_acoustic_guitar_steel").gain(0.28).pan(0.4)

// chords · vibraphone
const vibraphone = note("<A B@3 C D E F G H I J K L M N O P@2 Q R S T U V ~@18>".pickRestart({
  A: "~@5 [g5,d6]", // G5
  B: "[~@48 [ab5,f6]@7 ~ f6@4 [a5,eb6]@12, ab5@2 ~, eb6@24 eb6@31 ~@17, ~@9 f6@3 ~@7 f6@5 ~@12, ~@22 c6@20 c6@13 ~@17]/3", // Db Adim
  C: "~@2 f6@2 f5 gb5 g5@6, ab5 ~@2", D: "ab5@4 ~ f6 ~ bb5@5, db6 eb6, ~@2 ab5 ~@3",
  E: "~@2 db6@2 f5 gb5 ~@2 db6@4, [ab5,f6]@2 ~ g5@3", F: "f6@5 f6 ~@2 db6@4, ab5@3 eb6 ~@2, ~@7 g5@5",
  G: "~@4 g5@8 [c5,eb5]@3 ~ [c5,e5]@2 [db5,f5]@2 [b4,d5]@4, [eb5,c6] ~", H: "~@2 g5, c5",
  I: "f5@7 ~ ab4@4, ~@7 [d5,f5]@5", J: "~@16 bb4@7 ~, db5@12 ~@2 db5@9 ~, ~@2 bb4 ~@3, ~@10 eb5@13 ~",
  K: "~@2 gb4@4 ~@3 a4@3, ~ [bb4,e5]@5 eb5@3 ~@3, ~@7 c5@5", L: "~@2 [d6,f6], ~ [ab4,d5]@11, ~@7 bb5@5",
  M: "~@7 f5@5, [ab4,d5,g5]", N: "c5@7 ~@2 ab4@3, ~@7 db5@5", O: "e5@2 eb5 ~",
  P: "[~@3 [eb5,c6]@6 f5@9 ~@2 bb5@4, ~ g5@8 ~@9 [f5,c6]@6, ~@2 bb5@7 ~@15]/2", // Cm F5
  Q: "c5 ~ c5, [ab4,f5]@12 a4@11 ~, ~@2 c5 ~@3, ~@5 eb5@7", R: "f5 ~@7 f5@4 eb5@12, ~ bb4@5 ~@6, ~ f5@3 ~@8, ~ db5 ~@2",
  S: "~@2 ab5 eb5 eb5@2, f5 ~, ~ bb5@3", T: "~@8 f5@2 gb5@2 g5@11 ~", U: "bb5@4 f4 gb4 ~@2 db5@4, ~ g4, ~@7 bb4@5",
  V: "~@6 f5@11 ~@7, [ab4,c5]@17 ~@7", // Ab
})).s("gm_vibraphone").gain(0.2).pan(0.6)

// chords · vibraphone · soft notes
const vibraphone_soft = note("<~@2 A@2 B ~@11 C ~@3 D E F ~@20>".pickRestart({
  A: "[bb6@31 ~@17, f6@7 ~@17]/2", B: "f6 ~@5", C: "~ ab4@5 ~@6", D: "~@7 bb4@5", E: "ab4 ~, bb4 ~@11",
  F: "~@4 bb5@5 ~@15",
})).s("gm_vibraphone").gain(0.12).pan(0.6)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@40 A@2 ~>".pickRestart({
  A: "[ab4@5 g4@16 ~@3, g4 ~@47]/2",
})).s("gm_electric_guitar_muted").gain(0.44)

// other · alto sax
const alto_sax = note("<~@39 A B@2 ~>".pickRestart({
  A: "~@10 eb4@2 gb4@3 ~ f4@2 db4@3 ~ f3@2", B: "[gb3@5 db3@16 ~@3]/2",
})).s("gm_alto_sax").gain(0.38).pan(0.6)

// other · alto sax
const alto_sax_2 = note("<~@39 A B@2 ~>".pickRestart({
  A: "~@10 eb4@2 gb4@3 ~ f4@2 db4@3 ~ f3@2", B: "[gb3@9 ~ c4@32 ~@6]/2",
})).s("gm_alto_sax").gain(0.38).pan(0.3)

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

// drums · snare
const snare = s("sd").struct(`<
  ~ A@3 B A@4 C A C D E F G H I J K L M N K O P Q E R G N M S T U M V G W X Y Z ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@5 x!2 ~", C: "~@3 x ~@5 x!3", D: "~@3 x ~@3 x ~ x ~ x", E: "~ x!3",
  F: "x ~@2 x ~@2 x ~ x!2 ~ x", G: "x ~@2 x ~@2 x ~@2 x!3", H: "~@3 x ~@2 x!2 ~ x ~ x", I: "~@3 x ~@2 x!2 ~ x ~@2",
  J: "~@3 x ~@2 x!6", K: "x ~@2 x ~@5 x!3", L: "~@3 x ~@3 x!4 ~", M: "x!4", N: "x ~@2 x ~@2 x ~@2 x!2 ~",
  O: "x!4 ~@2 x ~@2 x!2 ~", P: "x!2 ~ x ~@5 x!3", Q: "x ~@2 x ~@2 x!2 ~ x ~ x", R: "x!2 ~ x!2 ~ x!4 ~@2",
  S: "x ~@2 x!8 ~", T: "x ~@5 x ~@5 x ~@5 x ~ x!3 ~", U: "x ~@2 x ~@2 x!6", V: "x!2 ~ x ~ x!3 ~ x!3",
  W: "x ~@2 x ~@4 x!4", X: "~@3 x ~@3 x!5", Y: "~@3 x!2 ~@7", Z: "~@17 x ~@6",
})).gain(0.44)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@8 A@2 B A B C D E F ~ G H A D ~ I ~ J ~ G ~@4 K ~@5 J ~@2 L ~>".pickRestart({
  A: "x ~ x!2", B: "x!4", C: "x!2 ~ x", D: "~ x ~ x", E: "~@3 x", F: "x ~@2 x", G: "x", H: "~ x!2 ~", I: "~@2 x!2",
  J: "~ x", K: "~ x ~@2", L: "~@2 x",
})).gain(0.27)

// drums · ride
const ride = s("rd").struct("<~ A@2 B@2 A@3 C B A B D B@12 E A F G H A E I E J K B L M N O P ~>".pickRestart({
  A: "x ~@2 x ~@2 x ~@2 x ~ x", B: "x ~@2 x ~ x!2 ~@2 x ~ x", C: "x ~@2 x ~ x!2 ~ x ~@2 x",
  D: "x ~@2 x ~ x!2 ~ x!2 ~ x", E: "x!4", F: "x ~@2 x ~@2 x ~ x!2 ~@2", G: "x ~@2 x ~@2 x!3 ~ x!2", H: "~ x!3",
  I: "x ~@2 x ~ x!2 ~ x!2 ~@2", J: "x ~@2 x ~@2 x ~@2 x!3", K: "~ x ~ x ~ x ~ x ~ x ~ x", L: "x ~@2 x ~ x ~ x ~ x ~ x",
  M: "x ~@2 x ~@2 x ~ x ~@2 x", N: "x ~@4 x!2 ~@4 x", O: "x ~@9 x ~@3 x!10", P: "x!2 ~ x!6 ~@5 x!2 ~@8",
})).gain(0.44)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@41 [~@2 x ~@6 x!5 ~@10] ~>").gain(0.27)

// drums · splash
const splash = s("cr").struct("<~@9 A ~@3 A ~@3 A ~@7 A ~ A ~ A ~@3 A ~ B C A@3 ~@3>".pickRestart({
  A: "x", B: "~@5 x", C: "x ~@10 x",
})).gain(0.38)

stack(
  piano, bass, acoustic_guitar_nylon, acoustic_guitar_steel, vibraphone, vibraphone_soft, electric_guitar_muted,
  alto_sax, alto_sax_2, kick, snare, snare_soft, ride, ride_soft, splash
)