Strudelify

One More Night

Phil Collins

KeyE♭ majorTempo64 bpm
0:00/0:00
// One More Night — Phil Collins
// 64 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 6/4 at bar 50, 4/4 at bar 51) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 87 bars on a 16-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.

// bass · fretless bass
const bass = note(`<
  ~@5 A B A C D E F G H I F J A B A K A B A C L M N O P Q R J S B A K A B A K A B A K T U V W@2 X@2 Y@2 Z AA AB AC AD AE
  AF@2 X@2 AG@2 X@2 AH@2 X@2 AG@2 AI@2 AJ@2 AI@2 AK@2 AL@2 AM@2 ~
>`.pickRestart({
  A: "bb1 eb2", B: "bb1@4 d2@3 eb2@9", C: "f2@4 c2@3 bb1@7 eb3@2", D: "ab3@8 g3@7 f3", E: "f3 eb3", F: "ab3 g3",
  G: "f3", H: "ab3@8 g3@7 eb3", I: "f3@7 d3 eb3@8", J: "[f2,f3]@7 ~", K: "f2@4 c2@3 bb1@8 ~", L: "ab3@8 g3@6 bb2 eb3",
  M: "f3@7 d3 eb3@7 g3", N: "ab3@7 a3 bb3@6 bb2 eb3", O: "f3@14 g3 eb3", P: "ab3@6 c4@2 bb3@6 g3 bb2",
  Q: "f3@7 d3 eb3@4 eb3 f3 g3 eb3", R: "ab3@7 a3 bb3@7 g3", S: "bb1 d2 eb2@2", T: "c2@7 db2@9", U: "c2@5 db2 d2 eb2@9",
  V: "c2@7 db2@3 ~@6", W: "[c2@5 db2 d2 eb2@16 ~ bb1@8]/2", X: "[eb2@8 bb1@4 d2@3 eb2@9 bb1@8]/2",
  Y: "[eb2@8 f2@4 c2@3 bb1@9 ab3@8]/2", Z: "g3@6 bb2 eb3 f3@7 d3", AA: "eb3@6 f3 g3 ab3@7 a3", AB: "bb3@7 g3 f3@8",
  AC: "~ eb2 ab2!2 bb2 c3 eb3 f3 ab3@8", AD: "g3@8 f3@3 ~ bb2 c3 eb3 f3", AE: "eb3@5 f3 g3 eb3 ab3@7 a3",
  AF: "[bb3@4 g3@4 [f2,f3]@12 ~@2 f1 ab1 bb1@8]/2", AG: "[eb2@8 f2@4 c2@3 bb1@8 ~ bb1@8]/2",
  AH: "[eb2@8 f2@4 c2@3 bb1@6 f1 g1 ab1 bb1@8]/2", AI: "[eb2@8 bb1@4 d2@3 eb2@7 ab2 bb2 bb1@8]/2",
  AJ: "[eb2@8 f2@4 c2@3 bb1@4 c3 bb2 g2 f2 f1 bb1@8]/2", AK: "[eb2@8 f2@4 c2@3 bb1@6 bb2 g2 f2 bb1@8]/2",
  AL: "[eb2@8 bb1@4 d2@3 eb2@6 g1 ab1 a1 bb1@8]/2", AM: "[eb2@8 f2@4 c2@3 bb1@7 ~@10]/2",
})).s("gm_fretless_bass").gain(0.2)

// chords · epiano2
const epiano2 = note(`<
  ~@5 A B C D E F G H E F I J K B L M@2 N K O G P Q R S T U H V W K X Y Z K X Y Z K X AA AB AC AD@8 AE@2 AF AG AH@5 AI@6
  AJ@4 AK@8 AL@3 ~
>`.pickRestart({
  A: "[bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@8 ~", B: "~@4 bb4@3 [bb3,eb4,g4]@9, [bb3,d4,f4]@7 ~@9",
  C: "f4@4 f4@3 [bb3,eb4,g4]@9, [bb3,d4]@7 ~@9", D: "[c4,eb4,ab4]@4 [bb3,eb4,g4]@3 [bb3,d4,f4]@9",
  E: "[ab3,eb4,ab4,c5,eb5]@8 ~@5 eb5@3, ~ [g3,eb4,bb4], ~@11 d5@5", F: "[f3,eb4,ab4,c5] [f4,g4,bb4]",
  G: "[ab3,ab4,c5,eb5]@8 ~@5 eb5@3, ~ [g3,eb4,bb4], ~@11 d5@5", H: "[f3,eb4,ab4,c5]",
  I: "[ab3,eb4,ab4,c5]@2 ~ eb5, ~ [g3,eb4,bb4]", J: "[f3,eb4,ab4]", K: "[bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@9",
  L: "[d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@9, c4@7 ~@9", // Dm Bb Eb
  M: "[[f3,c4,eb4,ab4]@4 [bb3,eb4,g4]@3 ~@9 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@9, ~@7 [bb3,d4,f4]@9 ~@16, ~@13 bb4@10 ~@9]/2", // Fm7 Eb Bb Eb Bb
  N: "~@4 bb4@3 [bb3,eb4,g4]@8 ~, [bb3,d4,f4]@7 ~@9", O: "[f3,c4,eb4,ab4]@4 [bb3,eb4,g4]@3 [bb3,d4,f4]@9",
  P: "[eb4,ab4,c5] [f4,g4,bb4]", Q: "[ab3,eb4,ab4,c5,eb5]@8 [eb4,bb4]@3 ~@2 eb5@3, ~ g3, ~@11 [eb4,bb4,d5]@5",
  R: "eb4@9 ~@4 c5@3, f3, c5@11 ab4@5, ab4@5 f4@3, ~@9 eb4@7",
  S: "[ab3,eb4,ab4,c5]@8 ~@5 eb5@3, ~ [g3,eb4,bb4], ~@11 d5@5", T: "[f3,eb4,ab4,c5] [eb3,f4,g4,bb4]",
  U: "~@7 eb4 ~@4 d5@4, [ab3,eb4,c5] [g3,eb4,bb4], ab4@3 ab4 ~@4, ~ bb4 ~@2", // Ab Eb
  V: "[bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,g4]@5 [bb3,g4,bb4]@4, ~@7 eb4@9", // Bb Eb
  W: "[bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@4 [bb3,eb4,g4]@5", X: "[f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 [bb3,d4,f4]@9",
  Y: "[bb3,d4,f4]@4 [bb3,d4,f4]@3 ~@5 bb4@4, ~@7 [eb4,g4]@9, ~@7 bb3@7 ~@2", // Bb Eb
  Z: "bb3@4 [bb3,bb4]@3 [bb3,eb4,g4]@4 [bb3,f4,bb4]@5, [d4,f4]@7 ~@9", AA: "[bb3,eb4,g4]@7 [bb3,eb4,g4]@9",
  AB: "[g3,bb3,eb4,g4]@7 [ab3,bb3,db4,f4,ab4]@9", AC: "[f3,g3,bb3,eb4,g4]@7 [f3,g3,bb3,eb4,g4]@9",
  AD: "[[g3,bb3,eb4,g4]@7 [db4,f4]@4 [f4,ab4,c5]@4 [f4,ab4,c5,eb5]@9 [d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@9 [bb3,d4,f4]@4 [bb3,d4,f4,bb4]@3 [bb3,eb4,g4]@6 [bb3,eb4,g4,bb4]@3 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@9 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 bb3@6 [bb3,bb4]@3 ~@5 ab4@3 ~@5 eb5@3 eb4@3 ~@2 ab4@2 ~@5 bb4@4 ~@5 ab4@3, ~@7 [ab3,bb3]@17 ~@16 f3@7 ~@9 f3@7 ~@16 [f3,d4,f4]@9 [ab3,eb4,c5]@8 [g3,bb3,eb4,bb4]@8 [f3,c4,c5]@8 ~@16, ~@11 db4@13 c4@7 ~@57 eb5@13 ~@22 bb4@5, ~@88 ab4@5 ~@11 ab4@5 ~@2 bb3@9 [ab3,c4,eb4,c5,eb5]@8, ~@91 bb4@5 ~@3 d5@5 ~@3 eb4@5 [eb4,g4]@8 ab4@5 ~@3]/8", // Eb Db Fm Fm7 Dm Bb Eb Bb …
  AE: "[~@5 eb5@2 c4 ~@13 c5@3 [ab3,eb4,ab4,c5,eb5]@8, [g3,bb3,eb4,g4,bb4] f3@2 ~, ~@3 d5@5 c5@11 ab4@5 ~@8, ~@4 [eb4,ab4]@5 eb4@3 ~@4, ~@17 c4@7 ~@8]/2", // Ab Eb Ab5
  AF: "[g3,f4,bb4]@8 ~@5 eb5@3, bb3@3 ~ [f3,ab3,c4,eb4,ab4]@4", AG: "[eb4,g4] [ab3,eb4,ab4,c5], bb3@2 ~@2 c4@3 ~",
  AH: "[~@4 d5@4 [f3,c4,eb4,ab4,c5]@16 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@8 ~ [c4,d4,f4]@4 [bb3,d4,f4,bb4]@3 [bb3,eb4]@7 [bb3,eb4]@2 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@9 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 [bb3,d4,f4], [g3,bb3,eb4,bb4]@8 ~@31 f3@5 ~@3 g4@9 ~@24]/5", // Fm7 Bb Eb Dm7 Bb Eb5 Bb Eb …
  AI: "[~@5 [bb3,d4,f4,bb4]@3 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,g4]@6 [bb3,f4,g4]@3 [bb3,f4]@4 [bb3,f4,bb4]@3 [bb3,eb4,g4]@8 bb3 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4]@9 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 [f3,bb3,d4,f4]@8 f3 [bb3,c4,d4,f4,bb4]@4 [bb3,d4,f4,bb4]@3 [bb3,eb4]@4 [bb3,eb4,f4,bb4]@4 ~ [bb3,d4,f4]@4 [bb3,f4,bb4]@3 [bb3,eb4,g4], ~@15 eb4@9 [f3,d4]@7 ~@9 f3@7 ~@40 f3@5 ~@4, ~@21 bb4@7 ~@19 g4@4 ~@28 g4@9 ~@8]/6", // Bb Eb Gm7 Bb5 Eb Bb Eb5 Fm …
  AJ: "[~@3 [bb3,eb4,f4,bb4]@5 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4]@6 bb3 [bb3,eb4,bb4]@2 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 f4@6 ~@3 [bb3,d4,f4]@4 [bb3,d4,f4]@3 bb3@6 ~@3 [d4,f4]@4 [bb3,d4,f4,bb4]@3 [bb3,eb4,g4], ~@8 f3@7 g4@9 ~@7 [f3,bb3,d4]@9 f3@7 ~@7 bb4@6 ~@4, ~@37 bb4@10 [eb4,g4]@9 f3@7 ~]/4", // Bbsus4 Bb Eb5 Fm Eb Bb Dm Bb …
  AK: "[~@5 [bb3,eb4,g4,bb4]@3 [bb3,d4,f4]@4 [bb3,d4,f4]@3 bb3@6 ~@2 g4 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 ~@8 bb3 bb3@4 bb3@3 [bb3,eb4,g4]@7 [eb4,g4]@2 [d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@6 bb3 [eb4,g4]@2 [d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4]@6 ~ [eb4,bb4]@2 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 ~@9 [bb3,d4,f4]@4 [bb3,d4,f4]@3 [bb3,eb4,g4]@6 [bb3,eb4,g4]@3 [bb3,f4]@4 [bb3,f4,bb4]@3 [bb3,eb4,g4], ~@8 f3@7 [eb4,g4]@7 eb4@2 ~@13 bb4@7 bb4@10 bb4@16 bb4@16 ~@15 bb4@16 bb4@7 ~@4, ~@21 bb3@3 ~@7 [f3,bb3,d4,f4]@9 [f3,d4,f4]@7 ~@7 bb3@6 ~@10 bb3@6 ~@3 g4@9 ~@40, ~@56 f3@7 ~@9 f3@7 ~@6 bb3@3 ~@7 [f3,bb3,d4,f4]@9 ~@16 [f3,d4]@7 ~]/8", // Eb Bb Fm Eb Dm Bb Eb Dm …
  AL: "[~@5 [g4,eb5]@3 [bb3,d4,f4]@4 [bb3,d4,f4,bb4]@3 [bb3,eb4,g4]@8 bb3 [f3,c4,f4,ab4]@4 [bb3,eb4,g4]@3 [f3,d4,f4]@9 ~@8]/3", // Cm Bb Eb Fm Eb Dm
})).s("gm_epiano2").gain(0.3)

// chords · epiano2 · soft notes
const epiano2_soft = note(`<
  ~@10 A B ~@2 C ~ D ~@8 B ~@8 E ~@2 F G ~@2 F G ~@2 H ~@3 I J ~@2 K ~ L ~ K M N ~@3 O P@2 J ~ Q ~@4 R S ~@3 T ~ U I J V
  W@2 ~
>`.pickRestart({
  A: "~ [eb3,eb4]", B: "eb4 ~", C: "~ eb3", D: "c4", E: "~@15 bb3", F: "~@7 bb3", G: "~@11 [eb4,g4]@5",
  H: "g3@7 ~@8 bb3", I: "~@8 f3@7 ~", J: "~@7 bb3 ~@8", K: "~ c4", L: "eb3@8 ~@7 bb3", M: "~@3 bb3 ~@4",
  N: "~@4 bb3@3 bb3 ~@7 eb4, eb3@4 ~@3 c4", O: "~@10 f3@5 ~", P: "[~@7 bb3 ~@7 f3@8 f3@8 ~, ~@23 bb3 ~@8]/2",
  Q: "~@3 g4@5 ~@8", R: "~@7 bb3 ~@8, ~@3 f4 ~@4", S: "~@5 bb3@2 bb3@5 ~@4", T: "~@5 bb3 ~@10", U: "~@3 d4 ~@4",
  V: "~@4 bb3@3 f3@8 ~", W: "[~@15 bb3@9 ~@8]/2",
})).s("gm_epiano2").gain(0.15)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@5 A B C D@2 ~@7 E F G H I J G K L M L N O@2 L P A Q C R S T U V S T U V W@3 X@6 Y@2 Z@7 AA@8 AB@8 AC@8
>`.pickRestart({
  A: "f4@4 f4@3 g4@9", B: "f4@4 bb4@3 g4@9", C: "f4@4 f4@3 ~@7 bb3@2, ~@7 g4@9",
  D: "[gb4@4 f4@3 ~@4 ab4@13 ~@8, ~@7 eb4@17 ~@8]/2", E: "f4@3 ~ f4@3 g4@9", F: "~@4 bb4@3 g4@9, f4",
  G: "f4@4 f4@3 g4@7 bb3@2", H: "gb4@4 f4@3 ~@7 ab4@2, ~@7 eb4@9", I: "eb4@4 eb4@3 f4@8 ~",
  J: "~@7 g4@7 ~@2, f4@7 ~, ~@2 bb4@5 ~", K: "gb4@4 f4@3 eb4@4 ab4@4 ~", L: "c5 bb4", M: "ab4@6 ~ bb3 g4@8, ~@3 c4 ~@4",
  N: "~@6 eb4@9 ~, ab4@15 ~, ~@5 c4@10 ~", O: "[c5@8 ~@8 ab4@6 c4 ~ g4@7 bb3, ~@8 bb4@15 ~@9]/2",
  P: "ab4@5 g4 ~ eb5@9, ~@3 ab4@5", Q: "~@4 bb4@3 g4@9, f4@7 ~@9", R: "gb4@4 f4@3 eb4@7 ~@2",
  S: "f4@3 ~ f4@3 g4@2 ~@5 bb3@2, ~@9 g4@2 bb3@2 eb4@3, ~@5 eb4 g4@2",
  T: "~@4 bb4@3 g4@2 ~@4 eb4@3, f4@7 ~@2 g4@2 bb3@3 ~@2, ~@5 eb4 g4@2",
  U: "f4@4 f4@3 g4@2 ~ eb4@2 ~@2 bb3@2, ~@9 g4@3 g4@4, ~@13 eb4@3", V: "ab4@4 g4@3 f4@9",
  W: "~@6 g3 eb4@9, ~ eb4@2 g3@2 bb3@2 ~@9, ~@2 bb3@2 eb4@3 ~@9",
  X: "[~@6 g3 ~@8 eb5@9 f4@4 f4@3 g4@2 ~ eb4@2 ~@2 bb3@2 ~@4 bb4@3 g4@2 ~ eb4@2 ~@2 bb3@2 f4@4 f4@3 g4@2 ~@6 c4 ab4@4 g4@3 f4@9 c5@8, ~ eb4@2 g3@2 bb3@2 f4@17 ~@9 g4@3 g4@4 f4@7 ~@2 g4@3 g4@4 ~@9 g4@3 g4@4 ~@24, ~@2 bb3@2 eb4@5 eb4@25 ~@3 eb4@3 ~@13 eb4@13 eb4@3 eb4@7 ~@20, ~@11 c5@13 ~@43 bb3@3 bb3@2 ~@24]/6",
  Y: "[~@3 c4 ~@4 g4@3 ~ c5@4, bb4@8 ab4@7 bb3@7 bb3@10, ~@14 c4@2 ~@7 g4@9]/2",
  Z: "[bb4@8 ~@16 c5@8 ~@16 g4@5 ~@3 c5@8 bb4@8 ab4@5 ~@2 eb5@9 f4@4 f4@3 g4@2 ~ eb4@2 ~@8 bb4@3 g4, ~@8 ab4@24 bb4@7 bb3@7 c4@2 ~@6 g4@10 ~@13 g4@11 ~@9 g4@3 g4@4 f4@7 ~, ~@14 eb4@84 ~@3 eb4@11, ~@38 c4@2 ab4@7 bb3@6 bb3@3 ~@22 ab4@10 ~@24]/7",
  AA: "[~@8 f4@4 f4@3 g4@2 ~@11 g4@3 ~@4 bb4@5 d5@4 d5@3 eb5@2 ~@5 g4@2 ~@4 f5@3 eb5@2 ~ bb4@2 ~@2 g4@2 d5@4 d5@3 eb5@2 ~@5 g4@2 ab5@4 g5@3 f5@2 ~ bb4@2 f5@4 d5@4 d5@3 eb5@2 eb5@2 ~@3 g4@2 ~@4 f5@3 eb5, ~ g4@2 bb3@2 eb4@13 eb4@3 ~@10 f4@9 ~@10 bb4@3 bb4@3 ~@26 bb4@3 ~@43, ~@2 eb4@2 g4@4 ~@9 g4@3 g4@4 ab4@7 ~@18 eb5@3 eb5@4 d5@7 ~@2 eb5@3 eb5@4 ~@9 eb5@3 eb5@4 ~@9 f5@3 ~@16 eb5@4 d5@7 ~, ~@6 bb3@13 bb3@3 bb3@9 ~@20 g4@3 ~@29 g4@3 ~@29 g4@3 ~@10]/8",
  AB: "[~ eb5@2 ~@3 g4@2 d5@4 d5@3 eb5@2 eb5@2 ~@9 g5@3 f5@5 ~@4 d5@4 d5@3 eb5@2 ~@3 eb5@2 ~ eb5 ~@4 f5@3 eb5@2 ~@5 g4@2 d5@4 d5@3 eb5@2 eb5@2 ~@3 g4@2 ab5@4 g5@3 f5@2 ~@5 f4@2 f4@4 f4@3 g4@2 g4@3 ~@2 bb3@2 f4@2 ~@2 bb4@3 g4, ~@3 g4@3 ~@13 g4@3 g4@9 ~@7 f4@18 ~@11 g4@3 ~@13 g4@3 ~@30 g4@4 ~@2 f4@4 ~@2, ~@4 eb5@4 ~@12 eb5@4 ab5@7 ~@5 f5@4 ~@9 eb5@2 g4@3 g4@2 ~@10 bb4@3 ~@31 d5@4 ~@19 bb3@2 ~@3, ~@50 bb4@3 ~@3 d5@7 ~@2 eb5@3 eb5@4 ~@12 eb5@4 ~@9 f5@7 ~@24]/8",
  AC: "[~@4 g4@4 f4@4 ~@2 bb4 ~@8 bb4 ab4@4 ~@21 eb5@3 eb5@4 ~@4 f5@3 eb5@2 eb5@2 ~@3 g4@2 d5@4 [d5,f5]@3 eb5@2 eb5@2 ~@3 g4@2 ab5@4 g5@3 f5@32 ~, ~ g4@2 bb3@3 ~@9 g4@6 f4@3 ~@7 f4@4 bb4@9 bb4@6 ~@6 d5@7 ~@5 eb5@4 ~@12 eb5@4 ~@40, ~@2 eb4@3 ~@7 f4@8 eb4@75 ~@33, ~@19 bb3@5 ~@10 d4@6 ~@45 bb4@3 ~@40, ~@22 g4@2 ~@4 g4@12 f4@7 g4@4 ~@16 g4@3 ~@13 g4@3 ~@42]/8", // Dm
})).s("gm_electric_guitar_clean").gain(0.2)

// chords · electric guitar clean · soft notes
const electric_guitar_clean_2 = note(`<
  ~@30 A ~@7 B C ~@2 B C ~@6 D@2 ~ E F ~ G@2 ~@4 H@2 I@8 J K L@2 J@2 M@3 N O J P ~@2
>`.pickRestart({
  A: "~@7 bb3@8 ~", B: "~@7 bb3", C: "~@11 bb3@3 ~@2", D: "~@3 bb3@3 ~@10", E: "~@3 bb4@5 ~@8", F: "~@7 bb3 ~@8",
  G: "[~@13 c4@19]/2", H: "[~@3 bb3@3 bb3@13 ~@13]/2",
  I: "[~@51 g4@2 bb4@3 ~@13 bb4@3 ~@11 f4@2 ~ f4@2 ~@10 bb4@3 bb4@3 ~@10 bb4@3 bb4@3 ~@8, ~@5 eb4@123, ~@85 bb4@3 ~@40]/8",
  J: "~@2 bb4@3 bb4@3 ~@8", K: "~@3 f4@2 bb4@3 ~@8", L: "[~@5 bb4@3 ~@3 bb4@3 ~@7 bb4@2 bb4 ~@8, ~@5 f4@2 f4@5 ~@4]/2",
  M: "[~@3 bb3@2 ~@4 bb3@2 ~@5 bb3@3 ~@3 bb3@9 ~@17, ~@2 eb4@3 eb4@13 ~@3 eb4@15 ~@12, ~@13 bb3@2 ~@33, ~@7 f4@5 ~@12]/3",
  N: "~ c4@7 ~@3 bb3@3 bb3 ~", O: "~@3 g4@2 ~ g4@2 ~@8, ~@2 bb4@3 bb4@10 ~", P: "~@2 bb4@3 ~@11",
})).s("gm_electric_guitar_clean").gain(0.1)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@17 A B@3 C D E F ~@8 A G@6 H@5 I J K L@4 M@8 N O@6 P@6 Q@4 R@8 S ~>".pickRestart({
  A: "[d4,f4]@7 [eb4,g4]@8 ~, bb4@15 ~", // Dm Eb
  B: "[[d4,f4]@2 [eb4,g4]@2 [d4,f4]@2 g4@2 [c4,ab4] g4 [d4,f4]@2, bb4 ~@7 bb4@24 ~@4 bb3@12, ~@8 eb4@5 ~@3]/3", // Dm Eb Dm Fm Dm
  C: "bb4 ~@7 [eb4,g4]@8", D: "f4 [eb4,g4], d4@7 ~@9", E: "[d4,f4] [eb4,g4]",
  F: "[c4,ab4]@4 g4@4 [d4,f4]@7 ~, eb4@7 ~@9, ~@4 bb3@11 ~", // Fm Dm
  G: "[[d4,f4]@2 [eb4,g4]@2 [d4,f4]@2 g4@2 [c4,ab4] g4 ~@4 [eb4,g4]@2 f4@2 [eb4,g4]@2 [d4,f4]@2 [eb4,g4]@2, bb4 ~@7 bb4@24 ~@4 bb3@45 ~@15, ~@24 eb4@15 ~ [d4,f4]@16 ~@8 d4@7 ~@25, ~@48 bb4@17 ~@31]/6", // Dm Eb Dm Fm Eb Dm Eb Dm
  H: "[[c4,ab4]@4 g4@4 ~@16 [eb4,g4]@8 f4@8 [eb4,g4]@8 [d4,f4]@8 [eb4,g4]@8 [c4,ab4]@4 g4@4 [d4,f4]@7 ~, eb4@7 ~ [d4,f4]@16 ~@8 d4@7 ~@25 eb4@7 ~@9, ~@4 bb3@11 ~ bb5@49 ~@3 bb3@11 ~]/5", // Fm Eb Dm Eb Fm Dm
  I: "[bb3,eb4,g4]@6 ~ [bb3,eb4,g4]@8 ~", J: "[bb3,g4]@7 [ab3,db4,f4,ab4]@8 ~, eb4 ~@3",
  K: "[bb3,g4]@6 ~ [bb3,eb4,g4]@8 ~, eb4 ~@15", // Eb
  L: "[~@7 [ab3,db4,f4,ab4]@17 ~@7 eb4@9 ~@16 [d4,f4]@8, bb3@41 ~@23, [eb4,g4]@31 g4@17 [eb4,g4]@16, ~@3 bb5@5, ~@3 [d4,f4]@2 [d4,f4]@2 ~]/4", // Db Dm Eb Dm
  M: "[~@8 [ab4,ab5]@4 g5@3 ~@9 ab4@2 ab4@2 ~@12 ab4@2 ~@14 ab4@2 ~@10 bb4@2 ~@2 ab4@16 c5@2 g5@2 [ab4,f5]@4 [bb4,f5]@3 f5@2 g5@3 ab5@2 [bb4,g5]@2 [ab4,f5]@4 [bb4,g5]@8 ~@2 ab5@2 [ab4,f5]@4, g4@12 g4@16 g4@9 g4@5 g4@6 g4@10 g4@6 g4@64, eb4@10 ~@5 f5 f4@14 f4@14 f4@16 f4@10 f4@58, ~@8 c4 ~@3 bb3@76 ab5 ~ bb4 ~@8 bb4@4 ~ c5 ~@17 c5 ~@5, ~ d4@7]/8", // Ab Db Bb5 Eb Db Eb Db
  N: "[bb4,g5]@3 f5 eb5 d5 ~ bb4 bb5@8, ~@6 c5@2 eb5 ~@7", // Eb
  O: "[~@4 g4@2 ~@8 [ab4,ab5] g5 [d4,f4,f5]@2 ~@2 g4@2 [d4,f4]@2, ~@8 bb5@31 ~ [f4,bb5]@16 f4@8 ~@8 bb5@24, ~ [d4,f4]@2 [d4,f4]@2 d4@3 ~ [d4,f4]@2 ~, ~@4 eb4@4 [eb4,g4]@4 [eb4,g4]@3 [eb4,g4]@5 eb4@4]/6", // Ab Dm Bb5 Dm Eb
  P: "[g4@2 ~@4 [ab4,ab5] g5 [d4,f4,f5]@2 ~@2 g4@2 ~@2 g4@2 ~@2 [eb4,g4]@2 ab4 g4, eb4@4 [eb4,g4]@3 [eb4,g4]@5 eb4@4 eb4@4 ~@2 c4@2, ~ d4@3 ~ bb3@7, ~ [f4,bb5]@2 f4 ~ [d4,f4]@2 [d4,f4]@2 [d4,f4]@3, ~@44 bb4@27 ~ bb4@16 ~@8]/6", // Ab Dm Eb Bb5 Dm
  Q: "[d4@2 ~@10 [eb4,g4]@2 ab4 g4, bb3@27 ~@29 [c4,f4]@8, f4@16 [eb4,g4]@15 [eb4,g4]@17 ~@16, ~@8 bb4@19 ~@13 [f4,bb4]@17 ~@7, ~ d4@2 [d4,f4]@2 d4@3]/4", // Eb F5 Eb Bb5 Dm
  R: "[[d4,f4]@8 ~@24 g4@8 ~@16 [ab4,ab5]@4 g5@4 [d4,f4]@8 ~@8 g4@8 ~@8 g4@8 ~@8 eb4@8 [c4,ab4]@3 ~ [bb3,g4]@4, bb3@26 ~@14 [f4,bb5]@17 ~@7 f5@6 ~@58, ~@8 bb5@31 ~@17 f4@8 ~@8 bb4@18 ~@14 bb4@15 ~ eb4@7 ~, ~ [d4,f4]@2 [d4,f4]@2 d4@3 ~ [d4,f4]@2 [d4,f4]@2 [d4,f4]@3, ~@16 [eb4,g4]@16 eb4@15 [eb4,g4]@13 [eb4,g4]@20 eb4@16 eb4@16 g4@12 ~@4]/8", // Dm Ab Dm Fm Eb Bb5 Dm Eb
  S: "[d4,f4] ~", // Dm
})).s("gm_string_ensemble_2").gain(0.13)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!84 x ~>").gain(0.2)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~ [~@7 x ~@7 x]!84 ~@2>").gain(0.1)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!84 [~ x ~@2] ~>").gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<A ~@16 B ~@3 B ~@11 B ~@3 B ~@3 B ~@45>".pickRestart({
  A: "x!4", B: "x",
})).gain(0.15)

// drums · open hat
const open_hat = s("oh").struct("<~@16 A ~ B ~ C ~ B ~@11 B ~ C ~ B ~@3 B ~@44>".pickRestart({
  A: "~@7 x", B: "~@15 x", C: "~@14 x!2",
})).gain(0.1)

// drums · ride
const ride = s("rd").struct("<~@8 [~@15 x] x ~@77>").gain(0.15)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@24 A ~@8 B@3 ~ B@3 ~ B@3 ~@6 C@3 ~@9 C@3 ~ C@3 ~ C@3 ~ C@3 ~ C@3 ~ C@3 ~@2
>`.pickRestart({
  A: "~@3 x", B: "~@14 x!2", C: "~@6 x!2 ~@8",
})).gain(0.2)

// drums · bongos
const bongos = s("bongo:18").struct("<~@33 A@12 ~@4 B A@3 C ~@7 B A@23 C ~>".pickRestart({
  A: "~ x ~@7 x ~@6", B: "~@9 x ~@6", C: "~ x ~@14",
})).gain(0.52)

// drums · congas
const congas = s("conga:33").struct("<~@33 [~@5 x ~@10]!12 ~@4 [~@13 x ~@2]!4 ~@8 [~@13 x ~@2]!24 ~@2>").gain(0.63)

// drums · shaker
const shaker = s("sh").struct("<~ [x!16]!84 [x!6 ~@10] ~>").gain(0.1)

stack(
  bass, epiano2, epiano2_soft, electric_guitar_clean, electric_guitar_clean_2, string_ensemble_2, kick, kick_soft,
  snare, hihat, open_hat, ride, tambourine, bongos, congas, shaker
)

More by Phil Collins