Strudelify

Oliver's Army

Elvis Costello

KeyE majorTempo126 bpm
0:00/0:00
// Oliver's Army — Elvis Costello
// 126 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(126/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(`<
  ~@8 A B C D E B F G@2 H I@2 ~@12 A B C D J B F G@2 H I@2 ~@12 K L M N O P Q R S T@2 U V W X Y V Z AA@2 AB AC@2 ~@28
>`.pickRestart({
  A: "[a3,c#4] [a3,c#4,e4,a4] [a3,c#4,e4,g#4] [a3,c#4,e4,a4]", B: "[c#4,e4,b4]@3 a4 [a3,c#4,e4,a4]@4",
  C: "[a3,d4,f#4]@2 [d4,f#4,a4] [d4,f#4]", D: "[g#3,b3,e4] [b3,e4,g#4] [e4,g#4,c#5] [e4,g#4,b4]",
  E: "[c#4,e4,a4]@2 ~ a4 [a3,c#4,e4,g#4]@2 [a3,c#4,e4,a4]@2", F: "~ [a3,d4,f#4]!2 ~",
  G: "[[g#3,b3,c#4,f4] f4!2 [g#3,b3,c#4,f#4]@2 g#4@2 [c#4,f#4,a4]@3 [c#4,f#4,a4] a4 [c#4,f#4,a4]@2 a4@2]/2", // C#7 G#m7 F#m
  H: "[b3,d#4,g#4]@2 f#4 [b3,d#4,f#4]@2 g#4 a4@2", // G#m B
  I: "[~@2 [c#4,f#4,a4] a4 [c#4,f#4,a4]@2 g#4 [b3,d#4,g#4]@3 f#4 [b3,e4,g#4]@3 g#4 f#4]/2", // F#m G#m E
  J: "[a3,c#4,a4] [a3,c#4,e4,a4] [a3,c#4,e4,g#4] [a3,c#4,e4,a4]", K: "~ [d#4,g#4,b4]!2 [b3,d#4,g#4]",
  L: "[a#3,c#4,f#4]@2 a#4 [c#4,f#4,a#4]@3 ~@2", M: "~ [e4,g#4,b4]!2 [b3,e4,g#4]",
  N: "[a#3,d#4,g4] g4 a#4 [d#4,f#4,a#4]@2 a#4 ~@2", O: "~@2 [c#4,g#4,b4] b4 [c#4,f4,b4]@2 g#4@2",
  P: "[a#3,c#4,f#4] a#4@2 [c#4,f#4,a#4]@3 ~@2", Q: "[e4,g#4,b4]@2 b4 [e4,g#4,b4]@2 a#4 g#4@2",
  R: "[a#3,c#4,f#4]@2 [c#4,f#4,a#4]@2 [c#4,f#4,a#4]@2 [a#3,c#4,f#4] f#4", // F#
  S: "[e4,g#4,b4]@2 [e4,g#4,b4] b4 [g#4,b4] a#4 g#4 f#4", // E G#m
  T: "[[a#3,c#4,f#4]@2 a#4!2 [c#4,f#4,a#4] b4 [c#4,f#4,a#4]@10]/2", // F#
  U: "[b3,d#4] [b3,d#4,f#4,b4] [b3,d#4,f#4,a#4] [b3,d#4,f#4,b4]", V: "[d#4,f#4,c#5]@3 b4 [b3,d#4,f#4,b4]@4",
  W: "[b3,e4,g#4]@2 [e4,g#4,b4] [e4,g#4]", X: "[a#3,c#4,f#4] [c#4,f#4,a#4] [f#4,a#4,d#5] [f#4,a#4,c#5]",
  Y: "[d#4,f#4,b4]@2 ~ b4 [b3,d#4,f#4,a#4]@2 [b3,d#4,f#4,b4]@2", Z: "~ [b3,e4,g#4]!2 ~",
  AA: "[[a#3,c#4,d#4,g4] g4!2 [a#3,c#4,d#4,g#4]@2 a#4@2 [d#4,g#4,b4]@3 [d#4,g#4,b4] b4 [d#4,g#4,b4]@2 b4@2]/2", // D#7 A#m7 G#m
  AB: "[c#4,f4,a#4]@2 g#4 [c#4,f4,g#4]@2 a#4 b4@2", // A#m C#
  AC: "[~@2 [d#4,g#4,b4] b4 [d#4,g#4,b4]@2 a#4 [c#4,f4,a#4]@3 g#4 [c#4,f#4,a#4]@3 a#4 g#4]/2", // G#m A#m F#
})).s("gm_piano").gain(0.36)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A B C D A B C D A B C E A B F G H I H J K L K M N O C P Q R S T A B C E A B F G H I H J K L K M N O C P Q R S T U V W
  X Y Z AA AB AC AD AE AF AG AH AI AF AG AJ AK AL AM AL AN AO AP AO AQ AR AS AH AT AR AS AH AT AU AV AW AX AU AV AW AX
  AU AV AW AX AU AV AW AX
>`.pickRestart({
  A: "a1@3 a1 c#2@2 e2@2", B: "a2@3 a2 g#2 f#2 a1 f#2", C: "d2@3 d2 c#2@3 c#2", D: "b1@2 ~ b1 e2@2 ~ e2",
  E: "b1@3 b1 e2@3 e2", F: "d2@3 d2 a1@2 d2@2", G: "c#2@2 ~ c#2 g#1@2 c#1@2", H: "f#2 e2 d#2 c#2", I: "b1 a1 g#1 f#1",
  J: "b1 c#2 d2 d#2 e2 d2 c#2 b1", K: "a1@2 ~ a1 c#2 d2 e2@2", L: "d2@2 ~ d2 e2@2 c#2 b1", M: "f#2@2 ~ f#2 g#2@2 ~ g#2",
  N: "a2@3 a2 g#2@3 g#2", O: "f#2@3 f#2 e2@3 e2", P: "e1@3 e1 e2@2 ~ e2", Q: "a1@2 ~ a1 c#2@2 e2@2",
  R: "a2@2 ~ a2 f#2 e2 a1 e2", S: "d2@2 ~ d2 c#2@2 ~ c#2", T: "b1 e2!3 e1!2 f#1 g#1", U: "e1@2 ~ e1 f#1@2 g#1@2",
  V: "c#2@2 ~ c#2 f#1@2 c#2@2", W: "b1@2 ~ b1 f#1@2 b1@2", X: "a#1@2 ~ a#1 a#1@2 ~ a#1", Y: "c#2 f2 g#2 c#3",
  Z: "f#2@2 ~ c#2 g#1@2 ~ d#2", AA: "e2@2 ~ e2 f#2@2 e2@2", AB: "f#2!2 a#2 f#2", AC: "b2@2 ~ b2 e3@2 b2@2",
  AD: "f#2 c#3 f#2@2", AE: "f#3 e3 c#3@2 f#2 e2 d#2 c#2", AF: "b1@3 b1 d#2@2 f#2@2", AG: "b2@3 b2 a#2 g#2 b1 g#2",
  AH: "e2@3 e2 d#2@3 d#2", AI: "c#2@3 c#2 f#2@3 f#2", AJ: "e2@3 e2 b1@2 e2@2", AK: "d#2@2 ~ d#2 a#1@2 d#1@2",
  AL: "g#2 f#2 f2 d#2", AM: "c#2 b1 a#1 g#1", AN: "c#2 d#2 e2 f2 f#2 e2 d#2 c#2", AO: "b1@2 ~ b1 d#2 e2 f#2@2",
  AP: "e2@2 ~ e2 f#2@2 d#2 c#2", AQ: "g#2@2 ~ g#2 a#2@2 ~ a#2", AR: "b2@3 b2 a#2@3 a#2", AS: "g#2@3 g#2 f#2@3 f#2",
  AT: "f#1@3 f#1 f#2@2 ~ f#2", AU: "b1@2 ~ b1 d#2@2 f#2@2", AV: "b2@2 ~ b2 a#2 g#2 b1 g#2", AW: "e2@2 ~ e2 d#2@2 ~ d#2",
  AX: "c#2 f#1!7",
})).s("gm_acoustic_bass").gain(0.36)

// chords · reed organ
const reed_organ = note("<~@28 A B C D ~@20 A B C D ~@51>".pickRestart({
  A: "~@2 [a3,c#4,e4,a4] [a3,c#4,e4,g#4]@3 [a3,c#4,e4,a4]@2", // A Amaj7 A
  B: "[a3,c#4,e4]@2 [a3,c#4,e4,a4] [a3,c#4,e4,g#4]@3 [a3,c#4,e4,a4]@2", // A Amaj7 A
  C: "[a3,d4,f#4]@4 ~@3 [d4,f#4,a4,d5] [d4,f#4,a4,d5]@4 ~@3 [c#4,e4,g#4,c#5]", // D C#m
  D: "[c#4,e4,g#4,c#5]@4 ~@3 [d4,e4,g#4,b4] [d4,e4,g#4,b4]@4 ~@4", // C#m E7
})).s("gm_reed_organ").gain(0.36)

// chords · pizzicato strings
const pizzicato_strings = note(`<
  A@2 B C A@2 B C ~@12 D E D E F G H I J ~@15 D E D E F G H I J ~@26 K L K L M N O P M N O P Q R S T Q R S T Q R S T Q R
  S T
>`.pickRestart({
  A: "[a5,c#6,e6] [a5,c#6,e6,a6] [a5,e6,g#6] [a5,c#6,e6,a6]", // A Amaj7 A
  B: "[a5,d6,f#6] [a5,d6,f#6,a6] [a5,d6,g#6] [a5,d6,f#6,a6]", C: "[e5,g#5,b5,e6]",
  D: "[c#5,e5,a5] a5!2 [c#5,e5,a5]@2 e5 [a4,c#5,e5]@2", E: "[a4,d5,f#5] [d5,f#5,a5] [e5,g#5,c#6] [e5,g#5,b5]",
  F: "[c#5,e5,a5]!2 [c#5,e5,g#5] [c#5,e5,a5]", G: "[c#5,f#5,b5] b5 [c#5,f#5,a5]@2 [a4,c#5,g#5] g#5 [c#5,e5,a5]@2",
  H: "[a4,d5,f#5]@2 [f#5,a5,d6] [f#5,a5,c#6]", I: "[e5,g#5,c#6]@4 [e5,g#5,c#6]@2 b5 a5", J: "[c#5,e5,a5] ~@3",
  K: "[d#5,f#5,b5] b5!2 [d#5,f#5,b5]@2 f#5 [b4,d#5,f#5]@2", L: "[b4,e5,g#5] [e5,g#5,b5] [f#5,a#5,d#6] [f#5,a#5,c#6]",
  M: "[d#5,f#5,b5]!2 [d#5,f#5,a#5] [d#5,f#5,b5]", N: "[d#5,g#5,c#6] c#6 [d#5,g#5,b5]@2 [b4,d#5,a#5] a#5 [d#5,f#5,b5]@2",
  O: "[b4,e5,g#5]@2 [g#5,b5,e6] [g#5,b5,d#6]", P: "[f#5,a#5,d#6]@4 [f#5,a#5,d#6]@2 c#6 b5",
  Q: "[d#5,f#5] [d#5,f#5]@3, c#6", R: "~ [d#5,f#5,b5,d#6] [d#5,f#5,c#6] [d#5,f#5,b5]",
  S: "[e5,g#5,c#6]@2 [e5,g#5,b5] ~", T: "[a#5,c#6,f#6] ~ [g#5,b5,e6] ~ [f#5,a#5,d#6] ~ [e5,a#5,c#6] b5",
})).s("gm_pizzicato_strings").gain(0.36)

stack(piano, bass, reed_organ, pizzicato_strings)

More by Elvis Costello