@@ -1,5 +1,7 @@ | |||
# Bridge | |||
***Note: VCV Bridge is deprecated and unsupported. It will be removed in Rack v2. See [Is VCV Rack available as a VST/AU/AAX plugin for DAWs?](https://vcvrack.com/manual/FAQ.html#is-vcv-rack-available-as-a-vst-au-aax-plugin-for-daws)*** | |||
Rack is a standalone DAW-like application and not a VST/AU plugin because of the major limitations of these formats. | |||
It is common to think of physical modular synthesizers as entire self-contained DAWs, so many people use Rack as a complete DAW to compose music and build patches without other software. | |||
@@ -6,6 +6,10 @@ Before building Rack or Rack plugins, you must install build dependencies provid | |||
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. | |||
<!-- | |||
TODO add Python dependency | |||
--> | |||
### Mac | |||
Install [Homebrew](https://brew.sh/), and install build dependencies. | |||
@@ -18,17 +22,18 @@ brew install git wget cmake autoconf automake libtool jq | |||
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*. | |||
Update the package manager itself: | |||
```bash | |||
pacman -Syu | |||
``` | |||
Then restart the shell. | |||
Then restart the shell and install packages. | |||
```bash | |||
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 | |||
On Ubuntu 18.04+: | |||
On Ubuntu 16.04+: | |||
```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 | |||
``` | |||
@@ -68,9 +73,11 @@ Run Rack. | |||
## Building Rack plugins | |||
Complete the [Setting up your development environment](#setting-up-your-development-environment) section. | |||
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. | |||
- [Build Rack from source](#building-rack) and build plugins in the `plugins/` folder. (Recommended for advanced developers.) | |||
- Download an [official Rack build](https://vcvrack.com/Rack.html) and [Rack-SDK-1.1.0.zip](https://vcvrack.com/downloads/Rack-SDK-1.1.0.zip), and build plugins anywhere you like. (Easiest/fastest.) | |||
Download or clone the plugin source code, e.g. | |||
@@ -81,16 +88,20 @@ Clone the git repo's submodules. | |||
cd Fundamental | |||
git submodule update --init --recursive | |||
Build the plugin. | |||
If using the Rack SDK, set the `RACK_DIR` environment variable by prefixing each of the following commands with `RACK_DIR=<Rack SDK dir>`. | |||
Build plugin dependencies. (Most plugins don't require this step.) | |||
make dep | |||
Build the plugin. | |||
make | |||
If using the Rack SDK, specify its location with | |||
Create a plugin ZIP package. | |||
RACK_DIR=<Rack SDK dir> make dep | |||
RACK_DIR=<Rack SDK dir> make | |||
make dist | |||
To build, package, and install plugins to your Rack user directory in one step, run | |||
Or you may build, package, and install plugins to your [Rack user folder](FAQ.html#where-is-the-rack-user-folder) in one step. | |||
make install |
@@ -2,25 +2,18 @@ | |||
## I found a bug. | |||
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 | |||
- The Rack version | |||
- The actions that trigger the problem | |||
- Any error messages that appear. Screenshots are helpful. | |||
- The hardware (e.g. audio interface, MIDI device, graphics card) related to your problem | |||
Search [Rack's issue tracker](https://github.com/VCVRack/Rack/issues?q=is%3Aissue) to check if someone else has posted a similar bug report. | |||
If you believe the problem has never been reported before, [create a GitHub account](https://github.com/) (it's free) and [open a bug report issue](https://github.com/VCVRack/Rack/issues/new?template=bug_report.md). | |||
You must fill out the issue template, or it will be closed. | |||
## I have a feature request. | |||
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 | |||
- A possible workflow or diagram (if your request involves multiple steps or UI states, e.g. dragging multiple modules simultaneously). | |||
All features added to Rack must begin with a well-written proposal. | |||
If approved, it is implemented, publicly tested with development builds, and released in a future Rack version. | |||
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. | |||
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 feature request issue](https://github.com/VCVRack/Rack/issues/new?template=feature_request.md). | |||
You must fill out the issue template, or it will be closed. | |||
## The graphics are rendered incorrectly, not at all, or Rack doesn't launch because of an "OpenGL error". | |||
@@ -28,7 +21,7 @@ Rack requires at least OpenGL 2.0 with the `GL_EXT_framebuffer_object` extension | |||
If your graphics card supports this, make sure you've installed the latest graphics drivers, and restart Rack. | |||
If this does not fix it, see below for instructions on submitting a bug to Rack's issue tracker. | |||
## Where is the "Rack user directory"? | |||
## Where is the "Rack user folder"? | |||
- MacOS: `Documents/Rack/` | |||
- Windows: `My Documents/Rack/` | |||
@@ -61,11 +54,11 @@ See [CPU timer](MenuBar.html#cpu-timer) for more info. | |||
## Is VCV Rack available as a VST/AU/AAX plugin for DAWs? | |||
Not at this time. | |||
Shortly after Rack 2.0 releases, Rack will also be available as a 64-bit VST2 plugin for around $99. | |||
VCV Rack is a standalone application, not a plugin. | |||
Shortly after Rack v2 is released, estimated for Dec 2019, Rack will also be available as a 64-bit VST2 plugin for around $99. | |||
VST3/AU/AAX versions might be released afterwards. | |||
All Rack v2 plugins will be compatible with the plugin version of Rack. | |||
The primary "standalone" version of Rack v2 will continue to be free/open-source. | |||
The standalone version of Rack v2 will continue to be free/open-source. | |||
## Does VCV Rack work with touch screens? | |||
@@ -41,7 +41,7 @@ Downloading plugins directly from the Plugin Manager website is not supported at | |||
*Install third-party plugins at your own risk. Like VST plugins, installing plugins from unknown sources may compromise your computer and personal information.* | |||
Download the plugin ZIP package from the vendor's website to `<Rack local directory>/plugins` (See [Where is the "Rack local directory"?](FAQ.html#where-is-the-rack-local-directory)). Rack will extract and load the plugin upon launch. | |||
Download the plugin ZIP package from the vendor's website to `<Rack user folder>/plugins` (See [Where is the "Rack user folder"?](FAQ.html#where-is-the-rack-user-folder)). Rack will extract and load the plugin upon launch. | |||
Note: Do not download the plugin via GitHub's green "Clone or download" button. These are source code ZIP packages and do not contain the compiled plugin binary. If the vendor distributes their plugin with GitHub, look in the "Releases" section for the compiled ZIP packages. | |||
@@ -59,13 +59,13 @@ Click on Rack in the Start Menu. | |||
### Running on Linux | |||
Double click the `Rack` binary. | |||
Or with the command-line, `cd` into the `Rack` directory and run `./Rack`. | |||
Or with the command-line, `cd` into the `Rack` folder and run `./Rack`. | |||
### Command line usage | |||
To launch Rack from the command line, `cd` into Rack's directory, and run `./Rack`, optionally with the following options. | |||
To launch Rack from the command line, `cd` into Rack's folder, and run `./Rack`, optionally with the following options. | |||
- `<patch filename>`: Loads a patch file. | |||
- `-u <dir>`: Sets Rack's system directory. | |||
- `-s <dir>`: Sets Rack's user directory. | |||
- `-s <dir>`: Sets Rack's system folder. | |||
- `-u <dir>`: Sets Rack's user folder. | |||
- `-d`: Enables development mode. | |||
This sets the system and user directories to the current directory, uses the terminal (stderr) for logging, and disables the Plugin Manager to prevent overwriting plugins. | |||
This sets the system and user folders to the current working directory, uses the terminal (stderr) for logging, and disables the Plugin Manager to prevent overwriting plugins. |
@@ -34,6 +34,8 @@ Prevents accidentally dragging modules. | |||
### Zoom | |||
Adjusts the zoom level for the rack from 25-400%. | |||
Double-click to reset to 100%. | |||
You can also use Ctrl-`-` and Ctrl-`=` (or Cmd on Mac) to zoom, or Ctrl-scroll. | |||
### Cable opacity | |||
Sets the transparency level for patch cables. | |||
Double-click to reset to 50%. | |||
@@ -74,7 +76,7 @@ For example, a quad-core machine would likely maximize the number of modules by | |||
Due to [simultaneous multithreading](https://en.wikipedia.org/wiki/Simultaneous_multithreading) such as [Intel Hyper-Threading](https://en.wikipedia.org/wiki/Hyper-threading), you may attempt to use up to twice as many threads as physical cores in your machine, but typically this results in worse performance with higher power usage. | |||
## Plugins | |||
## Library | |||
### Login | |||
Logs into your VCV account registered at [vcvrack.com](https://vcvrack.com/). | |||
@@ -91,4 +93,4 @@ Rack must be restarted to load new plugin updates. | |||
Opens [this manual](QuickStart.html). | |||
### Open user folder | |||
Opens the [Rack user directory](FAQ.html#where-is-the-rack-user-directory) in Windows Explorer, Apple Finder, etc. | |||
Opens the [Rack user folder](FAQ.html#where-is-the-rack-user-folder) in Windows Explorer, Apple Finder, etc. |
@@ -0,0 +1,129 @@ | |||
# Plugin Metadata | |||
This document defines the `plugin.json` file found at the root of your plugin folder. | |||
For example, see Fundamental's [plugin.json](https://github.com/VCVRack/Fundamental/blob/v1/plugin.json) file. | |||
JSON paths are denoted in "flat format", as used by [jq](https://stedolan.github.io/jq/manual/). | |||
## `.slug` | |||
*String. Required.* | |||
The unique identifier for your plugin. | |||
Slugs may only contain letters `a-z` and `A-Z`, numbers `0-9`, hyphens `-`, and underscores `_`. | |||
After your plugin is released, the slug must *never* change, otherwise patch compatibility would be broken. | |||
To guarantee uniqueness, it is a good idea to prefix the slug by your "brand name" if available, e.g. "MyCompany-MyPlugin". | |||
The word "slug" [comes from web publishing](https://en.wikipedia.org/wiki/Clean_URL#Slug) to represent URL paths that never change, which in turn [comes from typesetting](https://en.wikipedia.org/wiki/Slug_(typesetting)). | |||
## `.name` | |||
*String. Required.* | |||
The human-readable name for your plugin. | |||
Used for labeling your plugin the VCV Library. | |||
Unlike slugs, the name can be changed at any time without breaking patch compatibility. | |||
## `.version` | |||
*String. Required.* | |||
The version of your plugin should follow the form `MAJOR.MINOR.REVISION`. | |||
Do not include the "v" prefix---this is added automatically where appropriate. | |||
The `MAJOR` version should match the version of Rack your plugin is built for, e.g. 1. | |||
You are free to choose the `MINOR.REVISION` part of your plugin version. | |||
For example, *MyPlugin 1.4.2* would specify that your plugin is compatible with *Rack 1.X*. | |||
If you publish the source code in a git repository, it is recommended to add a git tag with `git tag vX.Y.Z` and `git push --tags`. | |||
## `.license` | |||
*String. Required.* | |||
The license of your plugin. | |||
Use `"proprietary"` for commercial and freeware plugins. | |||
If your plugin uses a common open-source license, the identifier from the [SPDX License List](https://spdx.org/licenses/) should be used. | |||
## `.brand` | |||
*String. Optional.* | |||
Prefix string for all modules in your plugin. | |||
For example, the brand "VCV" is used by the Fundamental plugin to create "VCV VCF", VCV Unity", etc. | |||
If blank or undefined, the plugin name is used. | |||
## `.author` | |||
*String. Required.* | |||
Your name, company, alias, GitHub username, etc. | |||
## `.authorEmail` | |||
*String. Optional.* | |||
Your email address for support inquiries. | |||
## `.authorUrl` | |||
*String. Optional.* | |||
Homepage for yourself or your company. | |||
## `.pluginUrl` | |||
*String. Optional.* | |||
Homepage for the plugin itself. | |||
## `.manualUrl` | |||
*String. Optional.* | |||
The manual of your plugin. | |||
E.g. HTML, PDF, GitHub readme, GitHub wiki. | |||
## `.sourceUrl` | |||
*String. Optional.* | |||
Homepage for the source code. | |||
For GitHub URLs, use the main project page, not the `.git` URL. | |||
## `.donateUrl` | |||
*String. Optional.* | |||
Link to donation page for users who wish to donate. | |||
E.g. [PayPal.Me](https://www.paypal.me/), [Cash App](https://cash.app/) links. | |||
## `.modules[].slug` | |||
*String. Required.* | |||
The unique identifier for the module. | |||
Similar guidelines from [.slug](#slug) apply. | |||
## `.modules[].name` | |||
*String. Required.* | |||
The human-readable name for the module. | |||
## `.modules[].tags` | |||
*Array of strings. Optional.* | |||
List of tags representing the functions and/or properties of the module. | |||
All tags must match the [list of allowed tags](https://github.com/VCVRack/Rack/blob/v1/src/plugin.cpp#L540) in Rack, case insensitive. | |||
## `.modules[].description` | |||
*String. Optional.* | |||
A one-line summary of the module's purpose. | |||
Displayed in the Module Browser tooltip. |
@@ -60,7 +60,7 @@ Remove `SLUG` and `VERSION` from the `Makefile`, and remove ` p->slug = ...` and | |||
### 1.4 | |||
Change `#include "rack.hpp"` to `#include "rack0.hpp"` to access deprecated functions. | |||
Change `#include <rack.hpp>` to `#include <rack0.hpp>` to access deprecated functions. | |||
### 1.5 | |||
@@ -110,9 +110,18 @@ perl -i -pe 's/toJson/dataToJson/g' src/* | |||
perl -i -pe 's/fromJson/dataFromJson/g' src/* | |||
``` | |||
### 1.6.4 | |||
Add `config()` to the `Module` constructor, and add `setModule()` to the `ModuleWidget` constructor. | |||
```bash | |||
perl -i -pe 's/: Module\(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS\) \{/{\n\t\tconfig(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);/g' src/* | |||
perl -i -pe 's/: Module\(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS\) \{/{\n\t\tconfig(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);/g' src/* | |||
perl -i -pe 's/: ModuleWidget\(module\) \{/{\n\t\tsetModule(module);/g' src/* | |||
``` | |||
### 1.7 | |||
If your plugin uses any of Rack's `dsp/*.hpp` headers, remove the `#include "dsp/..."` lines since they are now automatically included by `rack.hpp`. | |||
If your plugin uses any of Rack's `dsp/*.hpp` headers, remove the `#include <dsp/...>` lines since they are now automatically included by `rack.hpp`. | |||
### 1.8 | |||
@@ -138,7 +147,7 @@ If your plugin is open-source, you may even ask the [VCV Repair Team](https://gi | |||
### 2.1 | |||
Once your plugin can be compiled, change `#include "rack0.hpp"` back to `#include "rack.hpp"`. | |||
Once your plugin can be compiled, change `#include <rack0.hpp>` back to `#include <rack.hpp>`. | |||
### 2.2 | |||
@@ -212,11 +221,7 @@ perl -i -pe 's/\b(quadraticBipolar|cubic|quarticBipolar|quintic|sqrtBipolar|expo | |||
### 2.9 | |||
Add `config()` to the `Module` constructor, and add `setModule()` to the `ModuleWidget` constructor. | |||
```bash | |||
perl -i -pe 's/: Module\(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS\) \{/{\n\t\tconfig(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);/g' src/* | |||
perl -i -pe 's/: ModuleWidget\(module\) \{/{\n\t\tsetModule(module);/g' src/* | |||
``` | |||
*Moved to Phase 1.6.4.* | |||
### 2.10 | |||
@@ -0,0 +1,229 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
width="30.48mm" | |||
height="128.5mm" | |||
viewBox="0 0 30.480002 128.50002" | |||
version="1.1" | |||
id="svg8" | |||
inkscape:version="0.92.4 5da689c313, 2019-01-14" | |||
sodipodi:docname="MyModule.svg"> | |||
<defs | |||
id="defs2" /> | |||
<sodipodi:namedview | |||
id="base" | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1.0" | |||
inkscape:pageopacity="0.0" | |||
inkscape:pageshadow="2" | |||
inkscape:zoom="0.98994949" | |||
inkscape:cx="338.66683" | |||
inkscape:cy="191.1767" | |||
inkscape:document-units="mm" | |||
inkscape:current-layer="layer2" | |||
showgrid="false" | |||
units="mm" | |||
inkscape:snap-bbox="true" | |||
inkscape:snap-page="true" | |||
inkscape:bbox-nodes="false" | |||
inkscape:snap-bbox-edge-midpoints="false" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="882" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:window-maximized="0" | |||
inkscape:snap-bbox-midpoints="true" | |||
inkscape:snap-nodes="false" /> | |||
<metadata | |||
id="metadata5"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
<dc:title /> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<g | |||
inkscape:label="Layer 1" | |||
inkscape:groupmode="layer" | |||
id="layer1" | |||
transform="translate(0,-168.49998)"> | |||
<rect | |||
style="display:inline;opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.64935839;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||
id="rect420" | |||
width="30.48" | |||
height="128.5" | |||
x="5.9211732e-17" | |||
y="168.49997" /> | |||
<g | |||
aria-label="My Module" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:6.61458302px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||
id="text1229"> | |||
<path | |||
d="m 3.8783293,178.67396 c 0,0.1778 0.1397,0.3175 0.3174999,0.3175 0.1778,0 0.3217334,-0.1397 0.3217334,-0.3175 v -1.4732 l 0.5630333,0.86784 c 0.067733,0.1016 0.1524,0.1651 0.2709333,0.1651 0.1185333,0 0.2032,-0.0635 0.2709333,-0.1651 l 0.5715,-0.88054 v 1.47744 c 0,0.1778 0.1439333,0.32596 0.3217333,0.32596 0.1820333,0 0.3259666,-0.14393 0.3259666,-0.32596 v -2.35374 c 0,-0.18203 -0.1439333,-0.32596 -0.3259666,-0.32596 h -0.071967 c -0.1312333,0 -0.2243666,0.055 -0.2921,0.1651 l -0.7916333,1.28693 -0.7873999,-1.2827 c -0.059267,-0.0974 -0.1566333,-0.16933 -0.2963333,-0.16933 h -0.071967 c -0.1820333,0 -0.3259666,0.14393 -0.3259666,0.32596 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5029" /> | |||
<path | |||
d="m 7.9515894,179.6561 c 0.3852333,0 0.5757333,-0.17357 0.7662333,-0.635 l 0.7916333,-1.90077 c 0.0127,-0.0296 0.029633,-0.1016 0.029633,-0.1524 0,-0.16933 -0.1397,-0.29633 -0.3048,-0.29633 -0.1651,0 -0.2582333,0.11006 -0.3090333,0.24553 L 8.4511227,178.2337 7.960056,176.9129 c -0.055033,-0.1524 -0.1481666,-0.2413 -0.3090333,-0.2413 -0.1778,0 -0.3175,0.127 -0.3175,0.30903 0,0.0423 0.016933,0.10583 0.033867,0.14817 l 0.7747,1.79493 -0.021167,0.0508 c -0.059267,0.1143 -0.1143,0.13547 -0.2286,0.13547 -0.046567,0 -0.080433,-0.008 -0.1354667,-0.0254 -0.0254,-0.008 -0.055033,-0.0169 -0.1058333,-0.0169 -0.1312333,0 -0.254,0.10584 -0.254,0.26247 0,0.15663 0.1100667,0.23283 0.2032,0.2667 0.1058333,0.0381 0.2074333,0.0593 0.3513667,0.0593 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5031" /> | |||
<path | |||
d="m 11.303198,178.67396 c 0,0.1778 0.1397,0.3175 0.3175,0.3175 0.1778,0 0.321734,-0.1397 0.321734,-0.3175 v -1.4732 l 0.563033,0.86784 c 0.06773,0.1016 0.1524,0.1651 0.270933,0.1651 0.118534,0 0.2032,-0.0635 0.270934,-0.1651 l 0.5715,-0.88054 v 1.47744 c 0,0.1778 0.143933,0.32596 0.321733,0.32596 0.182033,0 0.325966,-0.14393 0.325966,-0.32596 v -2.35374 c 0,-0.18203 -0.143933,-0.32596 -0.325966,-0.32596 h -0.07197 c -0.131233,0 -0.224366,0.055 -0.2921,0.1651 l -0.791633,1.28693 -0.7874,-1.2827 c -0.05927,-0.0974 -0.156633,-0.16933 -0.296333,-0.16933 h -0.07197 c -0.182033,0 -0.325967,0.14393 -0.325967,0.32596 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5033" /> | |||
<path | |||
d="m 16.019925,179.01686 c 0.706967,0 1.2319,-0.52916 1.2319,-1.1811 v -0.008 c 0,-0.65194 -0.5207,-1.17264 -1.223433,-1.17264 -0.706967,0 -1.2319,0.52917 -1.2319,1.1811 v 0.008 c 0,0.65193 0.5207,1.17263 1.223433,1.17263 z m 0.0085,-0.55456 c -0.3556,0 -0.5969,-0.2921 -0.5969,-0.62654 v -0.008 c 0,-0.33444 0.220133,-0.61807 0.588433,-0.61807 0.3556,0 0.5969,0.2921 0.5969,0.62653 v 0.008 c 0,0.33443 -0.220133,0.61807 -0.588433,0.61807 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5035" /> | |||
<path | |||
d="m 19.999523,176.17206 c 0,-0.1778 -0.143933,-0.32173 -0.321733,-0.32173 -0.1778,0 -0.321733,0.14393 -0.321733,0.32173 v 0.82127 c -0.1524,-0.18203 -0.364067,-0.33867 -0.706967,-0.33867 -0.537633,0 -1.032933,0.41487 -1.032933,1.17264 v 0.008 c 0,0.75777 0.503766,1.17264 1.032933,1.17264 0.334433,0 0.550333,-0.15664 0.706967,-0.3683 v 0.0296 c 0,0.1778 0.143933,0.32173 0.321733,0.32173 0.1778,0 0.321733,-0.14393 0.321733,-0.32173 z m -1.185333,1.0287 c 0.300567,0 0.550333,0.24977 0.550333,0.62654 v 0.008 c 0,0.37677 -0.249766,0.62654 -0.550333,0.62654 -0.300567,0 -0.554567,-0.24977 -0.554567,-0.62654 v -0.008 c 0,-0.381 0.254,-0.62654 0.554567,-0.62654 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5037" /> | |||
<path | |||
d="m 22.640196,176.99333 c 0,-0.1778 -0.143933,-0.32173 -0.321733,-0.32173 -0.1778,0 -0.321733,0.14393 -0.321733,0.32173 v 0.96943 c 0,0.3048 -0.156634,0.46144 -0.402167,0.46144 -0.245533,0 -0.389467,-0.15664 -0.389467,-0.46144 v -0.96943 c 0,-0.1778 -0.143933,-0.32173 -0.321733,-0.32173 -0.1778,0 -0.321733,0.14393 -0.321733,0.32173 v 1.17263 c 0,0.5207 0.283633,0.84244 0.770466,0.84244 0.325967,0 0.516467,-0.17357 0.664634,-0.36407 v 0.0254 c 0,0.1778 0.143933,0.32173 0.321733,0.32173 0.1778,0 0.321733,-0.14393 0.321733,-0.32173 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5039" /> | |||
<path | |||
d="m 23.245762,178.66973 c 0,0.1778 0.143933,0.32173 0.321733,0.32173 0.1778,0 0.321734,-0.14393 0.321734,-0.32173 v -2.49767 c 0,-0.1778 -0.143934,-0.32173 -0.321734,-0.32173 -0.1778,0 -0.321733,0.14393 -0.321733,0.32173 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5041" /> | |||
<path | |||
d="m 25.018403,177.65373 c 0.0508,-0.2921 0.224367,-0.4826 0.491067,-0.4826 0.270933,0 0.440266,0.19473 0.478366,0.4826 z m 1.341967,1.08797 c 0.04657,-0.0423 0.08467,-0.10584 0.08467,-0.1905 0,-0.14394 -0.105833,-0.254 -0.249766,-0.254 -0.06773,0 -0.110067,0.0169 -0.156634,0.0508 -0.131233,0.0974 -0.2794,0.1524 -0.4572,0.1524 -0.287866,0 -0.491066,-0.1524 -0.554566,-0.4445 h 1.274233 c 0.169333,0 0.300567,-0.12277 0.300567,-0.30904 0,-0.4699 -0.334434,-1.0922 -1.0922,-1.0922 -0.6604,0 -1.121834,0.5334 -1.121834,1.1811 v 0.008 c 0,0.69427 0.503767,1.17263 1.185334,1.17263 0.3302,0 0.588433,-0.10583 0.7874,-0.27516 z" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5043" /> | |||
</g> | |||
<g | |||
aria-label="Pitch" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.93888855px;line-height:6.61458302px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||
id="text4944" | |||
transform="translate(0,10.583334)"> | |||
<path | |||
d="m 10.377818,215.46915 c 0,0.0593 0.0508,0.11007 0.110067,0.11007 0.05927,0 0.110067,-0.0508 0.110067,-0.11007 v -1.01176 h 0.8001 c 0.618066,0 1.155699,-0.32174 1.155699,-0.94404 v -0.008 c 0,-0.5715 -0.448733,-0.90594 -1.100666,-0.90594 h -0.9652 c -0.05927,0 -0.110067,0.0508 -0.110067,0.11007 z m 0.220134,-1.21496 v -1.45204 h 0.8382 c 0.533399,0 0.897466,0.24554 0.897466,0.71544 v 0.008 c 0,0.44027 -0.372533,0.72814 -0.922866,0.72814 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5046" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 13.163219,212.73442 c 0,0.072 0.05503,0.127 0.127,0.127 0.07197,0 0.131233,-0.055 0.131233,-0.127 v -0.072 c 0,-0.072 -0.05927,-0.127 -0.131233,-0.127 -0.07197,0 -0.127,0.055 -0.127,0.127 z m 0.0254,2.73897 c 0,0.0635 0.04657,0.10583 0.105833,0.10583 0.05927,0 0.1016,-0.0423 0.1016,-0.10583 v -1.9812 c 0,-0.0635 -0.04657,-0.10584 -0.105833,-0.10584 -0.05927,0 -0.1016,0.0466 -0.1016,0.10584 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5048" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 14.928717,215.60039 c 0.122767,0 0.220134,-0.0254 0.3048,-0.055 0.04233,-0.0169 0.06773,-0.0466 0.06773,-0.0889 0,-0.0508 -0.04657,-0.0931 -0.09313,-0.0931 -0.02963,0 -0.09737,0.0423 -0.245533,0.0423 -0.249767,0 -0.4318,-0.11006 -0.4318,-0.4191 v -1.39276 h 0.677333 c 0.0508,0 0.09737,-0.0423 0.09737,-0.0931 0,-0.0508 -0.04657,-0.0974 -0.09737,-0.0974 h -0.677333 v -0.60114 c 0,-0.0593 -0.04657,-0.10583 -0.105833,-0.10583 -0.05927,0 -0.1016,0.0466 -0.1016,0.10583 v 0.60114 h -0.232833 c -0.0508,0 -0.09737,0.0423 -0.09737,0.0931 0,0.0508 0.04657,0.0974 0.09737,0.0974 h 0.232833 v 1.41393 c 0,0.41063 0.270933,0.59267 0.605366,0.59267 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5050" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 16.790392,215.61309 c 0.3683,0 0.618067,-0.1524 0.833967,-0.37254 0.01693,-0.0169 0.0254,-0.0423 0.0254,-0.0635 0,-0.0508 -0.0508,-0.1016 -0.1016,-0.1016 -0.02963,0 -0.0508,0.0169 -0.06773,0.0339 -0.173566,0.17357 -0.397933,0.30903 -0.677333,0.30903 -0.4953,0 -0.889,-0.41486 -0.889,-0.93556 v -0.008 c 0,-0.51647 0.381,-0.9271 0.872067,-0.9271 0.2921,0 0.4953,0.1397 0.668866,0.3048 0.01693,0.0169 0.04657,0.0254 0.07197,0.0254 0.05927,0 0.105833,-0.0466 0.105833,-0.10583 0,-0.0296 -0.0127,-0.0593 -0.02963,-0.0762 -0.194733,-0.18204 -0.440267,-0.3429 -0.8128,-0.3429 -0.618067,0 -1.100667,0.52493 -1.100667,1.1303 v 0.008 c 0,0.60537 0.478367,1.12184 1.100667,1.12184 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5052" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 18.252215,215.47339 c 0,0.0635 0.04657,0.10583 0.105833,0.10583 0.05927,0 0.1016,-0.0423 0.1016,-0.10583 v -1.15994 c 0,-0.44873 0.325967,-0.77046 0.7493,-0.77046 0.436033,0 0.6858,0.2921 0.6858,0.7366 v 1.1938 c 0,0.0635 0.04657,0.10583 0.105833,0.10583 0.05927,0 0.1016,-0.0423 0.1016,-0.10583 v -1.2319 c 0,-0.51647 -0.3175,-0.889 -0.8636,-0.889 -0.3937,0 -0.635,0.19896 -0.778933,0.45296 v -1.2446 c 0,-0.0593 -0.04657,-0.10583 -0.105833,-0.10583 -0.05927,0 -0.1016,0.0466 -0.1016,0.10583 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5054" | |||
inkscape:connector-curvature="0" /> | |||
</g> | |||
<g | |||
aria-label="1V/oct" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.93888855px;line-height:6.61458302px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||
id="text4948" | |||
transform="translate(0,5.2916669)"> | |||
<path | |||
d="m 9.6908279,252.06539 c 0,0.0593 0.0508,0.11007 0.1100667,0.11007 0.059267,0 0.1058333,-0.0508 0.1058333,-0.11007 v -2.794 c 0,-0.055 -0.0381,-0.10583 -0.1058333,-0.10583 h -0.00847 c -0.046567,0 -0.0889,0.0127 -0.1354666,0.0296 l -0.5164667,0.1905 c -0.046567,0.0169 -0.080433,0.0423 -0.080433,0.0931 0,0.0508 0.042333,0.0931 0.093133,0.0931 0.016933,0 0.033867,-0.004 0.055033,-0.0127 l 0.4826,-0.1651 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5057" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 11.938463,252.18816 h 0.0085 c 0.06773,0 0.105833,-0.0381 0.131233,-0.0974 l 1.210733,-2.7686 c 0.0085,-0.0169 0.0085,-0.0254 0.0085,-0.0423 0,-0.0508 -0.04657,-0.1016 -0.105833,-0.1016 -0.0508,0 -0.0889,0.0381 -0.110067,0.0847 l -1.134533,2.65854 -1.1303,-2.6543 c -0.02117,-0.0508 -0.05927,-0.0889 -0.1143,-0.0889 -0.0635,0 -0.110067,0.055 -0.110067,0.10583 0,0.0212 0,0.0296 0.0085,0.0466 l 1.2065,2.76013 c 0.0254,0.0593 0.0635,0.0974 0.131233,0.0974 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5059" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 13.000435,252.62842 c 0,0.0508 0.0381,0.0889 0.0889,0.0889 0.04233,0 0.07197,-0.0254 0.0889,-0.0593 l 1.913466,-3.75074 c 0.0085,-0.0169 0.0127,-0.0381 0.0127,-0.055 0,-0.0508 -0.0381,-0.0889 -0.0889,-0.0889 -0.04233,0 -0.07197,0.0254 -0.0889,0.0593 l -1.913466,3.75073 c -0.0085,0.0169 -0.0127,0.0381 -0.0127,0.055 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5061" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 16.153937,252.20932 c 0.643467,0 1.113367,-0.52493 1.113367,-1.1303 v -0.008 c 0,-0.60537 -0.465667,-1.12184 -1.1049,-1.12184 -0.643467,0 -1.113367,0.52494 -1.113367,1.1303 v 0.008 c 0,0.60537 0.465667,1.12183 1.1049,1.12183 z m 0.0085,-0.19473 c -0.499534,0 -0.889,-0.41487 -0.889,-0.93557 v -0.008 c 0,-0.508 0.3683,-0.9271 0.880533,-0.9271 0.499533,0 0.889,0.41486 0.889,0.93556 v 0.008 c 0,0.508 -0.3683,0.9271 -0.880533,0.9271 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5063" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 18.861683,252.20932 c 0.3683,0 0.618066,-0.1524 0.833966,-0.37253 0.01693,-0.0169 0.0254,-0.0423 0.0254,-0.0635 0,-0.0508 -0.0508,-0.1016 -0.1016,-0.1016 -0.02963,0 -0.0508,0.0169 -0.06773,0.0339 -0.173567,0.17356 -0.397933,0.30903 -0.677333,0.30903 -0.4953,0 -0.889,-0.41487 -0.889,-0.93557 v -0.008 c 0,-0.51647 0.381,-0.9271 0.872066,-0.9271 0.2921,0 0.4953,0.1397 0.668867,0.3048 0.01693,0.0169 0.04657,0.0254 0.07197,0.0254 0.05927,0 0.105834,-0.0466 0.105834,-0.10584 0,-0.0296 -0.0127,-0.0593 -0.02963,-0.0762 -0.194733,-0.18203 -0.440266,-0.3429 -0.812799,-0.3429 -0.618067,0 -1.100667,0.52494 -1.100667,1.1303 v 0.008 c 0,0.60537 0.478367,1.12183 1.100667,1.12183 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5065" | |||
inkscape:connector-curvature="0" /> | |||
<path | |||
d="m 21.043172,252.19662 c 0.122767,0 0.220133,-0.0254 0.3048,-0.055 0.04233,-0.0169 0.06773,-0.0466 0.06773,-0.0889 0,-0.0508 -0.04657,-0.0931 -0.09313,-0.0931 -0.02963,0 -0.09737,0.0423 -0.245533,0.0423 -0.249767,0 -0.4318,-0.11007 -0.4318,-0.4191 v -1.39277 h 0.677333 c 0.0508,0 0.09737,-0.0423 0.09737,-0.0931 0,-0.0508 -0.04657,-0.0974 -0.09737,-0.0974 h -0.677333 v -0.60113 c 0,-0.0593 -0.04657,-0.10583 -0.105834,-0.10583 -0.05927,0 -0.1016,0.0466 -0.1016,0.10583 v 0.60113 h -0.232833 c -0.0508,0 -0.09737,0.0423 -0.09737,0.0931 0,0.0508 0.04657,0.0974 0.09737,0.0974 h 0.232833 v 1.41394 c 0,0.41063 0.270934,0.59266 0.605367,0.59266 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5067" | |||
inkscape:connector-curvature="0" /> | |||
</g> | |||
<g | |||
aria-label="Sine" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.93888855px;line-height:6.61458302px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||
id="text4952"> | |||
<path | |||
d="m 12.236549,288.79709 c 0.5715,0 0.982133,-0.3302 0.982133,-0.80856 v -0.008 c 0,-0.4318 -0.287866,-0.67733 -0.973666,-0.81703 -0.702734,-0.14394 -0.8636,-0.33444 -0.8636,-0.6477 v -0.008 c 0,-0.30903 0.287866,-0.5588 0.7239,-0.5588 0.300566,0 0.5588,0.0804 0.817033,0.2794 0.02117,0.0169 0.04657,0.0254 0.07197,0.0254 0.05927,0 0.110066,-0.0508 0.110066,-0.11007 0,-0.0423 -0.0254,-0.072 -0.04657,-0.0889 -0.270934,-0.2032 -0.5461,-0.3048 -0.944034,-0.3048 -0.550333,0 -0.952499,0.33867 -0.952499,0.77894 v 0.008 c 0,0.44874 0.287866,0.69004 0.999066,0.83397 0.6731,0.13547 0.8382,0.3175 0.8382,0.63077 v 0.008 c 0,0.33867 -0.3048,0.58844 -0.7493,0.58844 -0.4064,0 -0.702733,-0.11854 -0.999066,-0.38524 -0.01693,-0.0127 -0.04233,-0.0254 -0.07197,-0.0254 -0.05927,0 -0.110067,0.0508 -0.110067,0.11007 0,0.0381 0.02117,0.0677 0.04233,0.0847 0.334433,0.27516 0.681566,0.41486 1.126066,0.41486 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5070" /> | |||
<path | |||
d="m 13.902895,285.92689 c 0,0.072 0.05503,0.127 0.127,0.127 0.07197,0 0.131233,-0.055 0.131233,-0.127 v -0.072 c 0,-0.072 -0.05927,-0.127 -0.131233,-0.127 -0.07197,0 -0.127,0.055 -0.127,0.127 z m 0.0254,2.73897 c 0,0.0635 0.04657,0.10583 0.105833,0.10583 0.05927,0 0.1016,-0.0423 0.1016,-0.10583 v -1.9812 c 0,-0.0635 -0.04657,-0.10583 -0.105833,-0.10583 -0.05927,0 -0.1016,0.0466 -0.1016,0.10583 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5072" /> | |||
<path | |||
d="m 14.948726,288.66586 c 0,0.0635 0.04657,0.10583 0.105834,0.10583 0.05927,0 0.1016,-0.0423 0.1016,-0.10583 v -1.15993 c 0,-0.44874 0.325966,-0.77047 0.7493,-0.77047 0.436033,0 0.6858,0.2921 0.6858,0.7366 v 1.1938 c 0,0.0635 0.04657,0.10583 0.105833,0.10583 0.05927,0 0.1016,-0.0423 0.1016,-0.10583 v -1.2319 c 0,-0.51647 -0.3175,-0.889 -0.8636,-0.889 -0.3937,0 -0.635,0.19897 -0.778933,0.45297 v -0.31327 c 0,-0.0635 -0.04657,-0.10583 -0.105834,-0.10583 -0.05927,0 -0.1016,0.0466 -0.1016,0.10583 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5074" /> | |||
<path | |||
d="m 17.616917,287.57366 c 0.0381,-0.47837 0.3683,-0.8382 0.795867,-0.8382 0.4953,0 0.745066,0.40217 0.7747,0.8382 z m 1.680633,0.88053 c 0.0254,-0.0254 0.03387,-0.0508 0.03387,-0.072 0,-0.055 -0.04657,-0.0974 -0.1016,-0.0974 -0.02963,0 -0.0508,0.0127 -0.06773,0.0296 -0.173567,0.16934 -0.389467,0.29634 -0.6985,0.29634 -0.423334,0 -0.808567,-0.31327 -0.846667,-0.8509 h 1.693333 c 0.0508,0 0.1016,-0.0466 0.1016,-0.0974 0,-0.61807 -0.385233,-1.1176 -0.9906,-1.1176 -0.5842,0 -1.024466,0.49953 -1.024466,1.12607 v 0.008 c 0,0.6731 0.491066,1.12607 1.058333,1.12607 0.389467,0 0.630767,-0.1397 0.842433,-0.35137 z" | |||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:4.23333311px;font-family:'Gotham Rounded';-inkscape-font-specification:'Gotham Rounded Light';text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||
id="path5076" /> | |||
</g> | |||
</g> | |||
<g | |||
inkscape:groupmode="layer" | |||
id="layer2" | |||
inkscape:label="components"> | |||
<circle | |||
style="display:inline;opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||
id="path4954" | |||
cx="15.24" | |||
cy="46.063263" | |||
r="4" | |||
inkscape:label="pitch" /> | |||
<circle | |||
r="4" | |||
cy="77.477875" | |||
cx="15.24" | |||
id="circle4956" | |||
style="display:inline;opacity:1;vector-effect:none;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||
inkscape:label="pitch" /> | |||
<circle | |||
style="display:inline;opacity:1;vector-effect:none;fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||
id="circle4958" | |||
cx="15.24" | |||
cy="108.71259" | |||
r="4" | |||
inkscape:label="sine" /> | |||
<circle | |||
inkscape:label="blink" | |||
r="4" | |||
cy="25.80987" | |||
cx="15.24" | |||
id="circle66" | |||
style="display:inline;opacity:1;vector-effect:none;fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" /> | |||
</g> | |||
</svg> |
@@ -1,13 +1,11 @@ | |||
# Panel Tutorial | |||
**Note: This tutorial is for designing Rack v1 panels. For Rack v0.6 panels, see the [Plugin Development Tutorial](PluginDevelopmentTutorial.html#panel).** | |||
# Panel Guide | |||
## Setup | |||
Install [Inkscape](https://inkscape.org/), a cross-platform open-source vector graphics editor, to create SVG panels for Rack modules. | |||
Install [Inkscape](https://inkscape.org/), a cross-platform open-source vector graphics editor, to create panels for Rack modules in the open [Scalable Vector Graphics (SVG)](https://en.wikipedia.org/wiki/Scalable_Vector_Graphics) format. | |||
- Create a new document. | |||
- Open the "Document Properties" panel (Shift+Ctrl+D), and make sure "Units" and "Display units" are set to "mm". | |||
- Open the "Document Properties" panel (Shift+Ctrl+D), and make sure "Units" and "Display units" are set to "mm" ("px" is not supported). | |||
- Set the height to 128.5 mm and the width to a desired multiple of 5.08 mm ([1 HP](http://www.doepfer.de/a100_man/a100m_e.htm) in Eurorack). | |||
## Designing your panel | |||
@@ -24,12 +22,11 @@ Design recommendations from VCV: | |||
- Labels should succinctly state the purpose of knobs, switches, and ports. | |||
- Roughly follow the graphical density and text sizes of Fundamental modules. | |||
*Copyright and trademark advice: | |||
Don't use others' intellectual property (IP) without their permission. | |||
It may be illegal and/or make the owner of the IP upset. | |||
Plugins which use other people's work unfairly will not be accepted into the [VCV Plugin Manager](https://vcvrack.com/plugins.html).* | |||
Don't hesitate to ask the [VCV community](https://community.vcvrack.com/c/development) for design help. | |||
Do not use other people's intellectual property (IP) without their permission. | |||
See the [VCV Plugin Ethics Guidelines](PluginLicensing.html#vcv-plugin-ethics-guidelines). | |||
Don't hesitate to ask the [VCV Community](https://community.vcvrack.com/c/development) for design help. | |||
You may find several graphic designers seeking programmers for collaboration. | |||
## SVG limitations | |||
@@ -53,7 +50,7 @@ Instead, add placeholders so that the `helper.py` script can generate C++. | |||
- Use the circle tool (F5) to position a placeholder by its center. | |||
The size of the circle does not matter, only the center point. | |||
A `create*Centered()` function call is generated in C++. | |||
- Use the rectangle tool (F4) to to position a placeholder by its top-left point. | |||
- Or use the rectangle tool (F4) to to position a placeholder by its top-left point. | |||
This should only be used when the component's size needs to be defined on the panel, such as a rectangular LED display. | |||
A `create*()` function call is generated in C++. | |||
- Set the color of each shape depending on the component's type. | |||
@@ -65,6 +62,10 @@ Instead, add placeholders so that the `helper.py` script can generate C++. | |||
- To save time editing the .cpp file later, you may name each component to automatically generate names in C++. | |||
Open the "Object Properties" panel (Shift+Ctrl+O), select a component placeholder, and type in the "Label" field. | |||
Note that you must press "Set" or Enter to apply the new name. | |||
- Hide the components layer using the "Layers" panel and save the file to `res/<module slug>.svg`. | |||
- Hide the components layer using the eye icon in the "Layers" panel and save the file to `res/<module slug>.svg`. | |||
Run `<Rack SDK>/helper.py createmodule <module slug>` to automatically convert your panel into a template .cpp source file. | |||
Run | |||
```bash | |||
<Rack SDK>/helper.py createmodule <module slug> res/<module slug>.svg src/<module slug>.cpp | |||
``` | |||
to automatically convert your panel into a template .cpp source file. |
@@ -1,105 +1,142 @@ | |||
# Plugin Development Tutorial | |||
*TODO Update for v1* | |||
## Prerequisites | |||
- Familiarity with C++ is required. | |||
- [Set up your development environment](Building.html#setting-up-your-development-environment). | |||
- If you would like to build Rack from source, follow [Building Rack](Building.html#building-rack). | |||
- If you would like to save time, you may skip building Rack and use the [Rack SDK](https://github.com/VCVRack/Rack/issues/258#issuecomment-405119759) instead. You can then run your plugin with an official build of Rack. | |||
## Template Plugin | |||
Clone the [VCV Template plugin](https://github.com/VCVRack/Template) in a `plugins/` directory to get started. Familiarize yourself with the file structure. | |||
- `Makefile`: The build system configuration file. Edit this to add compiler flags and custom targets. | |||
- `src/`: C++ and C source files | |||
- `Template.cpp / Template.hpp`: Plugin-wide source and header for plugin initialization and configuration. Rename this to the name of your plugin. | |||
- `MyModule.cpp`: A single module's source code. Duplicate this file for every module you wish to add. You may have multiple modules per file or multiple files for a single module, but one module per file is recommended. | |||
- `res/`: Resource directory for SVG graphics and anything else you need to `fopen()` | |||
- `LICENSE.txt`: The template itself is released into public domain (CC0), but you may wish to replace this with your own license. | |||
The Template plugin implements a simple sine VCO, demonstrating inputs, outputs, parameters, and other concepts. | |||
## Inputs, Outputs, Parameters, and Lights | |||
Decide how many components you need on the panel of your module. | |||
Change the names of inputs, outputs, params, and lights in the enums in the `MyModule` class of `MyModule.cpp`. | |||
## DSP | |||
Write the DSP code of your module in the `MyModule::step()` function, using the values from the `params`, `inputs`, and `outputs` vectors. | |||
Rack includes a work-in-progress DSP framework in the `include/dsp/` directory that you may use. | |||
Writing a high quality audio processor is easier said than done, but there are many fantastic books and online resources on audio DSP that will teach you what you need to know. | |||
My word of advice: *mind the aliasing*. | |||
## Panel | |||
Design your module's panel with a vector graphics editor and save it to the `res/` directory as an SVG file. | |||
[Inkscape](https://inkscape.org/en/) is recommended, but [Adobe Illustrator](https://www.adobe.com/products/illustrator.html), [Affinity Designer](https://affinity.serif.com/en-gb/designer/), [Gravit Designer](https://www.designer.io/), etc. may also work with certain SVG export settings. | |||
Make sure the path to the .svg file is correctly specified in the `setPanel(SVG::Load(...))` function in your `ModuleWidget` constructor. | |||
Rack renders SVGs at 75 DPI, and the standard Eurorack 1HP module size is 128.5mm x 5.08mm, 5.06" x 0.2", or 380px x 15px. | |||
Note: The Rack renderer is currently only capable of rendering path and group objects with solid fill and stroke. Gradients are experimental and might not work correctly. Text must be converted to paths. Clipping masks, clones, symbols, CSS other than a few style attributes, etc. are not supported. | |||
## Component Widgets | |||
Add widgets to the panel including params (knobs, buttons, switches, etc.), input ports, and output ports. | |||
Helper functions `createParam()`, `createInput()`, and `createOutput()` are used to construct a particular `Widget` subclass, set its (x, y) position, range of values, and default value. | |||
Rack Widgets are defined in `include/widgets.hpp` and `include/app.hpp`, and helpers are found in `include/rack.hpp`. | |||
Note: Widgets from `include/components.hpp` using Component Library SVG graphics are licensed under CC BY-NC 4.0 and are free to use for noncommercial purposes. | |||
Contact contact@vcvrack.com for information about licensing for commercial use. | |||
## Naming | |||
Eventually, you will need to change the name of your plugin from "Template" to something of your choice. | |||
Decide on a "slug" (case-sensitive unique identifier) for your plugin that only contains letters, numbers, and the characters `_-`. | |||
It should *NEVER* change after releasing your plugin, otherwise old patches will break, so choose the slug wisely. | |||
To guarantee uniqueness, it is a good idea to prefix the slug by your name, alias, or company name if available, e.g. "MyCompany-MyPlugin". | |||
- Rename `Template.cpp` and `Template.hpp`. | |||
- Change references of `#include "Template.hpp"` in each of the source files. | |||
- In the `Makefile`, change the `SLUG` and `VERSION`. | |||
## Versioning | |||
The version string of your plugin should follow the form **MAJOR.MINOR.REVISION** and is placed in your plugin's Makefile. | |||
- Before *Rack 1.0*, the **MAJOR.MINOR** version should match the version of Rack your plugin is built for, e.g. **0.5**. | |||
You are free to choose the **REVISION** version of your plugin, but it recommended to start counting at **0**. | |||
For example, *MyPlugin 0.5.4* would be compatible with all *Rack 0.5.X* versions. | |||
- After *Rack 1.0*, the **MAJOR** version should match the version of Rack your plugin is built for, e.g. **1**. | |||
You are free to choose the **MINOR.REVISION** version of your plugin. | |||
For example, *MyPlugin 1.4.2* would be compatible with all *Rack 1.X* versions. | |||
After releasing a version of your plugin, it is recommended to add a git tag to your repository with `git tag X.Y.Z`. | |||
## Licenses | |||
Don't forget to edit the `LICENSE.txt` file to choose a license of your choice, unless you want to release your plugin into the public domain (CC0). | |||
Before releasing your plugin, read the [Rack licenses](https://github.com/VCVRack/Rack#licenses). | |||
If you are considering "porting" a hardware module to the VCV Rack platform, it is a good idea to ask the creator first. | |||
It may be illegal, immoral, or cause unpleasant relationships to copy certain intellectual property without permission. | |||
## Building | |||
Make sure the VERSION and SLUG are correct in your Makefile, and run `make dist`. | |||
A ZIP package is generated in `dist/` for your architecture. | |||
If you do not have all platforms for building, other plugin developers will be happy to help you by simply obtaining your source and running `make dist` themselves. | |||
- Familiarity with C++, although creating Rack plugins is a great way to learn programming and C++. | |||
- Familiarity with navigating the command line (`cd`, `ls`, etc). | |||
- Familiarity with modular synthesizers. [Digital signal processing (DSP)](DSP.html) knowledge is only required if creating sound generators and processors. | |||
- Download and install [VCV Rack](https://vcvrack.com/Rack.html). | |||
- Download and extract the [Rack SDK](https://vcvrack.com/downloads/Rack-SDK-1.1.0.zip). | |||
This contains the Rack API headers and build system for compiling your plugin. | |||
- Follow the steps to [set up your build environment](Building.html#setting-up-your-development-environment) for your operating system. | |||
You do not need to build Rack from source if using the Rack SDK. | |||
## Creating the template plugin | |||
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 display documentation. | |||
Decide on a [slug](Metadata.html#slug) for your plugin. | |||
We will use `MyPlugin` for this tutorial. | |||
Run | |||
```bash | |||
<Rack SDK folder>/helper.py createplugin MyPlugin | |||
``` | |||
to create a folder called `MyPlugin/` in your current directory. | |||
Example session: | |||
```text | |||
Plugin name [MyPlugin]: My Plugin | |||
Version [1.0.0]: | |||
License (if open-source, use license identifier from https://spdx.org/licenses/) [proprietary]: CC0-1.0 | |||
Brand (prefix for all module names) [My Plugin]: | |||
Author []: VCV | |||
Author email (optional) []: contact@vcvrack.com | |||
Author website URL (optional) []: https://vcvrack.com/ | |||
Plugin website URL (optional) []: | |||
Manual website URL (optional) []: | |||
Source code URL (optional) []: | |||
Donate URL (optional) []: | |||
Manifest written to MyPlugin/plugin.json | |||
Created template plugin in MyPlugin/ | |||
Initialized empty Git repository in /home/VCV/MyPlugin/.git/ | |||
``` | |||
You can change this metadata later by editing `plugin.json`. (See [Metadata](Metadata.html)). | |||
To test your build system, you may run `RACK_DIR=<Rack SDK folder> make` in the plugin directory. | |||
If it succeeds, an "empty" plugin will be built containing no modules. | |||
However, this is an good opportunity to check that your build environment is set up correctly. | |||
## Creating panels | |||
For each module you wish to create, follow the [Panel Guide](Panel.html) to design an SVG panel graphic. | |||
For this tutorial, we will create a module with the slug `MyModule` and panel file [MyModule.svg](_static/MyModule.svg). | |||
Save this file to `res/` and run | |||
```bash | |||
<Rack SDK folder>/helper.py createmodule MyModule res/MyModule.svg src/MyModule.cpp | |||
``` | |||
This will create a C++ file automatically from components in the SVG file. | |||
Example session: | |||
```text | |||
Module name [MyModule]: My Module | |||
One-line description (optional) []: Simple sine oscillator | |||
Tags (comma-separated, case-insensitive, see https://github.com/VCVRack/Rack/blob/v1/src/plugin.cpp#L511-L571 for list) []: VCO | |||
Added MyModule to plugin.json | |||
Panel found at res/MyModule.svg. Generating source file. | |||
Found 1 params, 1 inputs, 1 outputs, 0 lights, and 0 custom widgets. | |||
Components extracted from res/MyModule.svgSource file generated at src/MyModule.cpp | |||
To enable the module, add | |||
extern Model *modelMyModule; | |||
to plugin.hpp, and add | |||
p->addModel(modelMyModule); | |||
to the init() function in plugin.cpp. | |||
``` | |||
Open `MyModule.svg` with Inkscape, open the Layers panel, and hide the `components` layer to hide component placeholders. | |||
## Implementing the DSP kernel | |||
Rack modules have four basic components, as we saw in the [Panel Guide](Panel.html). | |||
- **Param**: Read with `params[...].getValue()` | |||
- **Input**: Read with `inputs[...].getVoltage()` | |||
- **Output**: Write with `outputs[...].setVoltage(voltage)` | |||
- **Light**: Write with `lights[...].setBrightness(brightness)` | |||
In this tutorial, we will implement a simple sine oscillator with a **PITCH** param, 1V/oct **PITCH** input, **SINE** output, and a **BLINK** light that flashes at 1 Hz. | |||
Open the generated `src/MyModule.cpp` source file and add the following member variables to the `Module` class. | |||
```cpp | |||
float phase = 0.f; | |||
float blinkPhase = 0.f; | |||
``` | |||
These variables store the internal state of the module. | |||
Then add the following code to the `process()` function, which is called every audio frame (e.g. 44,100 times per second if the sample rate is 44,100 Hz). | |||
```cpp | |||
void process(const ProcessArgs &args) override { | |||
// Compute the frequency from the pitch parameter and input | |||
float pitch = params[PITCH_PARAM].getValue(); | |||
pitch += inputs[PITCH_INPUT].getVoltage(); | |||
pitch = clamp(pitch, -4.f, 4.f); | |||
// The default pitch is C4 = 261.6256f | |||
float freq = dsp::FREQ_C4 * std::pow(2.f, pitch); | |||
// Accumulate the phase | |||
phase += freq * args.sampleTime; | |||
if (phase >= 0.5f) | |||
phase -= 1.f; | |||
// Compute the sine output | |||
float sine = std::sin(2.f * M_PI * phase); | |||
// Audio signals are typically +/-5V | |||
// https://vcvrack.com/manual/VoltageStandards.html | |||
outputs[SINE_OUTPUT].setVoltage(5.f * sine); | |||
// Blink light at 1Hz | |||
blinkPhase += args.sampleTime; | |||
if (blinkPhase >= 1.f) | |||
blinkPhase -= 1.f; | |||
lights[BLINK_LIGHT].setBrightness(blinkPhase < 0.5f ? 1.f : 0.f); | |||
} | |||
``` | |||
Compile the plugin with `RACK_DIR=<Rack SDK folder> make`. | |||
If this succeeds, you can build a distributable plugin package with `RACK_DIR=<Rack SDK folder> make dist` or automatically install it to your Rack installation with `RACK_DIR=<Rack SDK folder> make install`. | |||
You should now be able to test your plugin by opening Rack and adding your module from the Module Browser. | |||
## Beyond the tutorial | |||
The Rack API is very flexible for creating custom [DSP](DSP.html) algorithms and custom interactive widgets handling many types of events from the keyboard, mouse, etc. | |||
See the [Rack API headers](https://github.com/VCVRack/Rack/tree/v1/include) or the [Rack API documentation](https://vcvrack.com/docs/namespaces.html) for the full reference, or review the source code of the many open-source plugins if you prefer learning by example. | |||
The [Voltage Standards](VoltageStandards.html) article defines the behavior for handling signals in a consistent way. | |||
You can find a wealth of information on the [Developer category](https://community.vcvrack.com/c/development) of the [VCV Community](https://community.vcvrack.com/) forum by searching or creating a new thread. | |||
## Releasing | |||
To list your plugin on the [VCV Plugin Manager](https://vcvrack.com/plugins.html), see the [VCV community repository README](https://github.com/VCVRack/community#for-plugin-developers). | |||
If you wish to sell your plugin on the [VCV Store](https://vcvrack.com/plugins.html), email contact@vcvrack.com for details. | |||
Eventually you may want to release your hard work. | |||
## Maintaining | |||
See [Plugin Licensing](PluginLicensing.html) for information about following Rack's license, particularly if developing a commercial plugin. | |||
It is recommended to add a `LICENSE.txt` file to your plugin's root folder that specifies your preferred license (whether open-source or proprietary). | |||
Since Rack is currently in Beta and moving very quickly, breaking changes may be made to the Rack plugin API. | |||
Subscribe to the [Plugin API Updates Thread](https://github.com/VCVRack/Rack/issues/258) to receive notifications when the Rack API changes or a discussion about a change is being held. | |||
Review your `plugin.json` [metadata](Metadata.html) file for correctness, spelling, and capitalization. | |||
Finally, submit your plugin to the [VCV Library](https://github.com/VCVRack/library#adding-your-plugin-to-the-vcv-library-for-open-source-plugins) to allow users to easily download your plugin from their VCV account. |
@@ -27,9 +27,9 @@ This license also includes permission to use the [Component Library](https://git | |||
It is recommended to contact VCV as early as possible in your development process to make sure the license agreement is ready well before you release your plugin. | |||
You can expedite the licensing processing by sending concepts and design mockups along with your license request. | |||
You may also wish to sell your plugin on the [VCV Plugin Manager](https://vcvrack.com/plugins.html). | |||
Some benefits of distributing your plugin on the VCV Plugin Manager: | |||
- Most Rack users are already familiar with the VCV Plugin Manager checkout system. | |||
You may also wish to sell your plugin on the [VCV Library](https://vcvrack.com/plugins.html). | |||
Some benefits of distributing your plugin on the VCV Library: | |||
- Most Rack users are already familiar with the VCV Library checkout system. | |||
- Plugin updates are automatically synchronized to users' computers. | |||
- 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. | |||
@@ -39,7 +39,7 @@ Some benefits of distributing your plugin on the VCV Plugin Manager: | |||
- You may not clone the brand name, model name, logo, panel design, or layout of components (knobs, ports, switches, etc) of an existing hardware or software product without permission from its owner, regardless of whether these are covered under trademark/copyright law. | |||
It is recommended to follow these guidelines for all plugins, but you are not legally required to do so. | |||
It is recommended to follow these guidelines for all plugins, but you are not legally obligated to do so. | |||
However, it is a requirement for: | |||
- distributing your plugin on the [VCV Plugin Manager](https://vcvrack.com/plugins.html). | |||
- distributing your plugin on the [VCV Library](https://vcvrack.com/plugins.html). | |||
- obtaining a [commercial plugin license](#i-want-to-sell-my-plugin-commercially-under-non-gplv3-terms). |
@@ -10,6 +10,10 @@ Rack attempts to model Eurorack standards as accurately as possible, but this is | |||
Signals should typically be \\(10V_{pp}\\) (peak-to-peak). | |||
This means that audio outputs should typically be **±5V** (before bandlimiting is applied), and CV modulation sources should typically be **0 to 10V** (unipolar CV) or **±5V** (bipolar CV). | |||
Absolute decibel measurements (e.g. for VU meters) should be relative to 10V amplitude. | |||
For example, a ±10V signal is 0 dB, and a ±5V signal is approximately -6 dB. | |||
You may alternatively use **dBV** for measurements relative to 1V amplitude. | |||
## Output Saturation | |||
In Eurorack, power supplies supply **-12 to 12V**. | |||
@@ -58,7 +62,7 @@ If your module might produce [NaNs](https://en.wikipedia.org/wiki/NaN) or infini | |||
## 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. | |||
If your module supports polyphonic inputs or 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". | |||
@@ -11,7 +11,3 @@ body, h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { | |||
.wy-nav-content { | |||
max-width: 1000px; | |||
} | |||
img.module-screenshot { | |||
height: 380px !important; | |||
} |
@@ -23,7 +23,8 @@ Rack | |||
:caption: Plugin Development | |||
PluginDevelopmentTutorial.md | |||
PanelTutorial.md | |||
Panel.md | |||
Metadata.md | |||
VoltageStandards.md | |||
DSP.md | |||
Migrate1.md | |||