/*
  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) 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 "EnvelopeParams.h"
#include "LFOParams.h"
#include "FilterParams.h"
#include "../Synth/OscilGen.h"
#include "../Synth/Resonance.h"
#include "../Misc/Util.h"
#include "../Misc/XMLwrapper.h"
#include "../DSP/FFTwrapper.h"
#include "Presets.h"

  enum FMTYPE{NONE,MORPH,RING_MOD,PHASE_MOD,FREQ_MOD,PITCH_MOD};
    
   /*****************************************************************/
   /*                    GLOBAL PARAMETERS                          */
   /*****************************************************************/

    struct ADnoteGlobalParam{
	
       /* 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{

        /* If the voice is enabled */
        unsigned char Enabled; 

	/* 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 Presets{
    public:
	ADnoteParameters(FFTwrapper *fft_);
	~ADnoteParameters();

	ADnoteGlobalParam GlobalPar;
	ADnoteVoiceParam VoicePar[NUM_VOICES];

	void defaults();
	void add2XML(XMLwrapper *xml);
        void getfromXML(XMLwrapper *xml);

	REALTYPE getBandwidthDetuneMultiplier();
    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