commit eb5f46296ac784b707e950aeca8b72c40e82200c
parent fdfff37567e94e739ee3aa2b17ec1a78b6d2c1e3
Author: paulnasca <paulnasca>
Date: Wed, 11 Feb 2004 20:09:41 +0000
*** empty log message ***
Diffstat:
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;
};