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.
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)
| Name | Type | Default | Description |
|---|---|---|---|
| shots | KINBURG_MORPHEUS_SHOT | The chain out of the last 'Morpheus Dream'. | |
| model | MODEL | The H3 model. 'MiniMax H3 Sigma Shift' is applied here automatically if the model doesn't already carry it. | |
| clip | CLIP | H3's text encoder (it also sees the keyframes). | |
| vae | VAE | The VIDEO vae. | |
| width | INT | 134432β4096 | Canvas 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. |
| height | INT | 76832β4096 | Canvas 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. |
| steps | INT | 301β1000 | Ignored when a 'sigmas' input is wired. |
| scheduler | COMBO | simple | Ignored when a 'sigmas' input is wired. |
| sampler_name | COMBO | euler | Ignored when a 'sampler' input is wired. |
| seed | INT | 00β18446744073709550000 | Base seed. Each shot samples with seed + shot index + its own seed_offset, so no two shots get the same noise. |
| shift_video | FLOAT | 12.000.01β100 | H3's video flow shift (drives the sigma schedule). Applied here unless the wired model already went through 'MiniMax H3 Sigma Shift'. |
| shift_audio | FLOAT | 3.000.01β100 | β |
| seam_trim | INT | 10β24 | Frames 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. |
| audio | COMBO | concat | concat = 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_ms | INT | 400β500 | Fade-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. |
| cache | COMBO | disk | disk = 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_tag | STRING | Free 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_preview | BOOLEAN | true | Stream 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_loaded | BOOLEAN | false | Leave 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_range | STRING | Render 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. | |
| trims | STRING | Frames 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_vaeopt | VAE | The AUDIO vae. Without it the video comes out silent. | |
| llm_configopt | KINBURG_LLM_CONFIG | Optional '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. | |
| sigmasopt | SIGMAS | Optional explicit schedule (overrides steps/scheduler). Build it from a model that already has the sigma shift applied, or it won't match. | |
| sampleropt | SAMPLER | Optional explicit sampler (overrides sampler_name). | |
| noiseopt | NOISE | Optional noise source; its seed becomes the base seed, and each shot still gets its own offset. Leave empty to use the 'seed' widget. | |
| lora_triggersopt | STRING | Comma-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)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | Every frame of the storyboard, in order. |
| audio | AUDIO | The whole soundtrack, normalised once and seam-ramped. |
| fps | FLOAT | 24.0 β the model's fixed rate, as a FLOAT so it drops straight into 'Create Video'. |
| last_frame | IMAGE | The last frame β the cover, or the start_frame of a later run. |
| report | STRING | Per-shot table: frames, seam trim, seed, write/sample times, cache hits, warnings. |
| prompts | STRING | The 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. |