Changes again - moved frequency calculations to a static method... for some reason this saves a lot of cpu.

This commit is contained in:
Vesa
2014-03-24 03:55:43 +02:00
parent 7f98215c29
commit bfa73aa5a5
2 changed files with 20 additions and 13 deletions

View File

@@ -62,7 +62,8 @@ float WTSynthObject::s_mult [NUM_OSCS];
float WTSynthObject::s_ltune [NUM_OSCS];
float WTSynthObject::s_rtune [NUM_OSCS];
float WTSynthObject::s_xtalk;
float WTSynthObject::s_lfreq [NUM_OSCS];
float WTSynthObject::s_rfreq [NUM_OSCS];
WTSynthObject::WTSynthObject( float * _A1wave, float * _A2wave,
@@ -105,13 +106,6 @@ WTSynthObject::~WTSynthObject()
void WTSynthObject::renderOutput( fpp_t _frames )
{
// calculate frequencies
for( int i = 0; i < NUM_OSCS; i++ )
{
m_lfreq[i] = ( s_mult[i] / 8 ) * powf( 2, s_ltune[i] / 1200 );
m_rfreq[i] = ( s_mult[i] / 8 ) * powf( 2, s_rtune[i] / 1200 );
}
if( m_abuf == NULL )
m_abuf = new sampleFrame[m_fpp];
if( m_bbuf == NULL )
@@ -225,9 +219,9 @@ void WTSynthObject::renderOutput( fpp_t _frames )
// update phases
for( int i = 0; i < NUM_OSCS; i++ )
{
m_lphase[i] += ( static_cast<float>( WAVELEN ) / ( m_samplerate / ( m_nph->frequency() * m_lfreq[i] ) ) );
m_lphase[i] += ( static_cast<float>( WAVELEN ) / ( m_samplerate / ( m_nph->frequency() * s_lfreq[i] ) ) );
m_lphase[i] = fmodf( m_lphase[i], WAVELEN );
m_rphase[i] += ( static_cast<float>( WAVELEN ) / ( m_samplerate / ( m_nph->frequency() * m_rfreq[i] ) ) );
m_rphase[i] += ( static_cast<float>( WAVELEN ) / ( m_samplerate / ( m_nph->frequency() * s_rfreq[i] ) ) );
m_rphase[i] = fmodf( m_rphase[i], WAVELEN );
}
}
@@ -256,6 +250,17 @@ void WTSynthObject::changeTune( int _osc, float _ltune, float _rtune )
}
void WTSynthObject::updateFrequency()
{
// calculate frequencies
for( int i = 0; i < NUM_OSCS; i++ )
{
s_lfreq[i] = ( s_mult[i] / 8 ) * powf( 2, s_ltune[i] / 1200 );
s_rfreq[i] = ( s_mult[i] / 8 ) * powf( 2, s_rtune[i] / 1200 );
}
}
WTSynthInstrument::WTSynthInstrument( InstrumentTrack * _instrument_track ) :
Instrument( _instrument_track, &wtsynth_plugin_descriptor ),
@@ -614,6 +619,7 @@ void WTSynthInstrument::updateMult()
WTSynthObject::changeMult( A2_OSC, a2_mult.value() );
WTSynthObject::changeMult( B1_OSC, b1_mult.value() );
WTSynthObject::changeMult( B2_OSC, b2_mult.value() );
WTSynthObject::updateFrequency();
}
void WTSynthInstrument::updateTunes()
{
@@ -621,6 +627,7 @@ void WTSynthInstrument::updateTunes()
WTSynthObject::changeTune( A2_OSC, a2_ltune.value(), a2_rtune.value() );
WTSynthObject::changeTune( B1_OSC, b1_ltune.value(), b1_rtune.value() );
WTSynthObject::changeTune( B2_OSC, b2_ltune.value(), b2_rtune.value() );
WTSynthObject::updateFrequency();
}
void WTSynthInstrument::updateXtalk()
{

View File

@@ -83,6 +83,7 @@ public:
static void changeVolume( int _osc, float _lvol, float _rvol );
static void changeMult( int _osc, float _mul );
static void changeTune( int _osc, float _ltune, float _rtune );
static void updateFrequency();
static inline void changeXtalk( float _xtalk )
{
@@ -111,6 +112,8 @@ private:
static float s_ltune [NUM_OSCS];
static float s_rtune [NUM_OSCS];
static float s_xtalk;
static float s_lfreq [NUM_OSCS];
static float s_rfreq [NUM_OSCS];
// linear interpolation
/* inline sample_t interpolate( sample_t s1, sample_t s2, float x )
@@ -143,9 +146,6 @@ private:
float m_lphase [NUM_OSCS];
float m_rphase [NUM_OSCS];
float m_lfreq [NUM_OSCS];
float m_rfreq [NUM_OSCS];
float m_A1wave [WAVELEN];
float m_A2wave [WAVELEN];
float m_B1wave [WAVELEN];