class Module(BaseModule):
    """
    "Phase Vocoder based vectral module (spectral gate and verb)"
    
    Description

    This module implements a spectral gate followed by a spectral reverb.

    Sliders
    
        # Gate Threshold : 
            dB value at which the gate becomes active
        # Gate Attenuation : 
            Gain in dB of the gated signal
        # Time Factor : 
            Filter coefficient for decreasing bins
        # High Freq Damping : 
            High frequencies damping factor
        # Dry / Wet : 
            Mix between the original signal and the delayed signals
    
    Graph Only
    
        # Overall Amplitude : 
            The amplitude curve applied on the total duration of the performance

    Popups & Toggles

        # FFT Size : 
            Size, in samples, of the FFT
        # FFT Envelope : 
            Windowing shape of the FFT
        # FFT Overlaps : 
            Number of FFT overlaping analysis
        # Polyphony Voices : 
            Number of voices played simultaneously (polyphony), 
            only available at initialization time
        # Polyphony Spread : 
            Pitch variation between voices (chorus), 
            only available at initialization time

    """
    def __init__(self):
        BaseModule.__init__(self)
        self.snd = self.addSampler("snd")

        size = int(self.fftsize_value)
        olaps = int(self.overlaps_value)
        wintype = self.wtype_index
        self.oneOverSr = 1.0 / self.sr

        self.delsrc = Delay(self.snd, delay=size*self.oneOverSr)

        self.fin = PVAnal(self.snd, size=size, overlaps=olaps, wintype=wintype)
        self.gate = PVGate(self.fin, self.gthresh, DBToA(self.gatt))
        self.vect = PVVerb(self.gate, self.downfac, self.damp)
        self.fout = PVSynth(self.vect, wintype=wintype, mul=self.env)

        self.fade = SigTo(value=1, time=.05, init=1)
        self.out = Interp(self.delsrc*self.env, self.fout, self.mix, mul=self.fade)

    def fftsize(self, index, value):
        newsize = int(value)
        self.fade.value = 0
        time.sleep(.05)
        self.delsrc.delay = newsize*self.oneOverSr
        self.fin.size = newsize
        time.sleep(.05)
        self.fade.value = 1

    def overlaps(self, index, value):
        olaps = int(value)
        self.fade.value = 0
        time.sleep(.05)
        self.fin.overlaps = olaps
        time.sleep(.05)
        self.fade.value = 1

    def wtype(self, index, value):
        self.fin.wintype = index
        self.fout.wintype = index

Interface = [   csampler(name="snd"), 
                cgraph(name="env", label="Overall Amplitude", func=[(0,1),(1,1)], col="blue"),
                cslider(name="gthresh", label="Gate Threshold", min=-120, max=0, init=-30, rel="lin", unit="db", col="red"),
                cslider(name="gatt", label="Gate Attenuation", min=-120, max=0, init=-120, rel="lin", unit="db", col="red"),
                cslider(name="downfac", label="Time Factor", min=0, max=1, init=0.3, rel="lin", unit="x", col="orange"),
                cslider(name="damp", label="High Freq Damping", min=0, max=1, init=0.9, rel="lin", unit="x", col="green"),
                cslider(name="mix", label="Dry / Wet", min=0, max=1, init=1, rel="lin", unit="x", col="blue"),
                cpopup(name="fftsize", label="FFT Size", init="1024", value=["16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192"], col="red"),
                cpopup(name="wtype", label="FFT Envelope", init="Hanning", col="red", value=["Rectangular", "Hamming", "Hanning", "Bartlett",
                            "Blackman 3", "Blackman 4", "Blackman 7", "Tuckey", "Sine"]),
                cpopup(name="overlaps", label="FFT Overlaps", init="4", value=["1", "2", "4", "8", "16"]),
                cpoly()
          ]

