| @@ -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 ! | |||
| @@ -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) { | |||
| 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); | |||
| @@ -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 | |||
| @@ -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; | |||
| @@ -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 | |||
| @@ -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)) | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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, | |||
| "oversampleOfflineFactor": 16.0, | |||
| "oversampleOfflineQuality": 10.0, | |||
| "idleDetectInstr": 1, | |||
| "idleDetectFx": 2, | |||
| "lastPath": "", | |||
| "moduleBrowser": { | |||
| "favorites": [ | |||