zynaddsubfx

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

commit 72f489ca4212246f0e5b1e5e80fcb7c6fb05a6b6
parent 1cfd55838f5883a29a362b06f1eae439ff618dcd
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Tue,  5 Mar 2019 22:53:25 -0500

Merge remote-tracking branch 'github/master'

Diffstat:
Msrc/Misc/MiddleWare.cpp | 14+++++++-------
Msrc/Misc/XMLwrapper.cpp | 11+++++++++++
Msrc/Misc/XMLwrapper.h | 6++++++
Msrc/Params/ADnoteParameters.cpp | 33++++++++++++++++++++++++++-------
Msrc/Params/ADnoteParameters.h | 2+-
Msrc/Synth/ADnote.cpp | 6++----
Msrc/Tests/guitar-adnote.xmz | 4++--
7 files changed, 55 insertions(+), 21 deletions(-)

diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -466,7 +466,7 @@ public: bank.loadbank(bank.banks[par].dir); } - void loadPart(int npart, const char *filename, Master *master) + void loadPart(int npart, const char *filename, Master *master, rtosc::RtData &d) { actual_load[npart]++; @@ -524,7 +524,7 @@ public: //Give it to the backend and wait for the old part to return for //deallocation parent->transmitMsg("/load-part", "ib", npart, sizeof(Part*), &p); - GUI::raiseUi(ui, "/damage", "s", ("/part"+to_s(npart)+"/").c_str()); + d.broadcast("/damage", "s", ("/part"+to_s(npart)+"/").c_str()); } //Load a new cleared Part instance @@ -1424,14 +1424,14 @@ static rtosc::Ports middwareSnoopPorts = { const int part_id = rtosc_argument(msg,0).i; const char *file = rtosc_argument(msg,1).s; impl.pending_load[part_id]++; - impl.loadPart(part_id, file, impl.master); + impl.loadPart(part_id, file, impl.master, d); rEnd}, {"load-part:is", 0, 0, rBegin; const int part_id = rtosc_argument(msg,0).i; const char *file = rtosc_argument(msg,1).s; impl.pending_load[part_id]++; - impl.loadPart(part_id, file, impl.master); + impl.loadPart(part_id, file, impl.master, d); rEnd}, {"load-part:iss", 0, 0, rBegin; @@ -1439,7 +1439,7 @@ static rtosc::Ports middwareSnoopPorts = { const char *file = rtosc_argument(msg,1).s; const char *name = rtosc_argument(msg,2).s; impl.pending_load[part_id]++; - impl.loadPart(part_id, file, impl.master); + impl.loadPart(part_id, file, impl.master, d); impl.uToB->write(("/part"+to_s(part_id)+"/Pname").c_str(), "s", name); rEnd}, @@ -1449,7 +1449,7 @@ static rtosc::Ports middwareSnoopPorts = { const int slot = rtosc_argument(msg, 0).i + 128*bank.bank_lsb; if(slot < BANK_SIZE) { impl.pending_load[0]++; - impl.loadPart(0, impl.master->bank.ins[slot].filename.c_str(), impl.master); + impl.loadPart(0, impl.master->bank.ins[slot].filename.c_str(), impl.master, d); impl.uToB->write("/part0/Pname", "s", impl.master->bank.ins[slot].name.c_str()); } rEnd}, @@ -1545,7 +1545,7 @@ static rtosc::Ports middlewareReplyPorts = { Bank &bank = impl.master->bank; const int part = rtosc_argument(msg, 0).i; const int program = rtosc_argument(msg, 1).i + 128*bank.bank_lsb; - impl.loadPart(part, impl.master->bank.ins[program].filename.c_str(), impl.master); + impl.loadPart(part, impl.master->bank.ins[program].filename.c_str(), impl.master, d); impl.uToB->write(("/part"+to_s(part)+"/Pname").c_str(), "s", impl.master->bank.ins[program].name.c_str()); rEnd}, {"setbank:c", 0, 0, diff --git a/src/Misc/XMLwrapper.cpp b/src/Misc/XMLwrapper.cpp @@ -565,6 +565,17 @@ string XMLwrapper::getparstr(const string &name, return defaultpar; } +bool XMLwrapper::hasparreal(const char *name) const +{ + const mxml_node_t *tmp = mxmlFindElement(node, + node, + "par_real", + "name", + name, + MXML_DESCEND_FIRST); + return tmp != nullptr; +} + float XMLwrapper::getparreal(const char *name, float defaultpar) const { const mxml_node_t *tmp = mxmlFindElement(node, diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -202,6 +202,12 @@ class XMLwrapper const std::string &defaultpar) const; /** + * Test existence of real parameter. + * @param name The parameter name. + */ + bool hasparreal(const char *name) const; + + /** * Returns the real value stored in the node. * @param name The parameter name. * @param defaultpar The default value if the real value is not found. diff --git a/src/Params/ADnoteParameters.cpp b/src/Params/ADnoteParameters.cpp @@ -151,7 +151,7 @@ static const Ports voicePorts = { rParamZyn(PFilterVelocityScaleFunction, rShort("v.sense"), rDefault(64), "Filter Velocity Function Shape"), - + //Modulator Stuff rOption(PFMEnabled, rShort("mode"), rOptions(none, mix, ring, phase, frequency, pulse), rDefault(none), "Modulator mode"), @@ -180,6 +180,7 @@ static const Ports voicePorts = { "Modulator Amplitude Envelope"), + //weird stuff for PCoarseDetune {"detunevalue:", rMap(unit,cents) rDoc("Get detune in cents"), NULL, [](const char *, RtData &d) @@ -315,10 +316,20 @@ static const Ports globalPorts = { //Amplitude rParamZyn(PPanning, rShort("pan"), rDefault(64), "Panning of ADsynth (0 random, 1 left, 127 right)"), - rParamZyn(PVolume, rShort("vol"), rDefault(90), "volume control"), + rParamF(Volume, rShort("vol"), rLinear(-60.0f,20.0f), + rDefault(-3.75f), "volume control"), rParamZyn(PAmpVelocityScaleFunction, rShort("sense"), rDefault(64), "Volume velocity sense"), - + {"PVolume::i", rShort("vol.") rLinear(0,127) + rDoc("Volume"), NULL, + [](const char *msg, RtData &d) + { + rObject *obj = (rObject *)d.obj; + if (!rtosc_narguments(msg)) + d.reply(d.loc, "i", (int)roundf(96.0f * (1.0f + obj->Volume/60.0f))); + else + obj->Volume = -60.0f * (1.0f - rtosc_argument(msg, 0).i / 96.0f); + }}, rParamZyn(Fadein_adjustment, rDefault(FADEIN_ADJUSTMENT_SCALE), "Adjustment for anti-pop strategy."), rParamZyn(PPunchStrength, rShort("strength"), rDefault(0), @@ -460,7 +471,7 @@ void ADnoteGlobalParam::defaults() PBandwidth = 64; /* Amplitude Global Parameters */ - PVolume = 90; + Volume = -3.75f; PPanning = 64; //center PAmpVelocityScaleFunction = 64; AmpEnvelope->defaults(); @@ -839,7 +850,7 @@ void ADnoteGlobalParam::add2XML(XMLwrapper& xml) xml.addparbool("stereo", PStereo); xml.beginbranch("AMPLITUDE_PARAMETERS"); - xml.addpar("volume", PVolume); + xml.addparreal("volume", Volume); xml.addpar("panning", PPanning); xml.addpar("velocity_sensing", PAmpVelocityScaleFunction); xml.addpar("fadein_adjustment", Fadein_adjustment); @@ -914,7 +925,15 @@ void ADnoteGlobalParam::getfromXML(XMLwrapper& xml) PStereo = xml.getparbool("stereo", PStereo); if(xml.enterbranch("AMPLITUDE_PARAMETERS")) { - PVolume = xml.getpar127("volume", PVolume); + const bool upgrade_3_0_3 = (xml.fileversion() < version_type(3,0,3)) || + (!xml.hasparreal("volume")); + + if (upgrade_3_0_3) { + int vol = xml.getpar127("volume", 0); + Volume = -60.0f * ( 1.0f - vol / 96.0f); + } else { + Volume = xml.getparreal("volume", Volume); + } PPanning = xml.getpar127("panning", PPanning); PAmpVelocityScaleFunction = xml.getpar127("velocity_sensing", PAmpVelocityScaleFunction); @@ -1127,7 +1146,7 @@ void ADnoteGlobalParam::paste(ADnoteGlobalParam &a) { copy(PStereo); - copy(PVolume); + copy(Volume); copy(PPanning); copy(PAmpVelocityScaleFunction); diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h @@ -64,7 +64,7 @@ struct ADnoteGlobalParam { 127 - right */ unsigned char PPanning; - unsigned char PVolume; + float Volume; unsigned char PAmpVelocityScaleFunction; diff --git a/src/Synth/ADnote.cpp b/src/Synth/ADnote.cpp @@ -669,9 +669,7 @@ void ADnote::legatonote(LegatoParams lpars) int tmp[NUM_VOICES]; NoteGlobalPar.Volume = 4.0f - * powf(0.1f, 3.0f - * (1.0f - pars.GlobalPar.PVolume - / 96.0f)) //-60 dB .. 0 dB + * powf(10.0f, pars.GlobalPar.Volume / 20.0) //-60 dB .. 20 dB * VelF( velocity, pars.GlobalPar.PAmpVelocityScaleFunction); //velocity sensing @@ -1977,7 +1975,7 @@ void ADnote::Global::initparameters(const ADnoteGlobalParam &param, AmpLfo = memory.alloc<LFO>(*param.AmpLfo, basefreq, time, wm, (pre+"GlobalPar/AmpLfo/").c_str); - Volume = 4.0f * powf(0.1f, 3.0f * (1.0f - param.PVolume / 96.0f)) //-60 dB .. 0 dB + Volume = 4.0f * powf(10.0f, param.Volume / 20.0) //-60 dB .. 20 dB * VelF(velocity, param.PAmpVelocityScaleFunction); //sensing Filter = memory.alloc<ModFilter>(*param.GlobalFilter, synth, time, memory, diff --git a/src/Tests/guitar-adnote.xmz b/src/Tests/guitar-adnote.xmz @@ -66,7 +66,7 @@ version-revision="3" ZynAddSubFX-author="Nasca Octavian Paul"> <ADD_SYNTH_PARAMETERS> <par_bool name="stereo" value="yes" /> <AMPLITUDE_PARAMETERS> -<par name="volume" value="73" /> +<par_real name="volume" value="-14.375" exact_value="0xC165FFFF" /> <par name="panning" value="74" /> <par name="velocity_sensing" value="85" /> <par name="fadein_adjustment" value="20" /> @@ -764,7 +764,7 @@ version-revision="3" ZynAddSubFX-author="Nasca Octavian Paul"> <INSTRUMENT_EFFECT id="0"> <EFFECT> <par name="type" value="6" /> -<par name="preset" value="4" /> +<par name="preset" value="0" /> <EFFECT_PARAMETERS> <par_no id="0"> <par name="par" value="112" />