diff --git a/source/native-plugins/zynaddsubfx/Effects/EffectMgr.cpp b/source/native-plugins/zynaddsubfx/Effects/EffectMgr.cpp index 3ad54fa22..5397ae9af 100644 --- a/source/native-plugins/zynaddsubfx/Effects/EffectMgr.cpp +++ b/source/native-plugins/zynaddsubfx/Effects/EffectMgr.cpp @@ -43,7 +43,7 @@ static const rtosc::Ports local_ports = { rSelf(EffectMgr), rPaste, rRecurp(filterpars, "Filter Parameter for Dynamic Filter"), - {"parameter#64::i", rProp(alias) rDoc("Parameter Accessor"), NULL, + {"parameter#128::i", rProp(alias) rDoc("Parameter Accessor"), NULL, [](const char *msg, rtosc::RtData &d) { EffectMgr *eff = (EffectMgr*)d.obj; @@ -52,8 +52,10 @@ static const rtosc::Ports local_ports = { if(!rtosc_narguments(msg)) d.reply(d.loc, "i", eff->geteffectparrt(atoi(mm))); - else + else { eff->seteffectparrt(atoi(mm), rtosc_argument(msg, 0).i); + d.broadcast(d.loc, "i", eff->geteffectparrt(atoi(mm))); + } }}, {"preset::i", rProp(alias) rDoc("Effect Preset Selector"), NULL, [](const char *msg, rtosc::RtData &d) @@ -61,8 +63,10 @@ static const rtosc::Ports local_ports = { EffectMgr *eff = (EffectMgr*)d.obj; if(!rtosc_narguments(msg)) d.reply(d.loc, "i", eff->getpreset()); - else + else { eff->changepresetrt(rtosc_argument(msg, 0).i); + d.broadcast(d.loc, "i", eff->getpreset()); + } }}, {"eq-coeffs:", rProp(internal) rDoc("Get equalizer Coefficients"), NULL, [](const char *, rtosc::RtData &d) @@ -81,9 +85,10 @@ static const rtosc::Ports local_ports = { {"efftype::i", rDoc("Get Effect Type"), NULL, [](const char *m, rtosc::RtData &d) { EffectMgr *eff = (EffectMgr*)d.obj; - if(rtosc_narguments(m)) + if(rtosc_narguments(m)) { eff->changeeffectrt(rtosc_argument(m,0).i); - else + d.broadcast(d.loc, "i", eff->nefx); + } else d.reply(d.loc, "i", eff->nefx); }}, {"efftype:b", rProp(internal) rDoc("Pointer swap EffectMgr"), NULL, @@ -141,7 +146,7 @@ void EffectMgr::defaults(void) } //Change the effect -void EffectMgr::changeeffectrt(int _nefx) +void EffectMgr::changeeffectrt(int _nefx, bool avoidSmash) { cleanup(); if(nefx == _nefx && efx != NULL) @@ -185,6 +190,10 @@ void EffectMgr::changeeffectrt(int _nefx) if(efx) filterpars = efx->filterpars; + + if(!avoidSmash) + for(int i=0; i<128; ++i) + settings[i] = geteffectparrt(i); } void EffectMgr::changeeffect(int _nefx) @@ -203,8 +212,8 @@ int EffectMgr::geteffect(void) // Initialize An Effect in RT context void EffectMgr::init(void) { - changeeffectrt(nefx); - changepresetrt(preset); + changeeffectrt(nefx, true); + changepresetrt(preset, true); for(int i=0; i<128; ++i) seteffectparrt(i, settings[i]); } @@ -240,11 +249,14 @@ void EffectMgr::changepreset(unsigned char npreset) } // Change the preset of the current effect -void EffectMgr::changepresetrt(unsigned char npreset) +void EffectMgr::changepresetrt(unsigned char npreset, bool avoidSmash) { preset = npreset; if(efx) efx->setpreset(npreset); + if(!avoidSmash) + for(int i=0; i<128; ++i) + settings[i] = geteffectparrt(i); } //Change a parameter of the current effect @@ -368,11 +380,10 @@ void EffectMgr::setdryonly(bool value) void EffectMgr::paste(EffectMgr &e) { - changeeffectrt(e.nefx); - changepresetrt(e.preset); - for(int i=0;i<128;++i){ + changeeffectrt(e.nefx, true); + changepresetrt(e.preset, true); + for(int i=0;i<128;++i) seteffectparrt(e.settings[i], i); - } } void EffectMgr::add2XML(XMLwrapper *xml) diff --git a/source/native-plugins/zynaddsubfx/Effects/EffectMgr.h b/source/native-plugins/zynaddsubfx/Effects/EffectMgr.h index df3d1aa6f..e545c919c 100644 --- a/source/native-plugins/zynaddsubfx/Effects/EffectMgr.h +++ b/source/native-plugins/zynaddsubfx/Effects/EffectMgr.h @@ -62,11 +62,11 @@ class EffectMgr:public Presets void kill(void) REALTIME; void cleanup(void) REALTIME; - void changeeffectrt(int nefx_) REALTIME; + void changeeffectrt(int nefx_, bool avoidSmash=false) REALTIME; void changeeffect(int nefx_) NONREALTIME; int geteffect(void); void changepreset(unsigned char npreset) NONREALTIME; - void changepresetrt(unsigned char npreset) REALTIME; + void changepresetrt(unsigned char npreset, bool avoidSmash=false) REALTIME; unsigned char getpreset(void); void seteffectpar(int npar, unsigned char value) NONREALTIME; void seteffectparrt(int npar, unsigned char value) REALTIME; diff --git a/source/native-plugins/zynaddsubfx/UI/SUBnoteUI.fl b/source/native-plugins/zynaddsubfx/UI/SUBnoteUI.fl index 2d5121ca4..40d397f6b 100644 --- a/source/native-plugins/zynaddsubfx/UI/SUBnoteUI.fl +++ b/source/native-plugins/zynaddsubfx/UI/SUBnoteUI.fl @@ -52,6 +52,20 @@ class PPSlider {: {public Fl_Slider, public Fl_Osc_Widget} } { code {int X=x(),Y=y(),W=w(),H=h(); +// catch any (un)learn event first +{ + bool middle_mouse = (event == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); + bool ctl_click = (event == FL_PUSH && Fl::event_state(FL_BUTTON1) && Fl::event_ctrl()); + bool shift_middle = (event == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); + if(middle_mouse || ctl_click) { + osc->write("/learn", "s", (loc+ext).c_str()); + return 1; + } else if(shift_middle) { + osc->write("/unlearn", "s", (loc+ext).c_str()); + return 1; + } +} + if ((!Fl::event_buttons())|| (event==0)||(Fl::event_shift()==0)) return(Fl_Slider::handle(event)); if (!Fl::event_inside(X,Y,W,H)) { @@ -100,7 +114,7 @@ class SUBnoteharmonic {: {public Fl_Osc_Group} int x=0; if (Fl::event_button1() || Fl::event() == FL_MOUSEWHEEL) x=127-(int)o->value(); else o->value(127-x); - o->osc->writeValue(o->loc + "Phmag" + to_s(n), (char) x); + o->osc->writeValue(o->loc + o->ext, (char) x); if (x==0) o->selection_color(0); else o->selection_color(222);} tooltip {harmonic's magnitude} xywh {0 15 10 135} type {Vert Knob} box FLAT_BOX selection_color 222 maximum 127 step 1 value 127 @@ -137,16 +151,16 @@ if (Fl::event_button1() || Fl::event() == FL_MOUSEWHEEL) x=127-(int)o->value(); code {n=n_; make_window(); harmonic->show(); - -osc->createLink(base+"Phmag"+to_s(n), mag); +mag->ext = "Phmag" + to_s(n); +mag->oscRegister(mag->ext.c_str()); osc->createLink(base+"Phrelbw"+to_s(n), bw); -osc->requestValue(base+"Phmag"+to_s(n)); osc->requestValue(base+"Phrelbw"+to_s(n)); end();} {} } Function {refresh()} {} { - code {osc->requestValue(base+"Phmag"+to_s(n)); + code {// request values for the widgets +mag->oscWrite(mag->ext); osc->requestValue(base+"Phrelbw"+to_s(n));} {} } Function {~SUBnoteharmonic()} {} {