SuperCollider CLASSES (extension)
Libraries>BBCut

# WarpCutProc1

Oscillator-rate breakbeat cutting
Source: /Users/zzk/Library/Application Support/SuperCollider/downloaded-quarks/BBCut/classes/bbcutprocs/WarpCutProc.sc
Inherits from: BBCutProc : Object
See also: BBCut

## 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});

    });
    )

helpfile source: /Users/zzk/Library/Application Support/SuperCollider/downloaded-quarks/BBCut/HelpSource/Classes/WarpCutProc1.schelp
link::Classes/WarpCutProc1::
sc version: 3.8.0