TITLE:: FluidBufSelectEvery summary:: Extract every N samples / channels from a buffer categories:: Libraries>FluidCorpusManipulation related:: Classes/FluidBufSelect DESCRIPTION:: Pick every N frames and / or channels from a buffer, described in terms of independent hop sizes for frames and channels CLASSMETHODS:: private::new1 METHOD:: process, processBlocking Run the process on the given sever, and perfrom code::action:: when done ARGUMENT:: server The link::Classes/Server:: on which to run ARGUMENT:: source The link::Classes/Buffer:: to select values from ARGUMENT:: startFrame The starting point (in samples) from which to copy in the source buffer. ARGUMENT:: numFrames The duration (in samples) to copy from the source buffer. The default (-1) copies the full lenght of the buffer. ARGUMENT:: startChan The first channel from which to copy in the source buffer. ARGUMENT:: numChans The number of channels from which to copy in the source buffer. This parameter will wrap around the number of channels in the source buffer. The default (-1) copies all of the buffer's channel. ARGUMENT:: destination The link::Classes/Buffer:: to write the selected data to ARGUMENT:: frameHop Take every `frameHop` frames. Default = 1 = all frames (where 2 would be every other frame, etc.) ARGUMENT:: chanHop Take every `chanHop` channels. Default = 1 = all channels (where 2 would be every other channel, etc.) ARGUMENT:: freeWhenDone Free the server instance when processing complete. Default true ARGUMENT:: action Runs when processing is complete EXAMPLES:: Didactic code:: //send a known collection where the value of each frame in each channel is encoded //chan b = Buffer.sendCollection(s,30.collect{|x| x.mod(6) + (x.div(6) * 0.1)},6) //check the ranges (thus showing a plotter error...) b.plot(separately: true).plotMode_(\points) //you can also check the collection itself if in doubt b.getToFloatArray(action: {|x|x.round(0.1).postln;}); //let's make a destination buffer c = Buffer(s); //using default values, we copy everything: FluidBufSelectEvery.process(s,b, destination: c, action: {c.query}); c.getToFloatArray(action: {|x|x.round(0.1).postln;}); //more powerful copying, resizing the destination accordingly FluidBufSelectEvery.process(s,b, destination: c, frameHop: 2, chanHop: 3, action: {c.query}); c.getToFloatArray(action: {|x|x.round(0.1).postln;}); //source buffer boundaries still apply before the hopping selection FluidBufSelectEvery.process(s,b, startFrame: 1, numFrames: 3, startChan: 2, numChans: 3, destination: c, frameHop: 1, chanHop: 2, action: {c.query}); c.getToFloatArray(action: {|x|x.round(0.1).postln;}); ::