Strudelify
KeyG majorTempo120 bpm
0:00/0:00
// Jesus bleibet meine Freude — J. S. Bachcantata Herz und Mund und Tat und Leben BWV 148
// 120 bpm, 9/8, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "Piano" named as a piano, played on piano (its church organ patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5807086; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 56 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4.5)

// 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.

// chords · piano
const piano = note(`<
  A B C D A E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI H I J K AJ M N O AK AL@3 T AM AN AO T
  U V AP
>`.pickRestart({
  A: "g2 g3 e3", B: "b2 e3 e2", C: "a2 b2 c3", D: "d3 f#3 d3", E: "b2 e3 d3", F: "c3 c#3 d3", G: "g2@2 ~",
  H: "g3 f#3 [e3,e4,g4], [d4,g4]@2 ~", I: "[f#3,f#4,a4] [e3,g4] [d3,f#4,a4]", J: "[e3,e4,g4] [f#3,a4] [g3,d4,g4]",
  K: "[f#4,a4]@3 d4@2 e4@3 f#4@3 a4@2 g4@3 a4@3 c5@2 b4@3, d3@2 d3", // F#m
  L: "c5@3 a4@2 f#4@3 d4@3 f#4@2 a4@3 c5@3 b4@2 a4@3, d2@2 d3",
  M: "g4@3 b4@2 a4@3 b4@3 d5@2 c5@3 c5@3 e5@2 d5@3, g3 f#3 e3",
  N: "d5@3 g5@2 f#5@3 g5@3 d5@2 b4@3 g4@3 a4@2 b4@3, b2 b3 e3",
  O: "e4@3 d5@2 c5@3 b4@3 a4@2 g4@3 d4@3 g4@2 f#4@3, c3 d3!2",
  P: "g4@3 b4@2 a4@3 g4@3 b4@2 a4@3 a4@3 c5@2 b4@3, g2 g3 e3", Q: "b4@3 e5@2 d5@3 e5@3 b4@2 g4@3 [e2,e4]@8, b2 e3 ~",
  R: "a4@3 b4@2 c5@3 b4@3 a4@2 g4@3 f#4@3 g4@2 e4@3, a2 b2 c3",
  S: "d4@3 g4@2 a4@3 d4@3 f#4@2 a4@3 c5@3 b4@2 a4@3, d3 f#3 d3",
  T: "b4@3 g4@2 a4@3 b4@3 d5@2 c5@3 c5@3 e5@2 d5@3, g2 g3 e3",
  U: "d5@3 g5@2 f#5@3 g5@3 d5@2 b4@3 g4@3 a4@2 b4@3, b2 e3 d3",
  V: "e4@3 d5@2 c5@3 b4@3 a4@2 g4@3 d4@3 g4@2 f#4@3, c3 c#3 d3",
  W: "g4@3 b4@2 d5@3 g5@3 d5@2 b4@3 g4@3 b4@2 c#5@3, g2@2 ~", X: "d3 c3 [b2,d4,g#4], [f#4,a4]@2 ~",
  Y: "a2@2 a3 g3 f3 e3, [e4,a4]@2 [f4,a4]", Z: "d3 b2 [e3,e4,g#4], [f4,a4]@2 ~",
  AA: "a4@3 c5@2 b4@3 c5@3 e5@2 d5@3 d5@3 f5@2 e5@3, a2 f3 d3",
  AB: "e5@3 a5@2 g#5@3 a5@3 e5@2 c5@3 a4@3 b4@2 c5@3, c3 f3 e3",
  AC: "f5@3 e5@2 d5@3 c5@3 b4@2 a4@3 e4@3 a4@2 g#4@3, d3 d#3 e3", AD: "a2 a3 [b2,g4,b4], [e4,a4]@2 ~",
  AE: "c3@8 c4@8 g4@3 c5@2 a#4@3, [g4,c5]@2 e3", AF: "f3 d3 [g3,g4,b4], [f4,a4]@2 ~",
  AG: "c5@3 g5@2 f5@3 g5@3 e5@2 c5@3 g4@3 a4@2 a#4@3, c3 e3 c3",
  AH: "a4@3 c5@2 b4@3 c5@3 a4@2 f4@3 d4@3 e4@2 f4@3, f3 d3 g3",
  AI: "e4@3 c4@2 d4@3 e4@3 g4@2 f#4@3 g4@3 b4@2 [a3,a4]@3, c3@8 c4@8 b3@5 ~@3", // A
  AJ: "c5@3 a4@2 f#4@3 d4@3 f#4@2 a4@3 c5@3 b4@2 a4@3, d3@2 d3", AK: "g4@3 b4@2 d5@3 g5@3 d5@2 b4@3 g4@3 b4@2 d5@3, g2",
  AL: "[f5@3 d5@2 b4@3 g4@3 b4@2 d5@3 e5@3 c5@2 a4@3 f#4@3 a4@2 c5@3 d5@3 b4@2 g4@3 e4@3 g4@2 b4@3 c5@3 a4@2 f#4@3 d4@3 f#4@2 a4@3 c5@3 b4@2 a4@3, g2 g2@6 ~@2]/3",
  AM: "d5@3 g5@2 f#5@3 g5@3 d5@2 b4@3 g4@3 a4@2 b4@3, b2 e3 e2",
  AN: "c5@3 d5@2 e5@3 d5@3 c5@2 b4@3 a4@3 b4@2 g4@3, a2 b2 c3",
  AO: "f#4@3 g4@2 a4@3 d4@3 f#4@2 a4@3 c5@3 b4@2 a4@3, d3 f#3 d3", AP: "[g2,g3,b3,d4,g4]@7 ~",
})).s("gm_piano").gain(0.14)

stack(piano)