| @@ -202,6 +202,13 @@ jobs: | |||||
| - name: Build macOS (packaging) | - name: Build macOS (packaging) | ||||
| if: steps.cache.outputs.cache-hit == 'true' | if: steps.cache.outputs.cache-hit == 'true' | ||||
| shell: bash | 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: | | run: | | ||||
| source deps/PawPaw/local.env macos-universal-10.15 | source deps/PawPaw/local.env macos-universal-10.15 | ||||
| ./utils/create-macos-installer.sh | ./utils/create-macos-installer.sh | ||||
| @@ -194,7 +194,7 @@ The meaning of the outputs is: | |||||
| - Step: Trigger for step change | - Step: Trigger for step change | ||||
| - Bar Phase: 0-10v smooth ramp for the bar position (with bar division being a right-click option) | - 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 | - Beat Phase: 0-10v smooth ramp for the beat position | ||||
| - BPM: Volts per Beat per Second, as supported by Impromptu Clocked/Clkd and ZZC Clock | |||||
| - 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 | ## Extra modules | ||||
| @@ -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. | 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. | 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 | | | 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 | | | | 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 | | | 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 | | | 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 | | | | Host sync/timing | Using MIDI signals | Using dedicated module | | | ||||
| | Linux/X11 event handling | Runs on 2nd thread | Runs on main/GUI thread | | | | 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 | | | v1 module compatibility | No | No, but with less restrictions | Module widgets can load resources at any point | | ||||
| @@ -99,7 +99,7 @@ Below follows a list of all code licenses used in Cardinal and linked submodules | |||||
| ## ARTWORK / PANEL LICENSES | ## 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. | 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 * is used, it is meant as wildcard of all files, with potential exceptions mentioned afterwards. | ||||
| When a license is uncertain, ??? is used. | When a license is uncertain, ??? is used. | ||||
| @@ -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. | 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. | 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 | ## lv2export | ||||
| @@ -1 +1 @@ | |||||
| Subproject commit d38701abff789f44f2f483a6360416a9adbcc8f9 | |||||
| Subproject commit 5b32b1cac430e3038319e46c9e10f459e95ca598 | |||||
| @@ -201,7 +201,7 @@ struct CarlaInternalPluginModule : Module, Runner { | |||||
| { | { | ||||
| switch (opcode) | switch (opcode) | ||||
| { | { | ||||
| // cannnot be supported | |||||
| // cannot be supported | |||||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | case NATIVE_HOST_OPCODE_HOST_IDLE: | ||||
| break; | break; | ||||
| // other stuff | // other stuff | ||||
| @@ -27,7 +27,7 @@ | |||||
| #include "water/xml/XmlDocument.h" | #include "water/xml/XmlDocument.h" | ||||
| #ifndef CARDINAL_SYSDEPS | #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" { | extern "C" { | ||||
| json_t *jsonp_stringn_nocheck_own(const char* value, size_t len); | json_t *jsonp_stringn_nocheck_own(const char* value, size_t len); | ||||
| } | } | ||||
| @@ -244,7 +244,7 @@ struct CarlaModule : Module { | |||||
| { | { | ||||
| switch (opcode) | switch (opcode) | ||||
| { | { | ||||
| // cannnot be supported | |||||
| // cannot be supported | |||||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | case NATIVE_HOST_OPCODE_HOST_IDLE: | ||||
| break; | break; | ||||
| // other stuff | // other stuff | ||||
| @@ -52,7 +52,7 @@ | |||||
| #include <string> | #include <string> | ||||
| #ifndef CARDINAL_SYSDEPS | #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" { | extern "C" { | ||||
| json_t *jsonp_stringn_nocheck_own(const char* value, size_t len); | json_t *jsonp_stringn_nocheck_own(const char* value, size_t len); | ||||
| } | } | ||||
| @@ -575,7 +575,7 @@ struct IldaeilModule : Module { | |||||
| { | { | ||||
| switch (opcode) | switch (opcode) | ||||
| { | { | ||||
| // cannnot be supported? | |||||
| // cannot be supported? | |||||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | case NATIVE_HOST_OPCODE_HOST_IDLE: | ||||
| break; | break; | ||||
| // other stuff | // other stuff | ||||
| @@ -85,7 +85,7 @@ struct TextEditorModule : Module { | |||||
| { | { | ||||
| file.clear(); | file.clear(); | ||||
| // Rack Core Notes compatiblity | |||||
| // Rack Core Notes compatibility | |||||
| if (json_t* const textJ = json_object_get(rootJ, "text")) | if (json_t* const textJ = json_object_get(rootJ, "text")) | ||||
| { | { | ||||
| text = json_string_value(textJ); | text = json_string_value(textJ); | ||||
| @@ -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; | 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; | extern const unsigned long* gCardinalX11Icon; | ||||
| // definition afterwards | // definition afterwards | ||||
| @@ -33,6 +33,7 @@ BUILD_CXX_FLAGS += -DnsvgParseFromFile=nsvgParseFromFileCardinal | |||||
| RACK_FILES += AsyncDialog.cpp | RACK_FILES += AsyncDialog.cpp | ||||
| RACK_FILES += CardinalModuleWidget.cpp | RACK_FILES += CardinalModuleWidget.cpp | ||||
| RACK_FILES += custom/Browser.cpp | |||||
| RACK_FILES += custom/asset.cpp | RACK_FILES += custom/asset.cpp | ||||
| RACK_FILES += custom/dep.cpp | RACK_FILES += custom/dep.cpp | ||||
| RACK_FILES += custom/library.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/rtaudio.cpp | ||||
| IGNORED_FILES += Rack/src/rtmidi.cpp | IGNORED_FILES += Rack/src/rtmidi.cpp | ||||
| IGNORED_FILES += Rack/src/app/AudioDisplay.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/MenuBar.cpp | ||||
| IGNORED_FILES += Rack/src/app/MidiDisplay.cpp | IGNORED_FILES += Rack/src/app/MidiDisplay.cpp | ||||
| IGNORED_FILES += Rack/src/app/ModuleWidget.cpp | IGNORED_FILES += Rack/src/app/ModuleWidget.cpp | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Cardinal Plugin | * 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 | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU General Public License as | * 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. | * 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 | #define SCHEME_YELLOW SCHEME_YELLOW_OldVCV | ||||
| #include_next "componentlibrary.hpp" | |||||
| #include "componentlibrary.hpp" | |||||
| #undef SCHEME_YELLOW | #undef SCHEME_YELLOW | ||||
| namespace rack { | namespace rack { | ||||
| namespace componentlibrary { | namespace componentlibrary { | ||||
| // Yellow? What's that? | |||||
| static const NVGcolor SCHEME_YELLOW = nvgRGBf(0.76f, 0.11f, 0.22f); | static const NVGcolor SCHEME_YELLOW = nvgRGBf(0.76f, 0.11f, 0.22f); | ||||
| } | } | ||||
| } | } | ||||
| #include "../src/app/Browser.cpp" | |||||
| @@ -26,10 +26,34 @@ rm -rf vst2/*.vst/Contents/Resources | |||||
| rm -rf vst3/*.vst3/Contents/Resources | rm -rf vst3/*.vst3/Contents/Resources | ||||
| rm -rf clap/*.clap/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 \ | pkgbuild \ | ||||
| --identifier "studio.kx.distrho.cardinal.resources" \ | --identifier "studio.kx.distrho.cardinal.resources" \ | ||||
| --install-location "/Library/Application Support/Cardinal/" \ | --install-location "/Library/Application Support/Cardinal/" \ | ||||
| --root "${PWD}/res/" \ | --root "${PWD}/res/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-resources.pkg | ../dpf-cardinal-resources.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| @@ -37,6 +61,7 @@ pkgbuild \ | |||||
| --component-plist "../utils/macOS/Build_JACK.plist" \ | --component-plist "../utils/macOS/Build_JACK.plist" \ | ||||
| --install-location "/Applications/" \ | --install-location "/Applications/" \ | ||||
| --root "${PWD}/jack/" \ | --root "${PWD}/jack/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-jack.pkg | ../dpf-cardinal-jack.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| @@ -44,36 +69,42 @@ pkgbuild \ | |||||
| --component-plist "../utils/macOS/Build_Native.plist" \ | --component-plist "../utils/macOS/Build_Native.plist" \ | ||||
| --install-location "/Applications/" \ | --install-location "/Applications/" \ | ||||
| --root "${PWD}/native/" \ | --root "${PWD}/native/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-native.pkg | ../dpf-cardinal-native.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| --identifier "studio.kx.distrho.plugins.cardinal.components" \ | --identifier "studio.kx.distrho.plugins.cardinal.components" \ | ||||
| --install-location "/Library/Audio/Plug-Ins/Components/" \ | --install-location "/Library/Audio/Plug-Ins/Components/" \ | ||||
| --root "${PWD}/au/" \ | --root "${PWD}/au/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-components.pkg | ../dpf-cardinal-components.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| --identifier "studio.kx.distrho.plugins.cardinal.lv2bundles" \ | --identifier "studio.kx.distrho.plugins.cardinal.lv2bundles" \ | ||||
| --install-location "/Library/Audio/Plug-Ins/LV2/" \ | --install-location "/Library/Audio/Plug-Ins/LV2/" \ | ||||
| --root "${PWD}/lv2/" \ | --root "${PWD}/lv2/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-lv2bundles.pkg | ../dpf-cardinal-lv2bundles.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| --identifier "studio.kx.distrho.plugins.cardinal.vst2bundles" \ | --identifier "studio.kx.distrho.plugins.cardinal.vst2bundles" \ | ||||
| --install-location "/Library/Audio/Plug-Ins/VST/" \ | --install-location "/Library/Audio/Plug-Ins/VST/" \ | ||||
| --root "${PWD}/vst2/" \ | --root "${PWD}/vst2/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-vst2bundles.pkg | ../dpf-cardinal-vst2bundles.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| --identifier "studio.kx.distrho.plugins.cardinal.vst3bundles" \ | --identifier "studio.kx.distrho.plugins.cardinal.vst3bundles" \ | ||||
| --install-location "/Library/Audio/Plug-Ins/VST3/" \ | --install-location "/Library/Audio/Plug-Ins/VST3/" \ | ||||
| --root "${PWD}/vst3/" \ | --root "${PWD}/vst3/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-vst3bundles.pkg | ../dpf-cardinal-vst3bundles.pkg | ||||
| pkgbuild \ | pkgbuild \ | ||||
| --identifier "studio.kx.distrho.plugins.cardinal.clapbundles" \ | --identifier "studio.kx.distrho.plugins.cardinal.clapbundles" \ | ||||
| --install-location "/Library/Audio/Plug-Ins/CLAP/" \ | --install-location "/Library/Audio/Plug-Ins/CLAP/" \ | ||||
| --root "${PWD}/clap/" \ | --root "${PWD}/clap/" \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| ../dpf-cardinal-clapbundles.pkg | ../dpf-cardinal-clapbundles.pkg | ||||
| cd .. | cd .. | ||||
| @@ -86,4 +117,14 @@ productbuild \ | |||||
| --identifier "studio.kx.distrho.cardinal" \ | --identifier "studio.kx.distrho.cardinal" \ | ||||
| --package-path "${PWD}" \ | --package-path "${PWD}" \ | ||||
| --version 0 \ | --version 0 \ | ||||
| "${PKG_SIGN_ARGS[@]}" \ | |||||
| Cardinal-macOS.pkg | 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 | |||||