Synesthesia turns an album into a place you can enter
How I built Synesthesia, a mobile-first Godot experience in the browser where Virya's songs become rooms you reveal by touch.
- Engineering
- Godot
- Game Development
- Audio
Most ways of discovering an album still look like a list: cover, title, play button, maybe a waveform.
I wanted something different for Virya.
Rooms instead of a player
The idea behind Synesthesia was to turn listening into a small place you can enter. I didn't want a rhythm game, a visualiser glued to Spotify or a collection of music videos with Next buttons. I wanted the player to touch the image, disturb it, reveal it and move through a sequence of rooms where sound, colour, noise and interaction describe the same emotional state.
That became a mobile-first Godot experience running directly in the browser.
The rooms aren't conventional levels. Each one borrows a language from a song or release: television static and corrupted screens for Technophobia, Venetian masks for Unmasked, a tree growing out of doubt, ash and a phoenix, broken mirrors, balloons that can be popped, a western duel, an unnervingly elegant dinner and a bedroom that is deliberately quieter and more intimate.
The recurring structure is psychological rather than mechanical. Something is obscured. The player stays with it for a moment. Then the room starts giving something back.
The reveal brush
The main interaction became a reveal brush.
A noisy or damaged layer sits over the scene and the player physically wipes through it. The room reacts as the image comes through: visual noise changes, the mix opens, details become readable and the experience gradually moves from interference toward music.
That gave me a useful design rule: interaction should expose the song, not interrupt it.
Why Godot in the browser
Godot fit this better than a traditional website. I wanted a scene graph, shaders, audio buses, touch input, transitions, haptics and the option to ship the same project beyond the browser later. The target is a vertical phone screen, but the layout still has to survive real browsers, safe areas, address bars and devices that don't care about my 1080×1920 mock-up.
Doing less work
The browser also imposes limits. Audio can't simply start because a scene loaded. Video decoding is expensive. A transition that keeps rendering behind a menu still wastes battery. A decorative Control node can accidentally eat the input intended for the whole room.
So a large part of the work became making the experience stop doing things.
Idle video and transition processing sleeps. The animated eye in the menu uses a bounded frame rate instead of blinking at 120 FPS. Decorative UI ignores pointer events. The menu and room stack have explicit modal boundaries, so a button from the previous scene can't leak through into the next one. Heavy visual assets were converted to import-safe WebP where that made sense, and startup avoids waking every decoder just because the files exist.
UI that matches the artwork
The visual language needed the same pass. Early UI panels looked like generic game UI floating over much stronger artwork. I rebuilt them around comic-like frames, rougher typography, glitch accents and the same distressed style as the rooms. Door transitions got a job too: moving to the next track should feel like leaving one fragment of consciousness and entering another.
Sound
Sound is part of the interaction too.
Each room has an ambience layer and can move through static, pink-noise-like textures, ringing, environmental sound and the actual music. Visual Snow Syndrome inspired part of the persistent grain and perceptual interference, but I didn't want to turn sensory discomfort into a cheap horror effect. The stronger stimuli have to stay bounded, readable and purposeful. Haptics follow the same rule: touch feedback should underline an event, not buzz constantly just because the phone can.
Polish
The hard part has been keeping all those layers coherent.
A room can look right and still feel wrong because the bottom interaction panel is scaled like a desktop window. A transition can look beautiful and still be broken because its overlay survives into the menu. A font can fit the debug skin perfectly and then make normal copy unreadable. A video can loop correctly and still hitch because the loop seam asks the decoder to do too much at once.
In an experience like this, those details are the product.
One interaction, several senses
I ended up treating Synesthesia less like a game with a soundtrack and more like an instrument panel for perception:
image+ interference+ touch+ motion+ sound+ room state= one interactionPart of the Virya ecosystem
The completion flow points the player back toward Virya Signal instead of a generic “follow us” screen. Synesthesia isn't meant to be another isolated campaign microsite. It sits alongside the music, Signal, AREA and the rest of the fan experience.
The engineering underneath is deliberately unromantic: explicit scene ownership, bounded processing, import-safe assets, adaptive UI, visible failure states and tests for the exact regressions that kept appearing while I polished the rooms.
The thing on top should feel like opening a door and finding out that a song has a room behind it.
Replay scoring and Echoes
After Replay Mode, a replay needed a reason to feel different, without turning the project into an arcade score attack. Each completed room now gets a local Resonance mastery result (S, A, B or C, backed by a 0–100 score). It rewards exploration, clean interaction and personal-best progress, but deliberately doesn't punish accessibility or assist settings and doesn't affect reward eligibility.
The second addition gives Echoes a mechanical effect as well as a narrative one. A remembered Echo from an earlier room now gives a tiny positive carry-over to interaction tolerance and reveal energy in the next room. It can't unlock content, skip requirements or create a dead end. The effect is intentionally small: enough for the game to remember the player, not enough to make one room a prerequisite for another.
First-load work was tightened at the same time. The next room is no longer prefetched while the current room is still restoring. Prefetch waits until the first room is restored and interactive, so initial paint and current-room I/O get resources before background work starts.