Martin Walsh.
←  Index
08Creative & Maker

Frisson

Seed a song, get tracks that hit the same way.

Frisson is a music-discovery web app that takes one seed song and returns tracks that react similarly — not just same-genre neighbors, but songs that share the seed's sonic feel. It fuses neural audio-similarity with crowd-sourced recommendation signals from multiple music sources, and learns a personal taste profile over time. The result ranks genuine sonic siblings above superficial genre matches.

PythonCLAPPyTorchSQLiteApple Silicon / MPSREST APIs

The problem

Most recommendation engines lean on genre tags and collaborative-filtering popularity, which surfaces same-label neighbors rather than songs that actually feel like the seed. Frisson set out to capture the harder, more subjective signal — the sonic 'frisson' two tracks can share even across genres.

What I built

A web app where a single seed song produces a ranked list of similar candidates. It draws candidates from several independent music recommendation sources, deduplicates them, and re-ranks the pool with a neural audio-similarity model. It adds a 'match on' control (full mix, beat, or melody) and a personal taste profile that learns from liked and disliked tracks. Results play inline and can be saved back to a streaming playlist.

How it works

Candidates are gathered from multiple music APIs and deduplicated name-first. Ranking blends CLAP neural audio-embedding similarity, quality-weighted crowd votes, audio features, and personal liked/disliked centroids that activate once enough feedback exists. Beat- and melody-matching isolate the percussive or harmonic layer and add a rhythm-signature blend. A two-wave UX returns a fast crowd-based pass in seconds, then a neural re-rank; embeddings are cached so warm queries are near-instant. Careful score normalization was needed because raw neural cosines compress into a narrow band and produce poor rankings otherwise.

Where it stands

Built and running as a self-hosted service on a home server, with caching, automated tests, and a smoke-check script. A debugging pass diagnosed and fixed a ranking-quality regression caused by a souring unauthenticated upstream session, adding retry logic and empty-source warnings. Optional deeper streaming integrations (personal-library import, true stem separation) are scoped as future upgrades.