4 float slEnvelope::getValue ( float _time )
7 int step = getStepDelta ( &_time, &delta ) ;
9 return delta * (_time - time[step]) + value[step] ;
14 int slEnvelope::getStepDelta ( float *_time, float *delta )
18 if ( replay_mode == SL_SAMPLE_LOOP )
20 tt = floor ( *_time / time [ nsteps-1 ] ) ;
21 *_time -= tt * time [ nsteps-1 ] ;
26 if ( tt <= time[ 0 ] ) { *delta = 0.0f ; return 0 ; }
27 if ( tt >= time[nsteps-1] ) { *delta = 0.0f ; return nsteps-1 ; }
29 for ( int i = 1 ; i <= nsteps-1 ; i++ )
32 float t1 = time[i-1] ; float v1 = value[i-1] ;
33 float t2 = time[ i ] ; float v2 = value[ i ] ;
41 *delta = (v2-v1) / (t2-t1) ;
50 void slEnvelope::applyToPitch ( Uchar *dst, slSamplePlayer *src,
51 int nframes, int start, int next_env )
54 float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
55 int step = getStepDelta ( &_time, &delta ) ;
56 float _value = delta * (_time - time[step]) + value[step] ;
58 delta /= (float) slScheduler::getCurrent() -> getRate () ;
60 unsigned char tmp [ 512 ] ;
63 unsigned char last = 0x80 ;
70 int offset = (int) ( npos - pos ) ;
81 src -> read ( offset, tmp, next_env ) ;
83 *(dst++) = last = tmp [ offset-1 ] ;
89 void slEnvelope::applyToInvPitch ( Uchar *dst, slSamplePlayer *src,
90 int nframes, int start, int next_env )
93 float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
94 int step = getStepDelta ( &_time, &delta ) ;
95 float _value = delta * (_time - time[step]) + value[step] ;
97 delta /= (float) slScheduler::getCurrent() -> getRate () ;
99 unsigned char tmp [ 512 ] ;
102 unsigned char last = 0x80 ;
106 npos += 1.0 / _value ;
109 int offset = (int) ( npos - pos ) ;
120 src -> read ( offset, tmp, next_env ) ;
122 *(dst++) = last = tmp [ offset-1 ] ;
127 void slEnvelope::applyToVolume ( Uchar *dst, Uchar *src,
128 int nframes, int start )
131 float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
132 int step = getStepDelta ( &_time, &delta ) ;
133 float _value = delta * (_time - time[step]) + value[step] ;
135 delta /= (float) slScheduler::getCurrent() -> getRate () ;
139 register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ;
143 *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ;
147 void slEnvelope::applyToInvVolume ( Uchar *dst, Uchar *src,
148 int nframes, int start )
151 float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
152 int step = getStepDelta ( &_time, &delta ) ;
153 float _value = delta * (_time - time[step]) + value[step] ;
155 delta /= (float) slScheduler::getCurrent() -> getRate () ;
158 _value = 1.0 - _value ;
162 register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ;
166 *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ;