Nodes/msch-comfyui-nodes/marioslideshow
ComfyUI Node

marioslideshow

Pick the folder, hit go, get an MP4 with a soundtrack

By mariobilly·Created a day ago·Updated a day ago· 0
marioslideshow
  • photos
  • images
  • audio
  • beats
  • focus
  • video
  • mp4_path
  • poster
  • fps
  • frame_count
image_folder
width1280
height720
fps30
timing
bpm128
beats_per_image4.0
seconds_per_image2.0
pacing
layout
framing
transition
transition_seconds0.28
intensity0.75
motion_blur
grain0.08
accent#DFFF40
graphicstrue
headlines
font_path
audio_file
quality
shufflefalse
seed0
filename_prefixmarioslideshow
show_countertrue
show_progresstrue
show_headlinestrue
headline_layers

Most ComfyUI video work is assembling a chain of ten nodes and praying they agree on formats. marioslideshow (the node is literally named marioslideshow) is the opposite: it's a single output node that turns a folder of photos into a finished, beat-cut, transitioned, subtitled MP4 with a soundtrack. You point it at images, type a few headlines, connect a song, and it renders the whole promo - Ken Burns-style motion, layout variety, graphic accents - streaming frames straight to disk instead of holding the movie in RAM. It's the flagship node of the MSCH Nodes pack, and it's what the rest of the pack's slideshow machinery ultimately drives.

How it works

Feed photos via image_folder (a path) or the photos/images sockets, and the node acts as a miniature director plus renderer. timing picks the cutting logic: BPM mode cuts on a musical grid - every beats_per_image beats (default 4 at 128 BPM) - while Seconds mode just uses seconds_per_image. pacing of Dynamic alternates full- and half-length shots for rhythm; layout cycles through art-directed compositions (full-frame, layered, split-screen); transition picks the wipe style (Mixed, Whip, Zoom, Diagonal, Shutter, Impact, or hard Cut) over transition_seconds. Add headlines (one per image, blank line = untitled shot) and a soundtrack via audio_file or the audio socket, and it encodes everything with motion blur, grain, and an accent color.

The engine detail worth knowing: frames are rendered and written out one at a time to a uniquely numbered output MP4 - the pack docs describe it as streaming frames rather than accumulating the whole movie in RAM - with a poster image and a JSON settings manifest saved alongside. So a long slideshow won't blow up your VRAM the way a frame-stacking graph can. quality (Preview/High/Master) trades encode speed and bitrate for file size.

The inputs that matter

For a first run you honestly need: photos (folder or sockets), timing + bpm + beats_per_image (or seconds), layout, transition, audio, and headlines. Everything else has sane defaults. framing of Smart fit preserves photo aspect ratios instead of force-cropping - leave it there unless you want aggressive fills. graphics, show_counter, show_progress and show_headlines toggle the chrome. shuffle + seed vary the order reproducibly.

Outputs

video (a native VIDEO you can preview), mp4_path (the file on disk - feed it to anything that wants a path), poster (a preview IMAGE), plus fps and frame_count if you want to chain further processing. It's an output node, so it also saves the file itself - you don't strictly need a Save Video downstream.

Install

One node in the unified MSCH Nodes pack. In ComfyUI Manager search "MSCH Nodes" / msch-comfyui-nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/mariobilly/msch-comfyui-nodes.git
cd msch-comfyui-nodes
python -m pip install -r requirements.txt

Then restart ComfyUI. Slideshow rendering pulls in the pack's heavier stack (opencv, imageio-ffmpeg for encoding, scipy) - those come with the pack requirements, no separate models.

Gotchas

The one that bites everyone is the BPM/audio relationship: BPM mode cuts on the beat number you give it; if you don't connect a soundtrack or a beat analysis, it still cuts on your typed BPM, which is fine for a metronome feel but won't land on the actual song. For true beat-sync, run the pack's MarioBeatAnalyzer and feed its beats into this node. Also, image_folder plus images together is a footgun - pick one source. And render time is linear in resolution, frames, and quality; Preview is your friend while you're iterating on layout, High or Master for the final.

Categorymarioslideshow

Inputs (34)

NameTypeDefaultDescription
image_folderSTRINGLeave empty when photos or images is connected.
widthINT128064–4096
heightINT72064–4096
fpsINT301–60
timingCOMBO2 options: BPM, Seconds
bpmFLOAT12820–300
beats_per_imageFLOAT4.01–16
seconds_per_imageFLOAT2.00.4–30
pacingCOMBODynamic alternates full and half-length shots; minimum 0.4 seconds.
layoutCOMBO4 options: Art directed mix, Full frame, Layered, Split screen
framingCOMBOSmart fit preserves photos when their aspect ratio differs strongly from the scene.
transitionCOMBO7 options: Mixed, Whip, Zoom, Diagonal, Shutter, Impact, +1
transition_secondsFLOAT0.280–1
intensityFLOAT0.750–1
motion_blurCOMBO3 options: Standard (3 samples), Off, Fine (5 samples)
grainFLOAT0.080–1
accentSTRING#DFFF40
graphicsBOOLEANtrue
headlinesSTRINGOne headline per image; blank lines leave that shot untitled.
font_pathSTRINGOptional .ttf or .otf file.
audio_fileSTRINGOptional local soundtrack; alternatively connect AUDIO.
qualityCOMBO3 options: High, Preview, Master
shuffleBOOLEANfalse
seedINT00–2147483647
filename_prefixSTRINGmarioslideshow
photosoptMARIO_IMAGES
imagesoptIMAGE
audiooptAUDIO
beatsoptMARIO_BEATS
focusoptMARIO_FOCUS
show_counteroptBOOLEANtrue
show_progressoptBOOLEANtrue
show_headlinesoptBOOLEANtrue
headline_layersoptSTRINGUse Edit headlines. Nonempty layers replace the automatic per-image headlines. Times are seconds from video start.

Outputs (5)

NameTypeDescription
videoVIDEO
mp4_pathSTRING
posterIMAGE
fpsFLOAT
frame_countINT