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

Re: Cropping buffer - Server.sync + best way

by Dan Stowell :: Rate this Message:

Reply to Author | View in Thread

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...

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
>



--
http://www.mcld.co.uk

_______________________________________________
sc-users mailing list

info (subscribe and unsubscribe): http://swiki.hfbk-hamburg.de:8888/MusicTechnology/880
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/

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