@@ -227,3 +227,6 @@ | |||
[submodule "plugins/Sapphire"] | |||
path = plugins/Sapphire | |||
url = https://github.com/cosinekitty/sapphire.git | |||
[submodule "plugins/Cardinal/src/AIDA-X/RTNeural"] | |||
path = plugins/Cardinal/src/AIDA-X/RTNeural | |||
url = https://github.com/jatinchowdhury18/RTNeural.git |
@@ -0,0 +1,137 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
<svg | |||
width="116.84mm" | |||
height="128.5mm" | |||
viewBox="0 0 116.84 128.5" | |||
version="1.1" | |||
id="svg4620" | |||
xmlns:xlink="http://www.w3.org/1999/xlink" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:dc="http://purl.org/dc/elements/1.1/"> | |||
<defs | |||
id="defs4614"> | |||
<style | |||
id="style6" | |||
type="text/css"> | |||
.str0 {stroke:#565656;stroke-width:0.0966867} | |||
.str1 {stroke:#4F4F4F;stroke-width:0.193345} | |||
.fil0 {fill:none} | |||
.fil2 {fill:#2B2A29} | |||
.fil1 {fill:#6B6B6B} | |||
</style> | |||
<clipPath | |||
clipPathUnits="userSpaceOnUse" | |||
id="clipPath847"> | |||
<use | |||
x="0" | |||
y="0" | |||
xlink:href="#g843" | |||
id="use849" | |||
width="100%" | |||
height="100%" /> | |||
</clipPath> | |||
</defs> | |||
<metadata | |||
id="metadata4617"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<g | |||
id="layer1" | |||
transform="translate(0,-168.5)"> | |||
<g | |||
id="g845" | |||
clip-path="url(#clipPath847)" | |||
transform="translate(35.668149)"> | |||
<g | |||
id="g843"> | |||
<g | |||
transform="matrix(6.342689,0,0,6.342689,5.4472535,175.6457)" | |||
id="g5299" | |||
style="fill-rule:evenodd"> | |||
<g | |||
id="Layer_x0020_1" | |||
transform="translate(-1.6191379e-5,-0.08553947)"> | |||
<metadata | |||
id="CorelCorpID_0Corel-Layer" /> | |||
<circle | |||
class="fil0 str0" | |||
cx="0.525226" | |||
cy="0.61075097" | |||
r="0.15916" | |||
id="circle10" | |||
style="fill:none;stroke:#ffffff;stroke-width:0.0966867;stroke-opacity:1" /> | |||
<circle | |||
class="fil0 str1" | |||
cx="0.525226" | |||
cy="0.61075097" | |||
r="0.42853901" | |||
id="circle12" | |||
style="fill:none;stroke:#ffffff;stroke-width:0.193345;stroke-opacity:1" /> | |||
</g> | |||
</g> | |||
<g | |||
transform="translate(-0.09449404,0.14174107)" | |||
id="text5303" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" | |||
aria-label="Cardinal"> | |||
<path | |||
id="path5305" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 17.923601,176.99103 v 0.66043 q -0.31626,-0.29456 -0.675928,-0.44028 -0.356567,-0.14573 -0.759643,-0.14573 -0.79375,0 -1.21543,0.48679 -0.42168,0.48369 -0.42168,1.40146 0,0.91468 0.42168,1.40147 0.42168,0.48369 1.21543,0.48369 0.403076,0 0.759643,-0.14573 0.359668,-0.14572 0.675928,-0.44028 v 0.65422 q -0.328662,0.22325 -0.697632,0.33487 -0.365869,0.11162 -0.775146,0.11162 -1.051099,0 -1.655713,-0.64182 -0.604615,-0.64492 -0.604615,-1.75804 0,-1.11621 0.604615,-1.75803 0.604614,-0.64492 1.655713,-0.64492 0.415478,0 0.781347,0.11162 0.36897,0.10852 0.691431,0.32866 z" /> | |||
<path | |||
id="path5307" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 20.444377,179.51801 q -0.69143,0 -0.958081,0.15813 -0.26665,0.15813 -0.26665,0.5395 0,0.30386 0.198437,0.48369 0.201538,0.17674 0.545703,0.17674 0.47439,0 0.759644,-0.33487 0.288355,-0.33796 0.288355,-0.89606 v -0.12713 z m 1.137915,-0.23564 v 1.98127 h -0.570507 v -0.5271 q -0.195337,0.31626 -0.486792,0.46819 -0.291456,0.14883 -0.713135,0.14883 -0.533301,0 -0.849561,-0.29766 -0.313159,-0.30075 -0.313159,-0.80305 0,-0.58601 0.390674,-0.88367 0.393774,-0.29765 1.172021,-0.29765 h 0.799952 v -0.0558 q 0,-0.39378 -0.26045,-0.60772 -0.257348,-0.21704 -0.725537,-0.21704 -0.297656,0 -0.579809,0.0713 -0.282154,0.0713 -0.542603,0.21394 v -0.52709 q 0.313159,-0.12093 0.607715,-0.17984 0.294556,-0.062 0.573608,-0.062 0.753443,0 1.125513,0.39067 0.37207,0.39068 0.37207,1.18443 z" /> | |||
<path | |||
id="path5309" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 24.769695,178.32429 q -0.09612,-0.0558 -0.21084,-0.0806 -0.111621,-0.0279 -0.248047,-0.0279 -0.483691,0 -0.744141,0.31626 -0.257348,0.31315 -0.257348,0.90227 v 1.82934 H 22.73571 v -3.47265 h 0.573609 v 0.5395 q 0.179834,-0.31626 0.468188,-0.46819 0.288355,-0.15503 0.700733,-0.15503 0.05891,0 0.130224,0.009 0.07131,0.006 0.15813,0.0217 z" /> | |||
<path | |||
id="path5311" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 27.541618,178.31808 v -1.87895 h 0.570508 v 4.82451 h -0.570508 v -0.5209 q -0.179834,0.31006 -0.455786,0.46199 -0.272851,0.14883 -0.657324,0.14883 -0.629419,0 -1.026294,-0.5023 -0.393774,-0.50229 -0.393774,-1.32085 0,-0.81855 0.393774,-1.32085 0.396875,-0.50229 1.026294,-0.50229 0.384473,0 0.657324,0.15193 0.275952,0.14883 0.455786,0.45888 z m -1.944067,1.21233 q 0,0.62942 0.257349,0.98909 0.260449,0.35657 0.713134,0.35657 0.452686,0 0.713135,-0.35657 0.260449,-0.35967 0.260449,-0.98909 0,-0.62942 -0.260449,-0.98598 -0.260449,-0.35967 -0.713135,-0.35967 -0.452685,0 -0.713134,0.35967 -0.257349,0.35656 -0.257349,0.98598 z" /> | |||
<path | |||
id="path5313" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 29.287248,177.79099 h 0.570508 v 3.47265 h -0.570508 z m 0,-1.35186 h 0.570508 v 0.72244 h -0.570508 z" /> | |||
<path | |||
id="path5315" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 33.938127,179.16765 v 2.09599 h -0.570508 v -2.07739 q 0,-0.49299 -0.192236,-0.73794 -0.192236,-0.24495 -0.576709,-0.24495 -0.461987,0 -0.728638,0.29456 -0.26665,0.29455 -0.26665,0.80305 v 1.96267 h -0.573608 v -3.47265 h 0.573608 v 0.5395 q 0.204639,-0.31316 0.480591,-0.46819 0.279053,-0.15503 0.641821,-0.15503 0.598413,0 0.905371,0.37207 0.306958,0.36897 0.306958,1.08831 z" /> | |||
<path | |||
id="path5317" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 36.654241,179.51801 q -0.691431,0 -0.958081,0.15813 -0.26665,0.15813 -0.26665,0.5395 0,0.30386 0.198437,0.48369 0.201538,0.17674 0.545703,0.17674 0.47439,0 0.759644,-0.33487 0.288354,-0.33796 0.288354,-0.89606 v -0.12713 z m 1.137915,-0.23564 v 1.98127 h -0.570508 v -0.5271 q -0.195337,0.31626 -0.486792,0.46819 -0.291455,0.14883 -0.713135,0.14883 -0.5333,0 -0.84956,-0.29766 -0.313159,-0.30075 -0.313159,-0.80305 0,-0.58601 0.390674,-0.88367 0.393774,-0.29765 1.172021,-0.29765 h 0.799951 v -0.0558 q 0,-0.39378 -0.260449,-0.60772 -0.257349,-0.21704 -0.725537,-0.21704 -0.297656,0 -0.57981,0.0713 -0.282153,0.0713 -0.542602,0.21394 v -0.52709 q 0.313159,-0.12093 0.607715,-0.17984 0.294555,-0.062 0.573608,-0.062 0.753442,0 1.125513,0.39067 0.37207,0.39068 0.37207,1.18443 z" /> | |||
<path | |||
id="path5319" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 38.967278,176.43913 h 0.570508 v 4.82451 h -0.570508 z" /> | |||
</g> | |||
</g> | |||
</g> | |||
<text | |||
xml:space="preserve" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#808a8a;fill-opacity:1;stroke:none;stroke-width:0.264583" | |||
x="36.506084" | |||
y="188.65312" | |||
id="text845"><tspan | |||
id="tspan843" | |||
x="36.506084" | |||
y="188.65312" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#808a8a;fill-opacity:1;stroke-width:0.264583">Aida DSP : AIDA-X</tspan></text> | |||
</g> | |||
</svg> |
@@ -117,6 +117,16 @@ | |||
"Visual" | |||
] | |||
}, | |||
{ | |||
"slug": "AIDA-X", | |||
"name": "AIDA-X", | |||
"description": "Amp Model Player leveraging AI", | |||
"manualUrl": "https://github.com/DISTRHO/Cardinal/blob/main/docs/CARDINAL-MODULES.md#aidax", | |||
"tags": [ | |||
"Distortion", | |||
"Effect" | |||
] | |||
}, | |||
{ | |||
"slug": "Blank", | |||
"name": "Blank", | |||
@@ -0,0 +1,184 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
<svg | |||
width="116.84mm" | |||
height="128.5mm" | |||
viewBox="0 0 116.84 128.5" | |||
version="1.1" | |||
id="svg4620" | |||
xmlns:xlink="http://www.w3.org/1999/xlink" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:dc="http://purl.org/dc/elements/1.1/"> | |||
<defs | |||
id="defs4614"> | |||
<style | |||
id="style6" | |||
type="text/css"> | |||
.str0 {stroke:#565656;stroke-width:0.0966867} | |||
.str1 {stroke:#4F4F4F;stroke-width:0.193345} | |||
.fil0 {fill:none} | |||
.fil2 {fill:#2B2A29} | |||
.fil1 {fill:#6B6B6B} | |||
</style> | |||
<clipPath | |||
clipPathUnits="userSpaceOnUse" | |||
id="clipPath847"> | |||
<use | |||
x="0" | |||
y="0" | |||
xlink:href="#g843" | |||
id="use849" | |||
width="100%" | |||
height="100%" /> | |||
</clipPath> | |||
</defs> | |||
<metadata | |||
id="metadata4617"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<g | |||
id="layer1" | |||
transform="translate(0,-168.5)"> | |||
<g | |||
id="g845" | |||
clip-path="url(#clipPath847)" | |||
transform="translate(35.668149)"> | |||
<g | |||
id="g843"> | |||
<g | |||
transform="matrix(6.342689,0,0,6.342689,5.4472535,175.6457)" | |||
id="g5299" | |||
style="fill-rule:evenodd"> | |||
<g | |||
id="Layer_x0020_1" | |||
transform="translate(-1.6191379e-5,-0.08553947)"> | |||
<metadata | |||
id="CorelCorpID_0Corel-Layer" /> | |||
<path | |||
id="circle10" | |||
style="fill:none;stroke:#ffffff;stroke-width:0.0966867" | |||
class="fil0 str0" | |||
d="m 0.684386,0.61075097 a 0.15916,0.15916 0 0 1 -0.15916,0.15916001 0.15916,0.15916 0 0 1 -0.15916001,-0.15916001 0.15916,0.15916 0 0 1 0.15916001,-0.15916 0.15916,0.15916 0 0 1 0.15916,0.15916 z" /> | |||
<path | |||
id="circle12" | |||
style="fill:none;stroke:#ffffff;stroke-width:0.193345" | |||
class="fil0 str1" | |||
d="M 0.953765,0.61075097 A 0.42853901,0.42853901 0 0 1 0.525226,1.03929 0.42853901,0.42853901 0 0 1 0.09668699,0.61075097 0.42853901,0.42853901 0 0 1 0.525226,0.18221197 a 0.42853901,0.42853901 0 0 1 0.428539,0.428539 z" /> | |||
</g> | |||
</g> | |||
<g | |||
transform="translate(-0.09449404,0.14174107)" | |||
id="text5303" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" | |||
aria-label="Cardinal"> | |||
<path | |||
id="path5305" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 17.923601,176.99103 v 0.66043 q -0.31626,-0.29456 -0.675928,-0.44028 -0.356567,-0.14573 -0.759643,-0.14573 -0.79375,0 -1.21543,0.48679 -0.42168,0.48369 -0.42168,1.40146 0,0.91468 0.42168,1.40147 0.42168,0.48369 1.21543,0.48369 0.403076,0 0.759643,-0.14573 0.359668,-0.14572 0.675928,-0.44028 v 0.65422 q -0.328662,0.22325 -0.697632,0.33487 -0.365869,0.11162 -0.775146,0.11162 -1.051099,0 -1.655713,-0.64182 -0.604615,-0.64492 -0.604615,-1.75804 0,-1.11621 0.604615,-1.75803 0.604614,-0.64492 1.655713,-0.64492 0.415478,0 0.781347,0.11162 0.36897,0.10852 0.691431,0.32866 z" /> | |||
<path | |||
id="path5307" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 20.444377,179.51801 q -0.69143,0 -0.958081,0.15813 -0.26665,0.15813 -0.26665,0.5395 0,0.30386 0.198437,0.48369 0.201538,0.17674 0.545703,0.17674 0.47439,0 0.759644,-0.33487 0.288355,-0.33796 0.288355,-0.89606 v -0.12713 z m 1.137915,-0.23564 v 1.98127 h -0.570507 v -0.5271 q -0.195337,0.31626 -0.486792,0.46819 -0.291456,0.14883 -0.713135,0.14883 -0.533301,0 -0.849561,-0.29766 -0.313159,-0.30075 -0.313159,-0.80305 0,-0.58601 0.390674,-0.88367 0.393774,-0.29765 1.172021,-0.29765 h 0.799952 v -0.0558 q 0,-0.39378 -0.26045,-0.60772 -0.257348,-0.21704 -0.725537,-0.21704 -0.297656,0 -0.579809,0.0713 -0.282154,0.0713 -0.542603,0.21394 v -0.52709 q 0.313159,-0.12093 0.607715,-0.17984 0.294556,-0.062 0.573608,-0.062 0.753443,0 1.125513,0.39067 0.37207,0.39068 0.37207,1.18443 z" /> | |||
<path | |||
id="path5309" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 24.769695,178.32429 q -0.09612,-0.0558 -0.21084,-0.0806 -0.111621,-0.0279 -0.248047,-0.0279 -0.483691,0 -0.744141,0.31626 -0.257348,0.31315 -0.257348,0.90227 v 1.82934 H 22.73571 v -3.47265 h 0.573609 v 0.5395 q 0.179834,-0.31626 0.468188,-0.46819 0.288355,-0.15503 0.700733,-0.15503 0.05891,0 0.130224,0.009 0.07131,0.006 0.15813,0.0217 z" /> | |||
<path | |||
id="path5311" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 27.541618,178.31808 v -1.87895 h 0.570508 v 4.82451 h -0.570508 v -0.5209 q -0.179834,0.31006 -0.455786,0.46199 -0.272851,0.14883 -0.657324,0.14883 -0.629419,0 -1.026294,-0.5023 -0.393774,-0.50229 -0.393774,-1.32085 0,-0.81855 0.393774,-1.32085 0.396875,-0.50229 1.026294,-0.50229 0.384473,0 0.657324,0.15193 0.275952,0.14883 0.455786,0.45888 z m -1.944067,1.21233 q 0,0.62942 0.257349,0.98909 0.260449,0.35657 0.713134,0.35657 0.452686,0 0.713135,-0.35657 0.260449,-0.35967 0.260449,-0.98909 0,-0.62942 -0.260449,-0.98598 -0.260449,-0.35967 -0.713135,-0.35967 -0.452685,0 -0.713134,0.35967 -0.257349,0.35656 -0.257349,0.98598 z" /> | |||
<path | |||
id="path5313" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 29.287248,177.79099 h 0.570508 v 3.47265 h -0.570508 z m 0,-1.35186 h 0.570508 v 0.72244 h -0.570508 z" /> | |||
<path | |||
id="path5315" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 33.938127,179.16765 v 2.09599 h -0.570508 v -2.07739 q 0,-0.49299 -0.192236,-0.73794 -0.192236,-0.24495 -0.576709,-0.24495 -0.461987,0 -0.728638,0.29456 -0.26665,0.29455 -0.26665,0.80305 v 1.96267 h -0.573608 v -3.47265 h 0.573608 v 0.5395 q 0.204639,-0.31316 0.480591,-0.46819 0.279053,-0.15503 0.641821,-0.15503 0.598413,0 0.905371,0.37207 0.306958,0.36897 0.306958,1.08831 z" /> | |||
<path | |||
id="path5317" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 36.654241,179.51801 q -0.691431,0 -0.958081,0.15813 -0.26665,0.15813 -0.26665,0.5395 0,0.30386 0.198437,0.48369 0.201538,0.17674 0.545703,0.17674 0.47439,0 0.759644,-0.33487 0.288354,-0.33796 0.288354,-0.89606 v -0.12713 z m 1.137915,-0.23564 v 1.98127 h -0.570508 v -0.5271 q -0.195337,0.31626 -0.486792,0.46819 -0.291455,0.14883 -0.713135,0.14883 -0.5333,0 -0.84956,-0.29766 -0.313159,-0.30075 -0.313159,-0.80305 0,-0.58601 0.390674,-0.88367 0.393774,-0.29765 1.172021,-0.29765 h 0.799951 v -0.0558 q 0,-0.39378 -0.260449,-0.60772 -0.257349,-0.21704 -0.725537,-0.21704 -0.297656,0 -0.57981,0.0713 -0.282153,0.0713 -0.542602,0.21394 v -0.52709 q 0.313159,-0.12093 0.607715,-0.17984 0.294555,-0.062 0.573608,-0.062 0.753442,0 1.125513,0.39067 0.37207,0.39068 0.37207,1.18443 z" /> | |||
<path | |||
id="path5319" | |||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" | |||
d="m 38.967278,176.43913 h 0.570508 v 4.82451 h -0.570508 z" /> | |||
</g> | |||
</g> | |||
</g> | |||
<g | |||
aria-label="Aida DSP : AIDA-X" | |||
id="text845" | |||
style="font-size:10.5833px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';letter-spacing:0px;word-spacing:0px;fill:#808a8a;stroke-width:0.264583"> | |||
<path | |||
d="m 38.194182,185.53255 -0.66077,1.7918 h 1.323951 z m -0.274919,-0.4799 h 0.552249 l 1.372182,3.60047 h -0.506429 l -0.327974,-0.92363 h -1.622984 l -0.327974,0.92363 H 36.54467 Z" | |||
style="font-size:4.93889px" | |||
id="path6473" /> | |||
<path | |||
d="m 40.350123,185.95217 h 0.443728 v 2.70095 h -0.443728 z m 0,-1.05145 h 0.443728 v 0.5619 h -0.443728 z" | |||
style="font-size:4.93889px" | |||
id="path6475" /> | |||
<path | |||
d="m 43.49963,186.36213 v -1.46141 h 0.443728 v 3.7524 H 43.49963 v -0.40514 q -0.139871,0.24116 -0.354501,0.35932 -0.212217,0.11576 -0.511252,0.11576 -0.489548,0 -0.798229,-0.39068 -0.306269,-0.39067 -0.306269,-1.02732 0,-0.63666 0.306269,-1.02733 0.308681,-0.39068 0.798229,-0.39068 0.299035,0 0.511252,0.11817 0.21463,0.11576 0.354501,0.35691 z m -1.512053,0.94293 q 0,0.48954 0.20016,0.76929 0.202572,0.27733 0.554661,0.27733 0.352089,0 0.55466,-0.27733 0.202572,-0.27975 0.202572,-0.76929 0,-0.48955 -0.202572,-0.76688 -0.202571,-0.27974 -0.55466,-0.27974 -0.352089,0 -0.554661,0.27974 -0.20016,0.27733 -0.20016,0.76688 z" | |||
style="font-size:4.93889px" | |||
id="path6477" /> | |||
<path | |||
d="m 46.08483,187.29541 q -0.53778,0 -0.745174,0.12299 -0.207395,0.12299 -0.207395,0.41961 0,0.23634 0.15434,0.37621 0.156752,0.13746 0.424436,0.13746 0.36897,0 0.590834,-0.26045 0.224276,-0.26286 0.224276,-0.69695 v -0.0989 z m 0.885045,-0.18328 v 1.54099 h -0.443728 v -0.40996 q -0.151929,0.24598 -0.378616,0.36414 -0.226688,0.11576 -0.554661,0.11576 -0.414789,0 -0.660769,-0.23151 -0.243569,-0.23393 -0.243569,-0.6246 0,-0.45579 0.303858,-0.6873 0.306269,-0.23151 0.911572,-0.23151 h 0.622185 v -0.0434 q 0,-0.30627 -0.202572,-0.47267 -0.20016,-0.16881 -0.564307,-0.16881 -0.23151,0 -0.450963,0.0555 -0.219452,0.0555 -0.422024,0.1664 v -0.40996 q 0.243568,-0.0941 0.472667,-0.13987 0.229099,-0.0482 0.44614,-0.0482 0.586011,0 0.875399,0.30386 0.289388,0.30386 0.289388,0.92122 z" | |||
style="font-size:4.93889px" | |||
id="path6479" /> | |||
<path | |||
d="m 49.960219,185.45297 v 2.79983 h 0.588423 q 0.745174,0 1.090028,-0.33762 0.347266,-0.33762 0.347266,-1.06591 0,-0.72347 -0.347266,-1.05868 -0.344854,-0.33762 -1.090028,-0.33762 z m -0.487136,-0.40032 h 1.0008 q 1.04662,0 1.536168,0.4365 0.489549,0.43408 0.489549,1.36012 0,0.93086 -0.49196,1.36736 -0.49196,0.43649 -1.533757,0.43649 h -1.0008 z" | |||
style="font-size:4.93889px" | |||
id="path6481" /> | |||
<path | |||
d="m 55.434477,185.17082 v 0.47508 q -0.27733,-0.13264 -0.52331,-0.19775 -0.24598,-0.0651 -0.475079,-0.0651 -0.397909,0 -0.61495,0.15434 -0.214629,0.15434 -0.214629,0.4389 0,0.23875 0.142282,0.36174 0.144694,0.12058 0.545014,0.19533 l 0.294212,0.0603 q 0.545014,0.1037 0.803052,0.36656 0.260449,0.26045 0.260449,0.69936 0,0.52331 -0.352089,0.7934 -0.349677,0.2701 -1.027328,0.2701 -0.255626,0 -0.545014,-0.0579 -0.286976,-0.0579 -0.595657,-0.17122 v -0.50161 q 0.296623,0.1664 0.581188,0.25081 0.284565,0.0844 0.559483,0.0844 0.417202,0 0.643889,-0.16399 0.226687,-0.16398 0.226687,-0.46784 0,-0.26527 -0.163986,-0.41479 -0.161575,-0.14952 -0.532957,-0.22428 l -0.296623,-0.0579 q -0.545014,-0.10852 -0.788582,-0.34003 -0.243568,-0.23151 -0.243568,-0.64389 0,-0.47749 0.335207,-0.75241 0.33762,-0.27492 0.928454,-0.27492 0.253214,0 0.516075,0.0458 0.262861,0.0458 0.53778,0.13746 z" | |||
style="font-size:4.93889px" | |||
id="path6483" /> | |||
<path | |||
d="m 56.898299,185.45297 v 1.35289 h 0.612538 q 0.340031,0 0.525722,-0.17604 0.185691,-0.17605 0.185691,-0.50161 0,-0.32315 -0.185691,-0.49919 -0.185691,-0.17605 -0.525722,-0.17605 z m -0.487137,-0.40032 h 1.099675 q 0.605304,0 0.913984,0.27492 0.311092,0.27251 0.311092,0.80064 0,0.53296 -0.311092,0.80546 -0.30868,0.27251 -0.913984,0.27251 h -0.612538 v 1.44694 h -0.487137 z" | |||
style="font-size:4.93889px" | |||
id="path6485" /> | |||
<path | |||
d="m 61.053429,188.04058 h 0.508841 v 0.61254 h -0.508841 z m 0,-1.94131 h 0.508841 v 0.61254 h -0.508841 z" | |||
style="font-size:4.93889px" | |||
id="path6487" /> | |||
<path | |||
d="m 65.396662,185.53255 -0.66077,1.7918 h 1.323951 z m -0.274919,-0.4799 h 0.552249 l 1.372182,3.60047 h -0.506429 l -0.327973,-0.92363 h -1.622985 l -0.327973,0.92363 H 63.74715 Z" | |||
style="font-size:4.93889px" | |||
id="path6489" /> | |||
<path | |||
d="m 67.571895,185.05265 h 0.487136 v 3.60047 h -0.487136 z" | |||
style="font-size:4.93889px" | |||
id="path6491" /> | |||
<path | |||
d="m 69.51562,185.45297 v 2.79983 h 0.588422 q 0.745175,0 1.090029,-0.33762 0.347266,-0.33762 0.347266,-1.06591 0,-0.72347 -0.347266,-1.05868 -0.344854,-0.33762 -1.090029,-0.33762 z m -0.487137,-0.40032 h 1.000801 q 1.04662,0 1.536168,0.4365 0.489548,0.43408 0.489548,1.36012 0,0.93086 -0.491959,1.36736 -0.49196,0.43649 -1.533757,0.43649 h -1.000801 z" | |||
style="font-size:4.93889px" | |||
id="path6493" /> | |||
<path | |||
d="m 73.94808,185.53255 -0.660769,1.7918 h 1.32395 z m -0.274918,-0.4799 h 0.552248 l 1.372182,3.60047 h -0.506429 l -0.327973,-0.92363 h -1.622985 l -0.327973,0.92363 h -0.513664 z" | |||
style="font-size:4.93889px" | |||
id="path6495" /> | |||
<path | |||
d="m 75.771224,187.10248 h 1.299835 v 0.3955 h -1.299835 z" | |||
style="font-size:4.93889px" | |||
id="path6497" /> | |||
<path | |||
d="m 77.377327,185.05265 h 0.52331 l 0.894691,1.33842 0.899515,-1.33842 h 0.52331 l -1.157552,1.7291 1.234722,1.87137 h -0.52331 l -1.012858,-1.53134 -1.020093,1.53134 H 77.21334 l 1.285366,-1.92202 z" | |||
style="font-size:4.93889px" | |||
id="path6499" /> | |||
</g> | |||
</g> | |||
</svg> |
@@ -0,0 +1,8 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |||
<svg width="47px" height="47px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;"> | |||
<g id="knobLDark"> | |||
<path id="path3832" d="M23.521,45.109c-7.674,0 -3.302,3.9 -10.224,0.498c-6.922,-3.403 -1.202,-2.341 -5.997,-8.501c-4.795,-6.159 -5.059,-0.201 -6.763,-7.827c-1.704,-7.625 1.043,-2.42 2.76,-10.046c1.718,-7.626 -2.998,-4.102 1.797,-10.221c4.795,-6.12 2.51,-0.673 9.432,-4.035c6.921,-3.363 1.321,-4.977 8.995,-4.977c7.675,0 2.087,1.574 8.996,4.977c6.909,3.402 4.636,-2.045 9.432,4.035c4.795,6.078 0.079,2.689 1.796,10.26c1.717,7.572 4.465,2.422 2.761,10.048c-1.704,7.625 -1.982,1.708 -6.763,7.827c-4.782,6.119 0.924,5.057 -5.998,8.46c-6.921,3.402 -2.549,-0.498 -10.224,-0.498Z" style="fill:rgb(230,229,229);fill-rule:nonzero;"/> | |||
<path d="M23.521,23.5l0,-23.5" style="fill:none;fill-rule:nonzero;stroke:rgb(51,51,51);stroke-width:2.29px;"/> | |||
</g> | |||
</svg> |
@@ -0,0 +1,35 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||
width="1000px" height="1000px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve"> | |||
<image display="none" overflow="visible" width="1100" height="1100" xlink:href="scale.png" transform="matrix(0.9999 0 0 0.9999 -50 -20)"> | |||
</image> | |||
<circle display="none" fill="#969696" cx="500" cy="529.932" r="397"/> | |||
<path fill="#969696" d="M504.417,129.643c0,2.913-2.238,5.274-5,5.274l0,0c-2.761,0-5-2.361-5-5.274V64.774 | |||
c0-2.913,2.239-5.274,5-5.274l0,0c2.762,0,5,2.361,5,5.274V129.643z"/> | |||
<path fill="#969696" d="M350.896,158.423c1.114,2.69-0.05,5.729-2.602,6.785l0,0c-2.551,1.057-5.523-0.268-6.638-2.958 | |||
l-24.824-59.931c-1.114-2.691,0.05-5.729,2.602-6.786l0,0c2.552-1.057,5.522,0.269,6.638,2.959L350.896,158.423z"/> | |||
<path fill="#969696" d="M220.075,243.762c2.06,2.06,2.146,5.312,0.193,7.264l0,0c-1.952,1.953-5.205,1.867-7.265-0.193 | |||
l-45.869-45.87c-2.06-2.059-2.146-5.312-0.193-7.265l0,0c1.953-1.953,5.205-1.865,7.265,0.194L220.075,243.762z"/> | |||
<path fill="#969696" d="M131.87,372.668c2.691,1.114,4.016,4.086,2.959,6.637l0,0c-1.057,2.551-4.095,3.716-6.786,2.602 | |||
l-59.931-24.825c-2.69-1.114-4.016-4.086-2.959-6.638l0,0c1.058-2.552,4.095-3.715,6.786-2.601L131.87,372.668z"/> | |||
<path fill="#969696" d="M99.71,525.516c2.913,0,5.273,2.238,5.273,5l0,0c0,2.762-2.36,5-5.274,5.001H34.841 | |||
c-2.912,0-5.274-2.239-5.274-5.001l0,0c0.001-2.762,2.361-5,5.274-5H99.71z"/> | |||
<path fill="#969696" d="M128.49,679.037c2.691-1.115,5.729,0.049,6.785,2.601l0,0c1.057,2.552-0.268,5.522-2.959,6.639 | |||
l-59.931,24.824c-2.69,1.114-5.729-0.051-6.787-2.603l0,0c-1.056-2.552,0.269-5.522,2.96-6.638L128.49,679.037z"/> | |||
<path fill="#969696" d="M213.829,809.857c2.06-2.06,5.312-2.146,7.265-0.193l0,0c1.952,1.953,1.865,5.205-0.193,7.266 | |||
l-45.869,45.869c-2.06,2.059-5.313,2.146-7.267,0.192l0,0c-1.952-1.953-1.865-5.204,0.194-7.265L213.829,809.857z"/> | |||
<path fill="#969696" d="M779.925,816.104c-2.06-2.06-2.146-5.313-0.193-7.266l0,0c1.952-1.952,5.206-1.864,7.266,0.195 | |||
l45.868,45.869c2.06,2.06,2.146,5.311,0.192,7.266l0,0c-1.952,1.953-5.202,1.864-7.263-0.194L779.925,816.104z"/> | |||
<path fill="#969696" d="M868.129,687.197c-2.69-1.114-4.015-4.087-2.959-6.639l0,0c1.057-2.551,4.097-3.715,6.788-2.6l59.93,24.824 | |||
c2.69,1.115,4.015,4.086,2.958,6.64l0,0c-1.057,2.551-4.093,3.713-6.784,2.6L868.129,687.197z"/> | |||
<path fill="#969696" d="M900.289,534.35c-2.912,0-5.273-2.24-5.274-5.001l0,0c0-2.762,2.363-5,5.276-5l64.868,0.001 | |||
c2.913,0,5.272,2.238,5.273,5.002l0,0c0,2.761-2.36,4.996-5.272,4.998H900.289z"/> | |||
<path fill="#969696" d="M871.509,380.829c-2.69,1.115-5.729-0.052-6.786-2.602l0,0c-1.058-2.552,0.27-5.524,2.961-6.639 | |||
l59.931-24.823c2.691-1.114,5.728,0.051,6.786,2.604l0,0c1.057,2.551-0.269,5.519-2.958,6.635L871.509,380.829z"/> | |||
<path fill="#969696" d="M786.17,250.009c-2.06,2.06-5.313,2.145-7.266,0.193l0,0c-1.953-1.953-1.864-5.207,0.195-7.267 | |||
l45.869-45.868c2.061-2.06,5.311-2.145,7.266-0.191l0,0c1.953,1.952,1.864,5.201-0.193,7.262L786.17,250.009z"/> | |||
<path fill="#969696" d="M657.265,161.804c-1.115,2.691-4.089,4.015-6.64,2.959l0,0c-2.551-1.057-3.714-4.097-2.6-6.789l24.824-59.93 | |||
c1.115-2.691,4.086-4.014,6.64-2.957l0,0c2.552,1.056,3.713,4.092,2.601,6.783L657.265,161.804z"/> | |||
</svg> |
@@ -0,0 +1,605 @@ | |||
/* | |||
* AIDA-X Cardinal plugin | |||
* Copyright (C) 2022-2023 Massimo Pennazio <maxipenna@libero.it> | |||
* Copyright (C) 2023 Filipe Coelho <falktx@falktx.com> | |||
* SPDX-License-Identifier: GPL-3.0-or-later | |||
*/ | |||
#include "plugincontext.hpp" | |||
#include "ModuleWidgets.hpp" | |||
#include "extra/Sleep.hpp" | |||
#include "AIDA-X/Biquad.cpp" | |||
#include "AIDA-X/model_variant.hpp" | |||
#ifndef HEADLESS | |||
# include "ImGuiWidget.hpp" | |||
# include "ghc/filesystem.hpp" | |||
#endif | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
/* Define a constexpr for converting a gain in dB to a coefficient */ | |||
static constexpr float DB_CO(const float g) { return g > -90.f ? std::pow(10.f, g * 0.05f) : 0.f; } | |||
/* Define a macro to re-maps a number from one range to another */ | |||
static constexpr float MAP(const float x, const float in_min, const float in_max, const float out_min, const float out_max) | |||
{ | |||
return ((x - in_min) * (out_max - out_min) / (in_max - in_min)) + out_min; | |||
} | |||
/* Defines for tone controls */ | |||
static constexpr const float COMMON_Q = 0.707f; | |||
/* Defines for antialiasing filter */ | |||
static constexpr const float INLPF_MAX_CO = 0.99f * 0.5f; /* coeff * ((samplerate / 2) / samplerate) */ | |||
static constexpr const float INLPF_MIN_CO = 0.25f * 0.5f; /* coeff * ((samplerate / 2) / samplerate) */ | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
struct DynamicModel { | |||
ModelVariantType variant; | |||
bool input_skip; /* Means the model has been trained with first input element skipped to the output */ | |||
float input_gain; | |||
float output_gain; | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// This function carries model calculations | |||
static inline | |||
void applyModel(DynamicModel* model, float* const out, uint32_t numSamples) | |||
{ | |||
const bool input_skip = model->input_skip; | |||
const float input_gain = model->input_gain; | |||
const float output_gain = model->output_gain; | |||
std::visit( | |||
[&out, numSamples, input_skip, input_gain, output_gain] (auto&& custom_model) | |||
{ | |||
using ModelType = std::decay_t<decltype (custom_model)>; | |||
if (d_isNotEqual(input_gain, 1.f)) | |||
{ | |||
for (uint32_t i=0; i<numSamples; ++i) | |||
out[i] *= input_gain; | |||
} | |||
if constexpr (ModelType::input_size == 1) | |||
{ | |||
if (input_skip) | |||
{ | |||
for (uint32_t i=0; i<numSamples; ++i) | |||
out[i] += custom_model.forward(out + i); | |||
} | |||
else | |||
{ | |||
for (uint32_t i=0; i<numSamples; ++i) | |||
out[i] = custom_model.forward(out + i) * output_gain; | |||
} | |||
} | |||
if (input_skip && d_isNotEqual(output_gain, 1.f)) | |||
{ | |||
for (uint32_t i=0; i<numSamples; ++i) | |||
out[i] *= output_gain; | |||
} | |||
}, | |||
model->variant | |||
); | |||
} | |||
static inline | |||
float applyModel(DynamicModel* model, float sample) | |||
{ | |||
const bool input_skip = model->input_skip; | |||
const float input_gain = model->input_gain; | |||
const float output_gain = model->output_gain; | |||
sample *= input_gain; | |||
std::visit( | |||
[&sample, input_skip, output_gain] (auto&& custom_model) | |||
{ | |||
using ModelType = std::decay_t<decltype (custom_model)>; | |||
float* out = &sample; | |||
if constexpr (ModelType::input_size == 1) | |||
{ | |||
if (input_skip) | |||
{ | |||
sample += custom_model.forward(out); | |||
sample *= output_gain; | |||
} | |||
else | |||
{ | |||
sample = custom_model.forward(out) * output_gain; | |||
} | |||
} | |||
}, | |||
model->variant | |||
); | |||
return sample; | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
struct AidaPluginModule : Module { | |||
enum ParamIds { | |||
PARAM_INPUT_LEVEL, | |||
PARAM_OUTPUT_LEVEL, | |||
NUM_PARAMS | |||
}; | |||
enum InputIds { | |||
AUDIO_INPUT, | |||
NUM_INPUTS | |||
}; | |||
enum OutputIds { | |||
AUDIO_OUTPUT, | |||
NUM_OUTPUTS | |||
}; | |||
enum LightIds { | |||
NUM_LIGHTS | |||
}; | |||
enum Parameters { | |||
kParameterCount | |||
}; | |||
CardinalPluginContext* const pcontext; | |||
bool fileChanged = false; | |||
std::string currentFile; | |||
Biquad dc_blocker { bq_type_highpass, 0.5f, COMMON_Q, 0.0f }; | |||
Biquad in_lpf { bq_type_lowpass, 0.5f, COMMON_Q, 0.0f }; | |||
dsp::ExponentialFilter inlevel; | |||
dsp::ExponentialFilter outlevel; | |||
DynamicModel* model = nullptr; | |||
std::atomic<bool> activeModel { false }; | |||
AidaPluginModule() | |||
: pcontext(static_cast<CardinalPluginContext*>(APP)) | |||
{ | |||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
configInput(AUDIO_INPUT, "Audio"); | |||
configOutput(AUDIO_OUTPUT, "Audio"); | |||
configParam(PARAM_INPUT_LEVEL, -12.f, 12.f, 0.f, "Input level", " dB"); | |||
configParam(PARAM_OUTPUT_LEVEL, -12.f, 12.f, 0.f, "Output level", " dB"); | |||
inlevel.setTau(1 / 30.f); | |||
outlevel.setTau(1 / 30.f); | |||
} | |||
~AidaPluginModule() override | |||
{ | |||
delete model; | |||
} | |||
json_t* dataToJson() override | |||
{ | |||
json_t* const rootJ = json_object(); | |||
DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr, nullptr); | |||
json_object_set_new(rootJ, "filepath", json_string(currentFile.c_str())); | |||
return rootJ; | |||
} | |||
void dataFromJson(json_t* const rootJ) override | |||
{ | |||
fileChanged = false; | |||
if (json_t* const filepathJ = json_object_get(rootJ, "filepath")) | |||
{ | |||
const char* const filepath = json_string_value(filepathJ); | |||
if (filepath[0] != '\0') | |||
{ | |||
currentFile = filepath; | |||
fileChanged = true; | |||
loadModelFromFile(filepath); | |||
} | |||
} | |||
if (! fileChanged) | |||
{ | |||
currentFile.clear(); | |||
fileChanged = true; | |||
} | |||
} | |||
void loadModelFromFile(const char* const filename) | |||
{ | |||
try { | |||
std::ifstream jsonStream(filename, std::ifstream::binary); | |||
loadModelFromStream(jsonStream); | |||
} | |||
catch (const std::exception& e) { | |||
d_stderr2("Unable to load json file: %s\nError: %s", filename, e.what()); | |||
}; | |||
} | |||
void loadModelFromStream(std::istream& jsonStream) | |||
{ | |||
int input_size; | |||
int input_skip; | |||
float input_gain; | |||
float output_gain; | |||
nlohmann::json model_json; | |||
try { | |||
jsonStream >> model_json; | |||
/* Understand which model type to load */ | |||
input_size = model_json["in_shape"].back().get<int>(); | |||
if (input_size > 1) { // MAX_INPUT_SIZE | |||
throw std::invalid_argument("Value for input_size not supported"); | |||
} | |||
if (model_json["in_skip"].is_number()) { | |||
input_skip = model_json["in_skip"].get<int>(); | |||
if (input_skip > 1) | |||
throw std::invalid_argument("Values for in_skip > 1 are not supported"); | |||
} | |||
else { | |||
input_skip = 0; | |||
} | |||
if (model_json["in_gain"].is_number()) { | |||
input_gain = DB_CO(model_json["in_gain"].get<float>()); | |||
} | |||
else { | |||
input_gain = 1.0f; | |||
} | |||
if (model_json["out_gain"].is_number()) { | |||
output_gain = DB_CO(model_json["out_gain"].get<float>()); | |||
} | |||
else { | |||
output_gain = 1.0f; | |||
} | |||
} | |||
catch (const std::exception& e) { | |||
d_stderr2("Unable to load json, error: %s", e.what()); | |||
return; | |||
} | |||
std::unique_ptr<DynamicModel> newmodel = std::make_unique<DynamicModel>(); | |||
try { | |||
if (! custom_model_creator (model_json, newmodel->variant)) | |||
throw std::runtime_error ("Unable to identify a known model architecture!"); | |||
std::visit ( | |||
[&model_json] (auto&& custom_model) | |||
{ | |||
using ModelType = std::decay_t<decltype (custom_model)>; | |||
if constexpr (! std::is_same_v<ModelType, NullModel>) | |||
{ | |||
custom_model.parseJson (model_json, true); | |||
custom_model.reset(); | |||
} | |||
}, | |||
newmodel->variant); | |||
} | |||
catch (const std::exception& e) { | |||
d_stderr2("Error loading model: %s", e.what()); | |||
return; | |||
} | |||
// save extra info | |||
newmodel->input_skip = input_skip != 0; | |||
newmodel->input_gain = input_gain; | |||
newmodel->output_gain = output_gain; | |||
// Pre-buffer to avoid "clicks" during initialization | |||
float out[2048] = {}; | |||
applyModel(newmodel.get(), out, ARRAY_SIZE(out)); | |||
// swap active model | |||
DynamicModel* const oldmodel = model; | |||
model = newmodel.release(); | |||
// if processing, wait for process cycle to complete | |||
while (oldmodel != nullptr && activeModel.load()) | |||
d_msleep(1); | |||
delete oldmodel; | |||
} | |||
void process(const ProcessArgs& args) override | |||
{ | |||
const float stime = args.sampleTime; | |||
const float inlevelv = DB_CO(params[PARAM_INPUT_LEVEL].getValue()); | |||
const float outlevelv = DB_CO(params[PARAM_OUTPUT_LEVEL].getValue()); | |||
// High frequencies roll-off (lowpass) | |||
float sample = in_lpf.process(inputs[AUDIO_INPUT].getVoltage() * 0.1f) * inlevel.process(stime, inlevelv); | |||
// run model | |||
if (model != nullptr) | |||
{ | |||
activeModel.store(true); | |||
sample = applyModel(model, sample); | |||
activeModel.store(false); | |||
} | |||
// DC blocker filter (highpass) | |||
outputs[AUDIO_OUTPUT].setVoltage(dc_blocker.process(sample) * outlevel.process(stime, outlevelv) * 10.f); | |||
} | |||
void onSampleRateChange(const SampleRateChangeEvent& e) override | |||
{ | |||
dc_blocker.setFc(35.0f / e.sampleRate); | |||
in_lpf.setFc(MAP(66.216f, 0.0f, 100.0f, INLPF_MAX_CO, INLPF_MIN_CO)); | |||
} | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AidaPluginModule) | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
#ifndef HEADLESS | |||
struct AidaModelListWidget : ImGuiWidget { | |||
AidaPluginModule* const module; | |||
/* | |||
bool showError = false; | |||
String errorMessage; | |||
*/ | |||
struct ghcFile { | |||
std::string full, base; | |||
bool operator<(const ghcFile& other) const noexcept { return base < other.base; } | |||
}; | |||
std::string currentDirectory; | |||
std::vector<ghcFile> currentFiles; | |||
size_t selectedFile = (size_t)-1; | |||
AidaModelListWidget(AidaPluginModule* const m) | |||
: ImGuiWidget(), | |||
module(m) | |||
{ | |||
if (module->fileChanged) | |||
reloadDir(); | |||
} | |||
void drawImGui() override | |||
{ | |||
const float scaleFactor = getScaleFactor(); | |||
const int flags = ImGuiWindowFlags_NoSavedSettings | |||
| ImGuiWindowFlags_NoTitleBar | |||
| ImGuiWindowFlags_NoResize | |||
| ImGuiWindowFlags_NoCollapse | |||
| ImGuiWindowFlags_NoScrollbar | |||
| ImGuiWindowFlags_NoScrollWithMouse; | |||
ImGui::SetNextWindowPos(ImVec2(0, 0)); | |||
ImGui::SetNextWindowSize(ImVec2(box.size.x * scaleFactor, box.size.y * scaleFactor)); | |||
if (ImGui::Begin("Model File List", nullptr, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize)) | |||
{ | |||
/* | |||
if (showError) | |||
{ | |||
showError = false; | |||
ImGui::OpenPopup("Audio File Error"); | |||
} | |||
if (ImGui::BeginPopupModal("Model File Error", nullptr, flags)) | |||
{ | |||
ImGui::TextWrapped("Failed to load model file, error was:\n%s", errorMessage.buffer()); | |||
ImGui::Separator(); | |||
if (ImGui::Button("Ok")) | |||
ImGui::CloseCurrentPopup(); | |||
ImGui::EndPopup(); | |||
} | |||
else | |||
*/ | |||
if (ImGui::BeginTable("modellist", 1, ImGuiTableFlags_NoSavedSettings)) | |||
{ | |||
for (size_t i=0, count=currentFiles.size(); i < count; ++i) | |||
{ | |||
bool wasSelected = selectedFile == i; | |||
bool selected = wasSelected; | |||
ImGui::TableNextRow(); | |||
ImGui::TableSetColumnIndex(0); | |||
ImGui::Selectable(currentFiles[i].base.c_str(), &selected); | |||
if (selected && ! wasSelected) | |||
{ | |||
selectedFile = i; | |||
module->currentFile = currentFiles[i].full; | |||
module->loadModelFromFile(currentFiles[i].full.c_str()); | |||
} | |||
} | |||
ImGui::EndTable(); | |||
} | |||
} | |||
ImGui::End(); | |||
} | |||
void step() override | |||
{ | |||
if (module->fileChanged) | |||
reloadDir(); | |||
ImGuiWidget::step(); | |||
} | |||
void reloadDir() | |||
{ | |||
module->fileChanged = false; | |||
currentFiles.clear(); | |||
selectedFile = (size_t)-1; | |||
static constexpr const char* const supportedExtensions[] = { | |||
".json" | |||
}; | |||
using namespace ghc::filesystem; | |||
const path currentFile = u8path(module->currentFile); | |||
currentDirectory = currentFile.parent_path().generic_u8string(); | |||
directory_iterator it; | |||
try { | |||
it = directory_iterator(u8path(currentDirectory)); | |||
} DISTRHO_SAFE_EXCEPTION_RETURN("Failed to open current directory",); | |||
for (directory_iterator itb = begin(it), ite=end(it); itb != ite; ++itb) | |||
{ | |||
if (! itb->is_regular_file()) | |||
continue; | |||
const path filepath = itb->path(); | |||
const path extension = filepath.extension(); | |||
for (size_t i=0; i<ARRAY_SIZE(supportedExtensions); ++i) | |||
{ | |||
if (extension.compare(supportedExtensions[i]) == 0) | |||
{ | |||
currentFiles.push_back({ filepath.generic_u8string(), filepath.filename().generic_u8string() }); | |||
break; | |||
} | |||
} | |||
} | |||
std::sort(currentFiles.begin(), currentFiles.end()); | |||
for (size_t index = 0; index < currentFiles.size(); ++index) | |||
{ | |||
if (currentFiles[index].full.compare(currentFile) == 0) | |||
{ | |||
selectedFile = index; | |||
break; | |||
} | |||
} | |||
} | |||
}; | |||
struct AidaKnob : app::SvgKnob { | |||
AidaKnob() | |||
{ | |||
minAngle = -0.76 * M_PI; | |||
maxAngle = 0.76 * M_PI; | |||
shadow->opacity = 0; | |||
setSvg(APP->window->loadSvg(asset::plugin(pluginInstance, "res/aida-x-knob.svg"))); | |||
} | |||
}; | |||
struct AidaWidget : ModuleWidgetWithSideScrews<23> { | |||
static constexpr const float previewBoxHeight = 80.0f; | |||
static constexpr const float previewBoxBottom = 20.0f; | |||
static constexpr const float previewBoxRect[] = {8.0f, | |||
380.0f - previewBoxHeight - previewBoxBottom, | |||
15.0f * 23 - 16.0f, | |||
previewBoxHeight}; | |||
static constexpr const float startY_list = startY - 2.0f; | |||
static constexpr const float fileListHeight = 380.0f - startY_list - previewBoxHeight - previewBoxBottom * 1.5f; | |||
static constexpr const float startY_preview = startY_list + fileListHeight; | |||
AidaPluginModule* const module; | |||
AidaWidget(AidaPluginModule* const m) | |||
: module(m) | |||
{ | |||
setModule(module); | |||
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/AIDA-X.svg"))); | |||
createAndAddScrews(); | |||
addInput(createInput<PJ301MPort>(Vec(startX_In, 25), module, 0)); | |||
addOutput(createOutput<PJ301MPort>(Vec(startX_Out, 25), module, 0)); | |||
addChild(createParamCentered<AidaKnob>(Vec(box.size.x * 0.5f - 50, box.size.y - 60), | |||
module, AidaPluginModule::PARAM_INPUT_LEVEL)); | |||
addChild(createParamCentered<AidaKnob>(Vec(box.size.x * 0.5f + 50, box.size.y - 60), | |||
module, AidaPluginModule::PARAM_OUTPUT_LEVEL)); | |||
if (m != nullptr) | |||
{ | |||
AidaModelListWidget* const listw = new AidaModelListWidget(m); | |||
listw->box.pos = Vec(0, startY_list); | |||
listw->box.size = Vec(box.size.x, fileListHeight); | |||
addChild(listw); | |||
} | |||
} | |||
void draw(const DrawArgs& args) override | |||
{ | |||
drawBackground(args.vg); | |||
drawOutputJacksArea(args.vg); | |||
ModuleWidget::draw(args); | |||
} | |||
void drawOutputJacksArea(NVGcontext* const vg) | |||
{ | |||
nvgBeginPath(vg); | |||
nvgRoundedRect(vg, startX_Out - 2.5f, startY_list * 0.5f - padding * 0.5f, padding, padding, 4); | |||
nvgFillColor(vg, nvgRGB(0xd0, 0xd0, 0xd0)); | |||
nvgFill(vg); | |||
} | |||
void appendContextMenu(ui::Menu* const menu) override | |||
{ | |||
menu->addChild(new ui::MenuSeparator); | |||
struct LoadModelFileItem : MenuItem { | |||
AidaPluginModule* const module; | |||
LoadModelFileItem(AidaPluginModule* const m) | |||
: module(m) | |||
{ | |||
text = "Load model file..."; | |||
} | |||
void onAction(const event::Action&) override | |||
{ | |||
AidaPluginModule* const module = this->module; | |||
async_dialog_filebrowser(false, nullptr, nullptr, text.c_str(), [module](char* path) | |||
{ | |||
if (path == nullptr) | |||
return; | |||
module->currentFile = path; | |||
module->fileChanged = true; | |||
module->loadModelFromFile(path); | |||
std::free(path); | |||
}); | |||
} | |||
}; | |||
menu->addChild(new LoadModelFileItem(module)); | |||
} | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AidaWidget) | |||
}; | |||
#else | |||
struct AidaWidget : ModuleWidget { | |||
AidaWidget(AidaPluginModule* const module) { | |||
setModule(module); | |||
addInput(createInput<PJ301MPort>({}, module, 0)); | |||
addOutput(createOutput<PJ301MPort>({}, module, 0)); | |||
} | |||
}; | |||
#endif | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
Model* modelAidaX = createModel<AidaPluginModule, AidaWidget>("AIDA-X"); | |||
// -------------------------------------------------------------------------------------------------------------------- |
@@ -0,0 +1,165 @@ | |||
// | |||
// Biquad.cpp | |||
// | |||
// Created by Nigel Redmon on 11/24/12 | |||
// EarLevel Engineering: earlevel.com | |||
// Copyright 2012 Nigel Redmon | |||
// | |||
// For a complete explanation of the Biquad code: | |||
// http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/ | |||
// | |||
// License: | |||
// | |||
// This source code is provided as is, without warranty. | |||
// You may copy and distribute verbatim copies of this document. | |||
// You may modify and use this source code to create binary code | |||
// for your own purposes, free or commercial. | |||
// | |||
#include <math.h> | |||
#include "Biquad.h" | |||
Biquad::Biquad() { | |||
type = bq_type_lowpass; | |||
a0 = 1.0; | |||
a1 = a2 = b1 = b2 = 0.0; | |||
Fc = 0.50; | |||
Q = 0.707; | |||
peakGain = 0.0; | |||
z1 = z2 = 0.0; | |||
} | |||
Biquad::Biquad(int type, double Fc, double Q, double peakGainDB) { | |||
setBiquad(type, Fc, Q, peakGainDB); | |||
z1 = z2 = 0.0; | |||
} | |||
Biquad::~Biquad() { | |||
} | |||
void Biquad::setType(int type) { | |||
this->type = type; | |||
calcBiquad(); | |||
} | |||
void Biquad::setQ(double Q) { | |||
this->Q = Q; | |||
calcBiquad(); | |||
} | |||
void Biquad::setFc(double Fc) { | |||
this->Fc = Fc; | |||
calcBiquad(); | |||
} | |||
void Biquad::setPeakGain(double peakGainDB) { | |||
this->peakGain = peakGainDB; | |||
calcBiquad(); | |||
} | |||
void Biquad::setBiquad(int type, double Fc, double Q, double peakGainDB) { | |||
this->type = type; | |||
this->Q = Q; | |||
this->Fc = Fc; | |||
setPeakGain(peakGainDB); | |||
} | |||
void Biquad::calcBiquad(void) { | |||
double norm; | |||
double V = pow(10, fabs(peakGain) / 20.0); | |||
double K = tan(M_PI * Fc); | |||
switch (this->type) { | |||
case bq_type_lowpass: | |||
norm = 1 / (1 + K / Q + K * K); | |||
a0 = K * K * norm; | |||
a1 = 2 * a0; | |||
a2 = a0; | |||
b1 = 2 * (K * K - 1) * norm; | |||
b2 = (1 - K / Q + K * K) * norm; | |||
break; | |||
case bq_type_highpass: | |||
norm = 1 / (1 + K / Q + K * K); | |||
a0 = 1 * norm; | |||
a1 = -2 * a0; | |||
a2 = a0; | |||
b1 = 2 * (K * K - 1) * norm; | |||
b2 = (1 - K / Q + K * K) * norm; | |||
break; | |||
case bq_type_bandpass: | |||
norm = 1 / (1 + K / Q + K * K); | |||
a0 = K / Q * norm; | |||
a1 = 0; | |||
a2 = -a0; | |||
b1 = 2 * (K * K - 1) * norm; | |||
b2 = (1 - K / Q + K * K) * norm; | |||
break; | |||
case bq_type_notch: | |||
norm = 1 / (1 + K / Q + K * K); | |||
a0 = (1 + K * K) * norm; | |||
a1 = 2 * (K * K - 1) * norm; | |||
a2 = a0; | |||
b1 = a1; | |||
b2 = (1 - K / Q + K * K) * norm; | |||
break; | |||
case bq_type_peak: | |||
if (peakGain >= 0) { // boost | |||
norm = 1 / (1 + 1/Q * K + K * K); | |||
a0 = (1 + V/Q * K + K * K) * norm; | |||
a1 = 2 * (K * K - 1) * norm; | |||
a2 = (1 - V/Q * K + K * K) * norm; | |||
b1 = a1; | |||
b2 = (1 - 1/Q * K + K * K) * norm; | |||
} | |||
else { // cut | |||
norm = 1 / (1 + V/Q * K + K * K); | |||
a0 = (1 + 1/Q * K + K * K) * norm; | |||
a1 = 2 * (K * K - 1) * norm; | |||
a2 = (1 - 1/Q * K + K * K) * norm; | |||
b1 = a1; | |||
b2 = (1 - V/Q * K + K * K) * norm; | |||
} | |||
break; | |||
case bq_type_lowshelf: | |||
if (peakGain >= 0) { // boost | |||
norm = 1 / (1 + sqrt(2) * K + K * K); | |||
a0 = (1 + sqrt(2*V) * K + V * K * K) * norm; | |||
a1 = 2 * (V * K * K - 1) * norm; | |||
a2 = (1 - sqrt(2*V) * K + V * K * K) * norm; | |||
b1 = 2 * (K * K - 1) * norm; | |||
b2 = (1 - sqrt(2) * K + K * K) * norm; | |||
} | |||
else { // cut | |||
norm = 1 / (1 + sqrt(2*V) * K + V * K * K); | |||
a0 = (1 + sqrt(2) * K + K * K) * norm; | |||
a1 = 2 * (K * K - 1) * norm; | |||
a2 = (1 - sqrt(2) * K + K * K) * norm; | |||
b1 = 2 * (V * K * K - 1) * norm; | |||
b2 = (1 - sqrt(2*V) * K + V * K * K) * norm; | |||
} | |||
break; | |||
case bq_type_highshelf: | |||
if (peakGain >= 0) { // boost | |||
norm = 1 / (1 + sqrt(2) * K + K * K); | |||
a0 = (V + sqrt(2*V) * K + K * K) * norm; | |||
a1 = 2 * (K * K - V) * norm; | |||
a2 = (V - sqrt(2*V) * K + K * K) * norm; | |||
b1 = 2 * (K * K - 1) * norm; | |||
b2 = (1 - sqrt(2) * K + K * K) * norm; | |||
} | |||
else { // cut | |||
norm = 1 / (V + sqrt(2*V) * K + K * K); | |||
a0 = (1 + sqrt(2) * K + K * K) * norm; | |||
a1 = 2 * (K * K - 1) * norm; | |||
a2 = (1 - sqrt(2) * K + K * K) * norm; | |||
b1 = 2 * (K * K - V) * norm; | |||
b2 = (V - sqrt(2*V) * K + K * K) * norm; | |||
} | |||
break; | |||
} | |||
return; | |||
} |
@@ -0,0 +1,60 @@ | |||
// | |||
// Biquad.h | |||
// | |||
// Created by Nigel Redmon on 11/24/12 | |||
// EarLevel Engineering: earlevel.com | |||
// Copyright 2012 Nigel Redmon | |||
// | |||
// For a complete explanation of the Biquad code: | |||
// http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/ | |||
// | |||
// License: | |||
// | |||
// This source code is provided as is, without warranty. | |||
// You may copy and distribute verbatim copies of this document. | |||
// You may modify and use this source code to create binary code | |||
// for your own purposes, free or commercial. | |||
// | |||
#ifndef Biquad_h | |||
#define Biquad_h | |||
enum { | |||
bq_type_lowpass = 0, | |||
bq_type_highpass, | |||
bq_type_bandpass, | |||
bq_type_notch, | |||
bq_type_peak, | |||
bq_type_lowshelf, | |||
bq_type_highshelf | |||
}; | |||
class Biquad { | |||
public: | |||
Biquad(); | |||
Biquad(int type, double Fc, double Q, double peakGainDB); | |||
~Biquad(); | |||
void setType(int type); | |||
void setQ(double Q); | |||
void setFc(double Fc); | |||
void setPeakGain(double peakGainDB); | |||
void setBiquad(int type, double Fc, double Q, double peakGainDB); | |||
float process(float in); | |||
protected: | |||
void calcBiquad(void); | |||
int type; | |||
double a0, a1, a2, b1, b2; | |||
double Fc, Q, peakGain; | |||
double z1, z2; | |||
}; | |||
inline float Biquad::process(float in) { | |||
double out = in * a0 + z1; | |||
z1 = in * a1 + z2 - b1 * out; | |||
z2 = in * a2 - b2 * out; | |||
return out; | |||
} | |||
#endif // Biquad_h |
@@ -0,0 +1 @@ | |||
Subproject commit 74e9d354937346f31858e976a2eefc1c25cdcccd |
@@ -0,0 +1,683 @@ | |||
#include <variant> | |||
#include <RTNeural/RTNeural.h> | |||
#define MAX_INPUT_SIZE 3 | |||
struct NullModel { static constexpr int input_size = 0; static constexpr int output_size = 0; }; | |||
using ModelType_GRU_8_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 8>, RTNeural::DenseT<float, 8, 1>>; | |||
using ModelType_GRU_8_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 8>, RTNeural::DenseT<float, 8, 1>>; | |||
using ModelType_GRU_8_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 8>, RTNeural::DenseT<float, 8, 1>>; | |||
using ModelType_GRU_12_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 12>, RTNeural::DenseT<float, 12, 1>>; | |||
using ModelType_GRU_12_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 12>, RTNeural::DenseT<float, 12, 1>>; | |||
using ModelType_GRU_12_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 12>, RTNeural::DenseT<float, 12, 1>>; | |||
using ModelType_GRU_16_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 16>, RTNeural::DenseT<float, 16, 1>>; | |||
using ModelType_GRU_16_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 16>, RTNeural::DenseT<float, 16, 1>>; | |||
using ModelType_GRU_16_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 16>, RTNeural::DenseT<float, 16, 1>>; | |||
using ModelType_GRU_20_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 20>, RTNeural::DenseT<float, 20, 1>>; | |||
using ModelType_GRU_20_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 20>, RTNeural::DenseT<float, 20, 1>>; | |||
using ModelType_GRU_20_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 20>, RTNeural::DenseT<float, 20, 1>>; | |||
using ModelType_GRU_32_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 32>, RTNeural::DenseT<float, 32, 1>>; | |||
using ModelType_GRU_32_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 32>, RTNeural::DenseT<float, 32, 1>>; | |||
using ModelType_GRU_32_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 32>, RTNeural::DenseT<float, 32, 1>>; | |||
using ModelType_GRU_40_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 40>, RTNeural::DenseT<float, 40, 1>>; | |||
using ModelType_GRU_40_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 40>, RTNeural::DenseT<float, 40, 1>>; | |||
using ModelType_GRU_40_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 40>, RTNeural::DenseT<float, 40, 1>>; | |||
using ModelType_GRU_64_1 = RTNeural::ModelT<float, 1, 1, RTNeural::GRULayerT<float, 1, 64>, RTNeural::DenseT<float, 64, 1>>; | |||
using ModelType_GRU_64_2 = RTNeural::ModelT<float, 2, 1, RTNeural::GRULayerT<float, 2, 64>, RTNeural::DenseT<float, 64, 1>>; | |||
using ModelType_GRU_64_3 = RTNeural::ModelT<float, 3, 1, RTNeural::GRULayerT<float, 3, 64>, RTNeural::DenseT<float, 64, 1>>; | |||
using ModelType_LSTM_8_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 8>, RTNeural::DenseT<float, 8, 1>>; | |||
using ModelType_LSTM_8_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 8>, RTNeural::DenseT<float, 8, 1>>; | |||
using ModelType_LSTM_8_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 8>, RTNeural::DenseT<float, 8, 1>>; | |||
using ModelType_LSTM_12_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 12>, RTNeural::DenseT<float, 12, 1>>; | |||
using ModelType_LSTM_12_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 12>, RTNeural::DenseT<float, 12, 1>>; | |||
using ModelType_LSTM_12_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 12>, RTNeural::DenseT<float, 12, 1>>; | |||
using ModelType_LSTM_16_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 16>, RTNeural::DenseT<float, 16, 1>>; | |||
using ModelType_LSTM_16_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 16>, RTNeural::DenseT<float, 16, 1>>; | |||
using ModelType_LSTM_16_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 16>, RTNeural::DenseT<float, 16, 1>>; | |||
using ModelType_LSTM_20_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 20>, RTNeural::DenseT<float, 20, 1>>; | |||
using ModelType_LSTM_20_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 20>, RTNeural::DenseT<float, 20, 1>>; | |||
using ModelType_LSTM_20_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 20>, RTNeural::DenseT<float, 20, 1>>; | |||
using ModelType_LSTM_32_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 32>, RTNeural::DenseT<float, 32, 1>>; | |||
using ModelType_LSTM_32_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 32>, RTNeural::DenseT<float, 32, 1>>; | |||
using ModelType_LSTM_32_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 32>, RTNeural::DenseT<float, 32, 1>>; | |||
using ModelType_LSTM_40_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 40>, RTNeural::DenseT<float, 40, 1>>; | |||
using ModelType_LSTM_40_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 40>, RTNeural::DenseT<float, 40, 1>>; | |||
using ModelType_LSTM_40_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 40>, RTNeural::DenseT<float, 40, 1>>; | |||
using ModelType_LSTM_64_1 = RTNeural::ModelT<float, 1, 1, RTNeural::LSTMLayerT<float, 1, 64>, RTNeural::DenseT<float, 64, 1>>; | |||
using ModelType_LSTM_64_2 = RTNeural::ModelT<float, 2, 1, RTNeural::LSTMLayerT<float, 2, 64>, RTNeural::DenseT<float, 64, 1>>; | |||
using ModelType_LSTM_64_3 = RTNeural::ModelT<float, 3, 1, RTNeural::LSTMLayerT<float, 3, 64>, RTNeural::DenseT<float, 64, 1>>; | |||
using ModelVariantType = std::variant<NullModel,ModelType_GRU_8_1,ModelType_GRU_8_2,ModelType_GRU_8_3,ModelType_GRU_12_1,ModelType_GRU_12_2,ModelType_GRU_12_3,ModelType_GRU_16_1,ModelType_GRU_16_2,ModelType_GRU_16_3,ModelType_GRU_20_1,ModelType_GRU_20_2,ModelType_GRU_20_3,ModelType_GRU_32_1,ModelType_GRU_32_2,ModelType_GRU_32_3,ModelType_GRU_40_1,ModelType_GRU_40_2,ModelType_GRU_40_3,ModelType_GRU_64_1,ModelType_GRU_64_2,ModelType_GRU_64_3,ModelType_LSTM_8_1,ModelType_LSTM_8_2,ModelType_LSTM_8_3,ModelType_LSTM_12_1,ModelType_LSTM_12_2,ModelType_LSTM_12_3,ModelType_LSTM_16_1,ModelType_LSTM_16_2,ModelType_LSTM_16_3,ModelType_LSTM_20_1,ModelType_LSTM_20_2,ModelType_LSTM_20_3,ModelType_LSTM_32_1,ModelType_LSTM_32_2,ModelType_LSTM_32_3,ModelType_LSTM_40_1,ModelType_LSTM_40_2,ModelType_LSTM_40_3,ModelType_LSTM_64_1,ModelType_LSTM_64_2,ModelType_LSTM_64_3>; | |||
inline bool is_model_type_ModelType_GRU_8_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 8; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_8_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 8; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_8_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 8; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_12_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 12; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_12_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 12; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_12_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 12; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_16_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 16; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_16_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 16; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_16_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 16; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_20_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 20; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_20_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 20; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_20_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 20; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_32_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 32; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_32_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 32; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_32_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 32; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_40_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 40; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_40_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 40; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_40_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 40; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_64_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 64; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_64_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 64; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_GRU_64_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "gru"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 64; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_8_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 8; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_8_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 8; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_8_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 8; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_12_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 12; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_12_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 12; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_12_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 12; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_16_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 16; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_16_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 16; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_16_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 16; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_20_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 20; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_20_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 20; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_20_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 20; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_32_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 32; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_32_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 32; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_32_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 32; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_40_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 40; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_40_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 40; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_40_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 40; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_64_1 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 64; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 1; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_64_2 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 64; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 2; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool is_model_type_ModelType_LSTM_64_3 (const nlohmann::json& model_json) { | |||
const auto json_layers = model_json.at ("layers"); | |||
const auto rnn_layer_type = json_layers.at (0).at ("type").get<std::string>(); | |||
const auto is_layer_type_correct = rnn_layer_type == "lstm"; | |||
const auto hidden_size = json_layers.at (0).at ("shape").back().get<int>(); | |||
const auto is_hidden_size_correct = hidden_size == 64; | |||
const auto input_size = model_json.at ("in_shape").back().get<int>(); | |||
const auto is_input_size_correct = input_size == 3; | |||
return is_layer_type_correct && is_hidden_size_correct && is_input_size_correct; | |||
} | |||
inline bool custom_model_creator (const nlohmann::json& model_json, ModelVariantType& model) { | |||
if (is_model_type_ModelType_GRU_8_1 (model_json)) { | |||
model.emplace<ModelType_GRU_8_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_8_2 (model_json)) { | |||
model.emplace<ModelType_GRU_8_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_8_3 (model_json)) { | |||
model.emplace<ModelType_GRU_8_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_12_1 (model_json)) { | |||
model.emplace<ModelType_GRU_12_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_12_2 (model_json)) { | |||
model.emplace<ModelType_GRU_12_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_12_3 (model_json)) { | |||
model.emplace<ModelType_GRU_12_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_16_1 (model_json)) { | |||
model.emplace<ModelType_GRU_16_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_16_2 (model_json)) { | |||
model.emplace<ModelType_GRU_16_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_16_3 (model_json)) { | |||
model.emplace<ModelType_GRU_16_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_20_1 (model_json)) { | |||
model.emplace<ModelType_GRU_20_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_20_2 (model_json)) { | |||
model.emplace<ModelType_GRU_20_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_20_3 (model_json)) { | |||
model.emplace<ModelType_GRU_20_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_32_1 (model_json)) { | |||
model.emplace<ModelType_GRU_32_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_32_2 (model_json)) { | |||
model.emplace<ModelType_GRU_32_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_32_3 (model_json)) { | |||
model.emplace<ModelType_GRU_32_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_40_1 (model_json)) { | |||
model.emplace<ModelType_GRU_40_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_40_2 (model_json)) { | |||
model.emplace<ModelType_GRU_40_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_40_3 (model_json)) { | |||
model.emplace<ModelType_GRU_40_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_64_1 (model_json)) { | |||
model.emplace<ModelType_GRU_64_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_64_2 (model_json)) { | |||
model.emplace<ModelType_GRU_64_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_GRU_64_3 (model_json)) { | |||
model.emplace<ModelType_GRU_64_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_8_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_8_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_8_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_8_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_8_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_8_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_12_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_12_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_12_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_12_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_12_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_12_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_16_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_16_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_16_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_16_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_16_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_16_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_20_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_20_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_20_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_20_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_20_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_20_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_32_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_32_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_32_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_32_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_32_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_32_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_40_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_40_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_40_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_40_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_40_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_40_3>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_64_1 (model_json)) { | |||
model.emplace<ModelType_LSTM_64_1>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_64_2 (model_json)) { | |||
model.emplace<ModelType_LSTM_64_2>(); | |||
return true; | |||
} | |||
else if (is_model_type_ModelType_LSTM_64_3 (model_json)) { | |||
model.emplace<ModelType_LSTM_64_3>(); | |||
return true; | |||
} | |||
model.emplace<NullModel>(); | |||
return false; | |||
} |
@@ -28,6 +28,7 @@ using namespace rack; | |||
extern Plugin* pluginInstance; | |||
extern Model* modelAidaX; | |||
extern Model* modelAudioFile; | |||
extern Model* modelAudioToCVPitch; | |||
extern Model* modelCarla; | |||
@@ -223,6 +223,7 @@ MINIPLUGIN_FILES = plugins-mini.cpp | |||
# -------------------------------------------------------------- | |||
# Cardinal (built-in) | |||
PLUGIN_FILES += Cardinal/src/AIDA-X.cpp | |||
PLUGIN_FILES += Cardinal/src/Blank.cpp | |||
PLUGIN_FILES += Cardinal/src/ExpanderInputMIDI.cpp | |||
PLUGIN_FILES += Cardinal/src/ExpanderOutputMIDI.cpp | |||
@@ -1306,6 +1307,20 @@ ifeq ($(WASM),true) | |||
CARLA_FLAGS += -DDISTRHO_RUNNER_INDIRECT_WASM_CALLS | |||
endif | |||
# -------------------------------------------------------------- | |||
# RTNeural flags, used in AIDA-X | |||
RTNEURAL_FLAGS = -std=gnu++17 | |||
RTNEURAL_FLAGS += -DRTNEURAL_DEFAULT_ALIGNMENT=16 | |||
RTNEURAL_FLAGS += -DRTNEURAL_USE_EIGEN=1 | |||
ifeq ($(WASM),true) | |||
RTNEURAL_FLAGS += -DEIGEN_DONT_VECTORIZE=1 | |||
endif | |||
RTNEURAL_FLAGS += -ICardinal/src/AIDA-X/RTNeural | |||
RTNEURAL_FLAGS += -ICardinal/src/AIDA-X/RTNeural/modules/Eigen | |||
# -------------------------------------------------------------- | |||
# Build targets | |||
@@ -1975,6 +1990,19 @@ $(BUILD_DIR)/Cardinal/%.cpp.o: Cardinal/%.cpp | |||
-Dstbrp_rect=stbrp_rect_cardinal \ | |||
$(CARLA_FLAGS) | |||
$(BUILD_DIR)/Cardinal/src/AIDA-X.cpp.o: Cardinal/src/AIDA-X.cpp | |||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
@echo "Compiling $<" | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
-DpluginInstance=pluginInstance__Cardinal \ | |||
-Dstbrp_context=stbrp_context_cardinal \ | |||
-Dstbrp_coord=stbrp_coord_cardinal \ | |||
-Dstbtt_fontinfo=stbtt_fontinfo_cardinal \ | |||
-Dstbrp_node=stbrp_node_cardinal \ | |||
-Dstbrp_rect=stbrp_rect_cardinal \ | |||
$(RTNEURAL_FLAGS) \ | |||
$(CARLA_FLAGS) | |||
$(BUILD_DIR)/21kHz/%.cpp.o: 21kHz/%.cpp | |||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
@echo "Compiling $<" | |||
@@ -212,6 +212,7 @@ static void initStatic__Cardinal() | |||
/* | |||
#endif | |||
*/ | |||
spl.removeModule("AIDA-X"); | |||
spl.removeModule("AudioFile"); | |||
spl.removeModule("Blank"); | |||
spl.removeModule("Carla"); | |||
@@ -972,6 +972,7 @@ static void initStatic__Cardinal() | |||
const StaticPluginLoader spl(p, "Cardinal"); | |||
if (spl.ok()) | |||
{ | |||
p->addModel(modelAidaX); | |||
p->addModel(modelCardinalBlank); | |||
p->addModel(modelExpanderInputMIDI); | |||
p->addModel(modelExpanderOutputMIDI); | |||