Strudelify
Tuff Enuff cover art

1986 · Tuff Enuff

Tuff Enuff

The Fabulous Thunderbirds

KeyB majorTempo117 bpm
0:00/0:00
// Tuff Enuff — The Fabulous Thunderbirds
// 117 bpm, 4/4, key B major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 104 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117/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 · fretless bass · "BASS"
const bass = note(`<
  A B@4 C D E@2 C D E@2 C D E@2 F G H I F J H J C D E@2 C D E@2 F G H I F J H J K L M@2 N O E@2 C D E@2 C D E@2 F G H I
  F J H J C D E@2 C D E@2 N O E@2 F G H I F J H J P Q R S P T R T P Q R S P T R T U@3
>`.pickRestart({
  A: "~@10 d2@3 e2@3", B: "[b1@26 d2@3 e2@3]/2", C: "b1@6 e1@2 f#1@2 a1@2 f#1 ~ a1@2",
  D: "b1@3 e1 f#1 a1 f#1 a1, a1 ~@15", E: "b1@3 e1 f#1 a1 f#1 a1", F: "b1@9 ~ d2@3 e2@3", G: "b1@5 ~ b1@2 d2@4 e2@4",
  H: "b1@9 ~ d2@2 ~ e2@3", I: "b1@5 ~ b1@2 d2@4 e2@3 ~", J: "b1@5 ~ b1@2 d2@3 ~ e2@3 ~", K: "d2@13 ~@3", L: "e2@15 ~",
  M: "[b1@15 ~]/2", N: "d2@15 ~", O: "e2", P: "d2@9 ~ f1@3 g1@3", Q: "d2@5 ~ d2@2 f1@4 g1@4", R: "d2@9 ~ f1@2 ~ g1@3",
  S: "d2@5 ~ d2@2 f1@4 g1@3 ~", T: "d2@5 ~ d2@2 f1@3 ~ g1@3 ~", U: "[b1@11 ~@5]/3",
})).s("gm_fretless_bass").gain(0.46)

// chords · piano
const piano = note(`<
  A B@4 C D E F@9 G H I J I K I J F@8 G H I J I K I J ~@8 F@8 G H I J I K I J F@8 ~@4 G H I J I K I J L M N O N P N O L
  M N O N P N O Q ~@2
>`.pickRestart({
  A: "~@10 [d3,d4,f#4]@2 ~ [e3,e4,g#4]@3", B: "[[b2,b3,d#4]@25 ~ [d3,d4,f#4]@3 [e3,e4,g#4]@3]/2",
  C: "[b2,b3,d#4]@5 ~ [b2,b3,d#4]@2 ~@2 [b2,b3,d#4]@2 ~ [b3,d#4] ~@2, ~@13 b2@2 ~", // B
  D: "[b2,b3,d#4]@4 ~@2 [b2,b3]@2 ~@2 [b2,b3]@2 ~ [b2,b3]@2 ~, ~@6 d#4 ~@3 d#4 ~@2 d#4 ~@2", // B
  E: "[b2,b3,d#4]@4 ~@2 [b2,b3]@2 ~@2 [b2,b3,d#4]@2 ~ [b3,d#4]@2 ~, ~@6 d#4 ~@6 b2 ~@2", // B
  F: "[b2,b3,d#4]@4 ~@2 [b2,b3,d#4]@2 ~@2 [b2,b3,d#4]@2 ~ [b2,b3,d#4]@2 ~", // B
  G: "[b2,b3,d#4]@8 ~@2 [d3,d4,f#4]@2 ~ [e3,e4,g#4]@2 ~", // B D E
  H: "[b2,b3]@5 ~ [b2,b3]@2 [d3,d4,f#4]@3 ~ [e3,e4,g#4]@3 ~, d#4@3 ~@5", // B D E
  I: "[b2,b3,d#4]@9 ~ [d3,d4,f#4]@2 ~ [e3,e4,g#4]@3", // B D E
  J: "[b2,b3,d#4]@5 ~ [b2,b3,d#4]@2 [d3,d4,f#4]@3 ~ [e3,e4,g#4]@3 ~", // B D E
  K: "[b2,b3,d#4]@5 ~ [b2,b3,d#4]@2 [d3,d4,f#4]@4 [e3,e4,g#4]@3 ~", // B D E
  L: "[d3,d4,f#4]@8 ~@2 [f3,f4,a4]@2 ~ [g3,g4,b4]@2 ~", // D F G
  M: "[d3,d4]@5 ~ [d3,d4]@2 [f3,f4,a4]@3 ~ [g3,g4,b4]@3 ~, f#4@3 ~@5", N: "[d3,d4,f#4]@9 ~ [f3,f4,a4]@2 ~ [g3,g4,b4]@3",
  O: "[d3,d4,f#4]@5 ~ [d3,d4,f#4]@2 [f3,f4,a4]@3 ~ [g3,g4,b4]@3 ~", // D F G
  P: "[d3,d4,f#4]@5 ~ [d3,d4,f#4]@2 [f3,f4,a4]@4 [g3,g4,b4]@3 ~", Q: "[b2,f#3,b3]",
})).s("gm_piano").gain(0.36)

// chords · rock organ · "ORGAN"
const rock_organ = note(`<
  ~ A@4 B@2 C D@2 B D E F G D H A@4 ~@4 D B D E F G D H A@4 ~@12 D B D E F G D H A@4 ~@4 D B D E F G D H ~@4 A@4 ~@4 I@4
  ~@4 I@4 ~@7
>`.pickRestart({
  A: "[b4,b5,d#6,f#6]/4", B: "~@2 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~",
  C: "~@2 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@3 [b4,b5] ~@2 b4 [b5,d#6] ~", // B
  D: "~@2 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@2 [b4,b5,d#6] ~@2", // B
  E: "~@2 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@2 [b4,d#6] ~@2", // B
  F: "~@2 [b4,b5,d#6] ~@3 [b4,d#6] ~@3 [b4,b5,d#6] ~@2 [b4,d#6] ~@2", // B
  G: "~@2 [b4,d#6] ~@3 [b4,b5,d#6] ~@3 [b4,b5,d#6] ~@2 [b4,b5,d#6] ~@2", // B
  H: "~@2 [b4,b5,d#6] ~@3 [b4,b5] ~@3 [b4,d#6] ~@2 [b4,d#6] ~@2", I: "[d5,d6,f#6,a6]/4",
})).s("gm_rock_organ").gain(0.36)

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

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

// drums · hihat
const hihat = s("hh").struct(`<
  A B C D E@2 F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H A I J K L K M N E F G H E F G H E F
  G H E F G H E F G H E F G H L K M N E F G H E F G H E F G H E F G H E F G H E F G H ~@3
>`.pickRestart({
  A: "x!4", B: "~@2 x!2 ~@2 x!3 ~ x!2 ~@2 x ~", C: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x!2", D: "x ~ x ~ x ~ x!3 ~ x ~ x ~@3",
  E: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", F: "x ~ x ~ x ~ x!2 ~@2 x ~ x ~@3", G: "x!4 ~ x!3", H: "x!8",
  I: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", J: "x!3 ~ x!4", K: "x ~ x ~ x ~@3 x ~ x ~ x ~ x!2", L: "x!3 ~ x ~ x!2",
  M: "x!3 ~ x!3 ~", N: "x ~ x!3 ~ x!2",
})).gain(0.36)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A ~@4 B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D E ~ F@2 G F H I ~ B C D ~ B C D ~ B C D
  ~ B C D ~ B C D ~ B C D G F H I ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~@3
>`.pickRestart({
  A: "~ x ~@2", B: "~ x", C: "~@7 x!2 ~@7", D: "~@7 x ~@8", E: "~ x ~ x ~ x ~ x", F: "~@3 x ~@4", G: "~@3 x ~ x ~@2",
  H: "~@3 x ~@3 x", I: "~ x ~@3 x ~@2",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 A ~ A ~@11 B ~ C ~ C ~ C ~@5 B ~@5 C ~@3 C ~@2 D ~@6 C ~@3 C ~ C ~ C ~ B ~ E ~@3 B ~@11 B ~@5 F ~ G ~@3 B ~ C ~ C
  ~@6 D E ~@3
>`.pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@14 x!2", D: "x", E: "~@6 x!2", F: "~@11 x!2 ~ x ~", G: "~@12 x!4",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~@2 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@5
>`.pickRestart({
  A: "~@7 x",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@2 A ~ A ~@11 B ~ C ~@3 D ~ E ~@7 F ~ C ~@5 G ~@3 H ~@13 B ~@5 I ~@11 J ~@5 K ~ A ~@3 I ~@3 B ~ F ~ E ~ L ~ M ~@3
>`.pickRestart({
  A: "~@8 x!4 ~@4", B: "~@12 x!2 ~@2", C: "~@3 x", D: "~@10 x!3 ~@3", E: "~@10 x ~@2 x ~@2", F: "~@14 x!2",
  G: "~@12 x!4", H: "~@8 x ~@2 x ~@2 x ~", I: "~@8 x ~@2 x!2 ~@3", J: "~@5 x ~@2 x ~@2 x!2 ~@3", K: "~@5 x ~@2 x ~@7",
  L: "~@7 x", M: "~@4 x!2 ~@2",
})).gain(0.46)

// drums · crash
const crash = s("cr").struct(`<
  A B A B A B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B@3 ~ B@3 ~ B ~ C ~ B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B@3
  ~ B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@2
>`.pickRestart({
  A: "~@5 x ~@2", B: "x", C: "~ x ~@2",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@2 A ~ A ~@13 B ~@3 C ~@11 D ~ E ~@3 F ~@3 G ~@19 G ~@11 H ~@5 H ~ I ~@3 G ~@5 J ~@3 K ~@5
>`.pickRestart({
  A: "~@4 x!4 ~@8", B: "~@13 x ~@2", C: "~@8 x!2 ~@6", D: "~@10 x!2 ~ x ~@2", E: "~@14 x!2", F: "~@8 x!4 ~@4",
  G: "~@2 x ~@2 x ~@10", H: "~ x ~@6", I: "~@2 x!6 ~@8", J: "~@12 x!2 ~@2", K: "~@12 x!2 ~ x",
})).gain(0.46)

stack(bass, piano, rock_organ, kick, snare, hihat, hihat_soft, low_tom, open_hat, mid_tom, crash, high_tom)

More by The Fabulous Thunderbirds