zynaddsubfx

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

commit 463599325216cd6b110914d16163d9304babb337
parent 22bdc91da072a0f460cfba8b5bf30d387591b00e
Author: Daniel Sheeler <dsheeler@pobox.com>
Date:   Sat, 10 Feb 2018 13:04:26 -0600

Modulation volume representation from int to float

Diffstat:
MAUTHORS.txt | 1+
Msrc/Params/ADnoteParameters.cpp | 32+++++++++++++++++++++++++-------
Msrc/Params/ADnoteParameters.h | 2+-
Msrc/Synth/ADnote.cpp | 10+++++-----
4 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/AUTHORS.txt b/AUTHORS.txt @@ -6,6 +6,7 @@ Active Developers: Hans Petter Selasky (BSD Compat) Christopher Oliver (Unison + presets fix, mousewheel support, SUBnote overtones, unison enhancements, ...) + Daniel Sheeler Contributors: Gerald Folcher (legato, mono notes memory) diff --git a/src/Params/ADnoteParameters.cpp b/src/Params/ADnoteParameters.cpp @@ -157,8 +157,8 @@ static const Ports voicePorts = { frequency, pulse), rDefault(none), "Modulator mode"), rParamI(PFMVoice, rShort("voice"), rDefault(-1), "Modulator Oscillator Selection"), - rParamZyn(PFMVolume, rShort("vol."), rDefault(90), - "Modulator Magnitude"), + rParamF(FMvolume, rShort("vol."), rLinear(0.0, 100.0), + rDefault(70.0), "Modulator Magnitude"), rParamZyn(PFMVolumeDamp, rShort("damp."), rDefault(64), "Modulator HF dampening"), rParamZyn(PFMVelocityScaleFunction, rShort("sense"), rDefault(64), @@ -222,7 +222,17 @@ static const Ports voicePorts = { obj->PCoarseDetune = k + (obj->PCoarseDetune/1024)*1024; } }}, - + {"PFMVolume::i", rShort("vol.") rLinear(0,127) + rDoc("Modulator Magnitude"), NULL, + [](const char *msg, RtData &d) + { + rObject *obj = (rObject *)d.obj; + if (!rtosc_narguments(msg)) + d.reply(d.loc, "i", (int)roundf(127.0f * obj->FMvolume + / 100.0f)); + else + obj->FMvolume = 100.0f * rtosc_argument(msg, 0).i / 127.0f; + }}, //weird stuff for PCoarseDetune {"FMdetunevalue:", rMap(unit,cents) rDoc("Get modulator detune"), NULL, [](const char *, RtData &d) { @@ -525,7 +535,7 @@ void ADnoteVoiceParam::defaults() //I use the internal oscillator (-1) PFMVoice = -1; - PFMVolume = 90; + FMvolume = 70.0; PFMVolumeDamp = 64; PFMDetune = 8192; PFMCoarseDetune = 0; @@ -789,7 +799,7 @@ void ADnoteVoiceParam::add2XML(XMLwrapper& xml, bool fmoscilused) xml.beginbranch("FM_PARAMETERS"); xml.addpar("input_voice", PFMVoice); - xml.addpar("volume", PFMVolume); + xml.addpar("volume", FMvolume); xml.addpar("volume_damp", PFMVolumeDamp); xml.addpar("velocity_sensing", PFMVelocityScaleFunction); @@ -1090,7 +1100,7 @@ void ADnoteVoiceParam::paste(ADnoteVoiceParam &a) RCopy(FilterLfo); copy(PFMVoice); - copy(PFMVolume); + copy(FMvolume); copy(PFMVolumeDamp); copy(PFMVelocityScaleFunction); @@ -1264,8 +1274,16 @@ void ADnoteVoiceParam::getfromXML(XMLwrapper& xml, unsigned nvoice) } if(xml.enterbranch("FM_PARAMETERS")) { + const bool upgrade_3_0_3 = (xml.fileversion() < version_type(3,0,3)) || + (xml.getparreal("volume", -1) < 0); + PFMVoice = xml.getpar("input_voice", PFMVoice, -1, nvoice - 1); - PFMVolume = xml.getpar127("volume", PFMVolume); + if (upgrade_3_0_3) { + int Pvolume = xml.getpar127("volume", 0); + FMvolume = 100.0f * Pvolume / 127.0f; + } else { + FMvolume = xml.getparreal("volume", FMvolume); + } PFMVolumeDamp = xml.getpar127("volume_damp", PFMVolumeDamp); PFMVelocityScaleFunction = xml.getpar127("velocity_sensing", PFMVelocityScaleFunction); diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h @@ -270,7 +270,7 @@ struct ADnoteVoiceParam { OscilGen *FMSmp; /* Modullator Volume */ - unsigned char PFMVolume; + float FMvolume; /* Modullator damping at higher frequencies */ unsigned char PFMVolumeDamp; diff --git a/src/Synth/ADnote.cpp b/src/Synth/ADnote.cpp @@ -482,7 +482,7 @@ void ADnote::setupVoiceMod(int nvoice, bool first_run) //Compute the Voice's modulator volume (incl. damping) float fmvoldamp = powf(440.0f / getvoicebasefreq(nvoice), param.PFMVolumeDamp / 64.0f - 1.0f); - const float fmvolume_ = param.PFMVolume / 127.0f; + const float fmvolume_ = param.FMvolume / 100.0f; switch(voice.FMEnabled) { case PHASE_MOD: case PW_MOD: @@ -631,20 +631,20 @@ void ADnote::legatonote(LegatoParams lpars) nvoice), pars.VoicePar[nvoice].PFMVolumeDamp / 64.0f); NoteVoicePar[nvoice].FMVolume = - (expf(pars.VoicePar[nvoice].PFMVolume / 127.0f + (expf(pars.VoicePar[nvoice].FMvolume / 100.0f * FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; break; case FREQ_MOD: NoteVoicePar[nvoice].FMVolume = - (expf(pars.VoicePar[nvoice].PFMVolume / 127.0f + (expf(pars.VoicePar[nvoice].FMvolume / 100.0f * FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; break; default: if(fmvoldamp > 1.0f) fmvoldamp = 1.0f; NoteVoicePar[nvoice].FMVolume = - pars.VoicePar[nvoice].PFMVolume - / 127.0f * fmvoldamp; + pars.VoicePar[nvoice].FMvolume + / 100.0f * fmvoldamp; } //Voice's modulator velocity sensing