class Module(BaseModule):
    """
    "Phase Vocoder buffer and playback with transposition"

    Description

    This module pre-analyses the input sound and keeps the
    phase vocoder frames in a buffer for the playback. User
    has control on playback position and transposition.
    
    Sliders
    
        # Position : 
            Normalized position (0 -> 1) inside the recorded PV buffer.
            Buffer length is the same as the sound duration.
        # Transposition : 
            Pitch of the playback sound.

    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")
        snddur = self.getSamplerDur("snd")

        size = int(self.fftsize_value)
        olaps = int(self.overlaps_value)
        wintype = self.wtype_index

        self.fin = PVAnal(self.snd, size=size, overlaps=olaps, wintype=wintype)
        self.buf = PVBuffer(self.fin, self.pos, CentsToTranspo(self.pitch), length=snddur)
        self.fout = PVSynth(self.buf, wintype=wintype, mul=self.env)

        self.fade = SigTo(value=1, time=.05, init=1)
        self.out = Sig(self.fout, mul=self.fade)

    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="pos", label="Position", min=0, max=1, init=0, func=[(0,0), (1,1)], rel="lin", unit="x", col="green"),
                cslider(name="pitch", label="Transposition", min=-2400, max=2400, init=0, rel="lin", unit="cts", col="blue"),
                cpopup(name="fftsize", label="FFT Size", init="1024", rate="i", 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", rate="i", init="4", col="red", value=["1", "2", "4", "8", "16"]),
                cpoly()
          ]

