From ad0d90f664c750dcb8a14a8f543480ba77ce2c5d Mon Sep 17 00:00:00 2001 From: bsp2 Date: Sun, 19 Aug 2018 15:14:11 +0200 Subject: [PATCH] add idle-detection (off, wake on MIDI note-on, wake on audio input) --- README.md | 4 +- res/icons/idle_mode_icon_cc.svg | 76 ++++ src/app/ModuleWidget.cpp | 24 +- src/app/RackWidget.cpp | 19 + src/app/Toolbar.cpp | 49 +++ src/settings.cpp | 18 + src/vst2_main.cpp | 468 ++++++++++++++++------- vst2_bin/CHANGELOG_VST.txt | 10 + vst2_bin/README_vst2.txt | 3 +- vst2_bin/log.txt | 222 +++++------ vst2_bin/res/icons/idle_mode_icon_cc.svg | 76 ++++ vst2_bin/settings.json | 2 + 12 files changed, 714 insertions(+), 257 deletions(-) create mode 100644 res/icons/idle_mode_icon_cc.svg create mode 100644 vst2_bin/res/icons/idle_mode_icon_cc.svg diff --git a/README.md b/README.md index 41f220da..eea7590e 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ - there's a [plugin SDK](#dynamically-loaded-plugins-via-plugin-sdk) (for Microsoft Visual Studio 2017 Community Edition) which can be used to build new plugins without checking out this entire GIT repository + supports internal oversampling (up to 16x with configurable quality) - the number of oversampled I/O channels can be limited to save CPU time ++ supports idle-detection + - wake up on MIDI note on or audio input Tested in - Eureka (my own work-in-progress VST host) @@ -30,7 +32,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-18Aug2018.7z](dist/veeseevstrack_0_6_1_win64_bin-18Aug2018.7z) (64bit) +Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-19Aug2018.7z](dist/veeseevstrack_0_6_1_win64_bin-19Aug2018.7z) (64bit) Note: The effect plugin can used be as an instrument, too. You just have to send it MIDI events ! diff --git a/res/icons/idle_mode_icon_cc.svg b/res/icons/idle_mode_icon_cc.svg new file mode 100644 index 00000000..7f09a759 --- /dev/null +++ b/res/icons/idle_mode_icon_cc.svg @@ -0,0 +1,76 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/ModuleWidget.cpp b/src/app/ModuleWidget.cpp index 936b35dd..f9b36746 100644 --- a/src/app/ModuleWidget.cpp +++ b/src/app/ModuleWidget.cpp @@ -17,17 +17,17 @@ namespace rack { ModuleWidget::ModuleWidget(Module *module) { - printf("xxx ModuleWidget::ModuleWidget(module=%p) global=%p\n", module, global); + // printf("xxx ModuleWidget::ModuleWidget(module=%p) global=%p\n", module, global); // printf("xxx ModuleWidget::ModuleWidget: GetCurrentThreadId=%d\n", GetCurrentThreadId()); if (module) { engineAddModule(module); - printf("xxx ModuleWidget::ModuleWidget: engineAddModule OK\n"); + // printf("xxx ModuleWidget::ModuleWidget: engineAddModule OK\n"); } this->module = module; // printf("xxx ModuleWidget::ModuleWidget(): bind GL context global_ui->window.gWindow=%p\n", global_ui->window.gWindow); // glfwMakeContextCurrent(global_ui->window.gWindow); // // glfw_hack_makeContextCurrent(global_ui->window.gWindow); - printf("xxx ModuleWidget::ModuleWidget(): RETURN\n"); + // printf("xxx ModuleWidget::ModuleWidget(): RETURN\n"); } ModuleWidget::~ModuleWidget() { @@ -67,11 +67,11 @@ void ModuleWidget::addParam(ParamWidget *param) { void ModuleWidget::setPanel(std::shared_ptr svg) { // Remove old panel -#ifdef RACK_PLUGIN_SHARED - printf("xxx ModuleWidget::setPanel: 1\n"); -#else - printf("xxx ModuleWidget::setPanel: 1\n"); -#endif +// #ifdef RACK_PLUGIN_SHARED +// printf("xxx ModuleWidget::setPanel: 1\n"); +// #else +// printf("xxx ModuleWidget::setPanel: 1\n"); +// #endif if (panel) { removeChild(panel); delete panel; @@ -155,7 +155,7 @@ void ModuleWidget::fromJson(json_t *rootJ) { double x, y; json_unpack(posJ, "[F, F]", &x, &y); Vec pos = Vec(x, y); - printf("xxx ModuleWidget::fromJson: pos=(%f, %f) posJ=%p rootJ=%p\n", x, y, posJ, rootJ); + // printf("xxx ModuleWidget::fromJson: pos=(%f, %f) posJ=%p rootJ=%p\n", x, y, posJ, rootJ); if (legacy && legacy <= 1) { box.pos = pos; } @@ -444,12 +444,12 @@ struct DeleteMenuItem : MenuItem { }; Menu *ModuleWidget::createContextMenu() { - printf("xxx ModuleWidget::createContextMenu: ENTER\n"); + // printf("xxx ModuleWidget::createContextMenu: ENTER\n"); Menu *menu = global_ui->ui.gScene->createMenu(); MenuLabel *menuLabel = new MenuLabel(); - printf("xxx ModuleWidget::createContextMenu: model->author=\"%s\"\n", model->author.c_str()); - printf("xxx ModuleWidget::createContextMenu: model->name=\"%s\"\n", model->name.c_str()); + // printf("xxx ModuleWidget::createContextMenu: model->author=\"%s\"\n", model->author.c_str()); + // printf("xxx ModuleWidget::createContextMenu: model->name=\"%s\"\n", model->name.c_str()); menuLabel->text = model->author + " " + model->name + " " + model->plugin->version; menu->addChild(menuLabel); diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index e40e35dd..d8291e89 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -20,6 +20,8 @@ extern void vst2_oversample_realtime_set (float _factor, int _quality); extern void vst2_oversample_realtime_get (float *_factor, int *_quality); extern void vst2_oversample_channels_set (int _numIn, int _numOut); extern void vst2_oversample_channels_get (int *_numIn, int *_numOut); +extern void vst2_idle_detect_mode_set (int _mode); +extern void vst2_idle_detect_mode_get (int *_mode); #endif // RACK_HOST #endif // USE_VST2 @@ -295,6 +297,15 @@ json_t *RackWidget::toJson() { json_object_set_new(rootJ, "oversampleNumOut", oversampleJ); } } + + // Idle detection mode + { + int idleDetect; + vst2_idle_detect_mode_get(&idleDetect); + + json_t *idleJ = json_real(idleDetect); + json_object_set_new(rootJ, "idleDetect", idleJ); + } #endif // RACK_HOST #endif // USE_VST2 @@ -414,6 +425,14 @@ void RackWidget::fromJson(json_t *rootJ) { } vst2_oversample_channels_set(oversampleNumIn, oversampleNumOut); + + // Idle detection mode + { + json_t *idleJ = json_object_get(rootJ, "idleDetect"); + if (idleJ) { + vst2_idle_detect_mode_set(int(json_number_value(idleJ))); + } + } #endif // RACK_HOST // modules diff --git a/src/app/Toolbar.cpp b/src/app/Toolbar.cpp index abee9062..ff43d2c3 100644 --- a/src/app/Toolbar.cpp +++ b/src/app/Toolbar.cpp @@ -12,6 +12,8 @@ extern void vst2_oversample_realtime_set (float _factor, int _quality); extern void vst2_oversample_realtime_get (float *_factor, int *_quality); extern void vst2_oversample_channels_set (int _numIn, int _numOut); extern void vst2_oversample_channels_get (int *_numIn, int *_numOut); +extern void vst2_idle_detect_mode_set (int _mode); +extern void vst2_idle_detect_mode_get (int *_mode); #endif // RACK_HOST namespace rack { @@ -197,6 +199,14 @@ struct OversampleChannelItem : MenuItem { global->gPaused = false; } }; + +struct IdleModeItem : MenuItem { + int idle_mode; + + void onAction(EventAction &e) override { + vst2_idle_detect_mode_set(idle_mode); + } +}; #endif // RACK_HOST @@ -272,6 +282,44 @@ struct RackLockButton : TooltipIconButton { } }; +struct IdleModeButton : TooltipIconButton { + IdleModeButton() { + setSVG(SVG::load(assetGlobal("res/icons/idle_mode_icon_cc.svg"))); + tooltipText = "Idle Mode"; + } + void onAction(EventAction &e) override { +#ifdef RACK_HOST + Menu *menu = global_ui->ui.gScene->createMenu(); + menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y)); + menu->box.size.x = box.size.x; + + menu->addChild(MenuLabel::create("Idle Mode")); + + int idleMode; vst2_idle_detect_mode_get(&idleMode); + + IdleModeItem *item; + + item = new IdleModeItem(); + item->text = "Always Active"; + item->rightText = CHECKMARK(0/*IDLE_DETECT_NONE*/ == idleMode); + item->idle_mode = 0; + menu->addChild(item); + + item = new IdleModeItem(); + item->text = "Wake on MIDI Note-On"; + item->rightText = CHECKMARK(1/*IDLE_DETECT_MIDI*/ == idleMode); + item->idle_mode = 1; + menu->addChild(item); + + item = new IdleModeItem(); + item->text = "Wake on Audio Input"; + item->rightText = CHECKMARK(2/*IDLE_DETECT_AUDIO*/ == idleMode); + item->idle_mode = 2; + menu->addChild(item); +#endif // RACK_HOST + } +}; + struct ZoomSlider : Slider { void onAction(EventAction &e) override { Slider::onAction(e); @@ -298,6 +346,7 @@ Toolbar::Toolbar() { layout->addChild(new SampleRateButton()); layout->addChild(new PowerMeterButton()); layout->addChild(new RackLockButton()); + layout->addChild(new IdleModeButton()); wireOpacitySlider = new Slider(); wireOpacitySlider->box.size.x = 150; diff --git a/src/settings.cpp b/src/settings.cpp index fd0e20bb..802147bb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -17,6 +17,8 @@ extern void vst2_oversample_realtime_set (float _factor, int _quality); extern void vst2_oversample_offline_set (float _factor, int _quality); extern void vst2_oversample_offline_check_set (int _bEnable); extern void vst2_oversample_channels_set (int _numIn, int _numOut); +extern void vst2_idle_detect_mode_fx_set (int _mode); +extern void vst2_idle_detect_mode_instr_set (int _mode); #endif // RACK_HOST namespace rack { @@ -274,6 +276,22 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { } vst2_oversample_channels_set(oversampleNumIn, oversampleNumOut); + + // Idle detection mode (instrument build) + { + json_t *idleJ = json_object_get(rootJ, "idleDetectInstr"); + if (idleJ) { + vst2_idle_detect_mode_instr_set(int(json_number_value(idleJ))); + } + } + + // Idle detection mode (FX build) + { + json_t *idleJ = json_object_get(rootJ, "idleDetectFx"); + if (idleJ) { + vst2_idle_detect_mode_fx_set(int(json_number_value(idleJ))); + } + } #endif // RACK_HOST // lastPath diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index 325a93a3..8efe845f 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -18,7 +18,7 @@ /// created: 25Jun2018 /// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 /// 26Jul2018, 04Aug2018, 05Aug2018, 06Aug2018, 07Aug2018, 09Aug2018, 11Aug2018 -/// 18Aug2018 +/// 18Aug2018, 19Aug2018 /// /// @@ -33,6 +33,12 @@ #undef RACK_HOST +#define Dprintf if(0);else printf +// #define Dprintf if(1);else printf + +// #define Dprintf_idle if(0);else printf +#define Dprintf_idle if(1);else printf + #include #include #include @@ -52,6 +58,17 @@ YAC_Host *yac_host; // not actually used, just to satisfy the linker #define Dfltequal(a, b) ( (((a)-(b)) < 0.0f) ? (((a)-(b)) > -0.0001f) : (((a)-(b)) < 0.0001f) ) +typedef union cmemptr_u { + const sUI *u32; + const sF32 *f32; + const void *any; +} cmemptr_t; + +typedef union mem_u { + sUI u32; + sF32 f32; +} mem_t; + extern int vst2_init (int argc, char* argv[]); extern void vst2_exit (void); namespace rack { @@ -395,6 +412,10 @@ public: static const uint32_t MAX_BLOCK_SIZE = 16384u; static const uint32_t MAX_OVERSAMPLE_FACTOR = 16u; + static const uint32_t IDLE_DETECT_NONE = 0u; // always active + static const uint32_t IDLE_DETECT_MIDI = 1u; // become idle when output is silence, reactivate when there's MIDI input activity + static const uint32_t IDLE_DETECT_AUDIO = 2u; // become idle when output is silence, reactivate when there's audio input activity + public: rack::Global rack_global; rack::GlobalUI rack_global_ui; @@ -419,8 +440,10 @@ public: sF32 out_buffers[NUM_OUTPUTS * MAX_BLOCK_SIZE]; } oversample; -protected: +public: float sample_rate; // e.g. 44100.0 + +protected: uint32_t block_size; // e.g. 64 PluginMutex mtx_audio; @@ -434,6 +457,13 @@ public: bool b_offline; // true=offline rendering (HQ) bool b_check_offline; // true=ask host if it's in offline rendering mode + sUI idle_detect_mode; + sF32 idle_input_level_threshold; + sF32 idle_output_level_threshold; + sF32 idle_output_sec_threshold; + sUI idle_output_framecount; + bool b_idle; + ERect editor_rect; sBool b_editor_open; @@ -469,11 +499,11 @@ public: sSI openEffect(void) { - printf("xxx vstrack_plugin::openEffect\n"); + Dprintf("xxx vstrack_plugin::openEffect\n"); // (todo) use mutex instance_id = instance_count; - printf("xxx vstrack_plugin::openEffect: instance_id=%d\n", instance_id); + Dprintf("xxx vstrack_plugin::openEffect: instance_id=%d\n", instance_id); rack_global.vst2.wrapper = this; @@ -497,23 +527,23 @@ public: dllname.visit(dllnameraw); dllname.getDirName(&cwd); rack::global->vst2.program_dir = (const char*)cwd.chars; - printf("xxx vstrack_plugin::openEffect: cd to \"%s\"\n", (const char*)cwd.chars); + Dprintf("xxx vstrack_plugin::openEffect: cd to \"%s\"\n", (const char*)cwd.chars); // // ::SetCurrentDirectory("f:/vst_64bit/vstrack_plugin"); ::SetCurrentDirectory((const char*)cwd.chars); - printf("xxx vstrack_plugin::openEffect: cwd change done\n"); + Dprintf("xxx vstrack_plugin::openEffect: cwd change done\n"); // cwd.replace('\\', '/'); int argc = 1; char *argv[1]; //argv[0] = (char*)cwd.chars; argv[0] = (char*)dllnameraw; - printf("xxx vstrack_plugin::openEffect: dllname=\"%s\"\n", argv[0]); + Dprintf("xxx vstrack_plugin::openEffect: dllname=\"%s\"\n", argv[0]); (void)vst2_init(argc, argv); - printf("xxx vstrack_plugin::openEffect: vst2_init() done\n"); + Dprintf("xxx vstrack_plugin::openEffect: vst2_init() done\n"); vst2_set_shared_plugin_tls_globals(); - printf("xxx vstrack_plugin::openEffect: restore cwd=\"%s\"\n", oldCWD); + Dprintf("xxx vstrack_plugin::openEffect: restore cwd=\"%s\"\n", oldCWD); ::SetCurrentDirectory(oldCWD); setSampleRate(sample_rate); @@ -521,7 +551,7 @@ public: b_open = true; b_editor_open = false; - printf("xxx vstrack_plugin::openEffect: LEAVE\n"); + Dprintf("xxx vstrack_plugin::openEffect: LEAVE\n"); return 1; } @@ -557,7 +587,7 @@ public: } void openEditor(void *_hwnd) { - printf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); + Dprintf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); setGlobals(); (void)lglw_window_open(rack_global_ui.window.lglw, _hwnd, @@ -575,7 +605,7 @@ public: } void closeEditor(void) { - printf("xxx vstrack_plugin: closeEditor() b_editor_open=%d\n", b_editor_open); + Dprintf("xxx vstrack_plugin: closeEditor() b_editor_open=%d\n", b_editor_open); if(b_editor_open) { setGlobals(); @@ -590,14 +620,14 @@ public: closeEditor(); // (todo) use mutex - printf("xxx vstrack_plugin::closeEffect: last_program_chunk_str=%p\n", last_program_chunk_str); + Dprintf("xxx vstrack_plugin::closeEffect: last_program_chunk_str=%p\n", last_program_chunk_str); if(NULL != last_program_chunk_str) { ::free(last_program_chunk_str); last_program_chunk_str = NULL; } - printf("xxx vstrack_plugin::closeEffect: b_open=%d\n", b_open); + Dprintf("xxx vstrack_plugin::closeEffect: b_open=%d\n", b_open); if(b_open) { @@ -606,15 +636,15 @@ public: setGlobals(); rack::global->vst2.last_seen_instance_count = instance_count; - printf("xxx vstrack_plugin: call vst2_exit()\n"); + Dprintf("xxx vstrack_plugin: call vst2_exit()\n"); vst2_exit(); - printf("xxx vstrack_plugin: vst2_exit() done\n"); + Dprintf("xxx vstrack_plugin: vst2_exit() done\n"); destroyResamplerStates(); - printf("xxx vstrack_plugin: destroyResamplerStates() done\n"); + Dprintf("xxx vstrack_plugin: destroyResamplerStates() done\n"); #ifdef USE_CONSOLE // FreeConsole(); @@ -758,7 +788,7 @@ public: &err ); - printf("xxx vstrack_plugin: initialize speex resampler (rate=%f factor=%f quality=%d)\n", sample_rate, oversample.factor, oversample.quality); + Dprintf("xxx vstrack_plugin: initialize speex resampler (rate=%f factor=%f quality=%d)\n", sample_rate, oversample.factor, oversample.quality); } if(_bLock) @@ -807,7 +837,7 @@ public: static int i = 0; if(0 == (++i & 127)) { - printf("xxx vstrack_plugin: audioMasterGetCurrentProcessLevel: level=%d\n", level); + Dprintf("xxx vstrack_plugin: audioMasterGetCurrentProcessLevel: level=%d\n", level); } } #endif @@ -819,16 +849,16 @@ public: if(bOffline) { - printf("xxx vstrack_plugin: enter OFFLINE mode. factor=%f quality=%d\n", oversample.offline_factor, oversample.offline_quality); + Dprintf("xxx vstrack_plugin: enter OFFLINE mode. factor=%f quality=%d\n", oversample.offline_factor, oversample.offline_quality); setOversample(oversample.offline_factor, oversample.offline_quality, false/*bLock*/); } else { - printf("xxx vstrack_plugin: enter REALTIME mode. factor=%f quality=%d\n", oversample.realtime_factor, oversample.realtime_quality); + Dprintf("xxx vstrack_plugin: enter REALTIME mode. factor=%f quality=%d\n", oversample.realtime_factor, oversample.realtime_quality); setOversample(oversample.realtime_factor, oversample.realtime_quality, false/*bLock*/); } - printf("xxx vstrack_plugin: mode changed to %d\n", int(bOffline)); + Dprintf("xxx vstrack_plugin: mode changed to %d\n", int(bOffline)); } } } @@ -838,6 +868,26 @@ public: return 0; } + void setIdleDetectMode(uint32_t _mode) { + switch(_mode) + { + default: + case IDLE_DETECT_NONE: + idle_detect_mode = IDLE_DETECT_NONE; + break; + + case IDLE_DETECT_MIDI: + idle_detect_mode = IDLE_DETECT_MIDI; + break; + + case IDLE_DETECT_AUDIO: + idle_detect_mode = IDLE_DETECT_AUDIO; + break; + } + b_idle = false; + idle_output_framecount = 0u; + } + sUI getProgramChunk(uint8_t**_addr) { setGlobals(); if(NULL != last_program_chunk_str) @@ -862,13 +912,13 @@ public: setGlobals(); lockAudio(); #if 0 - printf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); + Dprintf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); #endif lglw_glcontext_push(rack::global_ui->window.lglw); bool r = rack::global_ui->app.gRackWidget->loadPatchFromString((const char*)_addr); rack::global_ui->ui.gScene->step(); // w/o this the patch is bypassed lglw_glcontext_pop(rack::global_ui->window.lglw); - printf("xxx vstrack_plugin:setProgramChunk: r=%d\n", r); + Dprintf("xxx vstrack_plugin:setProgramChunk: r=%d\n", r); unlockAudio(); return r; } @@ -1012,7 +1062,7 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, // 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); - // printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: ENTER\n"); + // Dprintf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: ENTER\n"); wrapper->lockAudio(); wrapper->setGlobals(); @@ -1029,9 +1079,9 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, rack::global->vst2.last_seen_num_frames = sUI(sampleFrames); vst2_handle_queued_params(); - //printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: lockAudio done\n"); + //Dprintf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: lockAudio done\n"); - //printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: wrapper=%p\n", wrapper); + //Dprintf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: wrapper=%p\n", wrapper); #ifdef HAVE_WINDOWS _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); @@ -1039,135 +1089,247 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, sUI chIdx; - if( !Dfltequal(wrapper->oversample.factor, 1.0f) && - (NULL != wrapper->oversample.srs_in) && - (NULL != wrapper->oversample.srs_out) - ) + if(wrapper->b_idle) { - sF32 *inputs[NUM_INPUTS]; - sF32 *outputs[NUM_INPUTS]; - - sUI hostNumFrames = sampleFrames; - sUI overNumFrames = sUI((sampleFrames * wrapper->oversample.factor) + 0.5f); - - // Up-sample inputs + switch(wrapper->idle_detect_mode) { - sUI inNumFrames = hostNumFrames; - sUI outNumFrames = overNumFrames; + default: + case VSTPluginWrapper::IDLE_DETECT_NONE: + // should not be reachable + wrapper->b_idle = false; + break; - sF32 *d = wrapper->oversample.in_buffers; + case VSTPluginWrapper::IDLE_DETECT_MIDI: + break; - for(chIdx = 0u; chIdx < NUM_INPUTS; chIdx++) + case VSTPluginWrapper::IDLE_DETECT_AUDIO: + { + wrapper->b_idle = true; + + for(chIdx = 0u; chIdx < NUM_INPUTS; chIdx++) + { + if(chIdx < wrapper->oversample.num_in) + { + cmemptr_t s; + s.f32 = _inputs[chIdx]; + sF32 sum = 0.0f; + + for(sUI i = 0u; i < sUI(sampleFrames); i++) + { + mem_t m; + m.u32 = s.u32[i] & ~0x80000000u; // abs + sum += m.f32; + // sum += (s.f32[i] * s.f32[i]); // RMS + } + + sum = (sum / float(sampleFrames)); + // sum = sqrtf(sum / float(sampleFrames)); // RMS + + if(sum >= wrapper->idle_input_level_threshold) + { + wrapper->b_idle = false; + Dprintf_idle("xxx vstrack_plugin: become active after input (sum=%f, threshold=%f)\n", sum, wrapper->idle_input_level_threshold); + wrapper->idle_output_framecount = 0u; + break; + } + } + } + } + break; + } // switch idle_detect_mode + } // if idle + + if(!wrapper->b_idle) + { + if( !Dfltequal(wrapper->oversample.factor, 1.0f) && + (NULL != wrapper->oversample.srs_in) && + (NULL != wrapper->oversample.srs_out) + ) + { + sF32 *inputs[NUM_INPUTS]; + sF32 *outputs[NUM_INPUTS]; + + sUI hostNumFrames = sampleFrames; + sUI overNumFrames = sUI((sampleFrames * wrapper->oversample.factor) + 0.5f); + + // Up-sample inputs { - if(chIdx < wrapper->oversample.num_in) + sUI inNumFrames = hostNumFrames; + sUI outNumFrames = overNumFrames; + + sF32 *d = wrapper->oversample.in_buffers; + + for(chIdx = 0u; chIdx < NUM_INPUTS; chIdx++) { - sF32 *s = _inputs[chIdx]; - - int err = speex_resampler_process_float(wrapper->oversample.srs_in, - chIdx, - s, - &inNumFrames, - d, - &outNumFrames - ); + if(chIdx < wrapper->oversample.num_in) + { + sF32 *s = _inputs[chIdx]; + + int err = speex_resampler_process_float(wrapper->oversample.srs_in, + chIdx, + s, + &inNumFrames, + d, + &outNumFrames + ); + } + else + { + // Skip channel + ::memset(d, 0, sizeof(sF32) * outNumFrames); + } + + inputs[chIdx] = d; + + // Next input channel + d += outNumFrames; } - else + } + + // Clear output buffers + // (note) AudioInterface instances accumulate samples in the output buffer + { + sF32 *d = wrapper->oversample.out_buffers; + ::memset((void*)d, 0, (sizeof(sF32) * wrapper->oversample.num_out * overNumFrames)); + + for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) { - // Skip channel - ::memset(d, 0, sizeof(sF32) * outNumFrames); + outputs[chIdx] = d; + d += overNumFrames; } + } + + // Process rack modules + if(wrapper->b_processing) + { + vst2_engine_process(inputs, outputs, overNumFrames); + } + + // Down-sample outputs + { + sF32 *s = wrapper->oversample.out_buffers; - inputs[chIdx] = d; + sUI inNumFrames = overNumFrames; + sUI outNumFrames = hostNumFrames; - // Next input channel - d += outNumFrames; + for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) + { + sF32 *d = _outputs[chIdx]; + + if(chIdx < wrapper->oversample.num_out) + { + int err = speex_resampler_process_float(wrapper->oversample.srs_out, + chIdx, + s, + &inNumFrames, + d, + &outNumFrames + ); + + // Next output channel + s += inNumFrames; + } + else + { + // Skip output + ::memset((void*)d, 0, sizeof(sF32) * outNumFrames); + } + } } } - - // Clear output buffers - // (note) AudioInterface instances accumulate samples in the output buffer + else { - sF32 *d = wrapper->oversample.out_buffers; - ::memset((void*)d, 0, (sizeof(sF32) * wrapper->oversample.num_out * overNumFrames)); + // No oversampling + // (note) Cubase (tested with 9.5.30) uses the same buffer(s) for both input&output + // => back up the inputs before clearing the outputs + sF32 *inputs[NUM_INPUTS]; + sUI k = 0u; + for(chIdx = 0u; chIdx < NUM_INPUTS; chIdx++) + { + inputs[chIdx] = &wrapper->tmp_input_buffers[k]; + ::memcpy((void*)inputs[chIdx], _inputs[chIdx], sizeof(sF32)*sampleFrames); + k += sampleFrames; + } + + // Clear output buffers + // (note) AudioInterface instances accumulate samples in the output buffer for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) { - outputs[chIdx] = d; - d += overNumFrames; + ::memset((void*)_outputs[chIdx], 0, sizeof(sF32)*sampleFrames); } - } - // Process rack modules - if(wrapper->b_processing) - { - vst2_engine_process(inputs, outputs, overNumFrames); + if(wrapper->b_processing) + { + vst2_engine_process(inputs, _outputs, sampleFrames); + } } - // Down-sample outputs + if(VSTPluginWrapper::IDLE_DETECT_NONE != wrapper->idle_detect_mode) { - sF32 *s = wrapper->oversample.out_buffers; - - sUI inNumFrames = overNumFrames; - sUI outNumFrames = hostNumFrames; + bool bSilence = true; for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) - { - sF32 *d = _outputs[chIdx]; - + { if(chIdx < wrapper->oversample.num_out) { - int err = speex_resampler_process_float(wrapper->oversample.srs_out, - chIdx, - s, - &inNumFrames, - d, - &outNumFrames - ); - - // Next output channel - s += inNumFrames; + cmemptr_t d; + d.f32 = _outputs[chIdx]; + sF32 sum = 0.0f; + + for(sUI i = 0u; i < sUI(sampleFrames); i++) + { + mem_t m; + m.u32 = d.u32[i] & ~0x80000000u; // abs + sum += m.f32; + // sum += d.f32[i] * d.f32[i]; // RMS + } + + sum = (sum / float(sampleFrames)); + // sum = sqrtf(sum / float(sampleFrames)); // RMS + + { + static int x = 0; + if(0 == (++x & 127)) + Dprintf_idle("xxx vstrack_plugin: output avg is %f\n", sum); + } + + if(sum >= wrapper->idle_output_level_threshold) + { + bSilence = false; + break; + } } - else + } + + if(bSilence) + { + wrapper->idle_output_framecount += sampleFrames; + + if(wrapper->idle_output_framecount >= sUI(wrapper->idle_output_sec_threshold * wrapper->sample_rate)) { - // Skip output - ::memset((void*)d, 0, sizeof(sF32) * outNumFrames); + // Frame threshold exceeded, become idle + wrapper->b_idle = true; + Dprintf_idle("xxx vstrack_plugin: now idle\n"); } } + } - } + } // if !wrapper->b_idle else { - // No oversampling - - // (note) Cubase (tested with 9.5.30) uses the same buffer(s) for both input&output - // => back up the inputs before clearing the outputs - sF32 *inputs[NUM_INPUTS]; - sUI k = 0u; - for(chIdx = 0u; chIdx < NUM_INPUTS; chIdx++) - { - inputs[chIdx] = &wrapper->tmp_input_buffers[k]; - ::memcpy((void*)inputs[chIdx], _inputs[chIdx], sizeof(sF32)*sampleFrames); - k += sampleFrames; - } - - // Clear output buffers - // (note) AudioInterface instances accumulate samples in the output buffer + // Idle, clear output buffers for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) { ::memset((void*)_outputs[chIdx], 0, sizeof(sF32)*sampleFrames); } - - if(wrapper->b_processing) - { - vst2_engine_process(inputs, _outputs, sampleFrames); - } } // // rack::global->engine.vipMutex.unlock(); rack::global->engine.mutex.unlock(); wrapper->unlockAudio(); - //printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: LEAVE\n"); + //Dprintf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: LEAVE\n"); } @@ -1192,7 +1354,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, void *ptr, float opt ) { - // printf("vstrack_plugin: called VSTPluginDispatcher(%d)\n", opCode); + // Dprintf("vstrack_plugin: called VSTPluginDispatcher(%d)\n", opCode); VstIntPtr r = 0; @@ -1214,7 +1376,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, case effOpen: // called by the host after it has obtained the effect instance (but _not_ during plugin scans) // (note) any heavy-lifting init code should go here - ::printf("vstrack_plugin: effOpen\n"); + Dprintf("vstrack_plugin: effOpen\n"); r = wrapper->openEffect(); break; @@ -1332,6 +1494,8 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, r = 1; else if(!strcmp((char*)ptr, "receiveVstMidiEvent")) // (note) required by Jeskola Buzz r = 1; + else if(!strcmp((char*)ptr, "noRealTime")) + r = 1; else r = 0; break; @@ -1384,7 +1548,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, // value: 0 // ptr: buffer address // r: buffer size - printf("xxx vstrack_plugin: effGetChunk index=%d ptr=%p\n", index, ptr); + Dprintf("xxx vstrack_plugin: effGetChunk index=%d ptr=%p\n", index, ptr); // // if(0 == index) // // { // // r = wrapper->getBankChunk((uint8_t**)ptr); @@ -1400,7 +1564,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, // value: buffer size // ptr: buffer address // r: 1 - printf("xxx vstrack_plugin: effSetChunk index=%d size=%lld ptr=%p\n", index, value, ptr); + Dprintf("xxx vstrack_plugin: effSetChunk index=%d size=%lld ptr=%p\n", index, value, ptr); // // if(0 == index) // // { // // r = wrapper->setBankChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; @@ -1439,7 +1603,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, // ptr: VstEvents* { VstEvents *events = (VstEvents*)ptr; - // printf("vstrack_plugin:effProcessEvents: recvd %d events", events->numEvents); + // Dprintf("vstrack_plugin:effProcessEvents: recvd %d events", events->numEvents); VstEvent**evAddr = &events->events[0]; if(events->numEvents > 0) @@ -1454,8 +1618,8 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, if(NULL != ev) // paranoia { #ifdef DEBUG_PRINT_EVENTS - printf("vstrack_plugin:effProcessEvents: ev[%u].byteSize = %u\n", evIdx, uint32_t(ev->byteSize)); // sizeof(VstMidiEvent) = 32 - printf("vstrack_plugin:effProcessEvents: ev[%u].deltaFrames = %u\n", evIdx, uint32_t(ev->deltaFrames)); + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].byteSize = %u\n", evIdx, uint32_t(ev->byteSize)); // sizeof(VstMidiEvent) = 32 + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].deltaFrames = %u\n", evIdx, uint32_t(ev->deltaFrames)); #endif // DEBUG_PRINT_EVENTS switch(ev->type) @@ -1474,16 +1638,29 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, { VstMidiEvent *mev = (VstMidiEvent *)ev; #ifdef DEBUG_PRINT_EVENTS - printf("vstrack_plugin:effProcessEvents: ev[%u].noteLength = %u\n", evIdx, uint32_t(mev->noteLength)); // #frames - printf("vstrack_plugin:effProcessEvents: ev[%u].noteOffset = %u\n", evIdx, uint32_t(mev->noteOffset)); // #frames - printf("vstrack_plugin:effProcessEvents: ev[%u].midiData = %02x %02x %02x %02x\n", evIdx, uint8_t(mev->midiData[0]), uint8_t(mev->midiData[1]), uint8_t(mev->midiData[2]), uint8_t(mev->midiData[3])); - printf("vstrack_plugin:effProcessEvents: ev[%u].detune = %d\n", evIdx, mev->detune); // -64..63 - printf("vstrack_plugin:effProcessEvents: ev[%u].noteOffVelocity = %d\n", evIdx, mev->noteOffVelocity); // 0..127 + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].noteLength = %u\n", evIdx, uint32_t(mev->noteLength)); // #frames + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].noteOffset = %u\n", evIdx, uint32_t(mev->noteOffset)); // #frames + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].midiData = %02x %02x %02x %02x\n", evIdx, uint8_t(mev->midiData[0]), uint8_t(mev->midiData[1]), uint8_t(mev->midiData[2]), uint8_t(mev->midiData[3])); + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].detune = %d\n", evIdx, mev->detune); // -64..63 + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].noteOffVelocity = %d\n", evIdx, mev->noteOffVelocity); // 0..127 #endif // DEBUG_PRINT_EVENTS vst2_process_midi_input_event(mev->midiData[0], mev->midiData[1], mev->midiData[2] ); + + if((VSTPluginWrapper::IDLE_DETECT_MIDI == wrapper->idle_detect_mode) && wrapper->b_idle) + { + if(0x90u == (mev->midiData[0] & 0xF0u)) // Note on ? + { + wrapper->lockAudio(); + wrapper->b_idle = false; + wrapper->idle_output_framecount = 0u; + wrapper->unlockAudio(); + Dprintf_idle("xxx vstrack_plugin: become active after MIDI note on\n"); + } + } + } break; @@ -1491,8 +1668,8 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, { VstMidiSysexEvent *xev = (VstMidiSysexEvent*)ev; #ifdef DEBUG_PRINT_EVENTS - printf("vstrack_plugin:effProcessEvents: ev[%u].dumpBytes = %u\n", evIdx, uint32_t(xev->dumpBytes)); // size - printf("vstrack_plugin:effProcessEvents: ev[%u].sysexDump = %p\n", evIdx, xev->sysexDump); // buffer addr + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].dumpBytes = %u\n", evIdx, uint32_t(xev->dumpBytes)); // size + Dprintf("vstrack_plugin:effProcessEvents: ev[%u].sysexDump = %p\n", evIdx, xev->sysexDump); // buffer addr #endif // DEBUG_PRINT_EVENTS // (note) don't forget to use a mutex (lockAudio(), unlockAudio()) when modifying the audio processor state! @@ -1563,7 +1740,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, case effEditKeyDown: // [index]: ASCII character [value]: virtual key [opt]: modifiers [return value]: 1 if key used @see AEffEditor::onKeyDown // (note) only used for touch input - // printf("xxx effEditKeyDown: ascii=%d (\'%c\') vkey=0x%08x mod=0x%08x\n", index, index, value, opt); + // Dprintf("xxx effEditKeyDown: ascii=%d (\'%c\') vkey=0x%08x mod=0x%08x\n", index, index, value, opt); if(rack::b_touchkeyboard_enable) { wrapper->setGlobals(); @@ -1617,7 +1794,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, default: // ignoring all other opcodes - printf("vstrack_plugin:dispatcher: unhandled opCode %d [ignored] \n", opCode); + Dprintf("vstrack_plugin:dispatcher: unhandled opCode %d [ignored] \n", opCode); break; } @@ -1634,7 +1811,7 @@ void VSTPluginSetParameter(VSTPlugin *vstPlugin, float parameter ) { #ifdef DEBUG_PRINT_PARAMS - printf("vstrack_plugin: called VSTPluginSetParameter(%d, %f)\n", index, parameter); + Dprintf("vstrack_plugin: called VSTPluginSetParameter(%d, %f)\n", index, parameter); #endif // DEBUG_PRINT_PARAMS // we can get a hold to our C++ class since we stored it in the `object` field (see constructor) @@ -1654,7 +1831,7 @@ float VSTPluginGetParameter(VSTPlugin *vstPlugin, VstInt32 index ) { #ifdef DEBUG_PRINT_PARAMS - printf("vstrack_plugin: called VSTPluginGetParameter(%d)\n", index); + Dprintf("vstrack_plugin: called VSTPluginGetParameter(%d)\n", index); #endif // DEBUG_PRINT_PARAMS // 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); @@ -1736,6 +1913,13 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, b_offline = false; b_check_offline = false; + idle_detect_mode = IDLE_DETECT_NONE; + b_idle = false; + idle_input_level_threshold = 0.00018f;//0.00007f; + idle_output_level_threshold = 0.00018f;//0.00003f; + idle_output_sec_threshold = 50.0f / 1000.0f; // idle after 50ms of silence + idle_output_framecount = 0u; + last_program_chunk_str = NULL; b_open = false; @@ -1832,12 +2016,32 @@ void vst2_oversample_channels_get(int *_numIn, int *_numOut) { *_numOut = int(rack::global->vst2.wrapper->oversample.num_out); } +void vst2_idle_detect_mode_fx_set(int _mode) { +#ifdef VST2_EFFECT + rack::global->vst2.wrapper->setIdleDetectMode(uint32_t(_mode)); +#endif // VST2_EFFECT +} + +void vst2_idle_detect_mode_instr_set(int _mode) { +#ifndef VST2_EFFECT + rack::global->vst2.wrapper->setIdleDetectMode(uint32_t(_mode)); +#endif // VST2_EFFECT +} + +void vst2_idle_detect_mode_set(int _mode) { + rack::global->vst2.wrapper->setIdleDetectMode(uint32_t(_mode)); +} + +void vst2_idle_detect_mode_get(int *_mode) { + *_mode = int(rack::global->vst2.wrapper->idle_detect_mode); +} + /** * Implementation of the main entry point of the plugin */ VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) { - printf("vstrack_plugin: called VSTPluginMain... \n"); + Dprintf("vstrack_plugin: called VSTPluginMain... \n"); #if 0 if(!vstHostCallback(0, audioMasterVersion, 0, 0, 0, 0)) diff --git a/vst2_bin/CHANGELOG_VST.txt b/vst2_bin/CHANGELOG_VST.txt index abe5203b..07439b86 100644 --- a/vst2_bin/CHANGELOG_VST.txt +++ b/vst2_bin/CHANGELOG_VST.txt @@ -1,3 +1,13 @@ +** August 19th, 2018 +- add idle detection support + - default detection settings are configured in settings.json ("idleDetectInstr", "idleDetectFx") + - modes: + - "Always Active" (0): Disables idle detection + - "Wake on MIDI Note-On" (1): Detect idle output, wake up when MIDI note-on is received + - "Wake on Audio Input" (2): Detect idle output, wake up when audio input level exceeds silence threshold + - idle mode is also (re-)stored per patch + + ** August 18th, 2018 - lglw: add clipboard support (TextField) - fix Fundamental.VCA-2 layout diff --git a/vst2_bin/README_vst2.txt b/vst2_bin/README_vst2.txt index 48daf9f1..d3171f33 100644 --- a/vst2_bin/README_vst2.txt +++ b/vst2_bin/README_vst2.txt @@ -1,4 +1,4 @@ -VeeSeeVST Rack VST 2.4 Plugin -- August 18th, 2018 +VeeSeeVST Rack VST 2.4 Plugin -- August 19th, 2018 ================================================== !!!------------------------------------------------------------------------------ @@ -17,6 +17,7 @@ This is a quick'n'dirty adaption of VCV Rack 0.6.1 for the VST2 format. + supports VST host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) + supports VST parameters (send / recv) + supports internal resampling (up to 16x with configurable quality) ++ supports idle-detection (+wake up on MIDI note on or audio input) Here's a demo video of it: https://vimeo.com/277703414 diff --git a/vst2_bin/log.txt b/vst2_bin/log.txt index cc420663..69365200 100644 --- a/vst2_bin/log.txt +++ b/vst2_bin/log.txt @@ -1,6 +1,6 @@ [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:686] vcvrack: Loaded static plugin 21kHz 0.6.1 [0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin Alikins 0.6.1 [0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin alto777_LFSR 0.6.1 @@ -8,17 +8,17 @@ [0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 [0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin Autodafe 0.6.1 [0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin BaconMusic 0.6.1 -[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin Befaco 0.6.1 +[0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin Befaco 0.6.1 [0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin Bidoo 0.6.1 [0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin Bogaudio 0.6.1 [0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin CastleRocktronics 0.6.1 [0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin cf 0.6.1 [0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin computerscare 0.6.1 -[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin DHE-Modules 0.6.1 -[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin DrumKit 0.6.1 -[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 -[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin ESeries 0.6.1 -[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin FrankBussFormula 0.6.1 +[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin DHE-Modules 0.6.1 +[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin DrumKit 0.6.1 +[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 +[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin ESeries 0.6.1 +[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin FrankBussFormula 0.6.1 [0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 [0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin Fundamental 0.6.1 [0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin Gratrix 0.6.1 @@ -30,7 +30,7 @@ [0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 [0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 [0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin LOGinstruments 0.6.1 -[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin ML_modules 0.6.1 +[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin ML_modules 0.6.1 [0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin moDllz 0.6.1 [0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin modular80 0.6.1 [0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin mscHack 0.6.1 @@ -40,109 +40,109 @@ [0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin Ohmer 0.6.1 [0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin PG-Instruments 0.6.1 [0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin Qwelk 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin RJModules 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin SerialRacker 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin SonusModular 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin Southpole 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 -[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin SubmarineFree 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin RJModules 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin SerialRacker 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin SonusModular 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin Southpole 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 +[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin SubmarineFree 0.6.1 [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin SynthKit 0.6.1 [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin Template 0.6.1 [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin TheXOR 0.6.1 [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin trowaSoft 0.6.1 -[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin unless_modules 0.6.1 -[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin Valley 0.6.1 -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/21kHz/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/alto777_LFSR/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Autodafe/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/CastleRocktronics/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist -[0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/computerscare/plugin.dll does not exist -[0.005 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from F:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrankBussFormula/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ImpromptuModular/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/JE/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Nohmad/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/PG-Instruments/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist -[0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SynthKit/plugin.dll does not exist -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist -[0.006 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/TheXOR/plugin.dll does not exist -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist -[0.006 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist -[0.006 info src/settings.cpp:321] Loading settings F:\git\VeeSeeVSTRack\vst2_bin\/settings.json -[0.076 info src/window.cpp:599] Loaded font F:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg -[0.077 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg -[0.077 info src/settings.cpp:321] Loading settings F:\git\VeeSeeVSTRack\vst2_bin\/settings.json -[0.179 info src/app/RackWidget.cpp:167] Saving patch to string -[0.193 info src/app/RackWidget.cpp:205] Loading patch from string -[0.194 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg -[0.194 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg -[0.195 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg -[0.195 info src/window.cpp:599] Loaded font F:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf -[0.195 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg -[0.197 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg -[0.197 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg -[0.197 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg -[0.198 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg -[0.198 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg -[0.198 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg -[0.198 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg -[0.198 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg -[0.198 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg -[0.199 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg -[0.199 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg -[0.199 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg -[0.199 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg -[0.200 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg -[0.200 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg -[0.200 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg -[0.200 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg -[0.201 info src/window.cpp:654] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg -[77.223 info src/app/RackWidget.cpp:167] Saving patch to string +[0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin unless_modules 0.6.1 +[0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin Valley 0.6.1 +[0.005 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/21kHz/plugin.dll does not exist +[0.005 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist +[0.005 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/alto777_LFSR/plugin.dll does not exist +[0.005 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist +[0.005 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Autodafe/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/CastleRocktronics/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/computerscare/plugin.dll does not exist +[0.007 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrankBussFormula/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ImpromptuModular/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JE/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Nohmad/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/PG-Instruments/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SynthKit/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist +[0.011 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/TheXOR/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist +[0.012 info src/settings.cpp:339] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json +[0.024 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf +[0.025 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg +[0.025 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg +[0.025 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg +[0.026 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg +[0.026 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg +[0.026 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg +[0.026 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg +[0.026 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg +[0.027 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg +[0.027 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/idle_mode_icon_cc.svg +[0.027 info src/settings.cpp:339] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json +[0.029 info src/app/RackWidget.cpp:207] Loading patch from string +[0.030 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg +[0.030 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg +[0.031 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg +[0.031 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf +[0.032 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg +[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg +[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg +[0.036 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg +[0.036 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/re[34.888 info src/app/RackWidget.cpp:169] Saving patch to string +eeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg +[0.038 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg +[0.038 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg +[0.039 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg +[0.040 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg +[0.040 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg +[0.040 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg +[0.041 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg +[34.813 info src/app/RackWidget.cpp:169] Saving patch to string diff --git a/vst2_bin/res/icons/idle_mode_icon_cc.svg b/vst2_bin/res/icons/idle_mode_icon_cc.svg new file mode 100644 index 00000000..7f09a759 --- /dev/null +++ b/vst2_bin/res/icons/idle_mode_icon_cc.svg @@ -0,0 +1,76 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vst2_bin/settings.json b/vst2_bin/settings.json index 003b37b0..b096612b 100644 --- a/vst2_bin/settings.json +++ b/vst2_bin/settings.json @@ -24,6 +24,8 @@ "oversampleOffline": false, "oversampleOfflineFactor": 16.0, "oversampleOfflineQuality": 10.0, + "idleDetectInstr": 1, + "idleDetectFx": 2, "lastPath": "", "moduleBrowser": { "favorites": [