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 · Subscribe to @adita_zzz
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.
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
| File | Lines | What it draws |
|---|---|---|
scene.py | 1,438 | Rage Against the Machine Learning — protest zine riot. |
sync_fix.py | 29 | This 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!