Example #1
0
void EnvGenUGenInternal::processBlock(bool& shouldDelete, const unsigned int blockID, const int channel) throw()
{
	int numSamplesToProcess = uGenOutput.getBlockSize();
	float* outputSamples = uGenOutput.getSampleData();
	
	if(isStealing() == false && shouldSteal() == true)
	{
		setIsStealing();
		const int numLevels = env_.getLevels().size();
		float stealValue = (float)currentValue;
		float targetValue = env_.getLevels().getSampleUnchecked(numLevels-1);
		float inc = (targetValue - stealValue) / (float)numSamplesToProcess;
		while(numSamplesToProcess)
		{
			*outputSamples++ = stealValue;
			stealValue += inc;
			--numSamplesToProcess;
		}
		shouldDelete = shouldDelete ? true : shouldDeleteValue;
		currentValue = targetValue;
		currentCurve = EnvCurve(EnvCurve::Empty);
		setIsDone();
	}
	else
	{
		if(isReleasing() == false && shouldRelease() == true)
		{
			int releaseNode = env_.getReleaseNode();

			if(releaseNode >= 0) // try this, - don't release if releaseNode is -1
			{
				setSegment(releaseNode, UGen::getSampleRate());
			}
		}		
		
		while(numSamplesToProcess && isDone() == false)
		{
			int samplesThisTime = min(stepsUntilTarget, numSamplesToProcess);
			numSamplesToProcess -= samplesThisTime;
			stepsUntilTarget -= samplesThisTime;
			
			// select from different curves here..., use a different loop
			
			switch(currentCurve.getType())
			{
				case EnvCurve::Numerical:
					while(samplesThisTime)
					{
						*outputSamples++ = (float)currentValue;
						b1 *= grow;
						currentValue = a2 - b1;
						--samplesThisTime;
					}
					break;
				case EnvCurve::Linear:
					while(samplesThisTime)
					{
						*outputSamples++ = (float)currentValue;
						currentValue += grow;
						--samplesThisTime;
					}
					break;
				case EnvCurve::Exponential:
					while(samplesThisTime)
					{
						*outputSamples++ = (float)currentValue;
						currentValue *= grow;
						--samplesThisTime;
					}
					break;
				case EnvCurve::Sine:
					while(samplesThisTime)
					{
						*outputSamples++ = (float)currentValue;
						double y0 = b1 * y1 - y2; 
						currentValue = a2 - y0;
						y2 = y1; 
						y1 = y0;
						--samplesThisTime;
					}
					break;
				case EnvCurve::Welch:
					while(samplesThisTime)
					{
						*outputSamples++ = (float)currentValue;
						double y0 = b1 * y1 - y2; 
						currentValue = a2 + y0;
						y2 = y1; 
						y1 = y0;
						--samplesThisTime;
					}
					break;
				case EnvCurve::Empty:
				case EnvCurve::Step:
				default:
					while(samplesThisTime)
					{
						*outputSamples++ = (float)currentValue;
						--samplesThisTime;
					}
			}
			
			if(stepsUntilTarget <= 0)
			{
				if(setSegment(currentSegment + 1, UGen::getSampleRate()) == true)
				{
					shouldDelete = shouldDelete ? true : shouldDeleteValue;
					const int numLevels = env_.getLevels().size();
					currentValue = env_.getLevels().getSampleUnchecked(numLevels-1);
					currentCurve = EnvCurve(EnvCurve::Empty);
					goto exit;
				}
			}
		}
	}
		
	while(numSamplesToProcess--)
	{
		*outputSamples++ = (float)currentValue;
	}
		
	return;
	
exit:
	while(numSamplesToProcess--)
	{
		*outputSamples++ = (float)currentValue;
	}
	setIsDone();
	
	sendDoneInternal();
}
Example #2
0
void LoopPointsUGenInternal::prepareForBlock(const int /*actualBlockSize*/, const unsigned int /*blockID*/, const int /*channel*/) throw()
{
	senderUserData = userData;
	if(isDone()) sendDoneInternal();
}
Example #3
0
void ASRUGenInternal::prepareForBlock(const int actualBlockSize, const unsigned int blockID, const int channel) throw()
{
	senderUserData = userData;
	if(isDone()) sendDoneInternal();
}