zynaddsubfx

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

commit 7a35ef743b02e26af53d8f74eba6cd909614a5ed
parent fec6008ec275f404b1227f8f0d0b5e29398649de
Author: paulnasca <paulnasca>
Date:   Fri, 13 Feb 2004 22:32:49 +0000

*** empty log message ***

Diffstat:
MChangeLog | 2+-
Msrc/Effects/EffectMgr.C | 19+++++++++++++++++++
Msrc/Effects/EffectMgr.h | 1+
Msrc/Misc/Master.C | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Msrc/Misc/Microtonal.C | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Misc/Microtonal.h | 1+
Msrc/Misc/Part.C | 146+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Msrc/Misc/XMLwrapper.C | 38+++++++++++++++++++++++++++++++++++++-
Msrc/Misc/XMLwrapper.h | 6++++++
Msrc/Params/ADnoteParameters.C | 205+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/Params/ADnoteParameters.h | 3+++
Msrc/Params/Controller.C | 37+++++++++++++++++++++++++++++++------
Msrc/Params/Controller.h | 1+
Msrc/Params/EnvelopeParams.C | 27+++++++++++++++++++++++++++
Msrc/Params/EnvelopeParams.h | 2++
Msrc/Params/FilterParams.C | 41+++++++++++++++++++++++++++++++++++++++++
Msrc/Params/FilterParams.h | 1+
Msrc/Params/LFOParams.C | 10++++++++++
Msrc/Params/LFOParams.h | 4++--
Msrc/Params/SUBnoteParameters.C | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/Params/SUBnoteParameters.h | 1+
Msrc/Synth/OscilGen.C | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Synth/OscilGen.h | 1+
Msrc/Synth/Resonance.C | 22++++++++++++++++++----
Msrc/Synth/Resonance.h | 2++
25 files changed, 738 insertions(+), 87 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -532,4 +532,4 @@ - Inceput sa scriu incarcarea parametrilor 11 Feb 2004 - Se pot incarca cativa parametrii de la master 12 Feb 2004 - Continuat incarcarea parametrilor XML si la part (neterminat) - +13 Feb 2004 - Terminat de adaugat parametrii la incarcarea XML diff --git a/src/Effects/EffectMgr.C b/src/Effects/EffectMgr.C @@ -261,5 +261,24 @@ void EffectMgr::add2XML(XMLwrapper *xml){ xml->endbranch(); }; +void EffectMgr::getfromXML(XMLwrapper *xml){ + changeeffect(xml->getpar127("type",geteffect())); + + if ((efx==NULL)||(geteffect()==0)) return; + + efx->Ppreset=xml->getpar127("preset",efx->Ppreset); + + if (xml->enterbranch("EFFECT_PARAMETERS")){ + for (int n=0;n<128;n++){ + if (xml->enterbranch("par_no",n)==0) continue; + + int par=geteffectpar(n); + seteffectpar_nolock(n,xml->getpar127("par",par)); + xml->exitbranch(); + }; + xml->exitbranch(); + }; +}; + diff --git a/src/Effects/EffectMgr.h b/src/Effects/EffectMgr.h @@ -46,6 +46,7 @@ class EffectMgr{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); void out(REALTYPE *smpsl,REALTYPE *smpsr); diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -742,7 +742,7 @@ void Master::add2XML(XMLwrapper *xml){ xml->beginbranch("SYSTEM_EFFECTS"); for (int nefx=0;nefx<NUM_SYS_EFX;nefx++){ - xml->beginbranch("SYSEFFECT",nefx); + xml->beginbranch("SYSTEM_EFFECT",nefx); xml->beginbranch("EFFECT"); sysefx[nefx]->add2XML(xml); xml->endbranch(); @@ -766,7 +766,7 @@ void Master::add2XML(XMLwrapper *xml){ xml->beginbranch("INSERTION_EFFECTS"); for (int nefx=0;nefx<NUM_INS_EFX;nefx++){ - xml->beginbranch("INSEFFECT",nefx); + xml->beginbranch("INSERTION_EFFECT",nefx); xml->addpar("part",Pinsparts[nefx]); xml->beginbranch("EFFECT"); @@ -811,30 +811,69 @@ int Master::loadXML(char *filename){ }; void Master::getfromXML(XMLwrapper *xml){ - if (xml->enterbranch("MASTER")){ - Pvolume=xml->getpar127("volume",Pvolume); - Pkeyshift=xml->getpar127("key_shift",Pkeyshift); - ctl.NRPN.receive=xml->getparbool("nrpn_receive",ctl.NRPN.receive); + if (xml->enterbranch("MASTER")==0) return; + + setPvolume(xml->getpar127("volume",Pvolume)); + setPkeyshift(xml->getpar127("key_shift",Pkeyshift)); + ctl.NRPN.receive=xml->getparbool("nrpn_receive",ctl.NRPN.receive); + + for (int npart=0;npart<NUM_MIDI_PARTS;npart++){ + if (xml->enterbranch("PART",npart)==0) continue; + part[npart]->getfromXML(xml); + xml->exitbranch(); + }; + + if (xml->enterbranch("MICROTONAL")){ + microtonal.getfromXML(xml); + xml->exitbranch(); + }; - for (int npart=0;npart<NUM_MIDI_PARTS;npart++){ - if (xml->enterbranch("PART",npart)==0) continue; - part[npart]->getfromXML(xml); + + + if (xml->enterbranch("SYSTEM_EFFECTS")){ + for (int nefx=0;nefx<NUM_SYS_EFX;nefx++){ + if (xml->enterbranch("SYSTEM_EFFECT",nefx)==0) continue; + if (xml->enterbranch("EFFECT")){ + sysefx[nefx]->getfromXML(xml); + xml->exitbranch(); + }; + + for (int partefx=0;partefx<NUM_MIDI_PARTS;partefx++){ + if (xml->enterbranch("VOLUME",partefx)==0) continue; + setPsysefxvol(partefx,nefx,xml->getpar127("vol",Psysefxvol[partefx][nefx])); + xml->exitbranch(); + }; + + for (int tonefx=nefx+1;tonefx<NUM_SYS_EFX;tonefx++){ + if (xml->enterbranch("SENDTO",tonefx)==0) continue; + setPsysefxsend(nefx,tonefx,xml->getpar127("send_vol",Psysefxsend[nefx][tonefx])); + xml->exitbranch(); + }; xml->exitbranch(); }; + xml->exitbranch(); + }; + + + if (xml->enterbranch("INSERTION_EFFECTS")){ + for (int nefx=0;nefx<NUM_INS_EFX;nefx++){ + + if (xml->enterbranch("INSERTION_EFFECT",nefx)==0) continue; + Pinsparts[nefx]=xml->getpar("part",Pinsparts[nefx],-1,NUM_MIDI_PARTS); -/* if (xml->enterbranch("MICROTONAL")){ - // + if (xml->enterbranch("EFFECT")){ + insefx[nefx]->getfromXML(xml); + xml->exitbranch(); + }; xml->exitbranch(); + }; - - etc. - - -*/ xml->exitbranch(); }; + + }; diff --git a/src/Misc/Microtonal.C b/src/Misc/Microtonal.C @@ -611,5 +611,54 @@ void Microtonal::add2XML(XMLwrapper *xml){ xml->endbranch(); }; +void Microtonal::getfromXML(XMLwrapper *xml){ + xml->getparstr("name",(char *) Pname,MICROTONAL_MAX_NAME_LEN); + xml->getparstr("comment",(char *) Pcomment,MICROTONAL_MAX_NAME_LEN); + + Pinvertupdown=xml->getparbool("invert_up_down",Pinvertupdown); + Pinvertupdowncenter=xml->getparbool("invert_up_down_center",Pinvertupdowncenter); + + Penabled=xml->getparbool("enabled",Penabled); + Pglobalfinedetune=xml->getpar127("global_fine_detune",Pglobalfinedetune); + + PAnote=xml->getpar127("a_note",PAnote); + PAfreq=xml->getparreal("a_freq",PAfreq,1.0,10000.0); + + if (xml->enterbranch("SCALE")){ + Pscaleshift=xml->getpar127("scale_shift",Pscaleshift); + Pfirstkey=xml->getpar127("first_key",Pfirstkey); + Plastkey=xml->getpar127("last_key",Plastkey); + Pmiddlenote=xml->getpar127("middle_note",Pmiddlenote); + + if (xml->enterbranch("OCTAVE")){ + octavesize=xml->getpar127("octave_size",octavesize); + for (int i=0;i<octavesize;i++){ + if (xml->enterbranch("DEGREE",i)==0) continue; + octave[i].x2=0; + octave[i].tuning=xml->getparreal("cents",octave[i].tuning); + octave[i].x1=xml->getpar127("numerator",octave[i].x1); + octave[i].x2=xml->getpar127("denominator",octave[i].x2); + + if (octave[i].x2!=0) octave[i].type=2; + else octave[i].type=1; + + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (xml->enterbranch("KEYBOARD_MAPPING")){ + Pmapsize=xml->getpar127("map_size",Pmapsize); + Pmappingenabled=xml->getpar127("mapping_enabled",Pmappingenabled); + for (int i=0;i<Pmapsize;i++){ + if (xml->enterbranch("KEYMAP",i)==0) continue; + Pmapping[i]=xml->getpar127("degree",Pmapping[i]); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + xml->exitbranch(); + }; +}; diff --git a/src/Misc/Microtonal.h b/src/Misc/Microtonal.h @@ -89,6 +89,7 @@ class Microtonal{ void saveloadbuf(Buffer *buf); void add2XML(XMLwrapper *xml); + void getfromXML(XMLwrapper *xml); private: int linetotunings(unsigned int nline,const char *line); diff --git a/src/Misc/Part.C b/src/Misc/Part.C @@ -93,6 +93,7 @@ void Part::defaults(){ Pveloffs=64; Pkeylimit=15; defaultsinstrument(); + ctl.defaults(); }; void Part::defaultsinstrument(){ @@ -952,40 +953,43 @@ void Part::add2XMLinstrument(XMLwrapper *xml){ xml->addpar("type",info.Ptype); xml->endbranch(); - xml->addpar("kit_mode",Pkitmode); - xml->addparbool("drum_mode",Pdrummode); - for (int i=0;i<NUM_KIT_ITEMS;i++){ - xml->beginbranch("INSTRUMENT_KIT_ITEM",i); - xml->addparbool("enabled",kit[i].Penabled); - if (kit[i].Penabled!=0) { - xml->addparstr("name",(char *)kit[i].Pname); - - xml->addpar("muted",kit[i].Pmuted); - xml->addpar("min_key",kit[i].Pminkey); - xml->addpar("max_key",kit[i].Pmaxkey); + xml->beginbranch("INSTRUMENT_KIT"); + xml->addpar("kit_mode",Pkitmode); + xml->addparbool("drum_mode",Pdrummode); + + for (int i=0;i<NUM_KIT_ITEMS;i++){ + xml->beginbranch("INSTRUMENT_KIT_ITEM",i); + xml->addparbool("enabled",kit[i].Penabled); + if (kit[i].Penabled!=0) { + xml->addparstr("name",(char *)kit[i].Pname); + + xml->addparbool("muted",kit[i].Pmuted); + xml->addpar("min_key",kit[i].Pminkey); + xml->addpar("max_key",kit[i].Pmaxkey); - xml->addpar("send_to_instrument_effect",kit[i].Psendtoparteffect); + xml->addpar("send_to_instrument_effect",kit[i].Psendtoparteffect); - xml->addpar("ad_enabled",kit[i].Padenabled); - if ((kit[i].Padenabled!=0)&&(kit[i].adpars!=NULL)){ - xml->beginbranch("ADD_SYNTH_PARAMETERS"); - kit[i].adpars->add2XML(xml); - xml->endbranch(); - }; + xml->addparbool("add_enabled",kit[i].Padenabled); + if ((kit[i].Padenabled!=0)&&(kit[i].adpars!=NULL)){ + xml->beginbranch("ADD_SYNTH_PARAMETERS"); + kit[i].adpars->add2XML(xml); + xml->endbranch(); + }; - xml->addpar("sub_enabled",kit[i].Psubenabled); - if ((kit[i].Psubenabled!=0)&&(kit[i].subpars!=NULL)){ - xml->beginbranch("SUB_SYNTH_PARAMETERS"); - kit[i].subpars->add2XML(xml); - xml->endbranch(); - }; + xml->addparbool("sub_enabled",kit[i].Psubenabled); + if ((kit[i].Psubenabled!=0)&&(kit[i].subpars!=NULL)){ + xml->beginbranch("SUB_SYNTH_PARAMETERS"); + kit[i].subpars->add2XML(xml); + xml->endbranch(); + }; - }; - xml->endbranch(); - }; + }; + xml->endbranch(); + }; + xml->endbranch(); - xml->beginbranch("EFFECTS"); + xml->beginbranch("INSTRUMENT_EFFECTS"); for (int nefx=0;nefx<NUM_PART_EFX;nefx++){ xml->beginbranch("INSTRUMENT_EFFECT",nefx); xml->beginbranch("EFFECT"); @@ -1052,35 +1056,71 @@ void Part::getfromXMLinstrument(XMLwrapper *xml){ xml->getparstr("comments",(char *)info.Pcomments,MAX_INFO_TEXT_SIZE); info.Ptype=xml->getpar("type",info.Ptype,0,16); - xml->endbranch(); + xml->exitbranch(); + }; + + if (xml->enterbranch("INSTRUMENT_KIT")){ + Pkitmode=xml->getpar127("kit_mode",Pkitmode); + Pdrummode=xml->getparbool("drum_mode",Pdrummode); + + for (int i=0;i<NUM_KIT_ITEMS;i++){ + if (xml->enterbranch("INSTRUMENT_KIT_ITEM",i)==0) continue; + setkititemstatus(i,xml->getparbool("enabled",kit[i].Penabled)); + if (kit[i].Penabled==0) { + xml->exitbranch(); + continue; + }; + + xml->getparstr("name",(char *)kit[i].Pname,PART_MAX_NAME_LEN); + + kit[i].Pmuted=xml->getparbool("muted",kit[i].Pmuted); + kit[i].Pminkey=xml->getpar127("min_key",kit[i].Pminkey); + kit[i].Pmaxkey=xml->getpar127("max_key",kit[i].Pmaxkey); + + kit[i].Psendtoparteffect=xml->getpar127("send_to_instrument_effect",kit[i].Psendtoparteffect); + + kit[i].Padenabled=xml->getparbool("add_enabled",kit[i].Padenabled); + + + if (xml->enterbranch("ADD_SYNTH_PARAMETERS")){ + kit[i].adpars->getfromXML(xml); + xml->exitbranch(); + }; + + kit[i].Psubenabled=xml->getparbool("sub_enabled",kit[i].Psubenabled); + if (xml->enterbranch("SUB_SYNTH_PARAMETERS")){ + kit[i].subpars->getfromXML(xml); + xml->exitbranch(); + }; + + xml->exitbranch(); + }; + + xml->exitbranch(); }; - - - //!!!!!!!!!!!continui de aici - - - - - - - - - - - - - - - + if (xml->enterbranch("INSTRUMENT_EFFECTS")){ + for (int nefx=0;nefx<NUM_PART_EFX;nefx++){ + if (xml->enterbranch("INSTRUMENT_EFFECT",nefx)==0) continue; + if (xml->enterbranch("EFFECT")){ + partefx[nefx]->getfromXML(xml); + xml->exitbranch(); + }; + + xml->getpar("route",Pefxroute[nefx],0,NUM_PART_EFX); + + xml->exitbranch(); + }; + xml->exitbranch(); + }; }; void Part::getfromXML(XMLwrapper *xml){ Penabled=xml->getparbool("enabled",Penabled); - Pvolume=xml->getpar127("volume",Pvolume); - Ppanning=xml->getpar127("panning",Ppanning); + setPvolume(xml->getpar127("volume",Pvolume)); + setPpanning(xml->getpar127("panning",Ppanning)); Pminkey=xml->getpar127("min_key",Pminkey); Pmaxkey=xml->getpar127("max_key",Pmaxkey); @@ -1094,14 +1134,16 @@ void Part::getfromXML(XMLwrapper *xml){ Ppolymode=xml->getparbool("poly_mode",Ppolymode); Pkeylimit=xml->getpar127("key_limit",Pkeylimit); + if (xml->enterbranch("INSTRUMENT")){ getfromXMLinstrument(xml); xml->exitbranch(); }; - xml->enterbranch("CONTROLLER"); -// ctl.(xml); - xml->exitbranch(); + if (xml->enterbranch("CONTROLLER")){ + ctl.getfromXML(xml); + xml->exitbranch(); + }; }; diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C @@ -54,7 +54,7 @@ XMLwrapper::XMLwrapper(){ node=root=mxmlNewElement(tree,"ZynAddSubFX-data"); mxmlElementSetAttr(root,"version-major","0"); - mxmlElementSetAttr(root,"version-minor","1"); + mxmlElementSetAttr(root,"version-minor","2"); //save zynaddsubfx specifications beginbranch("BASE_PARAMETERS"); @@ -135,6 +135,12 @@ void XMLwrapper::endbranch(){ int XMLwrapper::loadXMLfile(char *filename){ if (tree!=NULL) mxmlDelete(tree); tree=NULL; + + memset(&parentstack,0,sizeof(parentstack)); + memset(&values,0,sizeof(values)); + + stackpos=0; + FILE *file=fopen(filename,"r"); if (file==NULL) return(-1); @@ -176,6 +182,7 @@ int XMLwrapper::enterbranch(char *name,int id){ snprintf(tmpstr,TMPSTR_SIZE,"%d",id); node=mxmlFindElement(peek(),peek(),name,"id",tmpstr,MXML_DESCEND_FIRST); if (node==NULL) return(0); + push(node); return(1); }; @@ -237,6 +244,24 @@ void XMLwrapper::getparstr(char *name,char *par,int maxstrlen){ }; +REALTYPE XMLwrapper::getparreal(char *name,REALTYPE defaultpar){ + node=mxmlFindElement(peek(),peek(),"par_real","name",name,MXML_DESCEND_FIRST); + if (node==NULL) return(defaultpar); + + const char *strval=mxmlElementGetAttr(node,"value"); + if (strval==NULL) return(defaultpar); + + return(str2real(strval)); +}; + +REALTYPE XMLwrapper::getparreal(char *name,REALTYPE defaultpar,REALTYPE min,REALTYPE max){ + REALTYPE result=getparreal(name,defaultpar); + + if (result<min) result=min; + else if (result>max) result=max; + return(result); +}; + /** Private members **/ @@ -256,6 +281,12 @@ int XMLwrapper::str2int(const char *str){ return(result); }; +REALTYPE XMLwrapper::str2real(const char *str){ + if (str==NULL) return(0.0); + REALTYPE result=strtod(str,NULL); + return(result); +}; + mxml_node_t *XMLwrapper::addparams0(char *name){ mxml_node_t *element=mxmlNewElement(node,name); @@ -286,6 +317,8 @@ void XMLwrapper::push(mxml_node_t *node){ stackpos++; parentstack[stackpos]=node; +// printf("push %d - %s\n",stackpos,node->value.element.name); + }; mxml_node_t *XMLwrapper::pop(){ if (stackpos<=0) { @@ -294,6 +327,9 @@ mxml_node_t *XMLwrapper::pop(){ }; mxml_node_t *node=parentstack[stackpos]; parentstack[stackpos]=NULL; + +// printf("pop %d - %s\n",stackpos,node->value.element.name); + stackpos--; return(node); }; diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -99,6 +99,10 @@ class XMLwrapper{ int getparbool(char *name,int defaultpar); void getparstr(char *name,char *par,int maxstrlen); + REALTYPE getparreal(char *name,REALTYPE defaultpar); + REALTYPE getparreal(char *name,REALTYPE defaultpar,REALTYPE min,REALTYPE max); + + private: mxml_node_t *tree;//all xml data mxml_node_t *root;//xml data used by zynaddsubfx @@ -123,6 +127,7 @@ class XMLwrapper{ char *real2str(REALTYPE x); int str2int(const char *str); + REALTYPE str2real(const char *str); char tmpstr[TMPSTR_SIZE]; @@ -130,6 +135,7 @@ class XMLwrapper{ //this is used to store the parents mxml_node_t *parentstack[STACKSIZE]; int stackpos; + void push(mxml_node_t *node); mxml_node_t *pop(); diff --git a/src/Params/ADnoteParameters.C b/src/Params/ADnoteParameters.C @@ -539,7 +539,7 @@ void ADnoteParameters::add2XMLvoice(XMLwrapper *xml,int nvoice){ xml->addparbool("filter_enabled",VoicePar[nvoice].PFilterEnabled); xml->addparbool("filter_bypass",VoicePar[nvoice].Pfilterbypass); - xml->addparbool("fm_enabled",VoicePar[nvoice].PFMEnabled); + xml->addpar("fm_enabled",VoicePar[nvoice].PFMEnabled); xml->beginbranch("OSCIL"); VoicePar[nvoice].OscilSmp->add2XML(xml); @@ -591,7 +591,7 @@ void ADnoteParameters::add2XMLvoice(XMLwrapper *xml,int nvoice){ if (VoicePar[nvoice].PFilterEnabled!=0){ xml->beginbranch("FILTER_PARAMETERS"); xml->beginbranch("FILTER"); - GlobalPar.GlobalFilter->add2XML(xml); + VoicePar[nvoice].VoiceFilter->add2XML(xml); xml->endbranch(); xml->addparbool("filter_envelope_enabled",VoicePar[nvoice].PFilterEnvelopeEnabled); @@ -647,7 +647,7 @@ void ADnoteParameters::add2XMLvoice(XMLwrapper *xml,int nvoice){ void ADnoteParameters::add2XML(XMLwrapper *xml){ - xml->addpar("stereo",GlobalPar.PStereo); + xml->addparbool("stereo",GlobalPar.PStereo); xml->beginbranch("AMPLITUDE_PARAMETERS"); xml->addpar("volume",GlobalPar.PVolume); @@ -711,5 +711,204 @@ void ADnoteParameters::add2XML(XMLwrapper *xml){ }; +void ADnoteParameters::getfromXML(XMLwrapper *xml){ + GlobalPar.PStereo=xml->getparbool("stereo",GlobalPar.PStereo); + + if (xml->enterbranch("AMPLITUDE_PARAMETERS")){ + GlobalPar.PVolume=xml->getpar127("volume",GlobalPar.PVolume); + GlobalPar.PPanning=xml->getpar127("panning",GlobalPar.PPanning); + GlobalPar.PAmpVelocityScaleFunction=xml->getpar127("velocity_sensing",GlobalPar.PAmpVelocityScaleFunction); + + GlobalPar.PPunchStrength=xml->getpar127("punch_strength",GlobalPar.PPunchStrength); + GlobalPar.PPunchTime=xml->getpar127("punch_time",GlobalPar.PPunchTime); + GlobalPar.PPunchStretch=xml->getpar127("punch_stretch",GlobalPar.PPunchStretch); + GlobalPar.PPunchVelocitySensing=xml->getpar127("punch_velocity_sensing",GlobalPar.PPunchVelocitySensing); + + if (xml->enterbranch("AMPLITUDE_ENVELOPE")){ + GlobalPar.AmpEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + if (xml->enterbranch("AMPLITUDE_LFO")){ + GlobalPar.AmpLfo->getfromXML(xml); + xml->exitbranch(); + }; + + xml->exitbranch(); + }; + + if (xml->enterbranch("FREQUENCY_PARAMETERS")){ + GlobalPar.PDetune=xml->getpar("detune",GlobalPar.PDetune,0,16383); + GlobalPar.PCoarseDetune=xml->getpar127("coarse_detune",GlobalPar.PCoarseDetune); + GlobalPar.PDetuneType=xml->getpar127("detune_type",GlobalPar.PDetuneType); + + xml->enterbranch("FREQUENCY_ENVELOPE"); + GlobalPar.FreqEnvelope->getfromXML(xml); + xml->exitbranch(); + + xml->enterbranch("FREQUENCY_LFO"); + GlobalPar.FreqLfo->getfromXML(xml); + xml->exitbranch(); + + xml->exitbranch(); + }; + + + if (xml->enterbranch("FILTER_PARAMETERS")){ + GlobalPar.PFilterVelocityScale=xml->getpar127("velocity_sensing_amplitude",GlobalPar.PFilterVelocityScale); + GlobalPar.PFilterVelocityScaleFunction=xml->getpar127("velocity_sensing",GlobalPar.PFilterVelocityScaleFunction); + + xml->enterbranch("FILTER"); + GlobalPar.GlobalFilter->getfromXML(xml); + xml->exitbranch(); + + xml->enterbranch("FILTER_ENVELOPE"); + GlobalPar.FilterEnvelope->getfromXML(xml); + xml->exitbranch(); + + xml->enterbranch("FILTER_LFO"); + GlobalPar.FilterLfo->getfromXML(xml); + xml->exitbranch(); + xml->exitbranch(); + }; + + if (xml->enterbranch("RESONANCE")){ + GlobalPar.Reson->getfromXML(xml); + xml->exitbranch(); + }; + + for (int nvoice=0;nvoice<NUM_VOICES;nvoice++){ + if (xml->enterbranch("VOICE",nvoice)==0) continue; + getfromXMLvoice(xml,nvoice); + xml->exitbranch(); + }; + + +}; + +void ADnoteParameters::getfromXMLvoice(XMLwrapper *xml,int nvoice){ + if (nvoice>=NUM_VOICES) return; + + VoicePar[nvoice].Enabled=xml->getparbool("enabled",VoicePar[nvoice].Enabled); + + VoicePar[nvoice].Type=xml->getpar127("type",VoicePar[nvoice].Type); + VoicePar[nvoice].PDelay=xml->getpar127("delay",VoicePar[nvoice].PDelay); + VoicePar[nvoice].Presonance=xml->getparbool("resonance",VoicePar[nvoice].Presonance); + + VoicePar[nvoice].Pextoscil=xml->getpar("ext_oscil",-1,-1,nvoice-1); + VoicePar[nvoice].PextFMoscil=xml->getpar("ext_fm_oscil",-1,-1,nvoice-1); + + VoicePar[nvoice].Poscilphase=xml->getpar127("oscil_phase",VoicePar[nvoice].Poscilphase); + VoicePar[nvoice].PFMoscilphase=xml->getpar127("oscil_fm_phase",VoicePar[nvoice].PFMoscilphase); + + VoicePar[nvoice].PFilterEnabled=xml->getparbool("filter_enabled",VoicePar[nvoice].PFilterEnabled); + VoicePar[nvoice].Pfilterbypass=xml->getparbool("filter_bypass",VoicePar[nvoice].Pfilterbypass); + + VoicePar[nvoice].PFMEnabled=xml->getpar127("fm_enabled",VoicePar[nvoice].PFMEnabled); + + if (xml->enterbranch("OSCIL")){ + VoicePar[nvoice].OscilSmp->getfromXML(xml); + xml->exitbranch(); + }; + + + if (xml->enterbranch("AMPLITUDE_PARAMETERS")){ + VoicePar[nvoice].PPanning=xml->getpar127("panning",VoicePar[nvoice].PPanning); + VoicePar[nvoice].PVolume=xml->getpar127("volume",VoicePar[nvoice].PVolume); + VoicePar[nvoice].PVolumeminus=xml->getparbool("volume_minus",VoicePar[nvoice].PVolumeminus); + VoicePar[nvoice].PAmpVelocityScaleFunction=xml->getpar127("velocity_sensing",VoicePar[nvoice].PAmpVelocityScaleFunction); + + VoicePar[nvoice].PAmpEnvelopeEnabled=xml->getparbool("amp_envelope_enabled",VoicePar[nvoice].PAmpEnvelopeEnabled); + if (xml->enterbranch("AMPLITUDE_ENVELOPE")){ + VoicePar[nvoice].AmpEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + VoicePar[nvoice].PAmpLfoEnabled=xml->getparbool("amp_lfo_enabled",VoicePar[nvoice].PAmpLfoEnabled); + if (xml->enterbranch("AMPLITUDE_LFO")){ + VoicePar[nvoice].AmpLfo->getfromXML(xml); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (xml->enterbranch("FREQUENCY_PARAMETERS")){ + VoicePar[nvoice].Pfixedfreq=xml->getparbool("fixed_freq",VoicePar[nvoice].Pfixedfreq); + VoicePar[nvoice].PfixedfreqET=xml->getpar127("fixed_freq_et",VoicePar[nvoice].PfixedfreqET); + + + VoicePar[nvoice].PDetune=xml->getpar("detune",VoicePar[nvoice].PDetune,0,16383); + + VoicePar[nvoice].PCoarseDetune=xml->getpar127("coarse_detune",VoicePar[nvoice].PCoarseDetune); + VoicePar[nvoice].PDetuneType=xml->getpar127("detune_type",VoicePar[nvoice].PDetuneType); + + VoicePar[nvoice].PFreqEnvelopeEnabled=xml->getparbool("freq_envelope_enabled",VoicePar[nvoice].PFreqEnvelopeEnabled); + if (xml->enterbranch("FREQUENCY_ENVELOPE")){ + VoicePar[nvoice].FreqEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + VoicePar[nvoice].PFreqLfoEnabled=xml->getparbool("freq_lfo_enabled",VoicePar[nvoice].PFreqLfoEnabled); + if (xml->enterbranch("FREQUENCY_LFO")){ + VoicePar[nvoice].FreqLfo->getfromXML(xml); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (xml->enterbranch("FILTER_PARAMETERS")){ + if (xml->enterbranch("FILTER")){ + VoicePar[nvoice].VoiceFilter->getfromXML(xml); + xml->exitbranch(); + }; + + VoicePar[nvoice].PFilterEnvelopeEnabled=xml->getparbool("filter_envelope_enabled",VoicePar[nvoice].PFilterEnvelopeEnabled); + if (xml->enterbranch("FILTER_ENVELOPE")){ + VoicePar[nvoice].FilterEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + VoicePar[nvoice].PFilterLfoEnabled=xml->getparbool("filter_lfo_enabled",VoicePar[nvoice].PFilterLfoEnabled); + if (xml->enterbranch("FILTER_LFO")){ + VoicePar[nvoice].FilterLfo->getfromXML(xml); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (xml->enterbranch("FM_PARAMETERS")){ + VoicePar[nvoice].PFMVoice=xml->getpar("input_voice",VoicePar[nvoice].PFMVoice,-1,nvoice-1); + + VoicePar[nvoice].PFMVolume=xml->getpar127("volume",VoicePar[nvoice].PFMVolume); + VoicePar[nvoice].PFMVolumeDamp=xml->getpar127("volume_damp",VoicePar[nvoice].PFMVolumeDamp); + VoicePar[nvoice].PFMVelocityScaleFunction=xml->getpar127("velocity_sensing",VoicePar[nvoice].PFMVelocityScaleFunction); + + VoicePar[nvoice].PFMAmpEnvelopeEnabled=xml->getparbool("amp_envelope_enabled",VoicePar[nvoice].PFMAmpEnvelopeEnabled); + if (xml->enterbranch("AMPLITUDE_ENVELOPE")){ + VoicePar[nvoice].FMAmpEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + if (xml->enterbranch("MODULATOR")){ + VoicePar[nvoice].PFMDetune=xml->getpar("detune",VoicePar[nvoice].PFMDetune,0,16383); + VoicePar[nvoice].PFMCoarseDetune=xml->getpar127("coarse_detune",VoicePar[nvoice].PFMCoarseDetune); + VoicePar[nvoice].PFMDetuneType=xml->getpar127("detune_type",VoicePar[nvoice].PFMDetuneType); + + VoicePar[nvoice].PFMFreqEnvelopeEnabled=xml->getparbool("freq_envelope_enabled",VoicePar[nvoice].PFMFreqEnvelopeEnabled); + if (xml->enterbranch("FREQUENCY_ENVELOPE")){ + VoicePar[nvoice].FMFreqEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + if (xml->enterbranch("OSCIL")){ + VoicePar[nvoice].FMSmp->getfromXML(xml); + xml->exitbranch(); + }; + + xml->exitbranch(); + }; + xml->exitbranch(); + }; +}; diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h @@ -260,6 +260,8 @@ class ADnoteParameters{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); + void saveloadbuf(Buffer *buf); void saveloadbufvoice(Buffer *buf,unsigned char nvoice); @@ -270,6 +272,7 @@ class ADnoteParameters{ FFTwrapper *fft; void add2XMLvoice(XMLwrapper *xml,int nvoice); + void getfromXMLvoice(XMLwrapper *xml,int nvoice); }; #endif diff --git a/src/Params/Controller.C b/src/Params/Controller.C @@ -311,18 +311,18 @@ void Controller::saveloadbuf(Buffer *buf){ void Controller::add2XML(XMLwrapper *xml){ xml->addpar("pitchwheel_bendrange",pitchwheel.bendrange); - xml->addpar("expression_receive",expression.receive); + xml->addparbool("expression_receive",expression.receive); xml->addpar("panning_depth",panning.depth); xml->addpar("filter_cutoff_depth",filtercutoff.depth); xml->addpar("filter_q_depth",filterq.depth); xml->addpar("bandwidth_depth",bandwidth.depth); xml->addpar("mod_wheel_depth",modwheel.depth); - xml->addpar("mod_wheel_exponential",modwheel.exponential); - xml->addpar("fm_amp_receive",fmamp.receive); - xml->addpar("volume_receive",volume.receive); - xml->addpar("sustain_receive",sustain.receive); + xml->addparbool("mod_wheel_exponential",modwheel.exponential); + xml->addparbool("fm_amp_receive",fmamp.receive); + xml->addparbool("volume_receive",volume.receive); + xml->addparbool("sustain_receive",sustain.receive); - xml->addpar("portamento_receive",portamento.receive); + xml->addparbool("portamento_receive",portamento.receive); xml->addpar("portamento_time",portamento.time); xml->addpar("portamento_pitchthresh",portamento.pitchthresh); xml->addpar("portamento_pitchthreshtype",portamento.pitchthreshtype); @@ -333,5 +333,30 @@ void Controller::add2XML(XMLwrapper *xml){ xml->addpar("resonance_bandwidth_depth",resonancebandwidth.depth); }; +void Controller::getfromXML(XMLwrapper *xml){ + pitchwheel.bendrange=xml->getpar127("pitchwheel_bendrange",pitchwheel.bendrange); + + expression.receive=xml->getparbool("expression_receive",expression.receive); + panning.depth=xml->getpar127("panning_depth",panning.depth); + filtercutoff.depth=xml->getpar127("filter_cutoff_depth",filtercutoff.depth); + filterq.depth=xml->getpar127("filter_q_depth",filterq.depth); + bandwidth.depth=xml->getpar127("bandwidth_depth",bandwidth.depth); + modwheel.depth=xml->getpar127("mod_wheel_depth",modwheel.depth); + modwheel.exponential=xml->getparbool("mod_wheel_exponential",modwheel.exponential); + fmamp.receive=xml->getparbool("fm_amp_receive",fmamp.receive); + volume.receive=xml->getparbool("volume_receive",volume.receive); + sustain.receive=xml->getparbool("sustain_receive",sustain.receive); + + portamento.receive=xml->getparbool("portamento_receive",portamento.receive); + portamento.time=xml->getpar127("portamento_time",portamento.time); + portamento.pitchthresh=xml->getpar127("portamento_pitchthresh",portamento.pitchthresh); + portamento.pitchthreshtype=xml->getpar127("portamento_pitchthreshtype",portamento.pitchthreshtype); + portamento.portamento=xml->getpar127("portamento_portamento",portamento.portamento); + portamento.updowntimestretch=xml->getpar127("portamento_updowntimestretch",portamento.updowntimestretch); + + resonancecenter.depth=xml->getpar127("resonance_center_depth",resonancecenter.depth); + resonancebandwidth.depth=xml->getpar127("resonance_bandwidth_depth",resonancebandwidth.depth); +}; + diff --git a/src/Params/Controller.h b/src/Params/Controller.h @@ -37,6 +37,7 @@ class Controller{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); //Controllers functions void setpitchwheel(int value); diff --git a/src/Params/EnvelopeParams.C b/src/Params/EnvelopeParams.C @@ -240,6 +240,33 @@ void EnvelopeParams::add2XML(XMLwrapper *xml){ +void EnvelopeParams::getfromXML(XMLwrapper *xml){ + Pfreemode=xml->getparbool("free_mode",Pfreemode); + Penvpoints=xml->getpar127("env_points",Penvpoints); + Penvsustain=xml->getpar127("env_sustain",Penvsustain); + Penvstretch=xml->getpar127("env_stretch",Penvstretch); + Pforcedrelease=xml->getparbool("forced_release",Pforcedrelease); + Plinearenvelope=xml->getparbool("linear_envelope",Plinearenvelope); + + PA_dt=xml->getpar127("A_dt",PA_dt); + PD_dt=xml->getpar127("D_dt",PD_dt); + PR_dt=xml->getpar127("R_dt",PR_dt); + PA_val=xml->getpar127("A_val",PA_val); + PD_val=xml->getpar127("D_val",PD_val); + PS_val=xml->getpar127("S_val",PS_val); + PR_val=xml->getpar127("R_val",PR_val); + + for (int i=0;i<Penvpoints;i++){ + if (xml->enterbranch("POINT",i)==0) continue; + if (i!=0) Penvdt[i]=xml->getpar127("dt",Penvdt[i]); + Penvval[i]=xml->getpar127("val",Penvval[i]); + xml->exitbranch(); + }; + + if (!Pfreemode) converttofree(); +}; + + void EnvelopeParams::defaults(){ Penvstretch=Denvstretch; Pforcedrelease=Dforcedrelease; diff --git a/src/Params/EnvelopeParams.h b/src/Params/EnvelopeParams.h @@ -45,6 +45,8 @@ class EnvelopeParams{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); + REALTYPE getdt(char i); /* Parametrii MIDI */ diff --git a/src/Params/FilterParams.C b/src/Params/FilterParams.C @@ -348,4 +348,45 @@ void FilterParams::add2XML(XMLwrapper *xml){ }; +void FilterParams::getfromXML(XMLwrapper *xml){ + //filter parameters + Pcategory=xml->getpar127("category",Pcategory); + Ptype=xml->getpar127("type",Ptype); + Pfreq=xml->getpar127("freq",Pfreq); + Pq=xml->getpar127("q",Pq); + Pstages=xml->getpar127("stages",Pstages); + Pfreqtrack=xml->getpar127("freq_track",Pfreqtrack); + Pgain=xml->getpar127("gain",Pgain); + + //formant filter parameters + if(xml->enterbranch("FORMANT_FILTER")){ + Pnumformants=xml->getpar127("num_formants",Pnumformants); + Pformantslowness=xml->getpar127("formant_slowness",Pformantslowness); + Pvowelclearness=xml->getpar127("vowel_clearness",Pvowelclearness); + Pcenterfreq=xml->getpar127("center_freq",Pcenterfreq); + Poctavesfreq=xml->getpar127("octaves_freq",Poctavesfreq); + + for (int nvowel=0;nvowel<FF_MAX_VOWELS;nvowel++){ + if (xml->enterbranch("VOWEL",nvowel)==0) continue; + for (int nformant=0;nformant<FF_MAX_FORMANTS;nformant++){ + if (xml->enterbranch("FORMANT",nformant)==0) continue; + Pvowels[nvowel].formants[nformant].freq=xml->getpar127("freq",Pvowels[nvowel].formants[nformant].freq); + Pvowels[nvowel].formants[nformant].amp=xml->getpar127("amp",Pvowels[nvowel].formants[nformant].amp); + Pvowels[nvowel].formants[nformant].q=xml->getpar127("q",Pvowels[nvowel].formants[nformant].q); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + Psequencesize=xml->getpar127("sequence_size",Psequencesize); + Psequencestretch=xml->getpar127("sequence_stretch",Psequencestretch); + Psequencereversed=xml->getparbool("sequence_reversed",Psequencereversed); + for (int nseq=0;nseq<FF_MAX_SEQUENCE;nseq++){ + if (xml->enterbranch("SEQUENCE_POS",nseq)==0) continue; + Psequence[nseq].nvowel=xml->getpar("vowel_id",Psequence[nseq].nvowel,0,FF_MAX_VOWELS-1); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + +}; diff --git a/src/Params/FilterParams.h b/src/Params/FilterParams.h @@ -35,6 +35,7 @@ class FilterParams{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); REALTYPE getfreq(); diff --git a/src/Params/LFOParams.C b/src/Params/LFOParams.C @@ -115,4 +115,14 @@ void LFOParams::add2XML(XMLwrapper *xml){ xml->addparbool("continous",Pcontinous); }; +void LFOParams::getfromXML(XMLwrapper *xml){ + Pfreq=xml->getpar127("freq",Pfreq); + Pintensity=xml->getpar127("intensity",Pintensity); + Pstartphase=xml->getpar127("start_phase",Pstartphase); + PLFOtype=xml->getpar127("lfo_type",PLFOtype); + Prandomness=xml->getpar127("randomness_amplitude",Prandomness); + Pfreqrand=xml->getpar127("randomness_frequency",Pfreqrand); + Pdelay=xml->getpar127("delay",Pdelay); + Pcontinous=xml->getparbool("continous",Pcontinous); +}; diff --git a/src/Params/LFOParams.h b/src/Params/LFOParams.h @@ -35,8 +35,8 @@ class LFOParams{ void saveloadbuf(Buffer *buf); void add2XML(XMLwrapper *xml); - - void defaults();//reset parameters to the default parameters + void defaults(); + void getfromXML(XMLwrapper *xml); /* Parametrii MIDI */ unsigned char Pfreq; // frequency diff --git a/src/Params/SUBnoteParameters.C b/src/Params/SUBnoteParameters.C @@ -209,7 +209,6 @@ void SUBnoteParameters::saveloadbuf(Buffer *buf){ void SUBnoteParameters::add2XML(XMLwrapper *xml){ - xml->addpar("num_stages",Pnumstages); xml->addpar("harmonic_mag_type",Phmagtype); xml->addpar("start",Pstart); @@ -260,7 +259,7 @@ void SUBnoteParameters::add2XML(XMLwrapper *xml){ }; xml->endbranch(); - xml->beginbranch("FREQUENCY_PARAMETERS"); + xml->beginbranch("FILTER_PARAMETERS"); xml->addparbool("enabled",PGlobalFilterEnabled); if (PGlobalFilterEnabled!=0){ xml->beginbranch("FILTER"); @@ -277,6 +276,78 @@ void SUBnoteParameters::add2XML(XMLwrapper *xml){ xml->endbranch(); }; +void SUBnoteParameters::getfromXML(XMLwrapper *xml){ + Pnumstages=xml->getpar127("num_stages",Pnumstages); + Phmagtype=xml->getpar127("harmonic_mag_type",Phmagtype); + Pstart=xml->getpar127("start",Pstart); + + if (xml->enterbranch("HARMONICS")){ + for (int i=0;i<MAX_SUB_HARMONICS;i++){ + if (xml->enterbranch("HARMONIC",i)==0) continue; + Phmag[i]=xml->getpar127("mag",Phmag[i]); + Phrelbw[i]=xml->getpar127("relbw",Phrelbw[i]); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (xml->enterbranch("AMPLITUDE_PARAMETERS")){ + Pstereo=xml->getparbool("stereo",Pstereo); + PVolume=xml->getpar127("volume",PVolume); + PPanning=xml->getpar127("panning",PPanning); + PAmpVelocityScaleFunction=xml->getpar127("velocity_sensing",PAmpVelocityScaleFunction); + if (xml->enterbranch("AMPLITUDE_ENVELOPE")){ + AmpEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (xml->enterbranch("FREQUENCY_PARAMETERS")){ + Pfixedfreq=xml->getparbool("fixed_freq",Pfixedfreq); + PfixedfreqET=xml->getpar127("fixed_freq_et",PfixedfreqET); + + PDetune=xml->getpar("detune",PDetune,0,16383); + PCoarseDetune=xml->getpar127("coarse_detune",PCoarseDetune); + PDetuneType=xml->getpar127("detune_type",PDetuneType); + + Pbandwidth=xml->getpar127("bandwidth",Pbandwidth); + Pbwscale=xml->getpar127("bandwidth_scale",Pbwscale); + + PFreqEnvelopeEnabled=xml->getparbool("freq_envelope_enabled",PFreqEnvelopeEnabled); + if (xml->enterbranch("FREQUENCY_ENVELOPE")){ + FreqEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + PBandWidthEnvelopeEnabled=xml->getparbool("band_width_envelope_enabled",PBandWidthEnvelopeEnabled); + if (xml->enterbranch("BANDWIDTH_ENVELOPE")){ + BandWidthEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + xml->exitbranch(); + }; + + if (xml->enterbranch("FILTER_PARAMETERS")){ + PGlobalFilterEnabled=xml->getparbool("enabled",PGlobalFilterEnabled); + if (xml->enterbranch("FILTER")){ + GlobalFilter->getfromXML(xml); + xml->exitbranch(); + }; + + PGlobalFilterVelocityScaleFunction=xml->getpar127("filter_velocity_sensing",PGlobalFilterVelocityScaleFunction); + PGlobalFilterVelocityScale=xml->getpar127("filter_velocity_sensing_amplitude",PGlobalFilterVelocityScale); + + if (xml->enterbranch("FILTER_ENVELOPE")){ + GlobalFilterEnvelope->getfromXML(xml); + xml->exitbranch(); + }; + + xml->exitbranch(); + }; +}; + diff --git a/src/Params/SUBnoteParameters.h b/src/Params/SUBnoteParameters.h @@ -38,6 +38,7 @@ class SUBnoteParameters{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); //Parameters //AMPLITUDE PARAMETRERS diff --git a/src/Synth/OscilGen.C b/src/Synth/OscilGen.C @@ -873,4 +873,64 @@ void OscilGen::add2XML(XMLwrapper *xml){ }; +void OscilGen::getfromXML(XMLwrapper *xml){ + + Phmagtype=xml->getpar127("harmonic_mag_type",Phmagtype); + Pnormalizemethod=xml->getpar127("normalize_method",Pnormalizemethod); + + Pcurrentbasefunc=xml->getpar127("base_function",Pcurrentbasefunc); + Pbasefuncpar=xml->getpar127("base_function_par",Pbasefuncpar); + + Pwaveshaping=xml->getpar127("wave_shaping",Pwaveshaping); + Pwaveshapingfunction=xml->getpar127("wave_shaping_function",Pwaveshapingfunction); + + Pfiltertype=xml->getpar127("filter_type",Pfiltertype); + Pfilterpar=xml->getpar127("filter_par",Pfilterpar); + Pfilterbeforews=xml->getpar127("filter_before_wave_shaping",Pfilterbeforews); + + Psatype=xml->getpar127("spectrum_adjust_type",Psatype); + Psapar=xml->getpar127("spectrum_adjust_par",Psapar); + + Prand=xml->getpar127("rand",Prand); + Pamprandtype=xml->getpar127("amp_rand_type",Pamprandtype); + Pamprandpower=xml->getpar127("amp_rand_power",Pamprandpower); + + if (xml->enterbranch("HARMONICS")){ + for (int n=0;n<MAX_AD_HARMONICS;n++){ + if (xml->enterbranch("HARMONIC",n+1)==0) continue; + Phmag[n]=xml->getpar127("mag",Phmag[n]); + Phphase[n]=xml->getpar127("phase",Phphase[n]); + xml->exitbranch(); + }; + xml->exitbranch(); + }; + + if (Pcurrentbasefunc!=0) changebasefunction(); + + + if (xml->enterbranch("BASE_FUNCTION")){ + for (int i=1;i<OSCIL_SIZE/2;i++){ + if (xml->enterbranch("BF_HARMONIC",i)){ + basefuncFFTfreqs[i]=xml->getparreal("cos",0.0); + basefuncFFTfreqs[OSCIL_SIZE-i]=xml->getparreal("sin",0.0); + xml->exitbranch(); + }; + + + }; + xml->exitbranch(); + + REALTYPE max=0.0; + + basefuncFFTfreqs[0]=0.0; + for (int i=0;i<OSCIL_SIZE;i++) if (max<fabs(basefuncFFTfreqs[i])) max=fabs(basefuncFFTfreqs[i]); + if (max<0.00000001) max=1.0; + + for (int i=0;i<OSCIL_SIZE;i++) if (basefuncFFTfreqs[i]) basefuncFFTfreqs[i]/=max; + }; + + +}; + + diff --git a/src/Synth/OscilGen.h b/src/Synth/OscilGen.h @@ -53,6 +53,7 @@ class OscilGen{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); //Parameters diff --git a/src/Synth/Resonance.C b/src/Synth/Resonance.C @@ -238,11 +238,11 @@ void Resonance::add2XML(XMLwrapper *xml){ xml->addparbool("enabled",Penabled); if (Penabled==0) return; - xml->addpar("maxdb",PmaxdB); - xml->addpar("centerfreq",Pcenterfreq); - xml->addpar("octavesfreq",Poctavesfreq); + xml->addpar("max_db",PmaxdB); + xml->addpar("center_freq",Pcenterfreq); + xml->addpar("octaves_freq",Poctavesfreq); xml->addpar("gain",Pgain); - xml->addparbool("protectthefundamental",Pprotectthefundamental); + xml->addparbool("protect_fundamental_frequency",Pprotectthefundamental); xml->addpar("resonance_points",N_RES_POINTS); for (int i=0;i<N_RES_POINTS;i++){ xml->beginbranch("RESPOINT",i); @@ -252,5 +252,19 @@ void Resonance::add2XML(XMLwrapper *xml){ }; +void Resonance::getfromXML(XMLwrapper *xml){ + Penabled=xml->getparbool("enabled",Penabled); + + PmaxdB=xml->getpar127("max_db",PmaxdB); + Pcenterfreq=xml->getpar127("center_freq",Pcenterfreq); + Poctavesfreq=xml->getpar127("octaves_freq",Poctavesfreq); + Pgain=xml->getpar127("gain",Pgain); + Pprotectthefundamental=xml->getparbool("protect_fundamental_frequency",Pprotectthefundamental); + for (int i=0;i<N_RES_POINTS;i++){ + if (xml->enterbranch("RESPOINT",i)==0) continue; + Prespoints[i]=xml->getpar127("val",Prespoints[i]); + xml->exitbranch(); + }; +}; diff --git a/src/Synth/Resonance.h b/src/Synth/Resonance.h @@ -42,6 +42,8 @@ class Resonance{ void add2XML(XMLwrapper *xml); void defaults(); + void getfromXML(XMLwrapper *xml); + REALTYPE getfreqpos(REALTYPE freq); REALTYPE getfreqx(REALTYPE x);