Strudelify

Moscow Nights

Vasily Solovyov-Sedoi

KeyF majorTempo116 bpm
0:00/0:00
// Moscow Nights — Vasily Solovyov-Sedoi
// 116 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: ch 1 "Flutes" named as a pipe, played on flute (its pizzicato strings patch is not one); ch 2 "Oboes" named as a reed, played on oboe (its tremolo strings patch is not one); ch 3 "Clarinets in B♭" named as a reed, played on clarinet (its string ensemble 1 patch is not one); ch 4 "Bassoons" named as a reed, played on bassoon (its pizzicato strings patch is not one); ch 5 "Horns in F" named as a brass, played on brass section (its tremolo strings patch is not one); ch 6 "Trumpets in B♭" named as a brass, played on trumpet (its string ensemble 1 patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5980213; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 27 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(116/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.

// other · flute · "Flutes"
const flute = note("<A@6 B@4 C@2 D@2 E F G H I ~ J@2 K L@2 M@2>".pickRestart({
  A: "[~@11 d5@9 f5@10 a5@10 f5@9 g5@19 ~ f5@9 e5@10 a5@19 g5@19 ~ d5@37 ~ f5@10 a5@10 c6@7]/6",
  B: "[~@2 a5@10 d6@19 c6@10 bb5@10 a5@37 ~ b5@18 ~@2 db6@18 ~]/4", C: "[e6 d6 a5@3 f5 e5 d5]/2",
  D: "[a5@8 g5@8 bb5@31 ~ c6@8 bb5@8]/2", E: "a5@2 g5 f5", F: "a5 g5", G: "d5@15 ~", H: "b5@15 ~ db6@15 ~", I: "e5 d5",
  J: "[a4@16 bb4@32 [bb4,c5]@15 ~]/2", K: "bb4!2", L: "[a4@31 ~]/2", M: "[d5@61 ~@3]/2",
})).s("gm_flute").gain(0.25)

// other · oboe · "Oboes"
const oboe = note("<~@18 A B C@2 B D ~ E@2>".pickRestart({
  A: "d5 a4", B: "f4!2", C: "[g4 g4@2 g4]/2", D: "e4", E: "a4/2",
})).s("gm_oboe").gain(0.3)

// chords · clarinet · "Clarinets in B♭"
const clarinet = note("<A@5 B@5 C@2 D@2 E F G H I@2 J@2 K L ~ M@2>".pickRestart({
  A: "[~@11 d4@9 f4@10 a4@10 f4@9 g4@19 ~ f4@9 e4@10 a4@19 g4@19 ~ [a3,d4]@33, ~@11 a3@38 g3@39 a3@39 ~@33]/5", // D5
  B: "[~@5 f4@10 a4@10 c5@9 a4@10 d5@19 c5@10 bb4@10 [a3,a4]@38 [g3,b4]@19 ~ [a3,db5]@19, ~@5 a3@39 f3@39 ~@77]/5", // A G A
  C: "[e5 d5 a4@3 f4 e4 d4, a3]/2", D: "[a4 g4 bb4@4 c5 bb4, g3]/2", E: "a4@2 g4 f4, bb3", F: "a4 g4, a3", G: "[a3,d4]",
  H: "[g3,b4] [a3,db5]", I: "[a4 f4 e4 d4, [d3,a3]]/2", J: "[c4 c4@2 c4, [d3,g3]]/2", K: "[a3,bb3,c4] [bb3,c4]",
  L: "[a3,db4]", M: "[a3,d4]/2",
})).s("gm_clarinet").gain(0.25)

// other · bassoon · "Bassoons"
const bassoon = note("<~@19 A B@2 C D@4>".pickRestart({
  A: "a3!2", B: "g3", C: "~ f3", D: "a3/2",
})).s("gm_bassoon").gain(0.3)

// other · brass section · "Horns in F"
const brass_section = note("<~@8 A@2 B@2 C@2 D E F G B@2 C@2 D H I J@2>".pickRestart({
  A: "[~@25 b3@19 ~ db4@19]/2", B: "[e4 d4 a3@3 f3 e3 d3]/2", C: "[a3 g3 bb3@4 c4 bb3]/2", D: "a3@2 g3 f3", E: "a3 g3",
  F: "d3", G: "b3 db4", H: "a3", I: "g3", J: "d4/2",
})).s("gm_brass_section").gain(0.3)

// other · tremolo strings · "Timpani"
const tremolo_strings = note("<~@8 A@2 B ~ B ~@2 C B C B ~ B ~ B@2 D B ~>".pickRestart({
  A: "[~@25 d3@19 ~ d3@19]/2", B: "d3", C: "d3!2",
  D: "d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3 d3 e3",
})).s("gm_tremolo_strings").gain(0.5)

// other · string ensemble 1 · "Violin I"
const string_ensemble_1 = note("<~@5 A@5 B@2 C@2 D E D F G@2 H@2 I J K D L>".pickRestart({
  A: "[~@5 c5@39 [bb4,d5]@39 c5@38 b4@19 ~ a4@19]/5", B: "[a4,d5]/2", C: "[bb4,d5]/2", D: "d5", E: "db5",
  F: "[g4,b4] [g4,db5]", G: "[e6 d6 a5@3 f5 e5 d5]/2", H: "[a5 g5 bb5@4 c6 bb5]/2", I: "a5@2 g5 f5", J: "a5", K: "g5",
  L: "d6",
})).s("gm_string_ensemble_1").gain(0.3)

// other · string ensemble 1 · "Violin I" · soft notes
const string_ensemble_1_soft = note("<A@6 ~@21>".pickRestart({
  A: "[~@11 d5@38 d5@39 db5@39 d5@39 ~@26]/6",
})).s("gm_string_ensemble_1").gain(0.2)

// chords · string ensemble 1 · "Violin II"
const string_ensemble_1_2 = note("<~@5 A@5 B@2 C@2 D E D F G@2 H@2 I J ~ K@2>".pickRestart({
  A: "[~@5 a4@39 f4@39 a4@38 g4@19 ~ g4@19]/5", B: "e4/2", C: "a4/2", D: "a4", E: "g4", F: "[g4,b4] [g4,a4]",
  G: "[a4 a4, f4]/2", H: "[a4,bb4]/2", I: "[a4,d5]", J: "[g4,db5]", K: "[a4,d5]/2",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · string ensemble 1 · "Violin II" · soft notes
const string_ensemble_1_soft_2 = note("<A@6 ~@21>".pickRestart({
  A: "[~@11 a4@38 bb4@39 g4@39 a4@38 ~@27]/6",
})).s("gm_string_ensemble_1").gain(0.2)

// chords · string ensemble 1 · "Viola"
const string_ensemble_1_3 = note("<~@5 A@5 B@2 C@2 D E D F G@2 C@2 D E ~ B@2>".pickRestart({
  A: "[~@5 [c4,f4]@39 [bb3,d4]@39 [c4,f4]@38 [b3,e4]@19 ~ [db4,e4]@19]/5", B: "[d4,f4]/2", C: "[d4,g4]/2", D: "[d4,f4]",
  E: "[db4,e4]", F: "[b3,e4] [db4,e4]", G: "[d4,e4]/2",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · string ensemble 1 · "Viola" · soft notes
const string_ensemble_1_soft_3 = note("<A@6 ~@21>".pickRestart({
  A: "[~@11 [d4,f4]@38 [d4,g4]@39 [db4,e4]@39 [d4,f4]@39 ~@26]/6", // Dm G5 Dbm Dm
})).s("gm_string_ensemble_1").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~@10 A ~@7 A ~@3 A@2 ~ A ~>".pickRestart({
  A: "x",
})).gain(0.45)

stack(
  flute, oboe, clarinet, bassoon, brass_section, tremolo_strings, string_ensemble_1, string_ensemble_1_soft,
  string_ensemble_1_2, string_ensemble_1_soft_2, string_ensemble_1_3, string_ensemble_1_soft_3, crash
)