Strudelify

Canon and Gigue in D major P.37

J. Pachelbel

KeyF majorTempo52 bpm
0:00/0:00
// Canon and Gigue in D major P.37 — J. Pachelbel
// 52 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/863626; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 57 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(52/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS@2 AT
  AU AV AW AX AY@2
>`.pickRestart({
  A: "f5 e5 d5 c5", B: "bb4 a4 bb4 db5", C: "d5 db5 bb4 a4", D: "g4 f4 g4 e4", E: "d4 f4 a4 g4 f4 d4 f4 e4",
  F: "d4 bb3 d4 a4 g4 bb4 a4 g4", G: "f4 d4 e4 db5 d5 f5 a5 a4", H: "bb4@2 g4@2 a4@2 f4@2 d4@2 d5@2 d5@3 db5",
  I: "d5 db5 d5 d4 db4 a4 e4 f4 d4 d5 c5 bb4 a4 f5 a5 bb5", J: "g5 f5 e5 g5 f5 e5 d5 c5 bb4 a4 g4 f4 e4 g4 f4 e4",
  K: "d4 e4 f4 g4 a4 e4 a4 g4 f4 bb4 a4 g4 a4 g4 f4 e4", L: "d4 bb3 bb4 c5 d5 c5 bb4 a4 g4 f4 e4 bb4 a4 bb4 a4 g4",
  M: "f4 f5 e5@2 ~ d5 f5@2", N: "bb5 a5 bb5 db6", O: "d6 d5 db5@2 ~ bb4 d5@2", P: "d5@3 d5!2 g5 e5 a5",
  Q: "a5 [f5,g5] a5 [f5,g5] [a4,a5] [b4,db5] [d5,e5] [f5,g5] f5 [d5,e5] f5 [f4,g4] [a4,bb4] [g4,a4] [f4,a4] [g4,a4]", // Fsus2 A Bsus2 Dsus2 Fsus2 Dsus2 Fsus2 Bbmaj7 …
  R: "g4 [a4,bb4] g4 [e4,f4]!2 [d4,e4] [f4,g4] [a4,bb4] g4 [a4,bb4] bb4 [db5,d5] [a4,b4] [db5,d5] [e5,f5] [g5,a5]", // Bbmaj7 Fmaj7 Dsus2 Fsus2 Bbmaj7 Dmaj7 Asus2 Dmaj7 …
  S: "f5 [d5,e5] f5 [d5,e5] [db5,e5] [d5,e5] [e5,f5] [c5,d5] d5 [bb4,c5] d5 [d4,e4] [f4,g4] [e4,f4] [f4,d5] [db5,d5]", // Dsus2 Dbm Dsus2 Fmaj7 Csus2 Bbsus2 Dsus2 Fsus2 …
  T: "bb4 [c5,d5] bb4 [g4,a4]!2 [f4,g4] [a4,b4] [db5,d5] bb4 [db5,d5] d5 [b4,db5] [db5,d5] [d5,e5] [db5,d5] [b4,db5]", // Csus2 Gsus2 Fsus2 Asus2 Dmaj7 Bsus2 Dmaj7 Dsus2 …
  U: "d5 ~ db5 ~ bb4 ~ d5 ~", V: "d4 ~ d4 ~ d4 ~ e4 ~", W: "~ a4 ~ a4 ~ f4 ~ a4", X: "~ g4 ~ f4 ~ g4 ~ e5",
  Y: "f5 f4 g4 f4 e4 e5 f5 e5 d5 f4 d4 bb4 a4 a3 g3 a3", Z: "bb3 bb4 c5 bb4 a4 a3 g3 a3 bb3 bb4 a4 bb4 db5 db4 b3 db4",
  AA: "d4 d5 e5 d5 db5 db4 d4 c4 bb3 bb4 a4 bb4 c5 c4 f4 e4", AB: "d4 d5 e5 g5 f5 f4 a4 f5 d5 g5 f5 g5 e5 a4 g4 a4",
  AC: "f4 a4!7 f4!6 a4!2", AD: "g4!3 d5!7 bb4!2 a4!2 e5 db5", AE: "a4 f5!3 e5!4 d5!4 a5!4",
  AF: "bb5!4 a5!4 bb5!4 db6 db5!3", AG: "d5 [d4,e4] f4 d4 db4 [db5,d5] e5 db5 bb4 [bb3,c4] d4 bb3 c4 [g4,a4] f4 e4",
  AH: "d4 [f4,g4] e4 g4 f4 [d4,e4] f4 a4 g4 [a4,bb4] g4 f4 e4 [g4,a4] f4 e4", // Fsus2 Dsus2 Bbmaj7 Gsus2
  AI: "f4 [db5,d5] d5 f4 a4 [a4,b4] db5 a4 f4 [d5,e5] f5 d5 f5 [e5,f5] d5 c5", // Dmaj7 Asus2 Dsus2 Fmaj7
  AJ: "bb4 [a4,bb4] bb4 db5 d5 [e5,f5] d5 f5 g5 [c5,d5] bb4!2 a4 e4 a4!2", AK: "a4@3 a4 d4@3 a4",
  AL: "g4@4 a4@4 g4@2 d4@2 d4@3 db4", AM: "d4 d5 db5@2 bb4@2 a4@2", AN: "d4@3 e4 f4@4 bb4@4 e4@3 e4",
  AO: "f4@3 f5!2 g5 f5 e5 d5@3 d5!2 eb5 d5 c5", AP: "bb4@4 d5@4 d5 c5 bb4 c5 a4@3 a4",
  AQ: "a4@3 a5!2 bb5 a5 g5 f5@3 f5!2 g5 f5 eb5", AR: "d5 c5 bb4 c5 a4@3 a4 g4@2 d5@2 db5@3 db5",
  AS: "[d5@2 d5@4 c5@4 bb4@4 a4@4 g4@4 f4@5 e4 e4@4]/2", AT: "f4 f5@2 e5 d5 d6@2 c6", AU: "bb5@2 d6 a5 bb5@2 a5@2",
  AV: "a5@4 a4@3 g4 f4@4 f5@3 e5", AW: "d5@3 d5 d5@2 db5@2", AX: "d5 d4 db4 db5 bb4 bb3 a3 a4",
  AY: "[g4@2 g5@2 f5@2 f4@2 e4@2 bb4@2 ~ e4@2 e5@4 f5@7 ~@6]/2",
})).s("gm_violin").gain(0.12)

// other · violin
const violin_2 = note(`<
  ~@6 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 AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS@2 AT
  AU AV AW@2
>`.pickRestart({
  A: "f5 e5 d5 c5", B: "bb4 a4 bb4 db5", C: "d5 db5 bb4 a4", D: "g4 f4 g4 e4", E: "d4 f4 a4 g4 f4 d4 f4 e4",
  F: "d4 bb3 d4 a4 g4 bb4 a4 g4", G: "f4 d4 e4 db5 d5 f5 a5 a4", H: "bb4@2 g4@2 a4@2 f4@2 d4@2 d5@2 d5@3 db5",
  I: "d5 db5 d5 d4 db4 a4 e4 f4 d4 d5 c5 bb4 a4 f5 a5 bb5", J: "g5 f5 e5 g5 f5 e5 d5 c5 bb4 a4 g4 f4 e4 g4 f4 e4",
  K: "d4 e4 f4 g4 a4 e4 a4 g4 f4 bb4 a4 g4 a4 g4 f4 e4", L: "d4 bb3 bb4 c5 d5 c5 bb4 a4 g4 f4 e4 bb4 a4 bb4 a4 g4",
  M: "f4 f5 e5@2 ~ d5 f5@2", N: "bb5 a5 bb5 db6", O: "d6 d5 db5@2 ~ bb4 d5@2", P: "d5@3 d5!2 g5 e5 a5",
  Q: "a5 [f5,g5] a5 [f5,g5] [a4,a5] [b4,db5] [d5,e5] [f5,g5] f5 [d5,e5] f5 [f4,g4] [a4,bb4] [g4,a4] [f4,a4] [g4,a4]", // Fsus2 A Bsus2 Dsus2 Fsus2 Dsus2 Fsus2 Bbmaj7 …
  R: "g4 [a4,bb4] g4 [e4,f4]!2 [d4,e4] [f4,g4] [a4,bb4] g4 [a4,bb4] bb4 [db5,d5] [a4,b4] [db5,d5] [e5,f5] [g5,a5]", // Bbmaj7 Fmaj7 Dsus2 Fsus2 Bbmaj7 Dmaj7 Asus2 Dmaj7 …
  S: "f5 [d5,e5] f5 [d5,e5] [db5,e5] [d5,e5] [e5,f5] [c5,d5] d5 [bb4,c5] d5 [d4,e4] [f4,g4] [e4,f4] [f4,d5] [db5,d5]", // Dsus2 Dbm Dsus2 Fmaj7 Csus2 Bbsus2 Dsus2 Fsus2 …
  T: "bb4 [c5,d5] bb4 [g4,a4]!2 [f4,g4] [a4,b4] [db5,d5] bb4 [db5,d5] d5 [b4,db5] [db5,d5] [d5,e5] [db5,d5] [b4,db5]", // Csus2 Gsus2 Fsus2 Asus2 Dmaj7 Bsus2 Dmaj7 Dsus2 …
  U: "d5 ~ db5 ~ bb4 ~ d5 ~", V: "d4 ~ d4 ~ d4 ~ e4 ~", W: "~ a4 ~ a4 ~ f4 ~ a4", X: "~ g4 ~ f4 ~ g4 ~ e5",
  Y: "f5 f4 g4 f4 e4 e5 f5 e5 d5 f4 d4 bb4 a4 a3 g3 a3", Z: "bb3 bb4 c5 bb4 a4 a3 g3 a3 bb3 bb4 a4 bb4 db5 db4 b3 db4",
  AA: "d4 d5 e5 d5 db5 db4 d4 c4 bb3 bb4 a4 bb4 c5 c4 f4 e4", AB: "d4 d5 e5 g5 f5 f4 a4 f5 d5 g5 f5 g5 e5 a4 g4 a4",
  AC: "f4 a4!7 f4!6 a4!2", AD: "g4!3 d5!7 bb4!2 a4!2 e5 db5", AE: "a4 f5!3 e5!4 d5!4 a5!4",
  AF: "bb5!4 a5!4 bb5!4 db6 db5!3", AG: "d5 [d4,e4] f4 d4 db4 [db5,d5] e5 db5 bb4 [bb3,c4] d4 bb3 c4 [g4,a4] f4 e4",
  AH: "d4 [f4,g4] e4 g4 f4 [d4,e4] f4 a4 g4 [a4,bb4] g4 f4 e4 [g4,a4] f4 e4", // Fsus2 Dsus2 Bbmaj7 Gsus2
  AI: "f4 [db5,d5] d5 f4 a4 [a4,b4] db5 a4 f4 [d5,e5] f5 d5 f5 [e5,f5] d5 c5", // Dmaj7 Asus2 Dsus2 Fmaj7
  AJ: "bb4 [a4,bb4] bb4 db5 d5 [e5,f5] d5 f5 g5 [c5,d5] bb4!2 a4 e4 a4!2", AK: "a4@3 a4 d4@3 a4",
  AL: "g4@4 a4@4 g4@2 d4@2 d4@3 db4", AM: "d4 d5 db5@2 bb4@2 a4@2", AN: "d4@3 e4 f4@4 bb4@4 e4@3 e4",
  AO: "f4@3 f5!2 g5 f5 e5 d5@3 d5!2 eb5 d5 c5", AP: "bb4@4 d5@4 d5 c5 bb4 c5 a4@3 a4",
  AQ: "a4@3 a5!2 bb5 a5 g5 f5@3 f5!2 g5 f5 eb5", AR: "d5 c5 bb4 c5 a4@3 a4 g4@2 d5@2 db5@3 db5",
  AS: "[d5@2 d5@4 c5@4 bb4@4 a4@4 g4@4 f4@5 e4 e4@4]/2", AT: "f4 f5@2 e5 d5 d6@2 c6", AU: "bb5@2 d6 a5 bb5@2 a5@2",
  AV: "a5@4 a4@3 g4 f4@4 f5@3 e5", AW: "[d5@6 d5@2 d5@5 db5@6 d5@7 ~@6]/2",
})).s("gm_violin").gain(0.12)

// other · cello · "Violoncello"
const cello = note(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C@2
>`.pickRestart({
  A: "d3 a2 bb2 f2", B: "g2 d2 g2 a2", C: "[g2@4 d2@4 g2@5 a2@6 d2@7 ~@6]/2",
})).s("gm_cello").gain(0.3)

stack(violin, violin_2, cello)