| @@ -31,7 +31,7 @@ brew install git wget cmake autoconf automake libtool jq python | |||||
| On Ubuntu 16.04+: | On Ubuntu 16.04+: | ||||
| ```bash | ```bash | ||||
| sudo apt install git gdb curl cmake libx11-dev libglu1-mesa-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev zlib1g-dev libasound2-dev libgtk2.0-dev libjack-jackd2-dev jq | |||||
| sudo apt install unzip git gdb curl cmake libx11-dev libglu1-mesa-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev zlib1g-dev libasound2-dev libgtk2.0-dev libjack-jackd2-dev jq | |||||
| ``` | ``` | ||||
| On Arch Linux: | On Arch Linux: | ||||
| @@ -3,9 +3,9 @@ | |||||
| <a id="acronym"></a> | <a id="acronym"></a> | ||||
| ## What does "VCV" stand for? | ## What does "VCV" stand for? | ||||
| There is no official meaning of the name "VCV", but users have suggested "Virtual Control Voltage" or "Voltage Controlled Virtualization". | |||||
| There is no official meaning of the name "VCV", but some users have suggested "Virtual Control Voltage" or "Voltage Controlled Virtualization". | |||||
| These are good guesses, but "VCV" was chosen simply because it is easy to remember and type. | These are good guesses, but "VCV" was chosen simply because it is easy to remember and type. | ||||
| "VCV Rack" is the full name of our flagship software product. | |||||
| [VCV Rack](https://vcvrack.com/Rack) is the full name of our flagship software product. | |||||
| <a id="userfolder"></a> | <a id="userfolder"></a> | ||||
| @@ -15,6 +15,7 @@ Key commands documented in Rack's [menu bar](MenuBar.html) are not documented he | |||||
| - **Ctrl+=**: Zoom in. | - **Ctrl+=**: Zoom in. | ||||
| - **Scroll**: Scroll rack vertically. | - **Scroll**: Scroll rack vertically. | ||||
| - **Shift+scroll**: Scroll rack horizontally. | - **Shift+scroll**: Scroll rack horizontally. | ||||
| - **Ctrl+scroll**: Zoom in/out. | |||||
| - **Middle mouse button drag**: Pan rack view. | - **Middle mouse button drag**: Pan rack view. | ||||
| - **Arrow keys**: Pan rack view. You can use Ctrl, Shift, or Ctrl+shift to change the speed of scrolling. | - **Arrow keys**: Pan rack view. You can use Ctrl, Shift, or Ctrl+shift to change the speed of scrolling. | ||||
| - **Ctrl+V**: Pastes a new module at the cursor position, from the module context menu "Preset > Copy" or Ctrl+C. | - **Ctrl+V**: Pastes a new module at the cursor position, from the module context menu "Preset > Copy" or Ctrl+C. | ||||
| @@ -179,7 +179,7 @@ The core functionality times two. If multiple channels are a requirement for the | |||||
| Expands the functionality of a "mother" module when placed next to it. Expanders should inherit the tags of its mother module. | Expands the functionality of a "mother" module when placed next to it. Expanders should inherit the tags of its mother module. | ||||
| ### `External` | ### `External` | ||||
| Interfaces with hardware or software outside VCV Rack such as a MIDI/audio interface, webcam, DAW, robotic dog, etc. | |||||
| ### `Filter` | ### `Filter` | ||||
| *Deprecated aliases: `VCF`, `Voltage controlled filter`* | *Deprecated aliases: `VCF`, `Voltage controlled filter`* | ||||
| @@ -189,7 +189,7 @@ Expands the functionality of a "mother" module when placed next to it. Expanders | |||||
| ### `Function generator` | ### `Function generator` | ||||
| Generates complex envelopes or cycles via a large selection of general parameters. | |||||
| ### `Granular` | ### `Granular` | ||||
| @@ -218,16 +218,17 @@ Implements binary logic with gate signals. | |||||
| *Deprecated aliases: `Low pass gate`, `Lowpass gate`* | *Deprecated aliases: `Low pass gate`, `Lowpass gate`* | ||||
| ### `MIDI` | ### `MIDI` | ||||
| Generates, processes, or interprets MIDI messages, e.g. for a MIDI interface. | |||||
| ### `Mixer` | ### `Mixer` | ||||
| Mixes/sums audio with optional level adjustment, panning, and/or mix buses. | |||||
| ### `Multiple` | ### `Multiple` | ||||
| Copies an input directly to multiple outputs. | |||||
| While VCV Rack supports stacking cables on output ports, users sometimes prefer organizing their cables with multiples, allowing easy access to each cable. | |||||
| ### `Noise` | ### `Noise` | ||||
| Generates audio-rate or CV-rate random noise. | |||||
| ### `Oscillator` | ### `Oscillator` | ||||
| *Deprecated aliases: `VCO`, `Voltage controlled oscillator`* | *Deprecated aliases: `VCO`, `Voltage controlled oscillator`* | ||||
| @@ -239,7 +240,7 @@ Implements binary logic with gate signals. | |||||
| ### `Physical modeling` | ### `Physical modeling` | ||||
| Simulates a physical system such as a string, metal bar, vocal chords, chaotic system, celestial bodies, etc. | |||||
| ### `Polyphonic` | ### `Polyphonic` | ||||
| *Deprecated aliases: `Poly`* | *Deprecated aliases: `Poly`* | ||||
| @@ -1,6 +1,6 @@ | |||||
| # Migrating v1 Plugins to v2 | # Migrating v1 Plugins to v2 | ||||
| The API of VCV Rack v2 has been designed to be nearly backward-compatible with v1 plugins, so updating your plugin to v2 likely only involves the following step and a recompile. | |||||
| The API of VCV Rack v2 has been designed to be nearly backward-compatible with v1 plugins, so updating your plugin to v2 likely only involves a version update and a recompile. | |||||
| ## Update plugin version to v2 | ## Update plugin version to v2 | ||||
| @@ -32,8 +32,33 @@ If your plugin compiles successfully, you are ready to test and release. | |||||
| Or, you may take advantage of new v2 features below. | Or, you may take advantage of new v2 features below. | ||||
| ## Potential bugs | |||||
| ### Avoid keeping `Font` (and `Image`) references across multiple frames | |||||
| *Rack for DAWs* uses a different OpenGL context each time the plugin editor window is closed and reopened. | |||||
| This means that if you load a `Font` in a widget's constructor with `font = APP->window->loadFont(...)`, the OpenGL font reference will be invalid if the window is reopened later. | |||||
| Instead, save only the font path, and fetch the font each frame in `draw()`. Example: | |||||
| ```cpp | |||||
| std::shared_ptr<Font> font = APP->window->loadFont(fontPath); | |||||
| if (font) { | |||||
| nvgFontFaceId(args.vg, font->handle); | |||||
| ... | |||||
| } | |||||
| ``` | |||||
| `loadFont()` caches the font by its path, so this operation can be efficiently called in `draw()` every frame. | |||||
| *All of the above also applies to `Image` and `loadImage()`.* | |||||
| ## Optional v2 API features | ## Optional v2 API features | ||||
| ### SVG load function | |||||
| `Window::loadSvg()` has been moved to `Svg::load()`. Search and replace: | |||||
| ```bash | |||||
| perl -i -pe 's/APP->window->loadSvg\b/Svg::load/g' src/* | |||||
| ``` | |||||
| ### Port labels | ### Port labels | ||||
| TOOD | TOOD | ||||
| @@ -44,11 +69,3 @@ TODO | |||||
| ### TODO | ### TODO | ||||
| ```bash | |||||
| perl -i -pe 's/(\w+)_PARAM\b/PARAM_$1/g' src/* | |||||
| perl -i -pe 's/(\w+)_BUTTON\b/BUTTON_$1/g' src/* | |||||
| perl -i -pe 's/(\w+)_SWITCH\b/SWITCH_$1/g' src/* | |||||
| perl -i -pe 's/(\w+)_INPUT\b/INPUT_$1/g' src/* | |||||
| perl -i -pe 's/(\w+)_OUTPUT\b/OUTPUT_$1/g' src/* | |||||
| perl -i -pe 's/(\w+)_LIGHT\b/LIGHT_$1/g' src/* | |||||
| ``` | |||||
| @@ -23,7 +23,7 @@ You may wish to add this line to your `~/.bashrc` or other shell environment, so | |||||
| The `helper.py` script included in the Rack SDK is an easy way to create a plugin template. | The `helper.py` script included in the Rack SDK is an easy way to create a plugin template. | ||||
| You can run it with no arguments to show documentation. | You can run it with no arguments to show documentation. | ||||
| Decide on a [slug](Manifest.html#slug) for your plugin. | |||||
| Choose a [slug](Manifest.html#slug) for your plugin, a unique string containing letters, numbers, `-`, or `_`. | |||||
| We will use `MyPlugin` for this tutorial. | We will use `MyPlugin` for this tutorial. | ||||
| Run | Run | ||||
| ```bash | ```bash | ||||