Oscillator: fixed samplerate dependence of FM/PM

When doing FM/PM, the value of sub-oscillator is globally/locally added to
phase. However when doing this, a ratio between fixed default samplerate and
actual samplerate needs to be taken into account in the phase calculation.

This commit fixes missounding render output when rendering projects with
FM/PM inside at higher samplerates. (Thanks to Skiessi for his ladspa2.mmpz
which clearly brought up this bug)
(cherry picked from commit acaaea8204)
This commit is contained in:
Tobias Doerffel
2009-03-21 10:20:32 +01:00
parent 8ec501d6c6
commit a850c1dd43

View File

@@ -375,10 +375,13 @@ void oscillator::updatePM( sampleFrame * _ab, const fpp_t _frames,
m_subOsc->update( _ab, _frames, _chnl );
recalcPhase();
const float osc_coeff = m_freq * m_detuning;
const float sampleRateCorrection = 44100.0f /
engine::getMixer()->processingSampleRate();
for( fpp_t frame = 0; frame < _frames; ++frame )
{
_ab[frame][_chnl] = getSample<W>( m_phase + _ab[frame][_chnl] )
_ab[frame][_chnl] = getSample<W>( m_phase +
_ab[frame][_chnl]*sampleRateCorrection )
* m_volume;
m_phase += osc_coeff;
}
@@ -457,10 +460,12 @@ void oscillator::updateFM( sampleFrame * _ab, const fpp_t _frames,
m_subOsc->update( _ab, _frames, _chnl );
recalcPhase();
const float osc_coeff = m_freq * m_detuning;
const float sampleRateCorrection = 44100.0f /
engine::getMixer()->processingSampleRate();
for( fpp_t frame = 0; frame < _frames; ++frame )
{
m_phase += _ab[frame][_chnl];
m_phase += _ab[frame][_chnl] * sampleRateCorrection;
_ab[frame][_chnl] = getSample<W>( m_phase ) * m_volume;
m_phase += osc_coeff;
}