Nova Track Inspector ๐ฌ
The node that tells you where to listen
- audio
- audio
- inspection_json
- markers_json
- timeline_json
- score
- verdict
One WAV, no notes
You generated four minutes of music with ACE-Step. You have one file, a prompt and a seed. Listening to it end to end, four times, hunting for the bar where the take drifts out of step with itself - that's the part nobody enjoys.
Nova Track Inspector is the notes. Wire in AUDIO and it walks the whole file and hands back a map of where things go wrong, plus a score and a verdict. It applies no DSP - the audio output is the same tensor you fed in - so you can park it mid-chain, read the report, and pass the audio straight on.
It earns its place because generated music fails in boring, locatable ways - a quiet verse, a channel that collapses, a section that doesn't belong - and three minutes is a lot of listening to find that by ear.
How it works
The node slides a window across the track and computes a feature set per window - window RMS, crest factor, L/R correlation, four band percentages, a noise-likelihood figure. analysis_resolution sets how finely: Normal is a 3-second window on a 1-second hop, Fine is 2 s / 0.5 s, Fast is 4 s / 2 s. Then the important part: every window is judged against the track's own robust median and median-absolute-deviation, not an absolute standard - cymbals aren't an anomaly just because they're bright.
Suspicious windows become markers, tagged by category (LEVEL, STEREO, CONTENT, DYNAMICS, SPECTRAL, ARTIFACT, STRUCTURE, TECHNICAL) and graded INFO / REVIEW / WARNING / CRITICAL. Markers that are simply musical events are recorded as observations and never count against you - a verse-to-chorus transition is a fact, not a fault.
Measuring deviation from a track's own median can't catch a track that's uniformly wrong, so there's a second pass: a 24-band energy vector over 200โ6000 Hz, mean-removed and normalised, comparing start against end. It describes timbre - who is playing and singing - not level. Eight weighted subscores roll into the total score, which maps to verdict: EXCELLENT, GOOD, REVIEW, POOR, REJECT, with a letter grade alongside.
One design decision worth knowing: that start-vs-end measure and the excursion timing are provisional, calibrated on six masters the author approved - the tooltips say so. provisional_authority caps how far unvalidated measures can push the verdict, and a provisional result can never be the sole reason a track fails.
The controls that matter
Most of the thirteen widgets are set-and-forget. These are the four you'll actually touch:
analysis_resolution-Normalfor everything.Fastwhen a long track is chewing time,Finewhen you're chasing something you already suspect.marker_sensitivityandcoherence_sensitivity(both 60) - the two master dials. They lower the anomaly thresholds as you raise them, so higher means more flags. Got a wall of warnings? Turn these down first.weight_profile- a dropdown built at load time by listing the pack'spresets/folder, so the names are Madow's preset names and the two lists can't drift. The weights live separately inprofiles/track_inspector/<name>.json, and a profile overrides only the keys it names - everything else keeps your node's value.save_weights_to_profilewrites the nine back, off by default.provisional_authority(0.30) - leave it low until your own listening vouches for the provisional measures. At 1.00, an unvalidated measure can take a track all the way toREJECT.
Outputs and where they go
audio is the pass-through - wire it onward, unchanged. inspection_json is the full report: hashes, settings-as-used, summary, track metrics, subscores, sections, markers and the timeline. That's what you feed Nova Track Inspector Report ๐. markers_json and timeline_json are the same data pre-sliced for logging; score (FLOAT) and verdict (STRING) drop straight into a console or a database row.
Install
Through the Comfy Registry:
comfy node install comfyui-novaaudioplayer
Or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git
Restart ComfyUI and look under โถ๏ธ Nova Audio. The pack declares two dependencies, mutagen and pymysql; torch, numpy, PIL and av already ship with ComfyUI, and scipy only matters to the player's LUFS badge, not this node. No model downloads here.
Where people get burned
A high score is not a good mix. It means the track is internally consistent and free of artifacts. The report's own interpretation note says it outright: final musical judgement remains with the listener.
Explosive material will occasionally read as REVIEW. A deliberately dynamic track measures a big start-vs-end difference on purpose - the author's own example is 0.213 against a 0.075 threshold. That's the documented cost of one global threshold, and per-profile weights are the answer.
It needs at least two seconds of audio and raises if it gets less, so a two-bar stem won't do.
If the numbers move when you switch profiles, that's the profile working - the report records which profile was applied and which keys it overrode, under summary.provisional.profile.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | โ | |
| analysis_resolution | COMBO | Normal | 3 options: Normal, Fine, Fast |
| marker_sensitivity | FLOAT | 600โ100 | โ |
| coherence_sensitivity | FLOAT | 600โ100 | โ |
| consistency_threshold | FLOAT | 0.0750โ0.5 | Start-vs-end timbre difference that counts as a performer change. LOWER FLAGS MORE TRACKS. Six approved masters measured 0.018-0.058, so 0.075 leaves them headroom while still catching known-bad takes at 0.090 and above. NOTE: a deliberately explosive track can legitimately exceed this - No Gods No Mercy measures 0.213 - so expect an occasional REVIEW on dramatic material until per-profile thresholds exist. |
| consistency_weight | FLOAT | 0.350โ1 | How much a start-vs-end difference moves the score. HIGHER PENALISES tracks that end sounding like a different performance. 0 reports it without scoring it. |
| excursion_seconds | FLOAT | 100โ120 | Longest the track may sit away from its own baseline before flagging. LOWER IS MORE SENSITIVE. No approved master exceeded 10 s. |
| excursion_weight | FLOAT | 0.350โ1 | How much a sustained excursion moves the score. HIGHER PENALISES sections that do not belong to the rest of the track. |
| repeat_allowance | FLOAT | 0.700โ1 | Credit given to a section that repeats itself, so deliberate intros and loops are not mistaken for artifacts. At 0.70 only 30%% of repeating time counts, so a 33 s repeating intro reads as 10 s and passes. 0.00 treats a repeating intro as an artifact; 1.00 never penalises repetition. |
| step_z_threshold | FLOAT | 9.00โ20 | Size of a single timbre jump that counts as an event, in robust standard deviations. LOWER FLAGS MORE. Approved masters legitimately reached 8.5, so below that you will flag real musical sections. |
| step_weight | FLOAT | 0.200โ1 | How much a single jump moves the score. Deliberately lower than the others: jump size on its own misclassified approved masters. |
| loudness_weight | FLOAT | 0.250โ1 | How much dynamic extremes - very high crest, large level jumps - move the score. LOW BY DEFAULT because wide dynamics are a stylistic choice, not a fault. Raise it only if you want the report to argue with deliberately explosive tracks. |
| provisional_authority | FLOAT | 0.300โ1 | How far UNVALIDATED measures may push the verdict. 0.00 comment only - 0.30 may reach REVIEW - 0.70 may reach POOR - 1.00 may reach REJECT. Raise it as your own listening validates these measures. |
| weight_profile | COMBO | โ none โ | Load the nine controls above from a saved profile. The list is Madow's profile names, so the two stay in step. 'โ none โ' uses the values set on this node. A profile may override one control or all nine; anything it does not mention keeps the value shown above. Different material needs different thresholds - a deliberately explosive track and a steady one cannot share one number. |
| save_weights_to_profile | BOOLEAN | false | Writes the nine values above into the selected profile when the node runs, then behaves normally. Off by default: a run should not change your saved settings unless you ask it to. Does nothing when the profile is 'โ none โ'. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | โ |
| inspection_json | STRING | โ |
| markers_json | STRING | โ |
| timeline_json | STRING | โ |
| score | FLOAT | โ |
| verdict | STRING | โ |