Shift Clock Sampler
MiniMax-H3's Audio Sounds Blown Because Your Sampler Is On The Wrong Clock
- model
- model
- sampler
MiniMax H3 (33B, omni-modal, native stereo audio) generates picture and sound in one pass - the whole reason to use it over Wan 2.2 or LTX-2.3, and the reason a stock sampler quietly wrecks your audio.
H3 is one transformer, but video and audio denoise on different rectified-flow shifts - 12 for video, 3 for audio by default. ComfyUI's normal single-clock sampler walks both packed streams with the video delta, so audio gets stepped ~4× too hard: clipped, noise-like garbage at 4 Turbo steps, and subtly wrong at 20.
This node isn't a LoRA or a model - it's a sampler plus a model patch that replaces KSamplerSelect in an advanced H3 workflow.
What it actually does
A MiniMax-H3 AV latent is one packed tensor: video values, then audio values, concatenated. A stock sampler applies a single sigma trajectory to the whole thing, because that's all it knows how to do.
This node does what MiniMax's own two-scheduler loop does. It clones your model, swaps in a sampling class whose audio_scale is pinned to 1.0 - killing ComfyUI's native audio carry - then runs Euler (or res_multistep) with two clocks. Each step takes the video sigma from the incoming sigmas, maps it onto the audio clock with the shift ratio, and blends the audio slice on its own clock: x_next = r·x + (1−r)·x0, where r = σ_next/σ. That's the official MiniMaxH3Scheduler blend, done in float32 so half precision doesn't eat your waveform.
res_multistep is the same idea with two decoupled histories, one for each stream, falling back to plain Euler on the first and last step.
One detail that matters the moment you drop denoise below 1.0 (img2vid, continuation): the sampler rebuilds the audio slice at its own starting sigma instead of initializing it on the video clock, while masked regions keep the video-clock mix so inpaint wrappers still see a consistent state.
The inputs that matter
Four of them, and you'll only touch two after the first setup.
model - your H3 diffusion model, Turbo LoRA applied upstream if you're using one. The output model carries the patched sampling, so it has to feed your guider and your scheduler.
integrator - euler by default. The dropdown is context-sensitive and confuses people: the schema lists all 44 native ComfyUI samplers because that's the comfy_native list, and the pack's frontend narrows it to euler / res_multistep the moment you switch to dual-clock. Only those two work there; anything else raises a hard error.
shift_video (default 12) and shift_audio (default 3) - the author's numbers are the official H3 ones. 768p Turbo recipes sometimes want shift_video around 6. Leave shift_audio at 3 until you have a specific complaint.
sampling_mode (optional, default dual_clock) - the escape hatch. On comfy_native you get back the unmodified model plus ComfyUI's normal sampler, shifts ignored. A complete bypass, not a half-measure: great A/B switch, terrible setting to leave on by accident while wondering why the node does nothing.
Two outputs: model → BasicGuider and BasicScheduler, and sampler → SamplerCustomAdvanced.sampler. BasicScheduler still owns your step count and denoise; the sigmas it hands over are the video clock, and the sampler maps audio onto it.
Installing it
No models, no dependencies - pyproject.toml declares dependencies = [] and there's no requirements.txt, so this is one of the rare packs that physically can't break your environment. Given that dependency conflicts are the loudest complaint in the ComfyUI ecosystem, enjoy it.
ComfyUI Manager: search the pack name ComfyUI-ShiftClockSampler (or the node, Shift Clock Sampler) and install. Manual, if you prefer:
cd ComfyUI/custom_nodes
git clone https://github.com/cicalooo/ComfyUI-ShiftClockSampler
Then fully restart ComfyUI - not a browser refresh. It lands under sampling/custom_sampling/samplers.
Alongside it you still need the H3 weights and VAE through your H3 loader, plus the Turbo LoRA as a separate model-only LoRA node upstream. The pack won't rebuild a fixed 4-step sigma grid either - the scheduler you connect is used as-is.
Where people get burned
A sampler-only swap. Swapping KSamplerSelect for this node and leaving everything else alone doesn't work. If the model output doesn't reach the guider, ComfyUI carries audio onto the video clock before your loop even starts. Start from an official H3 advanced workflow, keep SamplerCustomAdvanced, rewire both outputs.
Stacking it on ComfyUI-MiniMaxH3-DualAxis. The author says it plainly in the README: that pack assumes the pre-ModelSamplingAV protocol and will double-scale your audio on current ComfyUI. One dual-clock solution at a time.
"could not find packed MiniMax-H3 video/audio latent shapes." That error means the sampler got a latent it can't split - almost always a wiring problem or a non-AV H3 latent, not a bug. Same class of problem as the width-mismatch error, which fires when the packed latent doesn't equal video+audio slice sizes.
Blaming the sampler for bad audio at 4 steps. Turbo at 4-8 steps is where the single-clock error is worst, so this node helps most there - but a Turbo LoRA cranked too high will still sound rough. Take base H3 at 20 steps, euler, simple as your sanity baseline before tuning shifts. CFG 1.0 throughout; the negative prompt is doing nothing.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| integrator | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| shift_video | FLOAT | 12.000.01–100 | — |
| shift_audio | FLOAT | 3.000.01–100 | — |
| sampling_modeopt | COMBO | dual_clock | dual_clock uses separate video/audio clocks. comfy_native returns the unmodified model and Comfy's stock sampler. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| sampler | SAMPLER | — |