Strudelify

Harbor Lights

Bruce Hornsby

KeyF majorTempo102 bpm
0:00/0:00
// Harbor Lights — Bruce Hornsby
// 102 bpm, 4/4, key F 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 (3/4 at bar 1, 4/4 at bar 24) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 152 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(102/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 · "Piano RH"
const piano = note(`<
  A@2 B@2 C@2 D E F G@3 H I J K L M@2 N@2 O@2 P Q@3 R Q@3 R ~@3 S ~@4 T U V W T U X@2 ~@7 Y Q@3 R ~@3 S ~@4 T U V W T U
  X@2 ~@7 Y Q@3 R Z AA Z AB Z AA Z AB AC AA Z AB Z AA Z AB T U V W T AD X@2 ~@8 Z AA Z AB Z AA Z AB AE AF AE AG AE AF AE
  AG Z AA Z AB Z AA Z AB AH@8
>`.pickRestart({
  A: "[~@15 [f4,c5,f5]@2 ~ [g4,c5,g5]@2 ~@2 [bb4,eb5,bb5]@2 ~ [bb4,eb5]@4 eb4@2 ~, ~@25 eb4@2 ~@5]/2", // F5 C5 Eb5
  B: "[~ [c4,f4,c5]@2 ~ [eb4,bb4]@4 bb3@2 ~ [g3,g4]@2 ~@2 [bb3,eb4]@5 ~@3 c5 eb5 [f4,c5,f5]@2 ~@2 [g4,c5,g5]@2 ~, ~@2 bb3 ~@13]/2", // F5 Eb5 G Eb5 F5 C5
  C: "[[bb4,eb5,bb5]@2 ~@2 eb4@2 ~ eb4@2 ~@2 f5 bb4 ~ [eb4,bb4]@4 [bb3,g4]@2 ~ [bb3,eb4]@2 ~@2 c4@5 ~@2, ~@4 [bb4,eb5]@5 ~@2 [f4,c5]@2 ~@19]/2", // Eb5 Eb Eb5 F5
  D: "~ eb5 g5 ~ [f5,c6]@4 c5@3 ~ [bb4,eb5,bb5]@3 ~, ~@4 c5@3 ~@9", // F5 Eb5
  E: "g4@3 g4@4 c5 ~ eb5 ~ f5 ~ g5 ~ f5, [bb4,g5]@5 ~@6 [g4,ab4]@5", // Eb Abmaj7
  F: "~ eb5 ~ c5 ~ eb5 ~ bb4@4 f4@4 c5, ~@7 f4@3 ~@6",
  G: "[~ eb5 [f4,c5,f5]@2 ~@2 [g4,c5,g5]@2 ~ [bb4,eb5,bb5]@2 ~@2 eb4@2 ~ eb4@2 ~@2 [c4,f4,c5]@2 ~@5 [bb3,g4]@2 ~@2 [g3,eb4]@2 ~ [bb3,f4]@5 ~@2 g5 ~ bb5 ~ [c5,f5,c6]@2 ~, ~@13 [bb4,eb5]@5 ~@6 [eb4,bb4]@5 ~@19]/3", // F5 C5 Eb5 F5 Eb Cm Bb5 F5 …
  H: "[c5,eb5,bb5]@2 ~@2 [c5,g5] f5 ~ [c5,f5]@2 ~@2 c5@2 ~ c5 ~", // Cm7 C5 F5
  I: "eb5 ~ [bb4,f5] [g4,eb5] ~ f5 ~ eb5 ~ bb4 ~ eb5 [f4,g4]@2 ~@2, ~@5 f4@5 ~@2 eb5@4", // Bb5 Cm Fsus2
  J: "[f4,g4]@2 ~ g5 ~ bb5 ~ [c5,f5,c6]@4 ~ [bb4,bb5] ~ [bb4,g5] ~", // Fsus2 F5 Bb Eb
  K: "bb5 [bb4,eb5,g5]@2 ~@2 [g4,bb4,eb5]@2 ~ f4 ~ bb4 ~ g4 ~ bb4 f4, ~@3 eb5", // Eb
  L: "~ f4 ~ [g4,eb5]@2 ~ [bb3,eb4,g4]@2 ~@2 [g3,ab3,bb3,eb4]@2 ~@2 g5 bb5", // Cm Eb
  M: "[~ [c5,f5,c6]@4 ~ [c5,bb5] ~ [bb4,g5] ~ bb5 ~ bb4@3 eb5@2 ~@2 c5 [c4,eb5] ~ f5 ~ g5 ~ f5 eb5 ~ c5 [c5,eb5] g4, ~@12 g5@2 ~@3 ab4@4 ~ ab4@5 ~@5]/2", // F5 C7 Eb Cm
  N: "[~ [g4,bb4]@2 ~ eb5@2 ~@2 [ab4,bb4] [g4,ab4,eb5] ~ [f4,c5,f5]@2 ~@2 [g4,c5,g5]@2 ~ [bb4,eb5,bb5]@2 ~@2 eb4@2 ~ eb4@2 ~@2 [c4,f4,c5]@2 ~, ~@22 [bb4,eb5]@5 ~@5]/2", // Gm Absus2 Abmaj7 F5 C5 Eb5 F5 Eb5
  O: "[[eb4,bb4]@4 [bb3,g4]@2 ~ [g3,eb4]@2 ~@2 [bb3,c4,f4]@7 ~@14, bb3 ~@15]/2", // Eb5 Eb Cm Bbsus2
  P: "~@5 g4 c5 f5 eb5 bb4 f4 c5 g4 d4 c4 g4",
  Q: "[[c4,f4]@4 ~@2 [c4,g4]!6 [d4,g4] ~ [c4,f4]@5 ~@3 [a3,c4,g4]!6 [g3,bb3,f4] ~ [a3,c4,f4]@5 ~@3 [a3,c4,g4]!6 [g3,bb3,eb4]@4]/3", // F5 C5 G5 F5 Am7 Gm7 F Am7 …
  R: "~@2 [g3,bb3,eb4]@2 ~ [bb3,d4]@2 ~ [g3,bb3,eb4]@3 ~ [bb3,d4]@3 ~", S: "~@10 [bb3,eb4,f4]@2 ~ [bb3,d4,f4]@2 ~",
  T: "~@2 f4@2 ~ bb4@2 ~ eb5@3 ~ bb4 ~ f4 ~, c4@5 ~@11", U: "d5 ~ bb4@3 ~ c5@4 ~@6",
  V: "~@2 f4@2 ~ bb4@2 ~ eb5@3 ~@5, c4@5 ~@11", W: "g5 ~ eb5@3 ~ f5@3 ~ ab4 g4 f4@3 ~",
  X: "[[c4,e4,g4]@3 [c4,f4,a4]@6 [c4,f4,bb4]@3 [f4,a4,c5]@4]/2", Y: "~@7 [bb3,d4]",
  Z: "~@2 [f4,bb4,d5,f5]@3 ~ [g4,bb4,eb5,f5] ~ [f4,d5,f5]@3 ~ [eb4,g4,bb4,eb5]@3 ~", // Bb Eb Dm Eb
  AA: "[bb3,eb4,f4,bb4]@2 ~ [bb3,d4,eb4,f4]@2 ~ [c4,f4] ~ [bb3,d4,eb4,f4]@3 ~ [bb3,c4,f4]@3 ~", // Bbsus4 Bb F5 Bb Bbsus2
  AB: "[bb3,eb4,f4,bb4]@2 ~ [bb3,d4,eb4,f4]@2 ~ [c4,f4]@10", // Bbsus4 Bb F5
  AC: "[c4,f4] ~ [f4,bb4,d5,f5]@3 ~ [g4,bb4,eb5,f5] ~ [f4,d5,f5]@3 ~ [eb4,g4,bb4,eb5]@3 ~", // F5 Bb Eb Dm Eb
  AD: "d5 ~ bb4@2 f4 ~ c5@4 ~@6", AE: "~@2 [f5,c6,f6]@3 ~ [eb5,bb5,eb6] ~ [c5,g5,c6]@3 ~ [bb4,f5,bb5]@3 ~",
  AF: "[gb4,db5,ab5]@2 ~ [eb4,bb4,f5]@2 ~ [f4,bb4,f5] ~ [f4,bb4,f5]@3 ~ [f4,bb4,f5]@3 ~", // Gbsus2 Ebsus2 Bb5
  AG: "[gb4,db5,ab5]@2 ~ [eb4,bb4,f5]@2 ~ [f4,bb4,f5]@10", // Gbsus2 Ebsus2 Bb5
  AH: "[[f4,c5,f5] ~ [c5,a5,c6] ~ c5 ~ c5 ~ [c5,a5,c6] ~ c5 ~ [c5,a5,c6] ~ c5 f5@2 ~ [c5,a5,c6] ~ c5 ~ c5 ~ [c5,f5,a5] ~ [d5,f5,bb5] [c5,f5,a5] ~ [bb4,d5,g5]@2 ~]/2", // F5 F Bb F Gm
})).s("gm_piano").gain(0.4)

// chords · piano
const piano_2 = note(`<
  A@2 B@2 C D E F G H@3 I J K L M N O P@2 Q@2 R S@3 T S@3 T ~@3 U ~@4 V ~ V ~ V ~@10 W S@3 T ~@3 U ~@4 V ~ V ~ V ~@10 W
  S@3 T X Y X Z X Y X Z AA Y X Z X Y X Z V ~ V ~ V ~@11 X Y X Z X Y X AB@8 AC AD@8 ~@8
>`.pickRestart({
  A: "[~@15 [d3,bb3]@2 ~ [eb3,bb3]@2 ~@2 [d3,bb3]@2 ~ [c3,ab3]@5 ~@2]/2", // Gm Eb5 Gm Fm
  B: "[~ [ab2,eb3]@2 ~ [g2,eb3]@5 ~@2 [f2,c3]@2 ~@5 f3@2 ~@2 eb3@2 ~ [d3,bb3]@2 ~@2 [eb3,bb3]@2 ~, ~@15 g2@7 ~@10]/2", // Ab5 Cm F5 Gm Eb5
  C: "[d3,bb3]@2 ~@2 c3@4 ab3@2 ~ [ab2,eb3]@2 ~ [g2,eb3]@2, ~@2 ab3 ~@5", // Gm Ab5 Cm
  D: "~@2 [f2,c3]@2 ~ eb3@4 ~@3 f3@2 ~@2, ~@5 g2@2 ~@2 ab2@7", E: "eb3@3 ~ [d4,bb4]@5 ~@3 [f3,bb3]@3 ~",
  F: "eb4@4 ~ eb4@4 ~@2 [f3,c4]@5, g3 ~", G: "~@3 [g3,eb4]@3 ~ eb4@6 eb4@3, ~@7 ab3@8 ~",
  H: "[~@2 [d3,bb3]@2 ~@2 [eb3,bb3]@2 ~ [d3,bb3]@2 ~@2 [c3,ab3]@5 ~@2 [ab2,eb3]@2 ~@2 [g2,eb3]@5 ~@2 [f2,c3]@2 ~@5 f3@5 ~@2 [d4,bb4]@2 ~, ~@34 [bb1,f2,d3]@7 ~@7]/3", // Gm Eb5 Gm Fm Ab5 Cm F5 Gm …
  I: "[c4,ab4]@2 ~@2 [c4,ab4]@2 ~ a3@4 ~ a3@4, ~@7 f4@7 ~@2", J: "~@2 [g3,eb4]@2 ~ [f3,d4]@5 ~@2 [ab3,eb4]@4",
  K: "~@2 eb4 bb4 ~ c5 ~ [eb4,bb4]@2 ~ [d4,ab4]@2 ~@2 [g3,d4]@2", L: "~ [ab3,f4]@2 ~@2 [f3,bb3]@5 ~@2 [ab3,eb4]@4",
  M: "~@3 [f3,c4]@2 ~ [ab2,eb3]@2 ~@2 [f2,c3]@2 ~@3 c5", N: "~ [eb4,bb4]@2 ~@2 [d4,ab4]@2 ~ [g3,d4]@2 ~@2 [ab3,eb4]@4",
  O: "~@6 c4@5 ~@2 eb4@2 ~",
  P: "[~ eb4@2 ~ f4 ~ eb4 ~@4 [d3,bb3]@2 ~@2 [eb3,bb3]@2 ~ [d3,bb3]@2 ~@2 [c3,ab3]@5 ~@2 [ab2,eb3]@2 ~, ~ ab3@7 ~@24]/2", // Gm Eb5 Gm Fm Ab5
  Q: "[[g2,eb3]@2 ~@2 [f2,c3]@2 ~ [g2,eb3]@2 ~@2 [bb1,f2,d3]@7 ~@14]/2", R: "~@5 g2 c3 f3 eb3 bb2 f2 c3 g2 d2 c2 g2",
  S: "[f3@4 ~@2 f3!7 ~ f3@5 ~@3 f3!6 [f3,g3] ~ f3@5 ~@3 f3!6 ~@4]/3", T: "~@5 f3@2 ~@5 f3@3 ~", U: "~@10 g3@2 ~ g3@2 ~",
  V: "c4@5 ~@11", W: "~@7 f3", X: "~@2 [d3,bb3]@3 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ [c3,ab3]@3 ~",
  Y: "[ab2,eb3]@2 ~ [g2,eb3]@2 ~ [f2,c3] ~ [g2,eb3]@3 ~ [ab2,eb3]@3 ~", Z: "[ab2,eb3]@2 ~ [g2,eb3]@2 ~ [f2,c3,f3]@10",
  AA: "[f2,c3,f3] ~ [d3,bb3]@3 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ [c3,ab3]@3 ~", // F5 Gm Eb5 Gm Fm
  AB: "[[ab2,eb3]@2 ~ [g2,eb3]@2 ~@13 [g3,c4,f4]@3 ~ [g3,c4,f4] ~ [a3,d4,g4]@3 ~ [bb3,eb4,ab4]@3 ~ [b3,e4]@2 ~ [ab3,db4]@2 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ [eb3,bb3]@3 ~@3 [g3,c4,f4]@3 ~ [g3,c4,f4] ~ [a3,d4,g4]@3 ~ [bb3,eb4,ab4]@3 ~ [b3,e4]@2 ~ [ab3,db4]@2 ~ [eb3,bb3]@9 ~@3 [g3,c4,f4]@3 ~ [g3,c4,f4] ~ [a3,d4,g4]@3 ~ [bb3,eb4,ab4]@3 ~ [b3,e4]@2 ~ [ab3,db4]@2 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ [eb3,bb3]@3 ~@3 [g3,c4,f4]@3 ~ [g3,c4,f4] ~ [a3,d4,g4]@3 ~ [bb3,eb4,ab4]@3 ~, ~@3 [f2,c3,f3]@61]/8", // Ab5 Cm Csus4 Dsus4 Ebsus4 E5 Db5 Eb5 …
  AC: "[b3,e4]@2 ~ [ab3,db4]@2 ~ [eb3,bb3]@9 ~", // E5 Db5 Eb5
  AD: "[~@2 [d3,bb3]@3 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ ab3@3 ~ [ab2,eb3]@2 ~ [g2,eb3]@2 ~@3 [g2,eb3]@3 ~ [ab2,eb3]@3 ~@3 [d3,bb3]@3 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ ab3@3 ~ [ab2,eb3]@2 ~ [g2,eb3]@2 ~@13 [d3,bb3]@3 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ ab3@3 ~ [ab2,eb3]@2 ~ [g2,eb3]@2 ~@3 [g2,eb3]@3 ~ [ab2,eb3]@3 ~@3 [d3,bb3]@3 ~ [eb3,bb3] ~ [d3,bb3]@3 ~ ab3@3 ~ [ab2,eb3]@2 ~ [g2,eb3]@2 ~@11, ~@6 c3@5 f2@16 f2@16 f2@21, ~@11 c3@11 c3@5 f3@37, ~@27 c3@11 c3@5 c3@11 c3@10]/8", // Gm Eb5 Gm Ab5 Cm Ab5 Gm Eb5 …
})).s("gm_piano").gain(0.4)

// bass · electric bass finger
const bass = note(`<
  ~@23 A B@3 C B@3 C D E F G D H I J K L M N K O P Q R S R S R S R S B@3 C D E F G D H I J K L M N K O P Q R S R S R S R
  S B@3 C T U T V T U T V W U T V T U T V K L M N K O P Q R S R S R S R X T U T V T U T V Y Z Y AA Y Z Y AA T U T V T U
  T AB AC AD AC AD AC AD AC AD
>`.pickRestart({
  A: "~@5 g2 c3 f3 eb3 bb2 f2 c3 g2 d2 c2 g2", B: "[f2@4 ~@2 f2!6 g2 ~ f2@5 ~@3 f2!6 eb2 ~ f2@5 ~@3 f2!6 c2@4]/3",
  C: "~@2 eb2@2 ~ c2@2 ~ c2@3 ~ eb2@3 ~", D: "f2@4 ~@2 f2 ~ f2@4 ~@2 f2 ~", E: "f2@4 ~@2 f2 ~ c2@4 ~@3 c3",
  F: "bb2@4 ~@2 bb2 ~ bb2@3 ~ g2@3 ~", G: "f2@5 ~@5 c3@2 ~ eb3@2 ~", H: "f2@4 ~@2 f2 ~ c3@4 ~ f2 c3 f2",
  I: "bb1@4 ~@2 bb1 ~ d3@3 ~ bb1@3 ~", J: "f2@5 ~@3 f2@3 ~ eb2 ~ bb1 d2", K: "c2@3 ~@4 c2 c2@3 ~@3 c2!2",
  L: "bb1@3 ~@3 bb1 ~ f2@2 ~ a1 c2!2 d2 f2", M: "c2@3 ~@3 c2 ~ c2@3 ~@3 c2!2", N: "bb1@3 ~ f2 ~ f2@5 ~@5",
  O: "bb1@3 ~@3 bb1 c2 f2@2 ~ a1!2 c2 d2 f2", P: "c3@2 ~ bb2@4 ~", Q: "~@2 g2@4 ~@2 d2@3 ~ a2@3 ~",
  R: "c2@4 ~@2 c2 ~ c2@4 ~@2 c2 ~", S: "bb1@4 ~@2 bb1 ~ f2@2 ~ f2 a1 c2 d2 f2", T: "~@2 d3@3 ~ eb3 ~ d3@3 ~ c3@3 ~",
  U: "ab2@2 ~ g2@2 ~ f2 ~ g2@3 ~ ab2@3 ~", V: "ab2@2 ~ g2@2 ~ f2@10", W: "f2 ~ d3@3 ~ eb3 ~ d3@3 ~ c3@3 ~",
  X: "bb1@4 ~@2 bb1 ~ f2@2 ~ f2 a2 c3 d3 f3", Y: "~@2 g3@3 ~ ab3 ~ a3@3 ~ bb3@3 ~",
  Z: "b3@2 ~ ab3@2 ~ eb3 ~ d3@3 ~ eb3@3 ~", AA: "b3@2 ~ ab3@2 ~ eb3@9 ~", AB: "ab2@2 ~ g2@2 ~@7 eb2 ~ e2 ~, ~@3 f2@5",
  AC: "f2@3 ~@3 f2 ~ f2@3 ~@5", AD: "f2@3 ~@3 f2 ~ f2@3 ~ eb2 ~ e2 ~",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@24 A@3 B A@3 B C@2 D E F@2 D G H I H J H I K@2 L M L M L M L N A@3 B C@2 D E F@2 D G H I H J H I K@2 L M L M L M L N
  A@3 B O P O Q@2 P O R S P O Q@2 P O R H I H J H I K@2 L M L M L M L N O P O Q@2 P O R T U T V T U T V O P O Q@2 P O R
  W@8
>`.pickRestart({
  A: "[[f4,a4,c5]@11 ~ [g4,bb4,d5] ~ [f4,a4,c5]@14 [eb4,g4,bb4] ~ [f4,a4,c5]@14 [c4,eb4,g4,bb4]@4]/3", // F Gm F Eb F Cm7
  B: "~@2 [eb4,g4,bb4]@2 ~ [d4,f4,bb4]@2 ~ [c4,eb4,g4,bb4]@3 ~ [d4,f4,bb4]@3 ~", // Eb Bb Cm7 Bb
  C: "[[c4,f4]@24 [bb3,c4,f4]@3 ~ [d4,f4,bb4]@3 ~]/2", D: "[c4,f4,a4]",
  E: "[f3,g3,c4]@8 ~@2 [bb3,eb4,f4]@2 ~ [bb3,d4,f4]@2 ~", F: "[[c4,f4]@24 [bb3,c4,f4]@5 ~@3]/2", G: "[bb3,f4,g4]@15 ~",
  H: "[c4,eb4,g4]@15 ~", I: "[f3,d4,f4]@7 ~ [f3,c4,f4]@7 ~", J: "[bb3,eb4,g4]@4 ~@2 [bb3,d4,f4]@9 ~",
  K: "[[c4,e4,g4]@3 [c4,f4,a4]@6 [c4,f4,bb4]@3 [f4,a4,c5]@4]/2", L: "[c4,e4,g4]", M: "[bb3,c4,g4] [c4,f4,g4]",
  N: "[bb3,c4,g4] [c4,f4,a4]", O: "~@2 [f4,bb4,d5,f5]@3 ~ [g4,bb4,eb5,f5] ~ [f4,c5,f5]@3 ~ [eb4,g4,bb4,eb5]@3 ~",
  P: "[bb3,eb4,f4,bb4]@2 ~ [bb3,d4,eb4,f4]@2 ~ [c4,f4] ~ [bb3,d4,eb4,f4]@3 ~ [bb3,c4,f4]@3 ~", // Bbsus4 Bb F5 Bb Bbsus2
  Q: "[[bb3,eb4,f4,bb4]@2 ~ [bb3,d4,eb4,f4]@2 ~ [c4,f4]@12 [f4,bb4,d5,f5]@3 ~ [g4,bb4,eb5,f5] ~ [f4,c5,f5]@3 ~ [eb4,g4,bb4,eb5]@3 ~]/2", // Bbsus4 Bb F5 Bb Eb F5 Eb
  R: "[bb3,eb4,f4,bb4]@2 ~ [bb3,d4,eb4,f4]@2 ~ [c4,f4]@10", // Bbsus4 Bb F5
  S: "[c4,f4]@2 [f4,bb4,d5,f5]@3 ~ [g4,bb4,eb5,f5] ~ [f4,c5,f5]@3 ~ [eb4,g4,bb4,eb5]@3 ~", // F5 Bb Eb F5 Eb
  T: "~@2 [f5,c6,f6]@3 ~ [eb5,bb5,eb6] ~ [c5,g5,c6]@3 ~ [bb4,f5,bb5]@3 ~", // F5 Eb5 C5 Bb5
  U: "[gb4,db5,ab5]@2 ~ [eb4,bb4,f5]@2 ~ [f4,bb4,f5] ~ [f4,bb4,f5]@3 ~ [f4,bb4,f5]@3 ~", // Gbsus2 Ebsus2 Bb5
  V: "[gb4,db5,ab5]@2 ~ [eb4,bb4,f5]@2 ~ [f4,bb4,f5]@9 ~", W: "[a3,c4,f4]/2",
})).s("gm_synth_strings_1").gain(0.11)

// other · overdriven guitar
const overdriven_guitar = note("<~@37 A B ~@26 A B ~@28 C D E F G H I J K ~@48>".pickRestart({
  A: "~@10 a4 g4 f4 d4 c4 bb3", B: "a3@3 ~@13", C: "~@7 e3 a3 e3 d4 a3 g4 d4 bb4 c5",
  D: "bb4 ~ g4 ~ ab4 g4 eb4 bb4 d5 ~ f5 ~ ab5 ~@3", E: "g5 f5 eb5 ~ c5 ~ eb5 ~ g5 f5!2 eb5 f5 ~ eb5 ~",
  F: "~ bb4 f4 eb5 ~ c5 ab4 ~ eb4 ~ bb4 ~ f4 ~ bb3 c4", G: "eb4 ~ f3 g3 bb3 ~ g3 f3 ~ eb3 c3 f3 ~ g3 f3 ~",
  H: "~ bb2 eb3 g3 eb3 ab3 c4 ~ ab3 c4 eb4 ~ g4 ~ bb4 f4", I: "~ eb5 ~ d5 ~ g4 ab4 ~ g5 ~ g5 f5 ab5 [f5,g5] eb5 ~",
  J: "~ eb5 d5 [f4,bb4] eb4 ab4 c5 d5 eb5 c5 d5 c5 bb4 ~ bb4 ab4", // Bb5
  K: "ab5!2 f5 c5 eb5 ~ f5 b4 ~ ab4 bb4 ab4 c5 [ab4,bb4] f4 eb4", // Absus2
})).s("gm_overdriven_guitar").gain(0.48)

// drums · kick
const kick = s("bd").struct("<~@24 A@8 B@8 C@6 ~@2 A@12 B@8 C@6 ~@2 A@28 C@6 ~@2 A@40>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@6 x!2 ~@5 x ~", C: "x ~@2 x!2 ~@2 x",
})).gain(0.3)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@27 A ~@3 B ~@14 C D ~@11 E ~@14 F G ~@11 H ~@22 F G ~@19 I ~@3 J ~@7 K ~@8
>`.pickRestart({
  A: "~@2 x!2", B: "~@4 x ~ x!2", C: "~@2 x!3 ~@5 x!2 ~ x!2 ~", D: "~@4 x ~ x ~ x ~@3 x!2 ~ x", E: "~@12 x!4",
  F: "x!3 ~ x ~@5 x!2 ~ x!2 ~", G: "~@4 x ~ x ~ x!2 ~@2 x ~@2 x", H: "x!3 ~@6 x!7", I: "~@14 x!2", J: "~@7 x",
  K: "~@6 x!2",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~@24 A@22 ~@2 A@8 ~@4 A@14 ~@2 A@8 ~@20 A@6 ~@2 A@8 ~@24 B@8>".pickRestart({
  A: "x!16", B: "x!8",
})).gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@27 A ~@3 B ~@14 C D ~@11 E ~@14 F G ~@11 H ~@15 I ~@6 F G ~@19 J ~@3 B ~@7 B ~@8
>`.pickRestart({
  A: "~@13 x ~ x", B: "~@5 x ~@2", C: "~ x", D: "x!4 ~@6 x!2 ~@4", E: "~@8 x ~ x!2 ~@4", F: "~@5 x ~@2 x ~@3 x ~@2 x",
  G: "x ~ x!2 ~@6 x!2 ~@2 x ~", H: "~@5 x!4 ~@7", I: "~@14 x!2", J: "~@9 x!2 ~@5",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~@46 A B ~@26 A B ~@16 C ~@3 C ~@5 C ~ C ~@5 A B ~@8 C ~@3 C ~@3 C ~ C ~ C ~ C ~ C ~@3 C ~@11
>`.pickRestart({
  A: "x ~@2 x ~@4", B: "~ x ~@2 x ~@3", C: "x",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@56 A@4 ~@24 A@3 ~ A@16 ~@16 A@24 ~@8>".pickRestart({
  A: "x!8",
})).gain(0.4)

// drums · cowbell
const cowbell = s("cb").struct("<~@32 [~ x ~ x]!8 ~@20 [~ x ~ x]!8 ~@84>").gain(0.2)

// drums · congas
const congas = s("conga:33").struct("<~@56 [~ x ~ x ~@12]!4 ~@24 [~ x ~ x ~@12]!4 ~@64>").gain(1.27)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@32 [~@3 x ~@3 x ~@3 x ~@3 x]!8 ~@20 [~@3 x ~@3 x ~@3 x ~@3 x]!8 ~@84>")
  .gain(0.29)

stack(
  piano, piano_2, bass, synth_strings_1, overdriven_guitar, kick, snare, low_tom, hihat, mid_tom, crash, ride, cowbell,
  congas, woodblocks
)

More by Bruce Hornsby