/*
==============================================================================

Vocoder.h
Created: 09 February 2017 12:36:11pm
Author:  Mathieu Carre

==============================================================================
*/

#ifndef VOCODEUR_H_INCLUDED
#define VOCODEUR_H_INCLUDED

#include <cmath>
#include <vector>

#include "EnvelopeDetector.h"
#include "NoiseOscillator.h"
#include "WavetableOscillator.h"
#include "PitchTracker.h"
#include "VocoderRingBuffer.h"
#include "Window.h"
#include "KrotosSmoothedValue.h"
#include "audio-analysis-framework/AudioAnalysisFramework.h"

using namespace std;

// #define GENERATEWINDOW

class Vocoder
{
public:
    enum class Carrier
    {
        OscillatorPitchTracking = 1,
        OscillatorFrequencySetByUI,
        Noise,
        External,
        NumberOfCarrierType
    };

    Vocoder(AK::IAkPluginMemAlloc* in_pAllocator);

    void prepareToPlay(int samplingRate, AK::IAkPluginMemAlloc* in_pAllocator);
    void processBlock(vector<float> &buffer);
    void processBlock(vector<float> &buffer, vector<float> &externalCarrier);

    void setCarrier(Carrier carrier);
    void setCarrierFrequency(float carrierFrequency);
    void setCarrierFrequencyMax(float carrierFrequencyMax);
    void setCarrierFrequencyMin(float carrierFrequencyMin);
    void setCarrierWaveform(WaveShapes waveform);
    void setGainBin(float gain, unsigned int bandNumber, unsigned int numberOfBands);
    void setEnvelopAttackTime(float attackTimeInSeconds);
    void setEnvelopReleaseTime(float releaseTimeInSeconds);
    void setPitchTrackerAlgorithm(PitchTracker::Algorithm algorithm);

    ////Constants to initialize UI
    //Oscillator
    const float m_oscillatorFrequencyInit{ 100.0f };
    const float m_oscillatorFrequencyMinInit { 10.0f };
    const float m_oscillatorFrequencyMaxInit { 1000.0f };
    const WaveShapes m_oscillatorShapeInit{ WaveShapes::Sawtooth };

    //Envelope Detector
    const float m_envelopeDetectorAttackTimeInSecInit  { 1.0f / 1000.0f };
    const float m_envelopeDetectorReleaseTimeInSecInit { 1.0f / 1000.0f };

    //EQ
    const float m_eqGainInLinearInit{ 1.0f };

    //Pitch Tracker
    const PitchTracker::Algorithm m_pitchTrackerAlgorithmInit { PitchTracker::Algorithm::SpectrumBased };

private:
    //Methods
    void applyWindow(float* buffer, float* window, int bufferSize);
    void applyEqGainsOnCarrierSpectrum(kiss_fft_cpx* inputFft, int fftSize, float* gainBuffer);
	void applyEqGainsOnCarrierSpectrum(float* fftBuffer, int fftSize, float* gainBuffer);
    void applyModulatorSpectralEnvelopeToCarrier(kiss_fft_cpx* carrierSpectrum, float* modulatorSpectrum, int halfFftSize);
	void applyModulatorSpectralEnvelopeToCarrier(float* fftBuffer, float* modulatorSpectrum, int halfFftSize);
    void calculateEqualTemperamentNoteFrequencies(vector<float>& noteFrequencies);
    void extractSpectralEnvelope(kiss_fft_cpx* inputFft, int fftSize, float* outputMagnitude, float normalizationCoefficient);
	void extractSpectralEnvelope(float* fftBuffer, int fftSize, float* outputMagnitude, float normalizationCoefficient);
    float findMaxLocationUsingquadraticInterpolation(float yMinusOne, float yZero, float yPlusOne);
    float findNearestValueInVector(float value, vector<float> vector);
    bool sumOfOverlappingWindowsIsConstantTest();
    void updateCarrierFrequency(float* buffer, kiss_fft_cpx* bufferFft);
	void updateCarrierFrequency(float* fftBuffer);

    //Parameters
    int m_samplingRate { 44100 };
#ifdef GENERATEWINDOW
    Window<float>::Type analysisWindowType    { Window<float>::HannSquareRoot };
#endif
    Window<float>::Type synthesisWindowType   { Window<float>::HannSquareRoot };
    static const int m_analysisWindowSize     { 1024 };
    static const int m_overlappingCoefficient { 2 };

    //Constants
    static const int m_synthesisWindowSize { m_analysisWindowSize };
    static const int m_analysisHopSize     { m_analysisWindowSize  / m_overlappingCoefficient };
    static const int m_synthesisHopSize    { m_synthesisWindowSize / m_overlappingCoefficient };
    const int m_analysisBufferSize         { 2048 };
    const int m_synthesisBufferSize        { m_analysisBufferSize };
    static const int m_internalBufferSize  { 2 * m_analysisWindowSize };

    const float m_fftNormalizationCoefficient;
    static const int m_fftSize  { m_analysisWindowSize };
    const int m_nyquistBinIndex { m_analysisWindowSize / 2};

    const WavetableOscillator::Interpolation m_oscillatorInterpolation { WavetableOscillator::CUBIC };
    const float m_noiseOscillatorMin { -1.0f };
    const float m_noiseOscillatorMax { 1.0f };

    const static int numberOfEnvelopeDetectors { m_fftSize / 2 + 1 };
    const DetectionMode m_envelopeDetectorMode { DetectionMode::Peak };
    const bool m_envelopeDetectorLookAhead     { false };

    //Buffers
#ifdef GENERATEWINDOW
    float m_analysisWindow  [m_analysisWindowSize];
    float m_synthesisWindow [m_synthesisWindowSize];
#else
	float* m_analysisWindow;
	float* m_synthesisWindow;
#endif
    VocoderRingBuffer m_analysisFIFO;
    VocoderRingBuffer m_oscillatorFIFO;
    VocoderRingBuffer m_synthesisFIFO;

    float m_internalBuffer[m_internalBufferSize];

    // float m_fftMagnitude[m_fftSize];
    float m_modulatorFftMagnitude[m_fftSize];

    float m_eqGain[m_analysisWindowSize]; 

    //FFT
	FastFourierTransform fft;

    //Carrier Oscillators
    WavetableOscillator m_oscillator;
    float m_oscillatorBuffer [2 * m_analysisWindowSize];
    Carrier m_carrier        { Carrier::OscillatorPitchTracking };
    float m_carrierFrequency { m_oscillatorFrequencyInit };
    vector <float> m_equalTemperamentNoteFrequencies;
    float m_oscillatorFrequencyMin { m_oscillatorFrequencyMinInit };
    float m_oscillatorFrequencyMax { m_oscillatorFrequencyMaxInit };

    NoiseOscillator noiseOscillator;

    //Pitch tracker
    PitchTracker m_pitchTracker;
	vector<float> m_pitchTrackerBuffer;
	const int m_pitchTrackerBufferSize { m_analysisWindowSize };
	KrotosSmoothedValue m_pitchInterpolator;
    PitchTracker::Algorithm m_pitchTrackerAlgorithm { m_pitchTrackerAlgorithmInit };
    bool m_pitchTrackerAlgorithmHasChanged { false };

    //Envelope Detectors
    EnvelopeDetector envelopeDetectors[numberOfEnvelopeDetectors];

#ifndef GENERATEWINDOW
	float m_analysis[1024] = { 0.00000000000f, 0.00306795677f, 0.00613588467f, 0.00920375437f, 0.01227153838f, 0.01533920690f, 0.01840673015f, 0.02147408016f, 0.02454122715f, 0.02760814503f, 0.03067480400f, 0.03374117240f, 0.03680722415f, 0.03987292945f, 0.04293825850f, 0.04600318149f, 0.04906767607f, 0.05213170499f, 0.05519524217f, 0.05825826526f, 0.06132073700f, 0.06438262761f, 0.06744392216f, 0.07050456852f, 0.07356456667f, 0.07662386447f, 0.07968243957f, 0.08274026215f, 0.08579730988f, 0.08885355294f, 0.09190895408f, 0.09496349841f, 0.09801714122f, 0.10106986761f, 0.10412163287f, 0.10717242211f, 0.11022220552f, 0.11327095330f, 0.11631863564f, 0.11936521530f, 0.12241066992f, 0.12545497715f, 0.12849810719f, 0.13154003024f, 0.13458070159f, 0.13762012124f, 0.14065824449f, 0.14369504154f, 0.14673048258f, 0.14976453781f, 0.15279717743f, 0.15582840145f, 0.15885815024f, 0.16188639402f, 0.16491311789f, 0.16793829203f, 0.17096188664f, 0.17398387194f, 0.17700421810f, 0.18002289534f, 0.18303988874f, 0.18605515361f, 0.18906866014f, 0.19208039343f, 0.19509032369f, 0.19809840620f, 0.20110464096f, 0.20410896838f, 0.20711137354f, 0.21011184156f, 0.21311032772f, 0.21610678732f, 0.21910123527f, 0.22209362686f, 0.22508391738f, 0.22807209194f, 0.23105810583f, 0.23404195905f, 0.23702360690f, 0.24000301957f, 0.24298018217f, 0.24595504999f, 0.24892760813f, 0.25189781189f, 0.25486564636f, 0.25783109665f, 0.26079410315f, 0.26375469565f, 0.26671275496f, 0.26966831088f, 0.27262136340f, 0.27557182312f, 0.27851969004f, 0.28146493435f, 0.28440752625f, 0.28734746575f, 0.29028469324f, 0.29321917892f, 0.29615089297f, 0.29907983541f, 0.30200594664f, 0.30492922664f, 0.30784964561f, 0.31076714396f, 0.31368175149f, 0.31659337878f, 0.31950202584f, 0.32240766287f, 0.32531028986f, 0.32820984721f, 0.33110630512f, 0.33399966359f, 0.33688986301f, 0.33977687359f, 0.34266072512f, 0.34554132819f, 0.34841868281f, 0.35129275918f, 0.35416352749f, 0.35703095794f, 0.35989505053f, 0.36275574565f, 0.36561298370f, 0.36846682429f, 0.37131720781f, 0.37416407466f, 0.37700742483f, 0.37984719872f, 0.38268342614f, 0.38551604748f, 0.38834506273f, 0.39117038250f, 0.39399203658f, 0.39680999517f, 0.39962419868f, 0.40243464708f, 0.40524131060f, 0.40804415941f, 0.41084316373f, 0.41363832355f, 0.41642954946f, 0.41921690106f, 0.42200025916f, 0.42477968335f, 0.42755508423f, 0.43032649159f, 0.43309381604f, 0.43585705757f, 0.43861624599f, 0.44137126207f, 0.44412213564f, 0.44686883688f, 0.44961133599f, 0.45234960318f, 0.45508357882f, 0.45781332254f, 0.46053871512f, 0.46325978637f, 0.46597647667f, 0.46868881583f, 0.47139674425f, 0.47410020232f, 0.47679921985f, 0.47949376702f, 0.48218378425f, 0.48486924171f, 0.48755016923f, 0.49022647738f, 0.49289819598f, 0.49556526542f, 0.49822768569f, 0.50088536739f, 0.50353837013f, 0.50618666410f, 0.50883013010f, 0.51146882772f, 0.51410275698f, 0.51673179865f, 0.51935601234f, 0.52197527885f, 0.52458971739f, 0.52719914913f, 0.52980363369f, 0.53240311146f, 0.53499764204f, 0.53758704662f, 0.54017144442f, 0.54275077581f, 0.54532498121f, 0.54789406061f, 0.55045795441f, 0.55301672220f, 0.55557024479f, 0.55811852217f, 0.56066155434f, 0.56319934130f, 0.56573182344f, 0.56825894117f, 0.57078075409f, 0.57329714298f, 0.57580816746f, 0.57831376791f, 0.58081394434f, 0.58330863714f, 0.58579784632f, 0.58828157187f, 0.59075969458f, 0.59323233366f, 0.59569931030f, 0.59816068411f, 0.60061645508f, 0.60306662321f, 0.60551100969f, 0.60794979334f, 0.61038279533f, 0.61281007528f, 0.61523157358f, 0.61764729023f, 0.62005722523f, 0.62246125937f, 0.62485951185f, 0.62725180387f, 0.62963825464f, 0.63201874495f, 0.63439327478f, 0.63676184416f, 0.63912445307f, 0.64148104191f, 0.64383155107f, 0.64617604017f, 0.64851438999f, 0.65084671974f, 0.65317285061f, 0.65549284220f, 0.65780669451f, 0.66011434793f, 0.66241580248f, 0.66471099854f, 0.66699993610f, 0.66928261518f, 0.67155897617f, 0.67382901907f, 0.67609268427f, 0.67835003138f, 0.68060100079f, 0.68284553289f, 0.68508368731f, 0.68731534481f, 0.68954056501f, 0.69175928831f, 0.69397145510f, 0.69617712498f, 0.69837623835f, 0.70056879520f, 0.70275473595f, 0.70493406057f, 0.70710676908f, 0.70927286148f, 0.71143221855f, 0.71358489990f, 0.71573084593f, 0.71787005663f, 0.72000247240f, 0.72212821245f, 0.72424703836f, 0.72635912895f, 0.72846442461f, 0.73056280613f, 0.73265427351f, 0.73473888636f, 0.73681658506f, 0.73888731003f, 0.74095112085f, 0.74300795794f, 0.74505776167f, 0.74710059166f, 0.74913638830f, 0.75116509199f, 0.75318682194f, 0.75520139933f, 0.75720882416f, 0.75920921564f, 0.76120239496f, 0.76318842173f, 0.76516723633f, 0.76713889837f, 0.76910334826f, 0.77106052637f, 0.77301043272f, 0.77495312691f, 0.77688848972f, 0.77881652117f, 0.78073722124f, 0.78265058994f, 0.78455662727f, 0.78645521402f, 0.78834640980f, 0.79023021460f, 0.79210656881f, 0.79397547245f, 0.79583692551f, 0.79769086838f, 0.79953724146f, 0.80137616396f, 0.80320751667f, 0.80503135920f, 0.80684757233f, 0.80865615606f, 0.81045717001f, 0.81225055456f, 0.81403636932f, 0.81581443548f, 0.81758481264f, 0.81934750080f, 0.82110249996f, 0.82284981012f, 0.82458931208f, 0.82632106543f, 0.82804501057f, 0.82976120710f, 0.83146959543f, 0.83317017555f, 0.83486288786f, 0.83654773235f, 0.83822470903f, 0.83989375830f, 0.84155493975f, 0.84320825338f, 0.84485358000f, 0.84649091959f, 0.84812033176f, 0.84974175692f, 0.85135519505f, 0.85296058655f, 0.85455799103f, 0.85614734888f, 0.85772860050f, 0.85930180550f, 0.86086696386f, 0.86242395639f, 0.86397284269f, 0.86551362276f, 0.86704623699f, 0.86857074499f, 0.87008696795f, 0.87159508467f, 0.87309497595f, 0.87458664179f, 0.87607008219f, 0.87754529715f, 0.87901222706f, 0.88047087193f, 0.88192129135f, 0.88336330652f, 0.88479709625f, 0.88622254133f, 0.88763964176f, 0.88904839754f, 0.89044874907f, 0.89184069633f, 0.89322429895f, 0.89459949732f, 0.89596623182f, 0.89732456207f, 0.89867448807f, 0.90001589060f, 0.90134882927f, 0.90267330408f, 0.90398931503f, 0.90529674292f, 0.90659570694f, 0.90788608789f, 0.90916800499f, 0.91044127941f, 0.91170603037f, 0.91296219826f, 0.91420978308f, 0.91544872522f, 0.91667908430f, 0.91790074110f, 0.91911381483f, 0.92031830549f, 0.92151403427f, 0.92270112038f, 0.92387956381f, 0.92504924536f, 0.92621022463f, 0.92736256123f, 0.92850607634f, 0.92964088917f, 0.93076694012f, 0.93188422918f, 0.93299281597f, 0.93409258127f, 0.93518352509f, 0.93626564741f, 0.93733900785f, 0.93840354681f, 0.93945920467f, 0.94050604105f, 0.94154405594f, 0.94257318974f, 0.94359344244f, 0.94460487366f, 0.94560730457f, 0.94660091400f, 0.94758558273f, 0.94856137037f, 0.94952815771f, 0.95048606396f, 0.95143502951f, 0.95237499475f, 0.95330607891f, 0.95422810316f, 0.95514112711f, 0.95604526997f, 0.95694035292f, 0.95782637596f, 0.95870345831f, 0.95957154036f, 0.96043050289f, 0.96128046513f, 0.96212142706f, 0.96295326948f, 0.96377605200f, 0.96458977461f, 0.96539443731f, 0.96618998051f, 0.96697646379f, 0.96775382757f, 0.96852213144f, 0.96928125620f, 0.97003126144f, 0.97077214718f, 0.97150391340f, 0.97222650051f, 0.97293996811f, 0.97364425659f, 0.97433936596f, 0.97502535582f, 0.97570210695f, 0.97636973858f, 0.97702813148f, 0.97767734528f, 0.97831737995f, 0.97894817591f, 0.97956979275f, 0.98018211126f, 0.98078525066f, 0.98137921095f, 0.98196387291f, 0.98253929615f, 0.98310548067f, 0.98366242647f, 0.98421013355f, 0.98474848270f, 0.98527765274f, 0.98579752445f, 0.98630809784f, 0.98680937290f, 0.98730140924f, 0.98778414726f, 0.98825758696f, 0.98872166872f, 0.98917651176f, 0.98962205648f, 0.99005818367f, 0.99048507214f, 0.99090266228f, 0.99131089449f, 0.99170976877f, 0.99209928513f, 0.99247956276f, 0.99285042286f, 0.99321192503f, 0.99356412888f, 0.99390697479f, 0.99424046278f, 0.99456459284f, 0.99487936497f, 0.99518471956f, 0.99548077583f, 0.99576741457f, 0.99604469538f, 0.99631261826f, 0.99657112360f, 0.99682033062f, 0.99706006050f, 0.99729043245f, 0.99751144648f, 0.99772310257f, 0.99792528152f, 0.99811810255f, 0.99830156565f, 0.99847561121f, 0.99864017963f, 0.99879544973f, 0.99894130230f, 0.99907773733f, 0.99920475483f, 0.99932241440f, 0.99943059683f, 0.99952942133f, 0.99961882830f, 0.99969881773f, 0.99976938963f, 0.99983060360f, 0.99988234043f, 0.99992471933f, 0.99995762110f, 0.99998116493f, 0.99999529123f, 1.00000000000f, 0.99999529123f, 0.99998116493f, 0.99995762110f, 0.99992471933f, 0.99988234043f, 0.99983060360f, 0.99976938963f, 0.99969881773f, 0.99961882830f, 0.99952942133f, 0.99943059683f, 0.99932241440f, 0.99920475483f, 0.99907773733f, 0.99894130230f, 0.99879544973f, 0.99864017963f, 0.99847561121f, 0.99830156565f, 0.99811810255f, 0.99792528152f, 0.99772310257f, 0.99751144648f, 0.99729043245f, 0.99706006050f, 0.99682033062f, 0.99657112360f, 0.99631261826f, 0.99604469538f, 0.99576741457f, 0.99548077583f, 0.99518471956f, 0.99487936497f, 0.99456459284f, 0.99424046278f, 0.99390697479f, 0.99356412888f, 0.99321192503f, 0.99285042286f, 0.99247956276f, 0.99209928513f, 0.99170976877f, 0.99131089449f, 0.99090266228f, 0.99048507214f, 0.99005818367f, 0.98962205648f, 0.98917651176f, 0.98872166872f, 0.98825758696f, 0.98778414726f, 0.98730140924f, 0.98680937290f, 0.98630809784f, 0.98579752445f, 0.98527765274f, 0.98474848270f, 0.98421013355f, 0.98366242647f, 0.98310548067f, 0.98253929615f, 0.98196387291f, 0.98137921095f, 0.98078525066f, 0.98018211126f, 0.97956979275f, 0.97894817591f, 0.97831737995f, 0.97767734528f, 0.97702813148f, 0.97636973858f, 0.97570210695f, 0.97502535582f, 0.97433936596f, 0.97364425659f, 0.97293996811f, 0.97222650051f, 0.97150391340f, 0.97077214718f, 0.97003126144f, 0.96928125620f, 0.96852213144f, 0.96775382757f, 0.96697646379f, 0.96618998051f, 0.96539443731f, 0.96458977461f, 0.96377605200f, 0.96295326948f, 0.96212142706f, 0.96128046513f, 0.96043050289f, 0.95957154036f, 0.95870345831f, 0.95782637596f, 0.95694035292f, 0.95604526997f, 0.95514112711f, 0.95422810316f, 0.95330607891f, 0.95237499475f, 0.95143502951f, 0.95048606396f, 0.94952815771f, 0.94856137037f, 0.94758558273f, 0.94660091400f, 0.94560730457f, 0.94460487366f, 0.94359344244f, 0.94257318974f, 0.94154405594f, 0.94050604105f, 0.93945920467f, 0.93840354681f, 0.93733900785f, 0.93626564741f, 0.93518352509f, 0.93409258127f, 0.93299281597f, 0.93188422918f, 0.93076694012f, 0.92964088917f, 0.92850607634f, 0.92736256123f, 0.92621022463f, 0.92504924536f, 0.92387956381f, 0.92270112038f, 0.92151403427f, 0.92031830549f, 0.91911381483f, 0.91790074110f, 0.91667908430f, 0.91544872522f, 0.91420978308f, 0.91296219826f, 0.91170603037f, 0.91044127941f, 0.90916800499f, 0.90788608789f, 0.90659570694f, 0.90529674292f, 0.90398931503f, 0.90267330408f, 0.90134882927f, 0.90001589060f, 0.89867448807f, 0.89732456207f, 0.89596623182f, 0.89459949732f, 0.89322429895f, 0.89184069633f, 0.89044874907f, 0.88904839754f, 0.88763964176f, 0.88622254133f, 0.88479709625f, 0.88336330652f, 0.88192129135f, 0.88047087193f, 0.87901222706f, 0.87754529715f, 0.87607008219f, 0.87458664179f, 0.87309497595f, 0.87159508467f, 0.87008696795f, 0.86857074499f, 0.86704623699f, 0.86551362276f, 0.86397284269f, 0.86242395639f, 0.86086696386f, 0.85930180550f, 0.85772860050f, 0.85614734888f, 0.85455799103f, 0.85296058655f, 0.85135519505f, 0.84974175692f, 0.84812033176f, 0.84649091959f, 0.84485358000f, 0.84320825338f, 0.84155493975f, 0.83989375830f, 0.83822470903f, 0.83654773235f, 0.83486288786f, 0.83317017555f, 0.83146959543f, 0.82976120710f, 0.82804501057f, 0.82632106543f, 0.82458931208f, 0.82284981012f, 0.82110249996f, 0.81934750080f, 0.81758481264f, 0.81581443548f, 0.81403636932f, 0.81225055456f, 0.81045717001f, 0.80865615606f, 0.80684757233f, 0.80503135920f, 0.80320751667f, 0.80137616396f, 0.79953724146f, 0.79769086838f, 0.79583692551f, 0.79397547245f, 0.79210656881f, 0.79023021460f, 0.78834640980f, 0.78645521402f, 0.78455662727f, 0.78265058994f, 0.78073722124f, 0.77881652117f, 0.77688848972f, 0.77495312691f, 0.77301043272f, 0.77106052637f, 0.76910334826f, 0.76713889837f, 0.76516723633f, 0.76318842173f, 0.76120239496f, 0.75920921564f, 0.75720882416f, 0.75520139933f, 0.75318682194f, 0.75116509199f, 0.74913638830f, 0.74710059166f, 0.74505776167f, 0.74300795794f, 0.74095112085f, 0.73888731003f, 0.73681658506f, 0.73473888636f, 0.73265427351f, 0.73056280613f, 0.72846442461f, 0.72635912895f, 0.72424703836f, 0.72212821245f, 0.72000247240f, 0.71787005663f, 0.71573084593f, 0.71358489990f, 0.71143221855f, 0.70927286148f, 0.70710676908f, 0.70493406057f, 0.70275473595f, 0.70056879520f, 0.69837623835f, 0.69617712498f, 0.69397145510f, 0.69175928831f, 0.68954056501f, 0.68731534481f, 0.68508368731f, 0.68284553289f, 0.68060100079f, 0.67835003138f, 0.67609268427f, 0.67382901907f, 0.67155897617f, 0.66928261518f, 0.66699993610f, 0.66471099854f, 0.66241580248f, 0.66011434793f, 0.65780669451f, 0.65549284220f, 0.65317285061f, 0.65084671974f, 0.64851438999f, 0.64617604017f, 0.64383155107f, 0.64148104191f, 0.63912445307f, 0.63676184416f, 0.63439327478f, 0.63201874495f, 0.62963825464f, 0.62725180387f, 0.62485951185f, 0.62246125937f, 0.62005722523f, 0.61764729023f, 0.61523157358f, 0.61281007528f, 0.61038279533f, 0.60794979334f, 0.60551100969f, 0.60306662321f, 0.60061645508f, 0.59816068411f, 0.59569931030f, 0.59323233366f, 0.59075969458f, 0.58828157187f, 0.58579784632f, 0.58330863714f, 0.58081394434f, 0.57831376791f, 0.57580816746f, 0.57329714298f, 0.57078075409f, 0.56825894117f, 0.56573182344f, 0.56319934130f, 0.56066155434f, 0.55811852217f, 0.55557024479f, 0.55301672220f, 0.55045795441f, 0.54789406061f, 0.54532498121f, 0.54275077581f, 0.54017144442f, 0.53758704662f, 0.53499764204f, 0.53240311146f, 0.52980363369f, 0.52719914913f, 0.52458971739f, 0.52197527885f, 0.51935601234f, 0.51673179865f, 0.51410275698f, 0.51146882772f, 0.50883013010f, 0.50618666410f, 0.50353837013f, 0.50088536739f, 0.49822768569f, 0.49556526542f, 0.49289819598f, 0.49022647738f, 0.48755016923f, 0.48486924171f, 0.48218378425f, 0.47949376702f, 0.47679921985f, 0.47410020232f, 0.47139674425f, 0.46868881583f, 0.46597647667f, 0.46325978637f, 0.46053871512f, 0.45781332254f, 0.45508357882f, 0.45234960318f, 0.44961133599f, 0.44686883688f, 0.44412213564f, 0.44137126207f, 0.43861624599f, 0.43585705757f, 0.43309381604f, 0.43032649159f, 0.42755508423f, 0.42477968335f, 0.42200025916f, 0.41921690106f, 0.41642954946f, 0.41363832355f, 0.41084316373f, 0.40804415941f, 0.40524131060f, 0.40243464708f, 0.39962419868f, 0.39680999517f, 0.39399203658f, 0.39117038250f, 0.38834506273f, 0.38551604748f, 0.38268342614f, 0.37984719872f, 0.37700742483f, 0.37416407466f, 0.37131720781f, 0.36846682429f, 0.36561298370f, 0.36275574565f, 0.35989505053f, 0.35703095794f, 0.35416352749f, 0.35129275918f, 0.34841868281f, 0.34554132819f, 0.34266072512f, 0.33977687359f, 0.33688986301f, 0.33399966359f, 0.33110630512f, 0.32820984721f, 0.32531028986f, 0.32240766287f, 0.31950202584f, 0.31659337878f, 0.31368175149f, 0.31076714396f, 0.30784964561f, 0.30492922664f, 0.30200594664f, 0.29907983541f, 0.29615089297f, 0.29321917892f, 0.29028469324f, 0.28734746575f, 0.28440752625f, 0.28146493435f, 0.27851969004f, 0.27557182312f, 0.27262136340f, 0.26966831088f, 0.26671275496f, 0.26375469565f, 0.26079410315f, 0.25783109665f, 0.25486564636f, 0.25189781189f, 0.24892760813f, 0.24595504999f, 0.24298018217f, 0.24000301957f, 0.23702360690f, 0.23404195905f, 0.23105810583f, 0.22807209194f, 0.22508391738f, 0.22209362686f, 0.21910123527f, 0.21610678732f, 0.21311032772f, 0.21011184156f, 0.20711137354f, 0.20410896838f, 0.20110464096f, 0.19809840620f, 0.19509032369f, 0.19208039343f, 0.18906866014f, 0.18605515361f, 0.18303988874f, 0.18002289534f, 0.17700421810f, 0.17398387194f, 0.17096188664f, 0.16793829203f, 0.16491311789f, 0.16188639402f, 0.15885815024f, 0.15582840145f, 0.15279717743f, 0.14976453781f, 0.14673048258f, 0.14369504154f, 0.14065824449f, 0.13762012124f, 0.13458070159f, 0.13154003024f, 0.12849810719f, 0.12545497715f, 0.12241066992f, 0.11936521530f, 0.11631863564f, 0.11327095330f, 0.11022220552f, 0.10717242211f, 0.10412163287f, 0.10106986761f, 0.09801714122f, 0.09496349841f, 0.09190895408f, 0.08885355294f, 0.08579730988f, 0.08274026215f, 0.07968243957f, 0.07662386447f, 0.07356456667f, 0.07050456852f, 0.06744392216f, 0.06438262761f, 0.06132073700f, 0.05825826526f, 0.05519524217f, 0.05213170499f, 0.04906767607f, 0.04600318149f, 0.04293825850f, 0.03987292945f, 0.03680722415f, 0.03374117240f, 0.03067480400f, 0.02760814503f, 0.02454122715f, 0.02147408016f, 0.01840673015f, 0.01533920690f, 0.01227153838f, 0.00920375437f, 0.00613588467f, 0.00306795677f };
	float m_synthesis[1024] = { 0.00000000000f, 0.00306795677f, 0.00613588467f, 0.00920375437f, 0.01227153838f, 0.01533920690f, 0.01840673015f, 0.02147408016f, 0.02454122715f, 0.02760814503f, 0.03067480400f, 0.03374117240f, 0.03680722415f, 0.03987292945f, 0.04293825850f, 0.04600318149f, 0.04906767607f, 0.05213170499f, 0.05519524217f, 0.05825826526f, 0.06132073700f, 0.06438262761f, 0.06744392216f, 0.07050456852f, 0.07356456667f, 0.07662386447f, 0.07968243957f, 0.08274026215f, 0.08579730988f, 0.08885355294f, 0.09190895408f, 0.09496349841f, 0.09801714122f, 0.10106986761f, 0.10412163287f, 0.10717242211f, 0.11022220552f, 0.11327095330f, 0.11631863564f, 0.11936521530f, 0.12241066992f, 0.12545497715f, 0.12849810719f, 0.13154003024f, 0.13458070159f, 0.13762012124f, 0.14065824449f, 0.14369504154f, 0.14673048258f, 0.14976453781f, 0.15279717743f, 0.15582840145f, 0.15885815024f, 0.16188639402f, 0.16491311789f, 0.16793829203f, 0.17096188664f, 0.17398387194f, 0.17700421810f, 0.18002289534f, 0.18303988874f, 0.18605515361f, 0.18906866014f, 0.19208039343f, 0.19509032369f, 0.19809840620f, 0.20110464096f, 0.20410896838f, 0.20711137354f, 0.21011184156f, 0.21311032772f, 0.21610678732f, 0.21910123527f, 0.22209362686f, 0.22508391738f, 0.22807209194f, 0.23105810583f, 0.23404195905f, 0.23702360690f, 0.24000301957f, 0.24298018217f, 0.24595504999f, 0.24892760813f, 0.25189781189f, 0.25486564636f, 0.25783109665f, 0.26079410315f, 0.26375469565f, 0.26671275496f, 0.26966831088f, 0.27262136340f, 0.27557182312f, 0.27851969004f, 0.28146493435f, 0.28440752625f, 0.28734746575f, 0.29028469324f, 0.29321917892f, 0.29615089297f, 0.29907983541f, 0.30200594664f, 0.30492922664f, 0.30784964561f, 0.31076714396f, 0.31368175149f, 0.31659337878f, 0.31950202584f, 0.32240766287f, 0.32531028986f, 0.32820984721f, 0.33110630512f, 0.33399966359f, 0.33688986301f, 0.33977687359f, 0.34266072512f, 0.34554132819f, 0.34841868281f, 0.35129275918f, 0.35416352749f, 0.35703095794f, 0.35989505053f, 0.36275574565f, 0.36561298370f, 0.36846682429f, 0.37131720781f, 0.37416407466f, 0.37700742483f, 0.37984719872f, 0.38268342614f, 0.38551604748f, 0.38834506273f, 0.39117038250f, 0.39399203658f, 0.39680999517f, 0.39962419868f, 0.40243464708f, 0.40524131060f, 0.40804415941f, 0.41084316373f, 0.41363832355f, 0.41642954946f, 0.41921690106f, 0.42200025916f, 0.42477968335f, 0.42755508423f, 0.43032649159f, 0.43309381604f, 0.43585705757f, 0.43861624599f, 0.44137126207f, 0.44412213564f, 0.44686883688f, 0.44961133599f, 0.45234960318f, 0.45508357882f, 0.45781332254f, 0.46053871512f, 0.46325978637f, 0.46597647667f, 0.46868881583f, 0.47139674425f, 0.47410020232f, 0.47679921985f, 0.47949376702f, 0.48218378425f, 0.48486924171f, 0.48755016923f, 0.49022647738f, 0.49289819598f, 0.49556526542f, 0.49822768569f, 0.50088536739f, 0.50353837013f, 0.50618666410f, 0.50883013010f, 0.51146882772f, 0.51410275698f, 0.51673179865f, 0.51935601234f, 0.52197527885f, 0.52458971739f, 0.52719914913f, 0.52980363369f, 0.53240311146f, 0.53499764204f, 0.53758704662f, 0.54017144442f, 0.54275077581f, 0.54532498121f, 0.54789406061f, 0.55045795441f, 0.55301672220f, 0.55557024479f, 0.55811852217f, 0.56066155434f, 0.56319934130f, 0.56573182344f, 0.56825894117f, 0.57078075409f, 0.57329714298f, 0.57580816746f, 0.57831376791f, 0.58081394434f, 0.58330863714f, 0.58579784632f, 0.58828157187f, 0.59075969458f, 0.59323233366f, 0.59569931030f, 0.59816068411f, 0.60061645508f, 0.60306662321f, 0.60551100969f, 0.60794979334f, 0.61038279533f, 0.61281007528f, 0.61523157358f, 0.61764729023f, 0.62005722523f, 0.62246125937f, 0.62485951185f, 0.62725180387f, 0.62963825464f, 0.63201874495f, 0.63439327478f, 0.63676184416f, 0.63912445307f, 0.64148104191f, 0.64383155107f, 0.64617604017f, 0.64851438999f, 0.65084671974f, 0.65317285061f, 0.65549284220f, 0.65780669451f, 0.66011434793f, 0.66241580248f, 0.66471099854f, 0.66699993610f, 0.66928261518f, 0.67155897617f, 0.67382901907f, 0.67609268427f, 0.67835003138f, 0.68060100079f, 0.68284553289f, 0.68508368731f, 0.68731534481f, 0.68954056501f, 0.69175928831f, 0.69397145510f, 0.69617712498f, 0.69837623835f, 0.70056879520f, 0.70275473595f, 0.70493406057f, 0.70710676908f, 0.70927286148f, 0.71143221855f, 0.71358489990f, 0.71573084593f, 0.71787005663f, 0.72000247240f, 0.72212821245f, 0.72424703836f, 0.72635912895f, 0.72846442461f, 0.73056280613f, 0.73265427351f, 0.73473888636f, 0.73681658506f, 0.73888731003f, 0.74095112085f, 0.74300795794f, 0.74505776167f, 0.74710059166f, 0.74913638830f, 0.75116509199f, 0.75318682194f, 0.75520139933f, 0.75720882416f, 0.75920921564f, 0.76120239496f, 0.76318842173f, 0.76516723633f, 0.76713889837f, 0.76910334826f, 0.77106052637f, 0.77301043272f, 0.77495312691f, 0.77688848972f, 0.77881652117f, 0.78073722124f, 0.78265058994f, 0.78455662727f, 0.78645521402f, 0.78834640980f, 0.79023021460f, 0.79210656881f, 0.79397547245f, 0.79583692551f, 0.79769086838f, 0.79953724146f, 0.80137616396f, 0.80320751667f, 0.80503135920f, 0.80684757233f, 0.80865615606f, 0.81045717001f, 0.81225055456f, 0.81403636932f, 0.81581443548f, 0.81758481264f, 0.81934750080f, 0.82110249996f, 0.82284981012f, 0.82458931208f, 0.82632106543f, 0.82804501057f, 0.82976120710f, 0.83146959543f, 0.83317017555f, 0.83486288786f, 0.83654773235f, 0.83822470903f, 0.83989375830f, 0.84155493975f, 0.84320825338f, 0.84485358000f, 0.84649091959f, 0.84812033176f, 0.84974175692f, 0.85135519505f, 0.85296058655f, 0.85455799103f, 0.85614734888f, 0.85772860050f, 0.85930180550f, 0.86086696386f, 0.86242395639f, 0.86397284269f, 0.86551362276f, 0.86704623699f, 0.86857074499f, 0.87008696795f, 0.87159508467f, 0.87309497595f, 0.87458664179f, 0.87607008219f, 0.87754529715f, 0.87901222706f, 0.88047087193f, 0.88192129135f, 0.88336330652f, 0.88479709625f, 0.88622254133f, 0.88763964176f, 0.88904839754f, 0.89044874907f, 0.89184069633f, 0.89322429895f, 0.89459949732f, 0.89596623182f, 0.89732456207f, 0.89867448807f, 0.90001589060f, 0.90134882927f, 0.90267330408f, 0.90398931503f, 0.90529674292f, 0.90659570694f, 0.90788608789f, 0.90916800499f, 0.91044127941f, 0.91170603037f, 0.91296219826f, 0.91420978308f, 0.91544872522f, 0.91667908430f, 0.91790074110f, 0.91911381483f, 0.92031830549f, 0.92151403427f, 0.92270112038f, 0.92387956381f, 0.92504924536f, 0.92621022463f, 0.92736256123f, 0.92850607634f, 0.92964088917f, 0.93076694012f, 0.93188422918f, 0.93299281597f, 0.93409258127f, 0.93518352509f, 0.93626564741f, 0.93733900785f, 0.93840354681f, 0.93945920467f, 0.94050604105f, 0.94154405594f, 0.94257318974f, 0.94359344244f, 0.94460487366f, 0.94560730457f, 0.94660091400f, 0.94758558273f, 0.94856137037f, 0.94952815771f, 0.95048606396f, 0.95143502951f, 0.95237499475f, 0.95330607891f, 0.95422810316f, 0.95514112711f, 0.95604526997f, 0.95694035292f, 0.95782637596f, 0.95870345831f, 0.95957154036f, 0.96043050289f, 0.96128046513f, 0.96212142706f, 0.96295326948f, 0.96377605200f, 0.96458977461f, 0.96539443731f, 0.96618998051f, 0.96697646379f, 0.96775382757f, 0.96852213144f, 0.96928125620f, 0.97003126144f, 0.97077214718f, 0.97150391340f, 0.97222650051f, 0.97293996811f, 0.97364425659f, 0.97433936596f, 0.97502535582f, 0.97570210695f, 0.97636973858f, 0.97702813148f, 0.97767734528f, 0.97831737995f, 0.97894817591f, 0.97956979275f, 0.98018211126f, 0.98078525066f, 0.98137921095f, 0.98196387291f, 0.98253929615f, 0.98310548067f, 0.98366242647f, 0.98421013355f, 0.98474848270f, 0.98527765274f, 0.98579752445f, 0.98630809784f, 0.98680937290f, 0.98730140924f, 0.98778414726f, 0.98825758696f, 0.98872166872f, 0.98917651176f, 0.98962205648f, 0.99005818367f, 0.99048507214f, 0.99090266228f, 0.99131089449f, 0.99170976877f, 0.99209928513f, 0.99247956276f, 0.99285042286f, 0.99321192503f, 0.99356412888f, 0.99390697479f, 0.99424046278f, 0.99456459284f, 0.99487936497f, 0.99518471956f, 0.99548077583f, 0.99576741457f, 0.99604469538f, 0.99631261826f, 0.99657112360f, 0.99682033062f, 0.99706006050f, 0.99729043245f, 0.99751144648f, 0.99772310257f, 0.99792528152f, 0.99811810255f, 0.99830156565f, 0.99847561121f, 0.99864017963f, 0.99879544973f, 0.99894130230f, 0.99907773733f, 0.99920475483f, 0.99932241440f, 0.99943059683f, 0.99952942133f, 0.99961882830f, 0.99969881773f, 0.99976938963f, 0.99983060360f, 0.99988234043f, 0.99992471933f, 0.99995762110f, 0.99998116493f, 0.99999529123f, 1.00000000000f, 0.99999529123f, 0.99998116493f, 0.99995762110f, 0.99992471933f, 0.99988234043f, 0.99983060360f, 0.99976938963f, 0.99969881773f, 0.99961882830f, 0.99952942133f, 0.99943059683f, 0.99932241440f, 0.99920475483f, 0.99907773733f, 0.99894130230f, 0.99879544973f, 0.99864017963f, 0.99847561121f, 0.99830156565f, 0.99811810255f, 0.99792528152f, 0.99772310257f, 0.99751144648f, 0.99729043245f, 0.99706006050f, 0.99682033062f, 0.99657112360f, 0.99631261826f, 0.99604469538f, 0.99576741457f, 0.99548077583f, 0.99518471956f, 0.99487936497f, 0.99456459284f, 0.99424046278f, 0.99390697479f, 0.99356412888f, 0.99321192503f, 0.99285042286f, 0.99247956276f, 0.99209928513f, 0.99170976877f, 0.99131089449f, 0.99090266228f, 0.99048507214f, 0.99005818367f, 0.98962205648f, 0.98917651176f, 0.98872166872f, 0.98825758696f, 0.98778414726f, 0.98730140924f, 0.98680937290f, 0.98630809784f, 0.98579752445f, 0.98527765274f, 0.98474848270f, 0.98421013355f, 0.98366242647f, 0.98310548067f, 0.98253929615f, 0.98196387291f, 0.98137921095f, 0.98078525066f, 0.98018211126f, 0.97956979275f, 0.97894817591f, 0.97831737995f, 0.97767734528f, 0.97702813148f, 0.97636973858f, 0.97570210695f, 0.97502535582f, 0.97433936596f, 0.97364425659f, 0.97293996811f, 0.97222650051f, 0.97150391340f, 0.97077214718f, 0.97003126144f, 0.96928125620f, 0.96852213144f, 0.96775382757f, 0.96697646379f, 0.96618998051f, 0.96539443731f, 0.96458977461f, 0.96377605200f, 0.96295326948f, 0.96212142706f, 0.96128046513f, 0.96043050289f, 0.95957154036f, 0.95870345831f, 0.95782637596f, 0.95694035292f, 0.95604526997f, 0.95514112711f, 0.95422810316f, 0.95330607891f, 0.95237499475f, 0.95143502951f, 0.95048606396f, 0.94952815771f, 0.94856137037f, 0.94758558273f, 0.94660091400f, 0.94560730457f, 0.94460487366f, 0.94359344244f, 0.94257318974f, 0.94154405594f, 0.94050604105f, 0.93945920467f, 0.93840354681f, 0.93733900785f, 0.93626564741f, 0.93518352509f, 0.93409258127f, 0.93299281597f, 0.93188422918f, 0.93076694012f, 0.92964088917f, 0.92850607634f, 0.92736256123f, 0.92621022463f, 0.92504924536f, 0.92387956381f, 0.92270112038f, 0.92151403427f, 0.92031830549f, 0.91911381483f, 0.91790074110f, 0.91667908430f, 0.91544872522f, 0.91420978308f, 0.91296219826f, 0.91170603037f, 0.91044127941f, 0.90916800499f, 0.90788608789f, 0.90659570694f, 0.90529674292f, 0.90398931503f, 0.90267330408f, 0.90134882927f, 0.90001589060f, 0.89867448807f, 0.89732456207f, 0.89596623182f, 0.89459949732f, 0.89322429895f, 0.89184069633f, 0.89044874907f, 0.88904839754f, 0.88763964176f, 0.88622254133f, 0.88479709625f, 0.88336330652f, 0.88192129135f, 0.88047087193f, 0.87901222706f, 0.87754529715f, 0.87607008219f, 0.87458664179f, 0.87309497595f, 0.87159508467f, 0.87008696795f, 0.86857074499f, 0.86704623699f, 0.86551362276f, 0.86397284269f, 0.86242395639f, 0.86086696386f, 0.85930180550f, 0.85772860050f, 0.85614734888f, 0.85455799103f, 0.85296058655f, 0.85135519505f, 0.84974175692f, 0.84812033176f, 0.84649091959f, 0.84485358000f, 0.84320825338f, 0.84155493975f, 0.83989375830f, 0.83822470903f, 0.83654773235f, 0.83486288786f, 0.83317017555f, 0.83146959543f, 0.82976120710f, 0.82804501057f, 0.82632106543f, 0.82458931208f, 0.82284981012f, 0.82110249996f, 0.81934750080f, 0.81758481264f, 0.81581443548f, 0.81403636932f, 0.81225055456f, 0.81045717001f, 0.80865615606f, 0.80684757233f, 0.80503135920f, 0.80320751667f, 0.80137616396f, 0.79953724146f, 0.79769086838f, 0.79583692551f, 0.79397547245f, 0.79210656881f, 0.79023021460f, 0.78834640980f, 0.78645521402f, 0.78455662727f, 0.78265058994f, 0.78073722124f, 0.77881652117f, 0.77688848972f, 0.77495312691f, 0.77301043272f, 0.77106052637f, 0.76910334826f, 0.76713889837f, 0.76516723633f, 0.76318842173f, 0.76120239496f, 0.75920921564f, 0.75720882416f, 0.75520139933f, 0.75318682194f, 0.75116509199f, 0.74913638830f, 0.74710059166f, 0.74505776167f, 0.74300795794f, 0.74095112085f, 0.73888731003f, 0.73681658506f, 0.73473888636f, 0.73265427351f, 0.73056280613f, 0.72846442461f, 0.72635912895f, 0.72424703836f, 0.72212821245f, 0.72000247240f, 0.71787005663f, 0.71573084593f, 0.71358489990f, 0.71143221855f, 0.70927286148f, 0.70710676908f, 0.70493406057f, 0.70275473595f, 0.70056879520f, 0.69837623835f, 0.69617712498f, 0.69397145510f, 0.69175928831f, 0.68954056501f, 0.68731534481f, 0.68508368731f, 0.68284553289f, 0.68060100079f, 0.67835003138f, 0.67609268427f, 0.67382901907f, 0.67155897617f, 0.66928261518f, 0.66699993610f, 0.66471099854f, 0.66241580248f, 0.66011434793f, 0.65780669451f, 0.65549284220f, 0.65317285061f, 0.65084671974f, 0.64851438999f, 0.64617604017f, 0.64383155107f, 0.64148104191f, 0.63912445307f, 0.63676184416f, 0.63439327478f, 0.63201874495f, 0.62963825464f, 0.62725180387f, 0.62485951185f, 0.62246125937f, 0.62005722523f, 0.61764729023f, 0.61523157358f, 0.61281007528f, 0.61038279533f, 0.60794979334f, 0.60551100969f, 0.60306662321f, 0.60061645508f, 0.59816068411f, 0.59569931030f, 0.59323233366f, 0.59075969458f, 0.58828157187f, 0.58579784632f, 0.58330863714f, 0.58081394434f, 0.57831376791f, 0.57580816746f, 0.57329714298f, 0.57078075409f, 0.56825894117f, 0.56573182344f, 0.56319934130f, 0.56066155434f, 0.55811852217f, 0.55557024479f, 0.55301672220f, 0.55045795441f, 0.54789406061f, 0.54532498121f, 0.54275077581f, 0.54017144442f, 0.53758704662f, 0.53499764204f, 0.53240311146f, 0.52980363369f, 0.52719914913f, 0.52458971739f, 0.52197527885f, 0.51935601234f, 0.51673179865f, 0.51410275698f, 0.51146882772f, 0.50883013010f, 0.50618666410f, 0.50353837013f, 0.50088536739f, 0.49822768569f, 0.49556526542f, 0.49289819598f, 0.49022647738f, 0.48755016923f, 0.48486924171f, 0.48218378425f, 0.47949376702f, 0.47679921985f, 0.47410020232f, 0.47139674425f, 0.46868881583f, 0.46597647667f, 0.46325978637f, 0.46053871512f, 0.45781332254f, 0.45508357882f, 0.45234960318f, 0.44961133599f, 0.44686883688f, 0.44412213564f, 0.44137126207f, 0.43861624599f, 0.43585705757f, 0.43309381604f, 0.43032649159f, 0.42755508423f, 0.42477968335f, 0.42200025916f, 0.41921690106f, 0.41642954946f, 0.41363832355f, 0.41084316373f, 0.40804415941f, 0.40524131060f, 0.40243464708f, 0.39962419868f, 0.39680999517f, 0.39399203658f, 0.39117038250f, 0.38834506273f, 0.38551604748f, 0.38268342614f, 0.37984719872f, 0.37700742483f, 0.37416407466f, 0.37131720781f, 0.36846682429f, 0.36561298370f, 0.36275574565f, 0.35989505053f, 0.35703095794f, 0.35416352749f, 0.35129275918f, 0.34841868281f, 0.34554132819f, 0.34266072512f, 0.33977687359f, 0.33688986301f, 0.33399966359f, 0.33110630512f, 0.32820984721f, 0.32531028986f, 0.32240766287f, 0.31950202584f, 0.31659337878f, 0.31368175149f, 0.31076714396f, 0.30784964561f, 0.30492922664f, 0.30200594664f, 0.29907983541f, 0.29615089297f, 0.29321917892f, 0.29028469324f, 0.28734746575f, 0.28440752625f, 0.28146493435f, 0.27851969004f, 0.27557182312f, 0.27262136340f, 0.26966831088f, 0.26671275496f, 0.26375469565f, 0.26079410315f, 0.25783109665f, 0.25486564636f, 0.25189781189f, 0.24892760813f, 0.24595504999f, 0.24298018217f, 0.24000301957f, 0.23702360690f, 0.23404195905f, 0.23105810583f, 0.22807209194f, 0.22508391738f, 0.22209362686f, 0.21910123527f, 0.21610678732f, 0.21311032772f, 0.21011184156f, 0.20711137354f, 0.20410896838f, 0.20110464096f, 0.19809840620f, 0.19509032369f, 0.19208039343f, 0.18906866014f, 0.18605515361f, 0.18303988874f, 0.18002289534f, 0.17700421810f, 0.17398387194f, 0.17096188664f, 0.16793829203f, 0.16491311789f, 0.16188639402f, 0.15885815024f, 0.15582840145f, 0.15279717743f, 0.14976453781f, 0.14673048258f, 0.14369504154f, 0.14065824449f, 0.13762012124f, 0.13458070159f, 0.13154003024f, 0.12849810719f, 0.12545497715f, 0.12241066992f, 0.11936521530f, 0.11631863564f, 0.11327095330f, 0.11022220552f, 0.10717242211f, 0.10412163287f, 0.10106986761f, 0.09801714122f, 0.09496349841f, 0.09190895408f, 0.08885355294f, 0.08579730988f, 0.08274026215f, 0.07968243957f, 0.07662386447f, 0.07356456667f, 0.07050456852f, 0.06744392216f, 0.06438262761f, 0.06132073700f, 0.05825826526f, 0.05519524217f, 0.05213170499f, 0.04906767607f, 0.04600318149f, 0.04293825850f, 0.03987292945f, 0.03680722415f, 0.03374117240f, 0.03067480400f, 0.02760814503f, 0.02454122715f, 0.02147408016f, 0.01840673015f, 0.01533920690f, 0.01227153838f, 0.00920375437f, 0.00613588467f, 0.00306795677f };
#endif
};

#endif
