SuperCollider CLASSES (extension)
Libraries>BBCut

# SQPusher1

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

## Description

This cut procedure is derived from some analysis of the manic breaks work of Squarepusher, aka Tom Jenkinson. His innovation was to push the tempo range to around 200 bpm, and to create constantly varying beats with highly musical jazz inflected drum programming.

His original work was with sampler/drum machine+sequencer but he uses many effects units and nowadays a laptop in his live shows. To my knowledge, all his programming is by hand, without algorithm. This is an automated routine inspired by his style, which is obviously my take on things and in no way to represent the great variety of great compositions Tom has created. The routine was inspired by transcribing drum patterns from Alive in Japan (disc 2, do you know squarepusher, warpcd97 2002).

Note that the original Squarepusher material is created by specifying all the individual drum hits- this routine simulates that sequencing in one single line by cutting up a breakbeat sample, so it works on a sense of rhythmic aggregate, not an analysis of relative positions of kick/snare/hat.

## Class Methods

### *new (activity: 0.1, fillfreq: 4, fillscramble: 0, sqweights, bpsd: 0.5)

Create a SQPusher1 object with the given parameters.

Note that this cut procedure always works in 4/4 with one bar phrases.

#### Arguments:

activity | Chance of semiquavers rather than quavers.
fillfreq | There are two types of bar, normal based on activity from the above parameter, and fills based on musical motifs lifted from Squarepusher tracks. The fills occur every fourth bar by default, but change their frequency with this parameter.
fillscramble | chance of a fill being scrambled, rather than played back exactly as stored.
sqweights | The chance of a semiquaver bias at each quaver of the bar. Used in combination with the activity parameter to make cut sequences for normal non fill bars.
bpsd | beats per sub division. Sets a primitive cut size resolution for choose offset messages.

### Inherited class methods

## Instance Methods

### -initSQPusher1 (ac: 0.1, ff: 4, fs: 0, sw)

### Inherited instance methods

### Undocumented instance methods

### -chooseblock

## Examples

Use your rawest noisest breaks to hear this properly. You won't have all the breaks I use below. Start with something that is running quick so repitching doesn't cause too much chipmunkiness, or double the beats per sample value in BBCutBuffer.

Otherwise you'll need to use CutBuf3 to preserve the original pitch and reslice.

    (   //defaults
    var sf;

    Routine.run({
    sf= BBCutBuffer(Platform.resourceDir +/+ "sounds/break2.aiff",4);

    s.sync;

    //3.33bps= 200 bpm
    BBCut2(CutBuf1(sf),SQPusher1.new).play(3.33);

    });
    )

    (   //fast cuts, half speed sample
    var sf;

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

    s.sync;

    //3.33bps= 200 bpm
    BBCut2(CutBuf1(sf),SQPusher1.new).play(3.33);

    });
    )

    //UI controls
    (
    var sf;
    var w,offset, activity;

    w = SCWindow("panel", Rect.new(200,200,230,130));
    offset=DDSlider( w, Rect.new(0,0,200,40), "offset", 0.0, 1.0, 'linear', 0.01, 0.0);
    activity=DDSlider( w, Rect.new(0,50,200,40), "activity", 0.0, 1.0, 'linear', 0.01, 0.0);

    w.front;

    Routine.run({
    sf= BBCutBuffer("sounds/Sounds/BOGDAN/dillbeat1",8);

    s.sync;

    //3.33bps= 200 bpm
    BBCut2(CutBuf1(sf, offset),SQPusher1(activity)).play(3.33);

    });

    )

    //preserved original pitch via CutBuf3
    (
    var sf;

    Routine.run({
    sf= BBCutBuffer("sounds/Sounds/BOGDAN/dillbeat1",8);

    s.sync;

    //3.33bps= 200 bpm
    BBCut2(CutBuf3(sf),SQPusher1.new).play(3.33);
    });
    )

    (   //two at once- sounds great on my machine at least!
    var sf, clock;

    clock= ExternalClock(3.4).play;

    Routine.run({
    sf=BBCutBuffer.array(["sounds/Sounds/bogdan/dillbeat1","sounds/Sounds/bogdanunused/bogdanbeat1"],[8,8]);

    s.sync;

    BBCut2(CutBuf1(sf[0],0.3),SQPusher1(0.4)).play(clock);
    BBCut2(CutBuf1(sf[1],0.45),SQPusher1(0.3)).play(clock);

    });

    )

    (   //two run off same routine
    var sf, clock;

    clock= ExternalClock(3.4).play;

    Routine.run({
    sf=BBCutBuffer.array(["sounds/Sounds/bogdan/dillbeat1","sounds/Sounds/bogdanunused/bogdanbeat1"],[8,8]);

    s.sync;
    BBCut2([CutBuf1(sf[0],0.3),CutBuf1(sf[1],0.45)],SQPusher1(0.4)).play(clock);

    });

    )

    (   //virtuoso rhythms
    var sf;

    Routine.run({
    sf=BBCutBuffer("sounds/a11wlk01.wav",8);

    s.sync;

    BBCut2(
    [[CutBuf2(sf,0.2,0.7,0.3), CutMixer(0,1.0,1.0,-0.5)],
    [CutBuf2(sf,0.5,0.8,0.1), CutMixer(0,1.0,1.0,0.5)]],
    SQPusher1(0.5,1, 1.0)
    ).play(4.5);

    });
    )

    (   //alternate normal and fill bars, always scramble fills, sometimes silent
    var sf;

    Routine.run({
    sf= BBCutBuffer("sounds/Sounds/BOGDAN/dillbeat1",8);

    s.sync;

    BBCut2([CutBuf2(sf, 0.3, dutycycle: 0.7), CutMixer(0,1.0,{if(0.2.coin,{0},{1})},{1.0.rand2})],SQPusher1(0.3,2, 1.0)).play(3.5);
    });
    )

    (   //SQPusher FX
    var sf;

    Routine.run({
    sf= BBCutBuffer(Platform.resourceDir +/+ "sounds/break2.aiff",4);

    s.sync;
    BBCut2([CutBuf2(sf,0.3,SQPushFXPitch2.new(0.96,pbchance:0.8)),CutMixer(0,1.0,SQPushFXAmp2.new(0.15),0.0)],SQPusher1(0.4, 3, 0.4)).play(3.4);

    });
    )

    (   //SQPusher fx at original pitch of sample using BBCSKnownOffsets
    var sf;

    Routine.run({
    sf= BBCutBuffer(Platform.resourceDir +/+ "sounds/break2.aiff",4);

    s.sync;

    BBCut2([CutBuf3(sf,0.3,pbsfunc:SQPushFXPitch2.new(0.96,pbchance:0.8)),CutMixer(0,1.0,SQPushFXAmp2.new(0.15),0.0)],SQPusher1(0.4, 3, 0.4)).play(3.4);

    });

    )

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