zynaddsubfx

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

commit b650636e306237397ef106b86fc2aaa35ec5182b
parent bb92bcccb79cf7f8e31fe62bc35ace5d7dd12d46
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Sat,  3 Jun 2017 11:20:36 -0400

Floating Point Control WIP

- Changes some filter parameters from 0..127 into floating point values with
  meaningful ranges

Diffstat:
Msrc/DSP/AnalogFilter.cpp | 1+
Msrc/Misc/Schema.cpp | 4++++
Msrc/Misc/Util.h | 2++
Msrc/Params/FilterParams.cpp | 87++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/Params/FilterParams.h | 19++++++++++++-------
5 files changed, 74 insertions(+), 39 deletions(-)

diff --git a/src/DSP/AnalogFilter.cpp b/src/DSP/AnalogFilter.cpp @@ -68,6 +68,7 @@ AnalogFilter::Coeff AnalogFilter::computeCoeff(int type, float cutoff, float q, { AnalogFilter::Coeff coeff; bool zerocoefs = false; //this is used if the freq is too high + printf("computeCoeff(%d, %f, %f, %d, %f, %f, %d)\n", type, cutoff, q, stages, gain, fs, order); const float samplerate_f = fs; const float halfsamplerate_f = fs/2; diff --git a/src/Misc/Schema.cpp b/src/Misc/Schema.cpp @@ -21,6 +21,7 @@ namespace zyn { * - 'shortname' : string [OPTIONAL] * - 'tooltip' : string [OPTIONAL] * - 'type' : type + * - 'units' : unit-type * - 'domain' : range [OPTIONAL] * - 'options' : [option...] [OPTIONAL] * type : {'int', 'float', 'boolean'} @@ -114,6 +115,7 @@ void dump_param_cb(const rtosc::Port *p, const char *full_name, void *v) auto mparameter = meta.find("parameter"); auto mdoc = meta.find("documentation"); auto msname = meta.find("shortname"); + auto units = meta.find("unit"); opts options; string doc; string name = p->name;; @@ -189,6 +191,8 @@ void dump_param_cb(const rtosc::Port *p, const char *full_name, void *v) o << " \"shortname\": \"" << msname.value << "\",\n"; o << " \"name\" : \"" << name << "\",\n"; o << " \"tooltip\" : \"" << doc << "\",\n"; + if(units != meta.end()) + o << " \"units\" : \"" << units.value << "\",\n"; o << " \"type\" : \"" << type << "\""; if(min && max) o << ",\n \"range\" : [" << min << "," << max << "]"; diff --git a/src/Misc/Util.h b/src/Misc/Util.h @@ -184,4 +184,6 @@ rPresetType, \ } +#define rUnit(x) rMap(unit, x) + #endif diff --git a/src/Params/FilterParams.cpp b/src/Params/FilterParams.cpp @@ -66,14 +66,16 @@ const rtosc::Ports FilterParams::ports = { rOption(Ptype, rShort("type"), rOptions(LP1, HP1, LP2, HP2, BP, notch, peak, l.shelf, h.shelf), "Filter Type"), - rParamZyn(Pfreq, rShort("cutoff"), "Center Freq"), - rParamZyn(Pq, rShort("q"), - "Quality Factor (resonance/bandwidth)"), rParamI(Pstages, rShort("stages"), rLinear(0,5), "Filter Stages"), - rParamZyn(Pfreqtrack, rShort("f.track"), + rParamF(baseq, rShort("q"), rUnit(none), rLog(0.1, 1000), + "Quality Factor (resonance/bandwidth)"), + rParamF(basefreq, rShort("cutoff"), rUnit(Hz), rLog(31.25, 32000), + "Base cutoff frequency"), + rParamF(freqtracking, rShort("f.track"), rUnit(%), rLinear(-100, 100), "Frequency Tracking amount"), - rParamZyn(Pgain, rShort("gain"), "Output Gain"), + rParamF(gain, rShort("gain"), rUnit(dB), rLinear(-30, 30), + "Output Gain"), rParamI(Pnumformants, rShort("formants"), rLinear(1,12), "Number of formants to be used"), rParamZyn(Pformantslowness, rShort("slew"), @@ -222,6 +224,14 @@ const rtosc::Ports FilterParams::ports = { } d.replyArray(d.loc, type, args); }}, + + //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)"), }; #undef rChangeCb #define rChangeCb @@ -257,16 +267,16 @@ void FilterParams::defaults() Pfreq = Dfreq; Pq = Dq; - Pstages = 0; - Pfreqtrack = 64; - Pgain = 64; - Pcategory = 0; + Pstages = 0; + freqtracking = 0.0; + gain = 0.0; + Pcategory = 0; Pnumformants = 3; Pformantslowness = 64; for(int j = 0; j < FF_MAX_VOWELS; ++j) defaults(j); - ; + Psequencesize = 3; for(int i = 0; i < FF_MAX_SEQUENCE; ++i) @@ -306,10 +316,10 @@ void FilterParams::getfromFilterParams(FilterParams *pars) Pfreq = pars->Pfreq; Pq = pars->Pq; - Pstages = pars->Pstages; - Pfreqtrack = pars->Pfreqtrack; - Pgain = pars->Pgain; - Pcategory = pars->Pcategory; + Pstages = pars->Pstages; + freqtracking = pars->freqtracking; + gain = pars->gain; + Pcategory = pars->Pcategory; Pnumformants = pars->Pnumformants; Pformantslowness = pars->Pformantslowness; @@ -337,21 +347,21 @@ void FilterParams::getfromFilterParams(FilterParams *pars) */ float FilterParams::getfreq() const { - return (Pfreq / 64.0f - 1.0f) * 5.0f; + return log2(basefreq) - log2f(1000.0f); } float FilterParams::getq() const { - return expf(powf((float) Pq / 127.0f, 2) * logf(1000.0f)) - 0.9f; + return baseq; } float FilterParams::getfreqtracking(float notefreq) const { - return logf(notefreq / 440.0f) * (Pfreqtrack - 64.0f) / (64.0f * LOG_2); + return log2f(notefreq / 440.0f) * (freqtracking / 100.0); } float FilterParams::getgain() const { - return (Pgain / 64.0f - 1.0f) * 30.0f; //-30..30dB + return gain; } /* @@ -427,11 +437,11 @@ void FilterParams::add2XML(XMLwrapper& xml) //filter parameters xml.addpar("category", Pcategory); xml.addpar("type", Ptype); - xml.addpar("freq", Pfreq); + xml.addpar("basefreq", basefreq); xml.addpar("q", Pq); xml.addpar("stages", Pstages); - xml.addpar("freq_track", Pfreqtrack); - xml.addpar("gain", Pgain); + xml.addpar("freq_track", freqtracking); + xml.addpar("gain", gain); //formant filter parameters if((Pcategory == 1) || (!xml.minimal)) { @@ -481,14 +491,28 @@ void FilterParams::getfromXMLsection(XMLwrapper& xml, int n) void FilterParams::getfromXML(XMLwrapper& xml) { + const bool upgrade_3_0_2 = xml.fileversion() < version_type(3,0,2); + //filter parameters - Pcategory = xml.getpar127("category", Pcategory); - Ptype = xml.getpar127("type", Ptype); - Pfreq = xml.getpar127("freq", Pfreq); - Pq = xml.getpar127("q", Pq); - Pstages = xml.getpar127("stages", Pstages); - Pfreqtrack = xml.getpar127("freq_track", Pfreqtrack); - Pgain = xml.getpar127("gain", Pgain); + Pcategory = xml.getpar127("category", Pcategory); + Ptype = xml.getpar127("type", Ptype); + Pstages = xml.getpar127("stages", Pstages); + if(upgrade_3_0_2) { + int Pfreq = xml.getpar127("freq", 0); + basefreq = (Pfreq / 64.0f - 1.0f) * 5.0f; + basefreq = powf(2.0f, basefreq + 9.96578428f); + int Pq = xml.getpar127("q", 0); + baseq = expf(powf((float) Pq / 127.0f, 2) * logf(1000.0f)) - 0.9f; + int Pgain = xml.getpar127("gain", 0); + gain = (Pgain / 64.0f - 1.0f) * 30.0f; //-30..30dB + int Pfreqtracking = xml.getpar127("freq_track", 0); + freqtracking = 100 * (Pfreqtracking - 64.0f) / (64.0f); + } else { + basefreq = xml.getparreal("basefreq", 1000); + baseq = xml.getparreal("baseq", 10); + gain = xml.getparreal("gain", 0); + freqtracking = xml.getparreal("freq_track", 0); + } //formant filter parameters if(xml.enterbranch("FORMANT_FILTER")) { @@ -526,11 +550,11 @@ void FilterParams::paste(FilterParams &x) { COPY(Pcategory); COPY(Ptype); - COPY(Pfreq); + COPY(basefreq); COPY(Pq); COPY(Pstages); - COPY(Pfreqtrack); - COPY(Pgain); + COPY(freqtracking); + COPY(gain); COPY(Pnumformants); COPY(Pformantslowness); @@ -565,7 +589,6 @@ void FilterParams::paste(FilterParams &x) void FilterParams::pasteArray(FilterParams &x, int nvowel) { - printf("FilterParameters::pasting-an-array<%d>\n", nvowel); for(int nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { auto &self = Pvowels[nvowel].formants[nformant]; auto &update = x.Pvowels[nvowel].formants[nformant]; diff --git a/src/Params/FilterParams.h b/src/Params/FilterParams.h @@ -46,13 +46,18 @@ class FilterParams:public PresetsArray float getfreqtracking(float notefreq) const ; float getgain() const ; - unsigned char Pcategory; //Filter category (Analog/Formant/StVar) - unsigned char Ptype; // Filter type (for analog lpf,hpf,bpf..) - unsigned char Pfreq; // Frequency (64-central frequency) - unsigned char Pq; // Q parameters (resonance or bandwidth) - unsigned char Pstages; //filter stages+1 - unsigned char Pfreqtrack; //how the filter frequency is changing according the note frequency - unsigned char Pgain; //filter's output gain + unsigned Pcategory:2; //< Filter category (Analog/Formant/StVar) + unsigned Ptype:8; //< Filter type (for analog lpf,hpf,bpf..) + unsigned Pstages:8; //< filter stages+1 + float basefreq; //< Base cutoff frequency (Hz) + float baseq; //< Q parameters (resonance or bandwidth) + float freqtracking; //< Tracking of center frequency with note frequency (percentage) + float gain; //< filter's output gain (dB) + + int Pq; //dummy + int Pfreq; //dummy + int Pfreqtrack; //dummy + int Pgain; //dummy //Formant filter parameters unsigned char Pnumformants; //how many formants are used