/*
  ZynAddSubFX - a software synthesizer
 
  PADnoteParameters.h - Parameters for PADnote (PADsynth)  
  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 PAD_NOTE_PARAMETERS_H
#define PAD_NOTE_PARAMETERS_H

#include "../Misc/XMLwrapper.h"
#include "../DSP/FFTwrapper.h"
#include "../globals.h"
#include "../Synth/OscilGen.h"
#include "../Synth/Resonance.h"
#include "../Misc/Util.h"

#include "EnvelopeParams.h"
#include "LFOParams.h"
#include "FilterParams.h"
#include "Presets.h"

class Master;

class PADnoteParameters:public Presets{
    public:
	PADnoteParameters(FFTwrapper *fft_,Master* master);
	~PADnoteParameters();
	
	void defaults();
	void add2XML(XMLwrapper *xml);
        void getfromXML(XMLwrapper *xml);
	
	//returns a value between 0.0-1.0 that represents the estimation perceived bandwidth
	REALTYPE getprofile(REALTYPE *smp,int size);
	
	//parameters
	
	//the mode: 0 - bandwidth, 1 - discrete (bandwidth=0), 2 - continous
	//the harmonic profile is used only on mode 0
	unsigned char Pmode;
	
	//Harmonic profile (the frequency distribution of a single harmonic)
	struct {
	    struct{//base function 
		unsigned char type;
		unsigned char par1;
	    }base;
	    unsigned char freqmult;//frequency multiplier of the distribution
	    struct{//the modulator of the distribution 
		unsigned char par1;
		unsigned char freq;
	    }modulator;
	    
	    unsigned char width;//the width of the resulting function after the modulation
	    struct{//the amplitude multiplier of the harmonic profile
		unsigned char mode;
		unsigned char type;
		unsigned char par1;
		unsigned char par2;
	    }amp;
	    bool autoscale;//if the scale of the harmonic profile is computed automaticaly
	    unsigned char onehalf;//what part of the base function is used to make the distribution
	}Php;

	
	unsigned int Pbandwidth;//the values are from 0 to 1000 
	unsigned char Pbwscale;//how the bandwidth is increased according to the harmonic's frequency
	
	struct{//where are positioned the harmonics (on integer multimplier or different places)
	    unsigned char type;
	    unsigned char par1,par2,par3;//0..255
	}Phrpos;

	struct {//quality of the samples (how many samples, the length of them,etc.)
	    unsigned char samplesize;
	    unsigned char basenote,oct,smpoct;
	} Pquality;
	
	//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;
	unsigned short int PDetune;//fine detune
	unsigned short int PCoarseDetune;//coarse detune+octave
	unsigned char PDetuneType;//detune type

	EnvelopeParams *FreqEnvelope; //Frequency Envelope
    	LFOParams *FreqLfo;//Frequency LFO

	//Amplitude parameters
	unsigned char PStereo;
	/* 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 Parameters
	FilterParams *GlobalFilter;

	// filter velocity sensing
	unsigned char PFilterVelocityScale; 

	// filter velocity sensing
	unsigned char PFilterVelocityScaleFunction;
    
	EnvelopeParams *FilterEnvelope;
	LFOParams *FilterLfo;
	


	
	REALTYPE setPbandwidth(int Pbandwidth);//returns the BandWidth in cents
	REALTYPE getNhr(int n);//gets the n-th overtone position relatively to N harmonic

	void applyparameters(bool lockmutex);

	OscilGen *oscilgen;
	Resonance *resonance;
	
	struct{
	    int size;
	    REALTYPE basefreq;
	    REALTYPE *smp;
	}sample[PAD_MAX_SAMPLES],newsample;
	
    private:
	void generatespectrum_bandwidthMode(REALTYPE *spectrum, int size,REALTYPE basefreq,REALTYPE *profile,int profilesize,REALTYPE bwadjust);
	void generatespectrum_otherModes(REALTYPE *spectrum, int size,REALTYPE basefreq,REALTYPE *profile,int profilesize,REALTYPE bwadjust);
	void deletesamples();
	void deletesample(int n);
    
	FFTwrapper *fft;
	Master* master;
};



#endif