| @@ -5,7 +5,7 @@ body: | |||
| id: version | |||
| attributes: | |||
| label: Version | |||
| value: "25.06" | |||
| value: "26.01" | |||
| validations: | |||
| required: true | |||
| - type: dropdown | |||
| @@ -3,7 +3,7 @@ name: build | |||
| on: [push, pull_request] | |||
| env: | |||
| CACHE_VERSION: 12 | |||
| CACHE_VERSION: 15 | |||
| CARDINAL_UNDER_WINE: 1 | |||
| CIBUILD: true | |||
| DEBIAN_FRONTEND: noninteractive | |||
| @@ -158,7 +158,7 @@ jobs: | |||
| *.tar.xz | |||
| macos: | |||
| runs-on: macos-13 | |||
| runs-on: macos-14 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -202,6 +202,13 @@ jobs: | |||
| - name: Build macOS (packaging) | |||
| if: steps.cache.outputs.cache-hit == 'true' | |||
| shell: bash | |||
| env: | |||
| MACOS_APP_CERTIFICATE: ${{ secrets.MACOS_APP_CERTIFICATE }} | |||
| MACOS_INSTALLER_CERTIFICATE: ${{ secrets.MACOS_INSTALLER_CERTIFICATE }} | |||
| MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} | |||
| MACOS_NOTARIZATION_USER: ${{ secrets.MACOS_NOTARIZATION_USER }} | |||
| MACOS_NOTARIZATION_PASS: ${{ secrets.MACOS_NOTARIZATION_PASS }} | |||
| MACOS_NOTARIZATION_TEAM: ${{ secrets.MACOS_NOTARIZATION_TEAM }} | |||
| run: | | |||
| source deps/PawPaw/local.env macos-universal-10.15 | |||
| ./utils/create-macos-installer.sh | |||
| @@ -426,7 +433,7 @@ jobs: | |||
| export PATH="/usr/lib/ccache:${PATH}" | |||
| source deps/PawPaw/local.env ${{ matrix.target }} | |||
| make features | |||
| make NOOPT=true -j $(nproc) | |||
| xvfb-run make NOOPT=true -j $(nproc) | |||
| - name: Build cross-compiled (carla) | |||
| if: steps.cache.outputs.cache-hit == 'true' | |||
| shell: bash | |||
| @@ -266,4 +266,6 @@ | |||
| [submodule "plugins/eightfold"] | |||
| path = plugins/eightfold | |||
| url = https://github.com/scanner-darkly/eightfold.git | |||
| [submodule "plugins/Venom"] | |||
| path = plugins/Venom | |||
| url = https://github.com/DaveBenham/VenomModules | |||
| @@ -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 = 25.06 | |||
| VERSION = 26.01 | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Build targets | |||
| @@ -26,7 +26,7 @@ Cardinal should be considered stable, if you spot any bugs please report them. | |||
| Currently the following should be noted: | |||
| - CLAP support is a work-in-progress [DPF#383](https://github.com/DISTRHO/DPF/issues/383) | |||
| - VST3 plugin hosting (inside Carla or Ildaeil modules) mostly works but is considered experimental | |||
| - VST3 plugin hosting (inside [Carla](https://github.com/falkTX/Carla/) or [Ildaeil](https://github.com/DISTRHO/Ildaeil) modules) mostly works but is considered experimental | |||
| - Windows 32bit builds still have a few problematic modules [#80](https://github.com/DISTRHO/Cardinal/issues/80) | |||
| ### Stable release | |||
| @@ -106,7 +106,7 @@ But a couple of modules background's have their colors flipped, because damn we | |||
|  | |||
| ### Carla and Ildaeil plugin hosts | |||
| ### [Carla](https://github.com/falkTX/Carla/) and [Ildaeil](https://github.com/DISTRHO/Ildaeil) plugin hosts | |||
|  | |||
| @@ -197,6 +197,7 @@ At the moment the following 3rd-party modules are provided: | |||
| - [Surge XT](https://github.com/surge-synthesizer/surge-rack) | |||
| - [unless_modules](https://gitlab.com/unlessgames/unless_modules) | |||
| - [Valley](https://github.com/ValleyAudio/ValleyRackFree) | |||
| - [Venom](https://github.com/DaveBenham/VenomModules) | |||
| - [Voxglitch](https://github.com/clone45/voxglitch) | |||
| - [WhatTheRack](https://github.com/korfuri/WhatTheRack) | |||
| - [WSTD-Drums](https://github.com/Wasted-Audio/WSTD-Drums) | |||
| @@ -1 +1 @@ | |||
| Subproject commit 12bc40fd6c9c5b36481c7df55086b27ba9ae8a80 | |||
| Subproject commit 011867b6bcd592a510b4ec157c032fcdac23d6ef | |||
| @@ -1 +1 @@ | |||
| Subproject commit f6eaed13bdeccec013d81ba2261f98aa8f452702 | |||
| Subproject commit dd0fd459be75110d76b633e606a1a1dbc607b2ab | |||
| @@ -185,6 +185,17 @@ Unlike Rack, Cardinal does not use PPQN (pulses per quarter note) values, but BB | |||
| The top of the panel has a timer display to help understand how and what the host is doing. | |||
| The first line is the song time in seconds, and second line is the BBT. | |||
| The meaning of the outputs is: | |||
| - Playing: On if the host transport is rolling or Off if paused/stopped | |||
| - Reset: Trigger for when the host transport has been relocated or has been restarted | |||
| - Bar: Trigger for bar change | |||
| - Beat: Trigger for beat change | |||
| - Step: Trigger for step change | |||
| - Bar Phase: 0-10v smooth ramp for the bar position (with bar division being a right-click option) | |||
| - Beat Phase: 0-10v smooth ramp for the beat position | |||
| - BPM: Beats per minute in [Rack standard](https://vcvrack.com/manual/VoltageStandards#Pitch-and-Frequencies), supported by Impromptu Clocked/Clkd and ZZC Clock | |||
| ## Extra modules | |||
| ### Blank | |||
| @@ -10,7 +10,7 @@ Also, the official plugin works pretty much like the free standalone where you l | |||
| This is intentionally not allowed/enabled in Cardinal, as the target is to make a self-contained plugin binary. | |||
| Online access is also not allowed. | |||
| Bellow follows a list of features comparing the official plugin to Cardinal. | |||
| Below follows a list of features comparing the official plugin to Cardinal. | |||
| | Feature | Rack Pro | Cardinal | Additional notes | | |||
| |--------------------------------|---------------------------|---------------------------------|------------------| | |||
| @@ -36,7 +36,7 @@ Bellow follows a list of features comparing the official plugin to Cardinal. | |||
| | FX plugin variant | 16 ins, 16 outs | 2 ins, 2 outs | | | |||
| | Raw-CV plugin variant | Unsupported | 8 audio IO + 10 CV IO | Available in JACK, LV2 and VST3 formats, not possible in AU and VST2 | | |||
| | Arbitrary parameter automation | Yes | No (*) | Static 24 automatable params, use Host Params/Map modules to map them to module parameters | | |||
| | Integrated plugin host | No, Host payed separately | Yes, using Carla or Ildaeil | | | |||
| | Integrated plugin host | No, Host paid separately | Yes, using Carla or Ildaeil | | | |||
| | Host sync/timing | Using MIDI signals | Using dedicated module | | | |||
| | Linux/X11 event handling | Runs on 2nd thread | Runs on main/GUI thread | | | |||
| | v1 module compatibility | No | No, but with less restrictions | Module widgets can load resources at any point | | |||
| @@ -91,6 +91,7 @@ Below follows a list of all code licenses used in Cardinal and linked submodules | |||
| | Surge XT | GPL-3.0-or-later | | | |||
| | unless_modules | GPL-3.0-or-later | | | |||
| | Valley | GPL-3.0-or-later | | | |||
| | Venom | GPL-3.0-or-later | | | |||
| | Voxglitch | GPL-3.0-or-later | | | |||
| | WSTD-Drums | CC0-1.0 | | | |||
| | WhatTheRack | WTFPL | | | |||
| @@ -99,7 +100,7 @@ Below follows a list of all code licenses used in Cardinal and linked submodules | |||
| ## ARTWORK / PANEL LICENSES | |||
| Bellow follows a list of all licenses related to **artwork and module panels**, sorted by file name. | |||
| Below follows a list of all licenses related to **artwork and module panels**, sorted by file name. | |||
| Licenses were retrieved from the official project's LICENSE, README or related files. | |||
| When * is used, it is meant as wildcard of all files, with potential exceptions mentioned afterwards. | |||
| When a license is uncertain, ??? is used. | |||
| @@ -269,6 +270,7 @@ Below is a list of artwork licenses from plugins | |||
| | ValleyAudio/din1451alt.ttf | CC-BY-3.0-DE | | | |||
| | ValleyAudio/DSEG14Classic-*.ttf | OFL-1.1-RFN | | | |||
| | ValleyAudio/ShareTechMono-*.ttf | OFL-1.1-RFN | | | |||
| | Venom/* | GPL-3.0-or-later | No artwork specific license provided | | |||
| | voxglitch/* | GPL-3.0-or-later | No artwork specific license provided | | |||
| | voxglitch/ShareTechMono-Regular.ttf | OFL-1.1-RFN | | | |||
| | WhatTheRack/* | WTFPL | | | |||
| @@ -23,6 +23,17 @@ If all went well opening the "Engine" menu again should show a checkmark, indica | |||
| For the moment there is no error dialog or information in case things go wrong. | |||
| If you are unable to connect, make sure your OS network firewall settings allows opening port 2228. | |||
| ### Automatic startup on headless builds | |||
| If you do a headless build there is no UI to click on to enable remote control, so for this reason the headless builds (standalone, not plugins) will have OSC remote control enabled by default. | |||
| To change the port for the OSC server use the `CARDINAL_REMOTE_HOST_PORT` environment variable, for example: | |||
| ```sh | |||
| env CARDINAL_REMOTE_HOST_PORT=2228 CardinalNative | |||
| ``` | |||
| This can be useful for starting Cardinal where no mouse/keyboard are attached but you want remote control. | |||
| ## TouchOSC example setup | |||
| A TouchOSC compatible file is available [here](https://github.com/DISTRHO/Cardinal/raw/main/patches/touchosc/24-direct-fader-params.tosc). | |||
| @@ -45,7 +45,7 @@ Implementing new plugin formats will be done here. | |||
| This directory contains special header files needed to build the original Rack code as required by Cardinal. | |||
| These headers are included before the official Rack ones, allowing us to override some implementation details. | |||
| Additionally a few compatiblity headers are present, helping compile the code for more targets than officially supported in Rack. | |||
| Additionally a few compatibility headers are present, helping compile the code for more targets than officially supported in Rack. | |||
| ## lv2export | |||
| @@ -1 +1 @@ | |||
| Subproject commit ab25198ea9f361145e3f8e694d90bd2a93ee830c | |||
| Subproject commit 5b32b1cac430e3038319e46c9e10f459e95ca598 | |||
| @@ -171,6 +171,7 @@ | |||
| "description": "Converts a monophonic audio signal to CV pitch", | |||
| "manualUrl": "https://github.com/DISTRHO/Cardinal/blob/main/docs/CARDINAL-MODULES.md#audio-to-cv-pitch", | |||
| "tags": [ | |||
| "Tuner", | |||
| "Utility" | |||
| ] | |||
| }, | |||
| @@ -192,15 +193,6 @@ | |||
| "Utility" | |||
| ] | |||
| }, | |||
| { | |||
| "slug": "MPV", | |||
| "name": "MPV", | |||
| "description": "An embed video player inside Cardinal", | |||
| "manualUrl": "https://github.com/DISTRHO/Cardinal/blob/main/docs/CARDINAL-MODULES.md#mpv", | |||
| "tags": [ | |||
| "Visual" | |||
| ] | |||
| }, | |||
| { | |||
| "slug": "SassyScope", | |||
| "name": "Sassy Scope", | |||
| @@ -201,7 +201,7 @@ struct CarlaInternalPluginModule : Module, Runner { | |||
| { | |||
| switch (opcode) | |||
| { | |||
| // cannnot be supported | |||
| // cannot be supported | |||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | |||
| break; | |||
| // other stuff | |||
| @@ -27,7 +27,7 @@ | |||
| #include "water/xml/XmlDocument.h" | |||
| #ifndef CARDINAL_SYSDEPS | |||
| // private method that takes ownership, we can use it to avoid superfulous allocations | |||
| // private method that takes ownership, we can use it to avoid superfluous allocations | |||
| extern "C" { | |||
| json_t *jsonp_stringn_nocheck_own(const char* value, size_t len); | |||
| } | |||
| @@ -244,7 +244,7 @@ struct CarlaModule : Module { | |||
| { | |||
| switch (opcode) | |||
| { | |||
| // cannnot be supported | |||
| // cannot be supported | |||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | |||
| break; | |||
| // other stuff | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2026 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 | |||
| @@ -37,6 +37,7 @@ struct HostTime : TerminalModule { | |||
| kHostTimeClock, | |||
| kHostTimeBarPhase, | |||
| kHostTimeBeatPhase, | |||
| kHostTimeBPM, | |||
| kHostTimeCount | |||
| }; | |||
| @@ -160,7 +161,7 @@ struct HostTime : TerminalModule { | |||
| ? ((float)((timeInfo.bar - 1) % barDivision) + (timeInfo.beat - 1) + beatPhase) | |||
| / (pcontext->beatsPerBar * barDivision) | |||
| : 0.0f; | |||
| lights[kHostTimeRolling].setBrightness(playing ? 1.0f : 0.0f); | |||
| lights[kHostTimeReset].setBrightnessSmooth(hasReset ? 1.0f : 0.0f, args.sampleTime * 0.5f); | |||
| lights[kHostTimeBar].setBrightnessSmooth(hasBar ? 1.0f : 0.0f, args.sampleTime * 0.5f); | |||
| @@ -176,6 +177,7 @@ struct HostTime : TerminalModule { | |||
| outputs[kHostTimeClock].setVoltage(hasClock ? 10.0f : 0.0f); | |||
| outputs[kHostTimeBarPhase].setVoltage(barPhase * 10.0f); | |||
| outputs[kHostTimeBeatPhase].setVoltage(beatPhase * 10.0f); | |||
| outputs[kHostTimeBPM].setVoltage(playingWithBBT ? std::log2(pcontext->beatsPerMinute / 120.0) : 0.0); | |||
| } | |||
| void processTerminalOutput(const ProcessArgs&) override | |||
| @@ -224,6 +226,7 @@ struct HostTimeWidget : ModuleWidgetWith8HP { | |||
| addOutput(createOutput<PJ301MPort>(Vec(startX, startY_cv + 4 * padding), m, HostTime::kHostTimeClock)); | |||
| addOutput(createOutput<PJ301MPort>(Vec(startX, startY_cv + 5 * padding), m, HostTime::kHostTimeBarPhase)); | |||
| addOutput(createOutput<PJ301MPort>(Vec(startX, startY_cv + 6 * padding), m, HostTime::kHostTimeBeatPhase)); | |||
| addOutput(createOutput<PJ301MPort>(Vec(startX, startY_cv + 7 * padding), m, HostTime::kHostTimeBPM)); | |||
| const float x = startX + 28; | |||
| addChild(createLightCentered<SmallLight<GreenLight>> (Vec(x, startY_cv + 0 * padding + 12), m, HostTime::kHostTimeRolling)); | |||
| @@ -263,6 +266,7 @@ struct HostTimeWidget : ModuleWidgetWith8HP { | |||
| nvgFontSize(args.vg, 11); | |||
| drawOutputLine(args.vg, 5, "Bar Phase"); | |||
| drawOutputLine(args.vg, 6, "Beat Phase"); | |||
| drawOutputLine(args.vg, 7, "BPM"); | |||
| nvgBeginPath(args.vg); | |||
| nvgRoundedRect(args.vg, startX - 1.0f, startY_top, 98.0f, 38.0f, 4); // 98 | |||
| @@ -52,7 +52,7 @@ | |||
| #include <string> | |||
| #ifndef CARDINAL_SYSDEPS | |||
| // private method that takes ownership, we can use it to avoid superfulous allocations | |||
| // private method that takes ownership, we can use it to avoid superfluous allocations | |||
| extern "C" { | |||
| json_t *jsonp_stringn_nocheck_own(const char* value, size_t len); | |||
| } | |||
| @@ -575,7 +575,7 @@ struct IldaeilModule : Module { | |||
| { | |||
| switch (opcode) | |||
| { | |||
| // cannnot be supported? | |||
| // cannot be supported? | |||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | |||
| break; | |||
| // other stuff | |||
| @@ -85,7 +85,7 @@ struct TextEditorModule : Module { | |||
| { | |||
| file.clear(); | |||
| // Rack Core Notes compatiblity | |||
| // Rack Core Notes compatibility | |||
| if (json_t* const textJ = json_object_get(rootJ, "text")) | |||
| { | |||
| text = json_string_value(textJ); | |||
| @@ -255,18 +255,12 @@ PLUGIN_FILES += Cardinal/src/glBars.cpp | |||
| endif | |||
| endif | |||
| ifneq ($(STATIC_BUILD),true) | |||
| ifneq ($(MOD_BUILD),true) | |||
| PLUGIN_FILES += Cardinal/src/AudioFile.cpp | |||
| ifneq ($(WASM),true) | |||
| PLUGIN_FILES += Cardinal/src/Carla.cpp | |||
| PLUGIN_FILES += Cardinal/src/Ildaeil.cpp | |||
| endif | |||
| ifneq ($(HEADLESS),true) | |||
| ifeq ($(HAVE_X11),true) | |||
| PLUGIN_FILES += Cardinal/src/EmbedWidget.cpp | |||
| PLUGIN_FILES += Cardinal/src/MPV.cpp | |||
| endif | |||
| endif | |||
| endif | |||
| ifneq ($(HEADLESS),true) | |||
| @@ -810,7 +804,7 @@ IHTSYN_CUSTOM_PER_FILE += mv_statevariable | |||
| PLUGIN_FILES += $(filter-out JW-Modules/src/JWModules.cpp JW-Modules/src/Str1ker.cpp,$(wildcard JW-Modules/src/*.cpp)) | |||
| ifneq ($(STATIC_BUILD),true) | |||
| ifneq ($(MOD_BUILD),true) | |||
| PLUGIN_FILES += JW-Modules/src/Str1ker.cpp | |||
| PLUGIN_FILES += $(wildcard JW-Modules/lib/oscpack/ip/*.cpp) | |||
| PLUGIN_FILES += $(wildcard JW-Modules/lib/oscpack/osc/*.cpp) | |||
| @@ -1316,6 +1310,11 @@ PLUGIN_BINARIES += ValleyAudio/src/XFADE.bin | |||
| VALLEYAUDIO_CUSTOM = $(DRWAV) Chord DigitalDisplay | |||
| VALLEYAUDIO_CUSTOM_PER_FILE = TempoKnob | |||
| # -------------------------------------------------------------- | |||
| # Venom | |||
| PLUGIN_FILES += $(filter-out Venom/src/plugin.cpp,$(wildcard Venom/src/*.cpp)) | |||
| # -------------------------------------------------------------- | |||
| # Voxglitch | |||
| @@ -1853,7 +1852,7 @@ LV2_RESOURCES += $(PLUGIN_LIST:%=../bin/CardinalFX.lv2/resources/PluginManifests | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/Cardinal.lv2/resources/%) | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/CardinalFX.lv2/resources/%) | |||
| # MOD builds only have LV2 FX variant for now | |||
| # wasm builds only have standalone and mini | |||
| else ifeq ($(WASM),true) | |||
| MINI_RESOURCES = $(MINIPLUGIN_LIST:%=../bin/CardinalMini.lv2/resources/PluginManifests/%.json) | |||
| @@ -2834,6 +2833,15 @@ $(BUILD_DIR)/ValleyAudio/%.cpp.o: ValleyAudio/%.cpp | |||
| -Wno-sign-compare \ | |||
| -Wno-unused-but-set-variable | |||
| $(BUILD_DIR)/Venom/%.cpp.o: Venom/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(VENOM_CUSTOM),$(call custom_module_names,$(m),Venom)) \ | |||
| -DSKIP_MINGW_FORMAT \ | |||
| -DpluginInstance=pluginInstance__Venom \ | |||
| -lglfw | |||
| $(BUILD_DIR)/voxglitch/%.cpp.o: voxglitch/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| @@ -1 +1 @@ | |||
| Subproject commit ef10da4e2578162b2db2f6534857d6504491daf4 | |||
| Subproject commit 191fbee21a6be7d9c18eacc6f3a1804455d5358d | |||
| @@ -0,0 +1 @@ | |||
| Subproject commit bb30fd61100856214c1def3431f4ce2df70102c2 | |||
| @@ -897,6 +897,13 @@ void surgext_rack_update_theme(); | |||
| // ValleyAudio | |||
| #include "ValleyAudio/src/Valley.hpp" | |||
| // Venom | |||
| #include "Venom/src/plugin.hpp" | |||
| namespace Venom | |||
| { | |||
| void readDefaultThemes(); | |||
| } | |||
| // Voxglitch | |||
| #define modelLooper modelVoxglitchLooper | |||
| #include "voxglitch/src/plugin.hpp" | |||
| @@ -1017,6 +1024,7 @@ extern Plugin* pluginInstance__stoermelder_p1; | |||
| Plugin* pluginInstance__surgext; | |||
| Plugin* pluginInstance__unless_modules; | |||
| Plugin* pluginInstance__ValleyAudio; | |||
| Plugin* pluginInstance__Venom; | |||
| Plugin* pluginInstance__Voxglitch; | |||
| Plugin* pluginInstance__WhatTheRack; | |||
| extern Plugin* pluginInstance__WSTD_Drums; | |||
| @@ -1065,10 +1073,17 @@ struct StaticPluginLoader { | |||
| return; | |||
| } | |||
| // force ABI, we use static plugins so this doesnt matter as long as it builds | |||
| json_t* const version = json_string((APP_VERSION_MAJOR + ".0").c_str()); | |||
| json_object_set(rootJ, "version", version); | |||
| json_decref(version); | |||
| std::string version; | |||
| if (json_t* const versionJ = json_object_get(rootJ, "version")) | |||
| version = json_string_value(versionJ); | |||
| if (!string::startsWith(version, APP_VERSION_MAJOR + ".")) | |||
| { | |||
| // force ABI, we use static plugins so this doesnt matter as long as it builds | |||
| json_t* const versionJ = json_string((APP_VERSION_MAJOR + ".0").c_str()); | |||
| json_object_set(rootJ, "version", versionJ); | |||
| json_decref(versionJ); | |||
| } | |||
| // Load manifest | |||
| p->fromJson(rootJ); | |||
| @@ -1153,12 +1168,12 @@ static void initStatic__Cardinal() | |||
| #else | |||
| spl.removeModule("glBars"); | |||
| #endif | |||
| #ifndef STATIC_BUILD | |||
| #ifndef __MOD_DEVICES__ | |||
| p->addModel(modelAudioFile); | |||
| #else | |||
| spl.removeModule("AudioFile"); | |||
| #endif | |||
| #if !(defined(DISTRHO_OS_WASM) || defined(STATIC_BUILD)) | |||
| #if !(defined(DISTRHO_OS_WASM) || defined(__MOD_DEVICES__)) | |||
| p->addModel(modelCarla); | |||
| p->addModel(modelIldaeil); | |||
| #else | |||
| @@ -1170,11 +1185,6 @@ static void initStatic__Cardinal() | |||
| #else | |||
| spl.removeModule("SassyScope"); | |||
| #endif | |||
| #if defined(HAVE_X11) && !defined(HEADLESS) && !defined(STATIC_BUILD) | |||
| p->addModel(modelMPV); | |||
| #else | |||
| spl.removeModule("MPV"); | |||
| #endif | |||
| #ifdef HAVE_FFTW3F | |||
| p->addModel(modelAudioToCVPitch); | |||
| #else | |||
| @@ -2595,7 +2605,7 @@ static void initStatic__JW() | |||
| p->addModel(modelCoolBreeze); | |||
| p->addModel(modelPete); | |||
| p->addModel(modelTimer); | |||
| #ifndef STATIC_BUILD | |||
| #ifndef __MOD_DEVICES__ | |||
| p->addModel(modelStr1ker); | |||
| #else | |||
| spl.removeModule("Str1ker"); | |||
| @@ -3501,6 +3511,82 @@ static void initStatic__ValleyAudio() | |||
| } | |||
| } | |||
| static void initStatic__Venom() | |||
| { | |||
| Plugin* const p = new Plugin; | |||
| pluginInstance__Venom = p; | |||
| const StaticPluginLoader spl(p, "Venom"); | |||
| if (spl.ok()) | |||
| { | |||
| p->addModel(modelVenomAD_ASR); | |||
| p->addModel(modelVenomAuxClone); | |||
| p->addModel(modelVenomBayInput); | |||
| p->addModel(modelVenomBayNorm); | |||
| p->addModel(modelVenomBayOutput); | |||
| p->addModel(modelVenomBenjolinOsc); | |||
| p->addModel(modelVenomBenjolinGatesExpander); | |||
| p->addModel(modelVenomBenjolinVoltsExpander); | |||
| p->addModel(modelVenomBernoulliSwitch); | |||
| p->addModel(modelVenomBernoulliSwitchExpander); | |||
| p->addModel(modelVenomBlocker); | |||
| p->addModel(modelVenomBypass); | |||
| p->addModel(modelVenomCloneMerge); | |||
| p->addModel(modelVenomCompare2); | |||
| p->addModel(modelVenomCrossFade3D); | |||
| p->addModel(modelVenomHQ); | |||
| p->addModel(modelVenomKnob5); | |||
| p->addModel(modelVenomLinearBeats); | |||
| p->addModel(modelVenomLinearBeatsExpander); | |||
| p->addModel(modelVenomLogic); | |||
| p->addModel(modelVenomMix4); | |||
| p->addModel(modelVenomMix4Stereo); | |||
| p->addModel(modelVenomMixFade); | |||
| p->addModel(modelVenomMixFade2); | |||
| p->addModel(modelVenomMixMute); | |||
| p->addModel(modelVenomMixOffset); | |||
| p->addModel(modelVenomMixPan); | |||
| p->addModel(modelVenomMixSend); | |||
| p->addModel(modelVenomMixSolo); | |||
| p->addModel(modelVenomMousePad); | |||
| p->addModel(modelVenomMultiMerge); | |||
| p->addModel(modelVenomMultiSplit); | |||
| p->addModel(modelVenomSVF); | |||
| p->addModel(modelVenomOscillator); | |||
| p->addModel(modelVenomNORS_IQ); | |||
| p->addModel(modelVenomNORSIQChord2Scale); | |||
| p->addModel(modelVenomPan3D); | |||
| p->addModel(modelVenomPolyClone); | |||
| p->addModel(modelVenomPolyFade); | |||
| p->addModel(modelVenomPolyOffset); | |||
| p->addModel(modelVenomPolySHASR); | |||
| p->addModel(modelVenomPolyScale); | |||
| p->addModel(modelVenomPolyUnison); | |||
| p->addModel(modelVenomPush5); | |||
| p->addModel(modelVenomQuadVCPolarizer); | |||
| p->addModel(modelVenomRecurse); | |||
| p->addModel(modelVenomRecurseStereo); | |||
| p->addModel(modelVenomReformation); | |||
| p->addModel(modelVenomRhythmExplorer); | |||
| p->addModel(modelVenomShapedVCA); | |||
| p->addModel(modelVenomSlew); | |||
| p->addModel(modelVenomSphereToXYZ); | |||
| p->addModel(modelVenomThru); | |||
| p->addModel(modelVenomVCAMix4); | |||
| p->addModel(modelVenomVCAMix4Stereo); | |||
| p->addModel(modelVenomVCOUnit); | |||
| p->addModel(modelVenomBlank); | |||
| p->addModel(modelVenomWaveFolder); | |||
| p->addModel(modelVenomWaveMangler); | |||
| p->addModel(modelVenomWaveMultiplier); | |||
| p->addModel(modelVenomWidgetMenuExtender); | |||
| p->addModel(modelVenomWinComp); | |||
| p->addModel(modelVenomXM_OP); | |||
| Venom::readDefaultThemes(); | |||
| } | |||
| } | |||
| static void initStatic__Voxglitch() | |||
| { | |||
| Plugin* p = new Plugin; | |||
| @@ -3702,6 +3788,7 @@ void initStaticPlugins() | |||
| initStatic__surgext(); | |||
| initStatic__unless_modules(); | |||
| initStatic__ValleyAudio(); | |||
| initStatic__Venom(); | |||
| initStatic__Voxglitch(); | |||
| initStatic__WhatTheRack(); | |||
| initStatic__WSTD_Drums(); | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2025 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2026 Filipe Coelho <falktx@falktx.com> | |||
| * SPDX-License-Identifier: GPL-3.0-or-later | |||
| */ | |||
| @@ -99,7 +99,7 @@ void destroyStaticPlugins(); | |||
| } | |||
| } | |||
| const std::string CARDINAL_VERSION = "25.06"; | |||
| const std::string CARDINAL_VERSION = "26.01"; | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| @@ -630,12 +630,14 @@ Initializer::Initializer(const CardinalBasePlugin* const plugin, const CardinalB | |||
| if (isRealInstance) | |||
| { | |||
| system::createDirectory(asset::userDir); | |||
| #if defined(DISTRHO_OS_WASM) && !defined(CARDINAL_COMMON_UI_ONLY) | |||
| EM_ASM({ | |||
| Module.FS.mkdir('/userfiles'); | |||
| Module.FS.mount(Module.IDBFS, {}, '/userfiles'); | |||
| Module.FS.syncfs(true, function(err) { if (!err) { dynCall('vi', $0, [$1]) } }); | |||
| }, WebBrowserDataLoaded, this); | |||
| #else | |||
| system::createDirectory(asset::userDir); | |||
| #endif | |||
| } | |||
| } | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2025 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2026 Filipe Coelho <falktx@falktx.com> | |||
| * SPDX-License-Identifier: GPL-3.0-or-later | |||
| */ | |||
| @@ -414,7 +414,7 @@ protected: | |||
| uint32_t getVersion() const override | |||
| { | |||
| return d_version(0, 25, 6); | |||
| return d_version(0, 26, 1); | |||
| } | |||
| int64_t getUniqueId() const override | |||
| @@ -1104,7 +1104,7 @@ protected: | |||
| rack::system::removeRecursively(fAutosavePath); | |||
| rack::system::createDirectories(fAutosavePath); | |||
| static constexpr const char zstdMagic[] = "\x28\xb5\x2f\xfd"; | |||
| static constexpr const uint8_t zstdMagic[4] = { 0x28, 0xb5, 0x2f, 0xfd }; | |||
| if (std::memcmp(data.data(), zstdMagic, sizeof(zstdMagic)) != 0) | |||
| { | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2026 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 | |||
| @@ -155,8 +155,8 @@ public: | |||
| std::function<void(char* path)> filebrowseraction; | |||
| FileBrowserHandle filebrowserhandle; | |||
| CardinalBaseUI(const uint width, const uint height) | |||
| : UI(width, height), | |||
| CardinalBaseUI() | |||
| : UI(), | |||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| context(getRackContextFromPlugin(getPluginInstancePointer())), | |||
| #else | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2026 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 | |||
| @@ -339,7 +339,7 @@ class CardinalUI : public CardinalBaseUI, | |||
| public: | |||
| CardinalUI() | |||
| : CardinalBaseUI(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT), | |||
| : CardinalBaseUI(), | |||
| #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| #ifdef DISTRHO_OS_WASM | |||
| fInitializer(new Initializer(static_cast<const CardinalBasePlugin*>(nullptr), this)), | |||
| @@ -1259,20 +1259,6 @@ protected: | |||
| #endif | |||
| } | |||
| #if 0 | |||
| void uiReshape(const uint width, const uint height) override | |||
| { | |||
| glEnable(GL_BLEND); | |||
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
| glMatrixMode(GL_PROJECTION); | |||
| glLoadIdentity(); | |||
| glOrtho(0.0, width, 0.0, height, -1.0, 1.0); | |||
| glViewport(0, 0, width, height); | |||
| glMatrixMode(GL_MODELVIEW); | |||
| glLoadIdentity(); | |||
| } | |||
| #endif | |||
| private: | |||
| /** | |||
| Set our UI class as non-copyable and add a leak detector just in case. | |||
| @@ -1214,7 +1214,7 @@ static constexpr const unsigned long sCardinalX11Icon[] = { | |||
| static constexpr const uint32_t sCardinalX11IconSize = 2 + 16 * 16 + 2 + 48 * 48 + 2 + 128 * 128; | |||
| // declaration first, ensuring extern/visiblity status is respected | |||
| // declaration first, ensuring extern/visibility status is respected | |||
| extern const unsigned long* gCardinalX11Icon; | |||
| // definition afterwards | |||
| @@ -33,6 +33,7 @@ BUILD_CXX_FLAGS += -DnsvgParseFromFile=nsvgParseFromFileCardinal | |||
| RACK_FILES += AsyncDialog.cpp | |||
| RACK_FILES += CardinalModuleWidget.cpp | |||
| RACK_FILES += custom/Browser.cpp | |||
| RACK_FILES += custom/asset.cpp | |||
| RACK_FILES += custom/dep.cpp | |||
| RACK_FILES += custom/library.cpp | |||
| @@ -68,6 +69,7 @@ IGNORED_FILES += Rack/src/plugin.cpp | |||
| IGNORED_FILES += Rack/src/rtaudio.cpp | |||
| IGNORED_FILES += Rack/src/rtmidi.cpp | |||
| IGNORED_FILES += Rack/src/app/AudioDisplay.cpp | |||
| IGNORED_FILES += Rack/src/app/Browser.cpp | |||
| IGNORED_FILES += Rack/src/app/MenuBar.cpp | |||
| IGNORED_FILES += Rack/src/app/MidiDisplay.cpp | |||
| IGNORED_FILES += Rack/src/app/ModuleWidget.cpp | |||
| @@ -291,7 +291,9 @@ endif | |||
| ifeq ($(WASM),true) | |||
| ifneq ($(DEBUG),true) | |||
| LINK_FLAGS += -O3 | |||
| endif | |||
| LINK_FLAGS += -sALLOW_MEMORY_GROWTH | |||
| LINK_FLAGS += -sINITIAL_MEMORY=64Mb | |||
| LINK_FLAGS += -sLZ4=1 | |||
| @@ -334,7 +336,12 @@ SYMLINKED_DIRS_RESOURCES += surgext/build/surge-data/fx_presets | |||
| SYMLINKED_DIRS_RESOURCES += surgext/build/surge-data/wavetables | |||
| SYMLINKED_DIRS_RESOURCES += WSTD-Drums/res/samples | |||
| endif | |||
| ifeq ($(CARDINAL_VARIANT),mini) | |||
| LINK_FLAGS += $(foreach d,$(SYMLINKED_DIRS_RESOURCES),--preload-file=../../bin/CardinalMini.lv2/resources/$(d)@/resources/$(d)) | |||
| else | |||
| LINK_FLAGS += $(foreach d,$(SYMLINKED_DIRS_RESOURCES),--preload-file=../../bin/CardinalNative.lv2/resources/$(d)@/resources/$(d)) | |||
| endif | |||
| else ifeq ($(HAIKU),true) | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2026 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 | |||
| @@ -15,17 +15,14 @@ | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #pragma once | |||
| // little hack to force browser yellow color to cardinal red | |||
| #define SCHEME_YELLOW SCHEME_YELLOW_OldVCV | |||
| #include_next "componentlibrary.hpp" | |||
| #include "componentlibrary.hpp" | |||
| #undef SCHEME_YELLOW | |||
| namespace rack { | |||
| namespace componentlibrary { | |||
| // Yellow? What's that? | |||
| static const NVGcolor SCHEME_YELLOW = nvgRGBf(0.76f, 0.11f, 0.22f); | |||
| } | |||
| } | |||
| #include "../src/app/Browser.cpp" | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2025 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 | |||
| @@ -55,6 +55,7 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow*, const char*) {} | |||
| GLFWAPI GLFWcursor* glfwCreateStandardCursor(int) { return nullptr; } | |||
| GLFWAPI void glfwSetCursor(GLFWwindow*, GLFWcursor*) {} | |||
| GLFWAPI const char* glfwGetKeyName(int, int) { return nullptr; } | |||
| GLFWAPI int glfwGetKey(GLFWwindow*, int) { return 0; } | |||
| GLFWAPI int glfwGetKeyScancode(int) { return 0; } | |||
| GLFWAPI double glfwGetTime(void) { return 0.0; } | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2025 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 | |||
| @@ -17,6 +17,7 @@ | |||
| #include "Application.hpp" | |||
| #include "CardinalPluginContext.hpp" | |||
| #include "widget/event.hpp" | |||
| #include <GLFW/glfw3.h> | |||
| @@ -207,3 +208,12 @@ GLFWAPI const char* glfwGetKeyName(const int key, int) | |||
| default: return nullptr; | |||
| } | |||
| } | |||
| int glfwGetKey(GLFWwindow*, const int key) | |||
| { | |||
| CardinalPluginContext* const context = static_cast<CardinalPluginContext*>(APP); | |||
| DISTRHO_SAFE_ASSERT_RETURN(context != nullptr, GLFW_RELEASE); | |||
| DISTRHO_SAFE_ASSERT_RETURN(context->event != nullptr, GLFW_RELEASE); | |||
| return context->event->heldKeys.find(key) != context->event->heldKeys.end() ? GLFW_PRESS : GLFW_RELEASE; | |||
| } | |||
| @@ -26,10 +26,34 @@ rm -rf vst2/*.vst/Contents/Resources | |||
| rm -rf vst3/*.vst3/Contents/Resources | |||
| rm -rf clap/*.clap/Contents/Resources | |||
| if [ -n "${MACOS_APP_CERTIFICATE}" ] && [ -n "${MACOS_INSTALLER_CERTIFICATE}" ] && [ -n "${MACOS_CERTIFICATE_PASSWORD}" ]; then | |||
| security create-keychain -p "" $(pwd)/keychain.db | |||
| security unlock-keychain -p "" $(pwd)/keychain.db | |||
| echo -n "${MACOS_APP_CERTIFICATE}" | base64 --decode -o cert.p12 | |||
| security import cert.p12 -P "${MACOS_CERTIFICATE_PASSWORD}" -A -t cert -f pkcs12 -k $(pwd)/keychain.db | |||
| echo -n "${MACOS_INSTALLER_CERTIFICATE}" | base64 --decode -o cert.p12 | |||
| security import cert.p12 -P "${MACOS_CERTIFICATE_PASSWORD}" -A -t cert -f pkcs12 -k $(pwd)/keychain.db | |||
| rm cert.p12 | |||
| security list-keychain -d user -s $(pwd)/keychain.db | |||
| MACOS_APP_DEV_ID="$(security find-identity -v $(pwd)/keychain.db | grep 'Developer ID Application:' | head -n 1 | cut -d' ' -f 5-99 | sed 's/\"//g')" | |||
| codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime au/*.component | |||
| codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime clap/*.clap | |||
| codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime jack/*.app | |||
| codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime native/*.app | |||
| codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime vst2/*.vst | |||
| codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime vst3/*.vst3 | |||
| codesign -s "${MACOS_APP_DEV_ID}" --force --verbose --option=runtime lv2/*.lv2/*.dylib | |||
| MACOS_INSTALLER_DEV_ID="$(security find-identity -v $(pwd)/keychain.db | grep 'Developer ID Installer:' | head -n 1 | cut -d' ' -f 5-99 | sed 's/\"//g')" | |||
| PKG_SIGN_ARGS=(--sign "${MACOS_INSTALLER_DEV_ID}") | |||
| fi | |||
| pkgbuild \ | |||
| --identifier "studio.kx.distrho.cardinal.resources" \ | |||
| --install-location "/Library/Application Support/Cardinal/" \ | |||
| --root "${PWD}/res/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-resources.pkg | |||
| pkgbuild \ | |||
| @@ -37,6 +61,7 @@ pkgbuild \ | |||
| --component-plist "../utils/macOS/Build_JACK.plist" \ | |||
| --install-location "/Applications/" \ | |||
| --root "${PWD}/jack/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-jack.pkg | |||
| pkgbuild \ | |||
| @@ -44,36 +69,42 @@ pkgbuild \ | |||
| --component-plist "../utils/macOS/Build_Native.plist" \ | |||
| --install-location "/Applications/" \ | |||
| --root "${PWD}/native/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-native.pkg | |||
| pkgbuild \ | |||
| --identifier "studio.kx.distrho.plugins.cardinal.components" \ | |||
| --install-location "/Library/Audio/Plug-Ins/Components/" \ | |||
| --root "${PWD}/au/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-components.pkg | |||
| pkgbuild \ | |||
| --identifier "studio.kx.distrho.plugins.cardinal.lv2bundles" \ | |||
| --install-location "/Library/Audio/Plug-Ins/LV2/" \ | |||
| --root "${PWD}/lv2/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-lv2bundles.pkg | |||
| pkgbuild \ | |||
| --identifier "studio.kx.distrho.plugins.cardinal.vst2bundles" \ | |||
| --install-location "/Library/Audio/Plug-Ins/VST/" \ | |||
| --root "${PWD}/vst2/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-vst2bundles.pkg | |||
| pkgbuild \ | |||
| --identifier "studio.kx.distrho.plugins.cardinal.vst3bundles" \ | |||
| --install-location "/Library/Audio/Plug-Ins/VST3/" \ | |||
| --root "${PWD}/vst3/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-vst3bundles.pkg | |||
| pkgbuild \ | |||
| --identifier "studio.kx.distrho.plugins.cardinal.clapbundles" \ | |||
| --install-location "/Library/Audio/Plug-Ins/CLAP/" \ | |||
| --root "${PWD}/clap/" \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| ../dpf-cardinal-clapbundles.pkg | |||
| cd .. | |||
| @@ -86,4 +117,14 @@ productbuild \ | |||
| --identifier "studio.kx.distrho.cardinal" \ | |||
| --package-path "${PWD}" \ | |||
| --version 0 \ | |||
| "${PKG_SIGN_ARGS[@]}" \ | |||
| Cardinal-macOS.pkg | |||
| if [ -n "${MACOS_NOTARIZATION_USER}" ] && [ -n "${MACOS_NOTARIZATION_PASS}" ] && [ -n "${MACOS_NOTARIZATION_TEAM}" ]; then | |||
| xcrun notarytool submit Cardinal-macOS.pkg \ | |||
| --apple-id ${MACOS_NOTARIZATION_USER} \ | |||
| --password ${MACOS_NOTARIZATION_PASS} \ | |||
| --team-id ${MACOS_NOTARIZATION_TEAM} \ | |||
| --wait | |||
| xcrun stapler staple Cardinal-macOS.pkg | |||
| fi | |||
| @@ -11,11 +11,11 @@ | |||
| <key>CFBundleIdentifier</key> | |||
| <string>studio.kx.distrho.cardinal.jack</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>25.06</string> | |||
| <string>26.01</string> | |||
| <key>LSMinimumSystemVersion</key> | |||
| <string>10.15</string> | |||
| <key>NSHumanReadableCopyright</key> | |||
| <string>(C) 2011-2025 Filipe Coelho. | |||
| <string>(C) 2011-2026 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.</string> | |||
| <key>NSHighResolutionCapable</key> | |||
| <true/> | |||
| @@ -11,11 +11,11 @@ | |||
| <key>CFBundleIdentifier</key> | |||
| <string>studio.kx.distrho.cardinal.native</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>25.06</string> | |||
| <string>26.01</string> | |||
| <key>LSMinimumSystemVersion</key> | |||
| <string>10.15</string> | |||
| <key>NSHumanReadableCopyright</key> | |||
| <string>(C) 2011-2025 Filipe Coelho. | |||
| <string>(C) 2011-2026 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.</string> | |||
| <key>NSHighResolutionCapable</key> | |||
| <true/> | |||