zynaddsubfx

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

commit 80d9775dc6690e5cdb346e6d760b09c093c975ed
parent 63e99124c36e30b4a97b993fcf54ed8fb65545e8
Author: paulnasca <paulnasca>
Date:   Thu,  5 Feb 2004 20:37:44 +0000

*** empty log message ***

Diffstat:
MChangeLog | 10++++++----
Msrc/Effects/EffectMgr.C | 30++++++++++++++++++++++++------
Msrc/Effects/EffectMgr.h | 4++++
Msrc/Misc/Master.C | 48+++++++++++++++++++++++++++++++++++++++++++++---
Msrc/Misc/Microtonal.C | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Misc/Microtonal.h | 17+++++++++++++----
Msrc/Misc/Part.C | 40+++++++++++++++++-----------------------
Msrc/Misc/XMLwrapper.C | 15++++++++++++---
Msrc/Misc/XMLwrapper.h | 7++++++-
Msrc/Params/ADnoteParameters.C | 178+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Msrc/Params/ADnoteParameters.h | 4++++
Msrc/Params/Controller.C | 27+++++++++++++++++++++++++++
Msrc/Params/Controller.h | 5+++++
Msrc/Params/SUBnoteParameters.C | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Params/SUBnoteParameters.h | 2++
Msrc/Synth/OscilGen.C | 29+++++++++++++++++++++++++++++
Msrc/Synth/OscilGen.h | 8++++++--
Msrc/Synth/Resonance.C | 2+-
Msrc/UI/MasterUI.fl | 6+++---
19 files changed, 498 insertions(+), 72 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -514,12 +514,14 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -01 Feb 2003 - Revenit la versiunea din 16 Dec. 2003 +01 Feb 2004 - Revenit la versiunea din 16 Dec. 2003 - Pus iarasi RMS normalize prestabilit la OscilGen - M-am razgandit ;) nu mai restructurez part-ul; mai bine pun acolo o functie separata pentru salvari/incarcari par instrumente - Inceput sa adaug suportul XML -02 Feb 2003 - Corectata o eroare care facea ca numele la instrumentele din bank sa fie aratate gresit (nu era pus un \0 ) +02 Feb 2004 - Corectata o eroare care facea ca numele la instrumentele din bank sa fie aratate gresit (nu era pus un \0 ) - Continuat suportul de XML -03 Feb 2003 - Continuat de scris suportul XML - inceput sa salvezi cativa parametrii -04 Feb 2003 - Se salveaza parametrii XML la master, part, filter, lfo, envelope, resonance si adnote (partial) +03 Feb 2004 - Continuat de scris suportul XML - inceput sa salvezi cativa parametrii +04 Feb 2004 - Se salveaza parametrii XML la master, part, filter, lfo, envelope, resonance si adnote (partial) +05 Feb 2004 - Se salveaza toti parametrii in XML + diff --git a/src/Effects/EffectMgr.C b/src/Effects/EffectMgr.C @@ -168,6 +168,15 @@ REALTYPE EffectMgr::sysefxgetvolume(){ }; +/* + * Get the EQ response + */ +REALTYPE EffectMgr::getEQfreqresponse(REALTYPE freq){ + if (nefx==7) return(efx->getfreqresponse(freq)); + else return(0.0); +}; + + /* * Save or load the parameters to/from the buffer @@ -228,13 +237,22 @@ void EffectMgr::saveloadbuf(Buffer *buf){ }; }; +void EffectMgr::add2XML(XMLwrapper *xml){ + xml->addpar("type",geteffect()); + if ((efx==NULL)||(geteffect()==0)) return; + xml->addpar("preset",efx->Ppreset); -/* - * Get the EQ response - */ -REALTYPE EffectMgr::getEQfreqresponse(REALTYPE freq){ - if (nefx==7) return(efx->getfreqresponse(freq)); - else return(0.0); + xml->beginbranch("EFFECT_PARAMETERS"); + for (int n=0;n<128;n++){ + int par=geteffectpar(n); + if (par==0) continue; + xml->beginbranch("parno",n); + xml->addpar("par",par); + xml->endbranch(); + }; + xml->endbranch(); }; + + diff --git a/src/Effects/EffectMgr.h b/src/Effects/EffectMgr.h @@ -34,6 +34,7 @@ #include "Distorsion.h" #include "EQ.h" #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" class EffectMgr{ @@ -41,6 +42,9 @@ class EffectMgr{ EffectMgr(int insertion_,pthread_mutex_t *mutex_); ~EffectMgr(); void saveloadbuf(Buffer *buf); + void add2XML(XMLwrapper *xml); + + void out(REALTYPE *smpsl,REALTYPE *smpsr); //get the output(to speakers) volume of the systemeffect diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -693,18 +693,60 @@ void Master::saveloadbuf(Buffer *buf){ void Master::add2XML(XMLwrapper *xml){ - //parameters xml->addpar("volume",Pvolume); xml->addpar("keyshift",Pkeyshift); xml->addparbool("NRPNreceive",ctl.NRPN.receive); - //Save all parts - + xml->beginbranch("MICROTONAL"); + microtonal.add2XML(xml); + xml->endbranch(); + for (int npart=0;npart<NUM_MIDI_PARTS;npart++){ xml->beginbranch("PART",npart); part[npart]->add2XML(xml); xml->endbranch(); }; + + xml->beginbranch("INSERTION_EFFECTS"); + xml->endbranch(); + + xml->beginbranch("SYSTEM_EFFECTS"); + for (int nefx=0;nefx<NUM_SYS_EFX;nefx++){ + xml->beginbranch("SYSEFFECT",nefx); + xml->beginbranch("EFFECT"); + sysefx[nefx]->add2XML(xml); + xml->endbranch(); + + for (int pefx=0;pefx<NUM_MIDI_PARTS;pefx++){ + xml->beginbranch("VOLUME",pefx); + xml->addpar("vol",Psysefxvol[nefx][pefx]); + xml->endbranch(); + }; + + for (int tonefx=nefx+1;tonefx<NUM_SYS_EFX;tonefx++){ + xml->beginbranch("SENDTO",tonefx); + xml->addpar("sendvol",Psysefxsend[nefx][tonefx]); + xml->endbranch(); + }; + + + xml->endbranch(); + }; + xml->endbranch(); + + xml->beginbranch("INSERTION_EFFECTS"); + for (int nefx=0;nefx<NUM_INS_EFX;nefx++){ + xml->beginbranch("INSEFFECT",nefx); + xml->addpar("part",Pinsparts[nefx]); + + xml->beginbranch("EFFECT"); + insefx[nefx]->add2XML(xml); + xml->endbranch(); + xml->endbranch(); + }; + + xml->endbranch(); + }; diff --git a/src/Misc/Microtonal.C b/src/Misc/Microtonal.C @@ -561,3 +561,69 @@ void Microtonal::saveloadbuf(Buffer *buf){ buf->rwbyte(&tmp); }; }; + + +void Microtonal::add2XML(XMLwrapper *xml){ + xml->addparstr("name",(char *) Pname); + xml->addparstr("comment",(char *) Pcomment); + + xml->addparbool("invertupdown",Pinvertupdown); + xml->addparbool("invertupdowncenter",Pinvertupdowncenter); + + xml->addparbool("enabled",Penabled); + xml->addpar("globalfinedetune",Pglobalfinedetune); + + xml->addpar("anote",PAnote); + xml->addparreal("afreq",PAfreq); + + if (Penabled==0) return; + + xml->beginbranch("SCALE"); + xml->addpar("scaleshift",Pscaleshift); + xml->addpar("firstkey",Pfirstkey); + xml->addpar("lastkey",Plastkey); + xml->addpar("middlenote",Pmiddlenote); + + xml->beginbranch("OCTAVE"); + xml->addpar("octavesize",octavesize); + for (int i=0;i<octavesize;i++){ + xml->beginbranch("DEGREE",i); + if (octave[i].type==1){ + xml->addparreal("cents",octave[i].tuning); + }; + if (octave[i].type==2){ + xml->addpar("numerator",octave[i].x1); + xml->addpar("denominator",octave[i].x2); + }; + xml->endbranch(); + }; + xml->endbranch(); + + xml->beginbranch("KEYBOARD_MAPPING"); + xml->addpar("mapsize",Pmapsize); + xml->addpar("mappingenabled",Pmappingenabled); + for (int i=0;i<Pmapsize;i++){ + xml->beginbranch("KEYMAP",i); + xml->addpar("degree",Pmapping[i]); + xml->endbranch(); + }; + xml->endbranch(); + xml->endbranch(); + + /* + + //Mapping ON/OFF + unsigned char Pmappingenabled; + //Mapping (keys) + short int Pmapping[128]; + + unsigned char Pglobalfinedetune; + + // Functions + + */ + +}; + + + diff --git a/src/Misc/Microtonal.h b/src/Misc/Microtonal.h @@ -25,6 +25,8 @@ #include "../globals.h" #include "Buffer.h" +#include "XMLwrapper.h" + #define MAX_OCTAVE_SIZE 128 #define MICROTONAL_MAX_NAME_LEN 120 @@ -36,9 +38,9 @@ class Microtonal{ ~Microtonal(); void reset(); REALTYPE getnotefreq(int note,int keyshift); + //Parameters - //if the keys are inversed (the pitch is lower to keys from the right direction) unsigned char Pinvertupdown; @@ -83,18 +85,25 @@ class Microtonal{ void texttomapping(const char *text); unsigned char *Pname; unsigned char *Pcomment; + void saveloadbuf(Buffer *buf); + + void add2XML(XMLwrapper *xml); + private: int linetotunings(unsigned int nline,const char *line); int loadline(FILE *file,char *line);//loads a line from the text file, while ignoring the lines beggining with "!" unsigned char octavesize; struct { + unsigned char type;//1 for cents or 2 for division + // the real tuning (eg. +1.05946 for one halftone) // or 2.0 for one octave REALTYPE tuning; - //folowing parameters are used for save/load from parameters buffers(file) - unsigned char type; - unsigned int x1,x2;// smaller than pow(128.0,3.0)-1.0 + + //the real tunning is x1/x2 + unsigned int x1,x2; + } octave[MAX_OCTAVE_SIZE],tmpoctave[MAX_OCTAVE_SIZE]; }; diff --git a/src/Misc/Part.C b/src/Misc/Part.C @@ -928,7 +928,7 @@ void Part::add2XMLinstrument(XMLwrapper *xml){ xml->addparbool("drummode",Pdrummode); for (int i=0;i<NUM_KIT_ITEMS;i++){ - xml->beginbranch("INSTRUMENTKIT",i); + xml->beginbranch("INSTRUMENTKITITEM",i); xml->addparbool("enabled",kit[i].Penabled); if (kit[i].Penabled!=0) { xml->addparstr("name",(char *)kit[i].Pname); @@ -940,17 +940,16 @@ void Part::add2XMLinstrument(XMLwrapper *xml){ xml->addpar("Psendtoparteefect",kit[i].Psendtoparteffect); xml->addpar("adenabled",kit[i].Padenabled); - xml->addpar("subenabled",kit[i].Psubenabled); - if ((kit[i].Padenabled!=0)&&(kit[i].adpars!=NULL)){ xml->beginbranch("ADNOTEPARAMETERS"); kit[i].adpars->add2XML(xml); xml->endbranch(); }; + xml->addpar("subenabled",kit[i].Psubenabled); if ((kit[i].Psubenabled!=0)&&(kit[i].subpars!=NULL)){ xml->beginbranch("SUBNOTEPARAMETERS"); - //kit[i].subpars->add2XML(xml); + kit[i].subpars->add2XML(xml); xml->endbranch(); }; @@ -977,31 +976,26 @@ void Part::add2XML(XMLwrapper *xml){ xml->addpar("velsns",Pvelsns); xml->addpar("veloffs",Pveloffs); - xml->addpar("noteon",Pnoteon); + xml->addparbool("noteon",Pnoteon); xml->addparbool("polymode",Ppolymode); xml->addpar("keylimit",Pkeylimit); -// xml->addpar("",P); + xml->beginbranch("INSTRUMENTKIT"); + add2XMLinstrument(xml); + xml->endbranch(); - - - - xml->beginbranch("INSTRUMENT"); - add2XMLinstrument(xml); + xml->beginbranch("CONTROLLER"); + ctl.add2XML(xml); xml->endbranch(); + for (int nefx=0;nefx<NUM_PART_EFX;nefx++){ + xml->beginbranch("PARTEFFECT",nefx); + xml->beginbranch("EFFECT"); + partefx[nefx]->add2XML(xml); + xml->endbranch(); - -// xml->addpar("volume",Pvolume); -// xml->addpar("keyshift",Pkeyshift); - - -// for (int npart=0;npart<NUM_MIDI_PARTS;npart++){ -// xml->addpart(npart); - - - -// xml->endbranch(); -// }; + xml->addpar("route",Pefxroute[nefx]); + xml->endbranch(); + }; }; diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C @@ -66,11 +66,11 @@ int XMLwrapper::saveXMLfile(char *filename,int compression){ fclose(file); - //test +/* //test printf("\n\n"); mxmlSaveFile(tree,stdout,XMLwrapper_whitespace_callback); printf("\n\n"); - +*/ return(0); }; @@ -79,6 +79,10 @@ void XMLwrapper::addpar(char *name,int val){ addparams2("PARAM","name",name,"value",int2str(val)); }; +void XMLwrapper::addparreal(char *name,REALTYPE val){ + addparams2("PARAMREAL","name",name,"value",real2str(val)); +}; + void XMLwrapper::addparbool(char *name,int val){ if (val!=0) addparams2("BOOLPARAM","name",name,"value","yes"); else addparams2("BOOLPARAM","name",name,"value","no"); @@ -112,6 +116,11 @@ char *XMLwrapper::int2str(int x){ return(tmpstr); }; +char *XMLwrapper::real2str(REALTYPE x){ + snprintf(tmpstr,TMPSTR_SIZE,"%g",x); + return(tmpstr); +}; + mxml_node_t *XMLwrapper::addparams0(char *name){ mxml_node_t *element=mxmlNewElement(node,name); return(element); @@ -136,7 +145,7 @@ mxml_node_t *XMLwrapper::addparams2(char *name,char *par1,char *val1,char *par2, void XMLwrapper::push(mxml_node_t *node){ if (stackpos>=STACKSIZE-1) { printf("BUG!: XMLwrapper::push() - full parentstack\n"); - return;//nu mai este loc in stiva + return; }; stackpos++; parentstack[stackpos]=node; diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -21,11 +21,14 @@ */ #include <mxml.h> +#ifndef REALTYPE +#define REALTYPE float +#endif #ifndef XML_WRAPPER_H #define XML_WRAPPER_H -#define TMPSTR_SIZE 20 +#define TMPSTR_SIZE 50 //the maxim tree depth #define STACKSIZE 100 @@ -40,6 +43,7 @@ class XMLwrapper{ //add simple parameter (name and value) void addpar(char *name,int val); + void addparreal(char *name,REALTYPE val); //add boolean parameter (name and boolean value) //if the value is 0 => "yes", else "no" @@ -78,6 +82,7 @@ class XMLwrapper{ mxml_node_t *addparams2(char *name,char *par1,char *val1,char *par2, char *val2); char *int2str(int x); + char *real2str(REALTYPE x); char tmpstr[TMPSTR_SIZE]; diff --git a/src/Params/ADnoteParameters.C b/src/Params/ADnoteParameters.C @@ -483,24 +483,141 @@ void ADnoteParameters::saveloadbuf(Buffer *buf){ }; +void ADnoteParameters::add2XMLvoice(XMLwrapper *xml,int nvoice){ + if (nvoice>=NUM_VOICES) return; + + int oscilused=0,fmoscilused=0;//if the oscil or fmoscil are used by another voice + for (int i=0;i<NUM_VOICES;i++){ + if (VoicePar[i].Pextoscil==nvoice) oscilused=1; + if (VoicePar[i].PextFMoscil==nvoice) fmoscilused=1; + }; + + xml->addparbool("enabled",VoicePar[nvoice].Enabled); + if ((VoicePar[nvoice].Enabled==0)&&(oscilused==0)&&(fmoscilused==0)) return; + + xml->addpar("type",VoicePar[nvoice].Type); + xml->addpar("delay",VoicePar[nvoice].PDelay); + xml->addparbool("resonance",VoicePar[nvoice].Presonance); + + xml->addpar("extoscil",VoicePar[nvoice].Pextoscil); + xml->addpar("extfmoscil",VoicePar[nvoice].PextFMoscil); + + xml->addpar("oscilphase",VoicePar[nvoice].Poscilphase); + xml->addpar("oscilfmphase",VoicePar[nvoice].PFMoscilphase); + + xml->addparbool("filterenabled",VoicePar[nvoice].PFilterEnabled); + xml->addparbool("filterbypass",VoicePar[nvoice].Pfilterbypass); + + xml->addparbool("fmenabled",VoicePar[nvoice].PFMEnabled); + + xml->beginbranch("OSCIL"); + VoicePar[nvoice].OscilSmp->add2XML(xml); + xml->endbranch(); + + + xml->beginbranch("AMPLITUDE_PARAMETERS"); + xml->addpar("panning",VoicePar[nvoice].PPanning); + xml->addpar("volume",VoicePar[nvoice].PVolume); + xml->addparbool("volumeminus",VoicePar[nvoice].PVolumeminus); + xml->addpar("velocitysensing",VoicePar[nvoice].PAmpVelocityScaleFunction); + + xml->addparbool("ampenvelopeenabled",VoicePar[nvoice].PAmpEnvelopeEnabled); + if (VoicePar[nvoice].PAmpEnvelopeEnabled!=0){ + xml->beginbranch("AMPLITUDE_ENVELOPE"); + VoicePar[nvoice].AmpEnvelope->add2XML(xml); + xml->endbranch(); + }; + xml->addparbool("amplfoenabled",VoicePar[nvoice].PAmpLfoEnabled); + if (VoicePar[nvoice].PAmpLfoEnabled!=0){ + xml->beginbranch("AMPLITUDE_LFO"); + VoicePar[nvoice].AmpLfo->add2XML(xml); + xml->endbranch(); + }; + xml->endbranch(); -void ADnoteParameters::add2XML(XMLwrapper *xml){ - xml->addpar("stereo",GlobalPar.PStereo); xml->beginbranch("FREQUENCY_PARAMETERS"); - xml->addpar("detune",GlobalPar.PDetune); - xml->addpar("coarsedetune",GlobalPar.PCoarseDetune); - xml->addpar("detunetype",GlobalPar.PDetuneType); - - xml->beginbranch("ENVELOPE_FREQUENCY"); - GlobalPar.FreqEnvelope->add2XML(xml); + xml->addparbool("fixedfreq",VoicePar[nvoice].Pfixedfreq); + xml->addpar("fixedfreqet",VoicePar[nvoice].PfixedfreqET); + xml->addpar("detune",VoicePar[nvoice].PDetune); + xml->addpar("coarsedetune",VoicePar[nvoice].PCoarseDetune); + xml->addpar("detunetype",VoicePar[nvoice].PDetuneType); + + xml->addparbool("freqenvelopeenabled",VoicePar[nvoice].PFreqEnvelopeEnabled); + if (VoicePar[nvoice].PFreqEnvelopeEnabled!=0){ + xml->beginbranch("FREQUENCY_ENVELOPE"); + VoicePar[nvoice].FreqEnvelope->add2XML(xml); + xml->endbranch(); + }; + xml->addparbool("freqlfoenabled",VoicePar[nvoice].PFreqLfoEnabled); + if (VoicePar[nvoice].PFreqLfoEnabled!=0){ + xml->beginbranch("FREQUENCY_LFO"); + VoicePar[nvoice].FreqLfo->add2XML(xml); + xml->endbranch(); + }; + xml->endbranch(); + + + if (VoicePar[nvoice].PFilterEnabled!=0){ + xml->beginbranch("FILTER_PARAMETERS"); + xml->beginbranch("FILTER"); + GlobalPar.GlobalFilter->add2XML(xml); + xml->endbranch(); + + xml->addparbool("filterenvelopeenabled",VoicePar[nvoice].PFilterEnvelopeEnabled); + if (VoicePar[nvoice].PFilterEnvelopeEnabled!=0){ + xml->beginbranch("FILTER_ENVELOPE"); + VoicePar[nvoice].FilterEnvelope->add2XML(xml); + xml->endbranch(); + }; + + xml->addparbool("filterlfoenabled",VoicePar[nvoice].PFilterLfoEnabled); + if (VoicePar[nvoice].PFilterLfoEnabled!=0){ + xml->beginbranch("FILTER_LFO"); + VoicePar[nvoice].FilterLfo->add2XML(xml); + xml->endbranch(); + }; xml->endbranch(); - - xml->beginbranch("LFO_FREQENCY"); - GlobalPar.FreqLfo->add2XML(xml); + }; + + if ((VoicePar[nvoice].PFMEnabled!=0)||(fmoscilused!=0)){ + xml->beginbranch("FM_PARAMETERS"); + xml->addpar("inputvoice",VoicePar[nvoice].PFMVoice); + + xml->addpar("volume",VoicePar[nvoice].PFMVolume); + xml->addpar("volumedamp",VoicePar[nvoice].PFMVolumeDamp); + xml->addpar("velocitysensing",VoicePar[nvoice].PFMVelocityScaleFunction); + + xml->addparbool("ampenvelopeenabled",VoicePar[nvoice].PFMAmpEnvelopeEnabled); + if (VoicePar[nvoice].PFMAmpEnvelopeEnabled!=0){ + xml->beginbranch("AMPLITUDE_ENVELOPE"); + VoicePar[nvoice].FMAmpEnvelope->add2XML(xml); + xml->endbranch(); + }; + + xml->addpar("detune",VoicePar[nvoice].PFMDetune); + xml->addpar("coarsedetune",VoicePar[nvoice].PFMCoarseDetune); + xml->addpar("detunetype",VoicePar[nvoice].PFMDetuneType); + + xml->addparbool("freqenvelopeenabled",VoicePar[nvoice].PFMFreqEnvelopeEnabled); + if (VoicePar[nvoice].PFMFreqEnvelopeEnabled!=0){ + xml->beginbranch("FREQUENCY_ENVELOPE"); + VoicePar[nvoice].FMFreqEnvelope->add2XML(xml); + xml->endbranch(); + }; + + xml->beginbranch("OSCIL"); + VoicePar[nvoice].FMSmp->add2XML(xml); + xml->endbranch(); + xml->endbranch(); - xml->endbranch(); - + }; +}; + + +void ADnoteParameters::add2XML(XMLwrapper *xml){ + xml->addpar("stereo",GlobalPar.PStereo); + xml->beginbranch("AMPLITUDE_PARAMETERS"); xml->addpar("volume",GlobalPar.PVolume); xml->addpar("panning",GlobalPar.PPanning); @@ -510,14 +627,29 @@ void ADnoteParameters::add2XML(XMLwrapper *xml){ xml->addpar("punchstretch",GlobalPar.PPunchStretch); xml->addpar("punchvelocitysensing",GlobalPar.PPunchVelocitySensing); - xml->beginbranch("ENVELOPE_AMPLITUDE"); + xml->beginbranch("AMPLITUDE_ENVELOPE"); GlobalPar.AmpEnvelope->add2XML(xml); xml->endbranch(); - xml->beginbranch("LFO_AMPLITUDE"); + xml->beginbranch("AMPLITUDE_LFO"); GlobalPar.AmpLfo->add2XML(xml); xml->endbranch(); xml->endbranch(); + + xml->beginbranch("FREQUENCY_PARAMETERS"); + xml->addpar("detune",GlobalPar.PDetune); + xml->addpar("coarsedetune",GlobalPar.PCoarseDetune); + xml->addpar("detunetype",GlobalPar.PDetuneType); + + xml->beginbranch("FREQUENCY_ENVELOPE"); + GlobalPar.FreqEnvelope->add2XML(xml); + xml->endbranch(); + + xml->beginbranch("FREQUENCY_LFO"); + GlobalPar.FreqLfo->add2XML(xml); + xml->endbranch(); + xml->endbranch(); + xml->beginbranch("FILTER_PARAMETERS"); xml->beginbranch("FILTER"); @@ -527,22 +659,24 @@ void ADnoteParameters::add2XML(XMLwrapper *xml){ xml->addpar("velocitysensingamplitude",GlobalPar.PFilterVelocityScale); xml->addpar("velocitysensing",GlobalPar.PFilterVelocityScaleFunction); - xml->beginbranch("ENVELOPE_FILTER"); + xml->beginbranch("FILTER_ENVELOPE"); GlobalPar.FilterEnvelope->add2XML(xml); xml->endbranch(); - xml->beginbranch("LFO_FILTER"); + xml->beginbranch("FILTER_LFO"); GlobalPar.FilterLfo->add2XML(xml); xml->endbranch(); xml->endbranch(); - xml->beginbranch("ENVELOPE_FILTER"); - GlobalPar.Reson->add2XML(xml); + xml->beginbranch("RESONANCE"); + GlobalPar.Reson->add2XML(xml); xml->endbranch(); - //aici sa salvez pt. fiecare voce (apelez o alta functie) - - + for (int nvoice=0;nvoice<NUM_VOICES;nvoice++){ + xml->beginbranch("VOICE",nvoice); + add2XMLvoice(xml,nvoice); + xml->endbranch(); + }; }; diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h @@ -258,12 +258,16 @@ class ADnoteParameters{ ADnoteVoiceParam VoicePar[NUM_VOICES]; void add2XML(XMLwrapper *xml); + void add2XMLvoice(XMLwrapper *xml,int nvoice); void saveloadbuf(Buffer *buf); void saveloadbufvoice(Buffer *buf,unsigned char nvoice); void copypastevoice(int n,int what); private: + + + void EnableVoice(int nvoice); void KillVoice(int nvoice); FFTwrapper *fft; diff --git a/src/Params/Controller.C b/src/Params/Controller.C @@ -304,3 +304,30 @@ void Controller::saveloadbuf(Buffer *buf){ }; +void Controller::add2XML(XMLwrapper *xml){ + xml->addpar("pitchwheel_bendrange",pitchwheel.bendrange); + + xml->addpar("expression_receive",expression.receive); + xml->addpar("panning_depth",panning.depth); + xml->addpar("filtercutoff_depth",filtercutoff.depth); + xml->addpar("filterq_depth",filterq.depth); + xml->addpar("bandwidth_depth",bandwidth.depth); + xml->addpar("modwheel_depth",modwheel.depth); + xml->addpar("modwheel_exponential",modwheel.exponential); + xml->addpar("fmamp_receive",fmamp.receive); + xml->addpar("volume_receive",volume.receive); + xml->addpar("sustain_receive",sustain.receive); + + xml->addpar("portamento_receive",portamento.receive); + xml->addpar("portamento_time",portamento.time); + xml->addpar("portamento_pitchthresh",portamento.pitchthresh); + xml->addpar("portamento_pitchthreshtype",portamento.pitchthreshtype); + xml->addpar("portamento_portamento",portamento.portamento); + xml->addpar("portamento_updowntimestretch",portamento.updowntimestretch); + + xml->addpar("resonancecenter_depth",resonancecenter.depth); + xml->addpar("resonancebandwidth_depth",resonancebandwidth.depth); +}; + + + diff --git a/src/Params/Controller.h b/src/Params/Controller.h @@ -26,12 +26,17 @@ #include "../globals.h" #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" + class Controller{ public: Controller(); ~Controller(); void resetall(); void saveloadbuf(Buffer *buf); + + void add2XML(XMLwrapper *xml); + //Controllers functions void setpitchwheel(int value); void setpitchwheelbendrange(unsigned short int value); diff --git a/src/Params/SUBnoteParameters.C b/src/Params/SUBnoteParameters.C @@ -193,3 +193,75 @@ void SUBnoteParameters::saveloadbuf(Buffer *buf){ }; +void SUBnoteParameters::add2XML(XMLwrapper *xml){ + + xml->addpar("numstages",Pnumstages); + xml->addpar("magtype",Phmagtype); + xml->addpar("start",Pstart); + + for (int i=0;i<MAX_SUB_HARMONICS;i++){ + if (Phmag[i]==0) continue; + + xml->beginbranch("HARMONIC",i); + xml->addpar("mag",Phmag[i]); + xml->addpar("relbw",Phrelbw[i]); + xml->endbranch(); + }; + + xml->beginbranch("AMPLITUDE_PARAMETERS"); + xml->addparbool("stereo",Pstereo); + xml->addpar("volume",PVolume); + xml->addpar("panning",PPanning); + xml->addpar("velocitysensing",PAmpVelocityScaleFunction); + xml->beginbranch("AMPLITUDE_ENVELOPE"); + AmpEnvelope->add2XML(xml); + xml->endbranch(); + xml->endbranch(); + + xml->beginbranch("FREQUENCY_PARAMETERS"); + xml->addparbool("fixedfreq",Pfixedfreq); + xml->addpar("fixedfreqet",PfixedfreqET); + + xml->addpar("detune",PDetune); + xml->addpar("coarsedetune",PCoarseDetune); + xml->addpar("detunetype",PDetuneType); + + xml->addpar("bandwidth",Pbandwidth); + xml->addpar("bwscale",Pbwscale); + + xml->addparbool("freqenvelopeenabled",PFreqEnvelopeEnabled); + if (PFreqEnvelopeEnabled!=0){ + xml->beginbranch("FREQUENCY_ENVELOPE"); + FreqEnvelope->add2XML(xml); + xml->endbranch(); + }; + + xml->addparbool("bandwidthenvelopeenabled",PBandWidthEnvelopeEnabled); + if (PBandWidthEnvelopeEnabled!=0){ + xml->beginbranch("BANCWIDTH_ENVELOPE"); + BandWidthEnvelope->add2XML(xml); + xml->endbranch(); + }; + xml->endbranch(); + + xml->beginbranch("FREQUENCY_PARAMETERS"); + xml->addparbool("enabled",PGlobalFilterEnabled); + if (PGlobalFilterEnabled!=0){ + xml->beginbranch("FILTER"); + GlobalFilter->add2XML(xml); + xml->endbranch(); + + xml->addpar("filtervelocitysensing",PGlobalFilterVelocityScaleFunction); + xml->addpar("filtervelocitysensingamplitude",PGlobalFilterVelocityScale); + + xml->beginbranch("FILTER_ENVELOPE"); + GlobalFilterEnvelope->add2XML(xml); + xml->endbranch(); + }; + xml->endbranch(); +}; + + + + + diff --git a/src/Params/SUBnoteParameters.h b/src/Params/SUBnoteParameters.h @@ -25,6 +25,7 @@ #include "../globals.h" #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" #include "EnvelopeParams.h" #include "FilterParams.h" @@ -34,6 +35,7 @@ class SUBnoteParameters{ ~SUBnoteParameters(); void saveloadbuf(Buffer *buf); + void add2XML(XMLwrapper *xml); //Parameters //AMPLITUDE PARAMETRERS diff --git a/src/Synth/OscilGen.C b/src/Synth/OscilGen.C @@ -698,6 +698,7 @@ void OscilGen::saveloadbuf(Buffer *buf){ buf->rwbyte(&tmp);//if tmp!=0xfe error if (buf->getmode()==0){ + Pnormalizemethod=0; for (nharmonic=0;nharmonic<MAX_AD_HARMONICS;nharmonic++){ Phmag[nharmonic]=64; Phphase[nharmonic]=64; @@ -803,7 +804,35 @@ void OscilGen::saveloadbuf(Buffer *buf){ }; +void OscilGen::add2XML(XMLwrapper *xml){ + for (int n=0;n<MAX_AD_HARMONICS;n++){ + if ((Phmag[n]==64)&&(Phphase[n]==64)) continue; + xml->beginbranch("HARMONIC",n); + xml->addpar("mag",Phmag[n]); + xml->addpar("phase",Phphase[n]); + xml->endbranch(); + }; + + xml->addpar("hmagtype",Phmagtype); + xml->addpar("normalizemethod",Pnormalizemethod); + + xml->addpar("currentbasefunc",Pcurrentbasefunc); + xml->addpar("basefuncpar",Pbasefuncpar); + + xml->addpar("waveshaping",Pwaveshaping); + xml->addpar("waveshapingfunction",Pwaveshapingfunction); + xml->addpar("filtertype",Pfiltertype); + xml->addpar("filterpar",Pfilterpar); + xml->addpar("filterbeforews",Pfilterbeforews); + + xml->addpar("satype",Psatype); + xml->addpar("sapar",Psapar); + + xml->addpar("rand",Prand); + xml->addpar("amprandtype",Pamprandtype); + xml->addpar("amprandpower",Pamprandpower); +}; diff --git a/src/Synth/OscilGen.h b/src/Synth/OscilGen.h @@ -25,6 +25,7 @@ #include "../globals.h" #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" #include "Resonance.h" #include "../DSP/FFTwrapper.h" @@ -47,8 +48,11 @@ class OscilGen{ void getspectrum(int n,REALTYPE *spc,int what);//what=0 pt. oscil,1 pt. basefunc void getcurrentbasefunction(REALTYPE *smps); void useasbase();//convert oscil to base function + void saveloadbuf(Buffer *buf); + void add2XML(XMLwrapper *xml); + //Parameters @@ -81,10 +85,10 @@ class OscilGen{ unsigned char Psatype,Psapar;//spectrum adjust unsigned char Pamprandpower, Pamprandtype; + private: REALTYPE hmag[MAX_AD_HARMONICS],hphase[MAX_AD_HARMONICS];//the magnituides and the phases of the sine/nonsine harmonics - //this is public because I get it from interface and show to the user - private: +// private: FFTwrapper *fft; //computes the basefunction and make the FFT; newbasefunc<0 = same basefunc void changebasefunction(); diff --git a/src/Synth/Resonance.C b/src/Synth/Resonance.C @@ -240,7 +240,7 @@ void Resonance::add2XML(XMLwrapper *xml){ xml->addpar("gain",Pgain); xml->addparbool("protectthefundamental",Pprotectthefundamental); for (int i=0;i<N_RES_POINTS;i++){ - xml->beginbranch("POINT",i); + xml->beginbranch("RESPOINT",i); xml->addpar("val",Prespoints[i]); xml->endbranch(); }; diff --git a/src/UI/MasterUI.fl b/src/UI/MasterUI.fl @@ -371,11 +371,11 @@ class MasterUI {} { fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. Please use the host aplication to close it."); \#else if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1; -\#endif} selected +\#endif} xywh {149 197 390 465} type Double code0 {setfilelabel(NULL);} non_modal visible } { - Fl_Menu_Bar mastermenu { + Fl_Menu_Bar mastermenu {selected xywh {0 0 690 25} } { submenu {} { @@ -383,7 +383,7 @@ if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1; xywh {0 0 100 20} } { menuitem {} { - label {&Save All As XML (NOT IMPLEMENTED)...} + label {&Save All As XML (EXPERIMENTAL)...} callback {char *filename; \#define EXT ".xml" filename=fl_file_chooser("Save:","(*"EXT")",NULL,0);