Audio analysis · Personal project
Record Checker
Hear the problem. Explore the evidence.
Mix feedback arrives as "the low end is muddy" with no way to find the moment it refers to. This ties every suggestion to a measurement and the seconds behind it.
Local prototype
Interactive sample
Glass Harbour
0:00 / 1:04
Interactive simulation using prepared findings; the Python engine does not run on this page.
Project details
My role
I built both halves: the Python analysis engine — detectors, ranking and report format, on NumPy, SciPy and SoundFile, with loudness following the ITU BS.1770-4 spec — and the browser workspace over it, in Next.js, React, TypeScript and WaveSurfer.js over the Web Audio API. No collaborators.
A personal project, built in my own time over 21 commits in October 2026. Claude is an optional layer that rewrites the report's prose and never produces a finding — the engine's output is the same with it switched off.
Project status
Local prototype. The portfolio demo uses prepared findings; evaluation against a labeled music collection is the next development step.
Validation and scope
- No instrument names from a stereo mix, and no prescribed EQ moves like "−3.7 dB at 287 Hz".
- No target curve and no quality score. It will not tell you −14 LUFS or a flat spectrum is required.
- A choice you marked deliberate is pushed down, not deleted.
- No guessing which section is the chorus, or claiming a key for a drum loop.
- A Claude rewrite the evidence does not support is discarded for the deterministic report and a line saying why.
Built with
- Python
- NumPy
- SciPy
- Next.js
- React
- TypeScript
- Web Audio API
- Claude (optional layer)
Where the project stands
A personal project: 21 commits between 10 and 16 October 2026, running on a local machine with no accounts, no payments and no deployment.
The evaluation rubric is written and its gates are set, but it has not been run against a labelled song collection — so every quality figure the rubric defines is a target, not a result. That is the next piece of work, and until it is done the page reports no quality number at all.
How the demo audio and the prepared findings were made
"Glass Harbour" has no audio file behind it. Your browser builds all 64 seconds from an oscillator graph when the demo loads — 120 BPM, A minor, 32 bars — so nothing is downloaded and every render comes out identical. Noise comes from a seeded generator, which is what makes that true.
The three findings on this page were not detected. The problems were composed into the track on purpose and the write-ups are mine, so the demo shows what the output looks like and what it is for, not the engine running. The engine is Python and does not run in a browser.
Inside each finding, values tagged "setting" are the exact synthesis parameters that built the flaw. Values tagged "measured" are real measurements of this render, taken by the project's own deterministic check suite. On a real file, producing those measurements and the findings over them is precisely what the engine does instead.
What I'd do next
- Run the labelled evaluation against real music. The rubric and gates are written, the song collection is not — so every quality number today is a target, not a result.
- Exercise the Claude layer against the live API. Tested only against a fake client, the verifier has never rejected a real model response.
- Validate section boundaries. Segmentation uses level and band-balance novelty alone, which is why sections stay A, B and C rather than claiming a chorus.
- Reference-track comparison, which the tool currently declares and refuses rather than approximating.
From measurement to something you can hear
-
Locate
Feedback points to a specific passage.
-
Inspect
Measurements remain available behind each finding.
-
Listen
Play the passage and evaluate the suggestion.
Inside the analysis engine
Select a layer to follow audio into measurements, findings and a report.
Key engineering decisions
Pick one to read it. The constraint, the implementation and the cost are behind each.