« Return to Thread: Cropping buffer - Server.sync + best way

Re: Cropping buffer - Server.sync + best way

by thor-2 :: Rate this Message:

Reply to Author | View in Thread


Thanks for all the replies. Right now I don't have time to investigate the bind issue
but I've implemented the crop method like this:

(still interested in improvements : )


b = Buffer.read(s, "sounds/a11wlk01.wav");
b.play
b.crop(100000, 66666, false)
b.play
b


+ Buffer {
crop {arg startFrame, numFrames, overwrite=false;
var s, cond, tempbuf, tempbufnum, newbuf, chNum;
cond = Condition.new;
s = Server.default;


Routine.run {
chNum = this.numChannels;
s.sync(cond);
tempbuf = Buffer.alloc(s, numFrames, chNum);
s.sync(cond);
this.copyData(tempbuf, 0, startFrame, numFrames);
tempbufnum = this.bufnum;
s.sync(cond);
this.free;
s.sync(cond);

newbuf = Buffer.alloc(s, tempbuf.numFrames, tempbuf.numChannels, bufnum:tempbufnum);
s.sync(cond);
tempbuf.copyData(newbuf);
s.sync(cond);
tempbuf.free;
tempbuf = nil;


if(overwrite, { newbuf.write(this.path, "aiff", "int16") });


s.sync(cond);
this.updateInfo; // update so the buffer object has the new buffer info
};
}
}



On 20 Jul 2008, at 16:54, Julian Rohrhuber wrote:

Looks like JH has answered your main issue. Regarding s.bind, remember
what it does: it colllects together all the OSC messages that your
function creates, and bundles them all off once the function has
completed. So it's illogical to use s.sync inside an s.bind, because
the OSC message sent out by s.sync won't be sent until the function
has completed, yet s.sync won't let the function complete until it's
heard a reply back...


no, this is not correct. A sync inside a bind will separate the bundles and automatically send the second part when the first is received.

So it should work, I don't know why it wouldn't.
Take a look into the BundleNetAddr, maybe there is aome way to query your intermediate state.


Dan


2008/7/20 thor <th.list@...>:

 Hi all
 I need to crop a buffer. That's not straight forward in SC because of memory
 allocation on the buffer and such, so I'm wondering if the following is the
 best
 way to do this? Has anyone got a better method?
 But there are also some problems. See my comments.
 PS. I need the cropped buffer to have the same bufnum as the original
 buffer.
 cheers
 thor

 (
 Routine.run {
 var cond;
 cond = Condition.new;

 // original buffer
 b = Buffer.read(s, "sounds/a11wlk01.wav");
 "b.bufnum is: ".post; b.bufnum.postln;
 s.sync(cond);
 // temp buffer used in copying
 c = Buffer.alloc(s, 88864, b.numChannels);
 s.sync(cond);
 b.copyData(c, 0, 100000, 88864); // my cropping
 n = b.bufnum; // getting b's bufnum
 s.sync(cond);
 b.free;

 // cropped buffer with b's bufnum
 d = Buffer.alloc(s, c.numFrames, c.numChannels, bufnum:n);
 s.sync(cond);
 c.copyData(d);
 s.sync(cond);
 c.free;
 \cropping_DONE.postln;
 };
 )

 d.play // is the new buffer there? yes
 d.bufnum // and it has the b.bufnum
 c.postln;
 c.play // c is freed. That's good.
 c.bufnum
 b.play // but I thought I'd freed b?
 b.bufnum // and now b and d share same bufnum !!!
 d.postln;
 b.postln;
 // and now I could do d.write(b...path) and I've changed the file forever
 (I'll not do that to your file)



 // I remember Julian telling me about s.bind once, but this doesn't work:
 // Should it not?
 (
 s.bind({
 b = Buffer.read(s, "sounds/a11wlk01.wav");
 "b.bufnum is: ".post; b.bufnum.postln;
 s.sync;
 // temp buffer used in copying
 c = Buffer.alloc(s, 88864, b.numChannels);
 s.sync;
 b.copyData(c, 0, 100000, 88864); // my cropping
 n = b.bufnum; // getting b's bufnum
 s.sync;
 b.free;
 s.sync;

 // cropped buffer with b's bufnum
 d = Buffer.alloc(s, c.numFrames, c.numChannels, bufnum:n);
 s.sync;
 c.copyData(d);
 s.sync;
 c.free;
 })
 )
 d.play




--

_______________________________________________
sc-users mailing list



-- 





.

_______________________________________________
sc-users mailing list


 « Return to Thread: Cropping buffer - Server.sync + best way