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