[chuck-users] Sample Playback Efficiency

Spencer Salazar ssalazar at CS.Princeton.EDU
Tue Nov 27 02:15:04 EST 2007


Juan-Pablo,
If efficiency is what you are looking for, use the => and =< approach.

You can tell a Ugen to stop processing samples and only output 0  
(using 0 => ugen.op;), which saves a lot of CPU cycles over setting  
the gain to 0.  Any ugens chucked to the op-0 ugen will still be  
ticked though, so for long ugen chains this is less likely to gain you  
much in performance.

In addition to stopping it from processing samples, removing a ugen  
from the graph entirely with =< reduces the overhead of moving each  
sample to the next ugen in the graph, which is noticeable.  It also  
has the (generally desirable) side effect of automatically stopping  
any ugens further down the graph from producing samples (assuming they  
aren't connected to some other active ugen).

(All of these approaches are prone to produce pops in your resulting  
audio--use an Envelope if this is a problem!)

My recommendation is to use the approach that makes the most sense to  
you; opt for a more efficient strategy only if you've identified this  
as a bottleneck.

spencer

On Nov 26, 2007, at 3:07 PM, Juan-Pablo Caceres wrote:

> Dear list,
>
> Lets say I have an array of SndBuf, and I want to playback one of the
> samples each time. What is the most efficient way? What I am doing is
> just connecting everything to dac, and then setting all but one of the
> gains to non-zero, something like this:
>
> SndBuf buf[20];
> for ( 0 => int i; i < 20; i++ )  {
>         sample_names[i] => buf[i].read; //assuming I have an array of
> 					//string names
>         buf[i] => dac;
>         0. => buf[i].gain;
>     }
>
> //then to playback one at the time:
> int isamp;
> while (true) {
>         Std.rand2(0, 19 ) => isamp;
> 	0 => buf[isamp].pos;
>         0.1 => buf[isamp].gain; //set gain to something different
> 				// than zero
>         200::ms => now;
>         0. => buf[isamp].gain; //bring it back to zero
>     }
>
>
> This works, but doesn't feel right. All the DSP connections are  
> made, so
> I would guess this is inefficient. The other option will be to connect
> (=>) and disconnect (=<) dynamically but that solution also feels  
> wrong...
>
> Any ideas? Thanks so much again,
> Juan-Pablo
>
>
> _______________________________________________
> chuck-users mailing list
> chuck-users at lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users



More information about the chuck-users mailing list