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