zynaddsubfx

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

commit 95ee486b64fef423a81037bf49de9f10fca08677
parent 6276491ccc665f4aa2f53e04f939b6e75d6191bf
Author: paulnasca <paulnasca>
Date:   Sat, 14 Feb 2004 21:44:43 +0000

*** empty log message ***

Diffstat:
MChangeLog | 2+-
MREADME.txt | 1+
Msrc/Makefile | 2+-
Msrc/Misc/Config.C | 12++++++++++++
Msrc/Misc/Config.h | 1+
Msrc/Misc/Master.C | 2+-
Msrc/Misc/Part.C | 2+-
Msrc/Misc/XMLwrapper.C | 121++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/Misc/XMLwrapper.h | 9+++++++--
Msrc/UI/ConfigUI.fl | 27+++++++++++++++++----------
Msrc/UI/MasterUI.fl | 22+++++++++++-----------
11 files changed, 145 insertions(+), 56 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -538,4 +538,4 @@ - Corectate cateva erori la incarcarea XML-ului - frecventa LFO-ul de la instrumente are valoare reala intre 0..1 - corectata eroarea care facea ca functia de rezonanta sa fie trasata incorect - + - adaugata compresie gzip la fisiere si decompresie automata la incarcare (folosesc biblioteca zlib) diff --git a/README.txt b/README.txt @@ -32,6 +32,7 @@ Requirements: - FFTW 2.x.x (tested with fftw 2.0.5, 2.1.3) - necesary for Fast Fourier computations - MXML library from http://www.easysw.com/~mike/mxml/ + - zlib library from http://www.zlib.org - this exists in most linux distributions - (for Linux) OpenSoundSystem (OSS) (if you don't have ALSA, only) - (for Windows) pthreads, portaudio diff --git a/src/Makefile b/src/Makefile @@ -9,7 +9,7 @@ endif CXXFLAGS += -DOS_$(OS_PORT) -D$(MIDIIN)MIDIIN -D$(AUDIOOUT)AUDIOOUT -DFFTW_VERSION_$(FFTW_VERSION) -DASM_F2I_$(ASM_F2I) `fltk-config --cflags` export CXXFLAGS -LIBS= -lm `fltk-config --ldflags` -lmxml +LIBS= -lm `fltk-config --ldflags` -lmxml -lz ifeq ($(FFTW_VERSION),2) LIBS += -lrfftw -lfftw diff --git a/src/Misc/Config.C b/src/Misc/Config.C @@ -55,6 +55,8 @@ Config::Config(){ cfg.DumpNotesToFile=0; cfg.DumpAppend=1; + cfg.GzipCompression=3; + winwavemax=1;winmidimax=1; //try to find out how many input midi devices are there #ifdef WINMIDIIN @@ -81,6 +83,7 @@ Config::Config(){ readConfig(filename); ui.showinstrumentinfo=0; + }; Config::~Config(){ @@ -166,6 +169,10 @@ void Config::readConfig(char *filename){ if (strlen(val)<2) continue; snprintf(cfg.DumpFile,MAX_STRING_SIZE,val); }; + + if (strstr(par,"GZIP_COMPRESSION")!=NULL){ + cfg.GzipCompression=intvalue; + }; }; fclose(file); @@ -181,6 +188,9 @@ void Config::readConfig(char *filename){ if (cfg.WindowsWaveOutId>=winwavemax) cfg.WindowsWaveOutId=0; if (cfg.WindowsMidiInId>=winmidimax) cfg.WindowsMidiInId=0; #endif + if (cfg.GzipCompression<0) cfg.GzipCompression=0; + else if (cfg.GzipCompression>9) cfg.GzipCompression=9; + }; void Config::saveConfig(char *filename){ @@ -198,6 +208,8 @@ void Config::saveConfig(char *filename){ fprintf(file,"DUMP_APPEND = %d\n",cfg.DumpAppend); fprintf(file,"DUMP_FILE = %s\n",cfg.DumpFile); + fprintf(file,"GZIP_COMPRESSION = %d\n",cfg.GzipCompression); + fprintf(file,"#Linux\n"); fprintf(file,"LINUX_OSS_WAVE_OUT_DEV = %s\n",cfg.LinuxOSSWaveOutDev); fprintf(file,"LINUX_OSS_SEQ_IN_DEV = %s\n",cfg.LinuxOSSSeqInDev); diff --git a/src/Misc/Config.h b/src/Misc/Config.h @@ -34,6 +34,7 @@ class Config{ int WindowsWaveOutId,WindowsMidiInId; int BankUIAutoClose; int DumpNotesToFile,DumpAppend; + int GzipCompression; char *DumpFile; } cfg; int winwavemax,winmidimax;//number of wave/midi devices on Windows diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -790,7 +790,7 @@ int Master::saveXML(char *filename){ add2XML(xml); xml->endbranch(); - xml->saveXMLfile(filename,0); + xml->saveXMLfile(filename); delete (xml); return(0); }; diff --git a/src/Misc/Part.C b/src/Misc/Part.C @@ -1026,7 +1026,7 @@ int Part::saveXML(char *filename){ add2XMLinstrument(xml); xml->endbranch(); - xml->saveXMLfile(filename,0); + xml->saveXMLfile(filename); delete (xml); return(0); }; diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C @@ -23,8 +23,10 @@ #include "XMLwrapper.h" #include <stdio.h> #include <stdlib.h> +#include <zlib.h> #include "../globals.h" +#include "Util.h" int XMLwrapper_whitespace_callback(mxml_node_t *node,int where){ const char *name=node->value.element.name; @@ -77,23 +79,49 @@ XMLwrapper::~XMLwrapper(){ /* SAVE XML members */ -int XMLwrapper::saveXMLfile(char *filename,int compression){ - FILE *file; - file=fopen(filename,"w"); - if (file==NULL) return(-1); - mxmlSaveFile(tree,file,XMLwrapper_whitespace_callback); +int XMLwrapper::saveXMLfile(char *filename){ + char *xmldata=mxmlSaveAllocString(tree,XMLwrapper_whitespace_callback); + if (xmldata==NULL) return(-2); + + int compression=config.cfg.GzipCompression; + + int fnsize=strlen(filename)+100; + char *filenamenew=new char [fnsize]; + if (compression) snprintf(filenamenew,fnsize,"%sz",filename); + else snprintf(filenamenew,fnsize,"%s",filename); + + int result=dosavefile(filenamenew,compression,xmldata); - fclose(file); + delete(filenamenew); + delete(xmldata); + return(result); +}; + +int XMLwrapper::dosavefile(char *filename,int compression,char *xmldata){ + if (compression==0){ + FILE *file; + file=fopen(filename,"w"); + if (file==NULL) return(-1); + fputs(xmldata,file); + fclose(file); + } else { + if (compression>9) compression=9; + if (compression<1) compression=1; + char options[10]; + snprintf(options,10,"wb%d",compression); + + gzFile gzfile; + gzfile=gzopen(filename,options); + if (gzfile==NULL) return(-1); + gzputs(gzfile,xmldata); + gzclose(gzfile); + }; -/* //test - printf("\n\n"); - mxmlSaveFile(tree,stdout,XMLwrapper_whitespace_callback); - printf("\n\n"); -*/ return(0); }; + void XMLwrapper::addpar(char *name,int val){ addparams2("par","name",name,"value",int2str(val)); }; @@ -141,35 +169,70 @@ 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 - FILE *file=fopen(filename,"r"); - if (file==NULL) return(-1); - - root=tree=mxmlLoadFile(NULL,file,MXML_OPAQUE_CALLBACK); - fclose(file); - - if (tree==NULL) return(-1);//this is not XML + root=tree=mxmlLoadString(NULL,xmldata,MXML_OPAQUE_CALLBACK); + + delete(xmldata); + + if (tree==NULL) return(-2);//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 - + if (root==NULL) return(-3);//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); }; +char *XMLwrapper::doloadfile(const char *filename){ + char *xmldata=NULL; + int filesize=-1; + + //try get filesize as gzip data (first) + gzFile gzfile=gzopen(filename,"rb"); + if (gzfile!=NULL){//this is a gzip file + // first check it's size + while(!gzeof(gzfile)) { + gzseek (gzfile,1024*1024,SEEK_CUR); + if (gztell(gzfile)>10000000) goto notgzip;//the file is not gzip + }; + filesize=gztell(gzfile); + + //rewind the file and load the data + xmldata=new char[filesize+1]; + memset(xmldata,0,filesize+1); + + gzrewind(gzfile); + gzread(gzfile,xmldata,filesize); + + gzclose(gzfile); + return (xmldata); + } else {//this is not a gzip file + notgzip: + FILE *file=fopen(filename,"rb"); + if (file==NULL) return(NULL); + fseek(file,0,SEEK_END); + filesize=ftell(file); + + xmldata=new char [filesize+1]; + memset(xmldata,0,filesize+1); + + rewind(file); + fread(xmldata,filesize,1,file); + + fclose(file); + return(xmldata); + }; +}; + + + + int XMLwrapper::enterbranch(char *name){ node=mxmlFindElement(peek(),peek(),name,NULL,NULL,MXML_DESCEND_FIRST); if (node==NULL) return(0); diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -43,8 +43,8 @@ class XMLwrapper{ /********************************/ //returns 0 if ok or -1 if the file cannot be saved - int saveXMLfile(char *filename, int compression); - + int saveXMLfile(char *filename); + //add simple parameter (name and value) void addpar(char *name,int val); void addparreal(char *name,REALTYPE val); @@ -104,6 +104,11 @@ class XMLwrapper{ private: + + int dosavefile(char *filename,int compression,char *xmldata); + char *doloadfile(const char *filename); + + mxml_node_t *tree;//all xml data mxml_node_t *root;//xml data used by zynaddsubfx mxml_node_t *node;//current node diff --git a/src/UI/ConfigUI.fl b/src/UI/ConfigUI.fl @@ -1,5 +1,5 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0104 +version 1.0200 header_name {.h} code_name {.cc} decl {//Copyright (c) 2002-2003 Nasca Octavian Paul} {} @@ -12,7 +12,7 @@ decl {\#include <stdio.h>} {public decl {\#include <math.h>} {public } -decl {\#include <stdlib.h>} {selected public +decl {\#include <stdlib.h>} {public } decl {\#include "../globals.h"} {public @@ -27,16 +27,17 @@ decl {\#include "../Misc/Dump.h"} {public decl {extern Dump dump;} {public } -class ConfigUI {} { +class ConfigUI {selected +} { Function {make_window()} {} { Fl_Window configwindow { label {ZynAddSubFX Settings} - xywh {41 80 500 290} hide + xywh {120 213 500 290} type Double hide } { Fl_Button {} { label OK callback {configwindow->hide();} - xywh {70 255 100 20} box THIN_UP_BOX + xywh {70 265 100 20} box THIN_UP_BOX } Fl_Group {} { label {Sample Rate} @@ -145,12 +146,12 @@ config.cfg.SoundBufferSize=strtoul(o->value(),&tmp,10);} } } Fl_Box {} { - label {The settings has effect only after ZynAddSubFX is restarted.} - xywh {10 210 235 30} labelfont 1 labelsize 12 align 128 + label {Most settings has effect only after ZynAddSubFX is restarted.} + xywh {10 225 235 30} labelfont 1 labelsize 12 align 128 } Fl_Box {} { label {Read the Readme.txt for other settings} - xywh {5 190 240 20} labelfont 1 labelsize 12 align 128 + xywh {5 205 240 20} labelfont 1 labelsize 12 align 128 } Fl_Group {} { xywh {5 95 230 85} box ENGRAVED_BOX @@ -170,11 +171,11 @@ dump.startnow();//this has effect only if this option was disabled} } } Fl_Group {} { - xywh {250 15 245 275} box ENGRAVED_FRAME + xywh {250 30 245 260} box ENGRAVED_FRAME } { Fl_Box {} { label {Note: Not all the following settings are used (this depends on the operating system, etc..)} - xywh {255 25 235 45} labelfont 1 labelsize 12 align 128 + xywh {255 35 235 45} labelfont 1 labelsize 12 align 128 } Fl_Group {} { label Linux @@ -218,6 +219,12 @@ midiinputnamebox->label(config.winmididevices[config.cfg.WindowsMidiInId].name); xywh {150 100 80 20} down_box DOWN_BOX code0 {o->value(config.cfg.DumpAppend);} } + Fl_Counter {} { + label {XML compression level} + callback {config.cfg.GzipCompression=(int) o->value();} + tooltip {gzip compression level (0 - uncompressed)} xywh {10 185 65 15} type Simple labelsize 12 align 8 minimum 0 maximum 9 step 1 + code0 {o->value(config.cfg.GzipCompression);} + } } } Function {ConfigUI()} {} { diff --git a/src/UI/MasterUI.fl b/src/UI/MasterUI.fl @@ -372,7 +372,7 @@ fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. P \#else if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1; \#endif} - xywh {151 174 390 465} type Double + xywh {448 226 390 465} type Double code0 {setfilelabel(NULL);} non_modal visible } { Fl_Menu_Bar mastermenu { @@ -385,11 +385,11 @@ if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1; menuitem {} { label {&Save All As XML (EXPERIMENTAL)...} callback {char *filename; -\#define EXT ".xml" -filename=fl_file_chooser("Save:","(*"EXT")",NULL,0); + +filename=fl_file_chooser("Save:","({*.xml,*.xmlz})",NULL,0); if (filename==NULL) return; -filename=fl_filename_setext(filename,EXT); -\#undef EXT +filename=fl_filename_setext(filename,".xml"); + pthread_mutex_lock(&master->mutex); master->saveXML(filename); @@ -401,7 +401,7 @@ updatepanel();} menuitem {} { label {&Open XML...} callback {char *filename; -filename=fl_file_chooser("Open:","(*.xml)",NULL,0); +filename=fl_file_chooser("Open:","({*.xml,*.xmlz})",NULL,0); if (filename==NULL) return; @@ -582,11 +582,11 @@ if (result!=0) fl_alert("Error: Could not save the file.");} menuitem {} { label {&Save As XML (EXPERIMENTAL)...} callback {char *filename; -\#define EXT ".xml" -filename=fl_file_chooser("Save:","(*"EXT")",NULL,0); + +filename=fl_file_chooser("Save:","({*.xml,*.xmlz})",NULL,0); if (filename==NULL) return; -filename=fl_filename_setext(filename,EXT); -\#undef EXT +filename=fl_filename_setext(filename,"xml"); + pthread_mutex_lock(&master->mutex); master->part[npart]->saveXML(filename); @@ -598,7 +598,7 @@ updatepanel();} menuitem {} { label {&Load XML Instrument...} callback {const char *filename; -filename=fl_file_chooser("Load:","(*.xml)",NULL,0); +filename=fl_file_chooser("Load:","({*.xml,*.xmlz})",NULL,0); if (filename==NULL) return;