diff options
Diffstat (limited to 'src/fmod.c')
-rw-r--r-- | src/fmod.c | 162 |
1 files changed, 87 insertions, 75 deletions
@@ -18,23 +18,17 @@ */ #include <stdlib.h> -#include "lv2/lv2plug.in/ns/ext/morph/morph.h" #include "lv2/lv2plug.in/ns/lv2core/lv2.h" #include "math_func.h" -#include "uris.h" #define FMOD_FREQUENCY 0 #define FMOD_MODULATOR 1 #define FMOD_OUTPUT 2 typedef struct { - float* frequency; - float* modulator; - float* output; - uint32_t frequency_is_cv; - uint32_t modulator_is_cv; - uint32_t output_is_cv; - URIs uris; + float* frequency; + float* modulator; + float* output; } Fmod; static void @@ -63,50 +57,6 @@ connect_port(LV2_Handle instance, } } -static LV2_Morph_Status -morph_port(LV2_Handle instance, - uint32_t port, - LV2_URID type, - const LV2_Morph_Property*const* properties) -{ - Fmod* plugin = (Fmod*)instance; - - if (type != plugin->uris.lv2_ControlPort && - type != plugin->uris.lv2_CVPort) { - return LV2_MORPH_ERR_BAD_TYPE; - } - - switch (port) { - case FMOD_FREQUENCY: - plugin->frequency_is_cv = (type == plugin->uris.lv2_CVPort); - break; - case FMOD_MODULATOR: - plugin->modulator_is_cv = (type == plugin->uris.lv2_CVPort); - break; - default: - return LV2_MORPH_ERR_BAD_PORT; - } - - return LV2_MORPH_SUCCESS; -} - -static LV2_URID -port_type(LV2_Handle instance, - uint32_t port, - LV2_Morph_Property*const* properties) -{ - Fmod* plugin = (Fmod*)instance; - - switch (port) { - case FMOD_FREQUENCY: - return (plugin->output_is_cv - ? plugin->uris.lv2_CVPort - : plugin->uris.lv2_ControlPort); - default: - return 0; - } -} - static LV2_Handle instantiate(const LV2_Descriptor* descriptor, double sample_rate, @@ -115,59 +65,121 @@ instantiate(const LV2_Descriptor* descriptor, { Fmod* plugin = (Fmod*)malloc(sizeof(Fmod)); - plugin->frequency_is_cv = 0; - plugin->modulator_is_cv = 0; - return (LV2_Handle)plugin; } static void -run(LV2_Handle instance, - uint32_t sample_count) +runFmod_fama_oa(LV2_Handle instance, + uint32_t sample_count) { Fmod* plugin = (Fmod*)instance; - /* Frequency to Modulate (array of floats of length 1 or sample_count) */ + /* Frequency to Modulate (array of floats of length sample_count) */ const float* frequency = plugin->frequency; - /* LFO Input (array of floats of length 1 or sample_count) */ + /* LFO Input (array of floats of length sample_count) */ const float* modulator = plugin->modulator; - /* Output Frequency (array of floats of length 1 or sample_count) */ + /* Output Frequency (array of floats of length sample_count) */ float* output = plugin->output; - if (!plugin->output_is_cv) { /* TODO: Avoid this branch */ - sample_count = 1; + float freq; + float mod; + float scale; + + for (uint32_t s = 0; s < sample_count; ++s) { + freq = frequency[s]; + mod = modulator[s]; + + scale = (float)EXPF(M_LN2 * mod); + + output[s] = scale * freq; } +} + +static void +runFmod_famc_oa(LV2_Handle instance, + uint32_t sample_count) +{ + Fmod* plugin = (Fmod*)instance; + + /* Frequency to Modulate (array of floats of length sample_count) */ + const float* frequency = plugin->frequency; + + /* Shift (Octaves) (float value) */ + const float modulator = *(plugin->modulator); + + /* Output Frequency (array of floats of length sample_count) */ + float* output = plugin->output; + + float freq; + float scale = (float)EXPF(M_LN2 * modulator); for (uint32_t s = 0; s < sample_count; ++s) { - const float freq = frequency[s * plugin->frequency_is_cv]; - const float mod = modulator[s * plugin->modulator_is_cv]; - const float scale = (float)EXPF(M_LN2 * mod); + freq = frequency[s]; output[s] = scale * freq; } } -static const void* -extension_data(const char* uri) +static void +runFmod_fcma_oa(LV2_Handle instance, + uint32_t sample_count) { - static const LV2_Morph_Interface morph = { morph_port, port_type }; - if (!strcmp(uri, LV2_MORPH__interface)) { - return &morph; + Fmod* plugin = (Fmod*)instance; + + /* Frequency to Modulate (float value) */ + const float frequency = *(plugin->frequency); + + /* LFO Input (array of floats of length sample_count) */ + const float* modulator = plugin->modulator; + + /* Output Frequency (array of floats of length sample_count) */ + float* output = plugin->output; + + float mod; + float scale; + + for (uint32_t s = 0; s < sample_count; ++s) { + mod = modulator[s]; + + scale = (float)EXPF(M_LN2 * mod); + + output[s] = scale * frequency; } - return NULL; +} + +static void +runFmod_fcmc_oc(LV2_Handle instance, + uint32_t sample_count) +{ + Fmod* plugin = (Fmod*)instance; + + /* Frequency to Modulate (float value) */ + const float frequency = *(plugin->frequency); + + /* Shift (Octaves) (float value) */ + const float modulator = *(plugin->modulator); + + /* Output Frequency (pointer to float value) */ + float* output = plugin->output; + + float scale; + + scale = (float)EXPF(M_LN2 * modulator); + + output[0] = scale * frequency; } static const LV2_Descriptor descriptor = { - "http://drobilla.net/plugins/blop/fmod", + "http://drobilla.net/plugins/blip/fmod", instantiate, connect_port, NULL, - run, + runFmod_fcmc_oc, NULL, cleanup, - extension_data, + NULL, }; LV2_SYMBOL_EXPORT const LV2_Descriptor* |