| @@ -667,7 +667,7 @@ void Master::AudioOut(float *outl, float *outr) | |||
| } | |||
| if(events>1 && false) | |||
| fprintf(stderr, "backend: %d events per cycle\n",events); | |||
| //Swaps the Left channel with Right Channel | |||
| if(swaplr) | |||
| @@ -347,14 +347,14 @@ struct NonRtObjStore | |||
| { | |||
| std::string base = "/part"+to_s(i)+"/kit"+to_s(j)+"/"; | |||
| for(int k=0; k<NUM_VOICES; ++k) { | |||
| std::string nbase = base+"adpars/voice"+to_s(k)+"/"; | |||
| std::string nbase = base+"adpars/VoicePar"+to_s(k)+"/"; | |||
| if(adpars) { | |||
| auto &nobj = adpars->VoicePar[k]; | |||
| objmap[nbase+"oscil/"] = nobj.OscilSmp; | |||
| objmap[nbase+"mod-oscil/"] = nobj.FMSmp; | |||
| objmap[nbase+"OscilSmp/"] = nobj.OscilSmp; | |||
| objmap[nbase+"FMSmp/"] = nobj.FMSmp; | |||
| } else { | |||
| objmap[nbase+"oscil/"] = nullptr; | |||
| objmap[nbase+"mod-oscil/"] = nullptr; | |||
| objmap[nbase+"OscilSmp/"] = nullptr; | |||
| objmap[nbase+"FMSmp/"] = nullptr; | |||
| } | |||
| } | |||
| } | |||
| @@ -365,10 +365,10 @@ struct NonRtObjStore | |||
| for(int k=0; k<NUM_VOICES; ++k) { | |||
| if(padpars) { | |||
| objmap[base+"padpars/"] = padpars; | |||
| objmap[base+"padpars/oscil/"] = padpars->oscilgen; | |||
| objmap[base+"padpars/oscilgen/"] = padpars->oscilgen; | |||
| } else { | |||
| objmap[base+"padpars/"] = nullptr; | |||
| objmap[base+"padpars/oscil/"] = nullptr; | |||
| objmap[base+"padpars/oscilgen/"] = nullptr; | |||
| } | |||
| } | |||
| } | |||
| @@ -1214,8 +1214,8 @@ void MiddleWareImpl::kitEnable(int part, int kit, int type) | |||
| */ | |||
| void MiddleWareImpl::handleMsg(const char *msg) | |||
| { | |||
| assert(!strstr(msg,"free")); | |||
| assert(msg && *msg && rindex(msg, '/')[1]); | |||
| assert(strstr(msg,"free") == NULL || strstr(rtosc_argument_string(msg), "b") == NULL); | |||
| assert(strcmp(msg, "/part0/Psysefxvol")); | |||
| assert(strcmp(msg, "/Penabled")); | |||
| assert(strcmp(msg, "part0/part0/Ppanning")); | |||
| @@ -4,7 +4,7 @@ | |||
| #include <string> | |||
| struct SYNTH_T; | |||
| class Master; | |||
| class Master; | |||
| //Link between realtime and non-realtime layers | |||
| class MiddleWare | |||
| { | |||
| @@ -98,7 +98,7 @@ XMLwrapper::XMLwrapper() | |||
| { | |||
| version.Major = 2; | |||
| version.Minor = 5; | |||
| version.Revision = 0; | |||
| version.Revision = 1; | |||
| minimal = true; | |||
| @@ -34,7 +34,11 @@ using namespace rtosc; | |||
| static const rtosc::Ports localPorts = { | |||
| rSelf(EnvelopeParams), | |||
| rPaste, | |||
| #undef rChangeCb | |||
| #define rChangeCb if(!obj->Pfreemode) obj->converttofree(); | |||
| rToggle(Pfreemode, "Complex Envelope Definitions"), | |||
| #undef rChangeCb | |||
| #define rChangeCb | |||
| 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"), | |||
| @@ -119,7 +119,7 @@ class ADvoicelistitem {open : {public Fl_Osc_Group} | |||
| class Fl_Osc_Output | |||
| } | |||
| Fl_Slider voicedetune { | |||
| callback {//detunevalueoutput->do_callback();} | |||
| callback {detunevalueoutput->update();} | |||
| tooltip {Fine Detune (cents)} xywh {315 5 185 20} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | |||
| code0 {o->init("PDetune",'i');} | |||
| class Fl_Osc_Slider | |||
| @@ -253,7 +253,7 @@ o->redraw();} | |||
| class Fl_Osc_Counter | |||
| } | |||
| Fl_Slider {} { | |||
| callback {o->oscWrite("detunevalue");} | |||
| callback {fmdetunevalueoutput->update();} | |||
| tooltip {Fine Detune (cents)} xywh {590 245 155 15} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | |||
| code0 {o->init("PFMDetune", 'i');} | |||
| class Fl_Osc_Slider | |||
| @@ -266,7 +266,7 @@ o->redraw();} | |||
| } | |||
| Fl_Choice {} { | |||
| label {Detune Type} | |||
| callback {fmdetunevalueoutput->do_callback();} open | |||
| callback {fmdetunevalueoutput->update();} open | |||
| xywh {540 280 75 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10 | |||
| code0 {o->add("Default");o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} | |||
| code1 {o->init("PFMDetuneType");} | |||
| @@ -466,7 +466,7 @@ o->redraw();} | |||
| class Fl_Osc_Counter | |||
| } | |||
| Fl_Slider {} { | |||
| callback {detunevalueoutput->do_callback();} | |||
| callback {detunevalueoutput->update();} | |||
| tooltip {Fine Detune (cents)} xywh {58 287 392 13} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | |||
| code0 {o->init("PDetune", 'i');} | |||
| class Fl_Osc_Slider | |||
| @@ -493,7 +493,7 @@ o->redraw();} | |||
| } | |||
| Fl_Choice {} { | |||
| label {Detune Type} | |||
| callback {detunevalueoutput->do_callback();} open | |||
| callback {detunevalueoutput->update();} open | |||
| xywh {455 320 70 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10 | |||
| code0 {o->add("Default");o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} | |||
| code1 {o->init("PDetuneType");} | |||
| @@ -866,7 +866,7 @@ class ADnoteUI {open : {public PresetsUI_} | |||
| class LFOUI | |||
| } {} | |||
| Fl_Slider detune { | |||
| callback {o->oscWrite("detunevalue");} | |||
| callback {detunevalueoutput->update();} | |||
| tooltip {Fine Detune (cents)} xywh {60 300 385 15} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | |||
| code0 {o->init("PDetune", 'i');} | |||
| class Fl_Osc_Slider | |||
| @@ -879,7 +879,7 @@ class ADnoteUI {open : {public PresetsUI_} | |||
| } | |||
| Fl_Choice detunetype { | |||
| label {Detune Type} | |||
| callback {o->oscWrite("detunevalue");} open | |||
| callback {detunevalueoutput->update();} open | |||
| xywh {455 340 75 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10 | |||
| code0 {o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} | |||
| code1 {o->init("PDetuneType",1);} | |||
| @@ -15,8 +15,8 @@ BankList::BankList(int x,int y, int w, int h, const char *label) | |||
| void BankList::init(std::string path) | |||
| { | |||
| ext = path; | |||
| oscRegister("bank-list"); | |||
| oscRegister(path.c_str()); | |||
| osc->createLink("/bank-list", this); | |||
| } | |||
| void BankList::OSC_raw(const char *msg) | |||
| @@ -29,12 +29,18 @@ decl {\#include "Fl_Osc_Counter.H"} {public local | |||
| decl {\#include "Fl_Osc_Choice.H"} {public local | |||
| } | |||
| decl {\#include "Osc_IntModel.h"} {public local | |||
| } | |||
| decl {\#include "Fl_Osc_Check.H"} {public local | |||
| } | |||
| decl {\#include "Fl_Osc_Input.H"} {public local | |||
| } | |||
| decl {\#include "Fl_Osc_Numeric_Input.H"} {public local | |||
| } | |||
| decl {\#include "Fl_Osc_ListView.H"} {public local | |||
| } | |||
| @@ -71,14 +77,14 @@ class ConfigUI {} { | |||
| Fl_Input samplerateinput { | |||
| xywh {115 50 60 20} type Int textfont 1 | |||
| code0 {o->init("cfg.SampleRate");} | |||
| class Fl_Osc_Input | |||
| class Fl_Osc_Numeric_Input | |||
| } | |||
| } | |||
| Fl_Input {} { | |||
| label {Buffer Size} | |||
| tooltip {Internal Sound Buffer Size (samples)} xywh {190 45 60 20} type Int labelsize 11 align 129 textfont 1 | |||
| code0 {o->init("cfg.SoundBufferSize");} | |||
| class Fl_Osc_Input | |||
| class Fl_Osc_Numeric_Input | |||
| } | |||
| Fl_Check_Button {} { | |||
| label {Swap Stereo } | |||
| @@ -86,11 +92,12 @@ class ConfigUI {} { | |||
| code0 {o->init("cfg.SwapStereo");} | |||
| class Fl_Osc_Check | |||
| } | |||
| Fl_Choice {} { | |||
| Fl_Choice oscilsize_widget { | |||
| label OscilSize | |||
| callback{ | |||
| oscilsize->updateVal((int)(o->value()+7)); | |||
| } | |||
| tooltip {ADSynth Oscillator Size (samples)} xywh {175 80 75 20} down_box BORDER_BOX labelfont 1 labelsize 11 textsize 10 | |||
| code0 {o->init("cfg.OscilPower");} | |||
| class Fl_Osc_Choice | |||
| } { | |||
| MenuItem {} { | |||
| label 128 | |||
| @@ -279,7 +286,14 @@ activatebutton_presetdir(true);} | |||
| Function {ConfigUI(Fl_Osc_Interface *osc_)} {} { | |||
| code { | |||
| osc = osc_; | |||
| make_window();} {} | |||
| make_window(); | |||
| oscilsize = new Osc_IntModel(osc); | |||
| oscilsize->callback = [this](int i){ | |||
| oscilsize_widget->value(i-7); | |||
| }; | |||
| oscilsize->update("/config/cfg.OscilPower"); | |||
| } {} | |||
| } | |||
| Function {activatebutton_rootdir(bool active)} {} { | |||
| code {if (active) { | |||
| @@ -308,4 +322,6 @@ activatebutton_presetdir(true);} | |||
| } | |||
| decl {class Fl_Osc_Interface *osc;} {public local | |||
| } | |||
| decl {class Osc_IntModel *oscilsize;} {public local | |||
| } | |||
| } | |||
| @@ -26,7 +26,7 @@ void EnvelopeFreeEdit::init(void) | |||
| void EnvelopeFreeEdit::OSC_raw(const char *msg) | |||
| { | |||
| const char *args = rtosc_argument_string(msg); | |||
| if(strstr(msg,"Penvpoints") && !strcmp(args, "c")) { | |||
| if(strstr(msg,"Penvpoints") && !strcmp(args, "i")) { | |||
| Penvpoints = rtosc_argument(msg, 0).i; | |||
| } else if(strstr(msg,"Penvdt") && !strcmp(args, "b")) { | |||
| rtosc_blob_t b = rtosc_argument(msg, 0).b; | |||
| @@ -36,7 +36,7 @@ void EnvelopeFreeEdit::OSC_raw(const char *msg) | |||
| rtosc_blob_t b = rtosc_argument(msg, 0).b; | |||
| assert(b.len == MAX_ENVELOPE_POINTS); | |||
| memcpy(Penvval, b.data, MAX_ENVELOPE_POINTS); | |||
| } else if(strstr(msg,"Penvsustain") && !strcmp(args, "c")) { | |||
| } else if(strstr(msg,"Penvsustain") && !strcmp(args, "i")) { | |||
| Penvsustain = rtosc_argument(msg, 0).i; | |||
| } | |||
| redraw(); | |||
| @@ -202,7 +202,10 @@ int EnvelopeFreeEdit::handle(int event) | |||
| else | |||
| Penvdt[currentpoint]=0; | |||
| oscWrite(to_s("Penvdt")+to_s(currentpoint), "c", newdt); | |||
| 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) | |||
| @@ -126,11 +126,15 @@ sustaincounter->update(); | |||
| } | |||
| Fl_Check_Button freemodebutton { | |||
| label FreeMode | |||
| callback {reinit(); | |||
| 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 | |||
| @@ -503,7 +507,6 @@ envfree->redraw();} | |||
| base = base_; | |||
| ext = ext_; | |||
| Envmode = env_type; | |||
| Pfreemode = false; | |||
| Penvsustain = false; | |||
| Penvpoints = 3; | |||
| Penvstretch = 0; | |||
| @@ -537,59 +540,60 @@ refresh();} {} | |||
| code {Fl_Osc_Group::rebase(new_base); | |||
| freemodeeditwindow->rebase(new_base+ext);} {} | |||
| } | |||
| Function {reinit()} {open | |||
| Function {reinit(bool Pfreemode)} {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; | |||
| }; | |||
| Pfreemode = !Pfreemode; | |||
| hide(); | |||
| const int winx=freemodeeditwindow->x(); | |||
| const int winy=freemodeeditwindow->y(); | |||
| freemodeeditwindow->hide(); | |||
| envwindow->hide(); | |||
| Fl_Group *par=envwindow->parent(); | |||
| par->hide(); | |||
| refresh(); | |||
| envwindow->show(); | |||
| par->redraw(); | |||
| par->show(); | |||
| show(); | |||
| freemodeeditwindow->position(winx,winy); | |||
| 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(); | |||
| }; | |||
| 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(); | |||
| hide(); | |||
| const int winx=freemodeeditwindow->x(); | |||
| const int winy=freemodeeditwindow->y(); | |||
| bool reshow = freemodeeditwindow->visible(); | |||
| freemodeeditwindow->hide(); | |||
| envwindow->hide(); | |||
| Fl_Group *par=envwindow->parent(); | |||
| par->hide(); | |||
| refresh(); | |||
| 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 | |||
| } | |||
| } | |||
| Function {refresh()} {open | |||
| } { | |||
| code {freemodebutton->value(Pfreemode); | |||
| code { | |||
| sustaincounter->value(Penvsustain); | |||
| sustaincounter->maximum(Penvpoints-2); | |||
| @@ -598,7 +602,7 @@ if (Pfreemode) { | |||
| linearenvelopecheck->value(Plinearenvelope); | |||
| //Conditionally display widgets | |||
| if(Pfreemode) { | |||
| if(freemodebutton->value()) { | |||
| freemodebutton->value(1); | |||
| addpoint->show(); | |||
| deletepoint->show(); | |||
| @@ -614,14 +618,14 @@ linearenvelopecheck->value(Plinearenvelope); | |||
| envstretchdial->hide(); | |||
| } | |||
| if(Pfreemode || Envmode>2) | |||
| if(freemodebutton->value() || Envmode>2) | |||
| linearenvelopecheck->hide(); | |||
| else | |||
| linearenvelopecheck->show(); | |||
| forcedreleasecheck->value(Pforcedrelease); | |||
| if (Pfreemode==0){ | |||
| if (freemodebutton->value()==0){ | |||
| addpoint->hide(); | |||
| deletepoint->hide(); | |||
| } else { | |||
| @@ -635,7 +639,7 @@ envADSRfilter->hide(); | |||
| envASRbw->hide(); | |||
| envfree->hide(); | |||
| if (Pfreemode==0){ | |||
| if (freemodebutton->value()==0){ | |||
| switch(Envmode){ | |||
| case 1: | |||
| case 2: | |||
| @@ -664,8 +668,6 @@ envwindow->show();} {} | |||
| } | |||
| decl {int Envmode;} {private local | |||
| } | |||
| decl {int Pfreemode;} {private local | |||
| } | |||
| decl {int Penvsustain;} {private local | |||
| } | |||
| decl {int Penvpoints;} {private local | |||
| @@ -0,0 +1,17 @@ | |||
| #pragma once | |||
| #include <FL/Fl_Input.H> | |||
| #include "Fl_Osc_Widget.H" | |||
| class Fl_Osc_Numeric_Input: public Fl_Input, public Fl_Osc_Widget | |||
| { | |||
| public: | |||
| Fl_Osc_Numeric_Input(int X, int Y, int W, int H, const char *label = NULL); | |||
| virtual ~Fl_Osc_Numeric_Input(void); | |||
| //Normal Initialization | |||
| void init(const char *path); | |||
| virtual void OSC_value(int i) override; | |||
| virtual void OSC_value(float f) override; | |||
| static void numeric_callback(Fl_Widget *w); | |||
| }; | |||
| @@ -0,0 +1,36 @@ | |||
| #include "Fl_Osc_Numeric_Input.H" | |||
| Fl_Osc_Numeric_Input::Fl_Osc_Numeric_Input(int X, int Y, int W, int H, const char *label) | |||
| :Fl_Input(X,Y,W,H, label), Fl_Osc_Widget(this) | |||
| { | |||
| callback(numeric_callback); | |||
| } | |||
| Fl_Osc_Numeric_Input::~Fl_Osc_Numeric_Input(void) | |||
| {} | |||
| void Fl_Osc_Numeric_Input::init(const char *path) | |||
| { | |||
| ext = path; | |||
| oscRegister(path); | |||
| } | |||
| void Fl_Osc_Numeric_Input::OSC_value(float f) | |||
| { | |||
| OSC_value((int)f); | |||
| } | |||
| void Fl_Osc_Numeric_Input::OSC_value(int i) | |||
| { | |||
| char buf[128]; | |||
| snprintf(buf, 128, "%d", i); | |||
| value(buf); | |||
| } | |||
| void Fl_Osc_Numeric_Input::numeric_callback(Fl_Widget *w) | |||
| { | |||
| auto &ww = *(Fl_Osc_Numeric_Input *)w; | |||
| int x = atoi(ww.value()); | |||
| if(x) | |||
| ww.oscWrite(ww.ext, "i", x); | |||
| } | |||
| @@ -2,7 +2,7 @@ | |||
| #include <FL/Fl_Value_Output.H> | |||
| #include "Fl_Osc_Widget.H" | |||
| class Fl_Osc_Output:public Fl_Value_Output, Fl_Osc_Widget | |||
| class Fl_Osc_Output:public Fl_Value_Output, public Fl_Osc_Widget | |||
| { | |||
| public: | |||
| Fl_Osc_Output(int x, int y, int w, int h, const char *label = NULL); | |||
| @@ -19,6 +19,5 @@ class Fl_Osc_Output:public Fl_Value_Output, Fl_Osc_Widget | |||
| void cb(void); | |||
| private: | |||
| float newvalue_; | |||
| std::string name; | |||
| std::pair<Fl_Callback*, void*> cb_data; | |||
| }; | |||
| @@ -19,7 +19,7 @@ Fl_Osc_Output::Fl_Osc_Output(int X, int Y, int W, int H, const char *label) | |||
| void Fl_Osc_Output::init(const char *path) | |||
| { | |||
| name = path; | |||
| ext = path; | |||
| oscRegister(path); | |||
| }; | |||
| @@ -51,7 +51,7 @@ void Fl_Osc_Output::OSC_value(float v) | |||
| void Fl_Osc_Output::update(void) | |||
| { | |||
| oscWrite(name); | |||
| oscWrite(ext); | |||
| } | |||
| float Fl_Osc_Output::newvalue(void) const | |||
| @@ -61,5 +61,5 @@ float Fl_Osc_Output::newvalue(void) const | |||
| void Fl_Osc_Output::cb(void) | |||
| { | |||
| oscWrite(name); | |||
| oscWrite(ext); | |||
| } | |||
| @@ -54,6 +54,9 @@ class Fl_Oscilloscope : public Fl_Box, public Fl_Osc_Widget | |||
| virtual void OSC_value(unsigned N, void *data) override | |||
| { | |||
| if(oscilsize == 0) | |||
| OSC_value((int)N/4); | |||
| assert(N==(unsigned)(oscilsize*4)); | |||
| memcpy(smps, data, N); | |||
| @@ -56,7 +56,7 @@ class Fl_Osc_StrChoice:public Fl_Choice, public Fl_Osc_Widget | |||
| cb_data.first = cb; | |||
| cb_data.second = p; | |||
| } | |||
| void cb(void) | |||
| { | |||
| assert(osc); | |||
| @@ -110,7 +110,7 @@ NioUI::NioUI(Fl_Osc_Interface *osc) | |||
| for(auto io:list) | |||
| audio->add(io.c_str()); | |||
| }; | |||
| midi_opt->update("/io/source-list"); | |||
| audio_opt->update("/io/sink-list"); | |||
| @@ -0,0 +1,45 @@ | |||
| #pragma once | |||
| #include "Fl_Osc_Widget.H" | |||
| #include <functional> | |||
| #include <vector> | |||
| #include <rtosc/rtosc.h> | |||
| class Osc_IntModel:public Fl_Osc_Widget | |||
| { | |||
| public: | |||
| Osc_IntModel(Fl_Osc_Interface *osc_) | |||
| :Fl_Osc_Widget("", osc_), value(0) | |||
| { | |||
| assert(osc); | |||
| } | |||
| typedef int value_t; | |||
| value_t value; | |||
| std::function<void(value_t)> callback; | |||
| void updateVal(value_t v) | |||
| { | |||
| value = v; | |||
| oscWrite(ext, "i", v); | |||
| } | |||
| void update(std::string url) | |||
| { | |||
| if(!ext.empty()) | |||
| osc->removeLink(this); | |||
| ext = url; | |||
| oscRegister(ext.c_str()); | |||
| } | |||
| //Raw messages | |||
| virtual void OSC_raw(const char *msg) | |||
| { | |||
| std::string args = rtosc_argument_string(msg); | |||
| if(args == "i") { | |||
| value = rtosc_argument(msg, 0).i; | |||
| if(callback) | |||
| callback(value); | |||
| } | |||
| } | |||
| }; | |||
| @@ -119,7 +119,7 @@ class Oscilharmonic {: {public Fl_Group} | |||
| Fl_Slider mag { | |||
| callback {int x=64; | |||
| if (Fl::event_button3()) o->value(x); | |||
| else x=127-(int)o->value(); | |||
| else x=128-(int)o->value(); | |||
| if (x==64) o->selection_color(0); | |||
| else o->selection_color(222); | |||
| @@ -496,12 +496,15 @@ redrawoscil();} | |||
| if (autoclearbutton->value()){ | |||
| for (int i=0;i<MAX_AD_HARMONICS;i++){ | |||
| h[i]->mag->value(64); | |||
| h[i]->mag->do_callback(); | |||
| h[i]->phase->value(64); | |||
| h[i]->phase->do_callback(); | |||
| }; | |||
| harmonicshiftcounter->value(0); | |||
| h[0]->mag->value(0); | |||
| h[0]->mag->do_callback(); | |||
| wshbutton->value(0); | |||
| wshbutton->do_callback(); | |||
| fltbutton->value(0); | |||
| @@ -527,9 +530,12 @@ redrawoscil();} | |||
| for (int i=0;i<MAX_AD_HARMONICS;i++){ | |||
| h[i]->mag->value(64); | |||
| h[i]->mag->do_callback(); | |||
| h[i]->phase->value(64); | |||
| h[i]->phase->do_callback(); | |||
| }; | |||
| h[0]->mag->value(0); | |||
| h[0]->mag->do_callback(); | |||
| //for (int i=0;i<MAX_AD_HARMONICS;i++){ | |||
| // if (oscil->Phmag[i]==64) h[i]->mag->selection_color(0); | |||
| @@ -429,11 +429,29 @@ int main(int argc, char *argv[]) | |||
| gui = NULL; | |||
| //Capture Startup Responses | |||
| typedef std::vector<const char *> wait_t; | |||
| wait_t msg_waitlist; | |||
| middleware->setUiCallback([](void*v,const char*msg) { | |||
| wait_t &wait = *(wait_t*)v; | |||
| size_t len = rtosc_message_length(msg, -1); | |||
| char *copy = new char[len]; | |||
| memcpy(copy, msg, len); | |||
| wait.push_back(copy); | |||
| }, &msg_waitlist); | |||
| if(!noui) | |||
| gui = GUI::createUi(middleware->spawnUiApi(), &Pexitprogram); | |||
| middleware->setUiCallback(GUI::raiseUi, gui); | |||
| middleware->setIdleCallback([](void*){GUI::tickUi(gui);}, NULL); | |||
| //Replay Startup Responses | |||
| for(auto msg:msg_waitlist) { | |||
| GUI::raiseUi(gui, msg); | |||
| delete [] msg; | |||
| } | |||
| if(!noui) | |||
| { | |||
| GUI::raiseUi(gui, "/show", "i", config.cfg.UserInterfaceMode); | |||