Strudelify

Canon in D major

Johann Pachelbel

KeyD majorTempo80 bpm
0:00/0:00
// Canon in D major — Johann Pachelbel
// 80 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "Alto Saxophone" alto sax (copy of ch 1 "Flute" flute)
// note: Transcription provider: pdmx. https://musescore.com/score/1034166; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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 · bassoon
const bassoon = note(`<
  ~@8 A B C D B C 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
  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 BU BV BW C BX BY BZ CA CB CC CD CE CC
  CF CG@4 CH CI@6 CJ CK CL CM CN@2
>`.pickRestart({
  A: "f#4 e4", B: "d4 c#4", C: "b3 a3", D: "b3 c#4", E: "g3 f#3", F: "g3 e3", G: "d3 f#3 a3 g3", H: "f#3 d3 f#3 e3",
  I: "d3 b2 d3 a3", J: "g3 b3 a3 g3", K: "f#3 d3 e3 c#4", L: "d4 f#4 a4 a3", M: "b3 g3 a3 f#3",
  N: "d3@4 d4@4 [d4,e4] d4 [d4,e4]!2 d4 [d4,e4] c#4@2", O: "d4 c#4 d4 d3 c#3 a3 e3 f#3",
  P: "d3 d4 c#4 b3 c#4 f#4 a4 b4", Q: "g4 f#4 e4 g4 f#4 e4 d4 c#4", R: "b3 a3 g3 f#3 e3 g3 f#3 e3",
  S: "d3 e3 f#3 g3 a3 e3 a3 g3", T: "f#3 b3 a3 g3 a3 g3 f#3 e3", U: "d3 b2 b3 c#4 d4 c#4 b3 a3",
  V: "g3 f#3 e3 b3 a3 b3 a3 g3", W: "f#3 f#4 e4@2", X: "~ d4 f#4@2", Y: "b4 a4", Z: "b4 c#5", AA: "d5 d4 c#4@2",
  AB: "~ b3 d4@2", AC: "d4@3 d4", AD: "d4 g4 e4 a4", AE: "a4@2 f#4 g4 a4@2 f#4 g4 a4 a3 b3 c#4 d4 e4 f#4 g4",
  AF: "f#4@2 d4 e4 f#4@2 f#3 g3 a3 b3 a3 g3 a3 f#3 g3 a3", AG: "g3@2 b3 a3 g3@2 f#3 e3 f#3 e3 d3 e3 f#3 g3 a3 b3",
  AH: "g3@2 b3 a3 b3@2 c#4 d4 a3 b3 c#4 d4 e4 f#4 g4 a4", AI: "f#4@2 d4 e4 f#4@2 e4 d4 e4 c#4 d4 e4 f#4 e4 d4 c#4",
  AJ: "d4@2 b3 c#4 d4@2 d3 e3 f#3 g3 f#3 e3 f#3 d4 c#4 d4", AK: "b3@2 d4 c#4 b3@2 a3 g3 a3 g3 f#3 g3 a3 b3 c#4 d4",
  AL: "b3@2 d4 c#4 d4@2 c#4 b3 c#4 d4 e4 d4 c#4 d4 b3 c#4", AM: "d4 ~ c#4 ~", AN: "b3 ~ d4 ~", AO: "d3 ~ d3 ~",
  AP: "d3 ~ e3 ~", AQ: "~ a3 ~ a3", AR: "~ f#3 ~ a3", AS: "~ g3 ~ f#3", AT: "~ g3 ~ e4",
  AU: "f#4 f#3 g3 f#3 e3 e4 f#4 e4", AV: "d4 f#3 d3 b3 a3 a2 g2 a2", AW: "b2 b3 c#4 b3 a3 a2 g2 a2",
  AX: "b2 b3 a3 b3 c#4 c#3 b2 c#3", AY: "d3 d4 e4 d4 c#4 c#3 d3 c#3", AZ: "b2 b3 a3 b3 c#4 c#3 f#3 e3",
  BA: "d3 d4 e4 g4 f#4 f#3 a3 f#4", BB: "d4 g4 f#4 g4 e4 a3 g3 a3", BC: "f#3 a3!7", BD: "f#3!6 a3!2", BE: "g3!3 d4!5",
  BF: "d4!2 b3!2 a3!2 e4 c#4", BG: "a3 f#4!3 e4!4", BH: "d4!4 a4!4", BI: "b4!4 a4!4", BJ: "b4!4 c#5 c#4!3",
  BK: "d4@2 d3 e3 f#3@2 d3@2 c#3@2 c#4 d4 e4@2 c#4@2", BL: "b3@2 b2 c#3 d3@2 b2@2 c#3@2 a3 g3 f#3@2 e3@2",
  BM: "d3@2 g3 f#3 e3@2 g3@2 f#3@2 d3 e3 f#3@2 a3@2", BN: "g3@2 b3 a3 g3@2 f#3@2 e3@2 a3 g3 f#3@2 e3@2",
  BO: "f#3@2 d4 c#4 d4@2 f#3@2 a3@2 a3 b3 c#4@2 a3@2", BP: "f#3@2 d4 e4 f#4@2 d4@2 f#4@2 f#4 e4 d4@2 c#4@2",
  BQ: "b3@2 b3 a3 b3@2 c#4@2 d4@2 f#4 e4 d4@2 f#4@2", BR: "g4@2 d4 c#4 b3@2 b3@2 a3@2 e3@2 a3@2 a3@2", BS: "a3@3 a3",
  BT: "d3@3 a3", BU: "g3 a3", BV: "g3@2 d3@2 d3@3 c#3", BW: "d3 d4 c#4@2", BX: "d3@3 e3 f#3@4", BY: "b3@4 e3@3 e3",
  BZ: "f#3@3 f#4!2 g4 f#4 e4", CA: "d4@3 d4!2 e4 d4 c#4", CB: "b3 d4", CC: "d4 c4 b3 c4 a3@3 a3",
  CD: "a3@3 a4!2 b4 a4 g4", CE: "f#4@3 f#4!2 g4 f#4 e4", CF: "g3@2 d4@2 c#4@3 c#4",
  CG: "[d4@2 d4@4 c#4@4 b3@4 a3@4 g3@4 f#3@3 f#3@2 f#3 e3@2 f#3@2]/4", CH: "f#4@2 e4 d4",
  CI: "[d5@4 c5@2 b4@4 d5@2 a4@2 b4@4 a4@4 a4@4 a3@3 g3 f#3@4 f#4@3 e4 d4@4 d4@2 d4@4]/6", CJ: "c#4@2 d4 d3",
  CK: "c#3 c#4 b3 b2", CL: "a2 a3 g3 g4", CM: "f#4 f#3 e3 b3", CN: "[e3 e4 f#4@4 ~@2]/2",
})).s("gm_bassoon").gain(0.3)

// other · clarinet · "Bass Clarinet"
const clarinet = note(`<
  ~@12 A B C D B C 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
  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 BU BV BW C BX BY BZ CA CB CC CD CE CC
  CF CG@4 CH CI@6 CJ@2
>`.pickRestart({
  A: "f#4 e4", B: "d4 c#4", C: "b3 a3", D: "b3 c#4", E: "g3 f#3", F: "g3 e3", G: "d3 f#3 a3 g3", H: "f#3 d3 f#3 e3",
  I: "d3 b2 d3 a3", J: "g3 b3 a3 g3", K: "f#3 d3 e3 c#4", L: "d4 f#4 a4 a3", M: "b3 g3 a3 f#3",
  N: "d3@4 d4@4 [d4,e4] d4 [d4,e4]!2 d4 [d4,e4] c#4@2", O: "d4 c#4 d4 d3 c#3 a3 e3 f#3",
  P: "d3 d4 c#4 b3 c#4 f#4 a4 b4", Q: "g4 f#4 e4 g4 f#4 e4 d4 c#4", R: "b3 a3 g3 f#3 e3 g3 f#3 e3",
  S: "d3 e3 f#3 g3 a3 e3 a3 g3", T: "f#3 b3 a3 g3 a3 g3 f#3 e3", U: "d3 b2 b3 c#4 d4 c#4 b3 a3",
  V: "g3 f#3 e3 b3 a3 b3 a3 g3", W: "f#3 f#4 e4@2", X: "~ d4 f#4@2", Y: "b4 a4", Z: "b4 c#5", AA: "d5 d4 c#4@2",
  AB: "~ b3 d4@2", AC: "d4@3 d4", AD: "d4 g4 e4 a4", AE: "a4@2 f#4 g4 a4@2 f#4 g4 a4 a3 b3 c#4 d4 e4 f#4 g4",
  AF: "f#4@2 d4 e4 f#4@2 f#3 g3 a3 b3 a3 g3 a3 f#3 g3 a3", AG: "g3@2 b3 a3 g3@2 f#3 e3 f#3 e3 d3 e3 f#3 g3 a3 b3",
  AH: "g3@2 b3 a3 b3@2 c#4 d4 a3 b3 c#4 d4 e4 f#4 g4 a4", AI: "f#4@2 d4 e4 f#4@2 e4 d4 e4 c#4 d4 e4 f#4 e4 d4 c#4",
  AJ: "d4@2 b3 c#4 d4@2 d3 e3 f#3 g3 f#3 e3 f#3 d4 c#4 d4", AK: "b3@2 d4 c#4 b3@2 a3 g3 a3 g3 f#3 g3 a3 b3 c#4 d4",
  AL: "b3@2 d4 c#4 d4@2 c#4 b3 c#4 d4 e4 d4 c#4 d4 b3 c#4", AM: "d4 ~ c#4 ~", AN: "b3 ~ d4 ~", AO: "d3 ~ d3 ~",
  AP: "d3 ~ e3 ~", AQ: "~ a3 ~ a3", AR: "~ f#3 ~ a3", AS: "~ g3 ~ f#3", AT: "~ g3 ~ e4",
  AU: "f#4 f#3 g3 f#3 e3 e4 f#4 e4", AV: "d4 f#3 d3 b3 a3 a2 g2 a2", AW: "b2 b3 c#4 b3 a3 a2 g2 a2",
  AX: "b2 b3 a3 b3 c#4 c#3 b2 c#3", AY: "d3 d4 e4 d4 c#4 c#3 d3 c#3", AZ: "b2 b3 a3 b3 c#4 c#3 f#3 e3",
  BA: "d3 d4 e4 g4 f#4 f#3 a3 f#4", BB: "d4 g4 f#4 g4 e4 a3 g3 a3", BC: "f#3 a3!7", BD: "f#3!6 a3!2", BE: "g3!3 d4!5",
  BF: "d4!2 b3!2 a3!2 e4 c#4", BG: "a3 f#4!3 e4!4", BH: "d4!4 a4!4", BI: "b4!4 a4!4", BJ: "b4!4 c#5 c#4!3",
  BK: "d4@2 d3 e3 f#3@2 d3@2 c#3@2 c#4 d4 e4@2 c#4@2", BL: "b3@2 b2 c#3 d3@2 b2@2 c#3@2 a3 g3 f#3@2 e3@2",
  BM: "d3@2 g3 f#3 e3@2 g3@2 f#3@2 d3 e3 f#3@2 a3@2", BN: "g3@2 b3 a3 g3@2 f#3@2 e3@2 a3 g3 f#3@2 e3@2",
  BO: "f#3@2 d4 c#4 d4@2 f#3@2 a3@2 a3 b3 c#4@2 a3@2", BP: "f#3@2 d4 e4 f#4@2 d4@2 f#4@2 f#4 e4 d4@2 c#4@2",
  BQ: "b3@2 b3 a3 b3@2 c#4@2 d4@2 f#4 e4 d4@2 f#4@2", BR: "g4@2 d4 c#4 b3@2 b3@2 a3@2 e3@2 a3@2 a3@2", BS: "a3@3 a3",
  BT: "d3@3 a3", BU: "g3 a3", BV: "g3@2 d3@2 d3@3 c#3", BW: "d3 d4 c#4@2", BX: "d3@3 e3 f#3@4", BY: "b3@4 e3@3 e3",
  BZ: "f#3@3 f#4!2 g4 f#4 e4", CA: "d4@3 d4!2 e4 d4 c#4", CB: "b3 d4", CC: "d4 c4 b3 c4 a3@3 a3",
  CD: "a3@3 a4!2 b4 a4 g4", CE: "f#4@3 f#4!2 g4 f#4 e4", CF: "g3@2 d4@2 c#4@3 c#4",
  CG: "[d4@2 d4@4 c#4@4 b3@4 a3@4 g3@4 f#3@3 f#3@2 f#3 e3@2 f#3@2]/4", CH: "f#4@2 e4 d4",
  CI: "[d5@4 c5@2 b4@4 d5@2 a4@2 b4@4 a4@4 a4@4 a3@3 g3 f#3@4 f#4@3 e4 d4@4 d4@2 d4@4]/6", CJ: "[c#4 d4@2 ~]/2",
})).s("gm_clarinet").gain(0.3)

// other · trombone
const trombone = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C
  D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D E@8 F@5
>`.pickRestart({
  A: "d3 a2", B: "b2 f#2", C: "g2 d2", D: "g2 a2",
  E: "[d3 a2@2 b2@2 f#2@2 g2@2 d2@2 g2@2 a2@2 d3@2 a2@2 b2@2 f#2@2 g2@2 d2@2 g2@2 a2@2 d3]/8",
  F: "[~ a2@2 b2@2 f#2@2 g2@2 d2@2 g2@2 a2@2 d3@2 d3 ~@2]/5",
})).s("gm_trombone").gain(0.3)

stack(bassoon, clarinet, trombone)

More by Johann Pachelbel