[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