TICK (JOV) ⏱
The frame counter and beat clock that drives animation
- ⚡
- VAL
- 🛟
- 🏎️
- ⚡
- BATCH
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.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| ⚡opt | * | Output to send when beat (BPM setting) is hit | |
| VALopt | INT | 00–9223372036854776000 | the current frame number of the tick |
| 🔄opt | INT | 00–9223372036854776000 | number of frames before looping starts. 0 means continuous playback (no loop point) |
| 🏎️opt | INT | 24 | Fixed frame step rate based on FPS (1/FPS) |
| BPMopt | INT | 1201–60000 | BPM trigger rate to send the input. If input is empty, TRUE is sent on trigger |
| 🎶opt | INT | 41–256 | Number of beats per measure. Quarter note is 4, Eighth is 8, 16 is 16, etc. |
| ✋🏽opt | BOOLEAN | false | Wait |
| RESETopt | BOOLEAN | false | Reset |
| BATCHopt | INT | 11–32767 | Number of frames wanted |
| 🦶🏽opt | INT | 00–9223372036854776000 | Steps/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)
| Name | Type | Description |
|---|---|---|
| VAL | INT | Current value for the configured tick as ComfyUI List |
| 🛟 | FLOAT | Normalized tick value (0..1) based on BPM and Loop |
| 🏎️ | FLOAT | Current '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 |