Browse Source

Merge branch 'master' of https://github.com/VCVRack/Rack

pull/805/head
Bader Boland 7 years ago
parent
commit
a54aafa194
50 changed files with 1473 additions and 1878 deletions
  1. +4
    -4
      README.md
  2. +73
    -50
      include/app.hpp
  3. +3
    -2
      include/audio.hpp
  4. +1
    -2
      include/bridge.hpp
  5. +88
    -31
      include/componentlibrary.hpp
  6. +6
    -0
      include/util/math.hpp
  7. +31
    -393
      res/ComponentLibrary/BefacoBigKnob.svg
  8. +34
    -391
      res/ComponentLibrary/BefacoTinyKnob.svg
  9. +66
    -0
      res/ComponentLibrary/LEDSlider.svg
  10. +71
    -0
      res/ComponentLibrary/LEDSliderBlueHandle.svg
  11. +71
    -0
      res/ComponentLibrary/LEDSliderGreenHandle.svg
  12. +71
    -0
      res/ComponentLibrary/LEDSliderRedHandle.svg
  13. +71
    -0
      res/ComponentLibrary/LEDSliderWhiteHandle.svg
  14. +71
    -0
      res/ComponentLibrary/LEDSliderYellowHandle.svg
  15. +10
    -207
      res/ComponentLibrary/PB61303.svg
  16. +6
    -6
      res/ComponentLibrary/Rogan1PGreen.svg
  17. +8
    -8
      res/ComponentLibrary/Rogan1PRed.svg
  18. +8
    -8
      res/ComponentLibrary/Rogan1PSGreen.svg
  19. +8
    -8
      res/ComponentLibrary/Rogan1PSRed.svg
  20. +8
    -8
      res/ComponentLibrary/Rogan2PGreen.svg
  21. +8
    -8
      res/ComponentLibrary/Rogan2PRed.svg
  22. +8
    -8
      res/ComponentLibrary/Rogan2PSGreen.svg
  23. +8
    -8
      res/ComponentLibrary/Rogan2PSRed.svg
  24. +8
    -8
      res/ComponentLibrary/Rogan3PGreen.svg
  25. +8
    -8
      res/ComponentLibrary/Rogan3PRed.svg
  26. +8
    -8
      res/ComponentLibrary/Rogan3PSGreen.svg
  27. +6
    -6
      res/ComponentLibrary/Rogan3PSRed.svg
  28. +0
    -123
      res/ComponentLibrary/RoundBlack.svg
  29. +71
    -0
      res/ComponentLibrary/RoundBlackKnob.svg
  30. +71
    -0
      res/ComponentLibrary/RoundHugeBlackKnob.svg
  31. +71
    -0
      res/ComponentLibrary/RoundLargeBlackKnob.svg
  32. +71
    -0
      res/ComponentLibrary/RoundSmallBlackKnob.svg
  33. +24
    -386
      res/ComponentLibrary/Trimpot.svg
  34. +22
    -19
      src/Core/AudioInterface.cpp
  35. +45
    -14
      src/Core/QuadMIDIToCVInterface.cpp
  36. +13
    -6
      src/app/CircularShadow.cpp
  37. +9
    -4
      src/app/Knob.cpp
  38. +1
    -1
      src/app/LightWidget.cpp
  39. +18
    -0
      src/app/MomentarySwitch.cpp
  40. +7
    -7
      src/app/Parameter.cpp
  41. +32
    -0
      src/app/SVGButton.cpp
  42. +0
    -30
      src/app/SVGFader.cpp
  43. +15
    -8
      src/app/SVGKnob.cpp
  44. +14
    -0
      src/app/SVGPort.cpp
  45. +37
    -0
      src/app/SVGSlider.cpp
  46. +1
    -1
      src/app/SVGSwitch.cpp
  47. +17
    -0
      src/app/ToggleSwitch.cpp
  48. +15
    -23
      src/audio.cpp
  49. +155
    -83
      src/bridge.cpp
  50. +1
    -1
      src/main.cpp

+ 4
- 4
README.md View File

@@ -87,10 +87,10 @@ Build plugin.

All **source code** in this repository is licensed under [BSD-3-Clause](LICENSE.txt) by [Andrew Belt](https://andrewbelt.name/).

**Component Library graphics** in `res/ComponentLibrary` are licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) by [Grayscale](http://grayscale.info/). Commercial plugins must request a commercial license to use Component Library graphics.
**Component Library graphics** in `res/ComponentLibrary` are licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) by [Grayscale](http://grayscale.info/). Commercial plugins must request a commercial license to use Component Library graphics by emailing contact@vcvrack.com.

**Core** panel graphics in `res/Core` are copyright © 2017 by Grayscale. You may not create derivative works of Core panels.
**Core** panel graphics in `res/Core` are copyright © 2017 Grayscale. You may not create derivative works of Core panels.

The **VCV logo and icon** are copyright © 2017 by Grayscale and may not be used in derivative works.
The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works.

The **"VCV" brand name** is trademarked and may not be used for unofficial products. However, it is acceptable to use the phrase "for VCV Rack" for promotion of your plugin.
The **"VCV" name** is trademarked and may not be used for unofficial products. However, it is acceptable to use the phrase "for VCV Rack" for promotion of your plugin. For all other purposes, email contact@vcvrack.com.

+ 73
- 50
include/app.hpp View File

@@ -36,7 +36,7 @@ struct Module;
struct Wire;

struct RackWidget;
struct ParamWidget;
struct Parameter;
struct Port;
struct SVGPanel;

@@ -58,14 +58,14 @@ struct ModuleWidget : OpaqueWidget {
SVGPanel *panel = NULL;
std::vector<Port*> inputs;
std::vector<Port*> outputs;
std::vector<ParamWidget*> params;
std::vector<Parameter*> params;

ModuleWidget(Module *module);
~ModuleWidget();
/** Convenience functions for adding special widgets (calls addChild()) */
void addInput(Port *input);
void addOutput(Port *output);
void addParam(ParamWidget *param);
void addParam(Parameter *param);
void setPanel(std::shared_ptr<SVG> svg);

virtual json_t *toJson();
@@ -200,16 +200,31 @@ struct SVGPanel : FramebufferWidget {
};

////////////////////
// params
// ParamWidgets and other components
////////////////////

/** A Widget that exists on a Panel and interacts with a Module */
struct Component : OpaqueWidget {
Module *module = NULL;

template <typename T = Component>
static T *create(Vec pos, Module *module) {
T *o = new T();
o->box.pos = pos;
o->module = module;
return o;
}
};

struct CircularShadow : TransparentWidget {
float blur = 0.0;
float blurRadius;
float opacity;
CircularShadow();
void draw(NVGcontext *vg) override;
};

struct ParamWidget : OpaqueWidget, QuantityWidget {
Module *module = NULL;
/** A Component which has control over a Param (defined in engine.hpp) */
struct Parameter : Component, QuantityWidget {
int paramId;
/** Used to momentarily disable value randomization
To permanently disable or change randomization behavior, override the randomize() method instead of changing this.
@@ -225,10 +240,9 @@ struct ParamWidget : OpaqueWidget, QuantityWidget {
void onMouseDown(EventMouseDown &e) override;
void onChange(EventChange &e) override;

template <typename T = ParamWidget>
template <typename T = Parameter>
static T *create(Vec pos, Module *module, int paramId, float minValue, float maxValue, float defaultValue) {
T *o = Widget::create<T>(pos);
o->module = module;
T *o = Component::create<T>(pos, module);
o->paramId = paramId;
o->setLimits(minValue, maxValue);
o->setDefaultValue(defaultValue);
@@ -236,8 +250,11 @@ struct ParamWidget : OpaqueWidget, QuantityWidget {
}
};

/** Deprecated name of Parameter */
typedef Parameter ParamWidget;

/** Implements vertical dragging behavior for ParamWidgets */
struct Knob : ParamWidget {
struct Knob : Parameter {
/** Snap to nearest integer while dragging */
bool snap = false;
/** Multiplier for mouse movement to adjust knob value */
@@ -249,18 +266,19 @@ struct Knob : ParamWidget {
void onDragEnd(EventDragEnd &e) override;
};

struct SpriteKnob : virtual Knob, SpriteWidget {
/** Deprecated */
struct SpriteKnob : Knob, SpriteWidget {
int minIndex, maxIndex, spriteCount;
void step() override;
};

/** A knob which rotates an SVG and caches it in a framebuffer */
struct SVGKnob : virtual Knob, FramebufferWidget {
/** Angles in radians */
float minAngle, maxAngle;
/** Not owned */
struct SVGKnob : Knob, FramebufferWidget {
TransformWidget *tw;
SVGWidget *sw;
CircularShadow *shadow;
/** Angles in radians */
float minAngle, maxAngle;

SVGKnob();
void setSVG(std::shared_ptr<SVG> svg);
@@ -268,26 +286,28 @@ struct SVGKnob : virtual Knob, FramebufferWidget {
void onChange(EventChange &e) override;
};

struct SVGFader : Knob, FramebufferWidget {
/** Intermediate positions will be interpolated between these positions */
Vec minHandlePos, maxHandlePos;
/** Not owned */
/** Behaves like a knob but linearly moves an SVGWidget between two points.
Can be used for horizontal or vertical linear faders.
*/
struct SVGSlider : Knob, FramebufferWidget {
SVGWidget *background;
SVGWidget *handle;
/** Intermediate positions will be interpolated between these positions */
Vec minHandlePos, maxHandlePos;

SVGFader();
SVGSlider();
void setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG);
void step() override;
void onChange(EventChange &e) override;
};

struct Switch : ParamWidget {
};
/** Deprecated name for SVGSlider */
typedef SVGSlider SVGFader;

struct SVGSwitch : virtual Switch, FramebufferWidget {
/** A Parameter with multiple frames corresponding to its value */
struct SVGSwitch : virtual Parameter, FramebufferWidget {
std::vector<std::shared_ptr<SVG>> frames;
/** Not owned */
SVGWidget *sw;

SVGSwitch();
/** Adds an SVG file to represent the next switch position */
void addFrame(std::shared_ptr<SVG> svg);
@@ -295,29 +315,33 @@ struct SVGSwitch : virtual Switch, FramebufferWidget {
};

/** A switch that cycles through each mechanical position */
struct ToggleSwitch : virtual Switch {
void onDragStart(EventDragStart &e) override {
// Cycle through values
// e.g. a range of [0.0, 3.0] would have modes 0, 1, 2, and 3.
if (value >= maxValue)
setValue(minValue);
else
setValue(value + 1.0);
}
struct ToggleSwitch : virtual Parameter {
void onDragStart(EventDragStart &e) override;
};

/** A switch that is turned on when held */
struct MomentarySwitch : virtual Switch {
/** A switch that is turned on when held and turned off when released.
Consider using SVGButton if the switch simply changes the state of your Module when clicked.
*/
struct MomentarySwitch : virtual Parameter {
/** Don't randomize state */
void randomize() override {}
void onDragStart(EventDragStart &e) override {
setValue(maxValue);
EventAction eAction;
onAction(eAction);
}
void onDragEnd(EventDragEnd &e) override {
setValue(minValue);
}
void onDragStart(EventDragStart &e) override;
void onDragEnd(EventDragEnd &e) override;
};

/** A Component with a default (up) and active (down) state when clicked.
Does not modify a Param, simply calls onAction() of a subclass.
*/
struct SVGButton : Component, FramebufferWidget {
Module *module = NULL;
std::shared_ptr<SVG> defaultSVG;
std::shared_ptr<SVG> activeSVG;
SVGWidget *sw;
SVGButton();
/** If `activeSVG` is NULL, `defaultSVG` is used as the active state instead. */
void setSVGs(std::shared_ptr<SVG> defaultSVG, std::shared_ptr<SVG> activeSVG);
void onDragStart(EventDragStart &e) override;
void onDragEnd(EventDragEnd &e) override;
};

////////////////////
@@ -426,13 +450,11 @@ struct ModuleLightWidget : MultiLightWidget {
// ports
////////////////////

struct Port : OpaqueWidget {
struct Port : Component {
enum PortType {
INPUT,
OUTPUT
};

Module *module = NULL;
PortType type = INPUT;
int portId;
MultiLightWidget *plugLight;
@@ -450,9 +472,8 @@ struct Port : OpaqueWidget {

template <typename T = Port>
static T *create(Vec pos, PortType type, Module *module, int portId) {
T *o = Widget::create<T>(pos);
T *o = Component::create<T>(pos, module);
o->type = type;
o->module = module;
o->portId = portId;
return o;
}
@@ -460,8 +481,10 @@ struct Port : OpaqueWidget {

struct SVGPort : Port, FramebufferWidget {
SVGWidget *background;
CircularShadow *shadow;

SVGPort();
void setSVG(std::shared_ptr<SVG> svg);
void draw(NVGcontext *vg) override;
};



+ 3
- 2
include/audio.hpp View File

@@ -43,17 +43,18 @@ struct AudioIO {
void setSampleRate(int sampleRate);
void setBlockSize(int blockSize);

void setChannels(int numOutputs, int numInputs);

/** Must close the stream before opening */
void openStream();
void closeStream();
/** Returns whether the audio stream is open and running */
bool isActive();

std::vector<int> getSampleRates();

virtual void processStream(const float *input, float *output, int frames) {}
virtual void onCloseStream() {}
virtual void onOpenStream() {}
virtual void onChannelsChange() {}
json_t *toJson();
void fromJson(json_t *rootJ);
};


+ 1
- 2
include/bridge.hpp View File

@@ -5,14 +5,13 @@
namespace rack {


static const int BRIDGE_CHANNELS = 16;
static const int BRIDGE_NUM_PORTS = 16;


void bridgeInit();
void bridgeDestroy();
void bridgeAudioSubscribe(int channel, AudioIO *audio);
void bridgeAudioUnsubscribe(int channel, AudioIO *audio);
bool bridgeAudioIsSubscribed(int channel, AudioIO *audio);


} // namespace rack

+ 88
- 31
include/componentlibrary.hpp View File

@@ -36,31 +36,30 @@ struct RoundKnob : SVGKnob {

struct RoundBlackKnob : RoundKnob {
RoundBlackKnob() {
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/RoundBlack.svg")));
box.size = Vec(38, 38);
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/RoundBlackKnob.svg")));
}
};

struct RoundSmallBlackKnob : RoundBlackKnob {
struct RoundSmallBlackKnob : RoundKnob {
RoundSmallBlackKnob() {
box.size = Vec(28, 28);
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/RoundSmallBlackKnob.svg")));
}
};

struct RoundLargeBlackKnob : RoundBlackKnob {
struct RoundLargeBlackKnob : RoundKnob {
RoundLargeBlackKnob() {
box.size = Vec(46, 46);
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/RoundLargeBlackKnob.svg")));
}
};

struct RoundHugeBlackKnob : RoundBlackKnob {
struct RoundHugeBlackKnob : RoundKnob {
RoundHugeBlackKnob() {
box.size = Vec(56, 56);
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/RoundHugeBlackKnob.svg")));
}
};

struct RoundSmallBlackSnapKnob : RoundSmallBlackKnob {
RoundSmallBlackSnapKnob() {
struct RoundBlackSnapKnob : RoundBlackKnob {
RoundBlackSnapKnob() {
snap = true;
smooth = false;
}
@@ -294,7 +293,6 @@ struct SynthTechAlco : SVGKnob {

struct Trimpot : SVGKnob {
Trimpot() {
box.size = Vec(17, 17);
minAngle = -0.75*M_PI;
maxAngle = 0.75*M_PI;
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/Trimpot.svg")));
@@ -303,7 +301,6 @@ struct Trimpot : SVGKnob {

struct BefacoBigKnob : SVGKnob {
BefacoBigKnob() {
box.size = Vec(75, 75);
minAngle = -0.75*M_PI;
maxAngle = 0.75*M_PI;
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/BefacoBigKnob.svg")));
@@ -319,52 +316,81 @@ struct BefacoBigSnapKnob : BefacoBigKnob {

struct BefacoTinyKnob : SVGKnob {
BefacoTinyKnob() {
box.size = Vec(26, 26);
minAngle = -0.75*M_PI;
maxAngle = 0.75*M_PI;
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/BefacoTinyKnob.svg")));
}
};

struct BefacoSlidePot : SVGFader {
struct BefacoSlidePot : SVGSlider {
BefacoSlidePot() {
Vec margin = Vec(3.5, 3.5);
maxHandlePos = Vec(-1, -2).plus(margin);
minHandlePos = Vec(-1, 87).plus(margin);
background->svg = SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePot.svg"));
background->wrap();
setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePot.svg")), SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePotHandle.svg")));
background->box.pos = margin;
box.size = background->box.size.plus(margin.mult(2));
handle->svg = SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePotHandle.svg"));
handle->wrap();
}
};

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)));
setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/LEDSlider.svg")), NULL);
}
};

/** API is unstable for LEDSlider. Will add a LightWidget later. */
struct LEDSliderGreen : LEDSlider {
LEDSliderGreen() {
handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderGreenHandle.svg")));
}
};

struct LEDSliderRed : LEDSlider {
LEDSliderRed() {
handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderRedHandle.svg")));
}
};

struct LEDSliderYellow : LEDSlider {
LEDSliderYellow() {
handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderYellowHandle.svg")));
}
};

struct LEDSliderBlue : LEDSlider {
LEDSliderBlue() {
handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderBlueHandle.svg")));
}
};

struct LEDSliderWhite : LEDSlider {
LEDSliderWhite() {
handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderWhiteHandle.svg")));
}
};

////////////////////
// Jacks
// Ports
////////////////////

struct PJ301MPort : SVGPort {
PJ301MPort() {
background->svg = SVG::load(assetGlobal("res/ComponentLibrary/PJ301M.svg"));
background->wrap();
box.size = background->box.size;
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/PJ301M.svg")));
}
};

struct PJ3410Port : SVGPort {
PJ3410Port() {
background->svg = SVG::load(assetGlobal("res/ComponentLibrary/PJ3410.svg"));
background->wrap();
box.size = background->box.size;
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/PJ3410.svg")));
}
};

struct CL1362Port : SVGPort {
CL1362Port() {
background->svg = SVG::load(assetGlobal("res/ComponentLibrary/CL1362.svg"));
background->wrap();
box.size = background->box.size;
setSVG(SVG::load(assetGlobal("res/ComponentLibrary/CL1362.svg")));
}
};

@@ -452,6 +478,26 @@ struct TinyLight : BASE {
}
};

/** A light to displayed over PB61303. Must add a color by subclassing or templating. */
template <typename BASE>
struct LEDBezelLight : BASE {
LEDBezelLight() {
this->bgColor = COLOR_BLACK_TRANSPARENT;
this->box.size = mm2px(Vec(6.0, 6.0));
}
};

/** A light to displayed over PB61303. Must add a color by subclassing or templating.
Don't add this as a child of the PB61303 itself. Instead, just place it over it as a sibling in the scene graph, offset by mm2px(Vec(0.5, 0.5)).
*/
template <typename BASE>
struct PB61303Light : BASE {
PB61303Light() {
this->bgColor = COLOR_BLACK_TRANSPARENT;
this->box.size = mm2px(Vec(9.0, 9.0));
}
};


////////////////////
// Switches and Buttons
@@ -515,18 +561,29 @@ struct BefacoPush : SVGSwitch, MomentarySwitch {
}
};

struct LEDBezel : SVGSwitch, MomentarySwitch {
LEDBezel() {
addFrame(SVG::load(assetGlobal("res/ComponentLibrary/LEDBezel.svg")));
}
};

struct PB61303 : SVGSwitch, MomentarySwitch {
PB61303() {
addFrame(SVG::load(assetGlobal("res/ComponentLibrary/PB61303.svg")));
}
};

struct LEDBezel : SVGSwitch, MomentarySwitch {
LEDBezel() {
addFrame(SVG::load(assetGlobal("res/ComponentLibrary/LEDBezel.svg")));
struct PB61303Button : SVGButton {
PB61303Button() {
setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/PB61303.svg")), NULL);
}
};

struct LEDBezelButton : SVGButton {
LEDBezelButton() {
setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/LEDBezel.svg")), NULL);
}
};

////////////////////
// Misc


+ 6
- 0
include/util/math.hpp View File

@@ -257,6 +257,12 @@ struct Rect {
r.size = size;
return r;
}
Rect grow(Vec delta) {
Rect r;
r.pos = pos.minus(delta);
r.size = size.plus(delta.mult(2.f));
return r;
}
};




+ 31
- 393
res/ComponentLibrary/BefacoBigKnob.svg View File

@@ -9,376 +9,15 @@
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="25.664583mm"
height="25.66571mm"
viewBox="0 0 25.664584 25.665714"
width="26.000004mm"
height="26.001146mm"
viewBox="0 0 26.000004 26.001146"
version="1.1"
id="svg15246"
sodipodi:docname="BefacoBigKnob.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
id="svg113936"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="BefacoBigKnob.svg">
<defs
id="defs15240">
<clipPath
id="clip89">
<rect
y="0"
x="0"
width="18"
height="19"
id="rect4864" />
</clipPath>
<clipPath
id="clip90">
<path
inkscape:connector-curvature="0"
d="m 0.898438,0.128906 h 16.25 v 17.882813 h -16.25 z m 0,0"
id="path4861" />
</clipPath>
<mask
id="mask44">
<g
style="filter:url(#alpha)"
id="g4858"
transform="matrix(0.26458333,0,0,0.26458333,89.358789,128.57765)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4856" />
</g>
</mask>
<filter
id="alpha"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149" />
</filter>
<clipPath
id="clipPath17821">
<rect
y="0"
x="0"
width="18"
height="19"
id="rect17819" />
</clipPath>
<clipPath
id="clipPath17825">
<path
inkscape:connector-curvature="0"
d="m 0.898438,0.128906 h 16.25 v 17.882813 h -16.25 z m 0,0"
id="path17823" />
</clipPath>
<clipPath
id="clip87">
<rect
y="0"
x="0"
width="24"
height="26"
id="rect4848" />
</clipPath>
<clipPath
id="clip88">
<path
inkscape:connector-curvature="0"
d="m 0.683594,0.921875 h 22.679687 v 24.9375 H 0.683594 Z m 0,0"
id="path4845" />
</clipPath>
<mask
id="mask43">
<g
style="filter:url(#alpha)"
id="g4842"
transform="matrix(0.26458333,0,0,0.26458333,89.358789,128.57765)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4840" />
</g>
</mask>
<filter
id="filter17836"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix17834" />
</filter>
<clipPath
id="clipPath17840">
<rect
y="0"
x="0"
width="24"
height="26"
id="rect17838" />
</clipPath>
<clipPath
id="clipPath17844">
<path
inkscape:connector-curvature="0"
d="m 0.683594,0.921875 h 22.679687 v 24.9375 H 0.683594 Z m 0,0"
id="path17842" />
</clipPath>
<clipPath
id="clip95">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect4912" />
</clipPath>
<clipPath
id="clip96">
<path
inkscape:connector-curvature="0"
d="M 0.140625,0.140625 H 17.199219 V 17.199219 H 0.140625 Z m 0,0"
id="path4909" />
</clipPath>
<mask
id="mask47">
<g
style="filter:url(#alpha-3)"
id="g4906"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect4904" />
</g>
</mask>
<filter
id="alpha-3"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149-6" />
</filter>
<clipPath
id="clipPath18541">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect18539" />
</clipPath>
<clipPath
id="clipPath18545">
<path
inkscape:connector-curvature="0"
d="M 0.140625,0.140625 H 17.199219 V 17.199219 H 0.140625 Z m 0,0"
id="path18543" />
</clipPath>
<clipPath
id="clip93">
<rect
y="0"
x="0"
width="22"
height="24"
id="rect4896" />
</clipPath>
<clipPath
id="clip94">
<path
inkscape:connector-curvature="0"
d="M 0.0390625,0.0390625 H 21.300781 V 23.421875 H 0.0390625 Z m 0,0"
id="path4893" />
</clipPath>
<mask
id="mask46">
<g
style="filter:url(#alpha-3)"
id="g4890"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4888" />
</g>
</mask>
<filter
id="filter18556"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix18554" />
</filter>
<clipPath
id="clipPath18560">
<rect
y="0"
x="0"
width="22"
height="24"
id="rect18558" />
</clipPath>
<clipPath
id="clipPath18564">
<path
inkscape:connector-curvature="0"
d="M 0.0390625,0.0390625 H 21.300781 V 23.421875 H 0.0390625 Z m 0,0"
id="path18562" />
</clipPath>
<clipPath
id="clip91">
<rect
y="0"
x="0"
width="29"
height="32"
id="rect4880" />
</clipPath>
<clipPath
id="clip92">
<path
inkscape:connector-curvature="0"
d="M 0.507812,0.5 H 28.855469 V 31.679688 H 0.507812 Z m 0,0"
id="path4877" />
</clipPath>
<mask
id="mask45">
<g
style="filter:url(#alpha-3)"
id="g4874"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4872" />
</g>
</mask>
<filter
id="filter18575"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix18573" />
</filter>
<clipPath
id="clipPath18579">
<rect
y="0"
x="0"
width="29"
height="32"
id="rect18577" />
</clipPath>
<clipPath
id="clipPath18583">
<path
inkscape:connector-curvature="0"
d="M 0.507812,0.5 H 28.855469 V 31.679688 H 0.507812 Z m 0,0"
id="path18581" />
</clipPath>
<clipPath
id="clip202">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect5795" />
</clipPath>
<clipPath
id="clip203">
<path
inkscape:connector-curvature="0"
d="M 0.855469,0.140625 H 17.914062 V 17.199219 H 0.855469 Z m 0,0"
id="path5792" />
</clipPath>
<mask
id="mask104">
<g
style="filter:url(#alpha-7)"
id="g5789"
transform="matrix(0.26458333,0,0,0.26458333,74.416306,97.613551)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect5787" />
</g>
</mask>
<filter
id="alpha-7"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149-5" />
</filter>
<clipPath
id="clipPath18765">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect18763" />
</clipPath>
<clipPath
id="clipPath18769">
<path
inkscape:connector-curvature="0"
d="M 0.855469,0.140625 H 17.914062 V 17.199219 H 0.855469 Z m 0,0"
id="path18767" />
</clipPath>
</defs>
id="defs113930" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
@@ -386,24 +25,23 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="87.773411"
inkscape:cy="59.915557"
inkscape:document-units="px"
inkscape:zoom="5.6"
inkscape:cx="14.009349"
inkscape:cy="28.754907"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata15243">
id="metadata113933">
<rdf:RDF>
<cc:Work
rdf:about="">
@@ -418,26 +56,26 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-35.482976,-90.654687)">
transform="translate(-80.833177,-85.089003)">
<path
inkscape:connector-curvature="0"
id="path8601"
d="m 61.147561,103.48699 c 0,7.08725 -5.74505,12.83341 -12.832292,12.83341 -7.087243,0 -12.832293,-5.74616 -12.832293,-12.83341 0,-7.086131 5.74505,-12.832303 12.832293,-12.832303 7.087242,0 12.832292,5.746172 12.832292,12.832303"
style="fill:#d4d4d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28420019" />
style="fill:#d4d4d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2879144"
d="m 106.83318,98.089007 c 0,7.179863 -5.82014,13.001143 -13.000007,13.001143 -7.179864,0 -12.999996,-5.82128 -12.999996,-13.001143 0,-7.178735 5.820132,-13.000004 12.999996,-13.000004 7.179867,0 13.000007,5.821269 13.000007,13.000004"
id="path109718" />
<path
inkscape:connector-curvature="0"
id="path8603"
d="m 57.727183,98.408023 c -0.629474,-1.174541 -1.474287,-2.215876 -2.478992,-3.075134 -1.937223,0.271988 -3.943278,-0.692738 -4.94463,-2.372407 -0.643883,-0.122118 -1.308884,-0.187618 -1.988292,-0.187618 -0.679408,0 -1.3433,0.0655 -1.988294,0.187618 -1.00135,1.679669 -3.006296,2.644395 -4.944627,2.372407 -1.004706,0.859258 -1.849519,1.900593 -2.478994,3.075134 0.71715,1.853957 0.205392,4.067617 -1.254488,5.418667 0.04774,1.34552 0.340842,2.62774 0.840408,3.80119 1.942764,0.58283 3.389316,2.4046 3.515869,4.43063 1.029117,0.75603 2.199227,1.32997 3.462581,1.67855 1.673003,-1.17786 4.022088,-1.17786 5.69509,0 1.263355,-0.34858 2.433463,-0.92252 3.463689,-1.67855 0.125446,-2.02603 1.571996,-3.8478 3.51587,-4.43063 0.499566,-1.17345 0.792663,-2.45567 0.83927,-3.80119 -1.45985,-1.35105 -1.970501,-3.56471 -1.25446,-5.418667"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28420019" />
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2879144"
d="m 103.36809,92.943667 c -0.6377,-1.189896 -1.49355,-2.244833 -2.51139,-3.115323 -1.962536,0.275543 -3.99481,-0.701791 -5.009247,-2.403411 -0.652299,-0.123713 -1.32599,-0.190069 -2.01428,-0.190069 -0.688287,0 -1.360855,0.06636 -2.014277,0.190069 -1.014438,1.70162 -3.045587,2.678954 -5.00925,2.403411 -1.017835,0.87049 -1.873689,1.925427 -2.51139,3.115323 0.726523,1.878194 0.208076,4.120774 -1.270883,5.489499 0.04838,1.363087 0.345295,2.662074 0.851391,3.850844 1.968154,0.59045 3.433609,2.43604 3.561817,4.48854 1.042568,0.76591 2.227968,1.34736 3.507834,1.7005 1.694867,-1.19327 4.074651,-1.19327 5.769516,0 1.279864,-0.35314 2.465268,-0.93459 3.508959,-1.7005 0.12709,-2.0525 1.59254,-3.89809 3.56182,-4.48854 0.50609,-1.18877 0.80302,-2.487757 0.85024,-3.850844 -1.47894,-1.368725 -1.99626,-3.611305 -1.27086,-5.489499"
id="path109720" />
<path
inkscape:connector-curvature="0"
id="path8605"
d="m 48.76709,91.713777 c 0,0.249785 -0.203146,0.450724 -0.451821,0.450724 -0.248676,0 -0.450713,-0.200939 -0.450713,-0.450724 0,-0.249785 0.202037,-0.450726 0.450713,-0.450726 0.248675,0 0.451821,0.200941 0.451821,0.450726"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28420019" />
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2879144"
d="m 94.2909,86.161932 c 0,0.253052 -0.205801,0.456617 -0.457727,0.456617 -0.251924,0 -0.456603,-0.203565 -0.456603,-0.456617 0,-0.253046 0.204679,-0.456614 0.456603,-0.456614 0.251926,0 0.457727,0.203568 0.457727,0.456614"
id="path109722" />
<path
inkscape:connector-curvature="0"
id="path8607"
d="m 48.76709,103.48809 h -0.902534 v -9.733847 h 0.902534 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28420019" />
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2879144"
d="m 94.2909,98.090134 h -0.91433 v -9.861065 h 0.91433 z m 0,0"
id="path109724" />
</g>
</svg>

+ 34
- 391
res/ComponentLibrary/BefacoTinyKnob.svg View File

@@ -9,376 +9,15 @@
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="8.6999998mm"
height="8.7000618mm"
viewBox="0 0 8.7000002 8.7000631"
width="9.0000019mm"
height="9.0000801mm"
viewBox="0 0 9.0000016 9.00008"
version="1.1"
id="svg15246"
sodipodi:docname="BefacoTinyKnob.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
id="svg113936"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="BefacoTinyKnob.svg">
<defs
id="defs15240">
<clipPath
id="clip89">
<rect
y="0"
x="0"
width="18"
height="19"
id="rect4864" />
</clipPath>
<clipPath
id="clip90">
<path
inkscape:connector-curvature="0"
d="m 0.898438,0.128906 h 16.25 v 17.882813 h -16.25 z m 0,0"
id="path4861" />
</clipPath>
<mask
id="mask44">
<g
style="filter:url(#alpha)"
id="g4858"
transform="matrix(0.26458333,0,0,0.26458333,89.358789,128.57765)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4856" />
</g>
</mask>
<filter
id="alpha"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149" />
</filter>
<clipPath
id="clipPath17821">
<rect
y="0"
x="0"
width="18"
height="19"
id="rect17819" />
</clipPath>
<clipPath
id="clipPath17825">
<path
inkscape:connector-curvature="0"
d="m 0.898438,0.128906 h 16.25 v 17.882813 h -16.25 z m 0,0"
id="path17823" />
</clipPath>
<clipPath
id="clip87">
<rect
y="0"
x="0"
width="24"
height="26"
id="rect4848" />
</clipPath>
<clipPath
id="clip88">
<path
inkscape:connector-curvature="0"
d="m 0.683594,0.921875 h 22.679687 v 24.9375 H 0.683594 Z m 0,0"
id="path4845" />
</clipPath>
<mask
id="mask43">
<g
style="filter:url(#alpha)"
id="g4842"
transform="matrix(0.26458333,0,0,0.26458333,89.358789,128.57765)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4840" />
</g>
</mask>
<filter
id="filter17836"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix17834" />
</filter>
<clipPath
id="clipPath17840">
<rect
y="0"
x="0"
width="24"
height="26"
id="rect17838" />
</clipPath>
<clipPath
id="clipPath17844">
<path
inkscape:connector-curvature="0"
d="m 0.683594,0.921875 h 22.679687 v 24.9375 H 0.683594 Z m 0,0"
id="path17842" />
</clipPath>
<clipPath
id="clip95">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect4912" />
</clipPath>
<clipPath
id="clip96">
<path
inkscape:connector-curvature="0"
d="M 0.140625,0.140625 H 17.199219 V 17.199219 H 0.140625 Z m 0,0"
id="path4909" />
</clipPath>
<mask
id="mask47">
<g
style="filter:url(#alpha-3)"
id="g4906"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect4904" />
</g>
</mask>
<filter
id="alpha-3"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149-6" />
</filter>
<clipPath
id="clipPath18541">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect18539" />
</clipPath>
<clipPath
id="clipPath18545">
<path
inkscape:connector-curvature="0"
d="M 0.140625,0.140625 H 17.199219 V 17.199219 H 0.140625 Z m 0,0"
id="path18543" />
</clipPath>
<clipPath
id="clip93">
<rect
y="0"
x="0"
width="22"
height="24"
id="rect4896" />
</clipPath>
<clipPath
id="clip94">
<path
inkscape:connector-curvature="0"
d="M 0.0390625,0.0390625 H 21.300781 V 23.421875 H 0.0390625 Z m 0,0"
id="path4893" />
</clipPath>
<mask
id="mask46">
<g
style="filter:url(#alpha-3)"
id="g4890"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4888" />
</g>
</mask>
<filter
id="filter18556"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix18554" />
</filter>
<clipPath
id="clipPath18560">
<rect
y="0"
x="0"
width="22"
height="24"
id="rect18558" />
</clipPath>
<clipPath
id="clipPath18564">
<path
inkscape:connector-curvature="0"
d="M 0.0390625,0.0390625 H 21.300781 V 23.421875 H 0.0390625 Z m 0,0"
id="path18562" />
</clipPath>
<clipPath
id="clip91">
<rect
y="0"
x="0"
width="29"
height="32"
id="rect4880" />
</clipPath>
<clipPath
id="clip92">
<path
inkscape:connector-curvature="0"
d="M 0.507812,0.5 H 28.855469 V 31.679688 H 0.507812 Z m 0,0"
id="path4877" />
</clipPath>
<mask
id="mask45">
<g
style="filter:url(#alpha-3)"
id="g4874"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4872" />
</g>
</mask>
<filter
id="filter18575"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix18573" />
</filter>
<clipPath
id="clipPath18579">
<rect
y="0"
x="0"
width="29"
height="32"
id="rect18577" />
</clipPath>
<clipPath
id="clipPath18583">
<path
inkscape:connector-curvature="0"
d="M 0.507812,0.5 H 28.855469 V 31.679688 H 0.507812 Z m 0,0"
id="path18581" />
</clipPath>
<clipPath
id="clip202">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect5795" />
</clipPath>
<clipPath
id="clip203">
<path
inkscape:connector-curvature="0"
d="M 0.855469,0.140625 H 17.914062 V 17.199219 H 0.855469 Z m 0,0"
id="path5792" />
</clipPath>
<mask
id="mask104">
<g
style="filter:url(#alpha-7)"
id="g5789"
transform="matrix(0.26458333,0,0,0.26458333,74.416306,97.613551)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect5787" />
</g>
</mask>
<filter
id="alpha-7"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149-5" />
</filter>
<clipPath
id="clipPath18765">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect18763" />
</clipPath>
<clipPath
id="clipPath18769">
<path
inkscape:connector-curvature="0"
d="M 0.855469,0.140625 H 17.914062 V 17.199219 H 0.855469 Z m 0,0"
id="path18767" />
</clipPath>
</defs>
id="defs113930" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
@@ -386,24 +25,23 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="6.9301735"
inkscape:cy="26.379575"
inkscape:zoom="2.8"
inkscape:cx="-45.569736"
inkscape:cy="83.754679"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
inkscape:window-maximized="0" />
<metadata
id="metadata15243">
id="metadata113933">
<rdf:RDF>
<cc:Work
rdf:about="">
@@ -418,26 +56,31 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-44.329061,-94.497224)">
transform="translate(-111.86932,-85.795053)">
<path
inkscape:connector-curvature="0"
style="fill:#d4d4d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28209424"
d="m 120.10511,92.798549 c 1.38512,-2.062815 0.83525,-4.854005 -1.22757,-6.23803 -2.0617,-1.384026 -4.86062,-0.840773 -6.24463,1.222041 -1.38514,2.062814 -0.83306,4.866126 1.22866,6.251255 2.06282,1.384023 4.8595,0.827547 6.24354,-1.235266"
id="path109730" />
<path
inkscape:connector-curvature="0"
id="path8613"
d="m 52.290324,101.26723 c 1.338942,-1.994021 0.807417,-4.692165 -1.186639,-6.030054 -1.992992,-1.337892 -4.698607,-0.812749 -6.036486,1.181298 -1.338972,1.994058 -0.805286,4.703946 1.187706,6.042896 1.994056,1.33787 4.69751,0.79991 6.035419,-1.19414"
style="fill:#d4d4d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2726914" />
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28209424"
d="m 120.02026,91.143448 c -0.46281,2.022043 -2.47716,3.285957 -4.49919,2.823148 -2.02205,-0.462813 -3.28598,-2.47714 -2.82314,-4.499182 0.46281,-2.020944 2.47713,-3.285958 4.49918,-2.82315 2.02093,0.462812 3.28594,2.477141 2.82315,4.499184"
id="path109732" />
<path
inkscape:connector-curvature="0"
id="path8615"
d="m 52.208301,99.667339 c -0.44738,1.954671 -2.394585,3.176391 -4.349209,2.729081 -1.954654,-0.44739 -3.176442,-2.39461 -2.729042,-4.349251 0.44738,-1.953574 2.394563,-3.176427 4.349208,-2.729043 1.953568,0.447388 3.176423,2.394569 2.729043,4.349213"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2726914" />
style="fill:none;stroke:#7f7878;stroke-width:0.11481237;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
d="m 120.02026,91.143463 c -0.46281,2.022042 -2.47715,3.285956 -4.49919,2.823145 -2.02204,-0.462811 -3.28595,-2.47714 -2.82314,-4.499183 0.46281,-2.020941 2.47714,-3.285957 4.49918,-2.823145 2.02094,0.46281 3.28596,2.47714 2.82315,4.499183 z m 0,0"
id="path109734" />
<path
inkscape:connector-curvature="0"
id="path8617"
d="m 52.208301,99.667339 c -0.44738,1.954671 -2.394585,3.176391 -4.349209,2.729081 -1.954654,-0.44739 -3.176442,-2.39461 -2.729042,-4.349251 0.44738,-1.953574 2.394563,-3.176427 4.349208,-2.729043 1.953568,0.447388 3.176423,2.394569 2.729043,4.349213 z m 0,0"
style="fill:none;stroke:#7f7878;stroke-width:0.11098535;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28209424"
d="m 116.20648,88.009558 c -0.11239,-0.07603 -0.14328,-0.229201 -0.0672,-0.342701 0.0761,-0.113495 0.23029,-0.143251 0.34379,-0.06722 0.11356,0.07603 0.14325,0.229201 0.0672,0.342701 -0.076,0.113495 -0.23031,0.14325 -0.34379,0.06722"
id="path109736" />
<path
inkscape:connector-curvature="0"
id="path8619"
d="m 48.391403,96.830763 c -0.21444,-0.145066 -0.273308,-0.437224 -0.128239,-0.653739 0.145022,-0.216515 0.439333,-0.273263 0.65581,-0.128222 0.216541,0.145032 0.273259,0.437221 0.128239,0.653732 -0.145017,0.216521 -0.439318,0.27326 -0.65581,0.128291"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.53812313" />
style="fill:none;stroke:#000000;stroke-width:0.46912277;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
d="m 116.20647,88.009571 c -0.11239,-0.07603 -0.14326,-0.229202 -0.0672,-0.3427 0.076,-0.113495 0.23032,-0.14325 0.34381,-0.06722 0.11356,0.07602 0.14325,0.229201 0.0672,0.3427 -0.076,0.113495 -0.2303,0.143251 -0.3438,0.06722 z m 0,0"
id="path109738" />
</g>
</svg>

+ 66
- 0
res/ComponentLibrary/LEDSlider.svg View File

@@ -0,0 +1,66 @@
<?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="7.00002mm"
height="26.999905mm"
viewBox="0 0 7.00002 26.999905"
version="1.1"
id="svg163547"
sodipodi:docname="LEDSlider.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
<defs
id="defs163541" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="-33.18202"
inkscape:cy="22.493378"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="2"
fit-margin-right="2"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata163544">
<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(-105.35713,-95.267905)">
<path
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 110.35715,95.267905 v 26.999905 h -3.00002 V 95.267905 Z m 0,0"
id="path159840"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/LEDSliderBlueHandle.svg View File

@@ -0,0 +1,71 @@
<?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="1.52411mm"
height="4.1437631mm"
viewBox="0 0 1.52411 4.143763"
version="1.1"
id="svg164153"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="LEDSliderBlueHandle.svg">
<defs
id="defs164147" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-27.821283"
inkscape:cy="-9.1133715"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata164150">
<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(-120.21393,-92.817187)">
<path
style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 121.73804,92.817187 v 4.143763 h -1.52411 v -4.143763 z m 0,0"
id="path162658"
inkscape:connector-curvature="0" />
<path
style="fill:#4cc7f3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 121.73804,93.251269 v 3.275599 h -1.52411 v -3.275599 z m 0,0"
id="path162660"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/LEDSliderGreenHandle.svg View File

@@ -0,0 +1,71 @@
<?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="1.52411mm"
height="4.1423831mm"
viewBox="0 0 1.52411 4.1423831"
version="1.1"
id="svg164153"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="LEDSliderGreenHandle.svg">
<defs
id="defs164147" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-42.017793"
inkscape:cy="0.48214362"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata164150">
<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(-123.97009,-95.35738)">
<path
style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 125.4942,95.35738 v 4.142383 h -1.52411 V 95.35738 Z m 0,0"
id="path162646"
inkscape:connector-curvature="0" />
<path
style="fill:#8fc53d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 125.4942,95.790083 v 3.276977 h -1.52411 v -3.276977 z m 0,0"
id="path162648"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/LEDSliderRedHandle.svg View File

@@ -0,0 +1,71 @@
<?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="1.52414mm"
height="4.1423802mm"
viewBox="0 0 1.52414 4.1423802"
version="1.1"
id="svg164153"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="LEDSliderRedHandle.svg">
<defs
id="defs164147" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-23.101371"
inkscape:cy="2.1230781"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata164150">
<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(-118.96512,-95.791547)">
<path
style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 120.48926,95.791547 v 4.14238 h -1.52414 v -4.14238 z m 0,0"
id="path162650"
inkscape:connector-curvature="0" />
<path
style="fill:#f82b1c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 120.48926,96.225629 v 3.275595 h -1.52414 v -3.275595 z m 0,0"
id="path162652"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/LEDSliderWhiteHandle.svg View File

@@ -0,0 +1,71 @@
<?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="1.52411mm"
height="4.1423841mm"
viewBox="0 0 1.52411 4.142384"
version="1.1"
id="svg164153"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="LEDSliderWhiteHandle.svg">
<defs
id="defs164147" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-27.719009"
inkscape:cy="-12.144383"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata164150">
<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(-120.18687,-92.016611)">
<path
style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 121.71098,92.016611 v 4.142384 h -1.52411 v -4.142384 z m 0,0"
id="path162662"
inkscape:connector-curvature="0" />
<path
style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 121.71098,92.449314 v 3.276974 h -1.52411 v -3.276974 z m 0,0"
id="path162664"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/LEDSliderYellowHandle.svg View File

@@ -0,0 +1,71 @@
<?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="1.52411mm"
height="4.1423841mm"
viewBox="0 0 1.52411 4.142384"
version="1.1"
id="svg164153"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="LEDSliderYellowHandle.svg">
<defs
id="defs164147" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-37.393768"
inkscape:cy="-10.378115"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata164150">
<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(-122.74665,-92.483936)">
<path
style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 124.27076,92.483936 v 4.142384 h -1.52411 v -4.142384 z m 0,0"
id="path162654"
inkscape:connector-curvature="0" />
<path
style="fill:#ffd714;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 124.27076,92.918018 v 3.275599 h -1.52411 v -3.275599 z m 0,0"
id="path162656"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 10
- 207
res/ComponentLibrary/PB61303.svg View File

@@ -7,209 +7,17 @@
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:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="10.000438mm"
height="10.000403mm"
viewBox="0 0 10.000438 10.000403"
version="1.1"
id="svg81475"
id="svg27765"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="PB61303.svg">
<defs
id="defs81469">
<clipPath
id="clip176">
<rect
y="0"
x="0"
width="23"
height="23"
id="rect5578" />
</clipPath>
<clipPath
id="clip177">
<path
inkscape:connector-curvature="0"
d="M 0.335938,0.0585938 H 22.300781 V 22.023438 H 0.335938 Z m 0,0"
id="path5566" />
</clipPath>
<clipPath
id="clip178">
<path
inkscape:connector-curvature="0"
d="m 11.316406,0.0585938 c -6.0625,0 -10.980468,4.9179682 -10.980468,10.9843752 0,6.0625 4.917968,10.980469 10.980468,10.980469 6.070313,0 10.988282,-4.917969 10.988282,-10.980469 0,-6.066407 -4.917969,-10.9843752 -10.988282,-10.9843752 m 0,0.5000002 c 5.785156,0 10.488282,4.703125 10.488282,10.484375 0,5.777343 -4.703126,10.480469 -10.488282,10.480469 -5.777344,0 -10.480468,-4.703126 -10.480468,-10.480469 0,-5.78125 4.703124,-10.484375 10.480468,-10.484375"
id="path5569" />
</clipPath>
<mask
id="mask89">
<g
style="filter:url(#alpha)"
id="g5575">
<image
y="-0.00263398"
x="-0.51525402"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABmJLR0QA/wD/AP+gvaeTAAABMklEQVRIia3UuUoEQRDG8d+2432hoIIHCBqIqWAqGGiggan4CoKJYCr4Tia+hhiLmRhosGKg7Bp0r7ses85q/6Goobr6m5mqrq7pTq3Dmsm3aHbYj/SVxAsMpedGsuYXq2EgWWv9V8YxUiUxETCJwd8SZ6oklTCF0bLF2W6LFZnXLucHw1j4pzCxD6tfg2ti7XIwI1ZBQH8KNjKJP3SKL+I+k3CLAiGIv/GUWfwFE0E8epUGoFfxQrvmOQlSWQZ8vjNyMI16EOs9l1l8Ho8B19jILD6G14C6eC7LbsheWcddZ2AZ+xmEazhO/mPkb8UmrPxT/AhXfjjaAWdY+qPwAXa7JRQ4xVYPooM4wXbVDXu4wKby23IchzgXe/aNbsNTYCe94C3lNpLvwzMucVP1i7PyDvnKKY/BOBMhAAAAAElFTkSuQmCC"
height="0.27702156"
width="0.27702156"
id="use5573"
transform="rotate(-90)" />
</g>
</mask>
<filter
id="alpha"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149" />
</filter>
<mask
id="mask88">
<g
style="filter:url(#alpha)"
id="g5563"
transform="scale(0.26458333)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect5561" />
</g>
</mask>
<filter
id="filter81423"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix81421" />
</filter>
<clipPath
id="clipPath81427">
<rect
y="0"
x="0"
width="23"
height="23"
id="rect81425" />
</clipPath>
<clipPath
id="clipPath81431">
<path
inkscape:connector-curvature="0"
d="M 0.335938,0.0585938 H 22.300781 V 22.023438 H 0.335938 Z m 0,0"
id="path81429" />
</clipPath>
<clipPath
id="clipPath81435">
<path
inkscape:connector-curvature="0"
d="m 11.316406,0.0585938 c -6.0625,0 -10.980468,4.9179682 -10.980468,10.9843752 0,6.0625 4.917968,10.980469 10.980468,10.980469 6.070313,0 10.988282,-4.917969 10.988282,-10.980469 0,-6.066407 -4.917969,-10.9843752 -10.988282,-10.9843752 m 0,0.5000002 c 5.785156,0 10.488282,4.703125 10.488282,10.484375 0,5.777343 -4.703126,10.480469 -10.488282,10.480469 -5.777344,0 -10.480468,-4.703126 -10.480468,-10.480469 0,-5.78125 4.703124,-10.484375 10.480468,-10.484375"
id="path81433" />
</clipPath>
<mask
id="mask81441">
<g
style="filter:url(#alpha)"
id="g81439">
<image
y="-0.00263398"
x="-0.51525402"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABmJLR0QA/wD/AP+gvaeTAAABMklEQVRIia3UuUoEQRDG8d+2432hoIIHCBqIqWAqGGiggan4CoKJYCr4Tia+hhiLmRhosGKg7Bp0r7ses85q/6Goobr6m5mqrq7pTq3Dmsm3aHbYj/SVxAsMpedGsuYXq2EgWWv9V8YxUiUxETCJwd8SZ6oklTCF0bLF2W6LFZnXLucHw1j4pzCxD6tfg2ti7XIwI1ZBQH8KNjKJP3SKL+I+k3CLAiGIv/GUWfwFE0E8epUGoFfxQrvmOQlSWQZ8vjNyMI16EOs9l1l8Ho8B19jILD6G14C6eC7LbsheWcddZ2AZ+xmEazhO/mPkb8UmrPxT/AhXfjjaAWdY+qPwAXa7JRQ4xVYPooM4wXbVDXu4wKby23IchzgXe/aNbsNTYCe94C3lNpLvwzMucVP1i7PyDvnKKY/BOBMhAAAAAElFTkSuQmCC"
height="0.27702156"
width="0.27702156"
id="use81437"
transform="rotate(-90)" />
</g>
</mask>
<filter
id="filter81445"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix81443" />
</filter>
<clipPath
id="clip174">
<rect
y="0"
x="0"
width="27"
height="26"
id="rect5553" />
</clipPath>
<clipPath
id="clip175">
<path
inkscape:connector-curvature="0"
d="M 0.558594,0.289062 H 26.070312 V 25.800781 H 0.558594 Z m 0,0"
id="path5550" />
</clipPath>
<mask
id="mask87">
<g
style="filter:url(#alpha)"
id="g5547"
transform="scale(0.26458333)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect5545" />
</g>
</mask>
<filter
id="filter81456"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix81454" />
</filter>
<clipPath
id="clipPath81460">
<rect
y="0"
x="0"
width="27"
height="26"
id="rect81458" />
</clipPath>
<clipPath
id="clipPath81464">
<path
inkscape:connector-curvature="0"
d="M 0.558594,0.289062 H 26.070312 V 25.800781 H 0.558594 Z m 0,0"
id="path81462" />
</clipPath>
</defs>
id="defs27759" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
@@ -217,9 +25,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="-30.133384"
inkscape:cy="16.667692"
inkscape:zoom="2.8"
inkscape:cx="-41.967543"
inkscape:cy="-16.198567"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
@@ -233,7 +41,7 @@
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata81472">
id="metadata27762">
<rdf:RDF>
<cc:Work
rdf:about="">
@@ -248,16 +56,11 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-57.743829,-79.577179)">
transform="translate(-52.452162,-82.600989)">
<path
inkscape:connector-curvature="0"
id="path9091"
d="m 67.744267,84.578086 c 0,2.760204 -2.239327,4.999496 -5.000907,4.999496 -2.760204,0 -4.999531,-2.239292 -4.999531,-4.999496 0,-2.761614 2.239327,-5.000907 4.999531,-5.000907 2.76158,0 5.000907,2.239293 5.000907,5.000907"
style="fill:#211e1e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
id="path81613"
d="m 67.244028,84.578086 c 0,2.484579 -2.014678,4.499293 -4.500668,4.499293 -2.484614,0 -4.499293,-2.014714 -4.499293,-4.499293 0,-2.485989 2.014679,-4.500668 4.499293,-4.500668 2.48599,0 4.500668,2.014679 4.500668,4.500668"
style="clip-rule:nonzero;fill:#6a6868;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
inkscape:connector-curvature="0" />
style="fill:#211e1e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 62.4526,87.601896 c 0,2.760204 -2.239327,4.999496 -4.999531,4.999496 -2.76158,0 -5.000907,-2.239292 -5.000907,-4.999496 0,-2.761615 2.239327,-5.000907 5.000907,-5.000907 2.760204,0 4.999531,2.239292 4.999531,5.000907"
id="path26168" />
</g>
</svg>

+ 6
- 6
res/ComponentLibrary/Rogan1PGreen.svg View File

@@ -392,9 +392,9 @@
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-width="2560"
inkscape:window-height="1440"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
units="px"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,11 +428,11 @@
inkscape:connector-curvature="0"
id="path7717"
d="m 60.430463,91.091863 c 0,2.182813 -1.768016,3.950836 -3.950828,3.950836 -2.181437,0 -3.950829,-1.768023 -3.950829,-3.950836 0,-2.181433 1.769392,-3.949456 3.950829,-3.949456 2.182812,0 3.950828,1.768023 3.950828,3.949456"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7719"
d="m 57.18519,85.60383 c -0.231493,-0.02893 -0.465772,-0.04961 -0.705555,-0.04961 -0.239783,0 -0.474028,0.02067 -0.705556,0.04961 v 1.701878 h 1.411111 z m 0,0"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan1PRed.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="35.570219"
inkscape:cx="4.6773619"
inkscape:cy="11.017728"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,11 +428,11 @@
inkscape:connector-curvature="0"
id="path7725"
d="m 58.530155,91.196795 c 0,2.182812 -1.768016,3.950836 -3.950828,3.950836 -2.181437,0 -3.950829,-1.768024 -3.950829,-3.950836 0,-2.181433 1.769392,-3.949457 3.950829,-3.949457 2.182812,0 3.950828,1.768024 3.950828,3.949457"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7727"
d="m 55.284882,85.708758 c -0.231493,-0.02893 -0.465772,-0.04961 -0.705555,-0.04961 -0.239783,0 -0.474028,0.02067 -0.705556,0.04961 v 1.701878 h 1.411111 z m 0,0"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan1PSGreen.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="45.219096"
inkscape:cx="14.326239"
inkscape:cy="27.987957"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,7 +428,7 @@
inkscape:connector-curvature="0"
id="path7691"
d="m 57.439346,94.226115 c 0,2.181437 -1.769392,3.950836 -3.950829,3.950836 -2.182812,0 -3.952204,-1.769399 -3.952204,-3.950836 0,-2.182812 1.769392,-3.950832 3.952204,-3.950832 2.181437,0 3.950829,1.76802 3.950829,3.950832"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7693"
@@ -438,6 +438,6 @@
inkscape:connector-curvature="0"
id="path7695"
d="m 54.125176,87.258067 c -0.20948,-0.0193 -0.421676,-0.03168 -0.638034,-0.03168 -0.260456,0 -0.51816,0.01654 -0.773077,0.0441 v 3.168111 h 1.411111 z m 0,0"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan1PSRed.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="50.246257"
inkscape:cx="19.3534"
inkscape:cy="20.515109"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,7 +428,7 @@
inkscape:connector-curvature="0"
id="path7699"
d="m 56.109243,92.248924 c 0,2.181437 -1.769392,3.950836 -3.950829,3.950836 -2.182812,0 -3.952204,-1.769399 -3.952204,-3.950836 0,-2.182812 1.769392,-3.950832 3.952204,-3.950832 2.181437,0 3.950829,1.76802 3.950829,3.950832"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7701"
@@ -438,6 +438,6 @@
inkscape:connector-curvature="0"
id="path7703"
d="m 52.795073,85.280876 c -0.20948,-0.0193 -0.421676,-0.03168 -0.638034,-0.03168 -0.260456,0 -0.51816,0.01654 -0.773077,0.0441 v 3.168111 h 1.411111 z m 0,0"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan2PGreen.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="19.905014"
inkscape:cx="-10.987843"
inkscape:cy="37.67402"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,11 +428,11 @@
inkscape:connector-curvature="0"
id="path7673"
d="m 63.549962,97.739725 c 0,2.382635 -1.931977,4.314635 -4.31462,4.314635 -2.382629,0 -4.316017,-1.932 -4.316017,-4.314635 0,-2.384005 1.933388,-4.314638 4.316017,-4.314638 2.382643,0 4.31462,1.930633 4.31462,4.314638"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7675"
d="m 59.939514,91.734925 c -0.23151,-0.02618 -0.465775,-0.0441 -0.705555,-0.0441 -0.2384,0 -0.472666,0.01792 -0.705556,0.0441 v 1.901691 h 1.411111 z m 0,0"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan2PRed.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="51.516994"
inkscape:cx="20.624137"
inkscape:cy="37.321731"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,11 +428,11 @@
inkscape:connector-curvature="0"
id="path7679"
d="m 55.185959,97.646518 c 0,2.382632 -1.931991,4.314642 -4.314616,4.314642 -2.38263,0 -4.316018,-1.93201 -4.316018,-4.314642 0,-2.384005 1.933388,-4.314638 4.316018,-4.314638 2.382625,0 4.314616,1.930633 4.314616,4.314638"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7681"
d="m 51.575511,91.641718 c -0.23151,-0.02618 -0.465775,-0.0441 -0.705555,-0.0441 -0.2384,0 -0.472666,0.01792 -0.705556,0.0441 v 1.901691 h 1.411111 z m 0,0"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan2PSGreen.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="17.70635"
inkscape:cx="-13.186507"
inkscape:cy="40.123343"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -433,11 +433,11 @@
inkscape:connector-curvature="0"
id="path7651"
d="m 65.728163,96.79133 c 0,2.382629 -1.932012,4.31464 -4.316017,4.31464 -2.382626,0 -4.314638,-1.932011 -4.314638,-4.31464 0,-2.384005 1.932012,-4.314638 4.314638,-4.314638 2.384005,0 4.316017,1.930633 4.316017,4.314638"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7653"
d="m 62.11839,89.179045 c -0.231511,-0.02205 -0.467156,-0.03443 -0.705556,-0.03443 -0.2384,0 -0.472666,0.01238 -0.705556,0.03443 v 3.507108 h 1.411112 z m 0,0"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan2PSRed.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="28.209324"
inkscape:cx="-2.6835331"
inkscape:cy="41.164604"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -433,11 +433,11 @@
inkscape:connector-curvature="0"
id="path7659"
d="m 62.949251,97.066827 c 0,2.382629 -1.932012,4.314643 -4.316017,4.314643 -2.382626,0 -4.314638,-1.932014 -4.314638,-4.314643 0,-2.384005 1.932012,-4.314638 4.314638,-4.314638 2.384005,0 4.316017,1.930633 4.316017,4.314638"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7661"
d="m 59.339478,89.454542 c -0.231511,-0.02205 -0.467156,-0.03443 -0.705556,-0.03443 -0.2384,0 -0.472666,0.01238 -0.705556,0.03443 v 3.507108 h 1.411112 z m 0,0"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan3PGreen.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="32.218991"
inkscape:cx="1.3261339"
inkscape:cy="50.179458"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,11 +428,11 @@
inkscape:connector-curvature="0"
id="path7631"
d="m 62.261116,99.730359 c 0,2.743681 -2.222775,4.967831 -4.967827,4.967831 -2.742293,0 -4.966448,-2.22415 -4.966448,-4.967831 0,-2.742292 2.224155,-4.966443 4.966448,-4.966443 2.745052,0 4.967827,2.224151 4.967827,4.966443"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7633"
d="m 57.998844,92.400584 c -0.23151,-0.02205 -0.467155,-0.03583 -0.705555,-0.03583 -0.2384,0 -0.472666,0.01379 -0.705556,0.03583 v 2.491493 h 1.411111 z m 0,0"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan3PRed.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="38.452993"
inkscape:cx="7.5601359"
inkscape:cy="47.306337"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,11 +428,11 @@
inkscape:connector-curvature="0"
id="path7637"
d="m 60.611703,98.97018 c 0,2.74368 -2.222775,4.96783 -4.967827,4.96783 -2.742293,0 -4.966448,-2.22415 -4.966448,-4.96783 0,-2.742297 2.224155,-4.966448 4.966448,-4.966448 2.745052,0 4.967827,2.224151 4.967827,4.966448"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7639"
d="m 56.349431,91.6404 c -0.23151,-0.02205 -0.467155,-0.03583 -0.705555,-0.03583 -0.2384,0 -0.472666,0.01379 -0.705556,0.03583 v 2.491493 h 1.411111 z m 0,0"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 8
- 8
res/ComponentLibrary/Rogan3PSGreen.svg View File

@@ -387,15 +387,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="39.52628"
inkscape:cx="8.6334229"
inkscape:cy="35.160107"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,7 +428,7 @@
inkscape:connector-curvature="0"
id="path7607"
d="m 62.688998,93.978827 c 0,3.064757 -2.484604,5.550739 -5.55074,5.550739 -3.064757,0 -5.549357,-2.485982 -5.549357,-5.550739 0,-3.064757 2.4846,-5.54936 5.549357,-5.54936 3.066136,0 5.55074,2.484603 5.55074,5.54936"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7609"
@@ -438,6 +438,6 @@
inkscape:connector-curvature="0"
id="path7611"
d="m 57.844505,84.865861 c -0.232886,-0.01792 -0.468531,-0.0303 -0.705556,-0.0303 -0.2384,0 -0.472665,0.01242 -0.705555,0.0303 v 4.43177 h 1.411111 z m 0,0"
style="fill:#42c5bd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#00a1a7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 6
- 6
res/ComponentLibrary/Rogan3PSRed.svg View File

@@ -392,9 +392,9 @@
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-width="2560"
inkscape:window-height="1440"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
units="px"
@@ -410,7 +410,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -428,7 +428,7 @@
inkscape:connector-curvature="0"
id="path7615"
d="m 62.71026,94.193113 c 0,3.064757 -2.484604,5.550739 -5.55074,5.550739 -3.064757,0 -5.549357,-2.485982 -5.549357,-5.550739 0,-3.064757 2.4846,-5.54936 5.549357,-5.54936 3.066136,0 5.55074,2.484603 5.55074,5.54936"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path7617"
@@ -438,6 +438,6 @@
inkscape:connector-curvature="0"
id="path7619"
d="m 57.865767,85.080147 c -0.232886,-0.01792 -0.468531,-0.0303 -0.705556,-0.0303 -0.2384,0 -0.472665,0.01242 -0.705555,0.0303 v 4.43177 h 1.411111 z m 0,0"
style="fill:#e147c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#da4061;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
</g>
</svg>

+ 0
- 123
res/ComponentLibrary/RoundBlack.svg View File

@@ -1,123 +0,0 @@
<?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="37.556625"
height="37.556622"
viewBox="0 0 9.9368575 9.9368564"
version="1.1"
id="svg49872"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="RoundBlack.svg">
<defs
id="defs49866">
<clipPath
id="clip12">
<path
d="m 143,129.75 h 3 V 158 h -3 z m 0,0"
id="path28860"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
id="clip11">
<path
d="m 117.39453,129.75 h 54 v 54.00391 h -54 z m 0,0"
id="path28857"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
id="clip150">
<path
d="m 176,208.92578 h 2 V 228 h -2 z m 0,0"
id="path29465"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
id="clip149">
<path
d="m 159.27734,208.92578 h 36 v 36 h -36 z m 0,0"
id="path29462"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
id="clip142">
<path
d="m 110,208.92578 h 3 V 228 h -3 z m 0,0"
id="path29320"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
id="clip141">
<path
d="m 93.511719,208.92578 h 36.000001 v 36 H 93.511719 Z m 0,0"
id="path29317"
inkscape:connector-curvature="0" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.4"
inkscape:cx="15.038057"
inkscape:cy="23.041"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
units="px"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
inkscape:snap-global="true"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:object-paths="true"
inkscape:pagecheckerboard="true" />
<metadata
id="metadata49869">
<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(-73.816227,-78.610433)">
<path
style="clip-rule:nonzero;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.27602378"
d="m 83.753084,83.578861 c 0,2.744065 -2.224363,4.968428 -4.968429,4.968428 -2.744065,0 -4.968428,-2.224363 -4.968428,-4.968428 0,-2.744066 2.224363,-4.968428 4.968428,-4.968428 2.744066,0 4.968429,2.224362 4.968429,4.968428"
id="path38955"
inkscape:connector-curvature="0" />
<path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 78.784655,83.578861 0,-4.968428"
id="path53181"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/RoundBlackKnob.svg View File

@@ -0,0 +1,71 @@
<?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="10.0004mm"
height="10.000431mm"
viewBox="0 0 10.000399 10.000431"
version="1.1"
id="svg111794"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="RoundBlackKnob.svg">
<defs
id="defs111788" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="-66.596017"
inkscape:cy="-47.298945"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata111791">
<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(-135.80716,-61.39592)">
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 145.80756,66.395451 c 0,2.761586 -2.23791,5.0009 -4.99949,5.0009 -2.76162,0 -5.00091,-2.239314 -5.00091,-5.0009 0,-2.76159 2.23929,-4.999524 5.00091,-4.999524 2.76158,0 4.99949,2.237934 4.99949,4.999524"
id="path110594" />
<path
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.35277775"
d="m 140.97479,61.41522 c -0.0551,-0.01242 -0.11024,-0.0193 -0.16672,-0.0193 -0.0579,0 -0.11162,0.0069 -0.16676,0.0193 v 5.043618 h 0.33348 z m 0,0"
id="path110596" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/RoundHugeBlackKnob.svg View File

@@ -0,0 +1,71 @@
<?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="19.000362mm"
height="19.000389mm"
viewBox="0 0 19.000362 19.000389"
version="1.1"
id="svg111794"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="RoundHugeBlackKnob.svg">
<defs
id="defs111788" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="-18.065819"
inkscape:cy="35.516889"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata111791">
<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(-98.209438,-77.425955)">
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 117.2098,86.92615 c 0,5.247569 -4.25397,9.500195 -9.50016,9.500195 -5.24757,0 -9.500202,-4.252626 -9.500202,-9.500195 0,-5.24619 4.252632,-9.500193 9.500202,-9.500193 5.24619,0 9.50016,4.254003 9.50016,9.500193"
id="path110586" />
<path
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.35277775"
d="m 108.0252,77.463165 c -0.10337,-0.02343 -0.2067,-0.03721 -0.31556,-0.03721 -0.10887,0 -0.21361,0.01379 -0.3156,0.03721 v 9.582876 h 0.63116 z m 0,0"
id="path110588" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/RoundLargeBlackKnob.svg View File

@@ -0,0 +1,71 @@
<?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="12.69999mm"
height="12.7mm"
viewBox="0 0 12.69999 12.7"
version="1.1"
id="svg111794"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="RoundLargeBlackKnob.svg">
<defs
id="defs111788" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="-130.49441"
inkscape:cy="-43.340255"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata111791">
<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(-127.95617,-62.862058)">
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 140.65616,69.212058 c 0,3.505729 -2.84289,6.35 -6.35,6.35 -3.5071,0 -6.34999,-2.844271 -6.34999,-6.35 0,-3.507109 2.84289,-6.35 6.34999,-6.35 3.50711,0 6.35,2.842891 6.35,6.35"
id="path110590" />
<path
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.35277775"
d="m 134.51698,62.885486 c -0.0689,-0.01517 -0.13917,-0.02342 -0.21082,-0.02342 -0.0731,0 -0.14333,0.0083 -0.21085,0.02342 v 6.405121 h 0.42167 z m 0,0"
id="path110592" />
</g>
</svg>

+ 71
- 0
res/ComponentLibrary/RoundSmallBlackKnob.svg View File

@@ -0,0 +1,71 @@
<?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="7.9995098mm"
height="7.9995222mm"
viewBox="0 0 7.9995093 7.9995222"
version="1.1"
id="svg111794"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="RoundSmallBlackKnob.svg">
<defs
id="defs111788" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="-87.928177"
inkscape:cy="-71.041818"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata111791">
<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(-168.09312,-67.39659)">
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 176.09263,71.397045 c 0,2.208995 -1.79006,3.999067 -3.99905,3.999067 -2.20902,0 -4.00046,-1.790072 -4.00046,-3.999067 0,-2.210372 1.79144,-4.000444 4.00046,-4.000444 2.20899,0 3.99905,1.790072 3.99905,4.000444"
id="path110598" />
<path
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.35277775"
d="m 172.22587,67.41176 c -0.0427,-0.0097 -0.0868,-0.01517 -0.13229,-0.01517 -0.0455,0 -0.0896,0.0055 -0.13367,0.01517 v 4.034896 h 0.26596 z m 0,0"
id="path110600" />
</g>
</svg>

+ 24
- 386
res/ComponentLibrary/Trimpot.svg View File

@@ -9,376 +9,15 @@
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="6.2990241mm"
height="6.3003879mm"
viewBox="0 0 6.2990242 6.3003887"
width="6.2990298mm"
height="6.3003922mm"
viewBox="0 0 6.2990294 6.3003921"
version="1.1"
id="svg15246"
sodipodi:docname="Trimpot.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
id="svg111794"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="Trimpot.svg">
<defs
id="defs15240">
<clipPath
id="clip89">
<rect
y="0"
x="0"
width="18"
height="19"
id="rect4864" />
</clipPath>
<clipPath
id="clip90">
<path
inkscape:connector-curvature="0"
d="m 0.898438,0.128906 h 16.25 v 17.882813 h -16.25 z m 0,0"
id="path4861" />
</clipPath>
<mask
id="mask44">
<g
style="filter:url(#alpha)"
id="g4858"
transform="matrix(0.26458333,0,0,0.26458333,89.358789,128.57765)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4856" />
</g>
</mask>
<filter
id="alpha"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149" />
</filter>
<clipPath
id="clipPath17821">
<rect
y="0"
x="0"
width="18"
height="19"
id="rect17819" />
</clipPath>
<clipPath
id="clipPath17825">
<path
inkscape:connector-curvature="0"
d="m 0.898438,0.128906 h 16.25 v 17.882813 h -16.25 z m 0,0"
id="path17823" />
</clipPath>
<clipPath
id="clip87">
<rect
y="0"
x="0"
width="24"
height="26"
id="rect4848" />
</clipPath>
<clipPath
id="clip88">
<path
inkscape:connector-curvature="0"
d="m 0.683594,0.921875 h 22.679687 v 24.9375 H 0.683594 Z m 0,0"
id="path4845" />
</clipPath>
<mask
id="mask43">
<g
style="filter:url(#alpha)"
id="g4842"
transform="matrix(0.26458333,0,0,0.26458333,89.358789,128.57765)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4840" />
</g>
</mask>
<filter
id="filter17836"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix17834" />
</filter>
<clipPath
id="clipPath17840">
<rect
y="0"
x="0"
width="24"
height="26"
id="rect17838" />
</clipPath>
<clipPath
id="clipPath17844">
<path
inkscape:connector-curvature="0"
d="m 0.683594,0.921875 h 22.679687 v 24.9375 H 0.683594 Z m 0,0"
id="path17842" />
</clipPath>
<clipPath
id="clip95">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect4912" />
</clipPath>
<clipPath
id="clip96">
<path
inkscape:connector-curvature="0"
d="M 0.140625,0.140625 H 17.199219 V 17.199219 H 0.140625 Z m 0,0"
id="path4909" />
</clipPath>
<mask
id="mask47">
<g
style="filter:url(#alpha-3)"
id="g4906"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect4904" />
</g>
</mask>
<filter
id="alpha-3"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149-6" />
</filter>
<clipPath
id="clipPath18541">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect18539" />
</clipPath>
<clipPath
id="clipPath18545">
<path
inkscape:connector-curvature="0"
d="M 0.140625,0.140625 H 17.199219 V 17.199219 H 0.140625 Z m 0,0"
id="path18543" />
</clipPath>
<clipPath
id="clip93">
<rect
y="0"
x="0"
width="22"
height="24"
id="rect4896" />
</clipPath>
<clipPath
id="clip94">
<path
inkscape:connector-curvature="0"
d="M 0.0390625,0.0390625 H 21.300781 V 23.421875 H 0.0390625 Z m 0,0"
id="path4893" />
</clipPath>
<mask
id="mask46">
<g
style="filter:url(#alpha-3)"
id="g4890"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4888" />
</g>
</mask>
<filter
id="filter18556"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix18554" />
</filter>
<clipPath
id="clipPath18560">
<rect
y="0"
x="0"
width="22"
height="24"
id="rect18558" />
</clipPath>
<clipPath
id="clipPath18564">
<path
inkscape:connector-curvature="0"
d="M 0.0390625,0.0390625 H 21.300781 V 23.421875 H 0.0390625 Z m 0,0"
id="path18562" />
</clipPath>
<clipPath
id="clip91">
<rect
y="0"
x="0"
width="29"
height="32"
id="rect4880" />
</clipPath>
<clipPath
id="clip92">
<path
inkscape:connector-curvature="0"
d="M 0.507812,0.5 H 28.855469 V 31.679688 H 0.507812 Z m 0,0"
id="path4877" />
</clipPath>
<mask
id="mask45">
<g
style="filter:url(#alpha-3)"
id="g4874"
transform="matrix(0.26458333,0,0,0.26458333,88.611154,119.19859)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.14999402;stroke:none"
id="rect4872" />
</g>
</mask>
<filter
id="filter18575"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix18573" />
</filter>
<clipPath
id="clipPath18579">
<rect
y="0"
x="0"
width="29"
height="32"
id="rect18577" />
</clipPath>
<clipPath
id="clipPath18583">
<path
inkscape:connector-curvature="0"
d="M 0.507812,0.5 H 28.855469 V 31.679688 H 0.507812 Z m 0,0"
id="path18581" />
</clipPath>
<clipPath
id="clip202">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect5795" />
</clipPath>
<clipPath
id="clip203">
<path
inkscape:connector-curvature="0"
d="M 0.855469,0.140625 H 17.914062 V 17.199219 H 0.855469 Z m 0,0"
id="path5792" />
</clipPath>
<mask
id="mask104">
<g
style="filter:url(#alpha-7)"
id="g5789"
transform="matrix(0.26458333,0,0,0.26458333,74.416306,97.613551)">
<rect
x="0"
y="0"
width="3052.8701"
height="3351.5"
style="fill:#000000;fill-opacity:0.33000201;stroke:none"
id="rect5787" />
</g>
</mask>
<filter
id="alpha-7"
filterUnits="objectBoundingBox"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
type="matrix"
in="SourceGraphic"
values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"
id="feColorMatrix4149-5" />
</filter>
<clipPath
id="clipPath18765">
<rect
y="0"
x="0"
width="18"
height="18"
id="rect18763" />
</clipPath>
<clipPath
id="clipPath18769">
<path
inkscape:connector-curvature="0"
d="M 0.855469,0.140625 H 17.914062 V 17.199219 H 0.855469 Z m 0,0"
id="path18767" />
</clipPath>
</defs>
id="defs111788" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
@@ -386,24 +25,23 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="26.106375"
inkscape:cy="37.463453"
inkscape:zoom="2.8"
inkscape:cx="-118.16736"
inkscape:cy="0.15014965"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-maximized="0"
units="px"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
<metadata
id="metadata15243">
id="metadata111791">
<rdf:RDF>
<cc:Work
rdf:about="">
@@ -418,16 +56,16 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.318588,-97.647662)">
transform="translate(-183.93691,-77.348595)">
<path
inkscape:connector-curvature="0"
id="path7219"
d="m 46.318588,100.79786 c 0,1.74046 1.409735,3.15019 3.1502,3.15019 1.739088,0 3.148824,-1.40973 3.148824,-3.15019 0,-1.739087 -1.409736,-3.150198 -3.148824,-3.150198 -1.740465,0 -3.1502,1.411111 -3.1502,3.150198"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 183.93691,80.498791 c 0,1.740461 1.40974,3.150196 3.1502,3.150196 1.73909,0 3.14883,-1.409735 3.14883,-3.150196 0,-1.739085 -1.40974,-3.150196 -3.14883,-3.150196 -1.74046,0 -3.1502,1.411111 -3.1502,3.150196"
id="path108214" />
<path
inkscape:connector-curvature="0"
id="path7221"
d="m 49.672764,97.658686 c -0.06752,-0.0055 -0.135079,-0.01101 -0.203976,-0.01101 -0.0689,0 -0.137795,0.0055 -0.205317,0.01101 v 3.139174 h 0.409293 z m 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775"
d="m 187.29109,77.359619 c -0.0675,-0.0055 -0.13508,-0.01101 -0.20398,-0.01101 -0.0689,0 -0.13779,0.0055 -0.20531,0.01101 v 3.139172 h 0.40929 z m 0,0"
id="path108216" />
</g>
</svg>

+ 22
- 19
src/Core/AudioInterface.cpp View File

@@ -43,10 +43,10 @@ struct AudioInterfaceIO : AudioIO {
for (int i = 0; i < frames; i++) {
if (inputBuffer.full())
break;
Frame<INPUTS> f;
memset(&f, 0, sizeof(f));
memcpy(&f, &input[numInputs * i], numInputs * sizeof(float));
inputBuffer.push(f);
Frame<INPUTS> inputFrame;
memset(&inputFrame, 0, sizeof(inputFrame));
memcpy(&inputFrame, &input[numInputs * i], numInputs * sizeof(float));
inputBuffer.push(inputFrame);
}
}

@@ -71,13 +71,17 @@ struct AudioInterfaceIO : AudioIO {
}

// Notify engine when finished processing
engineCv.notify_all();
engineCv.notify_one();
}

void onCloseStream() override {
inputBuffer.clear();
outputBuffer.clear();
}

void onChannelsChange() override {
debug("Channels changed %d %d", numOutputs, numInputs);
}
};


@@ -127,12 +131,6 @@ struct AudioInterface : Module {
}

void onSampleRateChange() override {
// for (int i = 0; i < INPUTS; i++) {
// inputSrc[i].setRates(audioIO.sampleRate, engineGetSampleRate());
// }
// for (int i = 0; i < OUTPUTS; i++) {
// outputSrc[i].setRates(engineGetSampleRate(), audioIO.sampleRate);
// }
inputSrc.setRates(audioIO.sampleRate, engineGetSampleRate());
outputSrc.setRates(engineGetSampleRate(), audioIO.sampleRate);
}
@@ -154,6 +152,7 @@ void AudioInterface::step() {
}

if (audioIO.numInputs > 0) {
// Convert inputs if needed
if (inputBuffer.empty()) {
int inLen = audioIO.inputBuffer.size();
int outLen = inputBuffer.capacity();
@@ -163,25 +162,27 @@ void AudioInterface::step() {
}
}

// Take input from buffer
if (!inputBuffer.empty()) {
inputFrame = inputBuffer.shift();
}
for (int i = 0; i < INPUTS; i++) {
outputs[AUDIO_OUTPUT + i].value = 10.0 * inputFrame.samples[i];
outputs[AUDIO_OUTPUT + i].value = 10.f * inputFrame.samples[i];
}

if (audioIO.numOutputs > 0) {
// Get and push output SRC frame
if (!outputBuffer.full()) {
Frame<OUTPUTS> f;
for (int i = 0; i < audioIO.numOutputs; i++) {
f.samples[i] = inputs[AUDIO_INPUT + i].value / 10.0;
Frame<OUTPUTS> outputFrame;
for (int i = 0; i < OUTPUTS; i++) {
outputFrame.samples[i] = inputs[AUDIO_INPUT + i].value / 10.f;
}
outputBuffer.push(f);
outputBuffer.push(outputFrame);
}

if (outputBuffer.full()) {
// Wait until outputs are needed
// Wait until outputs are needed.
// Give up after a timeout in case the audio device is being unresponsive.
std::unique_lock<std::mutex> lock(audioIO.engineMutex);
auto cond = [&] {
return (audioIO.outputBuffer.size() < (size_t) audioIO.blockSize);
@@ -200,14 +201,16 @@ void AudioInterface::step() {
debug("Audio Interface underflow");
}
}

// Notify audio thread that an output is potentially ready
audioIO.audioCv.notify_one();
}

// Turn on light if at least one port is enabled in the nearby pair
for (int i = 0; i < INPUTS / 2; i++)
lights[INPUT_LIGHT + i].value = (audioIO.numOutputs >= 2*i+1);
for (int i = 0; i < OUTPUTS / 2; i++)
lights[OUTPUT_LIGHT + i].value = (audioIO.numInputs >= 2*i+1);

audioIO.audioCv.notify_all();
}




+ 45
- 14
src/Core/QuadMIDIToCVInterface.cpp View File

@@ -43,6 +43,7 @@ struct QuadMIDIToCVInterface : Module {
uint8_t notes[4];
bool gates[4];
bool pedal;
int rotateIndex;

QuadMIDIToCVInterface() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS), heldNotes(128) {
onReset();
@@ -71,6 +72,7 @@ struct QuadMIDIToCVInterface : Module {
gates[i] = false;
}
pedal = false;
rotateIndex = 0;
}

void pressNote(uint8_t note) {
@@ -84,17 +86,23 @@ struct QuadMIDIToCVInterface : Module {
// Set notes and gates
switch (polyMode) {
case ROTATE_MODE: {

} break;

case RESET_MODE: {

} break;

case REASSIGN_MODE: {

} break;
case UNISON_MODE: {

case UNISON_MODE: {
for (int i = 0; i < 4; i++) {
notes[i] = note;
gates[i] = true;
}
} break;

default: break;
}
}
@@ -105,18 +113,41 @@ struct QuadMIDIToCVInterface : Module {
if (it != heldNotes.end())
heldNotes.erase(it);
// Hold note if pedal is pressed
// if (pedal)
// return;
// // Set last note
// if (!heldNotes.empty()) {
// auto it2 = heldNotes.end();
// it2--;
// lastNote = *it2;
// gate = true;
// }
// else {
// gate = false;
// }
if (pedal)
return;
// Set last note
switch (polyMode) {
case ROTATE_MODE: {

} break;

case RESET_MODE: {

} break;

case REASSIGN_MODE: {

} break;

case UNISON_MODE: {
if (!heldNotes.empty()) {
auto it2 = heldNotes.end();
it2--;
for (int i = 0; i < 4; i++) {
notes[i] = *it2;
gates[i] = true;
}
}
else {
for (int i = 0; i < 4; i++) {
gates[i] = false;
}
}
} break;

default: break;
}

}

void pressPedal() {


+ 13
- 6
src/app/CircularShadow.cpp View File

@@ -4,15 +4,22 @@
namespace rack {


CircularShadow::CircularShadow() {
blurRadius = 0;
opacity = 0.15;
}

void CircularShadow::draw(NVGcontext *vg) {
if (opacity < 0.0)
return;

nvgBeginPath(vg);
nvgRect(vg, -blur, -blur, box.size.x + 2*blur, box.size.y + 2*blur);
nvgFillColor(vg, nvgRGBAf(0.0, 0.0, 0.0, 0.25));
Vec c = box.size.div(2.0);
float radius = c.x;
NVGcolor icol = nvgRGBAf(0.0, 0.0, 0.0, 0.25);
nvgRect(vg, -blurRadius, -blurRadius, box.size.x + 2*blurRadius, box.size.y + 2*blurRadius);
Vec center = box.size.div(2.0);
float radius = center.x;
NVGcolor icol = nvgRGBAf(0.0, 0.0, 0.0, opacity);
NVGcolor ocol = nvgRGBAf(0.0, 0.0, 0.0, 0.0);
NVGpaint paint = nvgRadialGradient(vg, c.x, c.y, radius - blur/2, radius + blur/2, icol, ocol);
NVGpaint paint = nvgRadialGradient(vg, center.x, center.y, radius - blurRadius, radius, icol, ocol);
nvgFillPaint(vg, paint);
nvgFill(vg);
}


+ 9
- 4
src/app/Knob.cpp View File

@@ -21,15 +21,20 @@ void Knob::onDragStart(EventDragStart &e) {
}

void Knob::onDragMove(EventDragMove &e) {
float range = maxValue - minValue;
float delta = KNOB_SENSITIVITY * -e.mouseRel.y * speed;
if (isfinite(range))
delta *= range;
float range;
if (isfinite(minValue) && isfinite(maxValue)) {
range = maxValue - minValue;
}
else {
range = 1.0 - (-1.0);
}
float delta = KNOB_SENSITIVITY * -e.mouseRel.y * speed * range;

// Drag slower if Mod is held
if (windowIsModPressed())
delta /= 16.0;
dragValue += delta;
dragValue = clamp2(dragValue, minValue, maxValue);
if (snap)
setValue(roundf(dragValue));
else


+ 1
- 1
src/app/LightWidget.cpp View File

@@ -34,7 +34,7 @@ void LightWidget::drawHalo(NVGcontext *vg) {
nvgRect(vg, radius - oradius, radius - oradius, 2*oradius, 2*oradius);

NVGpaint paint;
NVGcolor icol = colorMult(color, 0.15);
NVGcolor icol = colorMult(color, 0.25);
NVGcolor ocol = nvgRGB(0, 0, 0);
paint = nvgRadialGradient(vg, radius, radius, radius, oradius, icol, ocol);
nvgFillPaint(vg, paint);


+ 18
- 0
src/app/MomentarySwitch.cpp View File

@@ -0,0 +1,18 @@
#include "app.hpp"


namespace rack {


void MomentarySwitch::onDragStart(EventDragStart &e) {
setValue(maxValue);
EventAction eAction;
onAction(eAction);
}

void MomentarySwitch::onDragEnd(EventDragEnd &e) {
setValue(minValue);
}


} // namespace rack

src/app/ParamWidget.cpp → src/app/Parameter.cpp View File

@@ -5,29 +5,29 @@
namespace rack {


json_t *ParamWidget::toJson() {
json_t *Parameter::toJson() {
json_t *rootJ = json_object();
json_object_set_new(rootJ, "paramId", json_integer(paramId));
json_object_set_new(rootJ, "value", json_real(value));
return rootJ;
}

void ParamWidget::fromJson(json_t *rootJ) {
void Parameter::fromJson(json_t *rootJ) {
json_t *valueJ = json_object_get(rootJ, "value");
if (valueJ)
setValue(json_number_value(valueJ));
}

void ParamWidget::reset() {
void Parameter::reset() {
setValue(defaultValue);
}

void ParamWidget::randomize() {
if (randomizable)
void Parameter::randomize() {
if (randomizable && isfinite(minValue) && isfinite(maxValue))
setValue(rescale(randomUniform(), 0.0, 1.0, minValue, maxValue));
}

void ParamWidget::onMouseDown(EventMouseDown &e) {
void Parameter::onMouseDown(EventMouseDown &e) {
if (e.button == 1) {
setValue(defaultValue);
}
@@ -35,7 +35,7 @@ void ParamWidget::onMouseDown(EventMouseDown &e) {
e.target = this;
}

void ParamWidget::onChange(EventChange &e) {
void Parameter::onChange(EventChange &e) {
if (!module)
return;


+ 32
- 0
src/app/SVGButton.cpp View File

@@ -0,0 +1,32 @@
#include "app.hpp"


namespace rack {


SVGButton::SVGButton() {
sw = new SVGWidget();
addChild(sw);
}

void SVGButton::setSVGs(std::shared_ptr<SVG> defaultSVG, std::shared_ptr<SVG> activeSVG) {
sw->setSVG(defaultSVG);
box.size = sw->box.size;
this->defaultSVG = defaultSVG;
this->activeSVG = activeSVG ? activeSVG : defaultSVG;
}

void SVGButton::onDragStart(EventDragStart &e) {
EventAction eAction;
onAction(eAction);
sw->setSVG(activeSVG);
dirty = true;
}

void SVGButton::onDragEnd(EventDragEnd &e) {
sw->setSVG(defaultSVG);
dirty = true;
}


} // namespace rack

+ 0
- 30
src/app/SVGFader.cpp View File

@@ -1,30 +0,0 @@
#include "app.hpp"


namespace rack {


SVGFader::SVGFader() {
background = new SVGWidget();
addChild(background);

handle = new SVGWidget();
addChild(handle);
}

void SVGFader::step() {
if (dirty) {
// Update handle position
Vec handlePos = Vec(rescale(value, minValue, maxValue, minHandlePos.x, maxHandlePos.x), rescale(value, minValue, maxValue, minHandlePos.y, maxHandlePos.y));
handle->box.pos = handlePos;
}
FramebufferWidget::step();
}

void SVGFader::onChange(EventChange &e) {
dirty = true;
Knob::onChange(e);
}


} // namespace rack

+ 15
- 8
src/app/SVGKnob.cpp View File

@@ -5,6 +5,10 @@ namespace rack {


SVGKnob::SVGKnob() {
shadow = new CircularShadow();
addChild(shadow);
shadow->box.size = Vec();

tw = new TransformWidget();
addChild(tw);

@@ -13,22 +17,26 @@ SVGKnob::SVGKnob() {
}

void SVGKnob::setSVG(std::shared_ptr<SVG> svg) {
sw->svg = svg;
sw->wrap();
sw->setSVG(svg);
tw->box.size = sw->box.size;
box.size = sw->box.size;
shadow->box.size = sw->box.size;
shadow->box.pos = Vec(0, sw->box.size.y * 0.1);
// shadow->box = shadow->box.grow(Vec(2, 2));
}

void SVGKnob::step() {
// Re-transform TransformWidget if dirty
if (dirty) {
tw->box.size = box.size;
float angle = 0.0;
if (isfinite(minValue) && isfinite(maxValue))
float angle;
if (isfinite(minValue) && isfinite(maxValue)) {
angle = rescale(value, minValue, maxValue, minAngle, maxAngle);
}
else {
angle = rescale(value, -1.0, 1.0, minAngle, maxAngle);
angle = fmodf(angle, 2*M_PI);
}
tw->identity();
// Scale SVG to box
tw->scale(box.size.div(sw->box.size));
// Rotate SVG
Vec center = sw->box.getCenter();
tw->translate(center);
@@ -44,5 +52,4 @@ void SVGKnob::onChange(EventChange &e) {
}



} // namespace rack

+ 14
- 0
src/app/SVGPort.cpp View File

@@ -5,10 +5,24 @@ namespace rack {


SVGPort::SVGPort() {
shadow = new CircularShadow();
addChild(shadow);
// Avoid breakage if plugins fail to call setSVG()
// In that case, just disable the shadow.
shadow->box.size = Vec();

background = new SVGWidget();
addChild(background);
}

void SVGPort::setSVG(std::shared_ptr<SVG> svg) {
background->setSVG(svg);
box.size = background->box.size;
shadow->box.size = background->box.size;
shadow->box.pos = Vec(0, background->box.size.y * 0.1);
// shadow->box = shadow->box.grow(Vec(2, 2));
}

void SVGPort::draw(NVGcontext *vg) {
Port::draw(vg);
FramebufferWidget::draw(vg);


+ 37
- 0
src/app/SVGSlider.cpp View File

@@ -0,0 +1,37 @@
#include "app.hpp"


namespace rack {


SVGSlider::SVGSlider() {
background = new SVGWidget();
addChild(background);

handle = new SVGWidget();
addChild(handle);
}

void SVGSlider::setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG) {
background->setSVG(backgroundSVG);
box.size = background->box.size;
if (handleSVG) {
handle->setSVG(handleSVG);
}
}

void SVGSlider::step() {
if (dirty) {
// Interpolate handle position
handle->box.pos = Vec(rescale(value, minValue, maxValue, minHandlePos.x, maxHandlePos.x), rescale(value, minValue, maxValue, minHandlePos.y, maxHandlePos.y));
}
FramebufferWidget::step();
}

void SVGSlider::onChange(EventChange &e) {
dirty = true;
Knob::onChange(e);
}


} // namespace rack

+ 1
- 1
src/app/SVGSwitch.cpp View File

@@ -24,7 +24,7 @@ void SVGSwitch::onChange(EventChange &e) {
int index = clamp((int) roundf(valueScaled), 0, frames.size() - 1);
sw->setSVG(frames[index]);
dirty = true;
Switch::onChange(e);
ParamWidget::onChange(e);
}




+ 17
- 0
src/app/ToggleSwitch.cpp View File

@@ -0,0 +1,17 @@
#include "app.hpp"


namespace rack {


void ToggleSwitch::onDragStart(EventDragStart &e) {
// Cycle through values
// e.g. a range of [0.0, 3.0] would have modes 0, 1, 2, and 3.
if (value >= maxValue)
setValue(minValue);
else
setValue(value + 1.0);
}


} // namespace rack

+ 15
- 23
src/audio.cpp View File

@@ -46,8 +46,10 @@ std::string AudioIO::getDriverName(int driver) {
}

void AudioIO::setDriver(int driver) {
// Close device
setDevice(-1, 0);

// Close driver
if (rtAudio) {
delete rtAudio;
rtAudio = NULL;
@@ -69,7 +71,7 @@ int AudioIO::getDeviceCount() {
return rtAudio->getDeviceCount();
}
if (driver == BRIDGE_DRIVER) {
return BRIDGE_CHANNELS;
return BRIDGE_NUM_PORTS;
}
return 0;
}
@@ -90,13 +92,11 @@ bool AudioIO::getDeviceInfo(int device, RtAudio::DeviceInfo *deviceInfo) {
}
catch (RtAudioError &e) {
warn("Failed to query RtAudio device: %s", e.what());
return false;
}
}
}
else {
return false;
}

return false;
}

int AudioIO::getDeviceChannels(int device) {
@@ -148,7 +148,7 @@ std::string AudioIO::getDeviceDetail(int device, int offset) {
}
}
if (driver == BRIDGE_DRIVER) {
return stringf("Channel %d", device + 1);
return stringf("Port %d", device + 1);
}
return "";
}
@@ -172,6 +172,12 @@ void AudioIO::setBlockSize(int blockSize) {
openStream();
}

void AudioIO::setChannels(int numOutputs, int numInputs) {
this->numOutputs = numOutputs;
this->numInputs = numInputs;
onChannelsChange();
}


static int rtCallback(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData) {
AudioIO *audioIO = (AudioIO*) userData;
@@ -197,8 +203,7 @@ void AudioIO::openStream() {
if (rtAudio->isStreamOpen())
return;

numOutputs = clamp((int) deviceInfo.outputChannels - offset, 0, maxChannels);
numInputs = clamp((int) deviceInfo.inputChannels - offset, 0, maxChannels);
setChannels(clamp((int) deviceInfo.outputChannels - offset, 0, maxChannels), clamp((int) deviceInfo.inputChannels - offset, 0, maxChannels));

if (numOutputs == 0 && numInputs == 0) {
warn("RtAudio device %d has 0 inputs and 0 outputs");
@@ -252,8 +257,7 @@ void AudioIO::openStream() {
onOpenStream();
}
if (driver == BRIDGE_DRIVER) {
numOutputs = 2;
numInputs = 2;
setChannels(0, 0);
// TEMP
sampleRate = 44100;
blockSize = 256;
@@ -262,8 +266,7 @@ void AudioIO::openStream() {
}

void AudioIO::closeStream() {
numOutputs = 0;
numInputs = 0;
setChannels(0, 0);

if (rtAudio) {
if (rtAudio->isStreamRunning()) {
@@ -293,17 +296,6 @@ void AudioIO::closeStream() {
onCloseStream();
}

bool AudioIO::isActive() {
if (rtAudio) {
return rtAudio->isStreamRunning();
}
if (driver == BRIDGE_DRIVER) {
bridgeAudioIsSubscribed(device, this);
}
return false;
}


std::vector<int> AudioIO::getSampleRates() {
if (rtAudio) {
try {


+ 155
- 83
src/bridge.cpp View File

@@ -25,11 +25,13 @@ enum BridgeCommand {
NO_COMMAND = 0,
START_COMMAND,
QUIT_COMMAND,
CHANNEL_SET_COMMAND,
PORT_SET_COMMAND,
MIDI_MESSAGE_SEND_COMMAND,
AUDIO_SAMPLE_RATE_SET_COMMAND,
AUDIO_CHANNELS_SET_COMMAND,
AUDIO_BUFFER_SEND_COMMAND,
MIDI_MESSAGE_SEND_COMMAND,
AUDIO_ACTIVATE,
AUDIO_DEACTIVATE,
NUM_COMMANDS
};

@@ -37,19 +39,46 @@ enum BridgeCommand {
static const int RECV_BUFFER_SIZE = (1<<13);
static const int RECV_QUEUE_SIZE = (1<<17);

static AudioIO *audioListeners[BRIDGE_CHANNELS];
struct BridgeClientConnection;
static BridgeClientConnection *connections[BRIDGE_NUM_PORTS] = {};
static AudioIO *audioListeners[BRIDGE_NUM_PORTS] = {};
static std::thread serverThread;
static bool serverQuit;


struct BridgeClientConnection {
int client;
RingBuffer<uint8_t, RECV_QUEUE_SIZE> recvQueue;
BridgeCommand currentCommand = START_COMMAND;
bool closeRequested = false;
int channel = -1;
int port = -1;
int sampleRate = -1;
int audioChannels = 0;
int audioBufferLength = -1;
bool audioActive = false;

~BridgeClientConnection() {
setPort(-1);
}

void send(const uint8_t *buffer, int length) {
if (length <= 0)
return;
#ifdef ARCH_LIN
int sendFlags = MSG_NOSIGNAL;
#else
int sendFlags = 0;
#endif
ssize_t written = ::send(client, (const char*) buffer, length, sendFlags);
// We must write the entire buffer
if (written < length)
closeRequested = true;
}

template <typename T>
void send(T x) {
send((uint8_t*) &x, sizeof(x));
}

/** Does not check if the queue has enough data.
You must do that yourself before calling this method.
@@ -61,6 +90,35 @@ struct BridgeClientConnection {
return x;
}

void run() {
info("Bridge client connected");

while (!closeRequested) {
uint8_t buffer[RECV_BUFFER_SIZE];
#ifdef ARCH_LIN
int recvFlags = MSG_NOSIGNAL;
#else
int recvFlags = 0;
#endif
ssize_t received = ::recv(client, (char*) buffer, sizeof(buffer), recvFlags);
if (received <= 0)
break;

// Make sure we can fill the buffer
if (recvQueue.capacity() < (size_t) received) {
// If we can't accept it, future messages will be incomplete
break;
}

recvQueue.pushBuffer(buffer, received);

// Loop the state machine until it returns false
while (step()) {}
}

info("Bridge client closed");
}

/** Steps the state machine
Returns true if step() should be called again
*/
@@ -96,10 +154,21 @@ struct BridgeClientConnection {
debug("Quitting!");
} break;

case CHANNEL_SET_COMMAND: {
case PORT_SET_COMMAND: {
if (recvQueue.size() >= 1) {
channel = shift<uint8_t>();
debug("Set channel %d", channel);
int port = shift<uint8_t>();
setPort(port);
debug("Set port %d", port);
currentCommand = NO_COMMAND;
return true;
}
} break;

case MIDI_MESSAGE_SEND_COMMAND: {
if (recvQueue.size() >= 3) {
uint8_t midiBuffer[3];
recvQueue.shiftBuffer(midiBuffer, 3);
// debug("MIDI: %02x %02x %02x", midiBuffer[0], midiBuffer[1], midiBuffer[2]);
currentCommand = NO_COMMAND;
return true;
}
@@ -117,7 +186,7 @@ struct BridgeClientConnection {
case AUDIO_CHANNELS_SET_COMMAND: {
if (recvQueue.size() >= 1) {
audioChannels = shift<uint8_t>();
debug("Set audio channels %d", channel);
debug("Set audio channels %d", audioChannels);
currentCommand = NO_COMMAND;
return true;
}
@@ -139,12 +208,18 @@ struct BridgeClientConnection {
}
else {
if (recvQueue.size() >= (size_t) (sizeof(float) * audioBufferLength)) {
// Get input buffer
int frames = audioBufferLength / 2;
float input[audioBufferLength];
float output[audioBufferLength];
memset(output, 0, sizeof(output));
recvQueue.shiftBuffer((uint8_t*) input, sizeof(float) * audioBufferLength);
int frames = audioBufferLength / 2;
// Process stream
float output[audioBufferLength];
processStream(input, output, frames);
// Send output buffer
send<uint8_t>(AUDIO_BUFFER_SEND_COMMAND);
send<uint32_t>(audioBufferLength);
send((uint8_t*) output, audioBufferLength * sizeof(float));

audioBufferLength = -1;
currentCommand = NO_COMMAND;
return true;
@@ -152,14 +227,18 @@ struct BridgeClientConnection {
}
} break;

case MIDI_MESSAGE_SEND_COMMAND: {
if (recvQueue.size() >= 3) {
uint8_t midiBuffer[3];
recvQueue.shiftBuffer(midiBuffer, 3);
debug("MIDI: %02x %02x %02x", midiBuffer[0], midiBuffer[1], midiBuffer[2]);
currentCommand = NO_COMMAND;
return true;
}
case AUDIO_ACTIVATE: {
audioActive = true;
refreshAudioActive();
currentCommand = NO_COMMAND;
return true;
} break;

case AUDIO_DEACTIVATE: {
audioActive = false;
refreshAudioActive();
currentCommand = NO_COMMAND;
return true;
} break;

default: {
@@ -167,51 +246,58 @@ struct BridgeClientConnection {
closeRequested = true;
} break;
}

// Stop looping the state machine
return false;
}

void recv(uint8_t *buffer, int length) {
// Make sure we can fill the buffer
if (recvQueue.capacity() < (size_t) length) {
// If we can't accept it, future messages will be incomplete
closeRequested = true;
return;
void setPort(int newPort) {
// Unbind from existing port
if (port >= 0 && connections[port] == this) {
if (audioListeners[port])
audioListeners[port]->setChannels(0, 0);
connections[port] = NULL;
}

recvQueue.pushBuffer(buffer, length);

// Loop the state machine until it returns false
while (step()) {}
// Bind to new port
if (newPort >= 0 && !connections[newPort]) {
connections[newPort] = this;
refreshAudioActive();
port = newPort;
}
else {
port = -1;
}
}

void processStream(const float *input, float *output, int frames) {
if (!(0 <= channel && channel < BRIDGE_CHANNELS))
if (!(0 <= port && port < BRIDGE_NUM_PORTS))
return;
if (!audioListeners[channel])
if (!audioListeners[port])
return;
audioListeners[channel]->processStream(input, output, frames);
audioListeners[port]->processStream(input, output, frames);
debug("%d frames", frames);
}
};

void refreshAudioActive() {
if (!(0 <= port && port < BRIDGE_NUM_PORTS))
return;
if (!audioListeners[port])
return;
if (audioActive)
audioListeners[port]->setChannels(2, 2);
else
audioListeners[port]->setChannels(0, 0);
}
};


static void clientRun(int client) {
defer({
close(client);
});
int err;
BridgeClientConnection connection;

// // Get client address
// struct sockaddr_in addr;
// socklen_t clientAddrLen = sizeof(addr);
// err = getpeername(client, (struct sockaddr*) &addr, &clientAddrLen);
// assert(!err);

// // Get client IP address
// struct in_addr ipAddr = addr.sin_addr;
// char ipBuffer[INET_ADDRSTRLEN];
// inet_ntop(AF_INET, &ipAddr, ipBuffer, INET_ADDRSTRLEN);

// info("Bridge client %s connected", ipBuffer);
info("Bridge client connected");
(void) err;

#ifdef ARCH_MAC
// Avoid SIGPIPE
@@ -219,29 +305,17 @@ static void clientRun(int client) {
setsockopt(client, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(int));
#endif

// Disable non-blocking
#ifdef ARCH_WIN
unsigned long blockingMode = 1;
unsigned long blockingMode = 0;
ioctlsocket(client, FIONBIO, &blockingMode);
#else
err = fcntl(client, F_SETFL, fcntl(client, F_GETFL, 0) & ~O_NONBLOCK);
#endif

while (!connection.closeRequested) {
uint8_t buffer[RECV_BUFFER_SIZE];
#ifdef ARCH_LIN
ssize_t received = recv(client, (char*) buffer, sizeof(buffer), MSG_NOSIGNAL);
#else
ssize_t received = recv(client, (char*) buffer, sizeof(buffer), 0);
#endif
if (received <= 0)
break;

connection.recv(buffer, received);
}

err = close(client);
(void) err;
info("Bridge client closed");
BridgeClientConnection connection;
connection.client = client;
connection.run();
}


@@ -270,7 +344,7 @@ static void serverRun() {
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
err = getaddrinfo(NULL, "5000", &hints, &result);
err = getaddrinfo("127.0.0.1", "5000", &hints, &result);
if (err) {
warn("Could not get Bridge server address");
return;
@@ -301,7 +375,6 @@ static void serverRun() {
close(server);
});


// Bind socket to address
#ifdef ARCH_WIN
err = bind(server, result->ai_addr, (int)result->ai_addrlen);
@@ -321,12 +394,13 @@ static void serverRun() {
}
info("Bridge server started");

// Make server non-blocking
// Enable non-blocking
#ifdef ARCH_WIN
unsigned long blockingMode = 1;
ioctlsocket(server, FIONBIO, &blockingMode);
#else
err = fcntl(server, F_SETFL, fcntl(server, F_GETFL, 0) | O_NONBLOCK);
int flags = fcntl(server, F_GETFL, 0);
err = fcntl(server, F_SETFL, flags | O_NONBLOCK);
#endif

// Accept clients
@@ -357,26 +431,24 @@ void bridgeDestroy() {
serverThread.join();
}

void bridgeAudioSubscribe(int channel, AudioIO *audio) {
if (!(0 <= channel && channel < BRIDGE_CHANNELS))
void bridgeAudioSubscribe(int port, AudioIO *audio) {
if (!(0 <= port && port < BRIDGE_NUM_PORTS))
return;
if (audioListeners[channel])
// Check if an Audio is already subscribed on the port
if (audioListeners[port])
return;
audioListeners[channel] = audio;
audioListeners[port] = audio;
if (connections[port])
connections[port]->refreshAudioActive();
}

void bridgeAudioUnsubscribe(int channel, AudioIO *audio) {
if (!(0 <= channel && channel < BRIDGE_CHANNELS))
void bridgeAudioUnsubscribe(int port, AudioIO *audio) {
if (!(0 <= port && port < BRIDGE_NUM_PORTS))
return;
if (audioListeners[channel] != audio)
if (audioListeners[port] != audio)
return;
audioListeners[channel] = NULL;
}

bool bridgeAudioIsSubscribed(int channel, AudioIO *audio) {
if (!(0 <= channel && channel < BRIDGE_CHANNELS))
return false;
return (audioListeners[channel] == audio);
audioListeners[port] = NULL;
audio->setChannels(0, 0);
}




+ 1
- 1
src/main.cpp View File

@@ -20,7 +20,7 @@ int main(int argc, char* argv[]) {
gLogFile = fopen(logFilename.c_str(), "w");
#endif

info("Rack v%s", gApplicationVersion.c_str());
info("Rack %s", gApplicationVersion.c_str());

{
char *cwd = getcwd(NULL, 0);


Loading…
Cancel
Save