Example 2

# This example shows how to load a sound in a table (RAM) in order to apply
# non-streaming effects. Here a frequency self-modulated reader is used to
# create new harmonics, in a way similar to waveshaping distortion.

class Module(BaseModule):
    """
    "Self-modulated frequency sound looper"

    Description

    This module loads a sound in a table and apply a frequency self-modulated
    playback of the content. A Frequency self-modulation occurs when the
    output sound of the playback is used to modulate the reading pointer speed.
    That produces new harmonics in a way similar to waveshaping distortion.

    Sliders

        # Transposition :
                Transposition, in cents, of the input sound
        # Feedback :
                Amount of self-modulation in sound playback
        # Filter Frequency :
                Frequency, in Hertz, of the filter
        # Filter Q :
                Q of the filter (inverse of the bandwidth)

    Graph Only

        # Overall Amplitude :
                The amplitude curve applied on the total duration of the performance

    Popups & Toggles

        # Filter Type :
                Type of the filter
        # Polyphony Voices :
                Number of voices played simultaneously (polyphony),
                only available at initialization time
        # Polyphony Chords :
                Pitch interval between voices (chords),
                only available at initialization time

    """
    def __init__(self):
        BaseModule.__init__(self)
        self.snd = self.addFilein("snd")
        self.trfactor = CentsToTranspo(self.transpo, mul=self.polyphony_spread)
        self.freq = Sig(self.trfactor, mul=self.snd.getRate())
        self.dsp = OscLoop(self.snd, self.freq, self.feed*0.0002,
                           mul=self.polyphony_scaling * 0.5)
        self.mix = self.dsp.mix(self.nchnls)
        self.out = Biquad(self.mix, freq=self.filt_f, q=self.filt_q,
                          type=self.filt_t_index, mul=self.env)

    def filt_t(self, index, value):
        self.out.type = index

Interface = [
    cfilein(name="snd"),
    cgraph(name="env", label="Overall Amplitude", func=[(0,1),(1,1)], col="blue1"),
    cslider(name="transpo", label="Transposition", min=-4800, max=4800, init=0,
            unit="cnts", col="red1"),
    cslider(name="feed", label="Feedback", min=0, max=1, init=0.25, unit="x",
            col="purple1"),
    cslider(name="filt_f", label="Filter Frequency", min=20, max=18000,
            init=10000, rel="log", unit="Hz", col="green1"),
    cslider(name="filt_q", label="Filter Q", min=0.5, max=25, init=1,
            rel="log", unit="x", col="green2"),
    cpopup(name="filt_t", label="Filter Type", init="Lowpass",
           value=["Lowpass", "Highpass", "Bandpass", "Bandreject"], col="green1"),
    cpoly()
]