@@ -5,7 +5,7 @@ body: | |||
id: version | |||
attributes: | |||
label: Version | |||
value: "24.05" | |||
value: "24.09" | |||
validations: | |||
required: true | |||
- type: dropdown | |||
@@ -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 }} | |||
@@ -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 | |||
@@ -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 | |||
@@ -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) | |||
@@ -1 +1 @@ | |||
Subproject commit c37d53a4216654118e711fa41e88e7e801d5bd9b | |||
Subproject commit e39f04d2d8587327e741ad881617c427f5014d48 |
@@ -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 | |||
@@ -1 +1 @@ | |||
Subproject commit 0edef2120e7fd493493e66967438c0b2ea8c8552 | |||
Subproject commit e0a81ba6f24b194c7aa0c6828d422f1354256a09 |
@@ -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) |
@@ -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 | | | |||
@@ -1 +1 @@ | |||
Subproject commit 470c5b7a77091bbea2154cd1d96d3cb1be737aa3 | |||
Subproject commit 6b042628933f220a05571bde6a02fe0198a96b5d |
@@ -1 +1 @@ | |||
Subproject commit d3ad6c6732cee8a80197aa351dd9efef9c278d4c | |||
Subproject commit b24e1c373c7c54871d33247d40216e311dc00849 |
@@ -1 +1 @@ | |||
Subproject commit f2a7d717e2ae066ba0127fa5ffade775baba1512 | |||
Subproject commit e4eb7adaff1afa731563e09c83e35d87319d4654 |
@@ -0,0 +1 @@ | |||
Subproject commit f622217ec6b709b7707fb76f85026e0faa93b893 |
@@ -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 $<" | |||
@@ -1 +1 @@ | |||
Subproject commit 0bcc1f4a48a7a7d59013f5f4a12574f7453a5edf | |||
Subproject commit b5d2fc122382d7934b3ea92e05ad91a9aec89504 |
@@ -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(); | |||
@@ -1 +1 @@ | |||
Subproject commit 55186974eeb6c068f2687d7bb4f5c5e1884bf7da | |||
Subproject commit 3792a1ee01240c70e4a9d9e9aed6ec90518ac293 |
@@ -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<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"); | |||
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::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; | |||
@@ -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 | |||
@@ -1,18 +1,7 @@ | |||
/* | |||
* DISTRHO Cardinal Plugin | |||
* 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> | |||
@@ -40,6 +29,12 @@ | |||
# include <lo/lo.h> | |||
#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<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; | |||
} | |||
@@ -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) | |||
{ | |||
@@ -1,18 +1,7 @@ | |||
/* | |||
* 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 | |||
@@ -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(); | |||
@@ -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); | |||
@@ -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" }, | |||
@@ -1,18 +1,7 @@ | |||
/* | |||
* 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]; | |||
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); | |||
@@ -1,18 +1,7 @@ | |||
/* | |||
* 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()) { | |||
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<std::string> 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); | |||
} | |||
@@ -1,18 +1,7 @@ | |||
/* | |||
* DISTRHO Cardinal Plugin | |||
* 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); | |||
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); | |||
} | |||
@@ -11,7 +11,7 @@ | |||
<key>CFBundleIdentifier</key> | |||
<string>studio.kx.distrho.cardinal.jack</string> | |||
<key>CFBundleShortVersionString</key> | |||
<string>24.05</string> | |||
<string>24.09</string> | |||
<key>LSMinimumSystemVersion</key> | |||
<string>10.15</string> | |||
<key>NSHumanReadableCopyright</key> | |||
@@ -11,7 +11,7 @@ | |||
<key>CFBundleIdentifier</key> | |||
<string>studio.kx.distrho.cardinal.native</string> | |||
<key>CFBundleShortVersionString</key> | |||
<string>24.05</string> | |||
<string>24.09</string> | |||
<key>LSMinimumSystemVersion</key> | |||
<string>10.15</string> | |||
<key>NSHumanReadableCopyright</key> | |||