Strudelify

Pictures at an Exhibition

Modest Mussorgsky

KeyF majorTempo95 bpm
0:00/0:00
// Pictures at an Exhibition — Modest Mussorgsky
// 95 bpm, 6/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: metre changes (5/4 at bar 1, 6/4 at bar 2, 5/4 at bar 3, 6/4 at bar 4, ...) are rendered on a constant 6/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/6297971; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 15 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(95/6)

// 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 · trumpet · "B♭ Trumpet"
const trumpet = note("<~@2 A B C D E ~ F G H I J@3>".pickRestart({
  A: "~@16 d4@5 c4@5 ~ d4@5", B: "a4@5 a4@5 ~ a4@5 bb4@5 g4@5 ~ g4@5", C: "c4@5 c4@5 ~ f4@5 g4@5 d4@5 ~ f4@2 g4@3",
  D: "c4@5 g4@3 a4@3 f4@5 f4@5 f4@5 ~ f4@5", E: "f4@5 ~@27", F: "ab4@5 bb4@5 ~ ab4@5 bb4@3 c5@2 eb5@3 bb4@3 ab4@5",
  G: "ab4@3 c5@2 db5@3 ~@3 eb5@2 db5@3 c5@3 db5@2 db5@3 db5@3 c5@5", H: "c5@21 ~@11", I: "d4@6 c4@6 ~ d4@6 a4@6 a4@6 ~",
  J: "[a4@6 bb4@6 g4@6 ~ g4@6 c4@6 c4@6 ~ d4@6 c4@6 d4@6 ~ a4@6 a4@6 g4@6 ~ g4@6 d4@6 c4@6 ~@2]/3",
})).s("gm_trumpet").gain(0.4)

// other · trumpet · "B♭ Trumpet"
const trumpet_2 = note("<~@2 A B C ~ D E F G H I J@3>".pickRestart({
  A: "~@16 bb3@5 a3@5 ~ bb3@5", B: "c4@5 f4@5 ~ c4@5 f4@5 d4@5 ~ e4@5", C: "g3@5 a3@5 ~@22",
  D: "~@5 f4@5 ~ g4@5 d4@5 f4@3 g4@3 eb4@5", E: "bb4@3 c5@2 ab4@5 ~ ab4@5 ab4@5 ab4@5 ~ ab4@5",
  F: "ab3@5 bb3@5 ~ ab3@5 bb3@3 c4@2 eb4@3 bb3@3 ab3@5",
  G: "f4@3 ab4@2 ab4@3 ab4@3 bb4@2 ab4@3 ab4@3 gb4@2 f4@3 db4@3 eb4@5", H: "eb4@21 ~@11",
  I: "bb3@6 a3@6 ~ bb3@6 c4@6 f4@6 ~",
  J: "[c4@6 f4@6 d4@6 ~ e4@6 g3@6 a3@6 ~ bb3@6 a3@6 bb3@6 ~ c4@6 f4@6 d4@6 ~ e4@6 g4@6 a4@6 ~@2]/3",
})).s("gm_trumpet").gain(0.4)

// other · trumpet · "B♭ Trumpet"
const trumpet_3 = note("<~@2 A B C D E F G H I J K@3>".pickRestart({
  A: "~@16 g4@5 f4@5 ~ g4@5", B: "f4@5 d4@5 ~ f4@5 bb4@5 g4@5 ~ c4@5", C: "e4@5 f4@5 ~@22", D: "~@16 f4@5 bb4@5 ~ g4@5",
  E: "f4@5 ~@27", F: "~@11 ab4@5 db5@5 bb4@5 ~ ab4@5", G: "gb4@11 f4@5 gb4@5 gb4@5 ~ gb4@5",
  H: "f4@3 eb4@2 db4@5 ~ eb4@2 f4@3 ab4@5 bb4@5 ~ ab4@5", I: "ab4@21 ~@11", J: "g4@6 f4@6 ~ g4@6 f4@6 d4@6 ~",
  K: "[f4@6 bb4@6 g4@6 ~ c4@6 e4@6 f4@6 ~ g4@6 f4@6 g4@6 ~ f4@6 d4@6 g3@6 ~ c4@6 e4@6 f4@6 ~@2]/3",
})).s("gm_trumpet").gain(0.25)

// other · trumpet · "B♭ Trumpet"
const trumpet_4 = note("<~@2 A B C D E F G H I J K@3>".pickRestart({
  A: "~@16 g4@5 a4@5 ~ g4@5", B: "f4@5 d4@5 ~ f4@5 bb4@5 g4@5 ~ c4@5", C: "e4@5 f4@5 ~@22", D: "~@16 f3@5 bb3@5 ~ g3@5",
  E: "f3@5 ~@27", F: "~@11 ab3@5 db4@5 bb3@5 ~ ab3@5", G: "gb3@11 f3@5 gb3@5 gb3@5 ~ gb4@5",
  H: "f4@3 eb4@2 db4@5 ~ eb4@2 f4@3 ab4@5 bb4@5 ~ ab4@5", I: "ab4@21 ~@11", J: "g4@6 a4@6 ~ g4@6 f4@6 d4@6 ~",
  K: "[f4@6 bb4@6 g4@6 ~ c4@6 e4@6 f4@6 ~ g4@6 a4@6 g4@6 ~ f4@6 d4@6 g4@6 ~ c5@6 e5@6 f5@6 ~@2]/3",
})).s("gm_trumpet").gain(0.25)

stack(trumpet, trumpet_2, trumpet_3, trumpet_4)