commit 2f909c9fe16c9bcff2617ac395eb222809f1973a
parent a211674ac615a8b4e7a1ae0c4898259f9872a2f6
Author: Alexandre Bique <bique.alexandre@gmail.com>
Date: Thu, 4 Dec 2014 00:12:52 +0100
thyns: easier way to deal with parameters
Diffstat:
4 files changed, 58 insertions(+), 111 deletions(-)
diff --git a/examples/thyns/osc.h b/examples/thyns/osc.h
@@ -29,14 +29,6 @@ enum thyns_osc_param_index
THYNS_OSC_PARAM_COUNT
};
-struct thyns_osc_params
-{
- enum thyns_osc_waveform waveform;
- double pwm; // 0..1
- double phase;
- double tune;
-};
-
struct thyns_osc
{
/* processing constants */
@@ -49,65 +41,14 @@ struct thyns_osc
double angle;
/* parameters */
- enum thyns_osc_waveform *waveform;
- double *pwm; // 0..1
- double *phase;
- double *tune;
+ union clap_param_value *values[THYNS_OSC_PARAM_COUNT];
};
static inline void
-thyns_osc_param_set(struct thyns_osc_params *params,
- uint32_t index,
- union clap_param_value value)
-{
- switch (index) {
- case THYNS_OSC_PARAM_WAVEFORM:
- params->waveform = value.i;
- break;
-
- case THYNS_OSC_PARAM_PHASE:
- params->phase = value.f;
- break;
-
- case THYNS_OSC_PARAM_PWM:
- params->pwm = value.f;
- break;
-
- case THYNS_OSC_PARAM_TUNE:
- params->tune = value.f;
- break;
- }
-}
-
-static inline void
-thyns_osc_param_use(struct thyns_osc *osc,
- struct thyns_osc_params *params,
- uint32_t index)
-{
- switch (index) {
- case THYNS_OSC_PARAM_WAVEFORM:
- osc->waveform = ¶ms->waveform;
- break;
-
- case THYNS_OSC_PARAM_PHASE:
- osc->phase = ¶ms->phase;
- break;
-
- case THYNS_OSC_PARAM_PWM:
- osc->pwm = ¶ms->pwm;
- break;
-
- case THYNS_OSC_PARAM_TUNE:
- osc->tune = ¶ms->tune;
- break;
- }
-}
-
-static inline void
-thyns_osc_param_info(struct thyns_osc_params *params,
- uint32_t index,
- struct clap_param *param,
- const char *prefix)
+thyns_osc_param_info(uint32_t index,
+ union clap_param_value value,
+ const char *prefix,
+ struct clap_param *param)
{
#define P(Dst, Args...) snprintf(Dst, sizeof (Dst), Args);
@@ -116,12 +57,12 @@ thyns_osc_param_info(struct thyns_osc_params *params,
P(param->id, "%s%s", prefix, "waveform");
P(param->name, "%s", "waveform");
P(param->desc, "%s", "Oscillator's waveform");
- P(param->display, "%s", thyns_osc_waveform_name[params->waveform]);
+ P(param->display, "%s", thyns_osc_waveform_name[value.i]);
param->type = CLAP_PARAM_ENUM;
param->is_per_note = true;
param->is_used = true;
param->is_periodic = false;
- param->value.i = params->waveform;
+ param->value = value;
param->min.i = 0;
param->max.i = THYNS_OSC_SINE;
param->scale = CLAP_PARAM_LINEAR;
@@ -131,12 +72,12 @@ thyns_osc_param_info(struct thyns_osc_params *params,
P(param->id, "%s%s", prefix, "phase");
P(param->name, "%s", "phase");
P(param->desc, "%s", "Oscillator's phase");
- P(param->display, "%f", params->phase);
+ P(param->display, "%f", value.f);
param->type = CLAP_PARAM_FLOAT;
param->is_per_note = true;
param->is_used = true;
param->is_periodic = true;
- param->value.f = params->phase;
+ param->value = value;
param->min.f = 0;
param->max.f = 2 * M_PI;
param->scale = CLAP_PARAM_LINEAR;
@@ -146,12 +87,12 @@ thyns_osc_param_info(struct thyns_osc_params *params,
P(param->id, "%s%s", prefix, "pwm");
P(param->name, "%s", "pwm");
P(param->desc, "%s", "Oscillator's pulse width modulation");
- P(param->display, "%f", params->pwm);
+ P(param->display, "%f", value.f);
param->type = CLAP_PARAM_FLOAT;
param->is_per_note = true;
param->is_used = true;
param->is_periodic = false;
- param->value.f = params->pwm;
+ param->value = value;
param->min.f = 0;
param->max.f = 1;
param->scale = CLAP_PARAM_LINEAR;
@@ -161,12 +102,12 @@ thyns_osc_param_info(struct thyns_osc_params *params,
P(param->id, "%s%s", prefix, "tune");
P(param->name, "%s", "tune");
P(param->desc, "%s", "Oscillator's tunning in semitones");
- P(param->display, "%f", params->pwm);
+ P(param->display, "%f", value.f);
param->type = CLAP_PARAM_FLOAT;
param->is_per_note = true;
param->is_used = true;
param->is_periodic = false;
- param->value.f = params->tune;
+ param->value = value;
param->min.f = -48;
param->max.f = +48;
param->scale = CLAP_PARAM_LINEAR;
@@ -177,12 +118,12 @@ thyns_osc_param_info(struct thyns_osc_params *params,
}
static inline void
-thyns_osc_params_init(struct thyns_osc_params *params)
+thyns_osc_params_init(union clap_param_value *values)
{
- params->waveform = THYNS_OSC_SQUARE;
- params->pwm = 0.5;
- params->phase = 0;
- params->tune = 0;
+ values[THYNS_OSC_PARAM_WAVEFORM].i = THYNS_OSC_SQUARE;
+ values[THYNS_OSC_PARAM_PWM].f = 0.5;
+ values[THYNS_OSC_PARAM_PHASE].f = 0;
+ values[THYNS_OSC_PARAM_TUNE].f = 0;
}
static inline void
@@ -198,16 +139,16 @@ static inline void
thyns_osc_set_freq(struct thyns_osc *osc, double freq)
{
osc->freq = freq;
- osc->angle_ramp = 2 * osc->pi_sr * freq * pow(2, *osc->tune / 12.f);
+ osc->angle_ramp = 2 * osc->pi_sr * freq * pow(2, osc->values[THYNS_OSC_PARAM_TUNE]->f / 12.f);
}
static inline double
thyns_osc_step(struct thyns_osc *osc)
{
osc->angle = fmod(osc->angle + osc->angle_ramp, 2 * M_PI);
- double angle = fmod(osc->angle + *osc->phase, 2 * M_PI);
+ double angle = fmod(osc->angle + osc->values[THYNS_OSC_PARAM_PHASE]->f, 2 * M_PI);
- switch (*osc->waveform) {
+ switch (osc->values[THYNS_OSC_PARAM_WAVEFORM]->i) {
case THYNS_OSC_NONE:
return 0;
diff --git a/examples/thyns/params.h b/examples/thyns/params.h
@@ -3,33 +3,16 @@
struct thyns_params
{
- struct thyns_osc_params osc1;
- struct thyns_osc_params osc2;
+ union clap_param_value values[0];
+ union clap_param_value osc1[THYNS_OSC_PARAM_COUNT];
+ union clap_param_value osc2[THYNS_OSC_PARAM_COUNT];
};
static void
thyns_params_init(struct thyns_params *params)
{
- thyns_osc_params_init(¶ms->osc1);
- thyns_osc_params_init(¶ms->osc2);
+ thyns_osc_params_init(params->osc1);
+ thyns_osc_params_init(params->osc2);
}
-static void
-thyns_params_set(struct thyns_params *params,
- uint32_t index,
- union clap_param_value value)
-{
- if (index < THYNS_OSC_PARAM_COUNT) {
- thyns_osc_param_set(¶ms->osc1, index, value);
- return;
- }
-
- index -= THYNS_OSC_PARAM_COUNT;
- if (index < THYNS_OSC_PARAM_COUNT) {
- thyns_osc_param_set(¶ms->osc2, index, value);
- return;
- }
-}
-
-
#endif /* !PARAMS_H */
diff --git a/examples/thyns/thyns.h b/examples/thyns/thyns.h
@@ -123,7 +123,12 @@ thyns_handle_event(struct thyns *thyns,
case CLAP_EVENT_PARAM_SET:
if (ev->param.is_global)
- thyns_params_set(&thyns->params, ev->param.index, ev->param.value);
+ thyns->params.values[ev->param.index] = ev->param.value;
+ else if (thyns->keys[ev->param.key]) {
+ struct thyns_voice *voice = thyns->keys[ev->param.key];
+ voice->params.values[ev->param.index] = ev->param.value;
+ thyns_voice_use_param(voice, &voice->params, ev->param.index);
+ }
break;
default:
diff --git a/examples/thyns/voice.h b/examples/thyns/voice.h
@@ -65,17 +65,35 @@ static inline void
thyns_voice_params_init(struct thyns_voice *voice,
struct thyns_params *params)
{
+ uint32_t off = 0;
+
// osc1
- voice->osc1.waveform = ¶ms->osc1.waveform;
- voice->osc1.pwm = ¶ms->osc1.pwm;
- voice->osc1.phase = ¶ms->osc1.phase;
- voice->osc1.tune = ¶ms->osc1.tune;
+ for (int i = 0; i < THYNS_OSC_PARAM_COUNT; ++i)
+ voice->osc1.values[i] = params->values + off + i;
+ off += THYNS_OSC_PARAM_COUNT;
// osc2
- voice->osc2.waveform = ¶ms->osc2.waveform;
- voice->osc2.pwm = ¶ms->osc2.pwm;
- voice->osc2.phase = ¶ms->osc2.phase;
- voice->osc2.tune = ¶ms->osc2.tune;
+ for (int i = 0; i < THYNS_OSC_PARAM_COUNT; ++i)
+ voice->osc1.values[i] = params->values + off + i;
+ off += THYNS_OSC_PARAM_COUNT;
+}
+
+static inline void
+thyns_voice_use_param(struct thyns_voice *voice,
+ struct thyns_params *params,
+ uint32_t index)
+{
+ uint32_t i = 0;
+
+ if (index < i + THYNS_OSC_PARAM_COUNT) {
+ voice->osc1.values[index - i] = params->values + index;
+ }
+ i += THYNS_OSC_PARAM_COUNT;
+
+ if (index < i + THYNS_OSC_PARAM_COUNT) {
+ voice->osc2.values[index - i] = params->values + index;
+ }
+ i += THYNS_OSC_PARAM_COUNT;
}
static inline void