Strudelify

the star-spangled banner

James McKelveyband

KeyB♭ majorTempo120 bpm
0:00/0:00
// the star-spangled banner — James McKelveyband
// 120 bpm, 3/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 3/4 at bar 2) are rendered on a constant 3/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 16 "Xylophone" xylophone (copy of ch 1 "Flute" flute); ch 7 "Baritone Saxophone" baritone sax (copy of ch 6 "Tenor Saxophone" tenor sax); ch 14 "Trombone" trombone (copy of ch 6 "Tenor Saxophone" tenor sax)
// note: Transcription provider: pdmx. https://musescore.com/score/669; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 37 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/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 · clarinet · "Bb Clarinet"
const clarinet = note("<A B C D E F G H I B C D E F G H J K L M N O P Q R K S T U V W ~ X Y Z AA@2>".pickRestart({
  A: "~@11 f5@4 d5", B: "bb4@5 d5@5 ~ f5@5", C: "g5@11 f5@4 f5", D: "f5@5 d5@5 ~ c5@5", E: "c5@11 f5@4 f5",
  F: "f5@8 f5@3 f5@5", G: "g5@5 f5@5 ~ f5@2 f5@3", H: "f5@5 eb5@3 d5@3 c5@5", I: "a4@5 bb4@5 ~ f5@4 d5",
  J: "a4@5 bb4@5 ~ d5@4 d5", K: "d5@5 eb5@5 ~ f5@5", L: "f5@11 eb5@4 d5", M: "c5@5 d5@5 ~ eb5@5", N: "eb5@11 eb5@5",
  O: "d5@8 c5@3 bb4@5", P: "a4@11 g4@2 a4@3", Q: "bb4@5 d5@5 ~ e5@5", R: "f5@11 f5@2 d5@3", S: "f5@5 eb5@5 ~ f5@5",
  T: "g5@5 eb5@3 d5@3 c5@2 bb4@3", U: "eb5@2 f5@2 ~ f5@5 ~@3 d5@3, ~@2 g5 ~@5", V: "bb4@3 c5@2 d5@3 eb5@3 f5@2 g5@3",
  W: "a5@5 ab5@5 ~@6", X: "~@11 bb4@5", Y: "bb4!2 ~ bb4@8 bb4@5", Z: "g4!2 ~ g4@8 bb4@5", AA: "d5/2",
})).s("gm_clarinet").gain(0.3)

// other · clarinet · "Bb Clarinet"
const clarinet_2 = note("<A B C D E F G H I B C D E F G H J K L M N O P Q R K S T U V W ~ X Y Z AA AB>".pickRestart({
  A: "~@11 f4@4 d4", B: "bb3@5 d4@5 ~ f4@5", C: "g4@11 a4@4 a4", D: "f4@5 d4@5 ~ c4@5", E: "c4@11 f4@4 f4",
  F: "f4@8 f4@3 f4@5", G: "g4@5 f4@5 ~ f4@2 f4@3", H: "f4@5 eb4@3 d4@3 c4@5", I: "a3@5 bb3@5 ~ f4@4 d4",
  J: "a3@5 bb3@5 ~ d4@4 d4", K: "d4@5 eb4@5 ~ f4@5", L: "f4@11 eb4@4 d4", M: "c4@5 d4@5 ~ eb4@5", N: "eb4@11 eb4@5",
  O: "d4@8 c4@3 bb3@5", P: "a3@11 g3@2 a3@3", Q: "bb3@5 d4@5 ~ e4@5", R: "f4@11 f4@2 d4@3", S: "f4@5 eb4@5 ~ f4@5",
  T: "g4@5 bb4@3 a4@3 g4@2 f4@3", U: "eb4@2 f4@2 ~ f4@5 ~@3 d4@3, ~@2 g4 ~@5", V: "d4@3 eb4@2 f4@3 g4@3 a4@2 bb4@3",
  W: "c5@5 bb4@5 ~@6", X: "~@11 bb3@5", Y: "g4!2 ~ g4@8 g4@5", Z: "eb4!2 ~ eb4@8 g4@5", AA: "f4", AB: "g4",
})).s("gm_clarinet").gain(0.3)

// bass · clarinet · "Bass Clarinet"
const bass = note("<A B C D E F G H I B C D E F G H J K L K M N O D P Q R S T U V ~@2 W X ~ Y>".pickRestart({
  A: "~@11 f3@4 d3", B: "bb2@5 bb2@5 ~ a2@5", C: "g2@11 f2@4 f2", D: "g2@5 a2@5 ~ g2@5", E: "f2@11 eb3@4 eb3",
  F: "d3@8 f2@3 g2@5", G: "a2@11 bb2@2 g2@3", H: "g2@5 c3@3 d3@3 eb3@5", I: "f3@5 bb2@5 ~ f3@4 d3",
  J: "f3@5 bb2@5 ~ bb2@4 bb2", K: "bb2@5 bb2@5 ~ bb2@5", L: "bb2@11 bb2@4 bb2", M: "bb2@11 bb2@5", N: "bb2@8 a2@3 g2@5",
  O: "a2@11 bb2@2 a2@3", P: "f3@3 f3!2 f3@3 eb3@3 d3@2 c3@3", Q: "bb2@5 c3@5 ~ d3@5", R: "eb3@5 c3@5 ~ d3@5",
  S: "eb3@5 g3@3 f3@3 eb3@2 d3@3", T: "c3@2 d3@2 ~ f3@5 ~@3 d3@3, ~@2 eb3 ~@5", U: "bb2@3 c3@2 d3@3 eb3@3 f3@2 g3@3",
  V: "a2@5 ab2@5 ~@6", W: "eb3@11 d3@5", X: "c3@11 eb3@5", Y: "bb2",
})).s("gm_electric_bass_finger").gain(0.3)

// other · alto sax · "Alto Saxophone"
const alto_sax = note("<A B C D E F G H I B C D E F G H J K L M N O P Q R S@2 T U V W ~@2 X Y ~ Z>".pickRestart({
  A: "~@11 f4@5", B: "bb3@5 bb3@5 ~ c4@5", C: "d4@11 d4@4 d4", D: "d4@5 bb3@5 ~ bb3@5", E: "a3@11 eb4@4 eb4",
  F: "d4@8 a3@3 bb3@5", G: "c4@11 d4@2 d4@3", H: "d4@5 c4@3 bb3@3 a3@5", I: "a3@5 bb3@5 ~ f4@5",
  J: "a3@5 bb3@5 ~ d4@4 d4", K: "d4@5 eb4@5 ~ f4@5", L: "f4@11 eb4@4 d4", M: "c4@5 d4@5 ~ eb4@5", N: "eb4@11 eb4@5",
  O: "d4@8 c4@3 bb3@5", P: "a3@11 g3@2 a3@3", Q: "bb3@5 d4@5 ~ e4@5", R: "f4@11 f4@5", S: "bb3@5 bb3@5 ~ bb3@5",
  T: "bb3@5 c4@3 bb3@3 a3@2 g3@3", U: "g3@2 bb3@2 ~ c4@5 ~@3 bb3@3, ~@2 d4 ~@5", V: "d4@3 eb4@2 f4@3 g4@3 a4@2 bb4@3",
  W: "c5@5 d5@5 ~@6", X: "bb3@11 bb3@5", Y: "g3@11 g3@5", Z: "d4",
})).s("gm_alto_sax").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note("<A B C D E F G H I B C D E F J H K L M L N O J D P Q R S T U V ~@2 W X ~ Y>".pickRestart({
  A: "~@11 f3@4 d3", B: "bb2@5 bb3@5 ~ a3@5", C: "g3@11 f3@4 f3", D: "g3@5 a3@5 ~ g3@5", E: "f3@11 eb3@4 eb3",
  F: "d3@8 f3@3 g3@5", G: "a3@11 bb3@2 g3@3", H: "g3@5 c3@3 d3@3 eb3@5", I: "f3@5 bb2@5 ~ f3@4 d3",
  J: "a3@11 bb3@2 a3@3", K: "f3@5 bb2@5 ~ bb3@4 bb3", L: "bb3@5 bb3@5 ~ bb3@5", M: "bb3@11 bb3@4 bb3",
  N: "bb3@11 bb3@5", O: "bb3@8 a3@3 g3@5", P: "f3@3 f3!2 f3@3 eb3@3 d3@2 c3@3", Q: "bb2@5 c3@5 ~ d3@5",
  R: "eb3@5 c3@5 ~ d3@5", S: "eb3@5 g3@3 f3@3 eb3@2 d3@3", T: "c3@2 d3@2 ~ f3@5 ~@3 d3@3, ~@2 eb3 ~@5",
  U: "bb2@3 c3@2 d3@3 eb3@3 f3@2 g3@3", V: "a3@5 ab3@5 ~@6", W: "eb3@11 d3@5", X: "c3@11 eb3@5", Y: "bb2",
})).s("gm_tenor_sax").gain(0.3)

// other · trumpet · "Bb Trumpet"
const trumpet = note("<A B C D E F G H I B C D E F G H J K L M N O P Q R S T U V W X Y Z AA AB AC@2>".pickRestart({
  A: "~@11 f4@4 d4", B: "bb3@5 d4@5 ~ f4@5", C: "bb4@11 d5@4 c5", D: "bb4@5 d4@5 ~ e4@5", E: "f4@11 f4@4 f4",
  F: "d5@8 c5@3 bb4@5", G: "a4@11 g4@2 a4@3", H: "bb4@5 bb4@5 ~ f4@5", I: "d4@5 bb3@5 ~ f4@4 d4",
  J: "d4@5 bb3@5 ~ d5@4 d5", K: "d5@5 c5@5 ~ bb4@5", L: "a4@11 g4@4 f4", M: "eb4@5 f4@5 ~ g4@5", N: "a4@11 a4@5",
  O: "f4@8 f4@3 f4@5", P: "g4@5 f4@5 ~ f4@2 f4@3", Q: "f4@5 d4@5 ~ c4@5", R: "c4@11 f4@5",
  S: "bb4@5 bb4@5 ~ bb4@2 a4@3", T: "g4@5 g4@5 ~ g4@5", U: "c5@5 eb5@3 d5@3 c5@2 bb4@3", V: "bb4@5 a4@5 ~ f4@2 f4@3",
  W: "bb4@8 c5@3 d5@2 eb5@3", X: "f5@11 bb4@2 c5@3", Y: "d5@8 eb5@3 [c5,f5]@5", Z: "[bb4,bb5]@11 bb4@5",
  AA: "eb5!2 ~ eb5@8 eb5@5", AB: "c5!2 ~ c5@8 eb5@5", AC: "[d5,bb5]/2",
})).s("gm_trumpet").gain(0.3)

// other · trumpet · "Bb Trumpet"
const trumpet_2 = note("<A B C D E F G H I B C D E F G H J K L M N F G D O P Q R S T U ~ V W X Y Z>".pickRestart({
  A: "~@11 f4@4 d4", B: "bb3@5 d4@5 ~ f4@5", C: "g4@11 a4@4 a4", D: "f4@5 d4@5 ~ c4@5", E: "c4@11 f4@4 f4",
  F: "f4@8 f4@3 f4@5", G: "g4@5 f4@5 ~ f4@2 f4@3", H: "f4@5 eb4@3 d4@3 c4@5", I: "a3@5 bb3@5 ~ f4@4 d4",
  J: "a3@5 bb3@5 ~ d5@4 d5", K: "d5@5 c5@5 ~ bb4@5", L: "a4@11 g4@4 f4", M: "eb4@5 f4@5 ~ g4@5", N: "a4@11 a4@5",
  O: "c4@11 f4@2 d4@3", P: "d4@5 eb4@5 ~ f4@5", Q: "f4@5 eb4@5 ~ f4@5", R: "g4@5 bb4@3 a4@3 g4@2 f4@3",
  S: "eb4@2 f4@2 ~ f4@5 ~@3 d4@3, ~@2 g4 ~@5", T: "d4@3 eb4@2 f4@3 g4@3 a4@2 bb4@3", U: "c5@5 bb4@5 ~@6",
  V: "~@11 bb4@5", W: "g4!2 ~ g4@8 g4@5", X: "eb4!2 ~ eb4@8 eb4@5", Y: "f4", Z: "g4",
})).s("gm_trumpet").gain(0.3)

// other · french horn · "Horn"
const french_horn = note("<A B C D E F G H I B C D E F G H J K L B M N G D O P@2 Q R S T ~@2 U V ~ W>".pickRestart({
  A: "~@11 f4@5", B: "bb3@5 bb3@5 ~ c4@5", C: "d4@11 d4@4 d4", D: "d4@5 bb3@5 ~ bb3@5", E: "a3@11 eb4@4 eb4",
  F: "d4@8 a3@3 bb3@5", G: "c4@11 d4@2 d4@3", H: "d4@5 c4@3 bb3@3 a3@5", I: "a3@5 bb3@5 ~ f4@5",
  J: "a3@5 bb3@5 ~ bb3@4 bb3", K: "bb3@5 c4@5 ~ d4@5", L: "d4@11 bb3@4 bb3", M: "c4@11 c4@5", N: "d4@8 d4@3 d4@5",
  O: "a3@11 f4@5", P: "bb3@5 bb3@5 ~ bb3@5", Q: "bb3@5 c4@3 bb3@3 a3@2 g3@3",
  R: "g3@2 bb3@2 ~ c4@5 ~@3 bb3@3, ~@2 d4 ~@5", S: "d4@3 eb4@2 f4@3 g4@3 a4@2 bb4@3", T: "a4@5 ab4@5 ~@6",
  U: "bb3@11 bb3@5", V: "g3@11 g3@5", W: "d4",
})).s("gm_french_horn").gain(0.3)

// bass · tuba · "Bb Tuba"
const bass_2 = note("<A B C D E F G H I B C D E F J H K L M L N O J D P Q R S T U V ~@2 W X ~ Y>".pickRestart({
  A: "~@11 f2@4 d2", B: "bb1@5 bb2@5 ~ a2@5", C: "g2@11 f2@4 f2", D: "g2@5 a2@5 ~ g2@5", E: "f2@11 eb2@4 eb2",
  F: "d2@8 f2@3 g2@5", G: "a2@11 bb2@2 g2@3", H: "g2@5 c2@3 d2@3 eb2@5", I: "f2@5 bb1@5 ~ f2@4 d2",
  J: "a2@11 bb2@2 a2@3", K: "f2@5 bb1@5 ~ bb2@4 bb2", L: "bb2@5 bb2@5 ~ bb2@5", M: "bb2@11 bb2@4 bb2",
  N: "bb2@11 bb2@5", O: "bb2@8 a2@3 g2@5", P: "f2@3 f2!2 f2@3 eb2@3 d2@2 c2@3", Q: "bb1@5 c2@5 ~ d2@5",
  R: "eb2@5 c2@5 ~ d2@5", S: "eb2@5 g2@3 f2@3 eb2@2 d2@3", T: "c2@2 d2@2 ~ f2@5 ~@3 d2@3, ~@2 eb2 ~@5",
  U: "bb1@3 c2@2 d2@3 eb2@3 f2@2 g2@3", V: "a2@5 ab2@5 ~@6", W: "eb2@11 d2@5", X: "c2@11 eb2@5", Y: "bb1",
})).s("gm_tuba").gain(0.3)

stack(clarinet, clarinet_2, bass, alto_sax, tenor_sax, trumpet, trumpet_2, french_horn, bass_2)