Nodes/Jovimetrix/TICK (JOV) ⏱
ComfyUI Node

TICK (JOV) ⏱

The frame counter and beat clock that drives animation

By Amorano·Created 3 years ago·Updated 12 months ago· 396
TICK (JOV) ⏱
  • VAL
  • 🛟
  • 🏎️
  • BATCH
VAL0
🔄0
🏎️24
BPM120
🎶4
✋🏽false
RESETfalse
BATCH1
🦶🏽0

Animation in ComfyUI needs a heartbeat. Something has to count frames, know what time it is, and tell the rest of the graph when to move. TICK is that heartbeat: a timer and frame counter that emits pulses and values based on time intervals, with FPS, BPM, and loop controls. It's the node that turns a static workflow into a sequence that runs itself.

It's stateful - it remembers where it is between runs. VAL is the current frame number (start it anywhere, default 0). Each execution steps it forward. 🔄 Loop sets how many frames pass before wrapping back to zero; 0 means continuous playback with no loop point. 🏎️ FPS (default 24) defines the frame rate, so "frame" and "time" stay in sync. BPM (default 120) drives the musical side: at every beat, the output fires. 🎶 sets beats per measure (4 is a quarter note, 8 is eighth, up to 256), giving you measure-level structure. ✋ Wait pauses the tick, RESET restarts it, BATCH says how many frames you want out of this run, and 🧶 sets the steps/stride between pulses - handy for odd-or-even batching; if it's 0, the tick stretches from VAL to Loop across the batch, producing a linear range instead of pulses.

The five outputs are the payload. VAL (INT, as a ComfyUI list) is the raw frame number - wire it anywhere a changing value drives something. 🛟 is the tick normalized to 0–1 based on BPM and Loop: that's your loop-friendly parameter, perfect for driving a LERP or an easing curve. 🏎️ is the current frame as a float in FPS terms. is the beat trigger: when a BPM beat lands, it outputs whatever you fed into the ⚡ input, or TRUE if you left it empty - the pulse that tells other nodes "now". BATCH is the whole batch of values for this run, formatted as a standard list that other Jovimetrix nodes understand.

The way you use it: feed a LERP the 🛟 normalized value to sweep a parameter back and forth over the loop. Use ⚡ to trigger a swap or a save exactly on the beat. Use VAL to stamp a frame number into a filename via STRINGER and SAVE OUTPUT. This is also a genuinely musical node - drop BPM to match a track and the beats line up with your animation.

Now the version note, because it matters: the current Jovimetrix keeps this classic BPM-driven design under the name TICK OLD (JOV) ⏱, and the "TICK (JOV)" name now belongs to a redesigned numeric-sequence generator (start/step/count, easing, normalization). If you've seen a TICK with START/STEP/COUNT and no BPM, that's the new one. The design on this page is the original beat-and-frame tick - and honestly, for syncing to music or driving simple loops, it's still the one a lot of people reach for.

Install is pack-wide: ComfyUI Manager → "Jovimetrix", or

cd ComfyUI/custom_nodes
git clone https://github.com/Amorano/Jovimetrix.git
pip install -r Jovimetrix/requirements.txt

then restart. Dependencies are the shared set - numpy, opencv-contrib-python, Pillow, matplotlib, cozy-comfyui helpers - no models. Keep ComfyUI at 0.1.3+ with a current frontend. And remember the pack split streaming/MIDI/GLSL nodes into separate Jovi_* packs in v2.0; TICK never left.

CategoryJOVIMETRIX 🔺🟩🔵/CALC

Inputs (10)

NameTypeDefaultDescription
opt*Output to send when beat (BPM setting) is hit
VALoptINT00–9223372036854776000the current frame number of the tick
🔄optINT00–9223372036854776000number of frames before looping starts. 0 means continuous playback (no loop point)
🏎️optINT24Fixed frame step rate based on FPS (1/FPS)
BPMoptINT1201–60000BPM trigger rate to send the input. If input is empty, TRUE is sent on trigger
🎶optINT41–256Number of beats per measure. Quarter note is 4, Eighth is 8, 16 is 16, etc.
✋🏽optBOOLEANfalseWait
RESEToptBOOLEANfalseReset
BATCHoptINT11–32767Number of frames wanted
🦶🏽optINT00–9223372036854776000Steps/Stride between pulses -- useful to do odd or even batches. If set to 0 will stretch from (VAL -> LOOP) / Batch giving a linear range of values.

Outputs (5)

NameTypeDescription
VALINTCurrent value for the configured tick as ComfyUI List
🛟FLOATNormalized tick value (0..1) based on BPM and Loop
🏎️FLOATCurrent 'frame' in the tick based on FPS setting
*Based on the BPM settings, on beat hit, output the input at '⚡'
BATCH*Current batch of values for the configured tick as standard list which works in other Jovimetrix nodes