Siren Scope (Audio β Image) π§
See the song, so you know which take to keep
- audio
- audio_b
- image
- report
- gen_extra_info
Audio can't go into Image Compare - a picture of it can. Siren Scope renders AUDIO to an IMAGE, and every design decision in it exists to make two takes comparable rather than to look nice. It's the visual checkpoint between "I generated a song" and "which of these three takes is the keeper," and it also hands gen_extra_info plain numbers that often answer the question faster than any picture.
Why it's built the way it is
Three choices do the heavy lifting:
- The dB scale is absolute, never auto-fitted.
db_floor(default β80) anddb_ceiling(default 0 dBFS) are fixed, so a quiet take renders dark instead of being silently boosted to fill the frame. Auto-normalizing each image is exactly what makes two spectrograms meaningless side by side - the whole point is that equal brightness means equal loudness. - The pixel grid is fixed. The clip always spans
width_px, so column x is the same moment in every render of a same-length track, and an A/B flip in Image Compare doesn't jitter. - The bar grid lands where Siren Section would cut. Give it the same
bpm/beats_per_bar/grid_origin_secyou gave the text encoder, and the bright lines are bar boundaries, dim ones beats - so you can pick a retake window off the picture and type those seconds straight into the Section node.
mode picks the view: mel spectrogram (structure, drop-outs, a band-limited top end), linear spectrogram (hard low-passes and resampling artifacts), waveform (level, silence, clipping), or mel + waveform stacked on one time axis. channels can draw a mono mix, one side, or both stacked - the way to catch a stereo collapse or one side dropping out.
The difference mode
Wire a second take into audio_b and it switches to AβB mode: black where the two are identical, bright where they diverge (warm = A louder, cool = B louder). Two independent takes never agree bin-for-bin, so diff_detail averages over musically-sized tiles first - musical (~1/8 of the mel bands Γ 120 ms, what a listener notices) is the default; fine (raw bins) is honest but usually unreadable. This is the direct check that a Siren retake did what it says: the frozen part of the track should come out pure black and only the marked section should light up. diff_span_db (default 6) decides how many dB of difference reaches full colour - leave it wide and two similar takes look identical when they aren't.
Settings worth knowing
n_fft (2048) and n_mels (192) - the 192 note again: at n_fft 2048 there are only 1025 frequency bins, and 256 mel bands would leave two permanently dead rows. Raise n_fft to 4096 before asking for more bands. db_floor is your inspect dial: raise toward β60 to see only what's audibly present, drop toward β100 to inspect the noise floor. time_labels off gives a clean image to overlay or diff pixel-for-pixel. And the gen_extra_info output carries plain numbers - loudness, crest, brightness, band balance, stereo - into a Generation Info dump, which is often the clearer answer to "how do these two differ" than squinting at colours.
Outputs: image (into Image Compare, like any other image), report, gen_extra_info.
Installing it
Part of Kinburg/Kinburg-Nodes - ComfyUI Manager search "Kinburg-Nodes", or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes, restart. No extra dependencies - it analyzes an AUDIO input in place. If your two takes look identical in A/B, check diff_span_db and diff_detail before re-rendering; and if a retake's frozen section glows in difference mode, something re-noised audio it shouldn't have - that's a Siren Section problem, not a scope problem.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The audio to draw β straight out of VAEDecodeAudio, or a LoadAudio for something off disk. | |
| mode | COMBO | mel + waveform | β’ mel spectrogram β frequency over time on a perceptual scale. The one to read structure, drop-outs and a band-limited top end off. β’ linear spectrogram β the same in linear frequency: worse for musical detail, better for spotting a hard low-pass or a resampling artifact. β’ waveform β min/max envelope, the DAW view. Best for level, silence and clipping. β’ mel + waveform β both stacked, sharing one time axis. |
| colormap | COMBO | magma | Ramp for the spectrogram. 'magma' has the most even perceptual spacing of the three, so equal steps in dB look like equal steps in brightness. Ignored in difference mode, which always uses its own diverging ramp. |
| width_px | INT | 128064β8192 | Image width. The whole clip always spans this width, so column x is the same moment in every render of a track of the same length β which is what lets two images be flipped between in Image Compare without anything shifting. |
| height_px | INT | 32032β4096 | Height of the panel area (the time ruler is added below it). With 'mel + waveform' the spectrogram takes 70% and the waveform 30%. |
| db_floor | FLOAT | -80-200β0 | Black point, in dB relative to full scale. ABSOLUTE, never auto-fitted: a quiet take renders dark rather than being boosted to fill the frame, which is the whole reason two of these can be compared. Raise toward -60 to see only what's audibly present; drop toward -100 to inspect the noise floor. |
| db_ceiling | FLOAT | 0-100β60 | White point in dBFS. 0 = digital full scale. Leave it there unless you're chasing something specific β moving it breaks comparability with images already rendered. |
| channels | COMBO | mix to mono | Which channel to draw. 'stack both' draws left and right as separate panels β the way to see a stereo image collapse or one side dropping out. |
| bpm | INT | 00β300 | Draw the musical grid: bright lines on bar boundaries, dim ones on beats. Use the same tempo you gave TextEncodeAceStepAudio1.5, and the lines land exactly where Siren Section's 'snap: bar' would cut β so you can pick a retake window off the picture. 0 = plain time ruler instead. |
| beats_per_bar | INT | 41β16 | Beats per bar for the grid (the 'timesignature' on the text encoder). |
| grid_origin_sec | FLOAT | 0.000β2000 | Where bar 1 starts, for a track that opens with a pickup or a moment of silence. Same meaning as on Siren Section β keep the two equal. |
| time_labels | BOOLEAN | true | Add the m:ss ruler under the panels. Turn it off for a clean image to overlay or diff pixel-for-pixel. |
| diff_detail | COMBO | musical | DIFFERENCE MODE ONLY ('audio_b' wired): how much to average before comparing. Two independent takes never agree bin-for-bin β their fine detail and noise floor are uncorrelated β so comparing raw bins gives a field of speckle that says nothing about whether they SOUND different. Averaging energy over a musically-sized tile throws that away. β’ musical (default) β ~1/8 of the mel bands x 120 ms. What a listener notices. β’ coarse β ~1/24 of the bands x 500 ms. Only broad shifts in balance survive. β’ fine (raw bins) β no averaging. Honest but usually unreadable; useful only when the two clips share actual samples, i.e. checking a Siren retake. |
| diff_span_db | FLOAT | 6.00.5β60 | DIFFERENCE MODE ONLY: how many dB of difference reaches full colour. 6 dB is a large, obvious change in a band; drop to 2-3 to bring out nuance, raise it if the picture is saturated everywhere. This is the dial that decides whether small differences are visible at all β leaving it wide makes two similar takes look identical when they aren't. |
| n_fft | INT | 2048256β16384 | FFT window. Larger = finer frequency detail and blurrier timing; smaller = sharper transients, coarser pitch. |
| n_mels | INT | 19216β1024 | Mel bands. Only the mel modes use it. 192 rather than 256 because at the default n_fft of 2048 there are only 1025 frequency bins to share out: ask for 256 mel bands and two of them come out with no bins at all, i.e. two permanently dead rows in the picture. 192 is the most that stays fully populated. Raise n_fft to 4096 first if you want more bands than that. |
| label_scale | INT | 21β6 | Pixel size of the ruler text. Raise it for a wide image you'll be looking at zoomed out. |
| audio_bopt | AUDIO | Wire a second take here to switch to DIFFERENCE mode: A minus B in dB, black where the two are identical and bright where they diverge (warm = A louder, cool = B louder). This is the direct check that a Siren retake did what it says β the frozen part of the track should come out pure BLACK and only the marked section should light up. If black bleeds into the section, the fade is eating it; if the frozen part glows, something re-noised audio it shouldn't have. The two clips are compared over the shorter of the two lengths, which is reported. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |
| report | STRING | β |
| gen_extra_info | GEN_INFO | β |