@@ -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": [ | |||