diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 0511b12..e97eeb4 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -5,7 +5,7 @@ body: id: version attributes: label: Version - value: "24.05" + value: "24.09" validations: required: true - type: dropdown diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1517211..d94a3ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -159,12 +159,20 @@ jobs: macos: strategy: matrix: + debug: [0, 1] target: [universal-10.15] runs-on: macos-12 steps: - uses: actions/checkout@v4 with: 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 id: cache uses: actions/cache@v4 @@ -179,7 +187,7 @@ jobs: src/Rack/dep/libarchive-3.4.3 src/Rack/dep/libsamplerate-0.1.9 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 run: | ./deps/PawPaw/.github/workflows/bootstrap-deps.sh macos-${{ matrix.target }} @@ -191,7 +199,7 @@ jobs: if: steps.cache.outputs.cache-hit == 'true' uses: hendrikmuhs/ccache-action@v1.2 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) if: steps.cache.outputs.cache-hit == 'true' shell: bash @@ -215,14 +223,14 @@ jobs: - name: Rename macOS bundle if: steps.cache.outputs.cache-hit == 'true' 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 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: | ${{ github.event.repository.name }}-*.pkg - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') + if: ${{ matrix.debug == '0' && startsWith(github.ref, 'refs/tags/') }} with: tag_name: ${{ github.ref_name }} name: ${{ github.ref_name }} diff --git a/.gitmodules b/.gitmodules index 7d9b38a..0c21bd0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -200,6 +200,9 @@ [submodule "plugins/forsitan-modulare"] path = plugins/forsitan-modulare 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"] path = plugins/myth-modules url = https://github.com/Ahineya/vcv-myth-plugin.git diff --git a/Makefile b/Makefile index b128c43..2e29714 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ include $(ROOT)/Makefile.base.mk # src/CardinalPlugin.cpp `getVersion` # 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 diff --git a/README.md b/README.md index 718db52..5878800 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ At the moment the following 3rd-party modules are provided: - [Mog](https://github.com/JustMog/Mog-VCV) - [mscHack](https://github.com/mschack/VCV-Rack-Plugins) - [MSM](https://github.com/netboy3/MSM-vcvrack-plugin) +- [MUS-X](https://github.com/Jojosito/MUS-X) - [Myth](https://github.com/Ahineya/vcv-myth-plugin) - [Nonlinear Circuits](https://github.com/mhetrick/nonlinearcircuits) - [Orbits](https://github.com/RareBreeds/Orbits) diff --git a/carla b/carla index c37d53a..e39f04d 160000 --- a/carla +++ b/carla @@ -1 +1 @@ -Subproject commit c37d53a4216654118e711fa41e88e7e801d5bd9b +Subproject commit e39f04d2d8587327e741ad881617c427f5014d48 diff --git a/deps/Makefile b/deps/Makefile index 6e985d4..e9e28a4 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -78,6 +78,9 @@ export MACOSX_DEPLOYMENT_TARGET = $(subst -mmacosx-version-min=,,$(filter -mmaco CMAKE += -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET) else ifeq ($(CIBUILD),true) $(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 CMAKE += -DCMAKE_OSX_SYSROOT="macosx" endif diff --git a/deps/PawPaw b/deps/PawPaw index 0edef21..e0a81ba 160000 --- a/deps/PawPaw +++ b/deps/PawPaw @@ -1 +1 @@ -Subproject commit 0edef2120e7fd493493e66967438c0b2ea8c8552 +Subproject commit e0a81ba6f24b194c7aa0c6828d422f1354256a09 diff --git a/docs/DIFFERENCES.md b/docs/DIFFERENCES.md index 024b81d..ef31a08 100644 --- a/docs/DIFFERENCES.md +++ b/docs/DIFFERENCES.md @@ -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: * 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) - * 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) diff --git a/docs/LICENSES.md b/docs/LICENSES.md index d2b048f..745b9d2 100644 --- a/docs/LICENSES.md +++ b/docs/LICENSES.md @@ -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, 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 | |-------------------------|--------------------------|------------------| | 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+ | | 21kHz | MIT | | | 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 | | | mscHack | BSD-3-Clause | | | 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 | | | Nonlinear Circuits | CC0-1.0 | | | 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/Segment7Standard.ttf | OFL-1.1-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 | | nonlinearcircuits/* | CC0-1.0 | No artwork specific license provided | | nonlinearcircuits/Audiowide-Regular.ttf | OFL-1.1-RFN | | diff --git a/dpf b/dpf index 470c5b7..6b04262 160000 --- a/dpf +++ b/dpf @@ -1 +1 @@ -Subproject commit 470c5b7a77091bbea2154cd1d96d3cb1be737aa3 +Subproject commit 6b042628933f220a05571bde6a02fe0198a96b5d diff --git a/plugins/Befaco b/plugins/Befaco index d3ad6c6..b24e1c3 160000 --- a/plugins/Befaco +++ b/plugins/Befaco @@ -1 +1 @@ -Subproject commit d3ad6c6732cee8a80197aa351dd9efef9c278d4c +Subproject commit b24e1c373c7c54871d33247d40216e311dc00849 diff --git a/plugins/DrumKit b/plugins/DrumKit index f2a7d71..e4eb7ad 160000 --- a/plugins/DrumKit +++ b/plugins/DrumKit @@ -1 +1 @@ -Subproject commit f2a7d717e2ae066ba0127fa5ffade775baba1512 +Subproject commit e4eb7adaff1afa731563e09c83e35d87319d4654 diff --git a/plugins/MUS-X b/plugins/MUS-X new file mode 160000 index 0000000..f622217 --- /dev/null +++ b/plugins/MUS-X @@ -0,0 +1 @@ +Subproject commit f622217ec6b709b7707fb76f85026e0faa93b893 diff --git a/plugins/Makefile b/plugins/Makefile index 9bcbbcc..d912281 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -551,7 +551,7 @@ MINIPLUGIN_FILES += BaconPlugs/src/Style.cpp # -------------------------------------------------------------- # 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) # 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 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 @@ -1301,9 +1306,10 @@ VALLEYAUDIO_CUSTOM_PER_FILE = TempoKnob # Voxglitch 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 -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 # -------------------------------------------------------------- @@ -1466,6 +1472,7 @@ RESOURCE_FILES += MindMeldModular/res/ShapeMaster/CommunityShapes RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldPresets RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldShapes RESOURCE_FILES += Mog/res +RESOURCE_FILES += MUS-X/presets RESOURCE_FILES += nonlinearcircuits/res RESOURCE_FILES += ParableInstruments/res/Neil.png 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)) \ -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 -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" @echo "Compiling $<" diff --git a/plugins/Sapphire b/plugins/Sapphire index 0bcc1f4..b5d2fc1 160000 --- a/plugins/Sapphire +++ b/plugins/Sapphire @@ -1 +1 @@ -Subproject commit 0bcc1f4a48a7a7d59013f5f4a12574f7453a5edf +Subproject commit b5d2fc122382d7934b3ea92e05ad91a9aec89504 diff --git a/plugins/plugins.cpp b/plugins/plugins.cpp index 6e869d1..01905d1 100644 --- a/plugins/plugins.cpp +++ b/plugins/plugins.cpp @@ -759,6 +759,9 @@ extern Model* modelBlankPanel; #undef modelVCA #undef modelVCO +// MUS-X +#include "MUS-X/src/plugin.hpp" + // myth-modules #include "myth-modules/src/plugin.hpp" @@ -955,6 +958,7 @@ Plugin* pluginInstance__MockbaModular; Plugin* pluginInstance__Mog; extern Plugin* pluginInstance__mscHack; Plugin* pluginInstance__MSM; +Plugin* pluginInstance__MUS_X; Plugin* pluginInstance__myth_modules; Plugin* pluginInstance__nonlinearcircuits; Plugin* pluginInstance__Orbits; @@ -1590,9 +1594,13 @@ static void initStatic__Befaco() p->addModel(modelMotionMTR); p->addModel(modelBurst); p->addModel(modelVoltio); + p->addModel(modelOctaves); #undef modelADSR #undef modelMixer #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() { Plugin* const p = new Plugin; @@ -3074,17 +3106,23 @@ static void initStatic__Sapphire() const StaticPluginLoader spl(p, "Sapphire"); 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()) { #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 } } @@ -3479,6 +3524,7 @@ void initStaticPlugins() initStatic__Mog(); initStatic__mscHack(); initStatic__MSM(); + initStatic__MUS_X(); initStatic__myth_modules(); initStatic__nonlinearcircuits(); initStatic__Orbits(); diff --git a/plugins/voxglitch b/plugins/voxglitch index 5518697..3792a1e 160000 --- a/plugins/voxglitch +++ b/plugins/voxglitch @@ -1 +1 @@ -Subproject commit 55186974eeb6c068f2687d7bb4f5c5e1884bf7da +Subproject commit 3792a1ee01240c70e4a9d9e9aed6ec90518ac293 diff --git a/src/CardinalCommon.cpp b/src/CardinalCommon.cpp index 3226cc0..fa594db 100644 --- a/src/CardinalCommon.cpp +++ b/src/CardinalCommon.cpp @@ -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/"); const lo_address source = lo_message_get_source(m); const lo_server server = static_cast(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"); return 0; } @@ -386,7 +395,10 @@ static int osc_load_handler(const char*, const char* types, lo_arg** argv, int a std::vector data(size); std::memcpy(data.data(), blob, size); + #ifdef CARDINAL_INIT_OSC_THREAD rack::contextSet(context); + #endif + rack::system::removeRecursively(context->patch->autosavePath); rack::system::createDirectories(context->patch->autosavePath); try { @@ -397,7 +409,10 @@ static int osc_load_handler(const char*, const char* types, lo_arg** argv, int a catch (rack::Exception& e) { WARN("%s", e.what()); } + + #ifdef CARDINAL_INIT_OSC_THREAD rack::contextSet(nullptr); + #endif } 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 float paramValue = argv[2]->f; + #ifdef CARDINAL_INIT_OSC_THREAD + rack::contextSet(context); + #endif + rack::engine::Module* const module = context->engine->getModule(moduleId); DISTRHO_SAFE_ASSERT_RETURN(module != nullptr, 0); context->engine->setParamValue(module, paramId, paramValue); + + #ifdef CARDINAL_INIT_OSC_THREAD + rack::contextSet(nullptr); + #endif } return 0; diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index 5139aec..c6e6616 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -414,7 +414,7 @@ protected: uint32_t getVersion() const override { - return d_version(0, 24, 5); + return d_version(0, 24, 9); } int64_t getUniqueId() const override diff --git a/src/CardinalRemote.cpp b/src/CardinalRemote.cpp index 14db71d..c52023e 100644 --- a/src/CardinalRemote.cpp +++ b/src/CardinalRemote.cpp @@ -1,18 +1,7 @@ /* * DISTRHO Cardinal Plugin * Copyright (C) 2021-2024 Filipe Coelho - * - * 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 @@ -40,6 +29,12 @@ # include #endif +namespace rack { +namespace engine { +void Engine_setRemoteDetails(Engine*, remoteUtils::RemoteDetails*); +} +} + // ----------------------------------------------------------------------------------------------------------- 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); - if (std::strcmp(&argv[0]->s, "hello") == 0 && std::strcmp(&argv[1]->s, "ok") == 0) - static_cast(self)->connected = true; + if (std::strcmp(&argv[0]->s, "hello") == 0) + { + if (std::strcmp(&argv[1]->s, "ok") == 0) + static_cast(self)->connected = true; + } + else if (std::strcmp(&argv[0]->s, "features") == 0) + { + static_cast(self)->screenshot = std::strstr(&argv[1]->s, ":screenshot:") != nullptr; + } } return 0; } @@ -92,8 +94,10 @@ bool connectToRemote(const char* const url) ui->remoteDetails = remoteDetails = new RemoteDetails; remoteDetails->handle = ui; remoteDetails->url = strdup(url); - remoteDetails->connected = true; remoteDetails->autoDeploy = true; + remoteDetails->connected = true; + remoteDetails->first = false; + remoteDetails->screenshot = false; } #elif defined(HAVE_LIBLO) 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; remoteDetails->handle = oscServer; remoteDetails->url = strdup(url); + remoteDetails->autoDeploy = true; + remoteDetails->first = true; remoteDetails->connected = false; - remoteDetails->autoDeploy = false; + remoteDetails->screenshot = false; 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) { diff --git a/src/CardinalRemote.hpp b/src/CardinalRemote.hpp index 991c995..6b67318 100644 --- a/src/CardinalRemote.hpp +++ b/src/CardinalRemote.hpp @@ -1,18 +1,7 @@ /* * DISTRHO Cardinal Plugin - * Copyright (C) 2021-2023 Filipe Coelho - * - * 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 + * SPDX-License-Identifier: GPL-3.0-or-later */ #pragma once @@ -27,8 +16,10 @@ namespace remoteUtils { struct RemoteDetails { void* handle; const char* url; - bool connected; bool autoDeploy; + bool first; + bool connected; + bool screenshot; }; RemoteDetails* getRemote(); diff --git a/src/CardinalUI.cpp b/src/CardinalUI.cpp index f5905d1..806608d 100644 --- a/src/CardinalUI.cpp +++ b/src/CardinalUI.cpp @@ -1041,7 +1041,7 @@ protected: if (inSelfTest) return false; #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 ScopedContext sc(this, mods); diff --git a/src/custom/dep.cpp b/src/custom/dep.cpp index af32036..dc9b710 100644 --- a/src/custom/dep.cpp +++ b/src/custom/dep.cpp @@ -464,6 +464,7 @@ static const struct { { kModeBefaco, "/Befaco/res/panels/SpringReverb.svg" }, { kModeBefaco, "/Befaco/res/panels/StereoStrip.svg" }, { kModeBefaco, "/Befaco/res/panels/Voltio.svg" }, + { kModeBefaco, "/Befaco/res/panels/Octaves.svg" }, // GPLv3+ { kModeCardinal, "/Cardinal/res/AudioFile.svg" }, { kModeCardinal, "/Cardinal/res/AudioToCVPitch.svg" }, diff --git a/src/override/Engine.cpp b/src/override/Engine.cpp index de59842..ba95f4c 100644 --- a/src/override/Engine.cpp +++ b/src/override/Engine.cpp @@ -1,18 +1,7 @@ /* * DISTRHO Cardinal Plugin - * Copyright (C) 2021-2023 Filipe Coelho - * - * 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 + * SPDX-License-Identifier: GPL-3.0-or-later */ /** @@ -295,7 +284,7 @@ static void Engine_stepFrame(Engine* that) { Param* smoothParam = &smoothModule->params[smoothParamId]; float value = smoothParam->value; float newValue; - if (internal->remoteDetails != nullptr) { + if (internal->remoteDetails != nullptr && internal->remoteDetails->connected) { newValue = value; sendParamChangeToRemote(internal->remoteDetails, smoothModule->id, smoothParamId, value); } else { @@ -1094,7 +1083,7 @@ void Engine::setParamValue(Module* module, int paramId, float value) { internal->smoothModule = NULL; internal->smoothParamId = 0; } - if (internal->remoteDetails != nullptr) { + if (internal->remoteDetails != nullptr && internal->remoteDetails->connected) { sendParamChangeToRemote(internal->remoteDetails, module->id, paramId, value); } module->params[paramId].setValue(value); diff --git a/src/override/Scene.cpp b/src/override/Scene.cpp index 07976df..909b498 100644 --- a/src/override/Scene.cpp +++ b/src/override/Scene.cpp @@ -1,18 +1,7 @@ /* * DISTRHO Cardinal Plugin - * Copyright (C) 2021-2023 Filipe Coelho - * - * 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 + * SPDX-License-Identifier: GPL-3.0-or-later */ /** @@ -207,14 +196,19 @@ void Scene::step() { if (remoteUtils::RemoteDetails* const remoteDetails = remoteUtils::getRemote()) { idleRemote(remoteDetails); - if (remoteDetails->autoDeploy) { + if (remoteDetails->autoDeploy && remoteDetails->connected) { const int actionIndex = APP->history->actionIndex; const double time = system::getTime(); if (internal->historyActionIndex == -1) { internal->historyActionIndex = actionIndex; 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); static const std::vector ignoredNames = { "move knob", @@ -224,7 +218,10 @@ void Scene::step() { if (std::find(ignoredNames.cbegin(), ignoredNames.cend(), name) == ignoredNames.cend()) { printf("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str()); remoteUtils::sendFullPatchToRemote(remoteDetails); - window::generateScreenshot(); + + if (remoteDetails->screenshot) { + window::generateScreenshot(); + } } internal->historyActionIndex = actionIndex; 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 (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); } diff --git a/src/override/Window.cpp b/src/override/Window.cpp index e1b3bf3..6457d04 100644 --- a/src/override/Window.cpp +++ b/src/override/Window.cpp @@ -1,18 +1,7 @@ /* * DISTRHO Cardinal Plugin * Copyright (C) 2021-2024 Filipe Coelho - * - * 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(context); if (char* const screenshot = String::asBase64(data, size).getAndReleaseBuffer()) { ui->setState("screenshot", screenshot); - if (ui->remoteDetails != nullptr) + if (ui->remoteDetails != nullptr && ui->remoteDetails->connected && ui->remoteDetails->screenshot) remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot); std::free(screenshot); } diff --git a/utils/macOS/Info_JACK.plist b/utils/macOS/Info_JACK.plist index d0980b3..968aa4a 100644 --- a/utils/macOS/Info_JACK.plist +++ b/utils/macOS/Info_JACK.plist @@ -11,7 +11,7 @@ CFBundleIdentifier studio.kx.distrho.cardinal.jack CFBundleShortVersionString - 24.05 + 24.09 LSMinimumSystemVersion 10.15 NSHumanReadableCopyright diff --git a/utils/macOS/Info_Native.plist b/utils/macOS/Info_Native.plist index 1672ad6..2c3d028 100644 --- a/utils/macOS/Info_Native.plist +++ b/utils/macOS/Info_Native.plist @@ -11,7 +11,7 @@ CFBundleIdentifier studio.kx.distrho.cardinal.native CFBundleShortVersionString - 24.05 + 24.09 LSMinimumSystemVersion 10.15 NSHumanReadableCopyright