More mini details, fake audio runs, set host param values
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
d0eba9e1ae
commit
5e73b8c227
14 changed files with 427 additions and 127 deletions
2
dpf
2
dpf
|
@ -1 +1 @@
|
||||||
Subproject commit 8eb504d3eb6b4f9984503bedfbd3c02b7cb63d2b
|
Subproject commit 207e0ae8720faa4db6f34192d83a0ee3b85b832a
|
|
@ -1,22 +1,161 @@
|
||||||
{
|
{
|
||||||
"version": "2.1",
|
"version": "2.1.1",
|
||||||
"zoom": 1.0,
|
"zoom": 1.0,
|
||||||
"modules": [
|
"modules": [
|
||||||
{
|
{
|
||||||
"id": 2799203590388841,
|
"id": 8712245256622475,
|
||||||
"plugin": "Cardinal",
|
"plugin": "Cardinal",
|
||||||
"model": "TextEditor",
|
"model": "TextEditor",
|
||||||
"version": "2.0",
|
"version": "2.0",
|
||||||
"params": [],
|
"params": [],
|
||||||
"leftModuleId": 4,
|
"leftModuleId": 1202678850202654,
|
||||||
"data": {
|
"data": {
|
||||||
"filepath": "",
|
"filepath": "",
|
||||||
"lang": "None",
|
"lang": "None",
|
||||||
"etext": "Welcome to Cardinal!\n\nThis is the mini variant\nIt has 2 audio ports, 5 CV ports, plus MIDI\n\nThe most relevant modules for host\nintegration are in this default patch\n\nHave fun!\n\n",
|
"etext": "Welcome to Cardinal!\n\nThis is the mini variant\nIt has 2 audio ports, 5 CV ports, plus MIDI\n\nThe most relevant modules for host\nintegration are in this default patch\n\nA basic VCO + ADSR + VCA is\nthe default patch\n\nHave fun!\n\n",
|
||||||
"width": 23
|
"width": 19
|
||||||
},
|
},
|
||||||
"pos": [
|
"pos": [
|
||||||
42,
|
58,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5726895899473528,
|
||||||
|
"plugin": "Fundamental",
|
||||||
|
"model": "ADSR",
|
||||||
|
"version": "2.0",
|
||||||
|
"params": [
|
||||||
|
{
|
||||||
|
"value": 0.5,
|
||||||
|
"id": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.5,
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.5,
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.5,
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 8
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"leftModuleId": 8601159184541723,
|
||||||
|
"rightModuleId": 4828178296911509,
|
||||||
|
"pos": [
|
||||||
|
18,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4828178296911509,
|
||||||
|
"plugin": "Fundamental",
|
||||||
|
"model": "VCA-1",
|
||||||
|
"version": "2.0",
|
||||||
|
"params": [
|
||||||
|
{
|
||||||
|
"value": 1.0,
|
||||||
|
"id": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 1.0,
|
||||||
|
"id": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"leftModuleId": 5726895899473528,
|
||||||
|
"rightModuleId": 1,
|
||||||
|
"pos": [
|
||||||
|
27,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8601159184541723,
|
||||||
|
"plugin": "Fundamental",
|
||||||
|
"model": "VCO",
|
||||||
|
"version": "2.0",
|
||||||
|
"params": [
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 1.0,
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.5,
|
||||||
|
"id": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 0.0,
|
||||||
|
"id": 7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"leftModuleId": 2,
|
||||||
|
"rightModuleId": 5726895899473528,
|
||||||
|
"pos": [
|
||||||
|
9,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"plugin": "Cardinal",
|
||||||
|
"model": "HostAudio2",
|
||||||
|
"version": "2.0",
|
||||||
|
"params": [
|
||||||
|
{
|
||||||
|
"value": 0.79432821273803711,
|
||||||
|
"id": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"leftModuleId": 4828178296911509,
|
||||||
|
"rightModuleId": 4,
|
||||||
|
"data": {
|
||||||
|
"dcFilter": true
|
||||||
|
},
|
||||||
|
"pos": [
|
||||||
|
30,
|
||||||
0
|
0
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -26,8 +165,7 @@
|
||||||
"model": "HostMIDI",
|
"model": "HostMIDI",
|
||||||
"version": "2.0",
|
"version": "2.0",
|
||||||
"params": [],
|
"params": [],
|
||||||
"leftModuleId": 7249509538355161,
|
"rightModuleId": 8601159184541723,
|
||||||
"rightModuleId": 3,
|
|
||||||
"data": {
|
"data": {
|
||||||
"pwRange": 0.0,
|
"pwRange": 0.0,
|
||||||
"smooth": false,
|
"smooth": false,
|
||||||
|
@ -39,20 +177,7 @@
|
||||||
"outputChannel": 0
|
"outputChannel": 0
|
||||||
},
|
},
|
||||||
"pos": [
|
"pos": [
|
||||||
16,
|
0,
|
||||||
0
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 3,
|
|
||||||
"plugin": "Cardinal",
|
|
||||||
"model": "HostTime",
|
|
||||||
"version": "2.0",
|
|
||||||
"params": [],
|
|
||||||
"leftModuleId": 2,
|
|
||||||
"rightModuleId": 4,
|
|
||||||
"pos": [
|
|
||||||
25,
|
|
||||||
0
|
0
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -62,58 +187,97 @@
|
||||||
"model": "HostParameters",
|
"model": "HostParameters",
|
||||||
"version": "2.0",
|
"version": "2.0",
|
||||||
"params": [],
|
"params": [],
|
||||||
"leftModuleId": 3,
|
"leftModuleId": 1,
|
||||||
"rightModuleId": 2799203590388841,
|
"rightModuleId": 1202678850202654,
|
||||||
"pos": [
|
|
||||||
33,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 7249509538355161,
|
|
||||||
"plugin": "Cardinal",
|
|
||||||
"model": "HostCV",
|
|
||||||
"version": "2.0",
|
|
||||||
"params": [
|
|
||||||
{
|
|
||||||
"value": 0.0,
|
|
||||||
"id": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"value": 0.0,
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"value": 0.0,
|
|
||||||
"id": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"value": 0.0,
|
|
||||||
"id": 3
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"leftModuleId": 3606136179759592,
|
|
||||||
"rightModuleId": 2,
|
|
||||||
"pos": [
|
|
||||||
8,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 3606136179759592,
|
|
||||||
"plugin": "Cardinal",
|
|
||||||
"model": "HostAudio2",
|
|
||||||
"version": "2.0",
|
|
||||||
"params": [],
|
|
||||||
"rightModuleId": 7249509538355161,
|
|
||||||
"data": {
|
"data": {
|
||||||
"dcFilter": false
|
"smooth": true
|
||||||
},
|
},
|
||||||
"pos": [
|
"pos": [
|
||||||
0,
|
38,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1202678850202654,
|
||||||
|
"plugin": "Cardinal",
|
||||||
|
"model": "HostParametersMap",
|
||||||
|
"version": "2.0",
|
||||||
|
"params": [],
|
||||||
|
"leftModuleId": 4,
|
||||||
|
"rightModuleId": 8712245256622475,
|
||||||
|
"data": {
|
||||||
|
"maps": [
|
||||||
|
{
|
||||||
|
"hostParamId": 255,
|
||||||
|
"inverted": false,
|
||||||
|
"smooth": true,
|
||||||
|
"moduleId": -1,
|
||||||
|
"paramId": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pos": [
|
||||||
|
47,
|
||||||
0
|
0
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"cables": []
|
"cables": [
|
||||||
|
{
|
||||||
|
"id": 5155876120487880,
|
||||||
|
"outputModuleId": 2,
|
||||||
|
"outputId": 1,
|
||||||
|
"inputModuleId": 5726895899473528,
|
||||||
|
"inputId": 4,
|
||||||
|
"color": "#ff9352"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 781753834216137,
|
||||||
|
"outputModuleId": 2,
|
||||||
|
"outputId": 6,
|
||||||
|
"inputModuleId": 5726895899473528,
|
||||||
|
"inputId": 5,
|
||||||
|
"color": "#ffd452"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3464471860196875,
|
||||||
|
"outputModuleId": 5726895899473528,
|
||||||
|
"outputId": 0,
|
||||||
|
"inputModuleId": 4828178296911509,
|
||||||
|
"inputId": 0,
|
||||||
|
"color": "#e8ff52"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 739552540616113,
|
||||||
|
"outputModuleId": 4828178296911509,
|
||||||
|
"outputId": 0,
|
||||||
|
"inputModuleId": 1,
|
||||||
|
"inputId": 0,
|
||||||
|
"color": "#52beff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6701970185765111,
|
||||||
|
"outputModuleId": 2,
|
||||||
|
"outputId": 0,
|
||||||
|
"inputModuleId": 8601159184541723,
|
||||||
|
"inputId": 0,
|
||||||
|
"color": "#ff5252"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6959800657121782,
|
||||||
|
"outputModuleId": 2,
|
||||||
|
"outputId": 2,
|
||||||
|
"inputModuleId": 8601159184541723,
|
||||||
|
"inputId": 1,
|
||||||
|
"color": "#52ff7d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1598271319373837,
|
||||||
|
"outputModuleId": 8601159184541723,
|
||||||
|
"outputId": 0,
|
||||||
|
"inputModuleId": 4828178296911509,
|
||||||
|
"inputId": 1,
|
||||||
|
"color": "#a8ff52"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -222,25 +222,51 @@ struct HostAudio2 : HostAudio<2> {
|
||||||
valueR = 0.0f;
|
valueR = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t j = internalDataFrame++;
|
if (pcontext->variant == kCardinalVariantMini)
|
||||||
internalDataBufferL[j] = valueL;
|
|
||||||
internalDataBufferR[j] = valueR;
|
|
||||||
|
|
||||||
if (internalDataFrame == 128)
|
|
||||||
{
|
{
|
||||||
internalDataFrame = 0;
|
const uint32_t j = internalDataFrame++;
|
||||||
|
internalDataBufferL[j] = valueL;
|
||||||
|
internalDataBufferR[j] = valueR;
|
||||||
|
|
||||||
if (resetMeters)
|
if (internalDataFrame == 4)
|
||||||
gainMeterL = gainMeterR = 0.0f;
|
{
|
||||||
|
internalDataFrame = 0;
|
||||||
|
|
||||||
gainMeterL = std::max(gainMeterL, d_findMaxNormalizedFloat128(internalDataBufferL));
|
if (resetMeters)
|
||||||
|
gainMeterL = gainMeterR = 0.0f;
|
||||||
|
|
||||||
if (in2connected)
|
gainMeterL = std::max(gainMeterL, d_findMaxNormalizedFloat<4>(internalDataBufferL));
|
||||||
gainMeterR = std::max(gainMeterR, d_findMaxNormalizedFloat128(internalDataBufferR));
|
|
||||||
else
|
|
||||||
gainMeterR = gainMeterL;
|
|
||||||
|
|
||||||
resetMeters = false;
|
if (in2connected)
|
||||||
|
gainMeterR = std::max(gainMeterR, d_findMaxNormalizedFloat<4>(internalDataBufferR));
|
||||||
|
else
|
||||||
|
gainMeterR = gainMeterL;
|
||||||
|
|
||||||
|
resetMeters = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const uint32_t j = internalDataFrame++;
|
||||||
|
internalDataBufferL[j] = valueL;
|
||||||
|
internalDataBufferR[j] = valueR;
|
||||||
|
|
||||||
|
if (internalDataFrame == 128)
|
||||||
|
{
|
||||||
|
internalDataFrame = 0;
|
||||||
|
|
||||||
|
if (resetMeters)
|
||||||
|
gainMeterL = gainMeterR = 0.0f;
|
||||||
|
|
||||||
|
gainMeterL = std::max(gainMeterL, d_findMaxNormalizedFloat128(internalDataBufferL));
|
||||||
|
|
||||||
|
if (in2connected)
|
||||||
|
gainMeterR = std::max(gainMeterR, d_findMaxNormalizedFloat128(internalDataBufferR));
|
||||||
|
else
|
||||||
|
gainMeterR = gainMeterL;
|
||||||
|
|
||||||
|
resetMeters = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,37 @@ extern Model* modelTextEditor;
|
||||||
|
|
||||||
extern std::vector<Model*> hostTerminalModels;
|
extern std::vector<Model*> hostTerminalModels;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the highest absolute and normalized value within a float array.
|
||||||
|
*/
|
||||||
|
template<std::size_t size>
|
||||||
|
static inline
|
||||||
|
float d_findMaxNormalizedFloat(const float floats[size])
|
||||||
|
{
|
||||||
|
static constexpr const float kEmptyFloats[size] = {};
|
||||||
|
|
||||||
|
if (std::memcmp(floats, kEmptyFloats, sizeof(float)*size) == 0)
|
||||||
|
return 0.f;
|
||||||
|
|
||||||
|
float tmp, maxf2 = std::abs(floats[0]);
|
||||||
|
|
||||||
|
for (std::size_t i=1; i<size; ++i)
|
||||||
|
{
|
||||||
|
if (!std::isfinite(floats[i]))
|
||||||
|
__builtin_unreachable();
|
||||||
|
|
||||||
|
tmp = std::abs(floats[i]);
|
||||||
|
|
||||||
|
if (tmp > maxf2)
|
||||||
|
maxf2 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxf2 > 1.f)
|
||||||
|
maxf2 = 1.f;
|
||||||
|
|
||||||
|
return maxf2;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the highest absolute and normalized value within a float array.
|
* Find the highest absolute and normalized value within a float array.
|
||||||
*/
|
*/
|
||||||
|
@ -61,7 +92,7 @@ float d_findMaxNormalizedFloat128(const float floats[128])
|
||||||
static constexpr const float kEmptyFloats[128] = {};
|
static constexpr const float kEmptyFloats[128] = {};
|
||||||
|
|
||||||
if (std::memcmp(floats, kEmptyFloats, sizeof(float)*128) == 0)
|
if (std::memcmp(floats, kEmptyFloats, sizeof(float)*128) == 0)
|
||||||
return 0.0f;
|
return 0.f;
|
||||||
|
|
||||||
float tmp, maxf2 = std::abs(floats[0]);
|
float tmp, maxf2 = std::abs(floats[0]);
|
||||||
|
|
||||||
|
@ -76,8 +107,8 @@ float d_findMaxNormalizedFloat128(const float floats[128])
|
||||||
maxf2 = tmp;
|
maxf2 = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxf2 > 1.0f)
|
if (maxf2 > 1.f)
|
||||||
maxf2 = 1.0f;
|
maxf2 = 1.f;
|
||||||
|
|
||||||
return maxf2;
|
return maxf2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -311,9 +311,12 @@ endif
|
||||||
PLUGIN_FILES += $(filter-out Fundamental/src/plugin.cpp,$(wildcard Fundamental/src/*.cpp))
|
PLUGIN_FILES += $(filter-out Fundamental/src/plugin.cpp,$(wildcard Fundamental/src/*.cpp))
|
||||||
PLUGIN_FILES += Fundamental/src/dr_wav.c
|
PLUGIN_FILES += Fundamental/src/dr_wav.c
|
||||||
|
|
||||||
|
MINIPLUGIN_FILES += Fundamental/src/ADSR.cpp
|
||||||
MINIPLUGIN_FILES += Fundamental/src/LFO.cpp
|
MINIPLUGIN_FILES += Fundamental/src/LFO.cpp
|
||||||
MINIPLUGIN_FILES += Fundamental/src/Noise.cpp
|
MINIPLUGIN_FILES += Fundamental/src/Noise.cpp
|
||||||
MINIPLUGIN_FILES += Fundamental/src/Random.cpp
|
MINIPLUGIN_FILES += Fundamental/src/Random.cpp
|
||||||
|
MINIPLUGIN_FILES += Fundamental/src/Scope.cpp
|
||||||
|
MINIPLUGIN_FILES += Fundamental/src/VCA-1.cpp
|
||||||
MINIPLUGIN_FILES += Fundamental/src/VCF.cpp
|
MINIPLUGIN_FILES += Fundamental/src/VCF.cpp
|
||||||
MINIPLUGIN_FILES += Fundamental/src/VCMixer.cpp
|
MINIPLUGIN_FILES += Fundamental/src/VCMixer.cpp
|
||||||
MINIPLUGIN_FILES += Fundamental/src/VCO.cpp
|
MINIPLUGIN_FILES += Fundamental/src/VCO.cpp
|
||||||
|
|
|
@ -209,13 +209,16 @@ static void initStatic__Fundamental()
|
||||||
const StaticPluginLoader spl(p, "Fundamental");
|
const StaticPluginLoader spl(p, "Fundamental");
|
||||||
if (spl.ok())
|
if (spl.ok())
|
||||||
{
|
{
|
||||||
|
p->addModel(modelADSR);
|
||||||
p->addModel(modelLFO);
|
p->addModel(modelLFO);
|
||||||
p->addModel(modelNoise);
|
p->addModel(modelNoise);
|
||||||
p->addModel(modelRandom);
|
p->addModel(modelRandom);
|
||||||
|
p->addModel(modelScope);
|
||||||
|
p->addModel(modelVCA_1);
|
||||||
p->addModel(modelVCF);
|
p->addModel(modelVCF);
|
||||||
p->addModel(modelVCMixer);
|
p->addModel(modelVCMixer);
|
||||||
|
p->addModel(modelVCO);
|
||||||
spl.removeModule("8vert");
|
spl.removeModule("8vert");
|
||||||
spl.removeModule("ADSR");
|
|
||||||
spl.removeModule("Delay");
|
spl.removeModule("Delay");
|
||||||
spl.removeModule("LFO2");
|
spl.removeModule("LFO2");
|
||||||
spl.removeModule("Merge");
|
spl.removeModule("Merge");
|
||||||
|
@ -226,14 +229,11 @@ static void initStatic__Fundamental()
|
||||||
spl.removeModule("Pulses");
|
spl.removeModule("Pulses");
|
||||||
spl.removeModule("Quantizer");
|
spl.removeModule("Quantizer");
|
||||||
spl.removeModule("SEQ3");
|
spl.removeModule("SEQ3");
|
||||||
spl.removeModule("Scope");
|
|
||||||
spl.removeModule("SequentialSwitch1");
|
spl.removeModule("SequentialSwitch1");
|
||||||
spl.removeModule("SequentialSwitch2");
|
spl.removeModule("SequentialSwitch2");
|
||||||
spl.removeModule("Split");
|
spl.removeModule("Split");
|
||||||
spl.removeModule("Sum");
|
spl.removeModule("Sum");
|
||||||
spl.removeModule("VCA");
|
spl.removeModule("VCA");
|
||||||
spl.removeModule("VCA-1");
|
|
||||||
spl.removeModule("VCO");
|
|
||||||
spl.removeModule("VCO2");
|
spl.removeModule("VCO2");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,4 +16,4 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CARDINAL_COMMON_UI_ONLY
|
#define CARDINAL_COMMON_UI_ONLY
|
||||||
#include "CardinalCommon.cpp"
|
#include "../CardinalCommon.cpp"
|
||||||
|
|
|
@ -39,8 +39,8 @@
|
||||||
#define DISTRHO_UI_FILE_BROWSER 1
|
#define DISTRHO_UI_FILE_BROWSER 1
|
||||||
#define DISTRHO_UI_USE_NANOVG 1
|
#define DISTRHO_UI_USE_NANOVG 1
|
||||||
#define DISTRHO_UI_USER_RESIZABLE 1
|
#define DISTRHO_UI_USER_RESIZABLE 1
|
||||||
#define DISTRHO_UI_DEFAULT_WIDTH 1228
|
#define DISTRHO_UI_DEFAULT_WIDTH 1000
|
||||||
#define DISTRHO_UI_DEFAULT_HEIGHT 666
|
#define DISTRHO_UI_DEFAULT_HEIGHT 600
|
||||||
#define DISTRHO_PLUGIN_IS_SYNTH 0
|
#define DISTRHO_PLUGIN_IS_SYNTH 0
|
||||||
#define DISTRHO_PLUGIN_NUM_INPUTS CARDINAL_NUM_AUDIO_INPUTS
|
#define DISTRHO_PLUGIN_NUM_INPUTS CARDINAL_NUM_AUDIO_INPUTS
|
||||||
#define DISTRHO_PLUGIN_NUM_OUTPUTS CARDINAL_NUM_AUDIO_OUTPUTS
|
#define DISTRHO_PLUGIN_NUM_OUTPUTS CARDINAL_NUM_AUDIO_OUTPUTS
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
|
|
||||||
static const constexpr uint kCardinalStateBaseCount = 3; // patch, screenshot, comment
|
static const constexpr uint kCardinalStateBaseCount = 3; // patch, screenshot, comment
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
# include "extra/ScopedValueSetter.hpp"
|
# include "extra/ScopedValueSetter.hpp"
|
||||||
# include "WindowParameters.hpp"
|
# include "WindowParameters.hpp"
|
||||||
static const constexpr uint kCardinalStateCount = kCardinalStateBaseCount + 2; // moduleInfos, windowSize
|
static const constexpr uint kCardinalStateCount = kCardinalStateBaseCount + 2; // moduleInfos, windowSize
|
||||||
|
@ -163,7 +163,7 @@ class CardinalPlugin : public CardinalBasePlugin
|
||||||
struct {
|
struct {
|
||||||
String comment;
|
String comment;
|
||||||
String screenshot;
|
String screenshot;
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
String windowSize;
|
String windowSize;
|
||||||
#endif
|
#endif
|
||||||
} fState;
|
} fState;
|
||||||
|
@ -172,7 +172,7 @@ class CardinalPlugin : public CardinalBasePlugin
|
||||||
bool fWasBypassed;
|
bool fWasBypassed;
|
||||||
MidiEvent bypassMidiEvents[16];
|
MidiEvent bypassMidiEvents[16];
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
// real values, not VCV interpreted ones
|
// real values, not VCV interpreted ones
|
||||||
float fWindowParameters[kWindowParameterCount];
|
float fWindowParameters[kWindowParameterCount];
|
||||||
#endif
|
#endif
|
||||||
|
@ -191,7 +191,7 @@ public:
|
||||||
fNextExpectedFrame(0),
|
fNextExpectedFrame(0),
|
||||||
fWasBypassed(false)
|
fWasBypassed(false)
|
||||||
{
|
{
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
fWindowParameters[kWindowParameterShowTooltips] = 1.0f;
|
fWindowParameters[kWindowParameterShowTooltips] = 1.0f;
|
||||||
fWindowParameters[kWindowParameterCableOpacity] = 50.0f;
|
fWindowParameters[kWindowParameterCableOpacity] = 50.0f;
|
||||||
fWindowParameters[kWindowParameterCableTension] = 75.0f;
|
fWindowParameters[kWindowParameterCableTension] = 75.0f;
|
||||||
|
@ -290,7 +290,7 @@ public:
|
||||||
context->patch->clear();
|
context->patch->clear();
|
||||||
|
|
||||||
// do a little dance to prevent context scene deletion from saving to temp dir
|
// do a little dance to prevent context scene deletion from saving to temp dir
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
const ScopedValueSetter<bool> svs(rack::settings::headless, true);
|
const ScopedValueSetter<bool> svs(rack::settings::headless, true);
|
||||||
#endif
|
#endif
|
||||||
Engine_setAboutToClose(context->engine);
|
Engine_setAboutToClose(context->engine);
|
||||||
|
@ -419,6 +419,10 @@ protected:
|
||||||
parameter.symbol += String(index + 1);
|
parameter.symbol += String(index + 1);
|
||||||
parameter.unit = "v";
|
parameter.unit = "v";
|
||||||
parameter.hints = kParameterIsAutomatable;
|
parameter.hints = kParameterIsAutomatable;
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
// TODO is hidden
|
||||||
|
// parameter.hints |= kParameterIsAutomatable;
|
||||||
|
#endif
|
||||||
parameter.ranges.def = 0.0f;
|
parameter.ranges.def = 0.0f;
|
||||||
parameter.ranges.min = 0.0f;
|
parameter.ranges.min = 0.0f;
|
||||||
parameter.ranges.max = 10.0f;
|
parameter.ranges.max = 10.0f;
|
||||||
|
@ -431,7 +435,7 @@ protected:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
switch (index - kModuleParameters - 1)
|
switch (index - kModuleParameters - 1)
|
||||||
{
|
{
|
||||||
case kWindowParameterShowTooltips:
|
case kWindowParameterShowTooltips:
|
||||||
|
@ -610,7 +614,11 @@ protected:
|
||||||
switch (index)
|
switch (index)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
state.hints = kStateIsHostWritable;
|
||||||
|
#else
|
||||||
state.hints = kStateIsBase64Blob;
|
state.hints = kStateIsBase64Blob;
|
||||||
|
#endif
|
||||||
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
|
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
|
||||||
state.hints |= kStateIsOnlyForDSP;
|
state.hints |= kStateIsOnlyForDSP;
|
||||||
#endif
|
#endif
|
||||||
|
@ -620,11 +628,16 @@ protected:
|
||||||
if (const long fileSize = std::ftell(f))
|
if (const long fileSize = std::ftell(f))
|
||||||
{
|
{
|
||||||
std::fseek(f, 0, SEEK_SET);
|
std::fseek(f, 0, SEEK_SET);
|
||||||
char* const fileContent = new char[fileSize];
|
char* const fileContent = new char[fileSize+1];
|
||||||
|
|
||||||
if (std::fread(fileContent, fileSize, 1, f) == 1)
|
if (std::fread(fileContent, fileSize, 1, f) == 1)
|
||||||
{
|
{
|
||||||
|
fileContent[fileSize] = '\0';
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
state.defaultValue = fileContent;
|
||||||
|
#else
|
||||||
state.defaultValue = String::asBase64(fileContent, fileSize);
|
state.defaultValue = String::asBase64(fileContent, fileSize);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] fileContent;
|
delete[] fileContent;
|
||||||
|
@ -675,7 +688,7 @@ protected:
|
||||||
if (index == kModuleParameters)
|
if (index == kModuleParameters)
|
||||||
return context->bypassed ? 1.0f : 0.0f;
|
return context->bypassed ? 1.0f : 0.0f;
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
// window related parameters
|
// window related parameters
|
||||||
index -= kModuleParameters + 1;
|
index -= kModuleParameters + 1;
|
||||||
|
|
||||||
|
@ -702,7 +715,7 @@ protected:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
// window related parameters
|
// window related parameters
|
||||||
index -= kModuleParameters + 1;
|
index -= kModuleParameters + 1;
|
||||||
|
|
||||||
|
@ -716,7 +729,7 @@ protected:
|
||||||
|
|
||||||
String getState(const char* const key) const override
|
String getState(const char* const key) const override
|
||||||
{
|
{
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
if (std::strcmp(key, "moduleInfos") == 0)
|
if (std::strcmp(key, "moduleInfos") == 0)
|
||||||
{
|
{
|
||||||
json_t* const rootJ = json_object();
|
json_t* const rootJ = json_object();
|
||||||
|
@ -784,9 +797,12 @@ protected:
|
||||||
context->patch->cleanAutosave();
|
context->patch->cleanAutosave();
|
||||||
// context->history->setSaved();
|
// context->history->setSaved();
|
||||||
|
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
#else
|
||||||
try {
|
try {
|
||||||
data = rack::system::archiveDirectory(fAutosavePath, 1);
|
data = rack::system::archiveDirectory(fAutosavePath, 1);
|
||||||
} DISTRHO_SAFE_EXCEPTION_RETURN("getState archiveDirectory", String());
|
} DISTRHO_SAFE_EXCEPTION_RETURN("getState archiveDirectory", String());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return String::asBase64(data.data(), data.size());
|
return String::asBase64(data.data(), data.size());
|
||||||
|
@ -797,10 +813,10 @@ protected:
|
||||||
#if CARDINAL_VARIANT_MINI
|
#if CARDINAL_VARIANT_MINI
|
||||||
if (std::strcmp(key, "param") == 0)
|
if (std::strcmp(key, "param") == 0)
|
||||||
{
|
{
|
||||||
int64_t moduleId = 0;
|
longlong moduleId = 0;
|
||||||
int paramId = 0;
|
int paramId = 0;
|
||||||
float paramValue = 0.f;
|
float paramValue = 0.f;
|
||||||
std::sscanf(value, "%lu:%d:%f", &moduleId, ¶mId, ¶mValue);
|
std::sscanf(value, "%lld:%d:%f", &moduleId, ¶mId, ¶mValue);
|
||||||
|
|
||||||
rack::engine::Module* const module = context->engine->getModule(moduleId);
|
rack::engine::Module* const module = context->engine->getModule(moduleId);
|
||||||
DISTRHO_SAFE_ASSERT_RETURN(module != nullptr,);
|
DISTRHO_SAFE_ASSERT_RETURN(module != nullptr,);
|
||||||
|
@ -810,7 +826,7 @@ protected:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
|
||||||
if (std::strcmp(key, "moduleInfos") == 0)
|
if (std::strcmp(key, "moduleInfos") == 0)
|
||||||
{
|
{
|
||||||
json_error_t error;
|
json_error_t error;
|
||||||
|
@ -869,6 +885,16 @@ protected:
|
||||||
if (fAutosavePath.empty())
|
if (fAutosavePath.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
FILE* const f = std::fopen(rack::system::join(fAutosavePath, "patch.json").c_str(), "w");
|
||||||
|
DISTRHO_SAFE_ASSERT_RETURN(f != nullptr,);
|
||||||
|
|
||||||
|
rack::system::removeRecursively(fAutosavePath);
|
||||||
|
rack::system::createDirectories(fAutosavePath);
|
||||||
|
|
||||||
|
std::fwrite(value, std::strlen(value)+1, 1, f);
|
||||||
|
std::fclose(f);
|
||||||
|
#else
|
||||||
const std::vector<uint8_t> data(d_getChunkFromBase64String(value));
|
const std::vector<uint8_t> data(d_getChunkFromBase64String(value));
|
||||||
|
|
||||||
DISTRHO_SAFE_ASSERT_RETURN(data.size() >= 4,);
|
DISTRHO_SAFE_ASSERT_RETURN(data.size() >= 4,);
|
||||||
|
@ -892,6 +918,7 @@ protected:
|
||||||
rack::system::unarchiveToDirectory(data, fAutosavePath);
|
rack::system::unarchiveToDirectory(data, fAutosavePath);
|
||||||
} DISTRHO_SAFE_EXCEPTION_RETURN("setState unarchiveToDirectory",);
|
} DISTRHO_SAFE_EXCEPTION_RETURN("setState unarchiveToDirectory",);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const ScopedContext sc(this);
|
const ScopedContext sc(this);
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ void sendParamChangeToRemote(RemoteDetails* const remote, int64_t moduleId, int
|
||||||
{
|
{
|
||||||
#if CARDINAL_VARIANT_MINI
|
#if CARDINAL_VARIANT_MINI
|
||||||
char paramBuf[512] = {};
|
char paramBuf[512] = {};
|
||||||
std::snprintf(paramBuf, sizeof(paramBuf), "%lu:%d:%f", moduleId, paramId, value);
|
std::snprintf(paramBuf, sizeof(paramBuf), "%llu:%d:%f", (ulonglong)moduleId, paramId, value);
|
||||||
static_cast<CardinalBaseUI*>(remote->handle)->setState("param", paramBuf);
|
static_cast<CardinalBaseUI*>(remote->handle)->setState("param", paramBuf);
|
||||||
#elif defined(HAVE_LIBLO)
|
#elif defined(HAVE_LIBLO)
|
||||||
const lo_address addr = lo_address_new_with_proto(LO_UDP, REMOTE_HOST, CARDINAL_DEFAULT_REMOTE_HOST_PORT);
|
const lo_address addr = lo_address_new_with_proto(LO_UDP, REMOTE_HOST, CARDINAL_DEFAULT_REMOTE_HOST_PORT);
|
||||||
|
@ -159,17 +159,23 @@ void sendFullPatchToRemote(RemoteDetails* const remote)
|
||||||
context->engine->prepareSave();
|
context->engine->prepareSave();
|
||||||
context->patch->saveAutosave();
|
context->patch->saveAutosave();
|
||||||
context->patch->cleanAutosave();
|
context->patch->cleanAutosave();
|
||||||
std::vector<uint8_t> data(rack::system::archiveDirectory(context->patch->autosavePath, 1));
|
|
||||||
|
std::vector<uint8_t> data;
|
||||||
|
using namespace rack::system;
|
||||||
|
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
try {
|
||||||
|
data = readFile(join(context->patch->autosavePath, "patch.json"));
|
||||||
|
} DISTRHO_SAFE_EXCEPTION_RETURN("sendFullPatchToRemote",);
|
||||||
|
|
||||||
|
static_cast<CardinalBaseUI*>(remote->handle)->setState("patch", reinterpret_cast<const char*>(data.data()));
|
||||||
|
#elif defined(HAVE_LIBLO)
|
||||||
|
try {
|
||||||
|
data = archiveDirectory(context->patch->autosavePath, 1);
|
||||||
|
} DISTRHO_SAFE_EXCEPTION_RETURN("sendFullPatchToRemote",);
|
||||||
|
|
||||||
DISTRHO_SAFE_ASSERT_RETURN(data.size() >= 4,);
|
DISTRHO_SAFE_ASSERT_RETURN(data.size() >= 4,);
|
||||||
|
|
||||||
#if CARDINAL_VARIANT_MINI
|
|
||||||
if (char* const patch = String::asBase64(data.data(), data.size()).getAndReleaseBuffer())
|
|
||||||
{
|
|
||||||
static_cast<CardinalBaseUI*>(remote->handle)->setState("patch", patch);
|
|
||||||
std::free(patch);
|
|
||||||
}
|
|
||||||
#elif defined(HAVE_LIBLO)
|
|
||||||
const lo_address addr = lo_address_new_with_proto(LO_UDP, REMOTE_HOST, CARDINAL_DEFAULT_REMOTE_HOST_PORT);
|
const lo_address addr = lo_address_new_with_proto(LO_UDP, REMOTE_HOST, CARDINAL_DEFAULT_REMOTE_HOST_PORT);
|
||||||
DISTRHO_SAFE_ASSERT_RETURN(addr != nullptr,);
|
DISTRHO_SAFE_ASSERT_RETURN(addr != nullptr,);
|
||||||
|
|
||||||
|
@ -180,7 +186,7 @@ void sendFullPatchToRemote(RemoteDetails* const remote)
|
||||||
}
|
}
|
||||||
|
|
||||||
lo_address_free(addr);
|
lo_address_free(addr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendScreenshotToRemote(RemoteDetails*, const char* const screenshot)
|
void sendScreenshotToRemote(RemoteDetails*, const char* const screenshot)
|
||||||
|
|
|
@ -298,7 +298,7 @@ class CardinalUI : public CardinalBaseUI,
|
||||||
rack::math::Vec lastMousePos;
|
rack::math::Vec lastMousePos;
|
||||||
WindowParameters windowParameters;
|
WindowParameters windowParameters;
|
||||||
int rateLimitStep = 0;
|
int rateLimitStep = 0;
|
||||||
#ifdef DISTRHO_OS_WASM
|
#if defined(DISTRHO_OS_WASM) && ! CARDINAL_VARIANT_MINI
|
||||||
int8_t counterForFirstIdlePoint = 0;
|
int8_t counterForFirstIdlePoint = 0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef DPF_RUNTIME_TESTING
|
#ifdef DPF_RUNTIME_TESTING
|
||||||
|
@ -345,7 +345,7 @@ public:
|
||||||
rack::contextSet(context);
|
rack::contextSet(context);
|
||||||
|
|
||||||
#if CARDINAL_VARIANT_MINI
|
#if CARDINAL_VARIANT_MINI
|
||||||
remoteUtils::connectToRemote();
|
DISTRHO_SAFE_ASSERT(remoteUtils::connectToRemote());
|
||||||
|
|
||||||
// create unique temporary path for this instance
|
// create unique temporary path for this instance
|
||||||
try {
|
try {
|
||||||
|
@ -366,9 +366,17 @@ public:
|
||||||
}
|
}
|
||||||
} DISTRHO_SAFE_EXCEPTION("create unique temporary path");
|
} DISTRHO_SAFE_EXCEPTION("create unique temporary path");
|
||||||
|
|
||||||
const float sampleRate = getSampleRate();
|
const float sampleRate = 60; // fake audio running at 60 fps
|
||||||
rack::settings::sampleRate = sampleRate;
|
rack::settings::sampleRate = sampleRate;
|
||||||
|
|
||||||
|
context->dataIns = new const float*[DISTRHO_PLUGIN_NUM_INPUTS];
|
||||||
|
context->dataOuts = new float*[DISTRHO_PLUGIN_NUM_OUTPUTS];
|
||||||
|
|
||||||
|
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS;++i)
|
||||||
|
*const_cast<float**>(&context->dataIns[i]) = new float[1];
|
||||||
|
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS;++i)
|
||||||
|
context->dataOuts[i] = new float[1];
|
||||||
|
|
||||||
context->bufferSize = 1;
|
context->bufferSize = 1;
|
||||||
context->sampleRate = sampleRate;
|
context->sampleRate = sampleRate;
|
||||||
|
|
||||||
|
@ -378,7 +386,7 @@ public:
|
||||||
context->history = new rack::history::State;
|
context->history = new rack::history::State;
|
||||||
context->patch = new rack::patch::Manager;
|
context->patch = new rack::patch::Manager;
|
||||||
context->patch->autosavePath = fAutosavePath;
|
context->patch->autosavePath = fAutosavePath;
|
||||||
context->patch->templatePath = context->patch->factoryTemplatePath = fInitializer->templatePath;
|
context->patch->templatePath = context->patch->factoryTemplatePath = fInitializer->factoryTemplatePath;
|
||||||
|
|
||||||
context->event = new rack::widget::EventState;
|
context->event = new rack::widget::EventState;
|
||||||
context->scene = new rack::app::Scene;
|
context->scene = new rack::app::Scene;
|
||||||
|
@ -386,6 +394,7 @@ public:
|
||||||
|
|
||||||
context->window = new rack::window::Window;
|
context->window = new rack::window::Window;
|
||||||
|
|
||||||
|
context->patch->loadTemplate();
|
||||||
context->scene->rackScroll->reset();
|
context->scene->rackScroll->reset();
|
||||||
|
|
||||||
Engine_setRemoteDetails(context->engine, remoteDetails);
|
Engine_setRemoteDetails(context->engine, remoteDetails);
|
||||||
|
@ -563,7 +572,7 @@ public:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISTRHO_OS_WASM
|
#if defined(DISTRHO_OS_WASM) && ! CARDINAL_VARIANT_MINI
|
||||||
if (counterForFirstIdlePoint >= 0 && ++counterForFirstIdlePoint == 30)
|
if (counterForFirstIdlePoint >= 0 && ++counterForFirstIdlePoint == 30)
|
||||||
{
|
{
|
||||||
counterForFirstIdlePoint = -1;
|
counterForFirstIdlePoint = -1;
|
||||||
|
@ -606,7 +615,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CARDINAL_VARIANT_MINI
|
#if CARDINAL_VARIANT_MINI
|
||||||
context->engine->stepBlock(1);
|
{
|
||||||
|
const ScopedContext sc(this);
|
||||||
|
++context->processCounter;
|
||||||
|
context->engine->stepBlock(1);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (windowParameters.rateLimit != 0 && ++rateLimitStep % (windowParameters.rateLimit * 2))
|
if (windowParameters.rateLimit != 0 && ++rateLimitStep % (windowParameters.rateLimit * 2))
|
||||||
|
@ -702,9 +715,23 @@ protected:
|
||||||
*/
|
*/
|
||||||
void parameterChanged(const uint32_t index, const float value) override
|
void parameterChanged(const uint32_t index, const float value) override
|
||||||
{
|
{
|
||||||
// host mapped parameters + bypass
|
// host mapped parameters
|
||||||
if (index <= kModuleParameters)
|
if (index < kModuleParameters)
|
||||||
|
{
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
context->parameters[index] = value;
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// bypass
|
||||||
|
if (index == kModuleParameters)
|
||||||
|
{
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
context->bypassed = value > 0.5f;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (index - kModuleParameters - 1)
|
switch (index - kModuleParameters - 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -180,7 +180,7 @@ endif
|
||||||
|
|
||||||
# FIXME
|
# FIXME
|
||||||
ifeq ($(CARDINAL_VARIANT)$(CIBUILD)$(WASM),nativetruetrue)
|
ifeq ($(CARDINAL_VARIANT)$(CIBUILD)$(WASM),nativetruetrue)
|
||||||
ifneq ($(STATIC_BUILD),true)
|
ifneq ($(OLD_PATH),)
|
||||||
STATIC_CARLA_PLUGIN_LIBS = -lsndfile -lopus -lFLAC -lvorbisenc -lvorbis -logg -lm
|
STATIC_CARLA_PLUGIN_LIBS = -lsndfile -lopus -lFLAC -lvorbisenc -lvorbis -logg -lm
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -380,6 +380,7 @@ LINK_FLAGS += -sLZ4=1
|
||||||
|
|
||||||
ifeq ($(CARDINAL_VARIANT),mini)
|
ifeq ($(CARDINAL_VARIANT),mini)
|
||||||
LINK_FLAGS += --preload-file=../../bin/CardinalMini.lv2/resources@/resources
|
LINK_FLAGS += --preload-file=../../bin/CardinalMini.lv2/resources@/resources
|
||||||
|
# LINK_FLAGS += -sEXPORTED_RUNTIME_METHODS=FS,cwrap
|
||||||
else
|
else
|
||||||
LINK_FLAGS += --shell-file=../emscripten/shell.html
|
LINK_FLAGS += --shell-file=../emscripten/shell.html
|
||||||
ifneq ($(STATIC_BUILD),true)
|
ifneq ($(STATIC_BUILD),true)
|
||||||
|
|
|
@ -135,6 +135,7 @@ struct FileButton : MenuButton {
|
||||||
patchUtils::loadTemplateDialog();
|
patchUtils::loadTemplateDialog();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
#if ! CARDINAL_VARIANT_MINI
|
||||||
#ifndef DISTRHO_OS_WASM
|
#ifndef DISTRHO_OS_WASM
|
||||||
menu->addChild(createMenuItem("Open / Import...", RACK_MOD_CTRL_NAME "+O", []() {
|
menu->addChild(createMenuItem("Open / Import...", RACK_MOD_CTRL_NAME "+O", []() {
|
||||||
patchUtils::loadDialog();
|
patchUtils::loadDialog();
|
||||||
|
@ -164,6 +165,7 @@ struct FileButton : MenuButton {
|
||||||
menu->addChild(createMenuItem("Save and download uncompressed", "", []() {
|
menu->addChild(createMenuItem("Save and download uncompressed", "", []() {
|
||||||
patchUtils::saveAsDialogUncompressed();
|
patchUtils::saveAsDialogUncompressed();
|
||||||
}));
|
}));
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
menu->addChild(createMenuItem("Revert", RACK_MOD_CTRL_NAME "+" RACK_MOD_SHIFT_NAME "+O", []() {
|
menu->addChild(createMenuItem("Revert", RACK_MOD_CTRL_NAME "+" RACK_MOD_SHIFT_NAME "+O", []() {
|
||||||
|
@ -194,6 +196,7 @@ struct FileButton : MenuButton {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ! CARDINAL_VARIANT_MINI
|
||||||
#ifndef DISTRHO_OS_WASM
|
#ifndef DISTRHO_OS_WASM
|
||||||
menu->addChild(new ui::MenuSeparator);
|
menu->addChild(new ui::MenuSeparator);
|
||||||
|
|
||||||
|
@ -206,6 +209,7 @@ struct FileButton : MenuButton {
|
||||||
patchUtils::saveAsDialogUncompressed();
|
patchUtils::saveAsDialogUncompressed();
|
||||||
}));
|
}));
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ! CARDINAL_VARIANT_MINI
|
#if ! CARDINAL_VARIANT_MINI
|
||||||
if (!demoPatches.empty())
|
if (!demoPatches.empty())
|
||||||
|
@ -761,9 +765,14 @@ struct MeterLabel : ui::Label {
|
||||||
// uiLastTime = time;
|
// uiLastTime = time;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
#if CARDINAL_VARIANT_MINI
|
||||||
|
text = string::f("%.1f fps", 1.0 / frameDurationAvg);
|
||||||
|
#else
|
||||||
double meterAverage = APP->engine->getMeterAverage();
|
double meterAverage = APP->engine->getMeterAverage();
|
||||||
double meterMax = APP->engine->getMeterMax();
|
double meterMax = APP->engine->getMeterMax();
|
||||||
text = string::f("%.1f fps %.1f%% avg %.1f%% max", 1.0 / frameDurationAvg, meterAverage * 100, meterMax * 100);
|
text = string::f("%.1f fps %.1f%% avg %.1f%% max", 1.0 / frameDurationAvg, meterAverage * 100, meterMax * 100);
|
||||||
|
#endif
|
||||||
|
|
||||||
Label::step();
|
Label::step();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -795,9 +804,11 @@ struct MenuBar : widget::OpaqueWidget {
|
||||||
viewButton->text = "View";
|
viewButton->text = "View";
|
||||||
layout->addChild(viewButton);
|
layout->addChild(viewButton);
|
||||||
|
|
||||||
|
#if ! CARDINAL_VARIANT_MINI
|
||||||
EngineButton* engineButton = new EngineButton;
|
EngineButton* engineButton = new EngineButton;
|
||||||
engineButton->text = "Engine";
|
engineButton->text = "Engine";
|
||||||
layout->addChild(engineButton);
|
layout->addChild(engineButton);
|
||||||
|
#endif
|
||||||
|
|
||||||
HelpButton* helpButton = new HelpButton;
|
HelpButton* helpButton = new HelpButton;
|
||||||
helpButton->text = "Help";
|
helpButton->text = "Help";
|
||||||
|
|
|
@ -212,7 +212,11 @@ void Scene::step() {
|
||||||
if (remoteDetails->autoDeploy) {
|
if (remoteDetails->autoDeploy) {
|
||||||
const int actionIndex = APP->history->actionIndex;
|
const int actionIndex = APP->history->actionIndex;
|
||||||
const double time = system::getTime();
|
const double time = system::getTime();
|
||||||
if (internal->historyActionIndex != actionIndex && actionIndex > 0 && time - internal->lastSceneChangeTime >= 1.0) {
|
|
||||||
|
if (internal->historyActionIndex == -1) {
|
||||||
|
internal->historyActionIndex = actionIndex;
|
||||||
|
internal->lastSceneChangeTime = time;
|
||||||
|
} else if (internal->historyActionIndex != actionIndex && actionIndex > 0 && time - internal->lastSceneChangeTime >= 1.0) {
|
||||||
const std::string& name(APP->history->actions[actionIndex - 1]->name);
|
const std::string& name(APP->history->actions[actionIndex - 1]->name);
|
||||||
if (/*std::abs(internal->historyActionIndex = actionIndex) > 1 ||*/ name != "move knob") {
|
if (/*std::abs(internal->historyActionIndex = actionIndex) > 1 ||*/ name != "move knob") {
|
||||||
printf("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str());
|
printf("action '%s'\n", APP->history->actions[actionIndex - 1]->name.c_str());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue