Browse Source

Added Muxlicer / Mex expander

tags/v2.1.0
hemmer 3 years ago
parent
commit
1b837cfb78
13 changed files with 7849 additions and 3 deletions
  1. +22
    -0
      plugin.json
  2. +72
    -0
      res/BefacoButton_0.svg
  3. +72
    -0
      res/BefacoButton_1.svg
  4. +101
    -0
      res/BefacoSwitchHoriz_0.svg
  5. +86
    -0
      res/BefacoSwitchHoriz_1.svg
  6. +104
    -0
      res/BefacoSwitchHoriz_2.svg
  7. +541
    -0
      res/Mex.svg
  8. +5891
    -0
      res/Muxlicer.svg
  9. +105
    -0
      src/Mex.cpp
  10. +811
    -0
      src/Muxlicer.cpp
  11. +8
    -3
      src/SamplingModulator.cpp
  12. +2
    -0
      src/plugin.cpp
  13. +34
    -0
      src/plugin.hpp

+ 22
- 0
plugin.json View File

@@ -203,6 +203,28 @@
"Stereo",
"Polyphonic"
]
},
{
"slug": "Muxlicer",
"name": "Muxlicer",
"description": "VC adressable sequential switch and sequencer",
"manualUrl": "https://www.befaco.org/muxlicer-2/",
"modularGridUrl": "https://www.modulargrid.net/e/befaco-muxlicer",
"tags": [
"Clock generator",
"Hardware clone",
"Sequencer",
"Switch"
]
},
{
"slug": "Mex",
"name": "Mex",
"description": "Gate Expander for Befaco Muxlicer",
"tags": [
"Expander",
"Hardware clone"
]
}
]
}

+ 72
- 0
res/BefacoButton_0.svg View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="9mm"
height="9mm"
viewBox="0 0 9 9"
version="1.1"
id="svg7758"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="Button.svg">
<defs
id="defs7752" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="11.723938"
inkscape:cy="46.023534"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1431"
inkscape:window-height="1208"
inkscape:window-x="2798"
inkscape:window-y="109"
inkscape:window-maximized="0" />
<metadata
id="metadata7755">
<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(-52.267899,-79.412453)">
<circle
style="fill:#a4a4a4;fill-opacity:1;stroke-width:1.33165;stroke-linejoin:round"
id="path8389"
cx="56.767899"
cy="83.912453"
r="4.5" />
<circle
style="fill:#e2dada;fill-opacity:1;stroke-width:1.31088;stroke-linejoin:round"
id="path8391"
cx="56.767899"
cy="83.912453"
r="3.725069" />
</g>
</svg>

+ 72
- 0
res/BefacoButton_1.svg View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="9mm"
height="9mm"
viewBox="0 0 9 9"
version="1.1"
id="svg7758"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="BefacoButton_1.svg">
<defs
id="defs7752" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="11.723938"
inkscape:cy="46.023534"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1431"
inkscape:window-height="1208"
inkscape:window-x="3055"
inkscape:window-y="111"
inkscape:window-maximized="0" />
<metadata
id="metadata7755">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-52.267899,-79.412453)">
<circle
style="fill:#a4a4a4;fill-opacity:1;stroke-width:1.33165;stroke-linejoin:round"
id="path8389"
cx="56.767899"
cy="83.912453"
r="4.5" />
<circle
style="fill:#c6b6b6;fill-opacity:1;stroke-width:1.31088;stroke-linejoin:round"
id="path8391"
cx="56.767899"
cy="83.912453"
r="3.725069" />
</g>
</svg>

+ 101
- 0
res/BefacoSwitchHoriz_0.svg View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="31.564199"
height="28"
viewBox="0 0 8.3513612 7.4083335"
version="1.1"
id="svg10799"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="BefacoSwitchHoriz_0.svg">
<defs
id="defs10793" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-20.11941"
inkscape:cy="22.358936"
inkscape:document-units="mm"
inkscape:current-layer="g3201"
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="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
units="px"
inkscape:document-rotation="0" />
<metadata
id="metadata10796">
<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(-78.695511,-76.621942)">
<g
id="g3201"
transform="matrix(0.22389288,0,0,-0.22685285,-171.54356,342.70568)"
style="stroke-width:1.56534">
<path
d="m 1120.3613,1156.6184 c 0,8.6921 7.2263,15.73 16.1487,15.73 8.9224,0 16.1791,-7.0379 16.1791,-15.73 0,-8.6911 -7.2567,-15.7607 -16.1791,-15.7607 -8.9224,0 -16.1487,7.0696 -16.1487,15.7607"
style="vector-effect:none;fill:#e7e7e7;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path6575"
inkscape:connector-curvature="0" />
<path
d="m 1124.0599,1156.5567 c 0,6.6945 5.593,12.1425 12.4667,12.1425 6.8727,0 12.4646,-5.448 12.4646,-12.1425 0,-6.6955 -5.5919,-12.1435 -12.4646,-12.1435 -6.8737,0 -12.4667,5.448 -12.4667,12.1435"
style="vector-effect:none;fill:#e7e7e7;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path6583"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 1127.3934,1156.5036 c 0,4.9978 4.2283,9.1139 9.3585,9.1139 5.1302,0 9.3564,-4.1161 9.3564,-9.1139 0,-4.9982 -4.2262,-9.1158 -9.3564,-9.1158 -5.1302,0 -9.3585,4.1176 -9.3585,9.1158 z"
id="path5904"
inkscape:connector-curvature="0" />
<g
id="g5918"
transform="matrix(0,-0.98695203,-1.0132205,0,2306.1154,2276.0176)"
style="stroke-width:1.56534">
<path
d="m 1130.6064,1154.4414 v -3.023 c 2.259,-2.464 6.448,-2.248 7.659,0.144 l -0.038,2.966 z"
style="fill:#656565;fill-opacity:1;stroke:#656565;stroke-width:1.56534;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5912"
inkscape:connector-curvature="0" />
<path
d="m 1129.6875,1153.2109 c 2.403,-2.906 7.479,-2.26 9.573,0.089 0.736,0.826 2.032,3.75 2.032,8.37 0,4.62 -0.91,8.369 -2.032,8.369 h -9.483 c -1.122,0 -2.032,-3.749 -2.032,-8.369 0,-4.62 0.82,-7.745 1.972,-8.459"
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#e40000;stroke-width:0.978338;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5914"
inkscape:connector-curvature="0" />
<path
d="m 1134.5156,1159.2344 c 3.783,0 6.851,3.067 6.851,6.851 0,3.784 -3.068,6.85 -6.851,6.85 -3.784,0 -6.851,-3.066 -6.851,-6.85 0,-3.784 3.067,-6.851 6.851,-6.851"
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.56534"
id="path5916"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>

+ 86
- 0
res/BefacoSwitchHoriz_1.svg View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="31.564199"
height="28"
viewBox="0 0 8.3513612 7.4083335"
version="1.1"
id="svg10799"
sodipodi:docname="BefacoSwitchHoriz_1.svg"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)">
<defs
id="defs10793" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="17.077398"
inkscape:cy="24.7434"
inkscape:document-units="mm"
inkscape:current-layer="g3201"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1431"
inkscape:window-height="1208"
inkscape:window-x="1343"
inkscape:window-y="142"
inkscape:window-maximized="0"
units="px"
inkscape:document-rotation="0" />
<metadata
id="metadata10796">
<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(-78.695511,-76.621942)">
<g
id="g3201"
transform="matrix(0.22389288,0,0,-0.22685285,-171.54356,342.70568)"
style="stroke-width:1.56534">
<path
d="m 1120.3613,1156.6184 c 0,8.6921 7.2263,15.73 16.1487,15.73 8.9224,0 16.1791,-7.0379 16.1791,-15.73 0,-8.6911 -7.2567,-15.7607 -16.1791,-15.7607 -8.9224,0 -16.1487,7.0696 -16.1487,15.7607"
style="vector-effect:none;fill:#e7e7e7;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path6575"
inkscape:connector-curvature="0" />
<path
d="m 1124.0599,1156.5567 c 0,6.6945 5.593,12.1425 12.4667,12.1425 6.8727,0 12.4646,-5.448 12.4646,-12.1425 0,-6.6955 -5.5919,-12.1435 -12.4646,-12.1435 -6.8737,0 -12.4667,5.448 -12.4667,12.1435"
style="vector-effect:none;fill:#e7e7e7;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path6583"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 1127.3934,1156.5036 c 0,4.9978 4.2283,9.1139 9.3585,9.1139 5.1302,0 9.3564,-4.1161 9.3564,-9.1139 0,-4.9982 -4.2262,-9.1158 -9.3564,-9.1158 -5.1302,0 -9.3585,4.1176 -9.3585,9.1158 z"
id="path5904"
inkscape:connector-curvature="0" />
<path
d="m 1136.7509,1163.3532 c 3.7829,0 6.851,-3.067 6.851,-6.851 0,-3.784 -3.068,-6.85 -6.851,-6.85 -3.7841,0 -6.8511,3.066 -6.8511,6.85 0,3.784 3.067,6.851 6.8511,6.851"
style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#e40000;stroke-width:0.978338;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path5916-1"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

+ 104
- 0
res/BefacoSwitchHoriz_2.svg View File

@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="31.564199"
height="28"
viewBox="0 0 8.3513611 7.4083335"
version="1.1"
id="svg10799"
sodipodi:docname="BefacoSwitchHoriz_2.svg"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)">
<defs
id="defs10793" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="-55.968488"
inkscape:cy="5.6835659"
inkscape:document-units="mm"
inkscape:current-layer="g3201"
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="1393"
inkscape:window-x="108"
inkscape:window-y="153"
inkscape:window-maximized="0"
units="px"
inkscape:document-rotation="0" />
<metadata
id="metadata10796">
<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(-78.695511,-76.621942)">
<g
id="g3201"
transform="matrix(0.22389288,0,0,-0.22685285,-171.54356,342.70568)"
style="stroke-width:1.56534">
<g
id="g845"
transform="matrix(0,-0.98695203,1.0132205,0,-33.462386,2276.0252)">
<path
d="m 1134.1982,1138.7744 c -8.807,0 -15.938,7.132 -15.938,15.938 0,8.806 7.131,15.968 15.938,15.968 8.806,0 15.969,-7.162 15.969,-15.968 0,-8.806 -7.163,-15.938 -15.969,-15.938"
style="opacity:1;vector-effect:none;fill:#e7e7e7;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path6575"
inkscape:connector-curvature="0" />
<path
d="m 1134.2607,1142.4248 c -6.783,0 -12.303,5.52 -12.303,12.304 0,6.783 5.52,12.302 12.303,12.302 6.784,0 12.304,-5.519 12.304,-12.302 0,-6.784 -5.52,-12.304 -12.304,-12.304"
style="opacity:1;vector-effect:none;fill:#e7e7e7;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path6583"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#909290;stroke-width:1.17401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 1134.3145,1145.7148 c -5.0639,0 -9.2344,4.1731 -9.2344,9.2364 0,5.0632 4.1705,9.2343 9.2344,9.2343 5.0643,0 9.2363,-4.1711 9.2363,-9.2343 0,-5.0633 -4.172,-9.2364 -9.2363,-9.2364 z"
id="path5904"
inkscape:connector-curvature="0" />
<g
id="g5870"
style="stroke-width:1.56534">
<path
inkscape:connector-curvature="0"
id="path6631"
style="fill:#656565;fill-opacity:1;stroke:#656565;stroke-width:1.56534;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 1130.6064,1154.4414 v -3.023 c 2.259,-2.464 6.448,-2.248 7.659,0.144 l -0.038,2.966 z" />
<path
inkscape:connector-curvature="0"
id="path6635"
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#e40000;stroke-width:0.978338;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 1129.6875,1153.2109 c 2.403,-2.906 7.479,-2.26 9.573,0.089 0.736,0.826 2.032,3.75 2.032,8.37 0,4.62 -0.91,8.369 -2.032,8.369 h -9.483 c -1.122,0 -2.032,-3.749 -2.032,-8.369 0,-4.62 0.82,-7.745 1.972,-8.459" />
<path
inkscape:connector-curvature="0"
id="path6643"
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.56534"
d="m 1134.5156,1159.2344 c 3.783,0 6.851,3.067 6.851,6.851 0,3.784 -3.068,6.85 -6.851,6.85 -3.784,0 -6.851,-3.066 -6.851,-6.85 0,-3.784 3.067,-6.851 6.851,-6.851" />
</g>
</g>
</g>
</g>
</svg>

+ 541
- 0
res/Mex.svg View File

@@ -0,0 +1,541 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20.32mm"
height="128.5mm"
viewBox="0 0 20.32 128.5"
version="1.1"
id="svg4264"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="Mex.svg">
<defs
id="defs4258" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="40.526586"
inkscape:cy="277.91307"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1" />
<metadata
id="metadata4261">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="background"
inkscape:groupmode="layer"
id="layer1"
style="display:inline">
<path
sodipodi:nodetypes="ccccccccsssccccssscccccsssccccssscc"
inkscape:export-ydpi="600"
inkscape:export-xdpi="600"
inkscape:export-filename="/home/befaco/Escritorio/tretwetwety"
inkscape:connector-curvature="0"
id="path31470"
d="M 0.0816,0.0816 V 128.4184 H 19.918526 V 0.0816 Z m 6.477214,1.45567 h 1.831651 v 0.009 c 0.008,-2.8e-4 0.0157,0 0.0235,0 0.5317,0 0.96278,0.65062 0.96278,1.44684 0,0.79622 -0.43108,1.43802 -0.96278,1.43802 h -0.0235 v 0.009 H 6.558814 v -0.009 h -0.0235 c -0.5317,0 -0.962781,-0.6418 -0.962781,-1.43802 0,-0.79622 0.431081,-1.44684 0.962781,-1.44684 0.008,0 0.0153,-2.8e-4 0.0235,0 z m -0.005,122.52296 h 1.831651 v 0.009 c 0.008,-2.6e-4 0.0157,0 0.0235,0 0.53171,0 0.96279,0.65063 0.96279,1.44685 0,0.79622 -0.43108,1.43802 -0.96279,1.43802 h -0.0235 v 0.009 H 6.553814 v -0.009 h -0.0235 c -0.5317,0 -0.962781,-0.6418 -0.962781,-1.43802 0,-0.79622 0.431081,-1.44685 0.962781,-1.44685 0.008,0 0.0153,-2.6e-4 0.0235,0 z"
style="display:inline;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.1632;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
inkscape:export-ydpi="600"
inkscape:export-xdpi="600"
inkscape:export-filename="/home/befaco/Escritorio/tretwetwety"
inkscape:connector-curvature="0"
id="path31470-3"
d="M 0.0822522,0.0822522 V 128.41775 H 20.237748 V 0.0822522 Z"
style="display:inline;fill:#171717;fill-opacity:1;stroke:#000000;stroke-width:0.164504;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:transform-center-y="0.97046852"
inkscape:export-ydpi="100"
inkscape:export-xdpi="100"
inkscape:export-filename="/home/diego/Desktop/muxlizer"
transform="matrix(0,-0.72475323,-0.67593541,0,63.95455,282.20322)"
inkscape:randomized="0"
inkscape:rounded="0"
inkscape:flatsided="true"
sodipodi:arg2="4.1887902"
sodipodi:arg1="3.1415927"
sodipodi:r2="0.75583667"
sodipodi:r1="1.5116733"
sodipodi:cy="87.252441"
sodipodi:cx="241.375"
sodipodi:sides="3"
id="path2054"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.377722;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
sodipodi:type="star"
d="m 239.86333,87.252441 2.26751,-1.309147 0,2.618295 z" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.467;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 1.7167932,101.59087 -2.2e-4,7.19097 3.2880774,4.63798"
id="path31526"
sodipodi:nodetypes="ccc" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31894"
cx="1.7167929"
cy="25.705538"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31896"
cx="1.7167929"
cy="13.063478"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31898"
cx="1.7167929"
cy="50.989685"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31900"
cx="1.7167929"
cy="38.34761"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31902"
cx="1.7167929"
cy="76.273819"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31904"
cx="1.7167929"
cy="63.631744"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31906"
cx="1.7167929"
cy="101.59952"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31908"
cx="1.7167929"
cy="88.915894"
rx="0.99996799"
ry="1" />
<path
inkscape:transform-center-y="0.67275822"
inkscape:export-ydpi="100"
inkscape:export-xdpi="100"
inkscape:export-filename="/home/diego/Desktop/muxlizer"
transform="matrix(0,-0.50242084,-0.47248326,0,43.129774,243.10294)"
inkscape:randomized="0"
inkscape:rounded="0"
inkscape:flatsided="true"
sodipodi:arg2="4.1887902"
sodipodi:arg1="3.1415927"
sodipodi:r2="0.75583667"
sodipodi:r1="1.5116733"
sodipodi:cy="87.252441"
sodipodi:cx="241.375"
sodipodi:sides="3"
id="path8699"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.542616;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
sodipodi:type="star"
d="m 239.86333,87.252441 2.26751,-1.309147 0,2.618295 z" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31910"
cx="14.627353"
cy="25.705538"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31912"
cx="14.627353"
cy="13.063478"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31916"
cx="14.627353"
cy="50.989685"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31920"
cx="14.627353"
cy="38.34761"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31924"
cx="14.627353"
cy="76.273819"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31928"
cx="14.627353"
cy="63.631744"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31930"
cx="14.627353"
cy="101.55795"
rx="0.99996799"
ry="1" />
<ellipse
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.113126;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
id="ellipse31934"
cx="14.627353"
cy="88.915894"
rx="0.99996799"
ry="1" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.467;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 14.645366,101.59087 -2.2e-4,2.57966"
id="path31940"
sodipodi:nodetypes="cc" />
<g
aria-label="MEX"
id="text31492"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;line-height:0%;font-family:Miso;-inkscape-font-specification:'Miso Bold Condensed';letter-spacing:-0.0142462px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.282223;enable-background:new"
inkscape:transform-center-x="0.53338096"
inkscape:transform-center-y="12.800067">
<path
d="m 12.315055,4.544594 q -0.101599,0 -0.172719,-0.07112 -0.07112,-0.07112 -0.07112,-0.172719 V 1.3543729 q 0,-0.086359 0.0508,-0.1523991 0.0508,-0.06604 0.13716,-0.086359 0.08636,-0.02032 0.162559,0.02032 0.0762,0.03556 0.111759,0.1168393 0.101599,0.2235187 0.208279,0.4419574 0.08636,0.1930388 0.193039,0.4114775 0.106679,0.2133588 0.193039,0.4013177 0.08636,-0.1879589 0.187958,-0.4013177 0.10668,-0.2184387 0.193039,-0.4114775 0.1016,-0.2184387 0.208279,-0.4419574 0.04064,-0.081279 0.111759,-0.1168393 0.0762,-0.04064 0.162559,-0.02032 0.08636,0.02032 0.13716,0.086359 0.05588,0.06604 0.05588,0.1523991 v 2.9463825 q 0,0.1015994 -0.07112,0.172719 -0.07112,0.07112 -0.172719,0.07112 -0.1016,0 -0.172719,-0.07112 -0.07112,-0.07112 -0.07112,-0.172719 v -1.854189 q -0.06604,0.1371592 -0.126999,0.2692384 -0.06096,0.1320793 -0.111759,0.2336786 -0.05588,0.1219193 -0.11176,0.2336787 -0.03048,0.06604 -0.09144,0.1066793 -0.05588,0.03556 -0.126999,0.03556 -0.15748,0 -0.223519,-0.1422391 -0.05588,-0.1117594 -0.11176,-0.2336787 -0.0508,-0.1015993 -0.111759,-0.2336786 -0.06096,-0.1320792 -0.121919,-0.2692384 v 1.854189 q 0,0.1015994 -0.07112,0.172719 -0.07112,0.07112 -0.172719,0.07112 z"
style="font-size:5.07997px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6808" />
<path
d="m 14.698548,1.3746928 q 0,-0.1015994 0.07112,-0.172719 0.07112,-0.07112 0.172719,-0.07112 h 1.015994 q 0.101599,0 0.172719,0.07112 0.07112,0.07112 0.07112,0.172719 0,0.1015994 -0.07112,0.172719 -0.07112,0.07112 -0.172719,0.07112 h -0.772155 v 0.9143946 h 0.670556 q 0.101599,0 0.172719,0.07112 0.07112,0.07112 0.07112,0.172719 0,0.1015994 -0.07112,0.1727189 -0.07112,0.07112 -0.172719,0.07112 h -0.670556 v 1.015994 h 0.772155 q 0.101599,0 0.172719,0.07112 0.07112,0.07112 0.07112,0.172719 0,0.1015994 -0.07112,0.1727189 -0.07112,0.07112 -0.172719,0.07112 h -1.015994 q -0.101599,0 -0.172719,-0.07112 -0.07112,-0.07112 -0.07112,-0.1727189 z"
style="font-size:5.07997px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6810" />
<path
d="m 16.487681,4.5191941 q -0.08636,-0.04572 -0.121919,-0.1422391 -0.03048,-0.096519 0.01524,-0.1828789 L 17.087117,2.7767645 16.431801,1.4661322 q -0.04572,-0.091439 -0.01524,-0.1879588 0.03556,-0.09652 0.12192,-0.1422392 0.09144,-0.04572 0.187959,-0.01016 0.09652,0.03048 0.142239,0.1219192 l 0.492757,0.9855142 0.492757,-0.9855142 q 0.04572,-0.091439 0.142239,-0.1219192 0.09652,-0.03556 0.182879,0.01016 0.09144,0.04572 0.121919,0.1422392 0.03556,0.096519 -0.01016,0.1879588 l -0.655316,1.3106323 0.706116,1.4173116 q 0.04572,0.086359 0.01016,0.1828789 -0.03048,0.096519 -0.121919,0.1422391 -0.08636,0.04572 -0.182879,0.01016 -0.09652,-0.03048 -0.142239,-0.1168393 L 17.361436,3.3203213 16.817879,4.4125148 q -0.04572,0.086359 -0.142239,0.1168393 -0.09652,0.03556 -0.187959,-0.01016 z"
style="font-size:5.07997px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6812" />
</g>
<path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.278199;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 16.79259,107.40764 h -0.612842 v -2.65838 h -0.61982 v 2.65838 h -0.59299 v -2.65838 h -0.620542 v 2.65838 h -0.63247 v -2.65838 h -0.619012 v 2.65838 h -0.64424"
id="path31528"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc"
inkscape:export-filename="/home/diego/Desktop/muxlizer"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100" />
<path
style="display:inline;fill:#ffffff;stroke-width:0.282223"
inkscape:connector-curvature="0"
d="m 14.427276,123.9019 v -0.53635 h -1.14484 l 0.005,3.70889 h 3.43018 v -3.17254 h -2.2905 z m 1.70391,1.72766 h -0.57229 v 0.4601 h -0.30986 v -0.4601 h -0.10884 l -0.71821,0.4601 v -0.4601 h -0.56275 v -0.26812 h 0.56275 v -0.46006 l 0.71818,0.46006 h 0.10887 v -0.46006 h 0.30986 v 0.46006 h 0.57229 z"
id="path31472"
inkscape:export-filename="/home/befaco/Escritorio/tretwetwety"
inkscape:export-xdpi="600"
inkscape:export-ydpi="600" />
<g
id="g31484"
style="display:inline;stroke-width:1.0087"
transform="matrix(0.98281995,0,0,1,-78.596643,-172.1756)">
<g
style="display:inline;opacity:1;stroke:none;stroke-width:0.988596"
transform="matrix(1,0,0,1.0410849,-232.64809,-4.1347356)"
id="g31478">
<g
id="g31476"
transform="matrix(0.2807711,0,0,0.26458333,102.17083,15.427607)"
style="display:inline;stroke:none;stroke-width:0.988596">
<path
sodipodi:nodetypes="sssssssss"
inkscape:connector-curvature="0"
id="path31474"
d="m 791.59826,975.45392 h 24.58697 c 2.90194,0 5.23816,2.43216 5.23816,5.45328 v 34.3739 c 0,3.0211 -2.33622,5.4532 -5.23816,5.4532 h -24.58697 c -2.90193,0 -5.23815,-2.4321 -5.23815,-5.4532 v -34.3739 c 0,-3.02112 2.33622,-5.45328 5.23815,-5.45328 z"
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.215487;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</g>
<g
aria-label="OUT"
transform="scale(1.0301369,0.97074476)"
id="text31482"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;line-height:0%;font-family:Miso;-inkscape-font-specification:'Miso Bold Condensed';letter-spacing:-0.0116002px;word-spacing:0px;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.231805;enable-background:new">
<path
d="m 90.977461,301.68723 q -0.124547,0 -0.23486,-0.0463 -0.106754,-0.0463 -0.188599,-0.12811 -0.08185,-0.0818 -0.128106,-0.1886 -0.04626,-0.11031 -0.04626,-0.23486 v -1.20988 q 0,-0.12455 0.04626,-0.2313 0.04626,-0.11031 0.128106,-0.19216 0.08185,-0.0818 0.188599,-0.1281 0.110313,-0.0463 0.23486,-0.0463 0.124547,0 0.231301,0.0463 0.110313,0.0463 0.192158,0.1281 0.08185,0.0819 0.128105,0.19216 0.04626,0.10675 0.04626,0.2313 v 1.20988 q 0,0.12455 -0.04626,0.23486 -0.04626,0.10676 -0.128105,0.1886 -0.08185,0.0819 -0.192158,0.12811 -0.106754,0.0463 -0.231301,0.0463 z m 0,-2.06392 q -0.106754,0 -0.181483,0.0747 -0.07473,0.0747 -0.07473,0.18148 v 1.20988 q 0,0.10676 0.07473,0.18149 0.07473,0.0747 0.181483,0.0747 0.106754,0 0.181482,-0.0747 0.07473,-0.0747 0.07473,-0.18149 v -1.20988 q 0,-0.10675 -0.07473,-0.18148 -0.07473,-0.0747 -0.181482,-0.0747 z"
style="font-size:3.55848px;line-height:1.25;fill:#000000;fill-opacity:1;stroke-width:0.231805"
id="path6773" />
<path
d="m 92.204206,301.0894 q 0,0.10676 0.07473,0.18149 0.07473,0.0747 0.181483,0.0747 0.103196,0 0.177924,-0.0747 0.07829,-0.0747 0.07829,-0.18149 v -1.6369 q 0,-0.0712 0.04982,-0.12099 0.04982,-0.0498 0.120988,-0.0498 0.07117,0 0.120989,0.0498 0.04982,0.0498 0.04982,0.12099 v 1.6369 q 0,0.12455 -0.04982,0.23486 -0.04626,0.10676 -0.128106,0.1886 -0.07829,0.0819 -0.188599,0.12811 -0.110313,0.0463 -0.231301,0.0463 -0.124547,0 -0.23486,-0.0463 -0.106754,-0.0463 -0.188599,-0.12811 -0.08185,-0.0818 -0.128106,-0.1886 -0.04626,-0.11031 -0.04626,-0.23486 v -1.6369 q 0,-0.0712 0.04982,-0.12099 0.04982,-0.0498 0.120988,-0.0498 0.07117,0 0.120989,0.0498 0.04982,0.0498 0.04982,0.12099 v 1.6369 z"
style="font-size:3.55848px;line-height:1.25;fill:#000000;fill-opacity:1;stroke-width:0.231805"
id="path6775" />
<path
d="m 94.341927,299.29593 q 0.07117,0 0.120989,0.0498 0.04982,0.0498 0.04982,0.12099 0,0.0712 -0.04982,0.12098 -0.04982,0.0498 -0.120989,0.0498 h -0.291795 v 1.87888 q 0,0.0712 -0.04982,0.12099 -0.04982,0.0498 -0.120988,0.0498 -0.07117,0 -0.120988,-0.0498 -0.04982,-0.0498 -0.04982,-0.12099 V 299.6375 H 93.41672 q -0.07117,0 -0.120988,-0.0498 -0.04982,-0.0498 -0.04982,-0.12098 0,-0.0712 0.04982,-0.12099 0.04982,-0.0498 0.120988,-0.0498 z"
style="font-size:3.55848px;line-height:1.25;fill:#000000;fill-opacity:1;stroke-width:0.231805"
id="path6777" />
</g>
</g>
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,19.42501 H 13.910984"
id="path31980" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,32.06146 H 13.910984"
id="path31982" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,44.6979 H 13.910984"
id="path31984" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,57.33435 H 13.910984"
id="path31986" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,69.97079 H 13.910984"
id="path31988" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,82.60724 H 13.910984"
id="path31990" />
<path
style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 2.900701,95.24368 H 13.910984"
id="path31992" />
<g
aria-label="GATE IN"
id="text31488"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;line-height:0%;font-family:Miso;-inkscape-font-specification:'Miso Bold Condensed';letter-spacing:-0.0142462px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.282223;enable-background:new"
inkscape:transform-center-x="0.53337456"
inkscape:transform-center-y="12.799991">
<path
d="m 2.3404268,119.40149 q 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10436 v 0.49106 q 0,0.10742 -0.039899,0.20257 -0.039899,0.0921 -0.1104902,0.16266 -0.070591,0.0706 -0.1657351,0.11049 -0.092075,0.0399 -0.1994961,0.0399 -0.1074209,0 -0.2025652,-0.0399 -0.092075,-0.0399 -0.162666,-0.11049 -0.067522,-0.0706 -0.1104901,-0.16266 -0.039899,-0.0952 -0.039899,-0.20257 v -1.04351 q 0,-0.0859 0.027623,-0.16574 0.027623,-0.0829 0.076729,-0.14732 0.052176,-0.0675 0.1227668,-0.11356 0.070591,-0.0491 0.1565277,-0.0706 0.082868,-0.0215 0.1688043,-0.0153 0.085937,0.003 0.1626661,0.0368 0.076729,0.0307 0.1411818,0.0859 0.064453,0.0553 0.1074209,0.13197 0.030692,0.0522 0.012277,0.11049 -0.015346,0.0583 -0.067522,0.0921 -0.052176,0.0307 -0.1104902,0.0154 -0.058314,-0.0184 -0.089006,-0.0706 -0.039899,-0.0645 -0.1104901,-0.0921 -0.067522,-0.0307 -0.1381127,-0.009 -0.07366,0.0184 -0.1196976,0.0798 -0.046037,0.0583 -0.046037,0.13198 v 1.04351 q 0,0.0921 0.064453,0.15653 0.067522,0.0645 0.1565277,0.0645 0.092075,0 0.1565277,-0.0645 0.064453,-0.0644 0.064453,-0.15653 v -0.34374 H 2.0335098 q -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10435 0,-0.0614 0.042968,-0.10436 0.042968,-0.043 0.1043518,-0.043 h 0.306917 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6795" />
<path
d="m 3.8791767,120.36827 q 0.015346,0.0614 -0.015346,0.11356 -0.027623,0.0522 -0.085937,0.0675 -0.061383,0.0153 -0.1135593,-0.0153 -0.052176,-0.0276 -0.067522,-0.0859 -0.012277,-0.0368 -0.024553,-0.089 -0.012277,-0.043 -0.030692,-0.10129 -0.015346,-0.0614 -0.033761,-0.13197 H 2.9860483 q -0.021484,0.0706 -0.03683,0.13197 -0.015346,0.0583 -0.027622,0.10129 -0.012277,0.0522 -0.024553,0.089 -0.015346,0.0583 -0.067522,0.0859 -0.052176,0.0307 -0.1135593,0.0153 -0.058314,-0.0153 -0.089006,-0.0675 -0.027623,-0.0522 -0.012277,-0.11356 l 0.4910672,-1.78011 q 0.012277,-0.0491 0.049107,-0.0767 0.039899,-0.0307 0.092075,-0.0307 0.052176,0 0.089006,0.0307 0.039899,0.0276 0.052176,0.0767 z m -0.4542371,-0.5371 q -0.042968,-0.1596 -0.089006,-0.3284 -0.046038,-0.16881 -0.089006,-0.3192 -0.042968,0.15039 -0.089006,0.3192 -0.046038,0.1688 -0.089006,0.3284 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6797" />
<path
d="m 4.7242921,118.49301 q 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043518,0.043 H 4.4726202 v 1.62052 q 0,0.0614 -0.042968,0.10436 -0.042968,0.043 -0.1043518,0.043 -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10436 v -1.62052 H 3.9263079 q -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10435 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043518,-0.043 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6799" />
<path
d="m 5.0537905,118.64033 q 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043517,-0.043 h 0.613834 q 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043518,0.043 H 5.3484308 v 0.55245 h 0.4051304 q 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043518,0.043 H 5.3484308 v 0.61384 h 0.4665138 q 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10436 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043518,0.043 h -0.613834 q -0.061383,0 -0.1043517,-0.043 -0.042968,-0.043 -0.042968,-0.10435 v -1.75557 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6801" />
<path
d="m 6.891346,120.55549 q -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10436 v -1.78012 q 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043518,-0.043 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 v 1.78012 q 0,0.0614 -0.042968,0.10436 -0.042968,0.043 -0.1043518,0.043 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6803" />
<path
d="m 8.3840586,120.55242 q -0.052176,0.0123 -0.098213,-0.0123 -0.046038,-0.0215 -0.067522,-0.0675 -0.092075,-0.19643 -0.1933577,-0.40207 -0.085937,-0.17494 -0.1902885,-0.38671 -0.1012826,-0.21177 -0.1964269,-0.41127 v 1.13559 q 0,0.0614 -0.042968,0.10436 -0.042968,0.043 -0.1043518,0.043 -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10436 v -1.78012 q 0,-0.0522 0.030692,-0.0921 0.030692,-0.0399 0.082868,-0.0522 0.052176,-0.0123 0.095144,0.0123 0.046038,0.0215 0.070591,0.0675 0.092075,0.19643 0.1933577,0.40206 0.085937,0.17495 0.1872194,0.38672 0.1012826,0.21177 0.1994961,0.41127 v -1.1356 q 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043518,-0.043 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 v 1.78012 q 0,0.0522 -0.033761,0.0921 -0.030692,0.0399 -0.079798,0.0522 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6805" />
</g>
<g
aria-label="[ CLOCK]"
id="text31944"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;line-height:0%;font-family:Miso;-inkscape-font-specification:'Miso Bold Condensed';letter-spacing:-0.0142462px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.282223;enable-background:new"
inkscape:transform-center-x="0.53337456"
inkscape:transform-center-y="12.799991">
<path
d="m 0.67835845,123.30254 q -0.0613834,0 -0.10435178,-0.043 -0.0429684,-0.043 -0.0429684,-0.10435 v -2.24664 q 0,-0.0614 0.0429684,-0.10435 0.0429684,-0.043 0.10435178,-0.043 h 0.306917 q 0.0613833,0 0.10435175,0.043 0.042968,0.043 0.042968,0.10435 0,0.0614 -0.042968,0.10436 -0.042968,0.043 -0.10435175,0.043 H 0.82567861 v 1.952 h 0.15959684 q 0.0613833,0 0.10435175,0.043 0.042968,0.043 0.042968,0.10436 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.10435175,0.043 h -0.306917 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6780" />
<path
d="m 3.3713407,123.05086 q -0.082868,-0.0215 -0.1534585,-0.0675 -0.070591,-0.0491 -0.1227668,-0.11356 -0.049107,-0.0675 -0.076729,-0.14732 -0.027622,-0.0798 -0.027622,-0.1688 v -1.04352 q 0,-0.0859 0.027622,-0.16573 0.027623,-0.0829 0.076729,-0.14732 0.052176,-0.0675 0.1227668,-0.11356 0.070591,-0.0491 0.1534585,-0.0706 0.1718735,-0.046 0.3314703,0.0215 0.1595969,0.0645 0.2486028,0.21791 0.033761,0.0522 0.015346,0.11049 -0.015346,0.0583 -0.067522,0.0921 -0.052176,0.0307 -0.1104901,0.0153 -0.058314,-0.0184 -0.092075,-0.0706 -0.03683,-0.0644 -0.107421,-0.0921 -0.067522,-0.0307 -0.1411818,-0.009 -0.070591,0.0184 -0.1166284,0.0798 -0.046038,0.0583 -0.046038,0.13197 v 1.04352 q 0,0.0767 0.046038,0.13504 0.046038,0.0583 0.1166284,0.0798 0.07366,0.0184 0.1411818,-0.009 0.070591,-0.0307 0.107421,-0.0951 0.033761,-0.0522 0.092075,-0.0675 0.058314,-0.0184 0.1104901,0.0123 0.052176,0.0338 0.067522,0.0921 0.018415,0.0583 -0.015346,0.11049 -0.089006,0.15346 -0.2486028,0.21791 -0.1595968,0.0675 -0.3314703,0.0215 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6782" />
<path
d="m 4.3422927,123.057 q -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10435 v -1.76784 q 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043518,-0.043 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 v 1.62052 h 0.4665139 q 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043518,0.043 h -0.613834 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6784" />
<path
d="m 5.7275865,123.06928 q -0.1074209,0 -0.2025652,-0.0399 -0.092075,-0.0399 -0.162666,-0.11049 -0.070591,-0.0706 -0.1104901,-0.16267 -0.039899,-0.0951 -0.039899,-0.20256 v -1.04352 q 0,-0.10742 0.039899,-0.19949 0.039899,-0.0951 0.1104901,-0.16574 0.070591,-0.0706 0.162666,-0.11049 0.095144,-0.0399 0.2025652,-0.0399 0.107421,0 0.1994961,0.0399 0.095144,0.0399 0.1657351,0.11049 0.070591,0.0706 0.1104902,0.16574 0.039899,0.0921 0.039899,0.19949 v 1.04352 q 0,0.10742 -0.039899,0.20256 -0.039899,0.0921 -0.1104902,0.16267 -0.070591,0.0706 -0.1657351,0.11049 -0.092075,0.0399 -0.1994961,0.0399 z m 0,-1.78012 q -0.092075,0 -0.1565277,0.0645 -0.064453,0.0645 -0.064453,0.15653 v 1.04352 q 0,0.0921 0.064453,0.15653 0.064453,0.0645 0.1565277,0.0645 0.092075,0 0.1565277,-0.0645 0.064453,-0.0645 0.064453,-0.15653 v -1.04352 q 0,-0.0921 -0.064453,-0.15653 -0.064453,-0.0645 -0.1565277,-0.0645 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6786" />
<path
d="m 6.8550672,123.05086 q -0.082868,-0.0215 -0.1534585,-0.0675 -0.070591,-0.0491 -0.1227668,-0.11356 -0.049107,-0.0675 -0.076729,-0.14732 -0.027623,-0.0798 -0.027623,-0.1688 v -1.04352 q 0,-0.0859 0.027623,-0.16573 0.027622,-0.0829 0.076729,-0.14732 0.052176,-0.0675 0.1227668,-0.11356 0.070591,-0.0491 0.1534585,-0.0706 0.1718735,-0.046 0.3314703,0.0215 0.1595969,0.0645 0.2486028,0.21791 0.033761,0.0522 0.015346,0.11049 -0.015346,0.0583 -0.067522,0.0921 -0.052176,0.0307 -0.1104901,0.0153 -0.058314,-0.0184 -0.092075,-0.0706 -0.03683,-0.0644 -0.107421,-0.0921 -0.067522,-0.0307 -0.1411818,-0.009 -0.070591,0.0184 -0.1166284,0.0798 -0.046038,0.0583 -0.046038,0.13197 v 1.04352 q 0,0.0767 0.046038,0.13504 0.046037,0.0583 0.1166284,0.0798 0.07366,0.0184 0.1411818,-0.009 0.070591,-0.0307 0.107421,-0.0951 0.033761,-0.0522 0.092075,-0.0675 0.058314,-0.0184 0.1104901,0.0123 0.052176,0.0338 0.067522,0.0921 0.018415,0.0583 -0.015346,0.11049 -0.089006,0.15346 -0.2486028,0.21791 -0.1595968,0.0675 -0.3314703,0.0215 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6788" />
<path
d="m 8.7590469,122.85751 q 0.024553,0.0552 0.00307,0.11356 -0.018415,0.0583 -0.07366,0.0829 -0.055245,0.0276 -0.1135593,0.006 -0.055245,-0.0184 -0.082868,-0.0737 l -0.4020613,-0.83788 -0.1166285,0.1596 v 0.61383 q 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043518,0.043 -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10435 v -1.78012 q 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043518,-0.043 0.061383,0 0.1043518,0.043 0.042968,0.043 0.042968,0.10435 v 0.65987 l 0.5309665,-0.74581 q 0.03683,-0.0491 0.095144,-0.0583 0.061383,-0.009 0.1104901,0.0245 0.052176,0.0338 0.061383,0.0952 0.00921,0.0583 -0.027622,0.11049 l -0.4603755,0.64759 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6790" />
<path
d="m 9.2757653,120.76126 q 0.061383,0 0.1043517,0.043 0.042968,0.043 0.042968,0.10435 v 2.24664 q 0,0.0614 -0.042968,0.10435 -0.042968,0.043 -0.1043517,0.043 h -0.306917 q -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10435 0,-0.0614 0.042968,-0.10436 0.042968,-0.043 0.1043518,-0.043 h 0.1595968 v -1.952 H 8.9688483 q -0.061383,0 -0.1043518,-0.043 -0.042968,-0.043 -0.042968,-0.10436 0,-0.0614 0.042968,-0.10435 0.042968,-0.043 0.1043518,-0.043 h 0.306917 z"
style="font-size:3.06917px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke-width:0.282223"
id="path6792" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="components"
style="display:none">
<g
style="display:inline"
id="g8018"
transform="matrix(-0.26458333,0,0,0.26458333,140.04773,5.1763806)" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31946"
cx="17.700045"
cy="101.55795"
r="0.99999994"
inkscape:label="led_8" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31948"
cx="17.700045"
cy="88.915894"
r="0.99999994"
inkscape:label="led_7" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31950"
cx="17.700045"
cy="76.273819"
r="0.99999994"
inkscape:label="led_6" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31952"
cx="17.700045"
cy="63.631744"
r="0.99999994"
inkscape:label="led_5" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31954"
cx="17.700045"
cy="50.989685"
r="0.99999994"
inkscape:label="led_4" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31956"
cx="17.700045"
cy="38.34761"
r="0.99999994"
inkscape:label="led_3" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31958"
cx="17.700045"
cy="25.705553"
r="0.99999994"
inkscape:label="led_2" />
<circle
style="display:inline;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.35;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.54016;stroke-opacity:1;paint-order:fill markers stroke"
id="circle31960"
cx="17.700045"
cy="13.063478"
r="0.99999994"
inkscape:label="led_1" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815"
cx="8.0876265"
cy="13.063484"
r="1.6036172"
inkscape:label="step_1" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-1"
cx="8.0876265"
cy="25.705629"
r="1.6036172"
inkscape:label="step_2" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-4"
cx="8.0876265"
cy="38.347778"
r="1.6036172"
inkscape:label="step_3" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-9"
cx="8.0876265"
cy="50.989925"
r="1.6036172"
inkscape:label="step_4" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-6"
cx="8.0876265"
cy="63.632069"
r="1.6036172"
inkscape:label="step_5" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-91"
cx="8.0876265"
cy="76.274216"
r="1.6036172"
inkscape:label="step_6" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-7"
cx="8.0876265"
cy="88.916367"
r="1.6036172"
inkscape:label="step_7" />
<circle
style="display:inline;fill:#ff0000;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-3"
cx="8.0876265"
cy="101.55852"
r="1.6036172"
inkscape:label="step_8" />
<circle
style="display:inline;fill:#00ff00;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-3-6"
cx="4.9775352"
cy="113.44526"
r="1.6036172"
inkscape:label="gate_in" />
<circle
style="display:inline;fill:#0000ff;fill-opacity:1;stroke-width:0.434999;stroke-linejoin:round"
id="path6815-3-6-2"
cx="15.01425"
cy="113.39995"
r="1.6036172"
inkscape:label="out" />
</g>
</svg>

+ 5891
- 0
res/Muxlicer.svg
File diff suppressed because it is too large
View File


+ 105
- 0
src/Mex.cpp View File

@@ -0,0 +1,105 @@
#include "plugin.hpp"

struct Mex : Module {
static const int numSteps = 8;
enum ParamIds {
ENUMS(STEP_PARAM, numSteps),
NUM_PARAMS
};
enum InputIds {
GATE_IN_INPUT,
NUM_INPUTS
};
enum OutputIds {
OUT_OUTPUT,
NUM_OUTPUTS
};
enum LightIds {
ENUMS(LED, numSteps),
NUM_LIGHTS
};
enum StepState {
GATE_IN_MODE,
MUTE_MODE,
MUXLICER_MODE
};

MexMessage leftMessages[2] = {};

Mex() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);

for (int i = 0; i < 8; ++i) {
configParam(STEP_PARAM + i, 0.f, 2.f, 0.f, string::f("Step %d", i));
}

leftExpander.producerMessage = &(leftMessages[0]);
leftExpander.consumerMessage = &(leftMessages[1]);
}

void process(const ProcessArgs& args) override {

for (int i = 0; i < 8; i++) {
lights[i].setBrightness(0.f);
}

if (leftExpander.module && leftExpander.module->model == modelMuxlicer) {

// Get consumer message
MexMessage* message = (MexMessage*) leftExpander.consumerMessage;

float gate = 0.f;

if (message->isPlaying) {
const int currentStep = clamp(message->addressIndex, 0, 7);
StepState state = (StepState) params[STEP_PARAM + currentStep].getValue();
if (state == MUXLICER_MODE) {
gate = message->allGates;
}
else if (state == GATE_IN_MODE) {
gate = inputs[GATE_IN_INPUT].getNormalVoltage(message->outputClock);
}

lights[currentStep].setBrightness(gate);
}

outputs[OUT_OUTPUT].setVoltage(gate);
}
}
};


struct MexWidget : ModuleWidget {
MexWidget(Mex* module) {
setModule(module);
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/Mex.svg")));

addChild(createWidget<Knurlie>(Vec(RACK_GRID_WIDTH, 0)));
addChild(createWidget<Knurlie>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));

addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 13.063)), module, Mex::STEP_PARAM + 0));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 25.706)), module, Mex::STEP_PARAM + 1));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 38.348)), module, Mex::STEP_PARAM + 2));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 50.990)), module, Mex::STEP_PARAM + 3));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 63.632)), module, Mex::STEP_PARAM + 4));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 76.274)), module, Mex::STEP_PARAM + 5));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 88.916)), module, Mex::STEP_PARAM + 6));
addParam(createParamCentered<BefacoSwitchHorizontal>(mm2px(Vec(8.088, 101.559)), module, Mex::STEP_PARAM + 7));

addInput(createInputCentered<PJ301MPort>(mm2px(Vec(4.978, 113.445)), module, Mex::GATE_IN_INPUT));

addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(15.014, 113.4)), module, Mex::OUT_OUTPUT));

addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 13.063)), module, Mex::LED + 0));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 25.706)), module, Mex::LED + 1));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 38.348)), module, Mex::LED + 2));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 50.990)), module, Mex::LED + 3));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 63.632)), module, Mex::LED + 4));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 76.274)), module, Mex::LED + 5));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 88.916)), module, Mex::LED + 6));
addChild(createLightCentered<SmallLight<RedLight>>(mm2px(Vec(17.7, 101.558)), module, Mex::LED + 7));
}
};


Model* modelMex = createModel<Mex, MexWidget>("Mex");

+ 811
- 0
src/Muxlicer.cpp View File

@@ -0,0 +1,811 @@
#include "plugin.hpp"

// an implementation of a performable, 3-stage switch, i.e. where
// the state triggers after being dragged a certain distance
struct BefacoSwitchMomentary : SVGSwitch {
BefacoSwitchMomentary() {
momentary = true;
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSwitch_0.svg")));
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSwitch_1.svg")));
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSwitch_2.svg")));
}

void onDragStart(const event::DragStart& e) override {
latched = false;
startMouseY = APP->scene->rack->mousePos.y;
ParamWidget::onDragStart(e);
}

void onDragMove(const event::DragMove& e) override {

float diff = APP->scene->rack->mousePos.y - startMouseY;

// Once the user has dragged the mouse a "threshold" distance, latch
// to disallow further changes of state until the mouse is released.
// We don't just setValue(1) (default/rest state) because this creates a
// jarring UI experience
if (diff < -10 && !latched) {
paramQuantity->setValue(2);
latched = true;
}
if (diff > 10 && !latched) {
paramQuantity->setValue(0);
latched = true;
}

ParamWidget::onDragMove(e);
}

void onDragEnd(const event::DragEnd& e) override {
// on release, the switch resets to default/neutral/middle position
paramQuantity->setValue(1);
latched = false;
ParamWidget::onDragEnd(e);
}

// do nothing
void randomize() override {}

float startMouseY = 0.f;
bool latched = false;
};


// Class which can yield a divided clock state, specifically where the
// gate is generated at request time through getGate(), rather than during
// process() - this means that different divisions of clock can be requested
// at any point in time. In contrast, the division/multiplication setting for
// ClockMultDiv cannot easily be changed _during_ a clock tick.
struct MultiGateClock {

float remaining = 0.f;
float fullPulseLength = 0.f;

/** Immediately disables the pulse */
void reset(float newfullPulseLength) {
fullPulseLength = newfullPulseLength;
remaining = fullPulseLength;
}

/** Advances the state by `deltaTime`. Returns whether the pulse is in the HIGH state. */
bool process(float deltaTime) {
if (remaining > 0.f) {
remaining -= deltaTime;
return true;
}
return false;
}

float getGate(int gateMode) {

if (gateMode == 0) {
// always on (special case)
return 10.f;
}
else if (gateMode < 0 || remaining <= 0) {
// disabled (or elapsed)
return 0.f;
}

const float multiGateOnLength = fullPulseLength / ((gateMode > 0) ? (2.f * gateMode) : 1.0f);
const bool isOddPulse = int(floor(remaining / multiGateOnLength)) % 2;

return isOddPulse ? 10.f : 0.f;
}
};


// Class for generating a clock sequence after setting a clock multiplication or division,
// given a stream of clock pulses as the "base" clock.
// Implementation is heavily inspired by BogAudio RGate, with modification
struct MultDivClock {

// convention: negative values are used for division (1/mult), positive for multiplication (x mult)
// multDiv = 0 should not be used, but if it is it will result in no modification to the clock
int multDiv = 1;
float secondsSinceLastClock = -1.0f;
float inputClockLengthSeconds = -1.0f;

// count how many divisions we've had
int dividerCount = 0;

float dividedProgressSeconds = 0.f;

// returns the gated clock signal
float process(float deltaTime, bool clockPulseReceived) {

if (clockPulseReceived) {
// update our record of the incoming clock spacing
if (secondsSinceLastClock > 0.0f) {
inputClockLengthSeconds = secondsSinceLastClock;
}
secondsSinceLastClock = 0.0f;
}

float out = 0.f;
if (secondsSinceLastClock >= 0.0f) {
secondsSinceLastClock += deltaTime;

// negative values are used for division (x 1/mult), positive for multiplication (x mult)
const int division = std::max(-multDiv, 1);
const int multiplication = std::max(multDiv, 1);

if (clockPulseReceived) {
if (dividerCount < 1) {
dividedProgressSeconds = 0.0f;
}
else {
dividedProgressSeconds += deltaTime;
}
++dividerCount;
if (dividerCount >= division) {
dividerCount = 0;
}
}
else {
dividedProgressSeconds += deltaTime;
}

// lengths of the mult/div versions of the clock
const float dividedSeconds = inputClockLengthSeconds * (float) division;
const float multipliedSeconds = dividedSeconds / (float) multiplication;

// length of the output gate (s)
const float gateSeconds = std::max(0.001f, multipliedSeconds * 0.5f);

if (dividedProgressSeconds < dividedSeconds) {
float multipliedProgressSeconds = dividedProgressSeconds / multipliedSeconds;
multipliedProgressSeconds -= (float)(int)multipliedProgressSeconds;
multipliedProgressSeconds *= multipliedSeconds;
out += (float)(multipliedProgressSeconds <= gateSeconds);
}
}
return out;
}

float getEffectiveClockLength() {
// negative values are used for division (x 1/mult), positive for multiplication (x mult)
const int division = std::max(-multDiv, 1);
const int multiplication = std::max(multDiv, 1);

// lengths of the mult/div versions of the clock
const float dividedSeconds = inputClockLengthSeconds * (float) division;
const float multipliedSeconds = dividedSeconds / (float) multiplication;

return multipliedSeconds;
}
};

struct Muxlicer : Module {
enum ParamIds {
PLAY_PARAM,
ADDRESS_PARAM,
GATE_MODE_PARAM,
TAP_TEMPO_PARAM,
ENUMS(LEVEL_PARAMS, 8),
NUM_PARAMS
};
enum InputIds {
GATE_MODE_INPUT,
ADDRESS_INPUT,
CLOCK_INPUT,
RESET_INPUT,
COM_INPUT,
ENUMS(MUX_INPUTS, 8),
ALL_INPUT,
NUM_INPUTS
};
enum OutputIds {
CLOCK_OUTPUT,
ALL_GATES_OUTPUT,
EOC_OUTPUT,
ENUMS(GATE_OUTPUTS, 8),
ENUMS(MUX_OUTPUTS, 8),
COM_OUTPUT,
NUM_OUTPUTS
};
enum LightIds {
CLOCK_LIGHT,
ENUMS(GATE_LIGHTS, 8),
NUM_LIGHTS
};

enum ModeCOMIO {
COM_1_IN_8_OUT,
COM_8_IN_1_OUT
};

enum PlayState {
STATE_PLAY_ONCE,
STATE_STOPPED,
STATE_PLAY
};

/*
This shows how the values of the gate mode knob + CV map onto gate triggers.
See also getGateMode()
value | description | quadratic only mode
-1 no gate | âś”
0 gate (full timestep) | x
+1 half timestep | âś”
2 two gates | âś”
3 three gates | x
4 four gates | âś”
5 five gates | x
6 six gates | x
7 seven gates | x
8 eight gates | âś”
*/
int possibleQuadraticGates[5] = {-1, 1, 2, 4, 8};
bool quadraticGatesOnly = false;

PlayState playState = STATE_STOPPED;
dsp::BooleanTrigger playStateTrigger;

uint32_t runIndex; // which step are we on (0 to 7)
uint32_t addressIndex = 0;
bool reset = false;

// used to track the clock (e.g. if external clock is not connected). NOTE: this clock
// is defined _prior_ to any clock division/multiplication logic
float internalClockProgress = 0.f;
float internalClockLength = 0.25f;

float tapTime = 99999; // used to track the time between clock pulses (or taps?)
dsp::SchmittTrigger inputClockTrigger; // to detect incoming clock pulses
dsp::SchmittTrigger mainClockTrigger; // to detect rising edges from the divided/multiplied version of the clock signal
dsp::SchmittTrigger resetTrigger; // to detect the reset signal
dsp::PulseGenerator endOfCyclePulse; // fire a signal at the end of cycle
dsp::BooleanTrigger tapTempoTrigger; // to only trigger tap tempo when push is first detected

MultDivClock mainClockMultDiv; // to produce a divided/multiplied version of the (internal or external) clock signal
MultDivClock outputClockMultDiv; // to produce a divided/multiplied version of the output clock signal
MultiGateClock multiClock; // to easily produce a divided version of the main clock (where division can be changed at any point)

const static int SEQUENCE_LENGTH = 8;
ModeCOMIO modeCOMIO = COM_1_IN_8_OUT; // are we in 1-in-8-out mode, or 8-in-1-out mode
int allInNormalVoltage = 10; // what voltage is normalled into the "All In" input, selectable via context menu
Module* rightModule; // for the expander

Muxlicer() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
configParam(Muxlicer::PLAY_PARAM, STATE_PLAY_ONCE, STATE_PLAY, STATE_STOPPED, "Play switch");
configParam(Muxlicer::ADDRESS_PARAM, -1.f, 7.f, -1.f, "Address");
configParam(Muxlicer::GATE_MODE_PARAM, -1.f, 8.f, 0.f, "Gate mode");
configParam(Muxlicer::TAP_TEMPO_PARAM, 0.f, 1.f, 0.f, "Tap tempo");

for (int i = 0; i < SEQUENCE_LENGTH; ++i) {
configParam(Muxlicer::LEVEL_PARAMS + i, 0.0, 1.0, 1.0, string::f("Slider %d", i));
}

onReset();
}

void onReset() override {
internalClockLength = 0.250f;
internalClockProgress = 0;
runIndex = 0;
}

void process(const ProcessArgs& args) override {

const bool usingExternalClock = inputs[CLOCK_INPUT].isConnected();

bool externalClockPulseReceived = false;
// a clock pulse does two things: sets the internal clock (based on timing between two pulses), and
// also synchronises the clock
if (usingExternalClock && inputClockTrigger.process(rescale(inputs[CLOCK_INPUT].getVoltage(), 0.1f, 2.f, 0.f, 1.f))) {
externalClockPulseReceived = true;
}
else if (!usingExternalClock && tapTempoTrigger.process(params[TAP_TEMPO_PARAM].getValue())) {
externalClockPulseReceived = true;
}

if (resetTrigger.process(rescale(inputs[RESET_INPUT].getVoltage(), 0.1f, 2.f, 0.f, 1.f))) {
reset = true;
if (playState == STATE_STOPPED) {
playState = STATE_PLAY_ONCE;
}
}

processPlayResetSwitch();

// TODO: work out CV scaling/conversion for ADDRESS_INPUT
const float address = params[ADDRESS_PARAM].getValue() + inputs[ADDRESS_INPUT].getVoltage();
const bool isSequenceAdvancing = address < 0.f;

// even if we have an external clock, use its pulses to time/sync the internal clock
// so that it will remain running after CLOCK_INPUT is disconnected
if (externalClockPulseReceived) {
// TODO: only want 2.f for tap for tempo, not all external clock
if (tapTime < 2.f) {
internalClockLength = tapTime;
}
tapTime = 0;
internalClockProgress = 0;
}
tapTime += args.sampleTime;
internalClockProgress += args.sampleTime;

// track if the internal clock has "ticked"
const bool internalClockPulseReceived = (internalClockProgress >= internalClockLength);
if (internalClockPulseReceived) {
internalClockProgress = 0.f;
}

// we can be in one of two clock modes:
// * external (decided by pulses to CLOCK_INPUT)
// * internal (decided by internalClockProgress exceeding the internal clock length)
//
// choose which clock source we are to use
const bool clockPulseReceived = usingExternalClock ? externalClockPulseReceived : internalClockPulseReceived;
// apply the main clock div/mult logic to whatever clock source we're using - this outputs a gate sequence
// so we must use a Schmitt Trigger on the divided/mult'd signal in order to detect when to advance the sequence
const bool dividedMultedClockPulseReceived = mainClockTrigger.process(mainClockMultDiv.process(args.sampleTime, clockPulseReceived));

// reset _doesn't_ reset/sync the clock, it just moves the sequence index marker back to the start
if (reset) {
runIndex = 0;
reset = false;
}

// end of cycle trigger trigger
outputs[EOC_OUTPUT].setVoltage(0.f);

if (dividedMultedClockPulseReceived) {

if (isSequenceAdvancing) {
runIndex++;
if (runIndex >= 8) {
// both play modes will reset to step 0 and fire an EOC trigger
runIndex = 0;
endOfCyclePulse.trigger(1e-3);

// additionally stop if in one shot mode
if (playState == STATE_PLAY_ONCE) {
playState = STATE_STOPPED;
}
}
}

multiClock.reset(mainClockMultDiv.getEffectiveClockLength());

for (int i = 0; i < 8; i++) {
outputs[GATE_OUTPUTS + i].setVoltage(0.f);
}
}

if (isSequenceAdvancing) {
addressIndex = runIndex;
}
else {
addressIndex = clamp((int) roundf(address), 0, 8 - 1);
}

// Gates
for (int i = 0; i < 8; i++) {
outputs[GATE_OUTPUTS + i].setVoltage(0.f);
lights[GATE_LIGHTS + i].setBrightness(0.f);
}
outputs[ALL_GATES_OUTPUT].setVoltage(0.f);

multiClock.process(args.sampleTime);
const int gateMode = getGateMode();

if (playState != STATE_STOPPED) {
// current gate output _and_ "All Gates" output get the gate pattern from multiClock
float gateValue = multiClock.getGate(gateMode);
outputs[GATE_OUTPUTS + addressIndex].setVoltage(gateValue);
lights[GATE_LIGHTS + addressIndex].setBrightness(gateValue / 10.f);
outputs[ALL_GATES_OUTPUT].setVoltage(gateValue);
}


if (modeCOMIO == COM_1_IN_8_OUT) {
// Mux outputs (all zero, except active step, if playing)
for (int i = 0; i < 8; i++) {
outputs[MUX_OUTPUTS + i].setVoltage(0.f);
}

if (playState != STATE_STOPPED) {
const float com_input = inputs[COM_INPUT].getVoltage();
const float stepVolume = params[LEVEL_PARAMS + addressIndex].getValue();
outputs[MUX_OUTPUTS + addressIndex].setVoltage(stepVolume * com_input);
}
}
else if (modeCOMIO == COM_8_IN_1_OUT && playState != STATE_STOPPED) {
const float allInValue = inputs[ALL_INPUT].getNormalVoltage(allInNormalVoltage);
const float stepVolume = params[LEVEL_PARAMS + addressIndex].getValue();
float stepValue = inputs[MUX_INPUTS + addressIndex].getNormalVoltage(allInValue) * stepVolume;
outputs[COM_OUTPUT].setVoltage(stepValue);
}

const bool isOutputClockHigh = outputClockMultDiv.process(args.sampleTime, clockPulseReceived);
outputs[CLOCK_OUTPUT].setVoltage(isOutputClockHigh ? 10.f : 0.f);
lights[CLOCK_LIGHT].setBrightness(isOutputClockHigh ? 1.f : 0.f);
outputs[EOC_OUTPUT].setVoltage(endOfCyclePulse.process(args.sampleTime) ? 10.f : 0.f);

if (rightExpander.module && rightExpander.module->model == modelMex) {
// Get message from right expander
MexMessage* message = (MexMessage*) rightExpander.module->leftExpander.producerMessage;

// Write message
message->addressIndex = addressIndex;
message->allGates = multiClock.getGate(gateMode);
message->outputClock = isOutputClockHigh ? 10.f : 0.f;
message->isPlaying = (playState != STATE_STOPPED);

// Flip messages at the end of the timestep
rightExpander.module->leftExpander.messageFlipRequested = true;
}
}

void processPlayResetSwitch() {

// if the play switch has effectively been activated for the first time,
// i.e. it's not just still being held
const bool switchIsActive = params[PLAY_PARAM].getValue() != STATE_STOPPED;
if (playStateTrigger.process(switchIsActive) && switchIsActive) {

// if we were stopped, check for activation (normal or one-shot)
if (playState == STATE_STOPPED) {
if (params[PLAY_PARAM].getValue() == STATE_PLAY) {
playState = STATE_PLAY;
}
else if (params[PLAY_PARAM].getValue() == STATE_PLAY_ONCE) {
playState = STATE_PLAY_ONCE;
runIndex = 0;
reset = true;
}
}
// otherwise we are in play mode (and we've not just held onto the play switch),
// so check for stop or reset
else {

// top switch will stop
if (params[PLAY_PARAM].getValue() == STATE_PLAY) {
playState = STATE_STOPPED;
}
// bottom will reset
else if (params[PLAY_PARAM].getValue() == STATE_PLAY_ONCE) {
reset = true;
runIndex = 0;
}
}
}
}

int getGateMode() {

float gate;

if (inputs[GATE_MODE_INPUT].isConnected()) {
float gateCV = clamp(inputs[GATE_MODE_INPUT].getVoltage(), 0.f, 5.f) / 5.f;
float knobAttenuation = rescale(params[GATE_MODE_PARAM].getValue(), -1.f, 8.f, 0.f, 1.f);
// todo: check against hardware
gate = rescale(gateCV * knobAttenuation, 0.f, 1.f, -1.0f, 8.f);
}
else {
gate = params[GATE_MODE_PARAM].getValue();
}

if (quadraticGatesOnly) {
int quadraticGateIndex = int(floor(rescale(gate, -1.f, 8.f, 0.f, 4.99f)));
return possibleQuadraticGates[quadraticGateIndex];
}
else {
return clamp((int) roundf(gate), -1, 8);
}
}

json_t* dataToJson() override {
json_t* rootJ = json_object();
json_object_set_new(rootJ, "modeCOMIO", json_integer(modeCOMIO));
json_object_set_new(rootJ, "quadraticGatesOnly", json_boolean(quadraticGatesOnly));
json_object_set_new(rootJ, "allInNormalVoltage", json_integer(allInNormalVoltage));
json_object_set_new(rootJ, "mainClockMultDiv", json_integer(mainClockMultDiv.multDiv));
json_object_set_new(rootJ, "outputClockMultDiv", json_integer(outputClockMultDiv.multDiv));
json_object_set_new(rootJ, "playState", json_integer(playState));

return rootJ;
}

void dataFromJson(json_t* rootJ) override {
json_t* modeJ = json_object_get(rootJ, "modeCOMIO");
modeCOMIO = (Muxlicer::ModeCOMIO) json_integer_value(modeJ);

json_t* quadraticJ = json_object_get(rootJ, "quadraticGatesOnly");
quadraticGatesOnly = json_boolean_value(quadraticJ);

json_t* allInNormalVoltageJ = json_object_get(rootJ, "allInNormalVoltage");
allInNormalVoltage = json_integer_value(allInNormalVoltageJ);

json_t* mainClockMultDivJ = json_object_get(rootJ, "mainClockMultDiv");
mainClockMultDiv.multDiv = json_integer_value(mainClockMultDivJ);

json_t* outputClockMultDivJ = json_object_get(rootJ, "outputClockMultDiv");
outputClockMultDiv.multDiv = json_integer_value(outputClockMultDivJ);

json_t* playStateJ = json_object_get(rootJ, "playState");
playState = (PlayState) json_integer_value(playStateJ);
}

};


struct MuxlicerWidget : ModuleWidget {
MuxlicerWidget(Muxlicer* module) {

setModule(module);
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/Muxlicer.svg")));

addChild(createWidget<Knurlie>(Vec(RACK_GRID_WIDTH, 0)));
addChild(createWidget<Knurlie>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
addChild(createWidget<Knurlie>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
addChild(createWidget<Knurlie>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));

addParam(createParam<BefacoSwitchMomentary>(mm2px(Vec(35.72963, 10.008)), module, Muxlicer::PLAY_PARAM));
addParam(createParam<BefacoTinyKnobSnap>(mm2px(Vec(3.84112, 10.90256)), module, Muxlicer::ADDRESS_PARAM));
addParam(createParam<BefacoTinyKnobWhite>(mm2px(Vec(67.83258, 10.86635)), module, Muxlicer::GATE_MODE_PARAM));
addParam(createParam<BefacoButton>(mm2px(Vec(28.12238, 24.62151)), module, Muxlicer::TAP_TEMPO_PARAM));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(2.32728, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 0));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(12.45595, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 1));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(22.58462, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 2));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(32.7133, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 3));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(42.74195, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 4));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(52.97062, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 5));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(63.0993, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 6));
addParam(createParam<BefacoSlidePot>(mm2px(Vec(73.22797, 40.67102)), module, Muxlicer::LEVEL_PARAMS + 7));

addInput(createInput<BefacoInputPort>(mm2px(Vec(51.568, 11.20189)), module, Muxlicer::GATE_MODE_INPUT));
addInput(createInput<BefacoInputPort>(mm2px(Vec(21.13974, 11.23714)), module, Muxlicer::ADDRESS_INPUT));
addInput(createInput<BefacoInputPort>(mm2px(Vec(44.24461, 24.93662)), module, Muxlicer::CLOCK_INPUT));
addInput(createInput<BefacoInputPort>(mm2px(Vec(12.62135, 24.95776)), module, Muxlicer::RESET_INPUT));
addInput(createInput<BefacoInputPort>(mm2px(Vec(36.3142, 98.07911)), module, Muxlicer::COM_INPUT));
addInput(createInput<BefacoInputPort>(mm2px(Vec(0.895950, 109.27901)), module, Muxlicer::MUX_INPUTS + 0));
addInput(createInput<BefacoInputPort>(mm2px(Vec(11.05332, 109.29256)), module, Muxlicer::MUX_INPUTS + 1));
addInput(createInput<BefacoInputPort>(mm2px(Vec(21.18201, 109.29256)), module, Muxlicer::MUX_INPUTS + 2));
addInput(createInput<BefacoInputPort>(mm2px(Vec(31.27625, 109.27142)), module, Muxlicer::MUX_INPUTS + 3));
addInput(createInput<BefacoInputPort>(mm2px(Vec(41.40493, 109.27142)), module, Muxlicer::MUX_INPUTS + 4));
addInput(createInput<BefacoInputPort>(mm2px(Vec(51.53360, 109.27142)), module, Muxlicer::MUX_INPUTS + 5));
addInput(createInput<BefacoInputPort>(mm2px(Vec(61.69671, 109.29256)), module, Muxlicer::MUX_INPUTS + 6));
addInput(createInput<BefacoInputPort>(mm2px(Vec(71.82537, 109.29256)), module, Muxlicer::MUX_INPUTS + 7));
addInput(createInput<BefacoInputPort>(mm2px(Vec(16.11766, 98.09121)), module, Muxlicer::ALL_INPUT));

addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(59.8492, 24.95776)), module, Muxlicer::CLOCK_OUTPUT));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(56.59663, 98.06252)), module, Muxlicer::ALL_GATES_OUTPUT));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(66.72661, 98.07008)), module, Muxlicer::EOC_OUTPUT));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(0.89595, 86.78581)), module, Muxlicer::GATE_OUTPUTS + 0));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(11.02463, 86.77068)), module, Muxlicer::GATE_OUTPUTS + 1));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(21.14758, 86.77824)), module, Muxlicer::GATE_OUTPUTS + 2));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(31.27625, 86.77824)), module, Muxlicer::GATE_OUTPUTS + 3));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(41.40493, 86.77824)), module, Muxlicer::GATE_OUTPUTS + 4));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(51.56803, 86.79938)), module, Muxlicer::GATE_OUTPUTS + 5));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(61.69671, 86.79938)), module, Muxlicer::GATE_OUTPUTS + 6));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(71.79094, 86.77824)), module, Muxlicer::GATE_OUTPUTS + 7));

// these blocks are exclusive (for visibility / interactivity) and allows IO and OI within one module
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(0.895950, 109.27901)), module, Muxlicer::MUX_OUTPUTS + 0));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(11.05332, 109.29256)), module, Muxlicer::MUX_OUTPUTS + 1));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(21.18201, 109.29256)), module, Muxlicer::MUX_OUTPUTS + 2));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(31.27625, 109.27142)), module, Muxlicer::MUX_OUTPUTS + 3));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(41.40493, 109.27142)), module, Muxlicer::MUX_OUTPUTS + 4));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(51.53360, 109.27142)), module, Muxlicer::MUX_OUTPUTS + 5));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(61.69671, 109.29256)), module, Muxlicer::MUX_OUTPUTS + 6));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(71.82537, 109.29256)), module, Muxlicer::MUX_OUTPUTS + 7));
addOutput(createOutput<BefacoOutputPort>(mm2px(Vec(36.3142, 98.07911)), module, Muxlicer::COM_OUTPUT));

updatePortVisibilityForIOMode(Muxlicer::COM_1_IN_8_OUT);

addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(71.28361, 28.02644)), module, Muxlicer::CLOCK_LIGHT));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(3.99336, 81.86801)), module, Muxlicer::GATE_LIGHTS + 0));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(14.09146, 81.86801)), module, Muxlicer::GATE_LIGHTS + 1));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(24.22525, 81.86801)), module, Muxlicer::GATE_LIGHTS + 2));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(34.35901, 81.86801)), module, Muxlicer::GATE_LIGHTS + 3));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(44.49277, 81.86801)), module, Muxlicer::GATE_LIGHTS + 4));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(54.62652, 81.86801)), module, Muxlicer::GATE_LIGHTS + 5));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(64.76028, 81.86801)), module, Muxlicer::GATE_LIGHTS + 6));
addChild(createLight<SmallLight<RedLight>>(mm2px(Vec(74.89404, 81.86801)), module, Muxlicer::GATE_LIGHTS + 7));
}

void draw(const DrawArgs& args) override {
Muxlicer* module = dynamic_cast<Muxlicer*>(this->module);

if (module != nullptr) {
updatePortVisibilityForIOMode(module->modeCOMIO);
}
else {
// module can be null, e.g. if populating the module browser with screenshots,
// in which case just assume the default (1 in, 8 out)
updatePortVisibilityForIOMode(Muxlicer::COM_1_IN_8_OUT);
}

ModuleWidget::draw(args);
}

struct IOMenuItem : MenuItem {
Muxlicer* module;
MuxlicerWidget* widget;
void onAction(const event::Action& e) override {
module->modeCOMIO = Muxlicer::COM_1_IN_8_OUT;
widget->updatePortVisibilityForIOMode(module->modeCOMIO);
widget->clearCables();
}
};
struct OIMenuItem : MenuItem {
Muxlicer* module;
MuxlicerWidget* widget;
void onAction(const event::Action& e) override {
module->modeCOMIO = Muxlicer::COM_8_IN_1_OUT;
widget->updatePortVisibilityForIOMode(module->modeCOMIO);
widget->clearCables();
}
};

struct OutputRangeChildItem : MenuItem {
Muxlicer* module;
int allInNormalVoltage;
void onAction(const event::Action& e) override {
module->allInNormalVoltage = allInNormalVoltage;
}
};

struct OutputRangeItem : MenuItem {
Muxlicer* module;

Menu* createChildMenu() override {
Menu* menu = new Menu;

std::vector<int> voltageOptions = {1, 5, 10};
for (auto voltageOption : voltageOptions) {
OutputRangeChildItem* rangeItem = createMenuItem<OutputRangeChildItem>(std::to_string(voltageOption) + "V",
CHECKMARK(module->allInNormalVoltage == voltageOption));
rangeItem->allInNormalVoltage = voltageOption;
rangeItem->module = module;
menu->addChild(rangeItem);
}

return menu;
}
};

static std::vector<int> getClockOptions() {
return std::vector<int> {-16, -8, -4, -3, -2, 1, 2, 3, 4, 8, 16};
}

struct OutputClockScalingItem : MenuItem {
Muxlicer* module;

struct OutputClockScalingChildItem : MenuItem {
Muxlicer* module;
int clockOutMulDiv;
void onAction(const event::Action& e) override {
module->outputClockMultDiv.multDiv = clockOutMulDiv;
}
};

Menu* createChildMenu() override {
Menu* menu = new Menu;

for (auto clockOption : getClockOptions()) {
std::string optionString = (clockOption < 0) ? ("x 1/" + std::to_string(-clockOption)) : ("x " + std::to_string(clockOption));
OutputClockScalingChildItem* clockItem = createMenuItem<OutputClockScalingChildItem>(optionString,
CHECKMARK(module->outputClockMultDiv.multDiv == clockOption));
clockItem->clockOutMulDiv = clockOption;
clockItem->module = module;
menu->addChild(clockItem);
}

return menu;
}
};

struct MainClockScalingItem : MenuItem {
Muxlicer* module;

struct MainClockScalingChildItem : MenuItem {
Muxlicer* module;
int clockOutMulDiv;
void onAction(const event::Action& e) override {
module->mainClockMultDiv.multDiv = clockOutMulDiv;
}
};

Menu* createChildMenu() override {
Menu* menu = new Menu;

for (auto clockOption : getClockOptions()) {
std::string optionString = (clockOption < 0) ? ("x 1/" + std::to_string(-clockOption)) : ("x " + std::to_string(clockOption));
MainClockScalingChildItem* clockItem = createMenuItem<MainClockScalingChildItem>(optionString,
CHECKMARK(module->mainClockMultDiv.multDiv == clockOption));
clockItem->clockOutMulDiv = clockOption;
clockItem->module = module;
menu->addChild(clockItem);
}

return menu;
}
};

struct QuadraticGatesMenuItem : MenuItem {
Muxlicer* module;
void onAction(const event::Action& e) override {
module->quadraticGatesOnly ^= true;
}
};

void appendContextMenu(Menu* menu) override {
Muxlicer* module = dynamic_cast<Muxlicer*>(this->module);
assert(module);

menu->addChild(new MenuSeparator());
menu->addChild(createMenuLabel<MenuLabel>("Clock Multiplication/Division"));

MainClockScalingItem* mainClockScaleItem = createMenuItem<MainClockScalingItem>("Input clock", "â–¸");
mainClockScaleItem->module = module;
menu->addChild(mainClockScaleItem);

OutputClockScalingItem* outputClockScaleItem = createMenuItem<OutputClockScalingItem>("Output clock", "â–¸");
outputClockScaleItem->module = module;
menu->addChild(outputClockScaleItem);

menu->addChild(new MenuSeparator());

OutputRangeItem* outputRangeItem = createMenuItem<OutputRangeItem>("All In Normalled Value", "â–¸");
outputRangeItem->module = module;
menu->addChild(outputRangeItem);

QuadraticGatesMenuItem* quadraticGatesItem = createMenuItem<QuadraticGatesMenuItem>("Gate Mode: quadratic only", CHECKMARK(module->quadraticGatesOnly));
quadraticGatesItem->module = module;
menu->addChild(quadraticGatesItem);

menu->addChild(new MenuSeparator());
menu->addChild(createMenuLabel<MenuLabel>("Input/Output mode"));

IOMenuItem* ioItem = createMenuItem<IOMenuItem>("1 input â–¸ 8 outputs",
CHECKMARK(module->modeCOMIO == Muxlicer::COM_1_IN_8_OUT));
ioItem->module = module;
ioItem->widget = this;
menu->addChild(ioItem);

OIMenuItem* oiItem = createMenuItem<OIMenuItem>("8 inputs â–¸ 1 output",
CHECKMARK(module->modeCOMIO == Muxlicer::COM_8_IN_1_OUT));
oiItem->module = module;
oiItem->widget = this;
menu->addChild(oiItem);
}

void clearCables() {
for (int i = Muxlicer::MUX_OUTPUTS; i <= Muxlicer::MUX_OUTPUTS_LAST; ++i) {
APP->scene->rack->clearCablesOnPort(outputs[i]);
}
APP->scene->rack->clearCablesOnPort(inputs[Muxlicer::COM_INPUT]);

for (int i = Muxlicer::MUX_INPUTS; i <= Muxlicer::MUX_INPUTS_LAST; ++i) {
APP->scene->rack->clearCablesOnPort(inputs[i]);
}
APP->scene->rack->clearCablesOnPort(outputs[Muxlicer::COM_OUTPUT]);
}

// set ports visibility, either for 1 input -> 8 outputs or 8 inputs -> 1 output
void updatePortVisibilityForIOMode(Muxlicer::ModeCOMIO mode) {

bool visibleToggle = (mode == Muxlicer::COM_1_IN_8_OUT);

for (int i = Muxlicer::MUX_OUTPUTS; i <= Muxlicer::MUX_OUTPUTS_LAST; ++i) {
outputs[i]->visible = visibleToggle;
}
inputs[Muxlicer::COM_INPUT]->visible = visibleToggle;

for (int i = Muxlicer::MUX_INPUTS; i <= Muxlicer::MUX_INPUTS_LAST; ++i) {
inputs[i]->visible = !visibleToggle;
}
outputs[Muxlicer::COM_OUTPUT]->visible = !visibleToggle;
}


};


Model* modelMuxlicer = createModel<Muxlicer, MuxlicerWidget>("Muxlicer");


+ 8
- 3
src/SamplingModulator.cpp View File

@@ -77,6 +77,7 @@ struct SamplingModulator : Module {
int currentStep = 0;
StepState stepStates[numSteps];

dsp::PulseGenerator triggerGenerator;
dsp::SchmittTrigger holdDetector;
dsp::SchmittTrigger clock;
dsp::MinBlepGenerator<16, 32> squareMinBlep;
@@ -171,7 +172,7 @@ struct SamplingModulator : Module {
if (stepStates[currentStep] == STATE_ON) {
const float crossing = -(oldPhase + deltaPhase - 1.0) / deltaPhase;
triggMinBlep.insertDiscontinuity(crossing, +2.f);
triggerGenerator.trigger();
if (!holdDetector.isHigh()) {
float oldHeldValue = heldValue;
heldValue = inputs[IN_INPUT].getVoltage();
@@ -186,7 +187,6 @@ struct SamplingModulator : Module {
float square = (stepPhase < 0.5) ? 2.f : 0.f;
square += squareMinBlep.process();


float trigger = (stepPhase < 0.5 && stepStates[currentStep] == STATE_ON) ? 2.f : 0.f;
trigger += triggMinBlep.process();

@@ -199,7 +199,12 @@ struct SamplingModulator : Module {
}

outputs[CLOCK_OUTPUT].setVoltage(5.f * square);
outputs[TRIGG_OUTPUT].setVoltage(5.f * trigger);
if (params[INT_EXT_PARAM].getValue() == CLOCK_INTERNAL) {
outputs[TRIGG_OUTPUT].setVoltage(5.f * trigger);
}
else {
outputs[TRIGG_OUTPUT].setVoltage(10.f * triggerGenerator.process(args.sampleTime));
}

for (int i = 0; i < numSteps; i++) {
lights[STEP_LIGHT + i].setBrightness(currentStep == i);


+ 2
- 0
src/plugin.cpp View File

@@ -21,4 +21,6 @@ void init(rack::Plugin *p) {
p->addModel(modelMorphader);
p->addModel(modelADSR);
p->addModel(modelSTMix);
p->addModel(modelMuxlicer);
p->addModel(modelMex);
}

+ 34
- 0
src/plugin.hpp View File

@@ -21,6 +21,8 @@ extern Model* modelSamplingModulator;
extern Model* modelMorphader;
extern Model* modelADSR;
extern Model* modelSTMix;
extern Model* modelMuxlicer;
extern Model* modelMex;

struct Knurlie : SvgScrew {
Knurlie() {
@@ -108,6 +110,30 @@ struct Crossfader : app::SvgSlider {
}
};

struct BefacoButton : app::SvgSwitch {
BefacoButton() {
momentary = true;
addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/BefacoButton_0.svg")));
addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/BefacoButton_1.svg")));
}
};

struct BefacoSwitchHorizontal : app::SvgSwitch {
BefacoSwitchHorizontal() {
addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/BefacoSwitchHoriz_0.svg")));
addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/BefacoSwitchHoriz_1.svg")));
addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/BefacoSwitchHoriz_2.svg")));
}
};

struct BefacoTinyKnobSnap : BefacoTinyKnob {
BefacoTinyKnobSnap() {
snap = true;
minAngle = -0.80 * M_PI;
maxAngle = 0.80 * M_PI;
}
};

template <typename T>
T sin2pi_pade_05_5_4(T x) {
x -= 0.5f;
@@ -176,3 +202,11 @@ struct ADEnvelope {
private:
float envLinear = 0.f;
};

struct MexMessage {
int addressIndex = 0;
bool isPlaying = false;
float allGates = 0.f;
float outputClock = 0.f;
};


Loading…
Cancel
Save