I have looked at one server side sequencing attempt on sc code 303 emulation
It basically can be reduced to this:
(
var every = { |eventTrigger, barTrigger, x|
var pattern = [1] ++ (0 ! (x - 1));
eventTrigger * Demand.ar(eventTrigger, barTrigger, Dseq(pattern, inf));
};
var sequencer = { |trig, barTrigger, pattern|
var barCounter = PulseCount.ar(barTrigger);
var isBarZero = InRange.ar(barCounter % 1, 0, 0.99999);
Demand.ar(trig, barTrigger * isBarZero, Dseq(pattern, inf));
};
{
var bpm = 135;
var clockFreq = bpm / 60;
var barLengthInBeats = 4;
var reso = 96;
var resetLength = 1;
var eventTrigger = Impulse.ar(clockFreq * reso);
var barTrigger = PulseDivider.ar(
trig: eventTrigger,
div: (barLengthInBeats * reso * resetLength).floor,
start: barLengthInBeats * reso
);
var trig = every.(eventTrigger, barTrigger, 24);
var envTrig = trig * sequencer.(trig, barTrigger, [1, 0, 1, 1, 1, 1, 1, 0]);
envTrig!2 * 0.25;
}.play;
)
You see the reso variable and the x argument for the every function, they have basically a factor of 4 between them 24 to 96 instead of 1 to 4. I was assuming that this is indicating some increased trigger resolution.
Does it in general make any difference if you run the triggers at a higher rate for accurancy, maybe for the resetLength
?
If you take the code and reduce it to this, it sounds the same to me:
(
{
var bpm = 135;
var clockFreq = bpm / 60;
var barLengthInBeats = 4;
var reso = 4;
var resetLength = 1;
var trig = Impulse.ar(clockFreq * reso);
var barReset = PulseDivider.ar(
trig: trig,
div: (barLengthInBeats * reso * resetLength).floor,
start: barLengthInBeats * reso
);
trig = trig * Demand.ar(trig, barReset, Dseq([1, 0, 1, 1, 1, 1, 1, 0], inf));
trig!2 * 0.25;
}.play;
)
There is also this isBarZero
calculation with:
var barCounter = PulseCount.ar(barTrigger);
var isBarZero = InRange.ar(barCounter % 1, 0, 0.99999);
is this actually necessary for the reset and isnt PulseCount.ar(barTrigger) > 0
the same?