MD: PingPong FBG (Full Control)
The 60-knob sampler MD Nodes is built around
- scheduler
- SAMPLER
If you landed on this page, you probably loaded a workflow and found a wall of ~60 sampler knobs staring back at you. PingPong FBG ("Full Control") is the flagship sampler of MD Nodes, originally built for ACE-Step audio generation and later borrowed for image and video texture work. It's a bidirectional ancestral sampler with a feedback-guidance loop, and it returns a plain SAMPLER that drops into a standard KSampler - the complexity is all inside.
What the mechanism actually is
Ping-pong sampling runs a forward and backward pass inside each step (that's the "bounce"), which resolves fine detail that a one-directional solver blurs - the README's pitch is "hyper-detailed textures that standard samplers turn to mush." On top of that sits feedback guidance (FBG): it watches recent steps and tightens or loosens guidance dynamically, and it includes NaN recovery so a bad step degrades gracefully instead of nuking the latent.
The knobs cluster into a few ideas. Step randomization (step_random_mode: off / block / reset / step, with step_size) rotates the seed every N steps so repetitive texture doesn't lock in - block is the recommended default. Ancestral noise injection (first_ancestral_step, last_ancestral_step, ancestral_noise_type: gaussian / uniform / brownian) adds creativity mid-run, with brownian suggested for organic, analog texture. blend_mode controls how new noise mixes with the latent - lerp is fast, slerp preserves spherical structural integrity. enable_restarts plus restart_mode raises noise partway through so the model can fix detail mistakes, at the cost of render time.
What a beginner actually sets
Ignore most of the wall. You'll touch these:
scheduler(required) - wire in the SIGMA schedule from the pack's Hybrid, GITS, or Noise Decay scheduler.seed,step_random_mode,step_size- texture variation.first_ancestral_step/last_ancestral_step- leave at 0 / -1 (disabled) for deterministic diffusion; raise the first one to 3–5 if your initial composition is messy.fbg_sampler_mode-EULERis recommended for standard ACE-Step audio;PINGPONGfor the full bidirectional path.enable_clamp_output- leave False; audio latents routinely exceed 1.0.enable_restarts+restart_mode- the detail fixer.
For the curious, dynamic CFG lives here too (cfg_start/end_sigma, fbg_start/end_sigma, max_guidance_scale), along with posterior factors (pi, t_0, t_1). Two parameters - fbg_eta and fbg_s_noise - are marked DEPRECATED in the schema; ignore them. You can also override everything by feeding YAML into yaml_settings_str, which is where MD_YAML_Utils earns its keep.
The straight talk
Don't start with this node. PingPongSamplerNodeLite and Basic wrap the same core with sane presets (noise_behavior, a couple of toggles) - use those to learn, then graduate to FBG when you need the production control. It's genuinely the pack's production workhorse for ACE-Step audio, and the concept traces back to blepping's original PingPong sampler, which MDMAchine credits and has also contributed to the HOT-Step-CPP C++ runtime. But for a plain image person it's overkill, and its home turf - ACE-Step music generation - is a real but niche corner of the ecosystem. If that's your corner, this is the sampler to learn.
Installing it
cd path/to/ComfyUI/custom_nodes
git clone https://github.com/MDMAchine/ComfyUI_MD_Nodes.git
cd ComfyUI_MD_Nodes
pip install -r requirements.txt
Or search MD_Nodes in ComfyUI Manager and restart. The solver logic lives in the pack's core/ subpackage (source ships with the repo); if that import ever fails, the node returns a fallback dummy instead of crashing - so if sampling suddenly does nothing, check your ComfyUI console for a core import error.
Inputs (57)
| Name | Type | Default | Description |
|---|---|---|---|
| step_random_mode | COMBO | block | STEP RANDOMIZATION MODE • Purpose: Controls how the seed evolves during sampling steps. • Options: off (static), block (periodic), reset (per-step), step (incremental). • Trade-offs: 'reset' is chaotic, 'off' is rigid. ⭐ Recommended: 'block' for best texture variation. |
| step_size | INT | 41–100 | STEP SIZE INTERVAL • Purpose: Defines how many sampling steps occur before the seed rotates. ⭐ Recommended: 4-10 steps. |
| seed | INT | 800850–9007199254740991 | RANDOM SEED • Purpose: Base JS-Safe seed for noise generation. |
| first_ancestral_step | INT | 0 | FIRST ANCESTRAL STEP • Purpose: The step index to begin injecting ancestral noise. ⭐ Recommended: Increase to 3-5 if initial structural composition is messy. |
| last_ancestral_step | INT | -1 | LAST ANCESTRAL STEP • Purpose: The step index to stop injecting ancestral noise. ⭐ Recommended: -1 (Disable entirely) for standard deterministic diffusion. |
| ancestral_noise_type | COMBO | gaussian | ANCESTRAL NOISE TYPE • Purpose: The statistical distribution of the injected noise. • Options: Gaussian (standard bell), Uniform (flat limits), Brownian (correlated). ⭐ Recommended: Brownian for highly organic/analog textures. |
| start_sigma_index | INT | 0 | START SIGMA INDEX • Purpose: Skip early sampling steps (used for img2img routing). |
| end_sigma_index | INT | -1 | END SIGMA INDEX • Purpose: Halt sampling early. |
| enable_clamp_output | BOOLEAN | false | CLAMP OUTPUT • Purpose: Forces all output latent values strictly into the [-1, 1] range. ⭐ Recommended: False for audio generation (audio latents often exceed 1.0). |
| scheduler | SCHEDULER | SCHEDULER INPUT • Purpose: Connects the sigma schedule (from Basic/Hybrid/GITS node). | |
| blend_mode | COMBO | lerp | BLEND MODE (PRIMARY) • Purpose: Mathematical approach for mixing new noise with the latent. ⭐ Recommended: 'lerp' for speed, 'slerp' for spherical structural integrity. |
| step_blend_mode | COMBO | lerp | STEP BLEND MODE (SECONDARY) • Purpose: Interpolation used for internal dual-step calculations. |
| fbg_sampler_mode | COMBO | EULER | FBG INTERNAL MODE • Purpose: Defines the fundamental ODE solver step logic. ⭐ Recommended: EULER for standard Ace-Step audio models. |
| cfg_scale | FLOAT | 1.00-1000–1000 | CFG SCALE (BASE) • Purpose: Classifier-Free Guidance magnitude. |
| cfg_start_sigma | FLOAT | 1.00 | CFG START SIGMA |
| cfg_end_sigma | FLOAT | 0.00 | CFG END SIGMA |
| fbg_start_sigma | FLOAT | 1.00 | FBG START SIGMA |
| fbg_end_sigma | FLOAT | 0.00 | FBG END SIGMA |
| max_guidance_scale | FLOAT | 10.00 | MAX GUIDANCE CAP • Purpose: Hard ceiling limit for dynamic CFG scaling. |
| initial_guidance_scale | FLOAT | 1.00 | INITIAL GUIDANCE • Purpose: Starting CFG magnitude. |
| fbg_guidance_multiplier | FLOAT | 1.00 | FBG MULTIPLIER • Purpose: Strength of the feedback loop correction. |
| guidance_max_change | FLOAT | 1000.00 | MAX CHANGE PER STEP • Purpose: Velocity limit for guidance scaling. |
| pi | FLOAT | 0.50 | PI (POSTERIOR FACTOR) |
| t_0 | FLOAT | 0.50 | T0 OFFSET |
| t_1 | FLOAT | 0.40 | T1 TEMP FACTOR |
| fbg_temp | FLOAT | 0.00 | FBG TEMPERATURE |
| fbg_offset | FLOAT | 0.00 | FBG OFFSET |
| fbg_eta | FLOAT | 0.00 | DEPRECATED: Legacy ETA parameter. |
| fbg_s_noise | FLOAT | 1.00 | DEPRECATED: Legacy noise scale. |
| max_posterior_scale | FLOAT | 3.00 | MAX POSTERIOR SCALE |
| log_posterior_initial_value | FLOAT | 0.00 | INITIAL LOG POSTERIOR |
| log_posterior_ema_factor | FLOAT | 0.00 | POSTERIOR EMA |
| adaptive_noise_scaling | BOOLEAN | false | ADAPTIVE NOISE SCALING |
| noise_scale_factor | FLOAT | 1.00 | NOISE SCALE FACTOR |
| progressive_blend_mode | BOOLEAN | false | PROGRESSIVE BLEND |
| conditional_blend_mode | BOOLEAN | false | CONDITIONAL BLEND |
| conditional_blend_sigma_threshold | FLOAT | 0.50 | BLEND THRESHOLD |
| conditional_blend_function_name | COMBO | slerp | CONDITIONAL BLEND FUNC |
| conditional_blend_on_change | BOOLEAN | false | BLEND ON CHANGE |
| conditional_blend_change_threshold | FLOAT | 0.10 | CHANGE THRESHOLD |
| clamp_noise_norm | BOOLEAN | false | CLAMP NOISE NORM |
| max_noise_norm | FLOAT | 1.00 | MAX NOISE NORM |
| gradient_norm_tracking | BOOLEAN | false | GRADIENT TRACKING: Unused. |
| enable_profiling | BOOLEAN | false | ENABLE PROFILING |
| debug_mode | INT | 00–2 | DEBUG MODE |
| tensor_memory_optimization | BOOLEAN | false | MEMORY OPTIMIZATION |
| early_exit_threshold | FLOAT | 0.00 | EARLY EXIT THRESHOLD |
| ancestral_start_sigma | FLOAT | 1.00 | ANCESTRAL START |
| ancestral_end_sigma | FLOAT | 0.00 | ANCESTRAL END |
| sigma_range_preset | COMBO | Custom | SIGMA RANGE PRESET |
| enable_restarts | BOOLEAN | false | ENABLE RES 2 RESTARTS |
| yaml_settings_stropt | STRING | YAML OVERRIDE | |
| checkpoint_steps_stropt | STRING | CHECKPOINT STEPS | |
| restart_modeopt | COMBO | balanced | RESTART MODE |
| restart_noise_scaleopt | FLOAT | 0.50 | RESTART NOISE SCALE |
| restart_s_noiseopt | FLOAT | 1.00 | RESTART S_NOISE |
| restart_stepsopt | STRING | CUSTOM RESTART STEPS |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | — |