Strudelify

Just Got Paid

ZZ Top

KeyE minorTempo100 bpm
0:00/0:00
// Just Got Paid — ZZ Top
// 100 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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.

// bass · electric bass finger · "bass"
const bass = note(`<
  ~ A B C@2 ~@2 D E F G H I F G H I F G J K F G H I F G H I F G J K F G L@3 M@9 N@4 H@8 O@4 ~@2 D E F G H I F G H I F G
  J K F G P Q P R S T@2 ~
>`.pickRestart({
  A: "~@4 d2 e2 ~ g2 ~ e2 ~ d2 ~ e2 d3 e2", B: "e3@3 ~ d2 e2 ~ g2 ~ e2 ~ d2 ~ e2 d2 e1", C: "[a2@7 ~]/2", D: "e2!8",
  E: "e2 ~ e2 ~ e2@2 e2@2 e2@2 e2@2 e2@2 e2@2", F: "e2@2 e2@2 e2@2 e2 ~ e2 ~ e2 ~ e2@2 e2@2",
  G: "e2@2 e2@2 e2 ~ e2@2 e2@2 e2@2 e2@2 e2@2", H: "e2!16", I: "d2!16", J: "g1@8 g1@7 ~", K: "a1!2",
  L: "[e2@2 e2@2 e2 ~ e2@2 ~@2 a2@36 ~@2]/3", M: "a1!4 e2!4", N: "d2!4 a1!4", O: "b1 ~@7", P: "d2!12 g1@3 g1",
  Q: "d2!11 ~ g1@3 g1", R: "d2!8 ~@8", S: "d2!8 e3!5 d3 b2 ~", T: "[d2!8 e2@24]/2",
})).s("gm_electric_bass_finger").gain(0.51)

// other · distortion guitar · "chop guitar"
const distortion_guitar = note(`<
  A B@2 C@2 D@6 E F D@2 E F D@2 G H D@2 E F D@2 E F D@2 G H D@2 I@3 J@9 K@4 L@8 ~@4 D@6 E F D@2 E F D@2 G H D@2 M N@2
  O@2 P@3
>`.pickRestart({
  A: "~@4 [e2,d3] e3 e2 g3 e2 e3 e2 d3 e2 e3 d3 e2", B: "e3@3 ~ [e2,d3] e3 e2 g3 e2 e3 e2 d3 e2 e3 d3 e2",
  C: "[[a3,a4]@29 ~@3]/2", D: "[e2,d3] e3 e2 g3 e2 e3 e2 d3 e2 e3 d3 e2 e3@3 ~",
  E: "~ [b2,e3] ~@2 [b2,e3] ~@4 [b2,e3] ~@2 [b2,e3] ~@3", F: "~ [a2,d3] ~@2 [a2,d3] ~@2 c2 d2 [a2,d3] ~@2 [a2,d3] ~@3",
  G: "[d3,g3]@7 ~", H: "[e3,a3]@15 ~", I: "[[e2,d3] e3 e2 g3 e2 e3 e2 d3 e2 ~ [a3,a4]@32 ~@6]/3",
  J: "[e3,a3]@2 ~@8 [b3,e4] ~ [b3,e4]@3 ~", K: "[a2,d3]@2 ~@8 [e3,a3] ~ [e3,a3]@3 ~",
  L: "[[b3,e4]@2 ~@7 [b3,e4]!2 ~ [b3,e4] ~ [b3,e4] [b3,e4]@2 ~@8 [c4,f4]@3 [d4,g4]@2 [d4,g4] [b3,e4]@2 ~@8 [b3,e4]!2 ~ [b3,e4] ~ [b3,e4] [b3,e4]@2 ~@8 [c4,f4]@3 [d4,g4]@2 [d4,g4] [b3,e4]@2 ~@8 [b3,e4]!2 ~ [b3,e4] ~ [b3,e4] [b3,e4]@2 ~@8 [c4,f4]@3 [d4,g4]@2 [d4,g4] [b3,e4]@2 ~@8 [b3,e4]!2 ~ [b3,e4] ~ [b3,e4] [b3,e4]@2 ~@15]/8", // E5 F5 G5 E5 F5 G5 E5 F5 …
  M: "d3!9 e3 d3 e3 g3@2 ~@2", N: "d3!9 e3 d3 e3 g3@2 g5@2", O: "d3!9 ~@7",
  P: "[d3!8 [e3,e4,e5,e6]@29 ~@11, ~@8 d3 ~@39]/3", // E
})).s("gm_distortion_guitar").gain(0.23)

// other · overdriven guitar · "slide guitar"
const overdriven_guitar = note(`<
  ~@5 A B ~ C D E ~@5 F G@2 ~@2 H I J ~@9 K L ~ M N O@2 P Q R S T U V W X Y Z ~@8 AA AB AC AD ~ AE ~ C D E ~@5 F G@2 ~@2
  H I AF@3 AG@3 ~@2
>`.pickRestart({
  A: "~@14 g4!2", B: "g4", C: "~@10 e5 ~ g4@3 ~", D: "~@10 a4 g#4 a4@3 ~", E: "~@5 d4@3", F: "~@14 e5 ~",
  G: "[g4@2 ~@5 d4@7 ~@2]/2", H: "~@10 e4 ~ d4@3 ~", I: "g4@7 ~@3 e4 ~ d4@3 ~", J: "e4@15 ~", K: "~@10 e4 d4 e4@3 ~",
  L: "~@10 a4 g4 a4@3 ~", M: "b4@2 e4 g4@2 ~ d4@2 g4 ~ g4 ~ e4@2 ~@2", N: "g#4@15 ~",
  O: "[~@10 e5@2 a#4@2 g4@8 ~@2 g4 e4 g4 ~ g4@4]/2", P: "g4@2 e4 g4@2 e4 g4@2 e4 g4@2 e4 ~@4", Q: "a4@8 g4@2 d4 d4@5",
  R: "a4@6 d4!2 e4 ~ e4@2 g4@4", S: "a4@2 e4 a4@2 e4 a4@2 e4 ~ a4@2 e4@3 ~", T: "~ b4 ~ e5 ~ e5 b4 e4 g4@2 g4@2 e4@3 ~",
  U: "a4@2 e4 b4@2 e4 ~ e4@3 e4@2 f#4@4", V: "~ b4 ~ e5 ~ e5 b4 e4 a5@8", W: "a4 b4 ~ g4 ~ g4 d4 e4 g4 ~ f4 ~ e4@3 ~",
  X: "a4@2 g4 a4 ~ g4!2 ~ g#4@8", Y: "d4 e4 g4 d4 e4 g4 d4 e4 g4@2 g4@2 g4 d4 e4 ~", Z: "a4",
  AA: "d#5@2 b4 d#5@2 b4 d#5@2 b4 ~ d#5@2 b4@3 ~", AB: "d#5 f#5 ~ b5 ~ b5 f#5 b4 c#5@8",
  AC: "f#5@4 b5 f#5 ~@2 b4 d5@2 d5@2 b4@2 ~", AD: "c#6!4", AE: "~@10 b4!2 b4@4", AF: "[g3,d4]@9 e4@2 e4 [b3,g4]@4",
  AG: "[g3,d4]@9 ~@7", // G5
})).s("gm_overdriven_guitar").gain(0.33)

// drums · kick
const kick = s("bd").struct("<~@7 A@11 B A@11 B A@4 C ~@2 D@13 B ~@11 B@2 A@11 B A@7 D@3 ~@2>".pickRestart({
  A: "x ~@7 x ~@2 x ~@4", B: "x", C: "x ~@4 x ~@2", D: "x!2",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A ~@3 B C@4 D@2 C@2 D@2 C E F@2 C@2 D@2 C@2 D@2 C E F@2 C@2 G ~@2 D@21 H@5 I C@4 D@2 C@2 D@2 C E F@2 C@2 J@3 K L@2
  ~@2
>`.pickRestart({
  A: "~@4 x!2 ~ x ~ x ~ x ~ x!3", B: "~@7 x!7 ~@2", C: "~@4 x ~@2 x ~ x ~@2 x ~@3", D: "~ x ~ x",
  E: "~@4 x ~@2 x!7 ~@2", F: "~@4 x ~@4 x ~@2 x ~@3", G: "~@4 x ~@2 x!4 ~@5", H: "x", I: "x ~@6 x",
  J: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@3", K: "~ x ~@2 x ~@2 x!5 ~@4", L: "~ x ~@2 x ~@2 x ~@8",
})).gain(0.41)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@7 A@4 ~@2 A@2 ~@2 A ~ A@4 ~@2 A@2 ~@2 A ~ A@4 ~@30 A@4 ~@2 A@2 ~@2 A ~ A@10 ~@2
>`.pickRestart({
  A: "~ x",
})).gain(0.26)

// drums · hihat
const hihat = s("hh").struct("<~@3 A ~@2 B C@28 D E@2 C@21 A@6 C@19 F@3 ~@2>".pickRestart({
  A: "x", B: "~@2 x!2", C: "x!8", D: "x!7 ~", E: "x!4", F: "x!4 ~@4",
})).gain(0.41)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@7 A@28 B ~@2 A@21 ~@6 A@19 C@3 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~ x ~@6", C: "~ x ~ x ~ x ~ x ~@8",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@84 [~@12 x!4] ~@4>").gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@6 A ~@11 A ~@11 A ~@45 A ~@12>".pickRestart({
  A: "~@14 x!2",
})).gain(0.41)

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

stack(bass, distortion_guitar, overdriven_guitar, kick, snare, snare_soft, hihat, hihat_soft, low_tom, mid_tom, crash)

More by ZZ Top