diff --git a/README.md b/README.md index 09c8f1b3..ab8ca940 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ + supports VST MIDI input + supports up to 8 audio outputs + supports up to 8 audio inputs -+ support VST program chunks (=> patches are saved with the DAW's project file or as .fxp files) ++ supports VST program chunks (=> patches are saved with the DAW's project file or as .fxp files) ++ supports VST host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) - does not support plugin DLLs due to VCV Rack's architecture which prevents this when it is run as a plugin itself - future releases may contain additional (open source) add-ons modules @@ -21,7 +22,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-05Jul2018.7z](dist/veeseevstrack_0_6_1_win64_bin-05Jul2018.7z) +Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-06Jul2018.7z](dist/veeseevstrack_0_6_1_win64_bin-06Jul2018.7z) # Demo Video diff --git a/src/Core/MIDIToCVInterface.cpp b/src/Core/MIDIToCVInterface.cpp index 7f88f63f..8607267a 100644 --- a/src/Core/MIDIToCVInterface.cpp +++ b/src/Core/MIDIToCVInterface.cpp @@ -1,3 +1,8 @@ + +#ifdef USE_VST2 +extern void vst2_get_timing_info (int *_retPlaying, float *_retBPM, float *_retSongPosPPQ); +#endif // USE_VST2 + #include "global_pre.hpp" #include "Core.hpp" #include "midi.hpp" @@ -47,6 +52,10 @@ struct MIDIToCVInterface : Module { PulseGenerator continuePulse; int clock = 0; int divisions[2]; +#ifdef USE_VST2 + int b_vst_transport_playing = 0; + float vst_timing_clock_samples = 0.0f; +#endif // USE_VST2 struct NoteData { uint8_t velocity = 0; @@ -100,6 +109,10 @@ struct MIDIToCVInterface : Module { clock = 0; divisions[0] = 24; divisions[1] = 6; +#ifdef USE_VST2 + b_vst_transport_playing = 0; + vst_timing_clock_samples = 0.0f; +#endif // USE_VST2 } void pressNote(uint8_t note) { @@ -141,6 +154,64 @@ struct MIDIToCVInterface : Module { releaseNote(255); } +#ifdef USE_VST2 + void handleVSTClock(void) { + // (note) calling this _per sample_ is quite excessive (but should not be a problem) + // (note) the VST host might not update this per sample, though + float songPosPPQ = -1.0f; + float bpm = -1.0f; + int bPlaying = 0; + vst2_get_timing_info(&bPlaying, &bpm, &songPosPPQ); + // printf("xxx songPosPPQ=%f bpm=%f bPlaying=%d\n", songPosPPQ, bpm, bPlaying); + + if(b_vst_transport_playing ^ bPlaying) + { + if(bPlaying) + { + startPulse.trigger(1e-3); + clock = 0; + vst_timing_clock_samples = 0.0f; + } + else + { + stopPulse.trigger(1e-3); + // Reset timing + clock = 0; + } + b_vst_transport_playing = bPlaying; + } + + if(bPlaying && (bpm > 0.0f)) + { + float secondsPerQuarter = 60.0f / bpm; + // 24 clock ticks per quarter note (MIDI timing clock) + float samplesPerTimingClockTick = (engineGetSampleRate() * secondsPerQuarter) / 24.0f; + + if (clock % divisions[0] == 0) { + clockPulses[0].trigger(1e-3); + } + if (clock % divisions[1] == 0) { + clockPulses[1].trigger(1e-3); + } + + vst_timing_clock_samples += 1.0f; + if(vst_timing_clock_samples >= samplesPerTimingClockTick) + { + vst_timing_clock_samples -= samplesPerTimingClockTick; + + // if(++clock < 0) clock = 0 (may be optimized away by a C compiler) + union { + int s; + unsigned int u; + } uclock; + uclock.s = clock; + uclock.u++; + clock = (uclock.s < 0) ? 0 : uclock.s; + } + } // if bPlaying + } +#endif // USE_VST2 + void step() override { MidiMessage msg; while (midiInput.shift(&msg)) { @@ -148,6 +219,10 @@ struct MIDIToCVInterface : Module { } float deltaTime = engineGetSampleTime(); +#ifdef USE_VST2 + handleVSTClock(); +#endif // USE_VST2 + outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f; outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f; outputs[VELOCITY_OUTPUT].value = rescale(noteData[lastNote].velocity, 0, 127, 0.f, 10.f); @@ -224,6 +299,7 @@ struct MIDIToCVInterface : Module { } void processSystem(MidiMessage msg) { +#ifndef USE_VST2 switch (msg.channel()) { // Timing case 0x8: { @@ -255,6 +331,9 @@ struct MIDIToCVInterface : Module { } break; default: break; } +#else + (void)msg; +#endif // USE_VST2 } }; diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index 462bd0a3..76c747c7 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -16,7 +16,7 @@ /// limitations under the License. /// /// created: 25Jun2018 -/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018 +/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018 /// /// /// @@ -771,7 +771,32 @@ public: void handleUIParam(int uniqueParamId, float normValue) { if(NULL != _vstHostCallback) - _vstHostCallback(&_vstPlugin, audioMasterAutomate, uniqueParamId, 0/*value*/, NULL/*ptr*/, normValue/*opt*/); + (void)_vstHostCallback(&_vstPlugin, audioMasterAutomate, uniqueParamId, 0/*value*/, NULL/*ptr*/, normValue/*opt*/); + } + + void getTimingInfo(int *_retPlaying, float *_retBPM, float *_retSongPosPPQ) { + *_retPlaying = 0; + + if(NULL != _vstHostCallback) + { + VstIntPtr result = _vstHostCallback(&_vstPlugin, audioMasterGetTime, 0, 0/*value*/, NULL/*ptr*/, 0.0f/*opt*/); + if(NULL != result) + { + const struct VstTimeInfo *timeInfo = (const struct VstTimeInfo *)result; + + *_retPlaying = (0 != (timeInfo->flags & kVstTransportPlaying)); + + if(0 != (timeInfo->flags & kVstTempoValid)) + { + *_retBPM = float(timeInfo->tempo); + } + + if(0 != (timeInfo->flags & kVstPpqPosValid)) + { + *_retSongPosPPQ = timeInfo->ppqPos; + } + } + } } private: @@ -1587,6 +1612,11 @@ void vst2_handle_ui_param(int uniqueParamId, float normValue) { rack::global->vst2.wrapper->handleUIParam(uniqueParamId, normValue); } +void vst2_get_timing_info(int *_retPlaying, float *_retBPM, float *_retSongPosPPQ) { + // updates the requested fields when query was successful + rack::global->vst2.wrapper->getTimingInfo(_retPlaying, _retBPM, _retSongPosPPQ); +} + #ifdef VST2_REPARENT_WINDOW_HACK #ifdef YAC_WIN32 void vst2_maximize_reparented_window(void) { diff --git a/vst2_bin/CHANGELOG_VST.txt b/vst2_bin/CHANGELOG_VST.txt index 40198daf..790b27aa 100644 --- a/vst2_bin/CHANGELOG_VST.txt +++ b/vst2_bin/CHANGELOG_VST.txt @@ -1,3 +1,8 @@ +** July 6th, 2018 +- Core.MIDI-1: support clock and start, stop signals + (host must implement audioMasterGetTime(7) and support kVstTempoValid + kVstTransportPlaying) + + ** July 5th, 2018 - add module huaba.EQ3 - add module huaba.ABBus diff --git a/vst2_bin/README_vst2.txt b/vst2_bin/README_vst2.txt index 6d33c018..458c4963 100644 --- a/vst2_bin/README_vst2.txt +++ b/vst2_bin/README_vst2.txt @@ -13,7 +13,8 @@ This is a quick'n'dirty adaption of VCV Rack 0.6.1 for the VST2 format. + supports VST MIDI input + supports up to 8 audio outputs + supports up to 8 audio inputs -+ support VST program chunks (=> patches are saved with the DAW's project file or as .fxp files) ++ supports VST program chunks (=> patches are saved with the DAW's project file or as .fxp files) ++ supports VST host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) - does not support plugin DLLs due to VCV Rack's architecture which prevents this when it is run as a plugin itself - future releases will contain additional (open source) add-ons modules diff --git a/vst2_bin/log.txt b/vst2_bin/log.txt index 398b4358..62282693 100644 --- a/vst2_bin/log.txt +++ b/vst2_bin/log.txt @@ -1,77 +1,66 @@ [0.000 info src/main.cpp:63] VeeSeeVST Rack 0.6.1 -[0.000 info src/main.cpp:66] Global directory: f:\git\VeeSeeVSTRack\vst2_bin\/ -[0.000 info src/main.cpp:67] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ -[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin AS 0.6.1 -[0.002 info src/plugin.cpp:618] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 -[0.003 info src/plugin.cpp:618] vcvrack: Loaded static plugin Befaco 0.6.1 -[0.003 info src/plugin.cpp:618] vcvrack: Loaded static plugin Bogaudio 0.6.1 -[0.003 info src/plugin.cpp:618] vcvrack: Loaded static plugin cf 0.6.1 -[0.004 info src/plugin.cpp:618] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 -[0.004 info src/plugin.cpp:618] vcvrack: Loaded static plugin ESeries 0.6.1 -[0.005 info src/plugin.cpp:618] vcvrack: Loaded static plugin Fundamental 0.6.1 -[0.005 info src/plugin.cpp:618] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 -[0.006 info src/plugin.cpp:618] vcvrack: Loaded static plugin HetrickCV 0.6.1 -[0.006 info src/plugin.cpp:618] vcvrack: Loaded static plugin huaba 0.6.1 -[0.007 info src/plugin.cpp:618] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 -[0.007 info src/plugin.cpp:618] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 -[0.008 info src/plugin.cpp:618] vcvrack: Loaded static plugin ML_modules 0.6.1 -[0.008 info src/plugin.cpp:618] vcvrack: Loaded static plugin Qwelk 0.6.1 -[0.009 info src/plugin.cpp:618] vcvrack: Loaded static plugin SonusModular 0.6.1 -[0.009 info src/plugin.cpp:618] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 -[0.010 info src/plugin.cpp:618] vcvrack: Loaded static plugin SubmarineFree 0.6.1 -[0.010 info src/plugin.cpp:618] vcvrack: Loaded static plugin Template 0.6.1 -[0.011 info src/plugin.cpp:618] vcvrack: Loaded static plugin trowaSoft 0.6.1 -[0.011 info src/plugin.cpp:618] vcvrack: Loaded static plugin Valley 0.6.1 -[0.012 info src/plugin.cpp:618] vcvrack: Loaded static plugin VultModules 0.6.1 -[0.012 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg -[0.013 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg -[0.013 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg -[0.014 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg -[0.014 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg -[0.015 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg -[0.015 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg -[0.016 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg -[0.016 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg -[0.194 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf -[0.297 info src/app/RackWidget.cpp:192] Loading patch from string -[0.299 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg -[0.299 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg -[0.300 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg -[0.300 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf -[0.301 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg -[0.304 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg -[0.304 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg -[0.305 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg -[0.305 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg -[0.306 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg -[0.306 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg -[0.307 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg -[0.307 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg -[0.308 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg -[0.309 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg -[0.309 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg -[0.310 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg -[0.310 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg -[0.312 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg -[0.312 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg -[0.312 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg -[0.313 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg -[0.314 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg -[5.948 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/trigSeq.svg -[5.949 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/Fonts/Digital dream Fat.ttf -[5.949 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/Fonts/ZeroesThree-Regular.ttf -[5.950 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/Fonts/larabieb.ttf -[5.950 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/ComponentLibrary/TS_pad_btn_0.svg -[5.951 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/ComponentLibrary/TS_pad_btn_1.svg -[5.951 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewBlack.svg -[5.952 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundSmallBlackKnob.svg -[5.952 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/LEDButton.svg -[5.953 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/ComponentLibrary/TS_Port.svg -[5.953 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/ComponentLibrary/TS_pad_0.svg -[12.871 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/voltSeq.svg -[17.842 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/cvOSCcv.svg -[23.597 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/multiScope.svg -[23.597 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/ComponentLibrary/TS_RoundBlackKnob_20.svg -[28.057 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/multiOscillator.svg -[28.058 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/trowaSoft/res/ComponentLibrary/TS_RoundBlackEncoder_20.svg -[32.862 info src/app/RackWidget.cpp:154] Saving patch to string +[0.000 info src/main.cpp:66] Global directory: F:\git\VeeSeeVSTRack\vst2_bin\/ +[0.000 info src/main.cpp:67] Local directory: F:\git\VeeSeeVSTRack\vst2_bin\/ +[0.000 info src/plugin.cpp:618] vcvrack: Loaded static plugin AS 0.6.1 +[0.000 info src/plugin.cpp:618] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Befaco 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Bogaudio 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin cf 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin ESeries 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Fundamental 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin HetrickCV 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin huaba 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin ML_modules 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Qwelk 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin SonusModular 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin SubmarineFree 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Template 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin trowaSoft 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin Valley 0.6.1 +[0.001 info src/plugin.cpp:618] vcvrack: Loaded static plugin VultModules 0.6.1 +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg +[0.002 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg +[0.253 info src/window.cpp:703] Loaded font F:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf +[0.276 info src/app/RackWidget.cpp:154] Saving patch to string +[0.567 info src/app/RackWidget.cpp:154] Saving patch to string +[15.484 info src/app/RackWidget.cpp:154] Saving patch to string +[66.347 info src/app/RackWidget.cpp:192] Loading patch from string +[66.348 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg +[66.348 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg +[66.349 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg +[66.349 info src/window.cpp:703] Loaded font F:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf +[66.350 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg +[66.352 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg +[66.352 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg +[66.352 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg +[66.352 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg +[66.353 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg +[66.353 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg +[66.353 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg +[66.353 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg +[66.353 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg +[66.353 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg +[66.354 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg +[66.354 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg +[66.354 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg +[66.355 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg +[66.356 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg +[66.356 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg +[66.356 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg +[66.356 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg +[66.357 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDITriggerToCVInterface.svg +[66.358 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/SEQ3.svg +[66.358 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundBlackKnob.svg +[66.358 info src/window.cpp:754] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/LEDButton.svg diff --git a/vst2_bin/veeseevstrack_instr.dll__ b/vst2_bin/veeseevstrack_instr.dll__ index 82c4e7e3..dc0150b2 100644 Binary files a/vst2_bin/veeseevstrack_instr.dll__ and b/vst2_bin/veeseevstrack_instr.dll__ differ