aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHanspeter Portner <dev@open-music-kontrollers.ch>2017-03-22 21:25:58 +0100
committerHanspeter Portner <dev@open-music-kontrollers.ch>2017-03-22 21:25:58 +0100
commitbe915d440188230da70de05925e4bbd19cfa4127 (patch)
tree06c4dc78b3922968eb5a3bed5ce55945caa688c3
parentedb77221e5ae7555b001e8cdb5eef574cc1c9656 (diff)
downloadvm.lv2-be915d440188230da70de05925e4bbd19cfa4127.tar.xz
add vm:cv, vm:audio plugins.
-rw-r--r--VERSION2
-rw-r--r--manifest.ttl.in16
-rw-r--r--vm.c249
-rw-r--r--vm.ttl448
-rw-r--r--vm_ui.ttl12
5 files changed, 640 insertions, 87 deletions
diff --git a/VERSION b/VERSION
index 1bdb3d7..89610fa 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.1.2875
+0.1.2877
diff --git a/manifest.ttl.in b/manifest.ttl.in
index b34bc26..2c96c8f 100644
--- a/manifest.ttl.in
+++ b/manifest.ttl.in
@@ -27,6 +27,22 @@ vm:control
ui:ui vm:vm_ui ;
rdfs:seeAlso <vm.ttl> .
+vm:cv
+ a lv2:Plugin ;
+ lv2:minorVersion @VM_MINOR_VERSION@ ;
+ lv2:microVersion @VM_MICRO_VERSION@ ;
+ lv2:binary <vm@CMAKE_SHARED_MODULE_SUFFIX@> ;
+ ui:ui vm:vm_ui ;
+ rdfs:seeAlso <vm.ttl> .
+
+vm:audio
+ a lv2:Plugin ;
+ lv2:minorVersion @VM_MINOR_VERSION@ ;
+ lv2:microVersion @VM_MICRO_VERSION@ ;
+ lv2:binary <vm@CMAKE_SHARED_MODULE_SUFFIX@> ;
+ ui:ui vm:vm_ui ;
+ rdfs:seeAlso <vm.ttl> .
+
vm:vm_ui
a ui:@VM_UI_TYPE@ ;
ui:binary <vm_ui@CMAKE_SHARED_MODULE_SUFFIX@> ;
diff --git a/vm.c b/vm.c
index a49f78b..bf54432 100644
--- a/vm.c
+++ b/vm.c
@@ -262,53 +262,32 @@ connect_port(LV2_Handle instance, uint32_t port, void *data)
#define CLIP(a, v, b) fmin(fmax(a, v), b)
static void
-run(LV2_Handle instance, uint32_t nsamples)
+run_internal(plughandle_t *handle, uint32_t frames, bool notify,
+ const float *in [CTRL_MAX], float *out [CTRL_MAX])
{
- plughandle_t *handle = instance;
-
- const uint32_t capacity = handle->notify->atom.size;
- LV2_Atom_Forge_Frame frame;
- lv2_atom_forge_set_buffer(&handle->forge, (uint8_t *)handle->notify, capacity);
- handle->ref = lv2_atom_forge_sequence_head(&handle->forge, &frame, 0);
-
- int64_t last_t = 0;
- LV2_ATOM_SEQUENCE_FOREACH(handle->control, ev)
- {
- const LV2_Atom *atom= &ev->body;
- const LV2_Atom_Object *obj = (const LV2_Atom_Object *)&ev->body;
-
- if(!timely_advance(&handle->timely, obj, last_t, ev->time.frames))
- props_advance(&handle->props, &handle->forge, ev->time.frames, obj, &handle->ref);
-
- last_t = ev->time.frames;
- }
- timely_advance(&handle->timely, NULL, last_t, nsamples);
-
- if(handle->needs_sync)
- {
- props_set(&handle->props, &handle->forge, nsamples - 1, handle->vm_graph, &handle->ref);
- handle->needs_sync = false;
- }
-
for(unsigned i = 0; i < CTRL_MAX; i++)
{
- const float in1 = CLIP(VM_MIN, *handle->in[i], VM_MAX);
+ const float in1 = CLIP(VM_MIN, *in[i], VM_MAX);
+
if(handle->in0[i] != in1)
{
handle->needs_recalc = true;
handle->in0[i] = in1;
- LV2_Atom_Forge_Frame tup_frame;
- if(handle->ref)
- handle->ref = lv2_atom_forge_frame_time(&handle->forge, nsamples - 1);
- if(handle->ref)
- handle->ref = lv2_atom_forge_tuple(&handle->forge, &tup_frame);
- if(handle->ref)
- handle->ref = lv2_atom_forge_int(&handle->forge, i + 2);
- if(handle->ref)
- handle->ref = lv2_atom_forge_float(&handle->forge, in1);
- if(handle->ref)
- lv2_atom_forge_pop(&handle->forge, &tup_frame);
+ if(notify)
+ {
+ LV2_Atom_Forge_Frame tup_frame;
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_frame_time(&handle->forge, frames);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_tuple(&handle->forge, &tup_frame);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_int(&handle->forge, i + 2);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_float(&handle->forge, in1);
+ if(handle->ref)
+ lv2_atom_forge_pop(&handle->forge, &tup_frame);
+ }
}
}
@@ -832,11 +811,6 @@ run(LV2_Handle instance, uint32_t nsamples)
}
_stack_pop_num(&handle->stack, handle->out0, CTRL_MAX);
-#if 0
- for(unsigned i = 0; i < CTRL_MAX; i++)
- printf("out %u: %f\n", i, handle->out0[i]);
-#endif
-
handle->needs_recalc = false;
}
@@ -844,23 +818,153 @@ run(LV2_Handle instance, uint32_t nsamples)
{
const float out1 = CLIP(VM_MIN, handle->out0[i], VM_MAX);
- if(*handle->out[i] != out1)
+ if(*out[i] != out1)
{
- *handle->out[i] = out1;
-
- LV2_Atom_Forge_Frame tup_frame;
- if(handle->ref)
- handle->ref = lv2_atom_forge_frame_time(&handle->forge, nsamples - 1);
- if(handle->ref)
- handle->ref = lv2_atom_forge_tuple(&handle->forge, &tup_frame);
- if(handle->ref)
- handle->ref = lv2_atom_forge_int(&handle->forge, i + 10);
- if(handle->ref)
- handle->ref = lv2_atom_forge_float(&handle->forge, out1);
- if(handle->ref)
- lv2_atom_forge_pop(&handle->forge, &tup_frame);
+ *out[i] = out1;
+
+ if(notify)
+ {
+ LV2_Atom_Forge_Frame tup_frame;
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_frame_time(&handle->forge, frames);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_tuple(&handle->forge, &tup_frame);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_int(&handle->forge, i + 10);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_float(&handle->forge, out1);
+ if(handle->ref)
+ lv2_atom_forge_pop(&handle->forge, &tup_frame);
+ }
}
}
+}
+
+static void
+run_control(LV2_Handle instance, uint32_t nsamples)
+{
+ plughandle_t *handle = instance;
+
+ const uint32_t capacity = handle->notify->atom.size;
+ LV2_Atom_Forge_Frame frame;
+ lv2_atom_forge_set_buffer(&handle->forge, (uint8_t *)handle->notify, capacity);
+ handle->ref = lv2_atom_forge_sequence_head(&handle->forge, &frame, 0);
+
+ int64_t last_t = 0;
+ LV2_ATOM_SEQUENCE_FOREACH(handle->control, ev)
+ {
+ const LV2_Atom *atom= &ev->body;
+ const LV2_Atom_Object *obj = (const LV2_Atom_Object *)&ev->body;
+
+ if(!timely_advance(&handle->timely, obj, last_t, ev->time.frames))
+ props_advance(&handle->props, &handle->forge, ev->time.frames, obj, &handle->ref);
+
+ last_t = ev->time.frames;
+ }
+ timely_advance(&handle->timely, NULL, last_t, nsamples);
+
+ if(handle->needs_sync)
+ {
+ props_set(&handle->props, &handle->forge, nsamples - 1, handle->vm_graph, &handle->ref);
+ handle->needs_sync = false;
+ }
+
+ {
+ const float *in [CTRL_MAX ] = {
+ handle->in[0],
+ handle->in[1],
+ handle->in[2],
+ handle->in[3],
+ handle->in[4],
+ handle->in[5],
+ handle->in[6],
+ handle->in[7]
+ };
+
+ float *out [CTRL_MAX ] = {
+ handle->out[0],
+ handle->out[1],
+ handle->out[2],
+ handle->out[3],
+ handle->out[4],
+ handle->out[5],
+ handle->out[6],
+ handle->out[7]
+ };
+
+ const bool notify = true;
+ run_internal(handle, nsamples -1, notify, in, out);
+ }
+
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_frame_time(&handle->forge, nsamples - 1);
+ if(handle->ref)
+ handle->ref = lv2_atom_forge_long(&handle->forge, handle->off);
+
+ if(handle->ref)
+ lv2_atom_forge_pop(&handle->forge, &frame);
+ else
+ lv2_atom_sequence_clear(handle->notify);
+
+ handle->off += nsamples;
+}
+
+static void
+run_cv(LV2_Handle instance, uint32_t nsamples)
+{
+ plughandle_t *handle = instance;
+
+ const uint32_t capacity = handle->notify->atom.size;
+ LV2_Atom_Forge_Frame frame;
+ lv2_atom_forge_set_buffer(&handle->forge, (uint8_t *)handle->notify, capacity);
+ handle->ref = lv2_atom_forge_sequence_head(&handle->forge, &frame, 0);
+
+ int64_t last_t = 0;
+ LV2_ATOM_SEQUENCE_FOREACH(handle->control, ev)
+ {
+ const LV2_Atom *atom= &ev->body;
+ const LV2_Atom_Object *obj = (const LV2_Atom_Object *)&ev->body;
+
+ if(!timely_advance(&handle->timely, obj, last_t, ev->time.frames))
+ props_advance(&handle->props, &handle->forge, ev->time.frames, obj, &handle->ref);
+
+ last_t = ev->time.frames;
+ }
+ timely_advance(&handle->timely, NULL, last_t, nsamples);
+
+ if(handle->needs_sync)
+ {
+ props_set(&handle->props, &handle->forge, nsamples - 1, handle->vm_graph, &handle->ref);
+ handle->needs_sync = false;
+ }
+
+ for(unsigned i = 0; i < nsamples; i++)
+ {
+ const float *in [CTRL_MAX ] = {
+ &handle->in[0][i],
+ &handle->in[1][i],
+ &handle->in[2][i],
+ &handle->in[3][i],
+ &handle->in[4][i],
+ &handle->in[5][i],
+ &handle->in[6][i],
+ &handle->in[7][i]
+ };
+
+ float *out [CTRL_MAX ] = {
+ &handle->out[0][i],
+ &handle->out[1][i],
+ &handle->out[2][i],
+ &handle->out[3][i],
+ &handle->out[4][i],
+ &handle->out[5][i],
+ &handle->out[6][i],
+ &handle->out[7][i]
+ };
+
+ const bool notify = (i == 0);
+ run_internal(handle, nsamples - 1, notify, in, out);
+ }
if(handle->ref)
handle->ref = lv2_atom_forge_frame_time(&handle->forge, nsamples - 1);
@@ -945,7 +1049,29 @@ static const LV2_Descriptor vm_control = {
.instantiate = instantiate,
.connect_port = connect_port,
.activate = NULL,
- .run = run,
+ .run = run_control,
+ .deactivate = NULL,
+ .cleanup = cleanup,
+ .extension_data = extension_data
+};
+
+static const LV2_Descriptor vm_cv = {
+ .URI = VM_PREFIX"cv",
+ .instantiate = instantiate,
+ .connect_port = connect_port,
+ .activate = NULL,
+ .run = run_cv,
+ .deactivate = NULL,
+ .cleanup = cleanup,
+ .extension_data = extension_data
+};
+
+static const LV2_Descriptor vm_audio = {
+ .URI = VM_PREFIX"audio",
+ .instantiate = instantiate,
+ .connect_port = connect_port,
+ .activate = NULL,
+ .run = run_cv,
.deactivate = NULL,
.cleanup = cleanup,
.extension_data = extension_data
@@ -958,6 +1084,11 @@ lv2_descriptor(uint32_t index)
{
case 0:
return &vm_control;
+ case 1:
+ return &vm_cv;
+ case 2:
+ return &vm_audio;
+
default:
return NULL;
}
diff --git a/vm.ttl b/vm.ttl
index 640c809..1cf9169 100644
--- a/vm.ttl
+++ b/vm.ttl
@@ -47,7 +47,7 @@ omk:me
proj:vm
a doap:Project ;
doap:maintainer omk:me ;
- doap:name "Vm Bundle" .
+ doap:name "VM Bundle" .
# Parameters
vm:graph
@@ -194,7 +194,7 @@ vm:opRShift
vm:control
a lv2:Plugin,
lv2:ConverterPlugin ;
- doap:name "Vm" ;
+ doap:name "VM Control" ;
doap:license lic:Artistic-2.0 ;
lv2:project proj:vm ;
lv2:requiredFeature urid:map, work:schedule, state:loadDefaultState ;
@@ -205,8 +205,7 @@ vm:control
a lv2:InputPort ,
atom:AtomPort ;
atom:bufferType atom:Sequence ;
- atom:supports midi:MidiEvent ,
- time:Position ,
+ atom:supports time:Position ,
patch:Message ;
lv2:index 0 ;
lv2:symbol "control" ;
@@ -217,8 +216,7 @@ vm:control
a lv2:OutputPort ,
atom:AtomPort ;
atom:bufferType atom:Sequence ;
- atom:supports midi:MidiEvent ,
- patch:Message ;
+ atom:supports patch:Message ;
lv2:index 1 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
@@ -381,10 +379,390 @@ vm:control
]
] .
+# Plugin
+vm:cv
+ a lv2:Plugin,
+ lv2:ConverterPlugin ;
+ doap:name "VM CV" ;
+ doap:license lic:Artistic-2.0 ;
+ lv2:project proj:vm ;
+ lv2:requiredFeature urid:map, work:schedule, state:loadDefaultState ;
+ lv2:optionalFeature lv2:isLive, lv2:hardRTCapable, log:log, state:threadSafeRestore ;
+ lv2:extensionData state:interface, work:interface ;
+
+ lv2:port [
+ a lv2:InputPort ,
+ atom:AtomPort ;
+ atom:bufferType atom:Sequence ;
+ atom:supports time:Position ,
+ patch:Message ;
+ lv2:index 0 ;
+ lv2:symbol "control" ;
+ lv2:name "Control" ;
+ lv2:designation lv2:control ;
+ rsz:minimumSize 8192 ;
+ ] , [
+ a lv2:OutputPort ,
+ atom:AtomPort ;
+ atom:bufferType atom:Sequence ;
+ atom:supports patch:Message ;
+ lv2:index 1 ;
+ lv2:symbol "notify" ;
+ lv2:name "Notify" ;
+ lv2:designation lv2:control ;
+ rsz:minimumSize 8192 ;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 2 ;
+ lv2:symbol "cv_in_0" ;
+ lv2:name "CV In 0" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 3 ;
+ lv2:symbol "cv_in_1" ;
+ lv2:name "CV In 1" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 4 ;
+ lv2:symbol "cv_in_2" ;
+ lv2:name "CV In 2" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 5 ;
+ lv2:symbol "cv_in_3" ;
+ lv2:name "CV In 3" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 6 ;
+ lv2:symbol "cv_in_4" ;
+ lv2:name "CV In 4" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 7 ;
+ lv2:symbol "cv_in_5" ;
+ lv2:name "CV In 5" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 8 ;
+ lv2:symbol "cv_in_6" ;
+ lv2:name "CV In 6" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:CVPort;
+ lv2:index 9 ;
+ lv2:symbol "cv_in_7" ;
+ lv2:name "CV In 7" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 10 ;
+ lv2:symbol "cv_out_0" ;
+ lv2:name "CV Out 0" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 11 ;
+ lv2:symbol "cv_out_1" ;
+ lv2:name "CV Out 1" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 12 ;
+ lv2:symbol "cv_out_2" ;
+ lv2:name "CV Out 2" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 13 ;
+ lv2:symbol "cv_out_3" ;
+ lv2:name "CV Out 3" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 14 ;
+ lv2:symbol "cv_out_4" ;
+ lv2:name "CV Out 4" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 15 ;
+ lv2:symbol "cv_out_5" ;
+ lv2:name "CV Out 5" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 16 ;
+ lv2:symbol "cv_out_6" ;
+ lv2:name "CV Out 6" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:CVPort;
+ lv2:index 17 ;
+ lv2:symbol "cv_out_7" ;
+ lv2:name "CV Out 7" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] ;
+
+ #patch:writable
+ # vm:graph ;
+
+ state:state [
+ vm:graph [
+ a atom:Tuple ;
+ rdf:value (
+ 7 vm:opInput
+ 6 vm:opInput
+ 5 vm:opInput
+ 4 vm:opInput
+ 3 vm:opInput
+ 2 vm:opInput
+ 1 vm:opInput
+ 0 vm:opInput
+ )
+ ]
+ ] .
+
+# Plugin
+vm:audio
+ a lv2:Plugin,
+ lv2:ConverterPlugin ;
+ doap:name "VM Audio" ;
+ doap:license lic:Artistic-2.0 ;
+ lv2:project proj:vm ;
+ lv2:requiredFeature urid:map, work:schedule, state:loadDefaultState ;
+ lv2:optionalFeature lv2:isLive, lv2:hardRTCapable, log:log, state:threadSafeRestore ;
+ lv2:extensionData state:interface, work:interface ;
+
+ lv2:port [
+ a lv2:InputPort ,
+ atom:AtomPort ;
+ atom:bufferType atom:Sequence ;
+ atom:supports time:Position ,
+ patch:Message ;
+ lv2:index 0 ;
+ lv2:symbol "control" ;
+ lv2:name "Control" ;
+ lv2:designation lv2:control ;
+ rsz:minimumSize 8192 ;
+ ] , [
+ a lv2:OutputPort ,
+ atom:AtomPort ;
+ atom:bufferType atom:Sequence ;
+ atom:supports patch:Message ;
+ lv2:index 1 ;
+ lv2:symbol "notify" ;
+ lv2:name "Notify" ;
+ lv2:designation lv2:control ;
+ rsz:minimumSize 8192 ;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 2 ;
+ lv2:symbol "audio_in_0" ;
+ lv2:name "Audio In 0" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 3 ;
+ lv2:symbol "audio_in_1" ;
+ lv2:name "Audio In 1" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 4 ;
+ lv2:symbol "audio_in_2" ;
+ lv2:name "Audio In 2" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 5 ;
+ lv2:symbol "audio_in_3" ;
+ lv2:name "Audio In 3" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 6 ;
+ lv2:symbol "audio_in_4" ;
+ lv2:name "Audio In 4" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 7 ;
+ lv2:symbol "audio_in_5" ;
+ lv2:name "Audio In 5" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 8 ;
+ lv2:symbol "audio_in_6" ;
+ lv2:name "Audio In 6" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:InputPort,
+ lv2:AudioPort;
+ lv2:index 9 ;
+ lv2:symbol "audio_in_7" ;
+ lv2:name "Audio In 7" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ lv2:default 0.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 10 ;
+ lv2:symbol "audio_out_0" ;
+ lv2:name "Audio Out 0" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 11 ;
+ lv2:symbol "audio_out_1" ;
+ lv2:name "Audio Out 1" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 12 ;
+ lv2:symbol "audio_out_2" ;
+ lv2:name "Audio Out 2" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 13 ;
+ lv2:symbol "audio_out_3" ;
+ lv2:name "Audio Out 3" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 14 ;
+ lv2:symbol "audio_out_4" ;
+ lv2:name "Audio Out 4" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 15 ;
+ lv2:symbol "audio_out_5" ;
+ lv2:name "Audio Out 5" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 16 ;
+ lv2:symbol "audio_out_6" ;
+ lv2:name "Audio Out 6" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] , [
+ a lv2:OutputPort,
+ lv2:AudioPort;
+ lv2:index 17 ;
+ lv2:symbol "audio_out_7" ;
+ lv2:name "Audio Out 7" ;
+ lv2:minimum -1.0;
+ lv2:maximum 1.0;
+ ] ;
+
+ #patch:writable
+ # vm:graph ;
+
+ state:state [
+ vm:graph [
+ a atom:Tuple ;
+ rdf:value (
+ 7 vm:opInput
+ 6 vm:opInput
+ 5 vm:opInput
+ 4 vm:opInput
+ 3 vm:opInput
+ 2 vm:opInput
+ 1 vm:opInput
+ 0 vm:opInput
+ )
+ ]
+ ] .
+
vm:add
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Add" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Add" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -398,8 +776,10 @@ vm:add
vm:sub
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Subtract" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Subtract" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -413,8 +793,10 @@ vm:sub
vm:mul
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Multiply" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Multiply" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -428,8 +810,10 @@ vm:mul
vm:div
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Divide" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Divide" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -443,8 +827,10 @@ vm:div
vm:mod
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Modulo" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Modulo" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -458,8 +844,10 @@ vm:mod
vm:pow
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Power" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Power" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -473,8 +861,10 @@ vm:pow
vm:dBFS
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "dBFS" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "dBFS" ;
lv2:port [
lv2:symbol "control_in_0" ;
pset:value 0.5
@@ -495,8 +885,10 @@ vm:dBFS
vm:rand
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Random" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Random" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -515,8 +907,10 @@ vm:rand
vm:sampleAndHold
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "Sample and hold" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "Sample and hold" ;
state:state [
vm:graph [
a atom:Tuple ;
@@ -534,8 +928,10 @@ vm:sampleAndHold
vm:lfo
a pset:Preset ;
- lv2:appliesTo vm:control ;
- rdfs:label "LFO" ;
+ lv2:appliesTo vm:control ,
+ vm:cv ,
+ vm:audio ;
+ rdfs:label "LFO" ;
state:state [
vm:graph [
a atom:Tuple ;
diff --git a/vm_ui.ttl b/vm_ui.ttl
index d7acc7b..4338b8d 100644
--- a/vm_ui.ttl
+++ b/vm_ui.ttl
@@ -23,7 +23,17 @@
vm:vm_ui
ui:portNotification [
- ui:plugin vm:vm ;
+ ui:plugin vm:control ;
+ lv2:symbol "notify" ;
+ ui:protocol atom:eventTransfer
+ ] ;
+ ui:portNotification [
+ ui:plugin vm:cv ;
+ lv2:symbol "notify" ;
+ ui:protocol atom:eventTransfer
+ ] ;
+ ui:portNotification [
+ ui:plugin vm:audio ;
lv2:symbol "notify" ;
ui:protocol atom:eventTransfer
] ;