APNext H3 De-Rope + Save Clip (Motion Lab by matlowai)
The fix for H3's fast-motion smear, fused into one node
- samples
- guider
- model
- vae
- audio
- audio_vae
- file_path
- report
APNext H3 De-Rope + Save Clip is where this pack stops being cute and gets genuinely clever. It fuses matlowai's "Motion Lab" de-rope pass into a single node that fixes H3's worst visual tell - the smeared, stringy interpolation you get when a clip's motion is too fast for the model's temporal upsampling - and then writes the result to disk. If you've ever watched an H3 render of someone turning their head quickly and thought "why does the back of their head look like rope," this is the answer to that specific grief.
The technique (all credit to matlowai's ComfyUI-MAINodes) is: find where motion is too fast, hold those frames, regenerate the clip v2v at partial denoise with the song stretched onto the held clock so lips stay on the lyric, then drop the held frames to recover exact real time. What this node adds is that the whole pipeline - H3JerkOracle → decode → H3TimeSmear → VAE encode → H3AudioSmear → H3V2VInit → H3InjectSchedule → partial-denoise sampling → decode → H3ExactRecover → save - runs per clip, freeing each clip's frames before the next. As ten separate nodes, every stage would cache every clip's frames and OOM a long song. As one node, an 18-scene song needs the RAM of a single clip.
Budget the time: a de-roped clip renders at roughly 2.4–3x its frame count. That's the price of the fix.
The inputs that matter
samples- the pass-1 sampler output (H3 AV latent). With a scene list wired in, each clip is de-roped and saved before the next is touched.guider- the sameBasicGuiderthe pass-1 sampler used (same model, same conditioning). Reuse the identical node.model- the patched H3 model, for the injection schedule.vae- the H3 video VAE.steps- default 14. Match your main sampler's step count;injectdecides how many actually run.inject0.5 = faithful (metric best), 0.7 = balanced, 0.8 = loose.q,d_max,bridge- the de-roping knobs:q(default 0.75) is the jerk quantile that counts as "too fast";d_max(4) is the peak hold on the hottest frames;bridge(8) closes valleys inside one burst. Tuneqdown toward 0.7 to catch more motion, up toward 0.85 for tighter, cheaper spans.enabled- off skips de-roping and saves pass-1 as-is. Handy for A/B.audio,audio_vae,audio_follow- the clip's song slice, the H3 audio VAE, and how hard pass 2 follows the stretched song. The default, "follow the original performance (0.5)", keeps dialogue and lip-sync through held spans; "invent freely" is the original Motion Lab behaviour (no audio seeding).
Outputs: file_path and a report string describing what the oracle decided.
Installing it - read this one
Yes, install the pack (comfyui_dagthomas, via Manager or git clone + pip install -r requirements.txt). But this node also requires ComfyUI-MAINodes (https://github.com/matlowai/ComfyUI-MAINodes) - it calls that pack's registered nodes rather than reimplementing them, so without it you get a runtime error: "node H3JerkOracle is not installed." The README's dependency list won't tell you this; the node's error message will. Install both, restart, then pull the H3 model files from the h3_music_video_masked_audio_derope.json example's download links.
Issues you'll actually hit
- Missing MAINodes - above.
- Audio wired but
audio_vaeempty: pass 2 invents its own audio, and held spans can come back with rushed lips. The console warns you. Wire the H3 audio VAE in. sampler_namedefaults toer_sde; if it's not in your build the list still includes the standard set. Match the main sampler for consistency.
If de-roping sounds like magic, it's not - it's a second, targeted render pass with the motion budget sorted out. That's why it costs 2.4–3x. For songs with a lot of movement, it's the difference between a music video and a slideshow with audio.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | The pass-1 sampler output (H3 AV latent). With a scene list wired in, each clip is de-roped and saved before the next one is touched. | |
| guider | GUIDER | The SAME BasicGuider the pass-1 sampler used (same model, same conditioning). | |
| model | MODEL | The patched H3 model (for the injection schedule). | |
| vae | VAE | The MiniMax H3 video VAE. | |
| filename_prefix | STRING | video/H3 | Wire a writer's `project_name` output so every run gets its own folder. |
| fps | FLOAT | 241–120 | — |
| format | COMBO | mp4/mkv use H.264, webm uses AV1. | |
| seed | INT | 00–18446744073709550000 | Noise seed for the de-rope regeneration pass. |
| steps | INT | 144–100 | Match the MAIN sampler's step count; `inject` decides how many actually run. |
| inject | FLOAT | 0.500.05–1 | How much of the denoise runs on the smeared init. 0.5 = faithful (metric best), 0.7 = balanced, 0.8 = loose. |
| scheduler | COMBO | beta | 6 options: beta, simple, normal, sgm_uniform, karras, exponential |
| sampler_name | COMBO | er_sde | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| q | FLOAT | 0.750.5–0.99 | Jerk quantile that counts as 'too fast'. Raise toward 0.85 for tighter spans (cheaper), lower toward 0.7 to catch more. |
| d_max | INT | 42–8 | Peak hold count on the hottest frames; 4 is the measured sweet spot. |
| bridge | INT | 80–20 | Close hold-map valleys inside one burst (prevents mid-burst hiccups). 0 = off. |
| enabled | BOOLEAN | true | Off = skip the de-rope entirely and save the pass-1 clip as-is. |
| audioopt | AUDIO | This clip's slice of the song (writer `audio_segments`). Used twice: stretched onto the held clock to seed pass 2's audio rows (keeps lip-sync through held spans), and muxed into the saved file. | |
| audio_vaeopt | VAE | The MiniMax H3 audio VAE - needed to seed pass 2's audio rows. | |
| audio_followopt | COMBO | follow the original performance (0.5) | How hard pass 2 follows the stretched song. 'follow the original performance' keeps dialogue/lip-sync through held spans; 'invent freely' skips audio seeding (the original Motion Lab behaviour). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| file_path | STRING | — |
| report | STRING | — |