hey, in this thread Masking triggers and adjust overlap legato style i have been asking how to adjust the overlap in a “legato style” when masking triggers by binary values. i have made this sketch which is working already (see the plot). But i would like to calculate the legato values from the serialized binary matrix which im passing, inside of triggerMask
and have two events mask
and legato
as outputs. I think it would be more intuitive to use the initial ~matrixOfDurations
for the legato values instead of the calculated ~legato
matrix. How can i do that?
(
~seqOfRows = [2, 0];
~matrixOfDurations = [
[ 12 ],
[ 6, 6 ],
[ 6, 3, 3 ],
[ 3, 3, 3, 3 ],
[ 3, 3, 2, 1, 3 ],
[ 3, 1, 2, 2, 1, 3 ],
[ 3, 1, 2, 2, 1, 2, 1 ],
[ 2, 1, 1, 2, 2, 1, 2, 1 ],
[ 2, 1, 1, 2, 2, 1, 1, 1, 1 ],
[ 2, 1, 1, 2, 1, 1, 1, 1, 1, 1 ],
[ 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
];
// matrixOfDurations converted to binary values
~binaryDurations = [
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ],
[ 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 ],
[ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 ],
[ 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0 ],
[ 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0 ],
[ 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1 ],
[ 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1 ],
[ 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
];
// manually calculated legato values for these specific binaryDurations
~legato = [
[ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
[ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ],
[ 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3 ],
[ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ],
[ 3, 3, 3, 3, 3, 3, 2, 2, 1, 3, 3, 3 ],
[ 3, 3, 3, 1, 2, 2, 2, 2, 1, 3, 3, 3 ],
[ 3, 3, 3, 1, 2, 2, 2, 2, 1, 2, 2, 1 ],
[ 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1 ],
[ 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1 ],
[ 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1 ],
[ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
];
)
(
var timingInformation = { |numChannels, trig, grainRate|
var rate = if(trig.rate == \audio, \ar, \kr);
var arrayOfTrigsAndPhases = numChannels.collect{ |i|
var localTrig = PulseDivider.perform(rate, trig, numChannels, i);
var hasTriggered = PulseCount.perform(rate, localTrig) > 0;
var localPhase = Sweep.perform(rate, localTrig, grainRate * hasTriggered);
[localTrig, localPhase];
};
var trigsAndPhasesArray = arrayOfTrigsAndPhases.flop;
(\trigger : trigsAndPhasesArray[0], \phase: trigsAndPhasesArray[1]);
};
var triggerMask = { |trig, reset, arrayOfValues, arrayOfLegatos, valuesPerRow, seqOfRows, rowSeqSize|
var noteInSeq = Demand.ar(trig, reset, Dseq([Dseries(0, 1, valuesPerRow)], inf));
var rowTrig = HPZ1.ar(noteInSeq) < 0;
var row = Demand.ar(rowTrig + Impulse.ar(0), reset,
Dseq([Dser(seqOfRows, rowSeqSize)], inf)
);
var seqOffset = row.floor * valuesPerRow;
var mask = Demand.ar(trig, reset, Dswitch1(arrayOfValues, seqOffset + noteInSeq));
var legato = Demand.ar(trig, reset, Dswitch1(arrayOfLegatos, seqOffset + noteInSeq));
(mask: mask, legato: legato);
};
var hanningWindow = { |phase|
(1 - (phase * 2pi).cos) / 2 * (phase < 1);
};
{
var numChannels = 4;
var sig, tFreq, trig, grainRate, grainWindow, phase, maskedTrig, legato, timings;
tFreq = \tFreq.kr(400);
trig = Impulse.ar(tFreq);
maskedTrig = triggerMask.(
trig: trig,
reset: \reset.tr(0),
arrayOfValues: ~binaryDurations.flat,
arrayOfLegatos: ~legato.flat,
valuesPerRow: ~binaryDurations.size,
seqOfRows: ~seqOfRows,
rowSeqSize: ~seqOfRows.size,
);
grainRate = (tFreq / (\overlap.kr(1) * maskedTrig.legato));
timings = timingInformation.(numChannels, trig * maskedTrig.mask, grainRate);
grainWindow = hanningWindow.(timings.phase);
sig = SinOsc.ar(440);
sig = sig * grainWindow;
}.plot(0.2);
)