SuperCollider CLASSES (extension)

WarpCutProc1

Oscillator-rate breakbeat cutting
Inherits from: BBCutProc : Object

Description

Cutups in the style of Aphex Twin/ Bogdan Raczynski/ u-ziq etc, that is, sometimes so fast that a pitch is heard. With this procedure you must specifiy the sizes of allowed blocks. Each block then has some probability to be a simple statement, or some type of roll (fast set of repetitions), either even or geometric series timed.

For additional data on the algorithm see

Nick Collins, "further automatic BreakBeat cutting methods",

Proceedings of Generative Art 2001

reproduced at http://www.cus.cam.ac.uk/~nc272

Class Methods

*new (blocksizefunc, rollfunc, probs, phraselength: 12, accel: 0.9, bpsd: 0.5)

Create a WarpCutProc1 object with the given parameters.

Arguments:

blocksizefunc

A function (or something else responding to value) returning the next block size. The function will be passed the number of beatsleft in the current phrase, and the current phrase length in case judgement is to depend on position within a phrase.

rollfunc

A function returning the number of cuts to subdivide a block in a roll. This function is passed the current blocklength as argument in case you want a decision to take account of how much space you divide.

probs

An array of three probabilities (0.0 to 1.0). They are [prob of simple statement, prob of even roll, prob of accelerando rather than decelerando geometric series]. The algorithm cascades through one prob at a time. If a block is not simple, then it is a roll. If it isn't an even roll it is a geometric roll.

phraselength

Next length of phrase in beats.

accel

a parameter to control the acceleration rate of the geometric series. Good values are 0.5 to 0.99. Do not pass 0.0 or 1.0 without expecting a crash.

bpsd

beats per sub division. Sets a primitive cut size resolution for choose offset messages.

Inherited class methods

Instance Methods

-initWarpCutProc1 (bsf, rf, p, acc: 0.9)

Called internally after a new.

Other methods are overrides of BBCutProc base class behaviour. WarpCutProc1 will flag rolls for synthesis.

Inherited instance methods

Undocumented instance methods

-chooseblock

Examples

You'll have to substitute your own break sample to hear the rhythmic aspects of this procedure properly perhaps, but the Warp cutter creates such bizarre effects that it's fun on any source.

(   //defaults
var sf;

Routine.run({   
    sf= BBCutBuffer("sounds/a11wlk01.wav",4);
    
    s.sync;
    
    //144 bpm
    BBCut2(CutBuf1(sf),WarpCutProc1.new).play(2.4);
});

)

(   //oddness on AudioIn 
BBCut2(CutStream1.new,WarpCutProc1({[1,2,4].wchoose([0.7,0.2,0.1])},{[9,19,29].choose},[0.0,0.5,0.5],100.0,{0.8+(0.15.rand)})).play(2.2); 
)


//roll through a sound with UI control
(
var w;
var slider, num, data;
var sf, bbcutter, clock;

data=   //control spec data for ui controls
[
["tempo",2,3,\lin,0.1,2.5],             
["blocklength", 0, 2,\lin,1,1],         
["roll", 0, 6,\lin,1,0],                
["simpleprob", 0.0, 1.0,\lin,0.1,0.5],  
["evenprob", 0.0, 1.0,\lin,0.1,0.5],        
["accelprob", 0.0, 1.0,\lin,0.1,0.5],       
["phraselength", 1.0, 5.0,\lin,1.0,2.0],        
["accelparam", 0.5, 0.99,\lin,0.01,0.9],        
["restchance", 0.0, 1.0,\lin,0.1,0.0],      
["ampvariation", 0.0, 1.0,\lin,0.01,1.0],       
["panvariation", 0.0, 1.0,\lin,0.01,0.0],       
["randomoffset", 0.0, 1.0,\lin,0.01,0.0]
];

w = SCWindow("WarpCutProc1 demo N.M.Collins 23/08/03", Rect.new(100, 500, 500, (30*(data.size))));

slider= Array.fill(data.size, {arg i; DDSlider.performList(\new,[w, Rect(5,30*i, 300, 30)]++ data.at(i))}); 

slider.at(1).slider.action_({arg sl; 
var val; val = slider.at(1).spec.map(sl.value);
val= [1,3,5].at(val.round(1.0).asInteger);
slider.at(1).string.string_(val); 
slider.at(1).lastval=val;  
});

slider.at(1).lastval= 3;
slider.at(2).string.string_(3);

slider.at(2).slider.action_({arg sl; 
var val; val = slider.at(2).spec.map(sl.value);
val= [3,5,7,11,13,17,19].at(val.round(1.0).asInteger);
slider.at(2).string.string_(val); 
slider.at(2).lastval=val;  
});

slider.at(2).lastval= 3;
slider.at(2).string.string_(3);

w.front;


Routine.run({   
    sf= BBCutBuffer(Platform.resourceDir +/+ "sounds/break.aiff",8);
    
    s.sync;

bbcutter= BBCut2([
CutBuf1(sf,
slider.at(11) //randomoffsetchance
),
CutMixer(0,1.0,{
if(slider.at(8).value.coin, //restchance
{0},
{
rrand(slider.at(9).value,1.0)} //amp variation
)},
{rrand(-1.0*(slider.at(10).value),slider.at(10).value)} //panvariation
)
],
WarpCutProc1(
slider.at(1),   //block
slider.at(2),   //rollcut
[slider.at(3),slider.at(4),slider.at(5)],   //probs
slider.at(6),   //phraselength
slider.at(7)    //accelparam
)
); 

clock=ExternalClock(slider.at(0).lastval).play;

bbcutter.play(clock);

//update tempo ten times a second
SystemClock.sched(0.0,{clock.tempoclock.tempo_(slider.at(0).lastval); 0.1});

});
)