zynaddsubfx

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

commit 09555136c12947ab77a3849d2bdfc991bff4b996
parent 3db418b800e8811ab1c7d4cdc1b0a977c10319df
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Wed, 28 Jun 2017 14:30:26 -0400

FilterParams: Add Hooks For Depricated Ports

Diffstat:
Msrc/Params/FilterParams.cpp | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Msrc/Tests/MessageTest.h | 47+++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 106 insertions(+), 6 deletions(-)

diff --git a/src/Params/FilterParams.cpp b/src/Params/FilterParams.cpp @@ -3,7 +3,9 @@ FilterParams.cpp - Parameters for filter Copyright (C) 2002-2005 Nasca Octavian Paul + Copyright (C) 2017 Mark McCurry Author: Nasca Octavian Paul + Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -226,12 +228,63 @@ const rtosc::Ports FilterParams::ports = { }}, //Old 0..127 parameter mappings - rParamZyn(Pfreq, rShort("cutoff"), rProp(deprecated), "Center Freq"), - rParamZyn(Pfreqtrack, rShort("f.track"), rProp(deprecated), - "Frequency Tracking amount"), - rParamZyn(Pgain, rShort("gain"), rProp(deprecated), "Output Gain"), - rParamZyn(Pq, rShort("q"), rProp(deprecated), - "Quality Factor (resonance/bandwidth)"), + {"Pfreq::i", rLinear(0, 127) rShort("cutoff") rProp(deprecated) rDoc("Center Freq"), 0, + [](const char *msg, RtData &d) { + FilterParams *obj = (FilterParams*)d.obj; + if(rtosc_narguments(msg)) { + int Pfreq = rtosc_argument(msg, 0).i; + obj->basefreq = (Pfreq / 64.0f - 1.0f) * 5.0f; + obj->basefreq = powf(2.0f, obj->basefreq + 9.96578428f); + rChangeCb; + d.broadcast(d.loc, "i", Pfreq); + } else { + float tmp = obj->basefreq; + tmp = log2f(tmp) - 9.96578428f; + tmp = (tmp / 5.0 + 1.0) * 64.0f; + int Pfreq = roundf(tmp); + d.reply(d.loc, "i", Pfreq); + } + }}, + {"Pfreqtrack::i", rLinear(0, 127) rShort("f.track") rProp(deprecated) rDoc("Frequency Tracking amount"), 0, + [](const char *msg, RtData &d) { + FilterParams *obj = (FilterParams*)d.obj; + if(rtosc_narguments(msg)) { + int Pfreqtracking = rtosc_argument(msg, 0).i; + obj->freqtracking = 100 * (Pfreqtracking - 64.0f) / (64.0f); + rChangeCb; + d.broadcast(d.loc, "i", Pfreqtracking); + } else { + int Pfreqtracking = obj->freqtracking/100.0*64.0 + 64.0; + d.reply(d.loc, "i", Pfreqtracking); + } + }}, + {"Pgain::i", rLinear(0, 127) rShort("gain") rProp(deprecated) rDoc("Output Gain"), 0, + [](const char *msg, RtData &d) { + FilterParams *obj = (FilterParams*)d.obj; + if(rtosc_narguments(msg)) { + int Pgain = rtosc_argument(msg, 0).i; + obj->gain = (Pgain / 64.0f - 1.0f) * 30.0f; //-30..30dB + rChangeCb; + d.broadcast(d.loc, "i", Pgain); + } else { + int Pgain = roundf((obj->gain/30.0f + 1.0f) * 64.0f); + d.reply(d.loc, "i", Pgain); + } + }}, + {"Pq::i", rLinear(0,127) rShort("q") rProp(deprecated) + rDoc("Quality Factor (resonance/bandwidth)"), 0, + [](const char *msg, RtData &d) { + FilterParams *obj = (FilterParams*)d.obj; + if(rtosc_narguments(msg)) { + int Pq = rtosc_argument(msg, 0).i; + obj->baseq = expf(powf((float) Pq / 127.0f, 2) * logf(1000.0f)) - 0.9f; + rChangeCb; + d.broadcast(d.loc, "i", Pq); + } else { + int Pq = roundf(127.0f * sqrtf(logf(0.9f + obj->baseq)/logf(1000.0f))); + d.reply(d.loc, "i", Pq); + } + }}, }; #undef rChangeCb #define rChangeCb diff --git a/src/Tests/MessageTest.h b/src/Tests/MessageTest.h @@ -243,6 +243,53 @@ class MessageTest:public CxxTest::TestSuite TS_ASSERT_EQUALS(field2, 35); } + void testFilterDepricated(void) + { + vector<string> v = {"Pfreq", "Pfreqtrack", "Pgain", "Pq"}; + for(int i=0; i<v.size(); ++i) { + string path = "/part0/kit0/adpars/GlobalPar/GlobalFilter/"+v[i]; + for(int j=0; j<128; ++j) { + mw->transmitMsg(path.c_str(), "i", j); //Set + mw->transmitMsg(path.c_str(), ""); //Get + } + + } + while(ms->uToB->hasNext()) { + const char *msg = ms->uToB->read(); + //printf("RT: handling <%s>\n", msg); + ms->applyOscEvent(msg); + } + + int id = 0; + int state = 0; + int value = 0; + // 0 - broadcast + // 1 - true value (set) + // 2 - expected value (get) + while(ms->bToU->hasNext()) { + const char *msg = ms->bToU->read(); + if(state == 0) { + TS_ASSERT_EQUALS(rtosc_narguments(msg), 0); + state = 1; + } else if(state == 1) { + TS_ASSERT_EQUALS(rtosc_narguments(msg), 1); + value = rtosc_argument(msg, 0).i; + state = 2; + } else if(state == 2) { + int val = rtosc_argument(msg, 0).i; + if(value != val) { + printf("%s - %d should equal %d\n", msg, value, val); + TS_ASSERT(0); + } + state = 0; + } + + //printf("Message #%d %s:%s\n", id++, msg, rtosc_argument_string(msg)); + //if(rtosc_narguments(msg)) + // printf(" %d\n", rtosc_argument(msg, 0).i); + } + } + private: SYNTH_T *synth;