zynaddsubfx

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

commit c6fa0c8c3a532f9056824d56bb772e2048ba938d
parent 466985b2af5507e88ba6318c006fd490734f2fbd
Author: Christopher A. Oliver <caowasteland@gmail.com>
Date:   Mon,  5 Oct 2015 19:06:46 -0400

New candidate freemode envelope behavior.

Diffstat:
Msrc/UI/EnvelopeFreeEdit.cpp | 123++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/UI/EnvelopeUI.fl | 148+++++++++++++++++++++++++------------------------------------------------------
2 files changed, 108 insertions(+), 163 deletions(-)

diff --git a/src/UI/EnvelopeFreeEdit.cpp b/src/UI/EnvelopeFreeEdit.cpp @@ -194,84 +194,85 @@ int EnvelopeFreeEdit::handle(int event) const int x_=Fl::event_x()-x(); const int y_=Fl::event_y()-y(); static Fl_Widget *old_focus; + int key; switch(event) { case FL_ENTER: - old_focus=Fl::focus(); - Fl::focus(this); - break; + old_focus=Fl::focus(); + Fl::focus(this); + // Otherwise the underlying window seems to regrab focus, + // and I can't see the KEYDOWN action. + return 1; case FL_LEAVE: - Fl::focus(old_focus); - break; + Fl::focus(old_focus); + break; case FL_KEYDOWN: case FL_KEYUP: - { - int key = Fl::event_key(); + key = Fl::event_key(); if (key==FL_Control_L || key==FL_Control_R){ - ctrldown = (event==FL_KEYDOWN); - redraw(); - if (pair!=NULL) pair->redraw(); + ctrldown = (event==FL_KEYDOWN); + redraw(); + if (pair!=NULL) pair->redraw(); } - } - break; + break; case FL_PUSH: - currentpoint=getnearest(x_,y_); - cpx=x_; - cpdt=Penvdt[currentpoint]; - lastpoint=currentpoint; - redraw(); - if (pair) - pair->redraw(); - return 1; + currentpoint=getnearest(x_,y_); + cpx=x_; + cpdt=Penvdt[currentpoint]; + lastpoint=currentpoint; + redraw(); + if (pair) + pair->redraw(); + return 1; case FL_RELEASE: - currentpoint=-1; - redraw(); - if (pair) - pair->redraw(); - return 1; + currentpoint=-1; + redraw(); + if (pair) + pair->redraw(); + return 1; case FL_MOUSEWHEEL: - if (lastpoint>=0) { - if (!ctrldown) { - int ny = Penvval[lastpoint] - Fl::event_dy(); - ny = ny < 0 ? 0 : ny > 127 ? 127 : ny; - Penvval[lastpoint] = ny; - oscWrite(to_s("Penvval")+to_s(lastpoint), "c", ny); - oscWrite("Penvval",""); - } else if (lastpoint > 0) { - int newdt = Fl::event_dy() + Penvdt[lastpoint]; - newdt = newdt < 0 ? 0 : newdt > 127 ? 127 : newdt; - Penvdt[lastpoint] = newdt; - oscWrite(to_s("Penvdt")+to_s(lastpoint), "c", newdt); - oscWrite("Penvdt",""); - } - redraw(); - if (pair!=NULL) pair->redraw(); - return 1; - } + if (lastpoint>=0) { + if (!ctrldown) { + int ny = Penvval[lastpoint] - Fl::event_dy(); + ny = ny < 0 ? 0 : ny > 127 ? 127 : ny; + Penvval[lastpoint] = ny; + oscWrite(to_s("Penvval")+to_s(lastpoint), "c", ny); + oscWrite("Penvval",""); + } else if (lastpoint > 0) { + int newdt = Fl::event_dy() + Penvdt[lastpoint]; + newdt = newdt < 0 ? 0 : newdt > 127 ? 127 : newdt; + Penvdt[lastpoint] = newdt; + oscWrite(to_s("Penvdt")+to_s(lastpoint), "c", newdt); + oscWrite("Penvdt",""); + } + redraw(); + if (pair!=NULL) pair->redraw(); + return 1; + } case FL_DRAG: - if (currentpoint>=0){ - int ny=limit(127-(int) (y_*127.0/h()), 0, 127); + if (currentpoint>=0){ + int ny=limit(127-(int) (y_*127.0/h()), 0, 127); - Penvval[currentpoint]=ny; + Penvval[currentpoint]=ny; - const int dx=(int)((x_-cpx)*0.1); - const int newdt=limit(cpdt+dx,0,127); + const int dx=(int)((x_-cpx)*0.1); + const int newdt=limit(cpdt+dx,0,127); - if(currentpoint!=0) - Penvdt[currentpoint]=newdt; - else - Penvdt[currentpoint]=0; + if(currentpoint!=0) + Penvdt[currentpoint]=newdt; + else + Penvdt[currentpoint]=0; - oscWrite(to_s("Penvval")+to_s(currentpoint), "c", ny); - oscWrite(to_s("Penvdt")+to_s(currentpoint), "c", newdt); - oscWrite("Penvdt",""); - oscWrite("Penvval",""); - redraw(); + oscWrite(to_s("Penvval")+to_s(currentpoint), "c", ny); + oscWrite(to_s("Penvdt")+to_s(currentpoint), "c", newdt); + oscWrite("Penvdt",""); + oscWrite("Penvval",""); + redraw(); - if(pair) - pair->redraw(); - return 1; - } + if(pair) + pair->redraw(); + return 1; + } } // Needed to propagate undo/redo keys. return 0; diff --git a/src/UI/EnvelopeUI.fl b/src/UI/EnvelopeUI.fl @@ -127,18 +127,6 @@ sustaincounter->update(); code0 {(void)o;//if (Pfreemode==0) o->hide();} class Fl_Osc_Button } - Fl_Check_Button freemodebutton { - label FreeMode - callback { - o->oscWrite("Pfreemode", o->value() ? "T" : "F"); - reinit(o->value()); - -freeedit->lastpoint=-1; -freeedit->redraw();} - tooltip {Enable or disable the freemode} xywh {10 155 95 20} labelsize 11 - code0{o->init("Pfreemode");} - class Fl_Osc_Check - } Fl_Check_Button forcedreleasecheck { label frcR tooltip {Forced Release} xywh {410 165 40 15} down_box DOWN_BOX labelsize 10 @@ -173,6 +161,18 @@ envfree->redraw();} code3 {o->init("Penvsustain");} class Fl_Osc_Counter } + Fl_Check_Button freemodehack { + xywh {0 0 0 0} down_box DOWN_BOX + callback{refresh();} + code0 {o->init("Pfreemode");o->hide();} + class Fl_Osc_Check + } + Fl_Button {} { + label {Cancel Freemode} + callback {disable_freemode();} + xywh {5 155 105 20} box THIN_UP_BOX labelsize 11 labelcolor 1 + class Fl_Osc_Button + } } } Function {make_ADSR_window()} {} { @@ -237,11 +237,9 @@ envfree->redraw();} } Fl_Button {} { label E - callback {freemodeeditwindow->show(); - freemodeeditwindow->position(Fl::event_x_root()-20, - Fl::event_y_root()+20); - } + callback {open_as_freemode();} tooltip {Envelope window} xywh {185 5 15 15} labelfont 1 labelsize 10 + class Fl_Osc_Button } Fl_Check_Button e1linearenvelope { label L @@ -315,11 +313,9 @@ envfree->redraw();} } Fl_Button {} { label E - callback {freemodeeditwindow->show(); - freemodeeditwindow->position(Fl::event_x_root()-20, - Fl::event_y_root()+20); - } + callback {open_as_freemode();} tooltip {Envelope window} xywh {190 5 15 15} labelfont 1 labelsize 10 + class Fl_Osc_Button } } } @@ -399,11 +395,9 @@ envfree->redraw();} } Fl_Button {} { label E - callback {freemodeeditwindow->show(); - freemodeeditwindow->position(Fl::event_x_root()-20, - Fl::event_y_root()+20); - } + callback {open_as_freemode();} xywh {255 5 15 15} labelfont 1 labelsize 10 + class Fl_Osc_Button } } } @@ -472,11 +466,9 @@ envfree->redraw();} } Fl_Button {} { label E - callback {freemodeeditwindow->show(); - freemodeeditwindow->position(Fl::event_x_root()-20, - Fl::event_y_root()+20); - } + callback {open_as_freemode();} xywh {190 5 15 15} labelfont 1 labelsize 10 + class Fl_Osc_Button } } } @@ -493,11 +485,9 @@ envfree->redraw();} } { Fl_Button {} { label E - callback {freemodeeditwindow->show(); - freemodeeditwindow->position(Fl::event_x_root()-20, - Fl::event_y_root()+20); - } + callback {open_as_freemode();} xywh {185 5 15 15} labelfont 1 labelsize 10 + class Fl_Osc_Button } Fl_Box freeeditsmall { label Envelope @@ -519,6 +509,18 @@ envfree->redraw();} } } } + Function {open_as_freemode()} {open + } { + code { + if (!freemodehack->value() && + fl_choice("Convert envelope to free mode data?","No","Yes",NULL)==0) + return; + freemodehack->oscWrite("Pfreemode", "T"); + freeedit->update(); + freemodeeditwindow->show(); + freemodeeditwindow->position(Fl::event_x_root()-20, Fl::event_y_root()+20); +} {} +} Function {init(int env_type, Fl_Osc_Interface *osc_, std::string base_, std::string ext_)} {open } { code {osc = osc_; @@ -558,107 +560,52 @@ refresh();} {} code {Fl_Osc_Group::rebase(new_base); freemodeeditwindow->rebase(new_base+ext);} {} } - Function {reinit(bool Pfreemode)} {open + Function {disable_freemode()} {open } { - code { - //if(!Pfreemode){ - // int answer=fl_choice("Disable the free mode of the Envelope?","No","Yes",NULL); - // freemodebutton->value(Pfreemode); - // if (answer==0) - // return; - //}; - freeedit->update(); + code {if (fl_choice("Discard free mode data?","No","Yes",NULL)==0) + return; hide(); int winx = Fl::event_x_root()-10; int winy = Fl::event_y_root()-155; winx = winx < 1 ? 1 : winx; winy = winy < 1 ? 1 : winy; - bool reshow = freemodeeditwindow->visible(); freemodeeditwindow->hide(); envwindow->hide(); Fl_Group *par=envwindow->parent(); par->hide(); - - refresh(); + freemodehack->oscWrite("Pfreemode", "F"); + freeedit->update(); envwindow->show(); par->redraw(); par->show(); show(); - freemodeeditwindow->position(winx,winy); - if(reshow) - freemodeeditwindow->show(); - - if (Pfreemode) { - freemodebutton->value(1); - addpoint->show(); - deletepoint->show(); - forcedreleasecheck->show(); - sustaincounter->show(); - envstretchdial->show(); - } else{ - freemodebutton->value(0); - addpoint->hide(); - deletepoint->hide(); - forcedreleasecheck->hide(); - sustaincounter->hide(); - envstretchdial->hide(); - }; -} {selected - } + freemodeeditwindow->position(winx,winy);} {} } Function {refresh()} {open } { - code { - sustaincounter->value(Penvsustain); + code {sustaincounter->value(Penvsustain); sustaincounter->maximum(Penvpoints-2); envstretchdial->value(Penvstretch); -linearenvelopecheck->value(Plinearenvelope); - -//Conditionally display widgets - if(freemodebutton->value()) { - freemodebutton->value(1); - addpoint->show(); - deletepoint->show(); - forcedreleasecheck->show(); - sustaincounter->show(); - envstretchdial->show(); - } else { - freemodebutton->value(0); - addpoint->hide(); - deletepoint->hide(); - forcedreleasecheck->hide(); - sustaincounter->hide(); - envstretchdial->hide(); - } - - if(freemodebutton->value() || Envmode>2) - linearenvelopecheck->hide(); - else - linearenvelopecheck->show(); + linearenvelopecheck->value(Plinearenvelope); + linearenvelopecheck->show(); forcedreleasecheck->value(Pforcedrelease); -if (freemodebutton->value()==0){ - addpoint->hide(); - deletepoint->hide(); -} else { - addpoint->show(); - deletepoint->show(); -} - envADSR->hide(); envASR->hide(); envADSRfilter->hide(); envASRbw->hide(); envfree->hide(); -if (freemodebutton->value()==0){ +if (freemodehack->value()) + envwindow=envfree; +else switch(Envmode){ case 1: case 2: @@ -676,9 +623,6 @@ if (freemodebutton->value()==0){ default: break; }; -}else{ - envwindow=envfree; -}; assert(envwindow); envwindow->resize(this->x(),this->y(),this->w(),this->h());