Strudelify
Vital Signs cover art

Moving Pictures

Vital Signs

Rush

KeyC minorTempo147 bpm
0:00/0:00
// Vital Signs — Rush
// 147 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 29, 4/4 at bar 30, 3/4 at bar 58, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 84 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(147/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 · vibraphone · "PRG.CHANGE" · Abmaj7 C5 Abmaj7 C5 Abmaj7
const vibraphone = note(`<
  [~@2 g3@5 ~ [ab3,c5,g5,c6] ab3 ~@4 ab3!2]
  [[c4,c5,g5,c6] c4 ~@4 g3!2 [ab3,c5,g5,c6] ab3 ~@5 ab3]!4
  [[c4,c5,g5,c6] c4 ~@4 g3@2 [ab3,c5,g5,c6] ab3 ~@6]
  ~@78
>`).s("gm_vibraphone").gain(0.11)

// chords · marimba · "PRG.CHANGE"
const marimba = note("<A@2 B@3 C ~@78>".pickRestart({
  A: "[~@4 [eb3,c5,g5,c6] eb3 ~@5 eb3 [bb3,c5,g5,c6] bb3 ~@6 [eb3,c5,g5,c6] eb3 ~@5 eb3 [bb3,c5,g5,c6] bb3 ~@2, ~@6 g3@12 g3@5 ~@9]/2", // Cm C7 Cm C7
  B: "[~@2 g3 ~ [eb3,c5,g5,c6] eb3 ~@5 eb3 [bb3,c5,g5,c6] bb3 ~@4 g3 ~ [eb3,c5,g5,c6] eb3 ~@5 eb3 [bb3,c5,g5,c6] bb3 ~@4 g3!2 [eb3,c5,g5,c6] eb3 ~@5 eb3 [bb3,c5,g5,c6] bb3 ~@2, ~@3 g3@15 ~ g3@15 ~@14]/3", // Cm C7 Cm C7 Cm C7
  C: "~@2 g3!2 [eb3,c5,g5,c6] eb3 ~@5 eb3 [bb3,c5,g5,c6] bb3 ~@2", // Cm C7
})).s("gm_marimba").gain(0.13)

// chords · music box · "PRG.CHANGE"
const music_box = note(`<
  ~@5 A B C@2 D E F G D E F G D E F G F G F G F G H@2 I J I K I K L M K I K I N O@3 P Q R S T U@2 P Q R S V@2 W@2 D E F
  G D E F G D E F G D E F G D H@2 I X Y@3
>`.pickRestart({
  A: "~@15 ab3",
  B: "[c4,c5,eb5,g5,c6] c4 [g3,c5,eb5,g5,c6] g3 eb3!2 [g3,bb4,d5,f5,bb5] g3 ab3!2 [eb3,g4,bb4,d5,g5] eb3 bb3!2 [ab3,ab4,c5,eb5,ab5] ab3", // Cm Gm7 Ebmaj7 Ab
  C: "[[c4,ab4,c5,eb5,ab5] c4 g3!2 eb3!2 g3!2 ab3!2 eb3!2 bb3!2 ab3!2 c4!2 g3!2 eb3!2 g3!2 ab3!2 eb3!2 bb3!2 ab3!2, ~ [ab4,c5,eb5,f5]@7]/2", // Ab Fm7
  D: "c4!2 g3!2 [eb3,eb5,g5,c6] eb3 g3!2 ab3!2 eb3!2 [bb3,c5,eb5,ab5] bb3 ab3!2", // Cm Ab
  E: "c4!2 g3!2 [eb3,eb5,g5,c6] eb3 [g3,eb5,g5,c6] g3 ab3!2 eb3!2 bb3!2 ab3!2", // Cm
  F: "[c4,eb5,g5,c6] c4 g3!2 eb3!2 g3!2 [ab3,c5,eb5,ab5] ab3 eb3!2 bb3!2 ab3!2", // Cm Ab
  G: "[c4,eb5,g5,c6] c4 [g3,eb5,g5,c6] g3 eb3!2 g3!2 ab3!2 eb3!2 [bb3,eb5,g5,c6] bb3 ab3!2", // Cm Cm7
  H: "[c5@2 g4@2 eb4@2 ab4@4 eb4@2 bb3@2 c4@4 c4@2 eb4@2 c4 ~ bb3@2 bb3@2 bb3@2 bb3@2]/2", I: "bb3!8",
  J: "c4!2 eb4 c4 bb3!4", K: "c4 eb4 c4 bb3!5",
  L: "bb3@2 bb3@2 bb3@2 bb3@2 [ab4,c5,eb5] ~ [ab4,c5,eb5] ~@3 [bb4,eb5,g5] ~", // Ab Eb
  M: "~@2 [bb4,eb5,g5] ~@3 [bb4,eb5,g5]@4 [bb4,d5,f5]@2 [f4,bb4,d5]@4", // Eb Bb
  N: "c4@2 eb4@2 c4@2 bb3@2 [ab4,c5,eb5] ~ [ab4,c5,eb5] ~@3 [bb4,d5,f5] ~", // Ab Bb
  O: "[~@2 [f4,bb4,d5] ~@3 [ab4,c5,eb5]@4 ~@2 [ab4,c5,eb5,f5]@28 ~@4 [eb4,g4,c5] ~ [eb4,g4,c5] ~]/3", // Bb Ab Fm7 Cm
  P: "~@4 [eb5,g5,c6] ~@7 [f4,bb4,d5] ~ [f4,bb4,d5] ~", Q: "~@4 [d5,f5,bb5] ~@7 [f4,bb4,d5] ~ [f4,bb4,d5] ~",
  R: "~@4 [d5,f5,bb5] ~@7 [ab4,c5,eb5] ~ [ab4,c5,eb5] ~", S: "~@4 [c5,eb5,ab5] ~@7 [eb4,g4,c5] ~ [eb4,g4,c5] ~",
  T: "~@4 [eb5,g5,c6] ~@3 [d5,f5,bb5] ~@5 [f4,bb4,d5]@2", U: "[~@6 [c5,eb5,ab5]@18 ~@4 [eb4,g4,c5] ~ [eb4,g4,c5] ~]/2",
  V: "[~@4 [eb5,g5,c6] ~@3 [d5,f5,bb5]@6 [f4,bb4,d5]@6 [ab4,c5,eb5,ab5] ~@5 [ab4,c5,eb5,f5] ~@5]/2", // Cm Bb Ab Fm7
  W: "[c4!2 g3!2 eb3!2 g3!2 ab3!2 eb3!2 bb3!2 ab3!2 c4!2 g3!2 eb3!2 g3!2 ab3!2 eb3!2 bb3!2 ab3!2, [eb4,g4,ab4,c5]]/2", // Abmaj7
  X: "c4@2 c4@2 eb4@2 c4@2 [ab4,c5,eb5] ~ [ab4,c5,eb5] ~@3 [bb4,d5,f5] ~", // Ab Bb
  Y: "[~@2 [f4,bb4,d5] ~@3 [ab4,c5,eb5]@4 ~@2 [ab4,c5,eb5,f5]@28 ~@8]/3", // Bb Ab Fm7
})).s("gm_music_box").gain(0.32)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@6 A B@2 C D C D C D C D C D C D C D C D C D E@2 F G H I J I K L M J I J N O@3 P Q R S T U@2 P Q R S V@2 W@2 C D C D
  C D C D C D C D C D C D C E@2 F X Y@2 ~
>`.pickRestart({
  A: "c3 ~ c3@2 ~@2 bb2@2 ~@2 bb2@2 ~@2 ab2 ~", B: "[ab2 ~ ab2@14]/2",
  C: "c4 ~ g3 ~ eb3 ~ g3 ~ ab3 ~ eb3 ~ bb3 ~ ab3 ~", D: "c4 ~ g3 ~ eb3 ~ g3 ~ ab3 ~ g3 ~ f3 ~ eb3 ~",
  E: "[c4@2 g3@2 eb3@2 ab3@4 eb3@2 bb2@2 c3@4 c3@2 eb3@2 c3@2 bb2 ~ bb2 ~ bb2 ~ bb2 ~]/2",
  F: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~", G: "c3 ~ c3 ~ eb3 ~ c3 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~",
  H: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2@2 bb2@2 bb2@2 bb2@2", I: "c3 eb3 c3 bb2!5", J: "bb2!8",
  K: "bb2@2 bb2@2 bb2@2 bb2@2 f2 ~ f2 ~@3 eb3 ~", L: "~@2 eb3 ~@3 eb3@3 ~ d3 ~ bb2@3 ~",
  M: "c3 ~ eb3 ~ c3 ~ bb2 ~ bb2@2 bb2@2 bb2@2 bb2@2", N: "c3@2 eb3@2 c3@2 bb2@2 c3 ~ c3 ~@3 bb2 ~",
  O: "[~@2 bb2 ~@3 ab2 ~ ab2 ~@3 ab2@28 c3 ~ c3 ~ c4 ~ c4 ~]/3", P: "c3 ~ c3 ~ c4 ~@3 bb2 ~ bb2 ~ bb3 ~ bb3 ~",
  Q: "bb2 ~ bb2 ~ bb3 ~@3 bb2 ~ bb2 ~ bb3 ~ bb3 ~", R: "d3 ~ d3 ~ f3 ~ f3 ~ eb3 ~ eb3 ~ eb3@3 ~",
  S: "ab2 ~ ab2 ~ ab2@3 ~ c3 ~ c3 ~ c4 ~ c4 ~", T: "c3 ~ c3 ~ c4 ~@3 bb2 ~@5 g2@2",
  U: "[~@6 ab2@18 c3 ~ c3 ~ c4 ~ c4 ~]/2", V: "[c3 ~ c3 ~ c4 ~@3 bb2@6 g2@6 ab3 ~@5 c3 ~@5]/2", W: "ab2/2",
  X: "c3 ~ c3 ~ eb3 ~ c3 ~ c3 ~ c3 ~@3 bb2 ~", Y: "[~@2 bb2 ~@3 ab2 ~ ab2 ~@3 ab2@12 ~@8]/2",
})).s("gm_synth_bass_1").gain(0.31)

// chords · synth brass 2 · "SYNBRASS 2"
const synth_brass_2 = note(`<
  ~@6 A B ~ C D E D E D E D E D E D E D E D E F ~@17 G@2 H@2 I H@2 J@2 H@3 K L M ~ N O N P@2 Q N P@2 R N P@2 S@2 T@2 U V
  W X Y@2 ~
>`.pickRestart({
  A: "[c2,bb3] ~@5 [c2,bb3] ~@3 [c2,bb3] ~@3 [c2,bb3] ~", B: "[c2,bb3] ~@3 [c2,bb3] ~@11",
  C: "[c2,a3] a3!7 b3 a3!3 b3 a3!3, bb3@15 ~", D: "a3!8 [c2,a3] a3!7", E: "a3!8 b3 a3!3 b3 a3!3",
  F: "a3!8 [c2,a3] a3!3 ~@4", // F
  G: "[f3@2 f3 d3 c3 ~@3 [c2,a3] a3 [c2,b3] a3!5 [c2,a3] a3 b3@2 a3!4 [c2,a3] a3 [c2,b3] a3!5, ~@8 bb3@15 ~@9, ~@18 c2 ~@13]/2", // F Cmaj7 F Cmaj7
  H: "[c2,a3] a3 b3@2 a3!4 [c2,a3] a3 [c2,b3] a3!5, ~@2 c2 ~@13", // F Cmaj7
  I: "[c2,a3] a3 b3@2 [d3,f3,a3] a3 [d3,f3,a3] a3 [c2,a3] a3 [c2,b3] a3!5, ~@2 c2 ~@13", // F Dm F Cmaj7
  J: "[[c2,a3] a3 b3@2 a3!4 [c2,a3] a3 [c2,b3] a3!5 [c2,a3] a3 b3@2 a3!4 [c2,a3] a3 [c2,b3] a3!5, ~@2 c2 ~ db4@20 ~@8, ~@18 c2 ~@13]/2", // F Cmaj7 F Cmaj7
  K: "[c2,a3] a3 b3@2 a3!4 [c2,a3,db4] a3!5 [c2,a3,db4] a3, ~@2 c2 ~@13", L: "a3!4 [c2,a3,db4] a3!5 [c2,a3,db4] a3!5",
  M: "[c2,db4] ~@15", N: "[c2,a3] ~ a3 ~ a3 ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~",
  O: "a3 ~ [c2,a3] ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~", // F
  P: "[a3 ~ [c2,a3] ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~, ~@8 db4@15 ~@9]/2", // F
  Q: "a3 ~ [c2,a3] ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ a3 ~", // F
  R: "a3 ~ db4@2 a3 ~ [c2,a3] ~ a3 ~ db4@2 a3 ~ [c2,a3] ~, ~@2 a3 ~@7 a3 ~@5", // F
  S: "[a3 ~ [c2,a3] ~ a3 ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~, ~@8 db4@15 ~@9]/2", // F
  T: "[a3 ~ a3 ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ a3 ~ [c2,a3] ~ [c2,a3] ~ a3 ~ a3 ~ [c2,a3] ~@3 c2 ~@3 c2 ~, ~@8 db4@15 ~@9]/2", // F
  U: "db4@7 ~ db4@3 ~@3 db4@2, c2 ~@7 c2 ~@5 c2 ~", V: "~@2 c2 ~ eb4 ~@3 [c2,eb4] ~ c2 ~ eb4 ~@3",
  W: "[c2,eb4] ~ c2!2 eb4 ~@3 [c2,eb4] ~ c2 ~ eb4 ~@3", X: "[c2,eb4] ~@3 eb4 ~ c2 ~ c2 ~ c2 ~@5",
  Y: "[c2 ~@5 c2 ~@3 c2 ~ db4@12 ~@8, ~@12 c2 ~@19]/2",
})).s("gm_synth_brass_2").gain(0.1)

// chords · synth brass 2 · "SYNBRASS 2" · soft notes
const synth_brass_2_soft = note(`<
  ~@10 A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A C D E F G F G H C I H J K E L M ~ N O@3 ~ O@6 P O ~@3 Q R Q R Q S Q R Q T Q R Q
  U Q V W X Y@2 Z Y ~@2
>`.pickRestart({
  A: "~@8 db4 ~@7", B: "c6 ~@3 c6 ~@3 db4 ~@7", C: "c2 ~ c2 ~@3 c2 ~@3 c2 ~@3 c2 ~", D: "~@2 c2 ~@5 c2 ~ c2 ~@5",
  E: "c2 ~ c2 ~@5 c2 ~ c2 ~@3 c2 ~", F: "c2 ~@7 c2 ~ c2 ~@3 c2 ~", G: "~@2 c2 ~@3 c2 ~ c2 ~ c2 ~@3 c2 ~",
  H: "c2 ~@7 c2 ~ c2 ~@5", I: "~@2 c2 ~@3 c2 ~@3 c2 ~@3 c2 ~", J: "c2 ~ c2 ~@5 c2 ~ c2 ~@5",
  K: "c2 ~ c2 ~@3 c2 ~@3 c2 ~@5", L: "~@2 c2 ~@3 c2 ~ c2 ~ c2 ~@5", M: "c2 ~@5 c2 ~@3 c2 ~ c2 ~@3", N: "~@6 c3 ~@9",
  O: "~@4 c6 ~@11", P: "~@4 c6!3 ~@9", Q: "~@8 c6 ~@7", R: "c6 ~@7 c6 ~@7", S: "c6 ~@7 c6 ~@3 c6 ~@3",
  T: "c6 ~ c6 ~@5 c6 ~ c6 ~@5", U: "c6 ~@3 c6 ~@3 c6 ~@7", V: "c6 ~ c6 ~@5 c6 ~@7", W: "~@8 c6 ~@3 c6 ~@3",
  X: "~@2 c6 ~ c6!3 ~@4 c6!2 ~@3", Y: "~@4 c6 ~@7 c6 ~@3", Z: "~@3 c6!2 ~@7 c6 ~@3",
})).s("gm_synth_brass_2").gain(0.05)

// drums · snare
const snare = s("sd").struct("<~@26 A B@3 C B C B C D B C B C B C B ~@41>".pickRestart({
  A: "~@12 x!3 ~", B: "~ x ~ x", C: "~ x!3 ~@2 x ~", D: "~@2 x!2 ~@2 x ~",
})).gain(0.35)

stack(vibraphone, marimba, music_box, bass, synth_brass_2, synth_brass_2_soft, snare)

More by Rush