From c8fcc8e7785635df91001781fa9926118ee51d55 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 1 Feb 2013 15:23:45 +0000 Subject: [PATCH] Initial import --- .gitignore | 2 + ptap/Makefile | 31 ++ ptap/ducker.c | 90 ++++++ ptap/ducker.ttl | 66 ++++ ptap/manifest.ttl | 7 + ptap/ptap.c | 228 ++++++++++++++ ptap/ptap.ttl | 763 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1187 insertions(+) create mode 100644 .gitignore create mode 100644 ptap/Makefile create mode 100644 ptap/ducker.c create mode 100644 ptap/ducker.ttl create mode 100644 ptap/manifest.ttl create mode 100644 ptap/ptap.c create mode 100644 ptap/ptap.ttl diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d22eb4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +*.so diff --git a/ptap/Makefile b/ptap/Makefile new file mode 100644 index 0000000..e8002b7 --- /dev/null +++ b/ptap/Makefile @@ -0,0 +1,31 @@ +CFLAGS := -Wall -O3 -g -D_GNU_SOURCE +LDFLAGS := -lm + +CFLAGS += `pkg-config lv2core --cflags` +LDFLAGS += `pkg-config lv2ore --libs` + +PTAPSRC := ptap.c +PTAPOBJ := $(PTAPSRC:.c=.o) +PTAPO := ptap.so + +DUCKERSRC := ducker.c +DUCKEROBJ := $(DUCKERSRC:.c=.o) +DUCKERO := ducker.so + +all: $(PTAPO) $(DUCKERO) + +clean: + rm $(PTAPOBJ) $(PTAPO) $(DUCKEROBJ) $(DUCKERO) + +depend: + makedepend $(PTAPSRC) $(DUCKERSRC) + +$(PTAPO): $(PTAPOBJ) + $(CC) -shared -fPIC -Wl,-soname,$(PTAPO) $(PTAPOBJ) -o $@ + +$(DUCKERO): $(DUCKEROBJ) + $(CC) -shared -fPIC -Wl,-soname,$(DUCKERO) $(DUCKEROBJ) -o $@ + +.c.o: + $(CC) -c -fPIC $(CFLAGS) $< -o $@ + diff --git a/ptap/ducker.c b/ptap/ducker.c new file mode 100644 index 0000000..0df4523 --- /dev/null +++ b/ptap/ducker.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include + +struct ducker +{ + double sample_rate; + float on_factor; + float off_factor; + + float *in_main_l; + float *in_main_r; + float *in_aux_l; + float *in_aux_r; + float *out_l; + float *out_r; +}; + +static LV2_Handle ducker_instantiate( + const LV2_Descriptor *descriptor, + double sample_rate, + const char *bundle_path, + const LV2_Feature *const *host_features) +{ + /* Allocate local data */ + struct ducker *d = malloc(sizeof *d); + if (d == NULL) { + return NULL; + } + + memset(d, 0, sizeof *d); + + d->sample_rate = sample_rate; + + d->on_factor = 0.0006f * 44100.0f / sample_rate; + d->off_factor = 0.00028f * 44100.0f / sample_rate; + + return (LV2_Handle)d; +} + +static void ducker_connect_port(LV2_Handle lv2instance, uint32_t port, void *data) +{ + struct ducker *d = (struct ducker *)lv2instance; + + /* Audio ports */ + switch (port) { + case 0: d->in_main_l = data; break; + case 1: d->in_main_r = data; break; + case 2: d->in_aux_l = data; break; + case 3: d->in_aux_r = data; break; + case 4: d->out_l = data; break; + case 5: d->out_r = data; break; + } +} + +static void ducker_run(LV2_Handle lv2instance, uint32_t sample_count) +{ + struct ducker *d = (struct ducker *)lv2instance; + + while (sample_count--) { + } +} + +static void ducker_cleanup(LV2_Handle lv2instance) +{ + struct ducker *d = (struct ducker *)lv2instance; + + free(d); +} + +static const LV2_Descriptor s_lv2descriptor = +{ + .URI = "http://fuzzle.org/~petern/ducker/1", + .instantiate = &ducker_instantiate, + .connect_port = &ducker_connect_port, + .run = &ducker_run, + .cleanup = &ducker_cleanup, +}; + +const LV2_Descriptor *lv2_descriptor(uint32_t index) +{ + if (index == 0) { + return &s_lv2descriptor; + } + + return NULL; +} diff --git a/ptap/ducker.ttl b/ptap/ducker.ttl new file mode 100644 index 0000000..33dfdab --- /dev/null +++ b/ptap/ducker.ttl @@ -0,0 +1,66 @@ +@prefix lv2: . +@prefix foaf: . +@prefix doap: . +@prefix lv2ev: . + + + a lv2:Plugin; + doap:maintainer [ + foaf:name "Peter Nelson"; + foaf:homepage ; + foaf:mbox ; + ]; + doap:name "PTap"; + doap:license ; + + lv2:port [ + a lv2:InputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 0; + lv2:symbol "in L"; + lv2:name "Main Input L"; + ], + [ + a lv2:InputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 1; + lv2:symbol "in R"; + lv2:name "Main Input R"; + ], + [ + a lv2:InputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 2; + lv2:symbol "aux L"; + lv2:name "Aux Input R"; + ], + [ + a lv2:InputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 3; + lv2:symbol "aux R"; + lv2:name "Aux Input R"; + ], + [ + a lv2:OutputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 4; + lv2:symbol "out L"; + lv2:name "Output L"; + ], + [ + a lv2:OutputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 5; + lv2:symbol "out R"; + lv2:name "Output R"; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 4; + lv2:symbol "t1_1_gain"; + lv2:name "Tap 1_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ]. diff --git a/ptap/manifest.ttl b/ptap/manifest.ttl new file mode 100644 index 0000000..aa5f2dc --- /dev/null +++ b/ptap/manifest.ttl @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin, lv2:DelayPlugin; + lv2:binary ; + rdfs:seeAlso . diff --git a/ptap/ptap.c b/ptap/ptap.c new file mode 100644 index 0000000..2a44c06 --- /dev/null +++ b/ptap/ptap.c @@ -0,0 +1,228 @@ +#include +#include +#include +#include +#include +#include + +#define CHANNELS 2 +#define TAPS 6 +#define BUFFER_SECONDS 10 + +struct tap_t { + float *t_gain[TAPS]; + float *l_gain; + float *r_gain; + float *gain; + float *delay; +}; + +static const int CONTROLS_PER_TAP = sizeof (struct tap_t) / sizeof (float *); + +struct ptap_t +{ + double sample_rate; + size_t buffer_max; + + struct tap_t tap[TAPS]; + struct tap_t l_out; + struct tap_t r_out; + + float *buffers[TAPS]; ///< Tap audio buffers + float *rp[TAPS]; ///< Read pointers + float *wp[TAPS]; ///< Write pointers + + float *in_l; + float *in_r; + float *out_l; + float *out_r; +}; + +static LV2_Handle ptap_instantiate( + const LV2_Descriptor *descriptor, + double sample_rate, + const char *bundle_path, + const LV2_Feature *const *host_features) +{ + /* Allocate local data */ + struct ptap_t *ptap = malloc(sizeof *ptap); + if (ptap == NULL) { + return NULL; + } + + memset(ptap, 0, sizeof *ptap); + + ptap->sample_rate = sample_rate; + ptap->buffer_max = ptap->sample_rate * BUFFER_SECONDS + 1; + + int i, j; + for (i = 0; i < TAPS; i++) { + ptap->buffers[i] = malloc(ptap->buffer_max * sizeof (float)); + + if (ptap->buffers[i] == NULL) { + for (j = 0; j < i; j++) { + free(ptap->buffers[i]); + } + free(ptap); + + printf("Failed to allocate buffers\n"); + return NULL; + } + + memset(ptap->buffers[i], 0, ptap->buffer_max * sizeof (float)); + + ptap->rp[i] = ptap->buffers[i]; + ptap->wp[i] = ptap->buffers[i]; + } + + return (LV2_Handle)ptap; +} + +static void ptap_connect_port(LV2_Handle lv2instance, uint32_t port, void *data) +{ + struct ptap_t *ptap = (struct ptap_t *)lv2instance; + struct tap_t *tap; + + /* Audio ports */ + if (port < 4) { + switch (port) { + case 0: ptap->in_l = data; break; + case 1: ptap->in_r = data; break; + case 2: ptap->out_l = data; break; + case 3: ptap->out_r = data; break; + } + return; + } + + port -= 4; + + int tap_index = port / CONTROLS_PER_TAP; + + if (tap_index < TAPS) { + tap = &ptap->tap[tap_index]; + } else if (tap_index - TAPS == 0) { + tap = &ptap->l_out; + } else if (tap_index - TAPS == 1) { + tap = &ptap->r_out; + } else { + return; + } + + int tap_port = port % CONTROLS_PER_TAP; + + if (tap_port < TAPS) { + tap->t_gain[tap_port] = data; + } else if (tap_port - TAPS == 0) { + tap->l_gain = data; + } else if (tap_port - TAPS == 1) { + tap->r_gain = data; + } else if (tap_port - TAPS == 2) { + tap->gain = data; + } else if (tap_port - TAPS == 3) { + tap->delay = data; + } else { + return; + } +} + +static void ptap_run(LV2_Handle lv2instance, uint32_t sample_count) +{ + struct ptap_t *ptap = (struct ptap_t *)lv2instance; + const struct tap_t *tap; + float *wp; + int i, j; + + /* Position read pointers behind write pointers */ + for (i = 0; i < TAPS; i++) { + int delay = *ptap->tap[i].delay * ptap->sample_rate; + ptap->rp[i] = ptap->wp[i] - delay; + if (ptap->rp[i] < ptap->buffers[i]) { + ptap->rp[i] += ptap->buffer_max; + } + } + + float *il = ptap->in_l; + float *ir = ptap->in_r; + float *ol = ptap->out_l; + float *or = ptap->out_r; + + while (sample_count--) { + for (i = 0; i < TAPS; i++) { + wp = ptap->wp[i]; + tap = &ptap->tap[i]; + + *wp = *il * *tap->l_gain; + *wp += *ir * *tap->r_gain; + for (j = 0; j < TAPS; j++) { + *wp += *ptap->rp[j] * *tap->t_gain[j]; + } + *wp *= *tap->gain; + } + + /* Write to left output */ + tap = &ptap->l_out; + *ol = *il * *tap->l_gain; + *ol += *ir * *tap->r_gain; + for (j = 0; j < TAPS; j++) { + *ol += *ptap->rp[j] * *tap->t_gain[j]; + } + *ol *= *tap->gain; + + /* Write to right output */ + tap = &ptap->r_out; + *or = *il * *tap->l_gain; + *or += *ir * *tap->r_gain; + for (j = 0; j < TAPS; j++) { + *or += *ptap->rp[j] * *tap->t_gain[j]; + } + *or *= *tap->gain; + + /* Progress read pointers */ + for (i = 0; i < TAPS; i++) { + ptap->wp[i]++; + if (ptap->wp[i] >= ptap->buffers[i] + ptap->buffer_max) { + ptap->wp[i] = ptap->buffers[i]; + } + + ptap->rp[i]++; + if (ptap->rp[i] >= ptap->buffers[i] + ptap->buffer_max) { + ptap->rp[i] = ptap->buffers[i]; + } + } + + il++; + ir++; + ol++; + or++; + } +} + +static void ptap_cleanup(LV2_Handle lv2instance) +{ + struct ptap_t *ptap = (struct ptap_t *)lv2instance; + + int i; + for (i = 0; i < TAPS; i++) { + free(ptap->buffers[i]); + } + + free(ptap); +} + +static const LV2_Descriptor s_lv2descriptor = +{ + .URI = "http://fuzzle.org/~petern/ptap/1", + .instantiate = &ptap_instantiate, + .connect_port = &ptap_connect_port, + .run = &ptap_run, + .cleanup = &ptap_cleanup, +}; + +const LV2_Descriptor *lv2_descriptor(uint32_t index) +{ + if (index == 0) { + return &s_lv2descriptor; + } + + return NULL; +} diff --git a/ptap/ptap.ttl b/ptap/ptap.ttl new file mode 100644 index 0000000..ad75782 --- /dev/null +++ b/ptap/ptap.ttl @@ -0,0 +1,763 @@ +@prefix lv2: . +@prefix foaf: . +@prefix doap: . +@prefix lv2ev: . + + + a lv2:Plugin; + doap:maintainer [ + foaf:name "Peter Nelson"; + foaf:homepage ; + foaf:mbox ; + ]; + doap:name "PTap"; + doap:license ; + + lv2:port [ + a lv2:InputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 0; + lv2:symbol "in_left"; + lv2:name "Audio Input L"; + ], + [ + a lv2:InputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 1; + lv2:symbol "in_right"; + lv2:name "Audio Input R"; + ], + [ + a lv2:OutputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 2; + lv2:symbol "out_left"; + lv2:name "Audio Output L"; + ], + [ + a lv2:OutputPort, lv2:AudioPort; + lv2:datatype lv2:float; + lv2:index 3; + lv2:symbol "out_right"; + lv2:name "Audio Output R"; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 4; + lv2:symbol "t1_1_gain"; + lv2:name "Tap 1_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 5; + lv2:symbol "t1_2_gain"; + lv2:name "Tap 1_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 6; + lv2:symbol "t1_3_gain"; + lv2:name "Tap 1_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 7; + lv2:symbol "t1_4_gain"; + lv2:name "Tap 1_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 8; + lv2:symbol "t1_5_gain"; + lv2:name "Tap 1_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 9; + lv2:symbol "t1_6_gain"; + lv2:name "Tap 1_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 10; + lv2:symbol "t1_l_gain"; + lv2:name "Tap 1_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 11; + lv2:symbol "t1_r_gain"; + lv2:name "Tap 1_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 12; + lv2:symbol "t1_gain"; + lv2:name "Tap 1_Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 13; + lv2:symbol "t1_delay"; + lv2:name "Tap 1_Delay"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 10; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 14; + lv2:symbol "t2_1_gain"; + lv2:name "Tap 2_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 15; + lv2:symbol "t2_2_gain"; + lv2:name "Tap 2_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 16; + lv2:symbol "t2_3_gain"; + lv2:name "Tap 2_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 17; + lv2:symbol "t2_4_gain"; + lv2:name "Tap 2_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 18; + lv2:symbol "t2_5_gain"; + lv2:name "Tap 2_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 19; + lv2:symbol "t2_6_gain"; + lv2:name "Tap 2_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 20; + lv2:symbol "t2_l_gain"; + lv2:name "Tap 2_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 21; + lv2:symbol "t2_r_gain"; + lv2:name "Tap 2_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 22; + lv2:symbol "t2_gain"; + lv2:name "Tap 2_Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 23; + lv2:symbol "t2_delay"; + lv2:name "Tap 2_Delay"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 10; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 24; + lv2:symbol "t3_1_gain"; + lv2:name "Tap 3_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 25; + lv2:symbol "t3_2_gain"; + lv2:name "Tap 3_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 26; + lv2:symbol "t3_3_gain"; + lv2:name "Tap 3_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 27; + lv2:symbol "t3_4_gain"; + lv2:name "Tap 3_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 28; + lv2:symbol "t3_5_gain"; + lv2:name "Tap 3_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 29; + lv2:symbol "t3_6_gain"; + lv2:name "Tap 3_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 30; + lv2:symbol "t3_l_gain"; + lv2:name "Tap 3_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 31; + lv2:symbol "t3_r_gain"; + lv2:name "Tap 3_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 32; + lv2:symbol "t3_gain"; + lv2:name "Tap 3_Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 33; + lv2:symbol "t3_delay"; + lv2:name "Tap 3_Delay"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 10; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 34; + lv2:symbol "t4_4_gain"; + lv2:name "Tap 4_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 35; + lv2:symbol "t4_2_gain"; + lv2:name "Tap 4_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 36; + lv2:symbol "t4_3_gain"; + lv2:name "Tap 4_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 37; + lv2:symbol "t4_4_gain"; + lv2:name "Tap 4_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 38; + lv2:symbol "t4_5_gain"; + lv2:name "Tap 4_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 39; + lv2:symbol "t4_6_gain"; + lv2:name "Tap 4_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 40; + lv2:symbol "t4_l_gain"; + lv2:name "Tap 4_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 41; + lv2:symbol "t4_r_gain"; + lv2:name "Tap 4_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 42; + lv2:symbol "t4_gain"; + lv2:name "Tap 4_Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 43; + lv2:symbol "t4_delay"; + lv2:name "Tap 4_Delay"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 10; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 44; + lv2:symbol "t5_5_gain"; + lv2:name "Tap 5_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 45; + lv2:symbol "t5_2_gain"; + lv2:name "Tap 5_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 46; + lv2:symbol "t5_3_gain"; + lv2:name "Tap 5_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 47; + lv2:symbol "t5_4_gain"; + lv2:name "Tap 5_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 48; + lv2:symbol "t5_5_gain"; + lv2:name "Tap 5_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 49; + lv2:symbol "t5_6_gain"; + lv2:name "Tap 5_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 50; + lv2:symbol "t5_l_gain"; + lv2:name "Tap 5_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 51; + lv2:symbol "t5_r_gain"; + lv2:name "Tap 5_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 52; + lv2:symbol "t5_gain"; + lv2:name "Tap 5_Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 53; + lv2:symbol "t5_delay"; + lv2:name "Tap 5_Delay"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 10; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 54; + lv2:symbol "t6_6_gain"; + lv2:name "Tap 6_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 55; + lv2:symbol "t6_2_gain"; + lv2:name "Tap 6_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 56; + lv2:symbol "t6_3_gain"; + lv2:name "Tap 6_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 57; + lv2:symbol "t6_4_gain"; + lv2:name "Tap 6_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 58; + lv2:symbol "t6_5_gain"; + lv2:name "Tap 6_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 59; + lv2:symbol "t6_6_gain"; + lv2:name "Tap 6_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 60; + lv2:symbol "t6_l_gain"; + lv2:name "Tap 6_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 61; + lv2:symbol "t6_r_gain"; + lv2:name "Tap 6_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 62; + lv2:symbol "t6_gain"; + lv2:name "Tap 6_Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 63; + lv2:symbol "t6_delay"; + lv2:name "Tap 6_Delay"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 10; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 64; + lv2:symbol "left_1_gain"; + lv2:name "Left_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 65; + lv2:symbol "left_2_gain"; + lv2:name "Left_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 66; + lv2:symbol "left_3_gain"; + lv2:name "Left_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 67; + lv2:symbol "left_4_gain"; + lv2:name "Left_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 68; + lv2:symbol "left_5_gain"; + lv2:name "Left_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 69; + lv2:symbol "left_6_gain"; + lv2:name "Left_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 70; + lv2:symbol "left_l_gain"; + lv2:name "Left_L Gain"; + lv2:minimum 0; + lv2:default 1; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 71; + lv2:symbol "left_r_gain"; + lv2:name "Left_R Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 72; + lv2:symbol "left_gain"; + lv2:name "Left_Gain"; + lv2:minimum 0; + lv2:default 1; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 73; + lv2:symbol "left_unused"; + lv2:name "Left_Unused"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 74; + lv2:symbol "right_1_gain"; + lv2:name "Right_1 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 75; + lv2:symbol "right_2_gain"; + lv2:name "Right_2 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 76; + lv2:symbol "right_3_gain"; + lv2:name "Right_3 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 77; + lv2:symbol "right_4_gain"; + lv2:name "Right_4 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 78; + lv2:symbol "right_5_gain"; + lv2:name "Right_5 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 79; + lv2:symbol "right_6_gain"; + lv2:name "Right_6 Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 80; + lv2:symbol "right_l_gain"; + lv2:name "Right_L Gain"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 81; + lv2:symbol "right_r_gain"; + lv2:name "Right_R Gain"; + lv2:minimum 0; + lv2:default 1; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 82; + lv2:symbol "right_gain"; + lv2:name "Right_Gain"; + lv2:minimum 0; + lv2:default 1; + lv2:maximum 1; + ], + [ + a lv2:InputPort, lv2:ControlPort; + lv2:index 83; + lv2:symbol "right_unused"; + lv2:name "Right_Unused"; + lv2:minimum 0; + lv2:default 0; + lv2:maximum 1; + ].