commit d5a0f8d9461c1db0a09b7b0138787596d96abdbc
parent a663671dbd8d1f393df14d8aefd8553524f501c1
Author: fundamental <mark.d.mccurry@gmail.com>
Date: Thu, 9 Jun 2016 13:42:34 -0400
Envelope: Add Float Array Port For Env Points
Diffstat:
2 files changed, 70 insertions(+), 39 deletions(-)
diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp
@@ -283,6 +283,12 @@ class DataObj:public rtosc::RtData
forwarded = false;
}
+ virtual void replyArray(const char *path, const char *args, rtosc_arg_t *vals) override
+ {
+ char *buffer = bToU->buffer();
+ rtosc_amessage(buffer,bToU->buffer_size(),path,args,vals);
+ reply(buffer);
+ }
virtual void reply(const char *path, const char *args, ...) override
{
va_list va;
diff --git a/src/Params/EnvelopeParams.cpp b/src/Params/EnvelopeParams.cpp
@@ -23,6 +23,9 @@
#define rObject EnvelopeParams
using namespace rtosc;
+#define rBegin [](const char *msg, RtData &d) { \
+ EnvelopeParams *env = (rObject*) d.obj
+#define rEnd }
static const rtosc::Ports localPorts = {
rSelf(EnvelopeParams),
@@ -32,7 +35,8 @@ static const rtosc::Ports localPorts = {
obj->last_update_timestamp = obj->time->time(); }
rToggle(Pfreemode, "Complex Envelope Definitions"),
#undef rChangeCb
-#define rChangeCb if (obj->time) { obj->last_update_timestamp = obj->time->time(); }
+#define rChangeCb if(!obj->Pfreemode) obj->converttofree(); \
+ if(obj->time) { obj->last_update_timestamp = obj->time->time(); }
rParamZyn(Penvpoints, rProp(internal), "Number of points in complex definition"),
rParamZyn(Penvsustain, rProp(internal), "Location of the sustain point"),
rParams(Penvdt, MAX_ENVELOPE_POINTS, "Envelope Delay Times"),
@@ -50,45 +54,66 @@ static const rtosc::Ports localPorts = {
rParamZyn(PS_val, rShort("s.val"), "Sustain Value"),
rParamZyn(PR_dt, rShort("r.dt"), "Release Time"),
rParamZyn(PR_val, rShort("r.val"), "Release Value"),
+
+ {"envdt:", rDoc("Envelope Delay Times"), NULL,
+ rBegin;
+ const int N = MAX_ENVELOPE_POINTS;
+ rtosc_arg_t args[N];
+ char arg_types[N+1] = {0};
+ for(int i=0; i<N; ++i) {
+ args[i].f = env->getdt(i);
+ arg_types[i] = 'f';
+ }
+ d.replyArray(d.loc, arg_types, args);
+ rEnd},
+ {"envval:", rDoc("Envelope Delay Times"), NULL,
+ rBegin;
+ const int N = MAX_ENVELOPE_POINTS;
+ rtosc_arg_t args[N];
+ char arg_types[N+1] = {0};
+ for(int i=0; i<N; ++i) {
+ args[i].f = env->Penvval[i]/127.0f;
+ arg_types[i] = 'f';
+ }
+ d.replyArray(d.loc, arg_types, args);
+ rEnd},
+
+ {"addPoint:i", rProp(internal) rDoc("Add point to envelope"), NULL,
+ rBegin;
+ const int curpoint = rtosc_argument(msg, 0).i;
+ //int curpoint=freeedit->lastpoint;
+ if (curpoint<0 || curpoint>env->Penvpoints || env->Penvpoints>=MAX_ENVELOPE_POINTS)
+ return;
+
+ for (int i=env->Penvpoints; i>=curpoint+1; i--) {
+ env->Penvdt[i]=env->Penvdt[i-1];
+ env->Penvval[i]=env->Penvval[i-1];
+ }
+
+ if (curpoint==0)
+ env->Penvdt[1]=64;
+
+ env->Penvpoints++;
+ if (curpoint<=env->Penvsustain)
+ env->Penvsustain++;
+ rEnd},
+ {"delPoint:i", rProp(internal) rDoc("Delete Envelope Point"), NULL,
+ rBegin;
+ const int curpoint=rtosc_argument(msg, 0).i;
+ if(curpoint<1 || curpoint>=env->Penvpoints-1 || env->Penvpoints<=3)
+ return;
+
+ for (int i=curpoint+1;i<env->Penvpoints;i++){
+ env->Penvdt[i-1]=env->Penvdt[i];
+ env->Penvval[i-1]=env->Penvval[i];
+ };
+
+ env->Penvpoints--;
+
+ if (curpoint<=env->Penvsustain)
+ env->Penvsustain--;
- {"addPoint:i", rProp(internal) rDoc("Add point to envelope"), NULL, [](const char *msg, RtData &d)
- {
- EnvelopeParams *env = (rObject*) d.obj;
- const int curpoint = rtosc_argument(msg, 0).i;
- //int curpoint=freeedit->lastpoint;
- if (curpoint<0 || curpoint>env->Penvpoints || env->Penvpoints>=MAX_ENVELOPE_POINTS)
- return;
-
- for (int i=env->Penvpoints; i>=curpoint+1; i--) {
- env->Penvdt[i]=env->Penvdt[i-1];
- env->Penvval[i]=env->Penvval[i-1];
- }
-
- if (curpoint==0) {
- env->Penvdt[1]=64;
- }
-
- env->Penvpoints++;
- if (curpoint<=env->Penvsustain) env->Penvsustain++;
- }},
- {"delPoint:i", rProp(internal) rDoc("Delete Envelope Point"), NULL, [](const char *msg, RtData &d)
- {
- EnvelopeParams *env = (rObject*) d.obj;
- const int curpoint=rtosc_argument(msg, 0).i;
- if(curpoint<1 || curpoint>=env->Penvpoints-1 || env->Penvpoints<=3)
- return;
-
- for (int i=curpoint+1;i<env->Penvpoints;i++){
- env->Penvdt[i-1]=env->Penvdt[i];
- env->Penvval[i-1]=env->Penvval[i];
- };
-
- env->Penvpoints--;
-
- if (curpoint<=env->Penvsustain)
- env->Penvsustain--;
-
- }},
+ rEnd},
};
#undef rChangeCb