Strudelify

The Battle Cry of Freedom

George Frederick Root

KeyG majorTempo120 bpm
0:00/0:00
// The Battle Cry of Freedom — George Frederick Root
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/3834226; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// chords · piano
const piano = note(`<
  A B@2 C D@4 E@2 F@2 G@2 H I J@2 K L@4 M@2 N@2 O@2 H P Q R Q S Q R Q T U V W X Y Z@2 E@2 F@2 G@2 H I J@2 K L@4 M@2 N@2
  O@2 H P Q R Q S Q R Q T U V W X Y Z@2 AA AB AC AD AE AF U AG AH AI AJ AK AL AM@2
>`.pickRestart({
  A: "~@2 g5 a5", B: "[b5@2 b5@2 b5@3 a5 g5@3 ~ e5@2 f#5@2, [d3,g3]@8 [d3,g3]@15 ~ [g2,c3]@8]/2",
  C: "g5@2 g5@2 g5@3 f#5, [c3,e3]!2", // C
  D: "[[g2,c3]@8 d5@8 d5@6 c5@2 b4@4 d5@4 g5@6 b5@2 [d3,g3,b5]@15 ~ [d3,a5]@8, e5@6 ~@2 g2@15 ~ g2@15 ~@25]/4", // C5 G D5
  E: "[[c3,g5]@2 [a2,a5]@2 b5@2 b5@2 b5@3 a5 c3@4, ~@8 [d3,g3]@15 ~ g5@6 ~@2]/2", // C5 A G5
  F: "[e5@2 f#5@2 g5@2 g5@2 g5@3 f#5 c3@4, c3@8 [c3,e3]@15 ~ e5@6 ~@2]/2", // C
  G: "[[g2,d5]@4 d5@3 c5 b4@2 d5@2 g5@3 b5, ~@8 g2@15 ~ [d3,g3]@8]/2", H: "[d3,a5]@15 ~", I: "[g2,d3,g5] ~",
  J: "[[d3,g3,b5]@8 [d3,g3,b5]@15 ~ [g2,c3,e5]@8]/2", K: "[a2,e3,g5]!2",
  L: "[[g2,c3,e5]@8 [g2,d5]@15 ~ [g2,b4]@15 ~ [d3,g3,b5]@15 ~ [d3,a5]@8]/4", // C G5 G D5
  M: "[[c3,g5]@4 [a2,a5]@4 [d3,g3,b5]@15 ~ [c3,g5]@8]/2", N: "[[c3,e5]@8 [a2,e3,g5]@15 ~ [c3,e5]@8]/2",
  O: "[[g2,d5]@8 [g2,d5]@15 ~ [d3,g3,g5]@8]/2", P: "[g2,c3,g5]@11 ~@5", Q: "[d3,g3,d4] [g2,b2,b3]",
  R: "[d3,g3,d4]@4 [e3,e4]@11 ~", S: "[d3,g3,d4]@15 ~", T: "[d3,g3,a3]@2 [c3,g5] [a2,a5]", U: "[d3,g3,b5]@15 ~",
  V: "[c3,g5] [c3,e5]", W: "[a2,e3,g5]@15 ~", X: "[c3,e5] [g2,d5]", Y: "[g2,d5]@15 ~",
  Z: "[[d3,g3,g5]@8 [d3,a5]@15 ~ [g2,c3,g5]@8]/2", AA: "g5 a5 b5!2, ~ [d3,g3]", AB: "b5@3 a5 g5@3 ~, [d3,g3]@15 ~",
  AC: "e5 f#5 g5!2, [g2,c3] [a2,e3]", AD: "g5@3 f#5 [g2,c3]@4, [a2,e3]@4 e5@3 ~", AE: "d5@4 d5@3 c5, g2@15 ~",
  AF: "b4@2 d5@2 g5@3 b5, g2@15 ~", AG: "[d3,a5]@2 [c3,g5] [a2,a5]", AH: "b5@2 b5@2 b5@3 a5, [d3,g3]@15 ~",
  AI: "c3@2 e5 f#5, g5@3 ~ c3@4", AJ: "g5@2 g5@2 g5@3 f#5, [a2,e3]@15 ~", AK: "c3 [g2,d5], e5@3 ~@5",
  AL: "d5@3 c5 b4@2 d5@2, g2@15 ~", AM: "[g5@6 b5@2 [d3,a5]@15 ~ [g2,c3,g5]@8, [d3,g3] ~@3]/2",
})).s("gm_piano").gain(0.25)

stack(piano)