Nodes/Kinburg-Nodes/Siren Scope (Audio β†’ Image) 🧜
ComfyUI Node

Siren Scope (Audio β†’ Image) 🧜

See the song, so you know which take to keep

By KinburgΒ·Created 3 months agoΒ·Updated 6 days agoΒ· 1
Siren Scope (Audio β†’ Image) 🧜
  • audio
  • audio_b
  • image
  • report
  • gen_extra_info
β—„modemel + waveformβ–Ί
β—„colormapmagmaβ–Ί
β—„width_px1280β–Ί
β—„height_px320β–Ί
β—„db_floor-80β–Ί
β—„db_ceiling0β–Ί
β—„channelsmix to monoβ–Ί
β—„bpm0β–Ί
β—„beats_per_bar4β–Ί
β—„grid_origin_sec0.00β–Ί
β—„time_labelstrueβ–Ί
β—„diff_detailmusicalβ–Ί
β—„diff_span_db6.0β–Ί
β—„n_fft2048β–Ί
β—„n_mels192β–Ί
β—„label_scale2β–Ί

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) and db_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_sec you 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.

CategoryKinburg-Nodes/Bestiary/Siren

Inputs (18)

NameTypeDefaultDescription
audioAUDIOThe audio to draw β€” straight out of VAEDecodeAudio, or a LoadAudio for something off disk.
modeCOMBOmel + 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.
colormapCOMBOmagmaRamp 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_pxINT128064–8192Image 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_pxINT32032–4096Height of the panel area (the time ruler is added below it). With 'mel + waveform' the spectrogram takes 70% and the waveform 30%.
db_floorFLOAT-80-200–0Black 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_ceilingFLOAT0-100–60White point in dBFS. 0 = digital full scale. Leave it there unless you're chasing something specific β€” moving it breaks comparability with images already rendered.
channelsCOMBOmix to monoWhich 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.
bpmINT00–300Draw 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_barINT41–16Beats per bar for the grid (the 'timesignature' on the text encoder).
grid_origin_secFLOAT0.000–2000Where 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_labelsBOOLEANtrueAdd the m:ss ruler under the panels. Turn it off for a clean image to overlay or diff pixel-for-pixel.
diff_detailCOMBOmusicalDIFFERENCE 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_dbFLOAT6.00.5–60DIFFERENCE 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_fftINT2048256–16384FFT window. Larger = finer frequency detail and blurrier timing; smaller = sharper transients, coarser pitch.
n_melsINT19216–1024Mel 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_scaleINT21–6Pixel size of the ruler text. Raise it for a wide image you'll be looking at zoomed out.
audio_boptAUDIOWire 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)

NameTypeDescription
imageIMAGEβ€”
reportSTRINGβ€”
gen_extra_infoGEN_INFOβ€”