Strudelify

J.S.Bach Concerto for Two Violins 1st Mvt.

henry ho

KeyF majorTempo110 bpm
0:00/0:00
// J.S.Bach Concerto for Two Violins 1st Mvt. — henry ho
// 110 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/4526266; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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 · violin
const violin = note(`<
  ~@4 A B C D E F G H I J K@3 L M N O P Q R S T U V W X Y Z AA AB@2 AC AD ~@3 AE AF AG AH AI A B C AJ AK AL AM AN AO AP
  AQ AR AS AT AU AV AW AX AY@3 AZ BA@3 BB BC BD BE BF@2 P Q R S T U V W BG M N BH
>`.pickRestart({
  A: "a4 b4 c5 d5 e5 ~ a5 ~ ab5 ~ e5 ~ b4 ~ d5 ~", B: "db5 ~ a4 ~ g5@6 gb5 e5 gb5 ~ d5 ~",
  C: "b4 ~ d5 ~ f5 ~ a4 ~ ab4 ~ e5 ~ a4 ~ d5 ~", D: "c5@4 b4 [b4,c5]!3 [a4,c5] ab4 a4 b4 c5 d5 e5 f5",
  E: "g5 ~ g4 ~ g5@6 e5 ~ a4 ~ g5 ~", F: "f5 e5 d5 e5 f5 e5 f5 g5 a5@8", G: "~ g5 gb5 e5 gb5 d5 e5 gb5 g5@8",
  H: "~ f5 e5 f5 g5 a5 bb5 g5 a5 bb5 a5 g5 f5 e5 d5 db5", I: "d5@2 d6@4 db6 ~ d6@4 ~@2 f5@2",
  J: "e5 ~ a5 ~ a4@6 d5 e5 gb5 g5 a5 gb5",
  K: "[g5@2 d5 c5 d5 b4 c5 d5 g4 ~ c5 ~ g5@6 gb5 g5 a5@2 c5@4 bb4 c5 d5@2 a5@4 g5@4 f5@4 e5 d5 db5 d5 b4 db5]/3",
  L: "d5 e5 f5 g5 a5 ~ d6 ~ db6 ~ a5 ~ e5 ~ g5 ~", M: "gb5 ~ d5 ~ c6@6 b5 a5 b5 ~ g5 ~",
  N: "e5 ~ g5 ~ bb5 ~ d5 ~ db5 ~ a5 ~ d5 ~ g5 ~", O: "f5@4 e5@4 d5@2 c5 bb4 a4 g4 f4 e4",
  P: "f4 ~ a5 ~ e4 ~ g5 ~ d4 g5 f5 e5 d5 c5 bb4 a4", Q: "bb4 ~ d6 ~ a4 ~ c6 ~ g4 c6 bb5 a5 g5 f5 e5 d5",
  R: "e5 bb5 a5 g5 a5 e5 d5 db5 d5 a5 g5 f5 g5 d5 db5 b4", S: "db5 g5 f5 e5 f5 e5 d5 f5 e5 d5 db5 b4 a4@4",
  T: "~ f4 d4 f4 g4 e4 db4 e4 f4 ~ d4 ~ d5@4", U: "~ bb4 g4 bb4 c5 a4 gb4 a4 bb4 ~ g4 ~ bb5@4",
  V: "~ g4 f4 e4 f4 ~ a5@3 f4 e4 d4 e4 ~ g5@2", W: "~ e4 d4 db4 d4 ~ d5@3 f5 e5 d5 e5 g5 f5 e5",
  X: "f5 a4 b4 db5 d5 e5 f5 d5 g4 d5 f5@3 d5 b4 g4", Y: "e5 g4 a4 b4 c5 d5 e5 c5 f4 c5 eb5@3 c5 a4 f4",
  Z: "d5 ~ f5 ~ g5 ~ d5 ~ e5 ~ g5 ~ a5 ~ e5 ~", AA: "f5 g5 f5 e5 d5 c5 bb4 a4 g4 a5 g5 f5 e5 d5 c5 bb4",
  AB: "[a4@2 f5 g5 a5@2 f4@3 e4 d4 c4 b3 ~ b4@4 e5 f5 g5@2 e4@3 d4 db4 b3 a3@2 a4@2]/2",
  AC: "~ d5 f5 a5 d6 a5 f5 d5 a4 c5 e5 a5 c6 a5 e5 c5", AD: "a4 b4 d5 f5 b5 f5 d5 a4 ab4 b4 d5 e5 b5 ~@3",
  AE: "~@13 d4 c4 b3", AF: "c4 ~ e5 ~ b3 ~ d5 ~ a3 d5 c5 b4 a4 g4 f4 e4",
  AG: "f4 ~ a5 ~ e4 ~ g5 ~ d4 g5 f5 e5 d5 c5 b4 a4", AH: "b4 f5 e5 d5 e5 b4 a4 ab4 a4 e5 d5 c5 d5 a4 ab4 gb4",
  AI: "ab4 d5 c5 b4 c5 b4 a4 c5 b4 a4 ab4 gb4 e4@2 ~@2", AJ: "c5@4 b4 [b4,c5]!3 a4@4 ~ f4 e4 d4, ~@8 c5 ~@7",
  AK: "c4 ~ a4 ~ d4 ~ b4 ~ c4 ~ a4 ~ b3 ~ ab4 ~", AL: "c4 ~ a4 ~ e4 ~ b4 ~ c5 ~ a4 ~@2 g5 f5 e5",
  AM: "d5 f5 a5 d6 e5 g5 a5 db6 d6 a5 f5 d5 db5 e5 g5 a5", AN: "d5 f5 a5 d6 e5 g5 a5 db6 d6 a5 f5 d5 d4 e4 f4 d4",
  AO: "e4 d4 e4 f4 e4 gb4 g4 e4 gb4 e4 gb4 g4 gb4 g4 a4 gb4", AP: "g4 ~ d5 ~@3 bb5@2 a5 g5 gb5 e5 gb5 d5 e5 gb5",
  AQ: "g5@9 f5 g5 a5 g5 bb5 a5 g5", AR: "a5@9 g5 gb5 e5 d5 c5 bb4 a4", AS: "bb4@3 c5 a4@3 g4!2 g5 gb5 e5 d5 c5 bb4 a4",
  AT: "g4 bb4 d5 g5 a4 c5 d5 gb5 g5 d5 bb4 g4 gb4 a4 c5 d5", AU: "g4 bb4 d5 g5 a4 c5 d5 gb5 g5 d5 bb4 g4 g3 ab4 g4 f4",
  AV: "eb4 ~ c5 ~ f4 ~ d5 ~ eb4 ~ c5 ~ d4 ~ b4 ~", AW: "eb4 ~ c5 ~ g4 ~ d5 ~ eb5 ~ c5 ~@2 g4 f4 g4",
  AX: "a4 g4 a4 bb4 a4 bb4 c5 a4 bb4 a4 bb4 c5 d5 c5 d5 e5",
  AY: "[gb5 e5 gb5 g5 gb5 g5 a5 gb5 g5 c5 bb4 a4 bb4 d5 g5@4 a4 ~ g5@6 a4 ~ d4 ~ f5@4 f4 ~ eb5@6 f4 ~ bb3 ~ d5 ~]/3",
  AZ: "e4 f4 g4 bb4 db5 bb5 a5 g5 f4 g4 a4 db5 d5 a5 g5 f5",
  BA: "[g4 a4 db5 d5 e5 g5 f5 e5 a4 db5 d5 e5 f5@2 d5@4 g5 a5 bb5@2 g4@3 f4 e4 d4 c4@2 c5@4 f5 g5 a5@2 f4@3 eb4 d4 c4 bb3@2 bb4@2]/3",
  BB: "~ c5 bb4 a4 g4 f4 e4 d4 c4 d5 c5 bb4 a4 g4 gb4 e4", BC: "d4 ~ d5 ~ eb5 ~ bb4 ~ c5 ~ eb5 ~ f5 ~ c5 ~",
  BD: "d5 f5 g5 a5 bb5 c6 d6 bb5 e5 bb5 d6@3 bb5 g5 e5", BE: "db6 e5 f5 g5 a5 bb5 c6 a5 d5 a5 c6@3 a5 gb5 d5",
  BF: "[bb5@2 g5 ~ d5 ~ d6@4 a5 f5 d5@6 bb4 ~ g4 ~ g5@4 e5 db5 a4 g4 f4 e4]/2",
  BG: "f5 g5 f5 e5 d5 ~ d6 ~ db6 ~ a5 ~ e5 ~ g5 ~", BH: "f5 e5 d5@2",
})).s("gm_violin").gain(0.13)

// chords · piano
const piano = note(`<
  A B@2 C D E F G H I J K L M N O P Q R S T U V W X Y Z W X AA AB AC AD AE AF AG AH AI AJ AK AL AM U AN AO AP AQ AR AS
  AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT U V W X Y Z BU BV BW BX BY BZ
>`.pickRestart({
  A: "d3@2 d4@2 c4@2 [bb3,g4]@2 a3 g3 a3 bb3 a3 g3 f3 e3, f4@3 ~ a4 e4 db4 ~", // Eb
  B: "[d3 c3 [d3,gb4] [eb3,g4] d3 c3 b2 a2 g4 gb4 g4 a4 g4 f4 e4 d4 db4 d4 e4 f4 g4 a4 bb4 g4 a4@2 f2 e2 [f2,d4]@2 [bb2,g4]@2, ~@2 a4 d4 g2@9 db4 ~@2]/2", // D Eb Dm Eb
  C: "a2@2 g2@2 a2@2 a1@2 [d2,d4]@2 [d3,a3]@2 ~ b3 c4 d4, [d4,f4]@2 [db4,e4]@2 ~@2 c3 b2", // D D5 Dm Dbm
  D: "[a2,e4]@2 [a3,c4]@2 g3@2 f3@2 e3 d3 e3 f3 e3 d3 c3 b2, ~@2 a3@2 b3 e4 ab4@2", // A5 Am
  E: "a2 ab2 a2 b2 a2 g2 f2 e2 d2 db3 d3 e3 d3 c3 b2 a2, a4 e4 e5 a4 ~ a4 a3 d4",
  F: "~@2 f4@2 b4@2 d3@4 c3 b2 [c3,e4]@2 [f3,a4]@2, ab2@2 ~ d5 ~ ab4 ~@2", // C F
  G: "[e3,e4]@2 d3@2 e3@2 e4 d4 c4@2 e4@2 a4@2 a3@2, ~ f4@2 e2 a2@2 ~@2", H: "e4@2 ~@5 db4",
  I: "[d2,a4] [e2,g4] [f2,f4] [g2,e4] d4 db4 d4 e4 [db3,a3]@2 [a2,e4]@2 [e2,g4]@2 [g2,e4]@2, ~@2 a2 d3 ~@4", // D5 Em F C Gbm A5 Em C
  J: "gb2@2 [d2,a4]@2 a3@2 a4@2 ~@2 b2 a2 [b2,g4]@2 [g2,b3]@2, ~@2 c3@3 d4 ~@2", // D5 Em G
  K: "[e2,c4] g2 bb2 [d2,d4] [db2,e4] [a2,e4] [d2,f4] [g2,bb3], ~ db4@2 ~@5", // C D Dbm A5 Dm Gm
  L: "a3@2 f4@2 bb4@2 g4@2 [d2,a4] [db2,g4] [d2,f4] [e2,e4] [f2,d4] [g2,e4] [a2,f4] [b2,g4], f2 e2 ~@2", // D5 Dbdim Dm E Dm C Dm Em
  M: "db3 b2 a2 b2 db3 a2 b2 db3 d4@2 gb4@2 a4@2 gb4@2, a4 e4 ~ a4 d3@4",
  N: "~ c3 b2 a2 b2 g2 a2 b2 ~ g3 a3 b3 c4 d4 eb4 f4, d4 g4 ~ d4 c3@4",
  O: "eb4 [bb2,d4] [a2,c4] [bb2,bb3] [c3,a3] [d3,bb3] [eb3,c4] [c3,a3] [d3,a4] [eb3,g4] [d3,gb4] [c3,e4] [bb2,d4] [a2,c4] [g2,bb3] [gb2,a3]", // Bb Am Bb F Gm Cm F D5 …
  P: "[g2,bb3] [f2,d4] [e2,db4] [d2,d4] db2 a1 d2 c2 bb1 d2 [db2,e4] [d2,f4] [e2,g4] [f2,a4] [g2,g4] [e2,a4], ~@2 e4 d4@2 ~@3", // Gm Dm Dbm D Dbm Dm Em F …
  Q: "f2 e2 d2 e2 f2 e2 f2 g2 e4@2 db4@2 e4@2 db4@2, f4 a3 d4 f4 a2@4",
  R: "~ g2 gb2 e2 gb2 d2 e2 gb2 ~ d4 e4 f4 g4 a4 bb4 c5, a3 d4 ~ a4 g2@4",
  S: "bb4 [f2,a4] [e2,bb4] [f2,a4] g2 a2 bb2 g2 [a2,d4] [bb2,db4] [a2,d4] [g2,e4] [f2,f4] [e2,g4] d2 db2, ~@2 g4 g3 ~@3 a4", // F Edim F D5 Bbm D5 C F …
  T: "[d2,a3] [bb1,bb2,d4] [g1,g2,d4,e4,bb4] [a1,a2,db4,e4,a4] [d1,d2,a3,d4,f4]@2 ~@2", // D5 Bb Em7b5 A Dm
  U: "[d3,d4] ~ [a2,e4] ~ [d2,f4] ~@3", V: "[g2,bb4] ~ [d3,gb4] ~ [g3,g4] ~@3", W: "c4 ~ f3 ~ bb3 ~ e3 ~",
  X: "a3 ~ d3 ~ a3 e3 db3 a2", Y: "[d3,f4] ~ [a2,a4] ~ [d2,a4] ~@3", Z: "[g2,g4] ~ [d3,a4] ~ [g3,bb4] ~@3",
  AA: "d4 e4 f4 g4 a4@2 d5@2 [g3,b4]@2 [d3,g4]@2 b2@2 g2@2, d3 ~@7", // G G5
  AB: "c4 d4 e4 f4 g4@2 c5@2 [f3,a4]@2 [c3,f4]@2 f2@2 a2@2, c3 ~@7", AC: "bb2 d3 b2 g2 c3 e3 db3 a2",
  AD: "d3 ~@2 d2 e2 ~@2 e3", AE: "f4 g4 a4 bb4 c5@2 [d3,f5]@2 [b2,d5]@2 b3 c4 d4@2 b3@2, f3 ~@4 b4 ~@2",
  AF: "e4 gb4 ab4 a4 b4@2 [db3,e5]@2 [a2,db5]@2 a3 b3 db4@2 a3@2, e3 ~@4 a4 ~@2", AG: "d3 ~@2 d4 c4 ~@2 c3",
  AH: "f3 ~@2 f2 e2 ~@3", AI: "[a3,a4] ~ [e3,b3] ~ [a2,c4] ~@3", AJ: "[d3,f4] ~ [a2,db4] ~ [d2,d4] ~@3",
  AK: "g2 ~ c3 ~ f3 ~ b2 ~", AL: "e3 ~ a2 ~ e3 b2 ab2 e2", AM: "[a2,c4] ~ [e3,e4] ~ [a3,e4] ~@3",
  AN: "g3 ~ c3 ~ f3 ~ b2 ~", AO: "e3 ~ a2 ~ e3 e2 ab2 e2",
  AP: "[a2,e4]@2 [a3,c4]@2 g3@2 f3@2 e3 d3 e3 f3 e3 d3 db3 b2, ~@2 a3@2 b3 e4 ab4@2", // A5 Am
  AQ: "a2 ab2 a2 b2 a2 g2 gb2 e2 d2 db3 d3 e3 d3 c3 b2 a2, a4 e4 e5 a4 ~ a4 a3 d4",
  AR: "~@2 f4@2 b3@2 d3@4 c3 b2 [c3,e3]@2 [f3,a3]@2, ab2@2 ~ d4 ~ ab3 ~@2", // C F
  AS: "[e3,e4]@2 d3@2 e3@2 e4 d4 a2@2 a3@2 ab3@2 e3@2, ~ f4@2 e2 c4@2 ~@2", AT: "[a3,e4] e4!7",
  AU: "e4@2 [a3,e4]@2 [ab3,e4]@2 [e3,e4]@2 [a2,e4]@2 a3 b3 c4@2 db4@2, ~@5 e4 ~@2", AV: "d4 a3!7",
  AW: "a3 [d3,a3] [db3,a3] [a2,a3] [d3,a3] [d2,a4] [f2,d5] [d2,d4]", AX: "[a2,e4]@2 ~ a3 d4@2 ~ gb4",
  AY: "[g2,d5] [a2,c5] [bb2,bb4] [c3,a4] g4 gb4 g4 a4 [gb3,d4]@2 [d3,a4]@2 [a2,c5]@2 [c3,a4]@2, ~@2 d3 g3 ~@4", // G5 Am Bb F D D5 Am F
  AZ: "b2@2 [g2,d5]@2 d4@2 d5@2 ~@2 e3 d3 [e3,c5]@2 [c3,e4]@2, ~@2 f3@3 g4 ~@2", // G5 C
  BA: "[a2,f4] c3 eb3 [g2,g4] [gb2,a4] [d3,a3] [g2,bb3] [eb3,c4], ~ gb4@2 ~@5", // Dm G Gbm D5 Gm Cm
  BB: "[d3,d4] [c3,eb4] [d3,a3] [d2,d4] [g2,bb3] bb3 gb3 d3", BC: "[g3,d4] ~@7",
  BD: "~@2 [g3,d4]@2 gb3@2 [d3,d4]@2 g2@2 g3 a3 ~@2 b3@2, ~@5 d4 ~@2", BE: "[c4,g4] ~@7",
  BF: "~@2 [c3,g3]@2 b2@2 [g2,g3]@2 c2@2 c3 d3 eb3@2 c3@2, ~@5 g3 ~@2", // C5 G
  BG: "f3@2 eb4 d4 c4@2 a2@2 bb2@2 f4 eb4 f4@2 bb2 c3", BH: "d3@2 gb4 e4 d4@2 d2@2 g2@2 d4 c4 bb3@2 e2@2",
  BI: "a2@2 a4@2 e4@2 a2@2 d3@2 d4 db4 d4@2 d3 eb3", BJ: "f3@2 c4 d4 eb4@2 f2@2 bb2@2 d4 eb4 f4@2 bb3 a3",
  BK: "g3@2 g4 f4 e4@2 e3@2 f3@2 f4 e4 d4@2 d3@2", BL: "e3@2 e4 d4 db4@2 [a2,db4]@2 [d3,a4]@2 a2@2 d2@2 f2@2",
  BM: "g3 a3 bb3 c4 d4@2 g4@2 [c3,e4]@2 [g2,c4]@2 e2@2 c2@2, g2 ~@7", // C C5
  BN: "f3 g3 a3 bb3 c4@2 f4@2 [bb2,d4]@2 [f3,bb3]@2 d3@2 bb2@2, f2 ~@7", BO: "eb3 g3 e3 c3 f3 a3 gb3 d3",
  BP: "g3 ~@2 g2 a2 ~@2 a2", BQ: "bb3 c4 d4 eb4 f4@2 [g3,bb4]@2 [e3,g4]@2 e2 f2 g2@2 e2@2, bb2 ~@4 e4 ~@2",
  BR: "a3 b3 db4 d4 e4@2 [gb3,a4]@2 [d3,gb4]@2 d2 e2 gb2@2 d2@2, a2 ~@4 d4 ~@2", BS: "g2 ~@2 g3 f3 ~@2 f2",
  BT: "bb2 ~@2 bb3 a3 ~@3", BU: "c3 ~ f3 ~ bb2 ~ e3 ~", BV: "a2 ~ d3 ~ a3 a2 db3 a2",
  BW: "d3 db3 d3 e3 f3 e3 f3 g3 a3 g3 a3 bb3 a3 g3 gb3 e3, a4@5 e4 db4@2",
  BX: "d3 db3 d3 e3 d3 c3 bb2 a2 g2 gb2 g2 a2 g2 f2 e2 d2, d4 a3 a4 d4 ~ d5 d4 g4",
  BY: "~@2 bb4@2 e4@2 g3@4 f3 e3 [f3,a3]@2 [bb3,d4]@2, db2@2 ~ g4 ~ db4 ~@2", // F Bb
  BZ: "[a3,a4]@2 g3@2 a3@2 a4 g4 [d2,gb4]@8, ~ bb4@2 a2 ~@4", // A D
})).s("gm_piano").gain(0.8)

// chords · piano · soft notes
const piano_soft = note(`<
  ~@8 A ~@12 B C D E F G H I ~@8 J K L M N B L M ~@13 O P Q R ~@14 B C D E F G H I ~@3 S
>`.pickRestart({
  A: "~@3 e3 a3@2 ~@2", B: "[a4,d5] ~ [a4,db5] ~ [a4,d5] ~@3", C: "[g4,d5] ~ [a4,d5] ~ [bb4,d5] ~@3",
  D: "[e4,bb4] ~ [e4,a4] ~ [d4,a4] ~ [d4,g4] ~", E: "[db4,g4] ~ [d4,f4] ~ [db4,e4] ~@3",
  F: "[a4,d5] ~ [db5,e5] ~ [d5,f5] ~@3", G: "[d5,g5] ~ [d5,gb5] ~ [d5,g5] ~@3",
  H: "[e5,bb5] ~ [e5,a5] ~ [d5,a5] ~ [d5,g5] ~", I: "[db5,g5] ~ [d5,f5] ~ [a4,e5] ~@3",
  J: "[c4,e4] ~ [e4,ab4] ~ [e4,a4] ~@3", K: "[d4,a4] ~ [e4,a4] ~ [f4,a4] ~@3",
  L: "[b4,f5] ~ [b4,e5] ~ [a4,e5] ~ [a4,d5] ~", M: "[ab4,d5] ~ [a4,c5] ~ [e4,b4] ~@3",
  N: "[e4,a4] ~ [ab4,b4] ~ [a4,c5] ~@3", O: "~ d4!7", P: "d4 ~ d4 ~ d4 ~ bb3 ~", Q: "~ g3!7", R: "g3 ~ g3 ~ g3 ~@3",
  S: "~ [d3,d5]", // D
})).s("gm_piano").gain(0.4)

stack(violin, piano, piano_soft)