zynaddsubfx

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

commit eb5f46296ac784b707e950aeca8b72c40e82200c
parent fdfff37567e94e739ee3aa2b17ec1a78b6d2c1e3
Author: paulnasca <paulnasca>
Date:   Wed, 11 Feb 2004 20:09:41 +0000

*** empty log message ***

Diffstat:
MChangeLog | 4++--
Msrc/Makefile | 2+-
Msrc/Misc/Master.C | 10++++++++++
Msrc/Misc/Master.h | 10++++++----
Msrc/Misc/XMLwrapper.C | 133++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
Msrc/Misc/XMLwrapper.h | 45+++++++++++++++++++++++++++++++++++++++++----
6 files changed, 171 insertions(+), 33 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -530,4 +530,5 @@ 08 Feb 2004 - Modificat putin formatul XML 10 Feb 2004 - Adaugata salvarea parametrilor pt. basefunction la OscilGen - Inceput sa scriu incarcarea parametrilor - -\ No newline at end of file +11 Feb 2004 - Se pot incarca cativa parametrii de la master + diff --git a/src/Makefile b/src/Makefile @@ -51,7 +51,7 @@ subdirs=DSP Effects Input Misc Output Params Synth Seq all: $(MAKE) -C UI $@ - rm -f Make.deps + rm -f Make.deps zynaddsubfx zynaddsubfx.exe @for name in $(subdirs); do sh -c "cd $$name ; $(CXX) -MM -MG -w *.C >> ../Make.deps ; cd .."; done @for name in $(subdirs); do sh -c "make -C $$name $@"; done $(MAKE) objs diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -796,6 +796,7 @@ int Master::saveXML(char *filename){ }; + int Master::loadXML(char *filename){ XMLwrapper *xml=new XMLwrapper(); if (xml->loadXMLfile(filename)<0) { @@ -803,11 +804,20 @@ int Master::loadXML(char *filename){ return(-1); }; + getfromXML(xml); delete(xml); return(0); }; +void Master::getfromXML(XMLwrapper *xml){ + xml->enterbranch("MASTER"); + Pvolume=xml->getpar127("volume",Pvolume); + Pkeyshift=xml->getpar127("key_shift",Pkeyshift); + ctl.NRPN.receive=xml->getparbool("nrpn_receive",ctl.NRPN.receive); + + xml->exitbranch(); +}; diff --git a/src/Misc/Master.h b/src/Misc/Master.h @@ -49,18 +49,20 @@ class Master{ //returns 0 for ok, 1 if there is a existing file or -1 if there is an error int saveXML(char *filename); - //saves all settings to a XML file - //returns 0 for ok or -1 if there is an error - int loadXML(char *filename); - //this adds the parameters to the XML data void add2XML(XMLwrapper *xml); void defaults(); + //saves all settings to a XML file + //returns 0 for ok or -1 if there is an error + int loadXML(char *filename); + void getfromXML(XMLwrapper *xml); + + //Midi IN void NoteOn(unsigned char chan,unsigned char note,unsigned char velocity); void NoteOff(unsigned char chan,unsigned char note); diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C @@ -22,6 +22,8 @@ #include "XMLwrapper.h" #include <stdio.h> +#include <stdlib.h> + #include "../globals.h" int XMLwrapper_whitespace_callback(mxml_node_t *node,int where){ @@ -30,13 +32,15 @@ int XMLwrapper_whitespace_callback(mxml_node_t *node,int where){ if ((where==MXML_WS_BEFORE_OPEN)&&(!strcmp(name,"?xml"))) return(0); if ((where==MXML_WS_BEFORE_CLOSE)&&(!strcmp(name,"string"))) return(0); if ((where==MXML_WS_BEFORE_OPEN)||(where==MXML_WS_BEFORE_CLOSE)) return('\n'); - + return(0); }; XMLwrapper::XMLwrapper(){ memset(&parentstack,0,sizeof(parentstack)); + memset(&values,0,sizeof(values)); + stackpos=0; tree=mxmlNewElement(MXML_NO_PARENT,"?xml"); @@ -49,7 +53,8 @@ XMLwrapper::XMLwrapper(){ node=root=mxmlNewElement(tree,"ZynAddSubFX-data"); - mxmlElementSetAttr(root,"version","0.1"); + mxmlElementSetAttr(root,"version-major","0"); + mxmlElementSetAttr(root,"version-minor","1"); //save zynaddsubfx specifications beginbranch("BASE_PARAMETERS"); @@ -69,27 +74,8 @@ XMLwrapper::~XMLwrapper(){ if (tree!=NULL) mxmlDelete(tree); }; -int XMLwrapper::loadXMLfile(char *filename){ - if (tree!=NULL) mxmlDelete(tree); - tree=NULL; - - FILE *file=fopen(filename,"r"); - if (file==NULL) return(-1); - - root=tree=mxmlLoadFile(NULL,file,MXML_NO_CALLBACK); - fclose(file); - - if (tree==NULL) return(-1);//this is not XML - -// if (strcmp(tree->value.element.name,"?xml")!=0) return(-2); - node=root=mxmlFindElement(tree,tree,"ZynAddSuFX-data",NULL,NULL,MXML_DESCEND); - if (root==NULL) return(-2);//the XML doesnt embbed zynaddsubfx data - -// printf("%s\n",root->value.element.name); - - return(0); -}; +/* SAVE XML members */ int XMLwrapper::saveXMLfile(char *filename,int compression){ FILE *file; @@ -144,6 +130,94 @@ void XMLwrapper::endbranch(){ +/* LOAD XML members */ + +int XMLwrapper::loadXMLfile(char *filename){ + if (tree!=NULL) mxmlDelete(tree); + tree=NULL; + + FILE *file=fopen(filename,"r"); + if (file==NULL) return(-1); + + root=tree=mxmlLoadFile(NULL,file,MXML_NO_CALLBACK); + fclose(file); + + if (tree==NULL) return(-1);//this is not XML + +// if (strcmp(tree->value.element.name,"?xml")!=0) return(-2); + node=root=mxmlFindElement(tree,tree,"ZynAddSubFX-data",NULL,NULL,MXML_DESCEND); + if (root==NULL) return(-2);//the XML doesnt embbed zynaddsubfx data + + push(root); + + values.xml_version.major=str2int(mxmlElementGetAttr(root,"version-major")); + values.xml_version.minor=str2int(mxmlElementGetAttr(root,"version-minor")); + + +// node=mxmlFindElement(node,node,NULL,"name","volume",MXML_DESCEND); + + + +// if (node!=NULL) printf("%s\n",node->value.element.name); +// else printf("NULL node\n"); + + return(0); +}; + +int XMLwrapper::enterbranch(char *name){ + node=mxmlFindElement(peek(),peek(),name,NULL,NULL,MXML_DESCEND_FIRST); + if (node==NULL) return(0); + push(node); + + return(1); +}; + +void XMLwrapper::exitbranch(){ + pop(); +}; + + +int XMLwrapper::getbranchid(int min, int max){ + int id=str2int(mxmlElementGetAttr(node,"id")); + if ((min==0)&&(max==0)) return(id); + + if (id<min) id=min; + else if (id>max) id=max; + + return(id); +}; + +int XMLwrapper::getpar(char *name,int defaultpar,int min,int max){ + node=mxmlFindElement(peek(),peek(),"par","name",name,MXML_DESCEND_FIRST); + if (node==NULL) return(defaultpar); + + const char *strval=mxmlElementGetAttr(node,"value"); + if (strval==NULL) return(defaultpar); + + int val=str2int(strval); + if (val<min) val=min; + else if (val>max) val=max; + + return(val); +}; + +int XMLwrapper::getpar127(char *name,int defaultpar){ + return(getpar(name,defaultpar,0,127)); +}; + +int XMLwrapper::getparbool(char *name,int defaultpar){ + node=mxmlFindElement(peek(),peek(),"par_bool","name",name,MXML_DESCEND_FIRST); + if (node==NULL) return(defaultpar); + + const char *strval=mxmlElementGetAttr(node,"value"); + if (strval==NULL) return(defaultpar); + + if ((strval[0]=='Y')||(strval[0]=='y')) return(1); + else return(0); +}; + + + /** Private members **/ char *XMLwrapper::int2str(int x){ @@ -156,6 +230,13 @@ char *XMLwrapper::real2str(REALTYPE x){ return(tmpstr); }; +int XMLwrapper::str2int(const char *str){ + if (str==NULL) return(0); + int result=strtol(str,NULL,10); + return(result); +}; + + mxml_node_t *XMLwrapper::addparams0(char *name){ mxml_node_t *element=mxmlNewElement(node,name); return(element); @@ -197,5 +278,13 @@ mxml_node_t *XMLwrapper::pop(){ return(node); }; +mxml_node_t *XMLwrapper::peek(){ + if (stackpos<=0) { + printf("BUG!: XMLwrapper::peek() - empty parentstack\n"); + return (root); + }; + return(parentstack[stackpos]); +}; + diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -38,12 +38,13 @@ class XMLwrapper{ XMLwrapper(); ~XMLwrapper(); + /********************************/ + /* SAVE to XML */ + /********************************/ + //returns 0 if ok or -1 if the file cannot be saved int saveXMLfile(char *filename, int compression); - //returns 0 if ok or -1 if the file cannot be loaded - int loadXMLfile(char *filename); - //add simple parameter (name and value) void addpar(char *name,int val); void addparreal(char *name,REALTYPE val); @@ -61,9 +62,36 @@ class XMLwrapper{ //this must be called after each branch (nodes that contains child nodes) void endbranch(); + + /********************************/ + /* LOAD from XML */ + /********************************/ + //returns 0 if ok or -1 if the file cannot be loaded + int loadXMLfile(char *filename); + + //enter into the branch + //returns 1 if is ok, or 0 otherwise + int enterbranch(char *name); + + //exits from a branch + void exitbranch(); + //get the the branch_id and limits it between the min and max + //if min==max==0, it will not limit it + //if there isn't any id, will return min + //this must be called only imediately after enterbranch() + int getbranchid(int min, int max); + + //it returns the parameter and limits it between min and max + //if min==max==0, it will not limit it + //if no parameter will be here, the defaultpar will be returned + int getpar(char *name,int defaultpar,int min,int max); + + //the same as getpar, but the limits are 0 and 127 + int getpar127(char *name,int defaultpar); + int getparbool(char *name,int defaultpar); private: mxml_node_t *tree;//all xml data mxml_node_t *root;//xml data used by zynaddsubfx @@ -87,6 +115,8 @@ class XMLwrapper{ char *int2str(int x); char *real2str(REALTYPE x); + int str2int(const char *str); + char tmpstr[TMPSTR_SIZE]; @@ -96,7 +126,14 @@ class XMLwrapper{ void push(mxml_node_t *node); mxml_node_t *pop(); - + mxml_node_t *peek(); + + //theese are used to store the values + struct{ + struct { + int major,minor; + }xml_version; + }values; };