Strudelify

Festive Minor

Gerry Mulligan

KeyG majorTempo120 bpm
0:00/0:00
// Festive Minor — Gerry Mulligan
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5963270; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 90 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · trombone · "Trombone 2"
const trombone = note(`<
  ~@4 A B C D E F@2 G H@2 I J K L M N A O C P E Q@2 ~@27 R S T@3 U@3 V W X@3 Y ~ Z AA AB AA AB AA AC@2 ~@13
>`.pickRestart({
  A: "~@2 b3@3 g3 e3@6", B: "~ e4 c4 a3@3", C: "~@2 b3@3 g3 e3@2 e3@4", D: "~ e4 c4 a3 a3@2",
  E: "~ a#3 b3 c4 b3 g3 e3@2 e3@4", F: "[~@2 e4@3 b3 d4@2 b3 g3@2 f#3@12 a3]/2", G: "a3@2 g3 ~@5 e4!2 f#4 g4",
  H: "[a4@5 f#4@3 e4 d#4@5 c4 b3@2 d#4 f#4@2 g4 g4@2 f#4]/2", I: "g4@2 e4 f#4@2 g4 ~@2 e4 f#4 g4 c#4", J: "c4 ~",
  K: "~@6 e4@5 d#4", L: "a#3@2 c#4 ~@9", M: "~@8 a4 f#4 e4 c4", N: "d#4 ~@3", O: "~@2 e4@3 c4 a3@6",
  P: "~@2 e4@3 c4 a3@2 a3@4", Q: "[~@2 e4@3 b3 d4@2 b3 g3@2 f#3@9 ~@4]/2", R: "~@2 e4 ~", S: "e4@3 ~@2 c4 ~@3 e4@3",
  T: "[e4@3 ~@3 e4@9 ~@3 g3@2 a3 ~@2 g3@7 b3@6]/3", U: "[e3@3 ~@2 c4 ~@2 c4 ~@2 a3@7 f#3@5 d4@4 ~@2 b3@7]/3", V: "a3",
  W: "d#4", X: "[b3@9 e4@6 ~@8 c#4@6 c#3@6 ~]/3", Y: "~@6 f3@2 b3@3 b3", Z: "f#3@2 ~@3 f#3 ~@6",
  AA: "~@2 b3@3 ~ b3@5 b3", AB: "c4@2 c4@3 ~@7", AC: "[c4@2 c4@3 e4@3 ~@3 a3@12 ~]/2",
})).s("gm_trombone").gain(0.3)

// other · trombone · "Trombone 2" · soft notes
const trombone_soft = note(`<
  ~@26 A B C D E ~ F G@2 H ~ I J K L M N K O P@2 Q R K S@2 T U ~@22 V W X@2 Y Z F AA@2 AB@2 AC AD@2
>`.pickRestart({
  A: "~@16 f#3@2 ~@3 a3 ~ b3", B: "a3@2 g3 ~@5 e4!2 f#4 g4", C: "a4@16 f#4@3 ~@3 e4@2",
  D: "d#4@6 ~@3 d#4 ~ c4 b3@4 d#4@2 f#4@4 a4@2", E: "g4@2 e4 f#4@2 g4@4 ~@3", F: "c#4@8 g4 e4@2 g4",
  G: "[f#4@2 e4 d4@2 c4 b3@2 a3 f4@2 e4@7 d#4@6]/2", H: "d4@6 c#4@3 b3@2 e4", I: "~@11 b3", J: "b3", K: "c4",
  L: "b3 e4@5", M: "e4@9 ~@2 e4", N: "~ e4@5", O: "~ a3@5", P: "[d4@6 b3@3 b3@2 a3@7 ~@6]/2", Q: "d#4 f#4", R: "e4 d4",
  S: "a#3", T: "f#3", U: "~@6 e4@5 d#4", V: "~@11 g3", W: "g3@2 d4 ~@5 e4!2 f#4 g4",
  X: "[a4@5 f#4@3 e4 d#4@5 c4 b3@2 d#4 f#4@2 g4 g4@2 f#4]/2", Y: "g4@2 e4 f#4@2 g4 ~@2 e4 f#4 g4 c#4", Z: "c4 ~",
  AA: "[f#4@2 e4 d4@2 c4 b3@2 a3 d#4@2 e4@7 d#4@6]/2", AB: "[d4@6 c#4@3 b3@2 e4@7 d#4@6]/2", AC: "d4@2 c#4 b3",
  AD: "[c4@6 b3@5 d4@13]/2",
})).s("gm_trombone").gain(0.2)

// other · trombone · "Trombone 3"
const trombone_2 = note(`<
  A B A B A B A B A C@2 ~@5 D E F G A B A B A H@2 ~@3 I J K L@2 M ~@18 N O P Q@2 R@3 S T U@3 V ~ W X Y X Z X AA@2 ~@5 AB
  AC@2 AD@2 AE AF@2
>`.pickRestart({
  A: "~@2 b2@3 ~ b2@6", B: "~@2 c3@3 ~ c3@6", C: "[~@2 c3@3 ~ c3@5 a3@12 ~]/2", D: "~@6 c#4@5 b3", E: "f#3@2 a#3 ~@9",
  F: "~@8 a3 f#3 e3 a3", G: "b3@3 ~@2 b2 ~@6", H: "[~@2 c3@3 ~ c3@5 a3@9 ~@4]/2", I: "~@21 e3 ~ d3", J: "c#3 c#3@2 ~@3",
  K: "a#3 c#4", L: "[c4@6 d#4@5 e3@7 d#3@6]/2", M: "d3@6 c#3@3 e3@2 g3", N: "~@2 b3 ~", O: "c4@3 ~@2 a3 ~@3 b3@3",
  P: "c4 ~ g3@2", Q: "[a3@3 ~@3 e3@2 e3 ~@2 e3@7 g3@6]/2", R: "[c3@3 ~@2 a3 ~@2 a3 ~@2 f#3@7 d3@5 g3@4 ~@2 g3@7]/3",
  S: "f#3", T: "b3", U: "[g3@9 c4@6 ~@8 f#3@6 a#2@6 ~]/3", V: "~@6 d#3@2 a3@3 g3", W: "d#3@2 ~@3 d#3 ~@6",
  X: "~@2 g3@3 ~ g3@5 g3", Y: "e3@2 e3@3 ~@7", Z: "a3@2 a3@3 ~@7", AA: "[e3@2 e3@3 a3@3 ~@3 f#3@12 ~]/2",
  AB: "a#3@8 e4 c#4@2 e4", AC: "[c4@2 c4 a3@2 a3 f#3@2 f#3 d#3@2 e3@7 d#3@6]/2", AD: "[d3@6 c#3@3 b2@2 e3@7 d#3@6]/2",
  AE: "d3@2 c#3 f3", AF: "[g3@6 f3@5 b3@13]/2",
})).s("gm_trombone").gain(0.3)

// other · trombone · "Trombone 3" · soft notes
const trombone_soft_2 = note(`<
  ~@10 A B C D E@2 ~@10 F B G D H ~@6 I J K L M N K O P@2 D Q K R@2 S T ~@22 U V G D W@2 ~@8
>`.pickRestart({
  A: "~@11 f#3", B: "f#3@2 g3 ~@9", C: "a3 c4", D: "b3 d#4", E: "[e4@6 ~@5 a3@7 ~@6]/2", F: "~@16 a3@2 ~@3 f#3 ~ g3",
  G: "f#3 c4", H: "e4@3 ~", I: "~@11 g3", J: "g3", K: "a3", L: "g3 b3@5", M: "c4@9 ~@2 b3", N: "~ b3@5", O: "~ f#3@5",
  P: "[b3@6 g3@3 g3@2 f#3@7 ~@6]/2", Q: "b3!2", R: "f#3", S: "d#3", T: "~@6 a3@5 f#3", U: "~@11 e3", V: "e3@2 g3 ~@9",
  W: "[e4@9 ~@2 a3@7 ~@6]/2",
})).s("gm_trombone").gain(0.2)

// bass · trombone · "Trombone 4 (bass)"
const bass = note(`<
  A@5 B A B A B C D E F G H I J K L A B A B A B C M N O P Q R S T U ~@2 V W V W V W X Y Z AA AB AC AD J AE F V W V W V
  AF@2 AG AH AI T AJ@2 AK@2 AL A B A B A AM@2 AN AO AP AQ@2 AR AS T AT T AU AV@2
>`.pickRestart({
  A: "~@2 e2@3 ~ e2@6", B: "~@2 a2@3 ~ a2@6", C: "~@2 d2@3 ~ d2@6", D: "g2 a2 b2 d3", E: "f#2 e2 f#2 a2",
  F: "b2 a2 f#2 d#2", G: "e2@3 f#2@3 g2@5 a2", H: "a2 e3 c#3 b2", I: "a#2 f#2 a#2 b2", J: "c#3 b2 a#2 f#2",
  K: "a2 c3 f#3 ~", L: "~@2 c#3 d#3@2 b2 ~@6", M: "g2 d3 b2 g2", N: "f#2 a2 c3!2", O: "b2 d#3 f#2 a2",
  P: "g2@6 e2@6 g2@6 ~@3 e2 ~ d2", Q: "c#2 c#2@2 ~@3", R: "f#2 a#2 c#3 b2", S: "a2 c3 d#3 b2", T: "e2 g2 b2 a2",
  U: "f#2@3 a2@3 d#3@3 b2@2 e3", V: "e2@5 g2@4 b2@3", W: "a2@3 ~@2 c3@4 ~@3", X: "d2 a2 f#2 e2", Y: "d3 c3 b2 g2",
  Z: "f#2 c3 a2 e3", AA: "b2 f#2 a2 d#3", AB: "d3 b2 g2 e2", AC: "a2 b2 c#3 g2", AD: "f#2 e2 f#2 a#2",
  AE: "a2 c3 d#3 a2", AF: "[a2@3 ~@2 c3@4 ~@2 d2@4 e2@3 f#2@3 a2@3]/2", AG: "g2@3 ~@2 b2@4 ~@3", AH: "f#3 e3 c3 f#2",
  AI: "b2@5 a2 a2@3 f#2@3", AJ: "[a2@3 g2@2 g2 a2@2 e2 ~@2 f#2@6 f#2@6 ~]/2", AK: "[~@6 b2@2 f2@3 e2@6 g2@4 d3@3]/2",
  AL: "b2@2 ~@3 d#2 ~@6", AM: "[~@2 a2@3 ~ a2@5 d2@12 g3]/2", AN: "g3@2 g2 ~@9", AO: "f#2 a2 c3 e3",
  AP: "d#3 b2 a2 f#2", AQ: "[e2@3 g2@3 b2@5 a2@4 e3@3 c#3@3 b2@3]/2", AR: "f#3@8 c#4 a#3@2 c#4",
  AS: "a3@2 a3 f#3@2 f#3 d#3@2 b2 f#2@2 e2", AT: "f#2@3 a2@3 d#3@3 b2@2 e2", AU: "f#2 a2 d#3 b2",
  AV: "[c3@6 b2@5 g3@13]/2",
})).s("gm_trombone").gain(0.3)

stack(trombone, trombone_soft, trombone_2, trombone_soft_2, bass)