Initial import

master
Peter Nelson 2013-02-01 15:23:45 +00:00
commit c8fcc8e778
7 changed files with 1187 additions and 0 deletions

2
.gitignore vendored 100644
View File

@ -0,0 +1,2 @@
*.o
*.so

31
ptap/Makefile 100644
View File

@ -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 $@

90
ptap/ducker.c 100644
View File

@ -0,0 +1,90 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <lv2.h>
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;
}

66
ptap/ducker.ttl 100644
View File

@ -0,0 +1,66 @@
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2ev: <http://lv2plug.in/ns/ext/event#> .
<http://fuzzle.org/~petern/ptap/1>
a lv2:Plugin;
doap:maintainer [
foaf:name "Peter Nelson";
foaf:homepage <http://fuzzle.org/~petern/ptap/>;
foaf:mbox <mailto:peter@fuzzle.org>;
];
doap:name "PTap";
doap:license <http://usefulinc.com/doap/licenses/gpl>;
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;
].

View File

@ -0,0 +1,7 @@
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://fuzzle.org/~petern/ptap/1>
a lv2:Plugin, lv2:DelayPlugin;
lv2:binary <ptap.so>;
rdfs:seeAlso <ptap.ttl>.

228
ptap/ptap.c 100644
View File

@ -0,0 +1,228 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <lv2.h>
#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;
}

763
ptap/ptap.ttl 100644
View File

@ -0,0 +1,763 @@
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2ev: <http://lv2plug.in/ns/ext/event#> .
<http://fuzzle.org/~petern/ptap/1>
a lv2:Plugin;
doap:maintainer [
foaf:name "Peter Nelson";
foaf:homepage <http://fuzzle.org/~petern/ptap/>;
foaf:mbox <mailto:peter@fuzzle.org>;
];
doap:name "PTap";
doap:license <http://usefulinc.com/doap/licenses/gpl>;
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;
].