diff --git a/CMakeLists.txt b/CMakeLists.txt index b7f2f50..ff425b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,13 @@ cmake_minimum_required(VERSION 3.16.0) project(pipedal - VERSION 1.4.75 + VERSION 1.4.76 DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi" HOMEPAGE_URL "https://rerdavies.github.io/pipedal" ) EXECUTE_PROCESS( COMMAND dpkg --print-architecture COMMAND tr -d '\n' OUTPUT_VARIABLE DEBIAN_ARCHITECTURE ) -set (DISPLAY_VERSION "PiPedal v1.4.75-Release") +set (DISPLAY_VERSION "PiPedal v1.4.76-Release") set (PACKAGE_ARCHITECTURE ${DEBIAN_ARCHITECTURE}) set (CMAKE_INSTALL_PREFIX "/usr/") diff --git a/README.md b/README.md index c014ae0..803093a 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ -Download: v1.4.75 +Download: v1.4.76 Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal). Documentation: [https://rerdavies.github.io/pipedal/Documentation.html](https://rerdavies.github.io/pipedal/Documentation.html). _Important notice_: [PatchStorage.com](https:///patchstorage.com) has added support for [PiPedal](https://patchstorage.com/platform/pipedal/). We urgently need your support! If you could please upload patches [here](https://patchstorage.com/platform/pipedal/) I would be enormously grateful. Note that media and model files are included in patch files, so you can share patches that include model files or audio samples. If you make use of plugins that are not included in the PiPedal distribution, please include a link to the plugin in the patch description. -#### NEW version 1.4.75 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. +#### NEW version 1.4.76 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. New Phaser and Graphic Equalizer plugins.   diff --git a/docs/Installing.md b/docs/Installing.md index a274baf..8d61482 100644 --- a/docs/Installing.md +++ b/docs/Installing.md @@ -13,17 +13,17 @@ page_icon: img/Install4.jpg Download the most recent Debian (.deb) package for your platform: -- [Raspberry Pi OS bookworm (aarch64) v1.4.75 Beta](https://github.com/rerdavies/pipedal/releases/download/v1.4.75/pipedal_1.4.75_arm64.deb) -- [Ubuntu 24.x (aarch64) v1.4.75 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.75/pipedal_1.4.75_arm64.deb) -- [Ubuntu 24.x (amd64) v1.4.75 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.75/pipedal_1.4.75_amd64.deb) +- [Raspberry Pi OS bookworm (aarch64) v1.4.76 Beta](https://github.com/rerdavies/pipedal/releases/download/v1.4.76/pipedal_1.4.76_arm64.deb) +- [Ubuntu 24.x (aarch64) v1.4.76 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.76/pipedal_1.4.76_arm64.deb) +- [Ubuntu 24.x (amd64) v1.4.76 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.76/pipedal_1.4.76_amd64.deb) -Version 1.4.75 has been tested on Raspberry Pi OS bookworm, Ubuntu 24.04 (amd64), and Ubuntu 24.10 (aarch64). Download the appropriate package for your platform, and install using the following procedure: +Version 1.4.76 has been tested on Raspberry Pi OS bookworm, Ubuntu 24.04 (amd64), and Ubuntu 24.10 (aarch64). Download the appropriate package for your platform, and install using the following procedure: ``` sudo apt update cd ~/Downloads - sudo apt-get install pipedal_1.4.75_arm64.deb + sudo apt-get install pipedal_1.4.76_arm64.deb ``` You MUST use `apt-get`. `apt` will not install downloaded packages; and `dpkg-i` will not install dependencies. diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md index 9ff74d0..7a2a062 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -1,8 +1,13 @@ # Release Notes +## PiPedal 1.4.76 Release +- **TooB Phaser**. A loose emulation of the MXR Phase 90 phaser. +- **TooB GE-7 Graphic Equalizer**. A 7-band graphic equalizer optimized for use as a guitar effect. + + ## PiPedal 1.4.75 Release -New pugins: +New plugins: - **TooB Noise Gate**. A standalone Noise Gate plugin. - **TooB Volume**. A standalong plugin to adjust signal volume. - **TooB Mix**. A standalone plugin to remix stereo signals. diff --git a/docs/download.md b/docs/download.md index 89bb61d..5394325 100644 --- a/docs/download.md +++ b/docs/download.md @@ -4,9 +4,9 @@ Download the most recent Debian (.deb) package for your platform: -- [Raspberry Pi OS bookworm (aarch64) v1.4.75 Beta](https://github.com/rerdavies/pipedal/releases/download/v1.4.75/pipedal_1.4.75_arm64.deb) -- [Ubuntu 24.x (aarch64) v1.4.75 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.75/pipedal_1.4.75_arm64.deb) -- [Ubuntu 24.x (amd64) v1.4.75 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.75/pipedal_1.4.75_amd64.deb) +- [Raspberry Pi OS bookworm (aarch64) v1.4.76 Beta](https://github.com/rerdavies/pipedal/releases/download/v1.4.76/pipedal_1.4.76_arm64.deb) +- [Ubuntu 24.x (aarch64) v1.4.76 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.76/pipedal_1.4.76_arm64.deb) +- [Ubuntu 24.x (amd64) v1.4.76 Alpha](https://github.com/rerdavies/pipedal/releases/download/v1.4.76/pipedal_1.4.76_amd64.deb) Install the package by running @@ -14,7 +14,7 @@ Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_1.4.75_arm64.deb + sudo apt-get install ./pipedal_1.4.76_arm64.deb ``` You MUST use `apt-get` to install the package. `apt install` will NOT install the package correctly. The message about missing permissions given by `apt-get` is expected, and can be safely ignored. diff --git a/docs/index.md b/docs/index.md index f9b67e9..503e355 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -v1.4.75 +v1.4.76 _To download PiPedal, click [*here*](download.md). To view PiPedal documentation, click [*here*](Documentation.md)._ @@ -6,7 +6,7 @@ To view PiPedal documentation, click [*here*](Documentation.md)._ _Important notice_: [PatchStorage.com](https:///patchstorage.com) has added support for [PiPedal](https://patchstorage.com/platform/pipedal/). We urgently need your support! If you could please upload patches [here](https://patchstorage.com/platform/pipedal/) I would be enormously grateful. Note that media and model files are included in patch files, so you can share patches that include model files or audio samples. If you make use of plugins that are not included in the PiPedal distribution, please include a link to the plugin in the patch description. -#### NEW version 1.4.75 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. +#### NEW version 1.4.76 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. New Phaser and Graphic Equalizer plugins.   diff --git a/lv2/aarch64/ToobAmp.lv2/CabIR.ttl b/lv2/aarch64/ToobAmp.lv2/CabIR.ttl index 39dce01..5634996 100644 --- a/lv2/aarch64/ToobAmp.lv2/CabIR.ttl +++ b/lv2/aarch64/ToobAmp.lv2/CabIR.ttl @@ -93,7 +93,7 @@ cabir:impulseFile3 doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ TooB Cab IR is a convolution-based guitar cabinet impulse response simulator. diff --git a/lv2/aarch64/ToobAmp.lv2/CabSim.ttl b/lv2/aarch64/ToobAmp.lv2/CabSim.ttl index 10b4928..04e2903 100644 --- a/lv2/aarch64/ToobAmp.lv2/CabSim.ttl +++ b/lv2/aarch64/ToobAmp.lv2/CabSim.ttl @@ -50,7 +50,7 @@ toob:frequencyResponseVector doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; mod:brand "TooB"; mod:label "TooB CabSim"; diff --git a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl index 40fcd51..441992c 100644 --- a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl @@ -53,7 +53,7 @@ toobimpulse:impulseFile doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Convolution reverb is a notoriously compute-intensive effect. If you are having performance issues, use the Max T control to constrain the length of the impulse file to diff --git a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl index e1569e9..e77c07d 100644 --- a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl @@ -51,7 +51,7 @@ toobimpulse:impulseFile doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ diff --git a/lv2/aarch64/ToobAmp.lv2/InputStage.ttl b/lv2/aarch64/ToobAmp.lv2/InputStage.ttl index 9f5dd36..0872580 100644 --- a/lv2/aarch64/ToobAmp.lv2/InputStage.ttl +++ b/lv2/aarch64/ToobAmp.lv2/InputStage.ttl @@ -66,7 +66,7 @@ inputStage:filterGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; mod:brand "TooB"; mod:label "TooB Input"; diff --git a/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl b/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl index 6c5b5a8..da5f078 100644 --- a/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl +++ b/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl @@ -68,7 +68,7 @@ pstage:stage3 doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; mod:brand "TooB"; mod:label "Power Stage"; diff --git a/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl b/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl index ef1b860..6385edf 100644 --- a/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl +++ b/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl @@ -57,7 +57,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment "TooB spectrum analyzer" ; mod:brand "TooB"; diff --git a/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl b/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl index d99175e..7be30fd 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl @@ -57,7 +57,7 @@ tonestack:eqGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; uiext:ui ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so index 1210dd3..da96e67 100644 Binary files a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so and b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so differ diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmpUI.so b/lv2/aarch64/ToobAmp.lv2/ToobAmpUI.so index f440547..ed6ce54 100644 Binary files a/lv2/aarch64/ToobAmp.lv2/ToobAmpUI.so and b/lv2/aarch64/ToobAmp.lv2/ToobAmpUI.so differ diff --git a/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl b/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl index 2aa91ce..299f637 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl @@ -40,7 +40,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Emulation of a Boss CE-2 Chorus. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl b/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl index ddeed16..84ea5bc 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ A straightforward no-frills digital delay. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl index 9de95cc..dfdb899 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Emulation of a Boss BF-2 Flanger, based on circuit analysis and simulation of the original. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl index bb85bc6..46f8776 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Digital emulation of a Boss BF-2 Flanger. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl index 2ebddda..4e4202e 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Toob Freeverb is an Lv2 implementation of the famous Freeverb reverb effect. FreeVerb delivers a well-balanced reverb with very little tonal coloration. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobGraphicEq.ttl b/lv2/aarch64/ToobAmp.lv2/ToobGraphicEq.ttl new file mode 100644 index 0000000..9279d63 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/ToobGraphicEq.ttl @@ -0,0 +1,165 @@ +@prefix doap: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix urid: . +@prefix atom: . +@prefix midi: . +@prefix epp: . +@prefix uiext: . +@prefix idpy: . +@prefix foaf: . +@prefix mod: . +@prefix param: . +@prefix work: . +@prefix pg: . + +@prefix atom: . +@prefix patch: . +@prefix rdfs: . +@prefix state: . +@prefix urid: . +@prefix xsd: . +@prefix toobGraphicEq: . +@prefix pipedal_ui: . + + + + a foaf:Person ; + foaf:name "Robin Davies" ; + foaf:mbox ; + foaf:homepage . + + + a lv2:Plugin , + lv2:EQPlugin ; + doap:name "TooB GE-7 Graphic Eq" , + "TooB GE-7 Graphic Eq"@en-gb + ; + uiext:ui ; + doap:license ; + doap:maintainer ; + lv2:minorVersion 0 ; + lv2:microVersion 62 ; + rdfs:comment """ +A 7 octave graphic equalizer, with frequencies chosen to be useful for EQ-ing guitar signals. +""" ; + + mod:brand "TooB"; + mod:label "GE-7 Graphic Eq"; + lv2:optionalFeature lv2:hardRTCapable; + + lv2:port [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "in_left" ; + lv2:name "In L" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 1 ; + lv2:symbol "out_left" ; + lv2:name "Out L" + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 2 ; + lv2:symbol "gain_100hz" ; + lv2:name "100" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + units:unit units:db ; + lv2:portProperty pipedal_ui:graphicEq; + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 3 ; + lv2:symbol "gain_200hz" ; + lv2:name "200" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + units:unit units:db ; + lv2:portProperty pipedal_ui:graphicEq; + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 4 ; + lv2:symbol "gain_400hz" ; + lv2:name "400" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + units:unit units:db ; + lv2:portProperty pipedal_ui:graphicEq; + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 5 ; + lv2:symbol "gain_800hz" ; + lv2:name "800" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + units:unit units:db ; + lv2:portProperty pipedal_ui:graphicEq; + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 6 ; + lv2:symbol "gain_1600hz" ; + lv2:name "1.6k" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + units:unit units:db ; + lv2:portProperty pipedal_ui:graphicEq; + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 7 ; + lv2:symbol "gain_3200hz" ; + lv2:name "3.2k" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + units:unit units:db ; + lv2:portProperty pipedal_ui:graphicEq; + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 8 ; + lv2:symbol "gain_6400hz" ; + lv2:name "6.4k" ; + lv2:default 0.0 ; + lv2:minimum -15.0 ; + lv2:maximum 15.0 ; + lv2:portProperty pipedal_ui:graphicEq; + units:unit units:db ; + ], [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 9 ; + lv2:symbol "level" ; + lv2:name "Level" ; + lv2:default 0.0 ; + lv2:minimum -30.0 ; + lv2:maximum 30.0 ; + units:unit units:db ; + ] . + + + a uiext:X11UI ; + lv2:binary ; + + lv2:extensionData uiext::idle ; + lv2:extensionData uiext:resize ; + lv2:extensionData uiext:idleInterface; + lv2:requiredFeature uiext:idleInterface ; + . + + + diff --git a/lv2/aarch64/ToobAmp.lv2/ToobLooperFour.ttl b/lv2/aarch64/ToobAmp.lv2/ToobLooperFour.ttl index 3f30c28..6bae997 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobLooperFour.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobLooperFour.ttl @@ -92,7 +92,7 @@ myprefix:output_group doap:license ; doap:maintainer ; lv2:minorVersion 1 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; ui:ui ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobLooperOne.ttl b/lv2/aarch64/ToobAmp.lv2/ToobLooperOne.ttl index 3e17a48..e1fd778 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobLooperOne.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobLooperOne.ttl @@ -78,7 +78,7 @@ myprefix:output_group doap:license ; doap:maintainer ; lv2:minorVersion 1 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; ui:ui ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobML.ttl b/lv2/aarch64/ToobAmp.lv2/ToobML.ttl index cabe8c6..be6b362 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobML.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobML.ttl @@ -67,7 +67,7 @@ toobml:sagGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ The TooB ML Amplifier plugin provides emulation of a variety of amplifiers and overdrive pedals that are implemented using neural-network-based machine learning models of real amplifiers. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobMix.ttl b/lv2/aarch64/ToobAmp.lv2/ToobMix.ttl index 45905db..4202334 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobMix.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobMix.ttl @@ -40,14 +40,14 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Remix a stereo input signal. """ ; mod:brand "TooB"; - mod:label "TooB Mix"; + mod:label "Mix"; lv2:optionalFeature lv2:hardRTCapable; lv2:port diff --git a/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl b/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl index bde7edc..bd4bf6b 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl @@ -61,7 +61,7 @@ toobNam:eqGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ A port of Steven Atkinson's Neural Amp Modeler to LV2. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobNoiseGate.ttl b/lv2/aarch64/ToobAmp.lv2/ToobNoiseGate.ttl index b1ded6d..485851d 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobNoiseGate.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobNoiseGate.ttl @@ -54,7 +54,7 @@ noisegate:envelope_group doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ A noise gate is an audio processing tool that controls the volume of an audio signal by allowing it to pass through only when it exceeds a set threshold. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobPhaser.ttl b/lv2/aarch64/ToobAmp.lv2/ToobPhaser.ttl new file mode 100644 index 0000000..5598a62 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/ToobPhaser.ttl @@ -0,0 +1,95 @@ +@prefix doap: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix urid: . +@prefix atom: . +@prefix midi: . +@prefix epp: . +@prefix uiext: . +@prefix idpy: . +@prefix foaf: . +@prefix mod: . +@prefix param: . +@prefix work: . +@prefix pg: . + +@prefix atom: . +@prefix patch: . +@prefix rdfs: . +@prefix state: . +@prefix urid: . +@prefix xsd: . +@prefix toobPhaser: . + + + + a foaf:Person ; + foaf:name "Robin Davies" ; + foaf:mbox ; + foaf:homepage . + + + a lv2:Plugin , + lv2:PhaserPlugin ; + doap:name "TooB Phaser" , + "TooB Phaser"@en-gb + ; + uiext:ui ; + doap:license ; + doap:maintainer ; + lv2:minorVersion 0 ; + lv2:microVersion 62 ; + rdfs:comment """ +A loose emulation of an MXR® Phase 90 Phaser. + +MXR is a registered trademark of Dunlop Manufacturing, Inc. The TooB Phaser is not in any way associated with or endorsed by Dunlop Manufacturing. + +""" ; + + mod:brand "TooB"; + mod:label "Phaser"; + lv2:optionalFeature lv2:hardRTCapable; + + lv2:port + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 0; + lv2:symbol "rate" ; + lv2:name "Speed"; + lv2:default 1.4 ; + lv2:minimum 0.1; + lv2:maximum 6.0; + lv2:portProperty epp:logarithmic; + ], + [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 1 ; + lv2:symbol "in" ; + lv2:name "In" + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 2 ; + lv2:symbol "out" ; + lv2:name "Out" + ] + . + + + a uiext:X11UI ; + lv2:binary ; + + lv2:extensionData uiext::idle ; + lv2:extensionData uiext:resize ; + lv2:extensionData uiext:idleInterface; + lv2:requiredFeature uiext:idleInterface ; + . + + + diff --git a/lv2/aarch64/ToobAmp.lv2/ToobRecordMono.ttl b/lv2/aarch64/ToobAmp.lv2/ToobRecordMono.ttl index 6348438..0d4a731 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobRecordMono.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobRecordMono.ttl @@ -52,7 +52,7 @@ recordPrefix:audioFile doap:license ; doap:maintainer ; lv2:minorVersion 1 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; ui:ui ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobRecordStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ToobRecordStereo.ttl index 9a14ff7..04fc7d6 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobRecordStereo.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobRecordStereo.ttl @@ -88,7 +88,7 @@ myprefix:loop3_group doap:license ; doap:maintainer ; lv2:minorVersion 1 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; ui:ui ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl b/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl index bb83452..7560605 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl @@ -40,7 +40,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ TooB Tuner is a chromatic guitar tuner. """ ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobVolume.ttl b/lv2/aarch64/ToobAmp.lv2/ToobVolume.ttl index d532b92..b3e9e35 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobVolume.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobVolume.ttl @@ -39,7 +39,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 61 ; + lv2:microVersion 62 ; rdfs:comment """ Volume control. diff --git a/lv2/aarch64/ToobAmp.lv2/manifest.ttl b/lv2/aarch64/ToobAmp.lv2/manifest.ttl index 8840e9b..46a0088 100644 --- a/lv2/aarch64/ToobAmp.lv2/manifest.ttl +++ b/lv2/aarch64/ToobAmp.lv2/manifest.ttl @@ -59,6 +59,11 @@ lv2:binary ; rdfs:seeAlso . + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . + + a lv2:Plugin ; lv2:binary ; rdfs:seeAlso . @@ -92,6 +97,11 @@ lv2:binary ; rdfs:seeAlso . + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . + + a lv2:Plugin ; lv2:binary ; rdfs:seeAlso . diff --git a/lv2/aarch64/ToobAmp.lv2/resources/ToobGraphicEqLogo.svg b/lv2/aarch64/ToobAmp.lv2/resources/ToobGraphicEqLogo.svg new file mode 100644 index 0000000..a1c9248 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/resources/ToobGraphicEqLogo.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lv2/aarch64/ToobAmp.lv2/resources/ToobPhaserLogo.svg b/lv2/aarch64/ToobAmp.lv2/resources/ToobPhaserLogo.svg new file mode 100644 index 0000000..d4c0924 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/resources/ToobPhaserLogo.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lv2/x86_64/toobamp_1.1.61_amd64.deb b/lv2/x86_64/toobamp_1.1.61_amd64.deb deleted file mode 100644 index aaf4dcf..0000000 Binary files a/lv2/x86_64/toobamp_1.1.61_amd64.deb and /dev/null differ diff --git a/lv2/x86_64/toobamp_1.1.62_amd64.deb b/lv2/x86_64/toobamp_1.1.62_amd64.deb new file mode 100644 index 0000000..bd46f7a Binary files /dev/null and b/lv2/x86_64/toobamp_1.1.62_amd64.deb differ diff --git a/src/Lv2Pedalboard.cpp b/src/Lv2Pedalboard.cpp index 8bed348..fbb1950 100644 --- a/src/Lv2Pedalboard.cpp +++ b/src/Lv2Pedalboard.cpp @@ -324,6 +324,7 @@ void Lv2Pedalboard::PrepareMidiMap(const PedalboardItem &pedalboardItem) mapping.midiBinding = binding; mapping.instanceId = pedalboardItem.instanceId(); + if (pPortInfo->mod_momentaryOffByDefault() || pPortInfo->mod_momentaryOnByDefault()) { mapping.mappingType = MidiControlType::MomentarySwitch; diff --git a/src/PiPedalUI.hpp b/src/PiPedalUI.hpp index df203f2..a39d688 100644 --- a/src/PiPedalUI.hpp +++ b/src/PiPedalUI.hpp @@ -67,6 +67,8 @@ #define PIPEDAL_UI__ledColor PIPEDAL_UI_PREFIX "ledColor" +#define PIPEDAL_UI__graphicEq PIPEDAL_UI_PREFIX "graphicEq" + namespace pipedal { diff --git a/src/PluginHost.cpp b/src/PluginHost.cpp index b8a9133..08077f3 100644 --- a/src/PluginHost.cpp +++ b/src/PluginHost.cpp @@ -159,6 +159,7 @@ void PluginHost::LilvUris::Initialize(LilvWorld *pWorld) pipedalUI__yBottom = lilv_new_uri(pWorld, PIPEDAL_UI__yBottom); pipedalUI__xLog = lilv_new_uri(pWorld, PIPEDAL_UI__xLog); pipedalUI__width = lilv_new_uri(pWorld, PIPEDAL_UI__width); + pipedalUI__graphicEq = lilv_new_uri(pWorld,PIPEDAL_UI__graphicEq); ui__portNotification = lilv_new_uri(pWorld, LV2_UI__portNotification); ui__plugin = lilv_new_uri(pWorld, LV2_UI__plugin); @@ -1005,8 +1006,12 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP this->integer_property_ = lilv_port_has_property(plugin, pPort, host->lilvUris->integer_property_uri); this->mod_momentaryOffByDefault_ = lilv_port_has_property(plugin, pPort, host->lilvUris->mod__preferMomentaryOffByDefault); this->mod_momentaryOnByDefault_ = lilv_port_has_property(plugin, pPort, host->lilvUris->mod__preferMomentaryOnByDefault); + this->pipedal_graphicEq_ = lilv_port_has_property(plugin, pPort, host->lilvUris->pipedalUI__graphicEq); + + this->enumeration_property_ = lilv_port_has_property(plugin, pPort, host->lilvUris->enumeration_property_uri); + this->toggled_property_ = lilv_port_has_property(plugin, pPort, host->lilvUris->core__toggled); this->not_on_gui_ = lilv_port_has_property(plugin, pPort, host->lilvUris->portprops__not_on_gui_property_uri); this->connection_optional_ = lilv_port_has_property(plugin, pPort, host->lilvUris->core__connectionOptional); @@ -1729,6 +1734,7 @@ json_map::storage_type Lv2PortInfo::jmap{ MAP_REF(Lv2PortInfo, toggled_property), MAP_REF(Lv2PortInfo, mod_momentaryOffByDefault), MAP_REF(Lv2PortInfo, mod_momentaryOnByDefault), + MAP_REF(Lv2PortInfo, pipedal_graphicEq), MAP_REF(Lv2PortInfo, not_on_gui), MAP_REF(Lv2PortInfo, buffer_type), MAP_REF(Lv2PortInfo, port_group), @@ -1796,6 +1802,7 @@ json_map::storage_type Lv2PluginUiPort::jmap{{ MAP_REF(Lv2PluginUiPort, mod_momentaryOffByDefault), MAP_REF(Lv2PluginUiPort, mod_momentaryOnByDefault), + MAP_REF(Lv2PluginUiPort, pipedal_graphicEq), MAP_REF(Lv2PluginUiPort, enumeration_property), MAP_REF(Lv2PluginUiPort, not_on_gui), MAP_REF(Lv2PluginUiPort, toggled_property), diff --git a/src/PluginHost.hpp b/src/PluginHost.hpp index c6dc501..ddc5d84 100644 --- a/src/PluginHost.hpp +++ b/src/PluginHost.hpp @@ -221,6 +221,7 @@ namespace pipedal bool mod_momentaryOffByDefault_ = false; bool mod_momentaryOnByDefault_ = false; + bool pipedal_graphicEq_ = false; bool not_on_gui_ = false; std::string buffer_type_; @@ -294,6 +295,7 @@ namespace pipedal LV2_PROPERTY_GETSET_SCALAR(integer_property); LV2_PROPERTY_GETSET_SCALAR(mod_momentaryOffByDefault); LV2_PROPERTY_GETSET_SCALAR(mod_momentaryOnByDefault); + LV2_PROPERTY_GETSET_SCALAR(pipedal_graphicEq); LV2_PROPERTY_GETSET_SCALAR(enumeration_property); LV2_PROPERTY_GETSET_SCALAR(toggled_property); LV2_PROPERTY_GETSET_SCALAR(not_on_gui); @@ -513,6 +515,7 @@ namespace pipedal integer_property_(pPort->integer_property()), mod_momentaryOffByDefault_(pPort->mod_momentaryOffByDefault()), mod_momentaryOnByDefault_(pPort->mod_momentaryOnByDefault()), + pipedal_graphicEq_(pPort->pipedal_graphicEq()), enumeration_property_(pPort->enumeration_property()), toggled_property_(pPort->toggled_property()), not_on_gui_(pPort->not_on_gui()), scale_points_(pPort->scale_points()), @@ -558,6 +561,8 @@ namespace pipedal bool mod_momentaryOffByDefault_ = false; bool mod_momentaryOnByDefault_ = false; + bool pipedal_graphicEq_ = false; + bool enumeration_property_ = false; bool not_on_gui_ = false; bool toggled_property_ = false; @@ -728,6 +733,7 @@ namespace pipedal AutoLilvNode pipedalUI__yTop; AutoLilvNode pipedalUI__yBottom; AutoLilvNode pipedalUI__width; + AutoLilvNode pipedalUI__graphicEq; AutoLilvNode pipedalUI__outputPorts; diff --git a/vite/src/pipedal/GraphicEqCtl.tsx b/vite/src/pipedal/GraphicEqCtl.tsx new file mode 100644 index 0000000..289e14e --- /dev/null +++ b/vite/src/pipedal/GraphicEqCtl.tsx @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2025 Robin E. R. Davies + * All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import SvgPathBuilder from "./SvgPathBuilder"; + +export interface GraphicEqCtlProps { + position: number; + imgRef: React.Ref | undefined; + onTouchStart: React.TouchEventHandler | undefined; + onTouchMove: React.TouchEventHandler | undefined; + onPointerDown: React.PointerEventHandler | undefined; + onPointerUp: React.PointerEventHandler | undefined; + onPointerMoveCapture: React.PointerEventHandler | undefined; + onDrag: React.DragEventHandler | undefined; + dialColor: string; + opacity: number; +}; + +const STROKE_HEIGHT=8.0; + +function MakeGraphicEqPath(value: number) +{ + + let x0 = 6; + let xN = 64-x0; + let xC0 = (64-STROKE_HEIGHT)/2; + let xC1 = xC0+STROKE_HEIGHT; + + let h = 64-STROKE_HEIGHT*2.5; + + let y0 = 0; + let y1 = h-h*value;; + let y2 = y1 + STROKE_HEIGHT; + let y3 = y2 + STROKE_HEIGHT/2; + let y4 = y3 + STROKE_HEIGHT; + let y5 = 64; + + + let s = new SvgPathBuilder(); + s.moveTo(x0,y1) + .lineTo(xC0,y1) + .lineTo(xC0,y0) + .lineTo(xC1,y0) + .lineTo(xC1,y1) + .lineTo(xN,y1) + .lineTo(xN,y2) + .lineTo(x0,y2) + .closePath() + + .moveTo(x0,y3) + .lineTo(x0,y4) + .lineTo(xC0,y4) + .lineTo(xC0,y5) + .lineTo(xC1,y5) + .lineTo(xC1,y4) + .lineTo(xN,y4) + .lineTo(xN,y3) + .lineTo(x0,y3) + .closePath(); + return s.toString(); + +} +export function UpdateGraphicEqPath(el: SVGSVGElement, value: number) { + if (!el) return; + let p = MakeGraphicEqPath(value); + let pathEl = el.getElementById("myPath"); + pathEl?.setAttribute("d",p); +} + +export default function GraphicEqCtl(props: GraphicEqCtlProps) { + return ( + + + + ); +} \ No newline at end of file diff --git a/vite/src/pipedal/Lv2Plugin.tsx b/vite/src/pipedal/Lv2Plugin.tsx index e5cba80..177b1b2 100644 --- a/vite/src/pipedal/Lv2Plugin.tsx +++ b/vite/src/pipedal/Lv2Plugin.tsx @@ -453,6 +453,7 @@ export enum ControlType { Trigger, Momentary, MomentaryOnByDefault, + GraphicEq, Tuner, Vu, @@ -497,6 +498,7 @@ deserialize(input: any): UiControl { this.integer_property = input.integer_property; this.mod_momentaryOffByDefault = input.mod_momentaryOffByDefault; this.mod_momentaryOnByDefault = input.mod_momentaryOnByDefault; + this.pipedal_graphicEq = input.pipedal_graphicEq; this.enumeration_property = input.enumeration_property; this.toggled_property = input.toggled_property; this.trigger_property = input.trigger_property; @@ -548,7 +550,11 @@ deserialize(input: any): UiControl { } if (this.is_input) { - if (this.mod_momentaryOnByDefault) { + if (this.pipedal_graphicEq) + { + this.controlType = ControlType.GraphicEq; + } + else if (this.mod_momentaryOnByDefault) { this.controlType = ControlType.MomentaryOnByDefault; } else if (this.mod_momentaryOffByDefault) { this.controlType = ControlType.Momentary; @@ -604,6 +610,7 @@ deserialize(input: any): UiControl { integer_property: boolean = false; mod_momentaryOffByDefault: boolean = false; mod_momentaryOnByDefault: boolean = false; + pipedal_graphicEq: boolean = false; enumeration_property: boolean = false; trigger_property: boolean = false; not_on_gui: boolean = false; @@ -647,6 +654,9 @@ deserialize(input: any): UiControl { isAbToggle(): boolean { return this.controlType === ControlType.ABSwitch; } + isGraphicEq() : boolean { + return this.controlType === ControlType.GraphicEq; + } isSelect(): boolean { return this.controlType === ControlType.Select; } diff --git a/vite/src/pipedal/PluginControl.tsx b/vite/src/pipedal/PluginControl.tsx index 4bf8acf..aee58fc 100644 --- a/vite/src/pipedal/PluginControl.tsx +++ b/vite/src/pipedal/PluginControl.tsx @@ -40,6 +40,7 @@ import ControlTooltip from './ControlTooltip'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import StopIcon from '@mui/icons-material/Stop'; import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord'; +import GraphicEqCtl, { UpdateGraphicEqPath } from './GraphicEqCtl'; const MIN_ANGLE = -135; const MAX_ANGLE = 135; @@ -59,6 +60,21 @@ const ULTRA_FINE_RANGE_SCALE = RANGE_SCALE * 50; // 12000 pixels to move from 0 export const StandardItemSize = { width: 80, height: 140 } +function preventNextClickAfterDrag() { + // the broswer fires a click event when the pointer goes up + // on ANY element under the mouse. Prevent this click event + // (and any other click event) from happening for 100ms + // after the drag stops. + let clickHandler = (e: MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + document.addEventListener('click',clickHandler,true); + window.setTimeout(() => { + document.removeEventListener('click',clickHandler,true); + },100); +} + function androidEmoji(text: string) { // android chrome doesn't support these characters properly. if (text === "⏹") { @@ -67,9 +83,8 @@ function androidEmoji(text: string) { if (text === "⏺") { return () } - if (text === "⏵") - { - return (); + if (text === "⏵") { + return (); } return text; } @@ -129,6 +144,7 @@ export interface PluginControlProps extends WithStyles; imgRef: React.RefObject; + graphicEqControlRef: React.RefObject; inputRef: React.RefObject; selectRef: React.RefObject; @@ -148,10 +165,12 @@ const PluginControl = super(props); this.state = { - error: false + error: false, + editFocused: false }; this.model = PiPedalModelFactory.getInstance(); this.imgRef = React.createRef(); + this.graphicEqControlRef = React.createRef(); this.inputRef = React.createRef(); this.selectRef = React.createRef(); this.displayValueRef = React.createRef(); @@ -195,16 +214,19 @@ const PluginControl = inputChanged: boolean = false; onInputLostFocus(event: any): void { + this.setState({editFocused: false}); if (this.inputChanged) // validation requried? { this.inputChanged = false; this.validateInput(event, true); } - this.displayValueRef.current!.style.display = "block"; + + //this.displayValueRef.current!.style.display = "block"; } onInputFocus(event: SyntheticEvent): void { - this.displayValueRef.current!.style.display = "none"; + //this.displayValueRef.current!.style.display = "none"; + this.setState({editFocused: true}); if (Utility.hasIMEKeyboard()) { event.preventDefault(); event.stopPropagation(); @@ -273,6 +295,7 @@ const PluginControl = onDrag(e: SyntheticEvent) { e.preventDefault(); + e.stopPropagation(); } isValidPointer(e: PointerEvent): boolean { @@ -333,9 +356,19 @@ const PluginControl = if (!this.mouseDown && this.isValidPointer(e)) { e.preventDefault(); e.stopPropagation(); + if (document.activeElement) + { + let e = document.activeElement as any; + if (e.blur) + { + e.blur(); + } + } if (this.isTouchDevice()) { - if (this.props.uiControl?.isDial() ?? false) { + if (this.props.uiControl + && (this.props.uiControl.isDial() || this.props.uiControl.isGraphicEq()) + ) { this.isTap = false; this.showZoomedControl(); return; @@ -390,7 +423,9 @@ const PluginControl = onPointerLostCapture(e: PointerEvent) { if (this.isCapturedPointer(e)) { - --this.pointersDown; + if (this.pointersDown !== 0) { + --this.pointersDown; + } this.isTap = false; @@ -438,7 +473,7 @@ const PluginControl = onPointerDoubleTap() { let uiControl = this.props.uiControl; if (uiControl) { - if (uiControl.isDial()) { + if (uiControl.isDial() || uiControl.isGraphicEq()) { this.resetToDefaultValue(uiControl); } } @@ -457,10 +492,14 @@ const PluginControl = onPointerUp(e: PointerEvent) { if (this.isCapturedPointer(e)) { - --this.pointersDown; - + if (this.pointersDown !== 0) + { + --this.pointersDown; + } e.preventDefault(); + e.stopPropagation(); + let dRange = this.updateRange(e) this.previewRange(dRange, true); @@ -471,9 +510,15 @@ const PluginControl = this.onPointerTap(); } } + // prevent click from firing on other elements + // when the pointer goes up0. + preventNextClickAfterDrag(); } else { - --this.pointersDown; + if (this.pointersDown !== 0) + { + --this.pointersDown; + } } } @@ -518,7 +563,7 @@ const PluginControl = this.isTap = false; } } - + } handleButtonMouseLeave(buttonStyle: ButtonStyle) { } @@ -527,10 +572,10 @@ const PluginControl = if (uiControl) { switch (buttonStyle) { case ButtonStyle.Momentary: - this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol,uiControl.max_value); + this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol, uiControl.max_value); break; case ButtonStyle.MomentaryOnByDefault: - this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol,uiControl.min_value); + this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol, uiControl.min_value); break; case ButtonStyle.Trigger: { @@ -539,7 +584,7 @@ const PluginControl = value = uiControl.min_value; } this.model.sendPedalboardControlTrigger(this.props.instanceId, uiControl.symbol, value); - + } break; } @@ -550,10 +595,10 @@ const PluginControl = if (uiControl) { switch (buttonStyle) { case ButtonStyle.Momentary: - this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol,uiControl.min_value); + this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol, uiControl.min_value); break; case ButtonStyle.MomentaryOnByDefault: - this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol,uiControl.max_value); + this.model.setPedalboardControl(this.props.instanceId, uiControl.symbol, uiControl.max_value); break; case ButtonStyle.Trigger: { @@ -567,14 +612,22 @@ const PluginControl = let range = this.valueToRange(value); value = this.rangeToValue(range); - let transform = this.rangeToRotationTransform(range); - if (this.mouseDown && !commitValue) { - transform += " scale(1.5, 1.5)"; - } let imgElement = this.imgRef.current if (imgElement) { - if (imgElement.style) { - imgElement.style.transform = transform; + if (this.props.uiControl?.isGraphicEq()) { + let imgElement = this.imgRef.current + if (imgElement) { + UpdateGraphicEqPath(imgElement, range); + } + } else { + + let transform = this.rangeToRotationTransform(range); + if (this.mouseDown && !commitValue) { + transform += " scale(1.5, 1.5)"; + } + if (imgElement.style) { + imgElement.style.transform = transform; + } } } if (commitValue) { @@ -594,10 +647,18 @@ const PluginControl = // apply value quantization and clipping. range = this.valueToRange(value); - let imgElement = this.imgRef.current - if (imgElement) { - if (imgElement.style) { - imgElement.style.transform = this.rangeToRotationTransform(range); + if (this.props.uiControl?.isGraphicEq()) { + let imgElement = this.imgRef.current + if (imgElement) { + UpdateGraphicEqPath(imgElement, range); + } + + } else { + let imgElement = this.imgRef.current + if (imgElement) { + if (imgElement.style) { + imgElement.style.transform = this.rangeToRotationTransform(range); + } } } let inputElement = this.inputRef.current; @@ -779,6 +840,16 @@ const PluginControl = return "rotate(" + angle + "deg)"; } + getEqPosition(): number { + let range = 0; + let uiControl = this.props.uiControl; + if (uiControl) { + let value = this.props.value; + range = this.valueToRange(value); + } + return range; + + } getRotationTransform(): string { let range = 0; let uiControl = this.props.uiControl; @@ -812,6 +883,8 @@ const PluginControl = let isButton = false; let buttonStyle: ButtonStyle = ButtonStyle.None; + let isGraphicEq = control.isGraphicEq(); + if (control.isTrigger()) { isButton = true; buttonStyle = ButtonStyle.Trigger; @@ -833,6 +906,9 @@ const PluginControl = if (isButton) { item_width = undefined; } + if (isGraphicEq) { + item_width = 58; + } return ( @@ -862,27 +938,29 @@ const PluginControl = ( control.name.length !== 1 ? (