HierSch Hierarchical Scheduler

HierSch schedules and quantises prioritised functions to a TempoClock grid. At any given time by default only the function with the highest priority is evaluated.

*new(aTempoClock)

test

prints 4 beats of test values

testRate

prints 1 beat's worth of test values at rate

schedAbs(beat, priority, function, interval, quant, schedQuant)

schedules a function at a particular beat.

priority is an integer between 0 (highest) and 12 (lowest).

By default priority 0 functions always play, others play according to the settings outlined below.

interval if nil defaults to a one shot stream.

quant is time per beat to quant to, default value is 32 dividions.

schedQuant determines at what point on the grid the first function will be scheduled, should the quant be different to rate

sched(priority, function, interval, quant)

schedules a function at next beat, arguments as per schedAbs

schedBar(priority, function, interval, quant)

schedule a function at next bar, arguments as per schedAbs

mute

do not evaluate functions if true

play

unmute

restart

restarts after command period, scheduled streams do not survive

stop

stop task that checks for functions to paly, scheduled streams survive upon restart

rate_(int)

sets rate at which the checker runs

rate

retruns rate at which the checker runs, default is 32 divisions per beat

cease

stops all scheduled functions; does not require restart

stop

temporarily stops all scheduled functions; requires restart

The methods below change the default playing behaviour in relation to priorities

ignore_(arr)

mute particular fns with priorities listed in the arr

unignore

unmute listed priority functions

playOnly_(arr)

opposite of ignore_

playGT_(int)

equivalent to ignore_((1..int))

playLT_(int)

equivalent to ignore_((int..1))

flip_(bool)

inverts priorities to play if true

width_(int)

the number of priority levels to play, default is 1

single_(bool)

determines whether only one function within the chosen priority plays, true by default. If true, the played function is chosen randomly from among those of the dominant priority

playEach

equivalent to width_(12); single_(true)

playAll

equivalent to width_(12); single_(false)

default

equivalent to width_(1); single_(true)

muteH0_(bool)

mutes or unmutes Hierachy 0 (false by default)

The functions when evaluated have the following arguments passed in:

arg beat, priority, durToNextVal, counter;

// Examples

t = t ? TempoClock.default // assign a TempoClock to t

b = HierSch.new(t)

b.test

b.rate

b.testRate

s.boot

(

SynthDef.new(\midiPing, {

arg out = 0, mfreq = 69, pan = 0, gain = 0.2, dur = 0.25;

Out.ar(out, Pan2.ar(

SinOsc.ar(mfreq.midicps, 0,

EnvGen.kr(envelope: (Env.perc(0.01, dur)), doneAction: 2)),

pan, gain));

}).memStore;

m = {|f| Synth(\midiPing, [\mfreq, f + 69]);}

)

b.sched(1, {"prio 0, a oneShot stream".postln; m.value(0)});

// Priorities range from 0 ("highest") to 12 ("lowest")

// By default, only the highest p-fns play

(

// only priority-function 1 plays by default

b.sched(1, {"prio 1".postln; m.value(0)}, 1);

b.sched(2, {"prio 2".postln; m.value(4)}, 1);

b.sched(3, {"prio 3a".postln; m.value(5)}, 1);

b.sched(3, {"prio 3b".postln; m.value(6)}, 1);

)

b.mute

b.play

b.flip_(true)

b.single_(false)

b.single_(true)

b.flip_(false)

b.ignore_([1])

b.unignore

b.width_(2)

b.ignore_([1])

b.unignore

b.width_(1)

b.playEach // play every prio, though only 1 of each

b.playAll // play every prio and each within

b.default

thisProcess.stop // kill off streams

// Demonstrates quantisation

b.restart

t.tempo_(48/60);

b.rate_(128); // per beat

b.playAll;

(

var quant, freqsArr5, freqsArr4, freqsArr3, freqsArr7, beatsArr;

var beats, r, fn, durStrm, quantArr;

fn = {|arr, pan| {|b, p, d, c|

Synth("midiPing",[\mfreq, arr[c%arr.size], \pan, pan, \gain, 0.1]);

}};

durStrm = {|num, beats| Pser.new([num.reciprocal], num * beats) };

beatsArr = [ 8, 8, 8, 10, 9, 8, 7, 6, 5, 4, 3, 2, 4];

freqsArr7 = [0, 2, 4, 5, 7, 9, 11] + 40;

freqsArr5 = (7..3) + 88;

freqsArr4 = [12, 7, 4, 7] + 64;

freqsArr3 = [0, 7, 12] + 52;

quantArr = [b.rate, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];

r = Routine.new({

(beatsArr.size).do({ |i|

quant = quantArr[i];

["Quant is", quant].postln;

beats = beatsArr[i];

b.sched(4, fn.value(freqsArr7, -0.5), durStrm.value(7, beats), quant);

b.sched(3, fn.value(freqsArr5, 1), durStrm.value(5, beats), quant);

b.sched(2, fn.value(freqsArr4, -1), durStrm.value(4, beats),quant);

b.sched(1, fn.value(freqsArr3, 0.5), durStrm.value(3, beats),quant);

(beats + 1).wait;

});

});

t.play(r);

)

b.default; // many notes are not played due to the quant values

b.playAll; // all notes played