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:
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