/* ZynAddSubFX - a software synthesizer ADnoteParameters.h - Parameters for ADnote (ADsynth) Copyright (C) 2002-2005 Nasca Octavian Paul Author: Nasca Octavian Paul This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (version 2 or later) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef AD_NOTE_PARAMETERS_H #define AD_NOTE_PARAMETERS_H #include "../globals.h" #include "../Misc/Util.h" #include "PresetsArray.h" class EnvelopeParams; class LFOParams; class FilterParams; class Resonance; class OscilGen; class FFTwrapper; enum FMTYPE { NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD }; extern int ADnote_unison_sizes[]; /*****************************************************************/ /* GLOBAL PARAMETERS */ /*****************************************************************/ struct ADnoteGlobalParam { ADnoteGlobalParam(); ~ADnoteGlobalParam(); void defaults(); void add2XML(XMLwrapper *xml); void getfromXML(XMLwrapper *xml); /* The instrument type - MONO/STEREO If the mode is MONO, the panning of voices are not used Stereo=1, Mono=0. */ unsigned char PStereo; /****************************************** * FREQUENCY GLOBAL PARAMETERS * ******************************************/ unsigned short int PDetune; //fine detune unsigned short int PCoarseDetune; //coarse detune+octave unsigned char PDetuneType; //detune type unsigned char PBandwidth; //how much the relative fine detunes of the voices are changed EnvelopeParams *FreqEnvelope; //Frequency Envelope LFOParams *FreqLfo; //Frequency LFO /******************************************** * AMPLITUDE GLOBAL PARAMETERS * ********************************************/ /* Panning - 0 - random 1 - left 64 - center 127 - right */ unsigned char PPanning; unsigned char PVolume; unsigned char PAmpVelocityScaleFunction; EnvelopeParams *AmpEnvelope; LFOParams *AmpLfo; unsigned char PPunchStrength, PPunchTime, PPunchStretch, PPunchVelocitySensing; /****************************************** * FILTER GLOBAL PARAMETERS * ******************************************/ FilterParams *GlobalFilter; // filter velocity sensing unsigned char PFilterVelocityScale; // filter velocity sensing unsigned char PFilterVelocityScaleFunction; EnvelopeParams *FilterEnvelope; LFOParams *FilterLfo; // RESONANCE Resonance *Reson; //how the randomness is applied to the harmonics on more voices using the same oscillator unsigned char Hrandgrouping; }; /***********************************************************/ /* VOICE PARAMETERS */ /***********************************************************/ struct ADnoteVoiceParam { void getfromXML(XMLwrapper *xml, unsigned nvoice); void add2XML(XMLwrapper *xml, bool fmoscilused); void defaults(); void enable(FFTwrapper *fft, Resonance *Reson); void kill(); /** If the voice is enabled */ unsigned char Enabled; /** How many subvoices are used in this voice */ unsigned char Unison_size; /** How subvoices are spread */ unsigned char Unison_frequency_spread; /** How much phase randomization */ unsigned char Unison_phase_randomness; /** Stereo spread of the subvoices*/ unsigned char Unison_stereo_spread; /** Vibratto of the subvoices (which makes the unison more "natural")*/ unsigned char Unison_vibratto; /** Medium speed of the vibratto of the subvoices*/ unsigned char Unison_vibratto_speed; /** Unison invert phase */ unsigned char Unison_invert_phase; //0=none,1=random,2=50%,3=33%,4=25% /** Type of the voice (0=Sound,1=Noise)*/ unsigned char Type; /** Voice Delay */ unsigned char PDelay; /** If the resonance is enabled for this voice */ unsigned char Presonance; // What external oscil should I use, -1 for internal OscilSmp&FMSmp short int Pextoscil, PextFMoscil; // it is not allowed that the externoscil,externFMoscil => current voice // oscillator phases unsigned char Poscilphase, PFMoscilphase; // filter bypass unsigned char Pfilterbypass; /** Voice oscillator */ OscilGen *OscilSmp; /********************************** * FREQUENCY PARAMETERS * **********************************/ /** If the base frequency is fixed to 440 Hz*/ unsigned char Pfixedfreq; /* Equal temperate (this is used only if the Pfixedfreq is enabled) If this parameter is 0, the frequency is fixed (to 440 Hz); if this parameter is 64, 1 MIDI halftone -> 1 frequency halftone */ unsigned char PfixedfreqET; /** Fine detune */ unsigned short int PDetune; /** Coarse detune + octave */ unsigned short int PCoarseDetune; /** Detune type */ unsigned char PDetuneType; /* Frequency Envelope */ unsigned char PFreqEnvelopeEnabled; EnvelopeParams *FreqEnvelope; /* Frequency LFO */ unsigned char PFreqLfoEnabled; LFOParams *FreqLfo; /*************************** * AMPLITUDE PARAMETERS * ***************************/ /* Panning 0 - random 1 - left 64 - center 127 - right The Panning is ignored if the instrument is mono */ unsigned char PPanning; /* Voice Volume */ unsigned char PVolume; /* If the Volume negative */ unsigned char PVolumeminus; /* Velocity sensing */ unsigned char PAmpVelocityScaleFunction; /* Amplitude Envelope */ unsigned char PAmpEnvelopeEnabled; EnvelopeParams *AmpEnvelope; /* Amplitude LFO */ unsigned char PAmpLfoEnabled; LFOParams *AmpLfo; /************************* * FILTER PARAMETERS * *************************/ /* Voice Filter */ unsigned char PFilterEnabled; FilterParams *VoiceFilter; /* Filter Envelope */ unsigned char PFilterEnvelopeEnabled; EnvelopeParams *FilterEnvelope; /* LFO Envelope */ unsigned char PFilterLfoEnabled; LFOParams *FilterLfo; /**************************** * MODULLATOR PARAMETERS * ****************************/ /* Modullator Parameters (0=off,1=Morph,2=RM,3=PM,4=FM.. */ unsigned char PFMEnabled; /* Voice that I use as modullator instead of FMSmp. It is -1 if I use FMSmp(default). It maynot be equal or bigger than current voice */ short int PFMVoice; /* Modullator oscillator */ OscilGen *FMSmp; /* Modullator Volume */ unsigned char PFMVolume; /* Modullator damping at higher frequencies */ unsigned char PFMVolumeDamp; /* Modullator Velocity Sensing */ unsigned char PFMVelocityScaleFunction; /* Fine Detune of the Modullator*/ unsigned short int PFMDetune; /* Coarse Detune of the Modullator */ unsigned short int PFMCoarseDetune; /* The detune type */ unsigned char PFMDetuneType; /* Frequency Envelope of the Modullator */ unsigned char PFMFreqEnvelopeEnabled; EnvelopeParams *FMFreqEnvelope; /* Frequency Envelope of the Modullator */ unsigned char PFMAmpEnvelopeEnabled; EnvelopeParams *FMAmpEnvelope; }; class ADnoteParameters:public PresetsArray { public: ADnoteParameters(FFTwrapper *fft_); ~ADnoteParameters(); ADnoteGlobalParam GlobalPar; ADnoteVoiceParam VoicePar[NUM_VOICES]; void defaults(); void add2XML(XMLwrapper *xml); void getfromXML(XMLwrapper *xml); float getBandwidthDetuneMultiplier(); float getUnisonFrequencySpreadCents(int nvoice); int get_unison_size_index(int nvoice); void set_unison_size_index(int nvoice, int index); private: void defaults(int n); //n is the nvoice void EnableVoice(int nvoice); void KillVoice(int nvoice); FFTwrapper *fft; void add2XMLsection(XMLwrapper *xml, int n); void getfromXMLsection(XMLwrapper *xml, int n); }; #endif