Browse Source

Merge branch 'main' into add-loginstruments

pull/656/head
ksmk GitHub 2 weeks ago
parent
commit
3fb8a87820
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
41 changed files with 10241 additions and 94 deletions
  1. +1
    -1
      .github/ISSUE_TEMPLATE/bug.yaml
  2. +10
    -3
      .github/workflows/build.yml
  3. +3
    -1
      .gitmodules
  4. +1
    -1
      Makefile
  5. +3
    -2
      README.md
  6. +1
    -1
      carla
  7. +1
    -1
      deps/PawPaw
  8. +11
    -0
      docs/CARDINAL-MODULES.md
  9. +2
    -2
      docs/DIFFERENCES.md
  10. +3
    -1
      docs/LICENSES.md
  11. BIN
      docs/Module_HostTime.png
  12. +11
    -0
      docs/OSC-REMOTE-CONTROL.md
  13. +1
    -1
      docs/OVERVIEW.md
  14. +1
    -1
      dpf
  15. +2114
    -0
      patches/examples/SpotlightKid_-_Cringe-Synth.vcv
  16. +2175
    -0
      patches/examples/nooneknowspeter_-_Catalyst.vcv
  17. +2055
    -0
      patches/examples/nooneknowspeter_-_Velour.vcv
  18. +3631
    -0
      patches/examples/nooneknowspeter_-_Xmas.vcv
  19. +1
    -9
      plugins/Cardinal/plugin.json
  20. +1
    -1
      plugins/Cardinal/src/AudioFile.cpp
  21. +2
    -2
      plugins/Cardinal/src/Carla.cpp
  22. +6
    -2
      plugins/Cardinal/src/HostTime.cpp
  23. +2
    -2
      plugins/Cardinal/src/Ildaeil.cpp
  24. +1
    -1
      plugins/Cardinal/src/TextEditor.cpp
  25. +17
    -9
      plugins/Makefile
  26. +1
    -1
      plugins/Sapphire
  27. +1
    -0
      plugins/Venom
  28. +99
    -12
      plugins/plugins.cpp
  29. +5
    -3
      src/CardinalCommon.cpp
  30. +3
    -3
      src/CardinalPlugin.cpp
  31. +3
    -3
      src/CardinalPluginContext.hpp
  32. +2
    -16
      src/CardinalUI.cpp
  33. +1
    -1
      src/CardinalX11WindowIcon.cpp
  34. +2
    -0
      src/Makefile
  35. +7
    -0
      src/Makefile.cardinal.mk
  36. +5
    -8
      src/custom/Browser.cpp
  37. +2
    -1
      src/custom/RemoteNanoVG.cpp
  38. +11
    -1
      src/custom/glfw.cpp
  39. +41
    -0
      utils/create-macos-installer.sh
  40. +2
    -2
      utils/macOS/Info_JACK.plist
  41. +2
    -2
      utils/macOS/Info_Native.plist

+ 1
- 1
.github/ISSUE_TEMPLATE/bug.yaml View File

@@ -5,7 +5,7 @@ body:
id: version
attributes:
label: Version
value: "25.06"
value: "26.01"
validations:
required: true
- type: dropdown


+ 10
- 3
.github/workflows/build.yml View File

@@ -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


+ 3
- 1
.gitmodules View File

@@ -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

+ 1
- 1
Makefile View File

@@ -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


+ 3
- 2
README.md View File

@@ -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

![screenshot](docs/Screenshot_Basic-Patching.png "Screenshot")

### Carla and Ildaeil plugin hosts
### [Carla](https://github.com/falkTX/Carla/) and [Ildaeil](https://github.com/DISTRHO/Ildaeil) plugin hosts

![screenshot](docs/Screenshot_Carla+Ildaeil.png "Screenshot")

@@ -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
carla

@@ -1 +1 @@
Subproject commit 12bc40fd6c9c5b36481c7df55086b27ba9ae8a80
Subproject commit 011867b6bcd592a510b4ec157c032fcdac23d6ef

+ 1
- 1
deps/PawPaw

@@ -1 +1 @@
Subproject commit f6eaed13bdeccec013d81ba2261f98aa8f452702
Subproject commit dd0fd459be75110d76b633e606a1a1dbc607b2ab

+ 11
- 0
docs/CARDINAL-MODULES.md View File

@@ -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


+ 2
- 2
docs/DIFFERENCES.md View File

@@ -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 |


+ 3
- 1
docs/LICENSES.md View File

@@ -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 | |


BIN
docs/Module_HostTime.png View File

Before After
Width: 320  |  Height: 760  |  Size: 77KB Width: 320  |  Height: 760  |  Size: 74KB

+ 11
- 0
docs/OSC-REMOTE-CONTROL.md View File

@@ -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
docs/OVERVIEW.md View File

@@ -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
dpf

@@ -1 +1 @@
Subproject commit ab25198ea9f361145e3f8e694d90bd2a93ee830c
Subproject commit 5b32b1cac430e3038319e46c9e10f459e95ca598

+ 2114
- 0
patches/examples/SpotlightKid_-_Cringe-Synth.vcv
File diff suppressed because it is too large
View File


+ 2175
- 0
patches/examples/nooneknowspeter_-_Catalyst.vcv
File diff suppressed because it is too large
View File


+ 2055
- 0
patches/examples/nooneknowspeter_-_Velour.vcv
File diff suppressed because it is too large
View File


+ 3631
- 0
patches/examples/nooneknowspeter_-_Xmas.vcv
File diff suppressed because it is too large
View File


+ 1
- 9
plugins/Cardinal/plugin.json View File

@@ -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
- 1
plugins/Cardinal/src/AudioFile.cpp View File

@@ -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


+ 2
- 2
plugins/Cardinal/src/Carla.cpp View File

@@ -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


+ 6
- 2
plugins/Cardinal/src/HostTime.cpp View File

@@ -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


+ 2
- 2
plugins/Cardinal/src/Ildaeil.cpp View File

@@ -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


+ 1
- 1
plugins/Cardinal/src/TextEditor.cpp View File

@@ -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);


+ 17
- 9
plugins/Makefile View File

@@ -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
plugins/Sapphire

@@ -1 +1 @@
Subproject commit ef10da4e2578162b2db2f6534857d6504491daf4
Subproject commit 191fbee21a6be7d9c18eacc6f3a1804455d5358d

+ 1
- 0
plugins/Venom

@@ -0,0 +1 @@
Subproject commit bb30fd61100856214c1def3431f4ce2df70102c2

+ 99
- 12
plugins/plugins.cpp View File

@@ -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();


+ 5
- 3
src/CardinalCommon.cpp View File

@@ -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
}
}


+ 3
- 3
src/CardinalPlugin.cpp View File

@@ -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)
{


+ 3
- 3
src/CardinalPluginContext.hpp View File

@@ -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


+ 2
- 16
src/CardinalUI.cpp View File

@@ -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.


+ 1
- 1
src/CardinalX11WindowIcon.cpp View File

@@ -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


+ 2
- 0
src/Makefile View File

@@ -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


+ 7
- 0
src/Makefile.cardinal.mk View File

@@ -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)



include/componentlibrary.hpp → src/custom/Browser.cpp View File

@@ -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"

+ 2
- 1
src/custom/RemoteNanoVG.cpp View File

@@ -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; }



+ 11
- 1
src/custom/glfw.cpp View File

@@ -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;
}

+ 41
- 0
utils/create-macos-installer.sh View File

@@ -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

+ 2
- 2
utils/macOS/Info_JACK.plist View File

@@ -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/>


+ 2
- 2
utils/macOS/Info_Native.plist View File

@@ -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/>


Loading…
Cancel
Save