mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-08 14:13:57 +01:00
Fix for bug 955 from Clayton Otey
This commit is contained in:
@@ -200,6 +200,18 @@ bool EffectSBSMS::ProcessLabelTrack(Track *t)
|
||||
return true;
|
||||
}
|
||||
|
||||
double EffectSBSMS::getInvertedStretchedTime(double rateStart, double rateEnd, SlideType slideType, double outputTime)
|
||||
{
|
||||
Slide slide(slideType,rateStart,rateEnd,0);
|
||||
return slide.getInverseStretchedTime(outputTime);
|
||||
}
|
||||
|
||||
double EffectSBSMS::getRate(double rateStart, double rateEnd, SlideType slideType, double t)
|
||||
{
|
||||
Slide slide(slideType,rateStart,rateEnd,0);
|
||||
return slide.getRate(t);
|
||||
}
|
||||
|
||||
bool EffectSBSMS::Process()
|
||||
{
|
||||
bool bGoodResult = true;
|
||||
@@ -307,6 +319,8 @@ bool EffectSBSMS::Process()
|
||||
bPitchReferenceInput,
|
||||
samplesToProcess,0,
|
||||
NULL);
|
||||
|
||||
|
||||
} else {
|
||||
rb.bPitch = false;
|
||||
outSlideType = (srProcess==srTrack?SlideIdentity:SlideConstant);
|
||||
@@ -330,7 +344,7 @@ bool EffectSBSMS::Process()
|
||||
samplesToProcess,processPresamples,
|
||||
rb.quality);
|
||||
}
|
||||
|
||||
|
||||
Resampler resampler(outResampleCB,&rb,outSlideType);
|
||||
|
||||
audio outBuf[SBSMSOutBlockSize];
|
||||
|
||||
@@ -28,7 +28,8 @@ public:
|
||||
void setParameters(double rateStart, double rateEnd, double pitchStart, double pitchEnd,
|
||||
SlideType rateSlideType, SlideType pitchSlideType,
|
||||
bool bLinkRatePitch, bool bRateReferenceInput, bool bPitchReferenceInput);
|
||||
|
||||
static double getInvertedStretchedTime(double rateStart, double rateEnd, SlideType slideType, double outputTime);
|
||||
static double getRate(double rateStart, double rateEnd, SlideType slideType, double t);
|
||||
private:
|
||||
bool ProcessLabelTrack(Track *track);
|
||||
double rateStart, rateEnd, pitchStart, pitchEnd;
|
||||
|
||||
@@ -72,6 +72,11 @@ EffectTimeScale::EffectTimeScale()
|
||||
m_PitchPercentChangeStart = DEF_PitchPercentStart;
|
||||
m_PitchPercentChangeEnd = DEF_PitchPercentEnd;
|
||||
|
||||
slideTypeRate = SlideLinearOutputRate;
|
||||
slideTypePitch = SlideLinearOutputRate;
|
||||
bPreview = false;
|
||||
previewSelectedDuration = 0.0;
|
||||
|
||||
SetLinearEffectFlag(true);
|
||||
}
|
||||
|
||||
@@ -143,13 +148,42 @@ bool EffectTimeScale::Init()
|
||||
return true;
|
||||
}
|
||||
|
||||
double EffectTimeScale::CalcPreviewInputLength(double previewLength)
|
||||
{
|
||||
double inputLength = Effect::GetDuration();
|
||||
if(inputLength == 0.0) {
|
||||
return 0.0;
|
||||
} else {
|
||||
double rateStart = PercentChangeToRatio(m_RatePercentChangeStart);
|
||||
double rateEnd = PercentChangeToRatio(m_RatePercentChangeEnd);
|
||||
double tOut = previewLength/inputLength;
|
||||
double t = EffectSBSMS::getInvertedStretchedTime(rateStart,rateEnd,slideTypeRate,tOut);
|
||||
return t * inputLength;
|
||||
}
|
||||
}
|
||||
|
||||
void EffectTimeScale::Preview(bool dryOnly)
|
||||
{
|
||||
previewSelectedDuration = Effect::GetDuration();
|
||||
bPreview = true;
|
||||
Effect::Preview(dryOnly);
|
||||
bPreview = false;
|
||||
}
|
||||
|
||||
bool EffectTimeScale::Process()
|
||||
{
|
||||
double pitchStart = PercentChangeToRatio(m_PitchPercentChangeStart);
|
||||
double pitchEnd = PercentChangeToRatio(m_PitchPercentChangeEnd);
|
||||
double rateStart = PercentChangeToRatio(m_RatePercentChangeStart);
|
||||
double rateEnd = PercentChangeToRatio(m_RatePercentChangeEnd);
|
||||
EffectSBSMS::setParameters(rateStart,rateEnd,pitchStart,pitchEnd,SlideLinearOutputRate,SlideLinearOutputRate,false,false,false);
|
||||
|
||||
if(bPreview) {
|
||||
double t = (mT1-mT0) / previewSelectedDuration;
|
||||
rateEnd = EffectSBSMS::getRate(rateStart,rateEnd,slideTypeRate,t);
|
||||
pitchEnd = EffectSBSMS::getRate(pitchStart,pitchEnd,slideTypePitch,t);
|
||||
}
|
||||
|
||||
EffectSBSMS::setParameters(rateStart,rateEnd,pitchStart,pitchEnd,slideTypeRate,slideTypePitch,false,false,false);
|
||||
return EffectSBSMS::Process();
|
||||
}
|
||||
|
||||
|
||||
@@ -50,10 +50,12 @@ public:
|
||||
// Effect implementation
|
||||
|
||||
virtual bool Init();
|
||||
virtual void Preview(bool dryOnly);
|
||||
virtual bool Process();
|
||||
virtual void PopulateOrExchange(ShuttleGui & S);
|
||||
virtual bool TransferDataToWindow();
|
||||
virtual bool TransferDataFromWindow();
|
||||
virtual double CalcPreviewInputLength(double previewLength);
|
||||
|
||||
private:
|
||||
// EffectTimeScale implementation
|
||||
@@ -82,6 +84,10 @@ private:
|
||||
void Update_Slider_RatePercentChangeEnd();
|
||||
|
||||
private:
|
||||
bool bPreview;
|
||||
double previewSelectedDuration;
|
||||
SlideType slideTypeRate;
|
||||
SlideType slideTypePitch;
|
||||
double m_RatePercentChangeStart;
|
||||
double m_RatePercentChangeEnd;
|
||||
double m_PitchHalfStepsStart;
|
||||
|
||||
Reference in New Issue
Block a user