Strudelify

Waltz no. 2

Shostakovich

KeyE♭ majorTempo180 bpm
0:00/0:00
// Waltz no. 2 — Shostakovich
// 180 bpm, 3/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5877073; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 221 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(180/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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.

// other · flute
const flute = note(`<
  A@4 B@6 C@8 B@2 D@2 E@2 F@2 D G H I J K H I J L M N O ~@3 P Q R@2 S T P U@2 V W@2 X Y Z P AA AB AC U AD AE AF G H I J
  G H I J L M N O AG AA@2 AH AI AD@2 AJ AK AL AM AN AO AP AQ AP AR AS@2 AT AU AV@2 AW AX AA@3 AY AZ BA BB BC ~@15 BD BE
  BF BG BH BI BJ BK BL BE BF BG BM BN BO BP BQ AS D@10 F@8 D@4 E@2 F@2 D G BR I J ~@4 L M N O ~@3 P Q R@2 S T P U@2 V
  W@2 X Y Z P BS BT BU BV BW BX BY G H I J G H I J L M N BZ CA
>`.pickRestart({
  A: "~@5 eb4@3 ~@3 eb4@3 ~@2", B: "~@5 c5@3 ~@3 c5@3 ~@2", C: "~@5 d5@3 ~@3 d5@3 ~@2", D: "~@5 g4@3 ~@3 g4@3 ~@2",
  E: "~@5 ab4@3 ~@3 ab4@3 ~@2", F: "~@5 f4@3 ~@3 f4@3 ~@2", G: "~@5 eb5@3 ~@3 f5@3 ~@2",
  H: "g5@3 ~@2 g5@3 f5@3 g5@2 ab5@3", I: "f5@3 ~@2 f5@3 eb5@3 f5@2 g5@3", J: "eb5@3 ~@8 g5@3 ~@2",
  K: "~@5 eb5@3 ~@3 f5@5", L: "~@5 c6@3 ~@3 d6@3 ~@2", M: "eb6@3 ~@2 eb6@3 d6@3 eb6@2 f6@3",
  N: "d6@3 ~@2 d6@3 c6@3 d6@2 eb6@3", O: "c6@3 ~@13", P: "g5@15 ~", Q: "eb5@11 d5@5", R: "[c5@20 ~ c5@5 ~ d5@5]/2",
  S: "eb5@5 c5@5 ~ eb5@5", T: "g5@11 ab5@5", U: "f5@15 ~", V: "d5@11 c5@5", W: "[b4@20 ~ g4@5 ~ b4@5]/2",
  X: "d5@5 b4@5 ~ d5@5", Y: "f5@5 g5@5 ~ ab5@5", Z: "gb5", AA: "eb6@15 ~", AB: "d6@11 c6@5", AC: "bb5@11 ab5@5",
  AD: "d6@15 ~", AE: "c6@11 bb5@5", AF: "bb5@11 g5@3 ~@2", AG: "~@11 bb5@5", AH: "eb6@5 d6@5 ~ c6@5",
  AI: "bb5@5 g5@5 ~ bb5@5", AJ: "c6@5 bb5@5 ~ g5@5", AK: "eb5@5 f5@5 ~ g5@5", AL: "c6@15 ~", AM: "bb5@15 ~",
  AN: "bb5@5 ab5@5 ~ g5@5", AO: "f5@5 eb5@5 ~ f5@5", AP: "g5@11 bb5@5", AQ: "f5@11 bb5@5", AR: "eb6@11 f6@5",
  AS: "g6@15 ~", AT: "g6@5 f6@5 ~ eb6@5", AU: "d6@5 bb5@5 ~ d6@5", AV: "f6@15 ~", AW: "f6@5 eb6@5 ~ d6@5",
  AX: "c6@5 g5@5 ~ bb5@5", AY: "f6@5 eb6@5 ~ f6@5", AZ: "g6@11 eb6@5", BA: "bb5@5 c6@5 ~ d6@5",
  BB: "eb6@5 f6@5 ~ eb6@5", BC: "db6@5 c6@5 ~ b5@5", BD: "~@11 db6@5", BE: "c6@3 b5@2 c6@3 ab5@3 eb5@2 d5@3",
  BF: "eb5@3 c5@2 d5@3 f5@3 eb5@2 ab5@3", BG: "c6@3 b5@2 c6@3 f6@3 eb6@2 c6@3", BH: "ab5@3 g5@2 ab5@3 db6@3 c6@2 ab5@3",
  BI: "eb5@3 d5@2 eb5@3 bb5@3 eb5@2 db5@3", BJ: "c5@3 b4@2 c5@3 eb5@3 g5@2 f5@3",
  BK: "eb5@3 g5@2 bb5@3 db6@3 f6@2 eb6@3", BL: "db6@3 bb5@2 g5@3 f5@3 d5@2 b5@3",
  BM: "ab5@3 g5@2 ab5@3 db6@3 bb5@2 g5@3", BN: "f5@3 e5@2 f5@3 db6@3 bb5@2 g5@3", BO: "f5@3 e5@2 f5@3 c5@3 d5@2 e5@3",
  BP: "f5@3 g5@2 ab5@3 bb5@3 c6@2 d6@3", BQ: "eb6@3 f6@2 eb6@3 d6@3 eb6@2 f6@3", BR: "g5@5 g5@3 f5@3 g5@2 ab5@3",
  BS: "c5@15 ~", BT: "eb5@11 eb5@5", BU: "f5@11 f5@5", BV: "ab4@15 ~", BW: "bb4@15 ~", BX: "d5@11 d5@5",
  BY: "eb5@11 bb4@5", BZ: "c6@3 ~@8 g5@4 ~", CA: "c6@5 ~@11",
})).s("gm_flute").gain(0.25)

// other · oboe
const oboe = note(`<
  ~@20 A B C D E F G ~@4 H I J K L I J M ~@3 N@16 O@2 P@2 Q@2 O ~@8 L I J M R S@2 T U V@2 W X Y S Z AA AB AC AB AD AE@2
  AF AG AH@2 AI AJ S@2 Y AK AL AM AN AO ~@15 AP AQ AR AS AT AU AV AW AX AQ AR AS AY AZ BA BB BC S O@10 Q@8 O@2 A B C D E
  F G ~@4 H I J K L I J M ~@3 BD BE BF@2 BG BH BD D@2 BI BJ@2 BK BL BM BD S BN B BO BP BQ BR ~@8 L I J BS BT
>`.pickRestart({
  A: "eb5", B: "d5@11 c5@5", C: "bb4@11 ab4@5", D: "f4", E: "d5", F: "c5@11 bb4@5", G: "bb4@11 g4@3 ~@2",
  H: "~@5 eb5@3 ~@3 f5@5", I: "g5@3 ~@2 g5@3 f5@3 g5@2 ab5@3", J: "f5@3 ~@2 f5@3 eb5@3 f5@2 g5@3",
  K: "eb5@3 ~@8 g5@3 ~@2", L: "~@5 eb5@3 ~@3 f5@3 ~@2", M: "eb5@3 ~@13", N: "~@5 g4@3 ~@3 g4@3 ~@2",
  O: "~@5 eb4@3 ~@3 eb4@3 ~@2", P: "~@5 f4@3 ~@3 f4@3 ~@2", Q: "~@5 d4@3 ~@3 d4@3 ~@2", R: "~@11 bb4@5", S: "g5",
  T: "g5@5 bb5@5 ~ ab5@5", U: "g5@5 eb5@5 ~ g5@5", V: "bb5", W: "ab5@5 g5@5 ~ eb5@5", X: "c5@5 d5@5 ~ eb5@5", Y: "ab5",
  Z: "g5@5 f5@5 ~ e5@5", AA: "f5@5 eb5@5 ~ f5@5", AB: "eb5@11 g5@5", AC: "d5@11 ab5@5", AD: "g5@11 bb5@5", AE: "eb6",
  AF: "eb6@5 d6@5 ~ c6@5", AG: "bb5@5 g5@5 ~ bb5@5", AH: "d6", AI: "d6@5 c6@5 ~ bb5@5", AJ: "ab5@5 eb5@5 ~ g5@5",
  AK: "ab5@5 g5@5 ~ ab5@5", AL: "bb5@11 g5@5", AM: "d5@5 eb5@5 ~ f5@5", AN: "g5@5 f5@5 ~ eb5@5",
  AO: "db5@5 c5@5 ~ b4@5", AP: "~@11 db5@5", AQ: "c5@3 b4@2 c5@3 ab4@3 eb4@2 d4@3",
  AR: "eb4@3 c4@2 d4@3 f4@3 eb4@2 ab4@3", AS: "c5@3 b4@2 c5@3 f5@3 eb5@2 c5@3", AT: "ab4@3 g4@2 ab4@3 db5@3 c5@2 ab4@3",
  AU: "eb4@3 d4@2 eb4@3 bb4@3 eb4@2 db4@3", AV: "c4@3 b3@2 c4@3 eb4@3 g4@2 f4@3",
  AW: "eb4@3 g4@2 bb4@3 db5@3 f5@2 eb5@3", AX: "db5@3 bb4@2 g4@3 f4@3 d4@2 b4@3",
  AY: "ab4@3 g4@2 ab4@3 db5@3 bb4@2 g4@3", AZ: "f4@3 e4@2 f4@3 db5@3 bb4@2 g4@3", BA: "f4@3 e4@2 f4@3 c4@3 d4@2 e4@3",
  BB: "f4@3 g4@2 ab4@3 bb4@3 c5@2 d5@3", BC: "eb5@3 f5@2 eb5@3 d5@3 eb5@2 f5@3", BD: "g4", BE: "eb4@11 d4@5",
  BF: "[c4@21 c4@5 ~ d4@5]/2", BG: "eb4@5 c4@5 ~ eb4@5", BH: "g4@11 ab4@5", BI: "d4@11 c4@5", BJ: "[b3@27 b3@5]/2",
  BK: "d4@5 b3@5 ~ d4@5", BL: "f4@5 g4@5 ~ ab4@5", BM: "gb4", BN: "f5@11 eb5@5", BO: "ab4", BP: "f5", BQ: "eb5@11 d5@5",
  BR: "eb5@11 bb4@5", BS: "eb5@3 ~@8 d5@4 ~", BT: "g4@5 ~@11",
})).s("gm_oboe").gain(0.25)

// other · french horn · "Horn in F"
const french_horn = note(`<
  A B A B A B A B A B C B C B C B C B A B D E F@2 G@2 H I ~@10 J@4 K L M@2 N O K P@2 Q R@2 S T U K V W X Y Z AA AB AC AD
  AE AF AC AD AE AF AC AD AE AG ~ AH@4 AI@2 AH@2 J@3 AJ AH AK AH@6 AK@2 AH@4 J AH@2 AL AM AN AO@2 AP@2 AQ@2 AR AS AO@2
  AT@2 AU AV AW AX AY AZ AY BA BB BC BD BE BF@2 BG@2 BH BI BJ BK Z J@4 BL@6 BM@8 BL@4 BN@2 BO@2 BP ~@4 BQ BR BS BR BQ AH
  AK J@4 K BK BT@2 BU K@2 BV BW P BX@2 BY BZ CA@2 AH@2 CB@2 AK@2 AH AC AD AE AF AC AD AE AF AC AD AE CC H
>`.pickRestart({
  A: "c4@11 ~@5", B: "g3@11 ~@5", C: "d4@11 ~@5", D: "c4@5 ~@11", E: "g3@5 ~@11", F: "f3@5 ~@11", G: "bb3@5 ~@11",
  H: "eb4@5 ~@11", I: "ab3@5 ~@11", J: "~@5 c4@3 ~@3 c4@3 ~@2", K: "g4", L: "eb4@11 d4@5", M: "[c4@21 c4@5 ~ d4@5]/2",
  N: "eb4@5 c4@5 ~ eb4@5", O: "g4@11 ab4@5", P: "f4", Q: "d4@11 c4@5", R: "[b3@21 g3@5 ~ b3@5]/2",
  S: "d4@5 b3@5 ~ d4@5", T: "f4@5 g4@5 ~ ab4@5", U: "gb4", V: "c4", W: "eb4@11 eb4@5", X: "f4@11 f4@5", Y: "ab3",
  Z: "bb3", AA: "d4@11 d4@5", AB: "eb4@11 bb3@3 ~@2", AC: "~@5 c4@3 ~@3 d4@3 ~@2",
  AD: "eb4@3 ~@2 eb4@3 d4@3 eb4@2 f4@3", AE: "d4@3 ~@2 d4@3 c4@3 d4@2 eb4@3", AF: "c4@3 ~@8 eb4@3 ~@2", AG: "c4@3 ~@13",
  AH: "~@5 eb4@3 ~@3 eb4@3 ~@2", AI: "~@5 bb3@3 ~@3 bb3@3 ~@2", AJ: "~@5 c4@5 ~ c4@5", AK: "~@5 d4@3 ~@3 d4@3 ~@2",
  AL: "~@5 ab4@3 ~@3 ab4@3 ~@2", AM: "bb3@3 ~@13", AN: "db4@3 ~@13", AO: "[ab4@11 c4@10 b3@5 ~ c4@5]/2",
  AP: "[ab4@11 c4@10 ab4@5 ~ ab4@5]/2", AQ: "g4/2", AR: "bb4@11 db5@5", AS: "g4@11 f4@5",
  AT: "[ab4@11 c4@10 db4@5 ~ eb4@5]/2", AU: "f4@11 g4@5", AV: "ab4@11 ab4@5", AW: "bb4@5 ab4@5 ~ bb4@5",
  AX: "g4@11 db4@5", AY: "c4@11 eb3@5", AZ: "eb3@5 d3@5 ~ eb3@5", BA: "eb3@5 db4@5 ~ c4@5", BB: "c4@11 bb3@5",
  BC: "a3@11 bb3@5", BD: "f4@11 eb4@5", BE: "db4@3 ~@2 c4@3 ~@3 b3@3 ~@2", BF: "[c4@11 eb3@10 d3@5 ~ eb3@5]/2",
  BG: "[c4@11 eb3@10 f3@5 ~ g3@5]/2", BH: "ab3@11 bb3@5", BI: "c4@11 c4@5", BJ: "d4@3 ~@2 c4@3 ~@3 d4@3 ~@2", BK: "eb4",
  BL: "~@5 eb4@3 d4@3 eb4@3 ~@2", BM: "~@5 g4@3 f4@3 g4@3 ~@2", BN: "~@5 f4@3 eb4@3 f4@3 ~@2",
  BO: "~@5 d4@3 c4@3 d4@3 ~@2", BP: "~@5 g3@3 bb3@3 eb4@2 g4@3", BQ: "~@5 ab3@3 ~@3 g3@3 ~@2",
  BR: "~@5 g3@3 ~@3 g3@3 ~@2", BS: "~@5 f3@3 ~@3 f3@3 ~@2", BT: "[c4@21 eb4@5 ~ d4@5]/2", BU: "eb4@11 c4@5",
  BV: "f4@5 g4@5 ~ f4@5", BW: "ab4", BX: "[d4@21 b3@5 ~ d4@5]/2", BY: "g4@3 d4@2 b3@5 ~ d4@5", BZ: "g4@5 b4@5 ~ ab4@5",
  CA: "c5/2", CB: "~@5 f4@3 ~@3 f4@3 ~@2", CC: "g3@3 ~@8 d4@4 ~",
})).s("gm_french_horn").gain(0.2)

// other · french horn · "Horn in F" · soft notes
const french_horn_soft = note("<~@28 A B A C A B A C D E ~@133 A B A ~@47>".pickRestart({
  A: "~@5 g3@3 ~@3 g3@3 ~@2", B: "~@5 f3@3 ~@3 f3@3 ~@2", C: "~@5 ab3@3 ~@3 g3@3 ~@2", D: "~@5 eb4@3 ~@3 eb4@3 ~@2",
  E: "~@5 d4@3 ~@3 d4@3 ~@2",
})).s("gm_french_horn").gain(0.15)

// other · bassoon
const bassoon = note(`<
  ~@4 A B C@2 D E A F@2 G H@2 I J K A@2 L M N F O P ~ Q R Q S Q R Q S T U V T V T W X W X W X Y X Y X Y X Y X W X Z AA
  AB@2 AC@2 AD AE Q R Q S Q R Q S T U AF AG AH AI AH AI AJ AI AJ AI W@2 AJ AK AL AM AL AN AL AN AL AN AO AM AP AM AL AQ
  AR AS AM@2 AL@2 AT AU AT AU AV AW AV AW AT AU AT AU AX AY AC AZ AT AU AT AU AV AW AV AW AT AU AT AU AX AY AC BA BB BC
  BD BC BD Z AA Z AA Z AA BE AA BE AA BE AA BE AA Z AA Z AA AB@2 AC@2 AD BF BG BH BG BI BG BH BG BI AA BJ Z AA Z BK Z AA
  Z AA Z AA BL AA BL AA BL AA BL BM Z AA Z AA AB@2 AC@2 AD AE Q R Q S Q R Q S T U BN BO
>`.pickRestart({
  A: "g4", B: "eb4@11 d4@5", C: "[c4@21 c4@5 ~ d4@5]/2", D: "eb4@5 c4@5 ~ eb4@5", E: "g4@11 ab4@5", F: "f4",
  G: "d4@11 c4@5", H: "[b3@21 g3@5 ~ b3@5]/2", I: "d4@5 b3@5 ~ d4@5", J: "f4@5 g4@5 ~ ab4@5", K: "gb4",
  L: "eb4@11 eb4@5", M: "f4@11 f4@5", N: "ab3", O: "d4@11 d4@5", P: "eb4@11 bb3@3 ~@2",
  Q: "g2@3 ~@2 eb3@3 ~@3 eb3@3 ~@2", R: "ab2@3 ~@2 d3@3 ~@3 d3@3 ~@2", S: "ab2@3 ~@2 eb3@3 ~@3 eb3@3 ~@2",
  T: "g2@3 ~@2 g3@3 ~@3 g3@3 ~@2", U: "g2@3 ~@2 f3@3 ~@3 f3@3 ~@2", V: "c2@3 ~@2 g3@3 ~@3 g3@3 ~@2", W: "c3@5 ~@11",
  X: "g2@5 ~@11", Y: "d3@5 ~@11", Z: "c3@5 g3@3 ~@3 g3@3 ~@2", AA: "g2@5 g3@3 ~@3 g3@3 ~@2",
  AB: "f2@5 ab3@3 ~@3 ab3@3 ~@2", AC: "bb2@5 f3@3 ~@3 f3@3 ~@2", AD: "eb3@5 g3@3 ~@3 g3@3 ~@2", AE: "ab2@5 ~@11",
  AF: "c3@3 ~@2 eb2@3 ~@3 d2@3 ~@2", AG: "c2@3 ~@13", AH: "eb2@5 ~@11", AI: "bb2@5 ~@11", AJ: "f2@5 ~@11",
  AK: "ab2@5 f2@5 ~ f2@5", AL: "eb3@5 g3@3 bb3@3 eb4@2 g4@3", AM: "bb2@5 f3@3 bb3@3 d4@2 f4@3",
  AN: "bb2@5 g3@3 bb3@3 eb4@2 g4@3", AO: "f2@5 f3@3 bb3@3 d4@2 f4@3", AP: "eb3@5 f3@3 bb3@3 d4@2 f4@3",
  AQ: "db3@5 g3@3 bb3@3 eb4@2 g4@3", AR: "c3@5 eb3@3 ab3@3 c4@2 eb4@3", AS: "b2@5 eb3@3 ab3@3 c4@2 eb4@3",
  AT: "ab2@5 c3@3 ~@3 c3@3 ~@2", AU: "eb2@5 c3@3 ~@3 c3@3 ~@2", AV: "bb2@5 eb3@3 ~@3 eb3@3 ~@2",
  AW: "eb2@5 eb3@3 ~@3 eb3@3 ~@2", AX: "db3@5 f3@3 ~@3 f3@3 ~@2", AY: "c3@5 f3@3 ~@3 f3@3 ~@2",
  AZ: "bb2@3 eb3@2 g3@3 bb3@3 db4@2 eb4@3", BA: "eb2@5 f3@3 ~@3 f3@3 ~@2", BB: "f3", BC: "c3@11 ~@5", BD: "g2@11 ~@5",
  BE: "d3@5 g3@3 ~@3 g3@3 ~@2", BF: "eb3@5 ~@11", BG: "g2@5 eb3@3 ~@3 eb3@3 ~@2", BH: "ab2@5 d3@3 ~@3 d3@3 ~@2",
  BI: "ab2@5 eb3@3 ~@3 eb3@3 ~@2", BJ: "g2@5 f3@3 ~@3 f3@3 ~@2", BK: "g2", BL: "d2@5 g3@3 ~@3 g3@3 ~@2",
  BM: "ab2@5 g3@3 ~@3 g3@3 ~@2", BN: "c3@3 ~@8 g2@4 ~", BO: "c2@5 ~@11",
})).s("gm_bassoon").gain(0.2)

stack(flute, oboe, french_horn, french_horn_soft, bassoon)