From: <sag...@us...> - 2014-02-14 22:11:50
|
Revision: 3716 http://sourceforge.net/p/modplug/code/3716 Author: saga-games Date: 2014-02-14 22:11:42 +0000 (Fri, 14 Feb 2014) Log Message: ----------- [New] Support MIDI mapping for aftertouch messages as well. Modified Paths: -------------- trunk/OpenMPT/mptrack/MIDIMapping.cpp trunk/OpenMPT/mptrack/MIDIMapping.h trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/MIDIMapping.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMapping.cpp 2014-02-14 21:08:07 UTC (rev 3715) +++ trunk/OpenMPT/mptrack/MIDIMapping.cpp 2014-02-14 22:11:42 UTC (rev 3716) @@ -9,10 +9,10 @@ #include "stdafx.h" -#include "MIDIMapping.h" #include "../soundlib/MIDIEvents.h" #include "Mainfrm.h" #include "../soundlib/FileReader.h" +#include "MIDIMapping.h" std::string CMIDIMappingDirective::ToString() const @@ -116,46 +116,40 @@ } -bool CMIDIMapper::OnMIDImsg(const DWORD midimsg, BYTE& mappedIndex, uint32& paramindex, BYTE& paramval) -//----------------------------------------------------------------------------------------------------- +bool CMIDIMapper::OnMIDImsg(const DWORD midimsg, PLUGINDEX &mappedIndex, PlugParamIndex ¶mindex, uint8 ¶mval) +//------------------------------------------------------------------------------------------------------------------- { bool captured = false; - if(MIDIEvents::GetTypeFromEvent(midimsg) != MIDIEvents::evControllerChange) return captured; - //For now only controllers can be mapped so if event is not controller change, - //no mapping will be found and thus no search is done. - //NOTE: The event value is not checked in code below. + const MIDIEvents::EventType eventType = MIDIEvents::GetTypeFromEvent(midimsg); + const uint8 controller = MIDIEvents::GetDataByte1FromEvent(midimsg); + const uint8 channel = MIDIEvents::GetChannelFromEvent(midimsg); - const BYTE controller = MIDIEvents::GetDataByte1FromEvent(midimsg); + for(const_iterator citer = Begin(); citer != End() && !captured; citer++) + { + if(!citer->IsActive()) continue; + if(citer->GetEvent() != eventType) continue; + if(eventType == MIDIEvents::evControllerChange && citer->GetController() != controller) continue; + if(!citer->GetAnyChannel() && channel + 1 != citer->GetChannel()) continue; - const_iterator citer = std::lower_bound(Begin(), End(), controller); + const PLUGINDEX plugindex = citer->GetPlugIndex(); + const uint32 param = citer->GetParamIndex(); + const uint8 val = (citer->GetEvent() == MIDIEvents::evChannelAftertouch ? controller : MIDIEvents::GetDataByte2FromEvent(midimsg)) & 0x7F; - const BYTE channel = MIDIEvents::GetChannelFromEvent(midimsg); + if(citer->GetAllowPatternEdit()) + { + mappedIndex = plugindex; + paramindex = param; + paramval = val; + } + if(citer->GetCaptureMIDI()) captured = true; - for(; citer != End() && citer->GetController() == controller && !captured; citer++) - { - if(!citer->IsActive()) continue; - BYTE plugindex = 0; - uint32 param = 0; - if( citer->GetAnyChannel() || channel+1 == citer->GetChannel()) + if(plugindex > 0 && plugindex <= MAX_MIXPLUGINS) { - plugindex = citer->GetPlugIndex(); - param = citer->GetParamIndex(); - if(citer->GetAllowPatternEdit()) - { - mappedIndex = plugindex; - paramindex = param; - paramval = MIDIEvents::GetDataByte2FromEvent(midimsg); - } - if(citer->GetCaptureMIDI()) captured = true; - - if(plugindex > 0 && plugindex <= MAX_MIXPLUGINS) - { - IMixPlugin* pPlug = m_rSndFile.m_MixPlugins[plugindex-1].pMixPlugin; - if(!pPlug) continue; - pPlug->SetZxxParameter(param, (midimsg >> 16) & 0x7F); - CMainFrame::GetMainFrame()->ThreadSafeSetModified(m_rSndFile.GetpModDoc()); - } + IMixPlugin *pPlug = m_rSndFile.m_MixPlugins[plugindex - 1].pMixPlugin; + if(!pPlug) continue; + pPlug->SetZxxParameter(param, val); + CMainFrame::GetMainFrame()->ThreadSafeSetModified(m_rSndFile.GetpModDoc()); } } Modified: trunk/OpenMPT/mptrack/MIDIMapping.h =================================================================== --- trunk/OpenMPT/mptrack/MIDIMapping.h 2014-02-14 21:08:07 UTC (rev 3715) +++ trunk/OpenMPT/mptrack/MIDIMapping.h 2014-02-14 22:11:42 UTC (rev 3716) @@ -92,7 +92,7 @@ // -paramvalue to parameter value. //In case of multiple mappings, these get the values from the last mapping found. //Returns true if MIDI was 'captured' by some directive, false otherwise. - bool OnMIDImsg(const DWORD midimsg, BYTE& mappedIndex, uint32& paramindex, BYTE& paramvalue); + bool OnMIDImsg(const DWORD midimsg, PLUGINDEX &mappedIndex, PlugParamIndex ¶mindex, uint8 ¶mvalue); //Swaps the positions of two elements. Returns true if swap was not done. bool Swap(const size_t a, const size_t b); Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2014-02-14 21:08:07 UTC (rev 3715) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2014-02-14 22:11:42 UTC (rev 3716) @@ -70,15 +70,25 @@ LRESULT CMIDIMappingDialog::OnMidiMsg(WPARAM dwMidiDataParam, LPARAM) //------------------------------------------------------------------- { - if(MIDIEvents::GetTypeFromEvent(dwMidiDataParam) == MIDIEvents::evControllerChange && IsDlgButtonChecked(IDC_CHECK_MIDILEARN)) + if(IsDlgButtonChecked(IDC_CHECK_MIDILEARN)) { - m_ChannelCBox.SetCurSel(1 + MIDIEvents::GetChannelFromEvent(dwMidiDataParam)); - m_EventCBox.SetCurSel(0); - m_ControllerCBox.SetCurSel(MIDIEvents::GetDataByte1FromEvent(dwMidiDataParam)); - OnCbnSelchangeComboChannel(); - OnCbnSelchangeComboEvent(); - OnCbnSelchangeComboController(); - UpdateString(); + for(int i = 0; i < m_EventCBox.GetCount(); i++) + { + if(static_cast<MIDIEvents::EventType>(m_EventCBox.GetItemData(i)) == MIDIEvents::GetTypeFromEvent(dwMidiDataParam)) + { + m_ChannelCBox.SetCurSel(1 + MIDIEvents::GetChannelFromEvent(dwMidiDataParam)); + m_EventCBox.SetCurSel(i); + if(MIDIEvents::GetTypeFromEvent(dwMidiDataParam) == MIDIEvents::evControllerChange) + { + m_ControllerCBox.SetCurSel(MIDIEvents::GetDataByte1FromEvent(dwMidiDataParam)); + } + OnCbnSelchangeComboChannel(); + OnCbnSelchangeComboEvent(); + OnCbnSelchangeComboController(); + UpdateString(); + break; + } + } } return 1; } @@ -89,7 +99,18 @@ { CDialog::OnInitDialog(); - m_EventCBox.SetCurSel(0); + m_EventCBox.SetItemData(m_EventCBox.AddString("Controller change (0xB)"), MIDIEvents::evControllerChange); + m_EventCBox.SetItemData(m_EventCBox.AddString("Polyphonic aftertouch (0xA)"), MIDIEvents::evPolyAftertouch); + m_EventCBox.SetItemData(m_EventCBox.AddString("Channel aftertouch (0xD)"), MIDIEvents::evChannelAftertouch); + m_EventCBox.SetCurSel(-1); + for(int i = 0; i < m_EventCBox.GetCount(); i++) + { + if(m_EventCBox.GetItemData(i) == m_Setting.GetEvent()) + { + m_EventCBox.SetCurSel(i); + break; + } + } //Add controller names. for(size_t i = MIDIEvents::MIDICC_start; i <= MIDIEvents::MIDICC_end; i++) @@ -150,12 +171,16 @@ m_ChannelCBox.SetCurSel(activeSetting.GetChannel()); - if(m_Setting.GetEvent() == MIDIEvents::evControllerChange) - m_EventCBox.SetCurSel(0); - else - m_EventCBox.SetCurSel(-1); + m_EventCBox.SetCurSel(-1); + for(int i = 0; i < m_EventCBox.GetCount(); i++) + { + if(m_EventCBox.GetItemData(i) == m_Setting.GetEvent()) + { + m_EventCBox.SetCurSel(i); + break; + } + } - m_ControllerCBox.SetCurSel(activeSetting.GetController()); m_PluginCBox.SetCurSel(activeSetting.GetPlugIndex()-1); m_PlugParamCBox.SetCurSel(activeSetting.GetParamIndex()); @@ -240,13 +265,11 @@ void CMIDIMappingDialog::OnCbnSelchangeComboEvent() //------------------------------------------------- { - if(m_EventCBox.GetCurSel() == 0) - { - m_Setting.SetEvent(0xB); - m_ControllerCBox.EnableWindow(); - } - else - m_ControllerCBox.EnableWindow(FALSE); + uint8 eventType = static_cast<uint8>(m_EventCBox.GetItemData(m_EventCBox.GetCurSel())); + m_Setting.SetEvent(eventType); + m_ControllerCBox.EnableWindow(eventType == MIDIEvents::evControllerChange ? TRUE : FALSE); + if(eventType != MIDIEvents::evControllerChange) + m_ControllerCBox.SetCurSel(0); UpdateString(); } @@ -283,7 +306,7 @@ m_rSndFile.GetpModDoc()->SetModified(); m_List.DeleteString(i); - m_List.InsertString(newIndex, CreateListString(m_Setting)); + m_List.InsertString(newIndex, CreateListString(m_Setting)); m_List.SetCurSel(newIndex); OnLbnSelchangeList1(); } @@ -331,7 +354,7 @@ str.AppendChar('.'); //Controller name - if(s.GetController() <= MIDIEvents::MIDICC_end) + if(s.GetController() <= MIDIEvents::MIDICC_end && s.GetEvent() == MIDIEvents::evControllerChange) { CString tstr; tstr.Format("%d %s", s.GetController(), MIDIEvents::MidiCCNames[s.GetController()]); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2014-02-14 21:08:07 UTC (rev 3715) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2014-02-14 22:11:42 UTC (rev 3716) @@ -971,8 +971,9 @@ if((event == MIDIEvents::evNoteOn) && !vol) event = MIDIEvents::evNoteOff; //Convert event to note-off if req'd - uint8 mappedIndex = 0, paramValue = 0; - uint32 paramIndex = 0; + PLUGINDEX mappedIndex = 0; + PlugParamIndex paramIndex = 0; + uint8 paramValue = 0; bool captured = m_SndFile.GetMIDIMapper().OnMIDImsg(midiData, mappedIndex, paramIndex, paramValue); // Handle MIDI messages assigned to shortcuts Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2014-02-14 21:08:07 UTC (rev 3715) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2014-02-14 22:11:42 UTC (rev 3716) @@ -3833,9 +3833,10 @@ // Handle MIDI mapping. - uint8 mappedIndex = uint8_max, paramValue = uint8_max; - uint32 paramIndex = 0; - bool captured = sndFile.GetMIDIMapper().OnMIDImsg(dwMidiData, mappedIndex, paramIndex, paramValue); + PLUGINDEX mappedIndex = uint8_max; + PlugParamIndex paramIndex = 0; + uint8 paramValue = uint8_max; + bool captured = sndFile.GetMIDIMapper().OnMIDImsg(dwMidiData, mappedIndex, paramIndex, paramValue); // Handle MIDI messages assigned to shortcuts @@ -3854,7 +3855,7 @@ ModCommandPos editpos = GetEditPos(sndFile, liveRecord); ModCommand &m = GetModCommand(sndFile, editpos); - pModDoc->GetPatternUndo().PrepareUndo(editpos.pattern, editpos.channel, editpos.row, 1, 1, "MIDI Record Entry"); + pModDoc->GetPatternUndo().PrepareUndo(editpos.pattern, editpos.channel, editpos.row, 1, 1, "MIDI Mapping Record"); m.Set(NOTE_PCS, mappedIndex, static_cast<uint16>(paramIndex), static_cast<uint16>((paramValue * ModCommand::maxColumnValue) / 127)); if(!liveRecord) InvalidateRow(editpos.row); @@ -4045,14 +4046,8 @@ case VIEWMSG_DOMIDISPACING: if (m_nSpacing) { -// -> CODE#0012 -// -> DESC="midi keyboard split" - //CModDoc *pModDoc = GetDocument(); - //CSoundFile * pSndFile = pModDoc->GetSoundFile(); -// if (timeGetTime() - lParam >= 10) int temp = timeGetTime(); if (temp - lParam >= 60) -// -! NEW_FEATURE#0012 { CModDoc *pModDoc = GetDocument(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); @@ -4064,8 +4059,6 @@ } } else { -// -> CODE#0012 -// -> DESC="midi keyboard split" // Sleep(1); Sleep(0); PostMessage(WM_MOD_VIEWMSG, VIEWMSG_DOMIDISPACING, lParam); @@ -5553,6 +5546,11 @@ ModCommand newCommand = target; CSoundFile *pSndFile = GetSoundFile(); + if(target.IsPcNote()) + { + return; + } + switch(TrackerSettings::Instance().aftertouchBehaviour) { case atRecordAsVolume: Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2014-02-14 21:08:07 UTC (rev 3715) +++ trunk/OpenMPT/mptrack/mptrack.rc 2014-02-14 22:11:42 UTC (rev 3716) @@ -2795,9 +2795,6 @@ 0x3531, "\000" IDC_COMBO_CHANNEL, 0x403, 3, 0 0x3631, "\000" - IDC_COMBO_EVENT, 0x403, 24, 0 -0x6f43, 0x746e, 0x6f72, 0x6c6c, 0x7265, 0x6320, 0x6168, 0x676e, 0x2065, -0x3028, 0x4278, 0x0029, 0 END This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |