Strudelify

Save the Last Dance for Me

Cats

KeyB♭ majorTempo140 bpm
0:00/0:00
// Save the Last Dance for Me — Cats
// 140 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · string ensemble 1
const string_ensemble_1 = note(`<
  ~@30 A@4 B@2 C D E@2 F@2 E G H I ~@10 A@4 B@2 J D E@2 F@2 E G H I A@4 B@2 C D K L M N O@2 N M O@2 M N O@2 M ~
>`.pickRestart({
  A: "[ab5 g5, eb5]/4", B: "bb5/2",
  C: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,g4] ~ [bb3,eb4,g4] ~, ~@6 eb4 ~", // Eb
  D: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~ [bb3,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~, ~@4 eb4 ~@3", // Eb
  E: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4]@3 ~ [bb3,d4,f4] ~@5", F: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~@5",
  G: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4]@3 ~ [bb3,d4,f4] ~@5, ~@3 ab4@5", // Bb
  H: "g4 ~ [bb3,eb4,g4] ~@3 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~@5", // Eb
  I: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4]@4 [bb3,eb4,g4] ~@5", // Eb
  J: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,g4,bb5] ~ [bb3,eb4,g4] ~, ~@3 bb5 eb6!2 eb4 ~", // Eb
  K: "~@2 [bb3,d4,f4] ~ d4 ~ [bb3,d4,f4]@2 [bb3,d4,f4] ~ [bb3,d4,f4] ~@5", // Bb
  L: "~@2 [bb3,d4,f4] ~@3 [d4,f4]@2 [bb3,d4,f4] ~ [bb3,d4,f4] ~@5, ~@6 bb3 ~@9", // Bb Dm Bb
  M: "~@2 [bb3,eb4,g4] ~@3 [bb3,g4] ~ [bb3,g4] ~ [bb3,eb4,g4] ~@5, ~@3 eb4!2 ~@3", // Eb
  N: "~@2 [bb3,eb4,g4] ~@3 [bb3,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~@5, ~@3 eb4 ~@4", // Eb
  O: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~@5", // Bb
})).s("gm_string_ensemble_1").gain(0.16).pan(0.6)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@5 B@5 C@8 D@2 E@8 F@8 G@2 H@6 I@5 B@5 F@8 G@2 ~@10 J@6 K@8 L@2 D@2 L@2 M@2
>`.pickRestart({
  A: "[g3,bb3,eb4]/5", B: "[f3,d4]/5", C: "[~@16 db4@16 [ab3,c4]@32 g3@31 [f3,d4]@32 ~, eb4@3 ~, g3 ~ bb3@2]/8",
  D: "[g3,eb4]/2", E: "[[g3,eb4]@3 [f3,d4]@5, bb3]/8", F: "[~ db4 [ab3,c4]@2 g3@2 [f3,d4]@2, eb4@3 ~, g3 ~ bb3@2]/8",
  G: "[[g3,eb4]@31 ~]/2", H: "[[f3,d4] [g3,eb4] [f3,d4], bb3]/6", I: "[g3,eb4]/5",
  J: "[g3@32 [f3,d4]@32 [g3,eb4]@31 ~, bb3]/6", K: "[[d4,f4] [g3,eb4] [d4,f4] [g3,eb4], bb3]/8", L: "[d4,f4]/2",
  M: "[[g3,eb4]@7 ~]/2", // Cm
})).s("gm_synth_strings_1").gain(0.09)

// chords · piano
const piano = note(`<
  A@5 B C@4 D E F G D@2 C@2 D@2 A@3 B C@4 D E F G D@2 C@2 D@2 C B D A C@2 D@2 A@3 B C@4 D E F G D@2 C@2 D@2 C B D A C@2
  D@2 F G D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D H
>`.pickRestart({
  A: "~@2 [g3,bb3,eb4]@4 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~", // Eb
  B: "~@2 [f3,bb3,d4]@4 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~", // Bb
  C: "~@2 [f3,bb3,d4]@3 ~ [f3,bb3,d4] ~@3 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~", // Bb
  D: "~@2 [g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~", // Eb
  E: "~@2 [g3,bb3,db4,eb4]@3 ~ [g3,bb3,db4,eb4] ~@3 [g3,bb3,db4,eb4] ~@3 [g3,bb3,db4,eb4] ~", // Eb7
  F: "~@2 [ab3,c4,eb4]@4 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~", // Ab
  G: "~@2 [ab3,c4,eb4]@3 ~ [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~", H: "[g3,bb3,eb4]@3 ~",
})).s("gm_piano").gain(0.15).pan(0.6)

// other · celesta
const celesta = note("<~@38 A B C D A B C D ~@18 A B C D A B C D ~@24>".pickRestart({
  A: "bb6 ~@9 bb5 ~ d6 ~ f6 ~", B: "bb6 ~@15", C: "eb7 ~@9 eb6 ~ g6 ~ bb6 ~", D: "eb7 ~@15",
})).s("gm_celesta").gain(0.22).pan(0.6)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A@2 B@2 C D@5 E@2 F@2 G@2 H@2 I@2 B@2 C D@5 E@2 F@2 G@2 H@2 I@2 J@8 B@2 C D@5 E@2 F@2 G@2 H@2 K@2 ~@8 L@2 G@2 H@2 I@2
  M@2 N@4 O@4 P@4 Q R
>`.pickRestart({
  A: "[~@3 eb4@2 ~@6 eb4@2 ~ bb3@2, g3@3 bb3@3 bb3@6 bb3@7 bb3@3 bb3@6 ~@4, ~ eb4@2 ~@2 eb4@4 eb4@2 ~@2 eb4@3, ~ g3@3 g3 g3@3]/2",
  B: "[g3@2 ~@4 eb4@4 ~@6 g3@2 ~@4 eb4@3 ~@3 bb3@4, ~@2 eb4@2 g3@11 ~@5 g3@12, ~@3 bb3@7 eb4@7 ~ eb4@3 ~@5 eb4@6, ~@12 bb3@7 bb3@8 ~@5]/2",
  C: "g3@2 ~@4 eb4@3 ~@3 bb3@4, ~ eb4 g3@6, ~@3 bb3@7 eb4@6",
  D: "[f3@2 ~@4 d4@4 ~@6 f3@2 ~@4 d4@3 ~@7 f3@2 ~@4 d4@3 ~@7 f3@2 ~@4 d4@3 ~@7 f3@2 ~@4 d4@3 ~@5 f3@2, ~ d4 f3@6 ~@2 f3@6 ~@2 f3@6 ~@2 f3@6 ~@2 f3@5 ~, ~@3 bb3@7 d4@7 ~ d4@3 ~@5 d4@7 ~ d4@3 ~@5 d4@7 ~ d4@3 ~@5 d4@6 ~@2 d4@3 ~@5 d4@6, ~@12 bb3@7 bb3@7 ~@2 bb3@7 bb3@8 ~ bb3@7 bb3@7 ~@2 bb3@7 bb3@7 ~@2 bb3@4]/5",
  E: "[g3@2 ~@4 eb4@3 ~@7 g3@2 ~@8 bb3@2 ~@2 bb3@2, ~@2 eb4@2 g3@12 ~@4 g3@7 ~ g3@4, ~@3 bb3@7 eb4@6 ~@2 eb4@3 ~ eb4@10, ~@12 bb3@6 ~ bb3@5 db4@8]/2",
  F: "[ab3@2 ~@4 eb4@4 ~@6 ab3@2 ~@4 eb4@3 ~@5 ab3@2, ~@2 eb4@2 ab3@11 ~@5 ab3@9 ~@3, ~@3 c4@7 eb4@8 eb4@2 ~@6 eb4@6, ~@12 c4@7 c4@7 ~@2 c4@4]/2",
  G: "[g3@2 ~@4 eb4@3 ~@13 eb4@3 ~@5 g3@2, ~ eb4 g3@6 g3@2 g3@5 ~, ~@3 bb3@7 eb4@6 ~@2 eb4@3 ~@5 eb4@6, ~@12 bb3@6 ~ bb3@8 ~ bb3@4]/2",
  H: "[f3@2 ~@4 d4@3 ~@7 f3@2 ~@4 d4@3 ~@5 f3@2, ~@2 d4@2 f3@12 ~@4 f3@9 ~@3, ~@3 bb3@7 d4@6 ~@2 d4@2 ~@6 d4@6, ~@12 bb3@7 bb3@7 ~@2 bb3@4]/2",
  I: "[g3@2 ~@4 eb4@3 ~@7 g3@2 ~@4 eb4@3 ~@5 g3@2, ~@2 eb4@2 g3@11 ~@5 g3@9 ~@3, ~@3 bb3@7 eb4@7 ~ eb4@2 ~@6 eb4@6, ~@12 bb3@6 ~ bb3@8 ~ bb3@4]/2",
  J: "[f3 ~@5 d4@4 ~@4 f3@2 ~@6 d4@4 ~@4 f3@2 ~@6 eb4@4 ~@4 g3@2 ~@6 eb4@4 ~@4 g3@2 ~@6 d4@4 ~@4 f3@2 ~@6 d4@4 ~@4 f3@2 ~@6 eb4@4 ~@4 g3@2 ~@6 eb4@4 ~@4 g3@2, [bb3,d4]@4 bb3@6 d4@5 ~ d4@4 bb3@8 bb3@7 ~ bb3@8 bb3@7 ~ bb3@8 bb3@7 ~ bb3@8 bb3@7 ~ bb3@7 ~ bb3@7 ~ bb3@8 bb3@7 ~ bb3@8 bb3@4, ~@2 f3@10 bb3@6 f3@11 ~@5 g3@10 ~@6 g3@10 ~@6 f3@12 ~@4 f3@11 ~@5 g3@11 ~@5 g3@12 ~@2, ~@26 d4@4 ~@2 eb4@5 ~@5 eb4@4 ~@2 eb4@5 ~@5 eb4@4 ~@2 d4@4 ~@6 d4@6 d4@5 ~@5 d4@5 ~ eb4@5 ~@5 eb4@4 ~@2 eb4@5 ~@5 eb4@6]/8", // Bb
  K: "[g3@2 ~@4 eb4@3 ~@7 g3@2 eb4@2 ~@12, ~@2 eb4@2 g3@11 ~@17, ~@3 bb3@7 eb4@7 ~@15, ~@6 bb3@3 ~@7]/2",
  L: "[~@6 eb4@4 ~@6 ab3@2 ~@4 eb4@3 ~@5 ab3@2, ~@2 eb4@2 ab3@11 ~@5 ab3@9 ~@3, ~@3 c4@7 eb4@8 eb4@2 ~@6 eb4@6, ~@12 c4@7 c4@7 ~@2 c4@4]/2",
  M: "[f3@2 ~@4 d4@4 ~@4 f3 ~ f3@2 ~@4 d4@4 ~@4 f3 ~, ~@2 d4@2 f3@8 bb3@7 bb3@7 d4@6, ~@3 bb3@7 d4@7 ~ d4@2 f3@8 bb3@4]/2",
  N: "[g3@2 ~@4 eb4@4 ~@4 g3 ~ g3@2 ~@4 eb4@4 ~@4 g3 ~ f3@2 ~@4 d4@4 ~@4 f3@2 f3@2 ~@4 d4@4 ~@4 f3 ~, ~@2 eb4@2 g3@8 bb3@6 ~ bb3@9 bb3@7 bb3@9 bb3@7 bb3@8 ~ bb3@4, ~@3 bb3@7 eb4@6 ~@2 eb4@2 g3@9 ~@7 f3@9 ~@7 f3@9 ~@3, ~@26 eb4@7 ~ d4@2 ~@6 d4@7 ~ d4@3 ~@5 d4@6]/4",
  O: "[g3@2 ~@4 eb4@4 ~@4 g3 ~ g3@2 ~@4 eb4@4 ~@4 g3 ~ f3@2 ~@4 d4@4 ~@4 f3 ~ f3@2 ~@4 d4@4 ~@4 f3 ~, ~@2 eb4@2 g3@8 bb3@6 ~ bb3@7 eb4@6 ~@2 d4@2 f3@9 ~@7 f3@9 ~@3, ~@3 bb3@7 eb4@7 ~ eb4@2 g3@8 bb3@6 ~ bb3@9 bb3@7 bb3@9 bb3@4, ~@42 d4@7 ~ d4@2 ~@6 d4@6]/4",
  P: "[g3@2 ~@4 eb4@4 ~@4 g3 ~ g3@2 ~@4 eb4@4 ~@4 g3 ~ f3@2 ~@4 d4@4 ~@4 f3@2 f3@2 ~@4 d4@4 ~@4 f3 ~, ~@2 eb4@2 g3@8 bb3@7 bb3@7 eb4@6 ~@2 d4@2 f3@8 bb3@6 ~ bb3@7 d4@6, ~@3 bb3@7 eb4@7 ~ eb4@2 g3@8 bb3@6 ~ bb3@7 d4@6 ~@2 d4@2 f3@8 bb3@4]/4",
  Q: "g3@2 ~@4 eb4@4 ~@4 g3 ~, ~ eb4 g3@4 bb3@2, ~@3 bb3@7 eb4@6", R: "[g3,bb3,eb4]@3 ~",
})).s("gm_acoustic_guitar_steel").gain(0.17).pan(0.2)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A B C D C E@2 F@3 G H I J K L M N O P C D C E@2 F@3 G H I J K L M N O P Q R S T R@2 S@2 C D C E@2 F@3 G H I J K L M N
  O P Q R S T R@2 S@2 I J K L M N O P U V W X M Y Z AA AB AC AD AE AF AG AH AI
>`.pickRestart({
  A: "~@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4]@4", B: "~@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4]@2 [g4,bb4]@4",
  C: "~@2 [eb4,g4,bb4] ~@3 [g4,bb4]@4 [g4,bb4] ~ [g4,bb4]@4", // Eb Gm
  D: "~@2 [eb4,g4,bb4] ~@3 [g4,bb4]@4 [g4,bb4]@2 [g4,bb4]@4", E: "~@2 [d4,f4,bb4] ~@3 [f4,bb4]@4 [f4,bb4]@2 [f4,bb4]@4",
  F: "~@2 [d4,f4,bb4] ~@3 [f4,bb4]@3 ~ [f4,bb4]@2 [f4,bb4]@4", // Bb Bb5
  G: "~@2 [eb4,g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4]@4", // Eb Gm
  H: "~@2 [eb4,g4,bb4] ~@3 [g4,bb4]@4 [g4,bb4]@2 [g4,bb4]@3 ~", // Eb Gm
  I: "~@2 [eb4,ab4,c5] ~@2 ab4 [ab4,c5]@4 [ab4,c5]@3 ~ [ab4,c5]@2", // Ab
  J: "~@2 [eb4,ab4,c5] ~@3 [ab4,c5]@4 [ab4,c5]@2 [ab4,c5]@4", // Ab
  K: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4]@4", // Gm
  L: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ g4@2 eb4 ~, ~@3 bb4", // Gm
  M: "d4@2 [f4,bb4] ~@3 [f4,bb4]@3 ~ [f4,bb4]@2 [f4,bb4]@4", N: "d4@2 [f4,bb4] ~@3 [f4,bb4]@3 ~ [f4,bb4] ~ [f4,bb4]@4",
  O: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ g4@2 g4@2, ~@3 bb4", // Gm
  P: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4]@2 [g4,bb4] ~", // Gm
  Q: "~@2 [d4,f4,bb4] ~@3 [d4,f4,bb4]@4 [f4,bb4]@2 [f4,bb4]@2 [f4,bb4] ~", // Bb Bb5
  R: "~@2 [d4,f4,bb4] ~@3 [d4,f4,bb4]@4 [f4,bb4] ~ [f4,bb4]@2 [f4,bb4]@2", // Bb Bb5
  S: "~@2 [eb4,g4,bb4] ~@3 [eb4,g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4]@2 [g4,bb4] ~", // Eb Gm
  T: "~@2 [eb4,g4,bb4] ~@3 [eb4,g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4]@2 [g4,bb4]@2", // Eb Gm
  U: "[d4,f4,bb4] ~ [f4,bb4]@3 ~ [f4,bb4]@4 [f4,bb4]@2 f4@2 f4@2, ~@3 bb4", // Bb Bb5
  V: "d4@2 [f4,bb4] ~@3 [f4,bb4]@3 ~ [f4,bb4]@2 f4@2 d4 ~, ~@3 bb4", // Bb5
  W: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ [g4,bb4] ~ bb4@2, ~@14 g4 ~", // Gm
  X: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4] ~ g4@2 eb4@2, ~@3 bb4", // Gm
  Y: "d4@2 [f4,bb4] ~@3 [f4,bb4]@4 [f4,bb4]@2 f4 ~ f4 ~, ~@3 bb4", // Bb5
  Z: "eb4@2 [g4,bb4] ~@3 [g4,bb4]@3 ~ [g4,bb4]@2 [g4,bb4]@4", AA: "eb4 [g4,bb4] ~ [g4,bb4]@2 [g4,bb4]!3",
  AB: "d4@2 [f4,bb4]@2 ~@2 [f4,bb4]@4 [f4,bb4]@2 [f4,bb4]@2 d4 ~", // Bb5
  AC: "d4@2 [f4,bb4] ~@3 [f4,bb4]@4 [f4,bb4] ~ [f4,bb4]@4, f4 ~@11 d4@2 ~@2", // Bb5
  AD: "eb4@2 [g4,bb4] ~@3 [eb4,g4,bb4]@4 [eb4,g4,bb4]@2 [g4,bb4] ~ [g4,bb4]@2", // Gm Eb Gm
  AE: "eb4@2 [g4,bb4]@2 ~@2 [g4,bb4]@3 ~ [g4,bb4]@2 [g4,bb4]@2 [g4,bb4]@2", // Gm
  AF: "d4@2 [f4,bb4] ~@3 [d4,f4,bb4]@4 [f4,bb4]@2 [f4,bb4]@2 [f4,bb4]@2", // Bb5 Bb Bb5
  AG: "d4@2 [f4,bb4] ~@3 [d4,f4,bb4]@4 [d4,f4,bb4] ~ [d4,f4] ~ [d4,f4] ~, ~@3 bb4", // Bb5 Bb Dm
  AH: "eb4@2 [g4,bb4] ~@3 [eb4,g4,bb4]@3 ~ [eb4,g4,bb4] ~ [g4,bb4]@2 eb4@2", AI: "[g4,bb4]@3 ~",
})).s("gm_electric_guitar_clean").gain(0.15).pan(0.8)

// other · string ensemble 1
const string_ensemble_1_2 = note("<~@63 A B C D E F G H I J@2 ~@10 K@2 L M K N L O P Q R ~>".pickRestart({
  A: "~@4 bb4@2 bb4@2 eb5@2 eb5@2 c5 ~ c5 ~", B: "f5 ~ c6 bb5 c6 ~ f6@8 ~@2",
  C: "~@2 d6 eb6 f6 ~ eb6 ~ d6 eb6 c6 ~ bb5 c6 ab5 ~", D: "bb5 ~ bb5 ab5 g5@7 ~@5",
  E: "~ g4 bb4 eb5 g5 [bb5,eb6] [eb6,g6] [g6,bb6]", // Eb5 Eb Gm
  F: "[ab6,bb6]!2 ab6 [ab6,bb6]!2 ~ [f6,ab6]@3 ~ [d6,f6] [c6,eb6] [bb5,d6]@4", // Absus2 Fm Dm Cm Bb
  G: "[ab5,f6] [f5,d6] [ab5,f6] [bb5,d6]@2 [f5,bb5] [d5,ab5]@2", H: "[eb5,g5]@5 bb4 c5 bb4", I: "eb5@5 bb4 g4 eb4",
  J: "[ab4@29 ~@3]/2", K: "~ d4 f4 d4 bb4 f4 d5 bb4", L: "~ eb4 g4 eb4 bb4 g4 bb4 eb5",
  M: "~ eb4 g4 eb4 bb4 g4 eb5 bb4", N: "~@2 d4 ~ f4@2 d4@2 bb4@2 f4@2 d5@2 bb4@2",
  O: "~@2 eb4@2 g4@2 eb4@2 bb4@2 g4@2 eb5@2 bb4 ~", P: "~@2 bb4 ~@3 f4@6 g4@4, d4@3 ~@5", Q: "ab4@3 g4@3 f4@2",
  R: "eb4",
})).s("gm_string_ensemble_1").gain(0.21).pan(0.3)

// bass · acoustic bass
const bass = note(`<
  A B C@2 B D E D@2 E C A F@2 A B G D A H C@2 B D E D@2 E C A F@2 A B G D A H I@2 J@2 I@2 J K C@2 B D E D@2 E C A F@2 A
  B G D A H I@2 J@2 I@2 J K F@2 A B G D A H L E M@2 N@2 M H N@2 M H L E O P
>`.pickRestart({
  A: "eb1@5 ~ bb1 ~ eb2@4 bb1@4", B: "eb1@5 ~ bb1 ~ eb2@4 bb1@3 ~", C: "eb1@6 bb1 ~ eb2@4 bb1@4",
  D: "bb1@5 ~ f2 ~ bb2@4 f2@4", E: "bb1@6 f2 ~ bb2@4 f2@4", F: "ab1@5 ~ eb2 ~ ab2@4 eb2@4",
  G: "bb1@6 f2 ~ bb2@4 f2@3 ~", H: "eb1@6 bb1@2 eb2@4 bb1@3 ~", I: "bb1@3 d2@3 f2@2", J: "eb2@3 g2@3 bb2@2",
  K: "eb2@6 g2@6 bb2@3 ~", L: "bb1@6 f2@2 bb2@4 f2@3 ~", M: "eb1@3 bb1 eb2@2 bb1@2", N: "bb1@3 f2 bb2@2 f2@2",
  O: "eb1@3 bb1 eb2 bb1 g1 bb1", P: "eb1@3 ~",
})).s("gm_acoustic_bass").gain(0.4)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x ~@4]!94 [x ~@2 x ~@2 x ~] x>").gain(0.4)

// drums · rim
const rim = s("rim").struct("<[~ x]!95 x>").gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  A@11 B A@7 B A@9 B A@7 B A@7 C A@9 B A@7 B A@7 C A@7 B A@7 B A@3 C A@2 D E
>`.pickRestart({
  A: "~@3 x", B: "~@5 x!3", C: "~@4 x!4", D: "~@10 x ~ x!4", E: "x",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@11 A ~@7 A ~@9 A ~@7 A ~@17 A ~@7 A ~@15 A ~@7 A ~@8>".pickRestart({
  A: "~ x",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<~ [~@3 x] ~@94>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<[x ~ x!2 ~ x!3]!95 x>").gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A ~@10 B@7 C ~@10 B@7 D ~@7 E ~@10 B@7 C ~@7 E B@7 C B@11 C B@2 ~@2>".pickRestart({
  A: "~@3 x!3 ~@2", B: "~@3 x", C: "~ x!7", D: "~ x ~@2 x!4", E: "~ x!3 ~@4",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~ [~ x ~@6] ~@94>").gain(0.35)

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

// drums · guiro
const guiro = s("guiro:0").struct("<[~@3 x ~@4]!95 x>").gain(8.38)

// drums · guiro
const guiro_2 = s("guiro:4").struct("<x!94 [x ~@2 x] ~>").gain(8.38)

stack(
  string_ensemble_1, synth_strings_1, piano, celesta, acoustic_guitar_steel, electric_guitar_clean, string_ensemble_1_2,
  bass, kick, rim, snare, snare_soft, low_tom, hihat, mid_tom, high_tom, ride, guiro, guiro_2
)

More by Cats