Skip to content

Commit dffc535

Browse files
committed
[New] Sample tab: The sample grid can now also be configured to divide the sample into grid elements of a fixed size.
git-svn-id: https://source.openmpt.org/svn/openmpt/trunk/OpenMPT@25221 56274372-70c3-4bfc-bfc3-4c3a0b034d27
1 parent 8147ab1 commit dffc535

5 files changed

Lines changed: 277 additions & 68 deletions

File tree

mptrack/SampleEditorDialogs.cpp

Lines changed: 123 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424

2525
OPENMPT_NAMESPACE_BEGIN
2626

27+
static void PopulateSampleLengthUnitComboBox(CComboBox &comboBox, SampleLengthUnit unit)
28+
{
29+
comboBox.SetItemData(comboBox.AddString(_T("samples")), static_cast<DWORD_PTR>(SampleLengthUnit::Samples));
30+
comboBox.SetItemData(comboBox.AddString(_T("ms")), static_cast<DWORD_PTR>(SampleLengthUnit::Milliseconds));
31+
comboBox.SetCurSel(static_cast<int>(unit));
32+
}
2733

2834
//////////////////////////////////////////////////////////////////////////
2935
// Sample amplification dialog
@@ -577,9 +583,7 @@ BOOL AddSilenceDlg::OnInitDialog()
577583
CComboBox *box = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO1));
578584
if(box)
579585
{
580-
box->AddString(_T("samples"));
581-
box->AddString(_T("ms"));
582-
box->SetCurSel(m_unit);
586+
PopulateSampleLengthUnitComboBox(*box, m_unit);
583587
if(m_sampleRate == 0)
584588
{
585589
// Can't do any conversions if samplerate is unknown
@@ -607,7 +611,7 @@ BOOL AddSilenceDlg::OnInitDialog()
607611
void AddSilenceDlg::OnOK()
608612
{
609613
m_numSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE, nullptr, FALSE);
610-
if(m_unit == kMilliseconds)
614+
if(m_unit == SampleLengthUnit::Milliseconds)
611615
{
612616
m_numSamples = Util::muldivr_unsigned(m_numSamples, m_sampleRate, 1000);
613617
}
@@ -648,13 +652,14 @@ void AddSilenceDlg::OnEditModeChanged()
648652

649653
void AddSilenceDlg::OnUnitChanged()
650654
{
651-
const auto unit = static_cast<Unit>(static_cast<CComboBox*>(GetDlgItem(IDC_COMBO1))->GetCurSel());
655+
CComboBox *box = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO1));
656+
const auto unit = static_cast<SampleLengthUnit>(box->GetItemData(box->GetCurSel()));
652657
if(m_unit == unit)
653658
return;
654659

655660
m_unit = unit;
656661
SmpLength duration = GetDlgItemInt(IDC_EDIT_ADDSILENCE);
657-
if(m_unit == kSamples)
662+
if(m_unit == SampleLengthUnit::Samples)
658663
{
659664
// Convert from milliseconds
660665
duration = Util::muldivr_unsigned(duration, m_sampleRate, 1000);
@@ -681,42 +686,144 @@ AddSilenceDlg::AddSilenceOptions AddSilenceDlg::GetEditMode() const
681686
/////////////////////////////////////////////////////////////////////////
682687
// Sample grid dialog
683688

689+
BEGIN_MESSAGE_MAP(CSampleGridDlg, DialogBase)
690+
ON_CBN_SELCHANGE(IDC_COMBO1, &CSampleGridDlg::OnUnitChanged)
691+
ON_EN_SETFOCUS(IDC_EDIT1, &CSampleGridDlg::OnSegmentsFocus)
692+
ON_EN_SETFOCUS(IDC_EDIT2, &CSampleGridDlg::OnSpacingFocus)
693+
ON_EN_CHANGE(IDC_EDIT1, &CSampleGridDlg::OnSegmentsChanged)
694+
ON_EN_CHANGE(IDC_EDIT2, &CSampleGridDlg::OnSpacingChanged)
695+
END_MESSAGE_MAP()
696+
697+
684698
void CSampleGridDlg::DoDataExchange(CDataExchange* pDX)
685699
{
686700
DialogBase::DoDataExchange(pDX);
687701
//{{AFX_DATA_MAP(CSampleGridDlg)
688-
DDX_Control(pDX, IDC_EDIT1, m_EditSegments);
689702
DDX_Control(pDX, IDC_SPIN1, m_SpinSegments);
703+
DDX_Control(pDX, IDC_SPIN2, m_SpinSpacing);
704+
DDX_Control(pDX, IDC_COMBO1, m_ComboUnit);
690705
//}}AFX_DATA_MAP
691706
}
692707

693708

694-
CSampleGridDlg::CSampleGridDlg(CWnd* parent, SmpLength nSegments, SmpLength nMaxSegments)
709+
CSampleGridDlg::CSampleGridDlg(CWnd *parent, SampleGridMode mode, double segments, double spacing, SampleLengthUnit unit, SmpLength maxSegments, uint32 sampleRate)
695710
: DialogBase{IDD_SAMPLE_GRID_SIZE, parent}
696-
, m_nSegments{nSegments}
697-
, m_nMaxSegments{nMaxSegments}
711+
, m_mode{mode}
712+
, m_maxSegments{maxSegments}
713+
, m_segments{std::max(segments, 2.0)}
714+
, m_spacing{spacing}
715+
, m_unit{unit}
716+
, m_sampleRate{sampleRate > 0 ? sampleRate : 8363u}
698717
{
699718
}
700719

701720

702721
BOOL CSampleGridDlg::OnInitDialog()
703722
{
704723
DialogBase::OnInitDialog();
705-
m_SpinSegments.SetRange32(0, m_nMaxSegments);
706-
m_SpinSegments.SetPos(m_nSegments);
707-
SetDlgItemInt(IDC_EDIT1, m_nSegments, FALSE);
708-
GetDlgItem(IDC_EDIT1)->SetFocus();
709-
return TRUE;
724+
725+
PopulateSampleLengthUnitComboBox(m_ComboUnit, m_unit);
726+
727+
m_SpinSegments.SetRange32(1, m_maxSegments);
728+
m_SpinSegments.SetPos32(mpt::saturate_round<int32>(m_segments));
729+
m_EditSegments.SubclassDlgItem(IDC_EDIT1, this);
730+
m_EditSegments.AllowFractions(true);
731+
m_EditSegments.AllowNegative(false);
732+
m_EditSegments.SetDecimalValue(m_segments);
733+
734+
m_SpinSpacing.SetRange32(0, m_maxSegments);
735+
m_SpinSpacing.SetPos32(mpt::saturate_round<int32>(m_spacing));
736+
m_EditSpacing.SubclassDlgItem(IDC_EDIT2, this);
737+
m_EditSpacing.AllowFractions(true);
738+
m_EditSpacing.AllowNegative(false);
739+
m_EditSpacing.SetDecimalValue(m_spacing);
740+
741+
int radioChoice = IDC_RADIO1;
742+
switch(m_mode)
743+
{
744+
case SampleGridMode::NoGrid:
745+
case SampleGridMode::DivideIntoSegments:
746+
radioChoice = IDC_RADIO2;
747+
GotoDlgCtrl(&m_EditSegments);
748+
break;
749+
case SampleGridMode::DivideEveryN:
750+
radioChoice = IDC_RADIO3;
751+
GotoDlgCtrl(&m_EditSpacing);
752+
break;
753+
}
754+
CheckRadioButton(IDC_RADIO1, IDC_RADIO3, radioChoice);
755+
756+
m_locked = false;
757+
return FALSE;
710758
}
711759

712760

713761
void CSampleGridDlg::OnOK()
714762
{
715-
m_nSegments = GetDlgItemInt(IDC_EDIT1, NULL, FALSE);
763+
if(IsDlgButtonChecked(IDC_RADIO1))
764+
{
765+
m_mode = SampleGridMode::NoGrid;
766+
} else if(IsDlgButtonChecked(IDC_RADIO2))
767+
{
768+
m_mode = SampleGridMode::DivideIntoSegments;
769+
m_EditSegments.GetDecimalValue(m_segments);
770+
if(m_segments < 1.0)
771+
{
772+
MessageBeep(MB_ICONWARNING);
773+
m_EditSegments.SetFocus();
774+
return;
775+
}
776+
} else if(IsDlgButtonChecked(IDC_RADIO3))
777+
{
778+
m_mode = SampleGridMode::DivideEveryN;
779+
m_EditSpacing.GetDecimalValue(m_spacing);
780+
m_unit = static_cast<SampleLengthUnit>(m_ComboUnit.GetItemData(m_ComboUnit.GetCurSel()));
781+
782+
double effectiveSamples = m_spacing;
783+
if(m_unit == SampleLengthUnit::Milliseconds)
784+
effectiveSamples *= m_sampleRate / 1000.0;
785+
786+
if(effectiveSamples < 1.0)
787+
{
788+
MessageBeep(MB_ICONWARNING);
789+
m_EditSpacing.SetFocus();
790+
return;
791+
}
792+
}
716793
DialogBase::OnOK();
717794
}
718795

719796

797+
void CSampleGridDlg::OnUnitChanged()
798+
{
799+
const auto newUnit = static_cast<SampleLengthUnit>(m_ComboUnit.GetItemData(m_ComboUnit.GetCurSel()));
800+
if(newUnit == m_unit)
801+
return;
802+
803+
double val = 0.0;
804+
m_EditSpacing.GetDecimalValue(val);
805+
if(newUnit == SampleLengthUnit::Milliseconds)
806+
val *= 1000.0 / m_sampleRate;
807+
else
808+
val *= m_sampleRate / 1000.0;
809+
m_unit = newUnit;
810+
m_locked = true;
811+
m_EditSpacing.SetDecimalValue(val);
812+
m_locked = false;
813+
814+
CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO3);
815+
}
816+
817+
818+
void CSampleGridDlg::OnEditChanged(int radio, bool onlyMouse)
819+
{
820+
if(m_locked || m_lastInputDevice == InputDevice::Unknown)
821+
return;
822+
if(!onlyMouse || m_lastInputDevice == InputDevice::Mouse)
823+
CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO1 + radio);
824+
}
825+
826+
720827
/////////////////////////////////////////////////////////////////////////
721828
// Sample cross-fade dialog
722829

mptrack/SampleEditorDialogs.h

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121

2222
OPENMPT_NAMESPACE_BEGIN
2323

24+
enum class SampleLengthUnit
25+
{
26+
Samples = 0,
27+
Milliseconds,
28+
};
29+
2430
//////////////////////////////////////////////////////////////////////////
2531
// Sample amplification dialog
2632

@@ -135,12 +141,6 @@ class AddSilenceDlg : public DialogBase
135141
kOPLInstrument, // Initialize as OPL instrument
136142
};
137143

138-
enum Unit
139-
{
140-
kSamples = 0,
141-
kMilliseconds,
142-
};
143-
144144
SmpLength m_numSamples; // Add x samples (also containes the return value in all cases)
145145
SmpLength m_length; // Set size to x samples (init value: current sample size)
146146
AddSilenceOptions m_editOption; // See above
@@ -149,7 +149,7 @@ class AddSilenceDlg : public DialogBase
149149
static SmpLength m_addSamples;
150150
static SmpLength m_createSamples;
151151
uint32 m_sampleRate;
152-
Unit m_unit = kSamples;
152+
SampleLengthUnit m_unit = SampleLengthUnit::Samples;
153153
bool m_allowOPL;
154154

155155
public:
@@ -169,22 +169,46 @@ class AddSilenceDlg : public DialogBase
169169
/////////////////////////////////////////////////////////////////////////
170170
// Sample grid dialog
171171

172+
enum class SampleGridMode
173+
{
174+
NoGrid = 0,
175+
DivideIntoSegments,
176+
DivideEveryN,
177+
};
178+
172179
class CSampleGridDlg : public DialogBase
173180
{
174181
public:
175-
SmpLength m_nSegments, m_nMaxSegments;
182+
SampleGridMode m_mode = SampleGridMode::NoGrid;
183+
const SmpLength m_maxSegments;
184+
double m_segments = 0.0;
185+
double m_spacing = 0.0;
186+
SampleLengthUnit m_unit = SampleLengthUnit::Samples;
187+
const uint32 m_sampleRate;
188+
bool m_locked = true;
176189

177190
protected:
178-
CEdit m_EditSegments;
179-
CSpinButtonCtrl m_SpinSegments;
191+
CNumberEdit m_EditSegments, m_EditSpacing;
192+
CSpinButtonCtrl m_SpinSegments, m_SpinSpacing;
193+
CComboBox m_ComboUnit;
180194

181195
public:
182-
CSampleGridDlg(CWnd *parent, SmpLength nSegments, SmpLength nMaxSegments);
196+
CSampleGridDlg(CWnd *parent, SampleGridMode mode, double segments, double spacing, SampleLengthUnit unit, SmpLength maxSegments, uint32 sampleRate);
183197

184198
protected:
185-
void DoDataExchange(CDataExchange* pDX) override;
199+
void DoDataExchange(CDataExchange *pDX) override;
186200
BOOL OnInitDialog() override;
187201
void OnOK() override;
202+
203+
void OnEditChanged(int radio, bool onlyMouse);
204+
205+
afx_msg void OnUnitChanged();
206+
afx_msg void OnSegmentsFocus() { OnEditChanged(1, true); }
207+
afx_msg void OnSpacingFocus() { OnEditChanged(2, true); }
208+
afx_msg void OnSegmentsChanged() { OnEditChanged(1, false); }
209+
afx_msg void OnSpacingChanged() { OnEditChanged(2, false); }
210+
211+
DECLARE_MESSAGE_MAP()
188212
};
189213

190214

0 commit comments

Comments
 (0)