In this document, Ctrl means Cmd on Mac.
ThemedSvgPanel
and ThemedSvgScrew
classes which automatically switch SVGs when dark panels are toggled."minRackVersion"
property to plugin manifest, which prevents Rack from downloading plugin if version is not compatible.ContextCreateEvent
and ContextDestroyEvent
not defining vg
NanoVG context.ParamQuantity::set/getValue()
set/get the Param's target value of the Engine's per-sample smoothing algorithm instead of the Param's immediate value. Add ParamQuantity::set/getImmediateValue()
. Deprecate ParamQuantity::set/getSmoothValue()
.dsp::polyDirect()
, dsp::polyHorner()
, and dsp::polyEstrin()
.dsp::approxExp2_taylor5()
to dsp::exp2_taylor5()
and improve polynomial coefficients.color::lerp()
.BooleanTrigger::processEvent()
and SchmittTrigger::processEvent()
.get()
helper function for std::vector
.ModuleWidget::getModule<TModule>()
convenience method.audio::Device::processBuffer()
before writing, to avoid sending uninitialized values to audio device.plugin-arm64.dylib
on Mac ARM64 so multiple plugin architectures can coexist in the same Rack user folder.CROSS_COMPILE
environment variable to specify target triplet for building plugins for non-native architectures.aarch64
in target triplet as alias for ARM64.SLUG-VERSION-OS-CPU.vcvplugin
.system::sleep()
.random::get()
, uniform()
, etc use global random state instead of thread-local.string::Version
documentation..vcv
patch file in Finder opens Rack and loads the patch.SvgButton
dispatch ActionEvent
only on left mouse down, instead of left/right mouse down and drag drop.zenity
for opening dialogs on Linux.-fno-omit-frame-pointer
.Redesign Module Browser with compact layout, adjustable zoom levels, sorting options, intelligent searching, and multiple tag selection.
Redesign component graphics and Core panels by Pyer.
Add port tooltips with name, voltage, and list of connected ports.
Add port context menu with ability to create cables with a particular color, drag any cable from the stack, or delete the top cable.
Evaluate mathematical expressions (such as 1+2*3
) in parameter context menu fields.
Add multiple module selection by highlighting a rectangle or Shift-clicking on a module panel.
Add importing/exporting module selections to new .vcvs
file format.
Add module whitelist to Module Browser which synchronizes individual modules chosen in the VCV Library.
Add favorite modules filter to Module Browser.
Restructure engine to no longer use an “engine thread”.
Replace module disabling with bypassing, which directly routes certain inputs to outputs if specified by the plugin.
Duplicate cables patched to inputs when a module is duplicated.
Add module tags to module context menu.
Add module manual URL (if plugin developer supplies it) to module context menu item.
Add quick access to user module patches from <Rack user dir>/presets/<plugin slug>/<module slug>
to module context menu. Supports subdirectories.
Add infinity and NaN protection to cables, so they won't propagate non-finite values from badly behaving modules.
Add basic headless support with the -h
flag.
Add multiple parameter dragging modes: scaled linear, absolute rotary, and relative rotary.
Add “knobLinearSensitivity” property to settings.
Add timestamps to MIDI messages.
Allow sending and receiving SysEx messages through MIDI drivers.
Allow scrolling with Alt+click and drag.
Add “File > Open recent” menu item for opening recent patches.
Add “Preset > Save template” to module context menu which saves the default module preset to load when a new instance is added to the rack.
Break Rack executable into libRack shared library and lightweight standalone Rack executable.
Add support for 1/2x and 1/4x low-fidelity sample rates to engine and “Engine > Sample rates” menu.
Add Escape key command for existing fullscreen, in case F11 doesn't work.
Copy cable color when cloning cables with Ctrl+click.
Fix key commands on AZERTY, Dvorak, and all other keyboard layouts.
Add Mouse device to Computer keyboard/mouse MIDI driver.
Make scrollbar mouse interaction similar to modern OS behavior.
Re-render framebuffers when subpixel offset changes, fixing bug that makes ports and knobs appear slightly offset at certain zoom levels.
Use new .vcv
patch format, an archive (POSIX tar compressed with Zstandard) of a patch.json
file, module patch assets, and potentially other future files.
Use randomly-generated 53-bit IDs to identify modules and cables in the patch.
Use a fuzzy search algorithm for searching modules in the Module Browser.
Add tips window which appears when Rack launches or when choosing “Help > Tips”.
Check for Library updates every few seconds to avoid needing to restart Rack to check for updates.
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.
Allow darkening rack brightness.
Draw spotlight near cursor when rack brightness is lowered.
Improve light rendering with a more physical blending algorithm.
Add engine CPU meter and framerate meter to menu bar.
Allow zooming rack with extra mouse buttons 4 and 5.
Add "pixelRatio"
to settings for forcing the UI pixel scale.
If Ctrl+clicking on any menu item, the menu stays open (except for some menu items like “Delete Module”).
Add Ctrl+F1 key command when cursor is hovering a module to open its user manual.
Redesign CPU meter with percentage history graph.
Add PulseAudio driver on Linux.
Distribute .pkg installer on Mac.
Check for VCV Library updates when Library menu is opened, rather than at time intervals.
Core
API
-march=nehalem
, enabling (and requiring) up to SSE4.2 and POPCNT instruction sets.Module::configInput()
and Module::configOutput()
for adding names to ports.ParamWidget::paramQuantity
with ParamWidget::getParamQuantity()
..modules[].manualUrl
to plugin manifest schema.appendAudioMenu()
and appendMidiMenu()
so plugin developers can develop custom audio/MIDI interfaces without adding an AudioWidget/MidiWidget
to their panel.Module::toJson()
and fromJson()
virtual.Module::paramsToJson()
and paramsFromJson()
virtual methods.SwitchQuantity
and a helper method Module::configSwitch()
for displaying named values in the parameter context menu. Also add Module::configButton()
recommended for momentary switches with no value labels.Engine::getNumModules()
and Engine::getModuleIds()
.event::KeyBase::keyName
. Plugins should use this instead of key
for alphanumeric keys in order to support all keyboard layouts.dsp::RingBuffer
.system::
.system::getTime()
and getUnixTime()
.system::readFile()
and writeFile()
.string::
functions dealing with filesystem paths to system::
.Module::id
and Cable::id
from int
to int64_t
.widget::Widget
class.Window::loadSvg()
. Un-deprecate Svg::load()
.Font
and Image
can no longer be stored across UI frames. Load them with APP->window->loadFont()
and loadImage()
each draw()
method.Widget::hasChild()
, addChildBottom()
, addChildBelow()
, addChildAbove()
, and drawChild()
.Module::createPatchStorageDirectory()
and getPatchStorageDirectory()
.createMenuLabel()
, createMenuItem()
, createCheckMenuItem()
, createBoolMenuItem()
, createBoolPtrMenuItem()
, createSubmenuItem()
, createIndexSubmenuItem()
, and createIndexPtrSubmenuItem()
to helpers.Module::onReset()
and onRandomize()
. Overrides default param resetting and randomization behavior if overridden, unless super methods are called.Module::SaveEvent
.Vec
.string::join()
, split()
, formatTime()
, and formatTimeISO()
.random::Xoroshiro128Plus
which can be used like C++ <random>
classes.Port::getVoltageRMS()
.Widget::drawLayer()
for handling multiple draw passes.dsp::SchmittTrigger
.dsp::convert()
template functions for converting audio between normalized floats and integers.bool app::SvgSwitch::latch
setting for latching button switches.Module::SampleRateChange
event when Module
is added to engine.rack::APP
, rack::DEBUG
, etc macros. Use namespace-less APP
, DEBUG
, etc instead.dsp::IIRFilter
.dsp::BiquadFilter
.dsp/approx.hpp
with approximate math functions.simd::tan()
, atan()
, and atan2()
.string::toBase64()
and fromBase64()
.string::absolutePath()
.-
and Ctrl+=
, or Ctrl+scroll, for zooming the rack.settings.json
.-p X
flag for dumping a screenshot of each available module.helper.py
for creating and manipulating plugins with the command-line.simd.hpp
for generically handling arithmetic and math functions for vectors of floats, accelerated with SSE.dsp::VuMeter2
.dsp::Timer
and dsp::Counter
.