Browse Source

Merge branch 'DISTRHO:main' into CVfunk

tags/24.12
Cody Geary GitHub 7 months ago
parent
commit
e8776010d4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
29 changed files with 226 additions and 142 deletions
  1. +1
    -1
      .github/ISSUE_TEMPLATE/bug.yaml
  2. +13
    -5
      .github/workflows/build.yml
  3. +3
    -0
      .gitmodules
  4. +1
    -1
      Makefile
  5. +1
    -0
      README.md
  6. +1
    -1
      carla
  7. +3
    -0
      deps/Makefile
  8. +1
    -1
      deps/PawPaw
  9. +13
    -12
      docs/DIFFERENCES.md
  10. +4
    -2
      docs/LICENSES.md
  11. +1
    -1
      dpf
  12. +1
    -1
      plugins/Befaco
  13. +1
    -1
      plugins/DrumKit
  14. +1
    -0
      plugins/MUS-X
  15. +16
    -2
      plugins/Makefile
  16. +1
    -1
      plugins/Sapphire
  17. +77
    -31
      plugins/plugins.cpp
  18. +1
    -1
      plugins/voxglitch
  19. +24
    -1
      src/CardinalCommon.cpp
  20. +1
    -1
      src/CardinalPlugin.cpp
  21. +26
    -16
      src/CardinalRemote.cpp
  22. +5
    -14
      src/CardinalRemote.hpp
  23. +1
    -1
      src/CardinalUI.cpp
  24. +1
    -0
      src/custom/dep.cpp
  25. +4
    -15
      src/override/Engine.cpp
  26. +20
    -18
      src/override/Scene.cpp
  27. +2
    -13
      src/override/Window.cpp
  28. +1
    -1
      utils/macOS/Info_JACK.plist
  29. +1
    -1
      utils/macOS/Info_Native.plist

+ 1
- 1
.github/ISSUE_TEMPLATE/bug.yaml View File

@@ -5,7 +5,7 @@ body:
id: version id: version
attributes: attributes:
label: Version label: Version
value: "24.05"
value: "24.09"
validations: validations:
required: true required: true
- type: dropdown - type: dropdown


+ 13
- 5
.github/workflows/build.yml View File

@@ -159,12 +159,20 @@ jobs:
macos: macos:
strategy: strategy:
matrix: matrix:
debug: [0, 1]
target: [universal-10.15] target: [universal-10.15]
runs-on: macos-12 runs-on: macos-12
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
submodules: recursive submodules: recursive
- name: Set debug or release
shell: bash
run: |
if [ "${{ matrix.debug }}" -eq 1 ]; then
echo "TARGET_SUFFIX=-debug" >> $GITHUB_ENV
echo "PAWPAW_DEBUG=1" >> $GITHUB_ENV
fi
- name: Set up cache - name: Set up cache
id: cache id: cache
uses: actions/cache@v4 uses: actions/cache@v4
@@ -179,7 +187,7 @@ jobs:
src/Rack/dep/libarchive-3.4.3 src/Rack/dep/libarchive-3.4.3
src/Rack/dep/libsamplerate-0.1.9 src/Rack/dep/libsamplerate-0.1.9
src/Rack/dep/zstd-1.4.5 src/Rack/dep/zstd-1.4.5
key: macos-${{ matrix.target }}-v${{ env.CACHE_VERSION }}
key: macos-${{ matrix.target }}${{ env.TARGET_SUFFIX }}-v${{ env.CACHE_VERSION }}
- name: Setup dependencies - name: Setup dependencies
run: | run: |
./deps/PawPaw/.github/workflows/bootstrap-deps.sh macos-${{ matrix.target }} ./deps/PawPaw/.github/workflows/bootstrap-deps.sh macos-${{ matrix.target }}
@@ -191,7 +199,7 @@ jobs:
if: steps.cache.outputs.cache-hit == 'true' if: steps.cache.outputs.cache-hit == 'true'
uses: hendrikmuhs/ccache-action@v1.2 uses: hendrikmuhs/ccache-action@v1.2
with: with:
key: ccache-macos-${{ matrix.target }}-v${{ env.CACHE_VERSION }}
key: ccache-macos-${{ matrix.target }}${{ env.TARGET_SUFFIX }}-v${{ env.CACHE_VERSION }}
- name: Build macOS (base) - name: Build macOS (base)
if: steps.cache.outputs.cache-hit == 'true' if: steps.cache.outputs.cache-hit == 'true'
shell: bash shell: bash
@@ -215,14 +223,14 @@ jobs:
- name: Rename macOS bundle - name: Rename macOS bundle
if: steps.cache.outputs.cache-hit == 'true' if: steps.cache.outputs.cache-hit == 'true'
run: | run: |
mv ${{ github.event.repository.name }}-macOS.pkg ${{ github.event.repository.name }}-macOS-${{ matrix.target }}-${{ github.event.pull_request.number || env.SHA8 }}.pkg
mv ${{ github.event.repository.name }}-macOS.pkg ${{ github.event.repository.name }}-macOS-${{ matrix.target }}${{ env.TARGET_SUFFIX }}-${{ github.event.pull_request.number || env.SHA8 }}.pkg
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: ${{ github.event.repository.name }}-macOS-${{ matrix.target }}-${{ github.event.pull_request.number || env.SHA8 }}
name: ${{ github.event.repository.name }}-macOS-${{ matrix.target }}${{ env.TARGET_SUFFIX }}-${{ github.event.pull_request.number || env.SHA8 }}
path: | path: |
${{ github.event.repository.name }}-*.pkg ${{ github.event.repository.name }}-*.pkg
- uses: softprops/action-gh-release@v1 - uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
if: ${{ matrix.debug == '0' && startsWith(github.ref, 'refs/tags/') }}
with: with:
tag_name: ${{ github.ref_name }} tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }} name: ${{ github.ref_name }}


+ 3
- 0
.gitmodules View File

@@ -200,6 +200,9 @@
[submodule "plugins/forsitan-modulare"] [submodule "plugins/forsitan-modulare"]
path = plugins/forsitan-modulare path = plugins/forsitan-modulare
url = https://github.com/gosub/forsitan-modulare.git url = https://github.com/gosub/forsitan-modulare.git
[submodule "plugins/MUS-X"]
path = plugins/MUS-X
url = https://github.com/Jojosito/MUS-X.git
[submodule "plugins/myth-modules"] [submodule "plugins/myth-modules"]
path = plugins/myth-modules path = plugins/myth-modules
url = https://github.com/Ahineya/vcv-myth-plugin.git url = https://github.com/Ahineya/vcv-myth-plugin.git


+ 1
- 1
Makefile View File

@@ -15,7 +15,7 @@ include $(ROOT)/Makefile.base.mk
# src/CardinalPlugin.cpp `getVersion` # src/CardinalPlugin.cpp `getVersion`
# utils/macOS/Info_{JACK,Native}.plist # utils/macOS/Info_{JACK,Native}.plist
# .github/ISSUE_TEMPLATE/bug.yaml src/CardinalCommon.cpp src/CardinalPlugin.cpp utils/macOS/Info_{JACK,Native}.plist # .github/ISSUE_TEMPLATE/bug.yaml src/CardinalCommon.cpp src/CardinalPlugin.cpp utils/macOS/Info_{JACK,Native}.plist
VERSION = 24.05
VERSION = 24.09


# -------------------------------------------------------------- # --------------------------------------------------------------
# Build targets # Build targets


+ 1
- 0
README.md View File

@@ -174,6 +174,7 @@ At the moment the following 3rd-party modules are provided:
- [Mog](https://github.com/JustMog/Mog-VCV) - [Mog](https://github.com/JustMog/Mog-VCV)
- [mscHack](https://github.com/mschack/VCV-Rack-Plugins) - [mscHack](https://github.com/mschack/VCV-Rack-Plugins)
- [MSM](https://github.com/netboy3/MSM-vcvrack-plugin) - [MSM](https://github.com/netboy3/MSM-vcvrack-plugin)
- [MUS-X](https://github.com/Jojosito/MUS-X)
- [Myth](https://github.com/Ahineya/vcv-myth-plugin) - [Myth](https://github.com/Ahineya/vcv-myth-plugin)
- [Nonlinear Circuits](https://github.com/mhetrick/nonlinearcircuits) - [Nonlinear Circuits](https://github.com/mhetrick/nonlinearcircuits)
- [Orbits](https://github.com/RareBreeds/Orbits) - [Orbits](https://github.com/RareBreeds/Orbits)


+ 1
- 1
carla

@@ -1 +1 @@
Subproject commit c37d53a4216654118e711fa41e88e7e801d5bd9b
Subproject commit e39f04d2d8587327e741ad881617c427f5014d48

+ 3
- 0
deps/Makefile View File

@@ -78,6 +78,9 @@ export MACOSX_DEPLOYMENT_TARGET = $(subst -mmacosx-version-min=,,$(filter -mmaco
CMAKE += -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET) CMAKE += -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET)
else ifeq ($(CIBUILD),true) else ifeq ($(CIBUILD),true)
$(error CI build requires -mmacosx-version-min flag on macOS) $(error CI build requires -mmacosx-version-min flag on macOS)
else
export MACOSX_DEPLOYMENT_TARGET = 10.15
CMAKE += -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15
endif endif
CMAKE += -DCMAKE_OSX_SYSROOT="macosx" CMAKE += -DCMAKE_OSX_SYSROOT="macosx"
endif endif


+ 1
- 1
deps/PawPaw

@@ -1 +1 @@
Subproject commit 0edef2120e7fd493493e66967438c0b2ea8c8552
Subproject commit e0a81ba6f24b194c7aa0c6828d422f1354256a09

+ 13
- 12
docs/DIFFERENCES.md View File

@@ -47,16 +47,17 @@ Bellow follows a list of features comparing the official plugin to Cardinal.
Additionally, Cardinal contains the following built-in modules not present in the official plugin or standalone: Additionally, Cardinal contains the following built-in modules not present in the official plugin or standalone:


* Aria Salvatrice modules (except Arcane related modules, due to their online requirement) * Aria Salvatrice modules (except Arcane related modules, due to their online requirement)
* Arable Instruments and Parable Instruments (never updated to v2)
* Mog (never updated to v2) * Mog (never updated to v2)
* mscHack (never updated to v2)
* rackwindows
* AIDA-X
* Audio File
* Audio to CV Pitch converter
* Carla Plugin Host
* Ildaeil Host
* glBars (OpenGL bars visualization, as seen in XMMS and XBMC/Kodi)
* Text Editor (resizable and with syntax highlight)
* Host Parameters (24 host-exposed parameters as CV sources)
* Host Time (play, reset, bar, beat, tick, bar-phase and beat-phase CV sources)
* Host CV (for the Raw-CV plugin variant, allows direct CV access to/from the DAW)
* Rackwindows (never updated to v2)
* The DISTRHO collection, including:
* AIDA-X
* Audio File
* Audio to CV Pitch converter
* Carla Plugin Host
* Ildaeil Host
* glBars (OpenGL bars visualization, as seen in XMMS and XBMC/Kodi)
* Text Editor (resizable and with syntax highlight)
* Host Parameters (24 host-exposed parameters as CV sources)
* Host Time (play, reset, bar, beat, tick, bar-phase and beat-phase CV sources)
* Host CV (for the Raw-CV plugin variant, allows direct CV access to/from the DAW)

+ 4
- 2
docs/LICENSES.md View File

@@ -6,12 +6,12 @@ While Cardinal itself is licensed under GPLv3+, some modules/plugins used by it
And since Cardinal builds the entire Rack and modules as a static library, And since Cardinal builds the entire Rack and modules as a static library,
the more restrictive of the **code licenses** will apply to the final binary. the more restrictive of the **code licenses** will apply to the final binary.


Bellow follows a list of all code licenses used in Cardinal and linked submodules.
Below follows a list of all code licenses used in Cardinal and linked submodules.


| Name | License(s) | Additional notes | | Name | License(s) | Additional notes |
|-------------------------|--------------------------|------------------| |-------------------------|--------------------------|------------------|
| Carla | GPL-2.0-or-later | Used as plugin host within Cardinal | | Carla | GPL-2.0-or-later | Used as plugin host within Cardinal |
| DPF | ISC, GPL-2.0-or-later | Used as the plugin framework, VST2 binary GPLv2+ licensed |
| DPF | ISC | Used as the plugin framework |
| Rack | GPL-3.0-or-later | The actual Rack code, internal dependencies are compatible with GPLv3+ | | Rack | GPL-3.0-or-later | The actual Rack code, internal dependencies are compatible with GPLv3+ |
| 21kHz | MIT | | | 21kHz | MIT | |
| 8Mode | BSD-3-Clause | | | 8Mode | BSD-3-Clause | |
@@ -68,6 +68,7 @@ Bellow follows a list of all code licenses used in Cardinal and linked submodule
| Mog | CC0-1.0 | | | Mog | CC0-1.0 | |
| mscHack | BSD-3-Clause | | | mscHack | BSD-3-Clause | |
| MSM | MIT | Repo's [LICENSE-dist.md](https://github.com/netboy3/MSM-vcvrack-plugin/issues/10) includes wrong information | | MSM | MIT | Repo's [LICENSE-dist.md](https://github.com/netboy3/MSM-vcvrack-plugin/issues/10) includes wrong information |
| MUS-X | GPL-3.0-or-later | |
| Myth | GPL-3.0-or-later | | | Myth | GPL-3.0-or-later | |
| Nonlinear Circuits | CC0-1.0 | | | Nonlinear Circuits | CC0-1.0 | |
| Orbits | GPL-3.0-or-later | | | Orbits | GPL-3.0-or-later | |
@@ -227,6 +228,7 @@ Below is a list of artwork licenses from plugins
| MSM/Fonts/DejaVuSansMono.ttf | Bitstream-Vera | | | MSM/Fonts/DejaVuSansMono.ttf | Bitstream-Vera | |
| MSM/Fonts/Segment7Standard.ttf | OFL-1.1-RFN | | | MSM/Fonts/Segment7Standard.ttf | OFL-1.1-RFN | |
| MSM/Fonts/Sudo.ttf | OFL-1.1-no-RFN | | | MSM/Fonts/Sudo.ttf | OFL-1.1-no-RFN | |
| MUS-X/* | GPL-3.0-or-later | No artwork specific license provided |
| Myth/* | GPL-3.0-or-later | No artwork specific license provided | | Myth/* | GPL-3.0-or-later | No artwork specific license provided |
| nonlinearcircuits/* | CC0-1.0 | No artwork specific license provided | | nonlinearcircuits/* | CC0-1.0 | No artwork specific license provided |
| nonlinearcircuits/Audiowide-Regular.ttf | OFL-1.1-RFN | | | nonlinearcircuits/Audiowide-Regular.ttf | OFL-1.1-RFN | |


+ 1
- 1
dpf

@@ -1 +1 @@
Subproject commit 470c5b7a77091bbea2154cd1d96d3cb1be737aa3
Subproject commit 6b042628933f220a05571bde6a02fe0198a96b5d

+ 1
- 1
plugins/Befaco

@@ -1 +1 @@
Subproject commit d3ad6c6732cee8a80197aa351dd9efef9c278d4c
Subproject commit b24e1c373c7c54871d33247d40216e311dc00849

+ 1
- 1
plugins/DrumKit

@@ -1 +1 @@
Subproject commit f2a7d717e2ae066ba0127fa5ffade775baba1512
Subproject commit e4eb7adaff1afa731563e09c83e35d87319d4654

+ 1
- 0
plugins/MUS-X

@@ -0,0 +1 @@
Subproject commit f622217ec6b709b7707fb76f85026e0faa93b893

+ 16
- 2
plugins/Makefile View File

@@ -551,7 +551,7 @@ MINIPLUGIN_FILES += BaconPlugs/src/Style.cpp
# -------------------------------------------------------------- # --------------------------------------------------------------
# Befaco # Befaco


PLUGIN_FILES += $(filter-out Befaco/src/plugin.cpp,$(wildcard Befaco/src/*.cpp))
PLUGIN_FILES += $(filter-out Befaco/src/plugin.cpp Befaco/src/MidiThing.cpp,$(wildcard Befaco/src/*.cpp))
PLUGIN_FILES += $(wildcard Befaco/src/noise-plethora/*/*.cpp) PLUGIN_FILES += $(wildcard Befaco/src/noise-plethora/*/*.cpp)


# modules/types which are present in other plugins # modules/types which are present in other plugins
@@ -930,6 +930,11 @@ PLUGIN_FILES += $(filter-out MSM/src/MSM.cpp,$(wildcard MSM/src/*.cpp))
# modules/types which are present in other plugins # modules/types which are present in other plugins
MSM_CUSTOM = ADSR BlankPanel Delay LFO LowFrequencyOscillator Mult Noise OP VCA VCO sawTable triTable MSM_CUSTOM = ADSR BlankPanel Delay LFO LowFrequencyOscillator Mult Noise OP VCA VCO sawTable triTable


# --------------------------------------------------------------
# MUS-X

PLUGIN_FILES += $(filter-out MUS-X/src/plugin.cpp,$(wildcard MUS-X/src/*.cpp))

# -------------------------------------------------------------- # --------------------------------------------------------------
# myth-modules # myth-modules


@@ -1301,9 +1306,10 @@ VALLEYAUDIO_CUSTOM_PER_FILE = TempoKnob
# Voxglitch # Voxglitch


PLUGIN_FILES += $(filter-out voxglitch/src/plugin.cpp,$(wildcard voxglitch/src/*.cpp)) PLUGIN_FILES += $(filter-out voxglitch/src/plugin.cpp,$(wildcard voxglitch/src/*.cpp))
PLUGIN_FILES += voxglitch/src/vgLib-2.0/constants.cpp


# modules/types which are present in other plugins # modules/types which are present in other plugins
VOXGLITCH_CUSTOM = ADSR AudioFile Looper Readout
VOXGLITCH_CUSTOM = $(DRWAV) ADSR AudioFile Looper Quantizer Random Readout SlewLimiter constants
VOXGLITCH_CUSTOM_PER_FILE = AudioBuffer GateSequencer Grain SamplePlayer Sequencer SequencerDisplay VoltageSequencer VOXGLITCH_CUSTOM_PER_FILE = AudioBuffer GateSequencer Grain SamplePlayer Sequencer SequencerDisplay VoltageSequencer


# -------------------------------------------------------------- # --------------------------------------------------------------
@@ -1466,6 +1472,7 @@ RESOURCE_FILES += MindMeldModular/res/ShapeMaster/CommunityShapes
RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldPresets RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldPresets
RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldShapes RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldShapes
RESOURCE_FILES += Mog/res RESOURCE_FILES += Mog/res
RESOURCE_FILES += MUS-X/presets
RESOURCE_FILES += nonlinearcircuits/res RESOURCE_FILES += nonlinearcircuits/res
RESOURCE_FILES += ParableInstruments/res/Neil.png RESOURCE_FILES += ParableInstruments/res/Neil.png
RESOURCE_FILES += surgext/build/surge-data/configuration.xml RESOURCE_FILES += surgext/build/surge-data/configuration.xml
@@ -2620,6 +2627,13 @@ $(BUILD_DIR)/MSM/%.cpp.o: MSM/%.cpp
$(foreach m,$(MSM_CUSTOM),$(call custom_module_names,$(m),MSM)) \ $(foreach m,$(MSM_CUSTOM),$(call custom_module_names,$(m),MSM)) \
-DpluginInstance=pluginInstance__MSM -DpluginInstance=pluginInstance__MSM


$(BUILD_DIR)/MUS-X/%.cpp.o: MUS-X/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \
$(foreach m,$(MUS_X_CUSTOM),$(call custom_module_names,$(m),MUS_X)) \
-DpluginInstance=pluginInstance__MUS_X

$(BUILD_DIR)/myth-modules/%.cpp.o: myth-modules/%.cpp $(BUILD_DIR)/myth-modules/%.cpp.o: myth-modules/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<" @echo "Compiling $<"


+ 1
- 1
plugins/Sapphire

@@ -1 +1 @@
Subproject commit 0bcc1f4a48a7a7d59013f5f4a12574f7453a5edf
Subproject commit b5d2fc122382d7934b3ea92e05ad91a9aec89504

+ 77
- 31
plugins/plugins.cpp View File

@@ -759,6 +759,9 @@ extern Model* modelBlankPanel;
#undef modelVCA #undef modelVCA
#undef modelVCO #undef modelVCO


// MUS-X
#include "MUS-X/src/plugin.hpp"

// myth-modules // myth-modules
#include "myth-modules/src/plugin.hpp" #include "myth-modules/src/plugin.hpp"


@@ -955,6 +958,7 @@ Plugin* pluginInstance__MockbaModular;
Plugin* pluginInstance__Mog; Plugin* pluginInstance__Mog;
extern Plugin* pluginInstance__mscHack; extern Plugin* pluginInstance__mscHack;
Plugin* pluginInstance__MSM; Plugin* pluginInstance__MSM;
Plugin* pluginInstance__MUS_X;
Plugin* pluginInstance__myth_modules; Plugin* pluginInstance__myth_modules;
Plugin* pluginInstance__nonlinearcircuits; Plugin* pluginInstance__nonlinearcircuits;
Plugin* pluginInstance__Orbits; Plugin* pluginInstance__Orbits;
@@ -1590,9 +1594,13 @@ static void initStatic__Befaco()
p->addModel(modelMotionMTR); p->addModel(modelMotionMTR);
p->addModel(modelBurst); p->addModel(modelBurst);
p->addModel(modelVoltio); p->addModel(modelVoltio);
p->addModel(modelOctaves);
#undef modelADSR #undef modelADSR
#undef modelMixer #undef modelMixer
#undef modelBurst #undef modelBurst

// NOTE disabled in Cardinal due to MIDI usage
spl.removeModule("MidiThingV2");
} }
} }


@@ -2846,6 +2854,30 @@ static void initStatic__MSM()
} }
} }


static void initStatic__MUS_X()
{
Plugin* const p = new Plugin;
pluginInstance__MUS_X = p;

const StaticPluginLoader spl(p, "MUS-X");
if (spl.ok())
{
p->addModel(musx::modelADSR);
p->addModel(musx::modelDelay);
p->addModel(musx::modelDrift);
p->addModel(musx::modelFilter);
p->addModel(musx::modelLast);
p->addModel(musx::modelLFO);
p->addModel(musx::modelModMatrix);
p->addModel(musx::modelOnePole);
p->addModel(musx::modelOnePoleLP);
p->addModel(musx::modelOscillators);
p->addModel(musx::modelSplitStack);
p->addModel(musx::modelSynth);
p->addModel(musx::modelTuner);
}
}

static void initStatic__myth_modules() static void initStatic__myth_modules()
{ {
Plugin* const p = new Plugin; Plugin* const p = new Plugin;
@@ -3074,17 +3106,23 @@ static void initStatic__Sapphire()
const StaticPluginLoader spl(p, "Sapphire"); const StaticPluginLoader spl(p, "Sapphire");
if (spl.ok()) if (spl.ok())
{ {
p->addModel(modelElastika);
p->addModel(modelFrolic);
p->addModel(modelGlee);
p->addModel(modelHiss);
p->addModel(modelMoots);
p->addModel(modelNucleus);
p->addModel(modelPolynucleus);
p->addModel(modelTin);
p->addModel(modelTout);
p->addModel(modelTricorder);
p->addModel(modelTubeUnit);
p->addModel(modelSapphireElastika);
p->addModel(modelSapphireFrolic);
p->addModel(modelSapphireGalaxy);
p->addModel(modelSapphireGlee);
p->addModel(modelSapphireGravy);
p->addModel(modelSapphireHiss);
p->addModel(modelSapphireMoots);
p->addModel(modelSapphireNucleus);
p->addModel(modelSapphirePivot);
p->addModel(modelSapphirePolynucleus);
p->addModel(modelSapphirePop);
p->addModel(modelSapphireRotini);
p->addModel(modelSapphireSam);
p->addModel(modelSapphireTin);
p->addModel(modelSapphireTout);
p->addModel(modelSapphireTricorder);
p->addModel(modelSapphireTubeUnit);
} }
} }


@@ -3341,26 +3379,33 @@ static void initStatic__Voxglitch()
if (spl.ok()) if (spl.ok())
{ {
#define modelLooper modelVoxglitchLooper #define modelLooper modelVoxglitchLooper
p->addModel(modelAutobreak);
p->addModel(modelByteBeat);
p->addModel(modelDigitalProgrammer);
p->addModel(modelDigitalSequencer);
p->addModel(modelDigitalSequencerXP);
p->addModel(modelGlitchSequencer);
p->addModel(modelGhosts);
p->addModel(modelGrainEngineMK2);
p->addModel(modelGrainEngineMK2Expander);
p->addModel(modelGrainFx);
p->addModel(modelGrooveBox);
p->addModel(modelGrooveBoxExpander);
p->addModel(modelHazumi);
p->addModel(modelLooper);
p->addModel(modelRepeater);
p->addModel(modelSamplerX8);
p->addModel(modelSatanonaut);
p->addModel(modelWavBank);
p->addModel(modelWavBankMC);
p->addModel(modelXY);
p->addModel(modelArpSeq);
p->addModel(modelAutobreak);
p->addModel(modelAutobreakStudio);
p->addModel(modelByteBeat);
p->addModel(modelDigitalProgrammer);
p->addModel(modelDigitalSequencer);
p->addModel(modelDigitalSequencerXP);
p->addModel(modelDrumRandomizer);
p->addModel(modelGlitchSequencer);
p->addModel(modelGhosts);
p->addModel(modelGrainEngineMK2);
p->addModel(modelGrainEngineMK2Expander);
p->addModel(modelGrainFx);
p->addModel(modelGrooveBox);
p->addModel(modelGrooveBoxExpander);
p->addModel(modelHazumi);
p->addModel(modelOnePoint);
p->addModel(modelOneZero);
p->addModel(modelLooper);
p->addModel(modelNoteDetector);
p->addModel(modelRepeater);
p->addModel(modelSamplerX8);
p->addModel(modelSampler16P);
p->addModel(modelSatanonaut);
p->addModel(modelWavBank);
p->addModel(modelWavBankMC);
p->addModel(modelXY);
#undef modelLooper #undef modelLooper
} }
} }
@@ -3479,6 +3524,7 @@ void initStaticPlugins()
initStatic__Mog(); initStatic__Mog();
initStatic__mscHack(); initStatic__mscHack();
initStatic__MSM(); initStatic__MSM();
initStatic__MUS_X();
initStatic__myth_modules(); initStatic__myth_modules();
initStatic__nonlinearcircuits(); initStatic__nonlinearcircuits();
initStatic__Orbits(); initStatic__Orbits();


+ 1
- 1
plugins/voxglitch

@@ -1 +1 @@
Subproject commit 55186974eeb6c068f2687d7bb4f5c5e1884bf7da
Subproject commit 3792a1ee01240c70e4a9d9e9aed6ec90518ac293

+ 24
- 1
src/CardinalCommon.cpp View File

@@ -99,7 +99,7 @@ void destroyStaticPlugins();
} }
} }


const std::string CARDINAL_VERSION = "24.05";
const std::string CARDINAL_VERSION = "24.09";


// ----------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------


@@ -362,6 +362,15 @@ static int osc_hello_handler(const char*, const char*, lo_arg**, int, const lo_m
d_stdout("Hello received from OSC, saying hello back to them o/"); d_stdout("Hello received from OSC, saying hello back to them o/");
const lo_address source = lo_message_get_source(m); const lo_address source = lo_message_get_source(m);
const lo_server server = static_cast<Initializer*>(self)->oscServer; const lo_server server = static_cast<Initializer*>(self)->oscServer;

// send list of features first
#ifdef CARDINAL_INIT_OSC_THREAD
lo_send_from(source, server, LO_TT_IMMEDIATE, "/resp", "ss", "features", ":screenshot:");
#else
lo_send_from(source, server, LO_TT_IMMEDIATE, "/resp", "ss", "features", "");
#endif

// then finally hello reply
lo_send_from(source, server, LO_TT_IMMEDIATE, "/resp", "ss", "hello", "ok"); lo_send_from(source, server, LO_TT_IMMEDIATE, "/resp", "ss", "hello", "ok");
return 0; return 0;
} }
@@ -386,7 +395,10 @@ static int osc_load_handler(const char*, const char* types, lo_arg** argv, int a
std::vector<uint8_t> data(size); std::vector<uint8_t> data(size);
std::memcpy(data.data(), blob, size); std::memcpy(data.data(), blob, size);


#ifdef CARDINAL_INIT_OSC_THREAD
rack::contextSet(context); rack::contextSet(context);
#endif

rack::system::removeRecursively(context->patch->autosavePath); rack::system::removeRecursively(context->patch->autosavePath);
rack::system::createDirectories(context->patch->autosavePath); rack::system::createDirectories(context->patch->autosavePath);
try { try {
@@ -397,7 +409,10 @@ static int osc_load_handler(const char*, const char* types, lo_arg** argv, int a
catch (rack::Exception& e) { catch (rack::Exception& e) {
WARN("%s", e.what()); WARN("%s", e.what());
} }

#ifdef CARDINAL_INIT_OSC_THREAD
rack::contextSet(nullptr); rack::contextSet(nullptr);
#endif
} }


const lo_address source = lo_message_get_source(m); const lo_address source = lo_message_get_source(m);
@@ -423,10 +438,18 @@ static int osc_param_handler(const char*, const char* types, lo_arg** argv, int
const int paramId = argv[1]->i; const int paramId = argv[1]->i;
const float paramValue = argv[2]->f; const float paramValue = argv[2]->f;


#ifdef CARDINAL_INIT_OSC_THREAD
rack::contextSet(context);
#endif

rack::engine::Module* const module = context->engine->getModule(moduleId); rack::engine::Module* const module = context->engine->getModule(moduleId);
DISTRHO_SAFE_ASSERT_RETURN(module != nullptr, 0); DISTRHO_SAFE_ASSERT_RETURN(module != nullptr, 0);


context->engine->setParamValue(module, paramId, paramValue); context->engine->setParamValue(module, paramId, paramValue);

#ifdef CARDINAL_INIT_OSC_THREAD
rack::contextSet(nullptr);
#endif
} }


return 0; return 0;


+ 1
- 1
src/CardinalPlugin.cpp View File

@@ -414,7 +414,7 @@ protected:
uint32_t getVersion() const override uint32_t getVersion() const override
{ {
return d_version(0, 24, 5);
return d_version(0, 24, 9);
} }
int64_t getUniqueId() const override int64_t getUniqueId() const override


+ 26
- 16
src/CardinalRemote.cpp View File

@@ -1,18 +1,7 @@
/* /*
* DISTRHO Cardinal Plugin * DISTRHO Cardinal Plugin
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2021-2024 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.
* SPDX-License-Identifier: GPL-3.0-or-later
*/ */


#include <engine/Engine.hpp> #include <engine/Engine.hpp>
@@ -40,6 +29,12 @@
# include <lo/lo.h> # include <lo/lo.h>
#endif #endif


namespace rack {
namespace engine {
void Engine_setRemoteDetails(Engine*, remoteUtils::RemoteDetails*);
}
}

// ----------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------


namespace remoteUtils { namespace remoteUtils {
@@ -53,8 +48,15 @@ static int osc_handler(const char* const path, const char* const types, lo_arg**
{ {
d_stdout("osc_handler(\"%s\", ...) - got resp | '%s' '%s'", path, &argv[0]->s, &argv[1]->s); d_stdout("osc_handler(\"%s\", ...) - got resp | '%s' '%s'", path, &argv[0]->s, &argv[1]->s);


if (std::strcmp(&argv[0]->s, "hello") == 0 && std::strcmp(&argv[1]->s, "ok") == 0)
static_cast<RemoteDetails*>(self)->connected = true;
if (std::strcmp(&argv[0]->s, "hello") == 0)
{
if (std::strcmp(&argv[1]->s, "ok") == 0)
static_cast<RemoteDetails*>(self)->connected = true;
}
else if (std::strcmp(&argv[0]->s, "features") == 0)
{
static_cast<RemoteDetails*>(self)->screenshot = std::strstr(&argv[1]->s, ":screenshot:") != nullptr;
}
} }
return 0; return 0;
} }
@@ -92,8 +94,10 @@ bool connectToRemote(const char* const url)
ui->remoteDetails = remoteDetails = new RemoteDetails; ui->remoteDetails = remoteDetails = new RemoteDetails;
remoteDetails->handle = ui; remoteDetails->handle = ui;
remoteDetails->url = strdup(url); remoteDetails->url = strdup(url);
remoteDetails->connected = true;
remoteDetails->autoDeploy = true; remoteDetails->autoDeploy = true;
remoteDetails->connected = true;
remoteDetails->first = false;
remoteDetails->screenshot = false;
} }
#elif defined(HAVE_LIBLO) #elif defined(HAVE_LIBLO)
const lo_address addr = lo_address_new_from_url(url); const lo_address addr = lo_address_new_from_url(url);
@@ -107,10 +111,16 @@ bool connectToRemote(const char* const url)
ui->remoteDetails = remoteDetails = new RemoteDetails; ui->remoteDetails = remoteDetails = new RemoteDetails;
remoteDetails->handle = oscServer; remoteDetails->handle = oscServer;
remoteDetails->url = strdup(url); remoteDetails->url = strdup(url);
remoteDetails->autoDeploy = true;
remoteDetails->first = true;
remoteDetails->connected = false; remoteDetails->connected = false;
remoteDetails->autoDeploy = false;
remoteDetails->screenshot = false;


lo_server_add_method(oscServer, "/resp", nullptr, osc_handler, remoteDetails); lo_server_add_method(oscServer, "/resp", nullptr, osc_handler, remoteDetails);

sendFullPatchToRemote(remoteDetails);

Engine_setRemoteDetails(context->engine, remoteDetails);
} }
else if (std::strcmp(remoteDetails->url, url) != 0) else if (std::strcmp(remoteDetails->url, url) != 0)
{ {


+ 5
- 14
src/CardinalRemote.hpp View File

@@ -1,18 +1,7 @@
/* /*
* DISTRHO Cardinal Plugin * DISTRHO Cardinal Plugin
* Copyright (C) 2021-2023 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.
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*/ */


#pragma once #pragma once
@@ -27,8 +16,10 @@ namespace remoteUtils {
struct RemoteDetails { struct RemoteDetails {
void* handle; void* handle;
const char* url; const char* url;
bool connected;
bool autoDeploy; bool autoDeploy;
bool first;
bool connected;
bool screenshot;
}; };


RemoteDetails* getRemote(); RemoteDetails* getRemote();


+ 1
- 1
src/CardinalUI.cpp View File

@@ -1041,7 +1041,7 @@ protected:
if (inSelfTest) return false; if (inSelfTest) return false;
#endif #endif


const rack::math::Vec scrollDelta = rack::math::Vec(-ev.delta.getX(), ev.delta.getY());
const rack::math::Vec scrollDelta = rack::math::Vec(-ev.delta.getX(), ev.delta.getY()) * 50 ;


const int mods = glfwMods(ev.mod); const int mods = glfwMods(ev.mod);
const ScopedContext sc(this, mods); const ScopedContext sc(this, mods);


+ 1
- 0
src/custom/dep.cpp View File

@@ -464,6 +464,7 @@ static const struct {
{ kModeBefaco, "/Befaco/res/panels/SpringReverb.svg" }, { kModeBefaco, "/Befaco/res/panels/SpringReverb.svg" },
{ kModeBefaco, "/Befaco/res/panels/StereoStrip.svg" }, { kModeBefaco, "/Befaco/res/panels/StereoStrip.svg" },
{ kModeBefaco, "/Befaco/res/panels/Voltio.svg" }, { kModeBefaco, "/Befaco/res/panels/Voltio.svg" },
{ kModeBefaco, "/Befaco/res/panels/Octaves.svg" },
// GPLv3+ // GPLv3+
{ kModeCardinal, "/Cardinal/res/AudioFile.svg" }, { kModeCardinal, "/Cardinal/res/AudioFile.svg" },
{ kModeCardinal, "/Cardinal/res/AudioToCVPitch.svg" }, { kModeCardinal, "/Cardinal/res/AudioToCVPitch.svg" },


+ 4
- 15
src/override/Engine.cpp View File

@@ -1,18 +1,7 @@
/* /*
* DISTRHO Cardinal Plugin * DISTRHO Cardinal Plugin
* Copyright (C) 2021-2023 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.
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*/ */


/** /**
@@ -295,7 +284,7 @@ static void Engine_stepFrame(Engine* that) {
Param* smoothParam = &smoothModule->params[smoothParamId]; Param* smoothParam = &smoothModule->params[smoothParamId];
float value = smoothParam->value; float value = smoothParam->value;
float newValue; float newValue;
if (internal->remoteDetails != nullptr) {
if (internal->remoteDetails != nullptr && internal->remoteDetails->connected) {
newValue = value; newValue = value;
sendParamChangeToRemote(internal->remoteDetails, smoothModule->id, smoothParamId, value); sendParamChangeToRemote(internal->remoteDetails, smoothModule->id, smoothParamId, value);
} else { } else {
@@ -1094,7 +1083,7 @@ void Engine::setParamValue(Module* module, int paramId, float value) {
internal->smoothModule = NULL; internal->smoothModule = NULL;
internal->smoothParamId = 0; internal->smoothParamId = 0;
} }
if (internal->remoteDetails != nullptr) {
if (internal->remoteDetails != nullptr && internal->remoteDetails->connected) {
sendParamChangeToRemote(internal->remoteDetails, module->id, paramId, value); sendParamChangeToRemote(internal->remoteDetails, module->id, paramId, value);
} }
module->params[paramId].setValue(value); module->params[paramId].setValue(value);


+ 20
- 18
src/override/Scene.cpp View File

@@ -1,18 +1,7 @@
/* /*
* DISTRHO Cardinal Plugin * DISTRHO Cardinal Plugin
* Copyright (C) 2021-2023 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.
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*/ */


/** /**
@@ -207,14 +196,19 @@ void Scene::step() {
if (remoteUtils::RemoteDetails* const remoteDetails = remoteUtils::getRemote()) { if (remoteUtils::RemoteDetails* const remoteDetails = remoteUtils::getRemote()) {
idleRemote(remoteDetails); idleRemote(remoteDetails);


if (remoteDetails->autoDeploy) {
if (remoteDetails->autoDeploy && remoteDetails->connected) {
const int actionIndex = APP->history->actionIndex; const int actionIndex = APP->history->actionIndex;
const double time = system::getTime(); const double time = system::getTime();


if (internal->historyActionIndex == -1) { if (internal->historyActionIndex == -1) {
internal->historyActionIndex = actionIndex; internal->historyActionIndex = actionIndex;
internal->lastSceneChangeTime = time; internal->lastSceneChangeTime = time;
} else if (internal->historyActionIndex != actionIndex && actionIndex > 0 && time - internal->lastSceneChangeTime >= 1.0) {
} else if (remoteDetails->first ||
(internal->historyActionIndex != actionIndex
&& actionIndex > 0
&& time - internal->lastSceneChangeTime >= 1.0)) {
remoteDetails->first = false;

const std::string& name(APP->history->actions[actionIndex - 1]->name); const std::string& name(APP->history->actions[actionIndex - 1]->name);
static const std::vector<std::string> ignoredNames = { static const std::vector<std::string> ignoredNames = {
"move knob", "move knob",
@@ -224,7 +218,10 @@ void Scene::step() {
if (std::find(ignoredNames.cbegin(), ignoredNames.cend(), name) == ignoredNames.cend()) { if (std::find(ignoredNames.cbegin(), ignoredNames.cend(), name) == ignoredNames.cend()) {
printf("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str()); printf("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str());
remoteUtils::sendFullPatchToRemote(remoteDetails); remoteUtils::sendFullPatchToRemote(remoteDetails);
window::generateScreenshot();

if (remoteDetails->screenshot) {
window::generateScreenshot();
}
} }
internal->historyActionIndex = actionIndex; internal->historyActionIndex = actionIndex;
internal->lastSceneChangeTime = time; internal->lastSceneChangeTime = time;
@@ -334,8 +331,13 @@ void Scene::onHoverKey(const HoverKeyEvent& e) {
if (e.key == GLFW_KEY_F7 && (e.mods & RACK_MOD_MASK) == 0) { if (e.key == GLFW_KEY_F7 && (e.mods & RACK_MOD_MASK) == 0) {
if (remoteUtils::RemoteDetails* const remoteDetails = remoteUtils::getRemote()) if (remoteUtils::RemoteDetails* const remoteDetails = remoteUtils::getRemote())
{ {
remoteUtils::sendFullPatchToRemote(remoteDetails);
window::generateScreenshot();
if (remoteDetails->connected) {
remoteUtils::sendFullPatchToRemote(remoteDetails);

if (remoteDetails->screenshot) {
window::generateScreenshot();
}
}
} }
e.consume(this); e.consume(this);
} }


+ 2
- 13
src/override/Window.cpp View File

@@ -1,18 +1,7 @@
/* /*
* DISTRHO Cardinal Plugin * DISTRHO Cardinal Plugin
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2021-2024 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.
* SPDX-License-Identifier: GPL-3.0-or-later
*/ */


/** /**
@@ -598,7 +587,7 @@ static void Window__writeImagePNG(void* context, void* data, int size) {
CardinalBaseUI* const ui = static_cast<CardinalBaseUI*>(context); CardinalBaseUI* const ui = static_cast<CardinalBaseUI*>(context);
if (char* const screenshot = String::asBase64(data, size).getAndReleaseBuffer()) { if (char* const screenshot = String::asBase64(data, size).getAndReleaseBuffer()) {
ui->setState("screenshot", screenshot); ui->setState("screenshot", screenshot);
if (ui->remoteDetails != nullptr)
if (ui->remoteDetails != nullptr && ui->remoteDetails->connected && ui->remoteDetails->screenshot)
remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot); remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot);
std::free(screenshot); std::free(screenshot);
} }


+ 1
- 1
utils/macOS/Info_JACK.plist View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>studio.kx.distrho.cardinal.jack</string> <string>studio.kx.distrho.cardinal.jack</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>24.05</string>
<string>24.09</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.15</string> <string>10.15</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>


+ 1
- 1
utils/macOS/Info_Native.plist View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>studio.kx.distrho.cardinal.native</string> <string>studio.kx.distrho.cardinal.native</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>24.05</string>
<string>24.09</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.15</string> <string>10.15</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>


Loading…
Cancel
Save