Add Audio to CV Pitch Cardinal module
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
19986c3023
commit
0d952f80af
14 changed files with 750 additions and 20 deletions
15
Makefile
15
Makefile
|
@ -67,7 +67,7 @@ DGL_EXTRA_ARGS = \
|
|||
WINDOWS_ICON_ID=401
|
||||
|
||||
# --------------------------------------------------------------
|
||||
# Check for system-wide dependencies
|
||||
# Check for required system-wide dependencies
|
||||
|
||||
ifeq ($(SYSDEPS),true)
|
||||
|
||||
|
@ -125,6 +125,15 @@ endif
|
|||
endif
|
||||
endif
|
||||
|
||||
# --------------------------------------------------------------
|
||||
# Check for optional system-wide dependencies
|
||||
|
||||
ifeq ($(shell pkg-config --exists fftw3f && echo true),true)
|
||||
HAVE_FFTW3F = true
|
||||
else
|
||||
$(warning fftw3f dependency not installed/available)
|
||||
endif
|
||||
|
||||
# --------------------------------------------------------------
|
||||
# MOD builds
|
||||
|
||||
|
@ -202,6 +211,9 @@ ifeq ($(SYSDEPS),true)
|
|||
else
|
||||
$(MAKE) all -C deps
|
||||
endif
|
||||
ifeq ($(HAVE_FFTW3F),true)
|
||||
$(MAKE) all -C deps/aubio
|
||||
endif
|
||||
|
||||
dgl:
|
||||
ifneq ($(HEADLESS),true)
|
||||
|
@ -250,6 +262,7 @@ deps/unzipfx/unzipfx2cat.exe:
|
|||
clean:
|
||||
$(MAKE) distclean -C carla $(CARLA_EXTRA_ARGS) CAN_GENERATE_LV2_TTL=false STATIC_PLUGIN_TARGET=true
|
||||
$(MAKE) clean -C deps
|
||||
$(MAKE) clean -C deps/aubio
|
||||
$(MAKE) clean -C dpf/dgl
|
||||
$(MAKE) clean -C dpf/utils/lv2-ttl-generator
|
||||
$(MAKE) clean -C plugins
|
||||
|
|
140
plugins/Cardinal/orig/AudioToCVPitch.svg
Normal file
140
plugins/Cardinal/orig/AudioToCVPitch.svg
Normal file
|
@ -0,0 +1,140 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="30.48mm"
|
||||
height="128.5mm"
|
||||
viewBox="0 0 30.479999 128.5"
|
||||
version="1.1"
|
||||
id="svg4620"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="AudioToCVPitch.svg">
|
||||
<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>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6"
|
||||
inkscape:cx="62.166118"
|
||||
inkscape:cy="427.68633"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1026"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<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" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-168.5)">
|
||||
<g
|
||||
id="g843"
|
||||
transform="translate(-2.2361371)">
|
||||
<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.58333302px;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.26458332"
|
||||
aria-label="Cardinal">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5305"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5309"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 20.682747,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 -0.573609 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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5311"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 23.45467,178.31808 v -1.87895 h 0.570508 v 4.82451 H 23.45467 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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5315"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 28.108637,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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5319"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 29.029017,176.43913 h 0.570508 v 4.82451 h -0.570508 z" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;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.26458332"
|
||||
x="2.6467977"
|
||||
y="189.18228"
|
||||
id="text845"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan843"
|
||||
x="2.6467977"
|
||||
y="189.18228"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332">ToCV Pitch</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
|
@ -146,6 +146,15 @@
|
|||
"Utility"
|
||||
]
|
||||
},
|
||||
{
|
||||
"slug": "AudioToCVPitch",
|
||||
"name": "Audio To CV Pitch",
|
||||
"description": "Converts a monophonic audio signal to CV pitch",
|
||||
"manualUrl": "https://github.com/DISTRHO/Cardinal/blob/main/docs/CARDINAL-MODULES.md#audio-to-cv-pitch",
|
||||
"tags": [
|
||||
"Utility"
|
||||
]
|
||||
},
|
||||
{
|
||||
"slug": "Carla",
|
||||
"name": "Carla Plugin Host",
|
||||
|
|
179
plugins/Cardinal/res/AudioToCVPitch.svg
Normal file
179
plugins/Cardinal/res/AudioToCVPitch.svg
Normal file
|
@ -0,0 +1,179 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="30.48mm"
|
||||
height="128.5mm"
|
||||
viewBox="0 0 30.479999 128.5"
|
||||
version="1.1"
|
||||
id="svg4620"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="AudioToCVPitch.svg">
|
||||
<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>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6"
|
||||
inkscape:cx="62.166118"
|
||||
inkscape:cy="427.68633"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1026"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<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" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-168.5)">
|
||||
<g
|
||||
id="g843"
|
||||
transform="translate(-2.2361371)">
|
||||
<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.58333302px;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.26458332"
|
||||
aria-label="Cardinal">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5305"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5309"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 20.682747,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 -0.573609 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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5311"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 23.45467,178.31808 v -1.87895 h 0.570508 v 4.82451 H 23.45467 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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5315"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 28.108637,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
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5319"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;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.26458332"
|
||||
d="m 29.029017,176.43913 h 0.570508 v 4.82451 h -0.570508 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
aria-label="ToCV Pitch"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;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.26458332"
|
||||
id="text845">
|
||||
<path
|
||||
d="m 2.6323283,185.58181 h 3.045809 v 0.40997 H 4.4000068 v 3.1905 H 3.9104587 v -3.1905 H 2.6323283 Z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path904"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 6.3364951,186.79242 q -0.3569119,0 -0.5643067,0.27974 -0.2073947,0.27733 -0.2073947,0.76206 0,0.48472 0.2049832,0.76446 0.2073947,0.27733 0.5667182,0.27733 0.3545003,0 0.5618951,-0.27974 0.2073947,-0.27974 0.2073947,-0.76205 0,-0.47991 -0.2073947,-0.75965 -0.2073948,-0.28215 -0.5618951,-0.28215 z m 0,-0.37621 q 0.578776,0 0.9091607,0.37621 0.3303847,0.3762 0.3303847,1.0418 0,0.66318 -0.3303847,1.04179 -0.3303847,0.37621 -0.9091607,0.37621 -0.5811876,0 -0.9115723,-0.37621 -0.3279731,-0.37861 -0.3279731,-1.04179 0,-0.6656 0.3279731,-1.0418 0.3303847,-0.37621 0.9115723,-0.37621 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path906"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 11.026992,185.85914 v 0.51367 q -0.245979,-0.2291 -0.525721,-0.34245 -0.27733,-0.11334 -0.5908341,-0.11334 -0.6173611,0 -0.9453342,0.37862 -0.3279731,0.3762 -0.3279731,1.09002 0,0.71142 0.3279731,1.09003 0.3279731,0.37621 0.9453342,0.37621 0.3135041,0 0.5908341,-0.11335 0.279742,-0.11334 0.525721,-0.34244 v 0.50884 q -0.255626,0.17363 -0.542602,0.26045 -0.284565,0.0868 -0.6028919,0.0868 -0.8175212,0 -1.2877767,-0.4992 -0.4702556,-0.5016 -0.4702556,-1.36736 0,-0.86816 0.4702556,-1.36735 0.4702555,-0.50161 1.2877767,-0.50161 0.3231499,0 0.6077149,0.0868 0.286976,0.0844 0.537779,0.25562 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path908"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 12.707855,189.18228 -1.374594,-3.60047 h 0.508841 l 1.140671,3.03134 1.143083,-3.03134 h 0.506429 l -1.372182,3.60047 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path910"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 17.215074,185.98213 v 1.35289 h 0.612538 q 0.340031,0 0.525721,-0.17604 0.185691,-0.17605 0.185691,-0.50161 0,-0.32315 -0.185691,-0.49919 -0.18569,-0.17605 -0.525721,-0.17605 z m -0.487137,-0.40032 h 1.099675 q 0.605303,0 0.913984,0.27492 0.311092,0.27251 0.311092,0.80064 0,0.53296 -0.311092,0.80546 -0.308681,0.27251 -0.913984,0.27251 h -0.612538 v 1.44694 h -0.487137 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path912"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 19.578409,186.48133 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-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path914"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 21.389495,185.71445 v 0.76688 h 0.913984 v 0.34485 h -0.913984 v 1.46623 q 0,0.33039 0.08923,0.42444 0.09164,0.0941 0.36897,0.0941 h 0.455786 v 0.37138 h -0.455786 q -0.513664,0 -0.709001,-0.19051 -0.195337,-0.19293 -0.195337,-0.69936 v -1.46623 h -0.325561 v -0.34485 h 0.325561 v -0.76688 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path916"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 24.830802,186.58502 v 0.41479 q -0.188102,-0.10369 -0.378616,-0.15434 -0.188102,-0.0531 -0.381028,-0.0531 -0.43167,0 -0.670415,0.27492 -0.238745,0.2725 -0.238745,0.76688 0,0.49437 0.238745,0.76929 0.238745,0.2725 0.670415,0.2725 0.192926,0 0.381028,-0.0506 0.190514,-0.053 0.378616,-0.15675 v 0.40996 q -0.185691,0.0868 -0.385851,0.13023 -0.197748,0.0434 -0.422024,0.0434 -0.610126,0 -0.96945,-0.38344 -0.359323,-0.38344 -0.359323,-1.03456 0,-0.66077 0.361735,-1.03939 0.364146,-0.37862 0.995977,-0.37862 0.204983,0 0.40032,0.0434 0.195337,0.041 0.378616,0.1254 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path918"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 27.847671,187.55206 v 1.63022 h -0.443728 v -1.61575 q 0,-0.38344 -0.149517,-0.57395 -0.149517,-0.19052 -0.448552,-0.19052 -0.359323,0 -0.566718,0.2291 -0.207394,0.2291 -0.207394,0.6246 v 1.52652 h -0.44614 v -3.7524 h 0.44614 v 1.47106 q 0.159163,-0.24357 0.373792,-0.36415 0.217041,-0.12058 0.499195,-0.12058 0.465432,0 0.704177,0.28939 0.238745,0.28698 0.238745,0.84646 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;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.26458332"
|
||||
id="path920"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
|
@ -1,3 +1,4 @@
|
|||
../../../deps/aubio/src
|
||||
../../../include
|
||||
../../../carla/source/backend
|
||||
../../../carla/source/includes
|
||||
|
|
362
plugins/Cardinal/src/AudioToCVPitch.cpp
Normal file
362
plugins/Cardinal/src/AudioToCVPitch.cpp
Normal file
|
@ -0,0 +1,362 @@
|
|||
/*
|
||||
* DISTRHO Cardinal Plugin
|
||||
* Copyright (C) 2021-2022 Bram Giesen
|
||||
* Copyright (C) 2022 Filipe Coelho <falktx@falktx.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of
|
||||
* the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* For a full copy of the GNU General Public License see the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "plugincontext.hpp"
|
||||
#include "ModuleWidgets.hpp"
|
||||
#include "Widgets.hpp"
|
||||
|
||||
extern "C" {
|
||||
#include "aubio.h"
|
||||
}
|
||||
|
||||
USE_NAMESPACE_DISTRHO;
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// aubio setup values (tested under 48 kHz sample rate)
|
||||
static constexpr const uint32_t kAubioHopSize = 1;
|
||||
static constexpr const uint32_t kAubioBufferSize = (1024 + 256 + 128) / kAubioHopSize;
|
||||
|
||||
// default values
|
||||
static constexpr const float kDefaultSensitivity = 50.f;
|
||||
static constexpr const float kDefaultTolerance = 6.25f;
|
||||
static constexpr const float kDefaultThreshold = 12.5f;
|
||||
|
||||
// static checks
|
||||
static_assert(sizeof(smpl_t) == sizeof(float), "smpl_t is float");
|
||||
static_assert(kAubioBufferSize % kAubioHopSize == 0, "kAubioBufferSize / kAubioHopSize has no remainder");
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
struct AudioToCVPitch : Module {
|
||||
enum ParamIds {
|
||||
PARAM_SENSITIVITY,
|
||||
PARAM_CONFIDENCETHRESHOLD,
|
||||
PARAM_TOLERANCE,
|
||||
PARAM_OCTAVE,
|
||||
NUM_PARAMS
|
||||
};
|
||||
enum InputIds {
|
||||
AUDIO_INPUT,
|
||||
NUM_INPUTS
|
||||
};
|
||||
enum OutputIds {
|
||||
CV_PITCH,
|
||||
CV_GATE,
|
||||
NUM_OUTPUTS
|
||||
};
|
||||
enum LightIds {
|
||||
NUM_LIGHTS
|
||||
};
|
||||
|
||||
bool holdOutputPitch = true;
|
||||
bool smooth = true;
|
||||
int octave = 0;
|
||||
|
||||
float lastKnownPitchInHz = 0.f;
|
||||
float lastKnownPitchConfidence = 0.f;
|
||||
|
||||
float lastUsedTolerance = kDefaultTolerance;
|
||||
float lastUsedOutputPitch = 0.f;
|
||||
float lastUsedOutputSignal = 0.f;
|
||||
|
||||
fvec_t* const detectedPitch = new_fvec(1);
|
||||
fvec_t* const inputBuffer = new_fvec(kAubioBufferSize);
|
||||
uint32_t inputBufferPos = 0;
|
||||
|
||||
aubio_pitch_t* pitchDetector = nullptr;
|
||||
|
||||
dsp::SlewLimiter smoothOutputSignal;
|
||||
|
||||
AudioToCVPitch()
|
||||
{
|
||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
|
||||
|
||||
configInput(AUDIO_INPUT, "Audio");
|
||||
configOutput(CV_PITCH, "Pitch");
|
||||
configOutput(CV_GATE, "Gate");
|
||||
configParam(PARAM_SENSITIVITY, 0.1f, 99.f, kDefaultSensitivity, "Sensitivity", " %");
|
||||
configParam(PARAM_CONFIDENCETHRESHOLD, 0.f, 99.f, kDefaultThreshold, "Confidence Threshold", " %");
|
||||
configParam(PARAM_TOLERANCE, 0.f, 99.f, kDefaultTolerance, "Tolerance", " %");
|
||||
}
|
||||
|
||||
void process(const ProcessArgs& args) override
|
||||
{
|
||||
float cvPitch = lastUsedOutputPitch;
|
||||
float cvSignal = lastUsedOutputSignal;
|
||||
|
||||
inputBuffer->data[inputBufferPos] = inputs[AUDIO_INPUT].getVoltage() * 0.1f
|
||||
* params[PARAM_SENSITIVITY].getValue();
|
||||
|
||||
if (++inputBufferPos == kAubioBufferSize)
|
||||
{
|
||||
inputBufferPos = 0;
|
||||
|
||||
const float tolerance = params[PARAM_TOLERANCE].getValue();
|
||||
if (d_isNotEqual(lastUsedTolerance, tolerance))
|
||||
{
|
||||
lastUsedTolerance = tolerance;
|
||||
aubio_pitch_set_tolerance(pitchDetector, tolerance * 0.01f);
|
||||
}
|
||||
|
||||
aubio_pitch_do(pitchDetector, inputBuffer, detectedPitch);
|
||||
const float detectedPitchInHz = fvec_get_sample(detectedPitch, 0);
|
||||
const float pitchConfidence = aubio_pitch_get_confidence(pitchDetector);
|
||||
|
||||
if (detectedPitchInHz > 0.f && pitchConfidence >= params[PARAM_CONFIDENCETHRESHOLD].getValue() * 0.01f)
|
||||
{
|
||||
const float linearPitch = 12.f * (log2f(detectedPitchInHz / 440.f) + octave - 1) + 69.f;
|
||||
cvPitch = std::max(-10.f, std::min(10.f, linearPitch * (1.f/12.f)));
|
||||
lastKnownPitchInHz = detectedPitchInHz;
|
||||
cvSignal = 10.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! holdOutputPitch)
|
||||
lastKnownPitchInHz = cvPitch = 0.0f;
|
||||
|
||||
cvSignal = 0.f;
|
||||
}
|
||||
|
||||
lastKnownPitchConfidence = pitchConfidence;
|
||||
lastUsedOutputPitch = cvPitch;
|
||||
lastUsedOutputSignal = cvSignal;
|
||||
}
|
||||
|
||||
outputs[CV_PITCH].setVoltage(smooth ? smoothOutputSignal.process(args.sampleTime, cvPitch) : cvPitch);
|
||||
outputs[CV_GATE].setVoltage(cvSignal);
|
||||
}
|
||||
|
||||
void onReset() override
|
||||
{
|
||||
inputBufferPos = 0;
|
||||
smooth = true;
|
||||
holdOutputPitch = true;
|
||||
octave = 0;
|
||||
}
|
||||
|
||||
void onSampleRateChange(const SampleRateChangeEvent& e) override
|
||||
{
|
||||
float tolerance;
|
||||
|
||||
if (pitchDetector != nullptr)
|
||||
{
|
||||
tolerance = aubio_pitch_get_tolerance(pitchDetector);
|
||||
del_aubio_pitch(pitchDetector);
|
||||
}
|
||||
else
|
||||
{
|
||||
tolerance = kDefaultTolerance * 0.01f;
|
||||
}
|
||||
|
||||
pitchDetector = new_aubio_pitch("yinfast", kAubioBufferSize, kAubioHopSize, e.sampleRate);
|
||||
DISTRHO_SAFE_ASSERT_RETURN(pitchDetector != nullptr,);
|
||||
|
||||
aubio_pitch_set_silence(pitchDetector, -30.0f);
|
||||
aubio_pitch_set_tolerance(pitchDetector, tolerance);
|
||||
aubio_pitch_set_unit(pitchDetector, "Hz");
|
||||
|
||||
const double fall = 1.0 / (double(kAubioBufferSize) / e.sampleRate);
|
||||
smoothOutputSignal.reset();
|
||||
smoothOutputSignal.setRiseFall(fall, fall);
|
||||
}
|
||||
|
||||
json_t* dataToJson() override
|
||||
{
|
||||
json_t* const rootJ = json_object();
|
||||
DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr, nullptr);
|
||||
|
||||
json_object_set_new(rootJ, "holdOutputPitch", json_boolean(holdOutputPitch));
|
||||
json_object_set_new(rootJ, "smooth", json_boolean(smooth));
|
||||
json_object_set_new(rootJ, "octave", json_integer(octave));
|
||||
|
||||
return rootJ;
|
||||
}
|
||||
|
||||
void dataFromJson(json_t* const rootJ) override
|
||||
{
|
||||
if (json_t* const holdOutputPitchJ = json_object_get(rootJ, "holdOutputPitch"))
|
||||
holdOutputPitch = json_boolean_value(holdOutputPitchJ);
|
||||
|
||||
if (json_t* const smoothJ = json_object_get(rootJ, "smooth"))
|
||||
smooth = json_boolean_value(smoothJ);
|
||||
|
||||
if (json_t* const octaveJ = json_object_get(rootJ, "octave"))
|
||||
octave = json_integer_value(octaveJ);
|
||||
}
|
||||
};
|
||||
|
||||
struct SmallPercentageNanoKnob : NanoKnob<2, 0> {
|
||||
SmallPercentageNanoKnob() {
|
||||
box.size = Vec(32, 32);
|
||||
displayLabel = "";
|
||||
}
|
||||
|
||||
void onChange(const ChangeEvent&) override
|
||||
{
|
||||
engine::ParamQuantity* const pq = getParamQuantity();
|
||||
DISTRHO_SAFE_ASSERT_RETURN(pq != nullptr,);
|
||||
|
||||
displayString = string::f("%.1f %%", pq->getDisplayValue());
|
||||
}
|
||||
};
|
||||
|
||||
struct AudioToCVPitchWidget : ModuleWidgetWith9HP {
|
||||
static constexpr const float startX = 10.0f;
|
||||
static constexpr const float startY_top = 71.0f;
|
||||
static constexpr const float startY_cv1 = 115.0f;
|
||||
static constexpr const float startY_cv2 = 145.0f;
|
||||
static constexpr const float padding = 32.0f;
|
||||
|
||||
AudioToCVPitch* const module;
|
||||
std::string monoFontPath;
|
||||
|
||||
AudioToCVPitchWidget(AudioToCVPitch* const m)
|
||||
: module(m)
|
||||
{
|
||||
setModule(m);
|
||||
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/AudioToCVPitch.svg")));
|
||||
monoFontPath = asset::system("res/fonts/ShareTechMono-Regular.ttf");
|
||||
|
||||
createAndAddScrews();
|
||||
|
||||
addInput(createInput<PJ301MPort>(Vec(startX, startY_cv1 + 0 * padding), m, AudioToCVPitch::AUDIO_INPUT));
|
||||
addOutput(createOutput<PJ301MPort>(Vec(startX, startY_cv2 + 0 * padding), m, AudioToCVPitch::CV_PITCH));
|
||||
addOutput(createOutput<PJ301MPort>(Vec(startX, startY_cv2 + 1 * padding), m, AudioToCVPitch::CV_GATE));
|
||||
|
||||
SmallPercentageNanoKnob* knobSens = createParamCentered<SmallPercentageNanoKnob>(Vec(box.size.x * 0.5f, startY_cv2 + 85.f),
|
||||
module, AudioToCVPitch::PARAM_SENSITIVITY);
|
||||
knobSens->displayString = "50 %";
|
||||
addChild(knobSens);
|
||||
|
||||
SmallPercentageNanoKnob* knobTolerance = createParamCentered<SmallPercentageNanoKnob>(Vec(box.size.x * 0.5f, startY_cv2 + 135.f),
|
||||
module, AudioToCVPitch::PARAM_TOLERANCE);
|
||||
knobTolerance->displayString = "6.25 %";
|
||||
addChild(knobTolerance);
|
||||
|
||||
SmallPercentageNanoKnob* knobThres = createParamCentered<SmallPercentageNanoKnob>(Vec(box.size.x * 0.5f, startY_cv2 + 185.f),
|
||||
module, AudioToCVPitch::PARAM_CONFIDENCETHRESHOLD);
|
||||
knobThres->displayString = "12.5 %";
|
||||
addChild(knobThres);
|
||||
}
|
||||
|
||||
void drawInputLine(NVGcontext* const vg, const uint offset, const char* const text)
|
||||
{
|
||||
const float y = startY_cv1 + offset * padding;
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, nvgRGB(0xd0, 0xd0, 0xd0));
|
||||
nvgText(vg, startX + 28, y + 16, text, nullptr);
|
||||
}
|
||||
|
||||
void drawOutputLine(NVGcontext* const vg, const uint offset, const char* const text)
|
||||
{
|
||||
const float y = startY_cv2 + offset * padding;
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, startX - 1.f, y - 2.f, box.size.x - startX * 2 + 2.f, 28.f, 4);
|
||||
nvgFillColor(vg, nvgRGB(0xd0, 0xd0, 0xd0));
|
||||
nvgFill(vg);
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, color::BLACK);
|
||||
nvgText(vg, startX + 28, y + 16, text, nullptr);
|
||||
}
|
||||
|
||||
void draw(const DrawArgs& args) override
|
||||
{
|
||||
drawBackground(args.vg);
|
||||
|
||||
nvgFontFaceId(args.vg, 0);
|
||||
nvgFontSize(args.vg, 14);
|
||||
|
||||
drawInputLine(args.vg, 0, "Input");
|
||||
drawOutputLine(args.vg, 0, "Pitch");
|
||||
drawOutputLine(args.vg, 1, "Gate");
|
||||
|
||||
nvgFontSize(args.vg, 11);
|
||||
nvgBeginPath(args.vg);
|
||||
nvgFillColor(args.vg, nvgRGB(0xd0, 0xd0, 0xd0));
|
||||
nvgTextLineHeight(args.vg, 0.8f);
|
||||
nvgTextAlign(args.vg, NVG_ALIGN_CENTER);
|
||||
nvgTextBox(args.vg, startX + 6.f, startY_cv2 + 75.f, 11.f, "S\ne\nn\ns", nullptr);
|
||||
nvgTextBox(args.vg, box.size.x - startX - 16.f, startY_cv2 + 130.f, 11.f, "T\no\nl", nullptr);
|
||||
nvgTextBox(args.vg, startX + 6.f, startY_cv2 + 175.f, 11.f, "T\nh\nr\ne\ns", nullptr);
|
||||
|
||||
nvgBeginPath(args.vg);
|
||||
nvgRoundedRect(args.vg, 10.0f, startY_top, box.size.x - 20.f, 38.0f, 4);
|
||||
nvgFillColor(args.vg, color::BLACK);
|
||||
nvgFill(args.vg);
|
||||
|
||||
ModuleWidgetWith9HP::draw(args);
|
||||
}
|
||||
|
||||
void drawLayer(const DrawArgs& args, int layer) override
|
||||
{
|
||||
if (layer == 1)
|
||||
{
|
||||
nvgFontSize(args.vg, 17);
|
||||
nvgFillColor(args.vg, nvgRGBf(0.76f, 0.11f, 0.22f));
|
||||
|
||||
char pitchConfString[24];
|
||||
char pitchFreqString[24];
|
||||
|
||||
std::shared_ptr<Font> monoFont = APP->window->loadFont(monoFontPath);
|
||||
|
||||
if (module != nullptr && monoFont != nullptr)
|
||||
{
|
||||
nvgFontFaceId(args.vg, monoFont->handle);
|
||||
|
||||
std::snprintf(pitchConfString, sizeof(pitchConfString), "%5.1f %%", module->lastKnownPitchConfidence * 100.f);
|
||||
std::snprintf(pitchFreqString, sizeof(pitchFreqString), "%5.0f Hz", module->lastKnownPitchInHz);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::strcpy(pitchConfString, "0.0 %");
|
||||
std::strcpy(pitchFreqString, "0 Hz");
|
||||
}
|
||||
|
||||
nvgTextAlign(args.vg, NVG_ALIGN_CENTER);
|
||||
nvgText(args.vg, box.size.x * 0.5f, startY_top + 15.0f, pitchConfString, nullptr);
|
||||
nvgText(args.vg, box.size.x * 0.5f, startY_top + 33.0f, pitchFreqString, nullptr);
|
||||
}
|
||||
|
||||
ModuleWidgetWith9HP::drawLayer(args, layer);
|
||||
}
|
||||
|
||||
void appendContextMenu(Menu* const menu) override
|
||||
{
|
||||
menu->addChild(new MenuSeparator);
|
||||
|
||||
menu->addChild(createBoolPtrMenuItem("Hold Output Pitch", "", &module->holdOutputPitch));
|
||||
menu->addChild(createBoolPtrMenuItem("Smooth Output Pitch", "", &module->smooth));
|
||||
|
||||
static const std::vector<int> octaves = {-4, -3, -2, -1, 0, 1, 2, 3, 4};
|
||||
menu->addChild(createSubmenuItem("Octave", string::f("%d", module->octave), [=](Menu* menu) {
|
||||
for (size_t i = 0; i < octaves.size(); i++) {
|
||||
menu->addChild(createCheckMenuItem(string::f("%d", octaves[i]), "",
|
||||
[=]() {return module->octave == octaves[i];},
|
||||
[=]() {module->octave = octaves[i];}
|
||||
));
|
||||
}
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Model* modelAudioToCVPitch = createModel<AudioToCVPitch, AudioToCVPitchWidget>("AudioToCVPitch");
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
|
@ -329,12 +329,14 @@ struct HostAudioNanoMeter : NanoMeter {
|
|||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
struct HostAudioWidget2 : HostAudioWidget<2> {
|
||||
typedef NanoKnob<> Knob;
|
||||
|
||||
HostAudioWidget2(HostAudio2* const m)
|
||||
: HostAudioWidget<2>(m)
|
||||
{
|
||||
// FIXME
|
||||
const float middleX = box.size.x * 0.5f;
|
||||
addParam(createParamCentered<NanoKnob>(Vec(middleX, 310.0f), m, 0));
|
||||
addParam(createParamCentered<Knob>(Vec(middleX, 310.0f), m, 0));
|
||||
|
||||
HostAudioNanoMeter* const meter = new HostAudioNanoMeter(m);
|
||||
meter->box.pos = Vec(middleX - padding + 2.75f, startY + padding * 2);
|
||||
|
|
|
@ -214,7 +214,7 @@ struct HostTimeWidget : ModuleWidget {
|
|||
{
|
||||
const float y = startY_cv + offset * padding;
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, startX - 1.0f, y - 2.0f, box.size.x - (startX + 1) * 2, 28.0f, 4);
|
||||
nvgRoundedRect(vg, startX - 1.0f, y - 2.f, box.size.x - startX * 2 + 2.f, 28.f, 4);
|
||||
nvgFillColor(vg, nvgRGB(0xd0, 0xd0, 0xd0));
|
||||
nvgFill(vg);
|
||||
nvgBeginPath(vg);
|
||||
|
|
|
@ -61,9 +61,8 @@ struct CardinalLedDisplayChoice : LedDisplayChoice {
|
|||
}
|
||||
};
|
||||
|
||||
template<int ringSize = 4, int heightPadding = 2>
|
||||
struct NanoKnob : Knob {
|
||||
static const int ringSize = 4;
|
||||
|
||||
std::string displayLabel = "Level";
|
||||
std::string displayString = "0 dB";
|
||||
float normalizedValue = 0.5f;
|
||||
|
@ -81,14 +80,14 @@ struct NanoKnob : Knob {
|
|||
const float w = box.size.x;
|
||||
const float h = box.size.y;
|
||||
|
||||
const int knobSize = std::min(w, h - BND_WIDGET_HEIGHT * 2) - ringSize;
|
||||
const int knobSize = std::min(w, h - BND_WIDGET_HEIGHT * heightPadding) - ringSize;
|
||||
|
||||
const int knobStartX = w / 2 - knobSize / 2;
|
||||
const int knobStartY = ringSize;
|
||||
const int knobCenterX = knobStartX + knobSize / 2;
|
||||
const int knobCenterY = knobStartY + knobSize / 2;
|
||||
|
||||
const NVGcolor testing = nvgRGBf(0.76f, 0.11f, 0.22f);
|
||||
const NVGcolor cardinalColor = nvgRGBf(0.76f, 0.11f, 0.22f);
|
||||
|
||||
nvgLineCap(args.vg, NVG_ROUND);
|
||||
|
||||
|
@ -102,7 +101,7 @@ struct NanoKnob : Knob {
|
|||
nvgDegToRad(135.0f) + nvgDegToRad(270.0f * normalizedValue),
|
||||
NVG_CW);
|
||||
nvgStrokeWidth(args.vg, ringSize);
|
||||
nvgStrokeColor(args.vg, testing);
|
||||
nvgStrokeColor(args.vg, cardinalColor);
|
||||
nvgStroke(args.vg);
|
||||
|
||||
// simulate color bleeding
|
||||
|
@ -115,7 +114,7 @@ struct NanoKnob : Knob {
|
|||
nvgDegToRad(135.0f) + nvgDegToRad(270.0f * normalizedValue),
|
||||
NVG_CW);
|
||||
nvgStrokeWidth(args.vg, 5);
|
||||
nvgStrokeColor(args.vg, nvgRGBAf(testing.r, testing.g, testing.b, 0.1f));
|
||||
nvgStrokeColor(args.vg, nvgRGBAf(cardinalColor.r, cardinalColor.g, cardinalColor.b, 0.1f));
|
||||
nvgStroke(args.vg);
|
||||
|
||||
// line indicator
|
||||
|
@ -136,7 +135,7 @@ struct NanoKnob : Knob {
|
|||
float radius = knobSize * 0.5f;
|
||||
float oradius = radius + std::min(radius * 4.f, 15.f);
|
||||
|
||||
NVGcolor icol = color::mult(nvgRGBAf(testing.r, testing.g, testing.b, 0.2f), halo);
|
||||
NVGcolor icol = color::mult(nvgRGBAf(cardinalColor.r, cardinalColor.g, cardinalColor.b, 0.2f), halo);
|
||||
NVGcolor ocol = nvgRGBA(0, 0, 0, 0);
|
||||
NVGpaint paint = nvgRadialGradient(args.vg, knobCenterX, knobCenterY, radius, oradius, icol, ocol);
|
||||
|
||||
|
@ -146,10 +145,13 @@ struct NanoKnob : Knob {
|
|||
nvgFill(args.vg);
|
||||
}
|
||||
|
||||
// bottom label (value)
|
||||
bndIconLabelValue(args.vg, 0, knobSize + ringSize, w, BND_WIDGET_HEIGHT, -1,
|
||||
testing, BND_CENTER,
|
||||
BND_LABEL_FONT_SIZE, displayString.c_str(), nullptr);
|
||||
if (! displayString.empty())
|
||||
{
|
||||
// bottom label (value)
|
||||
bndIconLabelValue(args.vg, -w, knobSize + ringSize, w*3, BND_WIDGET_HEIGHT, -1,
|
||||
cardinalColor, BND_CENTER,
|
||||
BND_LABEL_FONT_SIZE, displayString.c_str(), nullptr);
|
||||
}
|
||||
|
||||
Knob::drawLayer(args, layer);
|
||||
}
|
||||
|
@ -162,7 +164,7 @@ struct NanoKnob : Knob {
|
|||
const float w = box.size.x;
|
||||
const float h = box.size.y;
|
||||
|
||||
const int knobSize = std::min(w, h - BND_WIDGET_HEIGHT * 2) - ringSize;
|
||||
const int knobSize = std::min(w, h - BND_WIDGET_HEIGHT * heightPadding) - ringSize;
|
||||
|
||||
const int knobStartX = w / 2 - knobSize / 2;
|
||||
const int knobStartY = ringSize;
|
||||
|
@ -224,10 +226,14 @@ struct NanoKnob : Knob {
|
|||
nvgStrokeColor(args.vg, nvgRGBf(0.5f, 0.5f, 0.5f));
|
||||
nvgStroke(args.vg);
|
||||
|
||||
// bottom label (name)
|
||||
bndIconLabelValue(args.vg, 0, knobStartY + knobSize + BND_WIDGET_HEIGHT * 0.75f, w, BND_WIDGET_HEIGHT, -1,
|
||||
SCHEME_WHITE, BND_CENTER,
|
||||
BND_LABEL_FONT_SIZE, displayLabel.c_str(), nullptr);
|
||||
if (! displayLabel.empty())
|
||||
{
|
||||
// bottom label (name)
|
||||
bndIconLabelValue(args.vg, -w, knobStartY + knobSize + BND_WIDGET_HEIGHT * 0.75f,
|
||||
w*3, BND_WIDGET_HEIGHT, -1,
|
||||
SCHEME_WHITE, BND_CENTER,
|
||||
BND_LABEL_FONT_SIZE, displayLabel.c_str(), nullptr);
|
||||
}
|
||||
|
||||
Knob::draw(args);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ using namespace rack;
|
|||
extern Plugin* pluginInstance;
|
||||
|
||||
extern Model* modelAudioFile;
|
||||
extern Model* modelAudioToCVPitch;
|
||||
extern Model* modelCarla;
|
||||
extern Model* modelCardinalBlank;
|
||||
extern Model* modelExpanderInputMIDI;
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 71f4c72ded3560639b4ff1df3bb827e31c7d61a0
|
||||
Subproject commit ec6d477cedc9a00b7dde0f2713d263c4778162d2
|
|
@ -222,6 +222,11 @@ PLUGIN_FILES += $(wildcard Cardinal/src/DearImGui/*.cpp)
|
|||
PLUGIN_FILES += $(wildcard Cardinal/src/DearImGuiColorTextEditor/*.cpp)
|
||||
endif
|
||||
|
||||
ifeq ($(shell pkg-config --exists fftw3f && echo true),true)
|
||||
PLUGIN_FILES += Cardinal/src/AudioToCVPitch.cpp
|
||||
BASE_FLAGS += -DHAVE_FFTW3F
|
||||
endif
|
||||
|
||||
# --------------------------------------------------------------
|
||||
# Fundamental (always enabled)
|
||||
|
||||
|
@ -1215,6 +1220,7 @@ $(BUILD_DIR)/Cardinal/%.cpp.o: Cardinal/%.cpp
|
|||
-DCARLA_BACKEND_NAMESPACE=Cardinal \
|
||||
-DREAL_BUILD \
|
||||
-DSTATIC_PLUGIN_TARGET \
|
||||
-I../deps/aubio/src \
|
||||
-I../carla/source/backend \
|
||||
-I../carla/source/includes \
|
||||
-I../carla/source/modules \
|
||||
|
|
|
@ -882,6 +882,11 @@ static void initStatic__Cardinal()
|
|||
#else
|
||||
spl.removeModule("MPV");
|
||||
#endif
|
||||
#ifdef HAVE_FFTW3F
|
||||
p->addModel(modelAudioToCVPitch);
|
||||
#else
|
||||
spl.removeModule("AudioToCVPitch");
|
||||
#endif
|
||||
|
||||
hostTerminalModels = {
|
||||
modelHostAudio2,
|
||||
|
|
|
@ -113,6 +113,12 @@ endif
|
|||
EXTRA_DEPENDENCIES = $(RACK_EXTRA_LIBS) $(CARLA_EXTRA_LIBS)
|
||||
EXTRA_LIBS = $(RACK_EXTRA_LIBS) $(CARLA_EXTRA_LIBS) $(STATIC_CARLA_PLUGIN_LIBS)
|
||||
|
||||
ifeq ($(shell pkg-config --exists fftw3f && echo true),true)
|
||||
EXTRA_DEPENDENCIES += ../../deps/aubio/libaubio.a
|
||||
EXTRA_LIBS += ../../deps/aubio/libaubio.a
|
||||
EXTRA_LIBS += $(shell $(PKG_CONFIG) --libs fftw3f)
|
||||
endif
|
||||
|
||||
# --------------------------------------------------------------
|
||||
# Do some magic
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue