Strudelify
KeyD majorTempo93 bpm
0:00/0:00
// Souvenir — František Alois Drdla
// 93 bpm, 3/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5911206; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 104 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(93/3)

// 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 · pizzicato strings
const pizzicato_strings = note("<~@101 [~@15 d4@8 ~]!2 ~>").s("gm_pizzicato_strings").gain(0.25)

// chords · piano
const piano = note(`<
  A B C D A B C E F G H I A B C E J K L M N O@2 P Q@3 R N O@2 S T K U@2 V@3 W@2 X@7 Y@5 Z AA AB@6 AC@3 AD@8 ~@2 AE@2 AF
  AG@6 AH@5 AI AJ@2 AK@3 AL@8 AM@2
>`.pickRestart({
  A: "~@2 a2, d2, ~ [d4,f#4]@2, ~@3 a4@5", B: "~@2 a2, [f#3,a3], ~ d4@23", C: "~@2 a2, d2, ~ [d4,f#4]@2, ~@3 b4@5",
  D: "~@2 [a2,c#4,e4], f#3, [d4,f#4] [d4,f#4]@2, ~ a4@23", E: "~@2 a2, [f#3,a3,d4], ~ f#4@23",
  F: "~@2 [e2,e3,b3,d4], [b1,b2], ~ [g#3,e4]@2", G: "a2@2 [a2,g3,a4], [a1,c#4,e4,g4,b4]",
  H: "~@8 a5@3 f#5@2 d5@3 [a2,b4]@6 c#5@2, d2@2 ~, [d4,f#4,a4] ~@2, ~ a2@15 ~@8, ~ f#3@7 ~@4", I: "[f#3,a4]@2 a2",
  J: "~@2 [g1,b3,c#4], [g2,e4], ~ g4@2, ~@11 a4@13, ~@13 a#4@11", K: "[g3,a3]@2 [g3,a3,c#4], [a1,a2,e4]",
  L: "a3@4 ~@4 [a2,a4]@3 b4, [d2,d3,f#3], d4@11 d4@13, ~ a3@2, ~@13 f#4@11", M: "~@2 a2, [f#3,d5]",
  N: "~@8 [a2,a4]@3 b4, d2, ~ a3@2, ~@11 d4@13, ~@13 f#4@11", // A
  O: "[~@8 a2@4 ~@8 [a2,a4]@3 c#5, f#4@37 f#4@11, d3 d2, ~@16 d4@19 d4@13, ~ a3 a3]/2", // A
  P: "~@2 [a2,d4,f#4], [f#3,b4], [d4,f#4]@2 ~, ~ a4@2", // D B5 D
  Q: "[d4@4 ~@4 [e2,d4,b4]@4 c#4@4 ~@4 [a2,g3,c#4,b4]@3 ~@9 [a2,b4]@3 c#5, [b1,b2,g#3]@24 a1@24 [d2,d4,f#4]@11 f#5@2 d5@11, e4@11 e4@5 e4@19 e4@13 ~ a2@7 a5@16, ~@8 d4@8 ~@8 [a2,b4]@13 g4@11 ~@2 f#3@22, ~@13 g#4@11 ~@8 c#4@8 ~@6 a4@26]/3", // E7 A7 Asus2 E D Asus2
  R: "~@2 a2, [d2,d3,a4]", S: "~@2 [a2,a3,d4,f#4], [f#3,b4], [d4,f#4]@2 ~, ~ a4@2",
  T: "~@2 [g1,b3,c#4], [g2,a#3,d4,e4], ~ g4@2, ~@11 a4@13, ~@13 a#4@11", // C#m7b5 Em7b5
  U: "[~@2 a2 [d2,d3]@3, [f#3,a3,d4], [d2,d3] ~]/2", // D
  V: "[~@4 [f4,a#4,d5]@4 [a#4,d5]@3 [g4,a#4,d5]@4 [a#4,d5]@4 [f#4,a#4,d5]@4 ~@15 [f3,f4,d5]@8 ~@19 c#5@3 a#2@4, a#2@23 ~@7 a#3@15 ~ a#2@22 ~@4, ~@8 [f3,f4]@15 [f4,d5]@15 ~@19 g4@11 ~@4, ~@15 [a#3,g4]@8 [d4,a#4]@23 ~@3 g3@19 ~@4, ~@34 [e4,c#5]@11 ~@8 e4@8 [c#4,e4]@8 ~@3]/3", // A# Gm A# F#aug Dm F Dm D# …
  W: "[~@15 d5@4 ~@19 a4@4 [f2,c3]@4 a4@2, f3@19 a#2@23 ~@6, ~@4 f4@8 [d4,f4]@8 ~@3 f3@25, ~@8 a#4@11 ~@8 d#4@15 ~@6, ~@15 f4@2 c4@4 ~@3]/2", // F5 Dm
  X: "[~@13 f5@4 ~@3 [d6,f6]@4 d6@4 [a#5,d6]@4 a#5@4 [f5,a#5]@3 f5@4 [d5,f5]@4 d5@4 [a#4,d5]@4 [a#4,d5]@7 ~@4 [d4,f4,a#4]@4 ~@4 [c#4,g4,a4]@3 g4@4 [d3,d4,g4,a#4]@4 ~@19 [a#2,a#3,g4]@4 ~@19 a4@4 ~@19 a#4@3 ~@12 g4@3, ~ [d3,f3,a3,c4,a4,c5]@15 ~ [a#2,d5]@23 ~@22 g2@23 [g2,g3,d4,a#4,d5]@23 f4@7 d4@15 ~@12 g4@11 ~@15, ~@5 d#5@11 ~ f5@19 ~@11 f5@15 ~@8 [d4,a#4]@7 [d#3,c#4,a4]@8 ~@11 e4@11 ~ a3@11 f4@11 ~@8 e4@15 [e2,e3]@15, ~@9 g5@8 f3@7 [f3,f6]@15 [d4,f4,a#5]@23 ~@8 f4@15 g4@19 ~@4 a4@15 a3@8 ~@15 a#3@8 ~@7 d4@7, ~@24 a#3@8 [a#3,d4,d6]@8 ~@22 d3@19 ~@19 [a2,a3,f4]@8 a2@23 [g2,g3]@23 ~@14]/7", // Dm A# A#5 Dm A# A7 Gm D# …
  Y: "[~@4 a#4@4 ~@19 e4@4 ~@19 f4@4 ~@19 f5@3 ~@4 [f4,a#4,d5]@4 [a#4,d5]@4 [g4,a#4,d5]@4 [a#4,d5]@3 [f#4,a#4,d5]@4 ~@15 [f3,f4,d5]@6, a#3@8 [c2,g2]@23 f2@23 ~@11 e5@4 g5@8 ~@22 [f4,d5]@15 ~@6, ~@16 a#3@15 a3@4 c3@19 ~@7 d#5@15 ~@16 [a#3,g4]@8 ~@7 a#3@13, ~@19 g4@11 ~ f4@11 a3@4 c4@8 ~@3 c5@19 a#2@23 ~@12 [e4,c#5]@9, ~@23 c4@8 c4@7 f3@15 ~ [f3,a3,c4,d#4,a4]@23 ~@7 [f3,f4]@15 [d4,a#4]@21]/5", // A# Gm A# F#aug Dm C5 Dm D# …
  Z: "~@7 c#5, ~ a#2@11, ~ g3@3, ~@10 e4@7 [c#4,e4]@7, ~@13 g4@11", // C#m
  AA: "~@5 d5, ~ a#2@23, ~@5 f3@19, ~ f4 [d4,f4], ~@12 a#4@11 ~", // Dm
  AB: "[~@18 a4@4 ~@4 a4@4 ~@11 f5@4 ~@4 [d6,f6]@4 d6@3 [a#5,d6]@4 a#5@4 [f5,a#5]@4 f5@4 [d5,f5]@3 d5@4 [a#4,d5]@4 [a#4,d5]@8 ~@19 d#4@3 [g3,a#4]@23 ~@4 d4@4, a#2@23 ~@14 g5@8 f5@19 ~@11 f5@15 ~@8 d#4@8 [d#3,g4]@8 ~@30, ~@3 f3@27 [d3,f3,a3,c4,a4,c5]@15 [a#2,d5]@23 ~@23 d#2@23 ~@22 e2@8, ~@7 d#4@8 c4@8 ~@11 d#5@11 ~@8 a#3@7 [a#3,d4,d6]@8 [d4,f4,a#5]@23 ~@3 a#3@8 a#3@11 ~@31, ~@11 f4@11 [f2,c3]@23 f3@8 [f3,f6]@15 ~@30 a#2@15 ~@31]/6", // Dm A# A#5 Dm A# Gm D# Dm7 …
  AC: "[~@11 [d3,d4]@4 [g3,a#4,d5]@23 ~@19 [f3,d4]@3 [a#3,a#4,d5]@12, g2@15 ~@23 f2@23 ~@11, [g4,a#4]@7 [a#2,g4,a#4]@8 ~@30 [a#2,f4]@15 ~@12, ~@4 d4@7 ~@31 d4@7 d4@8 ~@15, ~@53 [d3,a#4]@8 ~@11]/3", // D Gm Dm A# Gm D# A#5 Gm
  AD: "[~@30 f#4@4 [d#4,f#4,a4,c5,d5]@23 ~@19 a4@4 [f2,c3,c5,d#5,g5]@22 ~@19 a#4@4 [c#4,g4,a#4,c#5,d#5,g5]@23 ~@11 [c#3,e3,g3,a3,c#4,e4,g4]@4 [c#3,e3,g3,a3,c#4,e4,g4]@29, ~@11 a#2@46 c3@23 ~@22 f2@46 [e2,a4,c#5,e5,g5]@23 ~@21, ~@15 f#4@8 f#4@7 ~@31 a4@11 d#5@8 ~@26 a#4@8 a#4@7 ~@71, ~@19 f#3@15 ~@30 [f3,a3,c4,d#4,c5]@15 ~@31 [f3,c#5]@15 ~@23 e3@11 ~@33, ~@19 [a4,c5,d5]@7 [a3,a4,c5,d5]@8 ~@34 f4@11 ~@31 a#3@8 [a#3,e4,e5]@8 ~@30 [a1,a2]@36]/8", // D7 Cm D#7 A7 F7 C# D7 A#dim …
  AE: "[~@18 a3@4 ~@19 a3@4 a2@3, ~@14 g#4@8 a2@23 ~@3, ~@15 a4@7 ~@15 g#4@8 ~@3, ~@38 a4@7 ~@3]/2",
  AF: "~@16 a3@3 a2@5, ~@3 a#4@2 ~, ~@13 b4@7 ~@4",
  AG: "[~@27 c4@6 [g3,c4,e4]@6 ~@16 a2@8 ~@16 a2@8 ~@16 a2@8 ~@16 a2@8 d2@8 [d4,f#4], ~@22 [a1,a2,b3,c#4,g4]@17 [d2,d3]@24 d3@24 d2@24 ~@33, ~@27 [a3,f#4]@12 [f#3,a3,d4]@48 ~@8 [d4,f#4]@16 [f#3,a3]@24 ~@9, ~@96 a4@15 ~ d4@23 ~@9]/6", // C D A7 D F#m
  AH: "[~@7 a2@8 ~@16 a2@8 ~@16 [e2,e3,b3,d4]@8 a2@16 [a2,g3,a4]@8 ~@8 a5@3 f#5@2 d5@3 [a2,b4]@6 c#5@2 [f#3,a4]@9, b4@15 [f#3,a3,d4]@24 [b1,b2]@24 [a1,c#4,e4,g4,b4]@24 d2@16 ~@17, ~@16 f#4@23 ~@8 [g#3,e4]@16 ~@24 [d4,f#4,a4]@8 ~@25, ~@88 a2@15 ~@17, ~@89 f#3@14 ~@17]/5", // E7 A7 Asus2 F#m D B A7 C#m …
  AI: "~@7 a2@8 d2@8 a3", AJ: "[~@7 [a2,a4]@6 b4@2 ~@16 a2@8 d2@8 a3, ~@2 d4@13 d3@24 ~@9, ~@4 f#4@11 f#4@33]/2",
  AK: "[~@7 [a2,a4]@6 c#5@2 ~@16 [a2,a3,d4,f#4]@8 ~@16 [g1,b3,c#4]@8 [a1,a2,g3,a3,e4]@9, ~@2 d4@13 [f#3,b4]@24 [g2,a#3,d4,e4]@24 ~@9, ~@4 f#4@11 [d4,f#4]@16 ~@19 a4@13 ~@9, ~@23 a4@16 ~@8 g4@16 ~@9, ~@52 a#4@11 ~@9]/3", // A D C#m7b5 A7 B5 Em7b5 D
  AL: "[~@7 [g3,a3,c#4]@8 ~@16 a2@8 ~@16 a2@8 ~@2 d4@6 ~@8 [f#4,b4]@6 [f#4,b4,d5]@2 [d4,f#4,b4,d5,f#5]@24 ~@2 d4@6 d4@3 f4@2 a#4@3 [a#4,d5]@6 [d5,f5]@2 [a#4,d5,f5]@24 ~@16 [d4,d5]@6 [a3,a4]@2 [d3,d4]@8 [b3,b4], ~@15 [f#3,a3,d4]@48 f#3@8 d4@3 [b3,f#4]@2 [d4,a4]@11 ~@25 a#3@7 a#3@3 d4@2 f4@11 ~@25 a3@10 [a4,a5]@2 [f#4,f#5]@11 ~@9, ~@5 [d2,d3]@8 [d2,d3]@8 d2@16 d2@16 [d2,a2]@11, ~@64 a2@47 ~ a#2@47 ~@2 d4@6 [b4,b5]@16 ~@9, ~@64 a3@7 a3@16 ~@24 f3@24 ~@24 f#3@24 ~@9]/8", // A7 B5 Bm A# Dm A# D A …
  AM: "[~@7 [d3,d4]@6 [a2,a3]@2 d2@8 [d2,a2]@16 ~@9, ~@2 [a3,a4]@13 ~@33, ~@4 [f#3,f#4]@11 [d3,f#3,a3,d4]@24 ~@9]/2", // D A D5 A F# D
})).s("gm_piano").gain(0.2)

stack(pizzicato_strings, piano)