Strudelify

Symphony No.5

Gustav Mahler

KeyF majorTempo55 bpm
0:00/0:00
// Symphony No.5 — Gustav Mahler
// 55 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/4230156; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 103 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(55/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.

// bass · contrabass · "Harp"
const bass = note(`<
  A B C D E F G H I J K L M N O P Q R S@3 ~ T U V W X Y Z AA AB@2 AC AD AE AF A B ~@2 AG ~@2 AH AI AJ ~@11 AK AL AM@2 AN
  AO ~@4 AP@3 AQ AR B AS AT AU AV AW F G AX AY AZ BA BB BC BD BE V BF BG@3 BH BI@2 BJ@2 BK BL BM@3
>`.pickRestart({
  A: "~@5 c4 a3 c3", B: "~ c4 a3 c3 a2 c2 c4 a3 c3 a2 c2 ~", C: "f2@2 c3@2 a3@2 c4@3 c3@3 ~@2 c3@2 a3@2 ~@2 c4@2 f4@2",
  D: "~ c2 g2 c3 g3 c4 f4@3 ~@3", E: "a1 c3 f3 c4@3 ab1 c3 f3 c4@3", F: "~ g1 g2 d3 f3 d4 f4@3 ~@3",
  G: "gb1 gb2 c3 eb3 c4 eb4 a4@3 d2@3", H: "g2@2 d3@2 bb3@2 d4@3 db4@3 c4@6 a2@6",
  I: "c2@2 c3@2 g3@2 c4@3 c3@3 ~@2 g3@2 c4@2 f4@3 g3@3", J: "~@2 c4@2 f4@2 g4@3 c4@3 ~@12", K: "~ f2 c3 a3 c4@2 c3@2",
  L: "~ c3 a3 c4 f4@2 ~@2", M: "~ f3 d4 f4 ~ f2 b2 f3", N: "b3 f3 d4 f4 ab4@2 ~@2", O: "~ f2 f3 d4 f4@2 ~@2",
  P: "~@5 e2 a2 e3", Q: "~@5 e2 a2 c3", R: "eb3@6 gb3@6 a3@6 c4@6 ~ [b2,ab3]@11 ~@12, ~@2 e2 ~", S: "[a1,c3]/3",
  T: "a2@2 [a1,a2] [g1,g2]", U: "f1 c3 f3 c4 f4@2 ~@2, f2 ~", V: "a2 c3 a3 c4 c5@2 ~@2", W: "bb1@2 ~@2 bb2 f3 d4 f4",
  X: "d5@2 gb2 eb3 bb3@2 ab2 f3", Y: "d4@2 e2@2 a2 c3 f3 c4", Z: "f4 ~ [bb2,f3,db4] ~",
  AA: "~@8 c2!2 c3 f3 c4 f4 c5 f5, ~@4 c3 ~@3",
  AB: "[a5@3 c3@3 f3@3 c4@3 f4@3 a4@3 c5@3 f5@3 a5@12 ~@40 c2@4 c3@4 bb3@4 c4@4 g4@4, ~@3 c2@16 ~@5]/2",
  AC: "~@3 c2 f2 c3 f3 c4, ~ f1@3", AD: "f2 c3 bb3 d4 g4@2 ~@2", AE: "f2 c3 a3 c4 a4@2 ~@2", AF: "~@4 f2 c3 g3@2",
  AG: "~ c2 g2 c3 g3@2 ~@2", AH: "~@5 c3 gb3 eb4", AI: "~@2 c3 g3 eb4 f2 c3 eb3", AJ: "a3 ~ [gb2,db3,db4] ~",
  AK: "db2 ~", AL: "db2@3 c2", AM: "b1 ~", AN: "bb1 ~", AO: "a1 ~", AP: "[a1,a2]/3", AQ: "[ab1,ab2] [g1,g2]",
  AR: "~ f5@3 ~@6 c4@2 a3@2 c3@2, [c3,f3,a3,c4] ~@3, ~ [f4,a4]@11 ~@36, ~ c5@5 ~@18", AS: "f2!2 c3 a3 c4@2 c3@2",
  AT: "~ c3 a3 c4 ~ c4 f4 a4", AU: "c2!2 g2 c3 g3 c4 d4 f4", AV: "g4 ~ bb1@2", AW: "f1 c2 c3 c4@3 ab1 c2 c3 c4@3",
  AX: "g2@2 d3@2 bb3@2 d4@3 db4@3 c4@6 ~@6", AY: "c2!2 g2 c3 g3 c4 g2 c3 g3 ~ e4 g4",
  AZ: "~ g2 c3 g3 c4 f4 ~ g3 c4 ~ f4 g4", BA: "c2 g2 e3 ~ g3 e4 ~@3 g4@3", BB: "~ c4 ~@2", BC: "c5 ~@3",
  BD: "~@2 [a1,a2] [g1,g2]", BE: "[f1,f2] c3 f3 c4 f4@2 ~@2", BF: "bb1@2 ~@2 bb2 f3 d4 g4",
  BG: "[[gb1,d5]@3 ~@3 [g1,g2]@3 ab2@6 e2@3 ~ f3 a3 c4 f4 a4 ~@6 bb1 f2 bb2 f3 bb3 db4, gb2@6 ~@3 ab1@3 ~@6 a2@12 bb2@2 ~@4]/3", // D G
  BH: "f4 bb2 f3 bb3 db4 f4 bb4 db5 [b2,f5] b2 f3 a3 d4 f4 bb4 d5", // Bdim
  BI: "[~ a5@5 ~@12 d3@12 c3@6 a2@6 g2@6, c3@3 ~@5, [f3,a3,c4,a4] ~@7, ~ [c5,f5]@11 ~@84]/2", BJ: "[c2@3 d2@3 c2@2]/2",
  BK: "a1 g1", BL: "g1", BM: "f1/3",
})).s("gm_contrabass").gain(0.2)

// other · violin
const violin = note(`<
  ~@2 A@2 B@2 C D@3 E@2 ~@4 F@2 G@5 H I J K@2 L M N O@2 P Q R S@2 T U V@5 W@2 X Y Z AA AB AC AD AE AF AG AH@2 AI AJ@2
  AK@2 AL@3 AM AN AO@2 AP AQ AR@2 AS@2 AT AU AV AW AX@4 AY AZ BA BB ~@3 BC BD BE@5 ~@4
>`.pickRestart({
  A: "c4/2", B: "f4/2", C: "eb4", D: "[d4@3 db4 c4@8 f4@8 c4@4]/3", E: "[a3@3 ~]/2", F: "[~ a3 ab3 a3 c4@10 b3@2]/2",
  G: "[a3@25 c4 c4@10 d4@2 e4@2]/5", H: "f4@3 c4", I: "c5@7 a4", J: "a4@2 g4@4 gb4 g4",
  K: "[d4 d5@17 a4@6 a4@6 bb4@6 d4 e5@17 d5@6 c5@6 ab4@6 f5@18 c5@6]/2",
  L: "bb4@6 a4@6 a4 g5@5 f5@6 db5@6 a4@6 g4@6 f4@6", M: "~@24 f4 a5@14 f5@3 c5@3 d4@3, ~@25 a4 ~@22", N: "f4 a3",
  O: "[c4@60 f4@24 g4 e4@5 f4@6, ~@85 f4 ~@10]/2", P: "gb4@2 g4@3 a4 bb4 d5", Q: "b4@2 c5@4 e4 f4",
  R: "gb4 g4 bb4@3 g4 f4 e4", S: "[e4 f4@2 ~]/2", T: "a3", U: "ab3", V: "[g3@3 eb4]/5",
  W: "[a3@4 a4@2 bb4@4 c4 db4 ab4@2 gb4@2]/2", X: "db4", Y: "a4", Z: "eb4@3 ab4", AA: "gb4",
  AB: "db5@3 b4 [gb4,bb4]@4, f4 ~", AC: "[eb4,eb5]", AD: "db4 db5@35 eb5@6 f5@6", AE: "eb5@6 f5 gb5",
  AF: "f4 gb5@11 f4@18 f5@6 gb5@6 ab5@6", AG: "a4 b5@5 bb5@6 f5@6 gb5@6 ab4 ab5@5 gb5@6 d5@6 eb5@6",
  AH: "b3 eb5@17 f4@6 ~@6 bb4@6 b4@6 db5@6", AI: "b3 eb5@17 db5@12 b4@6 a4@6 ab4@6, ~ g4 ~@46",
  AJ: "a3 db5@17 eb4@6 ~@6 ab4@6 a4@6 b4@6", AK: "[a3 db5@17 b4@18 a4@30 b4@6 b4@18 db5@6, ~ gb4 ~@94]/2",
  AL: "[db5@2 d5@8 e5@7 d5 bb4 b4 c5 b4 gb4 ab4]/3", AM: "~ b4@3 db4@4", AN: "~ b4@3 c4@4", AO: "[~ b4@7]/2",
  AP: "c4@3 ~", AQ: "~ c4 d4 e4", AR: "[e4@2 f4@3 f4 g4 a4]/2", AS: "[a4@2 g4@3 g4 a4 bb4]/2", AT: "c5@3 c5 d5@3 c5",
  AU: "d4 c5@11 b4@18 bb4@6 d5@6 bb4@6", AV: "bb4 a4 c5@4 bb4 gb4", AW: "gb4@2 g4 bb4@2 a4 g4 f4", AX: "[g4@11 c4@5]/4",
  AY: "~ c4", AZ: "d4 e4", BA: "f4", BB: "c5", BC: "c4 db4@3", BD: "a3 [f4,a4] a5@26 ab3@4 a3@4 db4@3 d4@3 f4@3 a4@3",
  BE: "[a3 c5@119 c4@84 ~@36, ~ f4 ~@238]/5",
})).s("gm_violin").gain(0.15)

// other · viola
const viola = note(`<
  A@2 B C D E D F G@2 H@4 I J@3 K L M N O@2 P Q R@2 Q S@2 P T U V W X@2 Y L Z AA@4 AB AC AD D AE@2 AF AG AH AI AJ AK AL
  AM@2 AN AO AP AQ AR AS AT ~@10 AU E D F AV AW AX AY@5 Q AZ@3 BA BB@2 BC BD BE@2 ~@3
>`.pickRestart({
  A: "[~@2 a3@5 [a3,c4], c4@7 ~]/2", B: "[a3,c4]", C: "[d4,f4]", D: "c4", E: "d4@3 db4", F: "bb3@3 c3",
  G: "[f4@2 c4@3 ~ c3@2]/2", H: "[g3@2 f3@4 c4@2 b3@6 e4 d4, ~@3 f4@4 ab4]/4", I: "[d4,ab4] d4 [c4,f4]@2",
  J: "[[f3,bb3] [e3,a3]@2 [eb3,gb3]@2 [d3,ab3]]/3", K: "~@2 e3@4 d3 e3", L: "f3", M: "e3@7 a3", N: "a3@7 c4", O: "c4/2",
  P: "c3", Q: "f4", R: "[a3 a4@23 d4@12 b4@24 d4@12 ab4@12 a4@12]/2",
  S: "[eb4@6 db4@6 bb3@6 gb3@6 c4 c5@38 a4@3 f4@3 a3@3 c4@24, ~@25 f4 ~@70]/2", T: "c4@3 a3", U: "bb3", V: "a4@3 c4",
  W: "db4 d4@2 c3", X: "a3/2", Y: "d3", Z: "~@2 eb4@3 f4 eb4 c4",
  AA: "[d4 eb4 d4 g3 c3@8 eb3@6 g3@4 gb3@4 g3@2 ab3@2 a3@2, ~@2 g3@7 ~@7]/4", AB: "eb4 db3",
  AC: "~@2 c4 db4 b4@2 bb4@2", AD: "db4 ab4@11 gb4@24 bb3@12", AE: "[b3@8 bb3@7 eb4, db3]/2", AF: "db4 eb4", AG: "ab3",
  AH: "db4 eb3@47", AI: "eb4 ab3@47", AJ: "~ f3@23 [ab3,d4]@24, db4 ~", AK: "eb3 eb4@23 c4@24, gb3",
  AL: "b3@2 ~ g3, ab3@3 ~, ~ bb3", AM: "[db3 b3@23 ~@12 g3@24 [ab3,b3]@24 e4@12, ab3@3 ~@5, ~@2 bb3@3 ~@3]/2",
  AN: "eb4 ~@35 f3@12, a3 ab3, ~ gb3@35 ~@12", AO: "eb4 a3@23 ~@12 e3@12, gb3@3 ~, ~ ab3", AP: "eb4 [gb3,a3]@47",
  AQ: "[g3,b3] [e3,g3]", AR: "[gb3,a3]@3 [a3,gb4]", AS: "e4 a3@3, g3", AT: "[gb3,bb3] [g3,b3]@2 [e3,ab3]",
  AU: "[c4,f4]", AV: "g3 f4@23 e4@24", AW: "a3@3 f4", AX: "e4", AY: "[~@3 c4@17]/5",
  AZ: "[a4@2 d4 b4@2 d4 c4@3 db4@3]/3", BA: "[db4,f4]!2 [d4,f4]!2", BB: "[f3 a4@95, ~ c4 ~@94]/2",
  BC: "c3 a4@47, ~ c4 ~@46", BD: "a3", BE: "[c3@5 ~@3]/2",
})).s("gm_viola").gain(0.15)

// other · viola · soft notes
const viola_soft = note("<~@71 A B@3 C@2 ~@26>".pickRestart({
  A: "d5@2 ~ c5@2 b4@2 ~ a4@2 ab4@2 g4@2 ~ f4@2 e4@2 ~ d4@2 db4@2 c4@24, ~@2 db5@2 ~@3 bb4@2 ~@5 gb4@2 ~@3 eb4@2 ~@27",
  B: "[~ c4@2, c4 ~@2, ~ a3@11]/3", C: "[d4,f4]/2",
})).s("gm_viola").gain(0.05)

// chords · cello · "Violoncello"
const cello = note(`<
  ~ A B@2 C D ~@3 E F@2 G@2 H I@3 J K L@4 M N O@3 P@4 Q M R S@2 T U V@4 W@5 ~@4 X Y Z AA AB AC AD AE AF AG AH@3 AI AJ AK
  AL@2 ~ A AM@4 ~@4 AN AO AP@6 N AQ@4 AR@2 AS@3 AT@4
>`.pickRestart({
  A: "~ a3@2 g3", B: "[c3@7 bb2]/2", C: "a2 ab2", D: "g2 ~", E: "~ c4 d4 e4", F: "[e4@2 f4@3 f4 bb4 a4, c3]/2",
  G: "[a4@2 ab4@3 ab4 c5 b4, d3@3 e3]/2", H: "b4@5 a4 g4 f4, f3", I: "[e4 d4 bb3 f3 e2@16 ~@4, d2 c4@2 ~@3]/3",
  J: "~@7 a2", K: "a2 c3 c3@4 b2 a2", L: "[a2 c3@15]/4", M: "c4", N: "db4@3 d4", O: "[eb4@2 e4 f4@3 c4@3 db4@3]/3",
  P: "[eb4@6 db4@6 bb3@6 gb3@6 [c3,f3] c4@2 f3@3 c3@3 f2@3 ~@15 c4@3 a3@3 f3@3 c3@12 ~@24 bb3@60 a3@24 c4@12, ~@25 f4@26 ~@141, ~@3 c2@3 c3@7 f2@3]/4", // F5
  Q: "d4", R: "bb3", S: "[f2,c3]/2", T: "~ a3@47, f2, ~ d3 ~@46", U: "f2 ab3@47, b2, ~ d3 ~@46",
  V: "[g2 g3@47 f3@24 c3 eb4@47 g2 b3@35 c4@24 eb4@12, c2@3 ~@5, ~ g2@71 ~ g3 ~@47 eb3 ~@70]/4",
  W: "[c3@2 b2 c3@3 ~@10 gb3@4, ~@3 db3@7]/5", X: "bb2 db4@47, ~ eb3 ~@46", Y: "b2 eb4@47, ~ ab3 ~@46",
  Z: "~ db4@11 f3@12 ab3@12 d4@12, bb2, ~ f3 ~@46", AA: "gb3 eb4@11 gb3@12 c4@12 gb4@12, eb3 ab2",
  AB: "ab3 f4@35 e4@12, db3", AC: "ab3 f4@35 [c3,e4]@12, db3@3 ~", AD: "~ e4@23 ab3 eb4@11 db4@6 b3@6, b2, ~ g3 ~@46",
  AE: "a3 eb4@35 d4@12, b2", AF: "a3 eb4@35 d4@12, bb2", AG: "~ eb4@23 d4@12 db4@6 c4@6, a2, ~ gb3 ~@46",
  AH: "[a2@6 a2@4 ~ a3, ~@5 a2]/3", AI: "e4@3 d4", AJ: "[g3,db4]", AK: "[gb3,c4]", AL: "[f3,db4]/2", AM: "[c3@7 bb2]/4",
  AN: "~@2 c4@4 b3 c4", AO: "db4 d4 f4@3 d4 c4 b3", AP: "[b3@2 c4@4 c3@5 c3@12 c4]/6",
  AQ: "[eb4@8 e4@4 f4@12 ab4@4 a4@33 f4 a3 f3]/4", AR: "[c2 c3@35 d3@24 c3@12 a2@12 g2@12]/2", AS: "[c2 d2 c2@2]/3",
  AT: "c3/4",
})).s("gm_cello").gain(0.15)

// other · pizzicato strings
const pizzicato_strings = note("<~@6 A B C ~@40 D@2 ~@13 E ~@12 F G ~@24>".pickRestart({
  A: "gb2 ~@2 d2", B: "g2@2 ~ e2 f2@2 a2@2", C: "c3 ~@3", D: "db2 ~@3", E: "~@2 a2 ~", F: "a2 ~ ab2 ~", G: "g2 ~@3",
})).s("gm_pizzicato_strings").gain(0.15)

// bass · acoustic bass
const bass_2 = note(`<
  ~@2 A B C D ~@2 E ~ A ~ A F A G ~ F ~@4 H A I J K L M ~@5 A ~ N ~ O P Q R@6 ~@6 S T J U ~@6 V W@2 ~@11 C D X Y ~@2 E
  ~@2 Z N V AA K AB M AC ~@9
>`.pickRestart({
  A: "f2 ~@3", B: "c2 ~@2 bb1", C: "a1 ~ ab1 ~", D: "g1 ~@3", E: "c2 ~@3", F: "~@2 e2 ~", G: "d2 ~ e2 ~",
  H: "a2 ~@2 g2", I: "a2 ~@3", J: "bb2 ~@3", K: "gb2 ~ g2 ab2", L: "~ e2 a2 ~", M: "~@2 bb2 ~", N: "f1 ~@3", O: "f2",
  P: "b1", Q: "c2@3 ~", R: "[~@2 c3@4 eb2@5 c2@3 f1@4 gb1@4 ~@2]/6", S: "bb2", T: "b2", U: "eb3 ~ ab2 ~", V: "a1 ~@3",
  W: "~@2 a1 ~", X: "gb2 ~@2 d2", Y: "g2@2 ~ e2 f2@2 a2@2", Z: "~@2 a1 g1", AA: "bb1 ~@3", AB: "ab2 e2 a2 ~",
  AC: "bb2 b2",
})).s("gm_acoustic_bass").gain(0.15)

stack(bass, violin, viola, viola_soft, cello, pizzicato_strings, bass_2)

More by Gustav Mahler