# Candy Paint – Music Video

A piano cover of Post Malone’s Candy Paint, performed note by note by little sprites of light.

Canonical URL: https://www.transitivebullsh.it/projects/candy-paint-music-video

Author: Travis Fischer

Published: 2026-10-03

Updated: 2026-10-03T03:52:00.000Z

Tags: AI, Video, Projects

[Website](<https://youtu.be/e-R5cXF3bzE>)

[Source](<https://github.com/transitive-bullshit/candy-paint>)

![Candy Paint – Music Video](<https://assets.cultural-alignment.com/personal-site/media/055521cc4db02087726492a639670d3f665d41a330939ad996c7de8362932bc7.jpg>)

[Watch video](<https://assets.cultural-alignment.com/media/videos/candy-paint-1080p60-e450a1e6c67a9345.mp4>)

<a id="cae263ac28d049fbbd308446c767da57"></a>

## Watching the music

I came across a pair of animated scores on X by Classical Melodies: Handel and Vivaldi, with little glowing sprites hopping across the staff and landing on every note exactly as it sounds. You don’t just hear the counterpoint; you watch the voices take turns.

𝗖𝗹𝗮𝘀𝘀𝗶𝗰𝗮𝗹 𝗠𝗲𝗹𝗼𝗱𝗶𝗲𝘀 (@Old\_But\_Gold50s):

> Vivaldi's “Winter,” visualized in a fascinating way, so that the auditory experience is even more intense; one can literally “see” the music, so to speak https://t.co/3HjlHw3PbM

[View original post](<https://x.com/Old_But_Gold50s/status/2105432507386822925>)

I wanted one for a song I love: Post Malone’s “Candy Paint,” in a solo piano cover by Molotov Cocktail Piano. The piano strips the song down to four voices: a rolling riff, a lead line above it, a high sparkle on top, and a bass that sits out the verses and comes back for the drops.

[Watch video](<https://www.youtube.com/watch?v=mThqhAT2Irk>)

The original: Post Malone, “Candy Paint” (2017)

My one rule: **no generative video or imagery.** My last two music videos, [Slow It Down](<https://www.transitivebullsh.it/projects/slow-it-down-ai-music-video>) and [Sometimes I Think Slow](<https://www.transitivebullsh.it/projects/sometimes-i-think-slow-ai-music-video>), were built from image and video models. This one has none. A purpose-built engine renders every frame from a transcription of the song, so the sync isn’t approximated. It’s the whole point. The audio is the cover, untouched.

<a id="edd4821e5e4c477fae7e1350879b9040"></a>

## Every note gets a performer

Each voice gets its own performer, a hot pearl of light that travels the score and touches down on every note as it sounds. Notes start as dark smoked glass and flood with candy paint when a performer lands on them. Held notes fill like a gauge, and the performer rides the leading edge of the fill.

The look is the title. Candy paint is a car finish, so the score is pinstriped in gold onto a black-cherry lacquer at night, with metal flake, clearcoat reflections, and shallow focus.

The camera follows a storyboard: close on the riff for the intro, wide on the hooks, hard cuts with a shockwave on the three drops, and a final rise that reveals the whole song at once, under the credits.

<a id="a1fbaa477cf7420ea5e59ad474c3678b"></a>

## How it was made

Claude Code with **Opus 5.5** built all of it: the song analysis, the engine, the choreography, the camera, and the render pipeline. My job was taste and feedback. It took about a day of back-and-forth, and no generation credits at all.

1. **Transcription.** Transkun turned the MP3 into 1,893 piano notes, and librosa found the grid: exactly 90 BPM in E major, with bar 0 at 0.702 seconds.

   ![The transcription, bar by bar: right hand in pink, left hand in blue. The similarity map below it exposes the song’s sections.](<https://assets.cultural-alignment.com/personal-site/media/3891bd246b075369697245d3be32fbe94fd6a6984e39dc67a785afc7d5aac738.jpg>)
   
   The transcription, bar by bar: right hand in pink, left hand in blue. The similarity map below it exposes the song’s sections.
1. **Voices.** The notes split by register into riff, lead, sparkle, and bass, and then each voice splits into single lines, one per finger.
1. **Concept art from the real renderer.** Instead of mood boards from an image model, three early looks were rendered by the engine itself, so whatever I picked was what I’d get.

   ![The three directions at the same moment of the first hook: A, Candy Lacquer (top); B, Long Exposure (bottom left); and C, Sleeve (bottom right).](<https://assets.cultural-alignment.com/personal-site/media/8c79723ea354518ab2387e655f3915f45eca2e4de27b49c82d1bfb2ff93e59e4.jpg>)
   
   The three directions at the same moment of the first hook: A, Candy Lacquer (top); B, Long Exposure (bottom left); and C, Sleeve (bottom right).
1. **Choreography.** Every hop borrows from Disney’s twelve principles of animation: anticipation before takeoff, hang time at the top, squash and stretch on landing, and follow-through.
1. **Storyboard.** Twelve story beats and 31 camera framings, each anchored to a bar of the song.

   ![The storyboard, from the intro to the final rise.](<https://assets.cultural-alignment.com/personal-site/media/9990820e79dfe5a6dbf42f74bce858413babf1efeecc162b35198150acc2ec1d.jpg>)
   
   The storyboard, from the intro to the final rise.
1. **Rendering.** Headless Chrome renders each frame with three.js and pipes it to FFmpeg with the matching slice of audio. Every frame is a pure function of song time, so any frame can be rendered on its own.

<a id="a5c86c6fb9e94658bc422baabebcae0d"></a>

### Directions we tried

- **Three looks.** B painted the melody in light trails like cars on a night freeway, and C printed the score as a risograph record sleeve. I didn’t feel the trails, and C was cute, but A was the only one that belonged to this song.
- **Chords.** One performer per voice can only visit one note of a chord, and I kept asking why some dots got skipped. We tried one performer per voice, one per line (“twins”), and **budding**: extra performers split off the voice’s main performer for a chord and merge back after.

  [Watch video](<https://assets.cultural-alignment.com/personal-site/media/ca00bd0b97bb3e36a3d9f530765b88e40b556912585e70ae8fd678dd726cb0b6.mp4>)
  
  Single, twins, and budding over the same bars. Budding won.
- **Merging.** The first buds merged back after every note, which looked twitchy. Now they keep their identity through short gaps and only merge after about a bar. The bass needed its own rule: its buds merge only once its main performer settles on a held note.

  [Watch video](<https://assets.cultural-alignment.com/personal-site/media/730716486c0988799564c84ca6bfbb556b24816fc2f869497aa03c272d6e7b77.mp4>)
  
  Before: the buds merge after every note. After: they keep their identity through short gaps.
- **The first frame.** X shows a video’s first frame as its preview, and ours was black. Of four posters, I liked Macro best, but cutting from it into the song was jarring.

  ![Four poster directions: flash-forward, frontispiece, the whole song, and macro.](<https://assets.cultural-alignment.com/personal-site/media/cbf21a06837032fc05733a298d81c5fbb98f360f71d128830d246f11992c5d21.jpg>)
  
  Four poster directions: flash-forward, frontispiece, the whole song, and macro.
  
  So the poster became the first shot. The title lingers for a few seconds while the riff performers fly in to their first notes, and the camera follows them into the song without adding a second before the music starts.
  
  [Watch video](<https://assets.cultural-alignment.com/personal-site/media/35ce5050e36b881cdfe094c3b71f7f85dd8cbb520918a0feb5a58b96abd94ecb.mp4>)
  
  Four ways to fly the riff performers in: wave, hover and dive, rise, and skip. Skip won.

<a id="12c35b175a5749668193db443d50d5ba"></a>

## What I learned

- **Make sync a test, not a vibe.** The audio is the master, and a motion test checks that every performer lands on all 1,893 onsets and never jumps between frames. Choreography changes can’t quietly drift off the beat.
- **Render concept art with the real engine.** There’s no gap between the pitch and the product.
- **Chords are where the metaphor breaks.** One performer per voice reads beautifully on a single line and falls apart on a chord. Budding keeps one character per voice while still hitting every note.
- **Iterate at low resolution.** A 540p review of the whole song renders in about five minutes; the 4K60 master takes about 45. I stopped one 4K render halfway and stuck to previews until the final.
- **The first frame is the thumbnail.** Make the poster part of the motion instead of a cut away from it.

<a id="fb548360744c4c6cbf035ea650e9c212"></a>

### Tools used

- **Claude Code (Opus 5.5):** all of the code, analysis, choreography, camera direction, and review renders.
- **Transkun:** piano transcription from the MP3.
- **librosa:** the tempo grid, key, and sections.
- **three.js:** the renderer, with bloom, depth of field, and film grain.
- **Playwright + headless Chrome, and FFmpeg:** frame-exact rendering and encoding.
- **Blender:** on the table from the start, and never needed.

---

*“Candy Paint” by Post Malone. Instrumental cover by Molotov Cocktail Piano. Not affiliated with either.*
