Strudelify

Fugue in G minor BWV 578

J. S. Bach

KeyB♭ majorTempo80 bpm
0:00/0:00
// Fugue in G minor BWV 578 — J.S. Bach
// 80 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5742197; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 68 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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
const flute = note(`<
  ~@5 A B C D E F G H I J K L ~@4 M N@2 O ~@7 P Q R@2 ~@2 S T U V W X Y Z AA AB AC@2 AD AE@3 AF ~@3 AG@2 AH AI AJ AK
  AL@3 AM
>`.pickRestart({
  A: "d5@2 a5@2 f5@3 e5", B: "d5 f5 e5 d5 db5 e5 a4@2", C: "d5@2 a4@2 e5@2 a4@2 f5@2 e5 d5 e5@2 a4@2",
  D: "d5@2 a4 d5 e5@2 a4 e5 f5@2 e5 d5 e5 a4 a5 g5", E: "f5 e5 d5 f5 e5 d5 db5 e5 d5 a4 d5 e5 f5 g5 a5 b5",
  F: "c6 bb5 c6 d6 c6 d6 a5 c6 bb5 a5 bb5 c6 bb5 a5 g5 bb5", G: "a5 g5 gb5 d5 g5@2 ~@2",
  H: "~@2 d5@2 g5@2 a5@2 bb5 c6 bb5 c6 [c6,d6] c6 [c6,d6] bb5", I: "[c6,d6] c6 d6 eb6 d6 c6 bb5 a5 d5@2 ~@2 c5@2 ~@2",
  J: "d5@2 ~@2 c5@2 ~@3 g5 gb5 g5 ~ g5 gb5 g5", K: "~ g5 gb5 g5 ~ g5 gb5 g5 d5@4 c5@4", L: "bb4 ~@3",
  M: "~ a4 d5 c5 bb4@4", N: "[~@2 g4@2 c5@2 bb4@2 a4@11 ~ g4@8 gb4@4]/2", O: "g4 ~@7", P: "a4@2 f4@2 d4@3 c4",
  Q: "~@7 f4", R: "[f4@15 ~]/2", S: "f5 eb5 f5 g5 f5 eb5 d5 f5 eb5 d5 eb5 f5 eb5 d5 c5 eb5",
  T: "d5 c5 d5 eb5 d5 c5 bb4 d5 c5 bb4 c5 d5 c5 bb4 a4 c5", U: "bb4 c5 d5 bb4 c5 d5 eb5 c5 d5 c5 bb4 c5 d5 eb5 d5 eb5",
  V: "f5 g5 f5 g5 g5@3 f5 [g5,a5] g5 a5 bb5 a5 g5 f5 eb5", W: "d5 f5 eb5 f5 a4 f5 eb5 f5 bb4 f5 eb5 f5 a4 f5 eb5 f5",
  X: "d5 bb5 a5 bb5 eb5 bb5 a5 bb5 f5 bb5 a5 bb5 eb5 bb5 a5 bb5", Y: "bb5 d6 c6 bb5 a5 g5 f5 eb5 ~@2 f5@2 bb5@2 a5@2",
  Z: "g5@9 ~ c5@2 a5@2 g5@2", AA: "f5@9 ~ bb4@2 g5@2 f5@2", AB: "eb5@9 eb5 d5 c5 b4@4",
  AC: "[c5@4 ~@6 c5@2 ab5@2 f5@7 f5 eb5 d5 eb5 d5 c5 f5 d5 c5 b4 d5]/2",
  AD: "eb5 g4 c5 d5 eb5 f5 eb5 f5 g5 eb5 c5 g5 ab5 f5 g5 ab5",
  AE: "[d5 eb5 d5 c5 b4@2 d5@2 g4@32 ~@2 g5@2 f5 eb5 d5 f5]/3", AF: "eb5@2 ~@3 c5 bb4 f4",
  AG: "[g4 d4 a4 d4@2 g4 c4 f4@2 f4 d4 g4@2 g4 e4 a4]/2", AH: "~ eb5 d5 c5 bb4 d5 a4 d5 g4 ab5 g5 f5 g5 f5 eb5 d5",
  AI: "eb5 d5", AJ: "c5@8 bb4 d5 c5 bb4 a4 bb4 g4 a4", AK: "bb4 c5 bb4 c5 d5 eb5 d5 c5 bb4@2 d5@2 c5@2 bb4@2",
  AL: "[a4@2 ~ d4 d4@16 ~ eb4@2 d4]/3", AM: "d4@15 ~",
})).s("gm_flute").gain(0.3)

// other · flute
const flute_2 = note(`<
  ~@11 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA ~@6 AB AC AD AE AF AG ~@4 AH AI AJ AK AL AM AN AO AP AQ AR
  AS AT AU
>`.pickRestart({
  A: "~@2 g4 d5", B: "bb4@3 a4 g4 bb4 a4 g4", C: "gb4 a4 d4@2 g4 d4 a4 d4",
  D: "bb4@2 a4 g4 a4@2 d4@2 g4@2 d4 g4 a4@2 d4 g4", E: "bb4@2 a4 g4 a4 d4 d5 c5 bb4 a4 g4 bb4 a4 g4 gb4 a4",
  F: "g4 d4 g4 a4 bb4 c5 d5 e5 f5 e5 d5 f5 e5 d5 db5 e5", G: "d5@2 a4@2 d5@2 e5@2 f5 g5 f5 g5 [g5,a5] g5 [g5,a5] f5",
  H: "[g5,a5] g5 a5 bb5 a5 g5 f5 e5 f5 a5 g5 a5 db5 a5 g5 a5", I: "d5 a5 g5 a5 db5 a5 g5 a5 f5 d5 db5 d5 g5 d5 db5 d5",
  J: "a5 d5 db5 d5 g5 d5 db5 d5 f5@2 e5 d5 [db5,d5] db5 [db5,d5] d5", // Dmaj7
  K: "d5 c5 d5 e5 d5 c5 bb4 a4 g4 f4 g4 a4 g4 f4 eb4 d4", L: "c5 bb4 c5 d5 c5 bb4 a4 g4 f4 eb4 f4 g4 f4 eb4 d4 c4",
  M: "bb4!2 c5 d5 eb5@4 ~ a4 bb4 c5 d5@4", N: "g4@2 d5@2 bb4@3 a4",
  O: "g4 bb4 a4 g4 gb4 g4 e4 gb4 g4 d4 e4 gb4 g4 d4 g4 a4",
  P: "bb4 c5 bb4 c5 [c5,d5] c5 [c5,d5] bb4 [c5,d5] c5 d5 eb5 d5 c5 bb4 a4", // Csus2
  Q: "bb4 d5 c5 d5 gb4 d5 c5 d5 g4 d5 c5 d5 gb4 d5 c5 d5", R: "bb4 g4 gb4 g4 c5 g4 gb4 g4 d5 g4 gb4 g4 c5 g4 gb4 g4",
  S: "g4@2 bb4@2 c5 bb4 a4 c5 bb4@5 d5 c5 bb4", T: "a4@5 c5 bb4 a4 g4@5 bb4 a4 g4", U: "f4@3 e4 f4 eb4 d4 c4",
  V: "bb4@2 ~@3 c5 bb4 a4", W: "bb4 d5 c5 bb4 a4 c5 f4@2", X: "bb4@2 f4@2 c5@2 f4@2 d5@2 c5 bb4 c5@2 f4@2",
  Y: "bb4@2 f4 bb4 c5@2 f4 c5 d5@2 c5 bb4 c5 f4 f5 eb5", Z: "d5 c5 bb4 d5 c5 bb4 a4 c5 bb4@2 g5@2 ~@2 g4@2",
  AA: "a4 f5 ~ f4 g4 f5 c5 e5", AB: "~ d5", AC: "~ g4 c5 bb4 a4@4", AD: "~ f4 bb4 a4 g4@4",
  AE: "~ eb4 ab4 g4 f4@2 g4@2", AF: "~ g4 a4 b4 c5 d5 eb5 c5 ab4@8", AG: "g4 a4 b4@2 c5 ~@3",
  AH: "~ g4 eb4 c4 f4@2 ~@2", AI: "bb4@9 ~ bb4@2 g4@2 eb4@2", AJ: "a4@9 ~ a4@2 gb4@2 d4@2",
  AK: "g4@4 ~@4 g4 bb4 a4 g4 d5 a4 d4 c5", AL: "g4 gb4 g4 a4", AM: "bb4 b4 c5 db5", AN: "d5@2 e5 gb5 g5@2 a5 bb5",
  AO: "c6 g5 f5 eb5 c6 a5 f5 a5 bb4 f5 eb5 d5 bb5 g5 eb5 g5",
  AP: "a4 eb5 d5 c5 a5 gb5 d5 gb5 g4 bb4 d5 g5 gb5 g5 e5 gb5", AQ: "g5@3 gb5 g5@2 a5 d5", AR: "d5@2 ~ gb4 g4 ~ c5 ~",
  AS: "bb4 ~ c5 ~ bb4 ~ a4 ~", AT: "g4 ~ a4 ~ g4 bb4 c5 a4", AU: "b4@15 ~",
})).s("gm_flute").gain(0.3)

// other · flute
const flute_3 = note(`<
  ~@16 A B C D E F ~@3 G H I@4 J ~ K ~@6 L M N O P Q R S T U V W X Y Z AA AB AC ~@4 AD AE AF AG AH U
>`.pickRestart({
  A: "~@2 d5 a5", B: "f5@3 e5 d5 f5 e5 d5", C: "db5 e5 a4@2 d5 a4 e5 a4",
  D: "f5@2 e5 d5 e5@2 a4@2 d5@2 a4 d5 e5@2 a4 e5", E: "f5@2 e5 d5 e5@2 a4@2 d5@2 a4@2 d5 [d5,e5]!3",
  F: "d4 ~@3, e5 ~@15", G: "~@5 g4 g5 f5", H: "eb5 ~ eb4 ~ d4 d5 ~@2", I: "[d5@21 ~ c5@4 bb4@4 a4@2]/4",
  J: "bb4 a4 g4@2 f4@2 ~@2", K: "g4@2 f4 ~", L: "bb4@2 f5@2 d5@3 c5", M: "bb4 d5 c5 bb4 a4 c5 f4@2",
  N: "bb4@2 f4@2 c5@2 f4@2 d5@2 c5 bb4 c5@2 f4@2", O: "bb4@2 f4 bb4 c5@2 f4 c5 d5@2 c5 bb4 c5@2 f4@2",
  P: "d5 eb5 f5 f4 bb4@2 ~@2", Q: "c5 ~ f4 ~", R: "bb4 ~ eb4 ~", S: "ab4 ~ d4 g4", T: "c4 ~ f4 ~", U: "g4@15 ~",
  V: "c4 g4 c5 d5 eb5@2 f5@2", W: "g5@5 g5 f5 g5 eb5 g5 f5 g5 b4 g5 f5 g5",
  X: "c5 g5 f5 g5 b4 g5 f5 g5 eb5 c6 b5 c6 f5 c6 b5 c6", Y: "g5 c6 b5 c6 g5 b5 a5 b5 c5@2 eb5@2 f5@2 g5@2", Z: "c5 ~@3",
  AA: "~ f5 d5 bb4 eb5@2 ~@2", AB: "~ eb5 c5 a4 d5@2 ~@2", AC: "g4 bb4 a4 g4 d5 a4 d4 c5 bb4@2 d5@2 gb4@2 d5@2",
  AD: "~@2 g5 d6", AE: "bb5@3 a5 g5 bb5 a5 g5", AF: "gb5 a5 d5@2 g5 d5 a5 d5",
  AG: "bb5@2 a5 g5 a5@2 d5@2 g5@2 d5 g5 a5@2 d5 a5", AH: "bb5@2 a5 g5 a5@2 d5@2 g5@2 eb5@2 c5@2 d5@2",
})).s("gm_flute").gain(0.3)

stack(flute, flute_2, flute_3)

More by J. S. Bach