Strudelify

the drift

Blackmill

KeyD♭ majorTempo78 bpm
0:00/0:00
// the drift — Blackmill
// 78.1 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 4 "Viola" named as a string part, played on viola (its piano patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/3440451; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 65 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(78.1/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 · viola
const viola = note(`<
  ~@4 A B C D A B C D A B C D E F G H I J K H L M N O P Q R S I J K H I J K H ~@8 T U V W T U V X Y@5 Z@4
>`.pickRestart({
  A: "~ ab2 db3 ab3 db4 e4 eb4 e4 ab3 e4 eb4 e4 gb4 eb4 e4 eb4",
  B: "~ ab2 db3 ab3 db4 e4 eb4 e4 db4 e4 eb4 e4 gb4 e4 eb4 gb4",
  C: "~ db3 gb3 db4 e4 gb4 eb4 e4 eb4 db4 e4 eb4 e4!2 db4 eb4",
  D: "e4 eb4 e4 db4 e4 eb4 e4 gb4 ab4 eb4 gb4 e4 ab4 b4 db5 ab4",
  E: "ab3 ~@2 ab4 db5 e5 eb5 e5 ab4 e5 eb5 e5 gb5 eb5 e5 eb5, db3, db4 db4@7, ~ ab3@15",
  F: "ab3 ~ db4 ab4 db5 e5 eb5 e5 db5 e5 eb5 e5 gb5 e5 eb5 gb5, [e3,e4], ~ ab3@15", // E
  G: "~@3 db4@3 gb4@3 db5@3 e5@3 gb5@3 eb5@3 ~ e5@3 eb5@3 db5@3 e5@3 eb5@3 e5@3 e5@3 db5@3 eb5@2, [gb2,db3,gb3]", // Gb5
  H: "~ e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 ab5@3 eb5@3 gb5@3 e5@3 ab5@3 b5@3 db6@3 ab5@2, ~ [a2,e3,a3]@24 [b2,b3]@12 [db3,db4]@11", // A5 B Db
  I: "~ ab3@3 ~@6 ab4@3 db5@3 e5@3 eb5@3 e5@3 ab4@3 e5@3 eb5@3 e5@3 gb5@3 eb5@3 e5@3 eb5@2, ~ db3@47, ~ db4@6 db4@41, ~ ab3@11",
  J: "~ ab3@3 ~@3 db4@3 ab4@3 db5@3 e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 e5@3 eb5@3 gb5@2, ~ [e3,e4]@47, ~ ab3@11", // E
  K: "~@4 db4@3 gb4@3 db5@3 e5@3 gb5@3 eb5@3 e5@3 eb5@3 db5@3 e5@3 eb5@3 e5@3 e5@3 db5@3 eb5@2, ~ [gb2,db3,gb3]@47", // Gb5
  L: "~@4 ab3@3 db3@3 ab3@3 db4@3 e4@3 eb4@3 e4@3 ab3@3 e4@3 eb4@3 e4@3 gb4@3 eb4@3 e4@3 eb4@2, ~ [db2,ab2]@47, ~ db3@6 ~@41", // Db5
  M: "~@4 ab3@3 db3@3 ab3@3 db4@3 e4@3 eb4@3 e4@3 db4@3 e4@3 eb4@3 e4@3 gb4@3 e4@3 eb4@3 gb4@2, ~ [e2,ab2,e3]@47", // E
  N: "~@4 db4@3 gb3@3 db4@3 e4@3 gb4@3 eb4@3 e4@3 eb4@3 db4@3 e4@3 eb4@3 e4@3 e4@3 db4@3 eb4@2, ~ [gb2,db3]@47, ~ gb3@6 ~@41", // Gb5
  O: "~ e4@3 eb4@3 e4@3 db4@3 e4@3 eb4@3 e4@3 gb4@3 ab4@3 eb4@3 gb4@3 e4@3 ab4@3 b4@3 db5@3 ab4@2, ~ [a2,e3,a3]@24 [b2,b3]@12 [db3,db4]@11", // A5 B Db
  P: "~@4 ab3@3 [db3,db4]@3 [ab3,ab4]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [ab3,ab4]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [eb4,e5]@3 [e4,eb5]@3 [eb4,e5]@2, ~ [db2,ab2]@47, ~ db3@6 ~@41", // Db Ab Db E Eb E Ab E …
  Q: "~@4 ab3@3 [db3,db4]@3 [ab3,ab4]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [e4,e5]@3 [eb4,eb5]@3 [gb4,e5]@2, ~ [e2,ab2,e3]@47", // Db Ab Db E Eb E Db E …
  R: "~@4 db4@3 [gb3,gb4]@3 [db4,db5]@3 [e4,e5]@3 [gb4,gb5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [e4,e5]@3 [db4,db5]@3 [eb4,eb5]@2, ~ [gb2,db3]@47, ~ gb3@6 ~@41", // Gb Db E Gb Eb E Eb Db …
  S: "~ [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [ab4,ab5]@3 [eb4,eb5]@3 [gb4,gb5]@3 [e4,e5]@3 [ab4,ab5]@3 [b4,b5]@3 [db5,db6]@3 [ab4,ab5]@2, ~ [a2,e3,a3]@24 [b2,b3]@12 [db3,db4]@11", // E Eb E Db E Eb E Gb …
  T: "~@4 ab2@3 db3@3 ab3@3 db4@3 e4@3 eb4@3 e4@3 ab3@3 e4@3 eb4@3 e4@3 gb4@3 eb4@3 e4@3 eb4@2",
  U: "~@4 ab2@3 db3@3 ab3@3 db4@3 e4@3 eb4@3 e4@3 db4@3 e4@3 eb4@3 e4@3 gb4@3 e4@3 eb4@3 gb4@2",
  V: "~@4 db3@3 gb3@3 db4@3 e4@3 gb4@3 eb4@3 e4@3 eb4@3 db4@3 e4@3 eb4@3 e4@3 e4@3 db4@3 eb4@2",
  W: "~ e4@3 eb4@3 e4@3 db4@3 e4@3 eb4@3 e4@3 gb4@3 ab4@3 eb4@3 gb4@3 e4@3 ab4@3 b4@3 db5@3 ab4@2",
  X: "~ e4@3 eb4@3 e4@3 ~ db4@3 e4@3 eb4@3 e4@3 gb4@3 ab4@3 eb4@3 gb4@3 e4@3 ab4@3 b4@3 db5@3 ab4",
  Y: "[~@2 ab3@3 ab2@3 db3@3 [ab3,ab4]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [ab3,ab4]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5]@3 ab3@3 ab2@3 [db3,db4]@3 [ab3,ab4]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [e4,e5]@3 [eb4,eb5]@3 [gb4,gb5]@3 db3@3 [db3,db4]@3 [gb3,gb4]@3 [db4,db5]@3 [e4,e5]@3 [gb4,gb5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [e4,e5]@3 [db4,db5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [ab4,ab5]@3 [eb4,eb5]@3 [gb4,gb5]@3 [e4,e5]@3 [ab4,ab5]@3 [b4,b5]@3 [db5,db6]@3 [ab4,ab5]@3 ab3@3 ab2@3 db3@3 [ab3,ab4]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [ab3,ab4]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5], ~@2 [db3,db4]@6 db4@6 ~@36 e4@15 ~@135 db4@6 ~@34, ~@5 ab3@6 ~@39 e3@48 gb2@48 [a2,e3,a3]@24 [b2,b3]@12 [db3,db4]@12 [db3,db4]@6 ~@40, ~@53 ab3@6 ~@39 gb3@6 ~@93 ab3@6 ~@37]/5", // Ab Db E Eb E Ab E Eb …
  Z: "[~@2 ab3@3 ab2@3 [db3,db4]@3 [ab3,ab4]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [e4,e5]@3 [eb4,eb5]@3 [gb4,gb5]@3 db3@3 [db3,db4]@3 [gb3,gb4]@3 [db4,db5]@3 [e4,e5]@3 [gb4,gb5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [e4,e5]@3 [db4,db5]@3 [eb4,eb5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [db4,db5]@3 [e4,e5]@3 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@3 [ab4,ab5]@3 [eb4,eb5]@3 [gb4,gb5]@3 [e4,e5]@3 [ab4,ab5]@3 [b4,b5]@3 [db5,db6]@3 [ab4,ab5]@3 ~@46, ~ e3@24 gb2@24 [a2,e3,a3]@12 [b2,b3]@6 [db3,db4]@6 ~@23, ~@2 e4@15 ~@175, ~@5 ab3@6 ~@39 gb3@6 ~@136]/4", // Db Ab Db E Eb E Db E …
})).s("gm_viola").gain(0.3)

// other · string ensemble 1 · "Violas"
const string_ensemble_1 = note("<A B C D A B C E F B C D F B C E ~@32 G H I J G H I K L M N O L M N P ~>".pickRestart({
  A: "db4@12 ~@18 db4@2 ~ db4@2 ~ db4@4 ~@2 db4@4 ~@2", B: "e4@8 ~@22 e4@2 ~ e4@2 ~ e4@4 ~@2 e4@4 ~@2",
  C: "gb4@8 ~@22 gb4@2 ~ gb4@2 ~ gb4@4 ~@2 gb4@4 ~@2", D: "a4@2 ~@4 b4@2 ~ db5@2 ~",
  E: "a4@8 ~@16 b4@2 ~ b4@3 b4@6 db5@2 ~ db5@3 db5@6", F: "db4@8 ~@22 db4@2 ~ db4@2 ~ db4@4 ~@2 db4@4 ~@2",
  G: "~ db4@8 ~@22 db4@2 ~ db4@2 ~ db4@4 ~@2 db4@4 ~", H: "~ e4@8 ~@22 e4@2 ~ e4@2 ~ e4@4 ~@2 e4@4 ~",
  I: "~ gb4@8 ~@22 gb4@2 ~ gb4@2 ~ gb4@4 ~@2 gb4@4 ~", J: "~ a4@8 ~@16 b4@8 ~@4 db5@8 ~@3",
  K: "~ a4@8 ~@17 b4@2 ~ b4@3 b4@6 db5@2 ~ db5@3 db5@4", L: "~@2 db4@8 ~@22 db4@2 ~ db4@2 ~ db4@4 ~@2 db4@4",
  M: "~@2 e4@8 ~@22 e4@2 ~ e4@2 ~ e4@4 ~@2 e4@4", N: "~@2 gb4@8 ~@22 gb4@2 ~ gb4@2 ~ gb4@4 ~@2 gb4@4",
  O: "~@2 a4@8 ~@16 b4@8 ~@4 db5@9 ~", P: "~@2 a4@8 ~@16 b4@2 ~ b4@3 b4@6 db5@2 ~ db5@3 db5@4",
})).s("gm_string_ensemble_1").gain(0.3)

// other · cello · "Violoncello"
const cello = note(`<
  A B C D A B C E F B C D F B C E A B G H I J K H ~@8 I J K H I J K H L M N O L M N O P J K H P J K Q R S T U R S T V ~
>`.pickRestart({
  A: "db3@12 ~@18 db3@2 ~ db3@2 ~ db3@4 ~@2 db3@4 ~@2", B: "e3@8 ~@22 e3@2 ~ e3@2 ~ e3@4 ~@2 e3@4 ~@2",
  C: "gb3@8 ~@22 gb3@2 ~ gb3@2 ~ gb3@4 ~@2 gb3@4 ~@2", D: "a3@2 ~@4 b3@2 ~ db4@2 ~",
  E: "a3@8 ~@16 b3@2 ~ b3@3 b3@6 db4@2 ~ db4@3 db4@6", F: "db3@8 ~@22 db3@2 ~ db3@2 ~ db3@4 ~@2 db3@4 ~@2",
  G: "gb3@8 ~@23 gb3@2 ~ gb3@2 ~ gb3@4 ~@2 gb3@4 ~", H: "~ a3@8 ~@16 b3@8 ~@4 db4@8 ~@3",
  I: "~ db3@12 ~@18 db3@2 ~ db3@2 ~ db3@4 ~@2 db3@4 ~", J: "~ e3@8 ~@22 e3@2 ~ e3@2 ~ e3@4 ~@2 e3@4 ~",
  K: "~ gb3@8 ~@22 gb3@2 ~ gb3@2 ~ gb3@4 ~@2 gb3@4 ~",
  L: "~ db3@3 db3@3 db3@6 db3@6 db3@6 db3@6 db3@3 db3@3 db3@6 db3@3 db3@2",
  M: "~ e3@3 e3@3 e3@6 e3@6 e3@6 e3@6 e3@3 e3@3 e3@6 e3@3 e3@2",
  N: "~ gb3@3 gb3@3 gb3@6 gb3@6 gb3@6 gb3@6 gb3@3 gb3@3 gb3@6 gb3@3 gb3@2",
  O: "~ a3@3 a3@3 a3@6 a3@6 a3@6 b3@3 b3@3 b3@6 db4@3 db4@3 db4@5", P: "~ db3@8 ~@22 db3@2 ~ db3@2 ~ db3@4 ~@2 db3@4 ~",
  Q: "~ a3@8 ~@17 b3@2 ~ b3@3 b3@6 db4@2 ~ db4@3 db4@4", R: "~@2 db3@8 ~@22 db3@2 ~ db3@2 ~ db3@4 ~@2 db3@4",
  S: "~@2 e3@8 ~@22 e3@2 ~ e3@2 ~ e3@4 ~@2 e3@4", T: "~@2 gb3@8 ~@22 gb3@2 ~ gb3@2 ~ gb3@4 ~@2 gb3@4",
  U: "~@2 a3@8 ~@16 b3@8 ~@4 db4@9 ~", V: "~@2 a3@8 ~@16 b3@2 ~ b3@3 b3@6 db4@2 ~ db4@3 db4@4",
})).s("gm_cello").gain(0.25)

// bass · contrabass
const bass = note(`<
  A B C D E F G H I B C D I B C H E F J K L M N K ~@8 L M N K L M N K O P Q R O P Q R S T U V S T U W X Y Z AA X Y Z AB
  ~
>`.pickRestart({
  A: "db2@12 ~@18 db2@2 ~ db2@2 ~ db2@4 ~@2 db2@4 ~@2", B: "e2@8 ~@22 e2@2 ~ e2@2 ~ e2@4 ~@2 e2@4 ~@2",
  C: "gb2@8 ~@22 gb2@2 ~ gb2@2 ~ gb2@4 ~@2 gb2@4 ~@2", D: "a2@2 ~@4 b2@2 ~ db3@2 ~",
  E: "db1@12 ~@18 db1@2 ~ db1@2 ~ db1@4 ~@2 db1@4 ~@2", F: "e1@8 ~@22 e1@2 ~ e1@2 ~ e1@4 ~@2 e1@4 ~@2",
  G: "gb1@8 ~@22 gb1@2 ~ gb1@2 ~ gb1@4 ~@2 gb1@4 ~@2", H: "a1@8 ~@16 b1@2 ~ b1@3 b1@6 db2@2 ~ db2@3 db2@6",
  I: "db2@8 ~@22 db2@2 ~ db2@2 ~ db2@4 ~@2 db2@4 ~@2", J: "gb1@8 ~@23 gb1@2 ~ gb1@2 ~ gb1@4 ~@2 gb1@4 ~",
  K: "~ a1@8 ~@16 b1@8 ~@4 db2@8 ~@3", L: "~ db1@12 ~@18 db1@2 ~ db1@2 ~ db1@4 ~@2 db1@4 ~",
  M: "~ e1@8 ~@22 e1@2 ~ e1@2 ~ e1@4 ~@2 e1@4 ~", N: "~ gb1@8 ~@22 gb1@2 ~ gb1@2 ~ gb1@4 ~@2 gb1@4 ~",
  O: "~ db2@3 db2@3 db2@6 db2@6 db2@6 db2@6 db2@3 db2@3 db2@6 db2@3 db2@2",
  P: "~ e2@3 e2@3 e2@6 e2@6 e2@6 e2@6 e2@3 e2@3 e2@6 e2@3 e2@2",
  Q: "~ gb2@3 gb2@3 gb2@6 gb2@6 gb2@6 gb2@6 gb2@3 gb2@3 gb2@6 gb2@3 gb2@2",
  R: "~ a2@3 a2@3 a2@6 a2@6 a2@6 b2@3 b2@3 b2@6 db3@3 db3@3 db3@5", S: "~ db2@8 ~@22 db2@2 ~ db2@2 ~ db2@4 ~@2 db2@4 ~",
  T: "~ e2@8 ~@22 e2@2 ~ e2@2 ~ e2@4 ~@2 e2@4 ~", U: "~ gb2@8 ~@22 gb2@2 ~ gb2@2 ~ gb2@4 ~@2 gb2@4 ~",
  V: "~ a2@8 ~@16 b2@8 ~@4 db3@8 ~@3", W: "~ a1@8 ~@17 b1@2 ~ b1@3 b1@6 db2@2 ~ db2@3 db2@4",
  X: "~@2 db2@8 ~@22 db2@2 ~ db2@2 ~ db2@4 ~@2 db2@4", Y: "~@2 e2@8 ~@22 e2@2 ~ e2@2 ~ e2@4 ~@2 e2@4",
  Z: "~@2 gb2@8 ~@22 gb2@2 ~ gb2@2 ~ gb2@4 ~@2 gb2@4", AA: "~@2 a2@8 ~@16 b2@8 ~@4 db3@9 ~",
  AB: "~@2 a1@8 ~@16 b1@2 ~ b1@3 b1@6 db2@2 ~ db2@3 db2@4",
})).s("gm_contrabass").gain(0.3)

// chords · orchestral harp · "Harp"
const orchestral_harp = note(`<
  A B C D A B C E A B C D A B C E F G H I J K L I ~@8 J K L I J K L I ~@8 M N O P M N O Q R ~@3 R ~@4
>`.pickRestart({
  A: "~@30 [db2,db4]@2 ~ [db2,db4]@2 ~ [db2,db4]@4 ~@2 [db2,db4]@4 ~@2", // Db
  B: "[e2,e4]@8 ~@22 [e2,e4]@2 ~ [e2,e4]@2 ~ [e2,e4]@4 ~@2 [e2,e4]@4 ~@2", // E
  C: "[gb2,gb4]@8 ~@22 [gb2,gb4]@2 ~ [gb2,gb4]@2 ~ [gb2,gb4]@4 ~@2 [gb2,gb4]@4 ~@2", // Gb
  D: "[a2,a4]@2 ~@4 [b2,b4]@2 ~ [db3,db5]@2 ~", E: "[a2,a4]@4 ~@8 [b2,b4] ~@5 [db3,db5] ~@5",
  F: "ab3 ~@2 ab4 db5 e5 eb5 e5 ab4 e5 eb5 e5 gb5 eb5 e5 eb5, db3, db4 db4@7, ~ ab3@15",
  G: "ab3 ~ db4 ab4 db5 e5 eb5 e5 db5 e5 eb5 e5 gb5 e5 eb5 gb5, [e3,e4], ~ ab3@15", // E
  H: "~@3 db4@3 gb4@3 db5@3 e5@3 gb5@3 eb5@3 ~ e5@3 eb5@3 db5@3 e5@3 eb5@3 e5@3 e5@3 db5@3 eb5@2, [gb2,db3,gb3]", // Gb5
  I: "~ e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 ab5@3 eb5@3 gb5@3 e5@3 ab5@3 b5@3 db6@3 ab5@2, ~ [a2,e3,a3]@24 [b2,b3]@12 [db3,db4]@11", // A5 B Db
  J: "~ ab3@3 ~@6 ab4@3 db5@3 e5@3 eb5@3 e5@3 ab4@3 e5@3 eb5@3 e5@3 gb5@3 eb5@3 e5@3 eb5@2, ~ db3@47, ~ db4@6 db4@41, ~ ab3@11",
  K: "~ ab3@3 ~@3 db4@3 ab4@3 db5@3 e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 e5@3 eb5@3 gb5@2, ~ [e3,e4]@47, ~ ab3@11", // E
  L: "~@4 db4@3 gb4@3 db5@3 e5@3 gb5@3 eb5@3 e5@3 eb5@3 db5@3 e5@3 eb5@3 e5@3 e5@3 db5@3 eb5@2, ~ [gb2,db3,gb3]@47", // Gb5
  M: "~ [db2,db4]@12 ~@18 [db2,db4]@2 ~ [db2,db4]@2 ~ [db2,db4]@4 ~@2 [db2,db4]@4 ~", // Db
  N: "~ [e2,e4]@8 ~@22 [e2,e4]@2 ~ [e2,e4]@2 ~ [e2,e4]@4 ~@2 [e2,e4]@4 ~", // E
  O: "~ [gb2,gb4]@8 ~@22 [gb2,gb4]@2 ~ [gb2,gb4]@2 ~ [gb2,gb4]@4 ~@2 [gb2,gb4]@4 ~", // Gb
  P: "~ [a2,a4]@8 ~@16 [b2,b4]@8 ~@4 [db3,db5]@8 ~@3", Q: "~ [a2,a4]@8 ~@17 [b2,b4]@2 ~@10 [db3,db5]@2 ~@8",
  R: "~@2 ab3@3 ~@6 ab4@3 db5@3 e5@3 eb5@3 e5@3 ab4@3 e5@3 eb5@3 e5@3 gb5@3 eb5@3 e5@3 ~, ~ db3@23, ~ db4@3 db4@20, ~@5 ab3@43",
})).s("gm_orchestral_harp").gain(0.45)

// chords · orchestral harp · "Harp" · soft notes
const orchestral_harp_soft = note("<A ~@3 A ~@2 B A ~@3 A ~@2 B ~@39 C D@5 E@4>".pickRestart({
  A: "[db2,db4] ~@3", B: "~@9 [b2,b4] [b2,b4]@2 ~ [db3,db5] [db3,db5]@2",
  C: "~@29 [b2,b4]@3 [b2,b4]@6 ~@3 [db3,db5]@3 [db3,db5]@4", // B Db
  D: "[~@47 eb5@3 ab3@3 ~@3 db4@3 ab4@3 db5@3 e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 e5@3 eb5@3 gb5@3 ~@3 db4@3 gb4@3 db5@3 e5@3 gb5@3 eb5@3 e5@3 eb5@3 db5@3 e5@3 eb5@3 e5@3 e5@3 db5@3 eb5@3 e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 ab5@3 eb5@3 gb5@3 e5@3 ab5@3 b5@3 db6@3 ab5@3 ~@45 eb5, ~@25 [e3,e4]@24 [gb2,db3,gb3]@24 [a2,e3,a3]@12 [b2,b3]@6 [db3,db4]@6 ~@23, ~@53 ab3@45 ~@142]/5", // E Gb5 A5 B Db
  E: "[~@2 ab3@3 ~@3 db4@3 ab4@3 db5@3 e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 e5@3 eb5@3 gb5@3 ~@3 db4@3 gb4@3 db5@3 e5@3 gb5@3 eb5@3 e5@3 eb5@3 db5@3 e5@3 eb5@3 e5@3 e5@3 db5@3 eb5@3 e5@3 eb5@3 e5@3 db5@3 e5@3 eb5@3 e5@3 gb5@3 ab5@3 eb5@3 gb5@3 e5@3 ab5@3 b5@3 db6@3 ab5@3 ~@46, ~ [e3,e4]@24 [gb2,db3,gb3]@24 [a2,e3,a3]@12 [b2,b3]@6 [db3,db4]@6 ~@23, ~@5 ab3@45 ~@142]/4", // E Gb5 A5 B Db
})).s("gm_orchestral_harp").gain(0.25)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A@3 B A@3 C A@3 D E@3 F ~@8 E@3 D E@3 F E@3 D E@3 F E@3 D E@3 F G@3 H G@3 I ~
>`.pickRestart({
  A: "x ~@2 x ~@12", B: "x ~@4 x ~@2", C: "x", D: "~ x ~@29 x ~@16", E: "~ x ~@8 x ~@37", F: "~ x ~@46",
  G: "~@2 x ~@8 x ~@36", H: "~ x ~@14 x ~@7", I: "~ x ~@22",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct(`<
  ~@7 A B C B D B C B E B C F G H I H I ~@8 H I H G H I H I H I H G H I H J H I H G H I H K L K L M L K L K ~
>`.pickRestart({
  A: "~@30 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~@2", B: "~ x ~ x", C: "~ x ~@2", D: "~@3 x", E: "~@4 x ~@7 x!4",
  F: "~@12 x ~@24 x ~@10", G: "~@37 x ~@10", H: "~@13 x ~@23 x ~@10", I: "~@13 x ~@34",
  J: "~@13 x ~@23 x ~@2 x ~@2 x ~@2 x ~", K: "~@7 x ~@16", L: "~@7 x ~@11 x ~@4", M: "~@19 x ~@4",
})).gain(0.4)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@15 A ~@7 B ~@15 C ~@7 D ~@7 E ~@7 E ~>".pickRestart({
  A: "~@30 x ~ x!2 ~@14", B: "~@31 x!2 ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~", C: "~@31 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~",
  D: "~@31 x ~ x!2 ~@13", E: "~@32 x!2 ~ x ~@2 x ~@2 x ~@2 x ~@2 x",
})).gain(0.2)

// drums · snare
const snare = s("sd").struct("<A@3 B A@3 C D@7 E D@2 F G@4 H ~@4 I@3 J G@7 K G@7 K G@7 L M@7 L ~>".pickRestart({
  A: "x ~@9 x!3 ~ x ~", B: "x ~ x!2", C: "x ~@29 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~@2", D: "~ x ~ x",
  E: "~@12 x ~@17 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~@2", F: "~@12 x ~@24 x ~@10", G: "~@13 x ~@23 x ~@10",
  H: "~@13 x ~@17 x!2 ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~",
  I: "~ x ~@2 x ~@2 x ~@5 x ~@5 x ~@2 x!2 ~ x ~@2 x ~@2 x ~@5 x ~@5 x ~@2 x!2",
  J: "~ x ~@2 x ~@2 x ~@5 x ~@5 x ~@2 x!2 ~ x ~@2 x ~@2 x!2 ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~",
  K: "~@13 x ~@17 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~", L: "~@14 x ~@17 x!2 ~ x ~@2 x ~@2 x ~@2 x ~@2 x",
  M: "~@7 x ~@11 x ~@4",
})).gain(0.25)

// drums · clap
const clap = s("cp").struct("<~@8 A@9 ~ B C@5 ~@8 C ~ C@21 D@9 ~>".pickRestart({
  A: "~ x ~ x", B: "~@12 x ~@24 x ~@10", C: "~@13 x ~@23 x ~@10", D: "~@7 x ~@11 x ~@4",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct(`<
  A@3 B A@3 C D E D F D E D C D E G H I J I K ~@8 I J I H I J I K I J I H I J I K I J I H I J I K L M L N L M L O ~
>`.pickRestart({
  A: "x ~@9 x!3 ~ x ~", B: "x ~ x!2", C: "x", D: "x ~@2 x ~@6 x ~@5", E: "x ~@2 x ~@6 x ~@2 x ~@2", F: "x ~@4 x ~@2",
  G: "x ~@8 x ~@21 x ~@16", H: "~ x ~@29 x ~@16", I: "~ x ~@8 x ~@20 x ~@16", J: "~ x ~@8 x ~@20 x ~@8 x ~@7",
  K: "~ x ~@46", L: "~@2 x ~@8 x ~@20 x ~@15", M: "~@2 x ~@8 x ~@20 x ~@8 x ~@6", N: "~ x ~@14 x ~@7", O: "~ x ~@22",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A B C D A B C E A B F G H I J K ~@8 H I J G H L M K H L M G H L M K H L M G H L M N O P Q R O P Q S ~
>`.pickRestart({
  A: "~ x!3 ~@3 x!2 ~ x ~ x!4", B: "~@3 x ~@2 x ~@2 x ~@11 x ~ x!2 ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x ~@2",
  C: "~@3 x ~@2 x ~@2 x ~@11 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x ~ x!2 ~@2", D: "x ~ x ~ x!2 ~ x ~@2 x ~ x ~@3",
  E: "x ~ x ~ x!2 ~ x ~@8", F: "~@3 x ~@2 x ~@2 x ~@12 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x!2 ~ x ~",
  G: "~ x ~@5 x ~@5 x ~@2 x ~@5 x ~@8 x ~@5 x ~@10",
  H: "~@4 x ~@2 x ~@2 x ~@11 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x ~",
  I: "~@4 x ~@2 x ~@2 x ~@11 x!2 ~ x ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x ~",
  J: "~@4 x ~@2 x ~@2 x ~@11 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x!2 ~ x ~", K: "~ x ~@5 x ~@5 x ~@2 x ~@5 x ~@25",
  L: "~@4 x ~@2 x ~@2 x ~@11 x ~ x!2 ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x ~",
  M: "~@4 x ~@2 x ~@2 x ~@11 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x ~ x!2 ~", N: "~ x ~@5 x ~@6 x ~@2 x ~@5 x ~@24",
  O: "~@5 x ~@2 x ~@2 x ~@11 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x",
  P: "~@5 x ~@2 x ~@2 x ~@11 x!2 ~ x ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x",
  Q: "~@5 x ~@2 x ~@2 x ~@11 x ~@2 x ~@5 x ~@5 x ~@2 x ~@2 x!2 ~ x", R: "~@2 x ~@5 x ~@5 x ~@2 x ~@5 x ~@8 x ~@5 x ~@9",
  S: "~@2 x ~@5 x ~@5 x ~@2 x ~@5 x ~@24",
})).gain(0.4)

// drums · china
const china = s("cr").struct("<[x ~@9 x!3 ~ x ~]!3 [x ~ x!2] [x ~@9 x!3 ~ x ~]!3 x ~@57>").gain(0.25)

// drums · claves
const claves = s("clave:2").struct("<~@8 A@9 ~ B C@5 ~@8 C ~ C@21 D@9 ~>".pickRestart({
  A: "~ x ~ x", B: "~@12 x ~@24 x ~@10", C: "~@13 x ~@23 x ~@10", D: "~@7 x ~@11 x ~@4",
// … 6 more lines