Browse Source

add idle-detection (off, wake on MIDI note-on, wake on audio input)

pull/1639/head
bsp2 6 years ago
parent
commit
ad0d90f664
12 changed files with 714 additions and 257 deletions
  1. +3
    -1
      README.md
  2. +76
    -0
      res/icons/idle_mode_icon_cc.svg
  3. +12
    -12
      src/app/ModuleWidget.cpp
  4. +19
    -0
      src/app/RackWidget.cpp
  5. +49
    -0
      src/app/Toolbar.cpp
  6. +18
    -0
      src/settings.cpp
  7. +336
    -132
      src/vst2_main.cpp
  8. +10
    -0
      vst2_bin/CHANGELOG_VST.txt
  9. +2
    -1
      vst2_bin/README_vst2.txt
  10. +111
    -111
      vst2_bin/log.txt
  11. +76
    -0
      vst2_bin/res/icons/idle_mode_icon_cc.svg
  12. +2
    -0
      vst2_bin/settings.json

+ 3
- 1
README.md View File

@@ -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 !



+ 76
- 0
res/icons/idle_mode_icon_cc.svg View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="-7074.5 3413.5 16 16"
enable-background="new -7074.5 3413.5 24 24"
xml:space="preserve"
id="svg12"
sodipodi:docname="idle_mode_icon_cc.svg"
width="16"
height="16"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata18"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs16">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview14"
showgrid="false"
inkscape:zoom="22.250293"
inkscape:cx="14.709114"
inkscape:cy="5.7391785"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg12" /><g
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
id="text1044" /><g
aria-label="z"
transform="rotate(13.220855)"
style="font-style:normal;font-weight:normal;font-size:9.93692684px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.24842319"
id="text1048"><path
id="path1091"
style="stroke-width:0.24842319;fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd"
d="m -6098.6451,4944.1307 h 4.2407 v 0.8151 l -3.3576,3.9059 h 3.3576 v 0.7132 h -4.362 v -0.8151 l 3.3576,-3.9059 h -3.2363 z m 7.3312,-0.7078 c 1.5371,2.1834 1.3916,5.3677 -0.462,7.3298 -0.3972,0.3918 -0.7671,0.7528 -1.1966,1.1104 -0.5406,0.4518 -1.301,0.7448 -1.9707,0.9342 -1.3785,0.3916 -2.7058,0.3435 -4.0459,-0.1576 -0.3066,-0.1144 -0.6004,-0.2707 -0.8801,-0.435 -0.286,-0.1722 -0.3728,-0.3563 -0.6609,-0.1432 -0.358,0.2676 -1.5561,0.6485 -1.2349,-0.241 0.1054,-0.2921 0.3538,-0.4813 0.4814,-0.7528 -0.059,-0.2503 -0.3681,-0.4953 -0.5037,-0.722 -0.3991,-0.6535 -0.6657,-1.3345 -0.8668,-2.0727 -0.099,-0.7799 -0.1419,-1.4378 -0.057,-2.2182 0.09,-0.8606 0.5018,-1.6004 0.8844,-2.3558 0.6621,-1.2921 2.1283,-2.1743 3.4404,-2.6566 0.6948,-0.1632 1.3383,-0.3144 2.0524,-0.3112 0.7228,0.014 1.3834,0.1648 2.0601,0.3956 1.2275,0.4184 2.2227,1.2401 2.9619,2.2907 z m -4.7309,-2.5723 c 0.028,0.1178 0.087,-0.079 0,0 z" /></g><g
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
id="text1056" /></svg>

+ 12
- 12
src/app/ModuleWidget.cpp View File

@@ -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> svg) {
// Remove old panel
#ifdef RACK_PLUGIN_SHARED
printf("xxx ModuleWidget::setPanel<shared>: 1\n");
#else
printf("xxx ModuleWidget::setPanel<host>: 1\n");
#endif
// #ifdef RACK_PLUGIN_SHARED
// printf("xxx ModuleWidget::setPanel<shared>: 1\n");
// #else
// printf("xxx ModuleWidget::setPanel<host>: 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);



+ 19
- 0
src/app/RackWidget.cpp View File

@@ -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


+ 49
- 0
src/app/Toolbar.cpp View File

@@ -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;


+ 18
- 0
src/settings.cpp View File

@@ -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


+ 336
- 132
src/vst2_main.cpp View File

@@ -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 <aeffect.h>
#include <aeffectx.h>
#include <stdio.h>
@@ -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<VSTPluginWrapper *>(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<dispatcher>: effOpen\n");
Dprintf("vstrack_plugin<dispatcher>: 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<midi>: ev[%u].noteLength = %u\n", evIdx, uint32_t(mev->noteLength)); // #frames
printf("vstrack_plugin:effProcessEvents<midi>: ev[%u].noteOffset = %u\n", evIdx, uint32_t(mev->noteOffset)); // #frames
printf("vstrack_plugin:effProcessEvents<midi>: 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<midi>: ev[%u].detune = %d\n", evIdx, mev->detune); // -64..63
printf("vstrack_plugin:effProcessEvents<midi>: ev[%u].noteOffVelocity = %d\n", evIdx, mev->noteOffVelocity); // 0..127
Dprintf("vstrack_plugin:effProcessEvents<midi>: ev[%u].noteLength = %u\n", evIdx, uint32_t(mev->noteLength)); // #frames
Dprintf("vstrack_plugin:effProcessEvents<midi>: ev[%u].noteOffset = %u\n", evIdx, uint32_t(mev->noteOffset)); // #frames
Dprintf("vstrack_plugin:effProcessEvents<midi>: 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<midi>: ev[%u].detune = %d\n", evIdx, mev->detune); // -64..63
Dprintf("vstrack_plugin:effProcessEvents<midi>: 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<syx>: ev[%u].dumpBytes = %u\n", evIdx, uint32_t(xev->dumpBytes)); // size
printf("vstrack_plugin:effProcessEvents<syx>: ev[%u].sysexDump = %p\n", evIdx, xev->sysexDump); // buffer addr
Dprintf("vstrack_plugin:effProcessEvents<syx>: ev[%u].dumpBytes = %u\n", evIdx, uint32_t(xev->dumpBytes)); // size
Dprintf("vstrack_plugin:effProcessEvents<syx>: 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<VSTPluginWrapper *>(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))


+ 10
- 0
vst2_bin/CHANGELOG_VST.txt View File

@@ -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


+ 2
- 1
vst2_bin/README_vst2.txt View File

@@ -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



+ 111
- 111
vst2_bin/log.txt View File

@@ -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

+ 76
- 0
vst2_bin/res/icons/idle_mode_icon_cc.svg View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="-7074.5 3413.5 16 16"
enable-background="new -7074.5 3413.5 24 24"
xml:space="preserve"
id="svg12"
sodipodi:docname="idle_mode_icon_cc.svg"
width="16"
height="16"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata18"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs16">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview14"
showgrid="false"
inkscape:zoom="22.250293"
inkscape:cx="14.709114"
inkscape:cy="5.7391785"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg12" /><g
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
id="text1044" /><g
aria-label="z"
transform="rotate(13.220855)"
style="font-style:normal;font-weight:normal;font-size:9.93692684px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.24842319"
id="text1048"><path
id="path1091"
style="stroke-width:0.24842319;fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd"
d="m -6098.6451,4944.1307 h 4.2407 v 0.8151 l -3.3576,3.9059 h 3.3576 v 0.7132 h -4.362 v -0.8151 l 3.3576,-3.9059 h -3.2363 z m 7.3312,-0.7078 c 1.5371,2.1834 1.3916,5.3677 -0.462,7.3298 -0.3972,0.3918 -0.7671,0.7528 -1.1966,1.1104 -0.5406,0.4518 -1.301,0.7448 -1.9707,0.9342 -1.3785,0.3916 -2.7058,0.3435 -4.0459,-0.1576 -0.3066,-0.1144 -0.6004,-0.2707 -0.8801,-0.435 -0.286,-0.1722 -0.3728,-0.3563 -0.6609,-0.1432 -0.358,0.2676 -1.5561,0.6485 -1.2349,-0.241 0.1054,-0.2921 0.3538,-0.4813 0.4814,-0.7528 -0.059,-0.2503 -0.3681,-0.4953 -0.5037,-0.722 -0.3991,-0.6535 -0.6657,-1.3345 -0.8668,-2.0727 -0.099,-0.7799 -0.1419,-1.4378 -0.057,-2.2182 0.09,-0.8606 0.5018,-1.6004 0.8844,-2.3558 0.6621,-1.2921 2.1283,-2.1743 3.4404,-2.6566 0.6948,-0.1632 1.3383,-0.3144 2.0524,-0.3112 0.7228,0.014 1.3834,0.1648 2.0601,0.3956 1.2275,0.4184 2.2227,1.2401 2.9619,2.2907 z m -4.7309,-2.5723 c 0.028,0.1178 0.087,-0.079 0,0 z" /></g><g
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
id="text1056" /></svg>

+ 2
- 0
vst2_bin/settings.json View File

@@ -24,6 +24,8 @@
"oversampleOffline": false,
"oversampleOfflineFactor": 16.0,
"oversampleOfflineQuality": 10.0,
"idleDetectInstr": 1,
"idleDetectFx": 2,
"lastPath": "",
"moduleBrowser": {
"favorites": [


Loading…
Cancel
Save