Shima Omnijog
A hardware shuttle wheel for 20 workflow parameters at once
- mux_out
Shima Omnijog is the strangest node in this pack, and the one people who like hardware-style UI will immediately fall for. It's a spring-loaded shuttle wheel, the kind you'd find on a video editing deck, that controls up to 20 workflow parameters. Spin the wheel to select a channel, use the +/- steppers to adjust its value, and each channel has its own label, step size, and LED color. It renders as a single compact control-room device on the canvas - and it's genuinely pleasant to use.
The point is consolidation. Instead of 20 primitive float nodes scattered across your graph, you get one node where CFG, SEED, and LORA1–LORA18 all live. The default labels are literally CFG, SEED, LORA1 … LORA18 - the pack's authors clearly built this for the classic "tweak sampler params and LoRA weights" workflow. Each channel has an independent step size, which matters: stepping CFG by 0.1 is sensible, stepping SEED by 0.1 is not, and the Omnijog lets you set those separately.
It's also the most "this is a UI, not a data node" of Shima's hardware widgets - the readout shows the active channel's value, and if that channel is wired through a DemuxList node, the readout switches from a number to the corresponding string label from the options array. The channel values and the active-channel selection persist in the workflow, so a saved workflow remembers which channel you were on.
How it works
Each channel's value, label, and step size are widget state (the val_*, label_*, and step_* inputs; values are JS-managed and hidden). On execution, the node packages the active rows channels into a single multiplexed dictionary: each channel label maps to a (label, float, int) tuple - so you get both the float value and its integer-rounded twin - plus a _active_ entry naming the current channel. That MUX travels down one wire, and downstream Demux nodes filter it by channel name to pull out a single value.
So the wiring pattern is: Omnijog mux_out → Demux (pick channel) → the channel's FLOAT/INT → whatever input you want to drive. For string selection, DemuxList converts an active MUX channel into a STRING via an options array, which is how the readout learns to display labels.
The inputs that matter
active_channel- which channel is selected (JS-managed).val_0–val_19- the per-channel values (hidden widgets).label_0–label_19- channel names (default CFG, SEED, LORA1–LORA18).step_0–step_19- per-channel step size.colors- comma-separated hex colors for the channel LEDs.rows- how many channels the LED bar shows (2–20).scale- visual size.
Output: mux_out (MUX) - the multiplexed signal carrying every channel.
How to install it
Part of the Shima pack - ComfyUI Manager, search "Shima", or:
cd ComfyUI/custom_nodes
git clone https://github.com/KDB-USJP/shima_wf.git Shima
restart. No extra dependencies; it's pure frontend + a dict-packing backend.
Common issues & troubleshooting
Demux returns the wrong value. The MUX keys on the label, not the index. Rename channel 3 to "SEED" and a Demux targeting "SEED" now reads channel 3. Keep labels unique, and if you're switching a channel's label, remember the downstream Demux follows the new name.
Channels beyond 8 don't appear. rows controls how many channels the UI actually surfaces. Bump rows up to see more of the 20 available.
Inputs (64)
| Name | Type | Default | Description |
|---|---|---|---|
| active_channel | STRING | CFG | — |
| val_0 | FLOAT | 0.000 | — |
| val_1 | FLOAT | 0.000 | — |
| val_2 | FLOAT | 0.000 | — |
| val_3 | FLOAT | 0.000 | — |
| val_4 | FLOAT | 0.000 | — |
| val_5 | FLOAT | 0.000 | — |
| val_6 | FLOAT | 0.000 | — |
| val_7 | FLOAT | 0.000 | — |
| label_0opt | STRING | CFG | — |
| label_1opt | STRING | SEED | — |
| label_2opt | STRING | LORA1 | — |
| label_3opt | STRING | LORA2 | — |
| label_4opt | STRING | LORA3 | — |
| label_5opt | STRING | LORA4 | — |
| label_6opt | STRING | LORA5 | — |
| label_7opt | STRING | LORA6 | — |
| step_0opt | FLOAT | 0.100 | — |
| step_1opt | FLOAT | 1.000 | — |
| step_2opt | FLOAT | 0.010 | — |
| step_3opt | FLOAT | 0.010 | — |
| step_4opt | FLOAT | 0.010 | — |
| step_5opt | FLOAT | 0.010 | — |
| step_6opt | FLOAT | 0.010 | — |
| step_7opt | FLOAT | 0.010 | — |
| colorsopt | STRING | #ffaa00,#00aaff,#55ff55,#ff55aa,#aa55ff,#ffaa55,#55ffff,#ffff55,#0055ff,#ff0055 | — |
| rowsopt | INT | 102–20 | — |
| scaleopt | FLOAT | 1.00.1–10 | — |
| val_8opt | FLOAT | 0.000 | — |
| val_9opt | FLOAT | 0.000 | — |
| val_10opt | FLOAT | 0.000 | — |
| val_11opt | FLOAT | 0.000 | — |
| val_12opt | FLOAT | 0.000 | — |
| val_13opt | FLOAT | 0.000 | — |
| val_14opt | FLOAT | 0.000 | — |
| val_15opt | FLOAT | 0.000 | — |
| val_16opt | FLOAT | 0.000 | — |
| val_17opt | FLOAT | 0.000 | — |
| val_18opt | FLOAT | 0.000 | — |
| val_19opt | FLOAT | 0.000 | — |
| label_8opt | STRING | LORA7 | — |
| label_9opt | STRING | LORA8 | — |
| label_10opt | STRING | LORA9 | — |
| label_11opt | STRING | LORA10 | — |
| label_12opt | STRING | LORA11 | — |
| label_13opt | STRING | LORA12 | — |
| label_14opt | STRING | LORA13 | — |
| label_15opt | STRING | LORA14 | — |
| label_16opt | STRING | LORA15 | — |
| label_17opt | STRING | LORA16 | — |
| label_18opt | STRING | LORA17 | — |
| label_19opt | STRING | LORA18 | — |
| step_8opt | FLOAT | 0.010 | — |
| step_9opt | FLOAT | 0.010 | — |
| step_10opt | FLOAT | 0.010 | — |
| step_11opt | FLOAT | 0.010 | — |
| step_12opt | FLOAT | 0.010 | — |
| step_13opt | FLOAT | 0.010 | — |
| step_14opt | FLOAT | 0.010 | — |
| step_15opt | FLOAT | 0.010 | — |
| step_16opt | FLOAT | 0.010 | — |
| step_17opt | FLOAT | 0.010 | — |
| step_18opt | FLOAT | 0.010 | — |
| step_19opt | FLOAT | 0.010 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| mux_out | MUX | — |