@@ -9,8 +9,8 @@ | |||
+ 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 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 | |||
- Eureka (my own work-in-progress VST host) | |||
@@ -23,7 +23,7 @@ Tested in | |||
# Downloads | |||
The current release can be found in the [vst2_bin/](vst2_bin/) folder. | |||
Here's a snapshot of it: [veeseevstrack_0_6_1_win64_bin-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.** | |||
@@ -41,7 +41,27 @@ Here's a demo video of it: https://vimeo.com/277703414 | |||
# 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.MomentaryOnButtons | |||
- Alikins.BigMuteButton | |||
@@ -204,22 +224,6 @@ The following (478) add-on modules are statically linked with the VST plugin: | |||
- cf.PATCH | |||
- cf.LEDS | |||
- 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.Cubic | |||
- DHE-Modules.Hostage | |||
@@ -5,8 +5,8 @@ | |||
#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 { | |||
@@ -29,8 +29,8 @@ static const NVGcolor COLOR_DARK_PANEL = nvgRGB(0x17, 0x17, 0x17); | |||
struct RoundKnob : SVGKnob { | |||
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 { | |||
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 { | |||
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 { | |||
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"))); | |||
SVGWidget *cap = new SVGWidget(); | |||
cap->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/SynthTechAlco_cap.svg"))); | |||
@@ -293,16 +293,16 @@ struct SynthTechAlco : SVGKnob { | |||
struct Trimpot : SVGKnob { | |||
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"))); | |||
} | |||
}; | |||
struct BefacoBigKnob : SVGKnob { | |||
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"))); | |||
} | |||
}; | |||
@@ -316,8 +316,8 @@ struct BefacoBigSnapKnob : BefacoBigKnob { | |||
struct BefacoTinyKnob : SVGKnob { | |||
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"))); | |||
} | |||
}; | |||
@@ -335,8 +335,8 @@ struct BefacoSlidePot : SVGSlider { | |||
struct LEDSlider : SVGSlider { | |||
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); | |||
} | |||
}; | |||
@@ -458,7 +458,7 @@ struct RGBLight : ModuleLightWidget { | |||
template <typename BASE> | |||
struct LargeLight : BASE { | |||
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> | |||
struct MediumLight : BASE { | |||
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> | |||
struct SmallLight : BASE { | |||
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 { | |||
LEDBezelLight() { | |||
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 | |||
} app; | |||
struct { | |||
int bnd_icon_image; | |||
int bnd_font; | |||
} blendish; | |||
#ifdef USE_VST2 | |||
struct { | |||
volatile int b_close_window; | |||
@@ -136,6 +141,9 @@ struct GlobalUI { | |||
app.bLoadVSTUniqueParamBaseId = true; | |||
blendish.bnd_icon_image = -1; | |||
blendish.bnd_font = -1; | |||
#ifdef USE_VST2 | |||
vst2.b_close_window = 0; | |||
vst2.b_hide_window = 0; | |||
@@ -1,9 +1,110 @@ | |||
#pragma once | |||
#include "global_pre.hpp" | |||
#include <string> | |||
#include <stdio.h> // debug | |||
#include <list> | |||
#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 { | |||
@@ -36,6 +137,34 @@ struct Plugin { | |||
std::string website; | |||
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(); | |||
void addModel(Model *model); | |||
}; | |||
@@ -74,9 +203,13 @@ struct Model { | |||
return module; | |||
} | |||
ModuleWidget *createModuleWidget() override { | |||
printf("xxx createModuleWidget: ENTER\n"); | |||
TModule *module = new TModule(); | |||
printf("xxx createModuleWidget: module=%p\n", module); | |||
TModuleWidget *moduleWidget = new TModuleWidget(module); | |||
printf("xxx createModuleWidget: moduleWidget=%p\n", moduleWidget); | |||
moduleWidget->model = this; | |||
printf("xxx createModuleWidget: LEAVE\n"); | |||
return moduleWidget; | |||
} | |||
ModuleWidget *createModuleWidgetNull() override { | |||
@@ -118,43 +251,6 @@ extern std::string gToken; | |||
} // 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 | |||
// | |||
@@ -263,12 +263,4 @@ struct Scene : OpaqueWidget { | |||
void step() override; | |||
}; | |||
//////////////////// | |||
// globals | |||
//////////////////// | |||
extern Scene *gScene; | |||
} // 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. | |||
*/ | |||
inline float interpolateLinear(const float *p, float x) { | |||
int xi = x; | |||
int xi = int(x); | |||
float xf = x - xi; | |||
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/pffft.o \ | |||
dep/nanovg/src/nanovg.o \ | |||
@@ -38,14 +38,6 @@ LIB_OBJ= \ | |||
src/app/WireWidget.o \ | |||
src/asset.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/engine.o \ | |||
src/keyboard.o \ | |||
@@ -91,6 +83,26 @@ LIB_OBJ= \ | |||
src/window.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= \ | |||
src/vst2_main.o \ | |||
src/main.o | |||
@@ -12,6 +12,10 @@ bin: vst | |||
lib: | |||
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: | |||
vst: lib | |||
rm -f src/vst2_main.o | |||
@@ -26,6 +30,7 @@ vst: lib | |||
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_effect.msvc clean | |||
@@ -22,6 +22,6 @@ PLAF_OBJ= | |||
include make.objects | |||
ALL_OBJ=$(LIB_OBJ) | |||
ALL_OBJ=$(LIB_OBJ) $(LIB_OBJ_WIN) | |||
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 | |||
include ../../../build_plugin_pre.mk | |||
include ../../../build_shared_plugin_pre.mk | |||
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); | |||
#ifdef USE_VST2 | |||
#define plugin "dBiz" | |||
#endif // USE_VST2 | |||
// // #ifdef USE_VST2 | |||
// // #define plugin "dBiz" | |||
// // #endif // USE_VST2 | |||
namespace rack_plugin_dBiz { | |||
@@ -2,6 +2,8 @@ | |||
#include "Core.hpp" | |||
#include "global.hpp" | |||
#ifdef RACK_HOST | |||
RACK_PLUGIN_MODEL_DECLARE(Core, AudioInterface); | |||
RACK_PLUGIN_MODEL_DECLARE(Core, MIDIToCVInterface); | |||
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, Notes); | |||
} | |||
#endif // RACK_HOST |
@@ -1,6 +1,6 @@ | |||
#include "rack.hpp" | |||
#ifndef RACK_PLUGIN_SHARED | |||
using namespace rack; | |||
RACK_PLUGIN_INIT(Core); | |||
@@ -53,3 +53,4 @@ struct Grid16MidiWidget : MidiWidget { | |||
} | |||
virtual GridChoice *createGridChoice() {return NULL;} | |||
}; | |||
#endif // RACK_PLUGIN_SHARED |
@@ -133,13 +133,23 @@ struct ModelItem : BrowserListItem { | |||
} | |||
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(); | |||
printf("xxx vcvrack::ModuleBrowser: moduleWidget=%p\n", moduleWidget); | |||
if (!moduleWidget) | |||
return; | |||
global_ui->app.gRackWidget->addModule(moduleWidget); | |||
printf("xxx vcvrack::ModuleBrowser: addModule() OK\n"); | |||
// Move module nearest to the mouse position | |||
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); | |||
printf("xxx vcvrack::ModuleBrowser: requestModuleBoxNearest() OK\n"); | |||
} | |||
}; | |||
@@ -7,14 +7,27 @@ | |||
#include "global_ui.hpp" | |||
#ifdef USE_VST2 | |||
extern "C" void glfw_hack_makeContextCurrent(GLFWwindow *handle); | |||
// #include <windows.h> | |||
#endif // USE_VST2 | |||
namespace rack { | |||
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) { | |||
engineAddModule(module); | |||
printf("xxx ModuleWidget::ModuleWidget: engineAddModule OK\n"); | |||
} | |||
this->module = module; | |||
// printf("xxx ModuleWidget::ModuleWidget(): bind GL context global_ui->window.gWindow=%p\n", global_ui->window.gWindow); | |||
// glfwMakeContextCurrent(global_ui->window.gWindow); | |||
// // glfw_hack_makeContextCurrent(global_ui->window.gWindow); | |||
printf("xxx ModuleWidget::ModuleWidget(): RETURN\n"); | |||
} | |||
ModuleWidget::~ModuleWidget() { | |||
@@ -54,17 +67,27 @@ void ModuleWidget::addParam(ParamWidget *param) { | |||
void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | |||
// Remove old panel | |||
#ifdef RACK_PLUGIN_SHARED | |||
printf("xxx ModuleWidget::setPanel<shared>: 1\n"); | |||
#else | |||
printf("xxx ModuleWidget::setPanel<host>: 1\n"); | |||
#endif | |||
if (panel) { | |||
removeChild(panel); | |||
delete panel; | |||
panel = NULL; | |||
} | |||
// printf("xxx ModuleWidget::setPanel: 2\n"); | |||
panel = new SVGPanel(); | |||
// printf("xxx ModuleWidget::setPanel: 3\n"); | |||
panel->setBackground(svg); | |||
// printf("xxx ModuleWidget::setPanel: 4\n"); | |||
addChild(panel); | |||
// printf("xxx ModuleWidget::setPanel: 5\n"); | |||
box.size = panel->box.size; | |||
// printf("xxx ModuleWidget::setPanel: 6\n"); | |||
} | |||
@@ -132,6 +155,7 @@ void ModuleWidget::fromJson(json_t *rootJ) { | |||
double x, y; | |||
json_unpack(posJ, "[F, F]", &x, &y); | |||
Vec pos = Vec(x, y); | |||
printf("xxx ModuleWidget::fromJson: pos=(%f, %f) posJ=%p rootJ=%p\n", x, y, posJ, rootJ); | |||
if (legacy && legacy <= 1) { | |||
box.pos = pos; | |||
} | |||
@@ -218,23 +242,31 @@ ParamWidget *ModuleWidget::findParamWidgetByParamId(int _paramId) { | |||
} | |||
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); | |||
// printf("xxx ModuleWidget::draw: 2\n"); | |||
Widget::draw(vg); | |||
// printf("xxx ModuleWidget::draw: 3\n"); | |||
// CPU meter | |||
if (module && global->gPowerMeter) { | |||
// printf("xxx ModuleWidget::draw: 4b\n"); | |||
nvgBeginPath(vg); | |||
// printf("xxx ModuleWidget::draw: 5b\n"); | |||
nvgRect(vg, | |||
0, box.size.y - 20, | |||
55, 20); | |||
nvgFillColor(vg, nvgRGBAf(0, 0, 0, 0.5)); | |||
nvgFill(vg); | |||
// printf("xxx ModuleWidget::draw: 6b module=%p\n", module); | |||
std::string cpuText = stringf("%.0f mS", module->cpuTime * 1000.f); | |||
// printf("xxx ModuleWidget::draw: 7b\n"); | |||
nvgFontFaceId(vg, global_ui->window.gGuiFont->handle); | |||
nvgFontSize(vg, 12); | |||
nvgFillColor(vg, nvgRGBf(1, 1, 1)); | |||
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); | |||
nvgBeginPath(vg); | |||
@@ -245,7 +277,10 @@ void ModuleWidget::draw(NVGcontext *vg) { | |||
nvgFill(vg); | |||
} | |||
// printf("xxx ModuleWidget::draw: 4\n"); | |||
nvgResetScissor(vg); | |||
// printf("xxx ModuleWidget::draw: LEAVE\n"); | |||
} | |||
void ModuleWidget::drawShadow(NVGcontext *vg) { | |||
@@ -379,9 +414,12 @@ struct DeleteMenuItem : MenuItem { | |||
}; | |||
Menu *ModuleWidget::createContextMenu() { | |||
printf("xxx ModuleWidget::createContextMenu: ENTER\n"); | |||
Menu *menu = global_ui->ui.gScene->createMenu(); | |||
MenuLabel *menuLabel = new MenuLabel(); | |||
printf("xxx ModuleWidget::createContextMenu: model->author=\"%s\"\n", model->author.c_str()); | |||
printf("xxx ModuleWidget::createContextMenu: model->name=\"%s\"\n", model->name.c_str()); | |||
menuLabel->text = model->author + " " + model->name + " " + model->plugin->version; | |||
menu->addChild(menuLabel); | |||
@@ -5,6 +5,7 @@ namespace rack { | |||
void Panel::draw(NVGcontext *vg) { | |||
// printf("xxx Panel::draw: ENTER\n"); | |||
nvgBeginPath(vg); | |||
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); | |||
nvgStroke(vg); | |||
// printf("xxx Panel::draw: call Widget::draw\n"); | |||
Widget::draw(vg); | |||
// printf("xxx Panel::draw: LEAVE\n"); | |||
} | |||
} // namespace rack |
@@ -12,6 +12,10 @@ | |||
#include "global_ui.hpp" | |||
#ifdef USE_VST2 | |||
extern void vst2_set_shared_plugin_tls_globals(void); | |||
#endif // USE_VST2 | |||
namespace rack { | |||
@@ -300,6 +304,8 @@ json_t *RackWidget::toJson() { | |||
void RackWidget::fromJson(json_t *rootJ) { | |||
std::string message; | |||
vst2_set_shared_plugin_tls_globals(); // update JSON hashtable seed | |||
// version | |||
std::string version; | |||
json_t *versionJ = json_object_get(rootJ, "version"); | |||
@@ -343,6 +349,11 @@ void RackWidget::fromJson(json_t *rootJ) { | |||
} | |||
// 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(); | |||
assert(moduleWidget); | |||
moduleWidget->fromJson(moduleJ); | |||
@@ -97,6 +97,8 @@ std::string assetLocal(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); | |||
return plugin->path + "/" + filename; | |||
} | |||
@@ -18,10 +18,6 @@ | |||
#include "global_ui.hpp" | |||
#ifdef USE_VST2 | |||
extern void vst2_handle_ui_param (int uniqueParamId, float normValue); | |||
#endif // USE_VST2 | |||
namespace rack { | |||
@@ -17,7 +17,9 @@ | |||
#include <sys/param.h> // for MAXPATHLEN | |||
#include <fcntl.h> | |||
#include <dirent.h> | |||
#endif | |||
#else | |||
#include "util/dirent_win32/dirent.h" | |||
#endif // YAC_POSIX | |||
#include <thread> | |||
#include <stdexcept> | |||
@@ -46,7 +48,9 @@ namespace rack { | |||
typedef void (*InitCallback)(Plugin *); | |||
#ifdef USE_VST2 | |||
#ifndef RACK_PLUGIN | |||
static void vst2_load_static_rack_plugins(void); | |||
#endif // RACK_PLUGIN | |||
#endif // USE_VST2 | |||
@@ -67,6 +71,7 @@ void Plugin::addModel(Model *model) { | |||
//////////////////// | |||
static bool loadPlugin(std::string path) { | |||
#ifdef RACK_HOST | |||
std::string libraryFilename; | |||
#if ARCH_LIN | |||
libraryFilename = path + "/" + "plugin.so"; | |||
@@ -108,10 +113,15 @@ static bool loadPlugin(std::string path) { | |||
// Call plugin's init() function | |||
InitCallback initCallback; | |||
#ifdef USE_VST2 | |||
#define init_symbol_name "init_plugin" | |||
#else | |||
#define init_symbol_name "init" | |||
#endif // USE_VST2 | |||
#if ARCH_WIN | |||
initCallback = (InitCallback) GetProcAddress(handle, "init"); | |||
initCallback = (InitCallback) GetProcAddress(handle, init_symbol_name); | |||
#else | |||
initCallback = (InitCallback) dlsym(handle, "init"); | |||
initCallback = (InitCallback) dlsym(handle, init_symbol_name); | |||
#endif | |||
if (!initCallback) { | |||
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->path = path; | |||
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); | |||
// Reject plugin if slug already exists | |||
@@ -137,6 +154,10 @@ static bool loadPlugin(std::string path) { | |||
global->plugin.gPlugins.push_back(plugin); | |||
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; | |||
} | |||
@@ -231,18 +252,25 @@ static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) { | |||
} | |||
static void loadPlugins(std::string path) { | |||
#ifdef RACK_HOST | |||
std::string message; | |||
for (std::string pluginPath : systemListEntries(path)) { | |||
if (!systemIsDirectory(pluginPath)) | |||
continue; | |||
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()); | |||
#endif // USE_VST2 | |||
} | |||
} | |||
if (!message.empty()) { | |||
message += "See log for details."; | |||
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str()); | |||
} | |||
#else | |||
(void)path; | |||
#endif // RACK_HOST | |||
} | |||
#ifndef USE_VST2 | |||
@@ -349,6 +377,7 @@ static void extractPackages(std::string path) { | |||
void pluginInit(bool devMode) { | |||
tagsInit(); | |||
#ifdef RACK_HOST | |||
// Load core | |||
// This function is defined in core.cpp | |||
@@ -356,11 +385,14 @@ void pluginInit(bool devMode) { | |||
init_plugin_Core(corePlugin); | |||
global->plugin.gPlugins.push_back(corePlugin); | |||
#ifndef USE_VST2 | |||
// Init statically linked plugins | |||
vst2_load_static_rack_plugins(); | |||
// Get local plugins directory | |||
std::string localPlugins = assetLocal("plugins"); | |||
mkdir(localPlugins.c_str(), 0755); | |||
#ifndef USE_VST2 | |||
if (!devMode) { | |||
// Copy Fundamental package to plugins directory if folder does not exist | |||
std::string fundamentalSrc = assetGlobal("Fundamental.zip"); | |||
@@ -370,16 +402,17 @@ void pluginInit(bool devMode) { | |||
systemCopy(fundamentalSrc, fundamentalDest); | |||
} | |||
} | |||
#endif // USE_VST2 | |||
// Extract packages and load plugins | |||
#ifndef USE_VST2 | |||
extractPackages(localPlugins); | |||
#endif // USE_VST2 | |||
// Load/init dynamically loaded plugins | |||
loadPlugins(localPlugins); | |||
#else | |||
vst2_load_static_rack_plugins(); | |||
#endif // USE_VST2 | |||
#endif // RACK_HOST | |||
} | |||
void pluginDestroy() { | |||
@@ -567,6 +600,7 @@ Model *pluginGetModel(std::string pluginSlug, std::string modelSlug) { | |||
#ifdef USE_VST2 | |||
#ifndef RACK_PLUGIN | |||
extern "C" { | |||
extern void init_plugin_Alikins (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_BOKONTEPByteBeatMachine (rack::Plugin *p); // unstable | |||
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_DrumKit (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("BOKONTEPByteBeatMachine", &init_plugin_BOKONTEPByteBeatMachine); | |||
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("DrumKit", &init_plugin_DrumKit); | |||
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("VultModules", &init_plugin_VultModules); | |||
} | |||
#endif // RACK_PLUGIN | |||
#endif // USE_VST2 | |||
} // 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) { | |||
#ifdef USE_VST2 | |||
return rack::global_ui->app.gRackScene; | |||
@@ -45,6 +45,7 @@ void Menu::step() { | |||
} | |||
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); | |||
Widget::draw(vg); | |||
} | |||
@@ -8,14 +8,17 @@ namespace rack { | |||
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() { | |||
// Add 10 more pixels because Retina measurements are sometimes too small | |||
const float rightPadding = 10.0; | |||
// 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; | |||
// printf("xxx MenuLabel::step: => bndLabelWidth = %f\n", box.size.x); | |||
Widget::step(); | |||
} | |||
@@ -24,6 +24,7 @@ Menu *Scene::createMenu() { | |||
MenuOverlay *overlay = new MenuOverlay(); | |||
Menu *menu = new Menu(); | |||
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); | |||
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) { | |||
#ifdef RACK_HOST | |||
global->logger.startTime = std::chrono::high_resolution_clock::now(); | |||
if (devMode) { | |||
global->logger.logFile = stderr; | |||
@@ -17,12 +18,15 @@ void loggerInit(bool devMode) { | |||
std::string logFilename = assetLocal("log.txt"); | |||
global->logger.logFile = fopen(logFilename.c_str(), "w"); | |||
} | |||
#endif // RACK_HOST | |||
} | |||
void loggerDestroy() { | |||
#ifdef RACK_HOST | |||
if (global->logger.logFile != stderr) { | |||
fclose(global->logger.logFile); | |||
} | |||
#endif // RACK_HOST | |||
} | |||
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) { | |||
#ifdef RACK_HOST | |||
auto nowTime = std::chrono::high_resolution_clock::now(); | |||
int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - global->logger.startTime).count(); | |||
if (global->logger.logFile == stderr) | |||
@@ -52,13 +57,16 @@ static void loggerLogVa(LoggerLevel level, const char *file, int line, const cha | |||
printf("\n"); // xxx | |||
fprintf(global->logger.logFile, "\n"); | |||
fflush(global->logger.logFile); | |||
#endif // RACK_HOST | |||
} | |||
void loggerLog(LoggerLevel level, const char *file, int line, const char *format, ...) { | |||
#ifdef RACK_HOST | |||
va_list args; | |||
va_start(args, format); | |||
loggerLogVa(level, file, line, format, args); | |||
va_end(args); | |||
#endif // RACK_HOST | |||
} | |||
/** Deprecated. Included for ABI compatibility */ | |||
@@ -4,6 +4,8 @@ | |||
#ifdef YAC_POSIX | |||
#include <dirent.h> | |||
#include <sys/stat.h> | |||
#else | |||
#include "dirent_win32/dirent.h" | |||
#endif // YAC_POSIX | |||
#if ARCH_WIN | |||
@@ -21,7 +23,6 @@ namespace rack { | |||
std::vector<std::string> systemListEntries(std::string path) { | |||
std::vector<std::string> filenames; | |||
#ifndef SKIP_SYSTEM_FXNS | |||
DIR *dir = opendir(path.c_str()); | |||
if (dir) { | |||
struct dirent *d; | |||
@@ -33,7 +34,6 @@ std::vector<std::string> systemListEntries(std::string path) { | |||
} | |||
closedir(dir); | |||
} | |||
#endif | |||
return filenames; | |||
} | |||
@@ -47,25 +47,31 @@ bool systemExists(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; | |||
if (stat(path.c_str(), &statbuf)) | |||
return false; | |||
return S_ISREG(statbuf.st_mode); | |||
#else | |||
return false; | |||
#endif // SKIP_SYSTEM_FXNS | |||
#endif // ARCH_WIN | |||
} | |||
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; | |||
if (stat(path.c_str(), &statbuf)) | |||
return false; | |||
return S_ISDIR(statbuf.st_mode); | |||
#else | |||
return false; | |||
#endif // SKIP_SYSTEM_FXNS | |||
#endif // ARCH_WIN | |||
} | |||
void systemCopy(std::string srcPath, std::string destPath) { | |||
@@ -16,7 +16,7 @@ | |||
/// limitations under the License. | |||
/// | |||
/// 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 float vst2_get_param (int uniqueParamId); | |||
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" | |||
@@ -830,6 +831,8 @@ static DWORD WINAPI vst2_ui_thread_entry(VSTPluginWrapper *_wrapper) { | |||
_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) | |||
{ | |||
// printf("xxx vstrack_plugin<ui>: idle loop\n"); | |||
@@ -1001,6 +1004,7 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||
wrapper->lockAudio(); | |||
wrapper->setGlobals(); | |||
vst2_set_shared_plugin_tls_globals(); | |||
// // rack::global->engine.vipMutex.lock(); | |||
rack::global->engine.mutex.lock(); | |||
rack::global->vst2.last_seen_num_frames = sUI(sampleFrames); | |||
@@ -1014,17 +1018,18 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||
sUI i; | |||
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 | |||
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); | |||
@@ -1032,18 +1037,6 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||
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.mutex.unlock(); | |||
@@ -5,6 +5,7 @@ | |||
#include "nanovg_gl_utils.h" | |||
#include "global_ui.hpp" | |||
// #include <windows.h> | |||
namespace rack { | |||
@@ -35,8 +36,14 @@ FramebufferWidget::~FramebufferWidget() { | |||
void FramebufferWidget::draw(NVGcontext *vg) { | |||
// 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 | |||
float xform[6]; | |||
@@ -49,69 +56,103 @@ void FramebufferWidget::draw(NVGcontext *vg) { | |||
Vec bi = b.floor(); | |||
Vec bf = b.minus(bi); | |||
// printf("xxx FramebufferWidget::draw: 2 dirty=%d\n", dirty); | |||
// Render to framebuffer | |||
if (dirty) { | |||
dirty = false; | |||
// printf("xxx FramebufferWidget::draw: 2b internal=%p\n", internal); | |||
internal->box = getChildrenBoundingBox(); | |||
internal->box.pos = internal->box.pos.mult(s).floor(); | |||
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); | |||
// printf("xxx FramebufferWidget::draw: 4b\n"); | |||
if (!fbSize.isFinite()) | |||
return; | |||
if (fbSize.isZero()) | |||
return; | |||
// printf("xxx FramebufferWidget::draw: 5b\n"); | |||
// info("rendering framebuffer %f %f", fbSize.x, fbSize.y); | |||
// Delete old one first to free up GPU memory | |||
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. | |||
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) | |||
return; | |||
internal->setFramebuffer(fb); | |||
// printf("xxx FramebufferWidget::draw: 7b\n"); | |||
nvgluBindFramebuffer(fb); | |||
glViewport(0.0, 0.0, fbSize.x, fbSize.y); | |||
glClearColor(0.0, 0.0, 0.0, 0.0); | |||
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); | |||
nvgScale(global_ui->window.gFramebufferVg, global_ui->window.gPixelRatio * oversample, global_ui->window.gPixelRatio * oversample); | |||
// printf("xxx FramebufferWidget::draw: 9b\n"); | |||
// Use local scaling | |||
nvgTranslate(global_ui->window.gFramebufferVg, bf.x, bf.y); | |||
nvgTranslate(global_ui->window.gFramebufferVg, -internal->box.pos.x, -internal->box.pos.y); | |||
nvgScale(global_ui->window.gFramebufferVg, s.x, s.y); | |||
// printf("xxx FramebufferWidget::draw: 10b\n"); | |||
Widget::draw(global_ui->window.gFramebufferVg); | |||
// printf("xxx FramebufferWidget::draw: 11b\n"); | |||
nvgEndFrame(global_ui->window.gFramebufferVg); | |||
// printf("xxx FramebufferWidget::draw: 12b\n"); | |||
nvgluBindFramebuffer(NULL); | |||
// printf("xxx FramebufferWidget::draw: 13b\n"); | |||
} | |||
// printf("xxx FramebufferWidget::draw: 3\n"); | |||
if (!internal->fb) { | |||
return; | |||
} | |||
// printf("xxx FramebufferWidget::draw: 4\n"); | |||
// Draw framebuffer image, using world coordinates | |||
nvgSave(vg); | |||
nvgResetTransform(vg); | |||
nvgTranslate(vg, bi.x, bi.y); | |||
// printf("xxx FramebufferWidget::draw: 5\n"); | |||
nvgBeginPath(vg); | |||
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); | |||
nvgFillPaint(vg, paint); | |||
nvgFill(vg); | |||
// printf("xxx FramebufferWidget::draw: 6\n"); | |||
// For debugging the bounding box of the framebuffer | |||
// nvgStrokeWidth(vg, 2.0); | |||
// nvgStrokeColor(vg, nvgRGBA(255, 0, 0, 128)); | |||
// nvgStroke(vg); | |||
nvgRestore(vg); | |||
// printf("xxx FramebufferWidget::draw: LEAVE\n"); | |||
} | |||
int FramebufferWidget::getImageHandle() { | |||
@@ -210,10 +210,12 @@ void SVGWidget::setSVG(std::shared_ptr<SVG> svg) { | |||
} | |||
void SVGWidget::draw(NVGcontext *vg) { | |||
// printf("xxx SVGWidget::draw: ENTER\n"); | |||
if (svg && svg->handle) { | |||
// printf("drawing svg %f %f\n", box.size.x, box.size.y); | |||
drawSVG(vg, svg->handle); | |||
} | |||
// printf("xxx SVGWidget::draw: LEAVE\n"); | |||
} | |||
@@ -110,12 +110,18 @@ void Widget::step() { | |||
void Widget::draw(NVGcontext *vg) { | |||
for (Widget *child : children) { | |||
// printf("xxx Widget::draw: 1 child=%p vg=%p\n", child, vg); | |||
if (!child->visible) | |||
continue; | |||
// printf("xxx Widget::draw: 2 child=%p\n", child); | |||
nvgSave(vg); | |||
// printf("xxx Widget::draw: 3 child=%p\n", child); | |||
nvgTranslate(vg, child->box.pos.x, child->box.pos.y); | |||
// printf("xxx Widget::draw: 4 child=%p\n", child); | |||
child->draw(vg); | |||
// printf("xxx Widget::draw: 5 child=%p\n", child); | |||
nvgRestore(vg); | |||
// printf("xxx Widget::draw: 6 child=%p\n", child); | |||
} | |||
} | |||
@@ -306,6 +306,7 @@ void errorCallback(int error, const char *description) { | |||
void renderGui() { | |||
int width, height; | |||
// printf("xxx renderGui: ENTER\n"); | |||
glfwGetFramebufferSize(global_ui->window.gWindow, &width, &height); | |||
// Update and render | |||
@@ -313,13 +314,16 @@ void renderGui() { | |||
nvgReset(global_ui->window.gVg); | |||
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); | |||
// printf("xxx renderGui: gScene->draw() END\n"); | |||
glViewport(0, 0, width, height); | |||
glClearColor(0.0, 0.0, 0.0, 1.0); | |||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | |||
nvgEndFrame(global_ui->window.gVg); | |||
glfwSwapBuffers(global_ui->window.gWindow); | |||
// printf("xxx renderGui: LEAVE\n"); | |||
} | |||
void windowInit() { | |||
@@ -469,7 +473,9 @@ void windowRun() { | |||
#endif // USE_VST2 | |||
) { | |||
#ifndef RACK_PLUGIN | |||
vst2_handle_queued_set_program_chunk(); | |||
#endif // RACK_PLUGIN | |||
double startTime = glfwGetTime(); | |||
global_ui->window.gGuiFrame++; | |||
@@ -547,6 +553,7 @@ void windowRun() { | |||
break; | |||
} | |||
#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) | |||
{ | |||
rack::global_ui->vst2.b_queued_maximize_window = false; | |||
@@ -554,6 +561,7 @@ void windowRun() { | |||
vst2_maximize_reparented_window(); | |||
} | |||
#endif // VST2_REPARENT_WINDOW_HACK | |||
#endif // RACK_PLUGIN | |||
#endif // USE_VST2 | |||
} | |||
@@ -749,13 +757,16 @@ std::shared_ptr<Image> Image::load(const std::string &filename) { | |||
//////////////////// | |||
SVG::SVG(const std::string &filename) { | |||
// printf("xxx SVG::SVG: ENTER\n"); | |||
handle = nsvgParseFromFile(filename.c_str(), "px", SVG_DPI); | |||
// printf("xxx SVG::SVG: handle=%p\n"); | |||
if (handle) { | |||
info("Loaded SVG %s", filename.c_str()); | |||
} | |||
else { | |||
warn("Failed to load SVG %s", filename.c_str()); | |||
} | |||
// printf("xxx SVG::SVG: LEAVE\n"); | |||
} | |||
SVG::~SVG() { | |||
@@ -763,9 +774,12 @@ SVG::~SVG() { | |||
} | |||
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(); | |||
// printf("xxx SVG::load: cache locked OK\n"); | |||
if (!sp) | |||
global_ui->window.svg_cache[filename] = sp = std::make_shared<SVG>(filename); | |||
// printf("xxx SVG::load: RETURN\n"); | |||
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 | |||
- fix: assign unique VST param base id when duplicating modules | |||
- 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:66] Global directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||
[0.000 info src/main.cpp:67] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||
[0.000 info src/plugin.cpp: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": "", | |||
"moduleBrowser": { | |||
"favorites": [ | |||
{ | |||
"plugin": "Template_shared", | |||
"model": "MyModule" | |||
}, | |||
{ | |||
"plugin": "Alikins", | |||
"model": "SpecificValue" | |||
@@ -13,6 +13,6 @@ PLAF_OBJ= | |||
include make.objects | |||
ALL_OBJ=$(MAIN_OBJ) | |||
ALL_OBJ= $(MAIN_OBJ) | |||
include vst2_common_msvc_post.mk |
@@ -8,7 +8,7 @@ EXTRALIBS+= $(call plugin_lib,Bidoo) | |||
EXTRALIBS+= $(call plugin_lib,Bogaudio) | |||
#EXTRALIBS+= $(call plugin_lib,BOKONTEPByteBeatMachine) # unstable | |||
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,DrumKit) | |||
EXTRALIBS+= $(call plugin_lib,ErraticInstruments) | |||