Playback for a stream of audio which can be cut-up. The stream can be any bus on the Server, so might be a file streamed off disk, a current audio input or some synthesised data.
Each grain may have associated parameters for enveloping and dutycycle (ratio of duration to inter-onset-interval).
Note that CutStream1 uses In.ar rather than InFeedback.ar, for reaction speed, so execution order is important. you cannot cut-up a stream created later in the execution order. Change the SynthDefs in the class file to InFeedback if you want no execution order worries, at the expense of an audio block's delay (usually 64 samples).
inbus |
Bus on the Server to be cut-up. |
bbcutbuf |
A Server side buffer must exist for the use of the UGen- by default one is allocated for you. |
dutycycle |
Ratio of duration to inter-onset-interval (IOI). 0.5 would mean that the duration of grains is only half the length between cut start times. |
atkprop |
Enveloping parameter for attack speed. Rated as a proportion of the overall envelope (0.0 to 1.0) |
relprop |
Enveloping parameter for release speed. Rated as a proportion of the overall envelope (0.0 to 1.0) |
curve |
Envelope curve |
s=Server.default; a=BBCut2(CutStream1.new).play; a.end; //dutycycle and envelope manipulations of first audio in channel ( var buf, clock; clock= ExternalClock(TempoClock(2.1)); clock.play; Routine.run({ buf= BBCutBuffer.alloc(s,44100,1); s.sync; //this forces a wait for the Buffer to be allocated BBCut2(CutStream1(s.options.numOutputBusChannels, buf, 0.5, 0.001, 0.5, -4), WarpCutProc1.new).play(clock); }); ) //dutycycle and envelope manipulations cutting up a stream being synthesised ( var buf, clock, synthgroup, bbcutgroup, synthbus; clock= ExternalClock(TempoClock(2.1)); synthgroup= Group.head(Node.basicNew(s,1)); bbcutgroup= Group.after(synthgroup); synthbus= Bus.audio(s,1); Routine.run({ SynthDef(\sourcesound,{Out.ar(synthbus.index,Gendy1.ar(1,3,0.2,0.5,LFNoise1.kr(1,100,300),550,0.05,0.07))}).play(synthgroup); buf= BBCutBuffer.alloc(s,44100,1); s.sync; //this forces a wait for the Buffer to be allocated BBCut2(CutGroup(CutStream1(synthbus.index, buf, 0.75, 0.01, 0.5, -4),bbcutgroup), WarpCutProc1.new).play(clock); }); clock.play; ) //source on its own for comparison SynthDef(\sourcesound,{Out.ar(0,Gendy1.ar(1,3,0.2,0.5,LFNoise1.kr(1,100,300),550,0.05,0.07)*0.1)}).play; //cutup of stereo sound- note use of stereo Bus and creation of stereo buffer, CutGroup last argument is numChannels ( var buf, clock, synthgroup, bbcutgroup, synthbus; clock= ExternalClock(TempoClock(2.1)); synthgroup= Group.head(Node.basicNew(s,1)); bbcutgroup= Group.after(synthgroup); synthbus= Bus.audio(s,2); Routine.run({ SynthDef(\sourcesound,{Out.ar(synthbus.index,0.25*Gendy1.ar(1,3,0.2,0.5,LFNoise1.kr([1.1,1.3],100,300),[650,750],0.05,0.07))}).play(synthgroup); buf= BBCutBuffer.alloc(s,44100,2); s.sync; //this forces a wait for the Buffer to be allocated BBCut2(CutGroup(CutStream1(synthbus.index, buf, 0.75, 0.01, 0.5, -4),bbcutgroup,nil,2), WarpCutProc1.new).play(clock); }); clock.play; )