Trigger burst generator

Hello everyone

Something I have been struggling to achieve in SuperCollider lately is a trigger burst generator. What I mean by this is:

  • Something that receives a trigger
  • When trigged, it will immediately emit X number of triggers
  • These triggers are spaced at a time interval of Y
  • When done triggering, resets itself and frees itself/waits for next input trigger.

I have been making weird hacks using Drate UGens and Impulse, but the problem with using eg Impulse as the internal clock for this is that if used in NodeProxy land it may be out of phase from when the synth receives the trigger and I want this trigger burst generator to emit triggers immediately when receiving a trigger and not be at risk of the clock/Impulse being halfway through it’s phase.

Does anyone have ideas on this subject?

Thanks

For something similar, I hacked a version of LFPulse to have a reset parameter. The C++ source and mac binary are here:

https://github.com/spluta/SPSynthTools/tree/master/Maths/MathsOG/LFPulseReset

This, in combination with a timed envelope, should maybe work for you?

Sam

Maybe delay the trigger and feed it back (with a PulseCount to silence the feedback after enough triggers)?

hjh

This appears to work:

(
a = { |num = 6, rate = 3, amp = 0.1, freq = 440|
	var blockdur = ControlDur.ir;
	var reset = MouseX.kr(0, 1, 0) > 0.5;
	var fb = LocalIn.kr(1, 0);
	var trig = fb + Trig1.kr(reset, blockdur);
	var count = PulseCount.kr(trig, reset);
	
	// borrow '[delay]' idea from Pd/Max (avoid delay line memory)
	// tricky detail: Sweep starts at synth onset;
	// we need to suppress this until the first "go" trigger
	var hasTriggered = PulseCount.kr(reset) > 0;
	var elapsed = Sweep.kr(trig) * hasTriggered;
	var dur = rate.reciprocal;
	var nextTrig = Trig1.kr(elapsed >= (dur - blockdur), blockdur);
	
	var eg = EnvGen.kr(Env.perc(0.01, 0.05), trig);
	var sig = SinOsc.ar(freq);
	
	// PulseCount under-reports by 1 if it's reset at the same time
	LocalOut.kr(nextTrig * (count < (num-1)));

	(sig * eg * amp).dup
}.play;
)

hjh

1 Like

This absolutely perfect !!! Thank you !