vcv-osc
A VCV Rack module that opens the whole patch to OSC control — parameters, cables and modules, addressed by name.
active version 2.1.2, 27 July 2026 licence GPL-3.0-or-later
VCV Rack has no official external control interface: the only way in is a module loaded inside Rack’s process, and vcv-osc is that module, which also serves as osc-bridge’s VCV Rack target. Its main limit: adding and removing cables and modules goes through a layer of Rack that is not part of its stable interface; checked against SDK 2.6.1, it may break in a later version, whereas parameters rely on the stable interface only.
The patch as an address space
Rack already has OSC modules, but they carry signal: you wire a voltage channel to an address and values flow. vcv-osc acts on the structure of the patch. Every module, parameter and port has an address, and those addresses use the names the patch already contains: "Fundamental/VCO", "Frequency", "Sine". A mapping built once therefore still resolves after the patch is reloaded, which internal numbers do not guarantee.
The module also publishes an OSCQuery description of the live patch: TouchOSC or Open Stage Control read it and build a labelled fader, with the right range, for each parameter, with nothing mapped by hand.
Getting started
In Rack, open the module browser, search for “OSC” and add OSC Controller (VCV Library, “Roomi Fields” plugin). Its display shows the listening state, the reply target, the OSCQuery state and a message counter. By default it listens on UDP 7770, replies on 7771 and serves OSCQuery over HTTP on 7772.
With the Python client from the repository:
pip install python-osc
python client/vcv_osc_client.py dump
python client/vcv_osc_client.py set "Fundamental/VCO" "Frequency" 0.5
python client/vcv_osc_client.py cable-add "VCO" "Sine" "VCF" "Audio"
What it does
- Set and read a parameter:
/param/set,/param/get, by number or by name. - Follow a parameter:
/param/watchsends every change. - Add and remove a cable:
/cable/add,/cable/remove. - Add and remove a module, by identifier or by name and brand (
"Audible Instruments/Braids"); load and save a preset. - Describe the whole patch:
/state/dumpreturns modules, parameters, cables, named inputs and outputs;/state/watchreports structural changes. - List installed modules:
/registry/dump. - Build a control surface through OSCQuery, at
http://127.0.0.1:7772/.
Through osc-bridge, the module is the /vcv target: osc-bridge strips the prefix, forwards to 7770 and adds it back to replies received on 7771.
Common issues
A module number no longer points at the right module. Numbers only hold as long as the patch is not rebuilt. Address by name; "VCO:1" means the second instance. An ambiguous name returns /error with the list of candidates.
The module is reachable from the whole network. Ports 7770 and 7772 listen on every interface, with no password, so that a phone on the local network can connect; /module/preset_load and /module/preset_save read and write files on the machine. On a network that is not yours, firewall these ports or remove the module: without it, nothing listens.
Cables stop responding after a Rack update. This is the limit stated above. Parameters, the patch description and OSCQuery keep working; only the applyCable* and applyModule* functions in src/OscController.cpp need adapting.
Where it stands
Version 2.0.1 (17 July 2026) brought Windows; 2.1.0 (25 July), addressing by name, OSCQuery and adding or removing modules; 2.1.1, the same day, brand names. Version 2.1.2 renames the plugin “Roomi Fields” at VCV’s request; it has been in the VCV Library since 27 July 2026. Two end-to-end tests check the OSC layer and the HTTP transport without Rack.
Repository · VCV Library · osc-bridge · OSCQuery proposal
Thanks to Andrew Belt (VCV) for reviewing the submission: the plugin’s name now holds if more modules join it.
How it was made. Claude Code (Claude Opus 5.5), from the repository, its README and its release notes. Method