commit bec0a3b40cb4f61c702402e285f4802070c84acf
parent 73542104578dc507336bf9da8b65bb44f0a736e9
Author: Christopher A. Oliver <caowasteland@gmail.com>
Date: Sun, 29 Nov 2015 19:41:28 -0500
Constant Hz detune. Defaults to zero of course.
This permits detunes with constant beat frequencies, and it makes
the keyboard slightly non-exponential, just like olden days.
Diffstat:
16 files changed, 62 insertions(+), 4 deletions(-)
diff --git a/src/Params/ADnoteParameters.cpp b/src/Params/ADnoteParameters.cpp
@@ -94,6 +94,7 @@ static const Ports voicePorts = {
rToggle(Pfixedfreq, "If frequency is fixed"),
rParamZyn(PfixedfreqET, "Equal Tempermant Parameter"),
rParamZyn(PBendAdjust, "Pitch bend adjustment"),
+ rParamZyn(POffsetHz, "Voice constant offset"),
rParamI(PDetune, "Fine Detune"),
rParamI(PCoarseDetune, "Coarse Detune"),
rParamZyn(PDetuneType, "Magnitude of Detune"),
@@ -412,6 +413,7 @@ void ADnoteVoiceParam::defaults()
Pfixedfreq = 0;
PfixedfreqET = 0;
PBendAdjust = 88; // 64 + 24
+ POffsetHz = 64;
Presonance = 1;
Pfilterbypass = 0;
Pextoscil = -1;
@@ -651,6 +653,7 @@ void ADnoteVoiceParam::add2XML(XMLwrapper& xml, bool fmoscilused)
xml.addparbool("fixed_freq", Pfixedfreq);
xml.addpar("fixed_freq_et", PfixedfreqET);
xml.addpar("bend_adjust", PBendAdjust);
+ xml.addpar("offset_hz", POffsetHz);
xml.addpar("detune", PDetune);
xml.addpar("coarse_detune", PCoarseDetune);
xml.addpar("detune_type", PDetuneType);
@@ -973,6 +976,7 @@ void ADnoteVoiceParam::paste(ADnoteVoiceParam &a)
copy(PCoarseDetune);
copy(PDetuneType);
copy(PBendAdjust);
+ copy(POffsetHz);
copy(PFreqEnvelopeEnabled);
RCopy(FreqEnvelope);
@@ -1111,6 +1115,7 @@ void ADnoteVoiceParam::getfromXML(XMLwrapper& xml, unsigned nvoice)
Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq);
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET);
PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust);
+ POffsetHz = xml.getpar127("offset_hz", POffsetHz);
PDetune = xml.getpar("detune", PDetune, 0, 16383);
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383);
PDetuneType = xml.getpar127("detune_type", PDetuneType);
diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h
@@ -192,6 +192,9 @@ struct ADnoteVoiceParam {
/** Pitch bend adjustment */
unsigned char PBendAdjust;
+ /** Pitch offset Hz */
+ unsigned char POffsetHz;
+
/* Frequency Envelope */
unsigned char PFreqEnvelopeEnabled;
EnvelopeParams *FreqEnvelope;
diff --git a/src/Params/PADnoteParameters.cpp b/src/Params/PADnoteParameters.cpp
@@ -67,6 +67,7 @@ static const rtosc::Ports realtime_ports =
rToggle(Pfixedfreq, "Base frequency fixed frequency enable"),
rParamZyn(PfixedfreqET, "Equal temeperate control for fixed frequency operation"),
rParamZyn(PBendAdjust, "Pitch bend adjustment"),
+ rParamZyn(POffsetHz, "Voice constant offset"),
rParamI(PDetune, "Fine Detune"),
rParamI(PCoarseDetune, "Coarse Detune"),
rParamZyn(PDetuneType, "Magnitude of Detune"),
@@ -328,6 +329,7 @@ void PADnoteParameters::defaults()
Pfixedfreq = 0;
PfixedfreqET = 0;
PBendAdjust = 88; // 64 + 24
+ POffsetHz = 64;
PDetune = 8192; //zero
PCoarseDetune = 0;
PDetuneType = 1;
@@ -986,6 +988,7 @@ void PADnoteParameters::add2XML(XMLwrapper& xml)
xml.addpar("fixed_freq", Pfixedfreq);
xml.addpar("fixed_freq_et", PfixedfreqET);
xml.addpar("bend_adjust", PBendAdjust);
+ xml.addpar("offset_hz", POffsetHz);
xml.addpar("detune", PDetune);
xml.addpar("coarse_detune", PCoarseDetune);
xml.addpar("detune_type", PDetuneType);
@@ -1101,6 +1104,7 @@ void PADnoteParameters::getfromXML(XMLwrapper& xml)
Pfixedfreq = xml.getpar127("fixed_freq", Pfixedfreq);
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET);
PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust);
+ POffsetHz = xml.getpar127("offset_hz", POffsetHz);
PDetune = xml.getpar("detune", PDetune, 0, 16383);
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383);
PDetuneType = xml.getpar127("detune_type", PDetuneType);
@@ -1180,6 +1184,7 @@ void PADnoteParameters::pasteRT(PADnoteParameters &x)
COPY(PfixedfreqET);
COPY(PBendAdjust);
+ COPY(POffsetHz);
COPY(PDetune);
COPY(PCoarseDetune);
COPY(PDetuneType);
diff --git a/src/Params/PADnoteParameters.h b/src/Params/PADnoteParameters.h
@@ -107,6 +107,7 @@ class PADnoteParameters:public Presets
if this parameter is 64, 1 MIDI halftone -> 1 frequency halftone */
unsigned char PfixedfreqET;
unsigned char PBendAdjust;
+ unsigned char POffsetHz;
unsigned short int PDetune; //fine detune
unsigned short int PCoarseDetune; //coarse detune+octave
unsigned char PDetuneType; //detune type
diff --git a/src/Params/SUBnoteParameters.cpp b/src/Params/SUBnoteParameters.cpp
@@ -54,6 +54,7 @@ static const rtosc::Ports SUBnotePorts = {
rToggle(Pfixedfreq, "Base frequency fixed frequency enable"),
rParamZyn(PfixedfreqET, "Equal temeperate control for fixed frequency operation"),
rParamZyn(PBendAdjust, "Pitch bend adjustment"),
+ rParamZyn(POffsetHz, "Voice constant offset"),
#undef rChangeCb
#define rChangeCb obj->updateFrequencyMultipliers();
rParamI(POvertoneSpread.type, rMap(min, 0), rMap(max, 7),
@@ -154,6 +155,7 @@ void SUBnoteParameters::defaults()
Pfixedfreq = 0;
PfixedfreqET = 0;
PBendAdjust = 88; // 64 + 24
+ POffsetHz = 64;
Pnumstages = 2;
Pbandwidth = 40;
Phmagtype = 0;
@@ -235,6 +237,7 @@ void SUBnoteParameters::add2XML(XMLwrapper& xml)
xml.addparbool("fixed_freq", Pfixedfreq);
xml.addpar("fixed_freq_et", PfixedfreqET);
xml.addpar("bend_adjust", PBendAdjust);
+ xml.addpar("offset_hz", POffsetHz);
xml.addpar("detune", PDetune);
xml.addpar("coarse_detune", PCoarseDetune);
@@ -356,6 +359,7 @@ void SUBnoteParameters::paste(SUBnoteParameters &sub)
doPaste(PCoarseDetune);
doPaste(PDetuneType);
doPaste(PBendAdjust);
+ doPaste(POffsetHz);
doPaste(PFreqEnvelopeEnabled);
doPPaste(FreqEnvelope);
doPaste(PBandWidthEnvelopeEnabled);
@@ -428,6 +432,7 @@ void SUBnoteParameters::getfromXML(XMLwrapper& xml)
Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq);
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET);
PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust);
+ POffsetHz = xml.getpar127("offset_hz", POffsetHz);
PDetune = xml.getpar("detune", PDetune, 0, 16383);
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383);
diff --git a/src/Params/SUBnoteParameters.h b/src/Params/SUBnoteParameters.h
@@ -55,6 +55,7 @@ class SUBnoteParameters:public Presets
unsigned char PBandWidthEnvelopeEnabled;
EnvelopeParams *BandWidthEnvelope;
unsigned char PBendAdjust;
+ unsigned char POffsetHz;
//Filter Parameters (Global)
unsigned char PGlobalFilterEnabled;
diff --git a/src/Synth/ADnote.cpp b/src/Synth/ADnote.cpp
@@ -111,6 +111,10 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars)
else
NoteVoicePar[nvoice].BendAdjust = BendAdj / 24.0f;
+ float offset_val = (pars.VoicePar[nvoice].POffsetHz - 64)/64.0f;
+ NoteVoicePar[nvoice].OffsetHz =
+ 25.0f*(offset_val * sqrtf(fabsf(offset_val)));
+
unison_stereo_spread[nvoice] =
pars.VoicePar[nvoice].Unison_stereo_spread / 127.0f;
@@ -1134,7 +1138,7 @@ void ADnote::computecurrentparameters()
* powf(2, (voicepitch + globalpitch) / 12.0f); //Hz frequency
voicefreq *=
powf(ctl.pitchwheel.relfreq, NoteVoicePar[nvoice].BendAdjust); //change the frequency by the controller
- setfreq(nvoice, voicefreq * portamentofreqrap);
+ setfreq(nvoice, voicefreq * portamentofreqrap + NoteVoicePar[nvoice].OffsetHz);
/***************/
/* Modulator */
diff --git a/src/Synth/ADnote.h b/src/Synth/ADnote.h
@@ -204,6 +204,8 @@ class ADnote:public SynthNote
// Bend adjustment
float BendAdjust;
+ float OffsetHz;
+
Envelope *FreqEnvelope;
LFO *FreqLfo;
diff --git a/src/Synth/PADnote.cpp b/src/Synth/PADnote.cpp
@@ -68,6 +68,8 @@ void PADnote::setup(float freq,
BendAdjust = BendAdj / 24;
else
BendAdjust = BendAdj / 24.0f;
+ float offset_val = (pars.POffsetHz - 64)/64.0f;
+ OffsetHz = 25.0f*(offset_val * sqrtf(fabsf(offset_val)));
firsttime = true;
realfreq = basefreq;
if(!legato)
@@ -260,7 +262,7 @@ void PADnote::computecurrentparameters()
realfreq = basefreq * portamentofreqrap
* powf(2.0f, globalpitch / 12.0f)
- * powf(ctl.pitchwheel.relfreq, BendAdjust);
+ * powf(ctl.pitchwheel.relfreq, BendAdjust) + OffsetHz;
}
diff --git a/src/Synth/PADnote.h b/src/Synth/PADnote.h
@@ -53,6 +53,7 @@ class PADnote:public SynthNote
float basefreq;
float BendAdjust;
+ float OffsetHz;
bool firsttime;
int nsample, portamento;
diff --git a/src/Synth/SUBnote.cpp b/src/Synth/SUBnote.cpp
@@ -83,6 +83,8 @@ void SUBnote::setup(float freq,
BendAdjust = BendAdj / 24;
else
BendAdjust = BendAdj / 24.0f;
+ float offset_val = (pars.POffsetHz - 64)/64.0f;
+ OffsetHz = 25.0f*(offset_val * sqrtf(fabsf(offset_val)));
float detune = getdetune(pars.PDetuneType,
pars.PCoarseDetune,
pars.PDetune);
@@ -183,9 +185,11 @@ void SUBnote::setup(float freq,
float amp = 1.0f;
if(nph == 0)
amp = gain;
- initfilter(lfilter[nph + n * numstages], freq, bw, amp, hgain);
+ initfilter(lfilter[nph + n * numstages], freq + OffsetHz, bw,
+ amp, hgain);
if(stereo)
- initfilter(rfilter[nph + n * numstages], freq, bw, amp, hgain);
+ initfilter(rfilter[nph + n * numstages], freq + OffsetHz, bw,
+ amp, hgain);
}
}
diff --git a/src/Synth/SUBnote.h b/src/Synth/SUBnote.h
@@ -60,6 +60,7 @@ class SUBnote:public SynthNote
int start; //how the harmonics start
float basefreq;
float BendAdjust;
+ float OffsetHz;
float panning;
Envelope *AmpEnvelope;
Envelope *FreqEnvelope;
diff --git a/src/Tests/guitar-adnote.xmz b/src/Tests/guitar-adnote.xmz
@@ -269,6 +269,7 @@ version-revision="2" ZynAddSubFX-author="Nasca Octavian Paul">
<par_bool name="fixed_freq" value="no" />
<par name="fixed_freq_et" value="0" />
<par name="bend_adjust" value="88" />
+<par name="offset_hz" value="64" />
<par name="detune" value="12040" />
<par name="coarse_detune" value="0" />
<par name="detune_type" value="0" />
@@ -488,6 +489,7 @@ version-revision="2" ZynAddSubFX-author="Nasca Octavian Paul">
<par_bool name="fixed_freq" value="no" />
<par name="fixed_freq_et" value="0" />
<par name="bend_adjust" value="88" />
+<par name="offset_hz" value="64" />
<par name="detune" value="7902" />
<par name="coarse_detune" value="0" />
<par name="detune_type" value="0" />
@@ -572,6 +574,7 @@ version-revision="2" ZynAddSubFX-author="Nasca Octavian Paul">
<par_bool name="fixed_freq" value="no" />
<par name="fixed_freq_et" value="0" />
<par name="bend_adjust" value="88" />
+<par name="offset_hz" value="64" />
<par name="detune" value="8192" />
<par name="coarse_detune" value="0" />
<par name="detune_type" value="0" />
@@ -679,6 +682,7 @@ version-revision="2" ZynAddSubFX-author="Nasca Octavian Paul">
<par_bool name="fixed_freq" value="no" />
<par name="fixed_freq_et" value="0" />
<par name="bend_adjust" value="88" />
+<par name="offset_hz" value="64" />
<par name="detune" value="8192" />
<par name="coarse_detune" value="0" />
<par name="detune_type" value="0" />
@@ -1003,6 +1007,7 @@ version-revision="2" ZynAddSubFX-author="Nasca Octavian Paul">
<par_bool name="fixed_freq" value="no" />
<par name="fixed_freq_et" value="103" />
<par name="bend_adjust" value="88" />
+<par name="offset_hz" value="64" />
<par name="detune" value="8192" />
<par name="coarse_detune" value="0" />
<par name="overtone_spread_type" value="0" />
@@ -3363,6 +3368,7 @@ version-revision="2" ZynAddSubFX-author="Nasca Octavian Paul">
<par name="fixed_freq" value="0" />
<par name="fixed_freq_et" value="0" />
<par name="bend_adjust" value="88" />
+<par name="offset_hz" value="64" />
<par name="detune" value="8192" />
<par name="coarse_detune" value="0" />
<par name="detune_type" value="1" />
diff --git a/src/UI/ADnoteUI.fl b/src/UI/ADnoteUI.fl
@@ -575,6 +575,12 @@ o->redraw();}
code0 {o->init("PBendAdjust");o->reset_value=24;o->set_transform([](float x){return x/24.0f;});o->set_rounding(2);}
class Fl_Osc_Dial
}
+ Fl_Dial offsethzdial {
+ label Offset
+ tooltip {Offset of frequency in Hz} xywh {110 270 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1
+ code0 {o->init("POffsetHz"); o->set_rounding(2); o->set_transform([](float x){x/=64; return 25*(x*sqrtf(fabsf(x)));});}
+ class Fl_Osc_Dial
+ }
Fl_Slider {} {
callback {detunevalueoutput->update();}
tooltip {Fine Detune (cents)} xywh {58 287 392 13} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1
diff --git a/src/UI/PADnoteUI.fl b/src/UI/PADnoteUI.fl
@@ -715,6 +715,12 @@ cbwidget->do_callback();}
code0 {o->init("PBendAdjust");o->reset_value=24;o->set_transform([](float x){return x/24.0f;});o->set_rounding(2);}
class Fl_Osc_Dial
}
+ Fl_Dial offsethzdial {
+ label Offset
+ tooltip {Offset of frequency in Hz} xywh {110 278 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1
+ code0 {o->init("POffsetHz"); o->set_rounding(2); o->set_transform([](float x){x/=64; return 25*(x*sqrtf(fabsf(x)));});}
+ class Fl_Osc_Dial
+ }
Fl_Check_Button hz440 {
label 440Hz
callback {if (o->value()==0) fixedfreqetdial->deactivate();
diff --git a/src/UI/SUBnoteUI.fl b/src/UI/SUBnoteUI.fl
@@ -293,6 +293,12 @@ freqsettingsui->redraw();}
code0 {o->init("PBendAdjust"); o->reset_value=24;o->set_transform([](float x){return x/24.0f;});o->set_rounding(2);}
class Fl_Osc_Dial
}
+ Fl_Dial offsethzdial {
+ label Offset
+ tooltip {Offset of frequency in Hz} xywh {500 53 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1
+ code0 {o->init("POffsetHz"); o->set_rounding(2); o->set_transform([](float x){x/=64; return 25*(x*sqrtf(fabsf(x)));});}
+ class Fl_Osc_Dial
+ }
Fl_Check_Button hz440 {
label 440Hz
callback {if (o->value()==0) fixedfreqetdial->deactivate();