Strudelify
KeyE♭ majorTempo180 bpm
0:00/0:00
// Waltz no. 2 — Dmitri Schostakowitsch
// 180 bpm, 3/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5063945; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 219 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 · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · violin · "Violine, Violine 2"
const violin = note(`<
  A@4 B@6 C@8 B@4 C@2 D E B F G H I F G H I J K L M N@9 O@4 P@4 N@4 Q@2 R@2 S F G H I F G H I J K L T U V@2 W X Y@2 Z AA
  AB V AC AD AE AF AE AG AH@2 AI AJ AK@2 AL AM AN@2 AO AP AQ AR AS AT AU AV AU AW AX@2 AY AZ AU AV AU BA BB BC BD AX BE
  BF BG BH BI BJ BK BL BE BF BG BH BM BN BO BP BQ BR@10 BS@4 BT@3 BU BR@2 BV BW BX BY BZ CA CB CC CD CE CF CC CD CE CF F
  G H CG CH V CI BV CJ CK CL V CM@2 CN CO CP CQ CR CS CT CU CV CW CX AB CY CZ F G H I F G H I J K L DA DB
>`.pickRestart({
  A: "~@5 g4@5 ~ g4@5", B: "~@5 eb4@5 ~ eb4@5", C: "~@5 f4@5 ~ f4@5", D: "~@5 d4@5 ~ d4@5", E: "~@5 eb4@5 ~ d4@5",
  F: "~@5 eb5@3 ~@3 f5@3 ~@2", G: "g5@3 ~@2 g5@3 ~@3 g5@3 ~@2", H: "f5@3 ~@2 f5@3 ~@3 f5@3 ~@2",
  I: "eb5@3 ~@8 g5@3 ~@2", J: "~@5 c6@3 ~@3 d6@3 ~@2", K: "eb6@3 ~@2 eb6@3 ~@3 eb6@3 ~@2",
  L: "d6@3 ~@2 d6@3 ~@3 d6@3 ~@2", M: "c6@3 ~@2 [g4,c5]@5 ~ [g4,c5]@5", N: "~@5 [g4,c5]@5 ~ [g4,c5]@5",
  O: "~@5 [c5,f5]@5 ~ [c5,f5]@5", P: "~@5 [b4,f5]@5 ~ [b4,f5]@5", Q: "~@5 [ab4,c5]@5 ~ [ab4,c5]@5",
  R: "~@5 [bb4,f5]@5 ~ [bb4,f5]@5", S: "~@5 [g4,bb4]@3 ~@3 [g4,bb4]@3 ~@2", T: "c6@3 ~@13", U: "~@11 bb4@5", V: "g5",
  W: "g5@3 ~@2 bb5@3 ~@3 ab5@5", X: "g5@3 ~@2 eb5@3 ~@3 g5@5", Y: "bb5", Z: "ab5@5 g5@5 ~ eb5@5",
  AA: "c5@5 d5@5 ~ eb5@5", AB: "ab5", AC: "g5@5 f5@5 ~ e5@5", AD: "f5@5 eb5@5 ~ f5@5", AE: "eb5@11 g5@5",
  AF: "d5@11 ab5@5", AG: "g4@11 bb4@5", AH: "eb5", AI: "eb5@5 eb5@5 ~ c5@5", AJ: "bb4@5 g4@5 ~ bb4@5", AK: "d5",
  AL: "d5@5 c5@5 ~ bb4@5", AM: "ab4@5 eb4@5 ~ g4@5", AN: "g4", AO: "ab4", AP: "ab4@5 g4@5 ~ ab4@5", AQ: "bb4@11 g4@5",
  AR: "d4@5 eb4@5 ~ f4@5", AS: "g4@5 f4@5 ~ eb4@5", AT: "db4@5 c4@5 ~ b3@5", AU: "ab5@11 c5@5", AV: "c5@5 b4@5 ~ c5@5",
  AW: "c5@5 ab5@5 ~ ab5@5", AX: "g5@11 g5@5", AY: "bb5@11 db6@5", AZ: "g5@11 f5@5", BA: "c5@5 db5@5 ~ eb5@5",
  BB: "f5@11 g5@5", BC: "ab5@11 ab5@5", BD: "bb5@5 ab5@5 ~ bb5@5", BE: "c5@3 b4@2 c5@3 ab4@3 eb4@2 d4@3",
  BF: "eb4@3 c4@2 ab4@3 d4@3 eb4@2 ab4@3", BG: "c5@3 b4@2 c5@3 f5@3 eb5@2 c5@3",
  BH: "ab4@3 g4@2 ab4@3 db5@3 c5@2 ab4@3", BI: "eb4@3 d4@2 eb4@3 a4@3 bb4@2 g4@3",
  BJ: "g4@3 a4@2 bb4@3 db5@3 f5@2 bb5@3", BK: "f4@3 ab4@2 g4@3 db5@3 f5@2 eb5@3", BL: "db5@3 db5@2 c5@3 c5@3 b4@2 b4@3",
  BM: "ab4@3 eb4@2 f4@3 db5@3 f4@2 e4@3", BN: "f4@3 e4@2 f4@3 c5@3 f4@2 c5@3", BO: "d4@3 f4@2 ab4@3 bb4@3 d5@2 bb4@3",
  BP: "eb5@3 f5@2 eb5@3 d5@3 eb5@2 f5@3", BQ: "[b4,g5]", BR: "~@5 [c4,eb4]@5 ~ [c4,eb4]@5",
  BS: "~@5 [c4,f4]@5 ~ [c4,f4]@5", BT: "~@5 [g3,f4]@5 ~ [g3,f4]@5", BU: "~@5 g3@5 ~ g3@5", BV: "c5", BW: "g4@11 g4@5",
  BX: "d4@11 c4@5, f4", BY: "c4", BZ: "[f4,ab4]", CA: "[eb4,ab4]@11 [d4,ab4]@5", CB: "[eb4,g4]",
  CC: "~@5 c5@3 ~@3 d5@3 ~@2", CD: "eb5@3 ~@2 eb5@3 ~@3 eb5@3 ~@2", CE: "d5@3 ~@2 d5@3 ~@3 d5@3 ~@2",
  CF: "c5@3 ~@8 eb5@3 ~@2", CG: "eb5@3 ~@2 eb4@3 ~@3 eb4@3 ~@2", CH: "~@5 eb4@5 ~ d4@5, ~@5 b3@11", CI: "eb5@11 d5@5",
  CJ: "~@5 c5@5 ~ d5@5", CK: "eb5@5 c5@5 ~ eb5@5", CL: "g5@11 ab5@5", CM: "f5", CN: "d5@11 c5@5", CO: "b4",
  CP: "~@5 g4@5 ~ b4@5", CQ: "d5@5 b4@5 ~ d5@5", CR: "f5@5 g5@5 ~ ab5@5", CS: "gb5", CT: "g5@11 ~@5", CU: "c6",
  CV: "g5@11 eb5@5", CW: "f5@11 c5@5", CX: "d5@11 ~@5", CY: "[c5,ab5]@11 [bb4,ab5]@5", CZ: "[bb4,g5]",
  DA: "c6@3 ~@8 [b3,g4,d5]@5", DB: "[g3,eb4,c5,g5]@5 ~@11",
})).s("gm_violin").gain(0.48)

// chords · viola · "Bratsche, Viola"
const viola = note(`<
  ~@38 A@10 B@4 C@4 A@4 D@4 ~@14 E F@3 G@2 F@2 H@2 I J F K L M F@4 N@2 L@4 O D L P Q R A@4 S@4 A@4 T A G U V A@3 S@3 A@4
  F W X Y Z AA AB AC AB AC ~@23 AD ~@10 AE ~ A@6 B@4 C@4 A@4 D@4 ~@12 AF AG
>`.pickRestart({
  A: "~@5 [c4,eb4]@5 ~ [c4,eb4]@5", B: "~@5 [ab3,d4]@5 ~ [ab3,d4]@5", C: "~@5 [g3,d4]@5 ~ [g3,d4]@5",
  D: "~@5 [ab3,f4]@5 ~ [ab3,f4]@5", E: "[eb4,eb5]@5 [bb3,eb4]@5 ~ [bb3,eb4]@5", F: "~@5 [bb3,eb4]@5 ~ [bb3,eb4]@5",
  G: "~@5 [bb3,d4]@5 ~ [bb3,d4]@5", H: "~@5 [bb3,e4]@5 ~ [bb3,e4]@5", I: "~@5 [c4,f4]@5 ~ [c4,e4]@5",
  J: "~@5 [c4,f4]@5 ~ [c4,f4]@5", K: "~@5 [bb3,ab4]@5 ~ [bb3,ab4]@5", L: "~@5 [bb3,g4]@5 ~ [bb3,g4]@5",
  M: "~@5 [bb3,g4]@5 ~ [bb3,f4]@5", N: "~@5 [d4,ab4]@5 ~ [d4,ab4]@5", O: "~@5 [c4,ab4]@5 ~ [c4,ab4]@5",
  P: "~@5 [d4,bb4]@5 ~ [d4,bb4]@5", Q: "[eb4,bb4]@5 ~@11", R: "[db4,g4]", S: "~@5 [db4,eb4]@5 ~ [db4,eb4]@5",
  T: "~@5 [db4,f4]@5 ~ [db4,f4]@5", U: "[bb3,g4]@5 ~@11", V: "[eb4,ab4]@5 [c4,eb4]@5 ~ [c4,eb4]@5",
  W: "~@5 [f4,bb4]@5 ~ [f4,bb4]@5", X: "~@5 [f4,ab4]@5 ~ [f4,ab4]@5", Y: "~@5 [ab4,bb4]@5 ~ [ab4,bb4]@5",
  Z: "~@5 [g4,c5]@5 ~ [g4,c5]@5", AA: "[g4,b4]@11 [f4,b4]@5", AB: "c4@5 ~@11", AC: "g3@5 ~@11", AD: "ab3@5 ~@11",
  AE: "~@5 c4@3 ~@3 c4@3 ~@2", AF: "~@11 [d3,b3]@5", AG: "[eb3,c4]@5 ~@11",
})).s("gm_viola").gain(0.41)

// chords · viola · "Bratsche, Viola" · soft notes
const viola_soft = note(`<
  A@4 B@10 C@4 B@6 D@3 E F G H E F G H I J K L ~@25 M E F G H E F G H I J K L ~@70 N O N O N O P O P O P O P O N O Q@2
  R@2 S@2 T E U V H E U V H I W X L Y ~@22 M E F G H E F G H I J K L ~
>`.pickRestart({
  A: "~@5 eb4@5 ~ eb4@5", B: "~@5 c4@5 ~ c4@5", C: "~@5 b3@5 ~ b3@5", D: "~@5 bb3@5 ~ bb3@5",
  E: "~@5 c4@3 ~@3 d4@3 ~@2", F: "eb4@3 ~@2 eb4@3 ~@3 eb4@3 ~@2", G: "d4@3 ~@2 d4@3 ~@3 d4@3 ~@2",
  H: "c4@3 ~@8 eb4@3 ~@2", I: "~@5 eb4@3 ~@3 f4@3 ~@2", J: "g4@3 ~@2 g4@3 ~@3 g4@3 ~@2",
  K: "f4@3 ~@2 f4@3 ~@3 f4@3 ~@2", L: "eb4@3 ~@13", M: "~@5 [eb4,bb4]@3 ~@3 [eb4,bb4]@3 ~@2", N: "c4@5 ~@11",
  O: "g3@5 ~@11", P: "d4@5 ~@11", Q: "~@5 [c4,eb4]@5 ~ [c4,eb4]@5", R: "~@5 [ab3,f4]@5 ~ [ab3,f4]@5",
  S: "~@5 [ab3,d4]@5 ~ [ab3,d4]@5", T: "~@5 [g3,eb4]@5 ~ [g3,eb4]@5", U: "eb4@3 ~@2 eb4@3 d4@3 eb4@2 f4@3",
  V: "d4@3 ~@2 d4@3 c4@3 d4@2 eb4@3", W: "g4@3 ~@2 g4@3 f4@3 g4@2 ab4@3", X: "f4@3 ~@2 f4@3 eb4@3 f4@2 g4@3",
  Y: "~@5 [b3,g4]@11", // Em
})).s("gm_viola").gain(0.27)

// other · cello · "Violoncello, Cello"
const cello = note(`<
  ~@27 A B ~@2 A B ~@2 C D ~@2 E F E F E F E F E G E G E G E G E F E F E H@2 I@2 J A B ~@2 A B ~@2 C D ~ K L M N M N H I
  J I F@2 O P J I J I J I J I Q N M N M R S T N@2 M@2 P J P J I J I J P J P J U F I J P J P J I J I J P J P J U F I J V
  ~@4 W X S Y Z AA W Q@2 AB T AC AD AE AF W ~@18 AG ~ F E F E F E G E G E G E G E F E F E H@2 I@2 J A B ~@2 A B ~@2 C D
  ~ AH AI
>`.pickRestart({
  A: "~@5 eb2@3 ~@3 f2@3 ~@2", B: "g2@3 ~@13", C: "~@5 c3@3 ~@3 d3@3 ~@2", D: "c3@3 ~@13", E: "g2@5 ~@11",
  F: "c3@5 ~@11", G: "d3@5 ~@11", H: "f3@5 ~@11", I: "bb2@5 ~@11", J: "eb3@5 ~@11", K: "~@5 g3@5 ~ eb3@5",
  L: "c3@5 ~@6 bb2@5", M: "eb3", N: "bb2", O: "f2@5 ~@11", P: "ab2@5 ~@11", Q: "f3", R: "db3", S: "c3", T: "b2",
  U: "db3@5 ~@11", V: "g2@5 g2@5 ~ g2@5", W: "g3", X: "eb3@11 d3@5", Y: "c3@5 c3@5 ~ d3@5", Z: "eb3@5 c3@5 ~ eb3@5",
  AA: "g3@11 ab3@5", AB: "d3@11 c3@5", AC: "~@5 g2@5 ~ b2@5", AD: "d3@5 b2@5 ~ d3@5", AE: "f3@5 g3@5 ~ ab3@5",
  AF: "gb3", AG: "~@5 [c3,g3]@3 ~@3 [c3,g3]@3 ~@2", AH: "~@11 [d2,g2]@5", AI: "[eb2,c3]@5 ~@11",
})).s("gm_cello").gain(0.3)

// other · cello · "Violoncello, Cello" · soft notes
const cello_soft = note(`<
  A B A B C D C D C D E D E D E D E D C D C D F@2 G@2 H I ~ I J I ~ I J I ~ K C ~@26 I ~ I J I ~ I J I ~ K C ~@66 A B A
  B ~@16 C D F@2 G@2 H I K I K I K I K I K@2 C L ~@23 I ~ I J I ~ I J I ~ K C ~
>`.pickRestart({
  A: "c3", B: "g2", C: "c3@5 ~@11", D: "g2@5 ~@11", E: "d3@5 ~@11", F: "f3@5 ~@11", G: "bb2@5 ~@11", H: "eb3@5 ~@11",
  I: "ab2@3 ~@13", J: "g2@3 ~@2 g2@3 ~@3 g2@3 ~@2", K: "g2@3 ~@13", L: "g2@5 eb3@5 ~ d3@5",
})).s("gm_cello").gain(0.2)

stack(violin, viola, viola_soft, cello, cello_soft)