Nodes/Jovi_MIDI/MIDI READER (JOV_MIDI)
ComfyUI Node

MIDI READER (JOV_MIDI)

Plug a MIDI controller into ComfyUI and let it turn the knobs

By Amorano·Created 2 years ago·Updated about a year ago· 5
MIDI READER (JOV_MIDI)
    • MIDI
    • ON
    • CHANNEL
    • CONTROL
    • NOTE
    • VALUE
    • NORMALIZE
    DEVICE

    MIDI READER is the node this whole pack exists for. It's the thing that takes a physical MIDI controller - a keyboard, a launchpad, a fader bank, even a cheap USB knob box - and puts its live output inside your ComfyUI graph as data you can wire into anything. The rest of Jovi_MIDI is plumbing around it.

    Here's how it actually works, because the mechanism explains every quirk you'll hit. When ComfyUI starts, the node asks the mido library for the list of input ports on your machine and bakes that list into the DEVICE dropdown. When you pick one, a background thread opens it (mido.open_input(...) with a callback) and every incoming message updates a snapshot inside the node: whether a note is currently held, the channel, control number, note number, and value. The node marks itself "changed" when a message lands, so ComfyUI re-runs your graph live - that's the real-time part.

    The outputs are all in the node's info_schema, and they're well-named. MIDI is the pack's custom JMIDIMSG bus - the full message you can hand to the filter or message nodes. Then come the readable forms: ON (boolean, note held or not), CHANNEL, CONTROL, NOTE (all ints), VALUE (the raw 0–127 control/velocity value), and NORMALIZE (value / 127, so a 0–1 float). That last one is what you'll feed straight into things like CFG, denoise, or seed as a live knob.

    A typical wiring: READER → MIDI FILTER → TRIGGER to gate a block of the workflow, or READER → MIDI MESSAGE and pull the numbers you want. The JMIDIMSG type is custom, so it only plugs into other JOV_MIDI (or Jovimetrix) sockets - you have to go through those nodes to get plain numbers out.

    Installing it

    The pack is Amorano's - Alexander Morano, "Joviex" on r/comfyui - and it's the MIDI section of his big Jovimetrix pack, split out so you don't have to install the whole thing. Install once for all five nodes:

    # via ComfyUI Manager: search "Jovi_MIDI"
    cd ComfyUI/custom_nodes
    git clone https://github.com/Amorano/Jovi_MIDI.git
    pip install -r requirements.txt
    

    No model files to download - it's hardware plumbing, not weights. The one dependency to watch: requirements.txt pulls mido[ports-rtmidi] (the actual MIDI backend) and a git+ install of cozy_comfyui (the author's node framework). If Manager leaves either behind, run the pip line manually and restart ComfyUI.

    Where people get burned

    • Your device isn't in the dropdown. The device list is captured at startup. Plug the controller in before launching ComfyUI, or restart. If it still never shows up, check that no other app (DAW, another ComfyUI instance) is holding the port - a busy device just logs errors and keeps retrying.
    • The mod wheel does nothing. The reader only reacts to note_on, note_off, and control_change messages. Pitch bend and aftertouch are silently ignored - that's in the source, not a setup problem.
    • You want knob→widget, not knob→graph. There's a more popular tool for the "turn knob to move a slider" job: ComfyUI ControlFreak, which maps any controller straight to any widget with zero graph surgery. Jovi_MIDI takes the opposite approach - the message becomes data your workflow logic reacts to, which is more flexible and more work.

    If you just want to wiggle CFG with a fader, either path works. If you want the graph to decide what a controller does, READER is your node.

    CategoryJOV_MIDI 🎛️

    Inputs (1)

    NameTypeDefaultDescription
    DEVICEoptCOMBO0 options:

    Outputs (7)

    NameTypeDescription
    MIDIJMIDIMSG
    ONBOOLEAN
    CHANNELINT
    CONTROLINT
    NOTEINT
    VALUEFLOAT
    NORMALIZEFLOAT