more vst + update nots
This commit is contained in:
parent
44fa0d9881
commit
468826463b
1
TODO
1
TODO
@ -11,3 +11,4 @@
|
|||||||
* lv2: i18n?
|
* lv2: i18n?
|
||||||
* #if > 0 -> dotjs
|
* #if > 0 -> dotjs
|
||||||
* more mappings, lv2 port props
|
* more mappings, lv2 port props
|
||||||
|
* latency mechanism, see https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/Workflow+Diagrams/Get+Latency+Call+Sequence.html, https://steinbergmedia.github.io/vst3_doc/vstinterfaces/classSteinberg_1_1Vst_1_1IAudioProcessor.html#af8884671ccefe68e0a86e72413a0fcf8, https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/Workflow+Diagrams/Audio+Processor+Call+Sequence.html
|
||||||
|
63
notes
63
notes
@ -23,4 +23,67 @@ product {
|
|||||||
bundleName:
|
bundleName:
|
||||||
VST3: plugin folder name, plugin .dll name, Info.plist
|
VST3: plugin folder name, plugin .dll name, Info.plist
|
||||||
LV2: plugin folder name, plugin .dll name, manifest.ttl plugin lv2:binary
|
LV2: plugin folder name, plugin .dll name, manifest.ttl plugin lv2:binary
|
||||||
|
buses: ...
|
||||||
|
parameters: [
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
parameter name string, required
|
||||||
|
VST3: ParameterInfo title
|
||||||
|
LV2: manifest.ttl lv2:port lv2:name
|
||||||
|
shortName:
|
||||||
|
parameter short name string, required
|
||||||
|
VST3: ParameterInfo shortTitle
|
||||||
|
LV2: manifest.ttl lv2:port lv2:shortName
|
||||||
|
direction:
|
||||||
|
"input" or "output", required
|
||||||
|
VST3: ParameterInfo flags
|
||||||
|
LV2: manifest.ttl lv2:port a
|
||||||
|
isBypass:
|
||||||
|
parameter is bypass/enabled? boolean - lots of implications, default false
|
||||||
|
VST3: ParameterInfo, controller get/set parameter/state
|
||||||
|
LV2: manifest.ttl lv2:port, run() (set parameter)
|
||||||
|
isLatency:
|
||||||
|
parameter is latency output? boolean - lots of implications, default false
|
||||||
|
VST3: TBD
|
||||||
|
LV2: manifest.ttl lv2:port, run() (set parameter)
|
||||||
|
defaultValue:
|
||||||
|
default value, number, mapped, required for non-bypass input
|
||||||
|
VST3: ParameterInfo defaultNormalizedValue, controller initialize
|
||||||
|
LV2: manifest.ttl lv2:port lv2:default, activate() (set initial parameter)
|
||||||
|
minimum:
|
||||||
|
minimum value, number, mapped, required for non-bypass input
|
||||||
|
VST3: ParameterInfo stepCount, defaultNormalizedValue, controller get/set parameter (value clamped)
|
||||||
|
LV2: manifest.ttl lv2:port lv2:minimum, run() (set parameter, value clamped)
|
||||||
|
LV2:
|
||||||
|
maximum:
|
||||||
|
maximum value, number, mapped, required for non-bypass input
|
||||||
|
VST3: ParameterInfo stepCount, defaultNormalizedValue, controller get/set parameter (value clamped)
|
||||||
|
LV2: manifest.ttl lv2:port lv2:maximum, run() (set parameter, value clamped)
|
||||||
|
toggled:
|
||||||
|
parameter is on/off? boolean, default false
|
||||||
|
VST3: ParameterInfo stepCount, controller set parameter/state
|
||||||
|
LV2: manifest.ttl lv2:port lv2:portProperty lv2:toggled, run() (set parameter)
|
||||||
|
optional:
|
||||||
|
parameter is optionally connected? boolean, default false
|
||||||
|
VST3: not used
|
||||||
|
LV2: manifest.ttl lv2:port lv2:portProperty lv2:connectionOptional
|
||||||
|
integer:
|
||||||
|
parameter values are integers? boolean, default false
|
||||||
|
VST3: ParameterInfo stepCount, controller set parameter/state
|
||||||
|
LV2: manifest.ttl lv2:port lv2:portProperty lv2:integer, run() (set parameter)
|
||||||
|
scalePoints:
|
||||||
|
{ "label1": value1, "label2", value2, ... }
|
||||||
|
labeled values, default none
|
||||||
|
VST3: TBD
|
||||||
|
LV2: manifest.ttl lv2:port lv2:scalePoint
|
||||||
|
list:
|
||||||
|
parameter is a list (using scalePoints values)? default false
|
||||||
|
VST3: TBD
|
||||||
|
LV2: manifest.ttl lv2:port lv2:enumeration - run() (set parameter) TBD?
|
||||||
|
unit:
|
||||||
|
unit of measure (from predefined list, see tibia-index.js), default ""
|
||||||
|
VST3: ParameterInfo units
|
||||||
|
LV2: manifest.ttl lv2:port units:unit
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
BIN
templates/lv2/data/.manifest.ttl.swp
Normal file
BIN
templates/lv2/data/.manifest.ttl.swp
Normal file
Binary file not shown.
BIN
templates/lv2/src/.data.h.swp
Normal file
BIN
templates/lv2/src/.data.h.swp
Normal file
Binary file not shown.
BIN
templates/lv2/src/.lv2.c.swp
Normal file
BIN
templates/lv2/src/.lv2.c.swp
Normal file
Binary file not shown.
@ -9,7 +9,6 @@
|
|||||||
// https://github.com/rubberduck-vba/Rubberduck/wiki/COM-in-plain-C
|
// https://github.com/rubberduck-vba/Rubberduck/wiki/COM-in-plain-C
|
||||||
// https://devblogs.microsoft.com/oldnewthing/20040205-00/?p=40733
|
// https://devblogs.microsoft.com/oldnewthing/20040205-00/?p=40733
|
||||||
|
|
||||||
|
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
# define TRACE(...) /* do nothing */
|
# define TRACE(...) /* do nothing */
|
||||||
#else
|
#else
|
||||||
@ -256,6 +255,7 @@ static Steinberg_tresult pluginSetState(void* thisInterface, struct Steinberg_I
|
|||||||
if (IS_BIG_ENDIAN)
|
if (IS_BIG_ENDIAN)
|
||||||
v.u = SWAP_UINT32(v.u);
|
v.u = SWAP_UINT32(v.u);
|
||||||
p->parameters[i] = v.f;
|
p->parameters[i] = v.f;
|
||||||
|
//XXX
|
||||||
plugin_set_parameter(&p->p, i, v.f);
|
plugin_set_parameter(&p->p, i, v.f);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -360,6 +360,7 @@ static Steinberg_tresult pluginSetProcessing(void* thisInterface, Steinberg_TBoo
|
|||||||
static Steinberg_tresult pluginProcess(void* thisInterface, struct Steinberg_Vst_ProcessData* data) {
|
static Steinberg_tresult pluginProcess(void* thisInterface, struct Steinberg_Vst_ProcessData* data) {
|
||||||
TRACE("plugin IAudioProcessor process\n");
|
TRACE("plugin IAudioProcessor process\n");
|
||||||
//TBD
|
//TBD
|
||||||
|
// IComponentHandler::restartComponent (kLatencyChanged), see https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/Workflow+Diagrams/Get+Latency+Call+Sequence.html
|
||||||
return Steinberg_kResultOk;
|
return Steinberg_kResultOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,6 +482,24 @@ static Steinberg_tresult controllerTerminate(void* thisInterface) {
|
|||||||
return Steinberg_kResultOk;
|
return Steinberg_kResultOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double clamp(double x, double m, double M) {
|
||||||
|
return x < m ? m : (x > M ? M : x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double parameterMap(Steinberg_Vst_ParamID id, double v) {
|
||||||
|
return parameterData[id].min + (parameterData[id].max - parameterData[id].min) * v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double parameterUnmap(Steinberg_Vst_ParamID id, double v) {
|
||||||
|
return (v - parameterData[id].min) / (parameterData[id].max - parameterData[id].min);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double parameterAdjust(Steinberg_Vst_ParamID id, double v) {
|
||||||
|
v = parameterData[id].flags & (DATA_PARAM_BYPASS | DATA_PARAM_TOGGLED) ? v >= 0.5 ? 1.0 : 0.0
|
||||||
|
: (parameterData[id].flags & DATA_PARAM_INTEGER ? (int32_t)(v + 0.5) : v);
|
||||||
|
return clamp(v, parameterData[id].min, parameterData[id].max);
|
||||||
|
}
|
||||||
|
|
||||||
static Steinberg_tresult controllerSetComponentState(void* thisInterface, struct Steinberg_IBStream* state) {
|
static Steinberg_tresult controllerSetComponentState(void* thisInterface, struct Steinberg_IBStream* state) {
|
||||||
TRACE("controller set component state %p %p\n", thisInterface, (void *)state);
|
TRACE("controller set component state %p %p\n", thisInterface, (void *)state);
|
||||||
if (state == NULL)
|
if (state == NULL)
|
||||||
@ -497,7 +516,7 @@ static Steinberg_tresult controllerSetComponentState(void* thisInterface, struct
|
|||||||
return Steinberg_kResultFalse;
|
return Steinberg_kResultFalse;
|
||||||
if (IS_BIG_ENDIAN)
|
if (IS_BIG_ENDIAN)
|
||||||
v.u = SWAP_UINT32(v.u);
|
v.u = SWAP_UINT32(v.u);
|
||||||
c->parameters[i] = v.f;
|
c->parameters[i] = parameterAdjust(i, v.f);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
TRACE(" ok\n");
|
TRACE(" ok\n");
|
||||||
@ -569,14 +588,6 @@ static void dToStr(double v, Steinberg_Vst_String128 s, int precision) {
|
|||||||
s[i] = '\0';
|
s[i] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
static double parameterMap(Steinberg_Vst_ParamID id, double v) {
|
|
||||||
return parameterData[id].min + (parameterData[id].max - parameterData[id].min) * v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double parameterUnmap(Steinberg_Vst_ParamID id, double v) {
|
|
||||||
return (v - parameterData[id].min) / (parameterData[id].max - parameterData[id].min);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Steinberg_tresult controllerGetParamStringByValue(void* thisInterface, Steinberg_Vst_ParamID id, Steinberg_Vst_ParamValue valueNormalized, Steinberg_Vst_String128 string) {
|
static Steinberg_tresult controllerGetParamStringByValue(void* thisInterface, Steinberg_Vst_ParamID id, Steinberg_Vst_ParamValue valueNormalized, Steinberg_Vst_String128 string) {
|
||||||
TRACE("controller get param string by value\n");
|
TRACE("controller get param string by value\n");
|
||||||
if (id >= DATA_PRODUCT_PARAMETERS_N)
|
if (id >= DATA_PRODUCT_PARAMETERS_N)
|
||||||
@ -637,7 +648,7 @@ static Steinberg_Vst_ParamValue controllerGetParamNormalized(void* thisInterface
|
|||||||
TRACE("controller get param normalized\n");
|
TRACE("controller get param normalized\n");
|
||||||
#if DATA_PRODUCT_PARAMETERS_N > 0
|
#if DATA_PRODUCT_PARAMETERS_N > 0
|
||||||
controller *c = (controller *)thisInterface;
|
controller *c = (controller *)thisInterface;
|
||||||
return parameterMap(id, c->parameters[id]);
|
return parameterUnmap(id, c->parameters[id]);
|
||||||
#else
|
#else
|
||||||
return 0.0;
|
return 0.0;
|
||||||
#endif
|
#endif
|
||||||
@ -649,7 +660,7 @@ static Steinberg_tresult controllerSetParamNormalized(void* thisInterface, Stein
|
|||||||
if (id >= DATA_PRODUCT_PARAMETERS_N)
|
if (id >= DATA_PRODUCT_PARAMETERS_N)
|
||||||
return Steinberg_kResultFalse;
|
return Steinberg_kResultFalse;
|
||||||
controller *c = (controller *)thisInterface;
|
controller *c = (controller *)thisInterface;
|
||||||
c->parameters[id] = parameterMap(id, value);
|
c->parameters[id] = parameterAdjust(id, parameterMap(id, value));
|
||||||
return Steinberg_kResultTrue;
|
return Steinberg_kResultTrue;
|
||||||
#else
|
#else
|
||||||
return Steinberg_kResultFalse;
|
return Steinberg_kResultFalse;
|
||||||
|
@ -8,6 +8,6 @@
|
|||||||
"types": [ "@lv2:AmplifierPlugin" ],
|
"types": [ "@lv2:AmplifierPlugin" ],
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"busSymbols": [ "input", "output" ],
|
"busSymbols": [ "input", "output" ],
|
||||||
"parameterSymbols": [ "gain", "bypass" ]
|
"parameterSymbols": [ "gain", "enabled" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,21 +5,21 @@ typedef struct plugin {
|
|||||||
char bypass;
|
char bypass;
|
||||||
} plugin;
|
} plugin;
|
||||||
|
|
||||||
void plugin_init(plugin *instance) {
|
static void plugin_init(plugin *instance) {
|
||||||
instance->gain = 1.f;
|
instance->gain = 1.f;
|
||||||
instance->bypass = 0;
|
instance->bypass = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_fini(plugin *instance) {
|
static void plugin_fini(plugin *instance) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_set_sample_rate(plugin *instance, float sample_rate) {
|
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_reset(plugin *instance) {
|
static void plugin_reset(plugin *instance) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_set_parameter(plugin *instance, size_t index, float value) {
|
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 0:
|
case 0:
|
||||||
instance->gain = value;
|
instance->gain = value;
|
||||||
@ -30,12 +30,12 @@ void plugin_set_parameter(plugin *instance, size_t index, float value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float plugin_get_parameter(plugin *instance, size_t index) {
|
static float plugin_get_parameter(plugin *instance, size_t index) {
|
||||||
// no output parameters
|
// no output parameters
|
||||||
return 0.f;
|
return 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
|
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
|
||||||
const float g = instance->bypass ? 1.f : powf(10.f, 0.05f * instance->gain);
|
const float g = instance->bypass ? 1.f : powf(10.f, 0.05f * instance->gain);
|
||||||
for (size_t i = 0; i < n_samples; i++)
|
for (size_t i = 0; i < n_samples; i++)
|
||||||
outputs[0][i] = g * inputs[0][i];
|
outputs[0][i] = g * inputs[0][i];
|
||||||
|
Loading…
Reference in New Issue
Block a user