Initial VST3 Support (disabled)
Disabled until Steinberg licensing compliance can be sorted out.
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 111 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,328 @@
|
||||
<?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"
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 123.64451 57.061291"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="vst.svg"
|
||||
width="123.64451"
|
||||
height="57.061291"
|
||||
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"><metadata
|
||||
id="metadata1016"><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><defs
|
||||
id="defs1014" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1019"
|
||||
id="namedview1012"
|
||||
showgrid="false"
|
||||
fit-margin-top="2"
|
||||
fit-margin-left="2"
|
||||
fit-margin-right="2"
|
||||
fit-margin-bottom="2"
|
||||
inkscape:zoom="7.3537604"
|
||||
inkscape:cx="51.146503"
|
||||
inkscape:cy="48.566934"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" />
|
||||
<style
|
||||
type="text/css"
|
||||
id="style849">
|
||||
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#030304;stroke:#FFFFFF;stroke-width:0.8877;stroke-miterlimit:10;}
|
||||
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
|
||||
.st2{fill:#030304;}
|
||||
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#030304;}
|
||||
.st4{fill:#FFFFFF;}
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
<path
|
||||
class="st3"
|
||||
d="m 72.920741,18.998501 h 36.199999 l 0.1,6.4 h -1.7 c -0.6,-2.2 -2.2,-3.7 -4.9,-4.4 -1.5,-0.4 -3.799999,-0.7 -6.799999,-0.7 v 16 c 0,1.1 0.4,1.6 1.1,1.9 0.8,0.4 2.4,0.4 4.799999,0.4 v 1.4 H 80.420741 v -1.4 c 2.3,0 3.9,-0.2 4.7,-0.5 0.8,-0.4 1.2,-0.7 1.2,-1.8 v -16 c -2.9,0 -5.2,0.3 -6.7,0.7 -2.9,0.8 -4.5,2.3 -4.9,4.4 -0.5,0 -1.7,0 -1.7,0 z"
|
||||
id="path879" />
|
||||
<g
|
||||
id="g885"
|
||||
transform="translate(3.6207414,-0.00149918)">
|
||||
<path
|
||||
class="st3"
|
||||
d="m 40.9,29.8 3.3,0.4 0.1,0.1 c 1.3,2.7 3.4,4.8 6.3,6 2.9,1.3 6.3,1.9 10.1,1.9 3.6,0 6.3,-0.4 7.8,-1.3 1.5,-0.8 2.2,-1.7 2.2,-2.6 0,-1 -0.8,-1.9 -2.3,-2.5 C 67.3,31.3 65.1,30.7 61.9,30 L 56.6,28.8 C 51.4,27.6 47.6,26.4 45.5,25.2 43.1,24 42,22.5 42,20.7 c 0,-1.9 1.5,-3.7 4.4,-5.4 2.9,-1.6 7.3,-2.4 13.2,-2.4 3,0 5.9,0.2 8.7,0.6 1.8,0.3 4.3,0.6 4.8,0.6 1.1,0 1.5,-0.2 1.7,-0.3 0.3,-0.2 0.6,-0.5 0.8,-0.9 l 0.1,-0.1 h 2.8 v 8.7 h -2.6 l -0.1,-0.1 c -1.1,-1.8 -3,-3.5 -5.7,-4.8 -2.7,-1.4 -6,-2 -9.8,-2 -2.7,0 -4.9,0.3 -6.4,1 -1.5,0.6 -2.2,1.4 -2.2,2.3 0,1.1 0.7,1.9 2.1,2.5 1.5,0.6 4.8,1.5 9.8,2.6 l 6.1,1.4 c 2.7,0.6 4.9,1.3 6.5,2.1 3.1,1.5 4.7,3.3 4.7,5.4 0,2 -1.7,3.9 -5,5.6 C 72.4,39.2 67.2,40 60,40 58.4,40 56.7,39.9 55,39.8 53.3,39.7 51.6,39.4 50,39.2 l -1.6,-0.3 c -0.4,0 -0.7,-0.1 -1,-0.1 -0.3,0 -0.6,-0.1 -0.9,-0.1 -0.8,0 -1.3,0.1 -1.6,0.3 -0.3,0.2 -0.5,0.5 -0.8,0.9 V 40 h -3.2 z"
|
||||
id="path881" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 78.1,13.1 v 8.2 h -2.3 c -1.1,-1.9 -3,-3.5 -5.7,-4.9 -2.7,-1.4 -6,-2.1 -9.9,-2.1 -2.8,0 -4.9,0.3 -6.5,1 -1.6,0.7 -2.4,1.5 -2.4,2.5 0,1.2 0.8,2.1 2.3,2.7 1.5,0.6 4.8,1.5 9.9,2.6 l 6.1,1.4 c 2.7,0.6 4.9,1.3 6.5,2.1 3,1.4 4.5,3.2 4.5,5.2 0,1.9 -1.6,3.7 -4.9,5.4 -3.2,1.7 -8.4,2.5 -15.5,2.5 -1.6,0 -3.3,-0.1 -5,-0.2 -1.7,-0.1 -3.3,-0.3 -5,-0.6 l -1.6,-0.3 c -0.4,0 -0.7,-0.1 -1.1,-0.1 -0.3,0 -0.6,-0.1 -0.9,-0.1 -0.8,0 -1.4,0.1 -1.7,0.3 -0.3,0.2 -0.6,0.5 -0.8,1 H 41.2 V 30 l 2.9,0.4 c 1.3,2.8 3.4,4.9 6.4,6.1 3,1.3 6.3,1.9 10.1,1.9 3.7,0 6.3,-0.4 7.9,-1.3 1.6,-0.9 2.3,-1.8 2.3,-2.8 0,-1.1 -0.8,-2 -2.5,-2.8 C 67.2,31 65,30.4 61.8,29.7 l -5.3,-1.2 c -5.2,-1.2 -8.9,-2.4 -11.1,-3.6 -2.1,-1.2 -3.2,-2.6 -3.2,-4.4 0,-1.8 1.4,-3.6 4.2,-5.2 2.9,-1.6 7.2,-2.4 13.1,-2.4 3,0 5.9,0.2 8.6,0.6 2.8,0.4 4.4,0.6 4.8,0.6 0.9,0 1.5,-0.1 1.9,-0.3 0.3,-0.2 0.6,-0.6 0.8,-1 h 2.5 m 0.4,-0.2 H 78 75.6 75.3 l -0.1,0.2 c -0.2,0.3 -0.4,0.6 -0.7,0.8 -0.1,0.1 -0.5,0.3 -1.6,0.3 -0.5,0 -3.7,-0.5 -4.7,-0.6 -2.8,-0.4 -5.7,-0.6 -8.7,-0.6 -5.9,0 -10.4,0.8 -13.3,2.5 -3,1.7 -4.5,3.5 -4.5,5.6 0,1.9 1.2,3.5 3.5,4.8 2.2,1.2 5.9,2.4 11.2,3.6 l 5.3,1.2 c 3.2,0.7 5.4,1.3 6.5,1.8 1.4,0.6 2.2,1.4 2.2,2.3 0,0.8 -0.7,1.6 -2.1,2.4 -1.5,0.8 -4.1,1.2 -7.7,1.2 -3.7,0 -7.1,-0.6 -10,-1.9 C 47.8,35 45.7,33 44.5,30.3 L 44.3,30 H 44 l -2.9,-0.4 -0.5,-0.1 v 0.5 9.7 0.5 h 0.5 2.9 0.3 L 44.4,40 c 0.2,-0.4 0.4,-0.6 0.7,-0.8 0.1,-0.1 0.5,-0.3 1.5,-0.3 0.2,0 0.5,0 0.8,0.1 0.3,0 0.7,0.1 1.1,0.1 l 1.6,0.3 c 1.6,0.3 3.3,0.5 5,0.6 1.7,0.1 3.4,0.2 5,0.2 7.2,0 12.5,-0.9 15.8,-2.6 3.4,-1.8 5.1,-3.7 5.1,-5.8 0,-2.2 -1.6,-4.1 -4.8,-5.6 -1.6,-0.8 -3.9,-1.5 -6.6,-2.1 l -6.1,-1.4 c -5,-1.1 -8.3,-2 -9.8,-2.6 -1.3,-0.5 -2,-1.3 -2,-2.2 0,-0.8 0.7,-1.5 2.1,-2.1 1.5,-0.7 3.7,-1 6.4,-1 3.8,0 7.1,0.7 9.7,2 2.7,1.3 4.5,2.9 5.6,4.7 l 0.1,0.2 h 0.3 2.3 0.5 V 21.2 13 12.6 Z"
|
||||
id="path883" />
|
||||
</g>
|
||||
<g
|
||||
id="g893"
|
||||
transform="translate(3.6207414,-0.00149918)">
|
||||
<g
|
||||
id="g891">
|
||||
<path
|
||||
class="st3"
|
||||
d="M 28.3,40.6 13.2,22.9 C 12.6,22.2 12,21.7 11.4,21.4 10.8,21.1 9.1,20.9 7.6,20.9 H 7.4 v -1.4 h 21 V 21 h -0.2 c -2.1,0.1 -3.4,0.1 -4.1,0.3 -0.7,0.1 -0.7,0.4 -0.7,0.7 0,0.1 0,0.3 0,0.4 0,0.1 0.1,0.2 0.2,0.3 l 8.8,10.8 h 0.1 l 7.6,-9.9 c 0.2,-0.2 0.3,-0.4 0.4,-0.6 0.3,-0.4 0.3,-0.7 0.3,-0.8 0,-0.3 -0.1,-0.7 -0.8,-0.8 -0.6,-0.1 -2,-0.2 -4,-0.3 H 35.8 V 19.6 H 49.6 V 21 h -0.2 c -1.5,0.1 -3.4,0.3 -4,0.6 -0.7,0.3 -1.3,0.9 -2,1.7 L 30.1,40.6 Z"
|
||||
id="path887" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 49.5,19.7 v 1 c -1.4,0.1 -3.4,0.3 -4.1,0.6 -0.7,0.3 -1.4,0.9 -2.1,1.8 L 30,40.4 H 28.4 L 13.3,22.7 C 12.7,22 12.1,21.5 11.4,21.2 10.8,20.9 8.9,20.7 7.5,20.6 v -1 H 28 v 1 c -2.1,0.1 -3.5,0.2 -4.1,0.3 -0.6,0.1 -0.9,0.4 -0.9,0.9 0,0.1 0,0.3 0.1,0.4 0.1,0.1 0.2,0.3 0.3,0.4 l 8.9,10.9 h 0.3 l 7.7,-9.9 c 0.2,-0.2 0.3,-0.4 0.5,-0.7 0.2,-0.4 0.3,-0.7 0.3,-0.9 0,-0.6 -0.3,-0.9 -1,-1 -0.6,-0.1 -2,-0.3 -4,-0.3 v -1 H 49.5 M 50,19.2 H 49.5 36.2 35.7 v 0.5 1 0.5 h 0.5 c 2,0.1 3.3,0.2 3.9,0.3 0.6,0.1 0.6,0.4 0.6,0.6 0,0.1 0,0.3 -0.3,0.7 -0.1,0.2 -0.3,0.4 -0.4,0.6 L 32.5,33 23.8,22.4 c -0.1,-0.1 -0.2,-0.2 -0.2,-0.3 0,-0.1 0,-0.2 0,-0.3 0,-0.1 0,-0.3 0.5,-0.4 0.6,-0.1 1.9,-0.2 4,-0.3 h 0.5 v -0.5 -1 -0.5 H 28.1 7.6 7.1 v 0.5 1 0.4 h 0.4 c 1.7,0.1 3.2,0.3 3.7,0.5 0.6,0.3 1.2,0.8 1.7,1.4 l 15.1,17.6 0.1,0.2 h 0.2 1.7 0.2 l 0.1,-0.2 13.4,-17.3 c 0.6,-0.8 1.3,-1.3 1.9,-1.6 0.5,-0.3 2.1,-0.5 3.9,-0.6 h 0.4 v -0.4 -1 -0.4 z"
|
||||
id="path889" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g1009"
|
||||
transform="translate(3.6207414,-0.00149918)">
|
||||
<path
|
||||
class="st4"
|
||||
d="m 14.1,87.1 h -0.5 l -1.2,-7.3 h 0.5 l 1,6.3 1.1,-6.3 h 0.5 z"
|
||||
id="path895" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 16.8,84.7 v 0.6 c 0,0.6 0,0.9 0.2,1.1 0.2,0.3 0.6,0.4 0.9,0.4 0.7,0 0.9,-0.5 0.9,-1.2 0,-0.8 -0.2,-1.1 -1.1,-2 -0.8,-0.8 -1.3,-1.3 -1.3,-2.3 0,-0.6 0.1,-1.6 1.4,-1.6 1.3,0 1.4,1 1.4,1.7 v 0.5 h -0.5 v -0.7 c 0,-0.4 0,-1.1 -0.9,-1.1 -0.6,0 -0.9,0.4 -0.9,1.1 0,0.7 0.1,1 1.2,2.1 0.8,0.8 1.1,1.2 1.1,2.1 0,0.7 -0.1,1.7 -1.5,1.7 -0.9,0 -1.5,-0.4 -1.5,-1.5 v -1 h 0.6 z"
|
||||
id="path897" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 21.7,80.2 v 6.9 H 21.2 V 80.2 H 19.9 V 79.7 H 23 v 0.5 z"
|
||||
id="path899" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 25.8,81.3 v -0.8 h 0.4 v 0.8 z m 0,5.8 v -5.2 h 0.4 v 5.2 z"
|
||||
id="path901" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 27.6,85.3 v 0.5 c 0,0.3 0,1 0.8,1 0.4,0 0.8,-0.2 0.8,-0.9 0,-0.5 -0.1,-0.7 -0.9,-1.3 -0.6,-0.5 -0.9,-0.8 -0.9,-1.6 0,-0.4 0.1,-1.1 1.1,-1.1 1.1,0 1.1,0.8 1.1,1.2 v 0.4 h -0.4 v -0.4 c 0,-0.6 -0.2,-0.8 -0.6,-0.8 -0.6,0 -0.7,0.4 -0.7,0.7 0,0.5 0,0.6 1,1.4 0.5,0.4 0.8,0.7 0.8,1.4 0,0.8 -0.3,1.3 -1.2,1.3 -1.1,0 -1.2,-0.6 -1.2,-1.5 v -0.4 h 0.3 z"
|
||||
id="path903" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 35.1,87.1 c -0.4,0 -0.6,-0.1 -0.7,-0.4 -0.2,0.1 -0.5,0.4 -1,0.4 -0.7,0 -1,-0.6 -1,-1.2 0,-1.5 1.4,-1.6 2,-2.2 V 83 c 0,-0.4 -0.1,-0.7 -0.6,-0.7 -0.5,0 -0.7,0.3 -0.7,1 v 0.3 h -0.4 v -0.3 c 0,-1 0.4,-1.4 1.2,-1.4 0.7,0 1.1,0.4 1.1,1.1 v 3.6 c 0,0.2 0.1,0.2 0.3,0.2 z m -0.7,-2.9 c -0.3,0.2 -0.6,0.3 -0.9,0.5 -0.5,0.3 -0.7,0.6 -0.7,1.2 0,0.2 0,0.8 0.7,0.8 0.4,0 0.7,-0.2 0.9,-0.5 z"
|
||||
id="path905" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 38.5,81.9 v 0.9 c 0.2,-0.6 0.7,-0.9 1.1,-1.1 v 0.6 c -0.1,0 -0.3,0.1 -0.4,0.2 -0.4,0.2 -0.6,0.8 -0.7,0.9 v 3.7 H 38 v -5.2 z"
|
||||
id="path907" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 42.6,85.9 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 v 1.3 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 v 0.6 z m -0.5,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path909" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 46,87.5 c 0,0.9 -0.6,1.3 -1.3,1.3 -0.4,0 -0.9,-0.1 -1,-0.5 C 43.6,88.2 43.6,88 43.6,87.7 H 44 c 0,0 0,0.2 0.1,0.4 0.2,0.3 0.6,0.3 0.6,0.3 0.1,0 0.8,-0.1 0.8,-0.8 v -0.9 c -0.1,0.1 -0.4,0.5 -0.9,0.5 -0.7,0 -1,-0.6 -1,-1.2 v -3 c 0,-0.9 0.5,-1.2 1.1,-1.2 0.5,0 0.8,0.3 0.9,0.5 V 81.9 H 46 Z M 45.6,83 c -0.1,-0.4 -0.4,-0.7 -0.8,-0.7 -0.6,0 -0.7,0.5 -0.7,0.9 v 2.6 c 0,0.7 0.3,0.9 0.7,0.9 0.3,0 0.7,-0.2 0.8,-0.8 z"
|
||||
id="path911" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 47.2,81.3 v -0.8 h 0.4 v 0.8 z m 0,5.8 v -5.2 h 0.4 v 5.2 z"
|
||||
id="path913" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 49,85.3 v 0.5 c 0,0.3 0,1 0.8,1 0.4,0 0.8,-0.2 0.8,-0.9 0,-0.5 -0.1,-0.7 -0.9,-1.3 -0.6,-0.5 -0.9,-0.8 -0.9,-1.6 0,-0.4 0.1,-1.1 1.1,-1.1 1.1,0 1.1,0.8 1.1,1.2 v 0.4 h -0.4 v -0.4 c 0,-0.6 -0.2,-0.8 -0.6,-0.8 -0.6,0 -0.7,0.4 -0.7,0.7 0,0.5 0,0.6 1,1.4 0.5,0.4 0.8,0.7 0.8,1.4 0,0.8 -0.3,1.3 -1.2,1.3 -1.1,0 -1.2,-0.6 -1.2,-1.5 V 85.2 H 49 Z"
|
||||
id="path915" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 51.5,81.9 h 0.6 v -1.4 h 0.4 v 1.4 h 0.8 v 0.4 h -0.8 v 4.1 c 0,0.3 0.3,0.3 0.4,0.3 0.1,0 0.3,0 0.4,0 v 0.4 c -0.2,0 -0.3,0 -0.5,0 -0.6,0 -0.8,-0.2 -0.8,-0.6 v -4.2 h -0.6 v -0.4 z"
|
||||
id="path917" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 56.3,85.9 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 v 1.3 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 v 0.6 z m -0.4,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path919" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 57.8,81.9 v 0.9 c 0.2,-0.6 0.7,-0.9 1.1,-1.1 v 0.6 c -0.1,0 -0.3,0.1 -0.4,0.2 -0.4,0.2 -0.6,0.8 -0.7,0.9 v 3.7 h -0.4 v -5.2 z"
|
||||
id="path921" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 62,85.9 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 v 1.3 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 V 85.3 H 62 Z m -0.5,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path923" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 65,87.1 v -0.6 c -0.1,0.2 -0.4,0.6 -1,0.6 -0.5,0 -1,-0.3 -1,-1.2 v -2.8 c 0,-0.9 0.5,-1.3 1.1,-1.3 0.6,0 0.8,0.4 0.9,0.5 v -2.6 h 0.4 V 87 H 65 Z m 0,-3.9 c -0.1,-0.5 -0.3,-0.9 -0.8,-0.9 -0.5,0 -0.7,0.4 -0.7,0.8 v 2.7 c 0,0.3 0.1,0.9 0.7,0.9 0.4,0 0.7,-0.4 0.8,-0.8 z"
|
||||
id="path925" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 68.2,81.9 h 0.6 v -1.4 h 0.4 v 1.4 H 70 v 0.4 h -0.8 v 4.1 c 0,0.3 0.3,0.3 0.4,0.3 0.1,0 0.3,0 0.4,0 v 0.4 c -0.2,0 -0.3,0 -0.5,0 -0.6,0 -0.8,-0.2 -0.8,-0.6 v -4.2 h -0.6 v -0.4 z"
|
||||
id="path927" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 71.1,81.9 v 0.9 c 0.2,-0.6 0.7,-0.9 1.1,-1.1 v 0.6 c -0.1,0 -0.3,0.1 -0.4,0.2 -0.4,0.2 -0.6,0.8 -0.7,0.9 v 3.7 h -0.4 v -5.2 z"
|
||||
id="path929" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 75.4,87.1 c -0.4,0 -0.6,-0.1 -0.7,-0.4 -0.2,0.1 -0.5,0.4 -1,0.4 -0.7,0 -1,-0.6 -1,-1.2 0,-1.5 1.4,-1.6 2,-2.2 V 83 c 0,-0.4 -0.1,-0.7 -0.6,-0.7 -0.5,0 -0.7,0.3 -0.7,1 v 0.3 H 73 v -0.3 c 0,-1 0.4,-1.4 1.2,-1.4 0.8,0 1.1,0.4 1.1,1.1 v 3.6 c 0,0.2 0.1,0.2 0.3,0.2 z m -0.7,-2.9 c -0.3,0.2 -0.6,0.3 -0.9,0.5 -0.5,0.3 -0.7,0.6 -0.7,1.2 0,0.2 0,0.8 0.7,0.8 0.4,0 0.7,-0.2 0.9,-0.5 z"
|
||||
id="path931" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 78.3,87.1 v -0.6 c -0.1,0.2 -0.4,0.6 -1,0.6 -0.5,0 -1,-0.3 -1,-1.2 v -2.8 c 0,-0.9 0.5,-1.3 1.1,-1.3 0.6,0 0.8,0.4 0.9,0.5 v -2.6 h 0.4 V 87 h -0.4 z m -0.1,-3.9 c -0.1,-0.5 -0.3,-0.9 -0.8,-0.9 -0.5,0 -0.7,0.4 -0.7,0.8 v 2.7 c 0,0.3 0.1,0.9 0.7,0.9 0.4,0 0.8,-0.4 0.8,-0.8 z"
|
||||
id="path933" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 82.2,85.9 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 v 1.3 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 v 0.6 z m -0.5,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path935" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 87.2,87.1 v -4 c 0,-0.5 -0.1,-0.9 -0.7,-0.9 -0.4,0 -0.7,0.3 -0.9,0.6 V 87 h -0.4 v -4 c 0,-0.5 -0.2,-0.7 -0.7,-0.7 -0.5,0 -0.8,0.4 -0.8,0.6 v 4.3 H 83.3 V 82 h 0.4 v 0.4 c 0.1,-0.2 0.5,-0.5 1,-0.5 0.6,0 0.8,0.4 0.9,0.6 0.1,-0.2 0.4,-0.6 1.1,-0.6 0.5,0 1,0.3 1,1.2 v 4.2 h -0.5 z"
|
||||
id="path937" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 91.2,87.1 c -0.4,0 -0.6,-0.1 -0.7,-0.4 -0.2,0.1 -0.5,0.4 -1,0.4 -0.7,0 -1,-0.6 -1,-1.2 0,-1.5 1.4,-1.6 2,-2.2 V 83 c 0,-0.4 -0.1,-0.7 -0.6,-0.7 -0.5,0 -0.7,0.3 -0.7,1 v 0.3 h -0.4 v -0.3 c 0,-1 0.4,-1.4 1.2,-1.4 0.7,0 1.1,0.4 1.1,1.1 v 3.6 c 0,0.2 0.1,0.2 0.3,0.2 z m -0.6,-2.9 c -0.3,0.2 -0.6,0.3 -0.9,0.5 -0.5,0.3 -0.7,0.6 -0.7,1.2 0,0.2 0,0.8 0.7,0.8 0.4,0 0.7,-0.2 0.9,-0.5 z"
|
||||
id="path939" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 92.6,81.9 v 0.9 c 0.2,-0.6 0.7,-0.9 1.1,-1.1 v 0.6 c -0.1,0 -0.3,0.1 -0.4,0.2 -0.4,0.2 -0.6,0.8 -0.7,0.9 v 3.7 h -0.4 v -5.2 z"
|
||||
id="path941" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 96.5,87.1 -1.1,-2.8 -0.5,0.8 V 87 h -0.4 v -7.3 h 0.4 v 4.6 l 1.5,-2.5 h 0.5 l -1.2,2 1.3,3.2 h -0.5 z"
|
||||
id="path943" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 102.1,85.7 c 0,1 -0.6,1.4 -1.2,1.4 -0.7,0 -1.2,-0.4 -1.2,-1.1 v -2.9 c 0,-0.6 0.3,-1.3 1.3,-1.3 0.8,0 1.2,0.5 1.2,1.3 v 2.6 z m -0.4,-2.5 c 0,-0.4 -0.1,-0.9 -0.7,-0.9 -0.7,0 -0.8,0.5 -0.8,1 v 2.6 c 0,0.6 0.3,0.8 0.8,0.8 0.7,0 0.8,-0.6 0.8,-0.9 v -2.6 z"
|
||||
id="path945" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 102.8,81.9 h 0.6 v -1.3 c 0,-0.4 0.2,-0.8 0.9,-0.8 0.1,0 0.2,0 0.3,0 v 0.4 c 0,0 -0.1,0 -0.2,0 -0.3,0 -0.6,0.1 -0.6,0.6 v 1.1 h 0.6 v 0.4 h -0.7 v 4.8 h -0.4 v -4.8 h -0.6 v -0.4 z"
|
||||
id="path947" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 6.9,96.7 v 0.6 c 0,0.6 0,0.9 0.2,1.1 0.2,0.3 0.6,0.4 0.9,0.4 0.7,0 0.9,-0.5 0.9,-1.2 0,-0.8 -0.2,-1.1 -1.1,-2 C 7,94.8 6.5,94.3 6.5,93.3 c 0,-0.6 0.1,-1.6 1.4,-1.6 1.3,0 1.4,1 1.4,1.7 v 0.5 H 8.8 v -0.7 c 0,-0.4 0,-1.1 -0.9,-1.1 -0.6,0 -0.9,0.4 -0.9,1.1 0,0.7 0.1,1 1.2,2.1 0.8,0.8 1.1,1.2 1.1,2.1 0,0.7 -0.1,1.7 -1.5,1.7 -0.9,0 -1.5,-0.4 -1.5,-1.5 v -1 h 0.6 z"
|
||||
id="path949" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 9.9,93.9 h 0.6 v -1.4 h 0.4 v 1.4 h 0.8 v 0.4 h -0.8 v 4.1 c 0,0.3 0.3,0.3 0.4,0.3 0.1,0 0.3,0 0.4,0 v 0.4 c -0.2,0 -0.3,0 -0.5,0 -0.6,0 -0.8,-0.2 -0.8,-0.6 V 94.3 H 9.9 Z"
|
||||
id="path951" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 14.7,98 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 V 98 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 V 98 Z m -0.5,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path953" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 15.7,93.3 v -0.8 h 0.4 v 0.8 z m 0,5.9 V 94 h 0.4 v 5.2 z"
|
||||
id="path955" />
|
||||
<path
|
||||
class="st4"
|
||||
d="M 19.3,99.2 V 95 c 0,-0.4 -0.1,-0.8 -0.6,-0.8 -0.4,0 -0.7,0.2 -0.9,0.7 v 4.3 H 17.4 V 94 h 0.4 v 0.5 c 0.3,-0.5 0.8,-0.6 1,-0.6 0.4,0 1,0.2 1,1.1 v 4.2 z"
|
||||
id="path957" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 20.9,91.8 h 0.4 v 2.6 c 0.3,-0.4 0.7,-0.5 1,-0.5 0.9,0 1,0.8 1,1.3 v 2.7 c 0,0.5 -0.3,1.2 -1.1,1.2 -0.1,0 -0.6,0 -0.8,-0.5 V 99 h -0.5 z m 0.5,5.9 c 0,0.9 0.6,1 0.8,1 0.5,0 0.7,-0.4 0.7,-1 v -2.6 c 0,-0.2 0,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 z"
|
||||
id="path959" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 26.8,98 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 V 98 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 V 98 Z m -0.5,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path961" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 28.3,93.9 v 0.9 c 0.2,-0.6 0.7,-0.9 1.1,-1.1 v 0.6 c -0.1,0 -0.3,0.1 -0.4,0.2 -0.4,0.2 -0.6,0.8 -0.7,0.9 v 3.7 h -0.4 v -5.2 z"
|
||||
id="path963" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 32.5,99.5 c 0,0.9 -0.6,1.3 -1.3,1.3 -0.4,0 -0.9,-0.1 -1,-0.5 -0.1,-0.1 -0.1,-0.3 -0.1,-0.6 h 0.4 c 0,0 0,0.2 0.1,0.4 0.2,0.3 0.6,0.3 0.6,0.3 0.1,0 0.8,-0.1 0.8,-0.8 v -0.9 c -0.1,0.1 -0.4,0.5 -0.9,0.5 -0.7,0 -1,-0.6 -1,-1.2 v -2.9 c 0,-0.9 0.5,-1.2 1.1,-1.2 0.5,0 0.8,0.3 0.9,0.5 V 94 h 0.4 z M 32,95 c -0.1,-0.4 -0.4,-0.7 -0.8,-0.7 -0.6,0 -0.7,0.5 -0.7,0.9 v 2.6 c 0,0.7 0.3,0.9 0.7,0.9 0.3,0 0.7,-0.2 0.8,-0.8 z"
|
||||
id="path965" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 39.3,99.2 c 0,-0.5 0,-5.1 0,-6.8 L 38,99.2 h -0.5 l -1.3,-6.8 v 6.8 h -0.5 c 0,-0.5 0.1,-7.3 0.1,-7.3 h 0.7 l 1.2,6.3 1.2,-6.3 h 0.7 c 0,0.8 0.1,7.3 0.1,7.3 z"
|
||||
id="path967" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 43.3,98 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 V 98 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 V 98 Z m -0.4,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path969" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 46.3,99.2 v -0.6 c -0.1,0.2 -0.4,0.6 -1,0.6 -0.5,0 -1,-0.3 -1,-1.2 v -2.8 c 0,-0.9 0.5,-1.3 1.1,-1.3 0.6,0 0.8,0.4 0.9,0.5 v -2.6 h 0.4 v 7.3 h -0.4 z m 0,-3.9 c -0.1,-0.5 -0.3,-0.9 -0.8,-0.9 -0.5,0 -0.7,0.4 -0.7,0.8 v 2.7 c 0,0.3 0.1,0.9 0.7,0.9 0.4,0 0.7,-0.4 0.8,-0.8 z"
|
||||
id="path971" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 48,93.3 v -0.8 h 0.4 v 0.8 z m 0,5.9 V 94 h 0.4 v 5.2 z"
|
||||
id="path973" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 52,99.2 c -0.4,0 -0.6,-0.1 -0.7,-0.4 -0.2,0.1 -0.5,0.4 -1,0.4 -0.7,0 -1,-0.6 -1,-1.2 0,-1.5 1.4,-1.6 2,-2.2 V 95 c 0,-0.4 -0.1,-0.7 -0.6,-0.7 -0.5,0 -0.7,0.3 -0.7,1 v 0.3 h -0.4 v -0.3 c 0,-1 0.4,-1.4 1.2,-1.4 0.7,0 1.1,0.4 1.1,1.1 v 3.6 c 0,0.2 0.1,0.2 0.3,0.2 z m -0.6,-3 c -0.3,0.2 -0.6,0.3 -0.9,0.5 -0.5,0.3 -0.7,0.6 -0.7,1.2 0,0.2 0,0.8 0.7,0.8 0.4,0 0.7,-0.2 0.9,-0.5 z"
|
||||
id="path975" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 56.3,92.3 v 6.9 h -0.5 v -6.9 h -1.3 v -0.5 h 3.1 v 0.5 z"
|
||||
id="path977" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 60,98 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 H 58 V 98 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 V 97.4 H 60 Z m -0.4,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path979" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 63.5,97.8 c 0,0.8 -0.3,1.4 -1.3,1.4 -0.9,0 -1.2,-0.7 -1.2,-1.3 v -2.6 c 0,-1 0.5,-1.3 1.2,-1.3 0.8,0 1.2,0.5 1.2,1.4 v 0.5 H 63 v -0.4 c 0,-0.5 -0.1,-1.1 -0.8,-1.1 -0.7,0 -0.8,0.6 -0.8,1 v 2.3 c 0,0.5 0,1.2 0.8,1.2 0.6,0 0.7,-0.5 0.7,-0.9 v -0.8 h 0.5 v 0.6 z"
|
||||
id="path981" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 66.4,99.2 v -3.9 c 0,-0.5 -0.1,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.7 v 4.2 H 64.5 V 92 h 0.4 v 2.5 C 65,94.4 65.3,94 65.8,94 c 0.4,0 1,0.2 1,1.1 v 4.2 h -0.4 z"
|
||||
id="path983" />
|
||||
<path
|
||||
class="st4"
|
||||
d="M 70,99.2 V 95 c 0,-0.4 -0.1,-0.8 -0.6,-0.8 -0.4,0 -0.7,0.2 -0.9,0.7 v 4.3 H 68 V 94 h 0.4 v 0.5 c 0.3,-0.5 0.8,-0.6 1,-0.6 0.4,0 1,0.2 1,1.1 v 4.2 z"
|
||||
id="path985" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 74,97.8 c 0,1 -0.6,1.4 -1.2,1.4 -0.7,0 -1.2,-0.4 -1.2,-1.1 v -2.9 c 0,-0.6 0.3,-1.3 1.3,-1.3 0.8,0 1.2,0.5 1.2,1.3 v 2.6 z m -0.5,-2.6 c 0,-0.4 -0.1,-0.9 -0.7,-0.9 -0.7,0 -0.8,0.5 -0.8,1 v 2.6 c 0,0.6 0.3,0.8 0.8,0.8 0.7,0 0.8,-0.6 0.8,-0.9 v -2.6 z"
|
||||
id="path987" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 75,99.2 v -7.3 h 0.4 v 7.3 z"
|
||||
id="path989" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 79.1,97.8 c 0,1 -0.6,1.4 -1.2,1.4 -0.7,0 -1.2,-0.4 -1.2,-1.1 v -2.9 c 0,-0.6 0.3,-1.3 1.3,-1.3 0.8,0 1.2,0.5 1.2,1.3 v 2.6 z m -0.5,-2.6 c 0,-0.4 -0.1,-0.9 -0.7,-0.9 -0.7,0 -0.8,0.5 -0.8,1 v 2.6 c 0,0.6 0.3,0.8 0.8,0.8 0.7,0 0.8,-0.6 0.8,-0.9 v -2.6 z"
|
||||
id="path991" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 82.6,99.5 c 0,0.9 -0.6,1.3 -1.3,1.3 -0.4,0 -0.9,-0.1 -1,-0.5 -0.1,-0.1 -0.1,-0.3 -0.1,-0.6 h 0.4 c 0,0 0,0.2 0.1,0.4 0.2,0.3 0.6,0.3 0.6,0.3 0.1,0 0.8,-0.1 0.8,-0.8 v -0.9 c -0.1,0.1 -0.4,0.5 -0.9,0.5 -0.8,0 -1,-0.6 -1,-1.2 v -2.9 c 0,-0.9 0.5,-1.2 1.1,-1.2 0.5,0 0.8,0.3 0.9,0.5 V 94 h 0.4 z M 82.2,95 c -0.1,-0.4 -0.4,-0.7 -0.8,-0.7 -0.6,0 -0.7,0.5 -0.7,0.9 v 2.6 c 0,0.7 0.3,0.9 0.7,0.9 0.3,0 0.7,-0.2 0.8,-0.8 z"
|
||||
id="path993" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 83.8,93.3 v -0.8 h 0.4 v 0.8 z m 0,5.9 V 94 h 0.4 v 5.2 z"
|
||||
id="path995" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 87.7,98 c 0,0.6 -0.3,1.2 -1.2,1.2 -0.7,0 -1.2,-0.4 -1.2,-1.2 v -2.8 c 0,-0.6 0.3,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.4 v 1.3 h -2 V 98 c 0,0.3 0.1,0.9 0.7,0.9 0.7,0 0.8,-0.6 0.8,-1.1 v -0.4 h 0.4 V 98 Z m -0.4,-2.8 c 0,-0.6 -0.3,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 v 1 h 1.5 z"
|
||||
id="path997" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 89,97.3 v 0.5 c 0,0.3 0,1 0.8,1 0.4,0 0.8,-0.2 0.8,-0.9 0,-0.5 -0.1,-0.7 -0.9,-1.3 -0.6,-0.5 -0.9,-0.8 -0.9,-1.6 0,-0.4 0.1,-1.1 1.1,-1.1 1.1,0 1.1,0.8 1.1,1.2 v 0.4 h -0.4 v -0.4 c 0,-0.6 -0.2,-0.8 -0.6,-0.8 -0.6,0 -0.7,0.4 -0.7,0.7 0,0.5 0,0.6 1,1.4 0.5,0.4 0.8,0.7 0.8,1.4 0,0.8 -0.3,1.3 -1.2,1.3 -1.1,0 -1.2,-0.6 -1.2,-1.5 V 97.2 H 89 Z"
|
||||
id="path999" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 96.6,99.2 v -0.6 c -0.1,0.2 -0.5,0.7 -1.2,0.7 -0.4,0 -0.9,-0.2 -1.1,-0.6 C 94.1,98.3 94,98 94,97.3 v -3.9 c 0,-1 0.4,-1.6 1.5,-1.6 1.1,0 1.4,0.7 1.4,1.3 v 1.1 h -0.5 v -0.9 c 0,-0.6 -0.1,-1.1 -1,-1.1 -0.8,0 -1,0.6 -1,1.2 v 3.8 c 0,0.6 0,0.9 0.1,1.2 0.1,0.2 0.3,0.5 0.8,0.5 0.7,0 1,-0.8 1,-1.2 V 96.4 H 95.2 V 96 H 97 v 3.4 h -0.4 z"
|
||||
id="path1001" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 102.1,99.2 v -4 c 0,-0.5 -0.1,-0.9 -0.7,-0.9 -0.4,0 -0.7,0.3 -0.9,0.6 v 4.2 h -0.4 V 95 c 0,-0.5 -0.2,-0.7 -0.7,-0.7 -0.5,0 -0.8,0.4 -0.8,0.6 v 4.3 H 98.2 V 94 h 0.4 v 0.4 c 0.1,-0.2 0.5,-0.5 1,-0.5 0.6,0 0.8,0.4 0.9,0.6 0.1,-0.2 0.4,-0.6 1.1,-0.6 0.5,0 1,0.3 1,1.2 v 4.2 h -0.5 z"
|
||||
id="path1003" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 103.7,91.8 h 0.4 v 2.6 c 0.3,-0.4 0.7,-0.5 1,-0.5 0.9,0 1,0.8 1,1.3 v 2.7 c 0,0.5 -0.3,1.2 -1.1,1.2 -0.1,0 -0.6,0 -0.8,-0.5 V 99 h -0.5 z m 0.5,5.9 c 0,0.9 0.6,1 0.8,1 0.5,0 0.7,-0.4 0.7,-1 v -2.6 c 0,-0.2 0,-0.9 -0.7,-0.9 -0.5,0 -0.8,0.4 -0.8,0.9 z"
|
||||
id="path1005" />
|
||||
<path
|
||||
class="st4"
|
||||
d="m 109.6,99.2 v -3.4 h -1.8 v 3.4 h -0.5 v -7 h 0.5 v 3.1 h 1.8 v -3.1 h 0.5 v 7 z"
|
||||
id="path1007" />
|
||||
</g>
|
||||
<rect
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect1018"
|
||||
width="115.64451"
|
||||
height="49.061291"
|
||||
x="4"
|
||||
y="4" /></svg>
|
||||
|
After Width: | Height: | Size: 22 KiB |
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"socket_server_port": 80,
|
||||
"socket_server_port": 8080,
|
||||
"socket_server_address": "*",
|
||||
"debug": true,
|
||||
"max_upload_size": 1048576,
|
||||
|
||||
@@ -228,6 +228,7 @@ export const LoadPluginDialog =
|
||||
let gridWidth = width - this.margin_reserve;
|
||||
let columns = Math.floor((gridWidth) / this.nominal_column_width);
|
||||
if (columns < 1) columns = 1;
|
||||
if (columns > 3) columns = 3;
|
||||
return columns;
|
||||
}
|
||||
|
||||
@@ -388,6 +389,14 @@ export const LoadPluginDialog =
|
||||
// let selectedUri = this.state.selected_uri;
|
||||
}
|
||||
|
||||
vst3_indicator(uiPlugin? : UiPlugin)
|
||||
{
|
||||
if (uiPlugin?.is_vst3)
|
||||
{
|
||||
return (<img alt="vst" src="/img/vst.svg" style={{marginLeft: 8,height: 22, opacity: 0.6,position: "relative",top: -1}} />)
|
||||
}
|
||||
return null;
|
||||
}
|
||||
stereo_indicator(uiPlugin?: UiPlugin): string {
|
||||
if (!uiPlugin) return "";
|
||||
if (uiPlugin.audio_inputs === 2 || uiPlugin.audio_outputs === 2) {
|
||||
@@ -436,7 +445,13 @@ export const LoadPluginDialog =
|
||||
for (let i = 0; i < plugins.length; ++i) {
|
||||
let plugin = plugins[i];
|
||||
if (filterType === PluginType.Plugin || rootClass.is_type_of(filterType, plugin.plugin_type)) {
|
||||
let score = searchFilter.score(plugin.name, plugin.plugin_display_type, plugin.author_name);
|
||||
let score:number = 0;
|
||||
if (plugin.is_vst3)
|
||||
{
|
||||
score = searchFilter.score(plugin.name, plugin.plugin_display_type, plugin.author_name,"vst3");
|
||||
} else {
|
||||
score = searchFilter.score(plugin.name, plugin.plugin_display_type, plugin.author_name);
|
||||
}
|
||||
|
||||
if (score !== 0) {
|
||||
if (this.state.favoritesList[plugin.uri]) {
|
||||
@@ -668,8 +683,9 @@ export const LoadPluginDialog =
|
||||
<div style={{ display: "flex", justifyContent: "start", alignItems: "center", flex: "1 1 auto", height: "100%", overflow: "hidden" }} >
|
||||
<PluginInfoDialog plugin_uri={this.state.selected_uri ?? ""} />
|
||||
<Typography display='block' variant='body2' color="textPrimary" noWrap >
|
||||
{this.info_string(selectedPlugin)}
|
||||
{this.info_string(selectedPlugin)}
|
||||
</Typography>
|
||||
{this.vst3_indicator(selectedPlugin)}
|
||||
<div style={{
|
||||
color: isFavorite ? "#F80" : "#CCC", display: (this.state.selected_uri !== "" ? "block" : "none"),
|
||||
position: "relative", top: -2
|
||||
|
||||
+26
-2
@@ -45,6 +45,8 @@ export class Port implements Deserializable<Port> {
|
||||
this.supports_time_position = input.supports_time_position;
|
||||
this.port_group = input.port_group;
|
||||
this.comment = input.comment;
|
||||
this.is_bypass = input.is_bypass;
|
||||
this.is_program_controller = input.is_program_controller;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -75,12 +77,17 @@ export class Port implements Deserializable<Port> {
|
||||
supports_time_position: boolean = false;
|
||||
port_group: string = "";
|
||||
comment: string = "";
|
||||
is_bypass: boolean = false;
|
||||
is_program_controller: boolean = false;
|
||||
}
|
||||
|
||||
export class PortGroup {
|
||||
deserialize(input: any): PortGroup {
|
||||
this.symbol = input.symbol;
|
||||
this.name = input.name;
|
||||
this.parent_group = input.parent_group;
|
||||
this.program_list_id = input.program_list_id ?? -1;
|
||||
|
||||
return this;
|
||||
}
|
||||
static deserialize_array(input: any) : PortGroup[] {
|
||||
@@ -94,6 +101,8 @@ export class PortGroup {
|
||||
|
||||
symbol: string = "";
|
||||
name: string = "";
|
||||
parent_group: string = "";
|
||||
program_list_id: number = -1;
|
||||
};
|
||||
|
||||
export class Lv2Plugin implements Deserializable<Lv2Plugin> {
|
||||
@@ -223,10 +232,19 @@ export class UiControl implements Deserializable<UiControl> {
|
||||
this.scale_points = ScalePoint.deserialize_array(input.scale_points);
|
||||
this.port_group = input.port_group;
|
||||
this.units = input.units as Units;
|
||||
this.comment = input.comment;
|
||||
|
||||
this.comment = input.comment ?? "";
|
||||
this.is_bypass = input.is_bypass ? true: false;
|
||||
this.is_program_controller = input.is_program_controller? true: false;
|
||||
this.custom_units = input.custom_units ?? "";
|
||||
|
||||
this.controlType = ControlType.Dial;
|
||||
|
||||
if (this.is_bypass)
|
||||
{
|
||||
this.not_on_gui = true;
|
||||
}
|
||||
|
||||
|
||||
if (this.enumeration_property && this.scale_points.length === 2)
|
||||
{
|
||||
@@ -234,7 +252,7 @@ export class UiControl implements Deserializable<UiControl> {
|
||||
} else {
|
||||
if (this.min_value === 0 && this.max_value === 1)
|
||||
{
|
||||
if (this.toggled_property || this.integer_property)
|
||||
if (this.toggled_property || this.integer_property || this.range_steps === 2)
|
||||
{
|
||||
this.controlType = ControlType.OnOffSwitch;
|
||||
}
|
||||
@@ -276,6 +294,10 @@ export class UiControl implements Deserializable<UiControl> {
|
||||
port_group: string = "";
|
||||
units: Units = Units.none;
|
||||
comment: string = "";
|
||||
is_bypass: boolean = true;
|
||||
is_program_controller: boolean = true;
|
||||
custom_units: string = "";
|
||||
|
||||
|
||||
// Return the value of the closest scale_point.
|
||||
clampSelectValue(value: number): number{
|
||||
@@ -452,6 +474,7 @@ export class UiPlugin implements Deserializable<UiPlugin> {
|
||||
this.description = input.description;
|
||||
this.controls = UiControl.deserialize_array(input.controls);
|
||||
this.port_groups = PortGroup.deserialize_array(input.port_groups);
|
||||
this.is_vst3 = input.is_vst3;
|
||||
return this;
|
||||
|
||||
}
|
||||
@@ -501,5 +524,6 @@ export class UiPlugin implements Deserializable<UiPlugin> {
|
||||
description: string = "";
|
||||
controls: UiControl[] = [];
|
||||
port_groups: PortGroup[] = [];
|
||||
is_vst3 : boolean = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ export class PedalBoardItem implements Deserializable<PedalBoardItem> {
|
||||
this.midiBindings = MidiBinding.deserialize_array(input.midiBindings);
|
||||
|
||||
this.controlValues = ControlValue.deserializeArray(input.controlValues);
|
||||
this.vstState = input.vstState ?? "";
|
||||
return this;
|
||||
}
|
||||
deserialize(input: any): PedalBoardItem {
|
||||
@@ -183,6 +184,7 @@ export class PedalBoardItem implements Deserializable<PedalBoardItem> {
|
||||
pluginName?: string;
|
||||
controlValues: ControlValue[] = ControlValue.EmptyArray;
|
||||
midiBindings: MidiBinding[] = [];
|
||||
vstState: string = "";
|
||||
};
|
||||
|
||||
|
||||
|
||||
+115
-97
@@ -62,6 +62,12 @@ const EMPTY_ICON_URL = "img/fx_empty.svg";
|
||||
const ERROR_ICON_URL = "img/fx_error.svg";
|
||||
const TERMINAL_ICON_URL = "img/fx_terminal.svg";
|
||||
|
||||
function CalculateConnection(numberOfInputs: number, numberOfOutputs: number)
|
||||
{
|
||||
let result = Math.min(numberOfInputs, numberOfOutputs);
|
||||
if (result > 2) result = 2;
|
||||
return result;
|
||||
}
|
||||
|
||||
const pedalBoardStyles = (theme: Theme) => createStyles({
|
||||
scrollContainer: {
|
||||
@@ -210,10 +216,9 @@ class PedalLayout {
|
||||
|
||||
bounds: Rect = new Rect();
|
||||
|
||||
inputs: number = 0;
|
||||
outputs: number = 0;
|
||||
stereoInput: boolean = false;
|
||||
stereoOutput: boolean = false;
|
||||
numberOfInputs: number = 2;
|
||||
numberOfOutputs: number = 2;
|
||||
|
||||
pedalItem?: PedalBoardItem;
|
||||
|
||||
// Split Layout only.
|
||||
@@ -227,8 +232,8 @@ class PedalLayout {
|
||||
let t: PedalLayout = new PedalLayout();
|
||||
t.uri = START_PEDALBOARD_ITEM_URI;
|
||||
t.iconUrl = TERMINAL_ICON_URL;
|
||||
t.inputs = 0;
|
||||
t.outputs = 1;
|
||||
t.numberOfInputs = 0;
|
||||
t.numberOfOutputs = 2;
|
||||
return t;
|
||||
}
|
||||
static End(): PedalLayout {
|
||||
@@ -236,8 +241,8 @@ class PedalLayout {
|
||||
t.pluginType = PluginType.UtilityPlugin;
|
||||
t.uri = END_PEDALBOARD_ITEM_URI;
|
||||
t.iconUrl = TERMINAL_ICON_URL;
|
||||
t.inputs = 2;
|
||||
t.outputs = 0;
|
||||
t.numberOfInputs = 2;
|
||||
t.numberOfOutputs = 0;
|
||||
return t;
|
||||
}
|
||||
constructor(model?: PiPedalModel, pedalItem?: PedalBoardItem) {
|
||||
@@ -256,27 +261,27 @@ class PedalLayout {
|
||||
this.topChildren = makeChain(model, splitter.topChain);
|
||||
this.bottomChildren = makeChain(model, splitter.bottomChain);
|
||||
|
||||
this.inputs = 2;
|
||||
this.outputs = 2;
|
||||
this.numberOfInputs = 2;
|
||||
this.numberOfOutputs = 2;
|
||||
|
||||
} else if (pedalItem.isEmpty()) {
|
||||
|
||||
this.pluginType = PluginType.UtilityPlugin;
|
||||
this.iconUrl = EMPTY_ICON_URL;
|
||||
this.inputs = 2;
|
||||
this.outputs = 2;
|
||||
this.numberOfInputs = 2;
|
||||
this.numberOfOutputs = 2;
|
||||
|
||||
} else if (pedalItem.uri === START_PEDALBOARD_ITEM_URI) {
|
||||
this.pluginType = PluginType.UtilityPlugin;
|
||||
this.iconUrl = TERMINAL_ICON_URL;
|
||||
this.inputs = 0;
|
||||
this.outputs = PiPedalModelFactory.getInstance().jackSettings.get().inputAudioPorts.length;
|
||||
this.numberOfInputs = 0;
|
||||
this.numberOfOutputs = PiPedalModelFactory.getInstance().jackSettings.get().inputAudioPorts.length;
|
||||
|
||||
} else if (pedalItem.uri === END_PEDALBOARD_ITEM_URI) {
|
||||
this.pluginType = PluginType.UtilityPlugin;
|
||||
this.iconUrl = TERMINAL_ICON_URL;
|
||||
this.inputs = PiPedalModelFactory.getInstance().jackSettings.get().outputAudioPorts.length;
|
||||
this.outputs = 0;
|
||||
this.numberOfInputs = PiPedalModelFactory.getInstance().jackSettings.get().outputAudioPorts.length;
|
||||
this.numberOfOutputs = 0;
|
||||
}
|
||||
else {
|
||||
let uiPlugin = model.getUiPlugin(pedalItem.uri);
|
||||
@@ -284,15 +289,15 @@ class PedalLayout {
|
||||
this.pluginType = uiPlugin.plugin_type;
|
||||
this.iconUrl = SelectIcon(uiPlugin.plugin_type,uiPlugin.uri);
|
||||
this.name = uiPlugin.name;
|
||||
this.inputs = uiPlugin.audio_inputs;
|
||||
this.outputs = uiPlugin.audio_outputs;
|
||||
this.numberOfInputs = Math.max(uiPlugin.audio_inputs,2);
|
||||
this.numberOfOutputs = Math.max(uiPlugin.audio_outputs,2);
|
||||
} else {
|
||||
// default to empty plugin.
|
||||
this.pluginType = PluginType.UtilityPlugin;
|
||||
this.name = pedalItem.pluginName??"#error";
|
||||
this.iconUrl = ERROR_ICON_URL;
|
||||
this.inputs = 2;
|
||||
this.outputs = 2;
|
||||
this.numberOfInputs = 2;
|
||||
this.numberOfOutputs = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -677,18 +682,18 @@ const PedalBoardView =
|
||||
// let classes = this.props.classes;
|
||||
let x_ = item.bounds.x + CELL_WIDTH / 2;
|
||||
let y_ = item.bounds.y + CELL_HEIGHT / 2;
|
||||
let isStereo = item.stereoOutput;
|
||||
let numberOfOutputs = item.numberOfOutputs;
|
||||
let color = enabled ? ENABLED_CONNECTOR_COLOR : DISABLED_CONNECTOR_COLOR;
|
||||
let svgPath = new SvgPathBuilder().moveTo(x_, y_).lineTo(x_ + CELL_WIDTH, y_).toString();
|
||||
|
||||
if (isStereo) {
|
||||
if (numberOfOutputs === 2) {
|
||||
output.push((
|
||||
<path d={svgPath} stroke={color} strokeWidth={SVG_STEREO_STROKE_WIDTH} />
|
||||
));
|
||||
output.push((
|
||||
<path d={svgPath} stroke="white" strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
} else {
|
||||
} else if (numberOfOutputs === 1) {
|
||||
output.push((
|
||||
<path d={svgPath} stroke={color} strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
@@ -712,18 +717,18 @@ const PedalBoardView =
|
||||
let topStartPath = new SvgPathBuilder().moveTo(x_, y_).lineTo(x_, yTop).lineTo(x_ + CELL_WIDTH, yTop).toString();
|
||||
let bottomStartPath = new SvgPathBuilder().moveTo(x_, y_).lineTo(x_, yBottom).lineTo(x_ + CELL_WIDTH, yBottom).toString();
|
||||
|
||||
if (item.stereoInput && item.topChildren[0].stereoInput) {
|
||||
if (item.numberOfInputs === 2 && item.topChildren[0].numberOfInputs === 2) {
|
||||
output.push((<path d={topStartPath} stroke={topColor} strokeWidth={SVG_STEREO_STROKE_WIDTH} />));
|
||||
output.push((<path d={topStartPath} stroke="white" strokeWidth={SVG_STROKE_WIDTH} />));
|
||||
} else {
|
||||
} else if (item.numberOfInputs !== 0 && item.topChildren[0].numberOfInputs !== 0) {
|
||||
output.push((<path d={topStartPath} stroke={topColor} strokeWidth={SVG_STROKE_WIDTH} />));
|
||||
}
|
||||
|
||||
if (item.stereoInput && item.bottomChildren[0].stereoInput) {
|
||||
if (item.numberOfInputs === 2 && item.bottomChildren[0].numberOfInputs === 2) {
|
||||
output.push((<path d={bottomStartPath} stroke={bottomColor} strokeWidth={SVG_STEREO_STROKE_WIDTH} />));
|
||||
output.push((<path d={bottomStartPath} stroke="white" strokeWidth={SVG_STROKE_WIDTH} />));
|
||||
|
||||
} else {
|
||||
} else if (item.numberOfInputs !== 0 && item.bottomChildren[0].numberOfInputs !== 0) {
|
||||
output.push((<path d={bottomStartPath} stroke={bottomColor} strokeWidth={SVG_STROKE_WIDTH} />));
|
||||
}
|
||||
|
||||
@@ -741,6 +746,8 @@ const PedalBoardView =
|
||||
|
||||
let firstPathStereo: boolean;
|
||||
let secondPathStereo: boolean;
|
||||
let firstPathAbsent: boolean;
|
||||
let secondPathAbsent: boolean;
|
||||
let firstPathEnabled: boolean;
|
||||
let secondPathEnabled: boolean;
|
||||
let xTee: number;
|
||||
@@ -753,11 +760,13 @@ const PedalBoardView =
|
||||
|
||||
// Third case: L/R stereo output, when both outputs are mono, requires a third stroke.
|
||||
let thirdPath: string | null = null; // for L/R stereo output (which can be stereo even if both outputs are mono)
|
||||
let hasThirdPath = item.stereoOutput && (!lastTop.stereoOutput) && (!lastBottom.stereoOutput);
|
||||
let hasThirdPath = item.numberOfOutputs === 2 && (lastTop.numberOfOutputs !== 2) && (lastBottom.numberOfOutputs !== 2);
|
||||
|
||||
if (hasThirdPath) {
|
||||
firstPathStereo = false;
|
||||
secondPathStereo = false;
|
||||
firstPathAbsent = lastTop.numberOfOutputs === 0 || item.numberOfOutputs === 0;
|
||||
secondPathAbsent = lastBottom.numberOfOutputs === 0 || item.numberOfOutputs === 0;
|
||||
xTee = xTee0 - monoAdjustment;
|
||||
firstPath = new SvgPathBuilder().moveTo(xBottom, yBottom).lineTo(xTee, yBottom).lineTo(xTee, y_).toString();
|
||||
|
||||
@@ -767,10 +776,13 @@ const PedalBoardView =
|
||||
thirdPath= new SvgPathBuilder().moveTo(xTee0,y_).lineTo(xEnd,y_).toString();
|
||||
firstPathEnabled = bottomEnabled;
|
||||
secondPathEnabled = topEnabled;
|
||||
} else if (bottomPathFirst || (topEnabled && lastTop.stereoOutput)) {
|
||||
} else if (bottomPathFirst || (topEnabled && lastTop.numberOfOutputs === 2)) {
|
||||
// draw the bottom path first.
|
||||
firstPathStereo = item.stereoOutput && lastBottom.stereoOutput;
|
||||
secondPathStereo = item.stereoOutput && lastTop.stereoOutput;
|
||||
firstPathStereo = item.numberOfOutputs === 2 && lastBottom.numberOfOutputs === 2;
|
||||
secondPathStereo = item.numberOfOutputs === 2 && lastTop.numberOfOutputs === 2;
|
||||
firstPathAbsent = item.numberOfOutputs === 0 || lastBottom.numberOfOutputs === 0;
|
||||
secondPathAbsent = item.numberOfOutputs === 0 || lastTop.numberOfOutputs === 0;
|
||||
|
||||
xTee = firstPathStereo ? xTee0 : xTee0 - monoAdjustment;
|
||||
firstPath = new SvgPathBuilder().moveTo(xBottom, yBottom).lineTo(xTee, yBottom).lineTo(xTee, y_).toString();
|
||||
xTee = secondPathStereo ? xTee0 : xTee0 - monoAdjustment;
|
||||
@@ -780,8 +792,10 @@ const PedalBoardView =
|
||||
secondPathEnabled = topEnabled;
|
||||
} else {
|
||||
// draw the top path first.
|
||||
firstPathStereo = item.stereoOutput && lastTop.stereoOutput;
|
||||
secondPathStereo = item.stereoOutput && lastBottom.stereoOutput;
|
||||
firstPathStereo = item.numberOfOutputs === 2 && lastTop.numberOfOutputs === 2;
|
||||
secondPathStereo = item.numberOfOutputs === 2 && lastBottom.numberOfOutputs === 2;
|
||||
firstPathAbsent = item.numberOfOutputs === 0 || lastTop.numberOfOutputs === 0;
|
||||
secondPathAbsent = item.numberOfOutputs === 0 || lastBottom.numberOfOutputs === 0;
|
||||
|
||||
xTee = firstPathStereo ? xTee0 : xTee0 - monoAdjustment;
|
||||
firstPath = new SvgPathBuilder().moveTo(xTop, yTop).lineTo(xTee, yTop).lineTo(xTee, y_).toString();
|
||||
@@ -804,7 +818,7 @@ const PedalBoardView =
|
||||
output.push((
|
||||
<path d={firstPath} stroke="white" strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
} else {
|
||||
} else if (!firstPathAbsent) {
|
||||
output.push((
|
||||
<path d={firstPath} stroke={firstPathColor} strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
@@ -816,7 +830,7 @@ const PedalBoardView =
|
||||
output.push((
|
||||
<path d={secondPath} stroke="white" strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
} else {
|
||||
} else if (!secondPathAbsent) {
|
||||
output.push((
|
||||
<path d={secondPath} stroke={secondPathColor} strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
@@ -828,7 +842,7 @@ const PedalBoardView =
|
||||
output.push((
|
||||
<path d={firstPath} stroke={firstPathColor} strokeWidth={SVG_STEREO_STROKE_WIDTH} />
|
||||
));
|
||||
} else {
|
||||
} else if (!firstPathAbsent) {
|
||||
output.push((
|
||||
<path d={firstPath} stroke={firstPathColor} strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
@@ -837,7 +851,7 @@ const PedalBoardView =
|
||||
output.push((
|
||||
<path d={secondPath} stroke={secondPathColor} strokeWidth={SVG_STEREO_STROKE_WIDTH} />
|
||||
));
|
||||
} else {
|
||||
} else if (!secondPathAbsent) {
|
||||
output.push((
|
||||
<path d={secondPath} stroke={secondPathColor} strokeWidth={SVG_STROKE_WIDTH} />
|
||||
));
|
||||
@@ -1011,126 +1025,130 @@ const PedalBoardView =
|
||||
}
|
||||
return true;
|
||||
}
|
||||
canOutputStereo(item: PedalLayout): boolean {
|
||||
getNumberOfInputs(item: PedalLayout): number {
|
||||
if (item.pedalItem) {
|
||||
let plugin = this.model.getUiPlugin(item.pedalItem.uri);
|
||||
if (plugin) {
|
||||
return plugin.audio_outputs === 2;
|
||||
return plugin.audio_inputs;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
getNumberOfOutputs(item: PedalLayout): number {
|
||||
if (item.pedalItem) {
|
||||
let plugin = this.model.getUiPlugin(item.pedalItem.uri);
|
||||
if (plugin) {
|
||||
return plugin.audio_outputs;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
markStereoOutputs(layoutChain: PedalLayout[], stereoInput: boolean, stereoOutput: boolean) {
|
||||
markStereoOutputs(layoutChain: PedalLayout[], numberOfInputs: number, numberOfOutputs: number) {
|
||||
// analyze forward flow.
|
||||
this.markStereoForward(layoutChain, stereoInput);
|
||||
this.markStereoForward(layoutChain, numberOfInputs);
|
||||
// mark items that feed a mono effect as mono.
|
||||
this.markStereoBackward(layoutChain, stereoOutput);
|
||||
this.markStereoBackward(layoutChain, numberOfOutputs);
|
||||
}
|
||||
|
||||
markStereoBackward(layoutChain: PedalLayout[], stereoOutput: boolean) : boolean
|
||||
markStereoBackward(layoutChain: PedalLayout[], numberOfOutputs: number) : number
|
||||
{
|
||||
for (let i = layoutChain.length-1; i >= 0; --i)
|
||||
{
|
||||
let item = layoutChain[i];
|
||||
if (item.isSplitter())
|
||||
{
|
||||
if (!stereoOutput)
|
||||
{
|
||||
item.stereoOutput = false;
|
||||
}
|
||||
this.markStereoBackward(item.topChildren,stereoOutput);
|
||||
this.markStereoBackward(item.bottomChildren,stereoOutput);
|
||||
let topStereoInput = item.topChildren[0].stereoInput;
|
||||
let bottomStereoInput = item.bottomChildren[0].stereoInput;
|
||||
item.numberOfOutputs = CalculateConnection(item.numberOfOutputs, numberOfOutputs)
|
||||
|
||||
if (! (topStereoInput || bottomStereoInput))
|
||||
this.markStereoBackward(item.topChildren,numberOfOutputs);
|
||||
this.markStereoBackward(item.bottomChildren,numberOfOutputs);
|
||||
let topInputs = item.topChildren[0].numberOfInputs;
|
||||
let bottomInputs = item.bottomChildren[0].numberOfInputs;
|
||||
|
||||
let splitItem = item.pedalItem as PedalBoardSplitItem;
|
||||
if (splitItem.getSplitType() !== SplitType.Lr)
|
||||
{
|
||||
let splitItem = item.pedalItem as PedalBoardSplitItem;
|
||||
if (splitItem.getSplitType() !== SplitType.Lr)
|
||||
{
|
||||
item.stereoInput = false;
|
||||
}
|
||||
item.numberOfInputs = CalculateConnection(item.numberOfInputs, Math.max(topInputs,bottomInputs));
|
||||
}
|
||||
} else if (item.isEnd())
|
||||
{
|
||||
|
||||
} else if (item.isStart())
|
||||
{
|
||||
if (!stereoOutput)
|
||||
{
|
||||
item.stereoOutput = false;
|
||||
}
|
||||
return item.stereoOutput;
|
||||
item.numberOfOutputs = CalculateConnection(item.numberOfOutputs,numberOfOutputs);
|
||||
return item.numberOfOutputs;
|
||||
|
||||
} else if (item.isEmpty()) {
|
||||
if (!stereoOutput)
|
||||
if (numberOfOutputs === 0)
|
||||
{
|
||||
item.stereoOutput = false;
|
||||
item.stereoInput = false;
|
||||
item.numberOfOutputs = 0;
|
||||
item.numberOfInputs = CalculateConnection(item.numberOfInputs,2);
|
||||
} else {
|
||||
item.numberOfOutputs = CalculateConnection(item.numberOfOutputs,numberOfOutputs);
|
||||
item.numberOfInputs = CalculateConnection(item.numberOfInputs,numberOfOutputs);
|
||||
}
|
||||
} else {
|
||||
if (!stereoOutput)
|
||||
{
|
||||
item.stereoOutput = false;
|
||||
}
|
||||
item.numberOfOutputs = CalculateConnection(item.numberOfOutputs,numberOfOutputs);
|
||||
}
|
||||
stereoOutput = item.stereoInput;
|
||||
numberOfOutputs = item.numberOfInputs;
|
||||
}
|
||||
return stereoOutput;
|
||||
return numberOfOutputs;
|
||||
}
|
||||
markStereoForward(layoutChain: PedalLayout[],stereoInput: boolean): boolean
|
||||
markStereoForward(layoutChain: PedalLayout[],numberOfInputs: number): number
|
||||
{
|
||||
if (layoutChain.length === 0) {
|
||||
return stereoInput;
|
||||
return numberOfInputs;
|
||||
}
|
||||
for (let i = 0; i < layoutChain.length; ++i) {
|
||||
let item = layoutChain[i];
|
||||
if (item.isSplitter()) {
|
||||
let splitter = item.pedalItem as PedalBoardSplitItem;
|
||||
item.stereoInput = stereoInput;
|
||||
item.numberOfInputs = numberOfInputs;
|
||||
|
||||
let isChainInputStereo = stereoInput;
|
||||
let chainInputs = numberOfInputs;
|
||||
if (splitter.getSplitType() === SplitType.Lr)
|
||||
{
|
||||
isChainInputStereo = false;
|
||||
chainInputs = CalculateConnection(numberOfInputs,1);
|
||||
}
|
||||
|
||||
let topStereo = this.markStereoForward(item.topChildren, isChainInputStereo);
|
||||
let bottomStereo = this.markStereoForward(item.bottomChildren, isChainInputStereo);
|
||||
let topOutputs = this.markStereoForward(item.topChildren, chainInputs);
|
||||
let bottomOutputs = this.markStereoForward(item.bottomChildren, chainInputs);
|
||||
|
||||
|
||||
if (splitter.getSplitType() === SplitType.Ab) {
|
||||
if (splitter.isASelected()) {
|
||||
item.stereoOutput = topStereo;
|
||||
item.numberOfOutputs = topOutputs;
|
||||
} else {
|
||||
item.stereoOutput = bottomStereo;
|
||||
item.numberOfOutputs = bottomOutputs;
|
||||
}
|
||||
} else if (splitter.getSplitType() === SplitType.Lr) {
|
||||
item.stereoOutput = true;
|
||||
item.numberOfOutputs = (topOutputs !== 0 && bottomOutputs !== 0) ? 2: 0;
|
||||
} else {
|
||||
item.stereoOutput = topStereo || bottomStereo;
|
||||
item.numberOfOutputs = CalculateConnection(topOutputs,bottomOutputs);
|
||||
}
|
||||
} else if (item.isStart())
|
||||
{
|
||||
item.stereoOutput = (PiPedalModelFactory.getInstance().jackSettings.get().inputAudioPorts.length > 1);
|
||||
item.numberOfOutputs = Math.min(PiPedalModelFactory.getInstance().jackSettings.get().inputAudioPorts.length,2);
|
||||
} else if (item.isEnd()) {
|
||||
item.stereoInput = (PiPedalModelFactory.getInstance().jackSettings.get().outputAudioPorts.length > 1) && stereoInput;
|
||||
return item.stereoInput;
|
||||
item.numberOfInputs =
|
||||
CalculateConnection(
|
||||
Math.min(PiPedalModelFactory.getInstance().jackSettings.get().outputAudioPorts.length,2),
|
||||
numberOfInputs);
|
||||
return item.numberOfInputs;
|
||||
} else if (item.isEmpty()) {
|
||||
item.stereoInput = stereoInput;
|
||||
item.stereoOutput = stereoInput;
|
||||
} else {
|
||||
if (stereoInput && this.canOutputStereo(item)) {
|
||||
item.stereoInput = true;
|
||||
item.numberOfInputs = numberOfInputs;
|
||||
if (numberOfInputs === 0)
|
||||
{
|
||||
item.numberOfOutputs = 2;
|
||||
} else {
|
||||
item.stereoInput = false;
|
||||
item.numberOfOutputs = item.numberOfInputs;
|
||||
}
|
||||
item.stereoOutput = this.canOutputStereo(item);
|
||||
} else {
|
||||
item.numberOfInputs = CalculateConnection(numberOfInputs,this.getNumberOfInputs(item));
|
||||
item.numberOfOutputs = this.getNumberOfOutputs(item);
|
||||
}
|
||||
stereoInput = item.stereoOutput;
|
||||
numberOfInputs = item.numberOfOutputs;
|
||||
}
|
||||
return stereoInput;
|
||||
return numberOfInputs;
|
||||
}
|
||||
|
||||
currentLayout?: PedalLayout[];
|
||||
@@ -1145,7 +1163,7 @@ const PedalBoardView =
|
||||
{
|
||||
layoutChain.splice(0, 0, start);
|
||||
layoutChain.splice(layoutChain.length, 0, end);
|
||||
this.markStereoOutputs(layoutChain, true, true);
|
||||
this.markStereoOutputs(layoutChain, 2,2);
|
||||
}
|
||||
|
||||
let layoutSize = this.doLayout(layoutChain);
|
||||
|
||||
@@ -22,7 +22,7 @@ import { UiPlugin, UiControl, PluginType } from './Lv2Plugin';
|
||||
import { PiPedalArgumentError, PiPedalStateError } from './PiPedalError';
|
||||
|
||||
import { ObservableProperty } from './ObservableProperty';
|
||||
import { PedalBoard, ControlValue } from './PedalBoard'
|
||||
import { PedalBoard, PedalBoardItem, ControlValue } from './PedalBoard'
|
||||
import PluginClass from './PluginClass';
|
||||
import PiPedalSocket, { PiPedalMessageHeader } from './PiPedalSocket';
|
||||
import { nullCast } from './Utility'
|
||||
@@ -303,6 +303,13 @@ interface ControlChangedBody {
|
||||
symbol: string;
|
||||
value: number;
|
||||
};
|
||||
interface Vst3ControlChangedBody {
|
||||
clientId: number;
|
||||
instanceId: number;
|
||||
symbol: string;
|
||||
value: number;
|
||||
state: string;
|
||||
};
|
||||
|
||||
export interface FavoritesList {
|
||||
[url: string]: boolean;
|
||||
@@ -634,6 +641,16 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
controlChangedBody.value,
|
||||
false // do NOT notify the server of the change.
|
||||
);
|
||||
} else if (message === "onVst3ControlChanged") {
|
||||
let controlChangedBody = body as Vst3ControlChangedBody;
|
||||
this._setVst3PedalBoardControlValue(
|
||||
controlChangedBody.instanceId,
|
||||
controlChangedBody.symbol,
|
||||
controlChangedBody.value,
|
||||
controlChangedBody.state,
|
||||
false // do NOT notify the server of the change.
|
||||
);
|
||||
|
||||
} else if (message === "onJackServerSettingsChanged") {
|
||||
let jackServerSettings = new JackServerSettings().deserialize(body);
|
||||
this.jackServerSettings.set(jackServerSettings);
|
||||
@@ -1195,6 +1212,29 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
_setVst3PedalBoardControlValue(instanceId: number, key: string, value: number, state: string, notifyServer: boolean ): void {
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
if (pedalBoard === undefined) throw new PiPedalStateError("Pedalboard not ready.");
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
|
||||
let item: PedalBoardItem = newPedalBoard.getItem(instanceId);
|
||||
let changed = item.setControlValue(key, value);
|
||||
item.vstState = state;
|
||||
|
||||
if (changed) {
|
||||
this.pedalBoard.set(newPedalBoard);
|
||||
if (notifyServer) {
|
||||
this._setServerControl("setControl", instanceId, key, value);
|
||||
}
|
||||
for (let i = 0; i < this._controlValueChangeItems.length; ++i) {
|
||||
let item = this._controlValueChangeItems[i];
|
||||
if (instanceId === item.instanceId) {
|
||||
item.onValueChanged(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
setPedalBoardControlValue(instanceId: number, key: string, value: number): void {
|
||||
@@ -1232,7 +1272,7 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
clientId: this.clientId,
|
||||
pedalBoard: this.pedalBoard.get()
|
||||
};
|
||||
this.webSocket?.send("setCurrentPedalBoard", body);
|
||||
this.webSocket?.send("updateCurrentPedalBoard", body);
|
||||
|
||||
}
|
||||
|
||||
@@ -1288,6 +1328,8 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
deletePedalBoardPedal(instanceId: number): number | null {
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
let result = newPedalBoard.deleteItem(instanceId);
|
||||
if (result != null) {
|
||||
this.pedalBoard.set(newPedalBoard);
|
||||
@@ -1301,6 +1343,9 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
if (fromInstanceId === toInstanceId) return;
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
let fromItem = newPedalBoard.getItem(fromInstanceId);
|
||||
if (fromItem === null) {
|
||||
throw new PiPedalArgumentError("fromInstanceId not found.");
|
||||
@@ -1317,6 +1362,9 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
if (fromInstanceId === toInstanceId) return;
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
let fromItem = newPedalBoard.getItem(fromInstanceId);
|
||||
if (fromItem === null) {
|
||||
throw new PiPedalArgumentError("fromInstanceId not found.");
|
||||
@@ -1334,6 +1382,10 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
|
||||
let fromItem = newPedalBoard.getItem(instanceId);
|
||||
if (fromItem === null) {
|
||||
throw new PiPedalArgumentError("fromInstanceId not found.");
|
||||
@@ -1350,6 +1402,9 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
|
||||
let fromItem = newPedalBoard.getItem(instanceId);
|
||||
if (fromItem === null) {
|
||||
throw new PiPedalArgumentError("fromInstanceId not found.");
|
||||
@@ -1371,6 +1426,9 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
|
||||
let fromItem = newPedalBoard.getItem(fromInstanceId);
|
||||
let toItem = newPedalBoard.getItem(toInstanceId);
|
||||
if (fromItem === null) {
|
||||
@@ -1389,6 +1447,9 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
addPedalBoardItem(instanceId: number, append: boolean): number {
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
|
||||
let item = newPedalBoard.getItem(instanceId);
|
||||
if (item === null) {
|
||||
throw new PiPedalArgumentError("instanceId not found.");
|
||||
@@ -1402,6 +1463,8 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
addPedalBoardSplitItem(instanceId: number, append: boolean): number {
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
let item = newPedalBoard.getItem(instanceId);
|
||||
if (item === null) {
|
||||
throw new PiPedalArgumentError("instanceId not found.");
|
||||
@@ -1416,6 +1479,9 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
setPedalBoardItemEmpty(instanceId: number): number {
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
|
||||
|
||||
let item = newPedalBoard.getItem(instanceId);
|
||||
if (item === null) {
|
||||
throw new PiPedalArgumentError("instanceId not found.");
|
||||
@@ -1768,12 +1834,24 @@ class PiPedalModelImpl implements PiPedalModel {
|
||||
this.showAlert(error);
|
||||
});
|
||||
}
|
||||
|
||||
updateVst3State(pedalBoard: PedalBoard)
|
||||
{
|
||||
// let it = pedalBoard.itemsGenerator();
|
||||
// while (true) {
|
||||
// let v = it.next();
|
||||
// if (v.done) break;
|
||||
// let item = v.value;
|
||||
// }
|
||||
}
|
||||
|
||||
setMidiBinding(instanceId: number, midiBinding: MidiBinding): void {
|
||||
let pedalBoard = this.pedalBoard.get();
|
||||
if (!pedalBoard) {
|
||||
throw new PiPedalStateError("Pedalboard not loaded.");
|
||||
}
|
||||
let newPedalBoard = pedalBoard.clone();
|
||||
this.updateVst3State(newPedalBoard);
|
||||
if (newPedalBoard.setMidiBinding(instanceId, midiBinding)) {
|
||||
this.pedalBoard.set(newPedalBoard);
|
||||
// notify the server.
|
||||
|
||||
@@ -603,17 +603,23 @@ const PluginControl =
|
||||
let uiControl = this.props.uiControl;
|
||||
if (uiControl) {
|
||||
if (uiControl.range_steps > 1) {
|
||||
range = Math.round(range * uiControl.range_steps-1) / (uiControl.range_steps-1);
|
||||
range = Math.round(range * (uiControl.range_steps-1)) / (uiControl.range_steps-1);
|
||||
}
|
||||
let value: number;
|
||||
if (uiControl.is_logarithmic)
|
||||
if (uiControl.min_value === uiControl.max_value)
|
||||
{
|
||||
value = uiControl.min_value*Math.pow(uiControl.max_value/uiControl.min_value,range);
|
||||
} else {
|
||||
value = range * (uiControl.max_value - uiControl.min_value) + uiControl.min_value;
|
||||
}
|
||||
if (uiControl.integer_property) {
|
||||
value = Math.round(value);
|
||||
value = uiControl.min_value;
|
||||
} else
|
||||
{
|
||||
if (uiControl.is_logarithmic)
|
||||
{
|
||||
value = uiControl.min_value*Math.pow(uiControl.max_value/uiControl.min_value,range);
|
||||
} else {
|
||||
value = range * (uiControl.max_value - uiControl.min_value) + uiControl.min_value;
|
||||
}
|
||||
if (uiControl.integer_property) {
|
||||
value = Math.round(value);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user