From 4d74da563963020ae68c9360b82b5a908af5f7e6 Mon Sep 17 00:00:00 2001 From: bsp2 Date: Sat, 11 Aug 2018 16:01:43 +0200 Subject: [PATCH] add oversampled I/O channel limit --- README.md | 1 + src/app/RackWidget.cpp | 41 +++++++ src/app/Toolbar.cpp | 53 ++++++++- src/settings.cpp | 24 ++++ src/vst2_main.cpp | 99 ++++++++++++---- vst2_bin/CHANGELOG_VST.txt | 2 + vst2_bin/log.txt | 230 ++++++++++++++++++------------------- vst2_bin/settings.json | 2 + 8 files changed, 310 insertions(+), 142 deletions(-) diff --git a/README.md b/README.md index 3e515874..a2d9d737 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ - the plugin.dll files are _not_ binary compatible with the VCV Rack plugins ! - 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 Tested in - Eureka (my own work-in-progress VST host) diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index 7e63eec2..71637a29 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -18,6 +18,8 @@ extern void vst2_set_shared_plugin_tls_globals(void); #ifdef RACK_HOST extern void vst2_oversample_set (int _factor, int _quality); extern void vst2_oversample_get (int *_factor, int *_quality); +extern void vst2_oversample_channels_set (int _numIn, int _numOut); +extern void vst2_oversample_channels_get (int *_numIn, int *_numOut); #endif // RACK_HOST #endif // USE_VST2 @@ -276,6 +278,23 @@ json_t *RackWidget::toJson() { json_object_set_new(rootJ, "oversampleQuality", oversampleJ); } } + { + int oversampleNumIn; + int oversampleNumOut; + vst2_oversample_channels_get(&oversampleNumIn, &oversampleNumOut); + + // Oversample input channel limit + { + json_t *oversampleJ = json_real(oversampleNumIn); + json_object_set_new(rootJ, "oversampleNumIn", oversampleJ); + } + + // Oversample output channel limit + { + json_t *oversampleJ = json_real(oversampleNumOut); + json_object_set_new(rootJ, "oversampleNumOut", oversampleJ); + } + } #endif // RACK_HOST #endif // USE_VST2 @@ -373,6 +392,28 @@ void RackWidget::fromJson(json_t *rootJ) { } vst2_oversample_set(oversampleFactor, oversampleQuality); + + // Oversample channel limit + int oversampleNumIn = -1; + int oversampleNumOut = -1; + + // Oversample input channel limit + { + json_t *oversampleJ = json_object_get(rootJ, "oversampleNumIn"); + if (oversampleJ) { + oversampleNumIn = int(json_number_value(oversampleJ)); + } + } + + // Oversample output channel limit + { + json_t *oversampleJ = json_object_get(rootJ, "oversampleNumOut"); + if (oversampleJ) { + oversampleNumOut = int(json_number_value(oversampleJ)); + } + } + + vst2_oversample_channels_set(oversampleNumIn, oversampleNumOut); #endif // RACK_HOST // modules diff --git a/src/app/Toolbar.cpp b/src/app/Toolbar.cpp index 9bb84388..1779afeb 100644 --- a/src/app/Toolbar.cpp +++ b/src/app/Toolbar.cpp @@ -9,6 +9,8 @@ #ifdef RACK_HOST extern void vst2_oversample_set (int _factor, int _quality); extern void vst2_oversample_get (int *_factor, int *_quality); +extern void vst2_oversample_channels_set (int _numIn, int _numOut); +extern void vst2_oversample_channels_get (int *_numIn, int *_numOut); #endif // RACK_HOST namespace rack { @@ -158,6 +160,33 @@ struct OversampleItem : MenuItem { global->gPaused = false; } }; + +struct OversampleChannelSetting { + const char *name; + int num_in; + int num_out; +}; + +static OversampleChannelSetting oversample_channel_settings[] = { + /* 0 */ { "Oversample: 0 in, 1 out", 0, 1 }, + /* 1 */ { "Oversample: 0 in, 2 out", 0, 2 }, + /* 2 */ { "Oversample: 0 in, 4 out", 0, 4 }, + /* 3 */ { "Oversample: 0 in, 8 out", 8, 8 }, + /* 4 */ { "Oversample: 2 in, 2 out", 2, 2 }, + /* 5 */ { "Oversample: 2 in, 4 out", 2, 4 }, + /* 6 */ { "Oversample: 4 in, 8 out", 4, 8 }, + /* 7 */ { "Oversample: 8 in, 8 out", 8, 8 }, +}; +#define NUM_OVERSAMPLE_CHANNEL_SETTINGS (sizeof(oversample_channel_settings) / sizeof(OversampleChannelSetting)) + +struct OversampleChannelItem : MenuItem { + const OversampleChannelSetting *setting; + + void onAction(EventAction &e) override { + vst2_oversample_channels_set(setting->num_in, setting->num_out); + global->gPaused = false; + } +}; #endif // RACK_HOST @@ -185,12 +214,28 @@ struct SampleRateButton : TooltipIconButton { for(unsigned int overIdx = 0u; overIdx < NUM_OVERSAMPLE_SETTINGS; overIdx++) { - const OversampleSetting *overSetting = &oversample_settings[overIdx]; + const OversampleSetting *setting = &oversample_settings[overIdx]; OversampleItem *item = new OversampleItem(); - item->text = overSetting->name; - item->rightText = CHECKMARK( (overSetting->factor == factor) && (overSetting->quality == quality) ); - item->setting = overSetting; + item->text = setting->name; + item->rightText = CHECKMARK( (setting->factor == factor) && (setting->quality == quality) ); + item->setting = setting; + menu->addChild(item); + } + } + { + int numIn; + int numOut; + vst2_oversample_channels_get(&numIn, &numOut); + + for(unsigned int overIdx = 0u; overIdx < NUM_OVERSAMPLE_CHANNEL_SETTINGS; overIdx++) + { + const OversampleChannelSetting *setting = &oversample_channel_settings[overIdx]; + + OversampleChannelItem *item = new OversampleChannelItem(); + item->text = setting->name; + item->rightText = CHECKMARK( (setting->num_in == numIn) && (setting->num_out == numOut) ); + item->setting = setting; menu->addChild(item); } } diff --git a/src/settings.cpp b/src/settings.cpp index 3843163a..15f8d007 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -14,6 +14,7 @@ extern void vst2_refresh_rate_set (float _hz); #ifdef RACK_HOST extern void vst2_oversample_set (int _factor, int _quality); +extern void vst2_oversample_channels_set (int _numIn, int _numOut); #endif // RACK_HOST namespace rack { @@ -195,6 +196,7 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { #endif // USE_VST2 #ifdef RACK_HOST + // Oversample factor and quality int oversampleFactor = -1; int oversampleQuality = -1; @@ -215,6 +217,28 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { } vst2_oversample_set(oversampleFactor, oversampleQuality); + + // Oversample channel limit + int oversampleNumIn = -1; + int oversampleNumOut = -1; + + // Oversample input channel limit + { + json_t *oversampleJ = json_object_get(rootJ, "oversampleNumIn"); + if (oversampleJ) { + oversampleNumIn = int(json_number_value(oversampleJ)); + } + } + + // Oversample output channel limit + { + json_t *oversampleJ = json_object_get(rootJ, "oversampleNumOut"); + if (oversampleJ) { + oversampleNumOut = int(json_number_value(oversampleJ)); + } + } + + vst2_oversample_channels_set(oversampleNumIn, oversampleNumOut); #endif // RACK_HOST // lastPath diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index 4ca04be6..370abb99 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -405,6 +405,8 @@ public: struct { sSI factor; // 1=no SR conversion, 2=oversample x2, 4=oversample x4, .. int quality; // SPEEX_RESAMPLER_QUALITY_xxx + sUI num_in; // hack that limits oversampling to "n" input channels. default = NUM_INPUTS + sUI num_out; // hack that limits oversampling to "n" input channels. default = NUM_OUTPUTS SpeexResamplerState *srs_in; SpeexResamplerState *srs_out; sF32 in_buffers[NUM_INPUTS * MAX_BLOCK_SIZE * MAX_OVERSAMPLE_FACTOR]; @@ -652,6 +654,29 @@ public: setSampleRate(sample_rate); } + void setOversampleChannels(int _numIn, int _numOut) { + if(_numIn < 0) + _numIn = int(oversample.num_in); // keep + + if(_numOut < 0) + _numOut = int(oversample.num_out); // keep + + if(_numIn < 0) + _numIn = 0; + else if(_numIn > NUM_INPUTS) + _numIn = NUM_INPUTS; + + if(_numOut < 1) + _numOut = 1; + else if(_numOut > NUM_OUTPUTS) + _numOut = NUM_OUTPUTS; + + lockAudio(); + oversample.num_in = sUI(_numIn); + oversample.num_out = sUI(_numOut); + unlockAudio(); + } + bool setSampleRate(float _rate) { bool r = false; @@ -907,15 +932,23 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, 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; @@ -928,7 +961,7 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, // (note) AudioInterface instances accumulate samples in the output buffer { sF32 *d = wrapper->oversample.out_buffers; - ::memset((void*)d, 0, (sizeof(sF32) * NUM_OUTPUTS * overNumFrames)); + ::memset((void*)d, 0, (sizeof(sF32) * wrapper->oversample.num_out * overNumFrames)); for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) { @@ -950,20 +983,28 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, sUI inNumFrames = overNumFrames; sUI outNumFrames = hostNumFrames; - for(chIdx = 0u; chIdx < NUM_INPUTS; chIdx++) + for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) { sF32 *d = _outputs[chIdx]; - int err = speex_resampler_process_float(wrapper->oversample.srs_out, - chIdx, - s, - &inNumFrames, - d, - &outNumFrames - ); - - // Next output channel - s += inNumFrames; + 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); + } } } } @@ -1535,10 +1576,13 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, // report latency _vstPlugin.initialDelay = 0; - oversample.factor = 1; + oversample.factor = 1; oversample.quality = SPEEX_RESAMPLER_QUALITY_DEFAULT; - oversample.srs_in = NULL; + oversample.srs_in = NULL; oversample.srs_out = NULL; + oversample.num_in = NUM_INPUTS; + oversample.num_out = NUM_OUTPUTS; + sample_rate = 44100.0f; block_size = 64u; b_processing = true; @@ -1621,6 +1665,15 @@ void vst2_oversample_get(int *_factor, int *_quality) { *_quality = int(rack::global->vst2.wrapper->oversample.quality); } +void vst2_oversample_channels_set(int _numIn, int _numOut) { + rack::global->vst2.wrapper->setOversampleChannels(_numIn, _numOut); +} + +void vst2_oversample_channels_get(int *_numIn, int *_numOut) { + *_numIn = int(rack::global->vst2.wrapper->oversample.num_in); + *_numOut = int(rack::global->vst2.wrapper->oversample.num_out); +} + /** * Implementation of the main entry point of the plugin diff --git a/vst2_bin/CHANGELOG_VST.txt b/vst2_bin/CHANGELOG_VST.txt index 62cea7a9..f5884305 100644 --- a/vst2_bin/CHANGELOG_VST.txt +++ b/vst2_bin/CHANGELOG_VST.txt @@ -1,6 +1,8 @@ ** August 11th, 2018 - add settings.json:"oversampleFactor" option (1..16) - add settings.json:"oversampleQuality" option (0..10) +- add settings.json:"oversampleNumIn" option (0..8) +- add settings.json:"oversampleNumOut" option (1..8) - oversample settings are also saved / restored with the patch - oversample settings can be configured via toolbar button menu diff --git a/vst2_bin/log.txt b/vst2_bin/log.txt index 4b402323..6802731f 100644 --- a/vst2_bin/log.txt +++ b/vst2_bin/log.txt @@ -3,122 +3,122 @@ [0.000 info src/main.cpp:63] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin Alikins 0.6.1 [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AS 0.6.1 -[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 +[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin BaconMusic 0.6.1 -[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Befaco 0.6.1 +[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Befaco 0.6.1 [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bidoo 0.6.1 [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bogaudio 0.6.1 -[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin cf 0.6.1 -[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin DHE-Modules 0.6.1 -[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin DrumKit 0.6.1 -[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 -[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin ESeries 0.6.1 +[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin cf 0.6.1 +[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin DHE-Modules 0.6.1 +[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin DrumKit 0.6.1 +[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 +[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin ESeries 0.6.1 [0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 -[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin Fundamental 0.6.1 -[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin Gratrix 0.6.1 -[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin HetrickCV 0.6.1 -[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin huaba 0.6.1 -[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin JW-Modules 0.6.1 -[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 -[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 -[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin LOGinstruments 0.6.1 -[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 -[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 -[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 -[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 -[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 -[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 -[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Ohmer 0.6.1 -[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Qwelk 0.6.1 -[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 0.6.1 -[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin SerialRacker 0.6.1 -[0.007 info src/plugin.cpp:673] vcvrack: Loaded static plugin SonusModular 0.6.1 -[0.007 info src/plugin.cpp:673] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 -[0.007 info src/plugin.cpp:673] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 -[0.007 info src/plugin.cpp:673] vcvrack: Loaded static plugin SubmarineFree 0.6.1 -[0.007 info src/plugin.cpp:673] vcvrack: Loaded static plugin Template 0.6.1 -[0.007 info src/plugin.cpp:673] vcvrack: Loaded static plugin trowaSoft 0.6.1 -[0.008 info src/plugin.cpp:673] vcvrack: Loaded static plugin unless_modules 0.6.1 -[0.008 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 0.6.1 -[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist -[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist -[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist -[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist -[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist -[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist -[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist -[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist -[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist -[0.010 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll -[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist -[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist -[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist -[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist -[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist -[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist -[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist -[0.015 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll -[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist -[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist -[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist -[0.015 info src/settings.cpp:262] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json -[0.033 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf -[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg -[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg -[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg -[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg -[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg -[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg -[0.035 info src/settings.cpp:262] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json -[0.038 info src/app/RackWidget.cpp:203] Loading patch from string -[0.039 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg -[0.040 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg -[0.040 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg -[0.040 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf -[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg -[0.046 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg -[0.046 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg -[0.046 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg -[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg -[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg -[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg -[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg -[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg -[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg -[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg -[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg -[0.052 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg -[0.052 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg -[0.054 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg -[0.054 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg -[0.054 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg -[0.055 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg -[0.055 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg -[0.058 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCO-1.svg -[0.058 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/CKSS_0.svg -[0.059 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/CKSS_1.svg -[32.846 info src/app/RackWidget.cpp:165] Saving patch to string +[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Fundamental 0.6.1 +[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Gratrix 0.6.1 +[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin HetrickCV 0.6.1 +[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin huaba 0.6.1 +[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin JW-Modules 0.6.1 +[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin LOGinstruments 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 +[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Ohmer 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Qwelk 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin SerialRacker 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin SonusModular 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 +[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 +[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin SubmarineFree 0.6.1 +[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Template 0.6.1 +[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin trowaSoft 0.6.1 +[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin unless_modules 0.6.1 +[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 0.6.1 +[0.006 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist +[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist +[0.008 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist +[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist +[0.013 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll +[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist +[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist +[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist +[0.013 info src/settings.cpp:286] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json +[0.034 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg +[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg +[0.036 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg +[0.036 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg +[0.036 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg +[0.037 info src/settings.cpp:286] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json +[0.039 info src/app/RackWidget.cpp:205] Loading patch from string +[0.041 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg +[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg +[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg +[0.042 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf +[0.044 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg +[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg +[0.049 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg +[0.049 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg +[0.049 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg +[0.049 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg +[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg +[0.051 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg +[0.052 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg +[0.053 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg +[0.054 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg +[0.055 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg +[0.056 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg +[0.056 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg +[0.056 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg +[0.057 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg +[0.060 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCO-1.svg +[0.060 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/CKSS_0.svg +[0.060 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/CKSS_1.svg +[14.606 info src/app/RackWidget.cpp:167] Saving patch to string diff --git a/vst2_bin/settings.json b/vst2_bin/settings.json index dfffd1ae..d195e019 100644 --- a/vst2_bin/settings.json +++ b/vst2_bin/settings.json @@ -19,6 +19,8 @@ "sampleRate": 44100.0, "oversampleFactor": 1.0, "oversampleQuality": 7.0, + "oversampleNumIn": 8.0, + "oversampleNumOut": 8.0, "lastPath": "", "moduleBrowser": { "favorites": [