Exemplo n.º 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();
}
Exemplo n.º 2
0
void ASRUGenInternal::steal() throw()
{
	setIsStealing();
	setStealSegment();
}
Exemplo n.º 3
0
void EnvGenUGenInternalK::processBlock(bool& shouldDelete, const unsigned int blockID, const int channel) throw()
{
	const int krBlockSize = UGen::getControlRateBlockSize();
	unsigned int blockPosition = blockID % krBlockSize;
	int numSamplesToProcess = uGenOutput.getBlockSize();
	float* outputSamples = uGenOutput.getSampleData();
	
	int numKrSamples = blockPosition % krBlockSize;
	
	double prevValue = currentValue;
	
	if(isDone()) goto exit;

	while(numSamplesToProcess > 0)
	{
		prevValue = currentValue;
		if(numKrSamples == 0)
		{
			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();
				return;
			}
			else
			{
				if(isReleasing() == false && shouldRelease() == true)
				{
					int releaseNode = env_.getReleaseNode();
//					if(releaseNode < 0)
//					{
//						releaseNode = env_.getTimes().size() - 1;
//					}
//					
//					setSegment(releaseNode, UGen::getSampleRate() / krBlockSize);
					
					if(releaseNode >= 0) // try this..
					{
						setSegment(releaseNode, UGen::getSampleRate() / krBlockSize);
					}
				}		
				
				--stepsUntilTarget;
									
				double y0;
				switch(currentCurve.getType())
				{
					case EnvCurve::Numerical:
						currentValue = a2 - b1;
						b1 *= grow;
						break;
					case EnvCurve::Linear:
						currentValue += grow;
						break;
					case EnvCurve::Exponential:
						currentValue *= grow;
						break;
					case EnvCurve::Sine:
						y0 = b1 * y1 - y2; 
						currentValue = a2 - y0;
						y2 = y1; y1 = y0;
						break;
					case EnvCurve::Welch:
						y0 = b1 * y1 - y2; 
						currentValue = a2 + y0;
						y2 = y1; y1 = y0;
						break;
					case EnvCurve::Empty:
					case EnvCurve::Step:
					default:
						;
				}
				
				if(stepsUntilTarget <= 0)
				{
					if(setSegment(currentSegment + 1, UGen::getSampleRate() / krBlockSize) == true)
					{
						shouldDelete = shouldDelete ? true : shouldDeleteValue;
						const int numLevels = env_.getLevels().size();
						currentValue = env_.getLevels().getSampleUnchecked(numLevels-1);
						currentCurve = EnvCurve(EnvCurve::Empty);
						goto exit;
					}
				}
				
			}
		}
		
		numKrSamples = krBlockSize - numKrSamples;
		blockPosition += numKrSamples;
		
		if(prevValue == currentValue)
		{
			while(numSamplesToProcess && numKrSamples)
			{
				*outputSamples++ = (float)prevValue;
				--numSamplesToProcess;
				--numKrSamples;
			}
		}
		else
		{
			double valueSlope = (currentValue - prevValue) / (double)UGen::getControlRateBlockSize();
			
			while(numSamplesToProcess && numKrSamples)
			{
				*outputSamples++ = (float)prevValue;
				prevValue += valueSlope;
				--numSamplesToProcess;
				--numKrSamples;
			}
		}
	}		
	
	return;

exit:
	
	if(prevValue == currentValue)
	{
		while(numSamplesToProcess > 0)
		{
			*outputSamples++ = (float)prevValue;
			--numSamplesToProcess;
		}
	}
	else
	{
		double valueSlope = (currentValue - prevValue) / (double)numSamplesToProcess;
		while(numSamplesToProcess > 0)
		{
			*outputSamples++ = (float)prevValue;
			prevValue += valueSlope;
			--numSamplesToProcess;
		}
	}
	
	setIsDone();
}