Strudelify

Crushing Day

Joe Satriani

KeyC majorTempo162 bpm
0:00/0:00
// Crushing Day — Joe Satriani
// 161.5 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "OVERDRIVE" overdriven guitar (copy of ch 2 "OVERDRIVE" overdriven guitar); ch 4 "FRETLESS" fretless bass (copy of ch 5 "FINGERDBAS" electric bass finger)
// note: Full arrangement: all 212 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(161.5/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 · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A@2 B@2 A@2 B C A@2 D E A@2 D@2 A@2 D@2 F G H I J K H L A@2 B@2 A@2 B C A@2 D@2 A@2 D@2 A@2 D@2 F G H I J K H M N O P
  Q R S T U F G H L A@2 B@2 A@2 B V W ~ W ~ W ~ W ~ W ~ W ~ W ~ W X@6 Y@8 Z@2 AA@2 Z@2 AA@2 Z@2 AA@2 Z@2 AA@2 Z@2 AA@2
  Z@2 AB AC AD@3 AE@4 AC AD@3 AE@3 AF A@2 B@2 A@2 B C A@2 D E A@2 D@2 A@2 D@2 F G H I F G H I F G H I J K H AG N O P Q R
  S T U N O P Q R S T U N O P Q R S T U N O P Q R S T U
>`.pickRestart({
  A: "[c3,g3,c4] c3!2 [c3,g3,c4] c3!4", B: "[c3,f#3,c4] c3!2 [c3,f#3,c4] c3!4", C: "[c3,f#3,c4] e2 f2 f#2 g2 a2 a#2 b2",
  D: "[d3,a3,d4] d3!2 [d3,a3,d4] d3!4", E: "[d3,a3,d4] d3!2 [d3,a3,d4] d3!3 a3",
  F: "[g3,d4,g4,a#4] g3!2 [g3,d4,g4,a#4]@2 [g3,d4,g4,a#4]!2 d#3", // Gm
  G: "[d#3,a#3,d#4,g4]@2 d#3@2 d#3@2 [d#3,a#3,d#4,g4]@4 [d#3,a#3,d4,g4]@2 [d#3,a#3,d4,g4] ~ f3@2", // D# D#maj7
  H: "[f3,c4,f4,a4]@2 f3@2 f3@2 [f3,c4,f4,a4]@4 [f3,c4,f4,a4]@2 [f3,c4,f4,a4] ~ f3@2", // F
  I: "[f3,c4,f4,a4]@2 f3@2 f3@2 [f3,c4,f4,a4]@4 [f3,c4,f4,a4]@2 [f3,c4,f4,a4] ~ g3@2", // F
  J: "[g3,d4,g4,a#4]@2 g3@2 g3@2 [g3,d4,g4,a#4]@4 [g3,d4,g4,a#4]@2 [g3,d4,g4,a#4] ~ d#3@2", // Gm
  K: "[d#3,a#3,d#4,g4]@2 d#3@2 d#3@2 [d#3,a#3,d#4,g4]@4 [d#3,a#3,d#4,g4]@2 [d#3,a#3,d#4,g4] ~ f3@2", // D#
  L: "[f3,c4,f4,a4]@2 f3@2 f3@2 [f3,c4,f4,a4]@4 [f3,c4,f4,a4]@2 [f3,c4,f4,a4] ~ c3@2", // F
  M: "[f3,c4,f4,a4]@2 f3@2 f3@2 [f3,c4,f4,a4]@4 [f3,c4,f4,a4]@2 [f3,c4,f4,a4] ~ e3@2", // F
  N: "[e3,b3,e4,g4] e3!2 [e3,b3,e4,g4]@2 [e3,b3,e4,g4]!2 c3", // Em
  O: "[c3,g3,c4,e4] c3!2 [c3,g3,c4,e4]@2 [c3,g3,b3,e4] d3!2", // C Cmaj7
  P: "[d3,a3,d4,g4] d3!2 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] d3!2", // Dsus4 D
  Q: "[d3,a3,d4,e4]@2 d3@2 d3@2 [d3,a3,d4,f#4]@4 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] ~ e3@2", // Dsus2 D
  R: "[e3,b3,e4,g4]@2 [e3,b3,e4,g4]@2 [e3,b3,e4,g4]@2 [e3,b3,e4,g4]@4 [e3,b3,e4,g4]@2 [e3,b3,e4,g4] ~ c3@2", // Em
  S: "[c3,g3,c4,e4]!3 [c3,g3,c4,e4]@2 [c3,g3,b3,e4] d3!2", // C Cmaj7
  T: "[d3,a3,d4,g4]@2 d3@2 d3@2 [d3,a3,d4,f#4]@4 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] ~ d3@2", // Dsus4 D
  U: "[d3,a3,d4,e4]@2 d3@2 d3@2 [d3,a3,d4,f#4]@4 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] ~ [d3,a3,d4,f#4] ~", V: "f#2@3 g2",
  W: "[g2,d3,g3] ~@3", // G5
  X: "[~@7 [f3,a#3]@2 [f3,c4] g2!5 [f3,a#3]@2 [f3,c4] g2!2 c4 a#3 d3 [d3,c4,f4]@2 [d3,c4,g4] d3!5 [d3,c4,f4]@2 [d3,c4,g4] d3!5 [f3,a#3]@2 [f3,c4] g2!5 [f3,a#3], ~@10 f3 ~@13]/6", // A#5 F5 A#5 F5 Dm7 Csus2 Dm7 Csus2 …
  Y: "[~ [f3,c4] g2!2 c4 a#3 d3 [d3,c4,f4]@2 [d3,c4,g4] d3!5 [d3,c4,f4]@2 [d3,c4,g4] d3!5 [f3,a#3]@2 [f3,c4] g2!5 [f3,a#3]@2 [f3,c4] g2!2 c4 a#3 d3 [d3,c4,f4]@2 [d3,c4,g4] d3!5 [d3,c4,f4]@2 [d3,c4,g4] d3!5 [f3,a#3]@2 [f3,c4] g2!6, ~@2 f3 ~@15 f3 ~@13]/8", // F5 Dm7 Csus2 Dm7 Csus2 A#5 F5 A#5 …
  Z: "[[f3,a#3] g2!2 [f3,a#3] g2!3 [d3,c4,f4]@2 [c4,g4] d3!6]/2", // A#5 Dm7 C5
  AA: "[[c4,f4] d3!2 [c4,f4] d3!3 [f3,a#3]@2 [f3,c4] g2!6]/2", AB: "[c4,f4] d3!2 [c4,f4] d3!3 d#3",
  AC: "[d#3,a#3,d#4] d#3!2 [d#3,a#3,d#4] d#3!4", AD: "[c4,d#4] d#3!2 [d#3,a#3,d#4] d#3!4",
  AE: "[f3,c4,f4] f3!2 [f3,c4,f4] f3!4", AF: "[f3,c4,f4] f3!2 [f3,c4,f4]!2 f3!3",
  AG: "[d3,a3,d4,g4]@2 d3@2 d3@2 [d3,a3,d4,g4]@4 [d3,a3,d4,g4]@2 [d3,a3,d4,g4] ~ e3@2", // Dsus4
})).s("gm_overdriven_guitar").gain(0.29).pan(0.2)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@7 A B@2 C@2 B@2 C D B@2 C@2 E F G H I F G J B@3 K B@3 A B@2 C D B@2 C D B@2 C D E F G H I F G J L M C N L M C O E F
  G J B@3 K B@3 ~ P ~ P ~ P ~ P ~ P ~ P ~ P ~ P ~ Q@2 C R Q@2 C R Q@2 C R Q S@2 R Q S@2 R Q S@2 R Q S@2 R Q S@2 R Q S@2
  T@2 U@2 V@2 W@2 X@2 U@2 V@2 W@2 Y@2 B@2 K B@3 A B@2 C@2 B@2 C D B@2 C@2 E F G H E F G H E F G H I F G N L M C N L M C
  O L M C N L M C O L M C N L M C O L M C N L M C O
>`.pickRestart({
  A: "~ e1 f1 f#1 g1 a1 a#1 b1", B: "c2!8", C: "d2!8", D: "d2!5 a1 a#1 b1", E: "g2!7 d#3", F: "d#2!7 f2", G: "f2!8",
  H: "f2!7 g2", I: "g2!7 d#2", J: "f2!7 c2", K: "c2 g1 g#1 a1 a#1 b1 c2!2", L: "e2!7 c2", M: "c2!7 d2", N: "d2!7 e2",
  O: "d2!7 a1", P: "g1 ~@3", Q: "g1!8", R: "d2!7 g1", S: "[g1!7 d2@2 d2!6 g1]/2", T: "[d2!7 g1@2 d#2!7]/2",
  U: "[d#2!7 d#2@2 d#2!7]/2", V: "[d#2!7 d#2@2 f2!7]/2", W: "[f2!7 f2@2 f2!7]/2", X: "[f2!7 f2@2 d#2!7]/2",
  Y: "[f2!7 ~ c2!8, ~@7 f2@2 ~@7]/2",
})).s("gm_electric_bass_finger").gain(0.35)

// drums · kick
const kick = s("bd").struct(`<
  ~@7 A B C B@2 C B@2 C@2 B@2 D E@8 F@6 C A C B@2 C@2 B@2 C@2 B@2 F E@8 C B C B C B C B E@5 F@6 A C B C B C B C A C B C
  B C B C A B C B A B C B C B C B A B@39 A B@7 G B C B@2 C B@2 C@2 B@2 D E@15 B H I H I H I H I H I H I H I H I H I H I
  H I H I H I H I H I H I
>`.pickRestart({
  A: "~ x ~@6", B: "x ~@2 x!2 ~@2 x", C: "x ~@2 x!3 ~ x", D: "x!2 ~ x ~ x ~ x", E: "x ~@2 x ~ x ~@2", F: "x!2",
  G: "x!2 ~ x!2 ~@2 x", H: "x ~@2 x ~ x ~ x", I: "x ~@2 x ~@3 x",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A B@11 C B@15 A B@32 D@7 A B@7 A B@7 A B@3 A B@7 A B@39 A B@7 E B@11 C B@48
>`.pickRestart({
  A: "x ~@2 x ~@2 x!2", B: "~ x ~ x", C: "~ x!3", D: "~@2 x ~@2 x!2 ~", E: "x ~ x!2 ~@2 x!2",
})).gain(0.57)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@11 B A@15 ~ A@32 C@7 ~ A@7 ~ A@7 ~ A@3 ~ A@7 ~ A@39 ~ A@19 B A@48>".pickRestart({
  A: "x!8", B: "x!2 ~@6", C: "x!4",
})).gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A ~@27 A ~@39 A ~@7 A ~@7 A ~@3 A ~@7 A ~@39 A ~@7 A ~@60>".pickRestart({
  A: "~@4 x!2 ~@2",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@19 [~ x ~@2] ~@143 [~ x ~@2] ~@48>").gain(0.5)

// drums · high tom
const high_tom = s("ht").struct("<~@7 A ~@27 A ~@39 A ~@7 A ~@7 A ~@3 A ~@7 A ~@39 A ~@7 A ~@60>".pickRestart({
  A: "~ x ~@2",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@6 B ~@7 A ~@3 A ~@3 A ~@7 B ~@3 B ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@27 C ~@7 C ~@28 B ~@6 D ~@12 A ~@6 B
  ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
>`.pickRestart({
  A: "x", B: "~ x", C: "~@3 x", D: "~@2 x ~@2 x ~ x",
})).gain(0.64)

// drums · tambourine
const tambourine = s("tb").struct("<~@95 x ~@7 x ~@108>").gain(0.64)

stack(overdriven_guitar, bass, kick, snare, hihat, mid_tom, open_hat, high_tom, crash, tambourine)

More by Joe Satriani