class:: SetResetFF
summary:: Set-reset flip flop.
related:: Classes/ToggleFF
categories::  UGens>Triggers


Description::

Output is set to 1.0 upon receiving a trigger in the trig input, and to
0.0 upon receiving a trigger in the reset input. Once the flip flop is
set to zero or one further triggers in the same input are have no effect.
One use of this is to have some precipitating event cause something to
happen until you reset it.

If both inputs receive a trigger at the same time, the teletype::reset:: input takes precedence. The output will be 0. See the examples below.

classmethods::

method::ar, kr

argument::trig

The trigger that sets output to 1. Trigger can be any signal.
A trigger happens when the signal changes from non-positive to
positive.


argument::reset

The trigger that sets output to 0. Trigger can be any signal.
A trigger happens when the signal changes from non-positive to
positive.


Examples::

code::

(
play({
	a = Dust.ar(5); // the set trigger
	b = Dust.ar(5); // the reset trigger
	SetResetFF.ar(a,b) * BrownNoise.ar(0.2);

}))

::

subsection::Simultaneous triggers

Here, 'reset' is triggered twice as often as 'trig'. Since 'trig' is always matched by a 'reset', the output is 0. (If 'trig' took precedence, you would have a 50%-duty-cycle pulse wave.)

code::
a = { SetResetFF.kr(Impulse.kr(50), Impulse.kr(100)) }.plot(duration: 0.1);
::

You can reverse this behavior, by reversing the inputs so that SetResetFF is triggered twice as often as resetting. This results in a signal that is 0 initially and switches to 1 halfway through the cycle: emphasis::reset, then trigger::. To make it emphasis::trigger, then reset::, invert the phase: code::1 - SetResetFF::.

code::
a = { 1 - SetResetFF.kr(Impulse.kr(100), Impulse.kr(50)) }.plot(duration: 0.1);
::

