Strudelify

A Song for Mama

Boyz II Men

KeyG majorTempo75 bpm
0:00/0:00
// A Song for Mama — Boyz II Men
// 75 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 93 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(75/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.

// other · fretless bass · "untitled"
const fretless_bass = note("<~@8 [~@2 g3@2 g2 ~@3] ~@84>").s("gm_fretless_bass").gain(0.56)

// chords · piano
const piano = note(`<
  A@4 B@3 C@4 D@2 E@2 F G H I J K L M@4 N O@3 P@2 Q@2 R S@2 T@2 U@2 V@2 W X Y@2 Z AA AB AC AD@2 AE AF@2 AG@2 AH@2 AI@2
  AJ@2 AK@2 AL AM AN@2 AO AP AQ AR AS@2 AT@4 AU@2 AV AW AX AY@2 AZ BA@2 BB@3
>`.pickRestart({
  A: "[~@12 g3@2 ~@2 d2@5 ~ [e3,g3]@13 ~ e3@2 ~@6 g3@2 ~@2 [d2,d3,f#3]@5 ~ [c2,c3,e3,g3]@9 ~, ~@8 g2@8 ~@6 c2@17 ~ g2@8 ~@16, ~@8 b3@4 ~@2 a3@7 ~@17 g3@4 ~@4 a3@7 ~@11, ~@10 d3@5 ~@7 c3@7 ~@10 d3@2 ~ d3@4 ~@18, ~@40 b3@5 ~@19]/4", // Em D C
  B: "[[c2,c3,e3,g3]@4 [d2,f#3,a3]@3 ~ g3@2 ~@2 g3@2 ~@2 [d2,d3,f#3]@5 ~ [e3,g3]@12 c3@2 d3@2 g3 ~ g3@2 ~@2 g3@2 a3@2, ~@4 d3@2 ~ d3@2 ~ d3@4 ~@8 c3@10 ~@8 g2@8, ~@8 g2@8 ~@6 c2@18 d3 ~ d3@4 ~@2, ~@8 b3@5 ~ a3@7 ~@19 b3@6 ~@2]/3", // C D Em
  C: "[[d2,d3,f#3,a3]@4 ~@2 [c2,c3,e3,g3]@15 ~@3 g3@2 ~@2 g3@2 ~@2 [d2,d3,f#3]@5 ~ g3@14 e3@2 g3 ~@5 g3@2 a3@2, ~@6 b2 ~@17 g2@8 ~@6 [c2,c3]@17 ~ [g2,b3]@8, ~@24 b3@6 a3@7 ~@27, ~@24 d3 ~ d3@5 ~@7 e3@12 ~@14]/4", // D C D C G
  D: "[[d2,d3,f#3,a3]@6 [c2,c3,e3,g3]@17 ~ g3@2 ~@2 g3@2 a3@2, ~@3 g2, ~@12 b3@3 ~, ~@24 d3 ~ d3@4 ~@2]/2", // D C
  E: "[[d2,f#3]@6 [e3,g3]@12 ~@2 e3@2 g3 ~ g3@2 ~@2 g3@2 a3 ~, [d3,a3]@2 ~ c2@9 g2@4, ~@6 c3@10 ~@2 d3@4 ~ d3@2 ~ d3@4 ~@2, ~@12 b3@3 ~]/2", // D Em D5
  F: "[d2,f#3]@6 [c2,c3,e3,g3]@9 ~, [d3,a3] ~@3", // D C D5
  G: "[c2,g3]@4 [d2,d3,f#3,a3]@3 ~ [a2,e3,a3,c4]@5 ~ [a2,a3,c4]@2, c3 ~@7, e3 ~@13 e3 ~", // C5 D Am
  H: "[g2,d3,b3]@3 [g2,d3,g3] [d3,f#3,a3]@3 [f#3,a3], g3@4 ~@2 f2 ~ d2@5 ~ d2 ~", // G G5 D F#m
  I: "[d3,f#3,a3]@3 ~ [d3,g3,b3]@2 g2 ~ [a2,e3,a3,c4]@5 ~ [a2,a3]@2, d2@4 ~@10 [e3,c4] ~", // D G Am A C
  J: "[g2,d3,g3,b3]@5 ~ [d3,g3,b3] ~ [d3,f#3,a3]@6 d2 ~, ~@6 g2@2 d2@5 ~@3", // G D
  K: "[d2,d3,f#3,a3]@4 [g2,d3,g3,b3]@4 [a2,e3,a3,c4]@5 ~ [a2,e3,a3,c4]@2", // D G Am
  L: "[g2,d3,g3]@5 ~ [d3,g3] ~ d2@6 d2@2, b3 ~, e3@3 ~@3 g2@2 [d3,f#3,a3]@8", // G5 D
  M: "[[d3,a3]@4 [a3,d4,f#4]@3 ~ [b3,d4,g4]@4 ~@4 [d3,g3,b3]@3 ~ [d3,g3,b3]@2 g2 ~ [d#3,g3,b3]@6 [d#3,b3]@6 ~@4 [g2,e3,g3,c4]@2 [g2,d3,g3,b3]@13 ~ [e3,c4] ~ [d3,b3]@4 [g2,g3,c4]@2, [d2,f#3]@7 ~@7 g2@7 ~@3 g2@16 ~@16 [g2,g3]@6 e3 ~]/4", // D5 D G D#aug G#m C G C …
  N: "[d3,g3,b3]@3 ~ [d3,g3,b3]@3 ~ [d3,b3]@2 [d3,f#3,a3]@4 d2 ~, g2@4 ~@4 d2@5 ~@3, ~@8 g3 ~@7", // G D
  O: "[d2@4 ~@2 d2 ~ d#2 ~ [d3,f#3,a3]@2 ~@2 d#2@2 ~@2 c4@2 b3 ~ g3 ~ [d#2,d3,f#3,a3] ~ g2@4 ~@2 g2@6 ~@2 [d3,g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [d3,g3,b3] g2, [f#3,a3]@9 d#2@5 ~@2 d#2@7 ~@17 g2@6 ~@2, ~@12 b3@6 ~@8 [d3,g3,b3]@13 ~@3 d3 ~ d3 ~@3]/3", // D G F#m G
  P: "[[e3,c4] ~ [e3,a3,c4] ~ [g3,b3,d4] ~@4 d4 c4 ~@3 c3 ~ c3@4 ~@2 c3@2 [a3,c4,e4]@2 [a3,e4] ~ [a3,e4] ~ [a3,c4,e4] a2, a2@4 b2@2 ~@2 c3@4 [c4,e4]@7 ~@7 c4@2 c4@2 ~@2, a3@2 ~@4 [g3,c4,e4]@4 ~ g3@8 ~ [g3,c4,e4]@4 a2@6 ~@2]/2", // C Am G Am A5 Am C
  Q: "[d4@2 a3 ~ a3 ~ [c4,e4,a4]@4 d4@3 e4 ~@4 b3@4 b3 ~ [g3,a3,c4,e4] ~ [f3,g3,a3,b3,c4,d4] ~ [g2,g3,b3] ~ [g2,g3,b3,d4]!2, f#4@6 d4 ~@3 g4@4 d4@8 ~@6 d4@2 ~@2, a3 ~@9 b3@7 ~@15]/2", // Am Am7 Dm7 G
  R: "[a2,a3,c4,e4] ~ [g2,g3,b3,d4] ~ [a2,c4,e4] [g2,g3] [b3,g4]@3 e4 [b3,d4]@4 ~@2, ~@6 d4@2 ~@2 g4 ~@5", // Am G Am G Em Bm
  S: "[~@8 [e3,a3,c4]@2 [e3,a3,c4] [a3,c4]@3 ~@2 b3@2 g3@2 a3@2 g3@2 [d3,g3]@2 ~@2 g3@2 a3@2, ~@2 a2@3 ~ g2@2, ~@11 e3@6 ~@9 d3@4 ~@2, ~@14 d4@4 ~@6 b3@5 ~@3]/2", // Am G5
  T: "[[d2,f#3,a3]@5 ~ [c3,e3,g3]@12 ~@2 e3@2 g3 ~ g3@2 ~@2 g3@2 a3@2, d3@3 ~@3 c2@17 ~ g2@8, ~@18 d3@4 ~ d3@2 ~ d3@4 ~@2, ~@6 b3 ~]/2", // D C
  U: "[[d2,f#3,a3]@5 ~ [c2,c3,e3,g3]@16 ~@2 g3@2 ~@2 g3@2 a3@2, d3@3 ~@21 g2@8, ~@24 b3@5 ~@3, ~@24 d3 ~ d3@4 ~@2]/2", // D C
  V: "[[d3,f#3,a3]@4 ~@2 g3@12 e3@2 g3@2 e3 ~ g3@2 ~@2 g3@2 a3@2, d2@6 c2@17 ~ d3 ~ d3@4 ~@2, ~@6 c3@15 ~@3 g2@8, ~@6 e3@9 ~@9 b3@6 ~@2]/2", // D
  W: "[d2,d3,f#3,a3]@5 ~ [c2,c3,e3,g3]@9 ~", // D C
  X: "[c2,c3,e3,g3]@4 [d2,d3,f#3,a3]@4 [d3,f#3] ~ e3 ~ g3@2 a3@2, ~@4 c3 ~@3 g2@8, ~@2 b3 ~, ~@8 g3@2 d3@5 ~", // C D
  Y: "[[d3,f#3,a3]@4 ~@2 e3@10 ~@2 e3@4 ~@2 d3 ~@3 g3@2 a3@2, ~@3 [c2,c3]@8 ~ g2@4, ~@3 g3@7 ~@2 b3@2 ~@2, ~@13 d3@2 ~]/2", // D C
  Z: "[d2,d3,f#3,a3]@5 ~ [c2,e3,g3]@9 ~, ~@3 c3@2 ~@3", // D C
  AA: "[c2,c3,e3,g3]@3 ~ [d2,d3,f#3,a3]@3 ~ [a2,e3,a3,c4]@5 ~ [a2,a3,c4]@2, ~@14 e3 ~", // C D Am
  AB: "[g2,d3,g3]@5 ~ [g2,g3]@2 d2@5 ~ d2@2, b3@4 d3 ~@3, e3 ~@5 d3 ~ [f#3,a3]@8", // G5 G F#m
  AC: "[d2,d3] ~ d2@2 [g2,d3,g3,b3]@4 [a2,e3,a3]@6 [a2,e3,a3]@2, f#3@2 ~@6 c4@4 ~@2 c4 ~, ~@8 d3 ~@7", // D G A5
  AD: "[[g2,d3,g3,b3]@6 [g2,d3,g3,b3]@2 d2@7 ~ d2@2 ~@2 d2@2 [g2,g3,b3]@2 [a2,e3,a3,c4]@5 ~ [a2,a3]@2, ~@8 [d3,f#3,a3]@10 [d3,f#3,a3]@4 d3 ~@7 [e3,c4] ~]/2", // G Am A D C
  AE: "[g2,d3,g3,b3]@5 ~ [g2,d3,b3]@2 d2@5 ~ d2 ~, ~@6 g3 ~ [d3,f#3,a3]@8", // G D
  AF: "[[d3,f#3,a3]@6 b3@2 g2 ~@7 g2@4 [d3,g3,b3]@2 g2 ~ g2@6 g2@2, d2@3 ~@5 [d3,g3,b3]@6 [d3,g3,b3]@5 ~@13, ~@3 g2 ~@4]/2", // D G
  AG: "[~@4 d#3 ~@2 g2 [e3,g3,c4] ~ [d3,g3,b3]@13 ~ [e3,g3,c4]@2 ~@2 g2@2 [g2,g3,c4]@2, ~@8 g2@2 g2@5 ~@9 g2@4 ~@4, ~@26 [d3,g3,b3]@4 e3 ~]/2", // C G C C5 G
  AH: "[[d3,g3,b3]@3 ~ [d3,g3,b3]@2 g2@2 [d3,g3,b3]@2 ~@4 d2 ~ d2@4 ~@2 d2 ~ d#2@4 [d3,a3]@2 d#2 ~, g2@4 ~@4 d2@5 ~@3 e2 ~@15, ~@10 [d3,f#3,a3]@9 ~ [d3,f#3,a3]@7 ~ f#3 ~@3]/2", // G D5 D
  AI: "[d#2@6 a3 g3 [d#2,d3,g3,a3] ~ g2@3 ~ g2 ~ g2@6 ~@2 [d3,g3,b3]@2 [g3,b3]@2 [d3,g3] ~ [d3,g3] g2, c4@3 ~@7 [d3,g3,b3]@12 ~@2 g2@6 ~@2, ~@26 d3 ~ b3@2 b3@2]/2", // D#maj7 G G5 G
  AJ: "[[e3,c4] ~ [e3,a3,c4] ~ [g3,b3,d4] ~ [g3,c4,e4]@2 ~ [g3,d4] c4 ~@5 c3@6 c3@2 [a3,e4]@2 [a3,e4] ~ [a3,c4,e4] ~ [a3,c4,e4] a2, a2@4 b2@2 ~@2 c3@6 ~@10 a2 ~ a2@4 ~@2, a3 ~@5 [g3,c4,e4]@6 c4@2 ~@2]/2", // C Am G C G5 A5 Am C
  AK: "[[a3,d4] ~ d4 ~ d4 ~ [c4,e4,a4]@4 [b3,d4]@3 e4 b3@3 ~ b3@3 ~ g3@2 [g2,b3,d4]@2 [g2,g3,b3] ~ [g2,b3,d4]@2 [g2,b3,d4] [g2,d4], a2@6 ~@8 d4@8 ~@2 g3 ~@3 g3 ~@3, f#4 ~@4 g4@6 ~@2 d4 ~@2]/2", // D5 Am Bm G G5
  AL: "[a2,a3,c4,e4] ~ [g2,g3,c4] ~ [a2,c4] [g2,g3,e4] f#4@2 ~@8, ~@6 a3 ~@9", // Am C5 Am C
  AM: "~@8 [e3,a3,c4]@2 [e3,a3,c4] [e3,a3,c4]@3 d4 ~", // Am
  AN: "[[d3,g3,b3] ~ e4 ~ g3 ~ a3 ~ [e4,a4]@4 g4 ~ [c4,e4] ~ [c4,e4] ~ [c4,e4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [a#3,d4] ~ [a#3,d4] ~ [a#3,d4] ~ [a#3,d4] ~, ~@8 c4@3 ~@3 g4@6 ~@4 g4@2 ~@4 g4@2, ~@8 b3 ~@23]/2", // G A5 C A#
  AO: "[a#3,d4] ~ [a#3,d4] ~ [a#3,d4,g4] ~ d4 ~ [a3,c4] ~ [a3,c4] ~ a3 ~ [a3,c4,e4] ~, ~@8 g4@5 ~@3", // A# Gm Am
  AP: "[a3,c4,e4] ~ a3 ~ [a3,c4,e4] ~ [a3,c4,e4] a#3 [f#3,a3,d4]@2 [a3,d4] ~ [f#3,a3,d4] ~ [f#3,a3,d4] ~, ~@8 d#4 ~@7", // Am D D5 D
  AQ: "[f#3,a3,d4] ~ a3 ~ [f#3,a3,d4] ~ [f#3,a3,d4] ~ [a3,c4,e4]@2 [c4,e4] ~ [a3,c4] ~ [a3,c4,e4] ~", // D Am C Am
  AR: "[a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [c4,e4,g4,a4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~", // Am Am7 C
  AS: "[[c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [d4,g4,b4] ~@5 g3 ~ g3@6 ~ g2 [a2,a3,e4,c5] ~ [g2,g3,d4,g4,b4]@2 [g2,g3]@2 [e4,c5] ~, ~@5 [d4,g4,b4]@7 a4 ~@2 a4]/2", // C G Am G C G
  AT: "[[d4,g4,b4]@3 ~ [d4,g4,b4]@2 [g2,g3] ~ [g4,b4]@2 ~@4 [d2,d3] ~ [d2,d3]@4 ~@2 [d2,d3] ~ [d#2,d#3]@4 [d4,a4]@2 b4@2 c5@2 b4 a4@3 g4 ~ [d4,f#4] ~ [g2,g3]@2 ~@2 [g2,g3] ~ [g2,g3]@4 [d4,g4]@2 [g2,g3] ~ [d4,g4,a4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4] [g2,g3], g3@4 ~@4 d3@5 ~@19 [d#2,d#3]@7 ~@17 [g2,g3]@6 ~@2, g2 ~@7 d4 ~ [d4,f#4,a4]@9 ~ [d4,f#4,a4]@7 ~ b4 ~ d4@5 ~@5 a4@2 [d4,g4,b4]@9 ~@13]/4", // G D D# D5 D G G5 G …
  AU: "[[e4,a4,c5] ~ [e4,a4,c5] ~ [g4,b4,d5] ~ [a4,c5,e5,f5] ~ b3 [g4,d5] c5 g4 ~@3 [c3,c4] [c3,c4]@4 [g4,c5,e5]@2 [c3,c4] ~ [a2,a3,c5]@4 [e4,a4,c5]@2 [a2,a3] ~, [a2,a3] ~ [b2,b3] d5 [c3,c4]@3 ~@9, ~@12 [g4,c5,e5]@6 ~@6 [e4,a4]@3 ~@5]/2", // Am G Fmaj7 G5 C Am A B …
  AV: "[e4,a4,c5]@2 ~@2 f#5@2 [a2,a3] ~ g5@5 ~ [b4,d5]@2, [a2,a3]@4 ~@4 d5@3 ~@5", // Am A Bm A
  AW: "[b2,b3]@2 [b4,c5]@4 [b2,b3] ~ [g4,b4] ~ c5 ~ a4 ~ [e4,g4,b4] ~, ~@4 g2@3 ~", // B Cmaj7 B G Em
  AX: "[a4,c5,e5] ~ [a4,d5] ~ [a4,c5,e5] c5 [b4,d5,g5]@2 ~@8", // Am D5 Am G
  AY: "[~@6 g4@2 [d4,g4,b4]@2 c5 c5@2 ~ d5@2 b4@2 g4@2 a4@2 g4 ~@4 c4@3 d4@2, ~ g2@2 ~]/2", // G
  AZ: "e4@3 ~@3 g3 ~ g3@2 ~@2 g3@2 a3@2, ~ g2, ~@2 b3 ~, ~@8 d3 ~ d3@4 ~@2",
  BA: "[[d2,f#3]@4 ~@2 [c2,g3]@14 e3@2 g3 ~ g3@2 ~@2 g3@3 ~, ~@6 e3@12 ~@5 d3@2 ~ d3@5 ~, ~@6 c3@9 ~@9 g2@8, ~@6 b3 ~]/2", // D C5
  BB: "[[d2,d3,f#3,a3]@5 ~ [c2,e3,g3]@20 ~@5 [d3,g3,b3]@8 ~@9, ~@6 c3@18 ~@7 g2@6 ~@11]/3", // D C G
})).s("gm_piano").gain(0.56)

// chords · piano · soft notes
const piano_soft = note(`<
  A B C ~@7 D ~@5 E F ~@8 G H I ~@4 J ~@11 K L ~@3 M N ~@2 O P@2 Q ~@4 R ~@2 S T ~ U V W X Y ~@2 Z AA ~@2 AB ~@2 AC AD
  ~@2 AE AF AG AH ~@3
>`.pickRestart({
  A: "~@8 [d3,g3]@3 ~@5", B: "[d3,f#3]@5 ~@11", C: "c3 ~@7", D: "~@8 [d3,g3]@3 ~ d3 ~@3", E: "~ d2@2 ~@13",
  F: "~@3 b3 ~@4", G: "~@3 g2 ~@4", H: "d3@5 ~@3", I: "~@5 a3 ~@8 g2 ~", J: "~@9 e4 ~@6", K: "d2@3 ~@5",
  L: "~@3 g3@2 ~@3", M: "a3 ~@3", N: "~@6 b2 ~@9", O: "~@4 d2@3 ~@9",
  P: "[~@10 d#3@2 d#3@2 ~@2 g2@5 ~@11, ~@8 [g3,b3]@11 ~@13, ~@14 d#3@5 ~@13]/2", Q: "g2@7 ~@9", R: "~@11 g3 ~@4",
  S: "~@14 g3 ~", T: "~@4 e4 ~@11", U: "~@12 c4 ~@3", V: "~@12 g4 ~@3", W: "~@6 [a#3,g4] ~@5 c4 ~@3",
  X: "~@2 [c4,e4] ~@7 f#3 ~@5", Y: "~@2 [f#3,d4] ~@7 a3 ~ e4 ~@3", Z: "~@4 g2@2 ~ g3 ~@8", AA: "~@3 g2 ~@12",
  AB: "~@2 b4 ~@5", AC: "~@8 b4@2 ~@2 e5@2 g5 ~, ~@10 [b2,b3]@5 ~", AD: "~@10 g3@2 c5 ~@3", AE: "~@8 c4 ~ c4 ~@5",
  AF: "c4 ~@2 g3 [g3,e4] ~@11", AG: "[d3,a3] ~@3", AH: "~@14 a3 ~",
})).s("gm_piano").gain(0.24)

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

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@24 A ~@8 B ~@2 B ~@2 C ~@8 B ~@3 B ~@3 B ~@5 B ~@4 D E ~@3 A B F ~@2 G ~ C@4 A@3 H ~@3 C ~@2
>`.pickRestart({
  A: "~@5 x ~@10", B: "~ x ~@2", C: "~@3 x ~@4", D: "~@3 x", E: "x!3 ~@5", F: "~@3 x!2 ~@3", G: "~@5 x ~@2", H: "~ x",
})).gain(0.46)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@12 A ~@2 B ~@39 C ~@12 D ~@24>".pickRestart({
  A: "~ x ~@2", B: "~@5 x ~@2", C: "~ x", D: "~@3 x ~@4",
})).gain(0.2)

stack(fretless_bass, piano, piano_soft, kick, snare, hihat, open_hat, open_hat_soft)

More by Boyz II Men