Nodes/10S-Comfy-nodes/⏱️ Latent Motion Retime
ComfyUI Node

⏱️ Latent Motion Retime

Your upsampled latent moves 25% too fast — this is the fix

By TenStrip·Created 4 months ago·Updated 26 days ago· 244
⏱️ Latent Motion Retime
  • latent
  • latent
source_fps24.0
target_fps30.0
strength1.00
manual_scale0.00

Here's a subtle LTX trap that trips up almost everyone converting 24fps workflows to 30fps output: the model generates at its baked-in 24fps cadence, so when you resample the latent up to 30fps and play it back, everything runs about 25% fast. Objects dash, people power-walk, gestures feel frantic - and no amount of prompt nudging fixes it, because it's not a content problem, it's a pacing problem.

LatentMotionRetime is the post-hoc correction for exactly that. It's a one-latent-in, one-latent-out node that attenuates per-frame motion amplitude on an already-upsampled latent, which makes it the cleanup step after something like LatentTemporalUpsampler with auto_retime off.

How it works

The node computes a per-frame velocity field - the symmetric difference v[t] = (f[t+1] - f[t-1]) / 2 - then shifts each frame toward its temporal mean by a fraction of that velocity:

f_retimed[t] = f[t] - v[t] * (1 - scale) * strength

For a 24→30fps conversion, scale = source_fps / target_fps = 0.8, so each frame shifts by 20% of its velocity, reducing apparent speed by exactly that 20% that the frame-count inflation added. It's mathematically the inverse of the upsampler's pacing inflation.

The inputs

  • source_fps (24) and target_fps (30) - drive the scale automatically.
  • strength (1.0) - how much of the correction to apply. 1.0 is the full theoretical fix; drop to 0.5-0.7 if things feel slightly too slow or you want a snappier cut.
  • manual_scale (0.0) - if you set this above 0, it overrides the fps-derived scale entirely. Handy when your source/target ratio isn't a clean conversion, or you're doing the inverse (slowing a 30fps source to 24fps).

If the calculated attenuation is below ~0.0001 (i.e. the fps ratio is 1:1 and manual_scale is off), the node passes the latent through untouched - no harm, no re-encode.

Where it sits in the pipeline

The recommended fast-motion workflow in the pack's source is: KSampler at 24fps → LatentMotionSharpener → LatentTemporalUpsampler (auto_retime=True) → LatentTemporalInpainter → KSampler at denoise 0.30-0.45. LatentMotionRetime is the alternative to auto_retime=True - if you already upsampled with auto-retiming off, or you inherited an upsampled latent, run this afterward to recover the natural pace.

It's a pure latent-space op, so it's cheap and safe to A/B: run one branch with the node, one without, and compare playback. The correction happens before decode, so you never touch pixels. As with all the 10S nodes, install is the pack-wide clone (10S_Nodes into custom_nodes, restart, or ComfyUI Manager → "10S-Comfy-nodes"), no extra deps, and it's written for LTX's 5D latent layout.

Category10S Nodes/Latents

Inputs (5)

NameTypeDefaultDescription
latentLATENT
source_fpsoptFLOAT24.01–120
target_fpsoptFLOAT30.01–120
strengthoptFLOAT1.000–1
manual_scaleoptFLOAT0.000–2

Outputs (1)

NameTypeDescription
latentLATENT