Strudelify

Polovtsian Dance

Borodin

KeyD minorTempo99 bpm
0:00/0:00
// Polovtsian Dance — Borodin
// 99 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 48 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(99/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 · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E F G ~ H B C D I F J K L@2 M@2 ~ N O P Q@2 R S T@2 U@2 A B C D E F G V@5 W@3 X
>`.pickRestart({
  A: "[f3,bb3]", B: "[e3,bb3]", C: "f3", D: "e3", E: "d3, bb3@29 ~@3", F: "[db3,bb3]", G: "[c3,a3]", H: "f3, bb3@7 ~",
  I: "d3, bb3@13 ~@3", J: "[d3,a3]", K: "~ e3 f3 a3", L: "[g3@3 ~@5 bb3@12 c4@4 bb3@4 a3@2 g3@2, ~@8 g3@11 ~@45]/2",
  M: "[a3@4 bb3@4 c4@29 ~@19 a3@8]/2", N: "g3", O: "a3@15 ~", P: "~@7 a3, ~ bb3@2 bb3, ~ c4",
  Q: "[g3@2 g3@2 bb3@6 ~@5 g3, ~@5 c4@3, ~@3 bb3, ~@7 a3]/2", R: "~ g3 a3@6, f3@9 ~@23", S: "~ bb3 ~ f3, ~ a3",
  T: "[g3@3 ~ g3@4 ~@8 e3@8 bb3@4 a3@2 g3@2, ~@16 bb3@19 ~@29]/2", U: "[a3@7 ~]/2",
  V: "[~@31 f3@32 ~ bb3@32 f3@31 e3@33, ~@31 bb3@28 ~@4 e3@34 ~@63]/5",
  W: "[d3@31 [db3,bb3]@33 [c3,a3]@25 ~@7, bb3@13 ~@35]/3", X: "~ [f3,c4]@13 ~@2",
})).s("gm_piano").gain(0.35)

// chords · piano · "A.PIANO 1"
const piano_2 = note("<A@2 B@4 C@6 D@4 ~ E@2 F G@4 H I J K L@2 M@2 N@4 O@6 P@4 Q@2>".pickRestart({
  A: "[g4@3 ~@27 g4@2, ~@2 g4@3 ~@5 c5@6, ~@4 d5@7 d5@5, ~@3 bb4, ~@7 a4]/2",
  B: "[~@16 d4@2 ~@13 e4, a4@30 ~@18 a4@12 f4@32 ~@12 a4@23 ~, ~@4 bb4@26 ~@10 d5@23 ~@65, ~@8 c5@55 ~@16 g4@33 g4@15 ~, ~@56 g4@7 ~@9 d4@20 ~@28 f4@8]/4",
  C: "[~@10 e4@2 f4@2 ~@2 g4@2 ~@10 bb4@2 ~@3 bb4 ~@13 f4, f4@13 ~@43 a4@34 ~@14 c5@13 ~@7 g4@12 ~@40 a4@16, ~@4 e4@9 ~@59 g4@19 ~@29 a4@8 a4@8 ~@32 d5@24, ~@8 d4@42 ~@30 d5@28 d5@9 ~@19 c5@56, ~@23 g4]/6",
  D: "[d4@8 ~@48 f4@4 ~@12 d4@29 ~@27, ~@8 d4@11 ~@21 a4@20 e4@8 e4@10 ~@50, ~@16 g4@32 g4@13 ~@3 f4@14 ~@50]/4",
  E: "[[db4,f4]@39 ~@25]/2", F: "[f4,a4]@8 db4@8 c4@7 ~@9",
  G: "[db4@4 ~@16 g4@4 f4@4 eb4@2 ~@10 c4@11 ~@13, ~@8 db4@38 ~@14 db4@23 ~@45, ~@16 f4@30 ~@18 f4@19 ~@45]/4",
  H: "~ d4", I: "e4@15 ~", J: "~ c4", K: "d4@15 ~", L: "[~@8 d4@12 c4@2 d4@3 ~@7]/2",
  M: "[~ [d4,e4]@2 e4 [db4,e4]@4, ~@24 d4@11 ~@29]/2", // Dsus2 Dbm
  N: "[g4@2 ~@29 f4, ~@8 g4@21 ~@11 c5@20 g4@34 ~@26 g4@8, ~@4 d5@7 d5@5 ~@2 c5@14, ~@48 bb4@15 ~@5 bb4@25 ~@11 d5@24, ~@56 a4@7 ~ a4@29 ~@19 a4@16]/4",
  O: "[d4@8 ~@48 f4@4 ~@12 d4@31 ~@16 a4@8 g4@8 ~@52 g4@5, ~@8 d4@52 e4@8 e4@35 e4@24 ~@49 bb4@16, ~@16 g4@32 g4@14 ~@2 f4@41 ~@6 f4@16 ~@8 g4@17 ~@16 c5@24, ~@40 a4@22 ~@81 d5@28 d5@21, ~@183 a4@8 ~]/6",
  P: "[a4@4 ~@59 d4@8 ~@8 g4@24 ~@21 e4@4, ~@4 bb4@26 ~@9 d5@20 f4@25 ~@27 g4@17, ~@8 c5@55 ~@65, ~@47 a4@15 ~@41 a4@25, ~@55 g4@7 ~@9 d4@13 ~@35 f4@9]/4",
  Q: "[f4@17 [a4,c5]@14 ~]/2", // Am
})).s("gm_piano").gain(0.35).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@7 B@8 C@8 D@8 E@8 F@8 G>".pickRestart({
  A: "[[f4,g4,bb4,d5]@5 ~@2 [f4,g4,bb4,d5]@8 ~@8 [f4,g4,bb4,d5]@5 ~@3 [g4,bb4,e5]@5 ~@3 [g4,bb4,c5,e5]@8 ~@8 [e4,g4,e5]@5 ~@3 [f4,a4,c5,f5]@5 ~@3 [f4,a4,c5,f5]@8 ~@8 [f4,a4,c5,f5]@5 ~@3 [f4,a4,c5,e5]@5 ~@3 [f4,a4,c5,e5]@8 ~@8 [f4,a4,c5]@5 ~@3 [f4,g4,bb4]@5 ~@3 [f4,g4,bb4]@8 ~@8 [f4,g4,bb4,d5]@5 ~@3 [f4,g4,bb4,db5]@5 ~@3 [f4,g4,bb4,db5]@8 ~@8 [f4,g4,bb4]@5 ~@3 [f4,a4]@5 ~@3 [f4,a4]@8 ~@8 [f4,a4]@5 ~@3 [f4,a4]]/7", // Gm7 Edim C7 Em F Fmaj7 F Gm7 …
  B: "[~@7 [f4,a4]@8 ~@8 [c4,f4,a4]@5 ~@3 [d4,g4,bb4]@5 ~@3 [d4,g4,bb4]@8 ~@8 [g4,bb4]@5 ~@3 [d4,g4,bb4]@5 ~@3 [d4,g4,bb4]@8 ~@8 [d4,g4,bb4]@5 ~@3 [f4,a4,c5]@5 ~@3 [f4,a4,c5]@8 ~@8 [e4,f4,a4]@5 ~@3 [f4,a4,c5]@5 ~@3 [f4,a4,c5]@8 ~@8 [c4,f4,a4]@5 ~@3 [d4,g4,bb4]@5 ~@3 [d4,g4,bb4]@8 ~@8 [d4,g4,bb4]@5 ~@3 [db4,g4,bb4]@5 ~@3 [db4,g4,bb4]@8 ~@8 [e4,g4,bb4]@5 ~@3 [d4,f4,a4]@5 ~@3 [d4,f4,a4]@8 ~@8 [d4,f4,a4]@5 ~@3 [d4,f4,a4], ~@214 db4@5 ~@37]/8", // F Gm F Fmaj7 F Gm Gdim Edim …
  C: "[~@7 [d4,f4,a4]@8 ~@8 [d4,f4,a4]@5 ~@3 [db4,f4,bb4]@5 ~@3 [db4,f4,bb4]@8 ~@8 [db4,f4]@5 ~@3 [db4,f4,g4]@5 ~@3 [db4,f4,g4]@8 ~@8 [db4,f4]@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@8 ~@8 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@8 ~@8 [c4,f4]@5 ~@3 [f4,bb4]@5 ~@3 [c4,f4,bb4]@8 ~@8 [c4,f4,bb4,db5]@5 ~@3 [c4,f4,bb4,db5]@5 ~@3 [c4,f4,bb4,db5]@8 ~@8 [c4,f4]@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,f4]@8 ~@8 [c4,f4,a4]@5 ~@3 [f4,a4], ~@158 c4@5 ~@91 c4@2]/8", // Dm Bbm Db Gm7b5 Db F F5 Bb5 …
  D: "[~@7 [c4,f4]@8 ~@8 [c4,f4]@5 ~@3 [bb3,d4]@5 ~@3 [bb3,d4]@8 ~@8 [bb3,d4,g4]@5 ~@3 [g3,d4,g4]@5 ~@3 [g3,d4,g4]@8 ~@8 [g3,bb3,d4]@5 ~@3 [d3,a3,d4]@5 ~@3 [d4,f4]@8 ~@8 [c4,d4,f4]@5 ~@3 [c4,d4,f4]@5 ~@3 [c4,d4,f4]@8 ~@8 [c4,d4]@5 ~@3 [bb3,d4]@5 ~@3 [d4,g4]@8 ~@8 [bb3,d4]@5 ~@3 [g3,d4]@5 ~@3 [g3,d4]@8 ~@8 [bb3,d4]@5 ~@3 [a3,e4]@5 ~@3 [a3,e4]@8 ~@8 [a3,g4]@5 ~@3 [a3,g4]]/8", // F5 Bb Gm G5 Gm D5 Dm Dm7 …
  E: "[~@7 [a3,g4]@8 ~@8 [a3,g4]@5 ~@3 f3@5 ~@3 [bb3,d4,g4]@5 ~@3 [bb3,d4,g4]@5 ~@3 c3@5 ~@3 c3@5 ~@3 [c4,e4,bb4]@5 ~@3 [c4,e4,bb4]@5 ~@3 c3@5 ~@3 c3@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@5 ~@3 c3@5 ~@3 c3@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@5 ~@3 c3@5 ~@3 d3@5 ~@3 [d4,g4,bb4]@5 ~@3 [d4,g4,bb4]@5 ~@3 d3@5 ~@3 db3@5 ~@3 [bb3,db4,g4,bb4]@5 ~@3 [bb3,db4,g4,bb4]@5 ~@3 db3@5 ~@3 c3@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@5 ~@3 c3@5 ~@3 c3]/8", // A7 Gm C7 F Gm Gdim F
  F: "[~@7 [c4,f4,a4]@5 ~@3 [c4,f4,a4]@5 ~@11 c3@5 ~@3 [d4,f4,bb4]@5 ~@3 [d4,f4]@5 ~@2 c3@5 ~@3 c3@5 ~@4 g4@5 ~@3 d4@5 ~@2 c3@5 ~@3 c3@5 ~@3 [c4,f4,a4]@5 ~@4 [f4,a4]@5 ~@2 c3@5 ~@3 c3@5 ~@4 [f4,a4]@5 ~@2 [c4,f4,a4]@5 ~@4 c3@5 ~@3 d3@5 ~@2 [d4,g4,bb4]@5 ~@3 [d4,g4,bb4]@5 ~@3 d3@5 ~@4 db3@5 ~@3 [db4,g4]@5 ~@3 [bb3,db4,g4]@5 ~@3 db3@5 ~@3 c3@6 ~@2 [c4,f4,a4]@6 ~@3 [f4,a4]@6 ~@2 c3@6 ~@2, ~@46 bb4@5 ~@19 [d4,bb4]@5 ~@3 [g4,bb4]@5 ~@27 c4@5 ~@19 c4@5 ~@59 bb3@5 ~@36 c4@6 ~@11]/8", // F Bb Dm F Gm Dbdim Gdim F …
  G: "~ [f2,f4,a4,c5,f5]@23 ~@8, c4@23 ~@9", // F
})).s("gm_string_ensemble_2").gain(0.16).pan(0.2)

// other · recorder
const recorder = note("<A@2 B@2 C@3 D@5 E@2 F G@3 H@4 I J K@2 L@2 M@2 N ~ O@2 P@2 Q@2 R@2 S@2 T@2 U@4>".pickRestart({
  A: "[g5@4 ~@4 g5@7 ~ d6@24 c6@4 d6@3 ~ c6@2 bb5@5 a5@3 ~@2 g5@4, ~@47 bb5@2 ~@15]/2",
  B: "[a5@4 bb5@4 c6@32 d6@6 a5 ~ bb5 a5@6 g5@3 ~ f5@4 ~]/2",
  C: "[d5@4 ~@4 d5@8 g5@23 a5@6 ~@2 a5@2 g5@6 ~ f5@3 e5@3 ~ f5@4 e5@4 d5@25, ~@23 g5 ~@24]/3",
  D: "[~@8 e5@8 f5@7 ~ a5@7 g5@6 ~@2 g5@8 ~ d6@23 ~@4 d6@3 ~@3 bb5@5 ~@2 a5@4 g5@3 a5@4 bb5@5 c6@31 d6@6 a5@2 ~@2 a5@6 g5@3 ~ f5@4 ~, ~@72 c6@5 ~@2 bb5@2 ~@63 bb5@2 ~@14, ~@40 c6 ~@39]/5",
  E: "[d5@5 ~@2 d5@8 g5@24 a5@6 g5 ~@2 g5@7 ~ f5@3 e5@4 ~, ~@47 a5@2 ~@15]/2", F: "f5@3 e5@4 d5@25",
  G: "[~@31 g4@6 ~@2 g4@9 bb4@23 c5@7 ~ bb4@8 a4@4 g4@5]/3",
  H: "[a4@4 bb4@4 c5@32 ~ db5@7 c5@8 a4@7 db5@6 ~@2 db5@8 ~ f5@23 g5@6 f5@2 ~ f5@7 ~ eb5@4 db5@4, ~@111 g5@2 ~@15]/4",
  I: "f5 c5", J: "~@8 bb4@7 c5@8 ~ bb4@3 a4@5",
  K: "[g4@5 ~@2 g4@8 bb4@23 ~@2 c5@6 bb4 ~ bb4@7 a4@4 ~ g4@4, ~@47 c5@2 ~@15]/2",
  L: "[f4@3 g4@5 a4@31 bb4@8 ~ a4@8 f4@8]/2",
  M: "[g4@6 ~@2 g4@7 d5@24 ~ c5@4 d5@2 bb4@2 ~ bb4@5 ~@2 a4@3 g4@5, ~@24 c5 ~@7]/2", N: "a4",
  O: "[g5@5 ~@2 g5@9 d6@23 ~ c6@4 d6@2 bb5 ~@2 bb5@6 ~ a5@3 g5@4 ~, ~@24 c6 ~@7]/2",
  P: "[a5@3 bb5@5 c6@31 ~ d6@6 ~ bb5@2 a5@6 g5@4 ~ f5@4, ~@23 a5 ~@8]/2",
  Q: "[d5@4 ~@3 d5@7 ~ g5@24 ~ a5@6 ~@2 a5 ~ g5@5 f5@4 e5@4 ~, ~@47 g5@2 ~@15]/2",
  R: "[f5@3 ~ e5@4 d5@31 e5@9 f5@8 a5@8]/2",
  S: "[g5@7 ~ g5@8 d6@23 c6@4 d6@3 bb5@2 ~ bb5@6 a5@4 ~ g5@4, ~@24 c6 ~@7]/2",
  T: "[a5@4 bb5@3 c6@31 ~@2 d6@5 ~ bb5@2 a5@6 ~ g5@3 ~ f5@5, ~@45 a5@2 ~@17]/2",
  U: "[d5@4 ~@3 d5@7 ~ g5@24 a5@6 g5 a5@2 g5@7 f5@4 ~ e5@3 f5@34 ~@31]/4",
})).s("gm_recorder").gain(0.16).pan(0.6)

// other · clarinet
const clarinet = note(`<
  A@2 B@2 C D E F G@2 H I J K L M N H O@2 P@2 Q R S T U@2 C V W X Y T Z AA AB@2 AC AD AE@3 AF@3 C AG
>`.pickRestart({
  A: "[d4@3 e4]/2", B: "[f4@46 ~@2 f4@7 ~ e4@8]/2", C: "d4", D: "db4", E: "d4@7 ~", F: "d4@3 f4", G: "[g4@3 e4]/2",
  H: "f4@15 ~", I: "f4@3 e4", J: "d4@21 ~@3 d4@8", K: "db4@11 ~ db4@4", L: "d4@27 ~@5", M: "d4 e4 f4 a4", N: "g4 bb4",
  O: "[f4@11 ~ c4@4]/2", P: "[db4@7 bb3]/2", Q: "c4 bb3 a3@6", R: "~@3 c4", S: "d4@31 ~", T: "d4 e4",
  U: "[f4@28 d4@3 ~]/2", V: "d4@16 e4@15 ~", W: "[d4,e4]@5 ~ [d4,e4]@2", X: "[db4,e4]@7 ~ [db4,e4]@13 ~@3 [db4,e4]@8",
  Y: "bb3", Z: "f4", AA: "a3", AB: "[~ d4 db4@2, bb3@63 ~]/2", AC: "[a3,d4]", AD: "f3@2 ~ f4, ~ c4, ~@4 a3@3 ~",
  AE: "[d4@31 e4@32 f4@33]/3", AF: "[e4@31 d4@32 db4@33]/3", AG: "~@2 f3@7 ~@23",
})).s("gm_clarinet").gain(0.14).pan(0.4)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2_2 = note("<A@8 ~ B@5 ~ C@4 D@8 E@7 F@4 G@4 H@6>".pickRestart({
  A: "[f3@31 [e3,bb3]@31 f3@33 e3@31 d3@32 db3@33 a3@32 f3@29 ~@2 bb3@2, bb3@29 ~@227]/8", // Edim
  B: "[~@30 f3@33 e3@31 d3@32 db3@34, ~@94 bb3@65 ~]/5",
  C: "[~@7 e3@8 f3@7 a3@8 g3@5 ~@11 bb3@24 c4@8 bb3@8 a3@4 g3@4 a3@4 bb3@5 c4@25, ~@37 g3@34 ~@57]/4",
  D: "[~@6 db4@8 c4@8 a3@9 db4@7 db4@8 f4@17 ~@7 g4@8 f4@8 eb4@4 ~ db4@3 ~ f4@16 c4@23 ~ bb3@8 c4@7 bb3@4 a3@5 g3@4 ~@3 g3@8 bb3@24 c4@9 bb3@8 a3@3 g3@4 f3@5 g3@4 a3@25, ~@63 g3@31 a3@21 ~@141]/8",
  E: "[~@6 bb3@8 a3@8 f3@8 g3@7 ~ g3@8 bb3@16 ~@16 bb3@8 a3@4 g3@5 a3@60 ~@4 f3@32 bb3@32 ~, ~@62 e3@19 ~@78 bb3@30 ~@35]/7",
  F: "[~@31 e3@31 ~@32 db3@33 ~, ~@62 bb3@65 ~]/4", G: "[~@63 bb3@29 ~@2 [e3,bb3]@34, ~@30 f3@65 ~@33]/4",
  H: "[~@30 e3@31 ~@32 db3@33 a3@35 ~@31, ~@61 d3@32 ~@99, ~@62 bb3@65 ~@65]/6",
})).s("gm_string_ensemble_2").gain(0.35).pan(1)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note("<~@3 A@4 B@3 ~@3 C@2 ~@17 D@5 E@3 ~ F@2 ~@2 G@3>".pickRestart({
  A: "[~@30 bb3@30 ~@2 bb3@32 ~ c3@33]/4", B: "[~@30 f3@32 [e3,bb3]@33 ~]/3", C: "[~@31 a3@33, ~@15 d3@16 ~]/2",
  D: "[~@31 e3@31 f3@35 ~@29 d3@34]/5", E: "[~@5 [c3,a3]@6 ~@5]/3", F: "[~@30 f3@33 ~]/2", G: "[~@31 c3@35 ~@30]/3",
})).s("gm_string_ensemble_2").gain(0.2).pan(1)

stack(piano, piano_2, string_ensemble_2, recorder, clarinet, string_ensemble_2_2, string_ensemble_2_soft)