Nodes/Kinburg-Nodes/Morpheus (Video Sampler) πŸŒ™
ComfyUI Node

Morpheus (Video Sampler) πŸŒ™

Samples a chain of 'Morpheus Dream' nodes into one long video with sound: each shot's last frame becomes the next shot's first keyframe. Handles the 24 fps frame grid, the seam frame, one global audio normalisation, and a disk cache of sampled latents so editing one shot doesn't re-run the whole storyboard.

By KinburgΒ·Created 2 months agoΒ·Updated 3 days agoΒ· 1
Morpheus (Video Sampler) πŸŒ™
  • shots
  • model
  • clip
  • vae
  • audio_vae
  • llm_config
  • sigmas
  • sampler
  • noise
  • images
  • audio
  • fps
  • last_frame
  • report
  • prompts
β—„width1344β–Ί
β—„height768β–Ί
β—„steps30β–Ί
β—„schedulersimpleβ–Ί
β—„sampler_nameeulerβ–Ί
β—„seed0β–Ί
β—„shift_video12.00β–Ί
β—„shift_audio3.00β–Ί
β—„seam_trim1β–Ί
β—„audioconcatβ–Ί
β—„seam_fade_ms40β–Ί
β—„cachediskβ–Ί
β—„cache_tagβ–Ί
β—„live_previewtrueβ–Ί
β—„llm_keep_loadedfalseβ–Ί
β—„shots_rangeβ–Ί
β—„trimsβ–Ί
β—„lora_triggersβ€”β–Ί
CategoryKinburg-Nodes/Bestiary/Morpheus

Inputs (27)

NameTypeDefaultDescription
shotsKINBURG_MORPHEUS_SHOTThe chain out of the last 'Morpheus Dream'.
modelMODELThe H3 model. 'MiniMax H3 Sigma Shift' is applied here automatically if the model doesn't already carry it.
clipCLIPH3's text encoder (it also sees the keyframes).
vaeVAEThe VIDEO vae.
widthINT134432–4096Canvas width for EVERY shot (they are concatenated, so one canvas for the whole storyboard). Rounded to a multiple of 32. H3's own budget is a 768 short edge with a 768*1344 area cap; going over it is slow and out of distribution, and the report says so.
heightINT76832–4096Canvas height. Match the aspect ratio of your keyframes: H3 STRETCHES the first frame onto the canvas and does not crop it, so a mismatch distorts the whole shot. The report warns when it spots one.
stepsINT301–1000Ignored when a 'sigmas' input is wired.
schedulerCOMBOsimpleIgnored when a 'sigmas' input is wired.
sampler_nameCOMBOeulerIgnored when a 'sampler' input is wired.
seedINT00–18446744073709550000Base seed. Each shot samples with seed + shot index + its own seed_offset, so no two shots get the same noise.
shift_videoFLOAT12.000.01–100H3's video flow shift (drives the sigma schedule). Applied here unless the wired model already went through 'MiniMax H3 Sigma Shift'.
shift_audioFLOAT3.000.01–100β€”
seam_trimINT10–24Frames dropped from the HEAD of every shot that starts from a keyframe. 1 (default) removes the duplicate β€” a continuing shot's first frame is the previous shot's last frame. Higher values also cut the re-acceleration: the model is handed a still frame, which carries position but no velocity, so every shot eases its motion in from rest and the subject appears to speed up again at each seam. 3-6 usually swallows it; each frame costs 1/24 s of that shot. The shot's audio is trimmed by the same amount, so sound stays in sync. Costs nothing to try: trimming is done at decode time, so cached shots are re-used.
audioCOMBOconcatconcat = decode each shot's audio, trim it to the shot's exact length, ramp the seams and normalise the whole track once. mute = silent track of the right length (still valid for Create Video). Needs 'audio_vae' wired; without it the track is silent.
seam_fade_msINT400–500Fade-out/fade-in ramp on each audio seam, in ms. Kills the click where two independently generated soundtracks meet. Not a crossfade: nothing overlaps, so the audio never shifts against the picture.
cacheCOMBOdiskdisk = cache each shot's sampled LATENTS under user/kinburg-nodes/minimax_shots (~7 MB per shot). Editing shot 5 then re-samples 5..N and replays 1..4. off = always re-sample.
cache_tagSTRINGFree text folded into every cache key. The key covers architecture + LoRA patches, NOT the exact weight file β€” so if you swap to another H3 checkpoint of the same size, bump this to invalidate.
live_previewBOOLEANtrueStream the in-loop LLM's writing to a 'Kinburg Live Log' node, one labelled block per shot ('refine 2/4 (opening)'). Only does anything when 'llm_config' is wired.
llm_keep_loadedBOOLEANfalseLeave the LLM in memory between shots instead of shutting its worker down after every call. Faster (no reload per seam) but it holds its VRAM and RAM while H3 samples β€” on 12 GB with a 26B model that means OOM. Off is the safe default: the LLM is loaded, used and killed around each shot.
shots_rangeSTRINGRender only part of the chain: '' = all, '3' = shot 3, '2-4' = shots 2..4. Shots after the range are skipped entirely; shots before it are still needed for the handoff frame (free if cached). Handy while you design the opening shots.
trimsSTRINGFrames dropped from the TAIL of each shot β€” a comma list, last value repeating, the same shape 'durations' and 'links' take. Blank (default) trims nothing and behaves exactly as before. This is Orpheus' output. H3's shot lengths move in a 0.708 s quantum and bar lines do not, so a cut that has to land on a downbeat is reached by generating the first legal length LONGER than the music needs and dropping the overshoot here. Generate long, cut on the beat. Costs nothing to change: trimming happens at decode, so cached shots replay. The next shot's first frame moves to the cut point with it, and the shot's audio slot shrinks to match, so picture and sound stay together. Note it competes with 'seam_trim' for room β€” a shot is never trimmed below 5 frames, and the report says when it was clamped.
audio_vaeoptVAEThe AUDIO vae. Without it the video comes out silent.
llm_configoptKINBURG_LLM_CONFIGOptional 'Local LLM Settings (GGUF)' WITH a 'Vision Settings (GGUF)' mmproj. Wire it and the writer gets to see the frame each shot really starts on: just before sampling a shot whose first frame was inherited, the LLM reworks that shot's opening from the actual pixels instead of the forecast it was written against. Per-shot control is the 'refine' widget on 'Morpheus Dream' (the Storyboard node sets it for you). Leave empty and shots are sampled exactly as they arrive.
sigmasoptSIGMASOptional explicit schedule (overrides steps/scheduler). Build it from a model that already has the sigma shift applied, or it won't match.
sampleroptSAMPLEROptional explicit sampler (overrides sampler_name).
noiseoptNOISEOptional noise source; its seed becomes the base seed, and each shot still gets its own offset. Leave empty to use the 'seed' widget.
lora_triggersoptSTRINGComma-separated LoRA trigger words, added to EVERY shot's prompt β€” wire the 'triggers' output of 'Lora Unlim Accumulator' here. They go in just before the prompt's [Negative] section, never after it, and are re-applied after the in-loop writer runs, so neither the storyboard's layout nor an LLM rewrite can lose them. A trigger already present in the text (case-insensitive) is not repeated.

Outputs (6)

NameTypeDescription
imagesIMAGEEvery frame of the storyboard, in order.
audioAUDIOThe whole soundtrack, normalised once and seam-ramped.
fpsFLOAT24.0 β€” the model's fixed rate, as a FLOAT so it drops straight into 'Create Video'.
last_frameIMAGEThe last frame β€” the cover, or the start_frame of a later run.
reportSTRINGPer-shot table: frames, seam trim, seed, write/sample times, cache hits, warnings.
promptsSTRINGThe prompts that were ACTUALLY sampled, ---separated β€” after any in-loop rework, so this is the text that made this video. Same format 'prompt_overrides' takes on the Storyboard node.