Strudelify

Jesu bleibet meine Freude

J.S. Bach 1716/1723

KeyG majorTempo105 bpm
0:00/0:00
// Jesu bleibet meine Freude — J.S. Bach 1716/1723
// 105 bpm, 9/8, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "I in B♭" trumpet (copy of ch 1 "I Sopraano" choir aahs); ch 12 "III Oboe" oboe (copy of ch 9 "III in B♭" trumpet); ch 15 "IV in Bb" tuba (copy of ch 14 "IV in Es" french horn)
// note: Transcription provider: pdmx. https://musescore.com/score/3804286; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 72 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/4.5)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · flute · "II Huilu"
const flute = note(`<
  ~@8 A B C D ~ A E F G ~@7 A B C D ~ A E F H ~@7 I J K L ~@2 M N O P ~@2 A B Q ~@2 A E R H ~@3 S T U V W T X H
>`.pickRestart({
  A: "b5@30 ~@2 c6@15 ~", B: "d6@30 ~@2 d6@15 ~", C: "c6@30 ~@2 b5@15 ~", D: "a5@5 ~@11", E: "d6@30 ~@2 b5@15 ~",
  F: "a5@10 ~ b5@2 c6@3 b5@15 ~ a5 b5 ~ a5 b5 a5 ~ b5 a5 b5 ~ a5 b5 a5 ~ b5", G: "g5@5 ~@11", H: "g5@5 ~@3",
  I: "a5@30 ~@2 b5@15 ~", J: "c6@30 ~@2 c6@15 ~", K: "b5@25 ~@2 c6@2 d6@3 b5@15 ~", L: "a5 ~@2", M: "c6@30 ~@2 d6@15 ~",
  N: "e6@30 ~@2 e6@15 ~", O: "d6@25 ~@2 e6@2 f6@3 d6@15 ~", P: "c6 ~@2",
  Q: "c6@15 ~ b5 c6 ~ b5 c6 b5 ~ c6 b5 c6 ~ b5 c6 b5 ~ c6 b5 c6 ~ b5 c6 b5 ~ c6 b5 c6 ~ b5 c6 b5 ~ c6",
  R: "a5@10 ~ b5@2 c6@3 a5 b5 ~ a5 b5 a5 ~ b5 a5 b5 ~ a5 b5 a5 ~ b5 a5 b5 ~ a5 b5 a5 ~ b5 a5 b5 ~ a5 b5 a5 ~ b5",
  S: "~@5 g5@5 ~ a5@5 b5@5 d6@5 ~ c6@5 c6@5 e6@5 ~ d6@5", T: "d6@5 g6@5 ~ f#6@5 g6@5 d6@5 ~ b5@5 g5@5 a5@5 ~ b5@5",
  U: "c6@5 d6@5 ~ e6@5 d6@5 c6@5 ~ b5@5 a5@5 b5@5 ~ g5@5", V: "f#5@5 g5@5 ~ a5@5 d5@5 f#5@5 ~ a5@5 c6@5 b5@5 ~ a5@5",
  W: "b5@5 g5@5 ~ a5@5 b5@5 d6@5 ~ c6@5 c6@5 e6@5 ~ d6@5", X: "e5@5 d6@5 ~ c6@5 b5@5 a5@5 ~ g5@5 d5@5 g5@5 ~ f#5@5",
})).s("gm_flute").gain(0.4)

// other · trumpet · "II in B♭"
const trumpet = note(`<
  ~@8 A B C D ~ A E F G ~@7 A B C D ~ A E F H ~@7 I J K D ~@2 L M N O ~@2 A B P ~@2 A E Q H ~@3 R S T U V S W H
>`.pickRestart({
  A: "b4@2 c5", B: "d5@2 d5", C: "c5@2 b4", D: "a4 ~@2", E: "d5@2 b4",
  F: "a4@11 b4@2 c5@3 b4@16 a4 b4 ~ a4 b4 a4 ~ b4 a4 b4 ~ a4 b4 a4 ~ b4", G: "g4 ~@2", H: "g4@2 ~", I: "a4@2 b4",
  J: "c5@2 c5", K: "b4@27 c5@2 d5@3 b4@16", L: "c5@2 d5", M: "e5@2 e5", N: "d5@27 e5@2 f5@3 d5@16", O: "c5 ~@2",
  P: "c5@16 b4 c5 ~ b4 c5 b4 ~ c5 b4 c5 ~ b4 c5 b4 ~ c5 b4 c5 ~ b4 c5 b4 ~ c5 b4 c5 ~ b4 c5 b4 ~ c5",
  Q: "a4@11 b4@2 c5@3 a4 b4 ~ a4 b4 a4 ~ b4 a4 b4 ~ a4 b4 a4 ~ b4 a4 b4 ~ a4 b4 a4 ~ b4 a4 b4 ~ a4 b4 a4 ~ b4",
  R: "~@5 g4@5 ~ a4@5 b4@5 d5@5 ~ c5@5 c5@5 e5@5 ~ d5@5", S: "d5@5 g5@5 ~ f#5@5 g5@5 d5@5 ~ b4@5 g4@5 a4@5 ~ b4@5",
  T: "c5@5 d5@5 ~ e5@5 d5@5 c5@5 ~ b4@5 a4@5 b4@5 ~ g4@5", U: "f#4@5 g4@5 ~ a4@5 d4@5 f#4@5 ~ a4@5 c5@5 b4@5 ~ a4@5",
  V: "b4@5 g4@5 ~ a4@5 b4@5 d5@5 ~ c5@5 c5@5 e5@5 ~ d5@5", W: "e4@5 d5@5 ~ c5@5 b4@5 a4@5 ~ g4@5 d4@5 g4@5 ~ f#4@5",
})).s("gm_trumpet").gain(0.4)

// other · trumpet · "III in B♭"
const trumpet_2 = note(`<
  A B C D E B F G H I J K L M N O P B C D E B F G H I J K L M N O P B C D E B F Q R S T U V W X Y Z AA AB AC M H AD AE L
  M N O G AF AG L E B C D E B F AH
>`.pickRestart({
  A: "~@5 g4@5 ~ a4@5 b4@5 d5@5 ~ c5@5 c5@5 e5@5 ~ d5@5", B: "d5@5 g5@5 ~ f#5@5 g5@5 d5@5 ~ b4@5 g4@5 a4@5 ~ b4@5",
  C: "c5@5 d5@5 ~ e5@5 d5@5 c5@5 ~ b4@5 a4@5 b4@5 ~ g4@5", D: "f#4@5 g4@5 ~ a4@5 d4@5 f#4@5 ~ a4@5 c5@5 b4@5 ~ a4@5",
  E: "b4@5 g4@5 ~ a4@5 b4@5 d5@5 ~ c5@5 c5@5 e5@5 ~ d5@5", F: "e4@5 d5@5 ~ c5@5 b4@5 a4@5 ~ g4@5 d4@5 g4@5 ~ f#4@5",
  G: "g4@5 b4@5 ~ d5@5 g5@5 d5@5 ~ b4@5 g4@5 b4@5 ~ d5@5", H: "g5@2 g5", I: "a5 g5 f#5", J: "g5 d5@2",
  K: "d5@5 d4@5 ~ e4@5 f#4@5 a4@5 ~ g4@5 a4@5 c5@5 ~ b4@5", L: "c5@5 a4@5 ~ f#4@5 d4@5 f#4@5 ~ a4@5 c5@5 b4@5 ~ a4@5",
  M: "g4@2 g5", N: "g5 d5 e5", O: "e5@16 f#5@11 e5@5 f#5@16", P: "g5@5 b4@5 ~ a4@5 b4@5 d5@5 ~ c5@5 c5@5 e5@5 ~ d5@5",
  Q: "g4@5 b4@5 ~ d5@5 g5@5 d5@5 ~ b4@5 g4@5 b4@5 ~ c#5@5", R: "d5 f#5 g#5", S: "a5@2 a5", T: "a5@2 g#5",
  U: "a5@5 c5@5 ~ b4@5 c5@5 e5@5 ~ d5@5 d5@5 f5@5 ~ e5@5", V: "e5@5 a5@5 ~ g#5@5 a5@5 e5@5 ~ c5@5 a4@5 b4@5 ~ c5@5",
  W: "f5@5 e5@5 ~ d5@5 c5@5 b4@5 ~ a4@5 e4@5 a4@5 ~ g#4@5", X: "a4 a5 g5", Y: "g5 c6 g5", Z: "f5 a5 g5",
  AA: "~@5 g5@5 ~ f5@5 g5@5 e5@5 ~ c5@5 g4@5 a4@5 ~ a#4@5", AB: "a4@5 c5@5 ~ b4@5 c5@5 a4@5 ~ f4@5 d4@5 e4@5 ~ f4@5",
  AC: "e4@5 c4@5 ~ d4@5 e4@5 g4@5 ~ f#4@5 g4@5 b4@5 ~ a4@5", AD: "g5@11 f#5@5 g5@32",
  AE: "f#5@5 d4@5 ~ e4@5 f#4@5 a4@5 ~ g4@5 a4@5 c5@5 ~ b4@5", AF: "f5@5 d5@5 ~ b4@5 g4@5 b4@5 ~ d5@5 e5@5 c5@5 ~ a4@5",
  AG: "f#4@5 a4@5 ~ c5@5 d5@5 b4@5 ~ g4@5 e4@5 g4@5 ~ b4@5", AH: "g4@2 ~",
})).s("gm_trumpet").gain(0.4)

// other · clarinet · "V in Bb"
const clarinet = note(`<
  A B C D E F G H I J K L M I N O P B C D E F G H I J K L M I N O P B C D E F G Q R S T U V W X Y J Z AA AB I N AC AD M
  I N O AE AF AG AH AI B C D E F G AJ
>`.pickRestart({
  A: "~@16 g3@11 f#3@5 g3@11 a3@5", B: "b3@11 a3@5 b3@11 g3@5 e3@11 d3@5", C: "e3@11 f#3@5 g3@11 d3@5 e3@11 b2@5",
  D: "a2@11 d3@5 a3@11 g3@5 a3@11 f#3@5", E: "d3@11 f#3@5 g3@11 f#3@5 g3@11 a3@5",
  F: "b3@11 a3@5 b3@11 g3@5 e3@11 g3@5", G: "a3@11 f#3@5 g3@11 e3@5 a2@11 c3@5", H: "b2@11 g3@5 b3@11 d4@5 g4@11 d4@5",
  I: "d4@2 e4", J: "a3@2 b3", K: "b3 a3 g3", L: "f#3@16 d3@11 e3@5 f#3@11 g3@5", M: "a3@11 c4@5 a3@11 f#3@5 d3@11 d4@5",
  N: "d4 b3!2", O: "c4@11 a3@5 d4@11 b3@5 c4@16", P: "b3@16 g3@11 f#3@5 g3@11 a3@5",
  Q: "b2@11 g3@5 b3@11 d4@5 g4@11 g3@5", R: "f#3 d4!2", S: "e4@2 f4", T: "f4 d4 e4",
  U: "c4@11 e3@5 a3@11 g#3@5 a3@11 b3@5", V: "c4@11 b3@5 c4@11 a3@5 f3@11 a3@5",
  W: "a3@11 g#3@5 a3@11 f#3@5 b2@11 d3@5", X: "c3 e4 d4", Y: "c4@2 c4", Z: "c4@11 g3@5 c4@11 g3@5 e3@11 d3@5",
  AA: "c3@11 e3@5 f3@11 a3@5 b3@11 d4@5", AB: "c4@11 g3@5 c4@11 a3@5 d4@11 d4@5", AC: "c4 d4 e4",
  AD: "a3@16 d3@11 e3@5 f#3@11 g3@5", AE: "b3@11 g3@5 b3@11 d4@5 g4@11 d4@5", AF: "b3@11 g3@5 d4@11 b3@5 c4@16",
  AG: "c4@11 a3@5 b3@16 b3@11 g3@5", AH: "a3@16 a3@11 f#3@5 d3@11 f#3@5", AI: "g3@11 d3@5 g3@11 f#3@5 g3@11 a3@5",
  AJ: "b2@2 ~",
})).s("gm_clarinet").gain(0.2)

// other · french horn · "IV in Es"
const french_horn = note(`<
  ~@7 A B C D E F G H I J ~@6 A B C D E F G H I J ~@6 K L M N O ~@3 P Q ~@2 R G H S T F G H I U E V ~@8 W
>`.pickRestart({
  A: "~@32 b3@11 g4@5", B: "g4 f#4 e4", C: "f#4 e4 d4", D: "e4 f#4 g4", E: "d4 ~@2", F: "~@32 a3@11 f#4@5",
  G: "g4@5 g3@5 ~ a3@5 b3@5 d4@5 ~ c4@5 c4@5 e4@5 ~ d4@5", H: "d4@5 g4@5 ~ f#4@5 g4@5 d4@5 ~ b3@5 g3@5 a3@5 ~ b3@5",
  I: "e3@5 d4@5 ~ c4@5 b3@5 a3@5 ~ g3@5 d3@5 g3@5 ~ f#3@5", J: "g3 d4 e4", K: "~@32 d4@11 e4@5", L: "d4 c4 b3",
  M: "a3@16 a3@11 g3@5 f3@11 e4@5", N: "d4 b3 e4", O: "e4 ~@2",
  P: "~@5 c4@5 ~ d4@5 e4@5 g4@5 ~ f#4@5 g4@5 a#4@5 ~ a4@5",
  Q: "a4@5 [c4,c5]@5 ~ [b3,b4]@5 [c4,c5]@5 a4@5 ~ f4@5 d4@5 e4@5 ~ f4@5", R: "~@32 d4@11 f#4@5",
  S: "c4@5 d4@5 ~ e4@5 d4@5 c4@5 ~ b3@5 a3@5 b3@5 ~ g3@5", T: "d3 ~@2", U: "g3 ~@2", V: "a3 ~@2", W: "d4@2 ~",
})).s("gm_french_horn").gain(0.3)

// other · french horn · "IV in Es" · soft notes
const french_horn_soft = note(`<
  A B C D E B F G ~@3 H I ~@4 B C D E B F G ~@3 H I ~@4 B C D E B F J ~@3 K L M N ~@2 O P Q ~@3 H I ~@3 R S T U V B C D
  E B F ~
>`.pickRestart({
  A: "~ d4 e4", B: "g4 e4 b3", C: "a3 d4 c4", D: "c4 a3 f#4", E: "g4 g3 e4", F: "c4 e4 d4", G: "d4@16 ~@11 d4@5 ~@16",
  H: "~ a3 d4", I: "f#4@11 a4@5 f#4@11 d4@5 ~@16", J: "d4@16 ~@11 g4@5 ~@16", K: "~ a3 f4", L: "a4 f4 c4",
  M: "d4 f#4 e4", N: "a3@5 c4@5 ~ e4@5 a4@32", O: "e4!2 g4", P: "f4 a4 g4", Q: "g4@16 ~@11 d4@5 ~@16",
  R: "~@27 g4@5 d4@11 g4@5", S: "~@27 g4@5 e4@11 c4@5", T: "~@27 d4@5 b3@11 e4@5",
  U: "e4@11 a4@5 f#4@11 a4@5 f#4@11 d4@5", V: "d4!2 e4",
})).s("gm_french_horn").gain(0.2)

// other · bassoon · "VI in C"
const bassoon = note(`<
  A B C D E F G H I J K L M N O P A B C D E F G H I J K L M N O P A B C D E F G Q R S T U V W X Y Z AA AB AC A B C L M N
  O P AD AE AF AD A B C D E F G AD
>`.pickRestart({
  A: "g2 g3 e3", B: "b2 e3 e2", C: "a2 b2 c3", D: "d3 f#3 d3", E: "g3 e3 c3", F: "b2 e3 d3", G: "c3 c#3 d3",
  H: "g2@16 ~@11 g3@5 d3@11 b2@5", I: "g2 f#3 e3", J: "f#3 e3 d3", K: "e3 f#3 g3", L: "d3@16 ~@11 d3@5 d3@11 d3@5",
  M: "d2@16 ~@11 d3@5 d3@11 d3@5", N: "g2 f#2 e2", O: "b2 b1 e2", P: "c2 d2!2", Q: "g2@16 ~@11 g3@5 f#3@11 e3@5",
  R: "d3 c3 b2", S: "a2@16 a3@11 g3@5 f3@11 e3@5", T: "d3 b2 e3", U: "a2 f3 d3", V: "c3 f3 e3", W: "d3 d#3 e3",
  X: "a2!2 b2", Y: "c3 a2 e2", Z: "f2 d2 g2", AA: "c3 e3 c3", AB: "f3 d3 g3", AC: "c3@16 ~@11 c3@5 b2@11 d3@5",
  AD: "g2@2 ~", AE: "g2@27 g2@5 g2@11 g2@5", AF: "g2@27 g2@5 g2@5 g2@5 ~ g2@5",
})).s("gm_bassoon").gain(0.25)

stack(flute, trumpet, trumpet_2, clarinet, french_horn, french_horn_soft, bassoon)