| @@ -207,9 +207,10 @@ float interpolate(const float *data, size_t len, float pos) | |||||
| float cinterpolate(const float *data, size_t len, float pos) | float cinterpolate(const float *data, size_t len, float pos) | ||||
| { | { | ||||
| const int l_pos = ((int)pos) % len, | |||||
| r_pos = (l_pos + 1) % len; | |||||
| const float leftness = pos - l_pos; | |||||
| const unsigned int i_pos = pos, | |||||
| l_pos = i_pos % len, | |||||
| r_pos = l_pos + 1 < len ? l_pos + 1 : 0; | |||||
| const float leftness = pos - i_pos; | |||||
| return data[l_pos] * leftness + data[r_pos] * (1.0f - leftness); | return data[l_pos] * leftness + data[r_pos] * (1.0f - leftness); | ||||
| } | } | ||||
| @@ -30,8 +30,6 @@ enum FMTYPE { | |||||
| NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD | NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD | ||||
| }; | }; | ||||
| #define FADEIN_ADJUSTMENT_SCALE 20 | |||||
| /*****************************************************************/ | /*****************************************************************/ | ||||
| /* GLOBAL PARAMETERS */ | /* GLOBAL PARAMETERS */ | ||||
| /*****************************************************************/ | /*****************************************************************/ | ||||
| @@ -51,6 +51,8 @@ static const rtosc::Ports realtime_ports = | |||||
| rParamZyn(PVolume, "Synth Volume"), | rParamZyn(PVolume, "Synth Volume"), | ||||
| rParamZyn(PAmpVelocityScaleFunction, "Amplitude Velocity Sensing function"), | rParamZyn(PAmpVelocityScaleFunction, "Amplitude Velocity Sensing function"), | ||||
| rParamZyn(Fadein_adjustment, "Adjustment for anti-pop strategy."), | |||||
| //Punch | //Punch | ||||
| rParamZyn(PPunchStrength, "Punch Strength"), | rParamZyn(PPunchStrength, "Punch Strength"), | ||||
| rParamZyn(PPunchTime, "UNKNOWN"), | rParamZyn(PPunchTime, "UNKNOWN"), | ||||
| @@ -323,6 +325,7 @@ void PADnoteParameters::defaults() | |||||
| PAmpVelocityScaleFunction = 64; | PAmpVelocityScaleFunction = 64; | ||||
| AmpEnvelope->defaults(); | AmpEnvelope->defaults(); | ||||
| AmpLfo->defaults(); | AmpLfo->defaults(); | ||||
| Fadein_adjustment = FADEIN_ADJUSTMENT_SCALE; | |||||
| PPunchStrength = 0; | PPunchStrength = 0; | ||||
| PPunchTime = 60; | PPunchTime = 60; | ||||
| PPunchStretch = 64; | PPunchStretch = 64; | ||||
| @@ -947,6 +950,7 @@ void PADnoteParameters::add2XML(XMLwrapper *xml) | |||||
| xml->addpar("volume", PVolume); | xml->addpar("volume", PVolume); | ||||
| xml->addpar("panning", PPanning); | xml->addpar("panning", PPanning); | ||||
| xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | ||||
| xml->addpar("fadein_adjustment", Fadein_adjustment); | |||||
| xml->addpar("punch_strength", PPunchStrength); | xml->addpar("punch_strength", PPunchStrength); | ||||
| xml->addpar("punch_time", PPunchTime); | xml->addpar("punch_time", PPunchTime); | ||||
| xml->addpar("punch_stretch", PPunchStretch); | xml->addpar("punch_stretch", PPunchStretch); | ||||
| @@ -1058,6 +1062,7 @@ void PADnoteParameters::getfromXML(XMLwrapper *xml) | |||||
| PPanning = xml->getpar127("panning", PPanning); | PPanning = xml->getpar127("panning", PPanning); | ||||
| PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | ||||
| PAmpVelocityScaleFunction); | PAmpVelocityScaleFunction); | ||||
| Fadein_adjustment = xml->getpar127("fadein_adjustment", Fadein_adjustment); | |||||
| PPunchStrength = xml->getpar127("punch_strength", PPunchStrength); | PPunchStrength = xml->getpar127("punch_strength", PPunchStrength); | ||||
| PPunchTime = xml->getpar127("punch_time", PPunchTime); | PPunchTime = xml->getpar127("punch_time", PPunchTime); | ||||
| PPunchStretch = xml->getpar127("punch_stretch", PPunchStretch); | PPunchStretch = xml->getpar127("punch_stretch", PPunchStretch); | ||||
| @@ -126,6 +126,9 @@ class PADnoteParameters:public Presets | |||||
| LFOParams *AmpLfo; | LFOParams *AmpLfo; | ||||
| /* Adjustment factor for anti-pop fadein */ | |||||
| unsigned char Fadein_adjustment; | |||||
| unsigned char PPunchStrength, PPunchTime, PPunchStretch, | unsigned char PPunchStrength, PPunchTime, PPunchStretch, | ||||
| PPunchVelocitySensing; | PPunchVelocitySensing; | ||||
| @@ -447,7 +447,9 @@ float OscilGen::userfunc(float x) | |||||
| fft->freqs2smps(basefuncFFTfreqs, cachedbasefunc); | fft->freqs2smps(basefuncFFTfreqs, cachedbasefunc); | ||||
| cachedbasevalid = true; | cachedbasevalid = true; | ||||
| } | } | ||||
| return cinterpolate(cachedbasefunc, synth.oscilsize, synth.oscilsize * x); | |||||
| return cinterpolate(cachedbasefunc, | |||||
| synth.oscilsize, | |||||
| synth.oscilsize * (x + 1) - 1); | |||||
| } | } | ||||
| /* | /* | ||||
| @@ -1344,6 +1346,9 @@ void OscilGen::getfromXML(XMLwrapper *xml) | |||||
| xml->exitbranch(); | xml->exitbranch(); | ||||
| } | } | ||||
| if(Pcurrentbasefunc != 0) | |||||
| changebasefunction(); | |||||
| if(xml->enterbranch("BASE_FUNCTION")) { | if(xml->enterbranch("BASE_FUNCTION")) { | ||||
| for(int i = 1; i < synth.oscilsize / 2; ++i) | for(int i = 1; i < synth.oscilsize / 2; ++i) | ||||
| if(xml->enterbranch("BF_HARMONIC", i)) { | if(xml->enterbranch("BF_HARMONIC", i)) { | ||||
| @@ -1354,14 +1359,10 @@ void OscilGen::getfromXML(XMLwrapper *xml) | |||||
| } | } | ||||
| xml->exitbranch(); | xml->exitbranch(); | ||||
| if(Pcurrentbasefunc != 0) | |||||
| changebasefunction(); | |||||
| clearDC(basefuncFFTfreqs); | clearDC(basefuncFFTfreqs); | ||||
| normalize(basefuncFFTfreqs, synth.oscilsize); | normalize(basefuncFFTfreqs, synth.oscilsize); | ||||
| } else if(Pcurrentbasefunc != 0) | |||||
| changebasefunction(); | |||||
| } | |||||
| cachedbasevalid = false; | |||||
| }} | |||||
| //Define basic functions | //Define basic functions | ||||
| @@ -114,6 +114,9 @@ void PADnote::setup(float freq, | |||||
| PFilterVelocityScaleFunction) - 1); | PFilterVelocityScaleFunction) - 1); | ||||
| if(!legato) { | if(!legato) { | ||||
| NoteGlobalPar.Fadein_adjustment = | |||||
| pars.Fadein_adjustment / (float)FADEIN_ADJUSTMENT_SCALE; | |||||
| NoteGlobalPar.Fadein_adjustment *= NoteGlobalPar.Fadein_adjustment; | |||||
| if(pars.PPunchStrength != 0) { | if(pars.PPunchStrength != 0) { | ||||
| NoteGlobalPar.Punch.Enabled = 1; | NoteGlobalPar.Punch.Enabled = 1; | ||||
| NoteGlobalPar.Punch.t = 1.0f; //start from 1.0f and to 0.0f | NoteGlobalPar.Punch.t = 1.0f; //start from 1.0f and to 0.0f | ||||
| @@ -206,6 +209,7 @@ inline void PADnote::fadein(float *smps) | |||||
| float tmp = (synth.buffersize_f - 1.0f) / (zerocrossings + 1) / 3.0f; | float tmp = (synth.buffersize_f - 1.0f) / (zerocrossings + 1) / 3.0f; | ||||
| if(tmp < 8.0f) | if(tmp < 8.0f) | ||||
| tmp = 8.0f; | tmp = 8.0f; | ||||
| tmp *= NoteGlobalPar.Fadein_adjustment; | |||||
| int n; | int n; | ||||
| F2I(tmp, n); //how many samples is the fade-in | F2I(tmp, n); //how many samples is the fade-in | ||||
| @@ -85,6 +85,7 @@ class PADnote:public SynthNote | |||||
| Envelope *AmpEnvelope; | Envelope *AmpEnvelope; | ||||
| LFO *AmpLfo; | LFO *AmpLfo; | ||||
| float Fadein_adjustment; | |||||
| struct { | struct { | ||||
| int Enabled; | int Enabled; | ||||
| float initialvalue, dt, t; | float initialvalue, dt, t; | ||||
| @@ -714,27 +714,33 @@ cbwidget->do_callback();} | |||||
| code0 {o->init("PPanning");} | code0 {o->init("PPanning");} | ||||
| class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
| } | } | ||||
| Fl_Dial {} { | |||||
| label De-pop selected | |||||
| tooltip {Pop suppression} xywh {208 238 20 20} type Float labelsize 10 maximum 127 step 1 textfont 1 textsize 11 | |||||
| code0 {o->init("Fadein_adjustment");} | |||||
| class Fl_Osc_Dial | |||||
| } | |||||
| Fl_Dial pstr { | Fl_Dial pstr { | ||||
| label {P.Str.} | label {P.Str.} | ||||
| tooltip {Punch Strength} xywh {125 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| tooltip {Punch Strength} xywh {78 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| code0 {o->init("PPunchStrength");} | code0 {o->init("PPunchStrength");} | ||||
| class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
| } | } | ||||
| Fl_Dial pt { | Fl_Dial pt { | ||||
| label {P.t.} | label {P.t.} | ||||
| tooltip {Punch Time (duration)} xywh {155 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| tooltip {Punch Time (duration)} xywh {108 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| code0 {o->init("PPunchTime");} | code0 {o->init("PPunchTime");} | ||||
| class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
| } | } | ||||
| Fl_Dial pstc { | Fl_Dial pstc { | ||||
| label {P.Stc.} | label {P.Stc.} | ||||
| tooltip {Punch Stretch} xywh {185 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| tooltip {Punch Stretch} xywh {138 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| code0 {o->init("PPunchStretch");} | code0 {o->init("PPunchStretch");} | ||||
| class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
| } | } | ||||
| Fl_Dial pvel { | Fl_Dial pvel { | ||||
| label {P.Vel.} | label {P.Vel.} | ||||
| tooltip {Punch Velocity Sensing} xywh {215 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| tooltip {Punch Velocity Sensing} xywh {168 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | |||||
| code0 {o->init("PPunchVelocitySensing");} | code0 {o->init("PPunchVelocitySensing");} | ||||
| class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
| } | } | ||||
| @@ -753,7 +759,7 @@ cbwidget->do_callback();} | |||||
| Fl_Check_Button stereo { | Fl_Check_Button stereo { | ||||
| label Stereo | label Stereo | ||||
| callback {hprofile->redraw();} | callback {hprofile->redraw();} | ||||
| xywh {15 245 70 25} down_box DOWN_BOX | |||||
| xywh {10 245 70 25} down_box DOWN_BOX labelsize 12 | |||||
| code0 {o->init("PStereo");} | code0 {o->init("PStereo");} | ||||
| class Fl_Osc_Check | class Fl_Osc_Check | ||||
| } | } | ||||
| @@ -776,7 +782,7 @@ cbwidget->do_callback();} | |||||
| } {} | } {} | ||||
| Fl_Group filterui { | Fl_Group filterui { | ||||
| label {PADsynth - Filter} open | label {PADsynth - Filter} open | ||||
| xywh {250 55 275 75} box FLAT_BOX color 50 align 144 | |||||
| xywh {250 50 275 75} box FLAT_BOX color 50 align 144 | |||||
| code0 {o->init(location + "PFilter", | code0 {o->init(location + "PFilter", | ||||
| osc_i, location, "GlobalFilter/");} | osc_i, location, "GlobalFilter/");} | ||||
| class FilterUI | class FilterUI | ||||
| @@ -19,8 +19,10 @@ | |||||
| */ | */ | ||||
| #include <rtosc/thread-link.h> | |||||
| #include <lo/lo.h> | #include <lo/lo.h> | ||||
| #include <string> | #include <string> | ||||
| #include <thread> | |||||
| //GUI System | //GUI System | ||||
| #include "Connection.h" | #include "Connection.h" | ||||
| @@ -509,6 +511,8 @@ Fl_Osc_Interface *GUI::genOscInterface(MiddleWare *) | |||||
| return new UI_Interface(); | return new UI_Interface(); | ||||
| } | } | ||||
| rtosc::ThreadLink lo_buffer(4096, 1000); | |||||
| static void liblo_error_cb(int i, const char *m, const char *loc) | static void liblo_error_cb(int i, const char *m, const char *loc) | ||||
| { | { | ||||
| fprintf(stderr, "liblo :-( %d-%s@%s\n",i,m,loc); | fprintf(stderr, "liblo :-( %d-%s@%s\n",i,m,loc); | ||||
| @@ -527,11 +531,17 @@ static int handler_function(const char *path, const char *types, lo_arg **argv, | |||||
| assert(lo_message_length(msg, path) <= sizeof(buffer)); | assert(lo_message_length(msg, path) <= sizeof(buffer)); | ||||
| lo_message_serialise(msg, path, buffer, &size); | lo_message_serialise(msg, path, buffer, &size); | ||||
| assert(size <= sizeof(buffer)); | assert(size <= sizeof(buffer)); | ||||
| raiseUi(gui, buffer); | |||||
| lo_buffer.raw_write(buffer); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void watch_lo(void) | |||||
| { | |||||
| while(server && Pexitprogram == 0) | |||||
| lo_server_recv_noblock(server, 100); | |||||
| } | |||||
| #ifndef CARLA_VERSION_STRING | #ifndef CARLA_VERSION_STRING | ||||
| int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||
| { | { | ||||
| @@ -542,17 +552,19 @@ int main(int argc, char *argv[]) | |||||
| sendtourl = argv[1]; | sendtourl = argv[1]; | ||||
| } | } | ||||
| fprintf(stderr, "ext client running on %d\n", lo_server_get_port(server)); | fprintf(stderr, "ext client running on %d\n", lo_server_get_port(server)); | ||||
| std::thread lo_watch(watch_lo); | |||||
| gui = GUI::createUi(new UI_Interface(), &Pexitprogram); | gui = GUI::createUi(new UI_Interface(), &Pexitprogram); | ||||
| GUI::raiseUi(gui, "/show", "i", 1); | GUI::raiseUi(gui, "/show", "i", 1); | ||||
| while(Pexitprogram == 0) { | while(Pexitprogram == 0) { | ||||
| if(server) | |||||
| while(lo_server_recv_noblock(server, 0)); | |||||
| GUI::tickUi(gui); | GUI::tickUi(gui); | ||||
| while(lo_buffer.hasNext()) | |||||
| raiseUi(gui, lo_buffer.read()); | |||||
| } | } | ||||
| exitprogram(); | exitprogram(); | ||||
| lo_watch.join(); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -179,6 +179,11 @@ typedef std::complex<fftw_real> fft_t; | |||||
| #define PI 3.1415926536f | #define PI 3.1415926536f | ||||
| #define LOG_10 2.302585093f | #define LOG_10 2.302585093f | ||||
| /* | |||||
| * For de-pop adjustment | |||||
| */ | |||||
| #define FADEIN_ADJUSTMENT_SCALE 20 | |||||
| /* | /* | ||||
| * Envelope Limits | * Envelope Limits | ||||
| */ | */ | ||||