zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

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:
Msrc/Misc/Master.cpp | 6++++++
Msrc/Params/EnvelopeParams.cpp | 103+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
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