@@ -27,7 +27,7 @@ Tested in | |||||
# Downloads | # Downloads | ||||
The current release can be found in the [vst2_bin/](vst2_bin/) folder. | The current release can be found in the [vst2_bin/](vst2_bin/) folder. | ||||
Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-05Aug2018.7z](dist/veeseevstrack_0_6_1_win64_bin-05Aug2018.7z) (64bit) | |||||
Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-06Aug2018.7z](dist/veeseevstrack_0_6_1_win64_bin-06Aug2018.7z) (64bit) | |||||
Note: The effect plugin can used be as an instrument, too. You just have to send it MIDI events ! | Note: The effect plugin can used be as an instrument, too. You just have to send it MIDI events ! | ||||
@@ -10,6 +10,7 @@ | |||||
extern void vst2_window_size_set (int _width, int _height); | extern void vst2_window_size_set (int _width, int _height); | ||||
extern void vst2_refresh_rate_set (float _hz); | |||||
namespace rack { | namespace rack { | ||||
@@ -130,14 +131,30 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||||
global_ui->app.gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0); | global_ui->app.gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0); | ||||
} | } | ||||
// refresh rate (Hz) | |||||
// (note) <15: use DAW timer (effEditIdle) | |||||
json_t *refreshJ = json_object_get(rootJ, "refreshRate"); | |||||
if (refreshJ) { | |||||
vst2_refresh_rate_set(clamp((float) json_number_value(refreshJ), 0.0f, 200.0f)); | |||||
} | |||||
// vsync | |||||
if(!bWindowSizeOnly) | |||||
{ | |||||
json_t *vsyncJ = json_object_get(rootJ, "vsync"); | |||||
if (vsyncJ) | |||||
{ | |||||
lglw_glcontext_push(global_ui->window.lglw); | |||||
lglw_swap_interval(global_ui->window.lglw, json_is_true(vsyncJ)); | |||||
lglw_glcontext_pop(global_ui->window.lglw); | |||||
} | |||||
} | |||||
// allowCursorLock | // allowCursorLock | ||||
json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); | json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); | ||||
if (allowCursorLockJ) | if (allowCursorLockJ) | ||||
{ | { | ||||
global_ui->window.gAllowCursorLock = json_is_true(allowCursorLockJ); | global_ui->window.gAllowCursorLock = json_is_true(allowCursorLockJ); | ||||
// #ifdef USE_VST2 | |||||
// global_ui->window.gAllowCursorLock = 0; | |||||
// #endif // USE_VST2 | |||||
} | } | ||||
#ifndef USE_VST2 | #ifndef USE_VST2 | ||||
@@ -17,7 +17,7 @@ | |||||
/// | /// | ||||
/// created: 25Jun2018 | /// created: 25Jun2018 | ||||
/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | /// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | ||||
/// 26Jul2018, 04Aug2018, 05Aug2018 | |||||
/// 26Jul2018, 04Aug2018, 05Aug2018, 06Aug2018 | |||||
/// | /// | ||||
/// | /// | ||||
/// | /// | ||||
@@ -419,6 +419,8 @@ public: | |||||
sF32 tmp_input_buffers[NUM_INPUTS * MAX_BLOCK_SIZE]; | sF32 tmp_input_buffers[NUM_INPUTS * MAX_BLOCK_SIZE]; | ||||
sUI redraw_ival_ms; // 0=use DAW timer (effEditIdle) | |||||
public: | public: | ||||
VSTPluginWrapper(VSTHostCallback vstHostCallback, | VSTPluginWrapper(VSTHostCallback vstHostCallback, | ||||
VstInt32 vendorUniqueID, | VstInt32 vendorUniqueID, | ||||
@@ -508,6 +510,13 @@ public: | |||||
editor_rect.bottom = EDITWIN_Y + _height; | editor_rect.bottom = EDITWIN_Y + _height; | ||||
} | } | ||||
void setRefreshRate(float _hz) { | |||||
if(_hz < 15.0f) | |||||
redraw_ival_ms = 0u; | |||||
else | |||||
redraw_ival_ms = sUI(1000.0f / _hz); | |||||
} | |||||
void openEditor(void *_hwnd) { | void openEditor(void *_hwnd) { | ||||
printf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); | printf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); | ||||
setGlobals(); | setGlobals(); | ||||
@@ -517,6 +526,12 @@ public: | |||||
(editor_rect.right - editor_rect.left), | (editor_rect.right - editor_rect.left), | ||||
(editor_rect.bottom - editor_rect.top) | (editor_rect.bottom - editor_rect.top) | ||||
); | ); | ||||
if(0u != redraw_ival_ms) | |||||
{ | |||||
lglw_timer_start(rack_global_ui.window.lglw, redraw_ival_ms); | |||||
} | |||||
b_editor_open = true; | b_editor_open = true; | ||||
} | } | ||||
@@ -525,6 +540,7 @@ public: | |||||
if(b_editor_open) | if(b_editor_open) | ||||
{ | { | ||||
setGlobals(); | setGlobals(); | ||||
lglw_timer_stop(rack_global_ui.window.lglw); | |||||
lglw_window_close(rack_global_ui.window.lglw); | lglw_window_close(rack_global_ui.window.lglw); | ||||
b_editor_open = false; | b_editor_open = false; | ||||
} | } | ||||
@@ -708,6 +724,23 @@ public: | |||||
} | } | ||||
} | } | ||||
void redraw(void) { | |||||
setGlobals(); | |||||
if(lglw_window_is_visible(rack::global_ui->window.lglw)) | |||||
{ | |||||
vst2_set_shared_plugin_tls_globals(); | |||||
// Save DAW GL context and bind our own | |||||
lglw_glcontext_push(rack::global_ui->window.lglw); | |||||
rack::vst2_editor_redraw(); | |||||
// Restore the DAW's GL context | |||||
lglw_glcontext_pop(rack::global_ui->window.lglw); | |||||
} | |||||
} | |||||
private: | private: | ||||
// the host callback (a function pointer) | // the host callback (a function pointer) | ||||
VSTHostCallback _vstHostCallback; | VSTHostCallback _vstHostCallback; | ||||
@@ -1128,25 +1161,16 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
#endif | #endif | ||||
case effEditIdle: | case effEditIdle: | ||||
wrapper->setGlobals(); | |||||
if(lglw_window_is_visible(rack::global_ui->window.lglw)) | |||||
if(0 == wrapper->redraw_ival_ms) | |||||
{ | { | ||||
vst2_set_shared_plugin_tls_globals(); | |||||
// Save DAW GL context and bind our own | |||||
lglw_glcontext_push(rack::global_ui->window.lglw); | |||||
rack::vst2_editor_redraw(); | |||||
// Restore the DAW's GL context | |||||
lglw_glcontext_pop(rack::global_ui->window.lglw); | |||||
wrapper->redraw(); | |||||
} | } | ||||
break; | break; | ||||
case effEditGetRect: | case effEditGetRect: | ||||
// Query editor window geometry | // Query editor window geometry | ||||
// ptr: ERect* (on Windows) | // ptr: ERect* (on Windows) | ||||
if(NULL != ptr) // yeah, this should never be NULL | |||||
if(NULL != ptr) | |||||
{ | { | ||||
// ... | // ... | ||||
*(void**)ptr = (void*) &wrapper->editor_rect; | *(void**)ptr = (void*) &wrapper->editor_rect; | ||||
@@ -1295,6 +1319,8 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
editor_rect.top = EDITWIN_Y; | editor_rect.top = EDITWIN_Y; | ||||
editor_rect.right = EDITWIN_X + EDITWIN_W; | editor_rect.right = EDITWIN_X + EDITWIN_W; | ||||
editor_rect.bottom = EDITWIN_Y + EDITWIN_H; | editor_rect.bottom = EDITWIN_Y + EDITWIN_H; | ||||
redraw_ival_ms = 0; | |||||
} | } | ||||
/** | /** | ||||
@@ -1339,6 +1365,15 @@ void vst2_window_size_set(int _width, int _height) { | |||||
rack::global->vst2.wrapper->setWindowSize(_width, _height); | rack::global->vst2.wrapper->setWindowSize(_width, _height); | ||||
} | } | ||||
void vst2_refresh_rate_set (float _hz) { | |||||
rack::global->vst2.wrapper->setRefreshRate(_hz); | |||||
} | |||||
extern "C" void lglw_timer_cbk(lglw_t _lglw) { | |||||
VSTPluginWrapper *wrapper = (VSTPluginWrapper*)lglw_userdata_get(_lglw); | |||||
wrapper->redraw(); | |||||
} | |||||
/** | /** | ||||
* Implementation of the main entry point of the plugin | * Implementation of the main entry point of the plugin | ||||
@@ -0,0 +1,632 @@ | |||||
//#ifdef USE_VST2 | |||||
/// vst2_main.cpp | |||||
/// | |||||
/// (c) 2018 bsp. very loosely based on pongasoft's "hello, world" example plugin. | |||||
/// | |||||
/// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
/// you may not use this file except in compliance with the License. | |||||
/// You may obtain a copy of the License at | |||||
/// | |||||
/// http://www.apache.org/licenses/LICENSE-2.0 | |||||
/// | |||||
/// Unless required by applicable law or agreed to in writing, software | |||||
/// distributed under the License is distributed on an "AS IS" BASIS, | |||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
/// See the License for the specific language governing permissions and | |||||
/// limitations under the License. | |||||
/// | |||||
/// created: 25Jun2018 | |||||
/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | |||||
/// | |||||
/// | |||||
/// | |||||
// #define DEBUG_PRINT_EVENTS defined | |||||
// #define DEBUG_PRINT_PARAMS defined | |||||
#define NUM_INPUTS ( 2) // must match AudioInterface.cpp:AUDIO_INPUTS | |||||
#define NUM_OUTPUTS ( 2) // must match AudioInterface.cpp:AUDIO_OUTPUTS | |||||
// (note) causes reason to shut down when console is freed (when plugin is deleted) | |||||
//#define USE_CONSOLE defined | |||||
#undef RACK_HOST | |||||
#include <aeffect.h> | |||||
#include <aeffectx.h> | |||||
#include <stdio.h> | |||||
#include "../dep/yac/yac.h" | |||||
#include "../dep/yac/yac_host.cpp" | |||||
YAC_Host *yac_host; // not actually used, just to satisfy the linker | |||||
#include "global_pre.hpp" | |||||
#include "global.hpp" | |||||
#include "global_ui.hpp" | |||||
extern int vst2_init (int argc, char* argv[]); | |||||
extern void vst2_exit (void); | |||||
extern void vst2_editor_create (void); | |||||
extern void vst2_editor_loop (void); | |||||
extern void vst2_editor_destroy (void); | |||||
extern void vst2_set_samplerate (sF32 _rate); | |||||
extern void vst2_engine_process (float *const*_in, float **_out, unsigned int _numFrames); | |||||
extern void vst2_process_midi_input_event (sU8 _a, sU8 _b, sU8 _c); | |||||
extern void vst2_queue_param (int uniqueParamId, float normValue); | |||||
extern void vst2_handle_queued_params (void); | |||||
extern float vst2_get_param (int uniqueParamId); | |||||
extern void vst2_get_param_name (int uniqueParamId, char *s, int sMaxLen); | |||||
extern void vst2_set_shared_plugin_tls_globals (void); | |||||
#include "../include/window.hpp" | |||||
#include "../dep/include/osdialog.h" | |||||
#include "../include/app.hpp" | |||||
// using namespace rack; | |||||
// extern void rack::windowRun(void); | |||||
#if defined(_WIN32) || defined(_WIN64) | |||||
#define HAVE_WINDOWS defined | |||||
#define WIN32_LEAN_AND_MEAN defined | |||||
#include <windows.h> | |||||
#include <xmmintrin.h> | |||||
EXTERN_C IMAGE_DOS_HEADER __ImageBase; | |||||
extern "C" extern HWND g_glfw_vst2_parent_hwnd; // read by modified version of GLFW (see glfw/src/win32_window.c) | |||||
extern "C" extern HWND __hack__glfwGetHWND (GLFWwindow *window); | |||||
// Windows: | |||||
#define VST_EXPORT extern "C" __declspec(dllexport) | |||||
struct PluginMutex { | |||||
CRITICAL_SECTION handle; | |||||
PluginMutex(void) { | |||||
::InitializeCriticalSection( &handle ); | |||||
} | |||||
~PluginMutex() { | |||||
::DeleteCriticalSection( &handle ); | |||||
} | |||||
void lock(void) { | |||||
::EnterCriticalSection(&handle); | |||||
} | |||||
void unlock(void) { | |||||
::LeaveCriticalSection(&handle); | |||||
} | |||||
}; | |||||
#else | |||||
// MacOSX, Linux: | |||||
#define HAVE_UNIX defined | |||||
#define VST_EXPORT extern | |||||
#include <pthread.h> | |||||
#include <errno.h> | |||||
#include <unistd.h> | |||||
#include <fcntl.h> | |||||
#include <sys/mman.h> | |||||
//static pthread_mutex_t loc_pthread_mutex_t_init = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; | |||||
static pthread_mutex_t loc_pthread_mutex_t_init = PTHREAD_MUTEX_INITIALIZER; | |||||
struct PluginMutex { | |||||
pthread_mutex_t handle; | |||||
PluginMutex(void) { | |||||
::memcpy((void*)&handle, (const void*)&loc_pthread_mutex_t_init, sizeof(pthread_mutex_t)); | |||||
} | |||||
~PluginMutex() { | |||||
} | |||||
void lock(void) { | |||||
::pthread_mutex_lock(&handle); | |||||
} | |||||
void unlock(void) { | |||||
::pthread_mutex_unlock(&handle); | |||||
} | |||||
}; | |||||
#endif // _WIN32||_WIN64 | |||||
// // extern "C" { | |||||
// // extern void glfwSetInstance(void *_glfw); | |||||
// // } | |||||
class PluginString : public YAC_String { | |||||
public: | |||||
static const sUI QUOT2 =(sUI)(1<<26); // \'\' | |||||
static const sUI STRFLQMASK = (QUOT | UTAG1 | QUOT2); | |||||
void safeFreeChars (void); | |||||
sSI _realloc (sSI _numChars); | |||||
sSI lastIndexOf (sChar _c, sUI _start) const; | |||||
void getDirName (PluginString *_r) const; | |||||
void replace (sChar _c, sChar _o); | |||||
}; | |||||
void PluginString::safeFreeChars(void) { | |||||
if(bflags & PluginString::DEL) | |||||
{ | |||||
// if(!(bflags & PluginString::LA)) | |||||
{ | |||||
Dyacfreechars(chars); | |||||
} | |||||
} | |||||
} | |||||
sSI PluginString::_realloc(sSI _numBytes) { | |||||
// Force alloc if a very big string is about to shrink a lot or there is simply not enough space available | |||||
if( ((buflen >= 1024) && ( (((sUI)_numBytes)<<3) < buflen )) || | |||||
(NULL == chars) || | |||||
(buflen < ((sUI)_numBytes)) | |||||
) // xxx (!chars) hack added 180702 | |||||
{ | |||||
if(NULL != chars) | |||||
{ | |||||
sUI l = length; | |||||
if(((sUI)_numBytes) < l) | |||||
{ | |||||
l = _numBytes; | |||||
} | |||||
sU8 *nc = Dyacallocchars(_numBytes + 1); | |||||
sUI i = 0; | |||||
for(; i<l; i++) | |||||
{ | |||||
nc[i] = chars[i]; | |||||
} | |||||
nc[i] = 0; | |||||
safeFreeChars(); | |||||
buflen = (_numBytes + 1); | |||||
bflags = PluginString::DEL | (bflags & PluginString::STRFLQMASK); // keep old stringflags | |||||
length = i + 1; | |||||
chars = nc; | |||||
key = YAC_LOSTKEY; | |||||
return YAC_TRUE; | |||||
} | |||||
else | |||||
{ | |||||
return PluginString::alloc(_numBytes + 1); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
key = YAC_LOSTKEY; // new 010208 | |||||
return YAC_TRUE; | |||||
} | |||||
} | |||||
sSI PluginString::lastIndexOf(sChar _c, sUI _start) const { | |||||
sSI li = -1; | |||||
if(NULL != chars) | |||||
{ | |||||
sUI i = _start; | |||||
for(; i<length; i++) | |||||
{ | |||||
if(chars[i] == ((sChar)_c)) | |||||
{ | |||||
li = i; | |||||
} | |||||
} | |||||
} | |||||
return li; | |||||
} | |||||
void PluginString::replace(sChar _c, sChar _o) { | |||||
if(NULL != chars) | |||||
{ | |||||
for(sUI i = 0; i < length; i++) | |||||
{ | |||||
if(chars[i] == _c) | |||||
chars[i] = _o; | |||||
} | |||||
} | |||||
} | |||||
void PluginString::getDirName(PluginString *_r) const { | |||||
sSI idxSlash = lastIndexOf('/', 0); | |||||
sSI idxBackSlash = lastIndexOf('\\', 0); | |||||
sSI idxDrive = lastIndexOf(':', 0); | |||||
sSI idx = -1; | |||||
if(idxSlash > idxBackSlash) | |||||
{ | |||||
idx = idxSlash; | |||||
} | |||||
else | |||||
{ | |||||
idx = idxBackSlash; | |||||
} | |||||
if(idxDrive > idx) | |||||
{ | |||||
idx = idxDrive; | |||||
} | |||||
if(-1 != idx) | |||||
{ | |||||
_r->_realloc(idx + 2); | |||||
_r->length = idx + 2; | |||||
sSI i; | |||||
for(i=0; i<=idx; i++) | |||||
{ | |||||
_r->chars[i] = chars[i]; | |||||
} | |||||
_r->chars[i++] = 0; | |||||
_r->key = YAC_LOSTKEY; | |||||
} | |||||
else | |||||
{ | |||||
_r->empty(); | |||||
} | |||||
} | |||||
#define MAX_FLOATARRAYALLOCSIZE (1024*1024*64) | |||||
class PluginFloatArray : public YAC_FloatArray { | |||||
public: | |||||
sSI alloc (sSI _maxelements); | |||||
}; | |||||
sSI PluginFloatArray::alloc(sSI _max_elements) { | |||||
if(((sUI)_max_elements)>MAX_FLOATARRAYALLOCSIZE) | |||||
{ | |||||
printf("[---] FloatArray::insane array size (maxelements=%08x)\n", _max_elements); | |||||
return 0; | |||||
} | |||||
if(own_data) | |||||
{ | |||||
if(elements) | |||||
{ | |||||
delete [] elements; | |||||
elements = NULL; | |||||
} | |||||
} | |||||
if(_max_elements) | |||||
{ | |||||
elements = new(std::nothrow) sF32[_max_elements]; | |||||
if(elements) | |||||
{ | |||||
max_elements = _max_elements; | |||||
num_elements = 0; | |||||
own_data = 1; | |||||
return 1; | |||||
} | |||||
} | |||||
num_elements = 0; | |||||
max_elements = 0; | |||||
return 0; | |||||
} | |||||
/* | |||||
* I find the naming a bit confusing so I decided to use more meaningful names instead. | |||||
*/ | |||||
/** | |||||
* The VSTHostCallback is a function pointer so that the plugin can communicate with the host (not used in this small example) | |||||
*/ | |||||
typedef audioMasterCallback VSTHostCallback; | |||||
/** | |||||
* The VSTPlugin structure (AEffect) contains information about the plugin (like version, number of inputs, ...) and | |||||
* callbacks so that the host can call the plugin to do its work. The primary callback will be `processReplacing` for | |||||
* single precision (float) sample processing (or `processDoubleReplacing` for double precision (double)). | |||||
*/ | |||||
typedef AEffect VSTPlugin; | |||||
void vst2_lock_midi_device() { | |||||
} | |||||
void vst2_unlock_midi_device() { | |||||
} | |||||
void vst2_handle_queued_set_program_chunk(void) { | |||||
} | |||||
void vst2_handle_ui_param(int uniqueParamId, float normValue) { | |||||
} | |||||
void vst2_get_timing_info(int *_retPlaying, float *_retBPM, float *_retSongPosPPQ) { | |||||
} | |||||
void vst2_maximize_reparented_window(void) { | |||||
} | |||||
// Since the host is expecting a very specific API we need to make sure it has C linkage (not C++) | |||||
extern "C" { | |||||
/* | |||||
* This is the main entry point to the VST plugin. | |||||
* | |||||
* The host (DAW like Maschine, Ableton Live, Reason, ...) will look for this function with this exact API. | |||||
* | |||||
* It is the equivalent to `int main(int argc, char *argv[])` for a C executable. | |||||
* | |||||
* @param vstHostCallback is a callback so that the plugin can communicate with the host (not used in this small example) | |||||
* @return a pointer to the AEffect structure | |||||
*/ | |||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback); | |||||
// note this looks like this without the type aliases (and is obviously 100% equivalent) | |||||
// extern AEffect *VSTPluginMain(audioMasterCallback audioMaster); | |||||
} | |||||
/* | |||||
* Constant for the version of the plugin. For example 1100 for version 1.1.0.0 | |||||
*/ | |||||
const VstInt32 PLUGIN_VERSION = 1000; | |||||
/** | |||||
* Encapsulates the plugin as a C++ class. It will keep both the host callback and the structure required by the | |||||
* host (VSTPlugin). This class will be stored in the `VSTPlugin.object` field (circular reference) so that it can | |||||
* be accessed when the host calls the plugin back (for example in `processDoubleReplacing`). | |||||
*/ | |||||
class VSTPluginWrapper | |||||
{ | |||||
public: | |||||
VSTPluginWrapper(VSTHostCallback vstHostCallback, | |||||
VstInt32 vendorUniqueID, | |||||
VstInt32 vendorVersion, | |||||
VstInt32 numParams, | |||||
VstInt32 numPrograms, | |||||
VstInt32 numInputs, | |||||
VstInt32 numOutputs); | |||||
~VSTPluginWrapper(); | |||||
inline VSTPlugin *getVSTPlugin() | |||||
{ | |||||
return &_vstPlugin; | |||||
} | |||||
inline VstInt32 getNumInputs() const | |||||
{ | |||||
return _vstPlugin.numInputs; | |||||
} | |||||
inline VstInt32 getNumOutputs() const | |||||
{ | |||||
return _vstPlugin.numOutputs; | |||||
} | |||||
private: | |||||
// the host callback (a function pointer) | |||||
VSTHostCallback _vstHostCallback; | |||||
// the actual structure required by the host | |||||
VSTPlugin _vstPlugin; | |||||
}; | |||||
/******************************************* | |||||
* Callbacks: Host -> Plugin | |||||
* | |||||
* Defined here because they are used in the rest of the code later | |||||
*/ | |||||
/** | |||||
* This is the callback that will be called to process the samples in the case of single precision. This is where the | |||||
* meat of the logic happens! | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||||
* @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||||
* @param sampleFrames the number of samples (second dimension in both arrays) | |||||
*/ | |||||
void VSTPluginProcessSamplesFloat32(VSTPlugin *vstPlugin, float **inputs, float **outputs, VstInt32 sampleFrames) | |||||
{ | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||||
// result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||||
for(int i = 0; i < wrapper->getNumInputs(); i++) | |||||
{ | |||||
auto inputSamples = inputs[i]; | |||||
auto outputSamples = outputs[i]; | |||||
for(int j = 0; j < sampleFrames; j++) | |||||
{ | |||||
outputSamples[j] = inputSamples[j] * 0.5f; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* This is the callback that will be called to process the samples in the case of double precision. This is where the | |||||
* meat of the logic happens! | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||||
* @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||||
* @param sampleFrames the number of samples (second dimension in both arrays) | |||||
*/ | |||||
void VSTPluginProcessSamplesFloat64(VSTPlugin *vstPlugin, double **inputs, double **outputs, VstInt32 sampleFrames) | |||||
{ | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||||
// result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||||
for(int i = 0; i < wrapper->getNumInputs(); i++) | |||||
{ | |||||
auto inputSamples = inputs[i]; | |||||
auto outputSamples = outputs[i]; | |||||
for(int j = 0; j < sampleFrames; j++) | |||||
{ | |||||
outputSamples[j] = inputSamples[j] * 0.5; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* This is the plugin called by the host to communicate with the plugin, mainly to request information (like the | |||||
* vendor string, the plugin category...) or communicate state/changes (like open/close, frame rate...) | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param opCode defined in aeffect.h/AEffectOpcodes and which continues in aeffectx.h/AEffectXOpcodes for a grand | |||||
* total of 79 of them! Only a few of them are implemented in this small plugin. | |||||
* @param index depend on the opcode | |||||
* @param value depend on the opcode | |||||
* @param ptr depend on the opcode | |||||
* @param opt depend on the opcode | |||||
* @return depend on the opcode (0 is ok when you don't implement an opcode...) | |||||
*/ | |||||
VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt) | |||||
{ | |||||
printf("called VSTPluginDispatcher(%d)\n", opCode); | |||||
VstIntPtr v = 0; | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// see aeffect.h/AEffectOpcodes and aeffectx.h/AEffectXOpcodes for details on all of them | |||||
switch(opCode) | |||||
{ | |||||
// request for the category of the plugin: in this case it is an effect since it is modifying the input (as opposed | |||||
// to generating sound) | |||||
case effGetPlugCategory: | |||||
return kPlugCategEffect; | |||||
// called by the host when the plugin was called... time to reclaim memory! | |||||
case effClose: | |||||
delete wrapper; | |||||
break; | |||||
// request for the vendor string (usually used in the UI for plugin grouping) | |||||
case effGetVendorString: | |||||
strncpy(static_cast<char *>(ptr), "testsoft", kVstMaxVendorStrLen); | |||||
v = 1; | |||||
break; | |||||
// request for the version | |||||
case effGetVendorVersion: | |||||
return PLUGIN_VERSION; | |||||
// ignoring all other opcodes | |||||
default: | |||||
printf("Unknown opCode %d [ignored] \n", opCode); | |||||
break; | |||||
} | |||||
return v; | |||||
} | |||||
/** | |||||
* Used for parameter setting (not used by this plugin) | |||||
*/ | |||||
void VSTPluginSetParameter(VSTPlugin *vstPlugin, VstInt32 index, float parameter) | |||||
{ | |||||
printf("called VSTPluginSetParameter(%d, %f)\n", index, parameter); | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
} | |||||
/** | |||||
* Used for parameter (not used by this plugin) | |||||
*/ | |||||
float VSTPluginGetParameter(VSTPlugin *vstPlugin, VstInt32 index) | |||||
{ | |||||
printf("called VSTPluginGetParameter(%d)\n", index); | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
return 0; | |||||
} | |||||
/** | |||||
* Main constructor for our C++ class | |||||
*/ | |||||
VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
VstInt32 vendorUniqueID, | |||||
VstInt32 vendorVersion, | |||||
VstInt32 numParams, | |||||
VstInt32 numPrograms, | |||||
VstInt32 numInputs, | |||||
VstInt32 numOutputs) : | |||||
_vstHostCallback(vstHostCallback) | |||||
{ | |||||
// Make sure that the memory is properly initialized | |||||
memset(&_vstPlugin, 0, sizeof(_vstPlugin)); | |||||
// this field must be set with this constant... | |||||
_vstPlugin.magic = kEffectMagic; | |||||
// storing this object into the VSTPlugin so that it can be retrieved when called back (see callbacks for use) | |||||
_vstPlugin.object = this; | |||||
// specifying that we handle both single and double precision (there are other flags see aeffect.h/VstAEffectFlags) | |||||
_vstPlugin.flags = effFlagsCanReplacing | effFlagsCanDoubleReplacing; | |||||
// initializing the plugin with the various values | |||||
_vstPlugin.uniqueID = vendorUniqueID; | |||||
_vstPlugin.version = vendorVersion; | |||||
_vstPlugin.numParams = numParams; | |||||
_vstPlugin.numPrograms = numPrograms; | |||||
_vstPlugin.numInputs = numInputs; | |||||
_vstPlugin.numOutputs = numOutputs; | |||||
// setting the callbacks to the previously defined functions | |||||
_vstPlugin.dispatcher = VSTPluginDispatcher; | |||||
_vstPlugin.getParameter = VSTPluginGetParameter; | |||||
_vstPlugin.setParameter = VSTPluginSetParameter; | |||||
_vstPlugin.processReplacing = VSTPluginProcessSamplesFloat32; | |||||
_vstPlugin.processDoubleReplacing = VSTPluginProcessSamplesFloat64; | |||||
} | |||||
/** | |||||
* Destructor called when the plugin is closed (see VSTPluginDispatcher with effClose opCode). In this very simply plugin | |||||
* there is nothing to do but in general the memory that gets allocated MUST be freed here otherwise there might be a | |||||
* memory leak which may end up slowing down and/or crashing the host | |||||
*/ | |||||
VSTPluginWrapper::~VSTPluginWrapper() | |||||
{ | |||||
} | |||||
/** | |||||
* Implementation of the main entry point of the plugin | |||||
*/ | |||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) | |||||
{ | |||||
printf("called VSTPluginMain... \n"); | |||||
// simply create our plugin C++ class | |||||
VSTPluginWrapper *plugin = | |||||
new VSTPluginWrapper(vstHostCallback, | |||||
CCONST('u', 's', 'b', 'n'), // registered with Steinberg (http://service.steinberg.de/databases/plugin.nsf/plugIn?openForm) | |||||
PLUGIN_VERSION, // version | |||||
0, // no params | |||||
0, // no programs | |||||
2, // 2 inputs | |||||
2); // 2 outputs | |||||
// return the plugin per the contract of the API | |||||
return plugin->getVSTPlugin(); | |||||
} |
@@ -36,6 +36,7 @@ | |||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
extern void vst2_set_globals (void *_wrapper); | extern void vst2_set_globals (void *_wrapper); | ||||
extern "C" extern void lglw_timer_cbk (lglw_t _lglw); | |||||
namespace rack { | namespace rack { | ||||
@@ -612,7 +613,7 @@ void windowInit() { | |||||
// // glfwMakeContextCurrent(global_ui->window.gWindow); | // // glfwMakeContextCurrent(global_ui->window.gWindow); | ||||
// // glfwSwapInterval(1); | // // glfwSwapInterval(1); | ||||
lglw_glcontext_push(global_ui->window.lglw); | lglw_glcontext_push(global_ui->window.lglw); | ||||
lglw_swap_interval(global_ui->window.lglw, 1); | |||||
lglw_swap_interval(global_ui->window.lglw, 1); // can be overridden via settings.json:"vsync" property | |||||
// // glfwSetInputMode(global_ui->window.gWindow, GLFW_LOCK_KEY_MODS, 1); | // // glfwSetInputMode(global_ui->window.gWindow, GLFW_LOCK_KEY_MODS, 1); | ||||
@@ -621,6 +622,7 @@ void windowInit() { | |||||
lglw_mouse_callback_set(global_ui->window.lglw, &lglw_mouse_cbk); | lglw_mouse_callback_set(global_ui->window.lglw, &lglw_mouse_cbk); | ||||
lglw_focus_callback_set(global_ui->window.lglw, &lglw_focus_cbk); | lglw_focus_callback_set(global_ui->window.lglw, &lglw_focus_cbk); | ||||
lglw_keyboard_callback_set(global_ui->window.lglw, &lglw_keyboard_cbk); | lglw_keyboard_callback_set(global_ui->window.lglw, &lglw_keyboard_cbk); | ||||
lglw_timer_callback_set(global_ui->window.lglw, &lglw_timer_cbk); | |||||
// Call this ourselves, but on every frame instead of only when the mouse moves | // Call this ourselves, but on every frame instead of only when the mouse moves | ||||
// glfwSetCursorPosCallback(gWindow, cursorPosCallback); | // glfwSetCursorPosCallback(gWindow, cursorPosCallback); | ||||
@@ -1,3 +1,10 @@ | |||||
** August 6th, 2018 | |||||
- add settings.json "refreshRate" property | |||||
- <15: use VST host timer | |||||
- >=15: custom refresh rate in Hz | |||||
- add settings.json "vsync" property | |||||
** August 5th, 2018 | ** August 5th, 2018 | ||||
- replace GLFW window / input event handling by LGLW library | - replace GLFW window / input event handling by LGLW library | ||||
=> no more "dummy" windows | => no more "dummy" windows | ||||
@@ -1,4 +1,4 @@ | |||||
VeeSeeVST Rack VST 2.4 Plugin -- August 5th, 2018 | |||||
VeeSeeVST Rack VST 2.4 Plugin -- August 6th, 2018 | |||||
================================================= | ================================================= | ||||
!!!------------------------------------------------------------------------------ | !!!------------------------------------------------------------------------------ | ||||
@@ -1,97 +1,121 @@ | |||||
[0.000 info src/main.cpp:59] VeeSeeVST Rack 0.6.1 | [0.000 info src/main.cpp:59] VeeSeeVST Rack 0.6.1 | ||||
[0.000 info src/main.cpp:62] Global directory: F:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/main.cpp:63] Local directory: F:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/main.cpp:62] Global directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/main.cpp:63] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin Alikins 0.6.1 | [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin Alikins 0.6.1 | ||||
[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AS 0.6.1 | [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AS 0.6.1 | ||||
[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 | [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 | ||||
[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin BaconMusic 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin BaconMusic 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Befaco 0.6.1 | [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Befaco 0.6.1 | ||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bidoo 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bogaudio 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin cf 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin DHE-Modules 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin DrumKit 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin ESeries 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Fundamental 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Gratrix 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin HetrickCV 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin huaba 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin JW-Modules 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin LOGinstruments 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Ohmer 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Qwelk 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin SerialRacker 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin SonusModular 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin SubmarineFree 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Template 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin trowaSoft 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin unless_modules 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 0.6.1 | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist | |||||
[0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist | |||||
[0.003 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from F:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist | |||||
[0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist | |||||
[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist | |||||
[0.005 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll | |||||
[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist | |||||
[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist | |||||
[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist | |||||
[0.005 info src/settings.cpp:194] Loading settings F:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||||
[0.030 info src/window.cpp:973] Loaded font F:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf | |||||
[0.030 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg | |||||
[0.030 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg | |||||
[0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg | |||||
[0.031 info src/settings.cpp:194] Loading settings F:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||||
[0.032 info src/app/RackWidget.cpp:158] Saving patch to string | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bidoo 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bogaudio 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin cf 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin DHE-Modules 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin DrumKit 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin ESeries 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Fundamental 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Gratrix 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin HetrickCV 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin huaba 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin JW-Modules 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin LOGinstruments 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Ohmer 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Qwelk 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin SerialRacker 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin SonusModular 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin SubmarineFree 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Template 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin trowaSoft 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin unless_modules 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 0.6.1 | |||||
[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist | |||||
[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist | |||||
[0.008 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll | |||||
[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist | |||||
[0.013 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll | |||||
[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist | |||||
[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist | |||||
[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist | |||||
[0.014 info src/settings.cpp:211] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||||
[0.030 info src/window.cpp:975] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf | |||||
[0.031 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg | |||||
[0.031 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg | |||||
[0.032 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg | |||||
[0.032 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg | |||||
[0.032 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg | |||||
[0.032 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg | |||||
[0.033 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg | |||||
[0.033 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg | |||||
[0.033 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg | |||||
[0.033 info src/settings.cpp:211] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||||
[0.037 info src/app/RackWidget.cpp:196] Loading patch from string | |||||
[0.039 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg | |||||
[0.039 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg | |||||
[0.040 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg | |||||
[0.040 info src/window.cpp:975] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf | |||||
[0.042 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg | |||||
[0.046 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg | |||||
[0.046 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg | |||||
[0.046 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg | |||||
[0.047 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg | |||||
[0.047 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg | |||||
[0.047 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg | |||||
[0.048 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg | |||||
[0.048 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg | |||||
[0.048 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg | |||||
[0.050 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg | |||||
[0.050 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg | |||||
[0.052 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg | |||||
[0.052 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg | |||||
[0.054 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg | |||||
[0.054 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg | |||||
[0.055 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg | |||||
[0.055 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg | |||||
[0.056 info src/window.cpp:1030] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg | |||||
[7.922 info src/app/RackWidget.cpp:158] Saving patch to string |
@@ -11,6 +11,8 @@ | |||||
"wireOpacity": 50.0, | "wireOpacity": 50.0, | ||||
"wireTension": 0.97, | "wireTension": 0.97, | ||||
"zoom": 1.0, | "zoom": 1.0, | ||||
"refreshRate": 0, | |||||
"vsync": true, | |||||
"allowCursorLock": true, | "allowCursorLock": true, | ||||
"sampleRate": 44100.0, | "sampleRate": 44100.0, | ||||
"lastPath": "", | "lastPath": "", | ||||