clap

CLAP Audio Plugin API
Log | Files | Refs | README | LICENSE

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:
Mexamples/thyns/osc.h | 101+++++++++++++++++--------------------------------------------------------------
Mexamples/thyns/params.h | 27+++++----------------------
Mexamples/thyns/thyns.h | 7++++++-
Mexamples/thyns/voice.h | 34++++++++++++++++++++++++++--------
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 = &params->waveform; - break; - - case THYNS_OSC_PARAM_PHASE: - osc->phase = &params->phase; - break; - - case THYNS_OSC_PARAM_PWM: - osc->pwm = &params->pwm; - break; - - case THYNS_OSC_PARAM_TUNE: - osc->tune = &params->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(&params->osc1); - thyns_osc_params_init(&params->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(&params->osc1, index, value); - return; - } - - index -= THYNS_OSC_PARAM_COUNT; - if (index < THYNS_OSC_PARAM_COUNT) { - thyns_osc_param_set(&params->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 = &params->osc1.waveform; - voice->osc1.pwm = &params->osc1.pwm; - voice->osc1.phase = &params->osc1.phase; - voice->osc1.tune = &params->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 = &params->osc2.waveform; - voice->osc2.pwm = &params->osc2.pwm; - voice->osc2.phase = &params->osc2.phase; - voice->osc2.tune = &params->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