2010-01-23 19:44:49 +00:00
|
|
|
/**********************************************************************
|
|
|
|
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
|
|
|
|
ChangeTempo.cpp
|
|
|
|
|
2014-06-03 20:30:19 +00:00
|
|
|
Vaughan Johnson,
|
2010-01-23 19:44:49 +00:00
|
|
|
Dominic Mazzoni
|
|
|
|
|
|
|
|
*******************************************************************//**
|
|
|
|
|
|
|
|
\class EffectChangeTempo
|
2014-06-03 20:30:19 +00:00
|
|
|
\brief An EffectSoundTouch provides speeding up or
|
2010-01-23 19:44:49 +00:00
|
|
|
slowing down tempo without changing pitch.
|
|
|
|
|
|
|
|
*//*******************************************************************/
|
|
|
|
|
|
|
|
#include "../Audacity.h" // for USE_SOUNDTOUCH
|
|
|
|
|
|
|
|
#if USE_SOUNDTOUCH
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include <wx/intl.h>
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
#include "../ShuttleGui.h"
|
2015-04-17 03:53:42 +00:00
|
|
|
#include "../widgets/valnum.h"
|
2010-01-23 19:44:49 +00:00
|
|
|
#include "TimeWarper.h"
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
#include "ChangeTempo.h"
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
ID_PercentChange = 10000,
|
|
|
|
ID_FromBPM,
|
|
|
|
ID_ToBPM,
|
|
|
|
ID_FromLength,
|
|
|
|
ID_ToLength
|
|
|
|
};
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// Soundtouch is not reasonable below -99% or above 3000%.
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// Define keys, defaults, minimums, and maximums for the effect parameters
|
|
|
|
//
|
2015-04-19 03:49:05 +00:00
|
|
|
// Name Type Key Def Min Max Scale
|
|
|
|
Param( Percentage, double, XO("Percentage"), 0.0, -99.0, 3000.0, 1 );
|
2015-04-17 03:53:42 +00:00
|
|
|
|
|
|
|
// We warp the slider to go up to 400%, but user can enter higher values.
|
|
|
|
static const double kSliderMax = 100.0; // warped above zero to actually go up to 400%
|
|
|
|
static const double kSliderWarp = 1.30105; // warp power takes max from 100 to 400.
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
//
|
|
|
|
// EffectChangeTempo
|
|
|
|
//
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
BEGIN_EVENT_TABLE(EffectChangeTempo, wxEvtHandler)
|
|
|
|
EVT_TEXT(ID_PercentChange, EffectChangeTempo::OnText_PercentChange)
|
|
|
|
EVT_SLIDER(ID_PercentChange, EffectChangeTempo::OnSlider_PercentChange)
|
|
|
|
EVT_TEXT(ID_FromBPM, EffectChangeTempo::OnText_FromBPM)
|
|
|
|
EVT_TEXT(ID_ToBPM, EffectChangeTempo::OnText_ToBPM)
|
|
|
|
EVT_TEXT(ID_ToLength, EffectChangeTempo::OnText_ToLength)
|
|
|
|
END_EVENT_TABLE()
|
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
EffectChangeTempo::EffectChangeTempo()
|
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
m_PercentChange = DEF_Percentage;
|
2013-06-28 03:20:33 +00:00
|
|
|
m_FromBPM = 0.0; // indicates not yet set
|
|
|
|
m_ToBPM = 0.0; // indicates not yet set
|
2013-02-23 04:33:20 +00:00
|
|
|
m_FromLength = 0.0;
|
|
|
|
m_ToLength = 0.0;
|
2015-04-17 03:53:42 +00:00
|
|
|
|
|
|
|
m_bLoopDetect = false;
|
2015-05-15 11:47:51 +00:00
|
|
|
|
|
|
|
SetLinearEffectFlag(true);
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
EffectChangeTempo::~EffectChangeTempo()
|
2013-02-15 00:24:43 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// IdentInterface implementation
|
|
|
|
|
|
|
|
wxString EffectChangeTempo::GetSymbol()
|
|
|
|
{
|
|
|
|
return CHANGETEMPO_PLUGIN_SYMBOL;
|
2014-06-03 20:30:19 +00:00
|
|
|
}
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
wxString EffectChangeTempo::GetDescription()
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-19 03:49:05 +00:00
|
|
|
return XO("Change the tempo of a selection without changing its pitch");
|
2015-04-17 03:53:42 +00:00
|
|
|
}
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// EffectIdentInterface implementation
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
EffectType EffectChangeTempo::GetType()
|
|
|
|
{
|
|
|
|
return EffectTypeProcess;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool EffectChangeTempo::SupportsAutomation()
|
|
|
|
{
|
2013-02-23 04:33:20 +00:00
|
|
|
return true;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// EffectClientInterface implementation
|
|
|
|
|
|
|
|
bool EffectChangeTempo::GetAutomationParameters(EffectAutomationParameters & parms)
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
parms.Write(KEY_Percentage, m_PercentChange);
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
bool EffectChangeTempo::SetAutomationParameters(EffectAutomationParameters & parms)
|
2014-06-03 20:30:19 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
ReadAndVerifyDouble(Percentage);
|
|
|
|
|
|
|
|
m_PercentChange = Percentage;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Effect implementation
|
|
|
|
|
|
|
|
double EffectChangeTempo::CalcPreviewInputLength(double previewLength)
|
|
|
|
{
|
|
|
|
return previewLength * (100.0 + m_PercentChange) / 100.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool EffectChangeTempo::CheckWhetherSkipEffect()
|
|
|
|
{
|
|
|
|
return (m_PercentChange == 0.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool EffectChangeTempo::Init()
|
|
|
|
{
|
|
|
|
// The selection might have changed since the last time EffectChangeTempo
|
|
|
|
// was invoked, so recalculate the Length parameters.
|
|
|
|
m_FromLength = mT1 - mT0;
|
|
|
|
m_ToLength = (m_FromLength * 100.0) / (100.0 + m_PercentChange);
|
|
|
|
|
|
|
|
mSoundTouch = NULL;
|
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool EffectChangeTempo::Process()
|
|
|
|
{
|
|
|
|
mSoundTouch = new SoundTouch();
|
|
|
|
mSoundTouch->setTempoChange(m_PercentChange);
|
|
|
|
double mT1Dashed = mT0 + (mT1 - mT0)/(m_PercentChange/100.0 + 1.0);
|
|
|
|
SetTimeWarper(new RegionTimeWarper(mT0, mT1,
|
|
|
|
new LinearTimeWarper(mT0, mT0, mT1, mT1Dashed )));
|
2015-04-17 03:53:42 +00:00
|
|
|
bool success = EffectSoundTouch::Process();
|
2010-01-23 19:44:49 +00:00
|
|
|
if( success )
|
|
|
|
mT1 = mT0 + (mT1 - mT0)/(m_PercentChange/100 + 1.);
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::PopulateOrExchange(ShuttleGui & S)
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
S.StartVerticalLay(0);
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
S.AddSpace(0, 5);
|
|
|
|
S.AddTitle(_("Change Tempo without Changing Pitch"));
|
|
|
|
S.SetBorder(5);
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
//
|
2015-04-17 03:53:42 +00:00
|
|
|
S.StartMultiColumn(2, wxCENTER);
|
|
|
|
{
|
2015-04-22 18:03:35 +00:00
|
|
|
FloatingPointValidator<double> vldPercentage(3, &m_PercentChange, NUM_VAL_THREE_TRAILING_ZEROES);
|
2015-04-17 03:53:42 +00:00
|
|
|
vldPercentage.SetRange(MIN_Percentage, MAX_Percentage);
|
|
|
|
m_pTextCtrl_PercentChange = S.Id(ID_PercentChange)
|
|
|
|
.AddTextBox(_("Percent Change:"), wxT(""), 12);
|
|
|
|
m_pTextCtrl_PercentChange->SetValidator(vldPercentage);
|
|
|
|
}
|
|
|
|
S.EndMultiColumn();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
//
|
2015-04-17 03:53:42 +00:00
|
|
|
S.StartHorizontalLay(wxEXPAND);
|
|
|
|
{
|
|
|
|
S.SetStyle(wxSL_HORIZONTAL);
|
|
|
|
m_pSlider_PercentChange = S.Id(ID_PercentChange)
|
|
|
|
.AddSlider(wxT(""), 0, (int)kSliderMax, (int)MIN_Percentage);
|
|
|
|
m_pSlider_PercentChange->SetName(_("Percent Change"));
|
|
|
|
}
|
|
|
|
S.EndHorizontalLay();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
//
|
|
|
|
S.StartMultiColumn(5, wxCENTER);
|
|
|
|
{
|
|
|
|
//
|
|
|
|
S.AddUnits(_("Beats per minute:"));
|
|
|
|
|
2015-04-22 18:03:35 +00:00
|
|
|
FloatingPointValidator<double> vldFromBPM(3, &m_FromBPM, NUM_VAL_THREE_TRAILING_ZEROES | NUM_VAL_ZERO_AS_BLANK);
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_FromBPM = S.Id(ID_FromBPM)
|
|
|
|
.AddTextBox(_("from"), wxT(""), 12);
|
|
|
|
m_pTextCtrl_FromBPM->SetName(_("From beats per minute"));
|
|
|
|
m_pTextCtrl_FromBPM->SetValidator(vldFromBPM);
|
|
|
|
|
2015-04-22 18:03:35 +00:00
|
|
|
FloatingPointValidator<double> vldToBPM(3, &m_ToBPM, NUM_VAL_THREE_TRAILING_ZEROES | NUM_VAL_ZERO_AS_BLANK);
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_ToBPM = S.Id(ID_ToBPM)
|
|
|
|
.AddTextBox(_("to"), wxT(""), 12);
|
|
|
|
m_pTextCtrl_ToBPM->SetName(_("To beats per minute"));
|
|
|
|
m_pTextCtrl_ToBPM->SetValidator(vldToBPM);
|
|
|
|
|
|
|
|
//
|
|
|
|
S.AddUnits(_("Length (seconds):"));
|
|
|
|
|
2015-05-20 16:50:37 +00:00
|
|
|
int precission = 2;
|
|
|
|
FloatingPointValidator<double> vldFromLength(precission, &m_FromLength, NUM_VAL_TWO_TRAILING_ZEROES);
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_FromLength = S.Id(ID_FromLength)
|
|
|
|
.AddTextBox(_("from"), wxT(""), 12);
|
|
|
|
m_pTextCtrl_FromLength->SetName(_("From length in seconds"));
|
|
|
|
m_pTextCtrl_FromLength->SetValidator(vldFromLength);
|
|
|
|
m_pTextCtrl_FromLength->Enable(false); // Disable because the value comes from the user selection.
|
|
|
|
|
2015-04-22 18:03:35 +00:00
|
|
|
FloatingPointValidator<double> vldToLength(2, &m_ToLength, NUM_VAL_TWO_TRAILING_ZEROES);
|
2015-05-20 16:50:37 +00:00
|
|
|
|
|
|
|
// min and max need same precision as what we're validating (bug 963)
|
|
|
|
double minLength = (m_FromLength * 100.0) / (100.0 + MAX_Percentage);
|
|
|
|
double maxLength = (m_FromLength * 100.0) / (100.0 + MIN_Percentage);
|
|
|
|
minLength = Internat::CompatibleToDouble(Internat::ToString(minLength, precission));
|
|
|
|
maxLength = Internat::CompatibleToDouble(Internat::ToString(maxLength, precission));
|
|
|
|
|
|
|
|
vldToLength.SetRange(minLength, maxLength);
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_ToLength = S.Id(ID_ToLength)
|
|
|
|
.AddTextBox(_("to"), wxT(""), 12);
|
|
|
|
m_pTextCtrl_ToLength->SetName(_("To length in seconds"));
|
|
|
|
m_pTextCtrl_ToLength->SetValidator(vldToLength);
|
|
|
|
}
|
|
|
|
S.EndMultiColumn();
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
2015-04-17 03:53:42 +00:00
|
|
|
S.EndVerticalLay();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
bool EffectChangeTempo::TransferDataToWindow()
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-22 18:03:35 +00:00
|
|
|
// Reset from length because it can be changed by Preview
|
|
|
|
m_FromLength = mT1 - mT0;
|
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
m_bLoopDetect = true;
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
if (!mUIParent->TransferDataToWindow())
|
|
|
|
{
|
|
|
|
return false;
|
2013-02-23 04:33:20 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// percent change controls
|
|
|
|
Update_Slider_PercentChange();
|
2015-04-22 18:03:35 +00:00
|
|
|
Update_Text_ToBPM();
|
|
|
|
Update_Text_ToLength();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
m_bLoopDetect = false;
|
|
|
|
|
2013-02-23 04:33:20 +00:00
|
|
|
return true;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
bool EffectChangeTempo::TransferDataFromWindow()
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
if (!mUIParent->Validate() || !mUIParent->TransferDataFromWindow())
|
|
|
|
{
|
|
|
|
return false;
|
2013-02-23 04:33:20 +00:00
|
|
|
}
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
// handler implementations for EffectChangeTempo
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::OnText_PercentChange(wxCommandEvent & WXUNUSED(evt))
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
if (m_bLoopDetect)
|
|
|
|
return;
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_PercentChange->GetValidator()->TransferFromWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_bLoopDetect = true;
|
|
|
|
Update_Slider_PercentChange();
|
|
|
|
Update_Text_ToBPM();
|
|
|
|
Update_Text_ToLength();
|
|
|
|
m_bLoopDetect = false;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::OnSlider_PercentChange(wxCommandEvent & WXUNUSED(evt))
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
if (m_bLoopDetect)
|
|
|
|
return;
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_PercentChange = (double)(m_pSlider_PercentChange->GetValue());
|
|
|
|
// Warp positive values to actually go up faster & further than negatives.
|
|
|
|
if (m_PercentChange > 0.0)
|
|
|
|
m_PercentChange = pow(m_PercentChange, kSliderWarp);
|
|
|
|
|
|
|
|
m_bLoopDetect = true;
|
|
|
|
Update_Text_PercentChange();
|
|
|
|
Update_Text_ToBPM();
|
|
|
|
Update_Text_ToLength();
|
|
|
|
m_bLoopDetect = false;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::OnText_FromBPM(wxCommandEvent & WXUNUSED(evt))
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
if (m_bLoopDetect)
|
|
|
|
return;
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_FromBPM->GetValidator()->TransferFromWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_bLoopDetect = true;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
Update_Text_ToBPM();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_bLoopDetect = false;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::OnText_ToBPM(wxCommandEvent & WXUNUSED(evt))
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
if (m_bLoopDetect)
|
|
|
|
return;
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_ToBPM->GetValidator()->TransferFromWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_bLoopDetect = true;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2016-02-13 15:43:16 +00:00
|
|
|
// If FromBPM has already been set, then there's a NEW percent change.
|
2015-04-17 03:53:42 +00:00
|
|
|
if (m_FromBPM != 0.0 && m_ToBPM != 0.0)
|
|
|
|
{
|
|
|
|
m_PercentChange = ((m_ToBPM * 100.0) / m_FromBPM) - 100.0;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
Update_Text_PercentChange();
|
|
|
|
Update_Slider_PercentChange();
|
2014-06-03 20:30:19 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
Update_Text_ToLength();
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
2015-04-17 03:53:42 +00:00
|
|
|
|
|
|
|
m_bLoopDetect = false;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::OnText_ToLength(wxCommandEvent & WXUNUSED(evt))
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
if (m_bLoopDetect)
|
|
|
|
return;
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_ToLength->GetValidator()->TransferFromWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
if (m_ToLength != 0.0)
|
|
|
|
{
|
2013-02-23 04:33:20 +00:00
|
|
|
m_PercentChange = ((m_FromLength * 100.0) / m_ToLength) - 100.0;
|
2015-04-17 03:53:42 +00:00
|
|
|
}
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_bLoopDetect = true;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
Update_Text_PercentChange();
|
|
|
|
Update_Slider_PercentChange();
|
2014-06-03 20:30:19 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
Update_Text_ToBPM();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
m_bLoopDetect = false;
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// helper fns
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::Update_Text_PercentChange()
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_PercentChange->GetValidator()->TransferToWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::Update_Slider_PercentChange()
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2015-04-17 03:53:42 +00:00
|
|
|
double unwarped = m_PercentChange;
|
|
|
|
if (unwarped > 0.0)
|
|
|
|
// Un-warp values above zero to actually go up to kSliderMax.
|
|
|
|
unwarped = pow(m_PercentChange, (1.0 / kSliderWarp));
|
|
|
|
|
|
|
|
// Add 0.5 to unwarped so trunc -> round.
|
|
|
|
m_pSlider_PercentChange->SetValue((int)(unwarped + 0.5));
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::Update_Text_ToBPM()
|
2016-02-13 15:43:16 +00:00
|
|
|
// Use m_FromBPM & m_PercentChange to set NEW m_ToBPM & control.
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2013-06-28 03:20:33 +00:00
|
|
|
m_ToBPM = (((m_FromBPM * (100.0 + m_PercentChange)) / 100.0));
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_ToBPM->GetValidator()->TransferToWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
void EffectChangeTempo::Update_Text_ToLength()
|
2016-02-13 15:43:16 +00:00
|
|
|
// Use m_FromLength & m_PercentChange to set NEW m_ToLength & control.
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
2013-02-23 04:33:20 +00:00
|
|
|
m_ToLength = (m_FromLength * 100.0) / (100.0 + m_PercentChange);
|
2015-04-17 03:53:42 +00:00
|
|
|
m_pTextCtrl_ToLength->GetValidator()->TransferToWindow();
|
2010-01-23 19:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-17 03:53:42 +00:00
|
|
|
#endif // USE_SOUNDTOUCH
|