diff options
author | Hanspeter Portner <dev@open-music-kontrollers.ch> | 2017-03-22 21:25:58 +0100 |
---|---|---|
committer | Hanspeter Portner <dev@open-music-kontrollers.ch> | 2017-03-22 21:25:58 +0100 |
commit | be915d440188230da70de05925e4bbd19cfa4127 (patch) | |
tree | 06c4dc78b3922968eb5a3bed5ce55945caa688c3 | |
parent | edb77221e5ae7555b001e8cdb5eef574cc1c9656 (diff) | |
download | vm.lv2-be915d440188230da70de05925e4bbd19cfa4127.tar.xz |
add vm:cv, vm:audio plugins.
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | manifest.ttl.in | 16 | ||||
-rw-r--r-- | vm.c | 249 | ||||
-rw-r--r-- | vm.ttl | 448 | ||||
-rw-r--r-- | vm_ui.ttl | 12 |
5 files changed, 640 insertions, 87 deletions
@@ -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@> ; @@ -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; } @@ -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 ; @@ -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 ] ; |