Strudelify

Riot Act

Elvis Costello

KeyD majorTempo114 bpm
0:00/0:00
// Riot Act — Elvis Costello
// 114 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(114/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 · drawbar organ · "Organ"
const drawbar_organ = note(`<
  A@2 B C D E F@3 G H@2 D I E J K L M@2 N O P Q R@2 S T U V W X Y@4 Z AA@2 AB AC AD Z ~ D AE AF@3 AG H@2 D I E J K L M@2
  AH AI AJ AK AL AM AN@2 R@2 S T U V W X R@2 S T ~@4 AO AP AO AP AO AP AO AP AQ@3
>`.pickRestart({
  A: "[~@2 a1 a2, a1 ~, ~ a2@2 ~]/2", B: "a1 a2", C: "a1 [a2,a3]", D: "a1@3 e2 a2@4, [c#3,e3,a3,c#4]",
  E: "[a1,a2]@3 a2 a2@4, [d3,f3,a3]", // A Dm
  F: "[~@17 e2 ~ c#3 [c#3,e3,a3]@2 [c#3,e3,a3]@2, a1@2 a1@2 a1 ~, ~@2 a2@4 a2@3 a2 a2@2]/3", // A
  G: "f2@3 f2 [f3,a3,d4,f4]@2 [e3,e4]@2, [d3,f3,a3,d4] d2", // Dm E Dm
  H: "[[e3,g3,c4,d4]@2 [e3,g3,c4]@2 [c3,e3,g3] g3 ~@2 f2@3 ~@3 f2@2, c2 g2 ~@2, ~@3 [a2,a3]@5, ~@3 f3@3 f3@2, ~@6 c3@5 c3@2 c3@3]/2", // C A
  I: "[a1,a2]@3 a2 ~@2 a3@2, [d3,f3,a3]@3 ~, ~ a2", J: "a1@3 e2 a2@2 e2@2, [c#3,e3,a3,c#4]",
  K: "~@2 [c#3,e3,a3] a3 [e3,a3,c#4]@2 [c#3,e3,a3]@2, a1 a2", // A
  L: "[d3,f3,a3,d4]@2 a3 [f2,a3] [b2,d3,f3] f3 a3!2, f2@3 ~ b1@4", // Dm F Bdim
  M: "[[e3,g3,c4,e4]@2 [e3,g3,c4]@2 [c3,e3,g3] g3 ~@2 f2@3 ~ f3 ~ f2@2, c2 g2 ~@2, ~@3 [e3,a3,c4]@5, ~@6 c3@5 c3@2 c3@3]/2", // C Am
  N: "~ [f#3,a3,d4] ~ d4 [a3,d4,f#4]@2 [f#3,a3,d4]@2", O: "~@2 [g3,g4]@2 [g3,b3,f#4] e4 [g3,b3,d4]@2",
  P: "~@2 [f#3,b3,d4] d4 [f#3,b3,f#4]@2 [f#3,b3,d4]@2", Q: "~@2 [g3,b3,g4]@2 f#4 e4 [g3,b3,d4]@2",
  R: "[[d3,f#3,a3,d4]@2 d4 [d3,f#3,a3,d4]@7 [a3,d4,g4] g4 [a3,d4,f#4]@2 e4 d4]/2", // D Dsus4 D
  S: "[d3,a3,d4]@2 d4 [d3,f#3,a3,d4]@5", T: "[d3,a3]@2 g4!2 [a3,d4,f#4]@2 e4 d4", U: "d4!2 b3 [d3,g3,d4]@3 b3 a3",
  V: "[a3,c#4,f#4] f#4 e4 d4 [a3,d4]@2 e4 d4", W: "d4!2 b3 [d3,g3,d4]@2 d4 b3 a3",
  X: "[a3,c#4,f#4]@2 e4 d4 [a3,d4]@2 e4@2", // F#m D5
  Y: "[~@2 [g#3,c#4,e4]@2 [g#3,c#4,e4]@2 e4 [g3,c4,e4]@3 [g3,c4,e4]@2 [g3,c4,f#4]@2 e4 [f#3,b3,e4]@2 [f#3,a3,d4]@3 [f#3,b3,d4] [f#3,b3,d4]@2 [f3,a#3,d4]@3 [f3,a#3,d4]@2 [f3,a#3,f4]@2 d4@2]/4", // C#m C Esus2 D Bm A# A#5
  Z: "[e3,a3,d4]@2 c#4 [e3,a3,c#4]@5", AA: "[~@10 [g#3,c#4,e4]@2 [g#3,c#4,e4] [g#3,c#4,e4]@3, a1 ~, ~ a2@2 ~]/2",
  AB: "[g3,c4,e4]!2 [g3,c4,f#4] [g3,c4,e4]", AC: "[f#3,b3,e4]@2 d4 [e3,b3,d4]@2 d4!3",
  AD: "[f3,a#3,d4] d4 [f3,a#3,d4]@2 [f3,a#3,e4] [f3,a#3,d4]@3", AE: "[a1,a2]@3 a2 ~@2 a3@2, [d3,f3], a3@3 ~, ~ a2",
  AF: "[~@8 a3@4 ~@5 e2 a3 [c#3,a3] [c#3,e3,a3]@2 a3!2, [a1,a3]@4 a1@4 a1@2 ~ [c#3,e3], ~@2 a2@4 a2@3 a2 a2@2]/3", // F#m A C#m
  AG: "[f#2,a3,d4]@2 ~ f2 f3!2 a3!2, [d3,f3] d2, ~ a3 [a3,d4,f4] [e3,e4]", // D Dm E
  AH: "~ [f#3,a3,d4] d4 ~ [a3,d4,f#4]@2 [f#3,a3,d4]@2", AI: "~@3 d4 [g3,b3,f#4] e4 [g3,b3,d4]@2, g4@3 ~@5, ~ g3 ~@2",
  AJ: "~@2 [f#3,b3] ~ [f#3,b3,f#4]@2 [f#3,b3,d4]@2, ~ d4 ~@2", AK: "[g3,b3,g4]@3 d4 [g3,b3,f#4] e4 [g3,b3,d4]@2",
  AL: "~ [f#3,a3,d4] [a3,d4,f#4] [f#3,a3,d4]", AM: "[g3,d4,g4]@2 g4 [g3,b3,f#4]@2 e4 [g3,d4]@2",
  AN: "~@2 g4 [g3,d4,f#4]@2 e4 [g3,d4]@2", AO: "[d3,f#3,a3,d4]@2 d4 [d3,f#3,a3,d4]@5",
  AP: "[d3,f#3,a3]@2 e4!2 [f#3,a3,e4]@2 d4 b3, c2", // D F#m7
  AQ: "[[d3,f#3,a3,d4]@2 d4 ~@5 [d1,d2]@16, ~@3 [d3,f#3,a3,d4]@13 ~@8]/3", // D
})).s("gm_drawbar_organ").gain(0.31)

// chords · piano · "Grand Piano"
const piano = note(`<
  ~@20 A B C D E F G H D I D I ~@28 A B C D A B J@2 E F G H D I D I E F G H K L M N E O E O E O E O E ~@2
>`.pickRestart({
  A: "[d3,a3,d4]", B: "[g2,d3,b3]", C: "[b2,f#3,d4]", D: "[e2,b2,g3]", E: "[d2,d3]", F: "[c2,c3]", G: "b2", H: "a#2",
  I: "[a2,e3,a3]", J: "[e2,b2,g3]/2", K: "d5!2 b4 [d4,g4,d5]@3 b4 a4, [e2,b2,g3]",
  L: "[a4,c#5,f#5] f#5 e5 d5 [a4,d5]@2 e5 d5, [a2,e3,a3]", M: "d5!2 b4 [d4,g4,d5]@2 d5 b4 a4, [e2,b2,g3]",
  N: "[a4,c#5,f#5]@2 e5 d5 [a4,d5]@2 e5@2, [a2,e3,a3]", O: "c2",
})).s("gm_piano").gain(0.46)

// drums · kick
const kick = s("bd").struct("<~@20 x ~@47 [x!2] x ~@25>").gain(0.46)

// drums · snare
const snare = s("sd").struct("<~@28 A@4 ~@12 B@4 ~@6 B@5 ~@13 C@4 ~@19>".pickRestart({
  A: "~ x!3", B: "x", C: "x!4",
})).gain(0.36)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@32 x!5 ~ x!5 ~@52>").gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~@6 [x!4]!2 ~@39 x ~@11 x ~@35>").gain(0.31)

// drums · high tom
const high_tom = s("ht").struct("<A@3 B C@3 D E@2 F E@9 G@4 ~@20 H ~ H@2 ~@8 A@3 ~@5 H@4 ~@27>".pickRestart({
  A: "x!2", B: "x ~ x!2", C: "~@2 x!2", D: "x!4", E: "~ x!3", F: "~@2 x ~ x!2 ~@2", G: "x!8", H: "x",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@6 [~ x ~@2] ~@38 x ~@49>").gain(0.31)

// drums · ride
const ride = s("rd").struct("<~@48 A@8 ~@4 B@2 C B C B C@2 ~@27>".pickRestart({
  A: "x", B: "x!8", C: "x ~ x!6",
})).gain(0.36)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@32 [~ x ~@2]!2 [~ x ~@6] [~ x ~@2]!2 ~ [~ x ~@2]!5 ~@52>").gain(1.31)

stack(drawbar_organ, piano, kick, snare, snare_soft, mid_tom, high_tom, crash, ride, agogo_bells)

More by Elvis Costello