| @@ -5,7 +5,7 @@ body: | |||
| id: version | |||
| attributes: | |||
| label: Version | |||
| value: "24.12" | |||
| value: "26.01" | |||
| validations: | |||
| required: true | |||
| - type: dropdown | |||
| @@ -3,11 +3,12 @@ name: build | |||
| on: [push, pull_request] | |||
| env: | |||
| CACHE_VERSION: 11 | |||
| CACHE_VERSION: 14 | |||
| CARDINAL_UNDER_WINE: 1 | |||
| CIBUILD: true | |||
| DEBIAN_FRONTEND: noninteractive | |||
| LIBGL_ALWAYS_SOFTWARE: true | |||
| PAWPAW_CI: 1 | |||
| PAWPAW_FAST_MATH: 1 | |||
| PAWPAW_SKIP_GLIB: 1 | |||
| PAWPAW_SKIP_LTO: 1 | |||
| @@ -23,7 +24,7 @@ jobs: | |||
| target: [aarch64, armhf, i686, riscv64, x86_64] | |||
| runs-on: ubuntu-latest | |||
| container: | |||
| image: ubuntu:20.04 | |||
| image: ubuntu:22.04 | |||
| steps: | |||
| - name: Install git | |||
| run: | | |||
| @@ -125,7 +126,7 @@ jobs: | |||
| *.tar.gz | |||
| linux-x86_64-debug: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -157,7 +158,7 @@ jobs: | |||
| *.tar.xz | |||
| macos: | |||
| runs-on: macos-13 | |||
| runs-on: macos-14 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -179,6 +180,7 @@ jobs: | |||
| key: macos-universal-v${{ env.CACHE_VERSION }} | |||
| - name: Setup dependencies | |||
| run: | | |||
| brew uninstall --force --ignore-dependencies cmake | |||
| ./deps/PawPaw/.github/workflows/bootstrap-deps.sh macos-universal-10.15 | |||
| - name: Build extra dependencies | |||
| run: | | |||
| @@ -228,10 +230,12 @@ jobs: | |||
| files: | | |||
| ${{ github.event.repository.name }}-*.pkg | |||
| modaudio: | |||
| mod-plugin-builder: | |||
| strategy: | |||
| matrix: | |||
| include: | |||
| - name: darkglass-anagram | |||
| target: darkglass-anagram | |||
| - name: modduo | |||
| target: modduo-static | |||
| extraflags: MODDUO=true | |||
| @@ -239,7 +243,7 @@ jobs: | |||
| target: modduox-static | |||
| - name: moddwarf | |||
| target: moddwarf | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -254,7 +258,7 @@ jobs: | |||
| - name: Set up dependencies | |||
| run: | | |||
| sudo apt-get update -qq | |||
| sudo apt-get install -yqq acl bc curl cvs git mercurial rsync subversion wget bison bzip2 flex gawk gperf gzip help2man nano perl patch tar texinfo unzip automake binutils build-essential cpio libtool libncurses-dev pkg-config python libtool-bin liblo-dev qemu-user-static | |||
| sudo apt-get install -yqq acl bc curl cvs git mercurial rsync subversion wget bison bzip2 flex gawk gperf gzip help2man nano perl patch tar texinfo unzip automake binutils build-essential cpio libtool libncurses-dev pkg-config python3 libtool-bin liblo-dev qemu-user-static | |||
| sudo apt-get install -yqq pandoc texlive-latex-recommended texlive-latex-extra | |||
| sudo apt-get clean | |||
| - name: Bootstrap toolchain | |||
| @@ -422,7 +426,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 | |||
| @@ -471,7 +475,7 @@ jobs: | |||
| Cardinal-*.zip | |||
| headless: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -488,7 +492,7 @@ jobs: | |||
| make HEADLESS=true -j $(nproc) | |||
| lto: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -505,7 +509,7 @@ jobs: | |||
| make WITH_LTO=true -j $(nproc) native | |||
| sysdeps: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -521,7 +525,7 @@ jobs: | |||
| make SYSDEPS=true -j $(nproc) | |||
| source-tarball: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -561,7 +565,7 @@ jobs: | |||
| /home/runner/*/*/cardinal*.tar.xz | |||
| plugin-validation: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| @@ -583,8 +587,8 @@ jobs: | |||
| - name: Set up dependencies | |||
| run: | | |||
| # custom repos | |||
| wget https://launchpad.net/~kxstudio-debian/+archive/kxstudio/+files/kxstudio-repos_11.1.0_all.deb | |||
| sudo dpkg -i kxstudio-repos_11.1.0_all.deb | |||
| wget https://launchpad.net/~kxstudio-debian/+archive/kxstudio/+files/kxstudio-repos_11.2.0_all.deb | |||
| sudo dpkg -i kxstudio-repos_11.2.0_all.deb | |||
| sudo apt-get update -qq | |||
| # build-deps | |||
| sudo apt-get install -yqq libdbus-1-dev libgl1-mesa-dev liblo-dev libx11-dev libxcursor-dev libxext-dev libxrandr-dev | |||
| @@ -49,9 +49,9 @@ | |||
| [submodule "plugins/ValleyAudio"] | |||
| path = plugins/ValleyAudio | |||
| url = https://github.com/ValleyAudio/ValleyRackFree.git | |||
| [submodule "plugins/DrumKit"] | |||
| path = plugins/DrumKit | |||
| url = https://github.com/SVModular/DrumKit.git | |||
| [submodule "plugins/WSTD-Drums"] | |||
| path = plugins/WSTD-Drums | |||
| url = https://github.com/Wasted-Audio/WSTD-Drums.git | |||
| [submodule "carla"] | |||
| path = carla | |||
| url = https://github.com/falkTX/Carla.git | |||
| @@ -260,4 +260,9 @@ | |||
| [submodule "plugins/admiral"] | |||
| path = plugins/admiral | |||
| url = https://github.com/wapiflapi/admiral.git | |||
| [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 | |||
| @@ -1,12 +1,12 @@ | |||
| #!/usr/bin/make -f | |||
| # DISTRHO Cardinal Plugin | |||
| # Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> | |||
| # Copyright (C) 2021-2025 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-3.0-or-later | |||
| ROOT = . | |||
| include $(ROOT)/Makefile.base.mk | |||
| # ----------------------------------------------------------------------------- | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Set version | |||
| # also set in: | |||
| @@ -15,20 +15,20 @@ 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.12 | |||
| VERSION = 26.01 | |||
| # -------------------------------------------------------------- | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Build targets | |||
| all: cardinal carla deps dgl plugins gen resources | |||
| # -------------------------------------------------------------- | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Build config | |||
| PREFIX ?= /usr/local | |||
| DESTDIR ?= | |||
| # -------------------------------------------------------------- | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Carla config | |||
| CARLA_EXTRA_ARGS = \ | |||
| @@ -44,7 +44,16 @@ ifneq ($(DEBUG),true) | |||
| CARLA_EXTRA_ARGS += EXTERNAL_PLUGINS=true | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # DGL config | |||
| ifeq ($(WASM),true) | |||
| UI_TYPE = gles2 | |||
| else | |||
| UI_TYPE = opengl | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Check for required system-wide dependencies | |||
| ifeq ($(SYSDEPS),true) | |||
| @@ -183,7 +192,7 @@ endif | |||
| dgl: | |||
| ifneq ($(HEADLESS),true) | |||
| $(MAKE) opengl -C dpf/dgl $(DGL_EXTRA_ARGS) | |||
| $(MAKE) $(UI_TYPE) -C dpf/dgl $(DGL_EXTRA_ARGS) | |||
| endif | |||
| plugins: deps | |||
| @@ -229,6 +238,9 @@ clap: carla deps dgl plugins resources | |||
| lv2: carla deps dgl plugins resources | |||
| $(MAKE) lv2 -C src $(CARLA_EXTRA_ARGS) | |||
| mapi: carla deps dgl plugins resources | |||
| $(MAKE) mapi -C src $(CARLA_EXTRA_ARGS) | |||
| vst2: carla deps dgl plugins resources | |||
| $(MAKE) vst2 -C src $(CARLA_EXTRA_ARGS) | |||
| @@ -145,7 +145,7 @@ At the moment the following 3rd-party modules are provided: | |||
| - [CVfunk](https://github.com/codygeary/CVfunk-Modules) | |||
| - [dBiz](https://github.com/dBiz/dBiz) | |||
| - [DHE Modules](https://github.com/dhemery/DHE-Modules) | |||
| - [DrumKit](https://svmodular.com/plugin/vcv/drumkit.html) | |||
| - [eightfold](https://github.com/scanner-darkly/eightfold) | |||
| - [EnigmaCurry](https://github.com/EnigmaCurry/EnigmaCurry-vcv-pack) | |||
| - [E-Series](https://github.com/VCVRack/ESeries) | |||
| - [ExpertSleepers Encoders](https://expert-sleepers.co.uk/vcvrack_encoders.html) | |||
| @@ -196,8 +196,10 @@ 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) | |||
| - [ZetaCarinae](https://github.com/mhampton/ZetaCarinaeModules) | |||
| - [ZZC](https://github.com/zezic/ZZC) | |||
| @@ -1 +1 @@ | |||
| Subproject commit 17000e7fe99459b25a50094a8b00bdfa12f2bfbc | |||
| Subproject commit 011867b6bcd592a510b4ec157c032fcdac23d6ef | |||
| @@ -57,6 +57,7 @@ SPACE += | |||
| CMAKE = cmake | |||
| CMAKE += -DCMAKE_INSTALL_LIBDIR=lib | |||
| CMAKE += -DCMAKE_INSTALL_PREFIX='$(RACK_DEP_PATH)' | |||
| CMAKE += -DCMAKE_POLICY_VERSION_MINIMUM=3.5 | |||
| CMAKE += -DBUILD_SHARED_LIBS=OFF | |||
| # make sure debug/release matches | |||
| @@ -1 +1 @@ | |||
| Subproject commit 0985cf8d1c3a00b1958ef90e0f1aa511b865241a | |||
| Subproject commit f6eaed13bdeccec013d81ba2261f98aa8f452702 | |||
| @@ -39,7 +39,7 @@ Below follows a list of all code licenses used in Cardinal and linked submodules | |||
| | CVfunk | MIT | | | |||
| | dBiz | GPL-3.0-or-later | | | |||
| | DHE-Modules | MIT | | | |||
| | DrumKit | CC0-1.0 | | | |||
| | eightfold | GPL-3.0-or-later | | | |||
| | EnigmaCurry | GPL-3.0-or-later | | | |||
| | E-Series | GPL-3.0-or-later | | | |||
| | ExpertSleepers Encoders | MIT | | | |||
| @@ -90,7 +90,9 @@ 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 | | | |||
| | ZetaCarinae | GPL-3.0-or-later | | | |||
| | ZZC | GPL-3.0-or-later | | | |||
| @@ -178,6 +180,7 @@ Below is a list of artwork licenses from plugins | |||
| | DHE-Modules/* | MIT | Same license as source code | | |||
| | DrumKit/* | CC0-1.0 | | | |||
| | DrumKit/component/NovaMono.ttf | OFL-1.1-RFN | | | |||
| | eightfold/* | GPL-3.0-or-later | No artwork specific license provided | | |||
| | EnigmaCurry/res/fonts/dseg/* | OFL-1.1-RFN | | | |||
| | EnigmaCurry/res/fonts/Fantasque/* | OFL-1.1 | | | |||
| | EnigmaCurry/res/fonts/manrope/* | OFL-1.1 | | | |||
| @@ -201,6 +204,7 @@ Below is a list of artwork licenses from plugins | |||
| | ImpromptuModular/res/comp/complib/* | CC-BY-NC-4.0 | | | |||
| | JW-Modules/* | BSD-3-Clause | No artwork specific license provided | | |||
| | JW-Modules/DejaVuSansMono.ttf | Bitstream-Vera | Unused in Cardinal | | |||
| | JW-Modules/res/fonts/ShareTechMono-Regular.ttf | OFL-1.1 | | | |||
| | kocmoc/* | GPL-3.0-or-later | No artwork specific license provided | | |||
| | LifeFormModular/* | MIT | No artwork specific license provided | | |||
| | LilacLoop/* | GPL-3.0-or-later | No artwork specific license provided | | |||
| @@ -263,6 +267,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). | |||
| @@ -1 +1 @@ | |||
| Subproject commit 32d911c1decd721520e44adce2ca7a92ca0ec4f0 | |||
| Subproject commit d4c2ce6e3da43ae328876146b60d2d2cca5caa44 | |||
| @@ -1 +1 @@ | |||
| Subproject commit 5a80023d86e0f67ead3e27385170310cd430d44c | |||
| Subproject commit 5914634cd91cf11cc32394616252beb19c5c934c | |||
| @@ -1 +1 @@ | |||
| Subproject commit a116e6b18ac05974a23509cc47adfd86e8406385 | |||
| Subproject commit 51f2b4e61cde7978fb84cdd892a1d3aaedc0ff5b | |||
| @@ -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", | |||
| @@ -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,14 +37,22 @@ struct HostTime : TerminalModule { | |||
| kHostTimeClock, | |||
| kHostTimeBarPhase, | |||
| kHostTimeBeatPhase, | |||
| kHostTimeBPM, | |||
| kHostTimeCount | |||
| }; | |||
| enum BarDivisions { | |||
| Bars1 = 1, | |||
| Bars4 = 4, | |||
| Bars8 = 8 | |||
| }; | |||
| const CardinalPluginContext* const pcontext; | |||
| rack::dsp::PulseGenerator pulseReset, pulseBar, pulseBeat, pulseClock; | |||
| float sampleTime = 0.0f; | |||
| uint32_t lastProcessCounter = 0; | |||
| BarDivisions barDivision = Bars1; | |||
| // cached time values | |||
| struct { | |||
| bool reset = true; | |||
| @@ -122,7 +130,9 @@ struct HostTime : TerminalModule { | |||
| { | |||
| timeInfo.beat = 1; | |||
| ++timeInfo.bar; | |||
| pulseBar.trigger(); | |||
| if (timeInfo.bar % barDivision == 1) | |||
| pulseBar.trigger(); | |||
| } | |||
| } | |||
| @@ -148,7 +158,8 @@ struct HostTime : TerminalModule { | |||
| ? tick / pcontext->ticksPerBeat | |||
| : 0.0f; | |||
| const float barPhase = playingWithBBT && pcontext->beatsPerBar > 0 | |||
| ? ((float) (timeInfo.beat - 1) + beatPhase) / pcontext->beatsPerBar | |||
| ? ((float)((timeInfo.bar - 1) % barDivision) + (timeInfo.beat - 1) + beatPhase) | |||
| / (pcontext->beatsPerBar * barDivision) | |||
| : 0.0f; | |||
| lights[kHostTimeRolling].setBrightness(playing ? 1.0f : 0.0f); | |||
| @@ -166,10 +177,25 @@ 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 | |||
| {} | |||
| json_t* dataToJson() override { | |||
| json_t* rootJ = json_object(); | |||
| json_object_set_new(rootJ, "barDivision", json_integer(barDivision)); | |||
| return rootJ; | |||
| } | |||
| void dataFromJson(json_t* rootJ) override { | |||
| if (json_t* bdJ = json_object_get(rootJ, "barDivision")) { | |||
| int value = json_integer_value(bdJ); | |||
| if (value == Bars1 || value == Bars4 || value == Bars8) | |||
| barDivision = static_cast<BarDivisions>(value); | |||
| } | |||
| } | |||
| }; | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -200,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)); | |||
| @@ -239,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 | |||
| @@ -286,6 +314,22 @@ struct HostTimeWidget : ModuleWidgetWith8HP { | |||
| ModuleWidget::drawLayer(args, layer); | |||
| } | |||
| void appendContextMenu(Menu* menu) override { | |||
| struct BarDivisionItem : MenuItem { | |||
| HostTime* module; | |||
| HostTime::BarDivisions value; | |||
| void onAction(const event::Action& e) override { | |||
| module->barDivision = value; | |||
| } | |||
| }; | |||
| menu->addChild(new MenuSeparator); | |||
| menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Bar Division")); | |||
| menu->addChild(construct<BarDivisionItem>(&BarDivisionItem::text, "Bars/1", &BarDivisionItem::module, module, &BarDivisionItem::value, HostTime::Bars1)); | |||
| menu->addChild(construct<BarDivisionItem>(&BarDivisionItem::text, "Bars/4", &BarDivisionItem::module, module, &BarDivisionItem::value, HostTime::Bars4)); | |||
| menu->addChild(construct<BarDivisionItem>(&BarDivisionItem::text, "Bars/8", &BarDivisionItem::module, module, &BarDivisionItem::value, HostTime::Bars8)); | |||
| } | |||
| }; | |||
| #else | |||
| struct HostTimeWidget : ModuleWidget { | |||
| @@ -1 +0,0 @@ | |||
| Subproject commit b94c5deb9b93d810f582221f03db8a6feaee6679 | |||
| @@ -1 +1 @@ | |||
| Subproject commit 49e2bc0f6a3ef4d1616b78d6280a6d4e7ee222d3 | |||
| Subproject commit 8c46fbe13acdcb87991719bddcc6ec8abcf152ef | |||
| @@ -1 +1 @@ | |||
| Subproject commit 9d8f8515deb20d7e14ca85b4c1d04ec6b66b3e8d | |||
| Subproject commit 72c8b569dd2cc12ce16abe2da582fc58e07c3d54 | |||
| @@ -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) | |||
| @@ -560,7 +554,7 @@ PLUGIN_FILES += $(filter-out Befaco/src/plugin.cpp Befaco/src/MidiThing.cpp,$(wi | |||
| PLUGIN_FILES += $(wildcard Befaco/src/noise-plethora/*/*.cpp) | |||
| # modules/types which are present in other plugins | |||
| BEFACO_CUSTOM = ADSR Mixer chowdsp Burst RecordButton | |||
| BEFACO_CUSTOM = ADSR Mixer chowdsp Burst RecordButton Mixer2 Slew | |||
| BEFACO_FLAGS = $(filter-out -fsingle-precision-constant,$(filter-out -std=gnu++11,$(BUILD_CXX_FLAGS))) | |||
| BEFACO_FLAGS += -std=gnu++17 | |||
| @@ -678,7 +672,7 @@ COMPUTERSCARE_CUSTOM = Quantizer PanelBorder | |||
| PLUGIN_FILES += $(filter-out CVfunk/src/plugin.cpp,$(wildcard CVfunk/src/*.cpp)) | |||
| # modules/types which are present in other plugins | |||
| CVFUNK_CUSTOM = Steps | |||
| CVFUNK_CUSTOM = Steps Node | |||
| # -------------------------------------------------------------- | |||
| # dBiz | |||
| @@ -695,17 +689,15 @@ DBIZ_CUSTOM_PER_FILE = LERP MultiFilter Oscillator calcOutput sineOsc subBank | |||
| PLUGIN_FILES += $(filter-out DHE-Modules/src/plugin.cpp,$(wildcard DHE-Modules/src/modules/*/init.cpp)) | |||
| # -------------------------------------------------------------- | |||
| # DrumKit | |||
| PLUGIN_FILES += $(wildcard DrumKit/src/*.cpp) | |||
| PLUGIN_FILES += $(wildcard DrumKit/src/controller/*.cpp) | |||
| PLUGIN_FILES += $(wildcard DrumKit/src/view/*.cpp) | |||
| PLUGIN_FILES += $(wildcard DrumKit/src/model/*.cpp) | |||
| PLUGIN_FILES += $(wildcard DrumKit/deps/*.cpp) | |||
| PLUGIN_FILES += $(wildcard DrumKit/deps/SynthDevKit/src/*.cpp) | |||
| # eightfold | |||
| PLUGIN_FILES += $(filter-out eightfold/src/plugin.cpp,$(wildcard eightfold/src/*.cpp)) | |||
| # modules/types which are present in other plugins | |||
| DRUMKIT_CUSTOM = ADSR Envelope LowFrequencyOscillator | |||
| EIGHTFOLD_CUSTOM = Comparator comparator | |||
| EIGHTFOLD_FLAGS = $(filter-out -std=gnu++11,$(BUILD_CXX_FLAGS)) | |||
| EIGHTFOLD_FLAGS += -std=gnu++17 | |||
| # -------------------------------------------------------------- | |||
| # EnigmaCurry | |||
| @@ -812,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) | |||
| @@ -824,7 +816,7 @@ endif | |||
| endif | |||
| # modules/types which are present in other plugins | |||
| JW_CUSTOM = PlayHead Quantizer | |||
| JW_CUSTOM = PlayHead Quantizer Arrange | |||
| # -------------------------------------------------------------- | |||
| # kocmoc | |||
| @@ -832,7 +824,7 @@ JW_CUSTOM = PlayHead Quantizer | |||
| PLUGIN_FILES += $(filter-out kocmoc/src/plugin.cpp,$(wildcard kocmoc/src/*.cpp)) | |||
| # modules/types which are present in other plugins | |||
| KOCMOC_CUSTOM = Phasor __ct_base __ct_comp | |||
| KOCMOC_CUSTOM = Diode Phasor __ct_base __ct_comp | |||
| # -------------------------------------------------------------- | |||
| # LifeFormModular | |||
| @@ -1312,6 +1304,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 | |||
| @@ -1327,6 +1324,19 @@ VOXGLITCH_CUSTOM_PER_FILE = AudioBuffer GateSequencer Grain SamplePlayer Sequenc | |||
| PLUGIN_FILES += $(filter-out WhatTheRack/src/WhatTheRack.cpp,$(wildcard WhatTheRack/src/*.cpp)) | |||
| # -------------------------------------------------------------- | |||
| # WSTD-Drums | |||
| PLUGIN_FILES += $(wildcard WSTD-Drums/src/*.cpp) | |||
| PLUGIN_FILES += $(wildcard WSTD-Drums/src/controller/*.cpp) | |||
| PLUGIN_FILES += $(wildcard WSTD-Drums/src/view/*.cpp) | |||
| PLUGIN_FILES += $(wildcard WSTD-Drums/src/model/*.cpp) | |||
| PLUGIN_FILES += $(wildcard WSTD-Drums/deps/*.cpp) | |||
| PLUGIN_FILES += $(wildcard WSTD-Drums/deps/SynthDevKit/src/*.cpp) | |||
| # modules/types which are present in other plugins | |||
| WSTD_DRUMS_CUSTOM = ADSR Envelope LowFrequencyOscillator | |||
| # -------------------------------------------------------------- | |||
| # ZetaCarinaeModules | |||
| @@ -1446,6 +1456,7 @@ clean: | |||
| PLUGIN_LIST = $(subst /plugin.json,,$(wildcard */plugin.json)) | |||
| UNWANTED_FILES = HetrickCV/res/illustrator - deprecated/MyModule.svg | |||
| UNWANTED_FILES += $(wildcard "HetrickCV/res/affinity redo/*") | |||
| UNWANTED_FILES += $(wildcard Meander/res/*) | |||
| UNWANTED_FILES += $(wildcard Mog/res/*) | |||
| UNWANTED_FILES += $(wildcard Mog/res/*/*) | |||
| @@ -1475,7 +1486,7 @@ RESOURCE_FILES += BaconPlugs/res/midi/goldberg | |||
| RESOURCE_FILES += Befaco/res/SpringReverbIR.f32 | |||
| RESOURCE_FILES += cf/playeroscs | |||
| RESOURCE_FILES += DHE-Modules/svg | |||
| RESOURCE_FILES += DrumKit/res/samples | |||
| RESOURCE_FILES += WSTD-Drums/res/samples | |||
| RESOURCE_FILES += Meander/res | |||
| RESOURCE_FILES += MindMeldModular/res/ShapeMaster/CommunityPresets | |||
| RESOURCE_FILES += MindMeldModular/res/ShapeMaster/CommunityShapes | |||
| @@ -2198,7 +2209,7 @@ $(BUILD_DIR)/AS/%.cpp.o: AS/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(AS_CUSTOM),$(call custom_module_names,$(m),AS)) \ | |||
| $(foreach m,$(AS_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),AS_$(shell basename $*))) \ | |||
| $(foreach m,$(AS_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),AS_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__AS \ | |||
| -Wno-unused-private-field | |||
| @@ -2254,7 +2265,7 @@ $(BUILD_DIR)/Bidoo%.cpp.o: Bidoo%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(BIDOO_CUSTOM),$(call custom_module_names,$(m),Bidoo)) \ | |||
| $(foreach m,$(BIDOO_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Bidoo_$(shell basename $*))) \ | |||
| $(foreach m,$(BIDOO_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Bidoo_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__Bidoo \ | |||
| -DSKIP_MINGW_FORMAT \ | |||
| -IBidoo/src/dep/gverb/include \ | |||
| @@ -2274,7 +2285,7 @@ $(BUILD_DIR)/BogaudioModules%.cpp.o: BogaudioModules%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(BOGAUDIO_CUSTOM),$(call custom_module_names,$(m),Bogaudio)) \ | |||
| $(foreach m,$(BOGAUDIO_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Bogaudio_$(shell basename $*))) \ | |||
| $(foreach m,$(BOGAUDIO_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Bogaudio_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__BogaudioModules \ | |||
| -DRACK_SIMD=1 \ | |||
| -DSKIP_MINGW_FORMAT \ | |||
| @@ -2327,7 +2338,7 @@ $(BUILD_DIR)/dBiz/src/%.cpp.o: dBiz/src/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(DBIZ_CUSTOM),$(call custom_module_names,$(m),dBiz)) \ | |||
| $(foreach m,$(DBIZ_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),dBiz_$(shell basename $*))) \ | |||
| $(foreach m,$(DBIZ_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),dBiz_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__dBiz | |||
| $(BUILD_DIR)/DHE-Modules/src/%.cpp.o: DHE-Modules/src/%.cpp | |||
| @@ -2338,14 +2349,12 @@ $(BUILD_DIR)/DHE-Modules/src/%.cpp.o: DHE-Modules/src/%.cpp | |||
| -DpluginInstance=pluginInstance__DHE \ | |||
| -IDHE-Modules/src | |||
| $(BUILD_DIR)/DrumKit/%.cpp.o: DrumKit/%.cpp | |||
| $(BUILD_DIR)/eightfold/src/%.cpp.o: eightfold/src/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(DRUMKIT_CUSTOM),$(call custom_module_names,$(m),DrumKit)) \ | |||
| -DpluginInstance=pluginInstance__DrumKit \ | |||
| -Dinit=init__DrumKit \ | |||
| -Wno-sign-compare | |||
| $(SILENT)$(CXX) $< $(EIGHTFOLD_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(EIGHTFOLD_CUSTOM),$(call custom_module_names,$(m),eightfold)) \ | |||
| -DpluginInstance=pluginInstance__eightfold | |||
| $(BUILD_DIR)/EnigmaCurry/src/%.cpp.o: EnigmaCurry/src/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @@ -2489,7 +2498,7 @@ $(BUILD_DIR)/ImpromptuModular%.cpp.o: ImpromptuModular%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(IMPROMPTUMODULAR_CUSTOM),$(call custom_module_names,$(m),ImpromptuModular)) \ | |||
| $(foreach m,$(IMPROMPTUMODULAR_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ImpromptuModular_$(shell basename $*))) \ | |||
| $(foreach m,$(IMPROMPTUMODULAR_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ImpromptuModular_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__ImpromptuModular \ | |||
| -Wno-format-truncation | |||
| @@ -2498,7 +2507,7 @@ $(BUILD_DIR)/ihtsyn/%.cpp.o: ihtsyn/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(IHTSYN_CUSTOM),$(call custom_module_names,$(m),ihtsyn)) \ | |||
| $(foreach m,$(IHTSYN_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ihtsyn_$(shell basename $*))) \ | |||
| $(foreach m,$(IHTSYN_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ihtsyn_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__ihtsyn | |||
| $(BUILD_DIR)/JW-Modules/src/WavHead.cpp.o: JW-Modules/src/WavHead.cpp | |||
| @@ -2619,7 +2628,7 @@ $(BUILD_DIR)/mscHack/%.cpp.o: mscHack/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(MSCHACK_CUSTOM),$(call custom_module_names,$(m),mscHack)) \ | |||
| $(foreach m,$(MSCHACK_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),mscHack_$(shell basename $*))) \ | |||
| $(foreach m,$(MSCHACK_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),mscHack_$(shell basename -- $*))) \ | |||
| -DthePlugin=pluginInstance__mscHack \ | |||
| -Dinit=init__mscHack \ | |||
| -Wno-class-memaccess \ | |||
| @@ -2700,7 +2709,7 @@ $(BUILD_DIR)/Prism/%.cpp.o: Prism/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(PRISM_CUSTOM),$(call custom_module_names,$(m),Prism)) \ | |||
| $(foreach m,$(PRISM_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Prism_$(shell basename $*))) \ | |||
| $(foreach m,$(PRISM_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Prism_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__Prism \ | |||
| $(BUILD_DIR)/rackwindows/%.cpp.o: rackwindows/%.cpp | |||
| @@ -2744,6 +2753,7 @@ $(BUILD_DIR)/Sapphire/%.cpp.o: Sapphire/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -std=gnu++17 -c -o $@ \ | |||
| $(foreach m,$(SAPPHIRE_CUSTOM),$(call custom_module_names,$(m),Sapphire)) \ | |||
| -DSKIP_MINGW_FORMAT \ | |||
| -DpluginInstance=pluginInstance__sapphire | |||
| $(BUILD_DIR)/sonusmodular/%.cpp.o: sonusmodular/%.cpp | |||
| @@ -2773,7 +2783,7 @@ $(BUILD_DIR)/stoermelder-packone/%.cpp.o: stoermelder-packone/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(STOERMELDER_PACKONE_CUSTOM),$(call custom_module_names,$(m),stoermelder_p1)) \ | |||
| $(foreach m,$(STOERMELDER_PACKONE_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),stoermelder_p1_$(shell basename $*))) \ | |||
| $(foreach m,$(STOERMELDER_PACKONE_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),stoermelder_p1_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__stoermelder_p1 \ | |||
| -Dinit=init__stoermelder_p1 | |||
| @@ -2803,19 +2813,28 @@ $(BUILD_DIR)/ValleyAudio/%.cpp.o: ValleyAudio/%.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(VALLEYAUDIO_CUSTOM),$(call custom_module_names,$(m),ValleyAudio)) \ | |||
| $(foreach m,$(VALLEYAUDIO_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ValleyAudio_$(shell basename $*))) \ | |||
| $(foreach m,$(VALLEYAUDIO_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ValleyAudio_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__ValleyAudio \ | |||
| -DSTDIO_OVERRIDE=ValleyAudio \ | |||
| -IValleyAudio/src \ | |||
| -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 $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(VOXGLITCH_CUSTOM),$(call custom_module_names,$(m),Voxglitch)) \ | |||
| $(foreach m,$(VOXGLITCH_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Voxglitch_$(shell basename $*))) \ | |||
| $(foreach m,$(VOXGLITCH_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),Voxglitch_$(shell basename -- $*))) \ | |||
| -DpluginInstance=pluginInstance__Voxglitch \ | |||
| -DSKIP_MINGW_FORMAT | |||
| @@ -2826,6 +2845,15 @@ $(BUILD_DIR)/WhatTheRack/%.cpp.o: WhatTheRack/%.cpp | |||
| $(foreach m,$(WHATTHERACK_CUSTOM),$(call custom_module_names,$(m),WhatTheRack)) \ | |||
| -DpluginInstance=pluginInstance__WhatTheRack | |||
| $(BUILD_DIR)/WSTD-Drums/%.cpp.o: WSTD-Drums/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| $(foreach m,$(WSTD_DRUMS_CUSTOM),$(call custom_module_names,$(m),WSTD_Drums)) \ | |||
| -DpluginInstance=pluginInstance__WSTD_Drums \ | |||
| -Dinit=init__WSTD_Drums \ | |||
| -Wno-sign-compare | |||
| $(BUILD_DIR)/ZamAudio/%.cpp.o: ZamAudio/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| @@ -1 +1 @@ | |||
| Subproject commit 9665f4bddb59841ef74ff206fe91345c146fed52 | |||
| Subproject commit 191fbee21a6be7d9c18eacc6f3a1804455d5358d | |||
| @@ -0,0 +1 @@ | |||
| Subproject commit ba95ede2370d340e0f7143dd897ff7e089bda336 | |||
| @@ -0,0 +1 @@ | |||
| Subproject commit 05330ce99f4ec742f906c77ab5d8758a15decb4c | |||
| @@ -0,0 +1 @@ | |||
| Subproject commit a541c5cfdc3fb9ad8e4f345470f817eaf576b987 | |||
| @@ -1 +1 @@ | |||
| Subproject commit eaf7cbf3af0a8525d3c649c53eab476c3052d41b | |||
| Subproject commit ea69acab96db49c32601b609cdfe06444ecee0e8 | |||
| @@ -147,10 +147,14 @@ extern Model* modelChord; | |||
| #define modelADSR modelBefacoADSR | |||
| #define modelMixer modelBefacoMixer | |||
| #define modelBurst modelBefacoBurst | |||
| #define modelMixer2 modelBefacoMixer2 | |||
| #define modelSlew modelBefacoSlew | |||
| #include "Befaco/src/plugin.hpp" | |||
| #undef modelADSR | |||
| #undef modelMixer | |||
| #undef modelBurst | |||
| #undef modelMixer2 | |||
| #undef modelSlew | |||
| // Bidoo | |||
| #include "Bidoo/src/plugin.hpp" | |||
| @@ -339,9 +343,11 @@ extern Model* modelTestVCF; | |||
| #include "cf/src/plugin.hpp" | |||
| // CVfunk | |||
| #define modelNode modelCVfunkNode | |||
| #define modelSteps modelCVfunkSteps | |||
| #include "CVfunk/src/plugin.hpp" | |||
| #undef modelSteps | |||
| #undef modelNode | |||
| // ChowDSP | |||
| #include "ChowDSP/src/plugin.hpp" | |||
| @@ -391,9 +397,8 @@ namespace truth { void init(Plugin*); } | |||
| namespace xycloid { void init(Plugin*); } | |||
| } | |||
| // DrumKit | |||
| #include "DrumKit/src/DrumKit.hpp" | |||
| void setupSamples(); | |||
| // eightfold | |||
| #include "eightfold/src/plugin.hpp" | |||
| // EnigmaCurry | |||
| #define modelPulse modelEnigmaCurryPulse | |||
| @@ -450,6 +455,7 @@ void saveGtgPluginDefault(const char*, int) {} | |||
| extern Model* modelTwoToFour; | |||
| extern Model* modelAnalogToDigital; | |||
| extern Model* modelASR; | |||
| extern Model* modelBinaryCounter; | |||
| extern Model* modelBinaryGate; | |||
| extern Model* modelBinaryNoise; | |||
| extern Model* modelBitshift; | |||
| @@ -460,6 +466,7 @@ extern Model* modelChaos2Op; | |||
| extern Model* modelChaos3Op; | |||
| extern Model* modelChaoticAttractors; | |||
| extern Model* modelClockedNoise; | |||
| extern Model* modelClockToPhasor; | |||
| extern Model* modelComparator; | |||
| extern Model* modelContrast; | |||
| extern Model* modelCrackle; | |||
| @@ -478,6 +485,7 @@ extern Model* modelGingerbread; | |||
| extern Model* modelLogicCombine; | |||
| extern Model* modelMidSide; | |||
| extern Model* modelMinMax; | |||
| extern Model* modelNormals; | |||
| extern Model* modelPhaseDrivenSequencer; | |||
| extern Model* modelPhaseDrivenSequencer32; | |||
| extern Model* modelPhasorAnalyzer; | |||
| @@ -507,8 +515,10 @@ extern Model* modelPhasorSubstepShape; | |||
| extern Model* modelPhasorSwing; | |||
| extern Model* modelPhasorTimetable; | |||
| extern Model* modelPhasorToClock; | |||
| extern Model* modelPhasorToRandom; | |||
| extern Model* modelPhasorToLFO; | |||
| extern Model* modelPhasorToWaveforms; | |||
| extern Model* modelPolymetricPhasors; | |||
| extern Model* modelProbability; | |||
| extern Model* modelRandomGates; | |||
| extern Model* modelRotator; | |||
| @@ -566,8 +576,10 @@ extern Model* modelBlankPanel; | |||
| // JW-Modules | |||
| #define modelQuantizer modelJWQuantizer | |||
| #define modelArrange modelJWArrange | |||
| #include "JW-Modules/src/JWModules.hpp" | |||
| #undef modelQuantizer | |||
| #undef modelArrange | |||
| // kocmoc | |||
| #include "kocmoc/src/plugin.hpp" | |||
| @@ -882,6 +894,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" | |||
| @@ -890,6 +909,10 @@ void surgext_rack_update_theme(); | |||
| // WhatTheRack | |||
| #include "WhatTheRack/src/WhatTheRack.hpp" | |||
| // WSTD-Drums | |||
| #include "WSTD-Drums/src/WSTD_Drums.hpp" | |||
| void setupSamples(); | |||
| // ZetaCarinaeModules | |||
| #include "ZetaCarinaeModules/src/plugin.hpp" | |||
| @@ -947,7 +970,7 @@ Plugin* pluginInstance__Computerscare; | |||
| Plugin* pluginInstance__CVfunk; | |||
| Plugin* pluginInstance__dBiz; | |||
| Plugin* pluginInstance__DHE; | |||
| extern Plugin* pluginInstance__DrumKit; | |||
| Plugin* pluginInstance__eightfold; | |||
| Plugin* pluginInstance__EnigmaCurry; | |||
| Plugin* pluginInstance__ESeries; | |||
| Plugin* pluginInstance__ExpertSleepersEncoders; | |||
| @@ -997,8 +1020,10 @@ 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; | |||
| Plugin* pluginInstance__ZetaCarinaeModules; | |||
| Plugin* pluginInstance__ZZC; | |||
| @@ -1044,10 +1069,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); | |||
| @@ -1132,12 +1164,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 | |||
| @@ -1149,11 +1181,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 | |||
| @@ -1614,6 +1641,8 @@ static void initStatic__Befaco() | |||
| #define modelADSR modelBefacoADSR | |||
| #define modelMixer modelBefacoMixer | |||
| #define modelBurst modelBefacoBurst | |||
| #define modelMixer2 modelBefacoMixer2 | |||
| #define modelSlew modelBefacoSlew | |||
| p->addModel(modelEvenVCO); | |||
| p->addModel(modelRampage); | |||
| p->addModel(modelABC); | |||
| @@ -1640,9 +1669,16 @@ static void initStatic__Befaco() | |||
| p->addModel(modelOctaves); | |||
| p->addModel(modelBypass); | |||
| p->addModel(modelBandit); | |||
| p->addModel(modelAtte); | |||
| p->addModel(modelAxBC); | |||
| p->addModel(modelMixer2); | |||
| p->addModel(modelMuDi); | |||
| p->addModel(modelSlew); | |||
| #undef modelADSR | |||
| #undef modelMixer | |||
| #undef modelBurst | |||
| #undef modelMixer2 | |||
| #undef modelSlew | |||
| // NOTE disabled in Cardinal due to MIDI usage | |||
| spl.removeModule("MidiThingV2"); | |||
| @@ -2024,6 +2060,7 @@ static void initStatic__CVfunk() | |||
| if (spl.ok()) | |||
| { | |||
| #define modelSteps modelCVfunkSteps | |||
| #define modelNode modelCVfunkNode | |||
| p->addModel(modelSteps); | |||
| p->addModel(modelEnvelopeArray); | |||
| p->addModel(modelPentaSequencer); | |||
| @@ -2044,7 +2081,17 @@ static void initStatic__CVfunk() | |||
| p->addModel(modelStepWave); | |||
| p->addModel(modelPreeeeeeeeeeessedDuck); | |||
| p->addModel(modelArrange); | |||
| p->addModel(modelTriDelay); | |||
| p->addModel(modelTriDelay); | |||
| p->addModel(modelTatami); | |||
| p->addModel(modelCartesia); | |||
| p->addModel(modelJunkDNA); | |||
| p->addModel(modelPicus); | |||
| p->addModel(modelNode); | |||
| p->addModel(modelWeave); | |||
| p->addModel(modelWonk); | |||
| p->addModel(modelHammer); | |||
| p->addModel(modelHub); | |||
| #undef modelNode | |||
| #undef modelSteps | |||
| } | |||
| } | |||
| @@ -2127,27 +2174,19 @@ static void initStatic__DHE() | |||
| } | |||
| } | |||
| static void initStatic__DrumKit() | |||
| static void initStatic__eightfold() | |||
| { | |||
| Plugin* const p = new Plugin; | |||
| pluginInstance__DrumKit = p; | |||
| pluginInstance__eightfold = p; | |||
| const StaticPluginLoader spl(p, "DrumKit"); | |||
| const StaticPluginLoader spl(p, "eightfold"); | |||
| if (spl.ok()) | |||
| { | |||
| setupSamples(); | |||
| p->addModel(modelBD9); | |||
| p->addModel(modelSnare); | |||
| p->addModel(modelClosedHH); | |||
| p->addModel(modelOpenHH); | |||
| p->addModel(modelDMX); | |||
| p->addModel(modelCR78); | |||
| p->addModel(modelSBD); | |||
| p->addModel(modelGnome); | |||
| p->addModel(modelSequencer); | |||
| p->addModel(modelTomi); | |||
| p->addModel(modelBaronial); | |||
| p->addModel(modelMarionette); | |||
| p->addModel(modelSDOrcasHeartV2); | |||
| p->addModel(modelSDFormation); | |||
| p->addModel(modelSDLines); | |||
| p->addModel(modelSDTransgate); | |||
| p->addModel(modelSDComparator); | |||
| } | |||
| } | |||
| @@ -2383,6 +2422,7 @@ static void initStatic__HetrickCV() | |||
| p->addModel(modelTwoToFour); | |||
| p->addModel(modelAnalogToDigital); | |||
| p->addModel(modelASR); | |||
| p->addModel(modelBinaryCounter); | |||
| p->addModel(modelBinaryGate); | |||
| p->addModel(modelBinaryNoise); | |||
| p->addModel(modelBitshift); | |||
| @@ -2393,6 +2433,7 @@ static void initStatic__HetrickCV() | |||
| p->addModel(modelChaos3Op); | |||
| p->addModel(modelChaoticAttractors); | |||
| p->addModel(modelClockedNoise); | |||
| p->addModel(modelClockToPhasor); | |||
| p->addModel(modelComparator); | |||
| p->addModel(modelContrast); | |||
| p->addModel(modelCrackle); | |||
| @@ -2411,6 +2452,7 @@ static void initStatic__HetrickCV() | |||
| p->addModel(modelLogicCombine); | |||
| p->addModel(modelMidSide); | |||
| p->addModel(modelMinMax); | |||
| p->addModel(modelNormals); | |||
| p->addModel(modelPhaseDrivenSequencer); | |||
| p->addModel(modelPhaseDrivenSequencer32); | |||
| p->addModel(modelPhasorAnalyzer); | |||
| @@ -2440,8 +2482,10 @@ static void initStatic__HetrickCV() | |||
| p->addModel(modelPhasorSwing); | |||
| p->addModel(modelPhasorTimetable); | |||
| p->addModel(modelPhasorToClock); | |||
| p->addModel(modelPhasorToRandom); | |||
| p->addModel(modelPhasorToLFO); | |||
| p->addModel(modelPhasorToWaveforms); | |||
| p->addModel(modelPolymetricPhasors); | |||
| p->addModel(modelProbability); | |||
| p->addModel(modelRandomGates); | |||
| p->addModel(modelRotator); | |||
| @@ -2526,6 +2570,7 @@ static void initStatic__JW() | |||
| if (spl.ok()) | |||
| { | |||
| #define modelQuantizer modelJWQuantizer | |||
| #define modelArrange modelJWArrange | |||
| p->addModel(modelAdd5); | |||
| p->addModel(modelAbcdSeq); | |||
| p->addModel(modelBouncyBalls); | |||
| @@ -2556,12 +2601,14 @@ 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"); | |||
| #endif | |||
| p->addModel(modelArrange); | |||
| #undef modelQuantizer | |||
| #undef modelArrange | |||
| } | |||
| } | |||
| @@ -2578,6 +2625,7 @@ static void initStatic__kocmoc() | |||
| p->addModel(modelTRG); | |||
| p->addModel(modelLADR); | |||
| p->addModel(modeluLADR); | |||
| p->addModel(modelDIOD); | |||
| p->addModel(modelOP); | |||
| p->addModel(modelPHASR); | |||
| p->addModel(modelMUL); | |||
| @@ -3173,7 +3221,11 @@ static void initStatic__Sapphire() | |||
| if (spl.ok()) | |||
| { | |||
| p->addModel(modelSapphireChaops); | |||
| p->addModel(modelSapphireEcho); | |||
| p->addModel(modelSapphireEchoOut); | |||
| p->addModel(modelSapphireEchoTap); | |||
| p->addModel(modelSapphireElastika); | |||
| p->addModel(modelSapphireEnv); | |||
| p->addModel(modelSapphireFrolic); | |||
| p->addModel(modelSapphireGalaxy); | |||
| p->addModel(modelSapphireGlee); | |||
| @@ -3192,6 +3244,7 @@ static void initStatic__Sapphire() | |||
| p->addModel(modelSapphireTout); | |||
| p->addModel(modelSapphireTricorder); | |||
| p->addModel(modelSapphireTubeUnit); | |||
| p->addModel(modelSapphireZoo); | |||
| } | |||
| } | |||
| @@ -3439,6 +3492,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; | |||
| @@ -3493,6 +3622,30 @@ static void initStatic__WhatTheRack() | |||
| } | |||
| } | |||
| static void initStatic__WSTD_Drums() | |||
| { | |||
| Plugin* const p = new Plugin; | |||
| pluginInstance__WSTD_Drums = p; | |||
| const StaticPluginLoader spl(p, "WSTD-Drums"); | |||
| if (spl.ok()) | |||
| { | |||
| setupSamples(); | |||
| p->addModel(modelBD9); | |||
| p->addModel(modelSnare); | |||
| p->addModel(modelClosedHH); | |||
| p->addModel(modelOpenHH); | |||
| p->addModel(modelDMX); | |||
| p->addModel(modelCR78); | |||
| p->addModel(modelSBD); | |||
| p->addModel(modelGnome); | |||
| p->addModel(modelSequencer); | |||
| p->addModel(modelTomi); | |||
| p->addModel(modelBaronial); | |||
| p->addModel(modelMarionette); | |||
| } | |||
| } | |||
| static void initStatic__ZetaCarinaeModules() | |||
| { | |||
| Plugin* p = new Plugin; | |||
| @@ -3565,7 +3718,7 @@ void initStaticPlugins() | |||
| initStatic__CVfunk(); | |||
| initStatic__dBiz(); | |||
| initStatic__DHE(); | |||
| initStatic__DrumKit(); | |||
| initStatic__eightfold(); | |||
| initStatic__EnigmaCurry(); | |||
| initStatic__ESeries(); | |||
| initStatic__ExpertSleepersEncoders(); | |||
| @@ -3615,8 +3768,10 @@ void initStaticPlugins() | |||
| initStatic__surgext(); | |||
| initStatic__unless_modules(); | |||
| initStatic__ValleyAudio(); | |||
| initStatic__Venom(); | |||
| initStatic__Voxglitch(); | |||
| initStatic__WhatTheRack(); | |||
| initStatic__WSTD_Drums(); | |||
| initStatic__ZetaCarinaeModules(); | |||
| initStatic__ZZC(); | |||
| @@ -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> | |||
| * SPDX-License-Identifier: GPL-3.0-or-later | |||
| */ | |||
| @@ -99,7 +99,7 @@ void destroyStaticPlugins(); | |||
| } | |||
| } | |||
| const std::string CARDINAL_VERSION = "24.12"; | |||
| const std::string CARDINAL_VERSION = "26.01"; | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| @@ -626,47 +626,7 @@ Initializer::Initializer(const CardinalBasePlugin* const plugin, const CardinalB | |||
| if (asset::userDir.empty()) | |||
| { | |||
| #if defined(DISTRHO_OS_WASM) | |||
| asset::userDir = "/userfiles"; | |||
| #elif defined(ARCH_MAC) | |||
| asset::userDir = system::join(homeDir(), "Documents", "Cardinal"); | |||
| #elif defined(ARCH_WIN) | |||
| asset::userDir = system::join(getSpecialPath(kSpecialPathMyDocuments), "Cardinal"); | |||
| #else | |||
| std::string xdgConfigDir; | |||
| if (const char* const xdgEnv = getenv("XDG_CONFIG_HOME")) | |||
| xdgConfigDir = xdgEnv; | |||
| if (xdgConfigDir.empty()) | |||
| xdgConfigDir = system::join(homeDir(), ".config"); | |||
| const std::string xdgDirsConfigPath(system::join(xdgConfigDir, "user-dirs.dirs")); | |||
| if (system::exists(xdgDirsConfigPath)) | |||
| { | |||
| std::ifstream xdgDirsConfigFile(xdgDirsConfigPath, std::ios::in|std::ios::ate); | |||
| std::string xdgDirsConfig(xdgDirsConfigFile.tellg(), 0); | |||
| xdgDirsConfigFile.seekg(0); | |||
| xdgDirsConfigFile.read(&xdgDirsConfig[0], xdgDirsConfig.size()); | |||
| if (const char* const xdgDocsDir = std::strstr(xdgDirsConfig.c_str(), "XDG_DOCUMENTS_DIR=\"")) | |||
| { | |||
| if (const char* const xdgDocsDirNL = std::strstr(xdgDocsDir, "\"\n")) | |||
| { | |||
| asset::userDir = std::string(xdgDocsDir + 19, xdgDocsDirNL - xdgDocsDir - 19); | |||
| if (string::startsWith(asset::userDir, "$HOME")) | |||
| asset::userDir.replace(asset::userDir.begin(), asset::userDir.begin() + 5, homeDir()); | |||
| if (! system::exists(asset::userDir)) | |||
| asset::userDir.clear(); | |||
| } | |||
| } | |||
| } | |||
| if (asset::userDir.empty()) | |||
| asset::userDir = system::join(homeDir(), "Documents", "Cardinal"); | |||
| #endif | |||
| asset::userDir = system::join(getSpecialDir(kSpecialDirDocuments), "Cardinal"); | |||
| if (isRealInstance) | |||
| { | |||
| @@ -683,17 +643,10 @@ Initializer::Initializer(const CardinalBasePlugin* const plugin, const CardinalB | |||
| #ifndef CARDINAL_COMMON_DSP_ONLY | |||
| if (asset::configDir.empty()) | |||
| { | |||
| #if defined(ARCH_MAC) || defined(ARCH_WIN) || defined(DISTRHO_OS_WASM) | |||
| asset::configDir = asset::userDir; | |||
| #else | |||
| if (const char* const xdgEnv = getenv("XDG_CONFIG_HOME")) | |||
| asset::configDir = system::join(xdgEnv, "Cardinal"); | |||
| else | |||
| asset::configDir = system::join(homeDir(), ".config", "Cardinal"); | |||
| asset::configDir = system::join(getSpecialDir(kSpecialDirConfig), "Cardinal"); | |||
| if (isRealInstance) | |||
| system::createDirectory(asset::configDir); | |||
| #endif | |||
| } | |||
| #endif | |||
| @@ -875,7 +828,8 @@ void Initializer::stopRemoteServer() | |||
| lo_server_thread_stop(oscServerThread); | |||
| lo_server_thread_del_method(oscServerThread, nullptr, nullptr); | |||
| lo_server_thread_free(oscServerThread); | |||
| oscServerThread = oscServer = nullptr; | |||
| oscServerThread = nullptr; | |||
| oscServer = nullptr; | |||
| } | |||
| #else | |||
| if (oscServer != nullptr) | |||
| @@ -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> | |||
| * SPDX-License-Identifier: GPL-3.0-or-later | |||
| */ | |||
| @@ -414,7 +414,7 @@ protected: | |||
| uint32_t getVersion() const override | |||
| { | |||
| return d_version(0, 24, 12); | |||
| return d_version(0, 26, 1); | |||
| } | |||
| int64_t getUniqueId() const override | |||
| @@ -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 | |||
| @@ -229,7 +229,6 @@ SYMLINKED_DIRS_RESOURCES += BaconPlugs/res/midi/chopin | |||
| SYMLINKED_DIRS_RESOURCES += BaconPlugs/res/midi/debussy | |||
| SYMLINKED_DIRS_RESOURCES += BaconPlugs/res/midi/goldberg | |||
| SYMLINKED_DIRS_RESOURCES += cf/playeroscs | |||
| SYMLINKED_DIRS_RESOURCES += DrumKit/res/samples | |||
| SYMLINKED_DIRS_RESOURCES += Fundamental/presets | |||
| SYMLINKED_DIRS_RESOURCES += GrandeModular/presets | |||
| SYMLINKED_DIRS_RESOURCES += LyraeModules/presets | |||
| @@ -247,6 +246,7 @@ SYMLINKED_DIRS_RESOURCES += surgext/build/surge-data/fx_presets | |||
| SYMLINKED_DIRS_RESOURCES += surgext/build/surge-data/wavetables | |||
| SYMLINKED_DIRS_RESOURCES += surgext/patches | |||
| SYMLINKED_DIRS_RESOURCES += surgext/presets | |||
| SYMLINKED_DIRS_RESOURCES += WSTD-Drums/res/samples | |||
| LINK_FLAGS += $(foreach d,$(SYMLINKED_DIRS_RESOURCES),--preload-file=../../bin/CardinalNative.lv2/resources/$(d)@/resources/$(d)) | |||
| endif | |||
| LINK_FLAGS += -sALLOW_MEMORY_GROWTH | |||
| @@ -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. | |||
| @@ -147,6 +147,9 @@ au: $(TARGETS) | |||
| $(MAKE) au -C CardinalFX $(CARDINAL_SYNTH_ARGS) | |||
| $(MAKE) au -C CardinalSynth $(CARDINAL_SYNTH_ARGS) | |||
| mapi: $(TARGETS) | |||
| $(MAKE) mapi -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| lv2: $(TARGETS) | |||
| $(MAKE) lv2 -C Cardinal | |||
| $(MAKE) lv2 -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| @@ -264,6 +264,7 @@ endif | |||
| ifeq ($(WASM),true) | |||
| APP_EXT = .js | |||
| UI_TYPE = gles2 | |||
| endif | |||
| USE_VST2_BUNDLE = true | |||
| @@ -317,7 +318,6 @@ SYMLINKED_DIRS_RESOURCES += BaconPlugs/res/midi/debussy | |||
| SYMLINKED_DIRS_RESOURCES += BaconPlugs/res/midi/goldberg | |||
| SYMLINKED_DIRS_RESOURCES += cf/playeroscs | |||
| SYMLINKED_DIRS_RESOURCES += DHE-Modules/svg | |||
| SYMLINKED_DIRS_RESOURCES += DrumKit/res/samples | |||
| SYMLINKED_DIRS_RESOURCES += GrandeModular/presets | |||
| SYMLINKED_DIRS_RESOURCES += LyraeModules/presets | |||
| SYMLINKED_DIRS_RESOURCES += Meander/res | |||
| @@ -332,6 +332,7 @@ SYMLINKED_DIRS_RESOURCES += Orbits/presets | |||
| SYMLINKED_DIRS_RESOURCES += stoermelder-packone/presets | |||
| 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 | |||
| LINK_FLAGS += $(foreach d,$(SYMLINKED_DIRS_RESOURCES),--preload-file=../../bin/CardinalNative.lv2/resources/$(d)@/resources/$(d)) | |||
| @@ -408,6 +409,11 @@ endif | |||
| BUILD_CXX_FLAGS += -DCARDINAL_PLUGIN_PREFIX='"$(PREFIX)"' | |||
| # -------------------------------------------------------------- | |||
| # we know what we are doing, promise! | |||
| BUILD_CXX_FLAGS += -DDISTRHO_NO_WARNINGS | |||
| # -------------------------------------------------------------- | |||
| # Enable all possible plugin types and setup resources | |||
| @@ -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; } | |||
| @@ -54,7 +54,6 @@ enum DarkMode { | |||
| kModeCf, | |||
| kModeComputerscare, | |||
| kModeDHE, | |||
| kModeDrumKit, | |||
| kModeESeries, | |||
| kModeLilacLoop, | |||
| kModeLittleUtils, | |||
| @@ -258,19 +257,6 @@ static const struct { | |||
| { kModeDHE, "/DHE-Modules/svg/truth-4.svg", {}, -1 }, | |||
| { kModeDHE, "/DHE-Modules/svg/upstage.svg", {}, -1 }, | |||
| { kModeDHE, "/DHE-Modules/svg/xycloid.svg", {}, -1 }, | |||
| // CC0-1.0 | |||
| { kModeDrumKit, "/DrumKit/res/Baronial.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/BD9.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/ClosedHH.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/CR78.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/DMX.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/Gnome.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/Marionette.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/OpenHH.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/SBD.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/Sequencer.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/Snare.svg", {}, -1 }, | |||
| { kModeDrumKit, "/DrumKit/res/Tomi.svg", {}, -1 }, | |||
| // Custom, runtime dark mode used with permission | |||
| { kModeESeries,"/ESeries/res/E340.svg", {}, -1 }, | |||
| // GPL3.0-or-later | |||
| @@ -284,6 +270,7 @@ static const struct { | |||
| { kModeLittleUtils, "/LittleUtils/res/TeleportOut.svg", {}, -1 }, | |||
| // GPL-3.0-or-later | |||
| { kModeKocmoc, "/kocmoc/res/DDLY.svg", {}, -1 }, | |||
| { kModeKocmoc, "/kocmoc/res/DIOD.svg", {}, -1 }, | |||
| { kModeKocmoc, "/kocmoc/res/LADR.svg", {}, -1 }, | |||
| { kModeKocmoc, "/kocmoc/res/uLADR.svg", {}, -1 }, | |||
| { kModeKocmoc, "/kocmoc/res/MUL.svg", {}, -1 }, | |||
| @@ -373,6 +360,7 @@ enum LightMode { | |||
| kModePrism, | |||
| kModeRepelzen, | |||
| kModeSonusmodular, | |||
| kModeWSTDDrums, | |||
| }; | |||
| static const struct { | |||
| @@ -435,6 +423,11 @@ static const struct { | |||
| { kModeBefaco, "/Befaco/res/panels/Octaves.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/Bypass.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/Bandit.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/Atte.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/AxBC.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/Mixer2.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/MuDi.svg" }, | |||
| { kModeBefaco, "/Befaco/res/panels/Slew.svg" }, | |||
| // GPLv3+ | |||
| { kModeCardinal, "/Cardinal/res/AudioFile.svg" }, | |||
| { kModeCardinal, "/Cardinal/res/AudioToCVPitch.svg" }, | |||
| @@ -588,6 +581,20 @@ static const struct { | |||
| { kModeSonusmodular, "/sonusmodular/res/tropicana.svg" }, | |||
| { kModeSonusmodular, "/sonusmodular/res/twoff.svg" }, | |||
| { kModeSonusmodular, "/sonusmodular/res/yabp.svg" }, | |||
| // CC0-1.0 | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/Baronial.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/BD9.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/ClosedHH.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/CR78.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/DMX.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/Gnome.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/Marionette.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/OpenHH.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/SBD.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/Sequencer.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/Snare.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/Tomi.svg" }, | |||
| { kModeWSTDDrums, "/WSTD-Drums/res/component/Knob.svg" }, | |||
| }; | |||
| static inline | |||
| @@ -624,12 +631,6 @@ bool invertPaintForDarkMode(const DarkMode mode, NSVGshape* const shape, NSVGpai | |||
| { | |||
| switch (mode) | |||
| { | |||
| // Special case for DrumKit background gradient | |||
| case kModeDrumKit: | |||
| std::free(paint.gradient); | |||
| paint.type = NSVG_PAINT_COLOR; | |||
| paint.color = 0xff191919; | |||
| return true; | |||
| // Special case for PathSet shifty gradient | |||
| case kModePathSet: | |||
| paint.gradient->stops[0].color = 0xff7c4919; // 50% darker than main blue | |||
| @@ -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; | |||
| } | |||
| @@ -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> | |||
| * SPDX-License-Identifier: GPL-3.0-or-later | |||
| */ | |||
| @@ -207,20 +207,23 @@ void Scene::step() { | |||
| (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", | |||
| "move modules", | |||
| "move switch", | |||
| }; | |||
| if (std::find(ignoredNames.cbegin(), ignoredNames.cend(), name) == ignoredNames.cend()) { | |||
| printf("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str()); | |||
| if (remoteDetails->first) { | |||
| remoteDetails->first = false; | |||
| remoteUtils::sendFullPatchToRemote(remoteDetails); | |||
| if (remoteDetails->screenshot) { | |||
| window::generateScreenshot(); | |||
| } else { | |||
| const std::string& name(APP->history->actions[actionIndex - 1]->name); | |||
| static const std::vector<std::string> ignoredNames = { | |||
| "move knob", | |||
| "move modules", | |||
| "move switch", | |||
| }; | |||
| if (std::find(ignoredNames.cbegin(), ignoredNames.cend(), name) == ignoredNames.cend()) { | |||
| d_debug("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str()); | |||
| remoteUtils::sendFullPatchToRemote(remoteDetails); | |||
| if (remoteDetails->screenshot) { | |||
| window::generateScreenshot(); | |||
| } | |||
| } | |||
| } | |||
| internal->historyActionIndex = actionIndex; | |||
| @@ -48,6 +48,7 @@ static const std::map<std::string, std::string> pluginSlugFallbacks = { | |||
| {"AudibleInstrumentsPreview", "AudibleInstruments"}, | |||
| {"SequelSequencers", "DanielDavies"}, | |||
| {"DelexanderVol1", "DelexandraVol1"}, | |||
| {"DrumKit", "WSTD-Drums"} | |||
| // {"", ""}, | |||
| }; | |||
| @@ -102,6 +103,18 @@ static const std::map<PluginModuleSlug, PluginModuleSlug> moduleSlugFallbacks = | |||
| {{"Core", "Notes"}, {"Cardinal", "TextEditor"}}, | |||
| {{"Core", "Blank"}, {"Cardinal", "Blank"}}, | |||
| {{"MindMeld-ShapeMasterPro", "ShapeMasterPro"}, {"MindMeldModular", "ShapeMaster"}}, | |||
| {{"DrumKit", "BassDrum9"}, {"WSTD-Drums", "BassDrum9"}}, | |||
| {{"DrumKit", "ClosedHiHat"}, {"WSTD-Drums", "ClosedHiHat"}}, | |||
| {{"DrumKit", "CR78"}, {"WSTD-Drums", "CR78"}}, | |||
| {{"DrumKit", "DMX"}, {"WSTD-Drums", "DMX"}}, | |||
| {{"DrumKit", "OpenHiHat"}, {"WSTD-Drums", "OpenHiHat"}}, | |||
| {{"DrumKit", "SyntheticBassDrum"}, {"WSTD-Drums", "SyntheticBassDrum"}}, | |||
| {{"DrumKit", "SnareDrumN"}, {"WSTD-Drums", "SnareDrumN"}}, | |||
| {{"DrumKit", "Tomi"}, {"WSTD-Drums", "Tomi"}}, | |||
| {{"DrumKit", "Gnome"}, {"WSTD-Drums", "Gnome"}}, | |||
| {{"DrumKit", "Sequencer"}, {"WSTD-Drums", "Sequencer"}}, | |||
| {{"DrumKit", "Baronial"}, {"WSTD-Drums", "Baronial"}}, | |||
| {{"DrumKit", "MarionetteBass"}, {"WSTD-Drums", "MarionetteBass"}}, | |||
| // {{"", ""}, {"", ""}}, | |||
| }; | |||
| @@ -11,11 +11,11 @@ | |||
| <key>CFBundleIdentifier</key> | |||
| <string>studio.kx.distrho.cardinal.jack</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>24.12</string> | |||
| <string>26.01</string> | |||
| <key>LSMinimumSystemVersion</key> | |||
| <string>10.15</string> | |||
| <key>NSHumanReadableCopyright</key> | |||
| <string>(C) 2011-2024 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>24.12</string> | |||
| <string>26.01</string> | |||
| <key>LSMinimumSystemVersion</key> | |||
| <string>10.15</string> | |||
| <key>NSHumanReadableCopyright</key> | |||
| <string>(C) 2011-2024 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/> | |||