/*
Okay but would be better with adjustable envelope rather than sine pulse
*/

desc: Isochronic Tone Generator

slider1:1<0,1,1{Off,On}>On/Off
slider2:110<0,1000,1>Tone (Hz)
slider3:4<0,20,0.1>Pulse (Hz)
slider4:50<0,1000,1>Inertia (ms)
slider5:-18<-30,0,0.5>Gain

/////////////////////////////////////////////////////////////////////////////////////////////////
@init
ext_noinit = 1;
twoPi = 2 * $pi;

/////////////////////////////////////////////////////////////////////////////////////////////////
@slider
On = slider1;
tTarget = slider2;
pTarget = slider3;
iTime = slider4;
aTarget = 10 ^ (slider5/20);

tDelta = tTarget - tCurrent;
abs(tDelta) > 0 ?
(
	tIncrement = tDelta / iTime;
	tCount = iTime;
);

pDelta = pTarget - pCurrent;
abs(pDelta) > 0 ?
(
	pIncrement = pDelta / iTime;
	pCount = iTime;
);

aDelta = aTarget - aCurrent;
abs(aDelta) > 0 ?
(
	aIncrement = aDelta / iTime;
	aCount = iTime;
);

/////////////////////////////////////////////////////////////////////////////////////////////////
@block
On ?
(
	samplesPerMs = srate / 1000;
	samplesLeft = samplesblock;

	i = 0;

	while
	(
		sampleCounter < samplesPerMs ?
		(
			sampleCounter += 1;
		)
		:
		(
			tCount > 0 ?
			(
				tCurrent += tIncrement;
				tCount -= 1;
				tSpeed = (twoPi * tCurrent) / srate;
			);
				
			pCount > 0 ?
			(
				pCurrent += pIncrement;
				pCount -= 1;
				pSpeed = (twoPi * pCurrent) / srate;
			);
				
			aCount > 0 ?
			(
				aCurrent += aIncrement;
				aCount -= 1;
			);
					
			sampleCounter = 0;		
		);

		tone = sin(tPos);
		pulse = sin(pPos);
		pulse < 0 ?
			pulse = 0;

		buf[i] = tone * pulse * aCurrent;
		
		(tPos += tSpeed) >= twoPi ?
			tPos -= twoPi;
			
		(pPos += pSpeed) >= twoPi ?
			pPos -= twoPi;
		
		i += 1;
		samplesLeft -= 1;

		samplesLeft > 0; //Loop condition
	);
);

i = 0; //Reset sample counter

/////////////////////////////////////////////////////////////////////////////////////////////////
@sample
On ?
(
	spl0 += buf[i];
	spl1 += buf[i];
	i += 1;
);

