# Candy Paint: a piano cover performed note by note in Three.js

**URL:** <https://discourse.threejs.org/t/candy-paint-a-piano-cover-performed-note-by-note-in-three-js/94966>\
**Category:** Showcase\
**Created:** [October 3, 2026, 9:40am UTC](https://discourse.threejs.org/t/candy-paint-a-piano-cover-performed-note-by-note-in-three-js/94966 "2026-10-03T09:40:17Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![transitive-bullshit](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/transitive-bullshit/32/73091_2.png) [@transitive-bullshit](https://discourse.threejs.org/u/transitive-bullshit)\
**Post date:** [October 3, 2026, 9:40am UTC](https://discourse.threejs.org/t/candy-paint-a-piano-cover-performed-note-by-note-in-three-js/94966/1 "2026-10-03T09:40:17Z")

</div>

Hi everyone! I made a browser-rendered music video for a piano cover of Post Malone’s “Candy Paint.” Little pearls of light follow the score, landing on every note and splitting and merging for chords.

The Three.js/WebGL renderer is deterministic: every frame is a function of song time. Transkun transcribed the piano cover, and a motion test checks all 1,893 note onsets. I built it with Claude Code in about a day of back-and-forth.

I’d love feedback on the choreography, especially the split/merge behavior.

[Play it live in your browser](https://candy-paint.vercel.app/)

[Watch the video](https://www.youtube.com/watch?v=e-R5cXF3bzE)

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

[How it was made](https://www.transitivebullsh.it/projects/candy-paint-music-video)
