Sharing a table with a numpy array using the buffer protocol 
============================================================================================================================================


**04-buffer-interface.py**

This example shows two things:
    
1. How to share memory from a PyoTableObject to a numpy array with the
   `getBuffer()` method of the PyoTableObject. Numpy functions can then
   be used to modify the table's content without copying every samples.

2. How to register a `callback` function, with the `setCallback()` method
   of the Server object, that the server will call at the beginning of
   every processing loop (each `buffersize` samples).

.. note::

    The numpy module **must** be installed for this example to work.

.. code-block:: python

    from pyo import *
    import numpy as np
    
    s = Server().boot()
    
    # Get the length of an audio block.
    bs = s.getBufferSize()
    
    # Create a table of length `buffer size` and read it in loop.
    t = DataTable(size=bs)
    osc = TableRead(t, freq=t.getRate(), loop=True, mul=0.1).out()
    
    # Share the table's memory with a numpy array.
    arr = np.asarray(t.getBuffer())
    
    
    def process():
        "Fill the array (so the table) with white noise."
        arr[:] = np.random.normal(0.0, 0.5, size=bs)
    
    
    # Register the `process` function to be called at the beginning
    # of every processing loop.
    s.setCallback(process)
    
    s.gui(locals())

