Strudelify
No Scrubs cover art

1999 · 20

No Scrubs

TLC

KeyG♯ minorTempo92 bpm
0:00/0:00
// No Scrubs — TLC
// 92 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(92/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · acoustic guitar steel · "Remixed"
const acoustic_guitar_steel = note(`<
  ~ A B A C A B A C A B A C A B D E A B A C A B A C A B D B A B D C ~@12 A B D B A B D C A B D B A B D C A B D B A B D C
>`.pickRestart({
  A: "~@3 e4@4 ~ g#2 ~@2 d#4@4 ~, c#3@7 ~@9, ~ g#3@6 ~@2 g#3@6 ~, ~@2 b3@5 ~@3 b3@5 ~",
  B: "~@3 c#4@4 ~ g#2 ~@2 d#4@4 ~, d#2@7 ~@9, ~ g3@6 ~@2 g#3@6 ~, ~@2 a#3@5 ~@3 b3@5 ~",
  C: "~@3 c#4@4 f#4 ~ e4 d#4 c#4 d#4@4, d#2@7 ~@9, ~ g3@6 ~@9, ~@2 a#3@5 ~@9",
  D: "~@3 e4@4 ~ g#2 ~@2 d#4@3 ~@2, c#3@7 ~@9, ~ g#3@6 ~@2 g#3@3 ~@4, ~@2 b3@5 ~@3 b3@3 ~@3",
  E: "~@3 c#4@4 ~ g#2 ~@2 d#4 d#4@4, d#2@7 ~@9, ~ g3@6 ~@2 g#3@6 ~, ~@2 a#3@5 ~@3 b3@5 ~",
})).s("gm_acoustic_guitar_steel").gain(0.64)

// chords · string ensemble 2 · "Remixed"
const string_ensemble_2 = note(`<
  ~@13 A B A B A B A B ~@8 A B A B A B A B ~@8 A B A B A C D C D C D C D C D C D C D C D C D C
>`.pickRestart({
  A: "[c#3,c#4,e4]@6 ~ [g#3,b3,d#4] ~@8", B: "[d#3,a#3,c#4]@6 ~ [g#3,b3,d#4] ~@8",
  C: "[d#3,a#3]@4 ~@3 [g#3,b3,d#4] ~@8, c#4@3 ~@5", D: "[c#3,c#4]@7 [g#3,b3,d#4] ~@8, e4 ~@3",
})).s("gm_string_ensemble_2").gain(0.64)

// drums · kick
const kick = s("bd").struct(`<
  ~@9 A B A C A B A D A B A D A B A D A B A D A B A D A B A D A B A D A B A C A B A D A B A D A B A D A B A D A B A C
  ~@4
>`.pickRestart({
  A: "x ~ x ~@4 x ~@2 x ~@5", B: "x ~ x ~@4 x ~@2 x ~@4 x", C: "x ~ x ~@4 x ~@3 x ~@4",
  D: "x ~ x ~@4 x ~@2 x ~@2 x ~@2",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct(`<
  ~@9 A@3 B A@3 C A@3 C A@3 C A@3 C A@3 C A@3 C A@3 C A@3 B A@3 C A@3 C A@3 C A@3 C A@3 B ~@4
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@2 x ~@3 x!2",
})).gain(0.8)

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

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

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A@4 B@2 C B@3 C B@4 D B@3 D B@3 D B@3 D B@3 D B@3 D B@3 D B@2 C B@4 D B@3 D B@3 D B@3 D B@2 C B ~@4
>`.pickRestart({
  A: "x!2", B: "x ~ x ~@4 x!2 ~ x ~@5", C: "x ~ x ~@4 x!2 ~ x ~@4 x", D: "x ~ x ~@4 x!2 ~ x ~@2 x ~@2",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct(`<
  ~@5 A@11 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@7 B A@3 B A@3 B A@3 B A@4 ~@4
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2",
})).gain(0.8)

stack(acoustic_guitar_steel, string_ensemble_2, kick, snare, hihat, crash, shaker, rim)

More by TLC