@@ -2,20 +2,20 @@ | |||||
## Setting up your development environment | ## Setting up your development environment | ||||
Before building Rack, you must install build dependencies provided by your system's package manager. | |||||
Before building Rack or Rack plugins, you must install build dependencies provided by your system's package manager. | |||||
Rack's own dependencies (GLEW, glfw, etc) do not need to be installed on your system, since specific versions are compiled locally during the build process. | Rack's own dependencies (GLEW, glfw, etc) do not need to be installed on your system, since specific versions are compiled locally during the build process. | ||||
However, you need proper tools to build Rack and these dependencies. | However, you need proper tools to build Rack and these dependencies. | ||||
### Mac | ### Mac | ||||
Install [Homebrew](https://brew.sh/), and install the build dependencies. | |||||
Install [Homebrew](https://brew.sh/), and install build dependencies. | |||||
```bash | ```bash | ||||
brew install git wget cmake autoconf automake libtool jq | brew install git wget cmake autoconf automake libtool jq | ||||
``` | ``` | ||||
### Windows | ### Windows | ||||
If you have an anti-virus program running, disable it. | |||||
If you have an anti-virus program running, disable it or it may interfere with the build process. | |||||
Install [MSYS2](http://www.msys2.org/) and launch the MinGW 64-bit shell from the Start menu, *not the default MSYS shell*. | Install [MSYS2](http://www.msys2.org/) and launch the MinGW 64-bit shell from the Start menu, *not the default MSYS shell*. | ||||
```bash | ```bash | ||||
@@ -23,24 +23,26 @@ pacman -Syu | |||||
``` | ``` | ||||
Then restart the shell. | Then restart the shell. | ||||
```bash | ```bash | ||||
pacman -Su git wget make tar unzip zip mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake autoconf automake mingw-w64-x86_64-libtool mingw-w64-x86_64-jq | |||||
pacman -Su git wget make tar unzip zip mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-cmake autoconf automake mingw-w64-x86_64-libtool mingw-w64-x86_64-jq | |||||
``` | ``` | ||||
### Linux | ### Linux | ||||
On Ubuntu 16.04: | |||||
On Ubuntu 18.04+: | |||||
```bash | ```bash | ||||
sudo apt install git 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 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: | ||||
```bash | ```bash | ||||
pacman -S git wget gcc make cmake tar unzip zip curl jq | |||||
pacman -S git wget gcc gdb make cmake tar unzip zip curl jq | |||||
``` | ``` | ||||
## Building Rack | ## Building Rack | ||||
*If the build fails for you, please report the issue with a detailed error message to help the portability of Rack.* | |||||
You do not need to build Rack to build plugins if you use the Rack SDK. | |||||
*If the build fails for you, please [report the issue](FAQ.html#i-found-a-bug) to help the portability of Rack.* | |||||
Clone this repository with `git clone https://github.com/VCVRack/Rack.git` and `cd Rack`. | Clone this repository with `git clone https://github.com/VCVRack/Rack.git` and `cd Rack`. | ||||
Make sure there are no spaces in your absolute path, since this breaks the Makefile-based build system. | Make sure there are no spaces in your absolute path, since this breaks the Makefile-based build system. | ||||
@@ -66,11 +68,12 @@ Run Rack. | |||||
## Building Rack plugins | ## Building Rack plugins | ||||
Be sure to check out and build the version of Rack you wish to build your plugins against. | |||||
Plugins can be built in two ways: | |||||
- [Build Rack from source](#building-rack) and build plugins in the `plugins/` directory. | |||||
- Download a build of Rack and the Rack SDK, and build plugins anywhere you like. | |||||
It is recommended to download plugins to Rack's `plugins/` directory, e.g. | |||||
Download or clone the plugin source code, e.g. | |||||
cd plugins | |||||
git clone https://github.com/VCVRack/Fundamental.git | git clone https://github.com/VCVRack/Fundamental.git | ||||
Clone the git repo's submodules. | Clone the git repo's submodules. | ||||
@@ -82,3 +85,12 @@ Build the plugin. | |||||
make dep | make dep | ||||
make | make | ||||
If using the Rack SDK, specify its location with | |||||
RACK_DIR=<Rack SDK dir> make dep | |||||
RACK_DIR=<Rack SDK dir> make | |||||
To build, package, and install plugins to your Rack user directory in one step, run | |||||
make install |
@@ -24,7 +24,6 @@ The **INPUT** section sends up to 8 Rack signals to a hardware audio device for | |||||
- [ASIO](https://en.wikipedia.org/wiki/Audio_Stream_Input/Output) on Windows | - [ASIO](https://en.wikipedia.org/wiki/Audio_Stream_Input/Output) on Windows | ||||
- [ALSA](http://alsa-project.org/main/index.php/Main_Page) on Linux | - [ALSA](http://alsa-project.org/main/index.php/Main_Page) on Linux | ||||
- [JACK](http://www.jackaudio.org/) on Linux | - [JACK](http://www.jackaudio.org/) on Linux | ||||
- [VCV Bridge](Bridge.html) | |||||
After a driver is selected, a particular **device** can be chosen for the driver. | After a driver is selected, a particular **device** can be chosen for the driver. | ||||
If the device has more than 8 inputs or outputs, you can select the desired range of outputs, offset by a factor of 8. | If the device has more than 8 inputs or outputs, you can select the desired range of outputs, offset by a factor of 8. | ||||
@@ -48,7 +47,6 @@ Each MIDI interface module (described below) supports the following drivers. | |||||
- Windows MIDI on Windows | - Windows MIDI on Windows | ||||
- ALSA on Linux | - ALSA on Linux | ||||
- JACK on Linux | - JACK on Linux | ||||
- [VCV Bridge](Bridge.html) | |||||
- Gamepad | - Gamepad | ||||
- Computer keyboard | - Computer keyboard | ||||
@@ -71,7 +69,7 @@ The **CV** output generates a 1V/oct pitch signal of the last held MIDI note. | |||||
**VEL** generates a CV signal from 0V to 10V of the velocity, **AFT** generates aftertouch CV (channel pressure, not polyphonic aftertouch), **PW** generates pitch wheel CV from -5V to 5V, and **MW** generates mod wheel CV. | **VEL** generates a CV signal from 0V to 10V of the velocity, **AFT** generates aftertouch CV (channel pressure, not polyphonic aftertouch), **PW** generates pitch wheel CV from -5V to 5V, and **MW** generates mod wheel CV. | ||||
**RTRG** generates a 1 ms trigger when a new note is pressed. | **RTRG** generates a 1 ms trigger when a new note is pressed. | ||||
**CLK1** and **CLK2** generate triggers specified by the division set by right-clicking on the panel and selecting the *CLK 1 rate* or *CLK 2 rate*. | **CLK1** and **CLK2** generate triggers specified by the division set by right-clicking on the panel and selecting the *CLK 1 rate* or *CLK 2 rate*. | ||||
**STRT**, **STOP**, and **CONT** generate triggers when the MIDI hardware or DAW host (for VCV Bridge) sends a start, stop, or continue event. | |||||
**STRT**, **STOP**, and **CONT** generate triggers when the MIDI device sends a start, stop, or continue event. | |||||
### MIDI-4 | ### MIDI-4 | ||||
@@ -23,8 +23,8 @@ See **Performance** above. | |||||
## I found a bug. | ## I found a bug. | ||||
Search [Rack's issue tracker](https://github.com/VCVRack/Rack/issues?q=is%3Aissue) to check whether someone else has posted a similar issue. | |||||
If you believe the problem has never been reported before, [open an issue](https://github.com/VCVRack/Rack/issues/new/choose) on GitHub with a detailed report containing the following information. | |||||
Search [Rack's issue tracker](https://github.com/VCVRack/Rack/issues?q=is%3Aissue) to check if someone else has posted a similar issue. | |||||
If you believe the problem has never been reported before, [create a GitHub account](https://github.com/) (it's free) and [open an issue](https://github.com/VCVRack/Rack/issues/new/choose) with a detailed report containing the following information. | |||||
- Your operating system and version | - Your operating system and version | ||||
- The Rack version | - The Rack version | ||||
@@ -34,13 +34,13 @@ If you believe the problem has never been reported before, [open an issue](https | |||||
## I have a feature request. | ## I have a feature request. | ||||
Search [Rack's issue tracker](https://github.com/VCVRack/Rack/issues?q=is%3Aissue) to check whether someone else has posted a similar feature request. | |||||
If you believe the feature has never been posted before, [open an issue](https://github.com/VCVRack/Rack/issues/new/choose) on GitHub with a detailed report containing the following information. | |||||
Search [Rack's issue tracker](https://github.com/VCVRack/Rack/issues?q=is%3Aissue) to check if someone else has posted a similar feature request. | |||||
If you believe the feature has never been requested before, [create a GitHub account](https://github.com/) (it's free) and [open an issue](https://github.com/VCVRack/Rack/issues/new/choose) with a detailed report containing the following information. | |||||
- Your proposal, with consideration for how it fits into Rack's existing features | - Your proposal, with consideration for how it fits into Rack's existing features | ||||
- A possible workflow or diagram (if your request involves multiple steps or UI states, e.g. dragging multiple modules simultaneously). | - A possible workflow or diagram (if your request involves multiple steps or UI states, e.g. dragging multiple modules simultaneously). | ||||
Your feature request may be addressed during the next period of new feature design of Rack. | |||||
Your feature request may be addressed during the next iteration of feature design of Rack. | |||||
If your request is judged to be not sufficiently useful to other users, it may be closed. | If your request is judged to be not sufficiently useful to other users, it may be closed. | ||||
## How do I load a default patch when selecting File > New? | ## How do I load a default patch when selecting File > New? | ||||
@@ -7,8 +7,8 @@ However, if you are experiencing performance issues, make sure you have the foll | |||||
- Operating system: MacOS 10.7+, Windows 7+, or Linux (Ubuntu 16.04+, etc) | - Operating system: MacOS 10.7+, Windows 7+, or Linux (Ubuntu 16.04+, etc) | ||||
- CPU: Intel/AMD 64-bit processor from \~2011 or later | - CPU: Intel/AMD 64-bit processor from \~2011 or later | ||||
- Graphics: Dedicated Nvidia/AMD graphics card from \~2013 or later. Integrated (non-dedicated) graphics such as Intel HD/Iris are not recommended and cause significantly increased CPU usage. | - Graphics: Dedicated Nvidia/AMD graphics card from \~2013 or later. Integrated (non-dedicated) graphics such as Intel HD/Iris are not recommended and cause significantly increased CPU usage. | ||||
- RAM: 1GB+ | |||||
- Disk space: 1GB+ | |||||
- RAM: 1GB | |||||
- Disk space: 1GB | |||||
## Installing Rack | ## Installing Rack | ||||
@@ -72,5 +72,6 @@ Or with the command-line, `cd` into the `Rack` directory and run `./Rack`. | |||||
To launch Rack from the command line, `cd` into Rack's directory, and run `./Rack`. | To launch Rack from the command line, `cd` into Rack's directory, and run `./Rack`. | ||||
- `-d`: Enables development mode | - `-d`: Enables development mode | ||||
- `-g <path>`: Sets Rack's global directory | |||||
- `-l <path>`: Sets Rack's local directory | |||||
- `-g <dir>`: Sets Rack's global directory | |||||
- `-l <dir>`: Sets Rack's local directory | |||||
- `<patch filename>`: Loads a patch file |
@@ -3,7 +3,7 @@ | |||||
This is a step-by-step guide for migrating plugins using the Rack v0.6 API to Rack v1. | This is a step-by-step guide for migrating plugins using the Rack v0.6 API to Rack v1. | ||||
There are three phases of porting. | There are three phases of porting. | ||||
- **Phase 1**: Quickly produces a valid Rack v1 plugin. | - **Phase 1**: Quickly produces a valid Rack v1 plugin. | ||||
- **Phase 2**: Modernizes your plugin by replacing deprecated v0.6 function calls with new v1 functions. | |||||
- **Phase 2**: Modernizes the code by replacing deprecated v0.6 function calls with new v1 functions. | |||||
- **Phase 3**: Takes advantage of new Rack v1 features such as parameter labels and polyphony. | - **Phase 3**: Takes advantage of new Rack v1 features such as parameter labels and polyphony. | ||||
## Prerequisites | ## Prerequisites | ||||
@@ -27,7 +27,7 @@ pacman -S mingw-w64-x86_64-jq python3 | |||||
### Linux | ### Linux | ||||
On Ubuntu 18.04: | |||||
On Ubuntu 18.04+: | |||||
```bash | ```bash | ||||
sudo apt install jq python3 | sudo apt install jq python3 | ||||
``` | ``` | ||||
@@ -97,6 +97,7 @@ perl -i -pe 's/Port::create/createPort/g' src/* | |||||
perl -i -pe 's/Port::OUTPUT/PortWidget::OUTPUT/g' src/* | perl -i -pe 's/Port::OUTPUT/PortWidget::OUTPUT/g' src/* | ||||
perl -i -pe 's/Port::INPUT/PortWidget::INPUT/g' src/* | perl -i -pe 's/Port::INPUT/PortWidget::INPUT/g' src/* | ||||
perl -i -pe 's/Widget::create/createWidget/g' src/* | perl -i -pe 's/Widget::create/createWidget/g' src/* | ||||
perl -i -pe 's/MenuEntry::create\(\)/new MenuEntry/g' src/* | |||||
perl -i -pe 's/MenuLabel::create/createMenuLabel/g' src/* | perl -i -pe 's/MenuLabel::create/createMenuLabel/g' src/* | ||||
perl -i -pe 's/MenuItem::create/createMenuItem/g' src/* | perl -i -pe 's/MenuItem::create/createMenuItem/g' src/* | ||||
``` | ``` | ||||
@@ -119,6 +120,7 @@ The event API has been overhauled in v1. | |||||
If you use `on*()` event handler methods in your custom widgets, see [event.hpp](https://github.com/VCVRack/Rack/blob/v1/include/event.hpp) and [widget/Widget.hpp](https://github.com/VCVRack/Rack/blob/v1/include/widget/Widget.hpp) for new methods and event classes. | If you use `on*()` event handler methods in your custom widgets, see [event.hpp](https://github.com/VCVRack/Rack/blob/v1/include/event.hpp) and [widget/Widget.hpp](https://github.com/VCVRack/Rack/blob/v1/include/widget/Widget.hpp) for new methods and event classes. | ||||
Once completed, your plugin may compile, although many deprecation warnings may appear. | Once completed, your plugin may compile, although many deprecation warnings may appear. | ||||
If there are too many warnings to see the errors, you may temporarily add `FLAGS += -w` to your `Makefile`. | |||||
### 1.9 | ### 1.9 | ||||
@@ -187,6 +189,7 @@ perl -i -pe 's/\bassetPlugin\b/asset::plugin/g' src/* | |||||
perl -i -pe 's/\brandomUniform\b/random::uniform/g' src/* | perl -i -pe 's/\brandomUniform\b/random::uniform/g' src/* | ||||
perl -i -pe 's/\brandomNormal\b/random::normal/g' src/* | perl -i -pe 's/\brandomNormal\b/random::normal/g' src/* | ||||
perl -i -pe 's/\brandomu32\b/random::u32/g' src/* | perl -i -pe 's/\brandomu32\b/random::u32/g' src/* | ||||
perl -i -pe 's/\bstringf\b/string::f/g' src/* | |||||
``` | ``` | ||||
### 2.7 | ### 2.7 | ||||
@@ -204,7 +207,7 @@ perl -i -pe 's/(outputs\[.*?\])\.active/$1.isConnected()/g' src/* | |||||
Add the `dsp::` namespace to dsp classes. | Add the `dsp::` namespace to dsp classes. | ||||
```bash | ```bash | ||||
perl -i -pe 's/\b(quadraticBipolar|cubic|quarticBipolar|quintic|sqrtBipolar|exponentialBipolar|BooleanTrigger|SchmittTrigger|PulseGenerator|RealFFT|ComplexFFT|RCFilter|PeakFilter|SlewLimiter|ExponentialSlewLimiter|ExponentialFilter|RealTimeConvolver|MinBlepGenerator|stepEuler|stepRK2|stepRK4|SampleRateConverter|Decimator|Upsampler|RingBuffer|DoubleRingBuffer|AppleRingBuffer|VuMeter|hann|hannWindow|blackman|blackmanWindow|blackmanNuttall|blackmanNuttallWindow|blackmanHarris|blackmanHarrisWindow)\b/dsp::$1/g' src/* | |||||
perl -i -pe 's/\b(quadraticBipolar|cubic|quarticBipolar|quintic|sqrtBipolar|exponentialBipolar|BooleanTrigger|SchmittTrigger|PulseGenerator|RealFFT|ComplexFFT|RCFilter|PeakFilter|SlewLimiter|ExponentialSlewLimiter|ExponentialFilter|RealTimeConvolver|MinBlepGenerator|stepEuler|stepRK2|stepRK4|SampleRateConverter|Decimator|Upsampler|RingBuffer|DoubleRingBuffer|AppleRingBuffer|VuMeter|hann|hannWindow|blackman|blackmanWindow|blackmanNuttall|blackmanNuttallWindow|blackmanHarris|blackmanHarrisWindow|Frame|VUMeter)\b/dsp::$1/g' src/* | |||||
``` | ``` | ||||
### 2.9 | ### 2.9 | ||||
@@ -235,7 +238,7 @@ in the `MyModule` constructor, and change the original line to | |||||
You can automate this process by running | You can automate this process by running | ||||
```bash | ```bash | ||||
perl -nle 'print "configParam($1);" while /createParam.*?module, (.*?)\)/g' src/* | |||||
perl -nle 'print "configParam($1, \"\");" while /createParam.*?module, (.*?)\)/g' src/* | |||||
``` | ``` | ||||
and copying the respective groups of lines into each module's `Module` constructor. | and copying the respective groups of lines into each module's `Module` constructor. | ||||
Then remove the arguments with | Then remove the arguments with | ||||
@@ -249,6 +252,6 @@ Now make sure your plugin compiles. | |||||
You are now ready to add optional Rack v1 features to your plugin. | You are now ready to add optional Rack v1 features to your plugin. | ||||
You may add parameters labels, units, and nonlinear scaling to be displayed when users right-click on a parameter or enable *View > Parameter tooltips*. See [Module::configParam()](https://github.com/VCVRack/Rack/blob/v1-gpl/include/engine/Module.hpp#L94-L95). | |||||
You may add parameters labels, units, and nonlinear scaling to be displayed when users right-click on a parameter or enable *View > Parameter tooltips*. See [Module::configParam()](https://github.com/VCVRack/Rack/blob/v1/include/engine/Module.hpp#L94-L95). | |||||
If you with to add support for polyphonic cables, see [How polyphonic cables will work in Rack v1](https://community.vcvrack.com/t/how-polyphonic-cables-will-work-in-rack-v1/1464) and [engine/Port.hpp](https://github.com/VCVRack/Rack/blob/v1-gpl/include/engine/Port.hpp). | |||||
If you with to add support for polyphonic cables, see [How polyphonic cables will work in Rack v1](https://community.vcvrack.com/t/how-polyphonic-cables-will-work-in-rack-v1/1464), [Making your monophonic module polyphonic](https://community.vcvrack.com/t/how-polyphonic-cables-will-work-in-rack-v1/1464/39), and [engine/Port.hpp](https://github.com/VCVRack/Rack/blob/v1/include/engine/Port.hpp). |
@@ -1,19 +1,15 @@ | |||||
# Plugin Licensing | # Plugin Licensing | ||||
**This document is a draft. It is currently not in effect, so everything here is bogus now, but it may eventually become the guide for plugin licensing in the future.** | |||||
VCV Rack is open-source software, but you should still familiarize yourself with the [VCV Rack licenses](https://github.com/VCVRack/Rack/blob/v1-gpl/LICENSE.md) before releasing your plugin, to avoid misuse of intellectual property. If in doubt, send any licensing questions to contact@vcvrack.com. | |||||
VCV Rack is open-source/free software, but you should still familiarize yourself with the [VCV Rack licenses](https://github.com/VCVRack/Rack/blob/v1/LICENSE.md) before releasing your plugin, to avoid misuse of intellectual property. If in doubt, send your licensing questions to contact@vcvrack.com. | |||||
### I want to release my plugin under the [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html) (GPLv3). | ### I want to release my plugin under the [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html) (GPLv3). | ||||
Since Rack is licensed under GPLv3, you may license your plugin under GPLv3 as well. | Since Rack is licensed under GPLv3, you may license your plugin under GPLv3 as well. | ||||
You may do anything with your plugin that the GPLv3 allows, including selling it without a commercial license (below) as long as you release the source code under GPLv3. | You may do anything with your plugin that the GPLv3 allows, including selling it without a commercial license (below) as long as you release the source code under GPLv3. | ||||
### I want to release my plugin non-commercially under non-GPLv3 terms. | |||||
### I want to release my plugin under a different open-source license or freeware. | |||||
This is the most common choice among plugin developers. | |||||
Rack offers a [VCV Rack Non-Commercial Plugin License Exception](https://github.com/VCVRack/Rack/blob/v1-gpl/LICENSE.md) which allows you to license your plugin under any terms you want, as long as it is offered free of charge. | |||||
Rack offers a [VCV Rack Non-Commercial Plugin License Exception](https://github.com/VCVRack/Rack/blob/v1/LICENSE.md) which allows you to license your plugin under any terms you want, as long as it is offered free of charge. | |||||
You may choose: | You may choose: | ||||
- **Open-source**. [BSD 3-clause](https://opensource.org/licenses/BSD-3-Clause), [MIT](https://opensource.org/licenses/MIT), and [CC0](https://creativecommons.org/publicdomain/zero/1.0/) are popular licenses. | - **Open-source**. [BSD 3-clause](https://opensource.org/licenses/BSD-3-Clause), [MIT](https://opensource.org/licenses/MIT), and [CC0](https://creativecommons.org/publicdomain/zero/1.0/) are popular licenses. | ||||
- **Closed-source freeware**. | - **Closed-source freeware**. | ||||
@@ -34,7 +30,7 @@ You can expedite the licensing processing by sending concepts and design mockups | |||||
You may also wish to sell your plugin on the [VCV Store](https://vcvrack.com/plugins.html). | You may also wish to sell your plugin on the [VCV Store](https://vcvrack.com/plugins.html). | ||||
Some benefits of distributing your plugin on the VCV Store: | Some benefits of distributing your plugin on the VCV Store: | ||||
- Most Rack users are already familiar with the VCV Store checkout system. | - Most Rack users are already familiar with the VCV Store checkout system. | ||||
- Plugin updates are automatically synchronized to users' Rack installations. | |||||
- Plugin updates are automatically synchronized to users' computers. | |||||
- VCV offers advanced technical support with the Rack SDK and DSP library. | - VCV offers advanced technical support with the Rack SDK and DSP library. | ||||
- You may supply VCV with either binary packages for Mac/Windows/Linux, or a source package which we will build for you. | - You may supply VCV with either binary packages for Mac/Windows/Linux, or a source package which we will build for you. | ||||
- Access to dashboard for managing customers' purchases and viewing real-time statistics. | - Access to dashboard for managing customers' purchases and viewing real-time statistics. | ||||
@@ -17,7 +17,7 @@ No voltage should be generated beyond this range, since it would be mostly impos | |||||
Additionally, protection diodes on the ±12V rails usually drop the range to about ±11.7V. | Additionally, protection diodes on the ±12V rails usually drop the range to about ±11.7V. | ||||
However, if you do not want to model analog output saturation for simplicity or performance reasons, that is perfectly fine. | However, if you do not want to model analog output saturation for simplicity or performance reasons, that is perfectly fine. | ||||
It is much better to allow voltages outside this range rather than use hard clipping with `clampf(out, -1.f, 1.f)` because in the best case they will be attenuated by a module downstream, and in the worst case, they will be hard clipped by the Audio module from Core. | |||||
It is much better to allow voltages outside this range rather than use hard clipping with `clamp(out, -1.f, 1.f)` because in the best case they will be attenuated by a module downstream, and in the worst case, they will be hard clipped by the Audio module from Core. | |||||
If your module is capable of applying >1x gain to an input, it is a good idea to saturate the output. | If your module is capable of applying >1x gain to an input, it is a good idea to saturate the output. | ||||
@@ -27,10 +27,10 @@ In Eurorack, many modules are triggered by reaching a particular rising slope th | |||||
However, because of the [Gibbs phenomenon](https://en.wikipedia.org/wiki/Gibbs_phenomenon), a digital emulation will falsely retrigger many times if the trigger source is bandlimited (e.g. by using a virtual VCO square wave as a trigger input or a hardware trigger through an audio interface.) | However, because of the [Gibbs phenomenon](https://en.wikipedia.org/wiki/Gibbs_phenomenon), a digital emulation will falsely retrigger many times if the trigger source is bandlimited (e.g. by using a virtual VCO square wave as a trigger input or a hardware trigger through an audio interface.) | ||||
Therefore, trigger inputs in Rack should be triggered by a [Schmitt trigger](https://en.wikipedia.org/wiki/Schmitt_trigger) with a low threshold of about **0.1V** and a high threshold of around **1 to 2V**. | Therefore, trigger inputs in Rack should be triggered by a [Schmitt trigger](https://en.wikipedia.org/wiki/Schmitt_trigger) with a low threshold of about **0.1V** and a high threshold of around **1 to 2V**. | ||||
Rack plugins can implement this using `SchmittTrigger` from `digital.hpp` with `schmittTrigger.process(rescale(x, 0.1f, 2.f, 0.f, 1.f))` | |||||
Rack plugins can implement this using `dsp::SchmittTrigger` with `schmittTrigger.process(rescale(x, 0.1f, 2.f, 0.f, 1.f))` | |||||
Trigger sources should produce **10V** with a duration of **1ms**. | Trigger sources should produce **10V** with a duration of **1ms**. | ||||
An easy way to hold a trigger for this duration is to use `PulseGenerator` from `digital.hpp` with `pulseGenerator.trigger(1e-3f)`. | |||||
An easy way to hold a trigger for this duration is to use `dsp::PulseGenerator` with `pulseGenerator.trigger(1e-3f)`. | |||||
Gates should produce **10V** when active. | Gates should produce **10V** when active. | ||||
@@ -42,6 +42,7 @@ For example, a pulse sent through a utility module and then to a sequencer's CLO | |||||
This will cause the sequencer to reset to step 1, and one sample later, advance to step 2, which is undesirable behavior. | This will cause the sequencer to reset to step 1, and one sample later, advance to step 2, which is undesirable behavior. | ||||
Therefore, modules with a CLOCK and RESET input, or similar variants, should ignore CLOCK triggers up to **1ms** after receiving a RESET trigger. | Therefore, modules with a CLOCK and RESET input, or similar variants, should ignore CLOCK triggers up to **1ms** after receiving a RESET trigger. | ||||
You can use `dsp::Timer` for keeping track of time. | |||||
## Pitch and Frequencies | ## Pitch and Frequencies | ||||
@@ -53,4 +54,22 @@ Low-frequency oscillators and clock generators should use 120 BPM (\\(f_0\\) = 2 | |||||
## NaNs and Infinity | ## NaNs and Infinity | ||||
If your module might produce [NaNs](https://en.wikipedia.org/wiki/NaN) or infinite values with finite input, e.g. an unstable IIR filter or reverb, it should check and return 0 if this happens: `isfinite(out) ? out : 0.f`. | |||||
If your module might produce [NaNs](https://en.wikipedia.org/wiki/NaN) or infinite output values when given only finite input, e.g. an unstable IIR filter or reverb, it should check and return 0 if this happens: `std::isfinite(out) ? out : 0.f`. | |||||
## Polyphony | |||||
If your module has polyphonic outputs, then it can be considered a "polyphonic module", so add the "Polyphonic" tag to the module's manifest. | |||||
It is recommended to support up to 16 channels, which is the maximum that Rack allows. | |||||
Typically each voice in your module can be abstracted into an "engine". | |||||
The number of active engines \\(N\\) should be defined by the number of channels of the "main" input (e.g. 1V/oct input for VCOs, audio input for filters, gate input for envelope generators, etc). | |||||
All other secondary inputs with \\(M\\) channels should follow these rules: | |||||
- If monophonic (\\(M = 1\\)), its voltage should be copied to all engines. | |||||
- If polyphonic with enough channels (\\(M \geq N\\)), each channel voltage should be used in its respective engine. | |||||
- If polyphonic but not enough channels (\\(1 < M < N\\)), 0V should be copied to out-of-bounds engines. | |||||
All of this behavior is provided by `Port::getPolyVoltage(c)`. | |||||
Monophonic modules should handle polyphonic inputs gracefully: | |||||
- For inputs intended to be used solely for audio, sum the voltages of all channels (e.g. with `Port::getVoltageSum()`) | |||||
- For inputs intended to be used for CV or hybrid audio/CV, use the first channel's voltage (e.g. with `Port::getVoltage()`) |
@@ -2,7 +2,7 @@ | |||||
VCV Rack Manual | VCV Rack Manual | ||||
=========================================== | =========================================== | ||||
The VCV Rack manual is under active development. | |||||
VCV Rack is an open-source virtual modular synthesizer. | |||||
Edit this manual at https://github.com/VCVRack/manual. | Edit this manual at https://github.com/VCVRack/manual. | ||||
@@ -17,7 +17,6 @@ Rack | |||||
FAQ.md | FAQ.md | ||||
Toolbar.md | Toolbar.md | ||||
Core.md | Core.md | ||||
Bridge.md | |||||
.. toctree:: | .. toctree:: | ||||
:maxdepth: 1 | :maxdepth: 1 | ||||