@@ -203,6 +203,28 @@ | |||||
"Stereo", | "Stereo", | ||||
"Polyphonic" | "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; | int currentStep = 0; | ||||
StepState stepStates[numSteps]; | StepState stepStates[numSteps]; | ||||
dsp::PulseGenerator triggerGenerator; | |||||
dsp::SchmittTrigger holdDetector; | dsp::SchmittTrigger holdDetector; | ||||
dsp::SchmittTrigger clock; | dsp::SchmittTrigger clock; | ||||
dsp::MinBlepGenerator<16, 32> squareMinBlep; | dsp::MinBlepGenerator<16, 32> squareMinBlep; | ||||
@@ -171,7 +172,7 @@ struct SamplingModulator : Module { | |||||
if (stepStates[currentStep] == STATE_ON) { | if (stepStates[currentStep] == STATE_ON) { | ||||
const float crossing = -(oldPhase + deltaPhase - 1.0) / deltaPhase; | const float crossing = -(oldPhase + deltaPhase - 1.0) / deltaPhase; | ||||
triggMinBlep.insertDiscontinuity(crossing, +2.f); | triggMinBlep.insertDiscontinuity(crossing, +2.f); | ||||
triggerGenerator.trigger(); | |||||
if (!holdDetector.isHigh()) { | if (!holdDetector.isHigh()) { | ||||
float oldHeldValue = heldValue; | float oldHeldValue = heldValue; | ||||
heldValue = inputs[IN_INPUT].getVoltage(); | heldValue = inputs[IN_INPUT].getVoltage(); | ||||
@@ -186,7 +187,6 @@ struct SamplingModulator : Module { | |||||
float square = (stepPhase < 0.5) ? 2.f : 0.f; | float square = (stepPhase < 0.5) ? 2.f : 0.f; | ||||
square += squareMinBlep.process(); | square += squareMinBlep.process(); | ||||
float trigger = (stepPhase < 0.5 && stepStates[currentStep] == STATE_ON) ? 2.f : 0.f; | float trigger = (stepPhase < 0.5 && stepStates[currentStep] == STATE_ON) ? 2.f : 0.f; | ||||
trigger += triggMinBlep.process(); | trigger += triggMinBlep.process(); | ||||
@@ -199,7 +199,12 @@ struct SamplingModulator : Module { | |||||
} | } | ||||
outputs[CLOCK_OUTPUT].setVoltage(5.f * square); | 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++) { | for (int i = 0; i < numSteps; i++) { | ||||
lights[STEP_LIGHT + i].setBrightness(currentStep == i); | lights[STEP_LIGHT + i].setBrightness(currentStep == i); | ||||
@@ -21,4 +21,6 @@ void init(rack::Plugin *p) { | |||||
p->addModel(modelMorphader); | p->addModel(modelMorphader); | ||||
p->addModel(modelADSR); | p->addModel(modelADSR); | ||||
p->addModel(modelSTMix); | p->addModel(modelSTMix); | ||||
p->addModel(modelMuxlicer); | |||||
p->addModel(modelMex); | |||||
} | } |
@@ -21,6 +21,8 @@ extern Model* modelSamplingModulator; | |||||
extern Model* modelMorphader; | extern Model* modelMorphader; | ||||
extern Model* modelADSR; | extern Model* modelADSR; | ||||
extern Model* modelSTMix; | extern Model* modelSTMix; | ||||
extern Model* modelMuxlicer; | |||||
extern Model* modelMex; | |||||
struct Knurlie : SvgScrew { | struct Knurlie : SvgScrew { | ||||
Knurlie() { | 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> | template <typename T> | ||||
T sin2pi_pade_05_5_4(T x) { | T sin2pi_pade_05_5_4(T x) { | ||||
x -= 0.5f; | x -= 0.5f; | ||||
@@ -176,3 +202,11 @@ struct ADEnvelope { | |||||
private: | private: | ||||
float envLinear = 0.f; | float envLinear = 0.f; | ||||
}; | }; | ||||
struct MexMessage { | |||||
int addressIndex = 0; | |||||
bool isPlaying = false; | |||||
float allGates = 0.f; | |||||
float outputClock = 0.f; | |||||
}; | |||||