zynaddsubfx

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

commit a55da9b25c8d4f22539ca19bed29493b847cc0ad
parent f054ad4d39ae39d156560c534bf41019f5c7d794
Author: paulnasca <paulnasca>
Date:   Tue,  9 Mar 2004 18:40:00 +0000

*** empty log message ***

Diffstat:
MChangeLog | 4++--
Msrc/Params/LFOParams.C | 5+++++
Msrc/Params/LFOParams.h | 6+++---
Msrc/Synth/ADnote.C | 12++++++------
Msrc/Synth/LFO.C | 7+++++--
Msrc/Synth/LFO.h | 2+-
Msrc/UI/LFOUI.fl | 11+++++++++--
7 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -545,7 +545,7 @@ 24 Feb 2004 - Continuat la Bank 25 Feb 2004 - La Bank - inceput sa scriu partea ca sa arate instrumentele din banca 26 Feb 2004 - Continuat la Bank -27 Feb 2004 - Corectate erori la snprintf ( nu dadeam parametru "%s" inainte de string si daca acel string continea ceva %, era periculos) si alte erori +27 Feb 2004 - Corectate erori la snprintf (nu dadeam parametru "%s" inainte de string si daca acel string continea ceva %, era periculos) si alte erori - Micsorat timpul de marire amplitudine la ADnote (doar in cazul cand amplitudinea creste brusc ca la un LFO expdown) - Corectata o eroare foarte veche la LFO amplitudine (amplitudinea nu scadea corespunzator) 28 Feb 2004 - Se poate incarca si salva instrumente in Bank @@ -555,7 +555,7 @@ 03 Mar 2004 - Terminat (teoretic) partea de XML 05 Mar 2004 - Actualizat Copyright-ul la 2004 in fisiere 08 Mar 2004 - Corectat o mica eroare la OscilGen (se aplica gain-ul rezonantei incorect) - +09 Mar 2004 - Adaugat posibilitatea de stretch la LFO in functie de frecventa notei diff --git a/src/Params/LFOParams.C b/src/Params/LFOParams.C @@ -53,6 +53,7 @@ void LFOParams::defaults(){ Pdelay=Ddelay; Pcontinous=Dcontinous; Pfreqrand=0; + Pstretch=64; }; /* @@ -95,6 +96,8 @@ void LFOParams::saveloadbuf(Buffer *buf){ break; case 0x87: buf->rwbytepar(n,&Pfreqrand); break; + case 0x88: buf->rwbytepar(n,&Pstretch); + break; }; }; @@ -114,6 +117,7 @@ void LFOParams::add2XML(XMLwrapper *xml){ xml->addpar("randomness_amplitude",Prandomness); xml->addpar("randomness_frequency",Pfreqrand); xml->addpar("delay",Pdelay); + xml->addpar("stretch",Pstretch); xml->addparbool("continous",Pcontinous); }; @@ -125,6 +129,7 @@ void LFOParams::getfromXML(XMLwrapper *xml){ Prandomness=xml->getpar127("randomness_amplitude",Prandomness); Pfreqrand=xml->getpar127("randomness_frequency",Pfreqrand); Pdelay=xml->getpar127("delay",Pdelay); + Pstretch=xml->getpar127("stretch",Pstretch); Pcontinous=xml->getparbool("continous",Pcontinous); }; diff --git a/src/Params/LFOParams.h b/src/Params/LFOParams.h @@ -26,7 +26,6 @@ #include "../Misc/Buffer.h" #include "../Misc/XMLwrapper.h" - class LFOParams{ public: LFOParams(char Pfreq_,char Pintensity_,char Pstartphase_, char PLFOtype_,char Prandomness_, char Pdelay_,char Pcontinous,char fel_); @@ -39,14 +38,15 @@ class LFOParams{ void getfromXML(XMLwrapper *xml); /* Parametrii MIDI */ - REALTYPE Pfreq; // frequency + REALTYPE Pfreq; // frequency unsigned char Pintensity; // intensity unsigned char Pstartphase;// start phase (0=random) unsigned char PLFOtype; // LFO type (sin,triangle,square,ramp,...) unsigned char Prandomness;// randomness (0=off) - unsigned char Pfreqrand;// frequency randomness (0=off) + unsigned char Pfreqrand; // frequency randomness (0=off) unsigned char Pdelay; // delay (0=off) unsigned char Pcontinous; // 1 if LFO is continous + unsigned char Pstretch; // how the LFO is "stretched" according the note frequency (64=no stretch) int fel;//what kind is the LFO (0 - frequency, 1 - amplitude, 2 - filter) static int time;//is used by Pcontinous parameter diff --git a/src/Synth/ADnote.C b/src/Synth/ADnote.C @@ -257,10 +257,10 @@ void ADnote::initparameters(){ // Global Parameters NoteGlobalPar.FreqEnvelope=new Envelope(partparams->GlobalPar.FreqEnvelope,basefreq); - NoteGlobalPar.FreqLfo=new LFO(partparams->GlobalPar.FreqLfo); + NoteGlobalPar.FreqLfo=new LFO(partparams->GlobalPar.FreqLfo,basefreq); NoteGlobalPar.AmpEnvelope=new Envelope(partparams->GlobalPar.AmpEnvelope,basefreq); - NoteGlobalPar.AmpLfo=new LFO(partparams->GlobalPar.AmpLfo); + NoteGlobalPar.AmpLfo=new LFO(partparams->GlobalPar.AmpLfo,basefreq); NoteGlobalPar.Volume=4.0*pow(0.1,3.0*(1.0-partparams->GlobalPar.PVolume/96.0))//-60 dB .. 0 dB *VelF(velocity,partparams->GlobalPar.PAmpVelocityScaleFunction);//velocity sensing @@ -272,7 +272,7 @@ void ADnote::initparameters(){ if (stereo!=0) NoteGlobalPar.GlobalFilterR=new Filter(partparams->GlobalPar.GlobalFilter); NoteGlobalPar.FilterEnvelope=new Envelope(partparams->GlobalPar.FilterEnvelope,basefreq); - NoteGlobalPar.FilterLfo=new LFO(partparams->GlobalPar.FilterLfo); + NoteGlobalPar.FilterLfo=new LFO(partparams->GlobalPar.FilterLfo,basefreq); NoteGlobalPar.FilterQ=partparams->GlobalPar.GlobalFilter->getq(); NoteGlobalPar.FilterFreqTracking=partparams->GlobalPar.GlobalFilter->getfreqtracking(basefreq); @@ -302,7 +302,7 @@ void ADnote::initparameters(){ }; if (partparams->VoicePar[nvoice].PAmpLfoEnabled!=0){ - NoteVoicePar[nvoice].AmpLfo=new LFO(partparams->VoicePar[nvoice].AmpLfo); + NoteVoicePar[nvoice].AmpLfo=new LFO(partparams->VoicePar[nvoice].AmpLfo,basefreq); newamplitude[nvoice]*=NoteVoicePar[nvoice].AmpLfo->amplfoout(); }; @@ -310,7 +310,7 @@ void ADnote::initparameters(){ if (partparams->VoicePar[nvoice].PFreqEnvelopeEnabled!=0) NoteVoicePar[nvoice].FreqEnvelope=new Envelope(partparams->VoicePar[nvoice].FreqEnvelope,basefreq); - if (partparams->VoicePar[nvoice].PFreqLfoEnabled!=0) NoteVoicePar[nvoice].FreqLfo=new LFO(partparams->VoicePar[nvoice].FreqLfo); + if (partparams->VoicePar[nvoice].PFreqLfoEnabled!=0) NoteVoicePar[nvoice].FreqLfo=new LFO(partparams->VoicePar[nvoice].FreqLfo,basefreq); /* Voice Filter Parameters Init */ if (partparams->VoicePar[nvoice].PFilterEnabled!=0){ @@ -321,7 +321,7 @@ void ADnote::initparameters(){ NoteVoicePar[nvoice].FilterEnvelope=new Envelope(partparams->VoicePar[nvoice].FilterEnvelope,basefreq); if (partparams->VoicePar[nvoice].PFilterLfoEnabled!=0) - NoteVoicePar[nvoice].FilterLfo=new LFO(partparams->VoicePar[nvoice].FilterLfo); + NoteVoicePar[nvoice].FilterLfo=new LFO(partparams->VoicePar[nvoice].FilterLfo,basefreq); NoteVoicePar[nvoice].FilterFreqTracking=partparams->VoicePar[nvoice].VoiceFilter->getfreqtracking(basefreq); diff --git a/src/Synth/LFO.C b/src/Synth/LFO.C @@ -27,8 +27,11 @@ #include "LFO.h" -LFO::LFO(LFOParams *lfopars){ - REALTYPE lfofreq=(pow(2,lfopars->Pfreq*10.0)-1.0)/12.0; +LFO::LFO(LFOParams *lfopars,REALTYPE basefreq){ + if (lfopars->Pstretch==0) lfopars->Pstretch=1; + REALTYPE lfostretch=pow(basefreq/440.0,(lfopars->Pstretch-64.0)/63.0);//max 2x/octave + + REALTYPE lfofreq=(pow(2,lfopars->Pfreq*10.0)-1.0)/12.0*lfostretch; incx=fabs(lfofreq)*(REALTYPE)SOUND_BUFFER_SIZE/(REALTYPE)SAMPLE_RATE; if (lfopars->Pcontinous==0){ diff --git a/src/Synth/LFO.h b/src/Synth/LFO.h @@ -29,7 +29,7 @@ class LFO{ public: - LFO(LFOParams *lfopars); + LFO(LFOParams *lfopars, REALTYPE basefreq); ~LFO(); REALTYPE lfoout(); REALTYPE amplfoout(); diff --git a/src/UI/LFOUI.fl b/src/UI/LFOUI.fl @@ -54,7 +54,7 @@ delete (lfoui);} {} } { Fl_Dial {} { label {Freq.} - callback {pars->Pfreq=o->value();} selected + callback {pars->Pfreq=o->value();} tooltip {LFO Frequency} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 step 1e-05 code0 {o->value(pars->Pfreq);} class WidgetPDial @@ -125,7 +125,7 @@ delete (lfoui);} {} Fl_Check_Button {} { label {C.} callback {pars->Pcontinous=(int)o->value();} - tooltip {Continous LFO} xywh {145 30 30 15} down_box DOWN_BOX labelsize 11 + tooltip {Continous LFO} xywh {150 13 25 15} down_box DOWN_BOX labelsize 11 code0 {o->value(pars->Pcontinous);} } Fl_Dial {} { @@ -135,6 +135,13 @@ delete (lfoui);} {} code0 {o->value(pars->Pfreqrand);} class WidgetPDial } + Fl_Dial {} { + label {Str.} + callback {pars->Pstretch=(int)o->value();} + tooltip {LFO stretch} xywh {150 30 20 20} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 + code0 {o->value(pars->Pstretch);} + class WidgetPDial + } } } }