SuperCollider CLASSES (extension)

SQPusher1

Squarepusher-inspired breakbeat cutting
Inherits from: BBCutProc : Object

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

});

)