Exemple #1
0
void LfoController::updateValueBuffer()
{
	m_phaseOffset = m_phaseModel.value() / 360.0;	
	float * values = m_valueBuffer.values();	
	float phase = m_currentPhase + m_phaseOffset;

	// roll phase up until we're in sync with period counter
	m_bufferLastUpdated++; 
	if( m_bufferLastUpdated < s_periods )
	{
		int diff = s_periods - m_bufferLastUpdated;
		phase += static_cast<float>( engine::framesPerTick() * diff ) / m_duration;
		m_bufferLastUpdated += diff;
	}


	for( int i = 0; i < m_valueBuffer.length(); i++ )
	{		
		const float currentSample = m_sampleFunction != NULL 
			? m_sampleFunction( phase )
			: m_userDefSampleBuffer->userWaveSample( phase );
			
		values[i] = qBound( 0.0f, m_baseModel.value() + ( m_amountModel.value() * currentSample / 2.0f ), 1.0f );

		phase += 1.0 / m_duration;
	}
	
	m_currentPhase = absFraction( phase - m_phaseOffset );
}
// should be called every time phase-offset is changed...
inline void Oscillator::recalcPhase()
{
	if( !typeInfo<float>::isEqual( m_phaseOffset, m_ext_phaseOffset ) )
	{
		m_phase -= m_phaseOffset;
		m_phaseOffset = m_ext_phaseOffset;
		m_phase += m_phaseOffset;
	}
	m_phase = absFraction( m_phase )+2;	// make sure we're not running
						// negative when doing PM
}