| @@ -207,9 +207,10 @@ float interpolate(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); | |||
| } | |||
| @@ -30,8 +30,6 @@ enum FMTYPE { | |||
| NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD | |||
| }; | |||
| #define FADEIN_ADJUSTMENT_SCALE 20 | |||
| /*****************************************************************/ | |||
| /* GLOBAL PARAMETERS */ | |||
| /*****************************************************************/ | |||
| @@ -51,6 +51,8 @@ static const rtosc::Ports realtime_ports = | |||
| rParamZyn(PVolume, "Synth Volume"), | |||
| rParamZyn(PAmpVelocityScaleFunction, "Amplitude Velocity Sensing function"), | |||
| rParamZyn(Fadein_adjustment, "Adjustment for anti-pop strategy."), | |||
| //Punch | |||
| rParamZyn(PPunchStrength, "Punch Strength"), | |||
| rParamZyn(PPunchTime, "UNKNOWN"), | |||
| @@ -323,6 +325,7 @@ void PADnoteParameters::defaults() | |||
| PAmpVelocityScaleFunction = 64; | |||
| AmpEnvelope->defaults(); | |||
| AmpLfo->defaults(); | |||
| Fadein_adjustment = FADEIN_ADJUSTMENT_SCALE; | |||
| PPunchStrength = 0; | |||
| PPunchTime = 60; | |||
| PPunchStretch = 64; | |||
| @@ -947,6 +950,7 @@ void PADnoteParameters::add2XML(XMLwrapper *xml) | |||
| xml->addpar("volume", PVolume); | |||
| xml->addpar("panning", PPanning); | |||
| xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||
| xml->addpar("fadein_adjustment", Fadein_adjustment); | |||
| xml->addpar("punch_strength", PPunchStrength); | |||
| xml->addpar("punch_time", PPunchTime); | |||
| xml->addpar("punch_stretch", PPunchStretch); | |||
| @@ -1058,6 +1062,7 @@ void PADnoteParameters::getfromXML(XMLwrapper *xml) | |||
| PPanning = xml->getpar127("panning", PPanning); | |||
| PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | |||
| PAmpVelocityScaleFunction); | |||
| Fadein_adjustment = xml->getpar127("fadein_adjustment", Fadein_adjustment); | |||
| PPunchStrength = xml->getpar127("punch_strength", PPunchStrength); | |||
| PPunchTime = xml->getpar127("punch_time", PPunchTime); | |||
| PPunchStretch = xml->getpar127("punch_stretch", PPunchStretch); | |||
| @@ -126,6 +126,9 @@ class PADnoteParameters:public Presets | |||
| LFOParams *AmpLfo; | |||
| /* Adjustment factor for anti-pop fadein */ | |||
| unsigned char Fadein_adjustment; | |||
| unsigned char PPunchStrength, PPunchTime, PPunchStretch, | |||
| PPunchVelocitySensing; | |||
| @@ -447,7 +447,9 @@ float OscilGen::userfunc(float x) | |||
| fft->freqs2smps(basefuncFFTfreqs, cachedbasefunc); | |||
| 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(); | |||
| } | |||
| if(Pcurrentbasefunc != 0) | |||
| changebasefunction(); | |||
| if(xml->enterbranch("BASE_FUNCTION")) { | |||
| for(int i = 1; i < synth.oscilsize / 2; ++i) | |||
| if(xml->enterbranch("BF_HARMONIC", i)) { | |||
| @@ -1354,14 +1359,10 @@ void OscilGen::getfromXML(XMLwrapper *xml) | |||
| } | |||
| xml->exitbranch(); | |||
| if(Pcurrentbasefunc != 0) | |||
| changebasefunction(); | |||
| clearDC(basefuncFFTfreqs); | |||
| normalize(basefuncFFTfreqs, synth.oscilsize); | |||
| } else if(Pcurrentbasefunc != 0) | |||
| changebasefunction(); | |||
| } | |||
| cachedbasevalid = false; | |||
| }} | |||
| //Define basic functions | |||
| @@ -114,6 +114,9 @@ void PADnote::setup(float freq, | |||
| PFilterVelocityScaleFunction) - 1); | |||
| if(!legato) { | |||
| NoteGlobalPar.Fadein_adjustment = | |||
| pars.Fadein_adjustment / (float)FADEIN_ADJUSTMENT_SCALE; | |||
| NoteGlobalPar.Fadein_adjustment *= NoteGlobalPar.Fadein_adjustment; | |||
| if(pars.PPunchStrength != 0) { | |||
| NoteGlobalPar.Punch.Enabled = 1; | |||
| 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; | |||
| if(tmp < 8.0f) | |||
| tmp = 8.0f; | |||
| tmp *= NoteGlobalPar.Fadein_adjustment; | |||
| int n; | |||
| F2I(tmp, n); //how many samples is the fade-in | |||
| @@ -85,6 +85,7 @@ class PADnote:public SynthNote | |||
| Envelope *AmpEnvelope; | |||
| LFO *AmpLfo; | |||
| float Fadein_adjustment; | |||
| struct { | |||
| int Enabled; | |||
| float initialvalue, dt, t; | |||
| @@ -714,27 +714,33 @@ cbwidget->do_callback();} | |||
| code0 {o->init("PPanning");} | |||
| 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 { | |||
| 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");} | |||
| class Fl_Osc_Dial | |||
| } | |||
| Fl_Dial pt { | |||
| 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");} | |||
| class Fl_Osc_Dial | |||
| } | |||
| Fl_Dial pstc { | |||
| 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");} | |||
| class Fl_Osc_Dial | |||
| } | |||
| Fl_Dial pvel { | |||
| 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");} | |||
| class Fl_Osc_Dial | |||
| } | |||
| @@ -753,7 +759,7 @@ cbwidget->do_callback();} | |||
| Fl_Check_Button stereo { | |||
| label Stereo | |||
| 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");} | |||
| class Fl_Osc_Check | |||
| } | |||
| @@ -776,7 +782,7 @@ cbwidget->do_callback();} | |||
| } {} | |||
| Fl_Group filterui { | |||
| 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", | |||
| osc_i, location, "GlobalFilter/");} | |||
| class FilterUI | |||
| @@ -19,8 +19,10 @@ | |||
| */ | |||
| #include <rtosc/thread-link.h> | |||
| #include <lo/lo.h> | |||
| #include <string> | |||
| #include <thread> | |||
| //GUI System | |||
| #include "Connection.h" | |||
| @@ -509,6 +511,8 @@ Fl_Osc_Interface *GUI::genOscInterface(MiddleWare *) | |||
| return new UI_Interface(); | |||
| } | |||
| rtosc::ThreadLink lo_buffer(4096, 1000); | |||
| static void liblo_error_cb(int i, const char *m, const char *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)); | |||
| lo_message_serialise(msg, path, buffer, &size); | |||
| assert(size <= sizeof(buffer)); | |||
| raiseUi(gui, buffer); | |||
| lo_buffer.raw_write(buffer); | |||
| return 0; | |||
| } | |||
| void watch_lo(void) | |||
| { | |||
| while(server && Pexitprogram == 0) | |||
| lo_server_recv_noblock(server, 100); | |||
| } | |||
| #ifndef CARLA_VERSION_STRING | |||
| int main(int argc, char *argv[]) | |||
| { | |||
| @@ -542,17 +552,19 @@ int main(int argc, char *argv[]) | |||
| sendtourl = argv[1]; | |||
| } | |||
| 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::raiseUi(gui, "/show", "i", 1); | |||
| while(Pexitprogram == 0) { | |||
| if(server) | |||
| while(lo_server_recv_noblock(server, 0)); | |||
| GUI::tickUi(gui); | |||
| while(lo_buffer.hasNext()) | |||
| raiseUi(gui, lo_buffer.read()); | |||
| } | |||
| exitprogram(); | |||
| lo_watch.join(); | |||
| return 0; | |||
| } | |||
| #endif | |||
| @@ -179,6 +179,11 @@ typedef std::complex<fftw_real> fft_t; | |||
| #define PI 3.1415926536f | |||
| #define LOG_10 2.302585093f | |||
| /* | |||
| * For de-pop adjustment | |||
| */ | |||
| #define FADEIN_ADJUSTMENT_SCALE 20 | |||
| /* | |||
| * Envelope Limits | |||
| */ | |||