Strudelify

Colonial Song

Grainger

KeyF majorTempo60 bpm
0:00/0:00
// Colonial Song — Grainger
// 60 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 3/4 at bar 6, 2/4 at bar 7, 3/4 at bar 7, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5909631; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/4)

// 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 · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@5 A B C D E@4 F G H@2 I J K L M N O P Q R S T@2 U V W X Y Z AA AB AC AD AE AF@2 AG@2 AH AI AJ AK AL AM AN AO AP AQ
  AR AS AT AU AV AW AX@2
>`.pickRestart({
  A: "~ c4@2 bb3", B: "a3 ~", C: "~@3 d4", D: "db4@2 c4@2 bb3 ab3 g3@2",
  E: "[ab3@3 ~@9 eb4@8 eb4@8 d4@6 c4@2 bb3@8 eb4@8 eb4@8 g4@4]/4", F: "eb4 c4 d4@4 d4@2", G: "db4@3 f4 g4 ab4 c5 bb4",
  H: "[d4 c4 bb3@4 g4@3 c5@2 bb4@2 ab4 f4 eb4]/2", I: "c4@7 d4 bb3@8", J: "g4@2 g4!3 ab4 g4 f4",
  K: "c4 d4 bb3@2 eb4@3 g4", L: "bb4@2 bb4@3 c5 d5 c5", M: "g4 bb4 c5@2 f4@3 g4", N: "f4 eb4 f4 g4 bb4@3 c5",
  O: "bb4 ab4@2 g4 ab4 f4 eb4 f4", P: "g4@2 eb5@2 d5 c5 d5 eb5", Q: "g4@2 bb4 ab4 g4@3 ~",
  R: "~ eb4 d4 db4 c4@2 bb3 ab3", S: "g3 f3 ab3@2 g3@2 bb3 eb4", T: "[d4@8 eb4@10 g4@2 f4@2 eb4@2 d4@2 c4@2 bb3@3 ~]/2",
  U: "ab3 g3 ab3 bb3 db4@2 c4@2", V: "db4 c4 b3 bb3 ab3@2 b3@2", W: "bb3@2 g4@2 f4 eb4 f4 g4",
  X: "f4 eb4 c4 d4 eb4 bb3 eb4 g4", Y: "bb4 b4", Z: "bb4@4 ~ g4 c5 eb5", AA: "g5 d5 bb4@2 d5 ~ ab4@2",
  AB: "g4@2 f4@2 eb4@3 ~ a4@2 g4@2 f4@2 eb4@2, ~@8 bb4 ~@7",
  AC: "d4@3 ~ f4@2 ~@2 bb4@2 ab4@2 ab4@2 f4@2, ~@4 eb4 ~@3 c5 ~@7", AD: "g4@2 gb4 b4 eb5!2 bb4 ~",
  AE: "db5@6 db5@3 b4 bb4 b4 g4@2 ~@2", AF: "[g4@3 d4 ~@2 eb5@5 db5 c5@4]/2",
  AG: "[b4@2 bb4 ~ eb5@6 db5 ~ db5@2 db5!2]/2", AH: "~ b4 bb4 b4 bb4@12", AI: "~ d5 bb4@3 bb4@2 ab4",
  AJ: "g4@2 bb4@2 g4@3 f4", AK: "f4@4 eb4@3 d4 c4@6 d4@2", AL: "bb3 c4", AM: "d4@2 c4 d4 bb3@4", AN: "bb3 a3",
  AO: "d4@2 d4 c4 d4@4", AP: "e4@2 db4@3 db4!2 c4", AQ: "c4!2 bb3 ab3 bb3@4", AR: "e4@4 g4 f4 eb4@2",
  AS: "g4@2 g4@2 e4@2 f4!2", AT: "eb4 ~@3", AU: "g3@2 bb3@2 ~ bb3 c4 d4", AV: "g3@2 eb4 f4", AW: "d4 f4 c4 gb4",
  AX: "[g4@5 ~@3]/2",
})).s("gm_trumpet").gain(0.25)

// other · trumpet · "B♭ Trumpet" · soft notes
const trumpet_soft = note("<~ A B@2 C@2 D@2 ~ E ~@53>".pickRestart({
  A: "~@2 g3@3 g3 ab3@2", B: "[ab3@4 g3@4 g3@3 bb3 bb3@8 g3@8 ab3@4]/2", C: "[bb3@4 eb4@2 g4@2 eb4@3 c4 f4@8 ~@12]/2",
  D: "[~@8 g3@3 bb3 ab3@8 bb3@8 ~@4]/2", E: "~@3 ab3 g3@8 ~@4",
})).s("gm_trumpet").gain(0.15)

// other · french horn · "Horn in F"
const french_horn = note(`<
  ~@4 A B C D E ~@6 F G@2 H I J K L@2 M N O P Q R S T U V W X Y Z AA@2 AB AC@2 AD AE AF AG AH AI ~@10 AJ AK AL@2
>`.pickRestart({
  A: "~@11 eb4 f4@4", B: "g4@2 bb4 ab4 g4 f4!2 eb4", C: "d4 c4 ~@2", D: "~@3 ab4", E: "bb4@2 bb4 ab4 g4 f4!2 ~",
  F: "~@3 eb4", G: "[d4 db4 c4 bb3@5]/2", H: "~ eb4 d4 db4 c4@2 bb3 ab3", I: "g3 f3 ab3@2 g3@2 bb3 eb4", J: "d4 eb4",
  K: "eb4@2 g4@2 f4@2 eb4@2 d4@2 c4@2 bb3@3 ~", L: "[ab3 g3 ab3 bb3 db4@2 c4@3 db4 c4 bb3 ab3@2 b3@2]/2",
  M: "bb3@2 g3@2 g4@2 f4 eb4", N: "f4 eb4 g4 f4 eb4@3 ~", O: "~@2 g3 ~ bb3 ~ eb4 ~@3 ab3 ~@3 ab3 ~",
  P: "~@2 d4 ~@3 bb3 ~ bb3 ~ g3 ~ bb3 ~ eb4 ~", Q: "f4 ~ bb3 ~ d4 ~ g4 ~@3 g3 ~ bb3 ~ c4 ~", R: "~ eb4!2 c4 bb3 ab3@3",
  S: "~@2 g3 ~ bb3 ~ eb4 ~@3 db4@2 c4@4", T: "~@2 f4 ~ f4 ~ e4 ~@3 ab3 ~ bb3 ~ c4 ~", U: "~@2 bb3@3 a3 g3 f3",
  V: "f4 eb4!2 d4 eb4!2 bb3 g3", W: "bb3@2 g3 ~ bb3 ~ eb4 ~@3 f4 ~ eb4 ~ f4 ~", X: "bb3@2 eb4@3 g4@2 a4",
  Y: "bb4@3 ~ g4@2 bb4@2 bb4@2 ~@2 eb4@4, ~@4 d4 ~@11", Z: "d4@2 c4@2 bb3@3 ~ f4@2 eb4@2 d4@2 c4@2, ~@8 g4 ~@7",
  AA: "[bb3@3 ~ d4@2 ~@2 d4@2 c4@2 eb4@8 eb4@2 b3@2 eb4@2 gb4@2 ~@4, ~@4 c4 ~@3 eb4 ~@23]/2",
  AB: "gb4@3 ~ eb4@10 g3 ~, ~@4 f4 ~@11",
  AC: "[bb3 ~ eb4 ~@3 b3@2 c4@2 eb4@2 g4@2 c4@5 [bb3,c4] eb4@10 ~@2, ~@20 bb3 ~@11]/2", // Bbsus2
  AD: "gb4@2 f4@2 eb4@2 bb3 ~ eb4 ~ g4 ~@3 eb3 ~", AE: "ab3 ~ b3 ~ bb3 ~ db4 ~ gb4 ~ bb3 ~ b3 ~ b3 ~",
  AF: "eb4 ~ f4 ~@3 g3 ~ bb3 ~ eb4 ~ g4 ~ bb4 ~", AG: "d4 ~ g4 ~ bb4 ~@3 ab3@8", AH: "g3@4 g3@2 bb3 ab3",
  AI: "g3@4 bb3@3 ~", AJ: "~ g3 bb3 f3", AK: "g3 f3 g3 a3", AL: "[bb3@5 ~@3]/2",
})).s("gm_french_horn").gain(0.3)

// other · french horn · "Horn in F" · soft notes
const french_horn_soft = note("<~ A B@2 C ~ D@2 E F@4 G H I ~@32 J K L K M N O P Q R@2 ~@4>".pickRestart({
  A: "~@2 bb3@3 bb3 bb3@2", B: "[bb3@4 eb3@4 eb3@3 g3 f3@8 bb3@8 bb3@4]/2", C: "g3@4 d4@2 eb4@2 eb4@3 ~@5",
  D: "[~@8 bb3@3 ab3 bb3@8 eb4@6 g4@2 ~@4]/2", E: "~@7 eb4",
  F: "[bb3@3 bb3@9 bb3@8 c4@8 bb3@6 ab3@2 g3@8 bb3@8 a3@8 bb3@4]/4", G: "a3 bb3@2 ab3", H: "g3@3 ab3 bb3 ab3 bb3@2",
  I: "ab3 g3@2 ~", J: "~@7 ab3", K: "g3!2", L: "bb3@2 bb3 ab3 g3@4", M: "~@4 a3 g3 gb3 g3",
  N: "ab3@2 bb3@2 g3 ab3 bb3@2", O: "c4 d4 g3@2", P: "bb3@4 ab3@2 g3 f3", Q: "bb3@2 bb3@2 bb3@2 c4 bb3",
  R: "[~@2 eb4@5 d4 c4@6 bb3@18]/2",
})).s("gm_french_horn").gain(0.2)

// other · trombone
const trombone = note(`<
  A@4 B@2 C@2 D E ~@6 F G ~@3 H I ~@2 J K L M N O P Q R S T U V W X Y Z AA AB@3 AC AD ~@11 AE AF AG@2
>`.pickRestart({
  A: "[~@6 g3@6 eb3@3 f3@2 g3 bb2 c3 eb3@2 f3@4 g3@2 eb3@3 f3]/4",
  B: "[g3@2 bb3@2 c4@2 bb3@2 bb3@3 g3 bb3@6 c4@2 eb4@6 c4@2 bb3@2 g3@2]/2",
  C: "[f3@2 eb3@2 f3@2 g3@2 bb2@3 c3 f3@8 g3@4 eb3@6 f3@2]/2", D: "g3 bb3 eb4@3 c4 bb3 g3", E: "eb3@3 f3 ~@12",
  F: "~ eb3@2 g3", G: "f3@7 ~@9", H: "~ bb3 ~@6", I: "~@5 f3 ~@2", J: "~@5 eb3 g3 bb3",
  K: "eb4@2 eb3 ~ g3 ~ bb3 ~@3 f3 ~@3 f3 ~", L: "~@2 f3 ~@3 eb3 ~ g3 ~ eb3 ~ g3 ~ bb3 ~",
  M: "d4 ~ g3 ~ bb3 ~ d4 ~@3 eb3 ~ g3 ~ bb3 ~", N: "~ bb3 a3 g3 f3 eb3 d3@2", O: "~@2 eb3 ~ g3 ~ bb3 ~@3 f3@2 e3@4",
  P: "~ c4 d4 e4 g4 f4 eb4 ab3", Q: "g3@4 c4@2 bb3 a3", R: "g3@2 c3 bb2 eb3!2 bb2 g2",
  S: "bb2@2 eb3 ~ g3 ~ bb3 ~ ab3@8", T: "ab3 g3 eb3@2", U: "d4@3 ~ bb3@2 d4@2 g4 ~@3 bb3@2 ~@2, ~@4 g3 ~@11",
  V: "ab3@2 ~@2 g3@3 ~ a3@2 g3@2 f3@2 eb3@2, ~@8 bb3 ~@7",
  W: "d3@3 ~ f3@2 ~@2 d4@2 c4@2 eb4 ~ bb3 ~, ~@4 eb3 ~@3 eb4 ~@7", X: "eb4 ~ g4 ~ gb4@2 eb4@2 gb4@3 ~ gb4@2 db3 ~",
  Y: "gb3 ~ bb3 ~@3 eb3 ~ f3 ~ b3 ~ bb3@2 eb3 ~", Z: "g3 ~ bb3 ~ b3@4 eb3@2 ~@6", AA: "~ eb3 f3 g3 bb3@2 ab3 ~",
  AB: "[~@6 b3@4 bb3@4 eb3@4 eb3@2 ~ g3 bb3 eb4]/3", AC: "d4@3 bb3 c4@2 g4 f4", AD: "f4@4 eb4@3 d4 ~@8",
  AE: "~ eb3 eb3@2", AF: "eb3@3 ~ db3@4 e3@4 eb3@4, ~@4 d3 ~@11", AG: "[eb3@5 ~@3]/2",
})).s("gm_trombone").gain(0.3)

// other · trombone · soft notes
const trombone_soft = note(`<
  ~@9 A@2 B@2 C@2 D@2 E F G H I J@2 K L ~@17 M ~@3 N@2 O P O Q R S T U V W X ~@3
>`.pickRestart({
  A: "[~ eb3@2 g3@2 g3@2 d3]/2", B: "[f3 bb2@2 g3@2 g3@3]/2", C: "[g3 eb3 d3@4 bb2@5 eb3@2 eb3 g3@2]/2",
  D: "[f3 bb2@4 ~@3]/2", E: "~@7 f3 g3@8", F: "~@2 bb2 ~ eb3 ~ g3 ~@3 eb3 ~@3 eb3 ~", G: "~@2 ab3 ~@3 eb3 ~ g3 ~@7",
  H: "~@2 d3 ~ g3 ~ bb3 ~@3 c3 ~ eb3 ~ g3 ~", I: "~@2 a3 g3 f3 eb3 d3@2",
  J: "[~@2 bb2 ~ eb3 ~ eb3 ~@5 e3@6 f3@4 e3@2 c3@4 bb3@2 ab3@2]/2", K: "g3@2 eb4 ~ eb4 ~@3 bb3@2 a3@2 g3@2 f3@2",
  L: "g3 bb3 ab3!2 g3 ~@3", M: "b3@2 bb3 ~@5", N: "[~@4 c4@3 bb3@9]/2", O: "eb3 c3", P: "g2@2 ab2 bb2 bb2@4",
  Q: "a3 g3!2 a3 d3@4", R: "bb2 eb3@3", S: "g3 f3 eb3@2", T: "gb3@2 g3@2 c3@2 bb3 c4",
  U: "bb3@3 c4 db4@4 d4@4 eb4@2 d4@2", V: "bb3@2 ~@3 bb2 c3 d3", W: "eb3@4 eb4@3 d4 c4@6 bb3@2", X: "bb3 ~@3",
})).s("gm_trombone").gain(0.2)

// bass · tuba
const bass = note(`<
  ~ A B@2 C@2 D@2 E@3 F@2 G H@4 I J K L M N O P Q R S T U V W X Y Z AA AB@5 AC AD AE AF AG AH AI AJ AK AJ AL AM AN AO AP
  AQ AR AS AT AU@2
>`.pickRestart({
  A: "~ eb2@2 bb1", B: "[bb1@2 eb2@2 g2@2 bb2@4 eb2@3 g2 bb2@2]/2", C: "[eb2@4 ab2@2 g2@2 g2@3 f2 bb2@8 ab2@8 g2@4]/2",
  D: "[c2@8 bb1@3 bb2@9 eb2@6 eb2@2 f2@4]/2", E: "[g2@4 ab2@4 f2@4 bb2@7 bb2 eb2@8 eb3@8 c3@8 g2@4]/3",
  F: "[bb2 eb2@2 eb3@2 c3@2 bb2]/2", G: "c3 eb3 g2@4 f2@2",
  H: "[eb2@4 eb2@6 ab2@2 bb2@8 eb2@20 ab2@2 f2@2 bb2@11 bb1 eb2@8]/4", I: "eb2 ~@7 ab2 ~@3 f2 ~@3",
  J: "bb2 ~@3 eb2 ~@5 eb2 ~ d2 ~ c2 ~", K: "bb1 ~@7 c2 ~@7", L: "f2 ~@3 f2 ~@3 bb1 ~@5 bb1 ~", M: "eb2 ~@7 g1 ~@5 g1 ~",
  N: "ab1 ~ bb1 ~ c2 ~@3 f2 ~@5 f2 ~", O: "bb1 ~@5 b1 ~ c2 ~@3 f2 ~@3", P: "bb2 ~@3 f2@2 bb1@2 eb2@4 ~@4",
  Q: "eb2@2 ~@2 ab2 ~ f2 ~", R: "bb2@2 eb2@2 ~ eb3 d3 c3", S: "g2 ~ c3 ~", T: "f2 ~ f3@2 bb2@2 ~ bb2",
  U: "eb2@2 ~@2 g2@2 ~ g2", V: "ab2@2 bb2 c3 f2@2 f2 f1", W: "bb1 b1 c2 f2", X: "bb2@2 f2 bb2 eb2!2 bb1 g1",
  Y: "eb2 b1", Z: "bb1@7 ~ c2@8, ~@8 b1 ~@7", AA: "g1@3 ~@9 f2@4",
  AB: "[bb1@4 c2@4 f2@4 bb1@10 ~@6 db2@7 ~ b1@8 gb2@8 ab2@8 bb2@8 b2@4 c3@2 ~@6, ~@36 c2 ~@43]/5", AC: "db2 ~@3 c2 ~@3",
  AD: "b1 b2 bb1 ~@3 ab1 ~", AE: "~@2 gb1 ~ gb2 ~@3", AF: "ab1 ~@3 bb1 ~@3", AG: "g1 ~@5 bb1 ~",
  AH: "~@2 eb2 ~@3 g2 ~ bb2 ~ bb2@2 c3@2 bb2@2", AI: "~@2 eb2 ~@3 g2 ~ bb2@8", AJ: "eb2 ~@3 c2 ~@3",
  AK: "g1 ~@3 [g1,ab1] ~ bb1 ~ eb2@4 ~@4", AL: "bb1@2 ~@2 c2@2 ~@2 g1@3 ~@5",
  AM: "e2@2 ~@2 eb2@2 ~@2 eb2@2 ~@2 [f2,g2] ~ ab2 ~, f2 ~@15", AN: "a2 ~ bb2@3 ~@3 eb2@2 ~@2 eb2@3 ~",
  AO: "db2@4 c2@4 f2@3 ~ g2@2 a2@2, d2 ~@11 f2 ~@3", AP: "bb1 ~@2 bb1 ~ bb1 ~ bb1",
  AQ: "eb2@2 ~@4 g2 ~ bb2@2 ~@2 bb1@2 ~@2", AR: "eb2@2 ~@4 g1 ~ bb1 ~@5 bb1 ~",
  AS: "eb2@4 eb2@3 ~ db2@4 c2@3 ~, ~@8 d2 ~@7", AT: "bb1 ab1 c2 b1, b1 ~@15", AU: "[eb2@5 ~@3]/2",
})).s("gm_tuba").gain(0.2)

stack(trumpet, trumpet_soft, french_horn, french_horn_soft, trombone, trombone_soft, bass)

More by Grainger