Nodes/Nova Audio Player/Nova Track Inspector ๐Ÿ”ฌ
ComfyUI Node

Nova Track Inspector ๐Ÿ”ฌ

The node that tells you where to listen

By NovaFemmeยทCreated 20 days agoยทUpdated 2 days agoยท 0
Nova Track Inspector ๐Ÿ”ฌ
  • audio
  • audio
  • inspection_json
  • markers_json
  • timeline_json
  • score
  • verdict
โ—„analysis_resolutionNormalโ–บ
โ—„marker_sensitivity60โ–บ
โ—„coherence_sensitivity60โ–บ
โ—„consistency_threshold0.075โ–บ
โ—„consistency_weight0.35โ–บ
โ—„excursion_seconds10โ–บ
โ—„excursion_weight0.35โ–บ
โ—„repeat_allowance0.70โ–บ
โ—„step_z_threshold9.0โ–บ
โ—„step_weight0.20โ–บ
โ—„loudness_weight0.25โ–บ
โ—„provisional_authority0.30โ–บ
โ—„weight_profileโ€” none โ€”โ–บ
โ—„save_weights_to_profilefalseโ–บ

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 - Normal for everything. Fast when a long track is chewing time, Fine when you're chasing something you already suspect.
  • marker_sensitivity and coherence_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's presets/ folder, so the names are Madow's preset names and the two lists can't drift. The weights live separately in profiles/track_inspector/<name>.json, and a profile overrides only the keys it names - everything else keeps your node's value. save_weights_to_profile writes 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 to REJECT.

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.

Categoryโ–ถ๏ธ Nova Audio/๐Ÿ“Š Analysis & Validation

Inputs (15)

NameTypeDefaultDescription
audioAUDIOโ€”
analysis_resolutionCOMBONormal3 options: Normal, Fine, Fast
marker_sensitivityFLOAT600โ€“100โ€”
coherence_sensitivityFLOAT600โ€“100โ€”
consistency_thresholdFLOAT0.0750โ€“0.5Start-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_weightFLOAT0.350โ€“1How 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_secondsFLOAT100โ€“120Longest the track may sit away from its own baseline before flagging. LOWER IS MORE SENSITIVE. No approved master exceeded 10 s.
excursion_weightFLOAT0.350โ€“1How much a sustained excursion moves the score. HIGHER PENALISES sections that do not belong to the rest of the track.
repeat_allowanceFLOAT0.700โ€“1Credit 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_thresholdFLOAT9.00โ€“20Size 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_weightFLOAT0.200โ€“1How much a single jump moves the score. Deliberately lower than the others: jump size on its own misclassified approved masters.
loudness_weightFLOAT0.250โ€“1How 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_authorityFLOAT0.300โ€“1How 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_profileCOMBOโ€” 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_profileBOOLEANfalseWrites 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)

NameTypeDescription
audioAUDIOโ€”
inspection_jsonSTRINGโ€”
markers_jsonSTRINGโ€”
timeline_jsonSTRINGโ€”
scoreFLOATโ€”
verdictSTRINGโ€”