@@ -4,7 +4,7 @@ VCV was founded by Andrew Belt in 2016 and is based in Tennessee, USA. | |||
Its flagship product VCV Rack was released on September 10, 2017 at [Knobcon](https://knobcon.com/) after two years of development. | |||
It was based on an unreleased C++ modular audio engine written by Andrew in 2012. | |||
VCV collaborates with [Grayscale](http://grayscale.info/) to design the [Fundamental](https://vcvrack.com/Fundamental.html) plugin and commercial VCV modules. | |||
VCV collaborates with [Grayscale](http://grayscale.info/) to design the [Fundamental](https://vcvrack.com/Fundamental.html) plugin, commercial VCV modules, and the UI design of Rack. | |||
## Mission | |||
@@ -11,26 +11,32 @@ However, you need proper tools to build Rack and these dependencies. | |||
Install [Xcode](https://developer.apple.com/xcode/). | |||
Using [Homebrew](https://brew.sh/), install the build dependencies. | |||
``` | |||
brew install git wget cmake autoconf automake libtool | |||
brew install git wget cmake autoconf automake libtool jq | |||
``` | |||
### Windows | |||
Install [MSYS2](http://www.msys2.org/) and launch the MinGW 64-bit shell (not the default MSYS shell). | |||
If you have an anti-virus program running, disable it. | |||
Install [MSYS2](http://www.msys2.org/) and launch the MinGW 64-bit shell from the Start menu, *not the default MSYS shell*. | |||
``` | |||
pacman -Syu | |||
``` | |||
Then restart the shell. | |||
``` | |||
pacman -S git wget make tar unzip zip mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake autoconf automake mingw-w64-x86_64-libtool | |||
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 | |||
``` | |||
### Linux | |||
On Ubuntu 16.04: | |||
``` | |||
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 | |||
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 | |||
``` | |||
On Arch Linux: | |||
``` | |||
pacman -S git wget gcc make cmake tar unzip zip curl | |||
pacman -S git wget gcc make cmake tar unzip zip curl jq | |||
``` | |||
## Building Rack | |||
@@ -38,18 +44,20 @@ pacman -S git wget gcc make cmake tar unzip zip curl | |||
*If the build fails for you, please report the issue with a detailed error message to help the portability of 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, as 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. | |||
Clone submodules. | |||
git submodule update --init --recursive | |||
Build dependencies locally. | |||
You may add `-j$(nproc)` to your make commands to parallelize builds across all CPU cores. | |||
You may add `-j4` (or your number of logical cores) to your `make` commands to parallelize builds. | |||
This may take 15-60 minutes. | |||
make dep | |||
Build Rack. | |||
This may take 1-5 minutes. | |||
make | |||
@@ -1,23 +1,23 @@ | |||
# Communities | |||
- [VCVRack.com](https://vcvrack.com/) | |||
- [Forum](https://community.vcvrack.com/) | |||
- [Website](https://vcvrack.com/) | |||
- [Community forum](https://community.vcvrack.com/) | |||
- [Facebook page](https://www.facebook.com/vcvrack/) | |||
- [Twitter](https://twitter.com/vcvrack) | |||
- [Github issue tracker](https://github.com/VCVRack/Rack/issues) | |||
- [Youtube](https://www.youtube.com/c/VCVRack) | |||
- [Instagram](https://www.instagram.com/vcvrack/) | |||
- [Facebook user group](https://www.facebook.com/groups/vcvrack/) | |||
- [Facebook developer group](https://www.facebook.com/groups/2035785263299933/) | |||
- [Facebook French user group](https://www.facebook.com/groups/2069785583250645/) | |||
- [Facebook Italian user group](https://www.facebook.com/groups/vcvitalia/) | |||
- [Switched On Rack blog](http://www.switchedonrack.com/) | |||
- [Youtube](https://www.youtube.com/c/VCVRack) | |||
- [Instagram](https://www.instagram.com/vcvrack/) | |||
- [Discord](https://discord.gg/wxa89Mh) | |||
- [Reddit](https://www.reddit.com/r/vcvrack/) | |||
- [IRC](http://webchat.freenode.net?channels=%23VCVRack) | |||
- [Patchstorage](https://patchstorage.com/platform/vcv-rack/) | |||
- [Switched On Rack unofficial blog](http://www.switchedonrack.com/) | |||
- [MuffWiggler thread](https://www.muffwiggler.com/forum/viewtopic.php?t=186899) | |||
- [KVR Audio thread](https://www.kvraudio.com/forum/viewtopic.php?f=23&t=489230) | |||
- [Hispasonic thread (Spanish)](https://www.hispasonic.com/foros/foro-vcv-rack/516252) | |||
- [Patchstorage](https://patchstorage.com/platform/vcv-rack/) | |||
- [Switched On Rack collaboration albums](https://switchedonrack.bandcamp.com/) | |||
- [Reddit](https://www.reddit.com/r/vcvrack/) | |||
- [IRC](http://webchat.freenode.net?channels=%23VCVRack) |
@@ -80,11 +80,13 @@ When running Rack in development mode, it is your current working directory inst | |||
## Will Rack be ported to iOS or Android? | |||
It is not planned. Many issues would need to be addressed. | |||
- Tablet and phone users don't normally use mice, so a touch driver would need to be written. If GLFW is still used, [touch support](https://github.com/glfw/glfw/issues/42) would need to be added to the library. | |||
- There is no user-managed filesystem on iOS, and forcing users to mess with the filesystem is bad UX on Android, so plugin folders and patch files would need to be managed entirely by Rack itself. | |||
- There is no OpenGL on mobile devices, so the OpenGL ES driver would need to be used and tested. | |||
- RtAudio and RtMidi don't have iOS Core Audio/MIDI or Android HAL/OpenSL ES backends, so they would need to be added and tested. | |||
- Apple does not allow apps distributed through the store to download and execute code, so either all plugins would need to be included in the distributable, or it could only be distributed on jailbroken iOS devices, which is an absurd user requirement. | |||
- Such a port would be very expensive to develop, so it would need to be sold commercially. Some plugins (proprietary, GPL, etc) would need special licensing agreements in order to be included in the package. Some plugins would increase the cost of the product if included in the package. Others would simply be omitted from the third-party plugin collection. | |||
- The friction for a developer to build and test their plugins on iOS/Android is significantly higher than the three desktop OS's, which may decrease their willingness to develop Rack plugins. | |||
It is not planned. There are many issues with such a project. | |||
- Technical: | |||
- Tablet and phone users don't normally use mice, so a touch driver would need to be written. If GLFW is still used, [touch support](https://github.com/glfw/glfw/issues/42) would need to be added to the library. | |||
- There is no user-managed filesystem on iOS, and forcing users to mess with the filesystem is bad UX on Android, so plugin folders and patch files would need to be managed entirely by Rack itself. | |||
- RtAudio and RtMidi don't have iOS Core Audio/MIDI or Android HAL/OpenSL ES backends, so they would need to be added and tested. | |||
- Apple does not allow apps distributed through the store to download and execute code, so either all plugins would need to be included in the distributable, or it could only be distributed on jailbroken iOS devices, which is an absurd user requirement. | |||
- Business: | |||
- Such a port would be expensive to develop, so it would need to be sold commercially. Some plugins (proprietary, GPL, etc) would need special licensing agreements in order to be included in the package. Some plugins would increase the cost of the product if included in the package. Others would simply be omitted from the third-party plugin collection. | |||
- The friction for a developer to build and test their plugins on iOS/Android is significantly higher than the three desktop OS's, which may decrease their willingness to develop Rack plugins. | |||
- When serving an app on the App Store or Google Play, Apple or Google are typically not obligated to continue serving an app and may remove it at will or change policies that can disrupt VCV's business model. This would place VCV's risk in a small number of baskets. |
@@ -1,6 +1,6 @@ | |||
# Migrating 0.6 plugins to Rack v1 | |||
***This document is a draft. It is not recommended to migrate plugins at this time. If you begin now, you will likely need to follow this guide again when the Rack v1 API is stabilized.*** | |||
**This document is a draft. It is not recommended to migrate plugins at this time. If you begin now, you will likely need to follow this guide again when the Rack v1 API is stabilized.** | |||
## The easy way: using the `rack0.hpp` compatibility header | |||
@@ -21,17 +21,23 @@ Model *modelMyModule = Model::create<MyModule, MyModuleWidget>("MyModule"); | |||
Make the following string replacements (requires Perl). | |||
``` | |||
perl -pi -e "s/Model::create/createModel/g" src/*.cpp | |||
perl -pi -e "s/ParamWidget::create/createParam/g" src/*.cpp | |||
perl -pi -e "s/ModuleLightWidget::create/createLight/g" src/*.cpp | |||
perl -pi -e "s/Port::create/createPort/g" src/*.cpp | |||
perl -pi -e "s/Port::OUTPUT/PortWidget::OUTPUT/g" src/*.cpp | |||
perl -pi -e "s/Port::INPUT/PortWidget::INPUT/g" src/*.cpp | |||
perl -pi -e "s/Widget::create/createWidget/g" src/*.cpp | |||
perl -pi -e "s/MenuLabel::create/createMenuLabel/g" src/*.cpp | |||
perl -pi -e "s/MenuItem::create/createMenuItem/g" src/*.cpp | |||
perl -pi -e "s/toJson/dataToJson/g" src/*.cpp | |||
perl -pi -e "s/fromJson/dataFromJson/g" src/*.cpp | |||
# Rename `plugin` variable to avoid a name collision with the `plugin::` namespace | |||
perl -pi -e "s/\bplugin\b/pluginInstance/g" src/* | |||
# Change `X::create()` functions to `createX()` | |||
perl -pi -e "s/Model::create/createModel/g" src/* | |||
perl -pi -e "s/ParamWidget::create/createParam/g" src/* | |||
perl -pi -e "s/ModuleLightWidget::create/createLight/g" src/* | |||
perl -pi -e "s/Port::create/createPort/g" src/* | |||
perl -pi -e "s/Port::OUTPUT/PortWidget::OUTPUT/g" src/* | |||
perl -pi -e "s/Port::INPUT/PortWidget::INPUT/g" src/* | |||
perl -pi -e "s/Widget::create/createWidget/g" src/* | |||
perl -pi -e "s/MenuLabel::create/createMenuLabel/g" src/* | |||
perl -pi -e "s/MenuItem::create/createMenuItem/g" src/* | |||
# Change `to/fromJson()` to `dataTo/FromJson()` | |||
perl -pi -e "s/toJson/dataToJson/g" src/* | |||
perl -pi -e "s/fromJson/dataFromJson/g" src/* | |||
``` | |||
If your plugin uses any of Rack's `dsp/*.hpp` headers, remove the `#include` statements since they are now automatically included. | |||
@@ -47,16 +53,28 @@ First complete the above section using the compatibility header as a first step. | |||
Once it is able to compile, change `#include "rack0.hpp"` back to `#include "rack.hpp"` | |||
``` | |||
perl -pi -e "s/engineGetSampleRate/app()->engine->getSampleRate/g" src/*.cpp | |||
perl -pi -e "s/engineGetSampleTime/app()->engine->getSampleTime/g" src/*.cpp | |||
perl -pi -e "s/, PortWidget::INPUT//g" src/*.cpp | |||
perl -pi -e "s/addInput\(createPort/addInput(createInput/g" src/*.cpp | |||
perl -pi -e "s/, PortWidget::OUTPUT//g" src/*.cpp | |||
perl -pi -e "s/addOutput\(createPort/addOutput(createOutput/g" src/*.cpp | |||
perl -pi -e "s/randomUniform/random::uniform/g" src/*.cpp | |||
perl -pi -e "s/randomNormal/random::normal/g" src/*.cpp | |||
``` | |||
# Use `APP` macro for accessing global state | |||
perl -pi -e "s/engineGetSampleRate/APP->engine->getSampleRate/g" src/* | |||
perl -pi -e "s/engineGetSampleTime/APP->engine->getSampleTime/g" src/* | |||
perl -pi -e "s/Font::load/APP->window->loadFont/g" src/* | |||
perl -pi -e "s/Image::load/APP->window->loadImage/g" src/* | |||
perl -pi -e "s/SVG::load/APP->window->loadSvg/g" src/* | |||
Add the `dsp::` prefix. | |||
# Use `createInput/Output()` functions instead of `createPort()` | |||
perl -pi -e "s/, PortWidget::INPUT//g" src/* | |||
perl -pi -e "s/addInput\(createPort/addInput(createInput/g" src/* | |||
perl -pi -e "s/, PortWidget::OUTPUT//g" src/* | |||
perl -pi -e "s/addOutput\(createPort/addOutput(createOutput/g" src/* | |||
TODO | |||
# Add namespaces to global functions | |||
perl -pi -e "s/randomUniform/random::uniform/g" src/* | |||
perl -pi -e "s/randomNormal/random::normal/g" src/* | |||
# Change `void draw(NVGcontext *vg)` to `void draw(const DrawContext &ctx)` | |||
perl -pi -e "s/draw\(NVGcontext \*vg\)/draw\(const DrawContext &ctx\)/g" src/* | |||
perl -pi -e "s/\(vg/(ctx.vg/g" src/* | |||
perl -pi -e "s/draw\(vg\)/draw\(ctx\)/g" src/* | |||
# Add the `dsp::` namespace to dsp classes | |||
# TODO | |||
``` |