[chuck-users] Sample Playback Efficiency

Juan-Pablo Caceres jcaceres at ccrma.stanford.edu
Wed Nov 28 15:20:25 EST 2007


Hi Spencer,

Thank you very much for your help. =< is working great for me.

Cheers,
JPa.


Spencer Salazar wrote:
> 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
> 
> _______________________________________________
> 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