zynaddsubfx

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

commit a30a36cc88334889b62c5c113af471029094ae5f
parent 3b6ece03220d7b04f04d5a8bed7d1b248ed5edd7
Author: paulnasca <paulnasca>
Date:   Wed, 23 Jun 2004 20:17:06 +0000

*** empty log message ***

Diffstat:
MChangeLog | 4+++-
Msrc/Params/ADnoteParameters.C | 5++++-
Msrc/Params/ADnoteParameters.h | 3+++
Msrc/Synth/ADnote.C | 7++++++-
Msrc/Synth/OscilGen.C | 10++++++++++
Msrc/Synth/OscilGen.h | 7++++++-
Msrc/UI/ADnoteUI.fl | 17+++++++++++------
7 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -590,8 +590,10 @@ - Facute mici modificari la FM-ul de la Oscil 21 Iun 2004 - Inceput sa scriu conversia in sinus 22 Iun 2004 - Continuat conversia in sinus si facut teste pentru posibilitatea de "draw" cu sliderele -23 Iun 2004 - Modificat modul in care parametrii se afiseaza la OscilGen (este o functie refresh() care face asta) +23 Iun 2004 - Modificat modul in care parametrii se afiseaza la OscilGen (este o functie "refresh" care face asta) - Adaugata posibilitatea de draw la armonicele OscilGen daca se apasa tasta Shift - Corectata o mica eroare care facea imposibila modificarea amplitudinii armonicelor cu tastatura + - Adaugat randomness de grup (adica se aplica acelasi randomness la toate vocile care folosesc acelasi oscilator) + diff --git a/src/Params/ADnoteParameters.C b/src/Params/ADnoteParameters.C @@ -68,6 +68,7 @@ void ADnoteParameters::defaults(){ GlobalPar.PPunchTime=60; GlobalPar.PPunchStretch=64; GlobalPar.PPunchVelocitySensing=72; + GlobalPar.Hrandgrouping=0; /* Filter Global Parameters*/ GlobalPar.PFilterVelocityScale=64; @@ -77,6 +78,7 @@ void ADnoteParameters::defaults(){ GlobalPar.FilterLfo->defaults(); GlobalPar.Reson->defaults(); + for (int nvoice=0;nvoice<NUM_VOICES;nvoice++){ VoicePar[nvoice].Enabled=0; VoicePar[nvoice].Type=0; @@ -659,6 +661,7 @@ void ADnoteParameters::add2XML(XMLwrapper *xml){ xml->addpar("punch_time",GlobalPar.PPunchTime); xml->addpar("punch_stretch",GlobalPar.PPunchStretch); xml->addpar("punch_velocity_sensing",GlobalPar.PPunchVelocitySensing); + xml->addpar("harmonic_randomness_grouping",GlobalPar.Hrandgrouping); xml->beginbranch("AMPLITUDE_ENVELOPE"); GlobalPar.AmpEnvelope->add2XML(xml); @@ -671,7 +674,6 @@ void ADnoteParameters::add2XML(XMLwrapper *xml){ xml->beginbranch("FREQUENCY_PARAMETERS"); xml->addpar("detune",GlobalPar.PDetune); -// printf("%d\n",GlobalPar.PCoarseDetune); xml->addpar("coarse_detune",GlobalPar.PCoarseDetune); xml->addpar("detune_type",GlobalPar.PDetuneType); @@ -727,6 +729,7 @@ void ADnoteParameters::getfromXML(XMLwrapper *xml){ GlobalPar.PPunchTime=xml->getpar127("punch_time",GlobalPar.PPunchTime); GlobalPar.PPunchStretch=xml->getpar127("punch_stretch",GlobalPar.PPunchStretch); GlobalPar.PPunchVelocitySensing=xml->getpar127("punch_velocity_sensing",GlobalPar.PPunchVelocitySensing); + GlobalPar.Hrandgrouping=xml->getpar127("harmonic_randomness_grouping",GlobalPar.Hrandgrouping); if (xml->enterbranch("AMPLITUDE_ENVELOPE")){ GlobalPar.AmpEnvelope->getfromXML(xml); diff --git a/src/Params/ADnoteParameters.h b/src/Params/ADnoteParameters.h @@ -97,6 +97,9 @@ // RESONANCE Resonance *Reson; + + //how the randomness is applied to the harmonics on more voices using the same oscillator + unsigned char Hrandgrouping; }; diff --git a/src/Synth/ADnote.C b/src/Synth/ADnote.C @@ -67,8 +67,9 @@ ADnote::ADnote(ADnoteParameters *pars,Controller *ctl_,REALTYPE freq,REALTYPE ve REALTYPE stretch=pow(440.0/freq,pars->GlobalPar.PPunchStretch/64.0); NoteGlobalPar.Punch.dt=1.0/(time*SAMPLE_RATE*stretch); } else NoteGlobalPar.Punch.Enabled=0; - + for (int nvoice=0;nvoice<NUM_VOICES;nvoice++){ + pars->VoicePar[nvoice].OscilSmp->newrandseed(rand()); NoteVoicePar[nvoice].OscilSmp=NULL; NoteVoicePar[nvoice].FMSmp=NULL; NoteVoicePar[nvoice].VoiceOut=NULL; @@ -112,6 +113,7 @@ ADnote::ADnote(ADnoteParameters *pars,Controller *ctl_,REALTYPE freq,REALTYPE ve //Get the voice's oscil or external's voice oscil int vc=nvoice; if (pars->VoicePar[nvoice].Pextoscil!=-1) vc=pars->VoicePar[nvoice].Pextoscil; + if (!pars->GlobalPar.Hrandgrouping) pars->VoicePar[vc].OscilSmp->newrandseed(rand()); oscposhi[nvoice]=pars->VoicePar[vc].OscilSmp->get(NoteVoicePar[nvoice].OscilSmp,getvoicebasefreq(nvoice), pars->VoicePar[nvoice].Presonance); @@ -329,6 +331,7 @@ void ADnote::initparameters(){ /* Voice Modulation Parameters Init */ if ((NoteVoicePar[nvoice].FMEnabled!=NONE)&&(NoteVoicePar[nvoice].FMVoice<0)){ + partparams->VoicePar[nvoice].FMSmp->newrandseed(rand()); NoteVoicePar[nvoice].FMSmp=new REALTYPE[OSCIL_SIZE+OSCIL_SMP_EXTRA_SAMPLES]; //Perform Anti-aliasing only on MORPH or RING MODULATION @@ -343,6 +346,8 @@ void ADnote::initparameters(){ int vc=nvoice; if (partparams->VoicePar[nvoice].PextFMoscil!=-1) vc=partparams->VoicePar[nvoice].PextFMoscil; + if (!partparams->GlobalPar.Hrandgrouping) partparams->VoicePar[vc].FMSmp->newrandseed(rand()); + oscposhiFM[nvoice]=(oscposhi[nvoice]+partparams->VoicePar[vc].FMSmp->get(NoteVoicePar[nvoice].FMSmp,tmp)) % OSCIL_SIZE; for (int i=0;i<OSCIL_SMP_EXTRA_SAMPLES;i++) NoteVoicePar[nvoice].FMSmp[OSCIL_SIZE+i]=NoteVoicePar[nvoice].FMSmp[i]; oscposhiFM[nvoice]+=(int)((partparams->VoicePar[nvoice].PFMoscilphase-64.0)/128.0*OSCIL_SIZE+OSCIL_SIZE*4); diff --git a/src/Synth/OscilGen.C b/src/Synth/OscilGen.C @@ -36,6 +36,7 @@ OscilGen::OscilGen(FFTwrapper *fft_,Resonance *res_){ basefuncFFTfreqsQ=NULL; basefuncFFTfreqs=NULL; outoscilFFTfreqs=NULL; + randseed=1; defaults(); }; @@ -777,6 +778,10 @@ short int OscilGen::get(REALTYPE *smps,REALTYPE freqHz){ return(this->get(smps,freqHz,0)); }; +void OscilGen::newrandseed(unsigned int randseed){ + this->randseed=randseed; +}; + /* * Get the oscillator function */ @@ -864,13 +869,17 @@ short int OscilGen::get(REALTYPE *smps,REALTYPE freqHz,int resonance){ //Harmonic Amplitude Randomness if (freqHz>0.1) { + unsigned int realrnd=rand(); + srand(randseed); REALTYPE power=Pamprandpower/127.0; REALTYPE normalize=1.0/(1.2-power); switch (Pamprandtype){ case 1: power=power*2.0-0.5; power=pow(15.0,power); for (i=1;i<nyquist-1;i++){ +// REALTYPE x=(i-1)/3.0;if (x>1.0) x=1.0;x*=x; REALTYPE amp=pow(RND,power)*normalize; +// amp=1.0-x+amp*x; outoscilFFTfreqs[i]*=amp; outoscilFFTfreqs[OSCIL_SIZE-i]*=amp; }; @@ -885,6 +894,7 @@ short int OscilGen::get(REALTYPE *smps,REALTYPE freqHz,int resonance){ }; break; }; + srand(realrnd+1); }; diff --git a/src/Synth/OscilGen.h b/src/Synth/OscilGen.h @@ -102,7 +102,10 @@ class OscilGen{ unsigned char Pmodulation;//what modulation is applied to the oscil unsigned char Pmodulationpar1,Pmodulationpar2,Pmodulationpar3;//the parameter of the parameters - + + //makes a new random seed for Amplitude Randomness + //this should be called every note on event + void newrandseed(unsigned int randseed); private: REALTYPE hmag[MAX_AD_HARMONICS],hphase[MAX_AD_HARMONICS];//the magnituides and the phases of the sine/nonsine harmonics @@ -166,6 +169,8 @@ class OscilGen{ unsigned short int *basefuncFFTfreqsQ; Resonance *res; + unsigned int randseed; + }; diff --git a/src/UI/ADnoteUI.fl b/src/UI/ADnoteUI.fl @@ -1,5 +1,5 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0200 +version 1.0105 header_name {.h} code_name {.cc} decl {//Copyright (c) 2002-2004 Nasca Octavian Paul} {} @@ -744,15 +744,14 @@ delete (ADnoteVoiceParameters);} {} } decl {int nvoice;} {} decl {ADnoteParameters *pars;} {} - decl {OscilEditor *oscedit;} {selected - } + decl {OscilEditor *oscedit;} {} decl {Oscilloscope *osc;} {} decl {Oscilloscope *oscFM;} {} decl {Master *master;} {} } class ADnoteUI {} { - Function {make_window()} {open private + Function {make_window()} {private } { Fl_Window ADnoteGlobalParameters { label {ADsynth Global Parameters of the Instrument} @@ -822,7 +821,7 @@ detunevalueoutput->do_callback();} } } Fl_Group {} { - label AMPLITUDE + label AMPLITUDE selected xywh {5 5 240 250} box THIN_UP_FRAME labeltype EMBOSSED_LABEL labelfont 1 labelsize 16 align 17 } { Fl_Value_Slider {} { @@ -884,6 +883,12 @@ detunevalueoutput->do_callback();} code0 {o->init(pars->GlobalPar.AmpLfo);} class LFOUI } {} + Fl_Check_Button {} { + label {Rnd Grp} + callback {pars->GlobalPar.Hrandgrouping=(int) o->value();} + tooltip {How the Harmonic Amplitude is applied to voices that use the same oscillator} xywh {70 225 40 25} down_box DOWN_BOX labelsize 10 align 148 + code0 {o->value(pars->GlobalPar.Hrandgrouping);} + } } Fl_Group {} { label FILTER @@ -911,7 +916,7 @@ detunevalueoutput->do_callback();} Fl_Check_Button {} { label Stereo callback {pars->GlobalPar.PStereo=(int) o->value();} - xywh {5 220 80 35} box ENGRAVED_BOX down_box DOWN_BOX labelfont 1 labelsize 12 + xywh {5 220 65 35} box ENGRAVED_BOX down_box DOWN_BOX labelfont 1 labelsize 12 code0 {o->value(pars->GlobalPar.PStereo);} } Fl_Button {} {