zynaddsubfx

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

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:
Msrc/Params/ADnoteParameters.cpp | 5+++++
Msrc/Params/ADnoteParameters.h | 3+++
Msrc/Params/PADnoteParameters.cpp | 5+++++
Msrc/Params/PADnoteParameters.h | 1+
Msrc/Params/SUBnoteParameters.cpp | 5+++++
Msrc/Params/SUBnoteParameters.h | 1+
Msrc/Synth/ADnote.cpp | 6+++++-
Msrc/Synth/ADnote.h | 2++
Msrc/Synth/PADnote.cpp | 4+++-
Msrc/Synth/PADnote.h | 1+
Msrc/Synth/SUBnote.cpp | 8++++++--
Msrc/Synth/SUBnote.h | 1+
Msrc/Tests/guitar-adnote.xmz | 6++++++
Msrc/UI/ADnoteUI.fl | 6++++++
Msrc/UI/PADnoteUI.fl | 6++++++
Msrc/UI/SUBnoteUI.fl | 6++++++
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();