aditazzz

Videos Rage Against the Machine Learning

Rage Against the Machine Learning

They scraped my blog from 2009. My terrible poems. My cat's full name. I never clicked accept, and the model kept learning anyway. A 90s rap-rock protest anthem for everyone whose whole personality is now a vector. ✊

Watch on YouTube · 2:47 · video by Claude Opus 5.5 ·

The code behind it

Every frame of this video is drawn by a Python program. This is the heart of it, from scene.py, line 1384.

songs/rage-against-the-machine-learning/scene.py
def render_frame(t, W=1920, H=1080, fi=0):
    vert = H > W; ts = min(W, H) / 1080; clean = C.STATE["clean"]
    cam = cam_at(t, vert); sx, sy = shake(t, W, H)
    M = cam.M(W, H, sx, sy)
    img = draw_wall(W, H, M)
    old_tag(img, M, W, H)                                                                              # an old, faded tag
    for f in ALL:
        if f["t"] - 0.16 > t: break
        draw_flyer(img, f, M, t, W, H)
    chart_dyn(img, t, M, W, H)
    heads, s = None, None
    if t >= T_SPRAY0: heads, s = spray(img, t, M, W, H)
    if T_OPTSTAMP - 0.06 <= t < 31.0:                                                   # OPT OUT stamped onto the cookie notice
        sl = slam(t, T_OPTSTAMP)
        if sl: world_strip(img, M, "OPT OUT", "red", *notice_pt(0.52, 0.70), 0.20, -0.10, sl[0], sl[1])
    img *= light(W, H, t)
    ck = chorus_k(t)
    if ck:
        k, c0, c1 = ck; w = sstep(c0, c0 + 0.25, t) * (1 - sstep(c1 - 0.35, c1, t))
        tint = np.array([0.66, 0.36, 0.33], np.float32) if k != 1 else np.array([0.72, 0.45, 0.30], np.float32)
        img *= 1 - w * (1 - tint) * (1 - 0.35 * bp(t, 5))
    # camera motion blur (whips between flyers)
    Mp = cam_at(t - 1 / 30, vert).M(W, H, *shake(t - 1 / 30, W, H))
    img = motion_blur(img, M, Mp, W, H)
    crowd(img, t, W, H, crowd_amt(t))
    if heads: spray_can(img, t, M, heads[-1], s, W, H)
    for f in VERSE:
        if -0.05 < t - f["t"] < 0.8: brush_layer(img, f, t, M, W, H)
    if 23.5 < t < 25.75:                                                               # the joke: the reject link is size two
        o = sstep(23.5, 23.8, t) * (1 - sstep(25.55, 25.75, t))
        rx_, ry_ = notice_pt(0.875, 0.865)
        if not vert:
            world_text(img, M, "the reject button", MARKER, rx_ - 0.20, ry_ + 0.034, 0.027, RED, o)
            a = to_screen(M, rx_ - 0.105, ry_ + 0.024); b = to_screen(M, rx_ - 0.022, ry_ + 0.006)
        else:
            world_text(img, M, "the reject button", MARKER, rx_ - 0.095, ry_ + 0.062, 0.024, RED, o)
            a = to_screen(M, rx_ - 0.05, ry_ + 0.045); b = to_screen(M, rx_ - 0.008, ry_ + 0.010)
        cv2.arrowedLine(img, (int(a[0]), int(a[1])), (int(b[0]), int(b[1])), (RED * o + 0).tolist(), max(2, int(5 * ts)), cv2.LINE_AA, tipLength=0.3)
    if not clean:
        chant(img, t, W, H); ransom(img, t, W, H); draw_hooks(img, t, W, H)
        lk = max(win(t, S["V1"]["s"] - 0.3, S["CH1"]["s"] - 0.2, 0.3, 0.2), win(t, S["V2"]["s"] - 0.3, S["CH2"]["s"] - 0.2, 0.3, 0.2))
        if lk > 0.01:
            bk = (W, H, "band")
            if bk not in _PPL:
                yy = np.arange(H, dtype=np.float32); yc = H * (0.70 if vert else 0.835)
                _PPL[bk] = np.exp(-((yy - yc) / (H * (0.055 if vert else 0.085))) ** 2)[:, None, None].astype(np.float32)
            img *= 1 - 0.58 * lk * _PPL[bk]
        C.overlay_lyrics(img, t, W, H, TM, active=hexc('ffb36b'), glow=RED, skip=lambda L: L["sec"] not in ("V1", "V2"))
        C.subscribe_pill(img, t, W, H, S["V2"]["s"] + 0.3, 5.5)
        C.end_screen(img, t, W, H, T_END, DUR - T_END, "Unsubscribe from them.", sub_line="Subscribe here instead: a new song every week",
                     title="Rage Against the Machine Learning", accent=RED)
    gl = 0.0
    if 98.6 < t < 101.3: gl += 0.25 * sstep(98.6, 99.2, t) + 0.6 * sstep(100.6, 101.2, t)
    if 0 <= t - LINES[32]["wt"][3] < 0.25: gl += 0.5
    return C.finish(img, t, fi, DUR, flash=flash_at(t), flash_col=np.array([1.0, 0.92, 0.85], np.float32), glitch_amt=gl, ca=0.0016)

Read all 1,467 lines on GitHub. If you use it, credit aditazzz and link the video.

What you see

A night wall gets wheat-pasted with photocopied evidence of a life scraped into a training set (the 2009 blog stamped SCRAPED, a router poem marked "awful", the cat's full name circled, Clause 62 in size-two font), then the boardroom memo that followed (efficiency gains, 10,000 tally marks, a bunker for sale, an invoice stamped UNPAID). Every hook is a crowd chant slammed onto torn paper, the breakdown chart lets LOSS fall while RENT punches through the poster, and OPT OUT gets spray-painted across the whole wall.

Files

FileLinesWhat it draws
scene.py1,438Rage Against the Machine Learning — protest zine riot.
sync_fix.py29This song's sync fix: the shouted gang vocals barely register in the separated vocal stem, so the words for those parts come from transcribing the full mix, and a few line starts are set by hand.

By the numbers

  • 2:47 long, 10,014 frames rendered (16:9 and 9:16, 30 fps)
  • 38 lyric lines and 258 words synced to the vocals, 99 BPM
  • 5 Shorts and Reels cut from it

Lyrics

Words and music by aditazzz.

Intro

Opt out! Opt out! Opt out! Opt out!
Opt out! Opt out!

Verse

They scraped my blog from two thousand nine
My terrible poems in your weights now, fine
My selfies, my reviews, my cat's full name
Now a chatbot does my job and it does it the same
Clause sixty-two in a size-two font
Says my soul's a training set, whatever they want
I never said yes, I never clicked accept
But my whole personality's a vector, I guess

Chorus

Alternative metal, rap metal, funk metal learning
Fine-tuned, fired, and the GPUs burning
Alternative metal, rap metal, funk metal learning
I said no, but the model kept learning
I said no, but the model kept learning
I said no, but the model kept learning

Verse

Boardroom bragging 'bout efficiency gains
Who's buying your product when nobody gets paid?
Ten thousand jobs in a quarterly slide
Your CEO's got a bunker and a yacht to hide
"AI first," says the guy who can't code
Vibe-shipping bugs straight down the road
You want the future? Then cut me in
I'm the data you stole, where's my royalty, friend?

Chorus

Alternative metal, rap metal, funk metal learning
Fine-tuned, fired, and the GPUs burning
Alternative metal, rap metal, funk metal learning
I said no, but the model kept learning

Breakdown

Loss goes down!
Rent goes up!
Loss goes down!
Rent goes up!
Gradient descent on me!

Final chorus

Alternative metal, rap metal, funk metal learning
Alternative metal, rap metal, funk metal learning
I said no, but the model kept
I said no, but the model kept learning!

Outro

Unsubscribe!