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.
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: 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 T U V W X Y Z AA ~ AB AC AD ~ AE AF@5 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: "~@2 d4@2 ~@2 f#3@2 g3@3 ~@5", U: "~@8 a#3@2 a3 ~@3 g#3@2",
  V: "a3 ~@3 a#3@4 a3@2 g3 ~@3 f#3@2", W: "g3 ~@3 a3@4 g3@2 f#3 ~@3 f3@2", X: "f#3 ~@3 g3@4 g3@2 ~@6", Y: "~ b3",
  Z: "c4 d4", AA: "f4@4 d#4 ~@3", AB: "~ a3", AC: "a#3 c4", AD: "d#4@4 d4 ~@3", AE: "~ f#3",
  AF: "[g3@9 a3@9 c4@9 ~ a#3@9 a3@9 g3@9 f3@8 d#3@8 ~ f3@4 d#3@4]/5", 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@5 AD ~@2 AE AF AG AH AI
  ~ AJ AK ~@3 AL AM@2 AJ AK AN@2 AO@2 AP@2 AJ AK ~@4 AQ@2 AR ~ AS AT AU AV AE AF AG AH AI ~@2 AW AX AY@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@9 f#3@9 a3@9 ~ g3@9 f3@9 d#3@9 d3@8 c3@8 ~ d3@4 c3@4]/5", AD: "b2 ~@7", AE: "f#3 a3 c3 d#3 ~ d3 ~ f#3",
  AF: "~ a3 ~ c3 d#3@2 d3@2", AG: "g3 a#3 d3 d#3 ~ d3 ~ g3", AH: "~ a#3 ~ d3 d#3@2 d3@2", AI: "~ a3!2 ~ g3!2 f#3 ~",
  AJ: "g3 a#3 d3 d#3 ~ d3 ~ f#3", AK: "g3 ~@7", AL: "~ a#3 a3 g3", AM: "[f#3@3 g3@3 f#3@4 ~@6]/2",
  AN: "~ c3 ~ c3 d3@2 c3@2", AO: "~ d3 ~ d3 d#3@2 d3@2", AP: "[a3@3 a#3@3 a3@4 ~@6]/2", AQ: "c3", AR: "d3",
  AS: "f#3@2 f#3 ~@3 f#3@2 f#3 ~@3 f#3@4", AT: "d3@2 d3 ~@3 d3@2 d3 ~@3 d#3@4", AU: "d#3@2 d#3 ~@3 d#3@2 d#3 ~@3 d#3@4",
  AV: "d3 ~@7", AW: "~ a#2 c3 d3 c3@2 a#2 g2", AX: "d3@3 ~@5 f#3@3 ~@5", AY: "[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@5 AD AE AF AG AH AI AJ AK ~
  AL AM ~@3 AN AO@2 AL AM AP AQ AR AN AS@2 AL AM AT AU AV ~ AW AX AY ~ AZ BA BB AM AG AH AI AJ AK ~ BC BD BE BF@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@9 a2@9 c3@9 ~ a#2@9 a2@9 a#2@9 a2@8 g2@8 ~ a2@4 g2@4]/5", AD: "f#2 ~@7", AE: "~@3 d2 g2 ~ d2 ~",
  AF: "g1 ~@7", AG: "f#2 a2 c2 d#2 ~ d2 ~ f#2", AH: "~ a2 ~ c2 d#2@2 d2@2", AI: "g2 a#2 d2 d#2 ~ d2 ~ g2",
  AJ: "~ a#2 ~ d2 d#2@2 d2@2", AK: "f#2 ~@2 g2 ~@2 f#2 ~", AL: "g2 a#2 d2 d#2 ~ d2 ~ f#2", AM: "g2 ~@7",
  AN: "~ a#2 a2 g2", AO: "[f#2@3 e2@3 d2@4 ~@6]/2", AP: "~ a2 ~ a2 a#2@2 a2@2", AQ: "~ d2 a#2 a2", AR: "g2@3 ~",
  AS: "[f#2@3 g2@3 f#2@4 ~@6]/2", AT: "g#2@3 c3@3 d#3@2", AU: "g2@3 b2@3 d3@2", AV: "c3 ~", AW: "f2@3 a2@3 c3@2",
  AX: "f#2@3 a2@3 c3@2", AY: "a#2", AZ: "a2@2 a2 ~@3 a2@2 a2 ~@3 a2@4", BA: "g2@2 g2 ~@3 g2@2 g2 ~@3 g2@4",
  BB: "f#2@2 f#2 ~@3 f#2@2 f#2 ~@3 f#2@4", BC: "g2!2 ~ c2 d2 ~ g2 ~", BD: "c2!2 ~ d2 d#2 ~ d2 ~",
  BE: "g2@3 ~@5 f#2@3 ~@5", BF: "[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)