zynaddsubfx

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

commit 36f2b1f238748b3113576d543f708f0e3dfcba6e
parent 99420bfa7fc96b2d3217e91311680204ef41b4d3
Author: paulnasca <paulnasca>
Date:   Mon, 23 Aug 2004 19:14:20 +0000

*** empty log message ***

Diffstat:
MChangeLog | 1+
Msrc/Misc/Bank.C | 15+++++++++++++++
Msrc/Misc/Bank.h | 4++++
Msrc/Misc/XMLwrapper.C | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Msrc/Misc/XMLwrapper.h | 10++++++++++
Msrc/Params/PADnoteParameters.C | 2++
Msrc/UI/BankUI.fl | 17+++++++++++------
7 files changed, 108 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -700,5 +700,6 @@ 22 Aug 2004 - Corectata o eroare de compilare - Makefile-ul modificat, a.i. make-ul sa se opreasca in caz de eroare - Terminat managerul de preset-uri +23 Aug 2004 - Adaugata posibilitatea de a se vedea direct din lista cu bancile de instrumente \ No newline at end of file diff --git a/src/Misc/Bank.C b/src/Misc/Bank.C @@ -40,12 +40,15 @@ #define FORCE_BANK_DIR_FILE ".bankdir" Bank::Bank(){ + + ZERO(defaultinsname,PART_MAX_NAME_LEN); snprintf(defaultinsname,PART_MAX_NAME_LEN,"%s"," "); for (int i=0;i<BANK_SIZE;i++){ ins[i].used=false; ins[i].filename=NULL; + ins[i].info.PADsynth_used=false; }; dirname=NULL; clearbank(); @@ -467,10 +470,22 @@ int Bank::addtobank(int pos, const char *filename, const char* name){ int len=strlen(filename)+1+strlen(dirname); ins[pos].filename=new char[len+1]; snprintf(ins[pos].filename,len+1,"%s/%s",dirname,filename); + + //see if PADsynth is used + XMLwrapper *xml=new XMLwrapper(); + xml->checkfileinformation(ins[pos].filename); + + ins[pos].info.PADsynth_used=xml->information.PADsynth_used; + delete(xml); return(0); }; +bool Bank::isPADsynth_used(unsigned int ninstrument){ + return(ins[ninstrument].info.PADsynth_used); +}; + + void Bank::deletefrombank(int pos){ if ((pos<0)||(pos>=BANK_SIZE)) return; ins[pos].used=false; diff --git a/src/Misc/Bank.h b/src/Misc/Bank.h @@ -43,6 +43,7 @@ class Bank{ char *getname(unsigned int ninstrument); char *getnamenumbered(unsigned int ninstrument); void setname(unsigned int ninstrument,const char *newname,int newslot);//if newslot==-1 then this is ignored, else it will be put on that slot + bool isPADsynth_used(unsigned int ninstrument); //returns 0 if the slot is not empty or 1 if the slot is empty int emptyslot(unsigned int ninstrument); @@ -86,6 +87,9 @@ class Bank{ bool used; char name[PART_MAX_NAME_LEN+1]; char *filename; + struct{ + bool PADsynth_used; + } info; }ins[BANK_SIZE]; char *dirname; diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C @@ -70,6 +70,8 @@ XMLwrapper::XMLwrapper(){ minimal=true; stackpos=0; + + information.PADsynth_used=false; tree=mxmlNewElement(MXML_NO_PARENT,"?xml"); mxmlElementSetAttr(tree,"version","1.0"); @@ -80,9 +82,12 @@ XMLwrapper::XMLwrapper(){ mxmlElementSetAttr(doctype,"ZynAddSubFX-data",NULL); node=root=mxmlNewElement(tree,"ZynAddSubFX-data"); - + mxmlElementSetAttr(root,"version-major","1"); mxmlElementSetAttr(root,"version-minor","0"); + + //make the empty branch that will contain the information parameters + info=addparams0("INFORMATION"); //save zynaddsubfx specifications beginbranch("BASE_PARAMETERS"); @@ -95,20 +100,66 @@ XMLwrapper::XMLwrapper(){ addpar("max_addsynth_voices",NUM_VOICES); endbranch(); - + }; XMLwrapper::~XMLwrapper(){ if (tree!=NULL) mxmlDelete(tree); }; +bool XMLwrapper::checkfileinformation(char *filename){ + stackpos=0; + information.PADsynth_used=false; + + if (tree!=NULL) mxmlDelete(tree);tree=NULL; + char *xmldata=doloadfile(filename); + if (xmldata==NULL) return(-1);//the file could not be loaded or uncompressed + + + char *start=strstr(xmldata,"<INFORMATION>"); + char *end=strstr(xmldata,"</INFORMATION>"); + + if ((start==NULL)||(end==NULL)||(start>end)) { + delete(xmldata); + return(false); + }; + end+=strlen("</INFORMATION>"); + end[0]='\0'; + + tree=mxmlNewElement(MXML_NO_PARENT,"?xml"); + node=root=mxmlLoadString(tree,xmldata,MXML_OPAQUE_CALLBACK); + if (root==NULL) { + delete(xmldata); + mxmlDelete(tree); + tree=NULL; + return(false); + }; + + root=mxmlFindElement(tree,tree,"INFORMATION",NULL,NULL,MXML_DESCEND); + push(root); + + if (root==NULL){ + delete(xmldata); + mxmlDelete(tree); + tree=NULL; + return(false); + }; + + information.PADsynth_used=getparbool("PADsynth_used",false); + + exitbranch(); + if (tree!=NULL) mxmlDelete(tree); + delete(xmldata); + tree=NULL; + + return(true); +}; + /* SAVE XML members */ int XMLwrapper::saveXMLfile(char *filename){ - xml_k=0; - ZERO(tabs,STACKSIZE+2); - char *xmldata=mxmlSaveAllocString(tree,XMLwrapper_whitespace_callback); + char *xmldata=getXMLdata(); if (xmldata==NULL) return(-2); int compression=config.cfg.GzipCompression; @@ -127,10 +178,17 @@ int XMLwrapper::saveXMLfile(char *filename){ char *XMLwrapper::getXMLdata(){ xml_k=0; ZERO(tabs,STACKSIZE+2); - char *xmldata=mxmlSaveAllocString(tree,XMLwrapper_whitespace_callback); + mxml_node_t *oldnode=node; + + node=info; + //Info storing + addparbool("PADsynth_used",information.PADsynth_used); + + node=oldnode; + char *xmldata=mxmlSaveAllocString(tree,XMLwrapper_whitespace_callback); + return(xmldata); - }; @@ -206,7 +264,6 @@ int XMLwrapper::loadXMLfile(const char *filename){ stackpos=0; - char *xmldata=doloadfile(filename); if (xmldata==NULL) return(-1);//the file could not be loaded or uncompressed diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -109,6 +109,15 @@ class XMLwrapper{ REALTYPE getparreal(char *name,REALTYPE defaultpar,REALTYPE min,REALTYPE max); bool minimal;//false if all parameters will be stored (used only for clipboard) + + struct { + bool PADsynth_used; + }information; + + //opens a file and parse only the "information" data on it + //returns "true" if all went ok or "false" on errors + bool checkfileinformation(char *filename); + private: int dosavefile(char *filename,int compression,char *xmldata); @@ -118,6 +127,7 @@ class XMLwrapper{ mxml_node_t *tree;//all xml data mxml_node_t *root;//xml data used by zynaddsubfx mxml_node_t *node;//current node + mxml_node_t *info;//this node is used to store the information about the data //adds params like this: // <name> diff --git a/src/Params/PADnoteParameters.C b/src/Params/PADnoteParameters.C @@ -525,6 +525,8 @@ void PADnoteParameters::applyparameters(bool lockmutex){ void PADnoteParameters::add2XML(XMLwrapper *xml){ + xml->information.PADsynth_used=true; + xml->addparbool("stereo",PStereo); xml->addpar("mode",Pmode); xml->addpar("bandwidth",Pbandwidth); diff --git a/src/UI/BankUI.fl b/src/UI/BankUI.fl @@ -66,17 +66,23 @@ bank=bank_; nselected=nselected_; box(FL_THIN_UP_BOX); align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); + highlight=0; refresh();} {} } Function {refresh()} {} { - code {if (bank->emptyslot(nslot)) color(46); - else color(51); + code {if (bank->emptyslot(nslot)) { + color(46); +} else { + if (bank->isPADsynth_used(nslot)) color(26); + else color(51); +}; if (*nselected==nslot) color(6); -label(bank->getnamenumbered(nslot));} {} +label(bank->getnamenumbered(nslot));} {selected + } } decl {int *what,*whatslot,nslot,highlight, *nselected;} {} decl {void (BankProcess_:: *fnc)(void);} {} @@ -206,7 +212,7 @@ refreshmainwindow();} open label {Refresh bank list} callback {rescan_for_banks(); banklist->value(0);} - tooltip {Refresh the bank list (rescan)} xywh {230 8 105 20} box THIN_UP_BOX labelsize 12 + tooltip {Refresh the bank list (rescan)} xywh {230 8 105 20} box THIN_UP_BOX color 50 labelsize 12 } } } @@ -300,8 +306,7 @@ if (mode==4){//swap bs[slot]->refresh(); }; }; -if (mode!=4) refreshmainwindow();} {selected - } +if (mode!=4) refreshmainwindow();} {} } Function {refreshmainwindow()} {} { code {bankuiwindow->label(bank->bankfiletitle);