Setting audio object parameter's value with portamento
============================================================================================================================================


**03-set-method.py**

The set() method of the PyoObject lets the user define a new
value for a given parameter with a portamento time to reach
the target. Optionally, a function to call at the end of the
ramp can be given to the `callback` argument.

The signature of the method is::

    PyoObject.set(attr, value, port=0.03, callback=None)

Where:

    - `attr` is the name of the attribute as a string.
    - `value` is the target value (can be a list if object has
      multiple streams).
    - `port` is the portamento time in seconds.
    - `callback` is a function to call when the ramp is done.

.. code-block:: python

    from pyo import *
    from random import uniform
    
    s = Server(duplex=0).boot()
    
    # 10 frequency modulations with random parameters.
    a = FM(
        carrier=[uniform(197, 203) for i in range(10)],
        ratio=[uniform(0.99, 1.01) for i in range(10)],
        index=[uniform(5, 10) for i in range(10)],
        mul=0.05,
    ).out()
    
    
    def go():
        "Linear ramps between the current values and the new ones in 9.5 sec."
        # Choose new targets and start the ramps.
        a.set("carrier", [uniform(395, 405) for i in range(10)], 9.5)
        a.set("ratio", [uniform(0.49, 0.51) for i in range(10)], 9.5)
        # Call the reset() function when portamentos are done.
        a.set("index", [uniform(10, 15) for i in range(10)], 9.5, callback=reset)
    
    
    def reset():
        "Instantaneous jumps to new values."
        a.carrier = [uniform(197, 203) for i in range(10)]
        a.ratio = [uniform(0.99, 1.01) for i in range(10)]
        a.index = [uniform(5, 10) for i in range(10)]
    
    
    # Call the go() function every 10 seconds.
    pat = Pattern(go, time=10).play()
    
    s.gui(locals())

