Strudelify

Both Sides Of The Story

Phil Collins

KeyA♭ majorTempo128 bpm
0:00/0:00
// Both Sides Of The Story — Collins Phil
// 128 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 202 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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 · overdriven guitar
const overdriven_guitar = note(`<
  ~ A B C D A B C D A B C D E F G@3 ~@17 A B C D A B C D H B I D H B I D H B I J H B I J E F K L M N O@2 P@2 Q@2 R S T U
  V@2 W@2 X Y Z AA X Y Z AA X AB AC AA X AB AC AA X AD AC AE X AD AC AE AF AE AG AH AI@2 AJ@2 AK@2 R S T U AL@2 AM@2
  AN@6 ~@22 AO AP AQ AR AO AP AQ AR AO AP AQ AR AO AP AQ AR AO AP AQ AR AO AP AQ AR AO AP AQ AR AO AP AQ AR AO AP AS AR
  AT AP AS AR AT AU@2 AV AT AU@2 AV AT AU@2 AW@2
>`.pickRestart({
  A: "[ab2,eb3,ab3,eb4,bb4,eb5]@21 [ab2,eb3,ab3] ~ [ab2,eb3,ab3]", // Absus2 Ab5
  B: "[ab3,eb4,bb4,eb5] [bb2,eb3,bb3,eb4,bb4,eb5], [ab2,eb3]@5 ~@7", // Absus2 Eb5 Ab5
  C: "[ab2,db3,ab3,eb4,ab4,db5]@21 [ab2,db3,ab3] ~ [ab2,db3,ab3]", D: "[ab2,db3,ab3,eb4,ab4], db5@11 ~",
  E: "[bb2,eb3,eb4,bb4,eb5], bb3@7 ~", F: "[ab2,db3,ab3,eb4,ab4,db5]@23 ~", G: "[[ab2,eb3,ab3,eb4,ab4,eb5]@65 ~@7]/3",
  H: "[ab2,eb3,ab3,eb4,bb4,eb5]@21 [eb3,ab3] ab2 [ab2,eb3,ab3]", // Absus2 Ab5
  I: "[ab2,db3,ab3,eb4,ab4,db5]@21 [db3,ab3] ab2 [ab2,db3,ab3]", J: "~ db5@22 ~, [ab2,db3,ab3,eb4,ab4]",
  K: "~ [eb3,eb4]@23, [bb2,bb4,eb5], [bb3,ab4]@7 ~", L: "~ [eb4,db5]@23, [ab2,db3,ab3,ab4]@23 ~",
  M: "~ ab5@14 ~ [ab3,ab5]@4 ~ eb3 ab2 [ab2,eb3], [ab2,ab4]@7 ~, [ab3,bb4,eb5]@14 ~ [bb4,eb5]@4 ~ [bb4,eb5,ab5]@4, ~ eb3@20 ab3@3", // Ab Ab5 Ab Absus2 Eb5 Ebsus4
  N: "~ [ab2,eb5]@11 [ab2,eb3,ab3,eb5]@12, [bb4,ab5], ab3 ~, eb3@5 ~@7", // Ab5 Bb7
  O: "[~ db3@20 [db3,ab3] ab2 [ab2,db3,ab3] ~ ab2@23, [eb4,ab4]@47 ~, db5@15 ~, [ab2,ab3]@7 ~ [db3,ab3]@8]/2", // Db5 Ab5 Ab Db5
  P: "[~ eb4@21 ab2!2 ~ [ab2,eb4]@11 [ab2,eb3,ab3,eb4,bb4,eb5]@12, [bb4,eb5]@35 ~@13, [ab2,ab3]@7 ~ ab3@4 ~@4, ~ eb3@35 ~@12]/2", // Ab5 Absus2 Eb5 Ab
  Q: "[~ [ab2,db3]@21 [ab2,db3]!2 ~ ab2@23, ab4@7 ~ [db3,ab4]@8, ~ eb4@47, ~ [ab3,db5]@45 ~@2]/2", // Db5
  R: "~ [ab2,eb3,bb4,eb5]@23, ~ [ab3,eb4]@21 ~@2", S: "~ [ab3,eb4,db5]@23, ~ [ab2,db3,ab4]@21 ~@2",
  T: "~ [bb3,g4,eb5]@23, ~ [bb2,eb3,bb4]@21 ~@2", U: "~ [f3,c4,ab4]@23, ~ [f2,c3,f4]@21 ~@2",
  V: "[~ [bb2,f3,bb4]@21 [bb2,f3]!2 ~ bb2@23, ~ f4@47, ~ [bb3,db5]@45 ~@2, ~ [f3,bb4]]/2", // Bb5 Bbm Bb5
  W: "[~ [bb2,eb3,bb4]@21 [bb2,eb3]!2 ~ [bb2,eb3]@23, ~ f4@47, ~ [bb3,eb5]@45 ~@2, ~ bb4]/2", // Eb5
  X: "~ [ab2,eb3,ab3,eb4,bb4,eb5]@21 [ab2,eb3,ab3]!2", // Absus2 Ab5
  Y: "~ [ab3,eb4,eb5]@11 ~ eb5@11, bb4@11 ~@13, ~ [ab2,eb3]@10 ~ [bb2,eb3,bb3,eb4,bb4]@12", // Ab5 Eb5
  Z: "~ [ab2,db3,ab3,eb4,db5]@21 [ab2,db3,ab3]!2, ab4@7 ~", AA: "~ [ab2,db3,ab3,eb4,db5]@23, ab4",
  AB: "~ [ab3,eb4,bb4,eb5]@11 ~ [bb2,eb3,bb4,eb5]@11, ~ [ab2,eb3]@10 ~ [bb3,eb4]@12", // Absus2 Eb5 Ab5 Eb5
  AC: "~ [ab2,db3,ab3,eb4,ab4,db5]@21 [ab2,db3,ab3]!2", // Absus4 Db5
  AD: "~ [ab3,eb4,bb4,eb5]@11 ~ [bb2,eb3,bb3,bb4,eb5]@11, ~ [ab2,eb3]@10 ~ eb4@12", // Absus2 Eb5 Ab5
  AE: "~ [ab2,db3,ab3,eb4,ab4,db5]@23", AF: "~ [bb2,eb3,eb4,bb4,eb5]@23, ~ bb3@21 ~@2",
  AG: "~ [ab3,bb4,eb5,ab5]@15 [ab3,bb4,eb5,ab5]@4 ~@2 [ab2,eb3]!2, ~ [ab2,eb3,ab4]@20 ab3@3, ~@5 [bb4,eb5,ab5]", // Absus2 Ab5 Ebsus4
  AH: "~ [ab3,eb5]@12 [ab2,eb3,ab3,eb5]@11, ~ [bb4,ab5]@23, ~ [ab2,eb3]@10 ~@13", // Ab5 Bb7 Ab5
  AI: "[~ [ab2,db3,ab3]@21 [ab2,db3,ab3]!2 ~ [ab2,db3,ab3]@23, ~ [eb4,ab4]@47, ~ db5@45 ~@2]/2", // Db5 Ab5
  AJ: "[~ [ab2,ab3,eb4]@21 ab2!2 ~ [ab3,eb4]@11 ~ [ab2,eb3,ab3,bb4,eb5]@11, ~ [eb3,bb4,eb5]@35 eb4@12, ~@25 ab2@10 ~@13]/2", // Ab5 Absus2 Eb5
  AK: "[~ [ab2,db3,ab4]@21 [ab2,db3]!2 ~ [ab2,db3,ab4]@23, ~ eb4@47, ~ [ab3,db5]@45 ~@2]/2", // Db5
  AL: "[~ [bb2,f3,bb4]@21 [bb2,f3]!2 ~ [bb2,f3,bb4]@23, ~ f4@47, ~ [bb3,db5]@45 ~@2]/2", // Bb5 Bbm
  AM: "[~ [bb2,eb3,bb4]@21 [bb2,eb3]!2 ~ [bb2,eb3,bb4]@23, ~ f4@47, ~ [bb3,eb5]@45 ~@2]/2", // Eb5
  AN: "[~ [eb3,ab3]@142 ~, ab2@71 ~]/6", AO: "~ [ab2,eb3,ab3,eb4,bb4,eb5]@21 [ab2,eb3,ab3] ~",
  AP: "[ab2,eb3,ab3] [ab3,eb4,bb4,eb5]@12 [bb2,eb3,bb3,eb4,bb4,eb5]@11, ~ [ab2,eb3]@10 ~@13", // Ab5 Absus2 Eb5 Ab5
  AQ: "~ [ab2,db3,ab3,eb4,ab4,db5]@21 [ab2,db3,ab3] ~", AR: "[ab2,db3,ab3] [ab2,db3,ab3,eb4,ab4,db5]@23",
  AS: "~ [ab2,db3,ab3,eb4,ab4,db5]@21 [db3,ab3] ab2", AT: "~ [ab2,eb3,ab3,eb4,bb4,eb5]@21 [eb3,ab3] ab2",
  AU: "[[ab2,eb3,ab3] [ab2,eb5]@24 [ab2,eb5]@21 [eb3,ab3] ab2, ~ [eb3,ab3,eb4,bb4]@44 ~@3]/2", // Ab5 Ebsus4
  AV: "[ab2,eb3,ab3] [ab2,eb3,ab3,eb4,bb4,eb5]@23", // Ab5 Absus2
  AW: "[[ab2,eb3,ab3] ~ [ab2,eb4,eb5]@24 ~@22, ~ [eb3,ab3,bb4]@24 ~@23]/2", // Ab5 Ebsus4
})).s("gm_overdriven_guitar").gain(0.23).pan(0.8)

// bass · fretless bass
const bass = note(`<
  ~ A B C@2 D@2 E@2 F@2 G H I J K@2 L M L M L M L N L M L N O P L M Q R S@2 T@2 U V@3 W@2 X@6 Y Z AA@4 AB AC Q R AD AE
  AF AG AH AI AJ AK@2 AL AM AN AO AP AQ AR AS AT AU@2 AV@2 AW@2 AX@2 AY@2 AZ@2 BA@2 BB@2 BC@2 BD@2 BE@2 BF@2 BG BH BI@2
  BJ BK BL@3 BM@2 BN BO BP BQ AR BR@2 BS BT BU@2 BV@4 BW@2 BX@2 BY@2 BZ@2 CA@2 CB@2 CC@2 CD@2 CE CF CE CF CG@2 CH@2 CI@2
  CJ@2 CK@4 CI@2 CL@2 CG@2 CH@2 CI@2 CJ@2 CK@4 CI@2 CL@2 CG@2 CM@4 CJ@2 CN@4 CI@2 CL@2 ~@5
>`.pickRestart({
  A: "ab1@18 ~@3 ab1@2 ~, ab3@23 ~", B: "eb4@23 ~, ab1@7 ~",
  C: "[ab1@18 ~@3 ab1@2 ~@19 [g3,bb3]@6, ab3@30 ~@3 ab3@8 ~@7, ~@12 ab1@11 ~, ~@36 eb4@11 ~]/2", // Gm
  D: "[ab3@12 eb3@6 ~@3 ab1@2 ~@19 ab2@5 ~, [ab1,eb4]@18 ab3@23 ~@7, ~@12 ab1@11 ~]/2", // Ab5
  E: "[ab1@19 ~@2 ab1@2 ~@19 bb3@6, ab2@23 ~, ~@12 ab1@11 ~, ~@33 bb3@7 ~@8, ~@36 eb4@11 ~]/2",
  F: "[ab1@20 ~ ab1@2 ~@13 ab3@6 eb4@6, [ab2,ab3,eb4]@35 ~ [ab2,eb3]@11 ~, ~@12 ab1@11 ~]/2", // Ab5
  G: "ab1@19 ~@2 ab1@2 ~, [ab2,eb3,ab3]@23 ~", H: "[ab2,ab3,eb4]@23 ~, ab1@7 ~", I: "[eb2,eb3,bb3]@23 ~",
  J: "[db2,db3,ab3]@23 ~", K: "[eb4@11 ~ eb4@6 bb3@6, [ab2,ab3]]/2", L: "ab1@6 ~ ab1", M: "ab1@23 ~",
  N: "~@5 ab2@3, ab1@23 ~", O: "~@5 eb3@3, ab1@23 ~", P: "ab1", Q: "[eb2,bb2,eb3]@23 ~", R: "[db2,ab2,db3]@23 ~",
  S: "[ab1@6 ~ ab1 ~@5 ab2 eb3 ab2, ab2@37 ~@11, ~@24 ab1@23 ~]/2", T: "[~@21 ab1@3 ab1@23 ~, ab1@3 ~@5, ~ ab2@47]/2",
  U: "ab1@6 ~ ab1, ab2",
  V: "[eb3@5 ab2 eb3 ~ ab1@6 ~ ab1 ~@6 ab2@2, ab1@23 ~ eb3@42 ~@6, ~@21 ab2@44 ~@7, ~@48 ab1@23 ~]/3",
  W: "[ab1@18 ~@3 ab1@3 ab1@23 ~, ab2@47 ~, ~@7 eb3@9]/2",
  X: "[ab1@18 ~@3 ab1@3 ~@24 ab1@18 ~@3 ab1@3 ab1@23 ~ ab1@18 ~@3 ab1@3 ~@12 [bb3,eb4]@6 [ab3,eb4]@6, ab2@47 ~ ab2@47 ~ ab2@35 ~@13, ~@24 ab1@23 ~@73 ab1@23 ~, ~@45 eb3@48 ~@2 eb3@37 ~@12]/6", // Eb5 Ab5
  Y: "~ ab3@20 [ab1,eb3]@3, ab1@3 ~", Z: "~ ab2@23, ab1@23 ~",
  AA: "[ab1@18 ~@3 ab1@3 ~@13 eb3@4 ~@50 eb3@2 ab2@3, ab2@23 ~ ab1@23 ~ ab1@23 ~ ab1@24, ~@21 eb3@15 ~@9 eb3@5 ~@46, ~@25 ab2@16 ab2@7 ~ ab2@43 ~@4]/4",
  AB: "~@7 ab1, ab1@3 ~, ~ ab2@23", AC: "[ab1,ab2]@23 ~", AD: "[eb2,bb2,eb3]@19 ~@3 [eb2,eb3]@2, ~@21 bb2@2 ~",
  AE: "~@3 db3, ab2, db3@17 ~@7, ~ db2@23", AF: "~@21 ab1@2 ~, ab1@3 ~, ~ ab2@23",
  AG: "~@7 eb3@5 ~@7 c3@5, ab1@11 ~, ab2 ab3", AH: "db2@19 ~@2 db2@2 ~, db3@23 ~", AI: "[db2,db3]@23 ~",
  AJ: "~ ab2@20 [ab1,eb3]@3, ab1@19 ~@5", AK: "[ab2@12 c3@6 ~ bb2@6 db2@19 ~ db2@2 ~, ab1@23 ~@2 db3@23]/2",
  AL: "db3@3 eb3, db2@23 ~", AM: "~ [ab1,ab2]@23", AN: "~ [db2,db3]@17 [db2,db3]@6", AO: "~ [eb2,eb3]@17 [eb2,eb3]@6",
  AP: "~ [f2,f3]@16 ~ [f2,f3]@6", AQ: "~ bb1@16 ~ [f2,f3]@6, bb2@17 ~@7", AR: "~ [bb1,bb2]@23",
  AS: "~ eb2@22 ~, eb3@23 ~", AT: "~ eb2@23, [eb3,bb3]",
  AU: "[~ ab1@19 ~ ab1@2 ~@16 [ab3,eb4]@9, ~ [eb3,ab3]@37 ~@10, ~@25 ab1@22 ~]/2", // Ab5
  AV: "[ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@9, [eb3,ab3]@19 ~@5, ~@25 ab1@22 ~]/2", // Ab5
  AW: "[~ ab1@20 ab1@2 ~@16 [ab3,eb4]@9, ~ [eb3,ab3]@37 ~@10, ~@25 ab1@23]/2", // Ab5
  AX: "[~ ab1@20 ab1@2 ~@17 eb4@8, [eb3,ab3]@38 ~ ab3@9, ~ ab1]/2", // Ab5
  AY: "[~ ab1@19 ~ ab1@2 ~@16 [ab3,eb4]@9, ~ [eb3,ab3]@37 ~@10, ~@25 ab1@22 ~, ~@3 ab2]/2", // Ab5
  AZ: "[ab1@20 ~ ab1@2 ~@17 eb4@8, [eb3,ab3]@38 ~ ab3@9, ~@25 ab1@22 ~, ~@3 ab2]/2", // Ab5
  BA: "[~ ab1@20 ab1@2 ~@16 [ab3,eb4]@9, ~ [eb3,ab3]@36 ab2@11, ~@25 ab1@23]/2", // Ab5
  BB: "[~ ab1@20 ab1@2 ~@17 eb4@8, [eb3,ab3]@37 ab2@11, ~@25 ab1@23, ~@13 ab3@3]/2", // Ab5
  BC: "[~ ab1@19 ~ ab1@2 ~@17 eb4@8, ~ [eb3,ab3]@37 ~ ab3@9, ~@25 ab1@22 ~, ~@3 ab2]/2", // Ab5
  BD: "[~ ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, [eb3,ab3]@19 ~@5, ~@25 ab1@22 ~, ~@33 ab2@14 ~]/2", // Ab5
  BE: "[~ ab1@20 ab1@2 ~@17 eb4@8, ~ [eb3,ab3]@36 ab2@11, ~@25 ab1@23, ~@13 ab3@3]/2", // Ab5
  BF: "[~ ab1@20 ab1@2 ~@17 [ab3,eb4]@8, [eb3,ab3]@19 ~@5, ~@25 ab1@23, ~@11 ab2@5]/2", BG: "~ [eb2,bb2,eb3]@23",
  BH: "~ [db2,ab2,db3]@23", BI: "[~ ab1@18 ~@2 ab1@3 ~ ab1@23, ~ ab2@47]/2", BJ: "~ db2@19 ~@2 db2@2, ~ db3@23",
  BK: "~ [db2,db3]@23", // Db
  BL: "[~ ab2@21 eb3@3 ab2@12 c3@6 bb2@6 db2@19 ~@2 db2@2, ~ ab1@19 ~@2 ab1@2 ~ ab1@23 ~ db3@23]/3",
  BM: "[~ db3@18 eb3@6 [ab1,ab2]@23, ~ db2@23 ~@24]/2", BN: "~ [db2,db3]@17 ~ [db2,db3]@5",
  BO: "~ [eb2,eb3]@17 ~ [eb2,eb3]@5", BP: "~ [f2,f3]@16 ~@2 [f2,f3]@5", BQ: "~ [bb1,bb2]@17 ~ [f2,f3]@5",
  BR: "~ [eb2,eb3]@23", BS: "~ ab1@18 ~@3 ab1@2", BT: "~@4 c4@9 ~@6 eb4@5, ~ ab1@23, ~@2 eb4@7 ~@3, ~@13 bb3@11",
  BU: "[~ ab1@19 ~@2 ab1@2 ~ ab1@22 ~, ~ [f3,db4]@47]/2", // Db
  BV: "[~ [c4,eb4]@15 bb3@5 ~ ab1@2 ~ bb3@4 ~@4 eb4@4 [g3,bb3]@4 ~@4 eb4@4 f3@9 ~@12 ab1@2 ~ ab1@22 ~, ~ ab1@19 ~ eb4@12 ~@34 f4@29, ~@25 ab1@22 ~@2 ab1@20 ~@27, ~@29 ab3@7 ~@5 ab3@9 ~@8 [ab3,db4]@38]/4", // Cm Gm Db5
  BW: "[~ ab1@19 ~@2 ab1@2 ~@7 ab2@17, ~ [ab3,eb4]@47, ~@25 ab1@21 ~@2]/2", // Ab5
  BX: "[~ ab1@19 ~@2 ab1@2 ~ ab1@21 ~@2, ~ [ab3,eb4]@35 ~@12]/2", // Ab5
  BY: "[~ ab1@19 ~@2 ab1@2 ~@7 bb3@6 ab3@11, ~ eb4@47, ~ ab3@29 ~@18, ~@25 ab1@22 ~]/2",
  BZ: "[~ ab1@19 ~@2 ab1@2 ~ ab1@21 ~@2, ~ [f3,db4]@47]/2", // Db
  CA: "[~ ab1@19 ~@2 ab1@2 ~@13 bb3@11, ~ eb4@47, ~ ab3@36 ~@11, ~@25 ab1@21 ~@2]/2",
  CB: "[~@22 ab1@2 ~ ab1@21 eb3@2, ~ eb4@47, ~ ab1@18 ab2@29, ~@10 ab3@11 ~@4 ab3@23]/2",
  CC: "[~ ab1@19 ~@2 ab1@2 ~ ab1@21 ~@2, ~ [eb3,c4]@46 ~]/2", // Cm
  CD: "[~ f3@20 ab1@2 ~@2 [ab1,f3]@22 ~, ~ db4@47, ~ ab1@18 ~@29]/2", CE: "~ [eb2,eb3,bb3]@23",
  CF: "~ [db2,db3,ab3]@23", CG: "[~ ab1@19 ~@2 ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@36 ab2@11, ~@25 ab1@22 ~]/2",
  CH: "[~ ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@38 ~@9, ~@25 ab1@22 ~, ~@3 ab2]/2", // Ab5
  CI: "[~ ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@36 ab2@11, ~@25 ab1@23]/2", // Ab5
  CJ: "[~ ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@38 ~@9, ~@25 ab1@23, ~@37 ab2@11]/2", // Ab5
  CK: "[~ ab1@19 ~@2 ab1@2 ~@16 [ab3,eb4]@9 ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@36 ab2@13 ~@23 ab1@22 ~, ~@25 ab1@22 ~@2 [eb3,ab3]@38 ~@9, ~@41 ab2@7]/4", // Ab5
  CL: "[~ ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@38 ~@9, ~@25 ab1@23, ~@17 ab2@7]/2", // Ab5
  CM: "[~ ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@9 ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@38 ~@10 [eb3,ab3]@37 ~@10, ~@25 ab1@22 ~@26 ab1@23, ~@37 ab2@13 ~@35 ab2@11]/4", // Ab5
  CN: "[~ ab1@19 ~@2 ab1@2 ~@16 [ab3,eb4]@9 ab1@20 ~ ab1@2 ~@16 [ab3,eb4]@8, ~ [eb3,ab3]@36 ab2@13 ~@24 ab1@22, ~@25 ab1@22 ~@2 [eb3,ab3]@38 ~@9, ~@41 ab2@7]/4", // Ab5
})).s("gm_fretless_bass").gain(0.35)

// chords · pad warm
const pad_warm = note(`<
  ~@16 A@3 B@2 C@2 B@2 C@2 B@2 C@2 B@2 D E C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 D E D E C@2 B@2 F@2 B@2 G E D
  H I@2 J@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 D K L@8 M K N O P@8 Q@8 R@8 S@5 K T U V@40 W@8 ~@5
>`.pickRestart({
  A: "[c5@5 g4, [eb4,bb4,eb5]]/3", B: "[db4,f4,ab4,db5]/2", C: "[c5@3 g4, [eb4,bb4,eb5]]/2", D: "[eb4,g4,bb4,eb5]",
  E: "[db4,f4,ab4,db5]", F: "[eb4,bb4,c5,eb5]/2", G: "[eb4,bb4,c5,eb5]", H: "[c4,f4,ab4,c5]", I: "[db4,f4,bb4,db5]/2",
  J: "[eb4,g4,bb4,eb5]/2", K: "~ [db4,f4,ab4,db5]@23",
  L: "[~ c5@36 g4@12 [db4,f4,ab4,db5]@48 [eb4,bb4,c5,eb5]@48 [db4,f4,ab4,db5]@47, ~ [eb4,bb4,eb5]@48 ~@143]/8", // Db Cm7 Db Eb5
  M: "~ [eb4,bb4,c5,eb5]@23", N: "~ [eb4,g4,bb4,eb5]@23", O: "~ [c4,f4,ab4,c5]@23",
  P: "[~ [db4,f4,bb4,db5]@48 [eb4,g4,bb4,eb5]@48 c5@36 g4@12 [db4,f4,ab4,db5]@47, ~@97 [eb4,bb4,eb5]@48 ~@47]/8", // Bbm Eb Db Eb5
  Q: "[~@19 ab5@18 g4@12 [db4,f4,ab4,db5]@48 c5@36 g4@12 [db4,f4,ab4,db5]@47, ~ [eb4,bb4,eb5]@48 ~@48 [eb4,bb4,eb5]@48 ~@47, ~ c5@36 ~@155]/8", // Db Eb5
  R: "[~ c5@36 g4@12 [db4,f4,ab4,db5]@48 c5@36 g4@12 [db4,f4,ab4,db5]@47, ~ [eb4,bb4,eb5]@48 ~@48 [eb4,bb4,eb5]@48 ~@47]/8", // Db Eb5
  S: "[~ c5@42 g4@6 [db4,f4,ab4,db5]@48 [eb4,g4,bb4,eb5]@23, ~ [eb4,bb4,eb5]@48 ~@71]/5", T: "~ [eb4,g4,bb4]@23",
  U: "~ [db4,f4,ab4]@23", // Db
  V: "[~ c5@36 g4@12 [db4,f4,ab4,db5]@48 c5@36 g4@12 [db4,f4,ab4,db5]@47, ~ eb5@96 eb5@95, ~ [eb4,bb4]@48 ~@48 [eb4,bb4]@48 ~@47]/8", // Db Eb5
  W: "[~ [eb4,ab4,bb4,c5,eb5]@191]/8", // Ab
})).s("gm_pad_warm").gain(0.26)

// other · bagpipe
const bagpipe = note("<~@79 A@2 B@6 C D@7 C E@7 C F@3 ~@42 G@2 H@6 C I@7 C J@7 C K@7 C K@7 C L@7 C M@3 ~>".pickRestart({
  A: "[~ eb5@20 bb4@2 ~ eb5@22 bb4 ab4, ~@23 c5@2 ~@23]/2",
  B: "[~ bb4@17 eb5@18 ~ bb4 eb5@4 bb4 eb5@29 bb4 eb5@12 bb4 eb5@29 ab4@11 bb4 eb5@5 ab4 eb5@5 ab4 eb5@3 c5 ~]/6",
  C: "db5 eb5@23",
  D: "[bb4@2 eb5@11 ab4 eb5@23 ab4@24 bb4 eb5@4 bb4 eb5@29 bb4 eb5@12 bb4 eb5@29 ab4@11 bb4 eb5@5 ab4 eb5@5 ab4 eb5@3 c5 ~]/7",
  E: "[bb4@2 eb5@11 ab4 eb5@23 ab4@24 bb4 eb5@4 bb4 eb5@29 bb4 eb5@12 bb4 eb5@29 ab4@11 bb4 ~ eb5@4 ab4 eb5@5 ab4 eb5@3 c5 ~]/7",
  F: "[~@2 eb5@11 ab4 eb5@53 ab4@5, ~ bb4@2 ~@69]/3", G: "[~ eb5@21 ~ c5@2 eb5@21 bb4 ~, ~@11 bb4 ~@12]/2",
  H: "[ab4 bb4@18 eb5@18 bb4 eb5@4 bb4 eb5@30 bb4 eb5@11 bb4 eb5@29 ab4@12 bb4 eb5@5 ab4 eb5@5 eb5@4 c5, ~@139 ab4 ~@4]/6",
  I: "[~@2 eb5@11 ~ ab4 eb5@22 ab4@24 bb4 eb5@4 bb4 eb5@30 bb4 eb5@11 bb4 eb5@29 ab4@12 bb4 eb5@5 ab4 eb5@5 ab4 eb5@3 c5, ~ bb4@2 ~@165]/7",
  J: "[~@2 eb5@11 ~ ab4 eb5@22 ab4@24 bb4 eb5@4 bb4 eb5@30 bb4 eb5@12 eb5@29 ab4@12 bb4 eb5@5 ab4 eb5@5 ab4 eb5@3 c5, ~ bb4@2 ~@107 bb4 ~@57]/7",
  K: "[~ bb4@2 eb5@11 ab4 eb5@22 ab4@24 bb4 eb5@4 ~ eb5@30 bb4 eb5@12 bb4 eb5@28 ab4@12 bb4 eb5@5 ab4 eb5@5 ab4 eb5@3 c5, ~@67 bb4 ~@100]/7",
  L: "[~ bb4@2 eb5@11 ab4 eb5@22 ab4@24 ~ eb5@4 ~ eb5@30 bb4 eb5@12 bb4 eb5@28 ab4@12 bb4 eb5@5 ab4 eb5@5 ab4 eb5@3 c5, ~@62 bb4 ~@4 bb4 ~@100]/7",
  M: "[~ bb4@2 eb5@11 ab4 eb5@22 ab4@24 ~ bb4 eb5@4 bb4 eb5@4]/3",
})).s("gm_bagpipe").gain(0.09)

// other · synth drum
const synth_drum = note(`<
  ~ A B A B A B A B A B A B A B A C D C D C D C D C D C D C D C D C D C E C E C E C E C E C E C E C E C F C F C F C F C
  F C F C F C F C F C G H G H G H G H I H I H I H I H I H I J I J I J I J I J I J I J I J I K I K I K I K I K L K L K L
  K L K L K L K L K L K L K L K L K L K L M L M L M L M L M L M L M L M L M L N O N O N O N O N O N O N O N O N P N P N
  P N P N P N P N P N P N P N Q N Q N Q N Q N Q N ~
>`.pickRestart({
  A: "d2 ~@8 d2!2 ~ e3@2 ~@4 e3!2 ~ ab3 ~@2", B: "d2@2 ~@15 d2 e3!2 ~ d2 ~@2", C: "d2@2 ~@15 d2 e3 ~ e3 d2 ~@2",
  D: "d2 ~@8 d2!2 ~ e3@2 ~@4 e3 ~ e3 ab3 ~@2", E: "d2 ~@8 d2 ~ d2 e3@2 ~@4 e3 ~ e3 ab3 ~@2",
  F: "d2 ~@9 d2!2 e3@2 ~@4 e3 ~ e3 ab3 ~@2", G: "~ d2 ~@8 d2!2 ~ e3@2 ~@3 e3 ~ e3 ab3 ~@2",
  H: "d2@2 ~@15 d2 ~ e3!2 d2 ~@2", I: "~ d2 ~@8 d2!2 ~ e3@2 ~@4 e3!2 ab3 ~@2", J: "~ d2@2 ~@14 d2 ~ e3!2 d2 ~@2",
  K: "~ d2@2 ~@14 d2 ~ e3!2 ~ d2 ~", L: "~ d2 ~@8 d2!2 ~ e3@2 ~@4 e3!2 ~ ab3 ~", M: "~ d2@2 ~@15 d2 e3!2 ~ d2 ~",
  N: "~ d2@2 ~@15 d2 e3 ~ e3 d2 ~", O: "~ d2 ~@8 d2!2 ~ e3@2 ~@4 e3 ~ e3 ab3 ~",
  P: "~ d2 ~@8 d2 ~ d2 e3@2 ~@4 e3 ~ e3 ab3 ~", Q: "~ d2 ~@9 d2!2 e3@2 ~@4 e3 ~ e3 ab3 ~",
})).s("gm_synth_drum").gain(0.22).pan(0.3)

// other · taiko drum
const taiko_drum = note(`<
  ~ A B A B A B A B A B A B A B A C D C D C D C D C D C D C D C D C D C E C E C E C E C E C E C E C E C F C F C F C F C
  F C F C F C F C F C G H G H G H G H I H I H I H I H I H I J I J I J I J I J I J I J I J I K I K I K I K I K L K L K L
  K L K L K L K L K L K L K L K L K L K L M L M L M L M L M L M L M L M L M L N O N O N O N O N O N O N O N O N P N P N
  P N P N P N P N P N P N P N Q N Q N Q N Q N Q N ~
>`.pickRestart({
  A: "g4 ~@8 g4!2 ~ a5@2 ~@4 a5!2 ~ c6 ~@2", B: "g4@2 ~@15 g4 a5!2 ~ g4 ~@2", C: "g4@2 ~@15 g4 a5 ~ a5 g4 ~@2",
  D: "g4 ~@8 g4!2 ~ a5@2 ~@4 a5 ~ a5 c6 ~@2", E: "g4 ~@8 g4 ~ g4 a5@2 ~@4 a5 ~ a5 c6 ~@2",
  F: "g4 ~@9 g4!2 a5@2 ~@4 a5 ~ a5 c6 ~@2", G: "~ g4 ~@8 g4!2 ~ a5@2 ~@3 a5 ~ a5 c6 ~@2",
  H: "g4@2 ~@15 g4 ~ a5!2 g4 ~@2", I: "~ g4 ~@8 g4!2 ~ a5@2 ~@4 a5!2 c6 ~@2", J: "~ g4@2 ~@14 g4 ~ a5!2 g4 ~@2",
  K: "~ g4@2 ~@14 g4 ~ a5!2 ~ g4 ~", L: "~ g4 ~@8 g4!2 ~ a5@2 ~@4 a5!2 ~ c6 ~", M: "~ g4@2 ~@15 g4 a5!2 ~ g4 ~",
  N: "~ g4@2 ~@15 g4 a5 ~ a5 g4 ~", O: "~ g4 ~@8 g4!2 ~ a5@2 ~@4 a5 ~ a5 c6 ~",
  P: "~ g4 ~@8 g4 ~ g4 a5@2 ~@4 a5 ~ a5 c6 ~", Q: "~ g4 ~@9 g4!2 a5@2 ~@4 a5 ~ a5 c6 ~",
})).s("gm_taiko_drum").gain(0.3).pan(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C B C B C B C B
  C B C B C B C B C D E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E
  F E F ~@28 E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F G F G F G F G F G F ~
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@6 x", C: "x ~@4 x!2 ~@4 x", D: "x ~@10 x", E: "~ x ~@8 x ~@2 x ~@8 x ~",
  F: "~ x ~@20 x ~", G: "~ x ~@9 x ~ x ~@9 x",
})).gain(0.25)

// drums · snare
// … 45 more lines

More by Phil Collins