SonarRepeatedNoise
Cache your noise and reuse it, with a twist
- sonar_custom_noise
- SONAR_CUSTOM_NOISE
Most of the time you want fresh noise every step - that's what makes ancestral sampling feel alive. But there are workflows where the opposite is useful: you want the same noise texture reused across calls, recycled and re-rolled instead of regenerated. SonarRepeatedNoise is the pack's caching layer for that. It generates a pool of noise items once, then hands them out repeatedly - with a permutation applied each time so the reuse isn't obvious.
Think of it as a deck of cards. You shuffle the deck, draw a card, and instead of putting it back, you flip it, rotate it, and reuse it a bunch of times before it gets replaced with a fresh card. The mechanical detail: "recycled noise will be permuted by randomly flipping it, rolling the channels, etc." - so the same underlying noise comes back in a different costume each draw.
The inputs that matter
sonar_custom_noise- the noise source to cache. LikeSonarRandomNoise, this node treats its input as a list of noise items rather than adding a single item to the chain.repeat_length(default 8) - how many items the cache holds. Bigger pool = more variety before something repeats.max_recycle(default 1000) - how many times a given item is reused before it's replaced with fresh noise. Lower it to force the deck to refresh more often.permute(enabled / disabled / always) - when enabled, recycled noise gets flipped/rolled before reuse.alwaysalso permutes the first use. Disable it if you want literally identical noise reused, which is the "I want the exact same texture every step" scenario.factorandnormalize- the standard strength and rebalance controls.
Output is a SONAR_CUSTOM_NOISE feeding into a Sonar sampler, SamplerConfigOverride, or NoisyLatentLike.
When this is actually the tool
The practical use is consistency across a series: animation frames, image-to-image passes, or batch workflows where you want the same noise character held through the whole run instead of each step getting independent randomness. Caching also saves the compute of regenerating noise every call, though for most samplers that cost is minor next to the model calls.
The trap is assuming it gives you true determinism. It doesn't - the permutation is random, the pack's own README admits noise generation is inconsistently on GPU or CPU (which changes seeds across hardware), and the author has reworked internals in ways that "may change seeds" between versions. If your goal is pixel-identical reproducibility, pin the git revision of the pack and don't update casually. If your goal is "same noise family, re-rolled," this is exactly the node.
Installing
It ships with ComfyUI-sonar. Easiest via ComfyUI Manager (search "ComfyUI-sonar"), or clone it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/blepping/ComfyUI-sonar
Restart ComfyUI, find it under advanced/noise. No extra Python packages and no model downloads - just the pack itself.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| factor | FLOAT | 1.000-10000–10000 | Scaling factor for the generated noise of this type. |
| sonar_custom_noise | SONAR_CUSTOM_NOISE,OCS_NOISE | Custom noise type to modulate. The following input types are supported: SONAR_CUSTOM_NOISE, OCS_NOISE | |
| repeat_length | INT | 81–100 | Number of items to cache. |
| max_recycle | INT | 10001–1000 | Number of times an individual item will be used before it is replaced with fresh noise. |
| normalize | COMBO | default | Controls whether the generated noise is normalized to 1.0 strength. |
| permute | COMBO | enabled | When enabled, recycled noise will be permuted by randomly flipping it, rolling the channels, etc. If set to always, the noise will be permuted the first time it's used as well. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SONAR_CUSTOM_NOISE | SONAR_CUSTOM_NOISE | A custom noise chain. |