More fixes
This commit is contained in:
@@ -128,58 +128,26 @@ public:
|
||||
const float ph = fraction( _ph );
|
||||
const float lookupf = ph * static_cast<float>( tlen );
|
||||
const int lookup = static_cast<int>( lookupf );
|
||||
const float ip = fraction( lookupf );
|
||||
|
||||
const sample_t s1 = s_waveforms[ _wave ].sampleAt( t, lookup );
|
||||
const sample_t s2 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 1 ) % tlen );
|
||||
return linearInterpolate( s1, s2, fraction( lookupf ) );
|
||||
const sample_t s12 = linearInterpolate( s1, s2, ip );
|
||||
|
||||
return s12;
|
||||
/*if( _wavelen > 0.75 * tlen ) return s12;
|
||||
|
||||
/*const int tlen1 = 1 << t;
|
||||
const int tlen2 = 1 << ( t - 1 );
|
||||
lookup = lookup >> 1;
|
||||
tlen = tlen >> 1;
|
||||
t -= 1;
|
||||
const sample_t s3 = s_waveforms[ _wave ].sampleAt( t, lookup );
|
||||
const sample_t s4 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 1 ) % tlen );
|
||||
const sample_t s34 = linearInterpolate( s3, s4, ip );
|
||||
|
||||
const float ph = fraction( _ph );
|
||||
const float lookupf = ph * static_cast<float>( tlen1 );
|
||||
const int lookup1 = static_cast<int>( lookupf );
|
||||
const int lookup2 = static_cast<int>( ph * static_cast<float>( tlen2 ) );
|
||||
|
||||
const sample_t s1 = linearInterpolate( s_waveforms[ _wave ].sampleAt( t, lookup1 ),
|
||||
s_waveforms[ _wave ].sampleAt( t, ( lookup1 + 1 ) % tlen1 ),
|
||||
fraction( lookupf ) );
|
||||
const sample_t s2 = s_waveforms[ _wave ].sampleAt( t - 1, lookup2 );
|
||||
|
||||
const float ip = static_cast<float>( tlen1 - _wavelen ) / static_cast<float>( tlen2 );
|
||||
const float ip2 = ( ( _wavelen - tlen ) / tlen - 0.5 ) * 2.0;
|
||||
|
||||
return linearInterpolate( s34, s12, ip2 );*/
|
||||
|
||||
return linearInterpolate( s1, s2, ip );*/
|
||||
};
|
||||
|
||||
/*! \brief The same as oscillate but uses cosinus interpolation instead of linear.
|
||||
*/
|
||||
static inline sample_t oscillateCos( float _ph, float _wavelen, Waveforms _wave )
|
||||
{
|
||||
int t = MAXLEN;
|
||||
while( ( 1 << t ) > _wavelen ) { t--; }
|
||||
t = qMax( 1, t );
|
||||
|
||||
const int tlen = 1 << t;
|
||||
const float ph = fraction( _ph );
|
||||
const int lookup = static_cast<int>( ph * tlen );
|
||||
const sample_t s1 = s_waveforms[ _wave ].sampleAt( t, lookup );
|
||||
const sample_t s2 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 1 ) % tlen );
|
||||
|
||||
return cosinusInterpolate( s1, s2, ph );
|
||||
};
|
||||
|
||||
/*! \brief The same as oscillate but without any interpolation.
|
||||
*/
|
||||
static inline sample_t oscillateNoip( float _ph, float _wavelen, Waveforms _wave )
|
||||
{
|
||||
int t = MAXLEN;
|
||||
while( ( 1 << t ) > _wavelen ) { t--; }
|
||||
t = qMax( 1, t );
|
||||
|
||||
const int tlen = 1 << t;
|
||||
const float ph = fraction( _ph );
|
||||
const int lookup = static_cast<int>( ph * tlen );
|
||||
return s_waveforms[ _wave ].sampleAt( t, lookup );
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -79,13 +79,16 @@ inline float cubicInterpolate( float v0, float v1, float v2, float v3, float x )
|
||||
|
||||
inline float cosinusInterpolate( float v0, float v1, float x )
|
||||
{
|
||||
float f = cosf( x * ( F_PI_2 ) );
|
||||
return( v1 - f * (v1-v0) );
|
||||
const float f = ( 1.0f - cosf( x * F_PI ) ) * 0.5f;
|
||||
#ifdef FP_FAST_FMAF
|
||||
return fmaf( x, v1-v0, v0 );
|
||||
#else
|
||||
return f * (v1-v0) + v0;
|
||||
#endif
|
||||
// return( v0*f + v1*( 1.0f-f ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
inline float linearInterpolate( float v0, float v1, float x )
|
||||
{
|
||||
// take advantage of fma function if present in hardware
|
||||
|
||||
@@ -23,10 +23,11 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _LMMS_MATH_H
|
||||
#define _LMMS_MATH_H
|
||||
#ifndef LMMS_MATH_H
|
||||
#define LMMS_MATH_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "lmms_constants.h"
|
||||
|
||||
#ifdef __INTEL_COMPILER
|
||||
|
||||
@@ -123,7 +124,7 @@ static inline double fastPow( double a, double b )
|
||||
// sinc function
|
||||
static inline double sinc( double _x )
|
||||
{
|
||||
return sin( F_PI * _x ) / ( F_PI * _x );
|
||||
return _x == 0.0 ? 1.0 : sin( F_PI * _x ) / ( F_PI * _x );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user