Strudelify
KeyG majorTempo130 bpm
0:00/0:00
// Tango For Jam Jam — for Minor Niners by Cameron McMahon
// 130 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/5870610; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 100 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: The whole transcription plays 17 ms ahead of the beat; the grid follows it, so its parts stay together.
setcpm(130/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, A@4 for four bars: edit a riff to change every repeat.

// other · tenor sax
const tenor_sax = note(`<
  A B C D E B C F G H I J K@2 A L G M N@2 O@2 A L P@2 Q@2 R@2 S L T U V W X Y Z ~ AA AB AC ~ AD AE@4 AF AG ~@2 AH AI
  AJ@2 AK ~ AL AM AN AO AP AQ AR@2 AL AS AT@2 AU@2 AV AW AL AX AY AZ BA BB BC BD BE ~ BF BG BH AS AH AI AJ@2 AK ~ BI BJ
  BK BL@2
>`.pickRestart({
  A: "~@4 g3 a#3 d4 d#4", B: "~ d4 ~ f#3 ~ a3 ~ c4", C: "d#4@2 d4@2 f#3 a3 c4 d#4", D: "~ d4 ~ g3 ~ a#3 ~ d4",
  E: "d#4@2 d4@2 g3 a#3 d4 d#4", F: "~ d4 ~ g3 ~@4", G: "~@5 f#3 ~ f#3", H: "g3@2 f#3@2 ~ f#3 ~ f#3",
  I: "g3@2 f#3@2 ~ g3 ~ g3", J: "g3@2 g3@2 ~ g3 ~ g3", K: "[g3@2 g3@2 a3@3 g3@3 f#3@2 ~@4]/2", L: "~ d4 ~ f#3 g3 ~@3",
  M: "g3@2 f#3@2 ~ a#3 a3 a#3", N: "[c4 a#3 a3 g#3 g3@8 ~ g3 ~ g3]/2", O: "[g3@2 g3@2 a4@3 g4@3 f#4@2 ~@4]/2",
  P: "[d4@2 c4@2 g#3@8 ~@2 g#3!2]/2", Q: "[g3 f3 d#3 f3 g3@8 ~@4]/2", R: "[d#4@2 d4@2 c4@8 ~@2 d#3!2]/2",
  S: "d3 c3 a#2 c3 g3 a#3 d4 d#4", T: "~@8 a#3@2 a3 ~@3 g#3@2", U: "a3 ~@3 a#3@4 a3@2 g3 ~@3 f#3@2",
  V: "g3 ~@3 a3@4 g3@2 f#3 ~@3 f3@2", W: "f#3 ~@3 g3@4 g3@2 ~@6", X: "~ b3", Y: "c4 d4", Z: "f4@4 d#4 ~@3", AA: "~ a3",
  AB: "a#3 c4", AC: "d#4@4 d4 ~@3", AD: "~ f#3", AE: "[~ g3@8 a3@9 ~ c4@9 a#3@9 a3@9 g3@9 f3@9]/4", AF: "d#3@2 f3 d#3",
  AG: "d3 ~@7", AH: "f#3 a3 c4 d#4 ~ d4 ~ f#3", AI: "~@2 a#3@2 a3 ~ a#3 ~ c4@2 a#3 ~ a3@2 g#3 ~",
  AJ: "[g3@18 g3@2 f#3 ~ g3 ~ a3@4 g3@4]/2", AK: "a3@3 g3@3 f#3@2", AL: "g3 a#3 d4 d#4 ~ d4 ~ f#3",
  AM: "g3 ~ g3@2 f3@2 d#3@2", AN: "d3@3 ~", AO: "~ d3 a#3 a3", AP: "g3@3 ~", AQ: "~ a#3 a3 g3",
  AR: "[f#3@3 g3@3 f#3@4 ~@6]/2", AS: "g3 ~@7", AT: "~ f#3 ~ f#3 g3@2 f#3@2", AU: "~ g3 ~ g3 a3@2 g3@2",
  AV: "~ d3@2 f#3 g3 a3 g3 f#3", AW: "d3 ~@3", AX: "g3 ~ g3@2 g#3@2 a#3@2", AY: "c4@2 g#3 c4", AZ: "b3@2 ~ d4",
  BA: "d4@2 c4 c4@5", BB: "~@2 f3 g3", BC: "a3", BD: "a3@3 a#3", BE: "a3@2 g3 a#3@5",
  BF: "a#3@2 a3 ~@3 g#3@2 a3 ~@3 a#3@4", BG: "a3@2 g3 ~@3 f#3@2 g3 ~@3 a3@4", BH: "g3@2 f#3 ~@3 f3@2 f#3 ~@3 g3@4",
  BI: "~ f#3 g3 a3 a#3 a3 g3 d3", BJ: "d#3", BK: "a#3@3 ~@5 a3@3 ~@5", BL: "[g3@3 ~ d3@28]/2",
})).s("gm_tenor_sax").gain(0.3)

// bass · tuba · "Euphonium"
const bass = note(`<
  A B C D E B C F G H I J K L A M G H I J K L A M ~ N O@2 P@2 Q@2 R S T U V W X ~ Y Z AA ~ AB AC@4 AD AE ~@2 AF AG AH AI
  AJ ~ AK AL ~@3 AM AN@2 AK AL AO@2 AP@2 AQ@2 AK AL ~@4 AR@2 AS ~ AT AU AV AW AF AG AH AI AJ ~@2 AX AY AZ@2
>`.pickRestart({
  A: "~@4 g3 a#3 d3 d#3", B: "~ d3 ~ f#3 ~ a3 ~ c3", C: "d#3@2 d3@2 f#3 a3 c3 d#3", D: "~ d3 ~ g3 ~ a#3 ~ d3",
  E: "d#3@2 d3@2 g3 a#3 d3 d#3", F: "~ d3 ~ g3 ~@4", G: "~@5 c3 ~ c3", H: "d3@2 c3@2 ~ c3 ~ c3",
  I: "d3@2 c3@2 ~ d3 ~ d3", J: "d#3@2 d3@2 ~ d3 ~ d3", K: "d#3@2 d3@2 ~ a3!2 ~", L: "g3!2 f#3 ~@5",
  M: "~ d3 ~ f#3 g3 ~@3", N: "g#3@2 g3 f3@3 f3!2", O: "[d#3 d3 c3 d3 d#3@8 ~@4]/2", P: "[a3@2 g3@2 f3@8 ~@2 d#3!2]/2",
  Q: "[d3 c3 a#2 c3 g2@8 ~@4]/2", R: "~@8 f#3@2 f#3 ~@3 f#3@2", S: "f#3 ~@3 f#3@4 d3@2 d3 ~@3 d3@2",
  T: "d3 ~@3 d#3@4 d#3@2 d#3 ~@3 d#3@2", U: "d#3 ~@3 d#3@4 d3@2 ~@6", V: "~ g2", W: "a2 b2", X: "d3@4 c3 ~@3",
  Y: "~ f#2", Z: "g2 a2", AA: "c3@4 a#2 ~@3", AB: "~ d3", AC: "[~ d#3@8 f#3@9 ~ a3@9 g3@9 f3@9 d#3@9 d3@9]/4",
  AD: "c3@2 d3 c3", AE: "b2 ~@7", AF: "f#3 a3 c3 d#3 ~ d3 ~ f#3", AG: "~ a3 ~ c3 d#3@2 d3@2",
  AH: "g3 a#3 d3 d#3 ~ d3 ~ g3", AI: "~ a#3 ~ d3 d#3@2 d3@2", AJ: "~ a3!2 ~ g3!2 f#3 ~", AK: "g3 a#3 d3 d#3 ~ d3 ~ f#3",
  AL: "g3 ~@7", AM: "~ a#3 a3 g3", AN: "[f#3@3 g3@3 f#3@4 ~@6]/2", AO: "~ c3 ~ c3 d3@2 c3@2",
  AP: "~ d3 ~ d3 d#3@2 d3@2", AQ: "[a3@3 a#3@3 a3@4 ~@6]/2", AR: "c3", AS: "d3",
  AT: "f#3@2 f#3 ~@3 f#3@2 f#3 ~@3 f#3@4", AU: "d3@2 d3 ~@3 d3@2 d3 ~@3 d#3@4", AV: "d#3@2 d#3 ~@3 d#3@2 d#3 ~@3 d#3@4",
  AW: "d3 ~@7", AX: "~ a#2 c3 d3 c3@2 a#2 g2", AY: "d3@3 ~@5 f#3@3 ~@5", AZ: "[g3@3 ~ d3@28]/2",
})).s("gm_tuba").gain(0.4)

// bass · tuba
const bass_2 = note(`<
  A B C D E B C F G H I J K L A M G H I N K L A M O@4 P Q@2 R S T U V ~@2 W X Y ~ Z AA AB AC@4 AD AE AF AG AH AI AJ AK
  AL ~ AM AN ~@3 AO AP@2 AM AN AQ AR AS AO AT@2 AM AN AU AV AW ~ AX AY AZ ~ BA BB BC AN AH AI AJ AK AL ~ BD BE BF BG@2
>`.pickRestart({
  A: "~@4 g2 a#2 d2 d#2", B: "~ d2 ~ f#2 ~ a2 ~ c2", C: "d#2@2 d2@2 f#2 a2 c2 d#2", D: "~ d2 ~ g2 ~ a#2 ~ d2",
  E: "d#2@2 d2@2 g2 a#2 d2 d#2", F: "~ d2 ~ g2 ~@4", G: "~@5 a2 ~ a2", H: "a#2@2 a2@2 ~ a2 ~ a2",
  I: "a#2@2 a2@2 ~ a#2 ~ a#2", J: "c3@2 a#2@2 ~ a#2 ~ a#2", K: "c3@2 a#2@2 f#2 ~@2 g2", L: "~@2 f#2 ~@5",
  M: "~ d2 ~ f#2 g2 ~@3", N: "c3@2 a#2@2 g2 a#2 ~ a#2", O: "[~@4 g#2@3 c3@3 d#3@2 f2@3 b2@3 d3@2 c3@8 c3@4]/4",
  P: "c3 a#2 a2@2", Q: "[a2@2 g2@2 f#2@6 ~@2 g2 a#2 [d2,d3] [d#2,d#3]]/2", R: "~@2 [d2,d3]@2 ~@2 f#2@2 g2@3 ~@5",
  S: "~@8 a2@2 a2 ~@3 a2@2", T: "a2 ~@3 a2@4 g2@2 g2 ~@3 g2@2", U: "g2 ~@3 g2@4 f#2@2 f#2 ~@3 f#2@2",
  V: "f#2 ~@3 f#2@4 g2@2 ~@6", W: "~@7 c2", X: "d#2 ~ g2 ~ a2 ~ b2 ~ c3@4 c3 ~ a#2 ~", Y: "a2 g2 ~@2", Z: "~@7 a#1",
  AA: "d2 ~ f2 ~ g2 ~ a2 ~ a#2@4 a#2 ~ a#2 ~", AB: "c3 ~ c3 ~ a#2 ~ a#2 ~ a2@8",
  AC: "[~ g2@8 a2@9 ~ c3@9 a#2@9 a2@9 a#2@9 a2@9]/4", AD: "g2@2 a2 g2", AE: "f#2 ~@7", AF: "~@3 d2 g2 ~ d2 ~",
  AG: "g1 ~@7", AH: "f#2 a2 c2 d#2 ~ d2 ~ f#2", AI: "~ a2 ~ c2 d#2@2 d2@2", AJ: "g2 a#2 d2 d#2 ~ d2 ~ g2",
  AK: "~ a#2 ~ d2 d#2@2 d2@2", AL: "f#2 ~@2 g2 ~@2 f#2 ~", AM: "g2 a#2 d2 d#2 ~ d2 ~ f#2", AN: "g2 ~@7",
  AO: "~ a#2 a2 g2", AP: "[f#2@3 e2@3 d2@4 ~@6]/2", AQ: "~ a2 ~ a2 a#2@2 a2@2", AR: "~ d2 a#2 a2", AS: "g2@3 ~",
  AT: "[f#2@3 g2@3 f#2@4 ~@6]/2", AU: "g#2@3 c3@3 d#3@2", AV: "g2@3 b2@3 d3@2", AW: "c3 ~", AX: "f2@3 a2@3 c3@2",
  AY: "f#2@3 a2@3 c3@2", AZ: "a#2", BA: "a2@2 a2 ~@3 a2@2 a2 ~@3 a2@4", BB: "g2@2 g2 ~@3 g2@2 g2 ~@3 g2@4",
  BC: "f#2@2 f#2 ~@3 f#2@2 f#2 ~@3 f#2@4", BD: "g2!2 ~ c2 d2 ~ g2 ~", BE: "c2!2 ~ d2 d#2 ~ d2 ~",
  BF: "g2@3 ~@5 f#2@3 ~@5", BG: "[g2@3 ~ d2@28]/2",
})).s("gm_tuba").gain(0.4)

// other · piano · D C# D D# E F F# G
const piano = note(`<
  ~@50
  [~@2 [d4,d5]@2 [c#4,c#5] ~ [d4,d5] ~ [d#4,d#5] ~ [e4,e5] ~ [f4,f5] ~ [f#4,f#5] ~]
  [[g4,g5] ~@15]
  ~@48
>`).s("gm_piano").gain(0.4)

stack(tenor_sax, bass, bass_2, piano)