commit 80d9775dc6690e5cdb346e6d760b09c093c975ed
parent 63e99124c36e30b4a97b993fcf54ed8fb65545e8
Author: paulnasca <paulnasca>
Date: Thu, 5 Feb 2004 20:37:44 +0000
*** empty log message ***
Diffstat:
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);