aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/adsr.c38
-rw-r--r--src/adsr_gt.c40
-rw-r--r--src/amp.c4
-rw-r--r--src/branch.c8
-rw-r--r--src/dahdsr.c64
-rw-r--r--src/difference.c50
-rw-r--r--src/fmod.c20
-rw-r--r--src/include/lp4pole_filter.h2
-rw-r--r--src/include/vector_op.h44
-rw-r--r--src/interpolator.c10
-rw-r--r--src/lp4pole.c12
-rw-r--r--src/product.c49
-rw-r--r--src/pulse.c20
-rw-r--r--src/quantiser.c36
-rw-r--r--src/random.c26
-rw-r--r--src/ratio.c22
-rw-r--r--src/sawtooth.c14
-rw-r--r--src/sequencer.c24
-rw-r--r--src/square.c14
-rw-r--r--src/sum.c49
-rw-r--r--src/sync_pulse.c26
-rw-r--r--src/sync_square.c20
-rw-r--r--src/tracker.c40
-rw-r--r--src/triangle.c24
24 files changed, 333 insertions, 323 deletions
diff --git a/src/adsr.c b/src/adsr.c
index 8c2c041..a84469f 100644
--- a/src/adsr.c
+++ b/src/adsr.c
@@ -38,19 +38,19 @@ typedef enum {
} ADSRState;
typedef struct {
- float* signal;
- float* trigger;
- float* attack;
- float* decay;
- float* sustain;
- float* release;
- float* output;
- float srate;
- float inv_srate;
- float from_level;
- float level;
- ADSRState state;
- uint32_t samples;
+ const float* signal;
+ const float* trigger;
+ const float* attack;
+ const float* decay;
+ const float* sustain;
+ const float* release;
+ float* output;
+ float srate;
+ float inv_srate;
+ float from_level;
+ float level;
+ ADSRState state;
+ uint32_t samples;
} Adsr;
static void
@@ -68,22 +68,22 @@ connect_port(LV2_Handle instance,
switch (port) {
case ADSR_SIGNAL:
- plugin->signal = (float*)data;
+ plugin->signal = (const float*)data;
break;
case ADSR_TRIGGER:
- plugin->trigger = (float*)data;
+ plugin->trigger = (const float*)data;
break;
case ADSR_ATTACK:
- plugin->attack = (float*)data;
+ plugin->attack = (const float*)data;
break;
case ADSR_DECAY:
- plugin->decay = (float*)data;
+ plugin->decay = (const float*)data;
break;
case ADSR_SUSTAIN:
- plugin->sustain = (float*)data;
+ plugin->sustain = (const float*)data;
break;
case ADSR_RELEASE:
- plugin->release = (float*)data;
+ plugin->release = (const float*)data;
break;
case ADSR_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/adsr_gt.c b/src/adsr_gt.c
index a660e3e..4f23649 100644
--- a/src/adsr_gt.c
+++ b/src/adsr_gt.c
@@ -38,20 +38,20 @@ typedef enum {
} ADSRState;
typedef struct {
- float* gate;
- float* trigger;
- float* attack;
- float* decay;
- float* sustain;
- float* release;
- float* output;
- float srate;
- float inv_srate;
- float last_trigger;
- float from_level;
- float level;
- ADSRState state;
- uint32_t samples;
+ const float* gate;
+ const float* trigger;
+ const float* attack;
+ const float* decay;
+ const float* sustain;
+ const float* release;
+ float* output;
+ float srate;
+ float inv_srate;
+ float last_trigger;
+ float from_level;
+ float level;
+ ADSRState state;
+ uint32_t samples;
} Adsr;
static void
@@ -69,22 +69,22 @@ connect_port(LV2_Handle instance,
switch (port) {
case ADSR_GATE:
- plugin->gate = (float*)data;
+ plugin->gate = (const float*)data;
break;
case ADSR_TRIGGER:
- plugin->trigger = (float*)data;
+ plugin->trigger = (const float*)data;
break;
case ADSR_ATTACK:
- plugin->attack = (float*)data;
+ plugin->attack = (const float*)data;
break;
case ADSR_DECAY:
- plugin->decay = (float*)data;
+ plugin->decay = (const float*)data;
break;
case ADSR_SUSTAIN:
- plugin->sustain = (float*)data;
+ plugin->sustain = (const float*)data;
break;
case ADSR_RELEASE:
- plugin->release = (float*)data;
+ plugin->release = (const float*)data;
break;
case ADSR_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/amp.c b/src/amp.c
index 5bcd339..96ef690 100644
--- a/src/amp.c
+++ b/src/amp.c
@@ -50,10 +50,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case AMP_GAIN:
- plugin->gain = (float*)data;
+ plugin->gain = (const float*)data;
break;
case AMP_INPUT:
- plugin->input = (float*)data;
+ plugin->input = (const float*)data;
break;
case AMP_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/branch.c b/src/branch.c
index c74e316..5ec0fff 100644
--- a/src/branch.c
+++ b/src/branch.c
@@ -26,9 +26,9 @@
#define BRANCH_OUTPUT2 2
typedef struct {
- float* input;
- float* output1;
- float* output2;
+ const float* input;
+ float* output1;
+ float* output2;
} Branch;
static void
@@ -46,7 +46,7 @@ connect_port(LV2_Handle instance,
switch (port) {
case BRANCH_INPUT:
- plugin->input = (float*)data;
+ plugin->input = (const float*)data;
break;
case BRANCH_OUTPUT1:
plugin->output1 = (float*)data;
diff --git a/src/dahdsr.c b/src/dahdsr.c
index 99f29de..00c1b3e 100644
--- a/src/dahdsr.c
+++ b/src/dahdsr.c
@@ -44,30 +44,30 @@ typedef enum {
} DAHDSRState;
typedef struct {
- float* gate;
- float* trigger;
- float* delay;
- float* attack;
- float* hold;
- float* decay;
- float* sustain;
- float* release;
- float* output;
- float srate;
- float inv_srate;
- float last_gate;
- float last_trigger;
- float from_level;
- float level;
- uint32_t delay_is_cv;
- uint32_t attack_is_cv;
- uint32_t hold_is_cv;
- uint32_t decay_is_cv;
- uint32_t sustain_is_cv;
- uint32_t release_is_cv;
- DAHDSRState state;
- uint32_t samples;
- URIs uris;
+ const float* gate;
+ const float* trigger;
+ const float* delay;
+ const float* attack;
+ const float* hold;
+ const float* decay;
+ const float* sustain;
+ const float* release;
+ float* output;
+ float srate;
+ float inv_srate;
+ float last_gate;
+ float last_trigger;
+ float from_level;
+ float level;
+ uint32_t delay_is_cv;
+ uint32_t attack_is_cv;
+ uint32_t hold_is_cv;
+ uint32_t decay_is_cv;
+ uint32_t sustain_is_cv;
+ uint32_t release_is_cv;
+ DAHDSRState state;
+ uint32_t samples;
+ URIs uris;
} Dahdsr;
static void
@@ -85,28 +85,28 @@ connect_port(LV2_Handle instance,
switch (port) {
case DAHDSR_GATE:
- plugin->gate = (float*)data;
+ plugin->gate = (const float*)data;
break;
case DAHDSR_TRIGGER:
- plugin->trigger = (float*)data;
+ plugin->trigger = (const float*)data;
break;
case DAHDSR_DELAY:
- plugin->delay = (float*)data;
+ plugin->delay = (const float*)data;
break;
case DAHDSR_ATTACK:
- plugin->attack = (float*)data;
+ plugin->attack = (const float*)data;
break;
case DAHDSR_HOLD:
- plugin->hold = (float*)data;
+ plugin->hold = (const float*)data;
break;
case DAHDSR_DECAY:
- plugin->decay = (float*)data;
+ plugin->decay = (const float*)data;
break;
case DAHDSR_SUSTAIN:
- plugin->sustain = (float*)data;
+ plugin->sustain = (const float*)data;
break;
case DAHDSR_RELEASE:
- plugin->release = (float*)data;
+ plugin->release = (const float*)data;
break;
case DAHDSR_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/difference.c b/src/difference.c
index 61a59e9..e886a09 100644
--- a/src/difference.c
+++ b/src/difference.c
@@ -21,19 +21,20 @@
#include "lv2/lv2plug.in/ns/ext/morph/morph.h"
#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
#include "uris.h"
+#include "vector_op.h"
#define DIFFERENCE_MINUEND 0
#define DIFFERENCE_SUBTRAHEND 1
#define DIFFERENCE_DIFFERENCE 2
typedef struct {
- float* minuend;
- float* subtrahend;
- float* difference;
- uint32_t minuend_is_cv;
- uint32_t subtrahend_is_cv;
- uint32_t difference_is_cv;
- URIs uris;
+ const float* minuend;
+ const float* subtrahend;
+ float* difference;
+ uint32_t minuend_is_cv;
+ uint32_t subtrahend_is_cv;
+ uint32_t difference_is_cv;
+ URIs uris;
} Difference;
static void
@@ -51,10 +52,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case DIFFERENCE_MINUEND:
- plugin->minuend = (float*)data;
+ plugin->minuend = (const float*)data;
break;
case DIFFERENCE_SUBTRAHEND:
- plugin->subtrahend = (float*)data;
+ plugin->subtrahend = (const float*)data;
break;
case DIFFERENCE_DIFFERENCE:
plugin->difference = (float*)data;
@@ -97,7 +98,7 @@ port_type(LV2_Handle instance,
uint32_t port,
LV2_Morph_Property*const* properties)
{
- Difference* plugin = (Difference*)instance;
+ const Difference* plugin = (const Difference*)instance;
switch (port) {
case DIFFERENCE_DIFFERENCE:
@@ -133,27 +134,14 @@ static void
run(LV2_Handle instance,
uint32_t sample_count)
{
- Difference* plugin = (Difference*)instance;
-
- /* Minuend (array of floats of length 1 or sample_count) */
- const float* minuend = plugin->minuend;
-
- /* Subtrahend (array of floats of length 1 or sample_count) */
- const float* subtrahend = plugin->subtrahend;
-
- /* Difference (array of floats of length 1 or sample_count) */
- float* difference = plugin->difference;
-
- if (!plugin->difference_is_cv) { /* TODO: Avoid this branch */
- sample_count = 1;
- }
-
- for (uint32_t s = 0; s < sample_count; ++s) {
- const float min = minuend[s * plugin->minuend_is_cv];
- const float sub = subtrahend[s * plugin->subtrahend_is_cv];
-
- difference[s] = min - sub;
- }
+ const Difference* const plugin = (Difference*)instance;
+ const float* const minuend = plugin->minuend;
+ const float* const subtrahend = plugin->subtrahend;
+ float* const difference = plugin->difference;
+
+ VECTOR_OP(-, difference,
+ minuend, plugin->minuend_is_cv,
+ subtrahend, plugin->subtrahend_is_cv);
}
static const void*
diff --git a/src/fmod.c b/src/fmod.c
index de972ce..95c243e 100644
--- a/src/fmod.c
+++ b/src/fmod.c
@@ -28,13 +28,13 @@
#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;
+ const float* frequency;
+ const float* modulator;
+ float* output;
+ uint32_t frequency_is_cv;
+ uint32_t modulator_is_cv;
+ uint32_t output_is_cv;
+ URIs uris;
} Fmod;
static void
@@ -52,10 +52,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case FMOD_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case FMOD_MODULATOR:
- plugin->modulator = (float*)data;
+ plugin->modulator = (const float*)data;
break;
case FMOD_OUTPUT:
plugin->output = (float*)data;
@@ -96,7 +96,7 @@ port_type(LV2_Handle instance,
uint32_t port,
LV2_Morph_Property*const* properties)
{
- Fmod* plugin = (Fmod*)instance;
+ const Fmod* plugin = (const Fmod*)instance;
switch (port) {
case FMOD_OUTPUT:
diff --git a/src/include/lp4pole_filter.h b/src/include/lp4pole_filter.h
index a6b27f1..310fbbe 100644
--- a/src/include/lp4pole_filter.h
+++ b/src/include/lp4pole_filter.h
@@ -110,7 +110,7 @@ static inline float
lp4pole_run(LP4PoleFilter* lpf,
float in)
{
- float abs_in = fabsf(16.0f * in); /* ~24dB unclipped headroom */
+ const float abs_in = fabsf(16.0f * in); /* ~24dB unclipped headroom */
lpf->max_abs_in = f_max(lpf->max_abs_in, abs_in);
diff --git a/src/include/vector_op.h b/src/include/vector_op.h
new file mode 100644
index 0000000..f8ea8dd
--- /dev/null
+++ b/src/include/vector_op.h
@@ -0,0 +1,44 @@
+/*
+ Apply a C arithmetical operator to two sample buffers.
+ Copyright 2012 David Robillard
+
+ This is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This software is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this software. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BLOP_VECTOR_OP_H
+#define BLOP_VECTOR_OP_H
+
+#define VECTOR_OP(op, output, input1, input1_is_cv, input2, input2_is_cv) \
+ switch ((input1_is_cv << 1) + input2_is_cv) { \
+ case 0: /* 00 (control * control) */ \
+ output[0] = input1[0] * input2[0]; \
+ break; \
+ case 1: /* 01 (control * cv) */ \
+ for (uint32_t s = 0; s < sample_count; ++s) { \
+ output[s] = input1[0] * input2[s]; \
+ } \
+ break; \
+ case 2: /* 10 (cv * control) */ \
+ for (uint32_t s = 0; s < sample_count; ++s) { \
+ output[s] = input1[s] * input2[0]; \
+ } \
+ break; \
+ case 3: /* 11 (cv * cv) */ \
+ for (uint32_t s = 0; s < sample_count; ++s) { \
+ output[s] = input1[s] * input2[s]; \
+ } \
+ break; \
+ }
+
+#endif /* BLOP_VECTOR_OP_H */
diff --git a/src/interpolator.c b/src/interpolator.c
index 84ddd5d..e47fbe3 100644
--- a/src/interpolator.c
+++ b/src/interpolator.c
@@ -43,10 +43,10 @@ interpolate(float interval,
}
typedef struct {
- float* input;
- float* output;
- float p1;
- float p0;
+ const float* input;
+ float* output;
+ float p1;
+ float p0;
} Interpolator;
static void
@@ -64,7 +64,7 @@ connect_port(LV2_Handle instance,
switch (port) {
case INTERPOLATOR_INPUT:
- plugin->input = (float*)data;
+ plugin->input = (const float*)data;
break;
case INTERPOLATOR_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/lp4pole.c b/src/lp4pole.c
index 07d8b48..27b1ae0 100644
--- a/src/lp4pole.c
+++ b/src/lp4pole.c
@@ -30,9 +30,9 @@
#define LP4POLE_OUTPUT 3
typedef struct {
- float* cutoff;
- float* resonance;
- float* input;
+ const float* cutoff;
+ const float* resonance;
+ const float* input;
float* output;
LP4PoleFilter* lpf;
uint32_t cutoff_is_cv;
@@ -59,13 +59,13 @@ connect_port(LV2_Handle instance,
switch (port) {
case LP4POLE_CUTOFF:
- plugin->cutoff = (float*)data;
+ plugin->cutoff = (const float*)data;
break;
case LP4POLE_RESONANCE:
- plugin->resonance = (float*)data;
+ plugin->resonance = (const float*)data;
break;
case LP4POLE_INPUT:
- plugin->input = (float*)data;
+ plugin->input = (const float*)data;
break;
case LP4POLE_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/product.c b/src/product.c
index 194a071..ea07ee6 100644
--- a/src/product.c
+++ b/src/product.c
@@ -21,19 +21,20 @@
#include "lv2/lv2plug.in/ns/ext/morph/morph.h"
#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
#include "uris.h"
+#include "vector_op.h"
#define PRODUCT_MULTIPLICAND 0
#define PRODUCT_MULTIPLIER 1
#define PRODUCT_PRODUCT 2
typedef struct {
- float* input1;
- float* input2;
- float* output;
- uint32_t input1_is_cv;
- uint32_t input2_is_cv;
- uint32_t output_is_cv;
- URIs uris;
+ const float* input1;
+ const float* input2;
+ float* output;
+ uint32_t input1_is_cv;
+ uint32_t input2_is_cv;
+ uint32_t output_is_cv;
+ URIs uris;
} Product;
static void
@@ -51,10 +52,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case PRODUCT_MULTIPLICAND:
- plugin->input1 = (float*)data;
+ plugin->input1 = (const float*)data;
break;
case PRODUCT_MULTIPLIER:
- plugin->input2 = (float*)data;
+ plugin->input2 = (const float*)data;
break;
case PRODUCT_PRODUCT:
plugin->output = (float*)data;
@@ -95,7 +96,7 @@ port_type(LV2_Handle instance,
uint32_t port,
LV2_Morph_Property*const* properties)
{
- Product* plugin = (Product*)instance;
+ const Product* plugin = (const Product*)instance;
switch (port) {
case PRODUCT_PRODUCT:
@@ -131,26 +132,14 @@ static void
run(LV2_Handle instance,
uint32_t sample_count)
{
- Product* plugin = (Product*)instance;
-
- /* First Input (array of floats of length 1 or sample_count) */
- const float* input1 = plugin->input1;
-
- /* Second Input (array of floats of length 1 or sample_count) */
- const float* input2 = plugin->input2;
-
- /* Output (array of floats of length sample_count) */
- float* output = plugin->output;
-
- if (!plugin->output_is_cv) { /* TODO: Avoid this branch */
- sample_count = 1;
- }
-
- for (uint32_t s = 0; s < sample_count; ++s) {
- const float in1 = input1[s * plugin->input1_is_cv];
- const float in2 = input2[s * plugin->input2_is_cv];
- output[s] = in1 * in2;
- }
+ const Product* const plugin = (Product*)instance;
+ const float* const input1 = plugin->input1;
+ const float* const input2 = plugin->input2;
+ float* const output = plugin->output;
+
+ VECTOR_OP(*, output,
+ input1, plugin->input1_is_cv,
+ input2, plugin->input2_is_cv);
}
static const void*
diff --git a/src/pulse.c b/src/pulse.c
index bffe4ea..b59caf8 100644
--- a/src/pulse.c
+++ b/src/pulse.c
@@ -28,14 +28,14 @@
#define PULSE_OUTPUT 2
typedef struct {
- float* frequency;
- float* pulsewidth;
- float* output;
- float phase;
- uint32_t frequency_is_cv;
- uint32_t pulsewidth_is_cv;
- Wavedata wdat;
- URIs uris;
+ const float* frequency;
+ const float* pulsewidth;
+ float* output;
+ float phase;
+ uint32_t frequency_is_cv;
+ uint32_t pulsewidth_is_cv;
+ Wavedata wdat;
+ URIs uris;
} Pulse;
static void
@@ -47,10 +47,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case PULSE_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case PULSE_PULSEWIDTH:
- plugin->pulsewidth = (float*)data;
+ plugin->pulsewidth = (const float*)data;
break;
case PULSE_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/quantiser.c b/src/quantiser.c
index ccf9fb3..ed3ae1d 100644
--- a/src/quantiser.c
+++ b/src/quantiser.c
@@ -34,18 +34,18 @@
#define QUANTISER_OUTPUT_CHANGED (QUANTISER_MAX_INPUTS + 7)
typedef struct {
- float* min;
- float* max;
- float* match_range;
- float* mode;
- float* count;
- float* values[QUANTISER_MAX_INPUTS];
- float* input;
- float* output_changed;
- float* output;
- float svalues[QUANTISER_MAX_INPUTS + 2];
- float temp[QUANTISER_MAX_INPUTS + 2];
- float last_found;
+ const float* min;
+ const float* max;
+ const float* match_range;
+ const float* mode;
+ const float* count;
+ const float* values[QUANTISER_MAX_INPUTS];
+ const float* input;
+ float* output_changed;
+ float* output;
+ float svalues[QUANTISER_MAX_INPUTS + 2];
+ float temp[QUANTISER_MAX_INPUTS + 2];
+ float last_found;
} Quantiser;
/*
@@ -170,22 +170,22 @@ connect_port(LV2_Handle instance,
switch (port) {
case QUANTISER_RANGE_MIN:
- plugin->min = (float*)data;
+ plugin->min = (const float*)data;
break;
case QUANTISER_RANGE_MAX:
- plugin->max = (float*)data;
+ plugin->max = (const float*)data;
break;
case QUANTISER_MATCH_RANGE:
- plugin->match_range = (float*)data;
+ plugin->match_range = (const float*)data;
break;
case QUANTISER_MODE:
- plugin->mode = (float*)data;
+ plugin->mode = (const float*)data;
break;
case QUANTISER_COUNT:
- plugin->count = (float*)data;
+ plugin->count = (const float*)data;
break;
case QUANTISER_INPUT:
- plugin->input = (float*)data;
+ plugin->input = (const float*)data;
break;
case QUANTISER_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/random.c b/src/random.c
index 8737bff..2239d48 100644
--- a/src/random.c
+++ b/src/random.c
@@ -30,17 +30,17 @@
#define RANDOM_OUTPUT 2
typedef struct {
- float* frequency;
- float* smooth;
- float* output;
- float nyquist;
- float inv_nyquist;
- float phase;
- float value1;
- float value2;
- uint32_t frequency_is_cv;
- uint32_t smooth_is_cv;
- URIs uris;
+ const float* frequency;
+ const float* smooth;
+ float* output;
+ float nyquist;
+ float inv_nyquist;
+ float phase;
+ float value1;
+ float value2;
+ uint32_t frequency_is_cv;
+ uint32_t smooth_is_cv;
+ URIs uris;
} Random;
float inv_rand_max;
@@ -60,10 +60,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case RANDOM_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case RANDOM_SMOOTH:
- plugin->smooth = (float*)data;
+ plugin->smooth = (const float*)data;
break;
case RANDOM_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/ratio.c b/src/ratio.c
index 567cca6..57cb6a5 100644
--- a/src/ratio.c
+++ b/src/ratio.c
@@ -29,13 +29,13 @@
#define RATIO_OUTPUT 2
typedef struct {
- float* numerator;
- float* denominator;
- float* output;
- uint32_t numerator_is_cv;
- uint32_t denominator_is_cv;
- uint32_t output_is_cv;
- URIs uris;
+ const float* numerator;
+ const float* denominator;
+ float* output;
+ uint32_t numerator_is_cv;
+ uint32_t denominator_is_cv;
+ uint32_t output_is_cv;
+ URIs uris;
} Ratio;
static void
@@ -53,10 +53,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case RATIO_NUMERATOR:
- plugin->numerator = (float*)data;
+ plugin->numerator = (const float*)data;
break;
case RATIO_DENOMINATOR:
- plugin->denominator = (float*)data;
+ plugin->denominator = (const float*)data;
break;
case RATIO_OUTPUT:
plugin->output = (float*)data;
@@ -97,7 +97,7 @@ port_type(LV2_Handle instance,
uint32_t port,
LV2_Morph_Property*const* properties)
{
- Ratio* plugin = (Ratio*)instance;
+ const Ratio* plugin = (const Ratio*)instance;
switch (port) {
case RATIO_OUTPUT:
@@ -138,7 +138,7 @@ run(LV2_Handle instance,
const float* numerator = plugin->numerator;
/* Denominator (array of floats of length sample_count) */
- float* denominator = plugin->denominator;
+ const float* denominator = plugin->denominator;
/* Output (array of floats of length sample_count) */
float* output = plugin->output;
diff --git a/src/sawtooth.c b/src/sawtooth.c
index 7106830..8667f73 100644
--- a/src/sawtooth.c
+++ b/src/sawtooth.c
@@ -27,12 +27,12 @@
#define SAWTOOTH_OUTPUT 1
typedef struct {
- float* frequency;
- float* output;
- float phase;
- uint32_t frequency_is_cv;
- Wavedata wdat;
- URIs uris;
+ const float* frequency;
+ float* output;
+ float phase;
+ uint32_t frequency_is_cv;
+ Wavedata wdat;
+ URIs uris;
} Sawtooth;
static void
@@ -44,7 +44,7 @@ connect_port(LV2_Handle instance,
switch (port) {
case SAWTOOTH_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case SAWTOOTH_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/sequencer.c b/src/sequencer.c
index ec218bb..939401b 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -32,12 +32,12 @@
#define SEQUENCER_OUTPUT (SEQUENCER_MAX_INPUTS + 5)
typedef struct {
- float* gate;
- float* trigger;
- float* loop_steps;
- float* reset;
- float* value_gate_closed;
- float* values[SEQUENCER_MAX_INPUTS];
+ const float* gate;
+ const float* trigger;
+ const float* loop_steps;
+ const float* reset;
+ const float* value_gate_closed;
+ const float* values[SEQUENCER_MAX_INPUTS];
float* output;
float srate;
float inv_srate;
@@ -62,26 +62,26 @@ connect_port(LV2_Handle instance,
switch (port) {
case SEQUENCER_GATE:
- plugin->gate = (float*)data;
+ plugin->gate = (const float*)data;
break;
case SEQUENCER_TRIGGER:
- plugin->trigger = (float*)data;
+ plugin->trigger = (const float*)data;
break;
case SEQUENCER_LOOP_POINT:
- plugin->loop_steps = (float*)data;
+ plugin->loop_steps = (const float*)data;
break;
case SEQUENCER_OUTPUT:
plugin->output = (float*)data;
break;
case SEQUENCER_RESET:
- plugin->reset = (float*)data;
+ plugin->reset = (const float*)data;
break;
case SEQUENCER_VALUE_GATE_CLOSED:
- plugin->value_gate_closed = (float*)data;
+ plugin->value_gate_closed = (const float*)data;
break;
default:
if (port >= SEQUENCER_VALUE_START && port < SEQUENCER_OUTPUT) {
- plugin->values[port - SEQUENCER_VALUE_START] = (float*)data;
+ plugin->values[port - SEQUENCER_VALUE_START] = (const float*)data;
}
break;
}
diff --git a/src/square.c b/src/square.c
index e7cb941..1425114 100644
--- a/src/square.c
+++ b/src/square.c
@@ -27,12 +27,12 @@
#define SQUARE_OUTPUT 1
typedef struct {
- float* frequency;
- float* output;
- float phase;
- uint32_t frequency_is_cv;
- Wavedata wdat;
- URIs uris;
+ const float* frequency;
+ float* output;
+ float phase;
+ uint32_t frequency_is_cv;
+ Wavedata wdat;
+ URIs uris;
} Square;
static void
@@ -44,7 +44,7 @@ connect_port(LV2_Handle instance,
switch (port) {
case SQUARE_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case SQUARE_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/sum.c b/src/sum.c
index 5c9c1c6..5665447 100644
--- a/src/sum.c
+++ b/src/sum.c
@@ -21,19 +21,20 @@
#include "lv2/lv2plug.in/ns/ext/morph/morph.h"
#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
#include "uris.h"
+#include "vector_op.h"
#define SUM_INPUT1 0
#define SUM_INPUT2 1
#define SUM_OUTPUT 2
typedef struct {
- float* input1;
- float* input2;
- float* output;
- uint32_t input1_is_cv;
- uint32_t input2_is_cv;
- uint32_t output_is_cv;
- URIs uris;
+ const float* input1;
+ const float* input2;
+ float* output;
+ uint32_t input1_is_cv;
+ uint32_t input2_is_cv;
+ uint32_t output_is_cv;
+ URIs uris;
} Sum;
static void
@@ -51,10 +52,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case SUM_INPUT1:
- plugin->input1 = (float*)data;
+ plugin->input1 = (const float*)data;
break;
case SUM_INPUT2:
- plugin->input2 = (float*)data;
+ plugin->input2 = (const float*)data;
break;
case SUM_OUTPUT:
plugin->output = (float*)data;
@@ -95,7 +96,7 @@ port_type(LV2_Handle instance,
uint32_t port,
LV2_Morph_Property*const* properties)
{
- Sum* plugin = (Sum*)instance;
+ const Sum* plugin = (const Sum*)instance;
switch (port) {
case SUM_OUTPUT:
@@ -130,26 +131,14 @@ static void
run(LV2_Handle instance,
uint32_t sample_count)
{
- Sum* plugin = (Sum*)instance;
-
- /* First Input (array of floats of length sample_count) */
- const float* input1 = plugin->input1;
-
- /* Second Input (array of floats of length sample_count) */
- const float* input2 = plugin->input2;
-
- /* Output (array of floats of length sample_count) */
- float* output = plugin->output;
-
- if (!plugin->output_is_cv) { /* TODO: Avoid this branch */
- sample_count = 1;
- }
-
- for (uint32_t s = 0; s < sample_count; ++s) {
- const float in1 = input1[s * plugin->input1_is_cv];
- const float in2 = input2[s * plugin->input2_is_cv];
- output[s] = in1 + in2;
- }
+ const Sum* const plugin = (Sum*)instance;
+ const float* const input1 = plugin->input1;
+ const float* const input2 = plugin->input2;
+ float* const output = plugin->output;
+
+ VECTOR_OP(+, output,
+ input1, plugin->input1_is_cv,
+ input2, plugin->input2_is_cv);
}
static const void*
diff --git a/src/sync_pulse.c b/src/sync_pulse.c
index 719115f..b1be0ac 100644
--- a/src/sync_pulse.c
+++ b/src/sync_pulse.c
@@ -30,15 +30,15 @@
#define SYNCPULSE_OUTPUT 3
typedef struct {
- float* frequency;
- float* pulsewidth;
- float* gate;
- float* output;
- float srate;
- float phase;
- uint32_t frequency_is_cv;
- uint32_t pulsewidth_is_cv;
- URIs uris;
+ const float* frequency;
+ const float* pulsewidth;
+ const float* gate;
+ float* output;
+ float srate;
+ float phase;
+ uint32_t frequency_is_cv;
+ uint32_t pulsewidth_is_cv;
+ URIs uris;
} SyncPulse;
static void
@@ -56,13 +56,13 @@ connect_port(LV2_Handle instance,
switch (port) {
case SYNCPULSE_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case SYNCPULSE_PULSEWIDTH:
- plugin->pulsewidth = (float*)data;
+ plugin->pulsewidth = (const float*)data;
break;
case SYNCPULSE_GATE:
- plugin->gate = (float*)data;
+ plugin->gate = (const float*)data;
break;
case SYNCPULSE_OUTPUT:
plugin->output = (float*)data;
@@ -133,7 +133,7 @@ run(LV2_Handle instance,
const float* frequency = plugin->frequency;
/* Pulse Width (array of float of length sample_count) */
- float* pulsewidth = plugin->pulsewidth;
+ const float* pulsewidth = plugin->pulsewidth;
/* Gate (array of float of length sample_count) */
const float* gate = plugin->gate;
diff --git a/src/sync_square.c b/src/sync_square.c
index f3c5ce8..4ac7d1a 100644
--- a/src/sync_square.c
+++ b/src/sync_square.c
@@ -28,14 +28,14 @@
#define SYNCSQUARE_OUTPUT 2
typedef struct {
- float* frequency;
- float* gate;
- float* output;
- float srate;
- float nyquist;
- float phase;
- uint32_t frequency_is_cv;
- URIs uris;
+ const float* frequency;
+ const float* gate;
+ float* output;
+ float srate;
+ float nyquist;
+ float phase;
+ uint32_t frequency_is_cv;
+ URIs uris;
} SyncSquare;
static void
@@ -53,10 +53,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case SYNCSQUARE_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case SYNCSQUARE_GATE:
- plugin->gate = (float*)data;
+ plugin->gate = (const float*)data;
break;
case SYNCSQUARE_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/tracker.c b/src/tracker.c
index 84742d2..3ff92c6 100644
--- a/src/tracker.c
+++ b/src/tracker.c
@@ -32,20 +32,20 @@
#define TRACKER_OUTPUT 6
typedef struct {
- float* gate;
- float* hattack;
- float* hdecay;
- float* lattack;
- float* ldecay;
- float* input;
- float* output;
- float coeff;
- float last_value;
- uint32_t hattack_is_cv;
- uint32_t hdecay_is_cv;
- uint32_t lattack_is_cv;
- uint32_t ldecay_is_cv;
- URIs uris;
+ const float* gate;
+ const float* hattack;
+ const float* hdecay;
+ const float* lattack;
+ const float* ldecay;
+ const float* input;
+ float* output;
+ float coeff;
+ float last_value;
+ uint32_t hattack_is_cv;
+ uint32_t hdecay_is_cv;
+ uint32_t lattack_is_cv;
+ uint32_t ldecay_is_cv;
+ URIs uris;
} Tracker;
static void
@@ -63,22 +63,22 @@ connect_port(LV2_Handle instance,
switch (port) {
case TRACKER_GATE:
- plugin->gate = (float*)data;
+ plugin->gate = (const float*)data;
break;
case TRACKER_HATTACK:
- plugin->hattack = (float*)data;
+ plugin->hattack = (const float*)data;
break;
case TRACKER_HDECAY:
- plugin->hdecay = (float*)data;
+ plugin->hdecay = (const float*)data;
break;
case TRACKER_LATTACK:
- plugin->lattack = (float*)data;
+ plugin->lattack = (const float*)data;
break;
case TRACKER_LDECAY:
- plugin->ldecay = (float*)data;
+ plugin->ldecay = (const float*)data;
break;
case TRACKER_INPUT:
- plugin->input = (float*)data;
+ plugin->input = (const float*)data;
break;
case TRACKER_OUTPUT:
plugin->output = (float*)data;
diff --git a/src/triangle.c b/src/triangle.c
index 1189b06..fb03f7b 100644
--- a/src/triangle.c
+++ b/src/triangle.c
@@ -28,16 +28,16 @@
#define TRIANGLE_OUTPUT 2
typedef struct {
- float* frequency;
- float* slope;
- float* output;
- float phase;
- float min_slope;
- float max_slope;
- uint32_t frequency_is_cv;
- uint32_t slope_is_cv;
- Wavedata wdat;
- URIs uris;
+ const float* frequency;
+ const float* slope;
+ float* output;
+ float phase;
+ float min_slope;
+ float max_slope;
+ uint32_t frequency_is_cv;
+ uint32_t slope_is_cv;
+ Wavedata wdat;
+ URIs uris;
} Triangle;
static void
@@ -49,10 +49,10 @@ connect_port(LV2_Handle instance,
switch (port) {
case TRIANGLE_FREQUENCY:
- plugin->frequency = (float*)data;
+ plugin->frequency = (const float*)data;
break;
case TRIANGLE_SLOPE:
- plugin->slope = (float*)data;
+ plugin->slope = (const float*)data;
break;
case TRIANGLE_OUTPUT:
plugin->output = (float*)data;