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

Cropping buffer - Server.sync + best way

by thor-2 :: Rate this Message:

Reply to Author | View in Thread


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

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