Strudelify
New York State of Mind cover art

1976 · Turnstiles

New York State of Mind

Billy Joel

KeyB♭ majorTempo60 bpm
0:00/0:00
// New York State of Mind — Billy Joel
// 60 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: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 84 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/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 · "NYSTATE"
const bass = note(`<
  ~@18 A B C D E F G H I A J K L M N O P Q R S C T U F G H I V W C D X Y G H I Z J K AA M AB AC AD AE AF AG C D E F G H
  I Z B G AH AI@2 AJ@3 AK@3
>`.pickRestart({
  A: "g2@3 c2@4 ~", B: "g2@3 f2@3 f2@2", C: "bb1 d2", D: "g2 f2", E: "eb2 g2", F: "c2@2 ab2!2", G: "bb2 a2 g2 f2",
  H: "eb2 d2 c2@2", I: "eb2 f2", J: "g2@3 f2@5", K: "g2 c2", L: "f2 f1", M: "f2 bb1", N: "eb2@4 eb2 d2 c2 bb1",
  O: "a1 d2", P: "g1 g2", Q: "g1@2 c2!2", R: "f2@2 f2@2 f2!2 c2!2", S: "c2@4 c2@3 f2", T: "g1 f2",
  U: "eb2@2 eb2 d2 g2@4", V: "~ g2@17 c2@30", W: "g2@3 f2@3 f2!2", X: "eb2@4 g2@3 g2", Y: "c2@2 ab2 a2", Z: "g2@3 c2@5",
  AA: "f2!2", AB: "eb2@2 eb2 g2", AC: "a2 d2", AD: "g2!2", AE: "g1@2 g2 c2", AF: "f2@5 f2!3", AG: "c2@5 f2!3",
  AH: "eb2 d2 g2@2", AI: "[eb2@24 f2@67 ~@5]/2", AJ: "[~@2 bb1@32 d2@25 g2@24 ab2@25 db2@12 ~ gb2@12 c2@11]/3",
  AK: "[~@2 b1@12 bb1@87 ~@43]/3",
})).s("gm_fretless_bass").gain(0.4)

// chords · piano
const piano = note(`<
  A B@3 C@2 D@2 E@3 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@2 AG AH AI AJ AK@2 AL@3 AM AN R AO@2 AP
  AQ AR AS AT AU AV AB AC AW AX AY@2 AZ BA R BB K BC BD BE S BF BG@8
>`.pickRestart({
  A: "[g3,d4]@3 [g3,bb3,d4]@3 [g3,bb3,d4]@6 [f3,g3,bb3,d4]@6 ~@27 bb3@2 ~, [g2,a3]@18 [c2,c3,e3,g3,bb3]@29 ~, ~@33 d4@6 bb4@8 ~, ~@36 [ab4,a4,d5]@11 ~, ~@42 d4@5 ~", // G5 Gm Gm7 Gsus2 C7 D
  B: "[[g3,d4]@3 [g3,bb3,d4]@3 [g3,bb3,d4]@6 [g3,bb3,d4]@6 f3@13 f3@2 ~@3 bb3@2 bb3@6 ~@4 e3 eb3 ~@10 d5@5 ~@4 c5@2 ~@4 d5@3 ~@10 c5@4 bb4@3 ~@4 d5@3 ~@15 bb4@2 ~ bb4 ~@2 bb4@3 ~@6 ab3@6 [ab3,c4]@5 ~, [g2,a3]@18 [a3,c4]@29 f3@2 ~ d3@22 [d3,c5]@11 ~@25 [f3,bb3,d4]@11 ab3@13 [bb2,d3,bb3,d4]@11 ~, ~@18 f2@17 g3@3 [f2,eb3,g3]@11 bb1@22 ~@13 [d2,gb3,a3,c4]@10 ~@2 [g2,c5]@11 ~@12 f2@24 ~, ~@34 f3@10 bb3@5 ~@11 [f3,bb3,d4]@11 bb4@2 ~@22 b4@11 ~@8 c5@6 c5@23 ~, ~@65 d5@7 ~@6 d5@16 ~@8 d5@18 ~@6 bb4@17 ~]/3", // G5 Gm Ab Gsus2 Am D7 Bb Cm …
  C: "[[eb2,bb2,eb3,g3,bb3]@9 ~@2 g5 ~ g5@8 ~@5 g5@3 ~@6 [d3,f3,g3,b3]@10 ~@6 eb5@2 eb5@7 [eb3,g3,bb3]@11 [eb3,bb3] [ab2,eb3,gb3,bb3]@12 [eb3,c4] [eb3,c4]@11, ~@9 f5@2 ~@10 f5@2 g2@6 g5@17 eb5@2 f5@7 ~@41, ~@10 [eb3,g3,bb3]@12 eb5@9 ~@15 c3@9 ~@29 [ab2,gb3]@12, ~@24 f5@7 ~@14 f5@2 e5@8 ~@41]/2", // Eb G7 Eb Eb5 Ebm Cm Eb Ab7
  D: "[~@24 g4 [d4,g4]@4 ~ g4@7 ~@8 g4@2 f4@2 bb3@7 [bb3,bb4]@5 f3 ~@2 bb4@6 bb4@3 ~@21 bb3@2, [bb2,f3,bb3,d4]@13 gb3@9 c5@2 g2@13 [f2,f3,bb3,d4]@11 ~ [eb2,g3,eb4,g4]@12 [d2,bb3,c5]@13 ~@14 bb4@8, ~@8 f4@6 [a2,c4,f4]@9 bb4@2 c5@12 ~@49 [a4,d5]@10, ~@10 d5@5 ~@6 d5@4 g3@2 ~@2 [d4,bb4]@8 ~@46 d4@8 d4@5, ~@25 [f3,a4] ~@12 a3@11 ~@24 [c2,c3,e3,bb3]@23]/2", // G5 Bb Eb Gm F D5 Gm F …
  E: "[~@22 g4@2 [eb4,c5]@4 ~@16 g4@3 [g2,g3,bb3,d4,g4]@19 ~@26 bb3@3 ~ b3 ~@17 f3@13 f3@2 ~@2 [g3,bb3]@2 ~ bb3@5 ~@4 e3, ~ [eb2,g3,bb3,d4,f4]@23 f2@24 ~@18 [c2,c3,e3,g3]@24 d4@5 [g2,f3,g3,bb3]@19 ~@15 f3@10 bb3@5, ~@19 g4@3 ~@6 [eb4,c5]@20 ~@34 d4@3 [a4,d5]@10 a3@2 ~@16 f2@20 [f2,eb3]@9 f3@2, ~@10 bb4@2 ~@6 [eb3,g3,bb3]@6 ~@18 ab4@6 ~@9 [a3,c4]@15, ~@41 bb4@6 [db4,f4] ~@18 bb3@21 bb4@9 ~@38 g3@10]/3", // Cm Gm Ebmaj7 C Gm7 Cm D5 F7 …
  F: "eb3 ~@11 [bb2,f3,bb3,d4]@12 [d3,gb3,a3,c4]@12 [d3,gb3,a3,c4]@12, ~ [bb1,d3]@23 d2@24", // Bb D7 Bb
  G: "[f3,bb3,d4]@12 [f3,bb3,d4]@12 ab3@12 ab3@6 [ab3,c4]@5 ~, g2@24 [f2,eb3]@23 ~, ~@4 c4@3 ~, ~@36 [bb2,d3]@11 ~", // Bb Ab F7 Bb
  H: "[eb3,g3,bb3]@12 [eb3,g3,bb3]@11 ~ [d3,f3,g3,b3]@12 [d3,f3,g3,b3]@12, eb2@23 ~ g2@24", // Eb G7
  I: "[eb3,g3,bb3]!2 [ab2,eb3,gb3] [ab2,eb3,gb3,c4], c3 bb3", // Eb Ab7
  J: "[bb2,f3,bb3,d4]@12 [a2,gb3,c4,f4]@11 ~ [g2,f3,d4,g4]@12 [f2,f3,a3,bb3,d4]@12", // Bb F G7 Bbmaj7
  K: "bb3@12 [d2,f3,bb3]@11 ~@22 bb3@3, [eb2,g3,eb4]@23 ~ [c2,c3,e3,bb3]@24, ~@11 d4@2 bb4@3, ~@3 [a4,d5], ~@7 d4", // Bb Eb C7 D5
  L: "[g2,g3,bb3,d4,f4]@23 ~@13 [eb3,g3,bb3]@12, ~ [f1,f2]", // Gm7 Eb F
  M: "[g2,g3,bb3,d4,g4]@6 ~@9 bb3, ~@3 [c2,c3,e3,g3,bb3]@5, ~@11 d4@2 bb4@3, ~@3 [a4,d5], ~@7 d4", // Gm C7 D5
  N: "[g2,f3,g3,bb3]@18 f3@12 f3@2 ~@3 bb3@2 bb3@5 bb3@4 f3 [eb3,e3], ~@9 [a3,c4]@14 ~, ~@18 f2@16 g3@3 [f2,eb3,g3]@9 ~@2, ~@16 f3@7 ~", // Gm7 Emaj7 Am Cm
  O: "[bb1,d3] [bb2,f3,bb3,d4] [d3,gb3,a3,c4]!2, ~ d2", // Bb D7
  P: "[f3,bb3,d4]@12 [f3,bb3,d4]@11 ~ ab3@12 ab3@6 [ab3,c4]@5 ~, g2@23 ~ [f2,eb3]@23 ~, ~@4 c4@3 ~, ~@36 [bb2,d3]@11 ~", // Bb Ab F7 Bb
  Q: "[eb3,g3,bb3]@12 [eb3,g3,bb3]@11 ~ [d3,f3,g3,b3]@12 [d3,f3,g3,b3]@12, [eb2,bb2]@23 ~ g2@24", // Eb G7 Eb5
  R: "[eb3,g3,bb3]!2 [ab2,eb3,gb3] [ab2,eb3,gb3,c4], [c2,c3] bb3", // Eb Ab7 C
  S: "[bb2,f3,bb3,d4] [a2,gb3,c4,f4] [g2,f3,d4,g4] [f2,f3,a3,bb3,d4]", // Bb F G7 Bbmaj7
  T: "[eb2,g3,bb3,eb4]@12 [d2,f3,bb3]@11 ~@22 [bb3,c4]@3, ~ [c2,c3,e3,bb3], ~@11 d4@2 bb4@3, ~@3 [a4,d5], ~@7 d4", // Eb Bb Bbsus2 C7 D5
  U: "[eb2,g3,bb3,d4,f4]@2 [eb3,g3,bb3]!2, e2@5 ~@43, f2 ~@11 f2@12, [gb2,g2] ~@47", // Ebmaj7 Eb Gmaj7
  V: "[g2,g3,bb3,d4]@6 ~@9 bb3, ~@3 [c2,c3,e3,g3,bb3]@5, ~@11 d4@2 bb4@3, ~@3 [a4,d5], ~@7 d4", // Gm C7 D5
  W: "[g2,f3,g3,bb3]@17 f3@15 f3@2 ~@11 c4@3, ~@17 [f2,a3,c4]@17 [eb3,f3]@3 [d3,gb3]@11, ~@35 g3@3 ~@3 eb4@7, ~@18 bb3 [c4,f4]@5, ~@11 d4", // Gm7 F Ebsus2 D F5
  X: "[f3,bb3,d4]@12 [f3,bb3,d4]@12 [c3,e3,g3]@12 [c3,e3,g3]@11 ~, g2@24 c2@23 ~", // Bb C
  Y: "[c3,f3,a3]@12 [c3,f3,a3]@12 [c3,f3]@12 [c3,f3,g3,c4]@11 ~, f2@47 ~, ~@24 a3@23 ~", // F F5 Csus4
  Z: "[eb3,ab3,c4]!2 [d3,ab3,c4]!2, f2 bb2", // Ab Dm7b5
  AA: "[eb3,g3,bb3]@12 [bb2,eb3,g3,bb3]@12 bb3@6 bb3@6 bb3@6 [g3,bb3]@5 ~, eb2@24 [eb2,eb3,eb4]@23 ~, ~@24 g4@12 [g2,g4,bb4]@11 ~, ~@30 [f4,ab4]@17 ~", // Eb Gm Eb Gm Fm
  AB: "[e3,c4] [e3,g3,a3,c4] [d3,gb3,a3,c4]!2, a2 d2", AC: "[d3,g3,b3]!4, g2",
  AD: "bb3 [d3,f3,g3,bb3] c2!2, [g2,d4,f4] [c3,e3,g3]", // Gm7 G7 C
  AE: "[c4,e4]@4 [f3,a3,c4,e4]@4 ~@5 f4 [e4,f4]@2, f2@5 f2@3, ~ f3, ~@2 [a3,c4,e4] [a3,c4], ~@6 e4 ~", // C Fmaj7 Am
  AF: "[g3 eb3!2 [eb3,g3] ~@6 [f3,bb3,d4]@2 [d3,gb3,a3,c4]@2 [d3,gb3,a3,c4]@2, [c2,c3,eb4]@42 f2@5 e3@2 ~@47, bb3@12 bb3@11 f3 eb3 ~@11 d2@12, ~@6 g3@12 ~@6 [eb3,g3]@6 f2@6 [eb3,g3,c4]@13 ~@47, ~@12 bb2@37 [bb1,d3]@24 ~@23]/2", // Eb Bb D7 Cm Eb Cm Bb
  AG: "[f3,bb3,d4]@12 [f3,bb3,d4]@11 ~@19 [ab3,c4]@5 ~, g2@23 ~ [f2,eb3]@23 ~, ~@4 [ab3,c4]@3 ~, ~@36 [bb2,bb3,d4]@11 ~", // Bb Ab F7 Ab Bb
  AH: "[eb3,g3,bb3]@12 [eb3,g3,bb3]@11 ~ [d3,f3,g3,b3]@12 [d3,f3,g3,b3]@11 ~, [eb2,bb2]@23 ~ g2@23 ~", // Eb G7 Eb5
  AI: "[eb3,g3,bb3]@12 [eb3,g3,bb3]@12 [ab2,eb3,gb3]@12 [ab2,eb3,gb3,c4]@11 ~, [c2,c3]@24 bb3@23 ~", // Eb Ab7 C
  AJ: "[bb2,f3,bb3,d4]@11 ~ [a2,gb3,c4,f4]@11 ~ [g2,f3,d4,g4]@6 ~@6 [f2,f3,a3,bb3,d4]@9 ~@3", // Bb F G7 Bbmaj7
  AK: "[[eb2,eb3,g3,bb3,eb4]@12 [d2,d3,f3,bb3,d4]@12 ~@22 c4@3 ~ eb4 ~@22 bb3@11 [eb3,g3,bb3]@12, ~@12 [c2,g2,c3,e3,bb3]@13 ~@11 f2@12, ~@35 d4@8 d4@6 [eb2,g3,bb3,d4,f4]@24 ~@23, ~@19 [a4,d5]@6 ~@11 [eb3,g3]@6 ~@6, ~@20 bb4@5 ~@23]/2", // Eb Bb Eb C7 Ebmaj7 D5 Eb
  AL: "[~ [g3,bb3,g4]@17 ~@26 bb3@3 ~ bb3@17 f3@13 ~ f3 ~@3 bb3@2 bb3@6 ~@17 [bb2,f3,bb3,d4]@12 [d3,gb3,a3,c4]@12 [d3,gb3,a3,c4]@12, [g2,d4]@18 [c2,c3,e3,g3]@29 [g2,f3,g3]@18 [f2,a3,c4]@20 [f2,eb3,g3]@12 [bb1,d3]@25 ~@22, ~@18 bb3@23 d4@7 ~@32 f3@5 ~@10 [e3,f3]@3 ~@46, ~@33 d4@6 bb4@10 ~@47 eb3@2 ~@22 d2@24, ~@36 [a4,d5]@13 ~@33 g3@3 ~@6 bb3@7 ~@46]/3", // Gm Bb D7 G5 C G7 F Cm …
  AM: "[f3,bb3,d4]@2 [f3,bb3,d4]@2 ab3@2 ~ [gb3,bb3], g2 [f2,eb3,c4], ~@3 [bb2,d3,ab3]", // Bb Gb F7 Bb7
  AN: "[eb3,g3,bb3]@2 [eb3,g3,bb3]@2 [d3,f3,g3,b3]@2 ~ g2, eb2@4 g2@3 ~, f3 ~@35 [d3,f3,g3,b3]@11 ~", // Eb G7
  AO: "[[bb2,f3,bb3,d4]@4 [a2,gb3,c4,f4]@4 [f3,d4]@4 bb3@4 bb3@4 [d2,d3,f3,bb3]@4 ~@7 bb3, ~@2 [g2,g4]@4 ~ [a4,d5], ~@12 [f2,a3,d4]@12 ~@5 bb4@3, ~@12 f3@8 ~@7 d4@3 d4@2, ~@2 [eb2,eb3,g3,eb4] [c2,c3,e3,bb3]]/2", // Bb F Dm Bb G D5 Dm Eb …
  AP: "[eb2,g3,bb3,d4,f4]@2 [eb3,g3,bb3]!2, ~ f2", // Ebmaj7 Eb
  AQ: "[g2,f3,g3,bb3,d4,g4]@6 ~@9 bb3, ~@3 [c2,c3,e3,g3,bb3]@5, ~@11 d4@2 bb4@3, ~@3 [a4,d5], ~@7 d4", // Gm7 C7 D5
  AR: "[g2,f3,g3,bb3]@17 ~ f3@13 f3 ~@3 bb3@2 ~ [bb3,c4] ~@7 c4@2, ~@18 [f2,a3,c4]@19 [d3,gb3]@11, ~@16 f3@3 f4@5, ~@34 g3@4 eb4@2 ~ c4@3 d4@4, ~@7 eb4", // Gm7 Bbsus2 F D
  AS: "[f3,bb3,d4]@12 [d3,f3,bb3,d4]@12 [c3,e3,g3]@12 [c3,e3,g3]@11 ~, g2@24 c2@23 ~", // Bb C
  AT: "[c3,f3,a3]@12 [c3,f3,a3]@12 [c3,f3,a3]@11 ~ [c3,f3,g3,c4]@11 ~, f2@35 ~@13", // F Csus4
  AU: "[eb3,ab3,c4]@12 [eb3,ab3,c4]@12 [d3,ab3,c4]@12 [bb2,d3,ab3,c4]@11 ~, f2 ~", // Ab Dm7b5 Bb7
  AV: "~@12 bb2@11 ~ bb3@6 bb3@6 bb3@6 [g3,bb3]@5 ~, [eb2,eb3,bb3,d4,g4]@23 ~ [eb2,eb4]@23 ~, ~@24 g4@12 [g2,g4,bb4]@11 ~, ~@30 [f4,ab4]@17 ~", // Gm Ebmaj7 Eb Gm Fm
  AW: "[bb3,d4,f4]@2 ~ d3 ~@2 c2@2, g2 [c3,e3,g3,bb3], ~@12 [bb3,d4,f4]@13 ~@23", // Bb C7 Bb
  AX: "[c4,e4]@12 [f3,a3,c4,e4]@12 ~@12 c4@3 ~@3 e4@4 ~@2, f2@15 f2@8 ~, ~@12 f3@11 ~, ~@12 [a3,c4,e4]@6 a3@5 ~, ~@36 e4@3 [c4,f4]@7 ~@2", // C Fmaj7 Am F5
  AY: "[g3@2 eb3@2 eb3@2 [eb3,g3]@2 ~@12 [f3,bb3,c4,d4]@4 [bb3,d4] ~@3 [d3,gb3,a3,c4]@4, [c2,c3,eb4]@42 f2@5 eb3@2 ~@23 f3@12 ~@12, bb3@12 bb3@11 [e3,f3] [bb1,d3]@13 ~@11, ~@6 g3@12 ~@6 [eb3,g3]@6 f2@6 [eb3,g3,c4]@13 ~@47, ~@12 bb2@37 ~@23 d2@24]/2", // Eb Bb D7 Cm Fmaj7 Bb Eb Cm
  AZ: "[f3,bb3,d4]!2 ab3 [bb2,d3,f3,ab3], g2 [f2,eb3,c4]", BA: "[eb3,g3,bb3]!2 [d3,f3,g3,b3]!2, eb2 g2",
  BB: "~@2 [f3,d4] [f2,f3,a3,bb3,d4], bb2, bb3@3 ~, [f3,d4] [g2,g4], ~ [a2,gb3,c4,f4]@3", // Dm Bbmaj7 Dm G F
  BC: "[eb2,g3,bb3,d4,f4]@24 ~ [eb3,g3]@11 [eb3,g3,bb3]@12, ~ f2, ~@25 c4@23", // Ebmaj7 Eb
  BD: "[g2,g3,bb3,d4,g4]@3 ~@4 d4, ~@3 [c2,c3,e3,g3,bb3]@5, ~@11 d4@2 bb4@3, ~@3 [a4,d5]", // Gm C7 D5
  BE: "[g2,f3,g3,bb3]@18 f3@15 ~@2 bb3@2 bb3@6 [bb3,c4]@5, ~@9 [f2,a3,c4]@10 ~@5, ~@33 f3@5 ~@10, ~@34 g3@3 [f2,eb3,g3]@11", // Gm7 Bbsus2 F Cm
  BF: "[eb2,g3,bb3,eb4]@6 [d2,f3,bb3]@6 ~@11 bb3, ~ [c2,g2,c3,e3,bb3], ~@35 d4@8 d4@5, ~@19 [a4,d5]@5, ~@5 bb4", // Eb Bb C7 D5
  BG: "[[eb2,bb2,g3,bb3,d4,f4]@24 [f2,eb3,g3,bb3]@74 [f3,bb3,d4,f4]@15 [f3,bb3,d4,f4]@17 [gb3,c4,f4]@12 [gb3,c4,f4]@12 ~ [f3,bb3,d4,f4]@12 [f3,bb3,d4,f4]@12 [eb3,ab3,c4,eb4]@12 ~ [eb3,ab3,c4,eb4]@12 db4@12 ~ [bb3,db4]@6 [bb3,db4,gb4]@6 ~@6 eb4@7 ~@6 a3@6 [bb1,d3,a3,c4]@84 ~@46, ~@98 [bb1,bb2]@33 ~@48 [ab1,ab2]@25 [db2,f4,bb4]@25 [c2,c3,bb3,c4,f4]@16 ~@139, ~@98 gb2@3 ~@29 [d2,d3]@24 ~ g2@26 ~@36 [gb2,ab4]@13 ~@12 [b1,eb3,db4]@20 ~@122]/8", // Ebmaj7 Eb Bb F Bb Ab Bbm Gb …
})).s("gm_piano").gain(0.36)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@20 A B C D E@2 F@2 G H I J K L M H N O A B C D E@2 F@2 G A B C D E@2 F@2 H@2 I J K L M H N O A B C D E@2 F@2 G P Q
  R@5 S@2 ~
>`.pickRestart({
  A: "d5 gb5", B: "g5 f5", C: "eb5 d5", D: "c5@2 eb5 gb5", E: "[f5 g5 bb5@4 g5@2]/2", F: "[f5@4 bb5@7 g5@5]/2",
  G: "bb5@3 c6@5", H: "bb5", I: "a5@4 a5 bb5 c6 c5", J: "ab5", K: "g5@4 g5 ab5 bb5 bb4", L: "c5 e5 gb5@2",
  M: "b5@4 b5 c6 d6 d5", N: "a5 bb5 c6 c5 a5@4", O: "g5", P: "bb5 a5 g5 f5", Q: "eb5 d5 c5@2",
  R: "[f5@98 bb5@32 a5@25 g5@24 f5@25 f5@25 f5@11]/5", S: "[~@2 f5@12 f5@57 ~@25]/2",
})).s("gm_string_ensemble_1").gain(0.26)

// drums · kick
const kick = s("bd").struct(`<
  ~@18 A B C@3 D C E C F G C@3 D C H I D H C H C H C@2 ~@3 C D H J C E C K L C H M N C D C O D C D C D C@3 P Q E C ~@2 R
  S T ~@3
>`.pickRestart({
  A: "~@11 x ~ x ~@2", B: "x ~@4 x ~@10", C: "x!2", D: "x ~@7 x ~@2 x ~ x ~@2", E: "x ~@7 x ~@6 x",
  F: "x ~@5 x ~@4 x ~ x ~@2", G: "x ~@5 x ~@4 x ~@4", H: "x ~@7 x ~@2 x ~@4", I: "x ~@2 x ~ x ~@2",
  J: "x ~@6 x!2 ~@2 x ~@4", K: "x ~@2 x ~@2 x ~@4 x ~ x ~@2", L: "x ~@2 x ~@2 x ~@3 x ~@5", M: "x ~@6 x!2 ~@7",
  N: "x ~@6 x!2 ~@6 x", O: "x ~@7 x ~@4 x ~ x", P: "x ~@5 x ~@3 x!2 ~ x ~@2", Q: "x ~@2 x ~@2 x ~@4 x ~@4",
  R: "~ x ~@15 x ~@2 x ~@3", S: "~@11 x ~@17 x ~@12 x ~@5", T: "~@6 x ~@12 x ~@11 x ~@11 x ~@4",
})).gain(0.25)

// drums · snare
const snare = s("sd").struct(`<
  ~@18 A B C@5 B C@6 D C@3 D C@2 E C@3 B ~@3 C@5 B C@17 F G E C@2 B ~ A H I J K ~@2
>`.pickRestart({
  A: "~@3 x", B: "~ x ~@2", C: "~ x ~ x", D: "~@2 x ~@3 x!2", E: "~@4 x ~@7 x ~@2 x", F: "~@2 x ~@4 x",
  G: "~@5 x!2 ~@5 x ~@3", H: "~@17 x ~@28 x ~", I: "~@23 x ~@11 x ~@12", J: "x ~@11 x ~@12 x ~@11 x ~@10",
  K: "~ x ~@22",
})).gain(0.25)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@35 A ~@2 B C D E F ~@6 E D G H ~@3 I J K L M ~@4 N O P ~@3 C Q ~@11
>`.pickRestart({
  A: "~ x ~ x ~@4", B: "~@3 x ~ x ~ x", C: "~@3 x ~@4", D: "~@7 x", E: "~@4 x ~@2 x", F: "x ~@2 x ~@3 x",
  G: "~@6 x ~@4 x ~@2 x ~", H: "x", I: "~@4 x!4", J: "x ~@2 x!3 ~ x", K: "~ x!5 ~ x", L: "~ x ~@5 x",
  M: "~ x!2 ~@2 x ~ x", N: "~ x ~ x!2 ~@3", O: "x!2 ~ x ~@4", P: "~ x ~@6", Q: "~ x!2 ~@5",
})).gain(0.03)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@35 A B C ~ C D@3 ~@6 C D A ~@5 C ~ C ~@24>".pickRestart({
  A: "~@7 x ~@8", B: "~@9 x ~@3 x ~@2", C: "~@15 x", D: "~@7 x ~@7 x",
})).gain(0.06)

// drums · crash
const crash = s("cr").struct("<~@19 A ~@7 A B ~@16 C D C ~@6 A@2 ~@16 C A E F ~@2 G H I J ~@2>".pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@16 x ~@30", C: "x", D: "~@17 x ~@30", E: "~ x ~ x", F: "x!3 ~",
  G: "~@2 x ~@14 x ~@16 x ~@11 x ~", H: "~@11 x ~@11 x ~@11 x ~@12", I: "~@12 x ~@12 x ~@10 x ~@6 x ~@4",
  J: "~ x ~@6 x ~@5 x ~@33",
})).gain(0.22)

// drums · ride
const ride = s("rd").struct("<~@18 A ~@24 B C D E ~@6 F ~ G ~@7 H ~@5 I J K L ~@4 M N O P Q ~@2>".pickRestart({
  A: "x ~@2 x ~@4", B: "~@11 x", C: "~ x ~@17 x!2 ~ x ~ x ~@23", D: "x ~@17 x ~@23 x ~@2 x ~ x",
  E: "x ~@16 x ~@25 x ~@2 x ~", F: "~@17 x ~ x ~ x ~@2 x ~@23", G: "~@3 x", H: "~@10 x ~ x ~ x!2", I: "~@2 x!2",
  J: "x!3 ~", K: "x ~ x!2", L: "~@3 x ~@4", M: "~@43 x ~@3 x", N: "~@25 x ~@14 x ~@7",
  O: "~@4 x ~@12 x ~@11 x ~@12 x ~@5", P: "x ~@5 x ~@5 x ~@24 x ~@10", Q: "~ x ~@2 x ~@19",
})).gain(0.18)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@43 [~@23 x] ~@19 [~@13 x ~@2] ~@12 [~ x ~@21 x ~@24] ~@7>").gain(0.12)

stack(bass, piano, string_ensemble_1, kick, snare, hihat, hihat_soft, open_hat, open_hat_soft, crash, ride, ride_soft)

More by Billy Joel