@@ -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 | - 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) | + supports internal oversampling (up to 16x with configurable quality) | ||||
- the number of oversampled I/O channels can be limited to save CPU time | - 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 | Tested in | ||||
- Eureka (my own work-in-progress VST host) | - Eureka (my own work-in-progress VST host) | ||||
@@ -30,7 +32,7 @@ Tested in | |||||
# Downloads | # Downloads | ||||
The current release can be found in the [vst2_bin/](vst2_bin/) folder. | The current release can be found in the [vst2_bin/](vst2_bin/) folder. | ||||
Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-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 ! | Note: The effect plugin can used be as an instrument, too. You just have to send it MIDI events ! | ||||
@@ -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> |
@@ -17,17 +17,17 @@ namespace rack { | |||||
ModuleWidget::ModuleWidget(Module *module) { | 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()); | // printf("xxx ModuleWidget::ModuleWidget: GetCurrentThreadId=%d\n", GetCurrentThreadId()); | ||||
if (module) { | if (module) { | ||||
engineAddModule(module); | engineAddModule(module); | ||||
printf("xxx ModuleWidget::ModuleWidget: engineAddModule OK\n"); | |||||
// printf("xxx ModuleWidget::ModuleWidget: engineAddModule OK\n"); | |||||
} | } | ||||
this->module = module; | this->module = module; | ||||
// printf("xxx ModuleWidget::ModuleWidget(): bind GL context global_ui->window.gWindow=%p\n", global_ui->window.gWindow); | // printf("xxx ModuleWidget::ModuleWidget(): bind GL context global_ui->window.gWindow=%p\n", global_ui->window.gWindow); | ||||
// glfwMakeContextCurrent(global_ui->window.gWindow); | // glfwMakeContextCurrent(global_ui->window.gWindow); | ||||
// // glfw_hack_makeContextCurrent(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() { | ModuleWidget::~ModuleWidget() { | ||||
@@ -67,11 +67,11 @@ void ModuleWidget::addParam(ParamWidget *param) { | |||||
void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | ||||
// Remove old panel | // 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) { | if (panel) { | ||||
removeChild(panel); | removeChild(panel); | ||||
delete panel; | delete panel; | ||||
@@ -155,7 +155,7 @@ void ModuleWidget::fromJson(json_t *rootJ) { | |||||
double x, y; | double x, y; | ||||
json_unpack(posJ, "[F, F]", &x, &y); | json_unpack(posJ, "[F, F]", &x, &y); | ||||
Vec pos = Vec(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) { | if (legacy && legacy <= 1) { | ||||
box.pos = pos; | box.pos = pos; | ||||
} | } | ||||
@@ -444,12 +444,12 @@ struct DeleteMenuItem : MenuItem { | |||||
}; | }; | ||||
Menu *ModuleWidget::createContextMenu() { | Menu *ModuleWidget::createContextMenu() { | ||||
printf("xxx ModuleWidget::createContextMenu: ENTER\n"); | |||||
// printf("xxx ModuleWidget::createContextMenu: ENTER\n"); | |||||
Menu *menu = global_ui->ui.gScene->createMenu(); | Menu *menu = global_ui->ui.gScene->createMenu(); | ||||
MenuLabel *menuLabel = new MenuLabel(); | 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; | menuLabel->text = model->author + " " + model->name + " " + model->plugin->version; | ||||
menu->addChild(menuLabel); | menu->addChild(menuLabel); | ||||
@@ -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_realtime_get (float *_factor, int *_quality); | ||||
extern void vst2_oversample_channels_set (int _numIn, int _numOut); | extern void vst2_oversample_channels_set (int _numIn, int _numOut); | ||||
extern void vst2_oversample_channels_get (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 // RACK_HOST | ||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
@@ -295,6 +297,15 @@ json_t *RackWidget::toJson() { | |||||
json_object_set_new(rootJ, "oversampleNumOut", oversampleJ); | 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 // RACK_HOST | ||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
@@ -414,6 +425,14 @@ void RackWidget::fromJson(json_t *rootJ) { | |||||
} | } | ||||
vst2_oversample_channels_set(oversampleNumIn, oversampleNumOut); | 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 | #endif // RACK_HOST | ||||
// modules | // modules | ||||
@@ -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_realtime_get (float *_factor, int *_quality); | ||||
extern void vst2_oversample_channels_set (int _numIn, int _numOut); | extern void vst2_oversample_channels_set (int _numIn, int _numOut); | ||||
extern void vst2_oversample_channels_get (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 // RACK_HOST | ||||
namespace rack { | namespace rack { | ||||
@@ -197,6 +199,14 @@ struct OversampleChannelItem : MenuItem { | |||||
global->gPaused = false; | global->gPaused = false; | ||||
} | } | ||||
}; | }; | ||||
struct IdleModeItem : MenuItem { | |||||
int idle_mode; | |||||
void onAction(EventAction &e) override { | |||||
vst2_idle_detect_mode_set(idle_mode); | |||||
} | |||||
}; | |||||
#endif // RACK_HOST | #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 { | struct ZoomSlider : Slider { | ||||
void onAction(EventAction &e) override { | void onAction(EventAction &e) override { | ||||
Slider::onAction(e); | Slider::onAction(e); | ||||
@@ -298,6 +346,7 @@ Toolbar::Toolbar() { | |||||
layout->addChild(new SampleRateButton()); | layout->addChild(new SampleRateButton()); | ||||
layout->addChild(new PowerMeterButton()); | layout->addChild(new PowerMeterButton()); | ||||
layout->addChild(new RackLockButton()); | layout->addChild(new RackLockButton()); | ||||
layout->addChild(new IdleModeButton()); | |||||
wireOpacitySlider = new Slider(); | wireOpacitySlider = new Slider(); | ||||
wireOpacitySlider->box.size.x = 150; | wireOpacitySlider->box.size.x = 150; | ||||
@@ -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_set (float _factor, int _quality); | ||||
extern void vst2_oversample_offline_check_set (int _bEnable); | extern void vst2_oversample_offline_check_set (int _bEnable); | ||||
extern void vst2_oversample_channels_set (int _numIn, int _numOut); | 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 | #endif // RACK_HOST | ||||
namespace rack { | namespace rack { | ||||
@@ -274,6 +276,22 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||||
} | } | ||||
vst2_oversample_channels_set(oversampleNumIn, oversampleNumOut); | 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 | #endif // RACK_HOST | ||||
// lastPath | // lastPath | ||||
@@ -18,7 +18,7 @@ | |||||
/// created: 25Jun2018 | /// created: 25Jun2018 | ||||
/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | /// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | ||||
/// 26Jul2018, 04Aug2018, 05Aug2018, 06Aug2018, 07Aug2018, 09Aug2018, 11Aug2018 | /// 26Jul2018, 04Aug2018, 05Aug2018, 06Aug2018, 07Aug2018, 09Aug2018, 11Aug2018 | ||||
/// 18Aug2018 | |||||
/// 18Aug2018, 19Aug2018 | |||||
/// | /// | ||||
/// | /// | ||||
@@ -33,6 +33,12 @@ | |||||
#undef RACK_HOST | #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 <aeffect.h> | ||||
#include <aeffectx.h> | #include <aeffectx.h> | ||||
#include <stdio.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) ) | #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 int vst2_init (int argc, char* argv[]); | ||||
extern void vst2_exit (void); | extern void vst2_exit (void); | ||||
namespace rack { | namespace rack { | ||||
@@ -395,6 +412,10 @@ public: | |||||
static const uint32_t MAX_BLOCK_SIZE = 16384u; | static const uint32_t MAX_BLOCK_SIZE = 16384u; | ||||
static const uint32_t MAX_OVERSAMPLE_FACTOR = 16u; | 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: | public: | ||||
rack::Global rack_global; | rack::Global rack_global; | ||||
rack::GlobalUI rack_global_ui; | rack::GlobalUI rack_global_ui; | ||||
@@ -419,8 +440,10 @@ public: | |||||
sF32 out_buffers[NUM_OUTPUTS * MAX_BLOCK_SIZE]; | sF32 out_buffers[NUM_OUTPUTS * MAX_BLOCK_SIZE]; | ||||
} oversample; | } oversample; | ||||
protected: | |||||
public: | |||||
float sample_rate; // e.g. 44100.0 | float sample_rate; // e.g. 44100.0 | ||||
protected: | |||||
uint32_t block_size; // e.g. 64 | uint32_t block_size; // e.g. 64 | ||||
PluginMutex mtx_audio; | PluginMutex mtx_audio; | ||||
@@ -434,6 +457,13 @@ public: | |||||
bool b_offline; // true=offline rendering (HQ) | bool b_offline; // true=offline rendering (HQ) | ||||
bool b_check_offline; // true=ask host if it's in offline rendering mode | 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; | ERect editor_rect; | ||||
sBool b_editor_open; | sBool b_editor_open; | ||||
@@ -469,11 +499,11 @@ public: | |||||
sSI openEffect(void) { | sSI openEffect(void) { | ||||
printf("xxx vstrack_plugin::openEffect\n"); | |||||
Dprintf("xxx vstrack_plugin::openEffect\n"); | |||||
// (todo) use mutex | // (todo) use mutex | ||||
instance_id = instance_count; | 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; | rack_global.vst2.wrapper = this; | ||||
@@ -497,23 +527,23 @@ public: | |||||
dllname.visit(dllnameraw); | dllname.visit(dllnameraw); | ||||
dllname.getDirName(&cwd); | dllname.getDirName(&cwd); | ||||
rack::global->vst2.program_dir = (const char*)cwd.chars; | 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("f:/vst_64bit/vstrack_plugin"); | ||||
::SetCurrentDirectory((const char*)cwd.chars); | ::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('\\', '/'); | // cwd.replace('\\', '/'); | ||||
int argc = 1; | int argc = 1; | ||||
char *argv[1]; | char *argv[1]; | ||||
//argv[0] = (char*)cwd.chars; | //argv[0] = (char*)cwd.chars; | ||||
argv[0] = (char*)dllnameraw; | 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); | (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(); | 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); | ::SetCurrentDirectory(oldCWD); | ||||
setSampleRate(sample_rate); | setSampleRate(sample_rate); | ||||
@@ -521,7 +551,7 @@ public: | |||||
b_open = true; | b_open = true; | ||||
b_editor_open = false; | b_editor_open = false; | ||||
printf("xxx vstrack_plugin::openEffect: LEAVE\n"); | |||||
Dprintf("xxx vstrack_plugin::openEffect: LEAVE\n"); | |||||
return 1; | return 1; | ||||
} | } | ||||
@@ -557,7 +587,7 @@ public: | |||||
} | } | ||||
void openEditor(void *_hwnd) { | void openEditor(void *_hwnd) { | ||||
printf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); | |||||
Dprintf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); | |||||
setGlobals(); | setGlobals(); | ||||
(void)lglw_window_open(rack_global_ui.window.lglw, | (void)lglw_window_open(rack_global_ui.window.lglw, | ||||
_hwnd, | _hwnd, | ||||
@@ -575,7 +605,7 @@ public: | |||||
} | } | ||||
void closeEditor(void) { | 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) | if(b_editor_open) | ||||
{ | { | ||||
setGlobals(); | setGlobals(); | ||||
@@ -590,14 +620,14 @@ public: | |||||
closeEditor(); | closeEditor(); | ||||
// (todo) use mutex | // (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) | if(NULL != last_program_chunk_str) | ||||
{ | { | ||||
::free(last_program_chunk_str); | ::free(last_program_chunk_str); | ||||
last_program_chunk_str = NULL; | 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) | if(b_open) | ||||
{ | { | ||||
@@ -606,15 +636,15 @@ public: | |||||
setGlobals(); | setGlobals(); | ||||
rack::global->vst2.last_seen_instance_count = instance_count; | 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(); | vst2_exit(); | ||||
printf("xxx vstrack_plugin: vst2_exit() done\n"); | |||||
Dprintf("xxx vstrack_plugin: vst2_exit() done\n"); | |||||
destroyResamplerStates(); | destroyResamplerStates(); | ||||
printf("xxx vstrack_plugin: destroyResamplerStates() done\n"); | |||||
Dprintf("xxx vstrack_plugin: destroyResamplerStates() done\n"); | |||||
#ifdef USE_CONSOLE | #ifdef USE_CONSOLE | ||||
// FreeConsole(); | // FreeConsole(); | ||||
@@ -758,7 +788,7 @@ public: | |||||
&err | &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) | if(_bLock) | ||||
@@ -807,7 +837,7 @@ public: | |||||
static int i = 0; | static int i = 0; | ||||
if(0 == (++i & 127)) | if(0 == (++i & 127)) | ||||
{ | { | ||||
printf("xxx vstrack_plugin: audioMasterGetCurrentProcessLevel: level=%d\n", level); | |||||
Dprintf("xxx vstrack_plugin: audioMasterGetCurrentProcessLevel: level=%d\n", level); | |||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
@@ -819,16 +849,16 @@ public: | |||||
if(bOffline) | 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*/); | setOversample(oversample.offline_factor, oversample.offline_quality, false/*bLock*/); | ||||
} | } | ||||
else | 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*/); | 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; | 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) { | sUI getProgramChunk(uint8_t**_addr) { | ||||
setGlobals(); | setGlobals(); | ||||
if(NULL != last_program_chunk_str) | if(NULL != last_program_chunk_str) | ||||
@@ -862,13 +912,13 @@ public: | |||||
setGlobals(); | setGlobals(); | ||||
lockAudio(); | lockAudio(); | ||||
#if 0 | #if 0 | ||||
printf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); | |||||
Dprintf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); | |||||
#endif | #endif | ||||
lglw_glcontext_push(rack::global_ui->window.lglw); | lglw_glcontext_push(rack::global_ui->window.lglw); | ||||
bool r = rack::global_ui->app.gRackWidget->loadPatchFromString((const char*)_addr); | bool r = rack::global_ui->app.gRackWidget->loadPatchFromString((const char*)_addr); | ||||
rack::global_ui->ui.gScene->step(); // w/o this the patch is bypassed | rack::global_ui->ui.gScene->step(); // w/o this the patch is bypassed | ||||
lglw_glcontext_pop(rack::global_ui->window.lglw); | 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(); | unlockAudio(); | ||||
return r; | 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) | // 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); | VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | ||||
// printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: ENTER\n"); | |||||
// Dprintf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: ENTER\n"); | |||||
wrapper->lockAudio(); | wrapper->lockAudio(); | ||||
wrapper->setGlobals(); | wrapper->setGlobals(); | ||||
@@ -1029,9 +1079,9 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||||
rack::global->vst2.last_seen_num_frames = sUI(sampleFrames); | rack::global->vst2.last_seen_num_frames = sUI(sampleFrames); | ||||
vst2_handle_queued_params(); | 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 | #ifdef HAVE_WINDOWS | ||||
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); | _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); | ||||
@@ -1039,135 +1089,247 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||||
sUI chIdx; | 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++) | 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++) | for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) | ||||
{ | |||||
sF32 *d = _outputs[chIdx]; | |||||
{ | |||||
if(chIdx < wrapper->oversample.num_out) | 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 | 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++) | for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) | ||||
{ | { | ||||
::memset((void*)_outputs[chIdx], 0, sizeof(sF32)*sampleFrames); | ::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.vipMutex.unlock(); | ||||
rack::global->engine.mutex.unlock(); | rack::global->engine.mutex.unlock(); | ||||
wrapper->unlockAudio(); | 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, | void *ptr, | ||||
float opt | float opt | ||||
) { | ) { | ||||
// printf("vstrack_plugin: called VSTPluginDispatcher(%d)\n", opCode); | |||||
// Dprintf("vstrack_plugin: called VSTPluginDispatcher(%d)\n", opCode); | |||||
VstIntPtr r = 0; | VstIntPtr r = 0; | ||||
@@ -1214,7 +1376,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
case effOpen: | case effOpen: | ||||
// called by the host after it has obtained the effect instance (but _not_ during plugin scans) | // 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 | // (note) any heavy-lifting init code should go here | ||||
::printf("vstrack_plugin<dispatcher>: effOpen\n"); | |||||
Dprintf("vstrack_plugin<dispatcher>: effOpen\n"); | |||||
r = wrapper->openEffect(); | r = wrapper->openEffect(); | ||||
break; | break; | ||||
@@ -1332,6 +1494,8 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
r = 1; | r = 1; | ||||
else if(!strcmp((char*)ptr, "receiveVstMidiEvent")) // (note) required by Jeskola Buzz | else if(!strcmp((char*)ptr, "receiveVstMidiEvent")) // (note) required by Jeskola Buzz | ||||
r = 1; | r = 1; | ||||
else if(!strcmp((char*)ptr, "noRealTime")) | |||||
r = 1; | |||||
else | else | ||||
r = 0; | r = 0; | ||||
break; | break; | ||||
@@ -1384,7 +1548,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
// value: 0 | // value: 0 | ||||
// ptr: buffer address | // ptr: buffer address | ||||
// r: buffer size | // 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) | // // if(0 == index) | ||||
// // { | // // { | ||||
// // r = wrapper->getBankChunk((uint8_t**)ptr); | // // r = wrapper->getBankChunk((uint8_t**)ptr); | ||||
@@ -1400,7 +1564,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
// value: buffer size | // value: buffer size | ||||
// ptr: buffer address | // ptr: buffer address | ||||
// r: 1 | // 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) | // // if(0 == index) | ||||
// // { | // // { | ||||
// // r = wrapper->setBankChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; | // // r = wrapper->setBankChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; | ||||
@@ -1439,7 +1603,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
// ptr: VstEvents* | // ptr: VstEvents* | ||||
{ | { | ||||
VstEvents *events = (VstEvents*)ptr; | 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]; | VstEvent**evAddr = &events->events[0]; | ||||
if(events->numEvents > 0) | if(events->numEvents > 0) | ||||
@@ -1454,8 +1618,8 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
if(NULL != ev) // paranoia | if(NULL != ev) // paranoia | ||||
{ | { | ||||
#ifdef DEBUG_PRINT_EVENTS | #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 | #endif // DEBUG_PRINT_EVENTS | ||||
switch(ev->type) | switch(ev->type) | ||||
@@ -1474,16 +1638,29 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
{ | { | ||||
VstMidiEvent *mev = (VstMidiEvent *)ev; | VstMidiEvent *mev = (VstMidiEvent *)ev; | ||||
#ifdef DEBUG_PRINT_EVENTS | #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 | #endif // DEBUG_PRINT_EVENTS | ||||
vst2_process_midi_input_event(mev->midiData[0], | vst2_process_midi_input_event(mev->midiData[0], | ||||
mev->midiData[1], | mev->midiData[1], | ||||
mev->midiData[2] | 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; | break; | ||||
@@ -1491,8 +1668,8 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
{ | { | ||||
VstMidiSysexEvent *xev = (VstMidiSysexEvent*)ev; | VstMidiSysexEvent *xev = (VstMidiSysexEvent*)ev; | ||||
#ifdef DEBUG_PRINT_EVENTS | #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 | #endif // DEBUG_PRINT_EVENTS | ||||
// (note) don't forget to use a mutex (lockAudio(), unlockAudio()) when modifying the audio processor state! | // (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: | case effEditKeyDown: | ||||
// [index]: ASCII character [value]: virtual key [opt]: modifiers [return value]: 1 if key used @see AEffEditor::onKeyDown | // [index]: ASCII character [value]: virtual key [opt]: modifiers [return value]: 1 if key used @see AEffEditor::onKeyDown | ||||
// (note) only used for touch input | // (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) | if(rack::b_touchkeyboard_enable) | ||||
{ | { | ||||
wrapper->setGlobals(); | wrapper->setGlobals(); | ||||
@@ -1617,7 +1794,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
default: | default: | ||||
// ignoring all other opcodes | // 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; | break; | ||||
} | } | ||||
@@ -1634,7 +1811,7 @@ void VSTPluginSetParameter(VSTPlugin *vstPlugin, | |||||
float parameter | float parameter | ||||
) { | ) { | ||||
#ifdef DEBUG_PRINT_PARAMS | #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 | #endif // DEBUG_PRINT_PARAMS | ||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | // 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 | VstInt32 index | ||||
) { | ) { | ||||
#ifdef DEBUG_PRINT_PARAMS | #ifdef DEBUG_PRINT_PARAMS | ||||
printf("vstrack_plugin: called VSTPluginGetParameter(%d)\n", index); | |||||
Dprintf("vstrack_plugin: called VSTPluginGetParameter(%d)\n", index); | |||||
#endif // DEBUG_PRINT_PARAMS | #endif // DEBUG_PRINT_PARAMS | ||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | // 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); | VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | ||||
@@ -1736,6 +1913,13 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
b_offline = false; | b_offline = false; | ||||
b_check_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; | last_program_chunk_str = NULL; | ||||
b_open = false; | 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); | *_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 | * Implementation of the main entry point of the plugin | ||||
*/ | */ | ||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) { | VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) { | ||||
printf("vstrack_plugin: called VSTPluginMain... \n"); | |||||
Dprintf("vstrack_plugin: called VSTPluginMain... \n"); | |||||
#if 0 | #if 0 | ||||
if(!vstHostCallback(0, audioMasterVersion, 0, 0, 0, 0)) | if(!vstHostCallback(0, audioMasterVersion, 0, 0, 0, 0)) | ||||
@@ -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 | ** August 18th, 2018 | ||||
- lglw: add clipboard support (TextField) | - lglw: add clipboard support (TextField) | ||||
- fix Fundamental.VCA-2 layout | - fix Fundamental.VCA-2 layout | ||||
@@ -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 host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) | ||||
+ supports VST parameters (send / recv) | + supports VST parameters (send / recv) | ||||
+ supports internal resampling (up to 16x with configurable quality) | + 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 | Here's a demo video of it: https://vimeo.com/277703414 | ||||
@@ -1,6 +1,6 @@ | |||||
[0.000 info src/main.cpp:59] VeeSeeVST Rack 0.6.1 | [0.000 info src/main.cpp:59] VeeSeeVST Rack 0.6.1 | ||||
[0.000 info src/main.cpp:62] Global directory: F:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/main.cpp:63] Local directory: F:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/main.cpp:62] Global directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/main.cpp:63] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||||
[0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin 21kHz 0.6.1 | [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 Alikins 0.6.1 | ||||
[0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin alto777_LFSR 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 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 Autodafe 0.6.1 | ||||
[0.000 info src/plugin.cpp:686] vcvrack: Loaded static plugin BaconMusic 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 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 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 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 cf 0.6.1 | ||||
[0.001 info src/plugin.cpp:686] vcvrack: Loaded static plugin computerscare 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 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 Fundamental 0.6.1 | ||||
[0.002 info src/plugin.cpp:686] vcvrack: Loaded static plugin Gratrix 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 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 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 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 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 modular80 0.6.1 | ||||
[0.003 info src/plugin.cpp:686] vcvrack: Loaded static plugin mscHack 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 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 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 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 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 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 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 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 |
@@ -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> |
@@ -24,6 +24,8 @@ | |||||
"oversampleOffline": false, | "oversampleOffline": false, | ||||
"oversampleOfflineFactor": 16.0, | "oversampleOfflineFactor": 16.0, | ||||
"oversampleOfflineQuality": 10.0, | "oversampleOfflineQuality": 10.0, | ||||
"idleDetectInstr": 1, | |||||
"idleDetectFx": 2, | |||||
"lastPath": "", | "lastPath": "", | ||||
"moduleBrowser": { | "moduleBrowser": { | ||||
"favorites": [ | "favorites": [ | ||||