Strudelify

Rough Boy

ZZ Top

KeyE majorTempo86 bpm
0:00/0:00
// Rough Boy — ZZ Top
// 86 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 1 "+SLOWSTRNG" electric bass finger (copy of ch 3 "SWEEP PAD" pad sweep)
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(86/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 · "FINGERDBAS"
const bass = note(`<
  A B A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE@2 V@2 AF@2 AG AH AI AJ V@2 AK AF I AL AI@3 AD
  AE@2 V@2 AF AM AN I AE@2 AO V AF AP AQ AR AS@3 ~
>`.pickRestart({
  A: "a1@3 e1@5", B: "f#2@3 c#2@4 ~", C: "a1@2 a1 ~ a1@2 a1 ~ a1@2 a1@2 a1@2 a1 ~",
  D: "a1 ~ a1 ~ a1@2 a1 ~ a1@2 a1 ~ a1 ~ a1 ~", E: "f#1@2 f#1@2 f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1@2 f#1@2",
  F: "f#1 ~ f#1 ~ f#1@2 f#1 ~ f#1@2 f#1 ~ f#1 ~ f#1 ~", G: "b1 ~ b1 ~ b1@2 b1@2 b1@2 b1 ~ b1@2 b1 ~",
  H: "b1@2 b1@2 b1@2 b1 ~ b1@2 b1 ~ b1 ~ b1 ~", I: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~",
  J: "e1@2 e1 ~ e1 ~ e1 ~ e1@2 e1 ~ e1 ~ g#1@2", K: "a1@2 a1 ~ a1@2 a1 ~ a1@2 a1 ~ a1@2 a1 ~",
  L: "a1@2 a1 ~ a1 ~ a1@2 a1@2 a1 ~ a1@2 a1@2", M: "f#1@2 f#1 ~ f#1@2 f#1 ~ f#1@2 f#1 ~ f#1 ~ f#1 ~",
  N: "f#1 ~ f#1 ~ f#1@2 f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~", O: "b1@2 b1@2 b1@2 b1 ~ b1 ~ b1 ~ b1@2 b1@2",
  P: "b1@2 b1 ~ b1@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~", Q: "e1@2 e1 ~ e1@2 e1 ~ e1 ~ e1 ~ e1 ~ e1@2", R: "e1@7 ~",
  S: "a1 ~ a1 ~ a1@2 a1@2 a1 ~ a1@2 a1@2 a1 ~", T: "a1@2 a1 ~ a1@2 a1 ~ a1@2 a1@2 a1 ~ a1 ~",
  U: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1@2 f#1 ~ f#1 ~", V: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~",
  W: "b1@2 b1 ~ b1 ~ b1@2 b1@2 b1@2 b1 ~ b1@2", X: "b1@2 b1@2 b1 ~ b1@2 b1@2 b1@2 b1 ~ b1 ~",
  Y: "e1 ~ e1@2 e1 ~ e1@2 e1 ~ e1@2 e1 ~ e1 ~", Z: "e1 ~ e1 ~ e1@2 e1 ~ e1@2 e1@2 e1@2 e1 ~",
  AA: "a1 ~ a1 ~ a1 ~ a1@2 a1 ~ a1@2 a1@2 a1 ~", AB: "a1@2 a1 ~ a1@2 a1@2 a1@2 a1@2 a1@2 a1@2",
  AC: "a1 ~ a1 ~ a1@2 a1 ~ a1 ~ a1 ~ a1 ~ a1@2", AD: "e1@15 ~", AE: "c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~",
  AF: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~", AG: "e1@2 e1@2 e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~",
  AH: "e1 ~ e1@2 e1@2 e1@9 ~", AI: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  AJ: "a1 ~ a1 ~ a1@2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", AK: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2 b1 ~",
  AL: "e1 ~ e1 ~ e1 ~ e1@2 e1 ~ e1 ~ e1 ~ e1 ~", AM: "b1 ~ b1 ~ b1@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  AN: "e1@2 e1 ~ e1 ~ e1 ~ e1@2 e1 ~ e1 ~ e1 ~", AO: "f#1@2 f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~",
  AP: "b1@2 b1 ~ b1 ~ b1 ~ b1@2 b1 ~ b1 ~ b1 ~", AQ: "e1@2 e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~",
  AR: "e1 ~ e1 ~ e1@3 ~ e1 ~ e1 ~ e1 ~ e1 ~", AS: "[a1@19 ~@5]/3",
})).s("gm_electric_bass_finger").gain(0.59)

// chords · pad sweep · "SWEEP PAD"
const pad_sweep = note("<A@7 B@3 C@6 D@2 E@8 F@6 G@2 H@4 I@2 J@3 K@8 ~ L@6 M N O@2 P@4 Q@2 R@4>".pickRestart({
  A: "[a4@6 g#4@9 a4@6 ~ g#4@10 a4@6 g#4@9 a4@6 ~ g#4@10 a4@5 g#4@10 ~ a4@6 g#4@9 ~ a4@6 g#4@10, e4]/7",
  B: "[a4@6 g#4@9 ~@6 a4@26 ~, ~@15 d4@31 ~@2, ~@18 f#4@29 ~]/3",
  C: "[~@15 a4@8 ~ g#4@8 a4@6 g#4@10 a4@6 g#4@10 a4@6 g#4@10 a4@6 g#4@9 ~, e4@95 ~, ~ g#4@14 ~@81, ~@5 b4@26 ~@65]/6",
  D: "[~@3 a4@13, d4@31 ~, ~ f#4@30 ~]/2",
  E: "[~@5 b4@10 ~@23 g#4@10 a4@6 g#4@10 a4@6 g#4@10 a4@6 g#4@9 ~@7 a4@26, e4@15 e4@79 ~ d4@31 ~@2, ~ g#4@14 ~@83 f#4@30]/8",
  F: "[~@15 a4@7 ~ g#4@8 ~ a4@6 g#4@10 a4@6 g#4@9 a4@6 g#4@10 ~@17, e4@95 ~, ~ g#4@7 ~@40, ~@5 b4@26 ~@65]/6",
  G: "[~@3 g#4@13, c#4@31 ~, ~ e4@15]/2", H: "[~@32 d4@30 ~ e4, c#4 ~, ~ f#4@31, ~@3 a4@29]/4",
  I: "[~@5 b4@10 ~@17, e4, ~ g#4@7 ~@8]/2", J: "[a4@6 g#4@9 a4@6 g#4@10 ~ a4@6 g#4@10, e4]/3",
  K: "[a4@6 g#4@9 ~@6 a4@26 ~@17 a4@8 g#4@8 a4@5 g#4@10 ~ a4@5 g#4@10 ~ a4@6 g#4@10, ~@15 d4@31 ~ e4@81, ~@9 f#4@15 ~ g#4@7 ~@32, ~@53 b4@27 ~@48]/8",
  L: "[~@5 g#4@26 ~@32 d4@16 ~@6 a4@10 ~, c#4@31 c#4@25 ~@2 c#4@6 ~@17 d4@13 ~@2, ~@2 e4@29 ~@3 f#4@24 ~@2 f#4@22 ~@2 f#4@12, ~@37 a4@46 ~@13]/6",
  M: "~@6 b4@9 ~, e4, ~@2 g#4@13 ~", N: "a4@8 g#4@7 ~, [e4,b4]@15 ~", O: "[~@3 g#4@13, c#4@31 ~, ~@2 e4@29 ~]/2",
  P: "[~@27 c#4@3 f#4@2 ~@6 a4@26, c#4@27 ~@5 d4@31 ~, ~@3 f#4@25 ~@6 f#4@30, ~@3 a4@14 ~@15]/4",
  Q: "[~@15 a4@8 ~ g#4@8, e4@31 ~, ~ g#4@7 ~@8, ~@5 b4@25 ~@2]/2", R: "[a4@15 ~]/4",
})).s("gm_pad_sweep").gain(0.44)

// chords · pad halo · "HALO PAD"
const pad_halo = note("<~@19 A B ~@10 C ~@7 D ~@11 E ~@20>".pickRestart({
  A: "~@6 e5@9 ~, ~ a4@7, ~@3 b4@12 ~", B: "a4@3 ~@5", C: "~@6 e5@9 ~, ~@2 a4@13 ~, ~@4 b4@11 ~",
  D: "~@3 e5@5, ~ a4@7, ~ b4@3", E: "~@6 e5@8 ~ c#4, ~@2 a4@13 ~, ~@2 b4@5 ~",
})).s("gm_pad_halo").gain(0.54)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@5 A ~ A ~@5 A ~ A ~ A ~ B ~@7 C ~@3 D ~@3 A ~ A ~@9 C ~@3 D ~@15 C ~@4
>`.pickRestart({
  A: "~@13 x ~@2", B: "x ~@14 x", C: "~@14 x!2", D: "x ~@2 x",
})).gain(0.45)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 A ~@7 B ~@19 B ~@19 B ~@4>".pickRestart({
  A: "~@7 x", B: "~@13 x ~@2",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct("<~@19 [~@13 x ~@2] ~@52>").gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@20 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3>".pickRestart({
  A: "x",
})).gain(0.35)

stack(bass, pad_sweep, pad_halo, kick, snare, low_tom, hihat, mid_tom, high_tom, crash)

More by ZZ Top