123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- /*
- * LFOPluginEditor.cpp
- * -------------------
- * Purpose: Editor interface for the LFO plugin.
- * Notes : (currently none)
- * Authors: Johannes Schultz (OpenMPT Devs)
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #include "stdafx.h"
- #include "LFOPluginEditor.h"
- #include "../Mptrack.h"
- #include "../UpdateHints.h"
- #include "../../soundlib/Sndfile.h"
- #include "../../soundlib/MIDIEvents.h"
- #include "../../mptrack/resource.h"
- OPENMPT_NAMESPACE_BEGIN
- BEGIN_MESSAGE_MAP(LFOPluginEditor, CAbstractVstEditor)
- //{{AFX_MSG_MAP(LFOPluginEditor)
- ON_WM_HSCROLL()
- ON_COMMAND(IDC_BUTTON1, &LFOPluginEditor::OnPluginEditor)
- ON_COMMAND(IDC_CHECK1, &LFOPluginEditor::OnPolarityChanged)
- ON_COMMAND(IDC_CHECK2, &LFOPluginEditor::OnTempoSyncChanged)
- ON_COMMAND(IDC_CHECK3, &LFOPluginEditor::OnBypassChanged)
- ON_COMMAND(IDC_CHECK4, &LFOPluginEditor::OnLoopModeChanged)
- ON_COMMAND_RANGE(IDC_RADIO1, IDC_RADIO1 + LFOPlugin::kNumWaveforms - 1, &LFOPluginEditor::OnWaveformChanged)
- ON_CBN_SELCHANGE(IDC_COMBO1, &LFOPluginEditor::OnPlugParameterChanged)
- ON_CBN_SELCHANGE(IDC_COMBO2, &LFOPluginEditor::OnOutputPlugChanged)
- ON_CBN_SELCHANGE(IDC_COMBO3, &LFOPluginEditor::OnMidiCCChanged)
- ON_COMMAND(IDC_RADIO7, &LFOPluginEditor::OnParameterChanged)
- ON_COMMAND(IDC_RADIO8, &LFOPluginEditor::OnParameterChanged)
- ON_EN_UPDATE(IDC_EDIT1, &LFOPluginEditor::OnParameterChanged)
- ON_MESSAGE(LFOPlugin::WM_PARAM_UDPATE, &LFOPluginEditor::OnUpdateParam)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- void LFOPluginEditor::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(LFOPluginEditor)
- DDX_Control(pDX, IDC_COMBO1, m_plugParam);
- DDX_Control(pDX, IDC_COMBO2, m_outPlug);
- DDX_Control(pDX, IDC_COMBO3, m_midiCC);
- DDX_Control(pDX, IDC_SLIDER1, m_amplitudeSlider);
- DDX_Control(pDX, IDC_SLIDER2, m_offsetSlider);
- DDX_Control(pDX, IDC_SLIDER3, m_frequencySlider);
- DDX_Control(pDX, IDC_EDIT1, m_midiChnEdit);
- DDX_Control(pDX, IDC_SPIN1, m_midiChnSpin);
- //}}AFX_DATA_MAP
- }
- LFOPluginEditor::LFOPluginEditor(LFOPlugin &plugin)
- : CAbstractVstEditor(plugin)
- , m_lfoPlugin(plugin)
- , m_locked(true)
- {
- }
- bool LFOPluginEditor::OpenEditor(CWnd *parent)
- {
- m_locked = true;
- Create(IDD_LFOPLUGIN, parent);
- m_midiChnSpin.SetRange32(1, 16);
- m_midiCC.SetRedraw(FALSE);
- CString s;
- for(unsigned int i = 0; i < 128; i++)
- {
- s.Format(_T("%3u: "), i);
- s += mpt::ToCString(mpt::Charset::UTF8, MIDIEvents::MidiCCNames[i]);
- m_midiCC.AddString(s);
- }
- if(m_lfoPlugin.m_outputToCC && m_lfoPlugin.m_outputParam != LFOPlugin::INVALID_OUTPUT_PARAM)
- {
- m_midiCC.SetCurSel(m_lfoPlugin.m_outputParam & 0x7F);
- SetDlgItemInt(IDC_EDIT1, 1 + ((m_lfoPlugin.m_outputParam & 0xF00) >> 8));
- } else
- {
- SetDlgItemInt(IDC_EDIT1, 1);
- }
- m_midiCC.SetRedraw(TRUE);
- UpdateView(PluginHint().Info().Names());
- for(int32 i = 0; i < LFOPlugin::kLFONumParameters; i++)
- {
- UpdateParam(i);
- }
- UpdateParamDisplays();
- m_locked = false;
- // Avoid weird WM_COMMAND message (following a WM_ACTIVATE message) activating a wrong waveform when closing the plugin editor while the pattern editor is open
- GetDlgItem(IDC_RADIO1 + m_lfoPlugin.m_waveForm)->SetFocus();
- return CAbstractVstEditor::OpenEditor(parent);
- }
- void LFOPluginEditor::UpdateParamDisplays()
- {
- CAbstractVstEditor::UpdateParamDisplays();
- m_locked = true;
- CheckRadioButton(IDC_RADIO7, IDC_RADIO8, m_lfoPlugin.m_outputToCC ? IDC_RADIO8 : IDC_RADIO7);
- m_plugParam.SetRedraw(FALSE);
- IMixPlugin *outPlug = m_lfoPlugin.GetOutputPlugin();
- if(outPlug != nullptr)
- {
- if(LONG_PTR(outPlug) != GetWindowLongPtr(m_plugParam, GWLP_USERDATA))
- {
- m_plugParam.ResetContent();
- AddPluginParameternamesToCombobox(m_plugParam, *outPlug);
- if(!m_lfoPlugin.m_outputToCC)
- m_plugParam.SetCurSel(m_lfoPlugin.m_outputParam);
- SetWindowLongPtr(m_plugParam, GWLP_USERDATA, LONG_PTR(outPlug));
- }
- GetDlgItem(IDC_BUTTON1)->EnableWindow(outPlug ? TRUE :FALSE);
- } else
- {
- m_plugParam.ResetContent();
- SetWindowLongPtr(m_plugParam, GWLP_USERDATA, 0);
- }
- m_plugParam.SetRedraw(TRUE);
- m_locked = false;
- }
- void LFOPluginEditor::UpdateParam(int32 p)
- {
- LFOPlugin::Parameters param = static_cast<LFOPlugin::Parameters>(p);
- CAbstractVstEditor::UpdateParam(p);
- m_locked = true;
- switch(param)
- {
- case LFOPlugin::kAmplitude:
- InitSlider(m_amplitudeSlider, LFOPlugin::kAmplitude);
- break;
- case LFOPlugin::kOffset:
- InitSlider(m_offsetSlider, LFOPlugin::kOffset);
- break;
- case LFOPlugin::kFrequency:
- InitSlider(m_frequencySlider, LFOPlugin::kFrequency);
- break;
- case LFOPlugin::kTempoSync:
- CheckDlgButton(IDC_CHECK2, m_lfoPlugin.m_tempoSync ? BST_CHECKED : BST_UNCHECKED);
- InitSlider(m_frequencySlider, LFOPlugin::kFrequency);
- break;
- case LFOPlugin::kWaveform:
- CheckRadioButton(IDC_RADIO1, IDC_RADIO1 + LFOPlugin::kNumWaveforms - 1, IDC_RADIO1 + m_lfoPlugin.m_waveForm);
- break;
- case LFOPlugin::kPolarity:
- CheckDlgButton(IDC_CHECK1, m_lfoPlugin.m_polarity ? BST_CHECKED : BST_UNCHECKED);
- break;
- case LFOPlugin::kBypassed:
- CheckDlgButton(IDC_CHECK3, m_lfoPlugin.m_bypassed ? BST_CHECKED : BST_UNCHECKED);
- break;
- case LFOPlugin::kLoopMode:
- CheckDlgButton(IDC_CHECK4, m_lfoPlugin.m_oneshot ? BST_CHECKED : BST_UNCHECKED);
- break;
- default:
- break;
- }
- m_locked = false;
- }
- void LFOPluginEditor::UpdateView(UpdateHint hint)
- {
- CAbstractVstEditor::UpdateView(hint);
- if(hint.GetType()[HINT_PLUGINNAMES | HINT_MIXPLUGINS])
- {
- PLUGINDEX hintPlug = hint.ToType<PluginHint>().GetPlugin();
- if(hintPlug > 0 && hintPlug <= m_lfoPlugin.GetSlot())
- {
- return;
- }
- CString s;
- IMixPlugin *outPlugin = m_lfoPlugin.GetOutputPlugin();
- m_outPlug.SetRedraw(FALSE);
- m_outPlug.ResetContent();
- for(PLUGINDEX out = m_lfoPlugin.GetSlot() + 1; out < MAX_MIXPLUGINS; out++)
- {
- const SNDMIXPLUGIN &outPlug = m_lfoPlugin.GetSoundFile().m_MixPlugins[out];
- if(outPlug.IsValidPlugin())
- {
- mpt::ustring libName = outPlug.GetLibraryName();
- s.Format(_T("FX%d: "), out + 1);
- s += mpt::ToCString(libName);
- if(outPlug.GetName() != U_("") && libName != outPlug.GetName())
- {
- s += _T(" (");
- s += mpt::ToCString(outPlug.GetName());
- s += _T(")");
- }
- int n = m_outPlug.AddString(s);
- m_outPlug.SetItemData(n, out);
- if(outPlugin == outPlug.pMixPlugin)
- {
- m_outPlug.SetCurSel(n);
- }
- }
- }
- m_outPlug.SetRedraw(TRUE);
- m_outPlug.Invalidate(FALSE);
- m_plugParam.Invalidate(FALSE);
- }
- }
- void LFOPluginEditor::InitSlider(CSliderCtrl &slider, LFOPlugin::Parameters param)
- {
- slider.SetRange(0, SLIDER_GRANULARITY);
- slider.SetTicFreq(SLIDER_GRANULARITY / 10);
- SetSliderValue(slider, m_lfoPlugin.GetParameter(param));
- SetSliderText(param);
- }
- void LFOPluginEditor::SetSliderText(LFOPlugin::Parameters param)
- {
- CString s = m_lfoPlugin.GetParamName(param) + _T(": ") + m_lfoPlugin.GetFormattedParamValue(param);
- SetDlgItemText(IDC_STATIC1 + param, s);
- }
- void LFOPluginEditor::SetSliderValue(CSliderCtrl &slider, float value)
- {
- slider.SetPos(mpt::saturate_round<int>(value * SLIDER_GRANULARITY));
- }
- float LFOPluginEditor::GetSliderValue(CSliderCtrl &slider)
- {
- float value = slider.GetPos() / static_cast<float>(SLIDER_GRANULARITY);
- return value;
- }
- void LFOPluginEditor::OnHScroll(UINT nCode, UINT nPos, CScrollBar *pSB)
- {
- CAbstractVstEditor::OnHScroll(nCode, nPos, pSB);
- if(!m_locked && nCode != SB_ENDSCROLL && pSB != nullptr)
- {
- auto slider = reinterpret_cast<CSliderCtrl *>(pSB);
- LFOPlugin::Parameters param;
- if(slider == &m_amplitudeSlider)
- param = LFOPlugin::kAmplitude;
- else if(slider == &m_offsetSlider)
- param = LFOPlugin::kOffset;
- else if(slider == &m_frequencySlider)
- param = LFOPlugin::kFrequency;
- else
- return;
- float value = GetSliderValue(*slider);
- m_lfoPlugin.SetParameter(param, value);
- m_lfoPlugin.AutomateParameter(param);
- SetSliderText(param);
- }
- }
- void LFOPluginEditor::OnPolarityChanged()
- {
- if(!m_locked)
- {
- m_lfoPlugin.m_polarity = IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED;
- m_lfoPlugin.AutomateParameter(LFOPlugin::kPolarity);
- }
- }
- void LFOPluginEditor::OnTempoSyncChanged()
- {
- if(!m_locked)
- {
- m_lfoPlugin.m_tempoSync = IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED;
- m_lfoPlugin.RecalculateFrequency();
- m_lfoPlugin.AutomateParameter(LFOPlugin::kTempoSync);
- InitSlider(m_frequencySlider, LFOPlugin::kFrequency);
- }
- }
- void LFOPluginEditor::OnBypassChanged()
- {
- if(!m_locked)
- {
- m_lfoPlugin.m_bypassed = IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED;
- m_lfoPlugin.AutomateParameter(LFOPlugin::kBypassed);
- }
- }
- void LFOPluginEditor::OnLoopModeChanged()
- {
- if(!m_locked)
- {
- m_lfoPlugin.m_oneshot = IsDlgButtonChecked(IDC_CHECK4) != BST_UNCHECKED;
- m_lfoPlugin.AutomateParameter(LFOPlugin::kLoopMode);
- }
- }
- void LFOPluginEditor::OnWaveformChanged(UINT nID)
- {
- if(!m_locked)
- {
- m_lfoPlugin.m_waveForm = static_cast<LFOPlugin::LFOWaveform>(nID - IDC_RADIO1);
- m_lfoPlugin.AutomateParameter(LFOPlugin::kWaveform);
- }
- }
- void LFOPluginEditor::OnPlugParameterChanged()
- {
- if(!m_locked)
- {
- CheckRadioButton(IDC_RADIO7, IDC_RADIO8, IDC_RADIO7);
- OnParameterChanged();
- }
- }
- void LFOPluginEditor::OnMidiCCChanged()
- {
- if(!m_locked)
- {
- CheckRadioButton(IDC_RADIO7, IDC_RADIO8, IDC_RADIO8);
- OnParameterChanged();
- }
- }
- void LFOPluginEditor::OnParameterChanged()
- {
- if(!m_locked)
- {
- m_locked = true;
- PlugParamIndex param = 0;
- bool outputToCC = IsDlgButtonChecked(IDC_RADIO8) != BST_UNCHECKED;
- if(outputToCC)
- {
- param = ((Clamp(GetDlgItemInt(IDC_EDIT1), 1u, 16u) - 1) << 8);
- if(m_lfoPlugin.m_outputToCC || m_midiCC.GetCurSel() >= 0)
- param |= (m_midiCC.GetCurSel() & 0x7F);
- } else
- {
- if(!m_lfoPlugin.m_outputToCC || m_plugParam.GetCurSel() >= 0)
- param = static_cast<PlugParamIndex>(m_plugParam.GetItemData(m_plugParam.GetCurSel()));
- }
- m_lfoPlugin.m_outputToCC = outputToCC;
- m_lfoPlugin.m_outputParam = param;
- m_lfoPlugin.SetModified();
- m_locked = false;
- }
- }
- void LFOPluginEditor::OnOutputPlugChanged()
- {
- if(!m_locked)
- {
- PLUGINDEX plug = static_cast<PLUGINDEX>(m_outPlug.GetItemData(m_outPlug.GetCurSel()));
- if(plug > m_lfoPlugin.GetSlot())
- {
- m_lfoPlugin.GetSoundFile().m_MixPlugins[m_lfoPlugin.GetSlot()].SetOutputPlugin(plug);
- m_lfoPlugin.SetModified();
- UpdateParamDisplays();
- }
- }
- }
- void LFOPluginEditor::OnPluginEditor()
- {
- std::vector<IMixPlugin *> plug;
- if(m_lfoPlugin.GetOutputPlugList(plug) && plug.front() != nullptr)
- {
- plug.front()->ToggleEditor();
- }
- }
- LRESULT LFOPluginEditor::OnUpdateParam(WPARAM wParam, LPARAM lParam)
- {
- if(wParam == m_lfoPlugin.GetSlot())
- {
- UpdateParam(static_cast<int32>(lParam));
- }
- return 0;
- }
- OPENMPT_NAMESPACE_END
|