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
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@lists.cs.princeton.edu https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
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@lists.cs.princeton.edu https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
_______________________________________________ chuck-users mailing list chuck-users@lists.cs.princeton.edu https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
participants (2)
-
Juan-Pablo Caceres
-
Spencer Salazar