zynaddsubfx

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

commit 4bf4af2fc5735dcf55fce28603aeb053963541bd
parent 68ec39daf32b8a36cb8c3029183a7d3da94950d1
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Sat, 14 Feb 2015 13:09:43 -0500

Envlope: Refactor

Diffstat:
Msrc/Params/EnvelopeParams.h | 11++++-------
Msrc/Synth/ADnote.cpp | 24++++++++++++------------
Msrc/Synth/Envelope.cpp | 38+++++++++++++++++++-------------------
Msrc/Synth/Envelope.h | 3+--
Msrc/Synth/OscilGen.cpp | 11++++++-----
Msrc/Synth/OscilGen.h | 3---
Msrc/Synth/PADnote.cpp | 6+++---
Msrc/Synth/SUBnote.cpp | 8++++----
Msrc/globals.h | 13+++++++++++++
9 files changed, 62 insertions(+), 55 deletions(-)

diff --git a/src/Params/EnvelopeParams.h b/src/Params/EnvelopeParams.h @@ -27,9 +27,6 @@ #include "../Misc/XMLwrapper.h" #include "Presets.h" -#define MAX_ENVELOPE_POINTS 40 -#define MIN_ENVELOPE_DB -400 - class EnvelopeParams:public Presets { public: @@ -72,10 +69,10 @@ class EnvelopeParams:public Presets int Envmode; // 1 for ADSR parameters (linear amplitude) - // 2 for ADSR_dB parameters (dB amplitude) - // 3 for ASR parameters (frequency LFO) - // 4 for ADSR_filter parameters (filter parameters) - // 5 for ASR_bw parameters (bandwidth parameters) + // 2 for ADSR_dB parameters (dB amplitude) + // 3 for ASR parameters (frequency LFO) + // 4 for ADSR_filter parameters (filter parameters) + // 5 for ASR_bw parameters (bandwidth parameters) static rtosc::Ports &ports; private: diff --git a/src/Synth/ADnote.cpp b/src/Synth/ADnote.cpp @@ -753,7 +753,7 @@ void ADnote::initparameters() newamplitude[nvoice] = 1.0f; if(param.PAmpEnvelopeEnabled) { - vce.AmpEnvelope = memory.alloc<Envelope>(param.AmpEnvelope, basefreq); + vce.AmpEnvelope = memory.alloc<Envelope>(*param.AmpEnvelope, basefreq); vce.AmpEnvelope->envout_dB(); //discard the first envelope sample newamplitude[nvoice] *= vce.AmpEnvelope->envout_dB(); } @@ -765,7 +765,7 @@ void ADnote::initparameters() /* Voice Frequency Parameters Init */ if(param.PFreqEnvelopeEnabled) - vce.FreqEnvelope = memory.alloc<Envelope>(param.FreqEnvelope, basefreq); + vce.FreqEnvelope = memory.alloc<Envelope>(*param.FreqEnvelope, basefreq); if(param.PFreqLfoEnabled) vce.FreqLfo = memory.alloc<LFO>(*param.FreqLfo, basefreq); @@ -777,7 +777,7 @@ void ADnote::initparameters() } if(param.PFilterEnvelopeEnabled) - vce.FilterEnvelope = memory.alloc<Envelope>(param.FilterEnvelope, basefreq); + vce.FilterEnvelope = memory.alloc<Envelope>(*param.FilterEnvelope, basefreq); if(param.PFilterLfoEnabled) vce.FilterLfo = memory.alloc<LFO>(*param.FilterLfo, basefreq); @@ -823,14 +823,14 @@ void ADnote::initparameters() } } - if(param.PFMFreqEnvelopeEnabled != 0) - vce.FMFreqEnvelope = memory.alloc<Envelope>(param.FMFreqEnvelope, basefreq); + if(param.PFMFreqEnvelopeEnabled) + vce.FMFreqEnvelope = memory.alloc<Envelope>(*param.FMFreqEnvelope, basefreq); FMnewamplitude[nvoice] = vce.FMVolume * ctl->fmamp.relamp; - if(param.PFMAmpEnvelopeEnabled != 0) { + if(param.PFMAmpEnvelopeEnabled ) { vce.FMAmpEnvelope = - memory.alloc<Envelope>(param.FMAmpEnvelope, basefreq); + memory.alloc<Envelope>(*param.FMAmpEnvelope, basefreq); FMnewamplitude[nvoice] *= vce.FMAmpEnvelope->envout_dB(); } } @@ -1010,10 +1010,10 @@ void ADnote::computecurrentparameters() oldamplitude[nvoice] = newamplitude[nvoice]; newamplitude[nvoice] = 1.0f; - if(NoteVoicePar[nvoice].AmpEnvelope != NULL) + if(NoteVoicePar[nvoice].AmpEnvelope) newamplitude[nvoice] *= NoteVoicePar[nvoice].AmpEnvelope->envout_dB(); - if(NoteVoicePar[nvoice].AmpLfo != NULL) + if(NoteVoicePar[nvoice].AmpLfo) newamplitude[nvoice] *= NoteVoicePar[nvoice].AmpLfo->amplfoout(); /****************/ @@ -1783,10 +1783,10 @@ void ADnote::Global::initparameters(const ADnoteGlobalParam &param, float basefreq, float velocity, bool stereo) { - FreqEnvelope = memory.alloc<Envelope>(param.FreqEnvelope, basefreq); + FreqEnvelope = memory.alloc<Envelope>(*param.FreqEnvelope, basefreq); FreqLfo = memory.alloc<LFO>(*param.FreqLfo, basefreq); - AmpEnvelope = memory.alloc<Envelope>(param.AmpEnvelope, basefreq); + AmpEnvelope = memory.alloc<Envelope>(*param.AmpEnvelope, basefreq); AmpLfo = memory.alloc<LFO>(*param.AmpLfo, basefreq); Volume = 4.0f * powf(0.1f, 3.0f * (1.0f - param.PVolume / 96.0f)) //-60 dB .. 0 dB @@ -1798,7 +1798,7 @@ void ADnote::Global::initparameters(const ADnoteGlobalParam &param, else GlobalFilterR = NULL; - FilterEnvelope = memory.alloc<Envelope>(param.FilterEnvelope, basefreq); + FilterEnvelope = memory.alloc<Envelope>(*param.FilterEnvelope, basefreq); FilterLfo = memory.alloc<LFO>(*param.FilterLfo, basefreq); FilterQ = param.GlobalFilter->getq(); FilterFreqTracking = param.GlobalFilter->getfreqtracking(basefreq); diff --git a/src/Synth/Envelope.cpp b/src/Synth/Envelope.cpp @@ -24,31 +24,31 @@ #include "Envelope.h" #include "../Params/EnvelopeParams.h" -Envelope::Envelope(EnvelopeParams *envpars, float basefreq) +Envelope::Envelope(EnvelopeParams &pars, float basefreq) { - envpoints = envpars->Penvpoints; + envpoints = pars.Penvpoints; if(envpoints > MAX_ENVELOPE_POINTS) envpoints = MAX_ENVELOPE_POINTS; - envsustain = (envpars->Penvsustain == 0) ? -1 : envpars->Penvsustain; - forcedrelase = envpars->Pforcedrelease; - envstretch = powf(440.0f / basefreq, envpars->Penvstretch / 64.0f); - linearenvelope = envpars->Plinearenvelope; + envsustain = (pars.Penvsustain == 0) ? -1 : pars.Penvsustain; + forcedrelase = pars.Pforcedrelease; + envstretch = powf(440.0f / basefreq, pars.Penvstretch / 64.0f); + linearenvelope = pars.Plinearenvelope; - if(envpars->Pfreemode == 0) - envpars->converttofree(); + if(!pars.Pfreemode) + pars.converttofree(); - float bufferdt = synth->buffersize_f / synth->samplerate_f; + const float bufferdt = synth->buffersize_f / synth->samplerate_f; - int mode = envpars->Envmode; + int mode = pars.Envmode; //for amplitude envelopes - if((mode == 1) && (linearenvelope == 0)) + if((mode == 1) && !linearenvelope) mode = 2; //change to log envelope - if((mode == 2) && (linearenvelope != 0)) + if((mode == 2) && linearenvelope) mode = 1; //change to linear for(int i = 0; i < MAX_ENVELOPE_POINTS; ++i) { - float tmp = envpars->getdt(i) / 1000.0f * envstretch; + const float tmp = pars.getdt(i) / 1000.0f * envstretch; if(tmp > bufferdt) envdt[i] = bufferdt / tmp; else @@ -56,24 +56,24 @@ Envelope::Envelope(EnvelopeParams *envpars, float basefreq) switch(mode) { case 2: - envval[i] = (1.0f - envpars->Penvval[i] / 127.0f) * -40; + envval[i] = (1.0f - pars.Penvval[i] / 127.0f) * -40; break; case 3: envval[i] = (powf(2, 6.0f - * fabs(envpars->Penvval[i] + * fabs(pars.Penvval[i] - 64.0f) / 64.0f) - 1.0f) * 100.0f; - if(envpars->Penvval[i] < 64) + if(pars.Penvval[i] < 64) envval[i] = -envval[i]; break; case 4: - envval[i] = (envpars->Penvval[i] - 64.0f) / 64.0f * 6.0f; //6 octaves (filtru) + envval[i] = (pars.Penvval[i] - 64.0f) / 64.0f * 6.0f; //6 octaves (filtru) break; case 5: - envval[i] = (envpars->Penvval[i] - 64.0f) / 64.0f * 10; + envval[i] = (pars.Penvval[i] - 64.0f) / 64.0f * 10; break; default: - envval[i] = envpars->Penvval[i] / 127.0f; + envval[i] = pars.Penvval[i] / 127.0f; } } diff --git a/src/Synth/Envelope.h b/src/Synth/Envelope.h @@ -24,7 +24,6 @@ #define ENVELOPE_H #include "../globals.h" -#include "../Params/EnvelopeParams.h" /**Implementation of a general Envelope*/ class Envelope @@ -32,7 +31,7 @@ class Envelope public: /**Constructor*/ - Envelope(class EnvelopeParams *envpars, float basefreq); + Envelope(class EnvelopeParams &pars, float basefreq); /**Destructor*/ ~Envelope(); void relasekey(); diff --git a/src/Synth/OscilGen.cpp b/src/Synth/OscilGen.cpp @@ -21,14 +21,15 @@ */ #include "OscilGen.h" +#include "../DSP/FFTwrapper.h" +#include "../Synth/Resonance.h" #include "../Misc/WaveShapeSmps.h" #include <cassert> -#include <stdlib.h> -#include <math.h> -#include <stdio.h> -#include <stddef.h> -#include <pthread.h> +#include <cstdlib> +#include <cmath> +#include <cstdio> +#include <cstddef> #include <unistd.h> diff --git a/src/Synth/OscilGen.h b/src/Synth/OscilGen.h @@ -24,10 +24,7 @@ #define OSCIL_GEN_H #include "../globals.h" -#include "../Misc/XMLwrapper.h" -#include "../DSP/FFTwrapper.h" #include "../Params/Presets.h" -#include "Resonance.h" class OscilGen:public Presets { diff --git a/src/Synth/PADnote.cpp b/src/Synth/PADnote.cpp @@ -130,10 +130,10 @@ void PADnote::setup(float freq, else NoteGlobalPar.Punch.Enabled = 0; - NoteGlobalPar.FreqEnvelope = memory.alloc<Envelope>(pars->FreqEnvelope, basefreq); + NoteGlobalPar.FreqEnvelope = memory.alloc<Envelope>(*pars->FreqEnvelope, basefreq); NoteGlobalPar.FreqLfo = memory.alloc<LFO>(*pars->FreqLfo, basefreq); - NoteGlobalPar.AmpEnvelope = memory.alloc<Envelope>(pars->AmpEnvelope, basefreq); + NoteGlobalPar.AmpEnvelope = memory.alloc<Envelope>(*pars->AmpEnvelope, basefreq); NoteGlobalPar.AmpLfo = memory.alloc<LFO>(*pars->AmpLfo, basefreq); } @@ -151,7 +151,7 @@ void PADnote::setup(float freq, NoteGlobalPar.GlobalFilterL = Filter::generate(memory, pars->GlobalFilter); NoteGlobalPar.GlobalFilterR = Filter::generate(memory, pars->GlobalFilter); - NoteGlobalPar.FilterEnvelope = memory.alloc<Envelope>(pars->FilterEnvelope, basefreq); + NoteGlobalPar.FilterEnvelope = memory.alloc<Envelope>(*pars->FilterEnvelope, basefreq); NoteGlobalPar.FilterLfo = memory.alloc<LFO>(*pars->FilterLfo, basefreq); } NoteGlobalPar.FilterQ = pars->GlobalFilter->getq(); diff --git a/src/Synth/SUBnote.cpp b/src/Synth/SUBnote.cpp @@ -360,13 +360,13 @@ void SUBnote::filter(bpfilter &filter, float *smps) */ void SUBnote::initparameters(float freq) { - AmpEnvelope = memory.alloc<Envelope>(pars->AmpEnvelope, freq); + AmpEnvelope = memory.alloc<Envelope>(*pars->AmpEnvelope, freq); if(pars->PFreqEnvelopeEnabled) - FreqEnvelope = memory.alloc<Envelope>(pars->FreqEnvelope, freq); + FreqEnvelope = memory.alloc<Envelope>(*pars->FreqEnvelope, freq); else FreqEnvelope = NULL; if(pars->PBandWidthEnvelopeEnabled) - BandWidthEnvelope = memory.alloc<Envelope>(pars->BandWidthEnvelope, freq); + BandWidthEnvelope = memory.alloc<Envelope>(*pars->BandWidthEnvelope, freq); else BandWidthEnvelope = NULL; if(pars->PGlobalFilterEnabled) { @@ -374,7 +374,7 @@ void SUBnote::initparameters(float freq) GlobalFilterL = Filter::generate(memory, pars->GlobalFilter); if(stereo) GlobalFilterR = Filter::generate(memory, pars->GlobalFilter); - GlobalFilterEnvelope = memory.alloc<Envelope>(pars->GlobalFilterEnvelope, freq); + GlobalFilterEnvelope = memory.alloc<Envelope>(*pars->GlobalFilterEnvelope, freq); GlobalFilterFreqTracking = pars->GlobalFilter->getfreqtracking(basefreq); } computecurrentparameters(); diff --git a/src/globals.h b/src/globals.h @@ -48,6 +48,7 @@ class SynthNote; class Microtonal; class XMLwrapper; +class Resonance; class FFTwrapper; class LFOParams; class FilterParams; @@ -58,6 +59,12 @@ class Controller; class Master; class Part; +namespace std { + template<class T> struct complex; +}; +typedef double fftw_real; +typedef std::complex<fftw_real> fft_t; + /** * The number of harmonics of additive synth * This must be smaller than OSCIL_SIZE/2 @@ -155,6 +162,12 @@ class Part; #define LOG_10 2.302585093f /* + * Envelope Limits + */ +#define MAX_ENVELOPE_POINTS 40 +#define MIN_ENVELOPE_DB -400 + +/* * The threshold for the amplitude interpolation used if the amplitude * is changed (by LFO's or Envelope's). If the change of the amplitude * is below this, the amplitude is not interpolated