zynaddsubfx

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

commit 63e99124c36e30b4a97b993fcf54ed8fb65545e8
parent 98ff5fc968a87eb46e2e15b00ee01ac1446974c5
Author: paulnasca <paulnasca>
Date:   Wed,  4 Feb 2004 20:24:37 +0000

*** empty log message ***

Diffstat:
MChangeLog | 1+
Msrc/Misc/Master.C | 2+-
Msrc/Misc/Part.C | 39++++++++++++++++++++++++++++++++++++++-
Msrc/Misc/Part.h | 4++--
Msrc/Misc/XMLwrapper.C | 4++--
Msrc/Misc/XMLwrapper.h | 2+-
Msrc/Params/ADnoteParameters.C | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Params/ADnoteParameters.h | 3+++
Msrc/Params/EnvelopeParams.C | 32+++++++++++++++++++++++++++++---
Msrc/Params/EnvelopeParams.h | 11++++++++---
Msrc/Params/FilterParams.C | 44++++++++++++++++++++++++++++++++++++++++++++
Msrc/Params/FilterParams.h | 6+++++-
Msrc/Params/LFOParams.C | 12++++++++++++
Msrc/Params/LFOParams.h | 8++++++--
Msrc/Synth/Envelope.C | 2+-
Msrc/Synth/Resonance.C | 20++++++++++++++++++++
Msrc/Synth/Resonance.h | 7+++++++
Msrc/UI/EnvelopeUI.fl | 20++++++++++----------
18 files changed, 254 insertions(+), 27 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -521,4 +521,5 @@ 02 Feb 2003 - 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) diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -701,7 +701,7 @@ void Master::add2XML(XMLwrapper *xml){ //Save all parts for (int npart=0;npart<NUM_MIDI_PARTS;npart++){ - xml->beginbranch("PART","npart",npart); + xml->beginbranch("PART",npart); part[npart]->add2XML(xml); xml->endbranch(); }; diff --git a/src/Misc/Part.C b/src/Misc/Part.C @@ -917,10 +917,47 @@ void Part::saveloadbuf(Buffer *buf,int instrumentonly){ */ void Part::add2XMLinstrument(XMLwrapper *xml){ - xml->addparstr("name",(char *)Pname); + xml->beginbranch("INSTRUMENTINFO"); + xml->addparstr("name",(char *)Pname); + xml->addparstr("author",(char *)info.Pauthor); + xml->addparstr("comments",(char *)info.Pcomments); + xml->addpar("type",info.Ptype); + xml->endbranch(); + xml->addpar("kitmode",Pkitmode); xml->addparbool("drummode",Pdrummode); + for (int i=0;i<NUM_KIT_ITEMS;i++){ + xml->beginbranch("INSTRUMENTKIT",i); + xml->addparbool("enabled",kit[i].Penabled); + if (kit[i].Penabled!=0) { + xml->addparstr("name",(char *)kit[i].Pname); + + xml->addpar("muted",kit[i].Pmuted); + xml->addpar("minkey",kit[i].Pminkey); + xml->addpar("maxkey",kit[i].Pmaxkey); + + 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(); + }; + + if ((kit[i].Psubenabled!=0)&&(kit[i].subpars!=NULL)){ + xml->beginbranch("SUBNOTEPARAMETERS"); + //kit[i].subpars->add2XML(xml); + xml->endbranch(); + }; + + }; + xml->endbranch(); + }; + }; diff --git a/src/Misc/Part.h b/src/Misc/Part.h @@ -86,7 +86,6 @@ class Part{ unsigned char Pvolume;//part volume unsigned char Pminkey;//the minimum key that the part receives noteon messages unsigned char Pmaxkey;//the maximum key that the part receives noteon messages - unsigned char *Pname; //name of the instrument void setPvolume(char Pvolume); unsigned char Pkeyshift;//Part keyshift unsigned char Prcvchn;//from what midi channel it receive commnads @@ -103,7 +102,8 @@ class Part{ unsigned char Ppolymode;//Part mode - 0=monophonic , 1=polyphonic unsigned char Pkeylimit;//how many keys are alowed to be played same time (0=off), the older will be relased - struct{ + unsigned char *Pname; //name of the instrument + struct{//instrument additional information unsigned char Ptype; unsigned char Pauthor[MAX_INFO_TEXT_SIZE+1]; unsigned char Pcomments[MAX_INFO_TEXT_SIZE+1]; diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C @@ -94,9 +94,9 @@ void XMLwrapper::beginbranch(char *name){ node=addparams0(name); }; -void XMLwrapper::beginbranch(char *name,char *par,int val){ +void XMLwrapper::beginbranch(char *name,int id){ push(node); - node=addparams1(name,par,int2str(val)); + node=addparams1(name,"id",int2str(id)); }; void XMLwrapper::endbranch(){ diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h @@ -50,7 +50,7 @@ class XMLwrapper{ //add a branch void beginbranch(char *name); - void beginbranch(char *name, char *par, int val); + void beginbranch(char *name, int id); //this must be called after each branch (nodes that contains child nodes) void endbranch(); diff --git a/src/Params/ADnoteParameters.C b/src/Params/ADnoteParameters.C @@ -484,3 +484,67 @@ void ADnoteParameters::saveloadbuf(Buffer *buf){ + +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->endbranch(); + + xml->beginbranch("LFO_FREQENCY"); + GlobalPar.FreqLfo->add2XML(xml); + xml->endbranch(); + xml->endbranch(); + + xml->beginbranch("AMPLITUDE_PARAMETERS"); + xml->addpar("volume",GlobalPar.PVolume); + xml->addpar("panning",GlobalPar.PPanning); + xml->addpar("velocitysensing",GlobalPar.PAmpVelocityScaleFunction); + xml->addpar("punchstrength",GlobalPar.PPunchStrength); + xml->addpar("punchtime",GlobalPar.PPunchTime); + xml->addpar("punchstretch",GlobalPar.PPunchStretch); + xml->addpar("punchvelocitysensing",GlobalPar.PPunchVelocitySensing); + + xml->beginbranch("ENVELOPE_AMPLITUDE"); + GlobalPar.AmpEnvelope->add2XML(xml); + xml->endbranch(); + + xml->beginbranch("LFO_AMPLITUDE"); + GlobalPar.AmpLfo->add2XML(xml); + xml->endbranch(); + xml->endbranch(); + + xml->beginbranch("FILTER_PARAMETERS"); + xml->beginbranch("FILTER"); + GlobalPar.GlobalFilter->add2XML(xml); + xml->endbranch(); + + xml->addpar("velocitysensingamplitude",GlobalPar.PFilterVelocityScale); + xml->addpar("velocitysensing",GlobalPar.PFilterVelocityScaleFunction); + + xml->beginbranch("ENVELOPE_FILTER"); + GlobalPar.FilterEnvelope->add2XML(xml); + xml->endbranch(); + + xml->beginbranch("LFO_FILTER"); + GlobalPar.FilterLfo->add2XML(xml); + xml->endbranch(); + xml->endbranch(); + + xml->beginbranch("ENVELOPE_FILTER"); + GlobalPar.Reson->add2XML(xml); + xml->endbranch(); + + //aici sa salvez pt. fiecare voce (apelez o alta functie) + + +}; + + + + diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h @@ -31,6 +31,7 @@ #include "../Synth/OscilGen.h" #include "../Synth/Resonance.h" #include "../Misc/Util.h" +#include "../Misc/XMLwrapper.h" #include "../DSP/FFTwrapper.h" enum FMTYPE{NONE,MORPH,RING_MOD,PHASE_MOD,FREQ_MOD,PITCH_MOD}; @@ -256,6 +257,8 @@ class ADnoteParameters{ ADnoteGlobalParam GlobalPar; ADnoteVoiceParam VoicePar[NUM_VOICES]; + void add2XML(XMLwrapper *xml); + void saveloadbuf(Buffer *buf); void saveloadbufvoice(Buffer *buf,unsigned char nvoice); diff --git a/src/Params/EnvelopeParams.C b/src/Params/EnvelopeParams.C @@ -26,7 +26,7 @@ #include <stdlib.h> #include "EnvelopeParams.h" -EnvelopeParams::EnvelopeParams(unsigned char Penvstretch_,unsigned char Pforcedrelase_){ +EnvelopeParams::EnvelopeParams(unsigned char Penvstretch_,unsigned char Pforcedrelease_){ int i; PA_dt=10;PD_dt=10;PR_dt=10;PA_val=64;PD_val=64;PS_val=64;PR_val=64; @@ -40,7 +40,7 @@ EnvelopeParams::EnvelopeParams(unsigned char Penvstretch_,unsigned char Pforcedr Penvpoints=1; Envmode=1; Penvstretch=Penvstretch_; - Pforcedrelase=Pforcedrelase_; + Pforcedrelease=Pforcedrelease_; Pfreemode=1; Plinearenvelope=0; }; @@ -154,7 +154,7 @@ void EnvelopeParams::saveloadbuf(Buffer *buf){ break; case 0x81: buf->rwbytepar(n,&Penvstretch); break; - case 0x82: buf->rwbytepar(n,&Pforcedrelase); + case 0x82: buf->rwbytepar(n,&Pforcedrelease); break; case 0x83: buf->rwbytepar(n,&Penvpoints); break; @@ -203,4 +203,30 @@ void EnvelopeParams::saveloadbuf(Buffer *buf){ }; }; +void EnvelopeParams::add2XML(XMLwrapper *xml){ + xml->addparbool("freemode",Pfreemode); + xml->addpar("envpoints",Penvpoints); + xml->addpar("envsustain",Penvsustain); + xml->addpar("envstretch",Penvstretch); + xml->addparbool("forcedrelease",Pforcedrelease); + xml->addparbool("linearenvelope",Plinearenvelope); + xml->addpar("A_dt",PA_dt); + xml->addpar("D_dt",PD_dt); + xml->addpar("R_dt",PR_dt); + xml->addpar("A_val",PA_val); + xml->addpar("D_val",PD_val); + xml->addpar("S_val",PS_val); + xml->addpar("R_val",PR_val); + + if (Pfreemode!=0){ + for (int i=0;i<Penvpoints;i++){ + xml->beginbranch("POINT",i); + if (i!=0) xml->addpar("envdt",Penvdt[i]); + xml->addpar("envval",Penvval[i]); + xml->endbranch(); + }; + }; +}; + + diff --git a/src/Params/EnvelopeParams.h b/src/Params/EnvelopeParams.h @@ -25,13 +25,14 @@ #include "../globals.h" #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" #define MAX_ENVELOPE_POINTS 40 #define MIN_ENVELOPE_DB -40 class EnvelopeParams{ public: - EnvelopeParams(unsigned char Penvstretch_,unsigned char Pforcedrelase_); + EnvelopeParams(unsigned char Penvstretch_,unsigned char Pforcedrelease_); ~EnvelopeParams(); void ADSRinit(char A_dt,char D_dt,char S_val,char R_dt); void ADSRinit_dB(char A_dt,char D_dt,char S_val,char R_dt); @@ -40,16 +41,20 @@ class EnvelopeParams{ void ASRinit_bw(char A_val,char A_dt,char R_val,char R_dt); void converttofree(); void saveloadbuf(Buffer *buf); + + void add2XML(XMLwrapper *xml); + + REALTYPE getdt(char i); /* Parametrii MIDI */ unsigned char Pfreemode;//1 daca este in modul free sau 0 daca este in mod ADSR,ASR,... unsigned char Penvpoints; - unsigned char Penvsustain;//127 pentru dezactivat,0 pentru relase "fortat" (folosit in amplitudine) + unsigned char Penvsustain;//127 pentru dezactivat unsigned char Penvdt[MAX_ENVELOPE_POINTS]; unsigned char Penvval[MAX_ENVELOPE_POINTS]; unsigned char Penvstretch;//64=normal stretch (piano-like), 0=no stretch - unsigned char Pforcedrelase;//0 - OFF, 1 - ON + unsigned char Pforcedrelease;//0 - OFF, 1 - ON unsigned char Plinearenvelope;//if the amplitude envelope is linear unsigned char PA_dt,PD_dt,PR_dt, diff --git a/src/Params/FilterParams.C b/src/Params/FilterParams.C @@ -297,3 +297,47 @@ void FilterParams::saveloadbuf(Buffer *buf){ buf->rwbyte(&tmp); }; }; + +void FilterParams::add2XML(XMLwrapper *xml){ + //filter parameters + xml->addpar("category",Pcategory); + xml->addpar("type",Ptype); + xml->addpar("freq",Pfreq); + xml->addpar("q",Pq); + xml->addpar("stages",Pstages); + xml->addpar("freqtrack",Pfreqtrack); + xml->addpar("gain",Pgain); + + //formant filter parameters + if (Pcategory==1){ + xml->beginbranch("FORMANTFILTER"); + xml->addpar("numformants",Pnumformants); + xml->addpar("formantslowness",Pformantslowness); + xml->addpar("vowelclearness",Pvowelclearness); + xml->addpar("centerfreq",Pcenterfreq); + xml->addpar("octavesfreq",Poctavesfreq); + for (int nvowel=0;nvowel<FF_MAX_VOWELS;nvowel++){ + xml->beginbranch("VOWEL",nvowel); + for (int nformant=0;nformant<FF_MAX_FORMANTS;nformant++){ + xml->beginbranch("FORMANT",nformant); + xml->addpar("freq",Pvowels[nvowel].formants[nformant].freq); + xml->addpar("amp",Pvowels[nvowel].formants[nformant].amp); + xml->addpar("q",Pvowels[nvowel].formants[nformant].q); + xml->endbranch(); + }; + xml->endbranch(); + }; + xml->addpar("sequencesize",Psequencesize); + xml->addpar("sequencestretch",Psequencestretch); + xml->addparbool("sequencereversed",Psequencereversed); + for (int nseq=0;nseq<FF_MAX_SEQUENCE;nseq++){ + xml->beginbranch("SEQUENCEPOS",nseq); + xml->addpar("nvowel",Psequence[nseq].nvowel); + xml->endbranch(); + }; + xml->endbranch(); + }; +}; + + + diff --git a/src/Params/FilterParams.h b/src/Params/FilterParams.h @@ -25,6 +25,7 @@ #include "../globals.h" #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" class FilterParams{ public: @@ -32,12 +33,15 @@ class FilterParams{ ~FilterParams(); void saveloadbuf(Buffer *buf); + void add2XML(XMLwrapper *xml); + + REALTYPE getfreq(); REALTYPE getq(); REALTYPE getfreqtracking(REALTYPE notefreq); REALTYPE getgain(); - unsigned char Pcategory;//Filter category (Analog/Formant) + unsigned char Pcategory;//Filter category (Analog/Formant/StVar) unsigned char Ptype;// Filter type (for analog lpf,hpf,bpf..) unsigned char Pfreq;// Frequency (64-central frequency) unsigned char Pq; // Q parameters (resonance or bandwidth) diff --git a/src/Params/LFOParams.C b/src/Params/LFOParams.C @@ -92,3 +92,15 @@ void LFOParams::saveloadbuf(Buffer *buf){ }; }; +void LFOParams::add2XML(XMLwrapper *xml){ + xml->addpar("freq",Pfreq); + xml->addpar("intensity",Pintensity); + xml->addpar("startphase",Pstartphase); + xml->addpar("LFOtype",PLFOtype); + xml->addpar("randomness",Prandomness); + xml->addpar("freqrand",Pfreqrand); + xml->addpar("delay",Pdelay); + xml->addparbool("continous",Pcontinous); +}; + + diff --git a/src/Params/LFOParams.h b/src/Params/LFOParams.h @@ -24,6 +24,8 @@ #define LFO_PARAMS_H #include "../Misc/Buffer.h" +#include "../Misc/XMLwrapper.h" + class LFOParams{ public: @@ -32,18 +34,20 @@ class LFOParams{ void saveloadbuf(Buffer *buf); + void add2XML(XMLwrapper *xml); + /* Parametrii MIDI */ unsigned char Pfreq; // frequency unsigned char Pintensity; // intensity unsigned char Pstartphase;// start phase (0=random) - unsigned char PLFOtype; // LFO typpe (sin,triangle,square,ramp,...) + unsigned char PLFOtype; // LFO type (sin,triangle,square,ramp,...) unsigned char Prandomness;// randomness (0=off) unsigned char Pfreqrand;// frequency randomness (0=off) unsigned char Pdelay; // delay (0=off) unsigned char Pcontinous; // 1 if LFO is continous + int fel;//what kind is the LFO (0 - frequency, 1 - amplitude, 2 - filter) - static int time;//is used by Pcontinous parameter private: }; diff --git a/src/Synth/Envelope.C b/src/Synth/Envelope.C @@ -28,7 +28,7 @@ Envelope::Envelope(EnvelopeParams *envpars,REALTYPE basefreq){ envpoints=envpars->Penvpoints; if (envpoints>MAX_ENVELOPE_POINTS) envpoints=MAX_ENVELOPE_POINTS; envsustain=(envpars->Penvsustain==0)?-1:envpars->Penvsustain; - forcedrelase=envpars->Pforcedrelase; + forcedrelase=envpars->Pforcedrelease; envstretch=pow(440.0/basefreq,envpars->Penvstretch/64.0); linearenvelope=envpars->Plinearenvelope; diff --git a/src/Synth/Resonance.C b/src/Synth/Resonance.C @@ -229,3 +229,23 @@ void Resonance::saveloadbuf(Buffer *buf){ }; }; + +void Resonance::add2XML(XMLwrapper *xml){ + xml->addparbool("enabled",Penabled); + if (Penabled==0) return; + + xml->addpar("maxdb",PmaxdB); + xml->addpar("centerfreq",Pcenterfreq); + xml->addpar("octavesfreq",Poctavesfreq); + xml->addpar("gain",Pgain); + xml->addparbool("protectthefundamental",Pprotectthefundamental); + for (int i=0;i<N_RES_POINTS;i++){ + xml->beginbranch("POINT",i); + xml->addpar("val",Prespoints[i]); + xml->endbranch(); + }; +}; + + + + diff --git a/src/Synth/Resonance.h b/src/Synth/Resonance.h @@ -24,6 +24,7 @@ #include "../globals.h" #include "../Misc/Util.h" +#include "../Misc/XMLwrapper.h" #define N_RES_POINTS 256 @@ -36,7 +37,12 @@ class Resonance{ void smooth(); void interpolatepeaks(int type); void randomize(int type); + void saveloadbuf(Buffer *buf); + + void add2XML(XMLwrapper *xml); + + REALTYPE getfreqpos(REALTYPE freq); REALTYPE getfreqx(REALTYPE x); REALTYPE getcenterfreq(); @@ -50,6 +56,7 @@ class Resonance{ unsigned char Pcenterfreq,Poctavesfreq; //the center frequency of the res. func., and the number of octaves unsigned char Pgain; //how the signal is amplified unsigned char Pprotectthefundamental; //the fundamental (1-st harmonic) is not damped, even it resonance function is low + //controllers REALTYPE ctlcenter;//center frequency(relative) REALTYPE ctlbw;//bandwidth(relative) diff --git a/src/UI/EnvelopeUI.fl b/src/UI/EnvelopeUI.fl @@ -281,9 +281,9 @@ freeedit->redraw();} } Fl_Check_Button {} { label frcR - callback {env->Pforcedrelase=(int)o->value();} + callback {env->Pforcedrelease=(int)o->value();} tooltip {Forced Relase} xywh {410 165 40 15} down_box DOWN_BOX labelsize 11 - code0 {o->value(env->Pforcedrelase);} + code0 {o->value(env->Pforcedrelease);} code1 {if (env->Pfreemode==0) o->hide();} } Fl_Dial {} { @@ -362,9 +362,9 @@ freeedit->redraw();} } Fl_Check_Button {} { label frcR - callback {env->Pforcedrelase=(int)o->value();} + callback {env->Pforcedrelease=(int)o->value();} tooltip {Forced Relase} xywh {180 35 20 15} down_box DOWN_BOX labelsize 11 align 6 - code0 {o->value(env->Pforcedrelase);} + code0 {o->value(env->Pforcedrelease);} } Fl_Dial {} { label Stretch @@ -437,9 +437,9 @@ freeedit->redraw();} } Fl_Check_Button {} { label frcR - callback {env->Pforcedrelase=(int)o->value();} + callback {env->Pforcedrelease=(int)o->value();} tooltip {Forced release} xywh {180 25 15 25} down_box DOWN_BOX labelsize 11 align 6 - code0 {o->value(env->Pforcedrelase);} + code0 {o->value(env->Pforcedrelease);} } } Fl_Button {} { @@ -515,9 +515,9 @@ freeedit->redraw();} } Fl_Check_Button {} { label frcR - callback {env->Pforcedrelase=(int)o->value();} + callback {env->Pforcedrelease=(int)o->value();} tooltip {Forced Relase} xywh {250 30 15 20} down_box DOWN_BOX labelsize 11 align 6 - code0 {o->value(env->Pforcedrelase);} + code0 {o->value(env->Pforcedrelease);} } Fl_Button {} { label Edit @@ -577,9 +577,9 @@ freeedit->redraw();} } Fl_Check_Button {} { label frcR - callback {env->Pforcedrelase=(int)o->value();} + callback {env->Pforcedrelease=(int)o->value();} tooltip {Forced release} xywh {180 25 15 25} down_box DOWN_BOX labelsize 11 align 6 - code0 {o->value(env->Pforcedrelase);} + code0 {o->value(env->Pforcedrelease);} } } Fl_Button {} {