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 }