1 #ifndef STK_LENTPITSHIFT_H 
    2 #define STK_LENTPITSHIFT_H 
   24   LentPitShift( StkFloat periodRatio = 1.0, 
int tMax = RT_BUFFER_SIZE );
 
   40   StkFloat 
tick( StkFloat input );
 
   92   unsigned long lastPeriod_;    
 
  115   unsigned long alternativePitch = tMax_;  
 
  116   lastPeriod_ = tMax_+1;         
 
  119   unsigned long delay_;
 
  126   for ( delay_=1; delay_<=tMax_; delay_++ )
 
  130   for ( n=0; n<inputFrames.
size(); n++ ) {
 
  131     x_t = inputLine_.
tick( inputFrames[ n ] );
 
  132     for ( delay_=1; delay_<= tMax_; delay_++ ) {
 
  133       x_t_T = inputLine_.
tapOut( delay_ );
 
  135       dt[delay_] += coeff * coeff;
 
  140   for ( delay_=1; delay_<=tMax_; delay_++ ) {
 
  141     cumDt[delay_] = dt[delay_] + cumDt[delay_-1];
 
  142     dpt[delay_] = dt[delay_] * delay_ / cumDt[delay_];
 
  145     if ( dpt[delay_-1]-dpt[delay_-2] < 0 && dpt[delay_]-dpt[delay_-1] > 0 ) {
 
  147       if ( dpt[delay_-1] < threshold_ ){
 
  148         lastPeriod_ = delay_-1;
 
  152       else if ( dpt[alternativePitch] > dpt[delay_-1] )
 
  154         alternativePitch = delay_-1;
 
  159   if ( dpt[delay_]-dpt[delay_-1] < 0 ) {
 
  160     if ( dpt[delay_] < threshold_ )
 
  161       lastPeriod_ = delay_;
 
  162     else if ( dpt[alternativePitch] > dpt[delay_] )
 
  163       alternativePitch = delay_;
 
  166   if ( lastPeriod_ == tMax_+1 )
 
  168     lastPeriod_ = alternativePitch;
 
  172   outputLine_.
tick( zeroFrame, outputFrames );
 
  175   for ( 
int n=-(
int)lastPeriod_; n<(int)lastPeriod_; n++ )
 
  176     window[n+lastPeriod_] = (1 + cos(PI*n/lastPeriod_)) / 2    ;
 
  183   for ( ; inputPtr<(int)(tMax_-lastPeriod_); inputPtr+=lastPeriod_ ) {
 
  185     while ( outputPtr < inputPtr ) {
 
  187       env[1] = fmod( outputPtr + tMax_, 1.0 );
 
  188       env[0] = 1.0 - env[1];
 
  189       M = tMax_ - inputPtr + lastPeriod_ - 1; 
 
  190       N = 2*tMax_ - (
unsigned long)floor(outputPtr + tMax_) + lastPeriod_ - 1; 
 
  191       for ( 
unsigned int j=0; j<2*lastPeriod_; j++,M--,N-- ) {
 
  192         sample = inputLine_.
tapOut(M) * window[j] / 2.;
 
  194         outputLine_.
addTo(env[0] * sample, N);
 
  195         outputLine_.
addTo(env[1] * sample, N-1);
 
  197       outputPtr = outputPtr + lastPeriod_ * periodRatio_; 
 
  210   inputFrames[ptrFrames] = input;
 
  212   sample = outputFrames[ptrFrames++];
 
  215   if ( ptrFrames == (
int) inputFrames.
size() ){
 
  225 #if defined(_STK_DEBUG_) 
  226   if ( channel >= frames.
channels() ) {
 
  227     oStream_ << 
"LentPitShift::tick(): channel and StkFrames arguments are incompatible!";
 
  232   StkFloat *samples = &frames[channel];
 
  233   unsigned int hop = frames.
channels();
 
  234   for ( 
unsigned int i=0; i<frames.
frames(); i++, samples += hop ) {
 
  235     *samples = 
tick( *samples );
 
  243 #if defined(_STK_DEBUG_) 
  245     oStream_ << 
"LentPitShift::tick(): channel and StkFrames arguments are incompatible!";
 
  250   StkFloat *iSamples = &iFrames[iChannel];
 
  251   StkFloat *oSamples = &oFrames[oChannel];
 
  253   for ( 
unsigned int i=0; i<iFrames.
frames(); i++, iSamples += iHop, oSamples += oHop ) {
 
  254     *oSamples = 
tick( *iSamples );