Strudelify

Three-Part Inventions

J. S. Bach

KeyF majorTempo88 bpm
0:00/0:00
// Three-Part Inventions — J. S. Bach
// 88 bpm, 12/8, 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 (12/8 at bar 1, 4/4 at bar 33, 5/4 at bar 55, 9/16 at bar 57) are rendered on a constant 12/8 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/349311; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 86 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(88/6)

// 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 · french horn · "Horn"
const french_horn = note(`<
  ~@2 A B C D E F G H I J K L M N O P Q R S@5 T@2 U V W X Y ~ Z AA AB@2 AC AD@2 AE@5 AF@3 AG AH@7 AI@2 ~@2 AJ AK@2 AL@2
  ~ AM AN AO AP@2 AQ@2 AR@3 AS AT AU@4 AV@2 AW@2
>`.pickRestart({
  A: "c4@3 g3@2 eb4@3 eb4@3 c4@2 g4@3 g4@8 g3@8", B: "c4@3 d4@2 eb4@3 f4@3 g4@2 ab4@3 b3@3 ab4@2 g4@3 f4@3 eb4@2 d4@3",
  C: "eb4@8 ~@9 c4 ~ d4 eb4 f4 ~ g4 ab4 bb4 ~ ab4 g4 f4 ~ eb4",
  D: "d4@5 ~@12 bb3 ~ c4 d4 eb4 ~ f4 g4 ab4 ~ g4 f4 eb4 ~ d4", E: "c4@5 ~@8 c5@3 bb4@13 c5@3",
  F: "ab4@13 bb4@3 g4@5 ~@11", G: "~@3 g4", H: "gb4@3 e4@2 d4@3 c5@3 bb4@2 a4@3 bb4@3 c5@2 bb4@3 a4@3 bb4@2 g4@3",
  I: "~@16 g4@5 ~@3 d4@5 ~@3", J: "a4@5 ~@3 gb4@5 ~@3 g4@5 ~@11", K: "~@16 g4@3 d4@2 bb4@3 bb4@3 g4@2 d5@3",
  L: "eb4@5 ~@11 f4@3 c4@2 a4@3 a4@3 f4@2 c5@3", M: "d4@5 ~@11 eb4@3 bb3@2 g4@3 g4@3 eb4@2 bb4@3",
  N: "d4@3 bb3@2 f4@3 f4@3 d4@2 bb4@3 c4@3 d4@2 eb4@3 f4@3 g4@2 a4@3", O: "bb3@5 ~@8 g4@3 eb4@13 a4@3",
  P: "gb4@3 d5 c5 bb4 ~ a4 g4 a4 ~ g4 f4 eb4 ~ d4 eb4@11 ab3@2 c4@3", Q: "bb3@5 ~@16 bb4@3 g4@5 bb4@3",
  R: "e4@5 ~@12 f5 ~ eb5 db5 c5 ~ bb4 ab4 bb4 ~ ab4 g4 f4 ~ eb4",
  S: "[d4@3 bb3@2 f4@3 f4@3 d4@2 ab4@3 ab4@19 f4@2 d5@3 d5@3 bb4@2 d5@3 eb5@19 c5@10 eb5@3 d5@19 b4@10 d5@3 c5@21 ~@14 g4 f4 eb4 ~ d4 c4 d4 ~ c4 bb3 ab3 ~ g3]/5",
  T: "[ab3@5 ab4@5 ~ f4@2 b4@5 ~ g4@2 c5@3 ab4@11 g4@2 f4@3 eb4@3 d4@2 c4@3 f4@5 eb4@3 d4@8]/2",
  U: "eb4@5 ~@12 c4 ~ d4 eb4 f4 ~ g4 ab4 bb4 ~ ab4 g4 f4 ~ eb4",
  V: "d4@3 f3@2 d4@3 d4@3 bb3@2 f4@3 eb4@3 bb3@2 g4@3 g4@3 eb4@2 bb4@3", W: "ab4@8 ~@5 ab4@3 g4@13 ab4@3",
  X: "f4@17 g3 ~ ab3 bb3 c4 ~ d4 eb4 d4 ~ c4 d4 eb4 ~ f4", Y: "g4@5 ~@5 eb4@3 d4@3 eb4@16",
  Z: "~@17 a4@2 ab4@2 a4@2 e4@4 c5@5", AA: "~ a4 b4 e4@2 d5@3 c5 b4 c5 f4@5, ~ b4@2 ~@29",
  AB: "[b4@2 a4@2 b4@2 e4@11 a4@4 d4@2 e4@2 d4@2 c4@2 b3@6 db4@2 [b3,db4] db4@7 d4@2 d5@2 db5@2 d5@2 g4@9 c5@2]/2", // Bsus2
  AC: "bb4 c5 f4@5 bb4 a4 c5 bb4@5 c5",
  AD: "[bb4@2 a4@2 bb4@2 ~ g4@2 f4@2 e4@4 bb4@6 a4@2 g4@2 a4@2 f4@23 e4@8 ~@2 f4@2 e4@2, ~@3 a4 ~@28]/2",
  AE: "[f4@2 c4@4 a4@6 g4@2 f4@2 g4@2 c4@4 bb4@6 a4@6 ~@3 f4@6 e4@6 ~@4 g4@6 f4@8 e4@2 d4@2 c4@2 bb3@9 a3@2 bb3@2 g3@2 c4@10 bb4@2 a4@2 bb4@2 ab4@4 a4@4 gb4@4 f4@3 e4@8 eb4@4 d4@4 db4@4 c4@4 b3@8 a3@8 ~]/5",
  AF: "[~@24 e4@2 eb4@2 e4@2 a3@4 g4@6 gb4@2 e4@2 gb4@2 d4@3 c5@6 bb4@2 a4@2 bb4@2 c5@2 d5@2 c5@2 d5@2 eb5@10 d5@2 eb5@2 c5@2 d5@4 ~@7]/3",
  AG: "~@11 f4 e4 f4 c4@2",
  AH: "[a4@6 ~ f4@2 g4@2 bb3@4 g4@6 f4@2 e4@2 f4@2 a3@4 f4@6 e4@2 d4@2 f4@2 eb4@2 d4@2 db4@2 ~ c4@4 d4@4 e4@12 a3@4 d4@10 g4@2 f4@2 g4@2 e4@2 bb4@2 ~ g4@2 a4@2 d4@2 c5@6 bb4@2 a4@2 bb4@2 a4@2 g4@2 gb4@2 g4@2 d4@4 bb4@6 a4@2 g4@2 a4@2 d4@4 g4@6 f4@2 ~ e4@2 f4@2 b3@5 e4@7 d4@3 db4@3 d4@5 db4@3 b3@3 db4@2 d4@26 ~@13, ~@6 g4@2 ~@41 d4@2 ~@43 a4@2 ~@128]/7",
  AI: "[~@14 b3@3 db4@3 d4@3 db4@2 b3@3 bb3@8 ~ bb3@2 b3@3 db4@3 b3@3 db4@3 bb3@2 b3@8 ~@3]/2",
  AJ: "~ d4 b3 ~ d4 gb4 b4 ~ gb4 d4 ~ gb4 d4 b3 ~ d4 b3 ~ gb3@3 ~@5 b4@3 gb4@3",
  AK: "[gb4@2 g4@3 gb4@3 gb4@3 b4@3 gb4@2 gb4@3 ab4@25 a4@3 e4@3 e4@3 gb4@2 e4@3 e4@3 a4@3]/2",
  AL: "[e4@3 e4@2 gb4@25 ~ g4@3 ~@30]/2", AM: "~@10 d4@3 a3@3 a3@2 b3@3 a3@3 a3@3 d4@3 a3@2",
  AN: "a3@3 e4@3 a3@3 a3@3 b3@2 a3@3 a3@3 e4@3 a3@2 a3@3 gb4 ~ d4 gb4",
  AO: "a4 ~ d5 b4 ~ ab4 b4 ab4 ~ e4 ab4 ~ e4 b3 e4 ~ b3 ab3 ~ b3 ab3 e3@8 ~@3",
  AP: "[~ a3@2 b3@3 db4@3 b3@3 a3@3 ab3@11 a3@3 b3@2 a3@3 b3@3 ab3@3 a3@11 b3@3 c4@2 b3@3 c4@3 a3@2]/2",
  AQ: "[~ e4@3 b3@2 b3@3 c4@3 b3@3 b3@3 e4@2 b3@3 b3@3 db4@28 a3@3 a3@3 b3@2 a3@2]/2",
  AR: "[~ a3@3 d4@3 a3@2 a3@3 b3@28 ab3@3 ab3@3 a3@3 ab3@2 ab3@3 db4@3 ab3@3 ab3@3 bb3@25 b3@3 ~@5]/3",
  AS: "~@17 db4 a3 ~ db4 e4 db4 ~ e4 a4@3 ~@4", AT: "~@10 g4 b4 ~ g4 d4 ~ g4 d4 g4@3 ~@11",
  AU: "[~@28 gb4@3 b3@3 b3@3 d4@2 b3@3 b3@3 e4@3 b3@3 b3@2 g4@25 ~ gb4@8 bb4@17 ~@16 gb4 ~ b4 gb4 ~ d4 gb4 d4]/4",
  AV: "[~ b4@50 bb4@8 ~@3 bb4@2]/2", AW: "[~ b4@3 db5@3 b4@2 bb4@3 b4@17 bb4@8 b4@22 ~@5]/2",
})).s("gm_french_horn").gain(0.25)

// bass · tuba · "Trombone"
const bass = note(`<
  A B C ~ D E F G H I J K L M N@3 O P Q R S T U V W X Y Z AA AB AC AD@3 AE@2 AF AG@5 AH AI@2 AJ AK AL AM@7 AN ~ AO@2
  AP@2 AQ AR@2 AS AT AU@2 AV AW AX@2 AY AZ@2 BA BB BC@4 BD@2 BE@2
>`.pickRestart({
  A: "c3@8 c4@8 b3@3 a3@2 g3@3 f4@3 eb4@2 d4@3", B: "eb4@5 c4@3 ab3@5 f3@3 g3@5 a3@3 b3@5 g3@3", C: "c4@5 ~@27",
  D: "c4@3 g3@2 eb4@3 eb4@3 c4@2 g4@3 a3@5 ~@11", E: "bb3@3 f3@2 d4@3 d4@3 bb3@2 f4@3 g3@5 ~@11",
  F: "ab3@3 eb3@2 c4@3 c4@3 ab3@2 eb4@3 g3@3 eb3@2 bb3@3 bb3@3 g3@2 eb4@3",
  G: "f3@3 g3@2 ab3@3 bb3@3 c4@2 d4@3 eb3@8 eb4@8", H: "d4@8 gb3@8 g3@3 d3@2 bb3@3 bb3@3 g3@2 d4@3",
  I: "d4@8 d3@8 g3@3 a3@2 bb3@3 c4@3 d4@2 eb4@3", J: "gb3@3 eb4@2 d4@3 c4@3 bb3@2 a3@3 bb3@8 g3@8",
  K: "g3@3 gb3@2 g3@3 a3@3 bb3@2 c4@3 bb3@3 c4@2 bb3@3 a3@3 bb3@2 g3@3",
  L: "d4@3 c4@2 bb3@3 a3@3 g3@2 gb3@3 g3@5 d4@3 g3@5 bb3@3", M: "c3@5 ~@16 c4@3 f3@5 a3@3",
  N: "[bb2@5 ~@11 bb2@40 a2@11 d3 c3 bb2 ~ a2 g2 a2 ~ g2 f2 eb2 ~ d2 c2@3 eb3 d3 c3 ~ bb2 a2 bb2 ~ a2 g2 gb2 ~ e2]/3",
  O: "d2@8 ~@4 g2 a2 ~ bb2 c3 bb2 ~ c3 d3 eb3 ~ c3 d3 eb3 ~ d3 c3 bb2 ~ a2",
  P: "g2@5 ~@14 bb3 ab3 g3 ~ f3 e3 f3 ~ e3 d3 c3 ~ bb2", Q: "ab2 f3 ~ e3 d3 c3 ~ bb2 a2 bb2 ~ a2 g2 f2 ~ eb2 f2@5 ~@11",
  R: "~@21 g4@3 f4@5 eb4@3", S: "d4@5 ab4@3 g4@5 f4@3 eb4 g3 ~ ab3 bb3 c4 ~ d4 eb4 f4 ~ eb4 d4 c4 ~ bb3",
  T: "ab3@17 f3 ~ g3 a3 b3 ~ c4 d4 eb4 ~ d4 c4 b3 ~ a3", U: "g3@17 eb3 ~ f3 g3 a3 ~ b3 c4 d4 ~ c4 bb3 ab3 ~ g3",
  V: "f3@3 eb3", W: "~ g3 ~ f3 eb3 d3 ~ c3 b2 c3 ~ b2 a2 g2 ~ f2 eb2@8 f2@8",
  X: "g2@8 a2@8 b2@3 g2@2 c3@3 ab2@3 f2@2 g2@3", Y: "c3@3 g2@2 eb3@3 eb3@3 c3@2 g3@3 f3@3 c3@2 ab3@3 ab3@3 f3@2 c4@3",
  Z: "bb3@5 ~@27", AA: "f3@3 c3@2 ab3@3 ab3@3 f3@2 c4@3 eb3@3 c3@2 g3@3 g3@3 eb3@2 c4@3",
  AB: "d3@3 eb3@2 f3@3 g3@3 a3@2 b3@3 eb3@16", AC: "~ g3 f3 ~ eb3 d3 c3 ~ g3@5 g2@3 c2@16",
  AD: "[~@16 d3@4 e3@3 f3@4 d3@4 a3@4 b3@4 db4@4 a3@4 d4@10 c4@2 bb3@2 a3@2 e4@7 e3@8 a2@8 ~@10]/3",
  AE: "[~@15 d3@2 db3@2 d3@2 a2@4 f3@6 e3@2 d3@2 f3@2 a2@4 g3@6 f3@2 e3@2 d3@2 d4@9 e3@2]/2",
  AF: "d3 c3 a3@5 d3 c3 d3 g2@2 f3@3 e3",
  AG: "[d3@2 e3@2 c3@3 bb3@6 a3@2 g3@2 a3@2 f3@4 eb4@4 d4@4 c4@4 bb3@4 a3@4 bb3@4 g3@3 c4@4 c3@4 f2@4 g2@4 a2@4 f2@4 c3@4 d3@4 e3@4 c3@4 f3@4 g3@3 a3@4 f3@4 c4@4 d4@4 e4@4 c4@4 f4@2 c4@2 bb3@2 c4@2 f3@4 f4@5 bb3@2 a3@2 bb3@2 f3@4 e4@6 a3@2 g3@2 a3@2]/5",
  AH: "d3@4 d4@4 d4@4 c4@6 b3@2 a3@2 ~ ab3@4 a3@5, ~@11 b3 ~@4",
  AI: "[~ ab3@2 gb3@2 ab3@2 a3@4 eb3@4 e3@4 e2@4 a2@4 b2@4 c3@3 a2@4 e3@4 gb3@4 ab3@4 e3@4 a3@10]/2",
  AJ: "g3@2 gb3@2 g3@2 d3@4 c3@4 bb2@3 a2@4 g2@2 g3@2 gb3@2 g3@2 d3@3",
  AK: "~ bb3@6 a3@2 g3@2 a3@2 d3@4 c4@6 bb3@2 ~ bb3@2 c4@2 bb3@2, ~@25 a3@2 ~@5",
  AL: "a3 g3 c4@2 d4@2 e4@2 c4@2 f3@4 ~@2",
  AM: "[f3@4 bb3@3 a3@4 g3@4 bb3@4 a3@4 g3@4 f3@4 d3@4 g3@4 f3@4 g3@4 e3@3 a3@4 b3@4 db4@4 a3@4 d4@2 d3@2 db3@2 d3@2 a2@4 f3@6 e3@2 d3@2 e3@2 a2@4 g3@5 gb3@2 e3@2 gb3@2 d3@4 c4@4 bb3@4 a3@4 bb3@2 a3@2 g3@2 a3@2 g3@2 gb3@2 e3@2 gb3@2 g3@2 f3@2 eb3@2 d3@2 db3@4 ~ d3@7 db3@2 b2@2 db3@2 ~ d3@5 ab2@5 a2@11 d2@26 ~@13]/7",
  AN: "~@3 b2@8 ~@21",
  AO: "[~@15 b3@2 gb3@3 gb3@3 g3@3 gb3@3 gb3@2 b3@3 gb3@3 gb3@3 db4@3 gb3@2 gb3@3 g3@3 gb3@3 gb3@2 db4@3 gb3@3 gb3@2]/2",
  AP: "[~ b3@3 ~@14 gb3 b3 gb3 ~ d3 gb3 ~ d3 b2@8 ~@3 b3@3 db4@3 d4@3 db4@2 b3@3 e4@8 ~@3 e3@2]/2",
  AQ: "~ gb3@3 ab3@3 gb3@2 e3@3 a3@8 ~@3 a2@3 b2@3 db3@3",
  AR: "[b2@3 a2@2 d3@8 ~@18 g2@8 g3 b3 ~ g3 e3 ~ g3 e3 db3 ~ e3 db3 ~ a2 db3 a2 ~ gb2@8]/2",
  AS: "gb3 a3 ~ gb3 d3 ~ gb3 d3 b2 ~ d3 b2 ~ g2 b2 g2 ~ e2@8 e3 ~ g3 e3 db3 ~ e3",
  AT: "db3 ~ a2 db3 a2 ~ gb2 a2 ~ gb2 d2@8 ~@3 d2@3 e2@3 gb2@3 e2@2",
  AU: "[d2@3 db2@8 ~@3 a2@3 b2@3 db3@3 b2@2 a2@3 d3@11 e3@3 gb3@3 e3@3 gb3@3 d3@2 db3@8 ~@3]/2", AV: "~@15 e3@8 ~@9",
  AW: "~ a2 gb3@2", AX: "[~ g3@8 ~@3 e3@3 gb3@3 g3@2 gb3@3 e3@3 a3@8 ~@3 a2@3 b2@3 db3@3 b2@2 a2@3 d3@8 ~@3 d3@2]/2",
  AY: "~ e3@3 gb3@3 e3@2 d3@3 g3@8 ~@3 g3@3 gb3@3 e3@3",
  AZ: "[gb3@3 g3@2 db3@8 ~@4 db3@2 b2@3 bb2@3 b2@3 db3@3 gb2@8 ~@3 gb3@3 e3@2 d3@3 e3@3 gb3@3 b2@8]/2",
  BA: "d3 b2 ~ d3 gb3 ~ d3 gb3 b3 ~ g3 b3 ~ e4 b3 e4 ~ a4@8 db3 ~ a2 db3 e3 ~ db3",
  BB: "e3 ~ a3 gb3 a3 ~ d4 a3 ~ d4 b3 g3 ~ b3 d4 ~ b3 d4 b3 ~ d4 b3 ~ g3 b3 g3 ~ d3 g3 ~ d3 b2",
  BC: "[d3 ~ b2 bb2@8 ~ bb2@2 b2@3 db3@3 gb2@3 b2@2 bb2@3 b2@8 ~@9 b2@8 e3@50 ~ d3@3 ~@21]/4",
  BD: "[~ b3 g3 ~ b3 d4 g4 ~ d4 b3 ~ d4 b3 g3 ~ b3 g3 ~ d3 g3 d3 ~ b2 d3 ~ b2 f2@8 ~@17 gb2@8 ~@3 e3@2]/2",
  BE: "[~ gb3@3 g3@3 gb3@2 e3@3 d3@6 e3@3 gb3@5 e3@3 gb3@6 gb2@2 b2@22 ~@5]/2",
})).s("gm_tuba").gain(0.38)

stack(french_horn, bass)

More by J. S. Bach