diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/external_dependencies/openmpt-trunk/mptrack/PSRatioCalc.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/mptrack/PSRatioCalc.cpp')
-rw-r--r-- | Src/external_dependencies/openmpt-trunk/mptrack/PSRatioCalc.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/mptrack/PSRatioCalc.cpp b/Src/external_dependencies/openmpt-trunk/mptrack/PSRatioCalc.cpp new file mode 100644 index 00000000..6bfff1f5 --- /dev/null +++ b/Src/external_dependencies/openmpt-trunk/mptrack/PSRatioCalc.cpp @@ -0,0 +1,183 @@ +/* + * PSRatioCalc.cpp + * --------------- + * Purpose: Dialog for calculating sample pitch shift ratios in the sample editor. + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "Mptrack.h" +#include "Mainfrm.h" +#include "PSRatioCalc.h" + + +OPENMPT_NAMESPACE_BEGIN + + +// CPSRatioCalc dialog + +IMPLEMENT_DYNAMIC(CPSRatioCalc, CDialog) +CPSRatioCalc::CPSRatioCalc(const CSoundFile &sndFile, SAMPLEINDEX sample, double ratio, CWnd* pParent /*=NULL*/) + : CDialog(IDD_PITCHSHIFT, pParent) + , m_dRatio(ratio) + , sndFile(sndFile) + , sampleIndex(sample) +{ + // Calculate/verify samplerate at C5. + const ModSample &smp = sndFile.GetSample(sampleIndex); + uint32 sampleRate = smp.GetSampleRate(sndFile.GetType()); + if(sampleRate <= 0) + sampleRate = 8363; + + m_nSpeed = sndFile.m_PlayState.m_nMusicSpeed; + m_nTempo = sndFile.m_PlayState.m_nMusicTempo; + + // Sample rate will not change. We can calculate original duration once and disgard sampleRate. + m_lMsOrig = static_cast<ULONGLONG>(1000.0 * ((double)smp.nLength / sampleRate)); + CalcSamples(); + CalcMs(); + CalcRows(); +} + + +void CPSRatioCalc::DoDataExchange(CDataExchange* pDX) +{ + CWnd* hasFocus = GetFocus(); + + CDialog::DoDataExchange(pDX); + SmpLength origLength = sndFile.GetSample(sampleIndex).nLength; + DDX_Text(pDX, IDC_SAMPLE_LENGTH_ORIGINAL, origLength); + DDX_Text(pDX, IDC_SAMPLE_LENGTH_NEW, m_lSamplesNew); + DDX_Text(pDX, IDC_MS_LENGTH_ORIGINAL2, m_lMsOrig); + DDX_Text(pDX, IDC_MS_LENGTH_NEW, m_lMsNew); + DDX_Text(pDX, IDC_SPEED, m_nSpeed); + DDX_Text(pDX, IDC_ROW_LENGTH_ORIGINAL, m_dRowsOrig); + + //These 2 CEdits must only be updated if they don't have focus (to preserve trailing . and 0s etc..) + if (pDX->m_bSaveAndValidate || hasFocus != GetDlgItem(IDC_ROW_LENGTH_NEW2)) + DDX_Text(pDX, IDC_ROW_LENGTH_NEW2, m_dRowsNew); + if (pDX->m_bSaveAndValidate || hasFocus != GetDlgItem(IDC_PSRATIO)) + DDX_Text(pDX, IDC_PSRATIO, m_dRatio); +} + + +BEGIN_MESSAGE_MAP(CPSRatioCalc, CDialog) + ON_EN_UPDATE(IDC_SAMPLE_LENGTH_NEW, &CPSRatioCalc::OnEnChangeSamples) + ON_EN_UPDATE(IDC_MS_LENGTH_NEW, &CPSRatioCalc::OnEnChangeMs) + ON_EN_UPDATE(IDC_SPEED, &CPSRatioCalc::OnEnChangeSpeed) + ON_EN_UPDATE(IDC_TEMPO, &CPSRatioCalc::OnEnChangeSpeed) + ON_EN_UPDATE(IDC_ROW_LENGTH_NEW2, &CPSRatioCalc::OnEnChangeRows) + ON_EN_UPDATE(IDC_PSRATIO, &CPSRatioCalc::OnEnChangeratio) + ON_BN_CLICKED(IDOK, &CPSRatioCalc::OnBnClickedOk) +END_MESSAGE_MAP() + + +BOOL CPSRatioCalc::OnInitDialog() +{ + CDialog::OnInitDialog(); + m_EditTempo.SubclassDlgItem(IDC_TEMPO, this); + m_EditTempo.AllowNegative(false); + m_EditTempo.SetTempoValue(m_nTempo); + return TRUE; +} + +// CPSRatioCalc message handlers +void CPSRatioCalc::OnEnChangeSamples() +{ + UpdateData(); + if (m_lSamplesNew && sndFile.GetSample(sampleIndex).nLength) + { + m_dRatio = (double)m_lSamplesNew / (double)sndFile.GetSample(sampleIndex).nLength * 100; + CalcMs(); + CalcRows(); + UpdateData(FALSE); + } +} + +void CPSRatioCalc::OnEnChangeMs() +{ + UpdateData(); + if (m_lMsOrig && m_lMsNew) + { + m_dRatio = (double)m_lMsNew / (double)m_lMsOrig * 100; + CalcSamples(); + CalcRows(); + UpdateData(FALSE); + } + +} + +void CPSRatioCalc::OnEnChangeRows() +{ + UpdateData(); + if (m_dRowsOrig && m_dRowsNew) + { + m_dRatio = m_dRowsNew / m_dRowsOrig * 100.0; + CalcSamples(); + CalcMs(); + UpdateData(FALSE); + } + +} + +void CPSRatioCalc::OnEnChangeSpeed() +{ + UpdateData(); + m_nTempo = m_EditTempo.GetTempoValue(); + if (m_nTempo < TEMPO(1, 0)) m_nTempo = TEMPO(1, 0); + if (m_nSpeed < 1) m_nSpeed = 1; + CalcRows(); + UpdateData(FALSE); +} + +void CPSRatioCalc::OnEnChangeratio() +{ + UpdateData(); + if (m_dRatio) + { + CalcSamples(); + CalcMs(); + CalcRows(); + UpdateData(FALSE); + } +} + +// CPSRatioCalc Internal Calculations: + +void CPSRatioCalc::CalcSamples() +{ + m_lSamplesNew = static_cast<ULONGLONG>(sndFile.GetSample(sampleIndex).nLength * (m_dRatio / 100.0)); + return; +} + +void CPSRatioCalc::CalcMs() +{ + m_lMsNew = static_cast<ULONGLONG>(m_lMsOrig * (m_dRatio / 100.0)); + return; +} + +void CPSRatioCalc::CalcRows() +{ + double rowTime = sndFile.GetRowDuration(m_nTempo, m_nSpeed); + + m_dRowsOrig = (double)m_lMsOrig / rowTime; + m_dRowsNew = m_dRowsOrig * (m_dRatio / 100); + + return; +} + +void CPSRatioCalc::OnBnClickedOk() +{ + if (m_dRatio<50.0 || m_dRatio>200.0) + { + Reporting::Error("Error: ratio must be between 50% and 200%."); + return; + } + OnOK(); +} + + +OPENMPT_NAMESPACE_END |