@@ -9,8 +9,8 @@ | |||||
+ supports 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) | + supports VST host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) | ||||
+ supports VST parameters (send / recv) | + supports VST parameters (send / recv) | ||||
- 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 | |||||
+ supports dynamically loaded plugin DLLs | |||||
- the plugin.dll files are _not_ binary compatible with the VCV Rack plugins ! | |||||
Tested in | Tested in | ||||
- Eureka (my own work-in-progress VST host) | - Eureka (my own work-in-progress VST host) | ||||
@@ -23,7 +23,7 @@ Tested in | |||||
# Downloads | # Downloads | ||||
The current release can be found in the [vst2_bin/](vst2_bin/) folder. | The current release can be found in the [vst2_bin/](vst2_bin/) folder. | ||||
Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-12Jul2018.7z](dist/veeseevstrack_0_6_1_win64_bin-12Jul2018.7z) (64bit) | |||||
Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-13Jul2018.7z](dist/veeseevstrack_0_6_1_win64_bin-13Jul2018.7z) (64bit) | |||||
**WARNING: DON'T TRY TO USE THE INSTRUMENT AND EFFECT PLUGINS IN THE SAME PROJECT OR YOUR DAW WILL CRASH.** | **WARNING: DON'T TRY TO USE THE INSTRUMENT AND EFFECT PLUGINS IN THE SAME PROJECT OR YOUR DAW WILL CRASH.** | ||||
@@ -41,7 +41,27 @@ Here's a demo video of it: https://vimeo.com/277703414 | |||||
# Add-on modules | # Add-on modules | ||||
The following (478) add-on modules are statically linked with the VST plugin: | |||||
The binary distribution contains the following dynamically loaded add-on modules: | |||||
- dBiz.dBizBlank | |||||
- dBiz.Multiple | |||||
- dBiz.Contorno | |||||
- dBiz.Chord | |||||
- dBiz.Utility | |||||
- dBiz.Transpose | |||||
- dBiz.Bene | |||||
- dBiz.Bene2 | |||||
- dBiz.BenePads | |||||
- dBiz.SubMix | |||||
- dBiz.Remix | |||||
- dBiz.PerfMixer | |||||
- dBiz.VCA530 | |||||
- dBiz.Verbo | |||||
- dBiz.DVCO | |||||
- dBiz.DAOSC | |||||
- Template_shared.MyModule | |||||
The following (462) add-on modules are statically linked with the VST plugin: | |||||
- Alikins.IdleSwitch | - Alikins.IdleSwitch | ||||
- Alikins.MomentaryOnButtons | - Alikins.MomentaryOnButtons | ||||
- Alikins.BigMuteButton | - Alikins.BigMuteButton | ||||
@@ -204,22 +224,6 @@ The following (478) add-on modules are statically linked with the VST plugin: | |||||
- cf.PATCH | - cf.PATCH | ||||
- cf.LEDS | - cf.LEDS | ||||
- cf.DAVE | - cf.DAVE | ||||
- dBiz.dBizBlank | |||||
- dBiz.Multiple | |||||
- dBiz.Contorno | |||||
- dBiz.Chord | |||||
- dBiz.Utility | |||||
- dBiz.Transpose | |||||
- dBiz.Bene | |||||
- dBiz.Bene2 | |||||
- dBiz.BenePads | |||||
- dBiz.SubMix | |||||
- dBiz.Remix | |||||
- dBiz.PerfMixer | |||||
- dBiz.VCA530 | |||||
- dBiz.Verbo | |||||
- dBiz.DVCO | |||||
- dBiz.DAOSC | |||||
- DHE-Modules.BoosterStage | - DHE-Modules.BoosterStage | ||||
- DHE-Modules.Cubic | - DHE-Modules.Cubic | ||||
- DHE-Modules.Hostage | - DHE-Modules.Hostage | ||||
@@ -5,8 +5,8 @@ | |||||
#include "ui.hpp" | #include "ui.hpp" | ||||
static const float SVG_DPI = 75.0; | |||||
static const float MM_PER_IN = 25.4; | |||||
static const float SVG_DPI = 75.0f; | |||||
static const float MM_PER_IN = 25.4f; | |||||
namespace rack { | namespace rack { | ||||
@@ -29,8 +29,8 @@ static const NVGcolor COLOR_DARK_PANEL = nvgRGB(0x17, 0x17, 0x17); | |||||
struct RoundKnob : SVGKnob { | struct RoundKnob : SVGKnob { | ||||
RoundKnob() { | RoundKnob() { | ||||
minAngle = -0.83*M_PI; | |||||
maxAngle = 0.83*M_PI; | |||||
minAngle = float(-0.83*M_PI); | |||||
maxAngle = float(0.83*M_PI); | |||||
} | } | ||||
}; | }; | ||||
@@ -68,8 +68,8 @@ struct RoundBlackSnapKnob : RoundBlackKnob { | |||||
struct Davies1900hKnob : SVGKnob { | struct Davies1900hKnob : SVGKnob { | ||||
Davies1900hKnob() { | Davies1900hKnob() { | ||||
minAngle = -0.83*M_PI; | |||||
maxAngle = 0.83*M_PI; | |||||
minAngle = float(-0.83*M_PI); | |||||
maxAngle = float(0.83*M_PI); | |||||
} | } | ||||
}; | }; | ||||
@@ -112,8 +112,8 @@ struct Davies1900hLargeRedKnob : Davies1900hKnob { | |||||
struct Rogan : SVGKnob { | struct Rogan : SVGKnob { | ||||
Rogan() { | Rogan() { | ||||
minAngle = -0.83*M_PI; | |||||
maxAngle = 0.83*M_PI; | |||||
minAngle = float(-0.83*M_PI); | |||||
maxAngle = float(0.83*M_PI); | |||||
} | } | ||||
}; | }; | ||||
@@ -282,8 +282,8 @@ struct Rogan1PWhite : Rogan { | |||||
struct SynthTechAlco : SVGKnob { | struct SynthTechAlco : SVGKnob { | ||||
SynthTechAlco() { | SynthTechAlco() { | ||||
minAngle = -0.82*M_PI; | |||||
maxAngle = 0.82*M_PI; | |||||
minAngle = float(-0.82*M_PI); | |||||
maxAngle = float(0.82*M_PI); | |||||
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/SynthTechAlco.svg"))); | setSVG(SVG::load(assetGlobal("res/ComponentLibrary/SynthTechAlco.svg"))); | ||||
SVGWidget *cap = new SVGWidget(); | SVGWidget *cap = new SVGWidget(); | ||||
cap->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/SynthTechAlco_cap.svg"))); | cap->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/SynthTechAlco_cap.svg"))); | ||||
@@ -293,16 +293,16 @@ struct SynthTechAlco : SVGKnob { | |||||
struct Trimpot : SVGKnob { | struct Trimpot : SVGKnob { | ||||
Trimpot() { | Trimpot() { | ||||
minAngle = -0.75*M_PI; | |||||
maxAngle = 0.75*M_PI; | |||||
minAngle = float(-0.75*M_PI); | |||||
maxAngle = float(0.75*M_PI); | |||||
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/Trimpot.svg"))); | setSVG(SVG::load(assetGlobal("res/ComponentLibrary/Trimpot.svg"))); | ||||
} | } | ||||
}; | }; | ||||
struct BefacoBigKnob : SVGKnob { | struct BefacoBigKnob : SVGKnob { | ||||
BefacoBigKnob() { | BefacoBigKnob() { | ||||
minAngle = -0.75*M_PI; | |||||
maxAngle = 0.75*M_PI; | |||||
minAngle = float(-0.75*M_PI); | |||||
maxAngle = float(0.75*M_PI); | |||||
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/BefacoBigKnob.svg"))); | setSVG(SVG::load(assetGlobal("res/ComponentLibrary/BefacoBigKnob.svg"))); | ||||
} | } | ||||
}; | }; | ||||
@@ -316,8 +316,8 @@ struct BefacoBigSnapKnob : BefacoBigKnob { | |||||
struct BefacoTinyKnob : SVGKnob { | struct BefacoTinyKnob : SVGKnob { | ||||
BefacoTinyKnob() { | BefacoTinyKnob() { | ||||
minAngle = -0.75*M_PI; | |||||
maxAngle = 0.75*M_PI; | |||||
minAngle = float(-0.75*M_PI); | |||||
maxAngle = float(0.75*M_PI); | |||||
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/BefacoTinyKnob.svg"))); | setSVG(SVG::load(assetGlobal("res/ComponentLibrary/BefacoTinyKnob.svg"))); | ||||
} | } | ||||
}; | }; | ||||
@@ -335,8 +335,8 @@ struct BefacoSlidePot : SVGSlider { | |||||
struct LEDSlider : SVGSlider { | struct LEDSlider : SVGSlider { | ||||
LEDSlider() { | LEDSlider() { | ||||
maxHandlePos = mm2px(Vec(0.738, 0.738).plus(Vec(2, 0))); | |||||
minHandlePos = mm2px(Vec(0.738, 22.078).plus(Vec(2, 0))); | |||||
maxHandlePos = mm2px(Vec(0.738f, 0.738f).plus(Vec(2, 0))); | |||||
minHandlePos = mm2px(Vec(0.738f, 22.078f).plus(Vec(2, 0))); | |||||
setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/LEDSlider.svg")), NULL); | setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/LEDSlider.svg")), NULL); | ||||
} | } | ||||
}; | }; | ||||
@@ -458,7 +458,7 @@ struct RGBLight : ModuleLightWidget { | |||||
template <typename BASE> | template <typename BASE> | ||||
struct LargeLight : BASE { | struct LargeLight : BASE { | ||||
LargeLight() { | LargeLight() { | ||||
this->box.size = mm2px(Vec(5.179, 5.179)); | |||||
this->box.size = mm2px(Vec(5.179f, 5.179f)); | |||||
} | } | ||||
}; | }; | ||||
@@ -466,7 +466,7 @@ struct LargeLight : BASE { | |||||
template <typename BASE> | template <typename BASE> | ||||
struct MediumLight : BASE { | struct MediumLight : BASE { | ||||
MediumLight() { | MediumLight() { | ||||
this->box.size = mm2px(Vec(3.176, 3.176)); | |||||
this->box.size = mm2px(Vec(3.176f, 3.176f)); | |||||
} | } | ||||
}; | }; | ||||
@@ -474,7 +474,7 @@ struct MediumLight : BASE { | |||||
template <typename BASE> | template <typename BASE> | ||||
struct SmallLight : BASE { | struct SmallLight : BASE { | ||||
SmallLight() { | SmallLight() { | ||||
this->box.size = mm2px(Vec(2.176, 2.176)); | |||||
this->box.size = mm2px(Vec(2.176f, 2.176f)); | |||||
} | } | ||||
}; | }; | ||||
@@ -491,7 +491,7 @@ template <typename BASE> | |||||
struct LEDBezelLight : BASE { | struct LEDBezelLight : BASE { | ||||
LEDBezelLight() { | LEDBezelLight() { | ||||
this->bgColor = COLOR_BLACK_TRANSPARENT; | this->bgColor = COLOR_BLACK_TRANSPARENT; | ||||
this->box.size = mm2px(Vec(6.0, 6.0)); | |||||
this->box.size = mm2px(Vec(6.0f, 6.0f)); | |||||
} | } | ||||
}; | }; | ||||
@@ -87,6 +87,11 @@ struct GlobalUI { | |||||
bool bLoadVSTUniqueParamBaseId; // temp. false while cloning ModuleWidget | bool bLoadVSTUniqueParamBaseId; // temp. false while cloning ModuleWidget | ||||
} app; | } app; | ||||
struct { | |||||
int bnd_icon_image; | |||||
int bnd_font; | |||||
} blendish; | |||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
struct { | struct { | ||||
volatile int b_close_window; | volatile int b_close_window; | ||||
@@ -136,6 +141,9 @@ struct GlobalUI { | |||||
app.bLoadVSTUniqueParamBaseId = true; | app.bLoadVSTUniqueParamBaseId = true; | ||||
blendish.bnd_icon_image = -1; | |||||
blendish.bnd_font = -1; | |||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
vst2.b_close_window = 0; | vst2.b_close_window = 0; | ||||
vst2.b_hide_window = 0; | vst2.b_hide_window = 0; | ||||
@@ -1,9 +1,110 @@ | |||||
#pragma once | #pragma once | ||||
#include "global_pre.hpp" | |||||
#include <string> | #include <string> | ||||
#include <stdio.h> // debug | |||||
#include <list> | #include <list> | ||||
#include "tags.hpp" | #include "tags.hpp" | ||||
#define RACK_PLUGIN_INIT_ID_INTERNAL p->slug = TOSTRING(SLUG); p->version = TOSTRING(VERSION) | |||||
#ifdef USE_VST2 | |||||
namespace rack { | |||||
struct Plugin; | |||||
} | |||||
typedef void (*vst2_handle_ui_param_fxn_t) (int uniqueParamId, float normValue); | |||||
typedef void (*rack_set_tls_globals_fxn_t) (rack::Plugin *p); | |||||
#ifdef RACK_HOST | |||||
// Rack host build: | |||||
extern void vst2_handle_ui_param (int uniqueParamId, float normValue); | |||||
#define RACK_PLUGIN_DECLARE(pluginname) | |||||
#define RACK_PLUGIN_INIT(pluginname) extern "C" void init_plugin_##pluginname##(rack::Plugin *p) | |||||
#define RACK_PLUGIN_INIT_ID() RACK_PLUGIN_INIT_ID_INTERNAL | |||||
#else | |||||
// Plugin build: | |||||
#ifdef _MSC_VER | |||||
#ifdef RACK_PLUGIN_SHARED | |||||
#define RACK_PLUGIN_EXPORT extern "C" __declspec(dllexport) | |||||
#else | |||||
#define RACK_PLUGIN_EXPORT extern "C" | |||||
#endif // RACK_PLUGIN_SHARED | |||||
#define RACK_TLS __declspec(thread) | |||||
#else | |||||
#define RACK_PLUGIN_EXPORT extern "C" | |||||
#define RACK_TLS __thread | |||||
#endif // _MSC_VER | |||||
extern vst2_handle_ui_param_fxn_t vst2_handle_ui_param; | |||||
#ifndef RACK_PLUGIN_SHARED_LIB_BUILD | |||||
#ifdef RACK_PLUGIN_SHARED | |||||
// Dynamically loaded plugin build | |||||
#define RACK_PLUGIN_DECLARE(pluginname) namespace rack { extern RACK_TLS Plugin *plugin; } extern void __rack_unused_symbol(void) | |||||
#ifdef ARCH_WIN | |||||
#define JSON_SEED_INIT_EXTERNAL extern "C" extern long seed_initialized; | |||||
#else | |||||
#define JSON_SEED_INIT_EXTERNAL extern "C" extern volatile char seed_initialized; | |||||
#endif | |||||
#define RACK_PLUGIN_INIT(pluginname) \ | |||||
vst2_handle_ui_param_fxn_t vst2_handle_ui_param; \ | |||||
JSON_SEED_INIT_EXTERNAL \ | |||||
extern "C" extern volatile uint32_t hashtable_seed; \ | |||||
namespace rack { \ | |||||
RACK_TLS Plugin *plugin; \ | |||||
RACK_TLS Global *global; \ | |||||
RACK_TLS GlobalUI *global_ui; \ | |||||
static void loc_set_tls_globals(rack::Plugin *p) { \ | |||||
plugin = p; \ | |||||
global = plugin->global; \ | |||||
global_ui = plugin->global_ui; \ | |||||
hashtable_seed = p->json.hashtable_seed; \ | |||||
seed_initialized = p->json.seed_initialized; \ | |||||
} \ | |||||
} \ | |||||
RACK_PLUGIN_EXPORT void init_plugin(rack::Plugin *p) | |||||
#define RACK_PLUGIN_INIT_ID() \ | |||||
rack::plugin = p; \ | |||||
rack::plugin->set_tls_globals_fxn = &rack::loc_set_tls_globals; \ | |||||
vst2_handle_ui_param = p->vst2_handle_ui_param_fxn; \ | |||||
rack::global = p->global; \ | |||||
rack::global_ui = p->global_ui; \ | |||||
RACK_PLUGIN_INIT_ID_INTERNAL | |||||
#else | |||||
// Statically linked plugin build | |||||
#define RACK_PLUGIN_DECLARE(pluginname) | |||||
#define RACK_PLUGIN_INIT(pluginname) extern "C" void init_plugin_##pluginname##(rack::Plugin *p) | |||||
#define RACK_PLUGIN_INIT_ID() RACK_PLUGIN_INIT_ID_INTERNAL | |||||
#endif // RACK_PLUGIN_SHARED | |||||
#endif // RACK_PLUGIN_SHARED_LIB_BUILD | |||||
#endif // RACK_HOST | |||||
#else | |||||
#define RACK_PLUGIN_DECLARE(pluginname) extern Plugin *plugin | |||||
#define RACK_PLUGIN_INIT(pluginname) extern "C" RACK_PLUGIN_EXPORT void init(rack::Plugin *p) | |||||
#define RACK_PLUGIN_INIT_ID() plugin = p; RACK_PLUGIN_INIT_ID_INTERNAL | |||||
#endif // USE_VST2 | |||||
#define RACK_PLUGIN_INIT_WEBSITE(url) p->website = url | |||||
#define RACK_PLUGIN_INIT_MANUAL(url) p->manual = url | |||||
#define RACK_PLUGIN_MODEL_DECLARE(pluginname, modelname) extern Model *create_model_##pluginname##_##modelname##(void) | |||||
#define RACK_PLUGIN_MODEL_INIT(pluginname, modelname) Model *create_model_##pluginname##_##modelname##(void) | |||||
#define RACK_PLUGIN_MODEL_ADD(pluginname, modelname) p->addModel(create_model_##pluginname##_##modelname##()) | |||||
namespace rack { | namespace rack { | ||||
@@ -36,6 +137,34 @@ struct Plugin { | |||||
std::string website; | std::string website; | ||||
std::string manual; | std::string manual; | ||||
#ifdef USE_VST2 | |||||
// | |||||
// Set by Rack host (before init_plugin()): | |||||
// | |||||
vst2_handle_ui_param_fxn_t vst2_handle_ui_param_fxn = NULL; | |||||
Global *global = NULL; | |||||
GlobalUI *global_ui = NULL; | |||||
// Set by Rack host immediately before set_tls_globals_fxn is called: | |||||
// (note) must be copied by the plugin or json import won't function properly | |||||
struct { | |||||
uint32_t hashtable_seed; | |||||
#ifdef ARCH_WIN | |||||
long seed_initialized; | |||||
#else | |||||
char seed_initialized; | |||||
#endif | |||||
} json; | |||||
// | |||||
// Set by plugin: | |||||
// - in init_plugin() | |||||
// - called by Rack host in audio thread | |||||
// - NULL if this is a statically linked add-on | |||||
// | |||||
rack_set_tls_globals_fxn_t set_tls_globals_fxn = NULL; | |||||
#endif // USE_VST2 | |||||
virtual ~Plugin(); | virtual ~Plugin(); | ||||
void addModel(Model *model); | void addModel(Model *model); | ||||
}; | }; | ||||
@@ -74,9 +203,13 @@ struct Model { | |||||
return module; | return module; | ||||
} | } | ||||
ModuleWidget *createModuleWidget() override { | ModuleWidget *createModuleWidget() override { | ||||
printf("xxx createModuleWidget: ENTER\n"); | |||||
TModule *module = new TModule(); | TModule *module = new TModule(); | ||||
printf("xxx createModuleWidget: module=%p\n", module); | |||||
TModuleWidget *moduleWidget = new TModuleWidget(module); | TModuleWidget *moduleWidget = new TModuleWidget(module); | ||||
printf("xxx createModuleWidget: moduleWidget=%p\n", moduleWidget); | |||||
moduleWidget->model = this; | moduleWidget->model = this; | ||||
printf("xxx createModuleWidget: LEAVE\n"); | |||||
return moduleWidget; | return moduleWidget; | ||||
} | } | ||||
ModuleWidget *createModuleWidgetNull() override { | ModuleWidget *createModuleWidgetNull() override { | ||||
@@ -118,43 +251,6 @@ extern std::string gToken; | |||||
} // namespace rack | } // namespace rack | ||||
//////////////////// | |||||
// Implemented by plugin | |||||
//////////////////// | |||||
/** Called once to initialize and return the Plugin instance. | |||||
You must implement this in your plugin | |||||
*/ | |||||
#ifdef _MSC_VER | |||||
// (note) turns out that VCV plugins don't work when the VCV engine itself is a DLL | |||||
// #define RACK_PLUGIN_EXPORT __declspec(dllexport) | |||||
#define RACK_PLUGIN_EXPORT | |||||
#else | |||||
#define RACK_PLUGIN_EXPORT | |||||
#endif | |||||
#define RACK_PLUGIN_INIT_ID_INTERNAL p->slug = TOSTRING(SLUG); p->version = TOSTRING(VERSION) | |||||
#ifdef USE_VST2 | |||||
#define RACK_PLUGIN_DECLARE(pluginname) | |||||
#define RACK_PLUGIN_INIT(pluginname) extern "C" void init_plugin_##pluginname##(rack::Plugin *p) | |||||
#define RACK_PLUGIN_INIT_ID() RACK_PLUGIN_INIT_ID_INTERNAL | |||||
#else | |||||
#define RACK_PLUGIN_DECLARE(pluginname) extern Plugin *plugin | |||||
#define RACK_PLUGIN_INIT(pluginname) extern "C" RACK_PLUGIN_EXPORT void init(rack::Plugin *p) | |||||
#define RACK_PLUGIN_INIT_ID() plugin = p; RACK_PLUGIN_INIT_ID_INTERNAL | |||||
#endif // USE_VST2 | |||||
#define RACK_PLUGIN_INIT_WEBSITE(url) p->website = url | |||||
#define RACK_PLUGIN_INIT_MANUAL(url) p->manual = url | |||||
#define RACK_PLUGIN_MODEL_DECLARE(pluginname, modelname) extern Model *create_model_##pluginname##_##modelname##(void) | |||||
#define RACK_PLUGIN_MODEL_INIT(pluginname, modelname) Model *create_model_##pluginname##_##modelname##(void) | |||||
#define RACK_PLUGIN_MODEL_ADD(pluginname, modelname) p->addModel(create_model_##pluginname##_##modelname##()) | |||||
// Access helpers for global UI vars | // Access helpers for global UI vars | ||||
// | // | ||||
@@ -263,12 +263,4 @@ struct Scene : OpaqueWidget { | |||||
void step() override; | void step() override; | ||||
}; | }; | ||||
//////////////////// | |||||
// globals | |||||
//////////////////// | |||||
extern Scene *gScene; | |||||
} // namespace rack | } // namespace rack |
@@ -132,7 +132,7 @@ inline float crossfade(float a, float b, float frac) { | |||||
Assumes that the array at `p` is of length at least floor(x)+1. | Assumes that the array at `p` is of length at least floor(x)+1. | ||||
*/ | */ | ||||
inline float interpolateLinear(const float *p, float x) { | inline float interpolateLinear(const float *p, float x) { | ||||
int xi = x; | |||||
int xi = int(x); | |||||
float xf = x - xi; | float xf = x - xi; | ||||
return crossfade(p[xi], p[xi+1], xf); | return crossfade(p[xi], p[xi+1], xf); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
LIB_OBJ= \ | |||||
COMMON_OBJ= \ | |||||
dep/jpommier-pffft-29e4f76ac53b/fftpack.o \ | dep/jpommier-pffft-29e4f76ac53b/fftpack.o \ | ||||
dep/jpommier-pffft-29e4f76ac53b/pffft.o \ | dep/jpommier-pffft-29e4f76ac53b/pffft.o \ | ||||
dep/nanovg/src/nanovg.o \ | dep/nanovg/src/nanovg.o \ | ||||
@@ -38,14 +38,6 @@ LIB_OBJ= \ | |||||
src/app/WireWidget.o \ | src/app/WireWidget.o \ | ||||
src/asset.o \ | src/asset.o \ | ||||
src/audio.o \ | src/audio.o \ | ||||
src/Core/AudioInterface.o \ | |||||
src/Core/Blank.o \ | |||||
src/Core/Core.o \ | |||||
src/Core/MIDICCToCVInterface.o \ | |||||
src/Core/MIDIToCVInterface.o \ | |||||
src/Core/MIDITriggerToCVInterface.o \ | |||||
src/Core/Notes.o \ | |||||
src/Core/QuadMIDIToCVInterface.o \ | |||||
src/dsp/minblep.o \ | src/dsp/minblep.o \ | ||||
src/engine.o \ | src/engine.o \ | ||||
src/keyboard.o \ | src/keyboard.o \ | ||||
@@ -91,6 +83,26 @@ LIB_OBJ= \ | |||||
src/window.o \ | src/window.o \ | ||||
src/vstmidi.o | src/vstmidi.o | ||||
HOST_OBJ= \ | |||||
src/Core/AudioInterface.o \ | |||||
src/Core/Blank.o \ | |||||
src/Core/Core.o \ | |||||
src/Core/MIDICCToCVInterface.o \ | |||||
src/Core/MIDIToCVInterface.o \ | |||||
src/Core/MIDITriggerToCVInterface.o \ | |||||
src/Core/Notes.o \ | |||||
src/Core/QuadMIDIToCVInterface.o | |||||
LIB_OBJ= \ | |||||
$(COMMON_OBJ) \ | |||||
$(HOST_OBJ) | |||||
LIB_OBJ_WIN= \ | |||||
src/util/dirent_win32/dirent.o | |||||
SHARED_LIB_OBJ= \ | |||||
$(COMMON_OBJ) | |||||
MAIN_OBJ= \ | MAIN_OBJ= \ | ||||
src/vst2_main.o \ | src/vst2_main.o \ | ||||
src/main.o | src/main.o | ||||
@@ -12,6 +12,10 @@ bin: vst | |||||
lib: | lib: | ||||
make -f makefile_lib.msvc bin -j $(NUM_JOBS) | make -f makefile_lib.msvc bin -j $(NUM_JOBS) | ||||
.PHONY: | |||||
shared_lib: | |||||
make -f makefile_shared_lib.msvc bin -j $(NUM_JOBS) && mv Rack_shared.lib plugins/ | |||||
.PHONY: | .PHONY: | ||||
vst: lib | vst: lib | ||||
rm -f src/vst2_main.o | rm -f src/vst2_main.o | ||||
@@ -26,6 +30,7 @@ vst: lib | |||||
clean: | clean: | ||||
make -f makefile_lib.msvc clean | make -f makefile_lib.msvc clean | ||||
make -f makefile_shared_lib.msvc clean | |||||
make -f makefile_vst_instr.msvc clean | make -f makefile_vst_instr.msvc clean | ||||
make -f makefile_vst_effect.msvc clean | make -f makefile_vst_effect.msvc clean | ||||
@@ -22,6 +22,6 @@ PLAF_OBJ= | |||||
include make.objects | include make.objects | ||||
ALL_OBJ=$(LIB_OBJ) | |||||
ALL_OBJ=$(LIB_OBJ) $(LIB_OBJ_WIN) | |||||
include dep/yac/staticlib_msvc.mk | include dep/yac/staticlib_msvc.mk |
@@ -0,0 +1,28 @@ | |||||
# | |||||
# Makefile for VCV rack lib + Microsoft Visual C++ 2003 / 2005 / 2008 / 2017 ToolKit | |||||
# (for linking with dynamically loaded plugins) | |||||
# | |||||
# | |||||
include dep/yac/install_msvc.mk | |||||
TARGET_BASENAME=Rack_shared | |||||
EXTRAFLAGS= -DVERSION=0.6.1 -DARCH_WIN -D_USE_MATH_DEFINES -DRACK_PLUGIN -DRACK_PLUGIN_SHARED -DUSE_VST2 -DVST2_REPARENT_WINDOW_HACK -Iinclude/ -Idep/include | |||||
EXTRAFLAGS+= -DRACK_PLUGIN_SHARED_LIB_BUILD | |||||
ifeq ($(BUILD_64),y) | |||||
EXTRALIBS= -LIBPATH:dep/lib/msvc/x64 | |||||
else | |||||
EXTRALIBS= -LIBPATH:dep/lib/msvc/x86 | |||||
endif | |||||
EXTRALIBS+= jansson.lib glew.lib glfw.lib gdi32.lib opengl32.lib gdi32.lib user32.lib kernel32.lib Comdlg32.lib Shell32.lib ws2_32.lib winmm.lib | |||||
PLAF_OBJ= | |||||
include make.objects | |||||
ALL_OBJ=$(SHARED_LIB_OBJ) $(LIB_OBJ_WIN) | |||||
include dep/yac/staticlib_msvc.mk |
@@ -0,0 +1,4 @@ | |||||
#ifdef ARCH_WIN | |||||
include ../../../../dep/yac/sharedlib_msvc.mk | |||||
#endif |
@@ -0,0 +1,19 @@ | |||||
# called from plugin directory (plugins/community/repos/<pluginname>/) | |||||
# | |||||
#include ../../../../arch.mk | |||||
#ifdef ARCH_WIN | |||||
include ../../../../dep/yac/install_msvc.mk | |||||
#endif | |||||
TARGET_BASENAME=$(SLUG) | |||||
EXTRAFLAGS+= -DVERSION=0.6.1 -D_USE_MATH_DEFINES -DUSE_VST2 -DRACK_PLUGIN -DRACK_PLUGIN_SHARED -DSLUG=$(SLUG) -I../../../../include/ -I../../../../dep/include -Idep/include | |||||
EXTRAFLAGS+= | |||||
EXTRALIBS+= ../../../Rack_shared.lib | |||||
PLAF_OBJ+= | |||||
#ifdef ARCH_WIN | |||||
include ../../../build_plugin_msvc_pre.mk | |||||
#endif |
@@ -0,0 +1,121 @@ | |||||
Creative Commons Legal Code | |||||
CC0 1.0 Universal | |||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE | |||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN | |||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS | |||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES | |||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS | |||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM | |||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED | |||||
HEREUNDER. | |||||
Statement of Purpose | |||||
The laws of most jurisdictions throughout the world automatically confer | |||||
exclusive Copyright and Related Rights (defined below) upon the creator | |||||
and subsequent owner(s) (each and all, an "owner") of an original work of | |||||
authorship and/or a database (each, a "Work"). | |||||
Certain owners wish to permanently relinquish those rights to a Work for | |||||
the purpose of contributing to a commons of creative, cultural and | |||||
scientific works ("Commons") that the public can reliably and without fear | |||||
of later claims of infringement build upon, modify, incorporate in other | |||||
works, reuse and redistribute as freely as possible in any form whatsoever | |||||
and for any purposes, including without limitation commercial purposes. | |||||
These owners may contribute to the Commons to promote the ideal of a free | |||||
culture and the further production of creative, cultural and scientific | |||||
works, or to gain reputation or greater distribution for their Work in | |||||
part through the use and efforts of others. | |||||
For these and/or other purposes and motivations, and without any | |||||
expectation of additional consideration or compensation, the person | |||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she | |||||
is an owner of Copyright and Related Rights in the Work, voluntarily | |||||
elects to apply CC0 to the Work and publicly distribute the Work under its | |||||
terms, with knowledge of his or her Copyright and Related Rights in the | |||||
Work and the meaning and intended legal effect of CC0 on those rights. | |||||
1. Copyright and Related Rights. A Work made available under CC0 may be | |||||
protected by copyright and related or neighboring rights ("Copyright and | |||||
Related Rights"). Copyright and Related Rights include, but are not | |||||
limited to, the following: | |||||
i. the right to reproduce, adapt, distribute, perform, display, | |||||
communicate, and translate a Work; | |||||
ii. moral rights retained by the original author(s) and/or performer(s); | |||||
iii. publicity and privacy rights pertaining to a person's image or | |||||
likeness depicted in a Work; | |||||
iv. rights protecting against unfair competition in regards to a Work, | |||||
subject to the limitations in paragraph 4(a), below; | |||||
v. rights protecting the extraction, dissemination, use and reuse of data | |||||
in a Work; | |||||
vi. database rights (such as those arising under Directive 96/9/EC of the | |||||
European Parliament and of the Council of 11 March 1996 on the legal | |||||
protection of databases, and under any national implementation | |||||
thereof, including any amended or successor version of such | |||||
directive); and | |||||
vii. other similar, equivalent or corresponding rights throughout the | |||||
world based on applicable law or treaty, and any national | |||||
implementations thereof. | |||||
2. Waiver. To the greatest extent permitted by, but not in contravention | |||||
of, applicable law, Affirmer hereby overtly, fully, permanently, | |||||
irrevocably and unconditionally waives, abandons, and surrenders all of | |||||
Affirmer's Copyright and Related Rights and associated claims and causes | |||||
of action, whether now known or unknown (including existing as well as | |||||
future claims and causes of action), in the Work (i) in all territories | |||||
worldwide, (ii) for the maximum duration provided by applicable law or | |||||
treaty (including future time extensions), (iii) in any current or future | |||||
medium and for any number of copies, and (iv) for any purpose whatsoever, | |||||
including without limitation commercial, advertising or promotional | |||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each | |||||
member of the public at large and to the detriment of Affirmer's heirs and | |||||
successors, fully intending that such Waiver shall not be subject to | |||||
revocation, rescission, cancellation, termination, or any other legal or | |||||
equitable action to disrupt the quiet enjoyment of the Work by the public | |||||
as contemplated by Affirmer's express Statement of Purpose. | |||||
3. Public License Fallback. Should any part of the Waiver for any reason | |||||
be judged legally invalid or ineffective under applicable law, then the | |||||
Waiver shall be preserved to the maximum extent permitted taking into | |||||
account Affirmer's express Statement of Purpose. In addition, to the | |||||
extent the Waiver is so judged Affirmer hereby grants to each affected | |||||
person a royalty-free, non transferable, non sublicensable, non exclusive, | |||||
irrevocable and unconditional license to exercise Affirmer's Copyright and | |||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the | |||||
maximum duration provided by applicable law or treaty (including future | |||||
time extensions), (iii) in any current or future medium and for any number | |||||
of copies, and (iv) for any purpose whatsoever, including without | |||||
limitation commercial, advertising or promotional purposes (the | |||||
"License"). The License shall be deemed effective as of the date CC0 was | |||||
applied by Affirmer to the Work. Should any part of the License for any | |||||
reason be judged legally invalid or ineffective under applicable law, such | |||||
partial invalidity or ineffectiveness shall not invalidate the remainder | |||||
of the License, and in such case Affirmer hereby affirms that he or she | |||||
will not (i) exercise any of his or her remaining Copyright and Related | |||||
Rights in the Work or (ii) assert any associated claims and causes of | |||||
action with respect to the Work, in either case contrary to Affirmer's | |||||
express Statement of Purpose. | |||||
4. Limitations and Disclaimers. | |||||
a. No trademark or patent rights held by Affirmer are waived, abandoned, | |||||
surrendered, licensed or otherwise affected by this document. | |||||
b. Affirmer offers the Work as-is and makes no representations or | |||||
warranties of any kind concerning the Work, express, implied, | |||||
statutory or otherwise, including without limitation warranties of | |||||
title, merchantability, fitness for a particular purpose, non | |||||
infringement, or the absence of latent or other defects, accuracy, or | |||||
the present or absence of errors, whether or not discoverable, all to | |||||
the greatest extent permissible under applicable law. | |||||
c. Affirmer disclaims responsibility for clearing rights of other persons | |||||
that may apply to the Work or any use thereof, including without | |||||
limitation any person's Copyright and Related Rights in the Work. | |||||
Further, Affirmer disclaims responsibility for obtaining any necessary | |||||
consents, permissions or other rights required for any use of the | |||||
Work. | |||||
d. Affirmer understands and acknowledges that Creative Commons is not a | |||||
party to this document and has no duty or obligation with respect to | |||||
this CC0 or use of the Work. |
@@ -0,0 +1,13 @@ | |||||
# VCV Template plugin | |||||
The VCV Template plugin is a starting point for developing your own plugins for VCV Rack. | |||||
It implements a simple sine VCO, demonstrating inputs, outputs, parameters, and other concepts. | |||||
See https://vcvrack.com/manual/PluginDevelopmentTutorial.html for a development tutorial. | |||||
## Contributing | |||||
I welcome Issues and Pull Requests to this repository if you have suggestions for improvement. | |||||
This template is released into the public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)). |
@@ -0,0 +1,3 @@ | |||||
ALL_OBJ= \ | |||||
src/MyModule.o \ | |||||
src/Template.o |
@@ -0,0 +1,7 @@ | |||||
SLUG=Template_shared | |||||
include ../../../build_shared_plugin_pre.mk | |||||
include make.objects | |||||
include ../../../build_shared_plugin_post.mk |
@@ -0,0 +1,243 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<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" | |||||
width="90" | |||||
height="380" | |||||
viewBox="0 0 23.812501 100.54167" | |||||
version="1.1" | |||||
id="svg8" | |||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||||
sodipodi:docname="MyModule.svg"> | |||||
<defs | |||||
id="defs2" /> | |||||
<sodipodi:namedview | |||||
id="base" | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1.0" | |||||
inkscape:pageopacity="0.0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:zoom="1.4" | |||||
inkscape:cx="188.48062" | |||||
inkscape:cy="170.63765" | |||||
inkscape:document-units="mm" | |||||
inkscape:current-layer="layer1" | |||||
showgrid="false" | |||||
units="px" | |||||
inkscape:snap-bbox="true" | |||||
inkscape:snap-page="true" | |||||
inkscape:bbox-nodes="true" | |||||
inkscape:snap-bbox-edge-midpoints="true" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" /> | |||||
<metadata | |||||
id="metadata5"> | |||||
<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></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<g | |||||
inkscape:label="Layer 1" | |||||
inkscape:groupmode="layer" | |||||
id="layer1" | |||||
transform="translate(0,-196.45832)"> | |||||
<path | |||||
style="opacity:1;vector-effect:none;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.48607069;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||||
d="M 0,196.45831 H 23.8125 V 296.99999 H 0 Z" | |||||
id="rect817" | |||||
inkscape:connector-curvature="0" /> | |||||
<g | |||||
aria-label="My Module" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text925" | |||||
transform="translate(0,-1.0583333)"> | |||||
<path | |||||
d="m 5.3546533,207.98659 v -2.76296 H 5.0597311 l -0.8770056,1.95968 -0.9002889,-1.95968 H 2.9875144 v 2.76296 h 0.2949222 v -2.09938 l 0.76835,1.66476 h 0.2522361 l 0.7567084,-1.66476 v 2.09938 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path956" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="M 7.4478493,206.07735 H 7.1451659 l -0.5199944,1.53282 -0.523875,-1.53282 H 5.7986131 l 0.6868584,1.87043 -0.1358195,0.37254 c -0.062089,0.17462 -0.1202972,0.23671 -0.314325,0.23671 H 5.949955 v 0.24835 h 0.120297 c 0.1358195,0 0.2716389,-0.0349 0.3725334,-0.13193 0.054328,-0.0505 0.097014,-0.1203 0.1358194,-0.22508 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path958" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.220962,207.98659 v -2.76296 H 10.92604 l -0.877006,1.95968 -0.9002887,-1.95968 H 8.853823 v 2.76296 h 0.2949223 v -2.09938 l 0.76835,1.66476 h 0.2522357 l 0.756709,-1.66476 v 2.09938 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path960" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.430574,207.03197 c 0,-0.29492 -0.0388,-0.56268 -0.232833,-0.76059 -0.131939,-0.13194 -0.314325,-0.21731 -0.547159,-0.21731 -0.232833,0 -0.415219,0.0854 -0.547158,0.21731 -0.194028,0.19791 -0.232833,0.46567 -0.232833,0.76059 0,0.29492 0.0388,0.56268 0.232833,0.76059 0.131939,0.13194 0.314325,0.21731 0.547158,0.21731 0.232834,0 0.41522,-0.0854 0.547159,-0.21731 0.194028,-0.19791 0.232833,-0.46567 0.232833,-0.76059 z m -0.2794,0 c 0,0.21343 -0.01164,0.45015 -0.151342,0.58985 -0.08925,0.0892 -0.21343,0.1397 -0.34925,0.1397 -0.135819,0 -0.256116,-0.0504 -0.345369,-0.1397 -0.1397,-0.1397 -0.155222,-0.37642 -0.155222,-0.58985 0,-0.21343 0.01552,-0.45014 0.155222,-0.58984 0.08925,-0.0893 0.20955,-0.1397 0.345369,-0.1397 0.13582,0 0.259998,0.0504 0.34925,0.1397 0.1397,0.1397 0.151342,0.37641 0.151342,0.58984 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path962" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 15.441855,207.98659 v -2.76296 h -0.2794 v 1.07492 c -0.155223,-0.19791 -0.329848,-0.24448 -0.539398,-0.24448 -0.194027,0 -0.364772,0.066 -0.465666,0.16686 -0.194028,0.19403 -0.232834,0.51224 -0.232834,0.81104 0,0.2988 0.03881,0.61701 0.232834,0.81104 0.100894,0.10089 0.271639,0.16686 0.465666,0.16686 0.20955,0 0.388056,-0.0505 0.543278,-0.25224 v 0.22896 z m -0.2794,-0.95462 c 0,0.37253 -0.06209,0.72955 -0.477309,0.72955 -0.415219,0 -0.481189,-0.35702 -0.481189,-0.72955 0,-0.37253 0.06597,-0.72954 0.481189,-0.72954 0.41522,0 0.477309,0.35701 0.477309,0.72954 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path964" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 17.622423,207.98659 v -1.90924 h -0.2794 v 1.17581 c 0,0.33373 -0.190147,0.50836 -0.477308,0.50836 -0.287161,0 -0.465667,-0.17075 -0.465667,-0.50836 v -1.17581 h -0.2794 v 1.2185 c 0,0.22119 0.05821,0.40358 0.194028,0.53552 0.116417,0.11641 0.287161,0.1785 0.492831,0.1785 0.21343,0 0.403577,-0.0815 0.539397,-0.23671 v 0.21343 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path966" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 19.001961,207.98659 v -0.2406 h -0.151342 c -0.194028,0 -0.256116,-0.0931 -0.256116,-0.2794 v -2.24296 h -0.2794 v 2.2546 c 0,0.29105 0.151341,0.50836 0.485069,0.50836 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path968" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 20.839343,207.1057 v -0.12806 c 0,-0.56656 -0.291042,-0.92357 -0.783872,-0.92357 -0.48507,0 -0.783873,0.36089 -0.783873,0.9779 0,0.67522 0.329848,0.9779 0.83432,0.9779 0.325967,0 0.504472,-0.10089 0.6985,-0.29492 l -0.190147,-0.16687 c -0.151342,0.15135 -0.2794,0.21732 -0.500592,0.21732 -0.364772,0 -0.562681,-0.2406 -0.562681,-0.6597 z m -0.2794,-0.20955 h -1.008945 c 0.0078,-0.15522 0.01552,-0.21343 0.05821,-0.3182 0.07373,-0.17463 0.244475,-0.28717 0.446264,-0.28717 0.201789,0 0.372533,0.11254 0.446264,0.28717 0.04269,0.10477 0.05045,0.16298 0.05821,0.3182 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path970" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Pitch" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text946" | |||||
transform="translate(0,-2.1166665)"> | |||||
<path | |||||
d="m 10.343313,234.08358 c 0,-0.36124 -0.254,-0.58984 -0.6208893,-0.58984 H 8.9745348 v 2.00942 h 0.2144889 v -0.82691 h 0.5334 c 0.3668893,0 0.6208893,-0.23142 0.6208893,-0.59267 z m -0.214489,0 c 0,0.26529 -0.174978,0.40076 -0.4261558,0.40076 H 9.1890237 v -0.79869 h 0.5136445 c 0.2511778,0 0.4261558,0.13264 0.4261558,0.39793 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path973" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 10.921471,235.50316 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78365 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path975" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.968251,235.50316 v -0.17498 h -0.107244 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84667 h 0.296333 v -0.15522 h -0.296333 v -0.43462 h -0.2032 v 0.43462 H 11.29374 v 0.15522 h 0.174978 v 0.85232 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path977" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.346113,235.31407 -0.138289,-0.13264 c -0.104422,0.11571 -0.186267,0.15804 -0.318911,0.15804 -0.135467,0 -0.248356,-0.0536 -0.321733,-0.15804 -0.06491,-0.0903 -0.09031,-0.19756 -0.09031,-0.37254 0,-0.17498 0.0254,-0.28222 0.09031,-0.37253 0.07338,-0.10442 0.186266,-0.15805 0.321733,-0.15805 0.132644,0 0.214489,0.0395 0.318911,0.15523 l 0.138289,-0.12983 c -0.143933,-0.15522 -0.265289,-0.20602 -0.4572,-0.20602 -0.349956,0 -0.615244,0.23707 -0.615244,0.7112 0,0.47414 0.265288,0.7112 0.615244,0.7112 0.191911,0 0.313267,-0.0508 0.4572,-0.20602 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path979" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.825619,235.50316 v -0.89182 c 0,-0.31327 -0.186267,-0.51365 -0.499534,-0.51365 -0.155222,0 -0.287866,0.0536 -0.389466,0.16934 v -0.77329 h -0.2032 v 2.00942 h 0.2032 v -0.85796 c 0,-0.23989 0.138289,-0.36689 0.347133,-0.36689 0.208844,0 0.338667,0.12418 0.338667,0.36689 v 0.85796 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path981" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="1V/oct" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text950" | |||||
transform="translate(0,-6.0862931)"> | |||||
<path | |||||
d="m 8.7942542,262.66519 v -2.00942 h -0.2032 l -0.3753555,0.32455 v 0.23143 l 0.3753555,-0.3302 v 1.78364 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path984" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 10.853021,260.65577 h -0.225778 l -0.522111,1.6256 -0.5221108,-1.6256 H 9.3572434 l 0.6603996,2.00942 h 0.174978 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path986" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.88278,260.44692 h -0.200378 l -0.804333,2.42712 h 0.200377 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path988" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.196436,261.97092 c 0,-0.21448 -0.02822,-0.40922 -0.169334,-0.55315 -0.09596,-0.096 -0.2286,-0.15805 -0.397933,-0.15805 -0.169333,0 -0.301978,0.0621 -0.397933,0.15805 -0.141111,0.14393 -0.169334,0.33867 -0.169334,0.55315 0,0.21449 0.02822,0.40923 0.169334,0.55316 0.09595,0.096 0.2286,0.15804 0.397933,0.15804 0.169333,0 0.301978,-0.0621 0.397933,-0.15804 0.141111,-0.14393 0.169334,-0.33867 0.169334,-0.55316 z m -0.2032,0 c 0,0.15523 -0.0085,0.32738 -0.110067,0.42898 -0.06491,0.0649 -0.155222,0.1016 -0.254,0.1016 -0.09878,0 -0.186267,-0.0367 -0.251178,-0.1016 -0.1016,-0.1016 -0.112889,-0.27375 -0.112889,-0.42898 0,-0.15522 0.01129,-0.32737 0.112889,-0.42897 0.06491,-0.0649 0.1524,-0.1016 0.251178,-0.1016 0.09878,0 0.189089,0.0367 0.254,0.1016 0.1016,0.1016 0.110067,0.27375 0.110067,0.42897 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path990" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.625318,262.4761 -0.138289,-0.13264 c -0.104422,0.11571 -0.186267,0.15804 -0.318911,0.15804 -0.135467,0 -0.248356,-0.0536 -0.321733,-0.15804 -0.06491,-0.0903 -0.09031,-0.19756 -0.09031,-0.37254 0,-0.17497 0.0254,-0.28222 0.09031,-0.37253 0.07338,-0.10442 0.186266,-0.15804 0.321733,-0.15804 0.132644,0 0.214489,0.0395 0.318911,0.15522 l 0.138289,-0.12982 c -0.143933,-0.15523 -0.265289,-0.20603 -0.4572,-0.20603 -0.349956,0 -0.615244,0.23707 -0.615244,0.7112 0,0.47414 0.265288,0.7112 0.615244,0.7112 0.191911,0 0.313267,-0.0508 0.4572,-0.20602 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path992" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 15.546024,262.66519 v -0.17498 H 15.43878 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84666 h 0.296333 v -0.15523 h -0.296333 v -0.43462 h -0.2032 v 0.43462 h -0.174978 v 0.15523 h 0.174978 v 0.85231 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path994" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Sine" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text954" | |||||
transform="translate(0,-10.054167)"> | |||||
<path | |||||
d="m 10.714958,289.26526 c 0,-0.16651 -0.05927,-0.3048 -0.169334,-0.39793 -0.08467,-0.0734 -0.1778,-0.11289 -0.366889,-0.14111 l -0.220133,-0.0339 c -0.1044223,-0.0169 -0.2088445,-0.0564 -0.2709334,-0.11006 -0.062089,-0.0536 -0.090311,-0.13265 -0.090311,-0.23143 0,-0.22295 0.1552222,-0.37253 0.4233334,-0.37253 0.211667,0 0.344311,0.0593 0.468489,0.17216 l 0.138289,-0.13829 c -0.172156,-0.15522 -0.341489,-0.22014 -0.598311,-0.22014 -0.3979337,0 -0.643467,0.22578 -0.643467,0.56727 0,0.16087 0.0508,0.28505 0.1524,0.37536 0.087489,0.0762 0.2116666,0.127 0.3697111,0.1524 l 0.2342439,0.0367 c 0.146756,0.0226 0.197556,0.0395 0.262467,0.0959 0.06491,0.0565 0.09596,0.14676 0.09596,0.25118 0,0.23424 -0.180623,0.37253 -0.474134,0.37253 -0.2257774,0 -0.3809996,-0.0536 -0.5475107,-0.22013 l -0.1467556,0.14675 c 0.1890889,0.18909 0.3866445,0.26529 0.6886223,0.26529 0.417689,0 0.694267,-0.21731 0.694267,-0.57009 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path997" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.329893,289.81842 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78364 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path999" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 12.935473,289.81842 v -0.889 c 0,-0.16087 -0.04515,-0.29069 -0.143933,-0.38664 -0.08467,-0.0847 -0.206022,-0.12983 -0.3556,-0.12983 -0.155222,0 -0.290689,0.0564 -0.389467,0.16934 v -0.1524 h -0.2032 v 1.38853 h 0.2032 v -0.85513 c 0,-0.24271 0.135467,-0.36971 0.344311,-0.36971 0.208845,0 0.341489,0.12417 0.341489,0.36971 v 0.85513 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path1001" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.494751,289.17778 v -0.0931 c 0,-0.41204 -0.211667,-0.67169 -0.570089,-0.67169 -0.352778,0 -0.570089,0.26247 -0.570089,0.7112 0,0.49107 0.239889,0.7112 0.606778,0.7112 0.237067,0 0.366889,-0.0734 0.508,-0.21449 l -0.138289,-0.12135 c -0.110067,0.11007 -0.2032,0.15804 -0.364067,0.15804 -0.265289,0 -0.409222,-0.17497 -0.409222,-0.47977 z m -0.2032,-0.1524 h -0.733778 c 0.0056,-0.11289 0.01129,-0.15523 0.04233,-0.23143 0.05362,-0.127 0.1778,-0.20884 0.324556,-0.20884 0.146756,0 0.270933,0.0818 0.324556,0.20884 0.03104,0.0762 0.03669,0.11854 0.04233,0.23143 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path1003" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Tutorial" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text1008"> | |||||
<path | |||||
d="M 8.5614537,289.39941 V 289.2075 H 7.1842093 v 0.19191 h 0.5813778 v 1.81751 H 7.980076 v -1.81751 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1010" /> | |||||
<path | |||||
d="m 9.8262062,291.21692 v -1.38853 h -0.2032 v 0.85513 c 0,0.24271 -0.1382889,0.36971 -0.3471334,0.36971 -0.2088444,0 -0.3386666,-0.12418 -0.3386666,-0.36971 v -0.85513 H 8.7340061 v 0.88617 c 0,0.16087 0.042333,0.29351 0.1411112,0.38947 0.084667,0.0847 0.2088444,0.12982 0.3584222,0.12982 0.1552222,0 0.2935111,-0.0593 0.3922889,-0.17215 v 0.15522 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1012" /> | |||||
<path | |||||
d="m 10.869017,291.21692 v -0.17498 h -0.107244 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84667 h 0.296333 v -0.15522 h -0.296333 v -0.43462 h -0.2032 v 0.43462 h -0.174978 v 0.15522 h 0.174978 v 0.85232 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1014" /> | |||||
<path | |||||
d="m 12.31179,290.52265 c 0,-0.21449 -0.02822,-0.40922 -0.169333,-0.55315 -0.09596,-0.096 -0.2286,-0.15805 -0.397934,-0.15805 -0.169333,0 -0.301977,0.0621 -0.397933,0.15805 -0.141111,0.14393 -0.169333,0.33866 -0.169333,0.55315 0,0.21449 0.02822,0.40922 0.169333,0.55316 0.09596,0.096 0.2286,0.15804 0.397933,0.15804 0.169334,0 0.301978,-0.0621 0.397934,-0.15804 0.141111,-0.14394 0.169333,-0.33867 0.169333,-0.55316 z m -0.2032,0 c 0,0.15522 -0.0085,0.32738 -0.110067,0.42898 -0.06491,0.0649 -0.155222,0.1016 -0.254,0.1016 -0.09878,0 -0.186266,-0.0367 -0.251177,-0.1016 -0.1016,-0.1016 -0.112889,-0.27376 -0.112889,-0.42898 0,-0.15522 0.01129,-0.32738 0.112889,-0.42898 0.06491,-0.0649 0.1524,-0.1016 0.251177,-0.1016 0.09878,0 0.189089,0.0367 0.254,0.1016 0.1016,0.1016 0.110067,0.27376 0.110067,0.42898 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1016" /> | |||||
<path | |||||
d="m 13.670117,289.94127 c -0.09878,-0.0988 -0.200378,-0.12982 -0.333022,-0.12982 -0.160867,0 -0.313267,0.0706 -0.389467,0.18627 v -0.16933 h -0.2032 v 1.38853 h 0.2032 v -0.85231 c 0,-0.21167 0.129822,-0.37254 0.333022,-0.37254 0.107245,0 0.163689,0.0254 0.239889,0.1016 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1018" /> | |||||
<path | |||||
d="m 14.138253,291.21692 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78365 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1020" /> | |||||
<path | |||||
d="m 15.642233,291.21692 v -0.94262 c 0,-0.30198 -0.183445,-0.46285 -0.555978,-0.46285 -0.225778,0 -0.366889,0.0452 -0.491067,0.20602 l 0.138289,0.127 c 0.08184,-0.11571 0.172156,-0.15804 0.349956,-0.15804 0.254,0 0.3556,0.1016 0.3556,0.3048 v 0.13264 h -0.417689 c -0.310445,0 -0.479778,0.15805 -0.479778,0.40076 0,0.11007 0.03669,0.21449 0.104422,0.28222 0.08749,0.0903 0.200378,0.127 0.392289,0.127 0.186267,0 0.287867,-0.0367 0.400756,-0.14958 v 0.13265 z m -0.2032,-0.49107 c 0,0.11571 -0.02258,0.19474 -0.07056,0.23989 -0.08749,0.0847 -0.191911,0.0931 -0.310444,0.0931 -0.220134,0 -0.318912,-0.0762 -0.318912,-0.23706 0,-0.16087 0.1016,-0.24554 0.310445,-0.24554 h 0.389467 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1022" /> | |||||
<path | |||||
d="m 16.628291,291.21692 v -0.17498 h -0.110067 c -0.141111,0 -0.186267,-0.0677 -0.186267,-0.2032 v -1.63124 h -0.2032 v 1.63971 c 0,0.21166 0.110067,0.36971 0.352778,0.36971 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1024" /> | |||||
</g> | |||||
</g> | |||||
</svg> |
@@ -0,0 +1,105 @@ | |||||
#include "Template.hpp" | |||||
struct MyModule : Module { | |||||
enum ParamIds { | |||||
PITCH_PARAM, | |||||
NUM_PARAMS | |||||
}; | |||||
enum InputIds { | |||||
PITCH_INPUT, | |||||
NUM_INPUTS | |||||
}; | |||||
enum OutputIds { | |||||
SINE_OUTPUT, | |||||
NUM_OUTPUTS | |||||
}; | |||||
enum LightIds { | |||||
BLINK_LIGHT, | |||||
NUM_LIGHTS | |||||
}; | |||||
float phase = 0.0f; | |||||
float blinkPhase = 0.0f; | |||||
MyModule() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} | |||||
void step() override; | |||||
// For more advanced Module features, read Rack's engine.hpp header file | |||||
// - toJson, fromJson: serialization of internal data | |||||
// - onSampleRateChange: event triggered by a change of sample rate | |||||
// - onReset, onRandomize, onCreate, onDelete: implements special behavior when user clicks these from the context menu | |||||
}; | |||||
void MyModule::step() { | |||||
// Implement a simple sine oscillator | |||||
float deltaTime = engineGetSampleTime(); | |||||
// Compute the frequency from the pitch parameter and input | |||||
float pitch = params[PITCH_PARAM].value; | |||||
pitch += inputs[PITCH_INPUT].value; | |||||
pitch = clamp(pitch, -4.0f, 4.0f); | |||||
// The default pitch is C4 | |||||
float freq = 261.626f * powf(2.0f, pitch); | |||||
// Accumulate the phase | |||||
phase += freq * deltaTime; | |||||
if (phase >= 1.0f) | |||||
phase -= 1.0f; | |||||
// Compute the sine output | |||||
float sine = sinf(float(2.0f * M_PI) * phase); | |||||
outputs[SINE_OUTPUT].value = 5.0f * sine; | |||||
// Blink light at 1Hz | |||||
blinkPhase += deltaTime; | |||||
if (blinkPhase >= 1.0f) | |||||
blinkPhase -= 1.0f; | |||||
lights[BLINK_LIGHT].value = (blinkPhase < 0.5f) ? 1.0f : 0.0f; | |||||
} | |||||
struct MyModuleWidget : ModuleWidget { | |||||
MyModuleWidget(MyModule *module) : ModuleWidget(module) { | |||||
printf("xxx template_shared: global=%p\n", rack::global); | |||||
printf("xxx template_shared: global_ui=%p x\n", rack::global_ui); | |||||
printf("xxx template_shared: plugin=%p\n", plugin); | |||||
std::shared_ptr<SVG> svg = SVG::load(assetPlugin(plugin, "res/MyModule.svg")); | |||||
printf("xxx template_shared: SVG::load() OK\n"); | |||||
setPanel(svg); | |||||
printf("xxx template_shared: setPanel() OK\n"); | |||||
addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||||
printf("xxx template_shared: 1 addChild() OK\n"); | |||||
addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||||
printf("xxx template_shared: 2 addChild() OK\n"); | |||||
addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); | |||||
printf("xxx template_shared: 3 addChild() OK\n"); | |||||
addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); | |||||
printf("xxx template_shared: 4 addChild() OK\n"); | |||||
addParam(ParamWidget::create<Davies1900hBlackKnob>(Vec(28, 87), module, MyModule::PITCH_PARAM, -3.0, 3.0, 0.0)); | |||||
printf("xxx template_shared: addParam() OK\n"); | |||||
addInput(Port::create<PJ301MPort>(Vec(33, 186), Port::INPUT, module, MyModule::PITCH_INPUT)); | |||||
printf("xxx template_shared: addInput() OK\n"); | |||||
addOutput(Port::create<PJ301MPort>(Vec(33, 275), Port::OUTPUT, module, MyModule::SINE_OUTPUT)); | |||||
printf("xxx template_shared: addOutput() OK\n"); | |||||
addChild(ModuleLightWidget::create<MediumLight<RedLight>>(Vec(41, 59), module, MyModule::BLINK_LIGHT)); | |||||
printf("xxx template_shared: addChild() OK\n"); | |||||
} | |||||
}; | |||||
// Specify the Module and ModuleWidget subclass, human-readable | |||||
// author name for categorization per plugin, module slug (should never | |||||
// change), human-readable module name, and any number of tags | |||||
// (found in `include/tags.hpp`) separated by commas. | |||||
RACK_PLUGIN_MODEL_INIT(Template_shared, MyModule) { | |||||
Model *modelMyModule = Model::create<MyModule, MyModuleWidget>("Template_shared", "MyModule", "My Module", OSCILLATOR_TAG); | |||||
return modelMyModule; | |||||
} |
@@ -0,0 +1,22 @@ | |||||
#include <stdio.h> | |||||
#include "Template.hpp" | |||||
// extern "C" extern int glfwInit(void); | |||||
RACK_PLUGIN_MODEL_DECLARE(Template_shared, MyModule); | |||||
RACK_PLUGIN_INIT(Template_shared) { | |||||
RACK_PLUGIN_INIT_ID(); | |||||
RACK_PLUGIN_INIT_WEBSITE("https://<your_website>"); | |||||
RACK_PLUGIN_INIT_MANUAL("https://<link_to_the_manual>"); | |||||
// Add all Models defined throughout the plugin | |||||
RACK_PLUGIN_MODEL_ADD(Template_shared, MyModule); | |||||
// Any other plugin initialization may go here. | |||||
// As an alternative, consider lazy-loading assets and lookup tables when your module is created to reduce startup times of Rack. | |||||
printf("hello from Template_shared plugin!\n"); | |||||
// glfwInit(); | |||||
} |
@@ -0,0 +1,5 @@ | |||||
#include "rack.hpp" | |||||
using namespace rack; | |||||
RACK_PLUGIN_DECLARE(Template_shared); |
@@ -1,7 +1,7 @@ | |||||
SLUG=dBiz | SLUG=dBiz | ||||
include ../../../build_plugin_pre.mk | |||||
include ../../../build_shared_plugin_pre.mk | |||||
include make.objects | include make.objects | ||||
include ../../../build_plugin_post.mk | |||||
include ../../../build_shared_plugin_post.mk |
@@ -4,9 +4,9 @@ using namespace rack; | |||||
RACK_PLUGIN_DECLARE(dBiz); | RACK_PLUGIN_DECLARE(dBiz); | ||||
#ifdef USE_VST2 | |||||
#define plugin "dBiz" | |||||
#endif // USE_VST2 | |||||
// // #ifdef USE_VST2 | |||||
// // #define plugin "dBiz" | |||||
// // #endif // USE_VST2 | |||||
namespace rack_plugin_dBiz { | namespace rack_plugin_dBiz { | ||||
@@ -2,6 +2,8 @@ | |||||
#include "Core.hpp" | #include "Core.hpp" | ||||
#include "global.hpp" | #include "global.hpp" | ||||
#ifdef RACK_HOST | |||||
RACK_PLUGIN_MODEL_DECLARE(Core, AudioInterface); | RACK_PLUGIN_MODEL_DECLARE(Core, AudioInterface); | ||||
RACK_PLUGIN_MODEL_DECLARE(Core, MIDIToCVInterface); | RACK_PLUGIN_MODEL_DECLARE(Core, MIDIToCVInterface); | ||||
RACK_PLUGIN_MODEL_DECLARE(Core, QuadMIDIToCVInterface); | RACK_PLUGIN_MODEL_DECLARE(Core, QuadMIDIToCVInterface); | ||||
@@ -23,3 +25,5 @@ RACK_PLUGIN_INIT(Core) { | |||||
RACK_PLUGIN_MODEL_ADD(Core, Blank); | RACK_PLUGIN_MODEL_ADD(Core, Blank); | ||||
RACK_PLUGIN_MODEL_ADD(Core, Notes); | RACK_PLUGIN_MODEL_ADD(Core, Notes); | ||||
} | } | ||||
#endif // RACK_HOST |
@@ -1,6 +1,6 @@ | |||||
#include "rack.hpp" | #include "rack.hpp" | ||||
#ifndef RACK_PLUGIN_SHARED | |||||
using namespace rack; | using namespace rack; | ||||
RACK_PLUGIN_INIT(Core); | RACK_PLUGIN_INIT(Core); | ||||
@@ -53,3 +53,4 @@ struct Grid16MidiWidget : MidiWidget { | |||||
} | } | ||||
virtual GridChoice *createGridChoice() {return NULL;} | virtual GridChoice *createGridChoice() {return NULL;} | ||||
}; | }; | ||||
#endif // RACK_PLUGIN_SHARED |
@@ -133,13 +133,23 @@ struct ModelItem : BrowserListItem { | |||||
} | } | ||||
void onAction(EventAction &e) override { | void onAction(EventAction &e) override { | ||||
printf("xxx vcvrack::ModuleBrowser: model=%p, calling createModuleWidget()\n", model); | |||||
#ifdef USE_VST2 | |||||
if(NULL != model->plugin->set_tls_globals_fxn) { | |||||
model->plugin->set_tls_globals_fxn(model->plugin); | |||||
} | |||||
#endif // USE_VST2 | |||||
ModuleWidget *moduleWidget = model->createModuleWidget(); | ModuleWidget *moduleWidget = model->createModuleWidget(); | ||||
printf("xxx vcvrack::ModuleBrowser: moduleWidget=%p\n", moduleWidget); | |||||
if (!moduleWidget) | if (!moduleWidget) | ||||
return; | return; | ||||
global_ui->app.gRackWidget->addModule(moduleWidget); | global_ui->app.gRackWidget->addModule(moduleWidget); | ||||
printf("xxx vcvrack::ModuleBrowser: addModule() OK\n"); | |||||
// Move module nearest to the mouse position | // Move module nearest to the mouse position | ||||
moduleWidget->box.pos = global_ui->app.gRackWidget->lastMousePos.minus(moduleWidget->box.size.div(2)); | moduleWidget->box.pos = global_ui->app.gRackWidget->lastMousePos.minus(moduleWidget->box.size.div(2)); | ||||
printf("xxx vcvrack::ModuleBrowser: box.pos OK\n"); | |||||
global_ui->app.gRackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box); | global_ui->app.gRackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box); | ||||
printf("xxx vcvrack::ModuleBrowser: requestModuleBoxNearest() OK\n"); | |||||
} | } | ||||
}; | }; | ||||
@@ -7,14 +7,27 @@ | |||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
#ifdef USE_VST2 | |||||
extern "C" void glfw_hack_makeContextCurrent(GLFWwindow *handle); | |||||
// #include <windows.h> | |||||
#endif // USE_VST2 | |||||
namespace rack { | namespace rack { | ||||
ModuleWidget::ModuleWidget(Module *module) { | ModuleWidget::ModuleWidget(Module *module) { | ||||
printf("xxx ModuleWidget::ModuleWidget(module=%p) global=%p\n", module, global); | |||||
// printf("xxx ModuleWidget::ModuleWidget: GetCurrentThreadId=%d\n", GetCurrentThreadId()); | |||||
if (module) { | if (module) { | ||||
engineAddModule(module); | engineAddModule(module); | ||||
printf("xxx ModuleWidget::ModuleWidget: engineAddModule OK\n"); | |||||
} | } | ||||
this->module = module; | this->module = module; | ||||
// printf("xxx ModuleWidget::ModuleWidget(): bind GL context global_ui->window.gWindow=%p\n", global_ui->window.gWindow); | |||||
// glfwMakeContextCurrent(global_ui->window.gWindow); | |||||
// // glfw_hack_makeContextCurrent(global_ui->window.gWindow); | |||||
printf("xxx ModuleWidget::ModuleWidget(): RETURN\n"); | |||||
} | } | ||||
ModuleWidget::~ModuleWidget() { | ModuleWidget::~ModuleWidget() { | ||||
@@ -54,17 +67,27 @@ void ModuleWidget::addParam(ParamWidget *param) { | |||||
void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | ||||
// Remove old panel | // Remove old panel | ||||
#ifdef RACK_PLUGIN_SHARED | |||||
printf("xxx ModuleWidget::setPanel<shared>: 1\n"); | |||||
#else | |||||
printf("xxx ModuleWidget::setPanel<host>: 1\n"); | |||||
#endif | |||||
if (panel) { | if (panel) { | ||||
removeChild(panel); | removeChild(panel); | ||||
delete panel; | delete panel; | ||||
panel = NULL; | panel = NULL; | ||||
} | } | ||||
// printf("xxx ModuleWidget::setPanel: 2\n"); | |||||
panel = new SVGPanel(); | panel = new SVGPanel(); | ||||
// printf("xxx ModuleWidget::setPanel: 3\n"); | |||||
panel->setBackground(svg); | panel->setBackground(svg); | ||||
// printf("xxx ModuleWidget::setPanel: 4\n"); | |||||
addChild(panel); | addChild(panel); | ||||
// printf("xxx ModuleWidget::setPanel: 5\n"); | |||||
box.size = panel->box.size; | box.size = panel->box.size; | ||||
// printf("xxx ModuleWidget::setPanel: 6\n"); | |||||
} | } | ||||
@@ -132,6 +155,7 @@ void ModuleWidget::fromJson(json_t *rootJ) { | |||||
double x, y; | double x, y; | ||||
json_unpack(posJ, "[F, F]", &x, &y); | json_unpack(posJ, "[F, F]", &x, &y); | ||||
Vec pos = Vec(x, y); | Vec pos = Vec(x, y); | ||||
printf("xxx ModuleWidget::fromJson: pos=(%f, %f) posJ=%p rootJ=%p\n", x, y, posJ, rootJ); | |||||
if (legacy && legacy <= 1) { | if (legacy && legacy <= 1) { | ||||
box.pos = pos; | box.pos = pos; | ||||
} | } | ||||
@@ -218,23 +242,31 @@ ParamWidget *ModuleWidget::findParamWidgetByParamId(int _paramId) { | |||||
} | } | ||||
void ModuleWidget::draw(NVGcontext *vg) { | void ModuleWidget::draw(NVGcontext *vg) { | ||||
// printf("xxx ModuleWidget::draw: ENTER this=%p global=%p global_ui=%p\n", this, global, global_ui); | |||||
nvgScissor(vg, 0, 0, box.size.x, box.size.y); | nvgScissor(vg, 0, 0, box.size.x, box.size.y); | ||||
// printf("xxx ModuleWidget::draw: 2\n"); | |||||
Widget::draw(vg); | Widget::draw(vg); | ||||
// printf("xxx ModuleWidget::draw: 3\n"); | |||||
// CPU meter | // CPU meter | ||||
if (module && global->gPowerMeter) { | if (module && global->gPowerMeter) { | ||||
// printf("xxx ModuleWidget::draw: 4b\n"); | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
// printf("xxx ModuleWidget::draw: 5b\n"); | |||||
nvgRect(vg, | nvgRect(vg, | ||||
0, box.size.y - 20, | 0, box.size.y - 20, | ||||
55, 20); | 55, 20); | ||||
nvgFillColor(vg, nvgRGBAf(0, 0, 0, 0.5)); | nvgFillColor(vg, nvgRGBAf(0, 0, 0, 0.5)); | ||||
nvgFill(vg); | nvgFill(vg); | ||||
// printf("xxx ModuleWidget::draw: 6b module=%p\n", module); | |||||
std::string cpuText = stringf("%.0f mS", module->cpuTime * 1000.f); | std::string cpuText = stringf("%.0f mS", module->cpuTime * 1000.f); | ||||
// printf("xxx ModuleWidget::draw: 7b\n"); | |||||
nvgFontFaceId(vg, global_ui->window.gGuiFont->handle); | nvgFontFaceId(vg, global_ui->window.gGuiFont->handle); | ||||
nvgFontSize(vg, 12); | nvgFontSize(vg, 12); | ||||
nvgFillColor(vg, nvgRGBf(1, 1, 1)); | nvgFillColor(vg, nvgRGBf(1, 1, 1)); | ||||
nvgText(vg, 10.0, box.size.y - 6.0, cpuText.c_str(), NULL); | nvgText(vg, 10.0, box.size.y - 6.0, cpuText.c_str(), NULL); | ||||
// printf("xxx ModuleWidget::draw: 8b\n"); | |||||
float p = clamp(module->cpuTime, 0.f, 1.f); | float p = clamp(module->cpuTime, 0.f, 1.f); | ||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
@@ -245,7 +277,10 @@ void ModuleWidget::draw(NVGcontext *vg) { | |||||
nvgFill(vg); | nvgFill(vg); | ||||
} | } | ||||
// printf("xxx ModuleWidget::draw: 4\n"); | |||||
nvgResetScissor(vg); | nvgResetScissor(vg); | ||||
// printf("xxx ModuleWidget::draw: LEAVE\n"); | |||||
} | } | ||||
void ModuleWidget::drawShadow(NVGcontext *vg) { | void ModuleWidget::drawShadow(NVGcontext *vg) { | ||||
@@ -379,9 +414,12 @@ struct DeleteMenuItem : MenuItem { | |||||
}; | }; | ||||
Menu *ModuleWidget::createContextMenu() { | Menu *ModuleWidget::createContextMenu() { | ||||
printf("xxx ModuleWidget::createContextMenu: ENTER\n"); | |||||
Menu *menu = global_ui->ui.gScene->createMenu(); | Menu *menu = global_ui->ui.gScene->createMenu(); | ||||
MenuLabel *menuLabel = new MenuLabel(); | MenuLabel *menuLabel = new MenuLabel(); | ||||
printf("xxx ModuleWidget::createContextMenu: model->author=\"%s\"\n", model->author.c_str()); | |||||
printf("xxx ModuleWidget::createContextMenu: model->name=\"%s\"\n", model->name.c_str()); | |||||
menuLabel->text = model->author + " " + model->name + " " + model->plugin->version; | menuLabel->text = model->author + " " + model->name + " " + model->plugin->version; | ||||
menu->addChild(menuLabel); | menu->addChild(menuLabel); | ||||
@@ -5,6 +5,7 @@ namespace rack { | |||||
void Panel::draw(NVGcontext *vg) { | void Panel::draw(NVGcontext *vg) { | ||||
// printf("xxx Panel::draw: ENTER\n"); | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
nvgRect(vg, 0.0, 0.0, box.size.x, box.size.y); | nvgRect(vg, 0.0, 0.0, box.size.x, box.size.y); | ||||
@@ -31,7 +32,9 @@ void Panel::draw(NVGcontext *vg) { | |||||
nvgStrokeWidth(vg, 1.0); | nvgStrokeWidth(vg, 1.0); | ||||
nvgStroke(vg); | nvgStroke(vg); | ||||
// printf("xxx Panel::draw: call Widget::draw\n"); | |||||
Widget::draw(vg); | Widget::draw(vg); | ||||
// printf("xxx Panel::draw: LEAVE\n"); | |||||
} | } | ||||
} // namespace rack | } // namespace rack |
@@ -12,6 +12,10 @@ | |||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
#ifdef USE_VST2 | |||||
extern void vst2_set_shared_plugin_tls_globals(void); | |||||
#endif // USE_VST2 | |||||
namespace rack { | namespace rack { | ||||
@@ -300,6 +304,8 @@ json_t *RackWidget::toJson() { | |||||
void RackWidget::fromJson(json_t *rootJ) { | void RackWidget::fromJson(json_t *rootJ) { | ||||
std::string message; | std::string message; | ||||
vst2_set_shared_plugin_tls_globals(); // update JSON hashtable seed | |||||
// version | // version | ||||
std::string version; | std::string version; | ||||
json_t *versionJ = json_object_get(rootJ, "version"); | json_t *versionJ = json_object_get(rootJ, "version"); | ||||
@@ -343,6 +349,11 @@ void RackWidget::fromJson(json_t *rootJ) { | |||||
} | } | ||||
// Create ModuleWidget | // Create ModuleWidget | ||||
// // #ifdef USE_VST2 | |||||
// // if(NULL != model->plugin->set_tls_globals_fxn) { | |||||
// // model->plugin->set_tls_globals_fxn(model->plugin); | |||||
// // } | |||||
// // #endif // USE_VST2 | |||||
ModuleWidget *moduleWidget = model->createModuleWidget(); | ModuleWidget *moduleWidget = model->createModuleWidget(); | ||||
assert(moduleWidget); | assert(moduleWidget); | ||||
moduleWidget->fromJson(moduleJ); | moduleWidget->fromJson(moduleJ); | ||||
@@ -97,6 +97,8 @@ std::string assetLocal(std::string filename) { | |||||
std::string assetPlugin(Plugin *plugin, std::string filename) { | std::string assetPlugin(Plugin *plugin, std::string filename) { | ||||
printf("xxx assetPlugin(plugin=%p)\n"); | |||||
printf("xxx assetPlugin: filename=\"%s\"\n", filename.c_str()); | |||||
assert(plugin); | assert(plugin); | ||||
return plugin->path + "/" + filename; | return plugin->path + "/" + filename; | ||||
} | } | ||||
@@ -18,10 +18,6 @@ | |||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
#ifdef USE_VST2 | |||||
extern void vst2_handle_ui_param (int uniqueParamId, float normValue); | |||||
#endif // USE_VST2 | |||||
namespace rack { | namespace rack { | ||||
@@ -17,7 +17,9 @@ | |||||
#include <sys/param.h> // for MAXPATHLEN | #include <sys/param.h> // for MAXPATHLEN | ||||
#include <fcntl.h> | #include <fcntl.h> | ||||
#include <dirent.h> | #include <dirent.h> | ||||
#endif | |||||
#else | |||||
#include "util/dirent_win32/dirent.h" | |||||
#endif // YAC_POSIX | |||||
#include <thread> | #include <thread> | ||||
#include <stdexcept> | #include <stdexcept> | ||||
@@ -46,7 +48,9 @@ namespace rack { | |||||
typedef void (*InitCallback)(Plugin *); | typedef void (*InitCallback)(Plugin *); | ||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
#ifndef RACK_PLUGIN | |||||
static void vst2_load_static_rack_plugins(void); | static void vst2_load_static_rack_plugins(void); | ||||
#endif // RACK_PLUGIN | |||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
@@ -67,6 +71,7 @@ void Plugin::addModel(Model *model) { | |||||
//////////////////// | //////////////////// | ||||
static bool loadPlugin(std::string path) { | static bool loadPlugin(std::string path) { | ||||
#ifdef RACK_HOST | |||||
std::string libraryFilename; | std::string libraryFilename; | ||||
#if ARCH_LIN | #if ARCH_LIN | ||||
libraryFilename = path + "/" + "plugin.so"; | libraryFilename = path + "/" + "plugin.so"; | ||||
@@ -108,10 +113,15 @@ static bool loadPlugin(std::string path) { | |||||
// Call plugin's init() function | // Call plugin's init() function | ||||
InitCallback initCallback; | InitCallback initCallback; | ||||
#ifdef USE_VST2 | |||||
#define init_symbol_name "init_plugin" | |||||
#else | |||||
#define init_symbol_name "init" | |||||
#endif // USE_VST2 | |||||
#if ARCH_WIN | #if ARCH_WIN | ||||
initCallback = (InitCallback) GetProcAddress(handle, "init"); | |||||
initCallback = (InitCallback) GetProcAddress(handle, init_symbol_name); | |||||
#else | #else | ||||
initCallback = (InitCallback) dlsym(handle, "init"); | |||||
initCallback = (InitCallback) dlsym(handle, init_symbol_name); | |||||
#endif | #endif | ||||
if (!initCallback) { | if (!initCallback) { | ||||
warn("Failed to read init() symbol in %s", libraryFilename.c_str()); | warn("Failed to read init() symbol in %s", libraryFilename.c_str()); | ||||
@@ -122,6 +132,13 @@ static bool loadPlugin(std::string path) { | |||||
Plugin *plugin = new Plugin(); | Plugin *plugin = new Plugin(); | ||||
plugin->path = path; | plugin->path = path; | ||||
plugin->handle = handle; | plugin->handle = handle; | ||||
#ifdef USE_VST2 | |||||
#ifdef RACK_HOST | |||||
plugin->vst2_handle_ui_param_fxn = &vst2_handle_ui_param; | |||||
plugin->global = global; | |||||
plugin->global_ui = global_ui; | |||||
#endif // RACK_HOST | |||||
#endif // USE_VST2 | |||||
initCallback(plugin); | initCallback(plugin); | ||||
// Reject plugin if slug already exists | // Reject plugin if slug already exists | ||||
@@ -137,6 +154,10 @@ static bool loadPlugin(std::string path) { | |||||
global->plugin.gPlugins.push_back(plugin); | global->plugin.gPlugins.push_back(plugin); | ||||
info("Loaded plugin %s %s from %s", plugin->slug.c_str(), plugin->version.c_str(), libraryFilename.c_str()); | info("Loaded plugin %s %s from %s", plugin->slug.c_str(), plugin->version.c_str(), libraryFilename.c_str()); | ||||
#else | |||||
(void)path; | |||||
#endif // RACK_HOST | |||||
return true; | return true; | ||||
} | } | ||||
@@ -231,18 +252,25 @@ static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) { | |||||
} | } | ||||
static void loadPlugins(std::string path) { | static void loadPlugins(std::string path) { | ||||
#ifdef RACK_HOST | |||||
std::string message; | std::string message; | ||||
for (std::string pluginPath : systemListEntries(path)) { | for (std::string pluginPath : systemListEntries(path)) { | ||||
if (!systemIsDirectory(pluginPath)) | if (!systemIsDirectory(pluginPath)) | ||||
continue; | continue; | ||||
if (!loadPlugin(pluginPath)) { | if (!loadPlugin(pluginPath)) { | ||||
#ifndef USE_VST2 | |||||
// (note) skip message (some plugins are linked statically in VST2 build) | |||||
message += stringf("Could not load plugin %s\n", pluginPath.c_str()); | message += stringf("Could not load plugin %s\n", pluginPath.c_str()); | ||||
#endif // USE_VST2 | |||||
} | } | ||||
} | } | ||||
if (!message.empty()) { | if (!message.empty()) { | ||||
message += "See log for details."; | message += "See log for details."; | ||||
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str()); | osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str()); | ||||
} | } | ||||
#else | |||||
(void)path; | |||||
#endif // RACK_HOST | |||||
} | } | ||||
#ifndef USE_VST2 | #ifndef USE_VST2 | ||||
@@ -349,6 +377,7 @@ static void extractPackages(std::string path) { | |||||
void pluginInit(bool devMode) { | void pluginInit(bool devMode) { | ||||
tagsInit(); | tagsInit(); | ||||
#ifdef RACK_HOST | |||||
// Load core | // Load core | ||||
// This function is defined in core.cpp | // This function is defined in core.cpp | ||||
@@ -356,11 +385,14 @@ void pluginInit(bool devMode) { | |||||
init_plugin_Core(corePlugin); | init_plugin_Core(corePlugin); | ||||
global->plugin.gPlugins.push_back(corePlugin); | global->plugin.gPlugins.push_back(corePlugin); | ||||
#ifndef USE_VST2 | |||||
// Init statically linked plugins | |||||
vst2_load_static_rack_plugins(); | |||||
// Get local plugins directory | // Get local plugins directory | ||||
std::string localPlugins = assetLocal("plugins"); | std::string localPlugins = assetLocal("plugins"); | ||||
mkdir(localPlugins.c_str(), 0755); | mkdir(localPlugins.c_str(), 0755); | ||||
#ifndef USE_VST2 | |||||
if (!devMode) { | if (!devMode) { | ||||
// Copy Fundamental package to plugins directory if folder does not exist | // Copy Fundamental package to plugins directory if folder does not exist | ||||
std::string fundamentalSrc = assetGlobal("Fundamental.zip"); | std::string fundamentalSrc = assetGlobal("Fundamental.zip"); | ||||
@@ -370,16 +402,17 @@ void pluginInit(bool devMode) { | |||||
systemCopy(fundamentalSrc, fundamentalDest); | systemCopy(fundamentalSrc, fundamentalDest); | ||||
} | } | ||||
} | } | ||||
#endif // USE_VST2 | |||||
// Extract packages and load plugins | // Extract packages and load plugins | ||||
#ifndef USE_VST2 | #ifndef USE_VST2 | ||||
extractPackages(localPlugins); | extractPackages(localPlugins); | ||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
// Load/init dynamically loaded plugins | |||||
loadPlugins(localPlugins); | loadPlugins(localPlugins); | ||||
#else | |||||
vst2_load_static_rack_plugins(); | |||||
#endif // USE_VST2 | |||||
#endif // RACK_HOST | |||||
} | } | ||||
void pluginDestroy() { | void pluginDestroy() { | ||||
@@ -567,6 +600,7 @@ Model *pluginGetModel(std::string pluginSlug, std::string modelSlug) { | |||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
#ifndef RACK_PLUGIN | |||||
extern "C" { | extern "C" { | ||||
extern void init_plugin_Alikins (rack::Plugin *p); | extern void init_plugin_Alikins (rack::Plugin *p); | ||||
extern void init_plugin_AS (rack::Plugin *p); | extern void init_plugin_AS (rack::Plugin *p); | ||||
@@ -577,7 +611,7 @@ extern void init_plugin_Bidoo (rack::Plugin *p); | |||||
extern void init_plugin_Bogaudio (rack::Plugin *p); | extern void init_plugin_Bogaudio (rack::Plugin *p); | ||||
// extern void init_plugin_BOKONTEPByteBeatMachine (rack::Plugin *p); // unstable | // extern void init_plugin_BOKONTEPByteBeatMachine (rack::Plugin *p); // unstable | ||||
extern void init_plugin_cf (rack::Plugin *p); | extern void init_plugin_cf (rack::Plugin *p); | ||||
extern void init_plugin_dBiz (rack::Plugin *p); | |||||
//extern void init_plugin_dBiz (rack::Plugin *p); // now a DLL (13Jul2018) | |||||
extern void init_plugin_DHE_Modules (rack::Plugin *p); | extern void init_plugin_DHE_Modules (rack::Plugin *p); | ||||
extern void init_plugin_DrumKit (rack::Plugin *p); | extern void init_plugin_DrumKit (rack::Plugin *p); | ||||
extern void init_plugin_ErraticInstruments (rack::Plugin *p); | extern void init_plugin_ErraticInstruments (rack::Plugin *p); | ||||
@@ -649,7 +683,7 @@ void vst2_load_static_rack_plugins(void) { | |||||
vst2_load_static_rack_plugin("Bogaudio", &init_plugin_Bogaudio); | vst2_load_static_rack_plugin("Bogaudio", &init_plugin_Bogaudio); | ||||
// vst2_load_static_rack_plugin("BOKONTEPByteBeatMachine", &init_plugin_BOKONTEPByteBeatMachine); | // vst2_load_static_rack_plugin("BOKONTEPByteBeatMachine", &init_plugin_BOKONTEPByteBeatMachine); | ||||
vst2_load_static_rack_plugin("cf", &init_plugin_cf); | vst2_load_static_rack_plugin("cf", &init_plugin_cf); | ||||
vst2_load_static_rack_plugin("dBiz", &init_plugin_dBiz); | |||||
// vst2_load_static_rack_plugin("dBiz", &init_plugin_dBiz); // now a DLL (13Jul2018) | |||||
vst2_load_static_rack_plugin("DHE-Modules", &init_plugin_DHE_Modules); | vst2_load_static_rack_plugin("DHE-Modules", &init_plugin_DHE_Modules); | ||||
vst2_load_static_rack_plugin("DrumKit", &init_plugin_DrumKit); | vst2_load_static_rack_plugin("DrumKit", &init_plugin_DrumKit); | ||||
vst2_load_static_rack_plugin("ErraticInstruments", &init_plugin_ErraticInstruments); | vst2_load_static_rack_plugin("ErraticInstruments", &init_plugin_ErraticInstruments); | ||||
@@ -684,12 +718,34 @@ void vst2_load_static_rack_plugins(void) { | |||||
vst2_load_static_rack_plugin("Valley", &init_plugin_Valley); | vst2_load_static_rack_plugin("Valley", &init_plugin_Valley); | ||||
// vst2_load_static_rack_plugin("VultModules", &init_plugin_VultModules); | // vst2_load_static_rack_plugin("VultModules", &init_plugin_VultModules); | ||||
} | } | ||||
#endif // RACK_PLUGIN | |||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
} // namespace rack | } // namespace rack | ||||
using namespace rack; | using namespace rack; | ||||
#ifdef USE_VST2 | |||||
#ifdef ARCH_WIN | |||||
extern "C" extern long seed_initialized; | |||||
#else | |||||
extern "C" extern volatile char seed_initialized; | |||||
#endif // ARCH_WIN | |||||
extern "C" extern volatile uint32_t hashtable_seed; | |||||
void vst2_set_shared_plugin_tls_globals(void) { | |||||
// Called in audio thread (see vst2_main.cpp:VSTPluginProcessReplacingFloat32()) | |||||
for(Plugin *p : global->plugin.gPlugins) { | |||||
if(NULL != p->set_tls_globals_fxn) { | |||||
// printf("xxx vcvrack: calling p->set_tls_globals_fxn() global=%p\n", p->global); | |||||
p->json.hashtable_seed = hashtable_seed; | |||||
p->json.seed_initialized = seed_initialized; | |||||
p->set_tls_globals_fxn(p); | |||||
// printf("xxx vcvrack: calling p->set_tls_globals_fxn() OK\n"); | |||||
} | |||||
} | |||||
} | |||||
#endif // USE_VST2 | |||||
RackScene *rack_plugin_ui_get_rackscene(void) { | RackScene *rack_plugin_ui_get_rackscene(void) { | ||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
return rack::global_ui->app.gRackScene; | return rack::global_ui->app.gRackScene; | ||||
@@ -45,6 +45,7 @@ void Menu::step() { | |||||
} | } | ||||
void Menu::draw(NVGcontext *vg) { | void Menu::draw(NVGcontext *vg) { | ||||
// printf("xxx Menu::draw: box.size=(%f; %f)\n", box.size.x, box.size.y); | |||||
bndMenuBackground(vg, 0.0, 0.0, box.size.x, box.size.y, BND_CORNER_NONE); | bndMenuBackground(vg, 0.0, 0.0, box.size.x, box.size.y, BND_CORNER_NONE); | ||||
Widget::draw(vg); | Widget::draw(vg); | ||||
} | } | ||||
@@ -8,14 +8,17 @@ namespace rack { | |||||
void MenuLabel::draw(NVGcontext *vg) { | void MenuLabel::draw(NVGcontext *vg) { | ||||
bndMenuLabel(vg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str()); | |||||
// printf("xxx drawMenuLabel: text=\"%s\" box.size=(%f; %f)\n", text.c_str(), box.size.x, box.size.y); | |||||
bndMenuLabel(vg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str()); | |||||
} | } | ||||
void MenuLabel::step() { | void MenuLabel::step() { | ||||
// Add 10 more pixels because Retina measurements are sometimes too small | // Add 10 more pixels because Retina measurements are sometimes too small | ||||
const float rightPadding = 10.0; | const float rightPadding = 10.0; | ||||
// HACK use gVg from the window. | // HACK use gVg from the window. | ||||
// printf("xxx MenuLabel::step: x bndLabelWidth text=\"%s\"\n", text.c_str()); | |||||
box.size.x = bndLabelWidth(global_ui->window.gVg, -1, text.c_str()) + rightPadding; | box.size.x = bndLabelWidth(global_ui->window.gVg, -1, text.c_str()) + rightPadding; | ||||
// printf("xxx MenuLabel::step: => bndLabelWidth = %f\n", box.size.x); | |||||
Widget::step(); | Widget::step(); | ||||
} | } | ||||
@@ -24,6 +24,7 @@ Menu *Scene::createMenu() { | |||||
MenuOverlay *overlay = new MenuOverlay(); | MenuOverlay *overlay = new MenuOverlay(); | ||||
Menu *menu = new Menu(); | Menu *menu = new Menu(); | ||||
menu->box.pos = global_ui->window.gMousePos; | menu->box.pos = global_ui->window.gMousePos; | ||||
printf("xxx Scene::createMenu: box.size=(%f; %f)\n", box.size.x, box.size.y); | |||||
overlay->addChild(menu); | overlay->addChild(menu); | ||||
global_ui->ui.gScene->setOverlay(overlay); | global_ui->ui.gScene->setOverlay(overlay); | ||||
@@ -0,0 +1,143 @@ | |||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | |||||
<html><head> | |||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |||||
<title>POSIX Directory Browsing API for Win32</title> | |||||
<meta name="Author" content="Kevlin Henney"> | |||||
<meta name="Generator" content="Kevlin Henney"><!-- ;-) --> | |||||
<meta name="Classification" content="Documentation"> | |||||
</head> | |||||
<body> | |||||
<h1>POSIX Directory Browsing API for Windows</h1> | |||||
The functions and types specified in POSIX for iterating over directory | |||||
entries have been defined here as wrappers for porting to and common use on | |||||
Windows platforms. The values of <tt>errno</tt> set in the event of errors | |||||
are the most significant difference between the POSIX definition and the | |||||
wrapper API. | |||||
<p> | |||||
In addition to this documentation file, the software is provided in the | |||||
<a href="http://www.two-sdg.demon.co.uk/curbralan/code/dirent/dirent.h"><tt>dirent.h</tt></a> header file and the | |||||
<a href="http://www.two-sdg.demon.co.uk/curbralan/code/dirent/dirent.c"><tt>dirent.c</tt></a> C source file. To use the API | |||||
ensure that the path to the <tt>dirent.h</tt> header is either somewhere | |||||
standard or is provided to the compiler as an additional option. Ensure also | |||||
that the <tt>dirent.c</tt> file is compiled and the object file is either | |||||
referenced explicitly in the link or included in a referenced library. The | |||||
source code also compiles cleanly as C++, but it retains C linkage. | |||||
</p><p> | |||||
</p><hr> | |||||
<h2><tt><dirent.h></tt></h2> | |||||
<font size="+1"> | |||||
<ul> | |||||
<pre>typedef ... DIR; | |||||
struct dirent | |||||
{ | |||||
char *d_name; | |||||
}; | |||||
DIR *<a href="#opendir">opendir</a>(const char *name); | |||||
int <a href="#closedir">closedir</a>(DIR *dir); | |||||
struct dirent *<a href="#readdir">readdir</a>(DIR *dir); | |||||
void <a href="#rewinddir">rewinddir</a>(DIR *dir); | |||||
</pre> | |||||
</ul> | |||||
</font> | |||||
<hr> | |||||
<a name="opendir"><h2><tt>DIR *opendir(const char *name);</tt></h2></a> | |||||
<h4>Description</h4> | |||||
<ul> | |||||
The <tt>opendir</tt> function opens the directory specified by | |||||
<tt>name</tt>, which may use either <tt>/</tt> or <tt>\</tt> as a | |||||
directory separator but should not contain any wildcards. On success | |||||
it associates a <tt>DIR</tt> stream with the open directory. A non-null | |||||
<tt>DIR</tt> stream may be used in subsequent calls to | |||||
<a href="#readdir">readdir</a>, <a href="#rewinddir">rewinddir</a> and | |||||
<a href="#closedir">closedir</a>. | |||||
<p> | |||||
A successful result will position the <tt>DIR</tt> stream at the first | |||||
directory entry, ready for reading. Note that a truly empty directory | |||||
(one without even <tt>.</tt> or <tt>..</tt> entries) will not open | |||||
successfully. | |||||
</p></ul> | |||||
<h4>Returns</h4> | |||||
<ul> | |||||
A pointer to the <tt>DIR</tt> structure for the opened directory on | |||||
success, otherwise null on failure. | |||||
</ul> | |||||
<h4>Errors</h4> | |||||
<ul> | |||||
<tt>ENOENT </tt>No such directory.<br> | |||||
<tt>EINVAL </tt>Invalid argument or directory name.<br> | |||||
<tt>ENOMEM </tt>Not enough memory to perform the operation. | |||||
</ul> | |||||
<hr> | |||||
<a name="closedir"><h2><tt>int closedir(DIR *dir);</tt></h2></a> | |||||
<h4>Description</h4> | |||||
<ul> | |||||
The <tt>closedir</tt> function closes the directory stream associated with | |||||
<tt>dir</tt>, freeing resources as necessary and invalidating the | |||||
<tt>dir</tt> pointer. | |||||
</ul> | |||||
<h4>Returns</h4> | |||||
<ul> | |||||
Returns <tt>0</tt> on successful completion, otherwise <tt>-1</tt>. | |||||
</ul> | |||||
<h4>Errors</h4> | |||||
<ul> | |||||
<tt>EBADF </tt>Invalid directory stream. | |||||
</ul> | |||||
<hr> | |||||
<a name="readdir"><h2><tt>struct dirent *readdir(DIR *dir);</tt></h2></a> | |||||
<h4>Description</h4> | |||||
<ul> | |||||
The <tt>readdir</tt> function is used to iterate through the directory | |||||
stream <tt>dir</tt>. It advances it one entry at a time, details of which | |||||
it returns as its result. | |||||
<p> | |||||
On NTFS and FAT file systems, except for drive root directories, the caller | |||||
is guaranteed that the <tt>.</tt> and <tt>..</tt> entries will be included | |||||
in the directory stream. On FATX file systems the <tt>.</tt> and | |||||
<tt>..</tt> entries are not included. | |||||
</p></ul> | |||||
<h4>Returns</h4> | |||||
<ul> | |||||
Returns a pointer to the directory details on success, in which | |||||
<tt>d_name</tt> is the file name of the current entry, otherwise null | |||||
on error or end of stream. | |||||
</ul> | |||||
<h4>Errors</h4> | |||||
<ul> | |||||
<tt>ENOENT </tt>No more entries.<br> | |||||
<tt>EBADF </tt>Invalid directory stream. | |||||
</ul> | |||||
<hr> | |||||
<a name="rewinddir"><h2><tt>void rewinddir(DIR *dir);</tt></h2></a> | |||||
<h4>Description</h4> | |||||
<ul> | |||||
The <tt>rewindir</tt> function can be used to reset the directory stream | |||||
<tt>dir</tt> to the start. Sensible results cannot be guaranteed if the | |||||
directory name used in the initial call to <tt>opendir</tt> was a | |||||
relative path name and the program has since changed its current working | |||||
directory. | |||||
</ul> | |||||
<h4>Returns</h4> | |||||
<ul> | |||||
No error status is returned. | |||||
</ul> | |||||
<h4>Errors</h4> | |||||
<ul> | |||||
<tt>EBADF </tt>Invalid directory stream. | |||||
</ul> | |||||
<hr><p> | |||||
</p><div align="right"><i><font size="-1"> | |||||
© Copyright <a href="mailto:kevlin@acm.org">Kevlin Henney</a> | |||||
</font></i></div> | |||||
</body></html> |
@@ -0,0 +1,148 @@ | |||||
/* | |||||
Implementation of POSIX directory browsing functions and types for Win32. | |||||
Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) | |||||
History: Created March 1997. Updated June 2003 and July 2012. | |||||
Rights: See end of file. | |||||
*/ | |||||
#include "dirent.h" | |||||
#include <errno.h> | |||||
#include <io.h> /* _findfirst and _findnext set errno iff they return -1 */ | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
{ | |||||
#endif | |||||
typedef ptrdiff_t handle_type; /* C99's intptr_t not sufficiently portable */ | |||||
struct DIR | |||||
{ | |||||
handle_type handle; /* -1 for failed rewind */ | |||||
struct _finddata_t info; | |||||
struct dirent result; /* d_name null iff first time */ | |||||
char *name; /* null-terminated char string */ | |||||
}; | |||||
DIR *opendir(const char *name) | |||||
{ | |||||
DIR *dir = 0; | |||||
if(name && name[0]) | |||||
{ | |||||
size_t base_length = strlen(name); | |||||
const char *all = /* search pattern must end with suitable wildcard */ | |||||
strchr("/\\", name[base_length - 1]) ? "*" : "/*"; | |||||
if((dir = (DIR *) malloc(sizeof *dir)) != 0 && | |||||
(dir->name = (char *) malloc(base_length + strlen(all) + 1)) != 0) | |||||
{ | |||||
strcat(strcpy(dir->name, name), all); | |||||
if((dir->handle = | |||||
(handle_type) _findfirst(dir->name, &dir->info)) != -1) | |||||
{ | |||||
dir->result.d_name = 0; | |||||
} | |||||
else /* rollback */ | |||||
{ | |||||
free(dir->name); | |||||
free(dir); | |||||
dir = 0; | |||||
} | |||||
} | |||||
else /* rollback */ | |||||
{ | |||||
free(dir); | |||||
dir = 0; | |||||
errno = ENOMEM; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
errno = EINVAL; | |||||
} | |||||
return dir; | |||||
} | |||||
int closedir(DIR *dir) | |||||
{ | |||||
int result = -1; | |||||
if(dir) | |||||
{ | |||||
if(dir->handle != -1) | |||||
{ | |||||
result = _findclose(dir->handle); | |||||
} | |||||
free(dir->name); | |||||
free(dir); | |||||
} | |||||
if(result == -1) /* map all errors to EBADF */ | |||||
{ | |||||
errno = EBADF; | |||||
} | |||||
return result; | |||||
} | |||||
struct dirent *readdir(DIR *dir) | |||||
{ | |||||
struct dirent *result = 0; | |||||
if(dir && dir->handle != -1) | |||||
{ | |||||
if(!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1) | |||||
{ | |||||
result = &dir->result; | |||||
result->d_name = dir->info.name; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
errno = EBADF; | |||||
} | |||||
return result; | |||||
} | |||||
void rewinddir(DIR *dir) | |||||
{ | |||||
if(dir && dir->handle != -1) | |||||
{ | |||||
_findclose(dir->handle); | |||||
dir->handle = (handle_type) _findfirst(dir->name, &dir->info); | |||||
dir->result.d_name = 0; | |||||
} | |||||
else | |||||
{ | |||||
errno = EBADF; | |||||
} | |||||
} | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
/* | |||||
Copyright Kevlin Henney, 1997, 2003, 2012. All rights reserved. | |||||
Permission to use, copy, modify, and distribute this software and its | |||||
documentation for any purpose is hereby granted without fee, provided | |||||
that this copyright and permissions notice appear in all copies and | |||||
derivatives. | |||||
This software is supplied "as is" without express or implied warranty. | |||||
But that said, if there are any problems please get in touch. | |||||
*/ |
@@ -0,0 +1,50 @@ | |||||
#ifndef DIRENT_INCLUDED | |||||
#define DIRENT_INCLUDED | |||||
/* | |||||
Declaration of POSIX directory browsing functions and types for Win32. | |||||
Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) | |||||
History: Created March 1997. Updated June 2003. | |||||
Rights: See end of file. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
{ | |||||
#endif | |||||
typedef struct DIR DIR; | |||||
struct dirent | |||||
{ | |||||
char *d_name; | |||||
}; | |||||
DIR *opendir(const char *); | |||||
int closedir(DIR *); | |||||
struct dirent *readdir(DIR *); | |||||
void rewinddir(DIR *); | |||||
/* | |||||
Copyright Kevlin Henney, 1997, 2003. All rights reserved. | |||||
Permission to use, copy, modify, and distribute this software and its | |||||
documentation for any purpose is hereby granted without fee, provided | |||||
that this copyright and permissions notice appear in all copies and | |||||
derivatives. | |||||
This software is supplied "as is" without express or implied warranty. | |||||
But that said, if there are any problems please get in touch. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif |
@@ -9,6 +9,7 @@ namespace rack { | |||||
void loggerInit(bool devMode) { | void loggerInit(bool devMode) { | ||||
#ifdef RACK_HOST | |||||
global->logger.startTime = std::chrono::high_resolution_clock::now(); | global->logger.startTime = std::chrono::high_resolution_clock::now(); | ||||
if (devMode) { | if (devMode) { | ||||
global->logger.logFile = stderr; | global->logger.logFile = stderr; | ||||
@@ -17,12 +18,15 @@ void loggerInit(bool devMode) { | |||||
std::string logFilename = assetLocal("log.txt"); | std::string logFilename = assetLocal("log.txt"); | ||||
global->logger.logFile = fopen(logFilename.c_str(), "w"); | global->logger.logFile = fopen(logFilename.c_str(), "w"); | ||||
} | } | ||||
#endif // RACK_HOST | |||||
} | } | ||||
void loggerDestroy() { | void loggerDestroy() { | ||||
#ifdef RACK_HOST | |||||
if (global->logger.logFile != stderr) { | if (global->logger.logFile != stderr) { | ||||
fclose(global->logger.logFile); | fclose(global->logger.logFile); | ||||
} | } | ||||
#endif // RACK_HOST | |||||
} | } | ||||
static const char* const loggerText[] = { | static const char* const loggerText[] = { | ||||
@@ -40,6 +44,7 @@ static const int loggerColor[] = { | |||||
}; | }; | ||||
static void loggerLogVa(LoggerLevel level, const char *file, int line, const char *format, va_list args) { | static void loggerLogVa(LoggerLevel level, const char *file, int line, const char *format, va_list args) { | ||||
#ifdef RACK_HOST | |||||
auto nowTime = std::chrono::high_resolution_clock::now(); | auto nowTime = std::chrono::high_resolution_clock::now(); | ||||
int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - global->logger.startTime).count(); | int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - global->logger.startTime).count(); | ||||
if (global->logger.logFile == stderr) | if (global->logger.logFile == stderr) | ||||
@@ -52,13 +57,16 @@ static void loggerLogVa(LoggerLevel level, const char *file, int line, const cha | |||||
printf("\n"); // xxx | printf("\n"); // xxx | ||||
fprintf(global->logger.logFile, "\n"); | fprintf(global->logger.logFile, "\n"); | ||||
fflush(global->logger.logFile); | fflush(global->logger.logFile); | ||||
#endif // RACK_HOST | |||||
} | } | ||||
void loggerLog(LoggerLevel level, const char *file, int line, const char *format, ...) { | void loggerLog(LoggerLevel level, const char *file, int line, const char *format, ...) { | ||||
#ifdef RACK_HOST | |||||
va_list args; | va_list args; | ||||
va_start(args, format); | va_start(args, format); | ||||
loggerLogVa(level, file, line, format, args); | loggerLogVa(level, file, line, format, args); | ||||
va_end(args); | va_end(args); | ||||
#endif // RACK_HOST | |||||
} | } | ||||
/** Deprecated. Included for ABI compatibility */ | /** Deprecated. Included for ABI compatibility */ | ||||
@@ -4,6 +4,8 @@ | |||||
#ifdef YAC_POSIX | #ifdef YAC_POSIX | ||||
#include <dirent.h> | #include <dirent.h> | ||||
#include <sys/stat.h> | #include <sys/stat.h> | ||||
#else | |||||
#include "dirent_win32/dirent.h" | |||||
#endif // YAC_POSIX | #endif // YAC_POSIX | ||||
#if ARCH_WIN | #if ARCH_WIN | ||||
@@ -21,7 +23,6 @@ namespace rack { | |||||
std::vector<std::string> systemListEntries(std::string path) { | std::vector<std::string> systemListEntries(std::string path) { | ||||
std::vector<std::string> filenames; | std::vector<std::string> filenames; | ||||
#ifndef SKIP_SYSTEM_FXNS | |||||
DIR *dir = opendir(path.c_str()); | DIR *dir = opendir(path.c_str()); | ||||
if (dir) { | if (dir) { | ||||
struct dirent *d; | struct dirent *d; | ||||
@@ -33,7 +34,6 @@ std::vector<std::string> systemListEntries(std::string path) { | |||||
} | } | ||||
closedir(dir); | closedir(dir); | ||||
} | } | ||||
#endif | |||||
return filenames; | return filenames; | ||||
} | } | ||||
@@ -47,25 +47,31 @@ bool systemExists(std::string path) { | |||||
} | } | ||||
bool systemIsFile(std::string path) { | bool systemIsFile(std::string path) { | ||||
#ifndef SKIP_SYSTEM_FXNS | |||||
#ifdef ARCH_WIN | |||||
DWORD dwAttrib = ::GetFileAttributes(path.c_str()); | |||||
return | |||||
(dwAttrib != INVALID_FILE_ATTRIBUTES) && | |||||
(0 == (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) ; | |||||
#else | |||||
struct stat statbuf; | struct stat statbuf; | ||||
if (stat(path.c_str(), &statbuf)) | if (stat(path.c_str(), &statbuf)) | ||||
return false; | return false; | ||||
return S_ISREG(statbuf.st_mode); | return S_ISREG(statbuf.st_mode); | ||||
#else | |||||
return false; | |||||
#endif // SKIP_SYSTEM_FXNS | |||||
#endif // ARCH_WIN | |||||
} | } | ||||
bool systemIsDirectory(std::string path) { | bool systemIsDirectory(std::string path) { | ||||
#ifndef SKIP_SYSTEM_FXNS | |||||
#ifdef ARCH_WIN | |||||
DWORD dwAttrib = ::GetFileAttributes(path.c_str()); | |||||
return | |||||
(dwAttrib != INVALID_FILE_ATTRIBUTES) && | |||||
(0 != (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) ; | |||||
#else | |||||
struct stat statbuf; | struct stat statbuf; | ||||
if (stat(path.c_str(), &statbuf)) | if (stat(path.c_str(), &statbuf)) | ||||
return false; | return false; | ||||
return S_ISDIR(statbuf.st_mode); | return S_ISDIR(statbuf.st_mode); | ||||
#else | |||||
return false; | |||||
#endif // SKIP_SYSTEM_FXNS | |||||
#endif // ARCH_WIN | |||||
} | } | ||||
void systemCopy(std::string srcPath, std::string destPath) { | void systemCopy(std::string srcPath, std::string destPath) { | ||||
@@ -16,7 +16,7 @@ | |||||
/// limitations under the License. | /// limitations under the License. | ||||
/// | /// | ||||
/// created: 25Jun2018 | /// created: 25Jun2018 | ||||
/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018 | |||||
/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | |||||
/// | /// | ||||
/// | /// | ||||
/// | /// | ||||
@@ -56,6 +56,7 @@ extern void vst2_queue_param (int uniqueParamId, float normValue); | |||||
extern void vst2_handle_queued_params (void); | extern void vst2_handle_queued_params (void); | ||||
extern float vst2_get_param (int uniqueParamId); | extern float vst2_get_param (int uniqueParamId); | ||||
extern void vst2_get_param_name (int uniqueParamId, char *s, int sMaxLen); | extern void vst2_get_param_name (int uniqueParamId, char *s, int sMaxLen); | ||||
extern void vst2_set_shared_plugin_tls_globals (void); | |||||
#include "../include/window.hpp" | #include "../include/window.hpp" | ||||
@@ -830,6 +831,8 @@ static DWORD WINAPI vst2_ui_thread_entry(VSTPluginWrapper *_wrapper) { | |||||
_wrapper->b_thread_started = YAC_TRUE; | _wrapper->b_thread_started = YAC_TRUE; | ||||
vst2_set_shared_plugin_tls_globals(); | |||||
while(_wrapper->b_thread_running || _wrapper->b_queued_destroy_editor || _wrapper->queued_load_patch.addr) | while(_wrapper->b_thread_running || _wrapper->b_queued_destroy_editor || _wrapper->queued_load_patch.addr) | ||||
{ | { | ||||
// printf("xxx vstrack_plugin<ui>: idle loop\n"); | // printf("xxx vstrack_plugin<ui>: idle loop\n"); | ||||
@@ -1001,6 +1004,7 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||||
wrapper->lockAudio(); | wrapper->lockAudio(); | ||||
wrapper->setGlobals(); | wrapper->setGlobals(); | ||||
vst2_set_shared_plugin_tls_globals(); | |||||
// // rack::global->engine.vipMutex.lock(); | // // rack::global->engine.vipMutex.lock(); | ||||
rack::global->engine.mutex.lock(); | rack::global->engine.mutex.lock(); | ||||
rack::global->vst2.last_seen_num_frames = sUI(sampleFrames); | rack::global->vst2.last_seen_num_frames = sUI(sampleFrames); | ||||
@@ -1014,17 +1018,18 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||||
sUI i; | sUI i; | ||||
sUI k = 0u; | sUI k = 0u; | ||||
if(wrapper->b_processing) | |||||
// Clear output buffers | |||||
// (note) AudioInterface instances accumulate samples in the output buffer | |||||
for(i = 0u; i < uint32_t(sampleFrames); i++) | |||||
{ | { | ||||
// Clear output buffers | |||||
// (note) AudioInterface instances accumulate samples in the output buffer | |||||
for(i = 0u; i < uint32_t(sampleFrames); i++) | |||||
for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) | |||||
{ | { | ||||
for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) | |||||
{ | |||||
outputs[chIdx][i] = 0.0f; | |||||
} | |||||
outputs[chIdx][i] = 0.0f; | |||||
} | } | ||||
} | |||||
if(1 && wrapper->b_processing) | |||||
{ | |||||
#ifdef HAVE_WINDOWS | #ifdef HAVE_WINDOWS | ||||
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); | _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); | ||||
@@ -1032,18 +1037,6 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||||
vst2_engine_process(inputs, outputs, sampleFrames); | vst2_engine_process(inputs, outputs, sampleFrames); | ||||
} | } | ||||
else | |||||
{ | |||||
// Not processing, output silence | |||||
// printf("xxx vstrack_plugin: output silence\n"); | |||||
for(i = 0u; i < uint32_t(sampleFrames); i++) | |||||
{ | |||||
for(chIdx = 0u; chIdx < NUM_OUTPUTS; chIdx++) | |||||
{ | |||||
outputs[chIdx][i] = 0.0f; | |||||
} | |||||
} | |||||
} | |||||
// // rack::global->engine.vipMutex.unlock(); | // // rack::global->engine.vipMutex.unlock(); | ||||
rack::global->engine.mutex.unlock(); | rack::global->engine.mutex.unlock(); | ||||
@@ -5,6 +5,7 @@ | |||||
#include "nanovg_gl_utils.h" | #include "nanovg_gl_utils.h" | ||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
// #include <windows.h> | |||||
namespace rack { | namespace rack { | ||||
@@ -35,8 +36,14 @@ FramebufferWidget::~FramebufferWidget() { | |||||
void FramebufferWidget::draw(NVGcontext *vg) { | void FramebufferWidget::draw(NVGcontext *vg) { | ||||
// Bypass framebuffer rendering entirely | // Bypass framebuffer rendering entirely | ||||
// Widget::draw(vg); | |||||
// return; | |||||
#ifdef RACK_PLUGIN_SHARED | |||||
// (note) FBO path crashes when plugin is a DLL (!) | |||||
// (the glGenFramebuffers() call in nvgluCreateFramebuffer() to be precise) | |||||
Widget::draw(vg); | |||||
return; | |||||
#endif // RACK_PLUGIN_SHARED | |||||
// printf("xxx FramebufferWidget::draw: ENTER vg=%p\n", vg); | |||||
// printf("xxx FramebufferWidget::draw: GetCurrentThreadId=%d\n", GetCurrentThreadId()); | |||||
// Get world transform | // Get world transform | ||||
float xform[6]; | float xform[6]; | ||||
@@ -49,69 +56,103 @@ void FramebufferWidget::draw(NVGcontext *vg) { | |||||
Vec bi = b.floor(); | Vec bi = b.floor(); | ||||
Vec bf = b.minus(bi); | Vec bf = b.minus(bi); | ||||
// printf("xxx FramebufferWidget::draw: 2 dirty=%d\n", dirty); | |||||
// Render to framebuffer | // Render to framebuffer | ||||
if (dirty) { | if (dirty) { | ||||
dirty = false; | dirty = false; | ||||
// printf("xxx FramebufferWidget::draw: 2b internal=%p\n", internal); | |||||
internal->box = getChildrenBoundingBox(); | internal->box = getChildrenBoundingBox(); | ||||
internal->box.pos = internal->box.pos.mult(s).floor(); | internal->box.pos = internal->box.pos.mult(s).floor(); | ||||
internal->box.size = internal->box.size.mult(s).ceil().plus(Vec(1, 1)); | internal->box.size = internal->box.size.mult(s).ceil().plus(Vec(1, 1)); | ||||
// printf("xxx FramebufferWidget::draw: 3b\n"); | |||||
Vec fbSize = internal->box.size.mult(global_ui->window.gPixelRatio * oversample); | Vec fbSize = internal->box.size.mult(global_ui->window.gPixelRatio * oversample); | ||||
// printf("xxx FramebufferWidget::draw: 4b\n"); | |||||
if (!fbSize.isFinite()) | if (!fbSize.isFinite()) | ||||
return; | return; | ||||
if (fbSize.isZero()) | if (fbSize.isZero()) | ||||
return; | return; | ||||
// printf("xxx FramebufferWidget::draw: 5b\n"); | |||||
// info("rendering framebuffer %f %f", fbSize.x, fbSize.y); | // info("rendering framebuffer %f %f", fbSize.x, fbSize.y); | ||||
// Delete old one first to free up GPU memory | // Delete old one first to free up GPU memory | ||||
internal->setFramebuffer(NULL); | internal->setFramebuffer(NULL); | ||||
// printf("xxx FramebufferWidget::draw: 5b2 global_ui->window.gVg=%p nvgluCreateFramebuffer=%p global_ui=%p\n", global_ui->window.gVg, global_ui); | |||||
// Create a framebuffer from the main nanovg context. We will draw to this in the secondary nanovg context. | // Create a framebuffer from the main nanovg context. We will draw to this in the secondary nanovg context. | ||||
NVGLUframebuffer *fb = nvgluCreateFramebuffer(global_ui->window.gVg, fbSize.x, fbSize.y, 0); | |||||
NVGLUframebuffer *fb = nvgluCreateFramebuffer(global_ui->window.gVg, fbSize.x, fbSize.y, 0); | |||||
// // NVGLUframebuffer *fb = nvgluCreateFramebuffer(NULL, 0, 0, 0); | |||||
// printf("xxx FramebufferWidget::draw: 6b fb=%p\n", fb); | |||||
if (!fb) | if (!fb) | ||||
return; | return; | ||||
internal->setFramebuffer(fb); | internal->setFramebuffer(fb); | ||||
// printf("xxx FramebufferWidget::draw: 7b\n"); | |||||
nvgluBindFramebuffer(fb); | nvgluBindFramebuffer(fb); | ||||
glViewport(0.0, 0.0, fbSize.x, fbSize.y); | glViewport(0.0, 0.0, fbSize.x, fbSize.y); | ||||
glClearColor(0.0, 0.0, 0.0, 0.0); | glClearColor(0.0, 0.0, 0.0, 0.0); | ||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | ||||
// printf("xxx FramebufferWidget::draw: 8b\n"); | |||||
nvgBeginFrame(global_ui->window.gFramebufferVg, fbSize.x, fbSize.y, global_ui->window.gPixelRatio * oversample); | nvgBeginFrame(global_ui->window.gFramebufferVg, fbSize.x, fbSize.y, global_ui->window.gPixelRatio * oversample); | ||||
nvgScale(global_ui->window.gFramebufferVg, global_ui->window.gPixelRatio * oversample, global_ui->window.gPixelRatio * oversample); | nvgScale(global_ui->window.gFramebufferVg, global_ui->window.gPixelRatio * oversample, global_ui->window.gPixelRatio * oversample); | ||||
// printf("xxx FramebufferWidget::draw: 9b\n"); | |||||
// Use local scaling | // Use local scaling | ||||
nvgTranslate(global_ui->window.gFramebufferVg, bf.x, bf.y); | nvgTranslate(global_ui->window.gFramebufferVg, bf.x, bf.y); | ||||
nvgTranslate(global_ui->window.gFramebufferVg, -internal->box.pos.x, -internal->box.pos.y); | nvgTranslate(global_ui->window.gFramebufferVg, -internal->box.pos.x, -internal->box.pos.y); | ||||
nvgScale(global_ui->window.gFramebufferVg, s.x, s.y); | nvgScale(global_ui->window.gFramebufferVg, s.x, s.y); | ||||
// printf("xxx FramebufferWidget::draw: 10b\n"); | |||||
Widget::draw(global_ui->window.gFramebufferVg); | Widget::draw(global_ui->window.gFramebufferVg); | ||||
// printf("xxx FramebufferWidget::draw: 11b\n"); | |||||
nvgEndFrame(global_ui->window.gFramebufferVg); | nvgEndFrame(global_ui->window.gFramebufferVg); | ||||
// printf("xxx FramebufferWidget::draw: 12b\n"); | |||||
nvgluBindFramebuffer(NULL); | nvgluBindFramebuffer(NULL); | ||||
// printf("xxx FramebufferWidget::draw: 13b\n"); | |||||
} | } | ||||
// printf("xxx FramebufferWidget::draw: 3\n"); | |||||
if (!internal->fb) { | if (!internal->fb) { | ||||
return; | return; | ||||
} | } | ||||
// printf("xxx FramebufferWidget::draw: 4\n"); | |||||
// Draw framebuffer image, using world coordinates | // Draw framebuffer image, using world coordinates | ||||
nvgSave(vg); | nvgSave(vg); | ||||
nvgResetTransform(vg); | nvgResetTransform(vg); | ||||
nvgTranslate(vg, bi.x, bi.y); | nvgTranslate(vg, bi.x, bi.y); | ||||
// printf("xxx FramebufferWidget::draw: 5\n"); | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
nvgRect(vg, internal->box.pos.x, internal->box.pos.y, internal->box.size.x, internal->box.size.y); | nvgRect(vg, internal->box.pos.x, internal->box.pos.y, internal->box.size.x, internal->box.size.y); | ||||
NVGpaint paint = nvgImagePattern(vg, internal->box.pos.x, internal->box.pos.y, internal->box.size.x, internal->box.size.y, 0.0, internal->fb->image, 1.0); | NVGpaint paint = nvgImagePattern(vg, internal->box.pos.x, internal->box.pos.y, internal->box.size.x, internal->box.size.y, 0.0, internal->fb->image, 1.0); | ||||
nvgFillPaint(vg, paint); | nvgFillPaint(vg, paint); | ||||
nvgFill(vg); | nvgFill(vg); | ||||
// printf("xxx FramebufferWidget::draw: 6\n"); | |||||
// For debugging the bounding box of the framebuffer | // For debugging the bounding box of the framebuffer | ||||
// nvgStrokeWidth(vg, 2.0); | // nvgStrokeWidth(vg, 2.0); | ||||
// nvgStrokeColor(vg, nvgRGBA(255, 0, 0, 128)); | // nvgStrokeColor(vg, nvgRGBA(255, 0, 0, 128)); | ||||
// nvgStroke(vg); | // nvgStroke(vg); | ||||
nvgRestore(vg); | nvgRestore(vg); | ||||
// printf("xxx FramebufferWidget::draw: LEAVE\n"); | |||||
} | } | ||||
int FramebufferWidget::getImageHandle() { | int FramebufferWidget::getImageHandle() { | ||||
@@ -210,10 +210,12 @@ void SVGWidget::setSVG(std::shared_ptr<SVG> svg) { | |||||
} | } | ||||
void SVGWidget::draw(NVGcontext *vg) { | void SVGWidget::draw(NVGcontext *vg) { | ||||
// printf("xxx SVGWidget::draw: ENTER\n"); | |||||
if (svg && svg->handle) { | if (svg && svg->handle) { | ||||
// printf("drawing svg %f %f\n", box.size.x, box.size.y); | // printf("drawing svg %f %f\n", box.size.x, box.size.y); | ||||
drawSVG(vg, svg->handle); | drawSVG(vg, svg->handle); | ||||
} | } | ||||
// printf("xxx SVGWidget::draw: LEAVE\n"); | |||||
} | } | ||||
@@ -110,12 +110,18 @@ void Widget::step() { | |||||
void Widget::draw(NVGcontext *vg) { | void Widget::draw(NVGcontext *vg) { | ||||
for (Widget *child : children) { | for (Widget *child : children) { | ||||
// printf("xxx Widget::draw: 1 child=%p vg=%p\n", child, vg); | |||||
if (!child->visible) | if (!child->visible) | ||||
continue; | continue; | ||||
// printf("xxx Widget::draw: 2 child=%p\n", child); | |||||
nvgSave(vg); | nvgSave(vg); | ||||
// printf("xxx Widget::draw: 3 child=%p\n", child); | |||||
nvgTranslate(vg, child->box.pos.x, child->box.pos.y); | nvgTranslate(vg, child->box.pos.x, child->box.pos.y); | ||||
// printf("xxx Widget::draw: 4 child=%p\n", child); | |||||
child->draw(vg); | child->draw(vg); | ||||
// printf("xxx Widget::draw: 5 child=%p\n", child); | |||||
nvgRestore(vg); | nvgRestore(vg); | ||||
// printf("xxx Widget::draw: 6 child=%p\n", child); | |||||
} | } | ||||
} | } | ||||
@@ -306,6 +306,7 @@ void errorCallback(int error, const char *description) { | |||||
void renderGui() { | void renderGui() { | ||||
int width, height; | int width, height; | ||||
// printf("xxx renderGui: ENTER\n"); | |||||
glfwGetFramebufferSize(global_ui->window.gWindow, &width, &height); | glfwGetFramebufferSize(global_ui->window.gWindow, &width, &height); | ||||
// Update and render | // Update and render | ||||
@@ -313,13 +314,16 @@ void renderGui() { | |||||
nvgReset(global_ui->window.gVg); | nvgReset(global_ui->window.gVg); | ||||
nvgScale(global_ui->window.gVg, global_ui->window.gPixelRatio, global_ui->window.gPixelRatio); | nvgScale(global_ui->window.gVg, global_ui->window.gPixelRatio, global_ui->window.gPixelRatio); | ||||
// printf("xxx renderGui: gScene->draw() BEGIN\n"); | |||||
global_ui->ui.gScene->draw(global_ui->window.gVg); | global_ui->ui.gScene->draw(global_ui->window.gVg); | ||||
// printf("xxx renderGui: gScene->draw() END\n"); | |||||
glViewport(0, 0, width, height); | glViewport(0, 0, width, height); | ||||
glClearColor(0.0, 0.0, 0.0, 1.0); | glClearColor(0.0, 0.0, 0.0, 1.0); | ||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | ||||
nvgEndFrame(global_ui->window.gVg); | nvgEndFrame(global_ui->window.gVg); | ||||
glfwSwapBuffers(global_ui->window.gWindow); | glfwSwapBuffers(global_ui->window.gWindow); | ||||
// printf("xxx renderGui: LEAVE\n"); | |||||
} | } | ||||
void windowInit() { | void windowInit() { | ||||
@@ -469,7 +473,9 @@ void windowRun() { | |||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
) { | ) { | ||||
#ifndef RACK_PLUGIN | |||||
vst2_handle_queued_set_program_chunk(); | vst2_handle_queued_set_program_chunk(); | ||||
#endif // RACK_PLUGIN | |||||
double startTime = glfwGetTime(); | double startTime = glfwGetTime(); | ||||
global_ui->window.gGuiFrame++; | global_ui->window.gGuiFrame++; | ||||
@@ -547,6 +553,7 @@ void windowRun() { | |||||
break; | break; | ||||
} | } | ||||
#if defined(YAC_WIN32) && defined(VST2_REPARENT_WINDOW_HACK) | #if defined(YAC_WIN32) && defined(VST2_REPARENT_WINDOW_HACK) | ||||
#ifndef RACK_PLUGIN | |||||
else if(rack::global_ui->vst2.b_queued_maximize_window || __glfw_hack__b_queued_maximize_window) | else if(rack::global_ui->vst2.b_queued_maximize_window || __glfw_hack__b_queued_maximize_window) | ||||
{ | { | ||||
rack::global_ui->vst2.b_queued_maximize_window = false; | rack::global_ui->vst2.b_queued_maximize_window = false; | ||||
@@ -554,6 +561,7 @@ void windowRun() { | |||||
vst2_maximize_reparented_window(); | vst2_maximize_reparented_window(); | ||||
} | } | ||||
#endif // VST2_REPARENT_WINDOW_HACK | #endif // VST2_REPARENT_WINDOW_HACK | ||||
#endif // RACK_PLUGIN | |||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
} | } | ||||
@@ -749,13 +757,16 @@ std::shared_ptr<Image> Image::load(const std::string &filename) { | |||||
//////////////////// | //////////////////// | ||||
SVG::SVG(const std::string &filename) { | SVG::SVG(const std::string &filename) { | ||||
// printf("xxx SVG::SVG: ENTER\n"); | |||||
handle = nsvgParseFromFile(filename.c_str(), "px", SVG_DPI); | handle = nsvgParseFromFile(filename.c_str(), "px", SVG_DPI); | ||||
// printf("xxx SVG::SVG: handle=%p\n"); | |||||
if (handle) { | if (handle) { | ||||
info("Loaded SVG %s", filename.c_str()); | info("Loaded SVG %s", filename.c_str()); | ||||
} | } | ||||
else { | else { | ||||
warn("Failed to load SVG %s", filename.c_str()); | warn("Failed to load SVG %s", filename.c_str()); | ||||
} | } | ||||
// printf("xxx SVG::SVG: LEAVE\n"); | |||||
} | } | ||||
SVG::~SVG() { | SVG::~SVG() { | ||||
@@ -763,9 +774,12 @@ SVG::~SVG() { | |||||
} | } | ||||
std::shared_ptr<SVG> SVG::load(const std::string &filename) { | std::shared_ptr<SVG> SVG::load(const std::string &filename) { | ||||
// printf("xxx SVG::load: ENTER\n"); | |||||
auto sp = global_ui->window.svg_cache[filename].lock(); | auto sp = global_ui->window.svg_cache[filename].lock(); | ||||
// printf("xxx SVG::load: cache locked OK\n"); | |||||
if (!sp) | if (!sp) | ||||
global_ui->window.svg_cache[filename] = sp = std::make_shared<SVG>(filename); | global_ui->window.svg_cache[filename] = sp = std::make_shared<SVG>(filename); | ||||
// printf("xxx SVG::load: RETURN\n"); | |||||
return sp; | return sp; | ||||
} | } | ||||
@@ -1,3 +1,9 @@ | |||||
** July 13th, 2018 | |||||
- add support for dynamically loaded plugins ("plugin.dll") | |||||
- add module Template_shared.MyModule | |||||
- change: the dBiz.* modules are now linked dynamically | |||||
** July 12th, 2018 | ** July 12th, 2018 | ||||
- fix: assign unique VST param base id when duplicating modules | - fix: assign unique VST param base id when duplicating modules | ||||
- change: Core.MIDI*: pre-select default VST MIDI input device | - change: Core.MIDI*: pre-select default VST MIDI input device | ||||
@@ -1,80 +1,111 @@ | |||||
[0.000 info src/main.cpp:63] VeeSeeVST Rack 0.6.1 | [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: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/main.cpp:67] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | ||||
[0.000 info src/plugin.cpp:639] vcvrack: Loaded static plugin Alikins 0.6.1 | |||||
[0.000 info src/plugin.cpp:639] vcvrack: Loaded static plugin AS 0.6.1 | |||||
[0.001 info src/plugin.cpp:639] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 | |||||
[0.001 info src/plugin.cpp:639] vcvrack: Loaded static plugin BaconMusic 0.6.1 | |||||
[0.002 info src/plugin.cpp:639] vcvrack: Loaded static plugin Befaco 0.6.1 | |||||
[0.002 info src/plugin.cpp:639] vcvrack: Loaded static plugin Bidoo 0.6.1 | |||||
[0.002 info src/plugin.cpp:639] vcvrack: Loaded static plugin Bogaudio 0.6.1 | |||||
[0.003 info src/plugin.cpp:639] vcvrack: Loaded static plugin cf 0.6.1 | |||||
[0.003 info src/plugin.cpp:639] vcvrack: Loaded static plugin dBiz 0.6.1 | |||||
[0.003 info src/plugin.cpp:639] vcvrack: Loaded static plugin DHE-Modules 0.6.1 | |||||
[0.003 info src/plugin.cpp:639] vcvrack: Loaded static plugin DrumKit 0.6.1 | |||||
[0.003 info src/plugin.cpp:639] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 | |||||
[0.003 info src/plugin.cpp:639] vcvrack: Loaded static plugin ESeries 0.6.1 | |||||
[0.004 info src/plugin.cpp:639] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 | |||||
[0.004 info src/plugin.cpp:639] vcvrack: Loaded static plugin Fundamental 0.6.1 | |||||
[0.004 info src/plugin.cpp:639] vcvrack: Loaded static plugin Gratrix 0.6.1 | |||||
[0.004 info src/plugin.cpp:639] vcvrack: Loaded static plugin HetrickCV 0.6.1 | |||||
[0.004 info src/plugin.cpp:639] vcvrack: Loaded static plugin huaba 0.6.1 | |||||
[0.005 info src/plugin.cpp:639] vcvrack: Loaded static plugin JW-Modules 0.6.1 | |||||
[0.005 info src/plugin.cpp:639] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 | |||||
[0.005 info src/plugin.cpp:639] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 | |||||
[0.005 info src/plugin.cpp:639] vcvrack: Loaded static plugin LOGinstruments 0.6.1 | |||||
[0.005 info src/plugin.cpp:639] vcvrack: Loaded static plugin ML_modules 0.6.1 | |||||
[0.005 info src/plugin.cpp:639] vcvrack: Loaded static plugin moDllz 0.6.1 | |||||
[0.006 info src/plugin.cpp:639] vcvrack: Loaded static plugin modular80 0.6.1 | |||||
[0.006 info src/plugin.cpp:639] vcvrack: Loaded static plugin mscHack 0.6.1 | |||||
[0.006 info src/plugin.cpp:639] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 | |||||
[0.006 info src/plugin.cpp:639] vcvrack: Loaded static plugin NauModular 0.6.1 | |||||
[0.006 info src/plugin.cpp:639] vcvrack: Loaded static plugin Ohmer 0.6.1 | |||||
[0.006 info src/plugin.cpp:639] vcvrack: Loaded static plugin Qwelk 0.6.1 | |||||
[0.007 info src/plugin.cpp:639] vcvrack: Loaded static plugin RJModules 0.6.1 | |||||
[0.007 info src/plugin.cpp:639] vcvrack: Loaded static plugin SerialRacker 0.6.1 | |||||
[0.007 info src/plugin.cpp:639] vcvrack: Loaded static plugin SonusModular 0.6.1 | |||||
[0.007 info src/plugin.cpp:639] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 | |||||
[0.007 info src/plugin.cpp:639] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 | |||||
[0.008 info src/plugin.cpp:639] vcvrack: Loaded static plugin SubmarineFree 0.6.1 | |||||
[0.008 info src/plugin.cpp:639] vcvrack: Loaded static plugin Template 0.6.1 | |||||
[0.008 info src/plugin.cpp:639] vcvrack: Loaded static plugin trowaSoft 0.6.1 | |||||
[0.008 info src/plugin.cpp:639] vcvrack: Loaded static plugin unless_modules 0.6.1 | |||||
[0.008 info src/plugin.cpp:639] vcvrack: Loaded static plugin Valley 0.6.1 | |||||
[0.009 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg | |||||
[0.009 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg | |||||
[0.009 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg | |||||
[0.009 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg | |||||
[0.009 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg | |||||
[0.009 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg | |||||
[0.010 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg | |||||
[0.010 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg | |||||
[0.010 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg | |||||
[0.186 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf | |||||
[0.187 info src/settings.cpp:185] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||||
[0.288 info src/app/RackWidget.cpp:192] Loading patch from string | |||||
[0.290 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg | |||||
[0.290 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg | |||||
[0.290 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg | |||||
[0.291 info src/window.cpp:703] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf | |||||
[0.292 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg | |||||
[0.294 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg | |||||
[0.294 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg | |||||
[0.295 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg | |||||
[0.295 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg | |||||
[0.295 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg | |||||
[0.295 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg | |||||
[0.295 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg | |||||
[0.296 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg | |||||
[0.296 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg | |||||
[0.297 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg | |||||
[0.297 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg | |||||
[0.298 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg | |||||
[0.298 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg | |||||
[0.299 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg | |||||
[0.299 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg | |||||
[0.300 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg | |||||
[0.300 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg | |||||
[0.300 info src/window.cpp:754] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg | |||||
[25.866 info src/app/RackWidget.cpp:137] Saving patch F:\eureka_data\vst_patches\vcvrack_duplicate_test2.vcv | |||||
[29.444 info src/app/RackWidget.cpp:154] Saving patch to string | |||||
[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin Alikins 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin AS 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 | |||||
[0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin BaconMusic 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Befaco 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bidoo 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Bogaudio 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin cf 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin DHE-Modules 0.6.1 | |||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin DrumKit 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin ErraticInstruments 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin ESeries 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin FrozenWasteland 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Fundamental 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin Gratrix 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin HetrickCV 0.6.1 | |||||
[0.003 info src/plugin.cpp:673] vcvrack: Loaded static plugin huaba 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin JW-Modules 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin LOGinstruments 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 | |||||
[0.004 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Ohmer 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin Qwelk 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin SerialRacker 0.6.1 | |||||
[0.005 info src/plugin.cpp:673] vcvrack: Loaded static plugin SonusModular 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Southpole-parasites 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin squinkylabs-plug1 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin SubmarineFree 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Template 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin trowaSoft 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin unless_modules 0.6.1 | |||||
[0.006 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 0.6.1 | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist | |||||
[0.007 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist | |||||
[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist | |||||
[0.008 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist | |||||
[0.008 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist | |||||
[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist | |||||
[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist | |||||
[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist | |||||
[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist | |||||
[0.013 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll | |||||
[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist | |||||
[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist | |||||
[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist | |||||
[0.014 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg | |||||
[0.014 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg | |||||
[0.014 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg | |||||
[0.014 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg | |||||
[0.014 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg | |||||
[0.015 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg | |||||
[0.015 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg | |||||
[0.015 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg | |||||
[0.015 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg | |||||
[0.192 info src/window.cpp:711] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf | |||||
[0.194 info src/settings.cpp:185] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||||
[0.295 info src/app/RackWidget.cpp:196] Loading patch from string | |||||
[0.297 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg | |||||
[0.297 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg | |||||
[0.297 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg | |||||
[0.297 info src/window.cpp:711] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf | |||||
[0.299 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg | |||||
[0.301 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg | |||||
[0.301 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg | |||||
[0.303 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg | |||||
[0.303 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg | |||||
[0.305 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg | |||||
[0.305 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg | |||||
[0.305 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg | |||||
[0.305 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg | |||||
[0.306 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg | |||||
[223.996 info src/app/RackWidget.cpp:158] Saving patch to string |
@@ -0,0 +1,121 @@ | |||||
Creative Commons Legal Code | |||||
CC0 1.0 Universal | |||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE | |||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN | |||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS | |||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES | |||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS | |||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM | |||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED | |||||
HEREUNDER. | |||||
Statement of Purpose | |||||
The laws of most jurisdictions throughout the world automatically confer | |||||
exclusive Copyright and Related Rights (defined below) upon the creator | |||||
and subsequent owner(s) (each and all, an "owner") of an original work of | |||||
authorship and/or a database (each, a "Work"). | |||||
Certain owners wish to permanently relinquish those rights to a Work for | |||||
the purpose of contributing to a commons of creative, cultural and | |||||
scientific works ("Commons") that the public can reliably and without fear | |||||
of later claims of infringement build upon, modify, incorporate in other | |||||
works, reuse and redistribute as freely as possible in any form whatsoever | |||||
and for any purposes, including without limitation commercial purposes. | |||||
These owners may contribute to the Commons to promote the ideal of a free | |||||
culture and the further production of creative, cultural and scientific | |||||
works, or to gain reputation or greater distribution for their Work in | |||||
part through the use and efforts of others. | |||||
For these and/or other purposes and motivations, and without any | |||||
expectation of additional consideration or compensation, the person | |||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she | |||||
is an owner of Copyright and Related Rights in the Work, voluntarily | |||||
elects to apply CC0 to the Work and publicly distribute the Work under its | |||||
terms, with knowledge of his or her Copyright and Related Rights in the | |||||
Work and the meaning and intended legal effect of CC0 on those rights. | |||||
1. Copyright and Related Rights. A Work made available under CC0 may be | |||||
protected by copyright and related or neighboring rights ("Copyright and | |||||
Related Rights"). Copyright and Related Rights include, but are not | |||||
limited to, the following: | |||||
i. the right to reproduce, adapt, distribute, perform, display, | |||||
communicate, and translate a Work; | |||||
ii. moral rights retained by the original author(s) and/or performer(s); | |||||
iii. publicity and privacy rights pertaining to a person's image or | |||||
likeness depicted in a Work; | |||||
iv. rights protecting against unfair competition in regards to a Work, | |||||
subject to the limitations in paragraph 4(a), below; | |||||
v. rights protecting the extraction, dissemination, use and reuse of data | |||||
in a Work; | |||||
vi. database rights (such as those arising under Directive 96/9/EC of the | |||||
European Parliament and of the Council of 11 March 1996 on the legal | |||||
protection of databases, and under any national implementation | |||||
thereof, including any amended or successor version of such | |||||
directive); and | |||||
vii. other similar, equivalent or corresponding rights throughout the | |||||
world based on applicable law or treaty, and any national | |||||
implementations thereof. | |||||
2. Waiver. To the greatest extent permitted by, but not in contravention | |||||
of, applicable law, Affirmer hereby overtly, fully, permanently, | |||||
irrevocably and unconditionally waives, abandons, and surrenders all of | |||||
Affirmer's Copyright and Related Rights and associated claims and causes | |||||
of action, whether now known or unknown (including existing as well as | |||||
future claims and causes of action), in the Work (i) in all territories | |||||
worldwide, (ii) for the maximum duration provided by applicable law or | |||||
treaty (including future time extensions), (iii) in any current or future | |||||
medium and for any number of copies, and (iv) for any purpose whatsoever, | |||||
including without limitation commercial, advertising or promotional | |||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each | |||||
member of the public at large and to the detriment of Affirmer's heirs and | |||||
successors, fully intending that such Waiver shall not be subject to | |||||
revocation, rescission, cancellation, termination, or any other legal or | |||||
equitable action to disrupt the quiet enjoyment of the Work by the public | |||||
as contemplated by Affirmer's express Statement of Purpose. | |||||
3. Public License Fallback. Should any part of the Waiver for any reason | |||||
be judged legally invalid or ineffective under applicable law, then the | |||||
Waiver shall be preserved to the maximum extent permitted taking into | |||||
account Affirmer's express Statement of Purpose. In addition, to the | |||||
extent the Waiver is so judged Affirmer hereby grants to each affected | |||||
person a royalty-free, non transferable, non sublicensable, non exclusive, | |||||
irrevocable and unconditional license to exercise Affirmer's Copyright and | |||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the | |||||
maximum duration provided by applicable law or treaty (including future | |||||
time extensions), (iii) in any current or future medium and for any number | |||||
of copies, and (iv) for any purpose whatsoever, including without | |||||
limitation commercial, advertising or promotional purposes (the | |||||
"License"). The License shall be deemed effective as of the date CC0 was | |||||
applied by Affirmer to the Work. Should any part of the License for any | |||||
reason be judged legally invalid or ineffective under applicable law, such | |||||
partial invalidity or ineffectiveness shall not invalidate the remainder | |||||
of the License, and in such case Affirmer hereby affirms that he or she | |||||
will not (i) exercise any of his or her remaining Copyright and Related | |||||
Rights in the Work or (ii) assert any associated claims and causes of | |||||
action with respect to the Work, in either case contrary to Affirmer's | |||||
express Statement of Purpose. | |||||
4. Limitations and Disclaimers. | |||||
a. No trademark or patent rights held by Affirmer are waived, abandoned, | |||||
surrendered, licensed or otherwise affected by this document. | |||||
b. Affirmer offers the Work as-is and makes no representations or | |||||
warranties of any kind concerning the Work, express, implied, | |||||
statutory or otherwise, including without limitation warranties of | |||||
title, merchantability, fitness for a particular purpose, non | |||||
infringement, or the absence of latent or other defects, accuracy, or | |||||
the present or absence of errors, whether or not discoverable, all to | |||||
the greatest extent permissible under applicable law. | |||||
c. Affirmer disclaims responsibility for clearing rights of other persons | |||||
that may apply to the Work or any use thereof, including without | |||||
limitation any person's Copyright and Related Rights in the Work. | |||||
Further, Affirmer disclaims responsibility for obtaining any necessary | |||||
consents, permissions or other rights required for any use of the | |||||
Work. | |||||
d. Affirmer understands and acknowledges that Creative Commons is not a | |||||
party to this document and has no duty or obligation with respect to | |||||
this CC0 or use of the Work. |
@@ -0,0 +1,13 @@ | |||||
# VCV Template plugin | |||||
The VCV Template plugin is a starting point for developing your own plugins for VCV Rack. | |||||
It implements a simple sine VCO, demonstrating inputs, outputs, parameters, and other concepts. | |||||
See https://vcvrack.com/manual/PluginDevelopmentTutorial.html for a development tutorial. | |||||
## Contributing | |||||
I welcome Issues and Pull Requests to this repository if you have suggestions for improvement. | |||||
This template is released into the public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)). |
@@ -0,0 +1,243 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<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" | |||||
width="90" | |||||
height="380" | |||||
viewBox="0 0 23.812501 100.54167" | |||||
version="1.1" | |||||
id="svg8" | |||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||||
sodipodi:docname="MyModule.svg"> | |||||
<defs | |||||
id="defs2" /> | |||||
<sodipodi:namedview | |||||
id="base" | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1.0" | |||||
inkscape:pageopacity="0.0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:zoom="1.4" | |||||
inkscape:cx="188.48062" | |||||
inkscape:cy="170.63765" | |||||
inkscape:document-units="mm" | |||||
inkscape:current-layer="layer1" | |||||
showgrid="false" | |||||
units="px" | |||||
inkscape:snap-bbox="true" | |||||
inkscape:snap-page="true" | |||||
inkscape:bbox-nodes="true" | |||||
inkscape:snap-bbox-edge-midpoints="true" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" /> | |||||
<metadata | |||||
id="metadata5"> | |||||
<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></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<g | |||||
inkscape:label="Layer 1" | |||||
inkscape:groupmode="layer" | |||||
id="layer1" | |||||
transform="translate(0,-196.45832)"> | |||||
<path | |||||
style="opacity:1;vector-effect:none;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.48607069;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||||
d="M 0,196.45831 H 23.8125 V 296.99999 H 0 Z" | |||||
id="rect817" | |||||
inkscape:connector-curvature="0" /> | |||||
<g | |||||
aria-label="My Module" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text925" | |||||
transform="translate(0,-1.0583333)"> | |||||
<path | |||||
d="m 5.3546533,207.98659 v -2.76296 H 5.0597311 l -0.8770056,1.95968 -0.9002889,-1.95968 H 2.9875144 v 2.76296 h 0.2949222 v -2.09938 l 0.76835,1.66476 h 0.2522361 l 0.7567084,-1.66476 v 2.09938 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path956" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="M 7.4478493,206.07735 H 7.1451659 l -0.5199944,1.53282 -0.523875,-1.53282 H 5.7986131 l 0.6868584,1.87043 -0.1358195,0.37254 c -0.062089,0.17462 -0.1202972,0.23671 -0.314325,0.23671 H 5.949955 v 0.24835 h 0.120297 c 0.1358195,0 0.2716389,-0.0349 0.3725334,-0.13193 0.054328,-0.0505 0.097014,-0.1203 0.1358194,-0.22508 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path958" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.220962,207.98659 v -2.76296 H 10.92604 l -0.877006,1.95968 -0.9002887,-1.95968 H 8.853823 v 2.76296 h 0.2949223 v -2.09938 l 0.76835,1.66476 h 0.2522357 l 0.756709,-1.66476 v 2.09938 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path960" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.430574,207.03197 c 0,-0.29492 -0.0388,-0.56268 -0.232833,-0.76059 -0.131939,-0.13194 -0.314325,-0.21731 -0.547159,-0.21731 -0.232833,0 -0.415219,0.0854 -0.547158,0.21731 -0.194028,0.19791 -0.232833,0.46567 -0.232833,0.76059 0,0.29492 0.0388,0.56268 0.232833,0.76059 0.131939,0.13194 0.314325,0.21731 0.547158,0.21731 0.232834,0 0.41522,-0.0854 0.547159,-0.21731 0.194028,-0.19791 0.232833,-0.46567 0.232833,-0.76059 z m -0.2794,0 c 0,0.21343 -0.01164,0.45015 -0.151342,0.58985 -0.08925,0.0892 -0.21343,0.1397 -0.34925,0.1397 -0.135819,0 -0.256116,-0.0504 -0.345369,-0.1397 -0.1397,-0.1397 -0.155222,-0.37642 -0.155222,-0.58985 0,-0.21343 0.01552,-0.45014 0.155222,-0.58984 0.08925,-0.0893 0.20955,-0.1397 0.345369,-0.1397 0.13582,0 0.259998,0.0504 0.34925,0.1397 0.1397,0.1397 0.151342,0.37641 0.151342,0.58984 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path962" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 15.441855,207.98659 v -2.76296 h -0.2794 v 1.07492 c -0.155223,-0.19791 -0.329848,-0.24448 -0.539398,-0.24448 -0.194027,0 -0.364772,0.066 -0.465666,0.16686 -0.194028,0.19403 -0.232834,0.51224 -0.232834,0.81104 0,0.2988 0.03881,0.61701 0.232834,0.81104 0.100894,0.10089 0.271639,0.16686 0.465666,0.16686 0.20955,0 0.388056,-0.0505 0.543278,-0.25224 v 0.22896 z m -0.2794,-0.95462 c 0,0.37253 -0.06209,0.72955 -0.477309,0.72955 -0.415219,0 -0.481189,-0.35702 -0.481189,-0.72955 0,-0.37253 0.06597,-0.72954 0.481189,-0.72954 0.41522,0 0.477309,0.35701 0.477309,0.72954 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path964" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 17.622423,207.98659 v -1.90924 h -0.2794 v 1.17581 c 0,0.33373 -0.190147,0.50836 -0.477308,0.50836 -0.287161,0 -0.465667,-0.17075 -0.465667,-0.50836 v -1.17581 h -0.2794 v 1.2185 c 0,0.22119 0.05821,0.40358 0.194028,0.53552 0.116417,0.11641 0.287161,0.1785 0.492831,0.1785 0.21343,0 0.403577,-0.0815 0.539397,-0.23671 v 0.21343 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path966" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 19.001961,207.98659 v -0.2406 h -0.151342 c -0.194028,0 -0.256116,-0.0931 -0.256116,-0.2794 v -2.24296 h -0.2794 v 2.2546 c 0,0.29105 0.151341,0.50836 0.485069,0.50836 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path968" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 20.839343,207.1057 v -0.12806 c 0,-0.56656 -0.291042,-0.92357 -0.783872,-0.92357 -0.48507,0 -0.783873,0.36089 -0.783873,0.9779 0,0.67522 0.329848,0.9779 0.83432,0.9779 0.325967,0 0.504472,-0.10089 0.6985,-0.29492 l -0.190147,-0.16687 c -0.151342,0.15135 -0.2794,0.21732 -0.500592,0.21732 -0.364772,0 -0.562681,-0.2406 -0.562681,-0.6597 z m -0.2794,-0.20955 h -1.008945 c 0.0078,-0.15522 0.01552,-0.21343 0.05821,-0.3182 0.07373,-0.17463 0.244475,-0.28717 0.446264,-0.28717 0.201789,0 0.372533,0.11254 0.446264,0.28717 0.04269,0.10477 0.05045,0.16298 0.05821,0.3182 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path970" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Pitch" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text946" | |||||
transform="translate(0,-2.1166665)"> | |||||
<path | |||||
d="m 10.343313,234.08358 c 0,-0.36124 -0.254,-0.58984 -0.6208893,-0.58984 H 8.9745348 v 2.00942 h 0.2144889 v -0.82691 h 0.5334 c 0.3668893,0 0.6208893,-0.23142 0.6208893,-0.59267 z m -0.214489,0 c 0,0.26529 -0.174978,0.40076 -0.4261558,0.40076 H 9.1890237 v -0.79869 h 0.5136445 c 0.2511778,0 0.4261558,0.13264 0.4261558,0.39793 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path973" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 10.921471,235.50316 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78365 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path975" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.968251,235.50316 v -0.17498 h -0.107244 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84667 h 0.296333 v -0.15522 h -0.296333 v -0.43462 h -0.2032 v 0.43462 H 11.29374 v 0.15522 h 0.174978 v 0.85232 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path977" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.346113,235.31407 -0.138289,-0.13264 c -0.104422,0.11571 -0.186267,0.15804 -0.318911,0.15804 -0.135467,0 -0.248356,-0.0536 -0.321733,-0.15804 -0.06491,-0.0903 -0.09031,-0.19756 -0.09031,-0.37254 0,-0.17498 0.0254,-0.28222 0.09031,-0.37253 0.07338,-0.10442 0.186266,-0.15805 0.321733,-0.15805 0.132644,0 0.214489,0.0395 0.318911,0.15523 l 0.138289,-0.12983 c -0.143933,-0.15522 -0.265289,-0.20602 -0.4572,-0.20602 -0.349956,0 -0.615244,0.23707 -0.615244,0.7112 0,0.47414 0.265288,0.7112 0.615244,0.7112 0.191911,0 0.313267,-0.0508 0.4572,-0.20602 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path979" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.825619,235.50316 v -0.89182 c 0,-0.31327 -0.186267,-0.51365 -0.499534,-0.51365 -0.155222,0 -0.287866,0.0536 -0.389466,0.16934 v -0.77329 h -0.2032 v 2.00942 h 0.2032 v -0.85796 c 0,-0.23989 0.138289,-0.36689 0.347133,-0.36689 0.208844,0 0.338667,0.12418 0.338667,0.36689 v 0.85796 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path981" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="1V/oct" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text950" | |||||
transform="translate(0,-6.0862931)"> | |||||
<path | |||||
d="m 8.7942542,262.66519 v -2.00942 h -0.2032 l -0.3753555,0.32455 v 0.23143 l 0.3753555,-0.3302 v 1.78364 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path984" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 10.853021,260.65577 h -0.225778 l -0.522111,1.6256 -0.5221108,-1.6256 H 9.3572434 l 0.6603996,2.00942 h 0.174978 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path986" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.88278,260.44692 h -0.200378 l -0.804333,2.42712 h 0.200377 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path988" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.196436,261.97092 c 0,-0.21448 -0.02822,-0.40922 -0.169334,-0.55315 -0.09596,-0.096 -0.2286,-0.15805 -0.397933,-0.15805 -0.169333,0 -0.301978,0.0621 -0.397933,0.15805 -0.141111,0.14393 -0.169334,0.33867 -0.169334,0.55315 0,0.21449 0.02822,0.40923 0.169334,0.55316 0.09595,0.096 0.2286,0.15804 0.397933,0.15804 0.169333,0 0.301978,-0.0621 0.397933,-0.15804 0.141111,-0.14393 0.169334,-0.33867 0.169334,-0.55316 z m -0.2032,0 c 0,0.15523 -0.0085,0.32738 -0.110067,0.42898 -0.06491,0.0649 -0.155222,0.1016 -0.254,0.1016 -0.09878,0 -0.186267,-0.0367 -0.251178,-0.1016 -0.1016,-0.1016 -0.112889,-0.27375 -0.112889,-0.42898 0,-0.15522 0.01129,-0.32737 0.112889,-0.42897 0.06491,-0.0649 0.1524,-0.1016 0.251178,-0.1016 0.09878,0 0.189089,0.0367 0.254,0.1016 0.1016,0.1016 0.110067,0.27375 0.110067,0.42897 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path990" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.625318,262.4761 -0.138289,-0.13264 c -0.104422,0.11571 -0.186267,0.15804 -0.318911,0.15804 -0.135467,0 -0.248356,-0.0536 -0.321733,-0.15804 -0.06491,-0.0903 -0.09031,-0.19756 -0.09031,-0.37254 0,-0.17497 0.0254,-0.28222 0.09031,-0.37253 0.07338,-0.10442 0.186266,-0.15804 0.321733,-0.15804 0.132644,0 0.214489,0.0395 0.318911,0.15522 l 0.138289,-0.12982 c -0.143933,-0.15523 -0.265289,-0.20603 -0.4572,-0.20603 -0.349956,0 -0.615244,0.23707 -0.615244,0.7112 0,0.47414 0.265288,0.7112 0.615244,0.7112 0.191911,0 0.313267,-0.0508 0.4572,-0.20602 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path992" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 15.546024,262.66519 v -0.17498 H 15.43878 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84666 h 0.296333 v -0.15523 h -0.296333 v -0.43462 h -0.2032 v 0.43462 h -0.174978 v 0.15523 h 0.174978 v 0.85231 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path994" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Sine" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text954" | |||||
transform="translate(0,-10.054167)"> | |||||
<path | |||||
d="m 10.714958,289.26526 c 0,-0.16651 -0.05927,-0.3048 -0.169334,-0.39793 -0.08467,-0.0734 -0.1778,-0.11289 -0.366889,-0.14111 l -0.220133,-0.0339 c -0.1044223,-0.0169 -0.2088445,-0.0564 -0.2709334,-0.11006 -0.062089,-0.0536 -0.090311,-0.13265 -0.090311,-0.23143 0,-0.22295 0.1552222,-0.37253 0.4233334,-0.37253 0.211667,0 0.344311,0.0593 0.468489,0.17216 l 0.138289,-0.13829 c -0.172156,-0.15522 -0.341489,-0.22014 -0.598311,-0.22014 -0.3979337,0 -0.643467,0.22578 -0.643467,0.56727 0,0.16087 0.0508,0.28505 0.1524,0.37536 0.087489,0.0762 0.2116666,0.127 0.3697111,0.1524 l 0.2342439,0.0367 c 0.146756,0.0226 0.197556,0.0395 0.262467,0.0959 0.06491,0.0565 0.09596,0.14676 0.09596,0.25118 0,0.23424 -0.180623,0.37253 -0.474134,0.37253 -0.2257774,0 -0.3809996,-0.0536 -0.5475107,-0.22013 l -0.1467556,0.14675 c 0.1890889,0.18909 0.3866445,0.26529 0.6886223,0.26529 0.417689,0 0.694267,-0.21731 0.694267,-0.57009 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path997" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.329893,289.81842 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78364 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path999" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 12.935473,289.81842 v -0.889 c 0,-0.16087 -0.04515,-0.29069 -0.143933,-0.38664 -0.08467,-0.0847 -0.206022,-0.12983 -0.3556,-0.12983 -0.155222,0 -0.290689,0.0564 -0.389467,0.16934 v -0.1524 h -0.2032 v 1.38853 h 0.2032 v -0.85513 c 0,-0.24271 0.135467,-0.36971 0.344311,-0.36971 0.208845,0 0.341489,0.12417 0.341489,0.36971 v 0.85513 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path1001" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.494751,289.17778 v -0.0931 c 0,-0.41204 -0.211667,-0.67169 -0.570089,-0.67169 -0.352778,0 -0.570089,0.26247 -0.570089,0.7112 0,0.49107 0.239889,0.7112 0.606778,0.7112 0.237067,0 0.366889,-0.0734 0.508,-0.21449 l -0.138289,-0.12135 c -0.110067,0.11007 -0.2032,0.15804 -0.364067,0.15804 -0.265289,0 -0.409222,-0.17497 -0.409222,-0.47977 z m -0.2032,-0.1524 h -0.733778 c 0.0056,-0.11289 0.01129,-0.15523 0.04233,-0.23143 0.05362,-0.127 0.1778,-0.20884 0.324556,-0.20884 0.146756,0 0.270933,0.0818 0.324556,0.20884 0.03104,0.0762 0.03669,0.11854 0.04233,0.23143 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path1003" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Tutorial" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text1008"> | |||||
<path | |||||
d="M 8.5614537,289.39941 V 289.2075 H 7.1842093 v 0.19191 h 0.5813778 v 1.81751 H 7.980076 v -1.81751 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1010" /> | |||||
<path | |||||
d="m 9.8262062,291.21692 v -1.38853 h -0.2032 v 0.85513 c 0,0.24271 -0.1382889,0.36971 -0.3471334,0.36971 -0.2088444,0 -0.3386666,-0.12418 -0.3386666,-0.36971 v -0.85513 H 8.7340061 v 0.88617 c 0,0.16087 0.042333,0.29351 0.1411112,0.38947 0.084667,0.0847 0.2088444,0.12982 0.3584222,0.12982 0.1552222,0 0.2935111,-0.0593 0.3922889,-0.17215 v 0.15522 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1012" /> | |||||
<path | |||||
d="m 10.869017,291.21692 v -0.17498 h -0.107244 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84667 h 0.296333 v -0.15522 h -0.296333 v -0.43462 h -0.2032 v 0.43462 h -0.174978 v 0.15522 h 0.174978 v 0.85232 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1014" /> | |||||
<path | |||||
d="m 12.31179,290.52265 c 0,-0.21449 -0.02822,-0.40922 -0.169333,-0.55315 -0.09596,-0.096 -0.2286,-0.15805 -0.397934,-0.15805 -0.169333,0 -0.301977,0.0621 -0.397933,0.15805 -0.141111,0.14393 -0.169333,0.33866 -0.169333,0.55315 0,0.21449 0.02822,0.40922 0.169333,0.55316 0.09596,0.096 0.2286,0.15804 0.397933,0.15804 0.169334,0 0.301978,-0.0621 0.397934,-0.15804 0.141111,-0.14394 0.169333,-0.33867 0.169333,-0.55316 z m -0.2032,0 c 0,0.15522 -0.0085,0.32738 -0.110067,0.42898 -0.06491,0.0649 -0.155222,0.1016 -0.254,0.1016 -0.09878,0 -0.186266,-0.0367 -0.251177,-0.1016 -0.1016,-0.1016 -0.112889,-0.27376 -0.112889,-0.42898 0,-0.15522 0.01129,-0.32738 0.112889,-0.42898 0.06491,-0.0649 0.1524,-0.1016 0.251177,-0.1016 0.09878,0 0.189089,0.0367 0.254,0.1016 0.1016,0.1016 0.110067,0.27376 0.110067,0.42898 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1016" /> | |||||
<path | |||||
d="m 13.670117,289.94127 c -0.09878,-0.0988 -0.200378,-0.12982 -0.333022,-0.12982 -0.160867,0 -0.313267,0.0706 -0.389467,0.18627 v -0.16933 h -0.2032 v 1.38853 h 0.2032 v -0.85231 c 0,-0.21167 0.129822,-0.37254 0.333022,-0.37254 0.107245,0 0.163689,0.0254 0.239889,0.1016 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1018" /> | |||||
<path | |||||
d="m 14.138253,291.21692 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78365 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1020" /> | |||||
<path | |||||
d="m 15.642233,291.21692 v -0.94262 c 0,-0.30198 -0.183445,-0.46285 -0.555978,-0.46285 -0.225778,0 -0.366889,0.0452 -0.491067,0.20602 l 0.138289,0.127 c 0.08184,-0.11571 0.172156,-0.15804 0.349956,-0.15804 0.254,0 0.3556,0.1016 0.3556,0.3048 v 0.13264 h -0.417689 c -0.310445,0 -0.479778,0.15805 -0.479778,0.40076 0,0.11007 0.03669,0.21449 0.104422,0.28222 0.08749,0.0903 0.200378,0.127 0.392289,0.127 0.186267,0 0.287867,-0.0367 0.400756,-0.14958 v 0.13265 z m -0.2032,-0.49107 c 0,0.11571 -0.02258,0.19474 -0.07056,0.23989 -0.08749,0.0847 -0.191911,0.0931 -0.310444,0.0931 -0.220134,0 -0.318912,-0.0762 -0.318912,-0.23706 0,-0.16087 0.1016,-0.24554 0.310445,-0.24554 h 0.389467 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1022" /> | |||||
<path | |||||
d="m 16.628291,291.21692 v -0.17498 h -0.110067 c -0.141111,0 -0.186267,-0.0677 -0.186267,-0.2032 v -1.63124 h -0.2032 v 1.63971 c 0,0.21166 0.110067,0.36971 0.352778,0.36971 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1024" /> | |||||
</g> | |||||
</g> | |||||
</svg> |
@@ -0,0 +1,121 @@ | |||||
Creative Commons Legal Code | |||||
CC0 1.0 Universal | |||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE | |||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN | |||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS | |||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES | |||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS | |||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM | |||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED | |||||
HEREUNDER. | |||||
Statement of Purpose | |||||
The laws of most jurisdictions throughout the world automatically confer | |||||
exclusive Copyright and Related Rights (defined below) upon the creator | |||||
and subsequent owner(s) (each and all, an "owner") of an original work of | |||||
authorship and/or a database (each, a "Work"). | |||||
Certain owners wish to permanently relinquish those rights to a Work for | |||||
the purpose of contributing to a commons of creative, cultural and | |||||
scientific works ("Commons") that the public can reliably and without fear | |||||
of later claims of infringement build upon, modify, incorporate in other | |||||
works, reuse and redistribute as freely as possible in any form whatsoever | |||||
and for any purposes, including without limitation commercial purposes. | |||||
These owners may contribute to the Commons to promote the ideal of a free | |||||
culture and the further production of creative, cultural and scientific | |||||
works, or to gain reputation or greater distribution for their Work in | |||||
part through the use and efforts of others. | |||||
For these and/or other purposes and motivations, and without any | |||||
expectation of additional consideration or compensation, the person | |||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she | |||||
is an owner of Copyright and Related Rights in the Work, voluntarily | |||||
elects to apply CC0 to the Work and publicly distribute the Work under its | |||||
terms, with knowledge of his or her Copyright and Related Rights in the | |||||
Work and the meaning and intended legal effect of CC0 on those rights. | |||||
1. Copyright and Related Rights. A Work made available under CC0 may be | |||||
protected by copyright and related or neighboring rights ("Copyright and | |||||
Related Rights"). Copyright and Related Rights include, but are not | |||||
limited to, the following: | |||||
i. the right to reproduce, adapt, distribute, perform, display, | |||||
communicate, and translate a Work; | |||||
ii. moral rights retained by the original author(s) and/or performer(s); | |||||
iii. publicity and privacy rights pertaining to a person's image or | |||||
likeness depicted in a Work; | |||||
iv. rights protecting against unfair competition in regards to a Work, | |||||
subject to the limitations in paragraph 4(a), below; | |||||
v. rights protecting the extraction, dissemination, use and reuse of data | |||||
in a Work; | |||||
vi. database rights (such as those arising under Directive 96/9/EC of the | |||||
European Parliament and of the Council of 11 March 1996 on the legal | |||||
protection of databases, and under any national implementation | |||||
thereof, including any amended or successor version of such | |||||
directive); and | |||||
vii. other similar, equivalent or corresponding rights throughout the | |||||
world based on applicable law or treaty, and any national | |||||
implementations thereof. | |||||
2. Waiver. To the greatest extent permitted by, but not in contravention | |||||
of, applicable law, Affirmer hereby overtly, fully, permanently, | |||||
irrevocably and unconditionally waives, abandons, and surrenders all of | |||||
Affirmer's Copyright and Related Rights and associated claims and causes | |||||
of action, whether now known or unknown (including existing as well as | |||||
future claims and causes of action), in the Work (i) in all territories | |||||
worldwide, (ii) for the maximum duration provided by applicable law or | |||||
treaty (including future time extensions), (iii) in any current or future | |||||
medium and for any number of copies, and (iv) for any purpose whatsoever, | |||||
including without limitation commercial, advertising or promotional | |||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each | |||||
member of the public at large and to the detriment of Affirmer's heirs and | |||||
successors, fully intending that such Waiver shall not be subject to | |||||
revocation, rescission, cancellation, termination, or any other legal or | |||||
equitable action to disrupt the quiet enjoyment of the Work by the public | |||||
as contemplated by Affirmer's express Statement of Purpose. | |||||
3. Public License Fallback. Should any part of the Waiver for any reason | |||||
be judged legally invalid or ineffective under applicable law, then the | |||||
Waiver shall be preserved to the maximum extent permitted taking into | |||||
account Affirmer's express Statement of Purpose. In addition, to the | |||||
extent the Waiver is so judged Affirmer hereby grants to each affected | |||||
person a royalty-free, non transferable, non sublicensable, non exclusive, | |||||
irrevocable and unconditional license to exercise Affirmer's Copyright and | |||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the | |||||
maximum duration provided by applicable law or treaty (including future | |||||
time extensions), (iii) in any current or future medium and for any number | |||||
of copies, and (iv) for any purpose whatsoever, including without | |||||
limitation commercial, advertising or promotional purposes (the | |||||
"License"). The License shall be deemed effective as of the date CC0 was | |||||
applied by Affirmer to the Work. Should any part of the License for any | |||||
reason be judged legally invalid or ineffective under applicable law, such | |||||
partial invalidity or ineffectiveness shall not invalidate the remainder | |||||
of the License, and in such case Affirmer hereby affirms that he or she | |||||
will not (i) exercise any of his or her remaining Copyright and Related | |||||
Rights in the Work or (ii) assert any associated claims and causes of | |||||
action with respect to the Work, in either case contrary to Affirmer's | |||||
express Statement of Purpose. | |||||
4. Limitations and Disclaimers. | |||||
a. No trademark or patent rights held by Affirmer are waived, abandoned, | |||||
surrendered, licensed or otherwise affected by this document. | |||||
b. Affirmer offers the Work as-is and makes no representations or | |||||
warranties of any kind concerning the Work, express, implied, | |||||
statutory or otherwise, including without limitation warranties of | |||||
title, merchantability, fitness for a particular purpose, non | |||||
infringement, or the absence of latent or other defects, accuracy, or | |||||
the present or absence of errors, whether or not discoverable, all to | |||||
the greatest extent permissible under applicable law. | |||||
c. Affirmer disclaims responsibility for clearing rights of other persons | |||||
that may apply to the Work or any use thereof, including without | |||||
limitation any person's Copyright and Related Rights in the Work. | |||||
Further, Affirmer disclaims responsibility for obtaining any necessary | |||||
consents, permissions or other rights required for any use of the | |||||
Work. | |||||
d. Affirmer understands and acknowledges that Creative Commons is not a | |||||
party to this document and has no duty or obligation with respect to | |||||
this CC0 or use of the Work. |
@@ -0,0 +1,13 @@ | |||||
# VCV Template plugin | |||||
The VCV Template plugin is a starting point for developing your own plugins for VCV Rack. | |||||
It implements a simple sine VCO, demonstrating inputs, outputs, parameters, and other concepts. | |||||
See https://vcvrack.com/manual/PluginDevelopmentTutorial.html for a development tutorial. | |||||
## Contributing | |||||
I welcome Issues and Pull Requests to this repository if you have suggestions for improvement. | |||||
This template is released into the public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)). |
@@ -0,0 +1,243 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<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" | |||||
width="90" | |||||
height="380" | |||||
viewBox="0 0 23.812501 100.54167" | |||||
version="1.1" | |||||
id="svg8" | |||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||||
sodipodi:docname="MyModule.svg"> | |||||
<defs | |||||
id="defs2" /> | |||||
<sodipodi:namedview | |||||
id="base" | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1.0" | |||||
inkscape:pageopacity="0.0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:zoom="1.4" | |||||
inkscape:cx="188.48062" | |||||
inkscape:cy="170.63765" | |||||
inkscape:document-units="mm" | |||||
inkscape:current-layer="layer1" | |||||
showgrid="false" | |||||
units="px" | |||||
inkscape:snap-bbox="true" | |||||
inkscape:snap-page="true" | |||||
inkscape:bbox-nodes="true" | |||||
inkscape:snap-bbox-edge-midpoints="true" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" /> | |||||
<metadata | |||||
id="metadata5"> | |||||
<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></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<g | |||||
inkscape:label="Layer 1" | |||||
inkscape:groupmode="layer" | |||||
id="layer1" | |||||
transform="translate(0,-196.45832)"> | |||||
<path | |||||
style="opacity:1;vector-effect:none;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.48607069;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" | |||||
d="M 0,196.45831 H 23.8125 V 296.99999 H 0 Z" | |||||
id="rect817" | |||||
inkscape:connector-curvature="0" /> | |||||
<g | |||||
aria-label="My Module" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text925" | |||||
transform="translate(0,-1.0583333)"> | |||||
<path | |||||
d="m 5.3546533,207.98659 v -2.76296 H 5.0597311 l -0.8770056,1.95968 -0.9002889,-1.95968 H 2.9875144 v 2.76296 h 0.2949222 v -2.09938 l 0.76835,1.66476 h 0.2522361 l 0.7567084,-1.66476 v 2.09938 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path956" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="M 7.4478493,206.07735 H 7.1451659 l -0.5199944,1.53282 -0.523875,-1.53282 H 5.7986131 l 0.6868584,1.87043 -0.1358195,0.37254 c -0.062089,0.17462 -0.1202972,0.23671 -0.314325,0.23671 H 5.949955 v 0.24835 h 0.120297 c 0.1358195,0 0.2716389,-0.0349 0.3725334,-0.13193 0.054328,-0.0505 0.097014,-0.1203 0.1358194,-0.22508 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path958" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.220962,207.98659 v -2.76296 H 10.92604 l -0.877006,1.95968 -0.9002887,-1.95968 H 8.853823 v 2.76296 h 0.2949223 v -2.09938 l 0.76835,1.66476 h 0.2522357 l 0.756709,-1.66476 v 2.09938 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path960" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.430574,207.03197 c 0,-0.29492 -0.0388,-0.56268 -0.232833,-0.76059 -0.131939,-0.13194 -0.314325,-0.21731 -0.547159,-0.21731 -0.232833,0 -0.415219,0.0854 -0.547158,0.21731 -0.194028,0.19791 -0.232833,0.46567 -0.232833,0.76059 0,0.29492 0.0388,0.56268 0.232833,0.76059 0.131939,0.13194 0.314325,0.21731 0.547158,0.21731 0.232834,0 0.41522,-0.0854 0.547159,-0.21731 0.194028,-0.19791 0.232833,-0.46567 0.232833,-0.76059 z m -0.2794,0 c 0,0.21343 -0.01164,0.45015 -0.151342,0.58985 -0.08925,0.0892 -0.21343,0.1397 -0.34925,0.1397 -0.135819,0 -0.256116,-0.0504 -0.345369,-0.1397 -0.1397,-0.1397 -0.155222,-0.37642 -0.155222,-0.58985 0,-0.21343 0.01552,-0.45014 0.155222,-0.58984 0.08925,-0.0893 0.20955,-0.1397 0.345369,-0.1397 0.13582,0 0.259998,0.0504 0.34925,0.1397 0.1397,0.1397 0.151342,0.37641 0.151342,0.58984 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path962" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 15.441855,207.98659 v -2.76296 h -0.2794 v 1.07492 c -0.155223,-0.19791 -0.329848,-0.24448 -0.539398,-0.24448 -0.194027,0 -0.364772,0.066 -0.465666,0.16686 -0.194028,0.19403 -0.232834,0.51224 -0.232834,0.81104 0,0.2988 0.03881,0.61701 0.232834,0.81104 0.100894,0.10089 0.271639,0.16686 0.465666,0.16686 0.20955,0 0.388056,-0.0505 0.543278,-0.25224 v 0.22896 z m -0.2794,-0.95462 c 0,0.37253 -0.06209,0.72955 -0.477309,0.72955 -0.415219,0 -0.481189,-0.35702 -0.481189,-0.72955 0,-0.37253 0.06597,-0.72954 0.481189,-0.72954 0.41522,0 0.477309,0.35701 0.477309,0.72954 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path964" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 17.622423,207.98659 v -1.90924 h -0.2794 v 1.17581 c 0,0.33373 -0.190147,0.50836 -0.477308,0.50836 -0.287161,0 -0.465667,-0.17075 -0.465667,-0.50836 v -1.17581 h -0.2794 v 1.2185 c 0,0.22119 0.05821,0.40358 0.194028,0.53552 0.116417,0.11641 0.287161,0.1785 0.492831,0.1785 0.21343,0 0.403577,-0.0815 0.539397,-0.23671 v 0.21343 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path966" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 19.001961,207.98659 v -0.2406 h -0.151342 c -0.194028,0 -0.256116,-0.0931 -0.256116,-0.2794 v -2.24296 h -0.2794 v 2.2546 c 0,0.29105 0.151341,0.50836 0.485069,0.50836 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path968" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 20.839343,207.1057 v -0.12806 c 0,-0.56656 -0.291042,-0.92357 -0.783872,-0.92357 -0.48507,0 -0.783873,0.36089 -0.783873,0.9779 0,0.67522 0.329848,0.9779 0.83432,0.9779 0.325967,0 0.504472,-0.10089 0.6985,-0.29492 l -0.190147,-0.16687 c -0.151342,0.15135 -0.2794,0.21732 -0.500592,0.21732 -0.364772,0 -0.562681,-0.2406 -0.562681,-0.6597 z m -0.2794,-0.20955 h -1.008945 c 0.0078,-0.15522 0.01552,-0.21343 0.05821,-0.3182 0.07373,-0.17463 0.244475,-0.28717 0.446264,-0.28717 0.201789,0 0.372533,0.11254 0.446264,0.28717 0.04269,0.10477 0.05045,0.16298 0.05821,0.3182 z" | |||||
style="font-size:3.88055563px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path970" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Pitch" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text946" | |||||
transform="translate(0,-2.1166665)"> | |||||
<path | |||||
d="m 10.343313,234.08358 c 0,-0.36124 -0.254,-0.58984 -0.6208893,-0.58984 H 8.9745348 v 2.00942 h 0.2144889 v -0.82691 h 0.5334 c 0.3668893,0 0.6208893,-0.23142 0.6208893,-0.59267 z m -0.214489,0 c 0,0.26529 -0.174978,0.40076 -0.4261558,0.40076 H 9.1890237 v -0.79869 h 0.5136445 c 0.2511778,0 0.4261558,0.13264 0.4261558,0.39793 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path973" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 10.921471,235.50316 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78365 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path975" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.968251,235.50316 v -0.17498 h -0.107244 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84667 h 0.296333 v -0.15522 h -0.296333 v -0.43462 h -0.2032 v 0.43462 H 11.29374 v 0.15522 h 0.174978 v 0.85232 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path977" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.346113,235.31407 -0.138289,-0.13264 c -0.104422,0.11571 -0.186267,0.15804 -0.318911,0.15804 -0.135467,0 -0.248356,-0.0536 -0.321733,-0.15804 -0.06491,-0.0903 -0.09031,-0.19756 -0.09031,-0.37254 0,-0.17498 0.0254,-0.28222 0.09031,-0.37253 0.07338,-0.10442 0.186266,-0.15805 0.321733,-0.15805 0.132644,0 0.214489,0.0395 0.318911,0.15523 l 0.138289,-0.12983 c -0.143933,-0.15522 -0.265289,-0.20602 -0.4572,-0.20602 -0.349956,0 -0.615244,0.23707 -0.615244,0.7112 0,0.47414 0.265288,0.7112 0.615244,0.7112 0.191911,0 0.313267,-0.0508 0.4572,-0.20602 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path979" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.825619,235.50316 v -0.89182 c 0,-0.31327 -0.186267,-0.51365 -0.499534,-0.51365 -0.155222,0 -0.287866,0.0536 -0.389466,0.16934 v -0.77329 h -0.2032 v 2.00942 h 0.2032 v -0.85796 c 0,-0.23989 0.138289,-0.36689 0.347133,-0.36689 0.208844,0 0.338667,0.12418 0.338667,0.36689 v 0.85796 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path981" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="1V/oct" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text950" | |||||
transform="translate(0,-6.0862931)"> | |||||
<path | |||||
d="m 8.7942542,262.66519 v -2.00942 h -0.2032 l -0.3753555,0.32455 v 0.23143 l 0.3753555,-0.3302 v 1.78364 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path984" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 10.853021,260.65577 h -0.225778 l -0.522111,1.6256 -0.5221108,-1.6256 H 9.3572434 l 0.6603996,2.00942 h 0.174978 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path986" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.88278,260.44692 h -0.200378 l -0.804333,2.42712 h 0.200377 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path988" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 13.196436,261.97092 c 0,-0.21448 -0.02822,-0.40922 -0.169334,-0.55315 -0.09596,-0.096 -0.2286,-0.15805 -0.397933,-0.15805 -0.169333,0 -0.301978,0.0621 -0.397933,0.15805 -0.141111,0.14393 -0.169334,0.33867 -0.169334,0.55315 0,0.21449 0.02822,0.40923 0.169334,0.55316 0.09595,0.096 0.2286,0.15804 0.397933,0.15804 0.169333,0 0.301978,-0.0621 0.397933,-0.15804 0.141111,-0.14393 0.169334,-0.33867 0.169334,-0.55316 z m -0.2032,0 c 0,0.15523 -0.0085,0.32738 -0.110067,0.42898 -0.06491,0.0649 -0.155222,0.1016 -0.254,0.1016 -0.09878,0 -0.186267,-0.0367 -0.251178,-0.1016 -0.1016,-0.1016 -0.112889,-0.27375 -0.112889,-0.42898 0,-0.15522 0.01129,-0.32737 0.112889,-0.42897 0.06491,-0.0649 0.1524,-0.1016 0.251178,-0.1016 0.09878,0 0.189089,0.0367 0.254,0.1016 0.1016,0.1016 0.110067,0.27375 0.110067,0.42897 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path990" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.625318,262.4761 -0.138289,-0.13264 c -0.104422,0.11571 -0.186267,0.15804 -0.318911,0.15804 -0.135467,0 -0.248356,-0.0536 -0.321733,-0.15804 -0.06491,-0.0903 -0.09031,-0.19756 -0.09031,-0.37254 0,-0.17497 0.0254,-0.28222 0.09031,-0.37253 0.07338,-0.10442 0.186266,-0.15804 0.321733,-0.15804 0.132644,0 0.214489,0.0395 0.318911,0.15522 l 0.138289,-0.12982 c -0.143933,-0.15523 -0.265289,-0.20603 -0.4572,-0.20603 -0.349956,0 -0.615244,0.23707 -0.615244,0.7112 0,0.47414 0.265288,0.7112 0.615244,0.7112 0.191911,0 0.313267,-0.0508 0.4572,-0.20602 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path992" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 15.546024,262.66519 v -0.17498 H 15.43878 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84666 h 0.296333 v -0.15523 h -0.296333 v -0.43462 h -0.2032 v 0.43462 h -0.174978 v 0.15523 h 0.174978 v 0.85231 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path994" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Sine" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text954" | |||||
transform="translate(0,-10.054167)"> | |||||
<path | |||||
d="m 10.714958,289.26526 c 0,-0.16651 -0.05927,-0.3048 -0.169334,-0.39793 -0.08467,-0.0734 -0.1778,-0.11289 -0.366889,-0.14111 l -0.220133,-0.0339 c -0.1044223,-0.0169 -0.2088445,-0.0564 -0.2709334,-0.11006 -0.062089,-0.0536 -0.090311,-0.13265 -0.090311,-0.23143 0,-0.22295 0.1552222,-0.37253 0.4233334,-0.37253 0.211667,0 0.344311,0.0593 0.468489,0.17216 l 0.138289,-0.13829 c -0.172156,-0.15522 -0.341489,-0.22014 -0.598311,-0.22014 -0.3979337,0 -0.643467,0.22578 -0.643467,0.56727 0,0.16087 0.0508,0.28505 0.1524,0.37536 0.087489,0.0762 0.2116666,0.127 0.3697111,0.1524 l 0.2342439,0.0367 c 0.146756,0.0226 0.197556,0.0395 0.262467,0.0959 0.06491,0.0565 0.09596,0.14676 0.09596,0.25118 0,0.23424 -0.180623,0.37253 -0.474134,0.37253 -0.2257774,0 -0.3809996,-0.0536 -0.5475107,-0.22013 l -0.1467556,0.14675 c 0.1890889,0.18909 0.3866445,0.26529 0.6886223,0.26529 0.417689,0 0.694267,-0.21731 0.694267,-0.57009 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path997" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 11.329893,289.81842 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78364 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path999" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 12.935473,289.81842 v -0.889 c 0,-0.16087 -0.04515,-0.29069 -0.143933,-0.38664 -0.08467,-0.0847 -0.206022,-0.12983 -0.3556,-0.12983 -0.155222,0 -0.290689,0.0564 -0.389467,0.16934 v -0.1524 h -0.2032 v 1.38853 h 0.2032 v -0.85513 c 0,-0.24271 0.135467,-0.36971 0.344311,-0.36971 0.208845,0 0.341489,0.12417 0.341489,0.36971 v 0.85513 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path1001" | |||||
inkscape:connector-curvature="0" /> | |||||
<path | |||||
d="m 14.494751,289.17778 v -0.0931 c 0,-0.41204 -0.211667,-0.67169 -0.570089,-0.67169 -0.352778,0 -0.570089,0.26247 -0.570089,0.7112 0,0.49107 0.239889,0.7112 0.606778,0.7112 0.237067,0 0.366889,-0.0734 0.508,-0.21449 l -0.138289,-0.12135 c -0.110067,0.11007 -0.2032,0.15804 -0.364067,0.15804 -0.265289,0 -0.409222,-0.17497 -0.409222,-0.47977 z m -0.2032,-0.1524 h -0.733778 c 0.0056,-0.11289 0.01129,-0.15523 0.04233,-0.23143 0.05362,-0.127 0.1778,-0.20884 0.324556,-0.20884 0.146756,0 0.270933,0.0818 0.324556,0.20884 0.03104,0.0762 0.03669,0.11854 0.04233,0.23143 z" | |||||
style="font-size:2.82222223px;text-align:center;text-anchor:middle;stroke-width:0.26458332px" | |||||
id="path1003" | |||||
inkscape:connector-curvature="0" /> | |||||
</g> | |||||
<g | |||||
aria-label="Tutorial" | |||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:DINPro;-inkscape-font-specification:DINPro;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||||
id="text1008"> | |||||
<path | |||||
d="M 8.5614537,289.39941 V 289.2075 H 7.1842093 v 0.19191 h 0.5813778 v 1.81751 H 7.980076 v -1.81751 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1010" /> | |||||
<path | |||||
d="m 9.8262062,291.21692 v -1.38853 h -0.2032 v 0.85513 c 0,0.24271 -0.1382889,0.36971 -0.3471334,0.36971 -0.2088444,0 -0.3386666,-0.12418 -0.3386666,-0.36971 v -0.85513 H 8.7340061 v 0.88617 c 0,0.16087 0.042333,0.29351 0.1411112,0.38947 0.084667,0.0847 0.2088444,0.12982 0.3584222,0.12982 0.1552222,0 0.2935111,-0.0593 0.3922889,-0.17215 v 0.15522 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1012" /> | |||||
<path | |||||
d="m 10.869017,291.21692 v -0.17498 h -0.107244 c -0.129822,0 -0.189089,-0.0762 -0.189089,-0.2032 v -0.84667 h 0.296333 v -0.15522 h -0.296333 v -0.43462 h -0.2032 v 0.43462 h -0.174978 v 0.15522 h 0.174978 v 0.85232 c 0,0.20602 0.118533,0.37253 0.3556,0.37253 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1014" /> | |||||
<path | |||||
d="m 12.31179,290.52265 c 0,-0.21449 -0.02822,-0.40922 -0.169333,-0.55315 -0.09596,-0.096 -0.2286,-0.15805 -0.397934,-0.15805 -0.169333,0 -0.301977,0.0621 -0.397933,0.15805 -0.141111,0.14393 -0.169333,0.33866 -0.169333,0.55315 0,0.21449 0.02822,0.40922 0.169333,0.55316 0.09596,0.096 0.2286,0.15804 0.397933,0.15804 0.169334,0 0.301978,-0.0621 0.397934,-0.15804 0.141111,-0.14394 0.169333,-0.33867 0.169333,-0.55316 z m -0.2032,0 c 0,0.15522 -0.0085,0.32738 -0.110067,0.42898 -0.06491,0.0649 -0.155222,0.1016 -0.254,0.1016 -0.09878,0 -0.186266,-0.0367 -0.251177,-0.1016 -0.1016,-0.1016 -0.112889,-0.27376 -0.112889,-0.42898 0,-0.15522 0.01129,-0.32738 0.112889,-0.42898 0.06491,-0.0649 0.1524,-0.1016 0.251177,-0.1016 0.09878,0 0.189089,0.0367 0.254,0.1016 0.1016,0.1016 0.110067,0.27376 0.110067,0.42898 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1016" /> | |||||
<path | |||||
d="m 13.670117,289.94127 c -0.09878,-0.0988 -0.200378,-0.12982 -0.333022,-0.12982 -0.160867,0 -0.313267,0.0706 -0.389467,0.18627 v -0.16933 h -0.2032 v 1.38853 h 0.2032 v -0.85231 c 0,-0.21167 0.129822,-0.37254 0.333022,-0.37254 0.107245,0 0.163689,0.0254 0.239889,0.1016 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1018" /> | |||||
<path | |||||
d="m 14.138253,291.21692 v -1.38853 h -0.2032 v 1.38853 z m 0.01411,-1.78365 v -0.2286 h -0.2286 v 0.2286 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1020" /> | |||||
<path | |||||
d="m 15.642233,291.21692 v -0.94262 c 0,-0.30198 -0.183445,-0.46285 -0.555978,-0.46285 -0.225778,0 -0.366889,0.0452 -0.491067,0.20602 l 0.138289,0.127 c 0.08184,-0.11571 0.172156,-0.15804 0.349956,-0.15804 0.254,0 0.3556,0.1016 0.3556,0.3048 v 0.13264 h -0.417689 c -0.310445,0 -0.479778,0.15805 -0.479778,0.40076 0,0.11007 0.03669,0.21449 0.104422,0.28222 0.08749,0.0903 0.200378,0.127 0.392289,0.127 0.186267,0 0.287867,-0.0367 0.400756,-0.14958 v 0.13265 z m -0.2032,-0.49107 c 0,0.11571 -0.02258,0.19474 -0.07056,0.23989 -0.08749,0.0847 -0.191911,0.0931 -0.310444,0.0931 -0.220134,0 -0.318912,-0.0762 -0.318912,-0.23706 0,-0.16087 0.1016,-0.24554 0.310445,-0.24554 h 0.389467 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1022" /> | |||||
<path | |||||
d="m 16.628291,291.21692 v -0.17498 h -0.110067 c -0.141111,0 -0.186267,-0.0677 -0.186267,-0.2032 v -1.63124 h -0.2032 v 1.63971 c 0,0.21166 0.110067,0.36971 0.352778,0.36971 z" | |||||
style="font-size:2.82222223px;stroke-width:0.26458332px" | |||||
id="path1024" /> | |||||
</g> | |||||
</g> | |||||
</svg> |
@@ -16,6 +16,10 @@ | |||||
"lastPath": "", | "lastPath": "", | ||||
"moduleBrowser": { | "moduleBrowser": { | ||||
"favorites": [ | "favorites": [ | ||||
{ | |||||
"plugin": "Template_shared", | |||||
"model": "MyModule" | |||||
}, | |||||
{ | { | ||||
"plugin": "Alikins", | "plugin": "Alikins", | ||||
"model": "SpecificValue" | "model": "SpecificValue" | ||||
@@ -13,6 +13,6 @@ PLAF_OBJ= | |||||
include make.objects | include make.objects | ||||
ALL_OBJ=$(MAIN_OBJ) | |||||
ALL_OBJ= $(MAIN_OBJ) | |||||
include vst2_common_msvc_post.mk | include vst2_common_msvc_post.mk |
@@ -8,7 +8,7 @@ EXTRALIBS+= $(call plugin_lib,Bidoo) | |||||
EXTRALIBS+= $(call plugin_lib,Bogaudio) | EXTRALIBS+= $(call plugin_lib,Bogaudio) | ||||
#EXTRALIBS+= $(call plugin_lib,BOKONTEPByteBeatMachine) # unstable | #EXTRALIBS+= $(call plugin_lib,BOKONTEPByteBeatMachine) # unstable | ||||
EXTRALIBS+= $(call plugin_lib,cf) | EXTRALIBS+= $(call plugin_lib,cf) | ||||
EXTRALIBS+= $(call plugin_lib,dBiz) | |||||
#EXTRALIBS+= $(call plugin_lib,dBiz) # now a DLL (13Jul2018) | |||||
EXTRALIBS+= $(call plugin_lib,DHE-Modules) | EXTRALIBS+= $(call plugin_lib,DHE-Modules) | ||||
EXTRALIBS+= $(call plugin_lib,DrumKit) | EXTRALIBS+= $(call plugin_lib,DrumKit) | ||||
EXTRALIBS+= $(call plugin_lib,ErraticInstruments) | EXTRALIBS+= $(call plugin_lib,ErraticInstruments) | ||||