All your options build arrays at a number of locations, a very slow and memory consuming operation. Instead of building the arrays continously create arrays of the size you need in the start and use those arrays to hold the data. Update using replace array elements, that does not copy the whole array(s) and is thus much faster.
Avoiding array builds alltogether is difficult in this case though, but you can probably optimize the performance by applying a circular buffer design (make functional globals, one for each band, that act as circular buffers, instead of using a que).
In the example you are in effect updating the plots every 25 ms...which is way too fast for the human eye anyway, just refresh the plots every 2-300 ms. That way you will only read the circular
buffers every 2-300 ms as well, which is the slowest operation involved here...
You can probably find circular buffer examples here on the zone, if not let me know and I'll make an appropriate one for you.
Mads