@@ -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" | |||
] | |||
} | |||
] | |||
} |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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"); |
@@ -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"); | |||
@@ -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); | |||
@@ -21,4 +21,6 @@ void init(rack::Plugin *p) { | |||
p->addModel(modelMorphader); | |||
p->addModel(modelADSR); | |||
p->addModel(modelSTMix); | |||
p->addModel(modelMuxlicer); | |||
p->addModel(modelMex); | |||
} |
@@ -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; | |||
}; | |||