Rack v2 is being worked on, but it’ll be a while before I get around to publishing the source code.
Coming in Rack v2: Port tooltips with voltage readings of all polyphonic channels.
Rack v2 is being worked on, but it’ll be a while before I get around to publishing the source code.
Coming in Rack v2: Port tooltips with voltage readings of all polyphonic channels.
Coming in Rack v2: There is no more “engine thread”. The engine can only be stepped (i.e. advanced in time) by other threads, such as the audio driver thread managed by VCV Audio or the encoder thread in VCV Recorder. This restructuring has a number of massive benefits.
Module::process()
) directly in the “DAW thread”. Locking the DAW thread to wait on another thread is somewhat unacceptable.Proposal for a module whitelist:
By the way, after I approve a proposal, potential changes will typically not be reconsidered until the next Rack major version. So if you have objections or alternative proposals, get them in now before you miss the boat.
Various minor features for Rack 2.0:
Add module bypass routing API, which replaces module disabling, so developers can specify direct routes from inputs to outputs when users “bypass” the module.
Add infinity and NaN protection to cables, so they won’t propagate non-finite values from badly behaving modules. (Performance not fully tested, could be removed.)
Duplicating modules also duplicates their input cables.
void appendAudioMenu(ui::Menu* menu, audio::Port* port);
void appendMidiMenu(ui::Menu* menu, midi::Port* port);
so plugin developers can develop custom audio/MIDI interfaces without adding an AudioWidget/MidiWidget
to their panel like VCV Audio-8, MIDI-CV, etc.
Full support for numpad keys, such as Enter to open the Module Browser and Ctrl-0/Minus/Plus for zooming the rack.
Evaluate mathematical expressions in parameter context menu fields.
MenuSeparator
instead of MenuEntry
for separating menu items.Recent features and fixes in Rack v2:
Add basic headless support with the -h
flag. It simply loads the given patch or autosave without a window.
Add multiple knob modes: scaled linear, absolute rotary, and relative rotary.
Add “knobLinearSensitivity” property to settings.
Add timestamps to MIDI messages, and use them in Core MIDI modules to improve timing and drastically reduce clock jitter.
Allow SysEx messages through MIDI drivers.
This is the first public screenshot of VCV Rack for DAWs, specifically VCV Rack for VST2 Linux. Not pictured, the sine output of VCV VCO-1 is patched into VCV Audio-8, which is using the new “Host” audio/MIDI driver that communicates with the DAW instead of your sound card. VST parameters (soon including labels, units, and actual values) control the parameters of Rack modules. Audio is as stable as can be, since there is no thread-switching overhead as with Rack v1.
The actual VST2 plugin is a ~100KB binary, which dynamically links to a lib-ized version of Rack. This allows for many plugin variations, such as effect/instrument, 2/8/16-channel, and potential VST3/AU/AAX/LV2 plugins, without having N copies of the entire Rack binary.
The source code is maintained in a private git branch and is rebased for every new v2
commit. This means that features and bug fixes added to Rack v2 will immediately be available for Rack for DAWs, so they will follow the same version numbers and will usually be released same-day.
After testing on the other OS’s and DAWs, I’ll focus on windowing, graphics, and improving mouse/keyboard interaction.
Added “MPE mode” to MIDI-CC and MIDI-Gate in Rack v2 which generates 16-voice signals with CC values and gates. Along with MIDI-CV, which already supports MPE in Rack v1, this allows you to take advantage of all features with polyphony on MPE-enabled devices, such as the LinnStrument, ROLI Seaboard, Haken Continuum, Eigenharp, Soundplane, and others.
Added SwitchQuantity
to Rack v2. Instead of displaying 0, 1, 2, etc for switches, this displays the actual value names instead.
Usage example:
configSwitch(MODE_PARAM, 0, 1, 1, "Engine mode", {"Digital", "Analog"});
In Rack v2, VCV MIDI-CC now supports 14-bit CC commands (i.e. MSB on CC 0-31, LSB on CC 32-63). The Gamepad MIDI driver now generates 14-bit CC commands.
Added VCV Audio-2 module which I expect will become the “default” audio interface module in most users’ patches since stereo in/out is usually all that is needed.
Made UI tweaks to more closely follow Grayscale’s design. The above screenshot demonstrates all these changes. This includes removing the LED glow/halo effect, brightening up the PJ301M port graphic, and toning down drop shadows.
Added fix suggested by @stoermelder to allow plugins to register their own audio/MIDI drivers. For example, it will be possible to create a plugin that installs an audio driver that communicates with an Arduino over a serial connection and exposes CV as a 1000 Hz audio interface. You will then be able to select the “My Custom Arduino Protocol” driver in VCV Audio, and it will handle resampling as needed. Or, register a MIDI device that converts MIDI CC messages to/from your custom Arduino protocol. I’m sure there are many ideas the plugin developer community can invent with this API.
Finished “library-izing” Rack.
To run the standalone GPLv3 version of Rack, you will launch a small wrapper executable (~100KB) which only contains a main()
function that initializes/destroys the Rack application state.
The rest of the code is in libRack.so/dylib/dll
. Rack for DAWs will come with VST2 plugin binaries (and possibly VST3/AU/AAX later) that link to this library as well.
You could theoretically embed this library into your own application and use only the parts you need, such as the plugin loader and engine.
However, I have not yet tested this use case in depth so it will not be supported in Rack v2.0.
Low-fidelity sample rates will be officially supported and offered in the UI, so plugin developers need to add support for these if their code makes assumptions about possible sample rates.
Rack v2 has switched from using key codes to key names, which correctly handle all keyboard layouts such as AZERTY or Dvorak.
Plugin developers should use e.keyName == "q"
instead of e.key == GLFW_KEY_Q
for checking printable keys. Non-printable keys should still use e.key
, e.g. e.key == GLFW_KEY_ESCAPE
.
More information in the docstrings when Rack v2 source code is released.
Overhauled Rack engine threading model. Now all Engine
methods are thread-safe and can safely be called from anywhere, with a few additional rules specified in the docstrings.
Performance of threading is improved, and after all bugs are fixed with public testing, engine stability will be increased (decreased thread-related crashes).
Removed engine pausing. This feature no longer makes sense after the recent engine restructure that allows modules to be processed on the audio thread.
Allow disabling smoothing for MIDI-CV (pitch and mod wheel), MIDI-CC, and MIDI-Map.
Add several module presets for many Core modules.
API
Engine::getNumModules()
and Engine::getModuleIds()
to query the Engine’s modules.Added Mouse device to “Computer keyboard/mouse” MIDI driver. This converts your mouse cursor position to MIDI CC 0 and 1 to be used with VCV MIDI-CC. Supports 14-bit MSB/LSB MIDI CC.
The tentative release plan for Rack v2 and Rack for DAWs is the following. By “wait”, I mean “ensure that a certain amount of time passes before the next step”.
The following people will be granted beta builds and licenses of Rack for DAWs at no charge.
I am requesting plugin developer feedback for this proposal.
Rack v2 has a new .vcv
patch format, which is a compressed folder containing the JSON-serialized patch.json
file and other files, such as module patch assets. Read more:
Other changes:
system::
.string::
functions dealing with filesystem paths to system::
.This is my (extremely) tentative feature wishlist for Rack v3.
The theme of Rack v3 is “massive performance improvements through architectural overhauls”.
simd::float_8
etc.Module::processBuffer()
.To respond to any of these blog posts, click on the grey timestamp in the top-right of the post and click “New Topic”
Previously you saw switch tooltips and port tooltips added to Rack v2, but now lights have tooltips as well, optionally appearing if the module’s developer has named them with Module::configLight()
.
Add a tip window which appears when Rack launches or when choosing “Help > Tips”. Currently there are about 20 tips, which I hope to expand to 50 in upcoming versions.
Use a fuzzy search algorithm for searching modules in the Module Browser.
VCV Rack v2 development is mostly finished, with only restructuring due to Rack for DAWs, review, and testing to be completed. Features and improvements posted in this thread are only a small subset of the complete list of changes. The full changelog will be available when the source code of Rack v2 is released.
However, there is more to be done to Rack for DAWs, the VCV website, the VCV Library, and related business/marketing before Rack v2 and Rack for DAWs can be released. I will continue to use this thread for Rack for DAWs development news.
Recent changelog:
Redesign Module Browser with compact layout, adjustable zoom levels, sorting options, intelligent searching, and multiple tag selection.
When clicking on a module in the Module Browser and immediately releasing, place the module in the last cursor position in the rack, rather than the current cursor position.
When clicking and dragging a module from the Module Browser, fix the mouse handle offset to the center of the module.
Check for Library updates every few seconds to avoid needing to restart Rack to check for updates.
Add DC blocker setting to Audio modules. On Audio-2, enable it by default.