Nodes/ComfyUI-BFSNodes/BFS Shot Noise
ComfyUI Node

BFS Shot Noise

Shaping the noise H3 starts from (gently, please)

By alisson-anjos·Created 8 months ago·Updated 5 days ago· 134
BFS Shot Noise
  • shot
  • vae
  • guide_frames
  • ref_image
  • mask
  • noise
  • seed
◄seed0►
◄shot_seedsame for every shot►
◄shared_base0.00►
◄static_share0.00►
◄guide_structure0.00►
◄distributiongaussian►
◄spectrum_tilt0.00►
◄pyramid0.00►
◄ref_tint0.00►
◄base_seed-1►
◄overrides►
◄base_grid6►
◄time_block2►

What it's for

The first few sampling steps are where a video decides its composition and who the subject ends up being. That decision is made almost entirely by the noise you start from - which is why re-rolling a seed changes the layout so violently, and why a shot loop with the same seed everywhere produces shots that all secretly agree on the same coarse structure.

BFS Shot Noise is the starting noise for SamplerCustomAdvanced, with optional structure on top: you can share the coarse pattern across every shot, freeze part of it across time, or lean the noise toward your guide and reference. Leave every amount at 0 and it is exactly ComfyUI's RandomNoise for the same seed - that's the design constraint the author built around, and it's a good one. This is not a node that "improves" your baseline run.

How the shaping works

Everything here keeps the noise at unit variance, so the sampler still receives the amount of noise it expects - that's what stops these knobs from being an accidental strength slider.

  • shared_base replaces the coarse block averages of the noise with averages drawn from base_seed instead of the shot's seed. Fine detail stays per shot. The grid is defined in blocks (base_grid, default 6 along the short side) rather than latent cells, so the same base seed gives you the same coarse pattern at any resolution, and time_block (default 2 latent frames) makes it a long tape that each shot reads at its own timeline position. Give a successful shot's seed to base_seed and you keep its layout while the detail re-rolls - that's the feature, and it's why the input exists at all.
  • static_share mixes in a component that's identical in every frame. Temporally correlated noise, basically: it steadies things up, and the tooltip is honest that too much of it freezes your motion.
  • guide_structure encodes the guide with the vae and mixes it into the noise outside the mask, so the background starts closer to the guide. Without a mask it applies everywhere, which also pulls toward the original person.
  • ref_tint leans the noise inside the mask toward the reference image's average latent - its colours. Very small values only; 0.05–0.15.
  • distribution - gaussian (what the model was trained on), laplacian, student-t (heavier-tailed, so sparser and harder kicks) or uniform. spectrum_tilt and pyramid are two ways to push energy into the large scales: tilt is a 1/f^α spectrum, the pink/fractal noise the tooltip compares to AdvancedNoise's fractal alpha, and pyramid adds progressively coarser layers. The pitch: the coarse layout is where a swap is decided, so give it a harder push.

Inputs and outputs

Required: seed, shot_seed (same / increment / random per shot - only active when a shot is connected), and the four amounts plus distribution, spectrum_tilt and pyramid. The optional side is where the interesting bits live: shot brings the per-shot seeds and the timeline position, base_seed overrides which seed owns the coarse pattern (-1 means "use the one above"), overrides takes shot:seed pairs, base_grid and time_block tune the coarse grid, and vae + guide_frames + ref_image + mask are the inputs guide_structure and ref_tint need.

Two outputs: noise (NOISE) goes to SamplerCustomAdvanced - this is not a seed you can paste into a plain KSampler, which takes a seed and makes its own noise - and seed (INT), which is the seed that shot actually used. Wire that second one to your filename or a note node; it's the only way to reproduce a take.

Install

ComfyUI Manager: search ComfyUI-BFSNodes. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/alisson-anjos/ComfyUI-BFSNodes.git
pip install -r requirements.txt

Restart ComfyUI. No extra models - vae is the video VAE you're already loading.

When to bother, and the ways it bites

The author's own description of this node says it best: the model was trained on plain noise, so use small amounts and compare against 0. That's not boilerplate. All of this is off-distribution input, and a swap that follows the pose beautifully at guide_structure 0.1 can look like it's fighting the source person at 0.4. Suggested starting ranges, from the tooltips: shared_base 0.5–1, static_share 0.1–0.3, guide_structure 0.05–0.2, ref_tint 0.05–0.15, spectrum_tilt 0.2–0.6, pyramid 0.3–0.6.

Two concrete failure modes worth knowing before you blame the LoRA:

  • A red error from the node means you asked for a mix without the ingredients: guide_structure needs both vae and guide_frames, ref_tint needs vae and ref_image. The error text says so.
  • It only touches the video latent. If the latent isn't the joint video+audio structure, the node hands back untouched noise, and the audio half always stays gaussian regardless - don't expect these knobs to change the soundtrack.
  • shot_seed does nothing without a shot. No shot, no index to iterate: you get exactly the seed you typed. Intended behaviour, and the first thing to check when the node seems inert.
CategoryBFS/shot loop

Inputs (18)

NameTypeDefaultDescription
seedINT00–18446744073709550000The seed (the base seed when a shot is connected).
shot_seedCOMBOsame for every shotOnly with a shot connected: the seed of each shot (same / counting up / unrelated but repeatable).
shared_baseFLOAT0.000–10 = off (plain noise). The coarse pattern of the noise comes from base_seed instead of the shot's seed: every shot, any length or size, agrees on it; the fine detail stays per shot. 1 = fully shared. Try 0.5 - 1.
static_shareFLOAT0.000–0.90 = off. A part of the noise that is identical in every frame (temporally correlated noise). Try 0.1 - 0.3; too much freezes the motion.
guide_structureFLOAT0.000–0.60 = off. Needs guide_frames + vae. Outside the mask the guide's latent is mixed into the noise, so the background starts closer to the guide (without a mask: everywhere, which also pulls toward the original person). Try 0.05 - 0.2.
distributionCOMBOgaussiangaussian = what the model was trained on. laplacian / student-t: more extreme values (stronger, sparser kicks). uniform: none. All at unit variance. Like AdvancedNoise's types, but for H3's video + audio latent (the audio noise always stays gaussian).
spectrum_tiltFLOAT0.00-2–20 = off (white noise). > 0: more energy in the large blobs (fractal / pink noise, AdvancedNoise's 'fractal' alpha): the coarse layout, where the swap is decided, gets a harder push. < 0: more fine grain. Try 0.2 - 0.6; large values burn colours.
pyramidFLOAT0.000–0.950 = off. Adds coarser layers of noise (each half the size, weight = this value per level): another way to put more energy in the large scales. Try 0.3 - 0.6.
ref_tintFLOAT0.000–0.60 = off. Needs ref_image + vae. Inside the mask (everywhere without one) the noise leans toward the reference's average latent, i.e. its colours. Try 0.05 - 0.15.
shotoptBFS_SHOTFrom BFS Shot Planner / Unpack: per-shot seeds, and the shared base is read at the shot's position on the timeline.
base_seedoptINT-1-1–18446744073709550000Seed of the shared coarse pattern and of static_share. -1 = the seed above. Put here the seed of a result that worked to keep its coarse noise while the detail changes with the seed.
overridesoptSTRINGSeeds for single shots: 'shot:seed, shot:seed' (shots count from 1).
base_gridoptINT61–32Blocks of the coarse pattern along the short side (the long side in proportion). Fewer = only the broadest layout is shared.
time_blockoptINT21–32Latent frames per block of the coarse pattern.
vaeoptVAEThe video VAE, for guide_structure and ref_tint.
guide_framesoptIMAGEThe guide video frames (guide_structure).
ref_imageoptIMAGEThe reference picture (ref_tint).
maskoptMASKThe person, one mask per frame (white = the person): guide_structure stays outside it, ref_tint inside it.

Outputs (2)

NameTypeDescription
noiseNOISEFor SamplerCustomAdvanced.
seedINTThe seed this shot used.