Dbufwr buffer demand ugen


superclass: DUGen



*new(input, bufnum, phase, loop)


all inputs can be either demand ugen or any other ugen.


input single channel input

bufnum buffer number to read from (single channel buffer)

phase index into the buffer

loop when phase exceeds number of frames in buffer, loops when set to 1 (default :1)


see also [Dbufrd]


// alloc a single channel buffer

b = Buffer.alloc(s, 24, 1);

b.setn(0, { 210 } ! b.numFrames);


// post some info:

fork { loop { 0.5.wait; b.getn(0, b.numFrames, {|x| x.postln }) } };


// write demand sequence into a buffer

(

{

var read, write, readpos, writepos, writetrig;


writetrig = Dust.kr(1);

readpos = Dseries(0, 1, inf);

writepos = Dseq([Dseries(0, 3, 30), Dseries(0, 1, 30)], inf);


read = Dbufrd(b, readpos);

write = Dbufwr(Dseq([Dseries(1, 1, 16), Dwhite(1, 16, 8)], inf) * 60, b, writepos);


Demand.kr(writetrig, 0, write); // write on trigger


SinOsc.ar(

Demand.kr(Impulse.kr(16), 0, read).lag(0.01) * [1, 1.01]

) * 0.1


}.play;

)




// write into buffer with mouse clicks

(

{

var val = MouseY.kr(1000, 200, 1); // cursor y pos controls frequency

var pos = MouseX.kr(0, BufFrames.kr(b) - 1); // cursor x position controls buffer pos

var write = MouseButton.kr; // button controls write action

Demand.kr(write, 0, Dbufwr(val, b, pos, 1));

SinOsc.ar(

Duty.kr(Dseq([0.5, 0.75, 0.5, 1.0], inf) * 0.2, 0, Dbufrd(b, Dseries(0, 1, inf)))

) * 0.1

}.play;

)







// write demand sequence into a buffer

b.free; b = Buffer.alloc(s, 2, 1);

fork { loop { 0.5.wait; b.getn(0, b.numFrames, {|x| x.postln }) } };

b.setn(0, [1, 0]);


(

{

var read, write, readpos, writepos, writetrig;


writetrig = Impulse.kr(2);

readpos = Dbufrd(b, 1); // first buffer val is position

writepos = Dbufrd(b, 0); // second buffer val is position

read = Dbufrd(b, readpos);


write = Dbufwr(read, b, writepos);


Demand.kr(writetrig, 0, write); // write on trigger

}.play;

)



// free buffer:

b.free;