diff --git a/README.md b/README.md index 46d81426..9dd9de0f 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Tested in # Downloads 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 ! diff --git a/dep/dep.7z b/dep/dep.7z index 1289fd6d..e40ad5bb 100644 Binary files a/dep/dep.7z and b/dep/dep.7z differ diff --git a/src/settings.cpp b/src/settings.cpp index a505f3b6..266de07f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -10,6 +10,7 @@ extern void vst2_window_size_set (int _width, int _height); +extern void vst2_refresh_rate_set (float _hz); 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); } + // 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 json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); if (allowCursorLockJ) { global_ui->window.gAllowCursorLock = json_is_true(allowCursorLockJ); -// #ifdef USE_VST2 -// global_ui->window.gAllowCursorLock = 0; -// #endif // USE_VST2 } #ifndef USE_VST2 diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index d1a78407..dacdaf91 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -17,7 +17,7 @@ /// /// created: 25Jun2018 /// 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]; + sUI redraw_ival_ms; // 0=use DAW timer (effEditIdle) + public: VSTPluginWrapper(VSTHostCallback vstHostCallback, VstInt32 vendorUniqueID, @@ -508,6 +510,13 @@ public: 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) { printf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); setGlobals(); @@ -517,6 +526,12 @@ public: (editor_rect.right - editor_rect.left), (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; } @@ -525,6 +540,7 @@ public: if(b_editor_open) { setGlobals(); + lglw_timer_stop(rack_global_ui.window.lglw); lglw_window_close(rack_global_ui.window.lglw); 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: // the host callback (a function pointer) VSTHostCallback _vstHostCallback; @@ -1128,25 +1161,16 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, #endif 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; case effEditGetRect: // Query editor window geometry // ptr: ERect* (on Windows) - if(NULL != ptr) // yeah, this should never be NULL + if(NULL != ptr) { // ... *(void**)ptr = (void*) &wrapper->editor_rect; @@ -1295,6 +1319,8 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, editor_rect.top = EDITWIN_Y; editor_rect.right = EDITWIN_X + EDITWIN_W; 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); } +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 diff --git a/src/vst2_test.cpp b/src/vst2_test.cpp new file mode 100644 index 00000000..eb23a19d --- /dev/null +++ b/src/vst2_test.cpp @@ -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 +#include +#include + +#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 +#include + +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 +#include +#include +#include +#include + +//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 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(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(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(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(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(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(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(); +} diff --git a/src/window.cpp b/src/window.cpp index b11bb7f1..14c090f4 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -36,6 +36,7 @@ #include "global_ui.hpp" extern void vst2_set_globals (void *_wrapper); +extern "C" extern void lglw_timer_cbk (lglw_t _lglw); namespace rack { @@ -612,7 +613,7 @@ void windowInit() { // // glfwMakeContextCurrent(global_ui->window.gWindow); // // glfwSwapInterval(1); 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); @@ -621,6 +622,7 @@ void windowInit() { lglw_mouse_callback_set(global_ui->window.lglw, &lglw_mouse_cbk); lglw_focus_callback_set(global_ui->window.lglw, &lglw_focus_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 // glfwSetCursorPosCallback(gWindow, cursorPosCallback); diff --git a/vst2_bin/CHANGELOG_VST.txt b/vst2_bin/CHANGELOG_VST.txt index 91496d73..52cc64cd 100644 --- a/vst2_bin/CHANGELOG_VST.txt +++ b/vst2_bin/CHANGELOG_VST.txt @@ -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 - replace GLFW window / input event handling by LGLW library => no more "dummy" windows diff --git a/vst2_bin/README_vst2.txt b/vst2_bin/README_vst2.txt index cfad53be..79ac930d 100644 --- a/vst2_bin/README_vst2.txt +++ b/vst2_bin/README_vst2.txt @@ -1,4 +1,4 @@ -VeeSeeVST Rack VST 2.4 Plugin -- August 5th, 2018 +VeeSeeVST Rack VST 2.4 Plugin -- August 6th, 2018 ================================================= !!!------------------------------------------------------------------------------ diff --git a/vst2_bin/log.txt b/vst2_bin/log.txt index 8627ec3c..1e403f3c 100644 --- a/vst2_bin/log.txt +++ b/vst2_bin/log.txt @@ -1,97 +1,121 @@ [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 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 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 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 diff --git a/vst2_bin/settings.json b/vst2_bin/settings.json index b23026d0..1b0d8500 100644 --- a/vst2_bin/settings.json +++ b/vst2_bin/settings.json @@ -11,6 +11,8 @@ "wireOpacity": 50.0, "wireTension": 0.97, "zoom": 1.0, + "refreshRate": 0, + "vsync": true, "allowCursorLock": true, "sampleRate": 44100.0, "lastPath": "",