|
From: <re...@us...> - 2006-08-20 20:32:51
|
Revision: 165 Author: rewbs Date: 2006-08-20 13:29:31 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=165&view=rev Log Message: ----------- v1.17.02.45 + <Relabsoluness & Alex> "Pitch to tempo lock" instrument setting: define the tempo at which your instrument loops correctly, and it will be pitched automatically to match the song's current tempo. + <Relabsoluness> Notification when attempting to modify pattern but pattern record is off. + <Relabsoluness> Orderlist margins: you can define how many slots to keep visible around the active pattern as the orderlist scrolls . <Relabsoluness> Fixes for various unexpected pattern loop state changes. . <Relabsoluness> Fixes to IT Style clear. . <Relabsoluness> Memory management fixes and misc other bug fixes. . <rewbs> ITP loading fixed (I broke it in v1.17.02.44) . <rewbs> Time estimation fixed for tracks with pattern break+XParam. . <rewbs> "Last saved with" version number was not always saved correctly - fixed Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/fxp.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/Tables.cpp trunk/OpenMPT/unlha/Unlha.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -186,13 +186,13 @@ if (p[0]) m_pSndFile->m_lpszSongComments = p; else - delete p; + delete[] p; if (oldcomments) { BOOL bSame = FALSE; if ((m_pSndFile->m_lpszSongComments) && (!strcmp(m_pSndFile->m_lpszSongComments, oldcomments))) bSame = TRUE; - delete oldcomments; + delete[] oldcomments; if (bSame) return; } else { Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -156,7 +156,8 @@ if (dwHint & HINT_MODSEQUENCE) { // Detecting max valid restart position - for (UINT i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; + UINT i = 0; + for (i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; m_SpinRestartPos.SetRange(0, i); } if (dwHint & HINT_MODGENERAL) Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -7,6 +7,11 @@ #include "ctrl_ins.h" #include "view_ins.h" #include "dlg_misc.h" +#include "misc_util.h" +#include <vector> +#include <string> +using std::string; +using std::vector; #pragma warning(disable:4244) @@ -215,7 +220,7 @@ { CWnd::OnSetFocus(pOldWnd); InvalidateRect(NULL, FALSE); - CMainFrame::GetMainFrame()->m_pNoteMapHasFocus= (CWnd*) this; //rewbs.customKeys + CMainFrame::GetMainFrame()->m_pNoteMapHasFocus = (CWnd*) this; //rewbs.customKeys } @@ -644,6 +649,9 @@ ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP + ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) + ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock) + ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock) END_MESSAGE_MAP() void CCtrlInstruments::DoDataExchange(CDataExchange* pDX) @@ -688,6 +696,8 @@ DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack); DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); // -! NEW_FEATURE#0027 + DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); + DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); //}}AFX_DATA_MAP } @@ -805,8 +815,12 @@ m_SpinInstrument.SetFocus(); + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); + //OnBnClickedCheckPitchtempolock(); + m_EditPitchTempoLock.SetLimitText(4); + return FALSE; } @@ -1038,6 +1052,8 @@ m_SliderResonance.EnableWindow(bITonly); m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); + m_EditPitchTempoLock.EnableWindow(bITonly); + m_CheckPitchTempoLock.EnableWindow(bITonly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { @@ -1129,6 +1145,12 @@ if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 + if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); + else + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); + + OnBnClickedCheckPitchtempolock(); } else { m_EditName.SetWindowText(""); @@ -1301,6 +1323,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { + //NOTE: pszText seems to point to char array of length 256. if ((pszText) && (uId)) { switch(uId) @@ -1313,6 +1336,23 @@ return TRUE; } break; + case IDC_EDIT_PITCHTEMPOLOCK: + case IDC_CHECK_PITCHTEMPOLOCK: + if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) + { + const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + ASSERT(str.size() < 256); + wsprintf(pszText, str.c_str()); + return TRUE; + } + break; + case IDC_EDIT7: //Fade out + if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) + { + wsprintf(pszText, "Higher value <-> Faster fade out"); + return TRUE; + } + break; } } return FALSE; @@ -2322,4 +2362,94 @@ return 0; } -//end rewbs.customKeys \ No newline at end of file +//end rewbs.customKeys +void CCtrlInstruments::OnEnChangeEditPitchtempolock() +//---------------------------------------------------- +{ + if(IsLocked() || !m_pModDoc || !m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) return; + + const WORD MINTEMPO = m_pSndFile->GetTempoMin(); + const WORD MAXTEMPO = m_pSndFile->GetTempoMax(); + char buffer[7]; + m_EditPitchTempoLock.GetWindowText(buffer, 6); + int ptlTempo = atoi(buffer); + if(ptlTempo < MINTEMPO) + ptlTempo = MINTEMPO; + if(ptlTempo > MAXTEMPO) + ptlTempo = MAXTEMPO; + + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = ptlTempo; + END_CRITICAL(); + m_pModDoc->SetModified(); +} + +void CCtrlInstruments::OnBnClickedCheckPitchtempolock() +//----------------------------------------------------- +{ + if(!m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) + return; + + if(IsDlgButtonChecked(IDC_CHECK_PITCHTEMPOLOCK)) + { + + INSTRUMENTHEADER* penv = m_pSndFile->Headers[m_nInstrument]; + if(!penv) + return; + + //Checking to what value to put for the wPitchToTempoLock. + m_EditPitchTempoLock.EnableWindow(); + WORD ptl = penv->wPitchToTempoLock; + if(ptl == 0) + { + if(m_EditPitchTempoLock.GetWindowTextLength() > 0) + { + char buffer[7]; + m_EditPitchTempoLock.GetWindowText(buffer, 6); + ptl = atoi(buffer); + } + else + ptl = m_pSndFile->m_nDefaultTempo; + } + m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); + //SetModified() comes with this. + } + else + { + m_EditPitchTempoLock.EnableWindow(FALSE); + if(m_pSndFile && m_nInstrument && m_pSndFile->Headers[m_nInstrument] && + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock > 0) + { + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = 0; + END_CRITICAL(); + m_pModDoc->SetModified(); + } + } +} + +void CCtrlInstruments::OnEnKillfocusEditPitchtempolock() +//------------------------------------------------------ +{ + if(!m_pSndFile || IsLocked()) return; + + char buffer[6]; + m_EditPitchTempoLock.GetWindowText(buffer, 5); + int ptlTempo = atoi(buffer); + bool changed = false; + + + if(ptlTempo < m_pSndFile->GetTempoMin()) + { + ptlTempo = m_pSndFile->GetTempoMin(); + changed = true; + } + if(ptlTempo > m_pSndFile->GetTempoMax()) + { + ptlTempo = m_pSndFile->GetTempoMax(); + changed = true; + + } + + if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str()); +} Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2006-08-20 20:29:31 UTC (rev 165) @@ -78,6 +78,10 @@ CSpinButtonCtrl m_SpinAttack; // -! NEW_FEATURE#0027 + //Pitch/Tempo lock + CEdit m_EditPitchTempoLock; + CButton m_CheckPitchTempoLock; + public: CCtrlInstruments(); virtual ~CCtrlInstruments(); @@ -144,6 +148,9 @@ afx_msg void OnEditSampleMap(); afx_msg void TogglePluginEditor(); //rewbs.instroVSTi afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void OnEnChangeEditPitchtempolock(); + afx_msg void OnBnClickedCheckPitchtempolock(); + afx_msg void OnEnKillfocusEditPitchtempolock(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -64,6 +64,7 @@ ON_COMMAND(IDC_PATINSTROPLUGGUI2, ToggleSplitPluginEditor) //rewbs.instroVST ON_EN_CHANGE(IDC_EDIT_SPACING, OnSpacingChanged) ON_EN_CHANGE(IDC_EDIT_PATTERNNAME, OnPatternNameChanged) + ON_EN_KILLFOCUS(IDC_EDIT_ORDERLIST_MARGINS, OnOrderListMarginsChanged) ON_UPDATE_COMMAND_UI(IDC_PATTERN_RECORD,OnUpdateRecord) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) //}}AFX_MSG_MAP @@ -85,8 +86,10 @@ DDX_Control(pDX, IDC_COMBO_OCTAVEMODIFIER, m_CbnOctaveModifier); DDX_Control(pDX, IDC_COMBO_SPLITVOLUME, m_CbnSplitVolume); DDX_Control(pDX, IDC_EDIT_SPACING, m_EditSpacing); + DDX_Control(pDX, IDC_EDIT_ORDERLIST_MARGINS,m_EditOrderListMargins); DDX_Control(pDX, IDC_EDIT_PATTERNNAME, m_EditPatName); DDX_Control(pDX, IDC_SPIN_SPACING, m_SpinSpacing); + DDX_Control(pDX, IDC_SPIN_ORDERLIST_MARGINS,m_SpinOrderListMargins); DDX_Control(pDX, IDC_SPIN_INSTRUMENT, m_SpinInstrument); DDX_Control(pDX, IDC_TOOLBAR1, m_ToolBar); //}}AFX_DATA_MAP @@ -157,13 +160,18 @@ // Special edit controls -> tab switch to view m_EditSpacing.SetParent(this); m_EditPatName.SetParent(this); + m_EditPatName.SetLimitText(MAX_PATTERNNAME); + m_EditOrderListMargins.SetParent(this); + m_EditOrderListMargins.SetLimitText(3); // Spin controls m_SpinSpacing.SetRange(0, 16); + m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); - m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); - m_EditPatName.SetLimitText(MAX_PATTERNNAME); + m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax()); + m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins()); SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing); + SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins()); CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked m_OrderList.SetFocus(); @@ -240,6 +248,7 @@ { m_OrderList.SetWindowPos(NULL, 0,0, cx, cy, SWP_NOMOVE|SWP_NOZORDER|SWP_DRAWFRAME); } + OnOrderListMarginsChanged(); } } @@ -410,6 +419,7 @@ SendViewMessage(VIEWMSG_PATTERNLOOP, (SONG_PATTERNLOOP & m_pSndFile->m_dwSongFlags)); } OnSpacingChanged(); + OnOrderListMarginsChanged(); //mimicry SendViewMessage(VIEWMSG_SETSPLITINSTRUMENT, m_nSplitInstrument); SendViewMessage(VIEWMSG_SETSPLITNOTE, m_nSplitNote); @@ -580,6 +590,7 @@ if (m_hWndView) { OnSpacingChanged(); + OnOrderListMarginsChanged(); //mimicry... if (m_bRecord) SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); CChildFrame *pFrame = (CChildFrame *)GetParentFrame(); @@ -664,6 +675,24 @@ } +void CCtrlPatterns::OnOrderListMarginsChanged() +//--------------------------------------------- +{ + BYTE i; + BYTE maxOrders = m_OrderList.GetShownOrdersMax(); + if((m_EditOrderListMargins.m_hWnd) && (m_EditOrderListMargins.GetWindowTextLength() > 0)) + { + i = m_OrderList.SetOrderlistMargins(GetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS)); + } + else + { + i = m_OrderList.GetOrderlistMargins(); + } + + m_SpinOrderListMargins.SetRange(0, maxOrders); + SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i); + +} void CCtrlPatterns::OnSpacingChanged() //------------------------------------ { Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2006-08-20 20:29:31 UTC (rev 165) @@ -12,6 +12,11 @@ HFONT m_hFont; COLORREF colorText, colorTextSel; int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos; + //m_nXScroll : The order at the beginning of shown orderlist? + //m_nScrollPos: The same as order? + BYTE m_nOrderlistMargins; + //To tell how many orders('orderboxes') to show at least + //on both sides of current order(when updating orderslist position). UINT m_nDragOrder; BOOL m_bScrolling, m_bDragging, m_bShift; CModDoc *m_pModDoc; @@ -32,6 +37,9 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); + BYTE SetOrderlistMargins(int); //Returns the number that was set. + BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;} + BYTE GetShownOrdersMax(); //Should return the maximum number of shown orders. public: //{{AFX_VIRTUAL(COrderList) @@ -98,8 +106,8 @@ // -> DESC="midi keyboard split" CComboBox m_CbnSplitInstrument,m_CbnSplitNote,m_CbnOctaveModifier,m_CbnSplitVolume; // -! NEW_FEATURE#0012 - CPatEdit m_EditSpacing, m_EditPatName; - CSpinButtonCtrl m_SpinInstrument, m_SpinSpacing; + CPatEdit m_EditSpacing, m_EditPatName, m_EditOrderListMargins; + CSpinButtonCtrl m_SpinInstrument, m_SpinSpacing, m_SpinOrderListMargins; CModControlBar m_ToolBar; UINT m_nInstrument, m_nDetailLevel; BOOL m_bRecord, m_bVUMeters, m_bPluginNames; @@ -171,6 +179,7 @@ afx_msg void OnNextInstrument(); afx_msg void OnSpacingChanged(); afx_msg void OnPatternNameChanged(); + afx_msg void OnOrderListMarginsChanged(); afx_msg void OnSetupZxxMacros(); afx_msg void OnChordEditor(); afx_msg void OnDetailLo(); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -67,7 +67,8 @@ m_pParent = NULL; m_cxFont = m_cyFont = 0; m_pModDoc = NULL; - m_nScrollPos = m_nXScroll = 0; + m_nScrollPos = m_nXScroll = 0; + m_nOrderlistMargins = 2; m_bScrolling = FALSE; m_bDragging = FALSE; m_bShift = FALSE; @@ -151,6 +152,16 @@ } +BYTE COrderList::GetShownOrdersMax() +//---------------------------------- +{ + CRect rcClient; + GetClientRect(&rcClient); + if(m_cxFont>0) return static_cast<BYTE>(rcClient.right / m_cxFont); + else return static_cast<BYTE>(rcClient.right / GetFontWidth()); +} + + BOOL COrderList::SetCurSel(int sel, BOOL bEdit) //--------------------------------------------- { @@ -164,18 +175,18 @@ m_nScrollPos = sel; if (!m_bScrolling) { - if ((m_nScrollPos < m_nXScroll) || (!m_cxFont) || (!m_cyFont)) + if ((m_nScrollPos < m_nXScroll+m_nOrderlistMargins) || (!m_cxFont) || (!m_cyFont)) { - m_nXScroll = m_nScrollPos; + m_nXScroll = max(0, m_nScrollPos - m_nOrderlistMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } else { - int maxsel = (rcClient.right / m_cxFont); + int maxsel = GetShownOrdersMax(); if (maxsel) maxsel--; - if (m_nScrollPos - m_nXScroll >= maxsel) + if (m_nScrollPos - m_nXScroll >= maxsel-m_nOrderlistMargins) { - m_nXScroll = m_nScrollPos - maxsel; + m_nXScroll = m_nScrollPos - (maxsel-m_nOrderlistMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } @@ -243,7 +254,8 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - for (int i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; + int i = 0; + for (i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; SetCurSel(i); } break; @@ -434,6 +446,7 @@ GetClientRect(&rcClient); rect = rcClient; int nIndex = m_nXScroll; + //Scrolling the shown orders(the showns rectangles)? while (rect.left < rcClient.right) { BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE; @@ -859,3 +872,24 @@ } return bCanDrop; } + + +BYTE COrderList::SetOrderlistMargins(int i) +//---------------------------------------------- +{ + const BYTE maxOrders = GetShownOrdersMax(); + const BYTE maxMargins = (maxOrders % 2 == 0) ? maxOrders/2 - 1 : maxOrders/2; + //For example: If maximum is 4 orders -> maxMargins = 4/2 - 1 = 1; + //if maximum is 5 -> maxMargins = (int)5/2 = 2 + + if(i >= 0 && i < maxMargins) + { + m_nOrderlistMargins = static_cast<BYTE>(i); + } + else + { + if(i<0) m_nOrderlistMargins = 0; + else m_nOrderlistMargins = maxMargins; + } + return m_nOrderlistMargins; +} Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -194,7 +194,7 @@ } -POINT CViewPattern::GetPointFromPosition(DWORD dwPos) +POINT CViewPattern::GetPointFromPosition(DWORD dwPos) //--------------------------------------------------- { PCPATTERNFONT pfnt = GetCurrentPatternFont(); @@ -231,7 +231,8 @@ int xx = (pt.x - m_szHeader.cx) % GetColumnWidth(), dx = 0; int imax = 4; if (imax > (int)m_nDetailLevel+1) imax = m_nDetailLevel+1; - for (int i=0; i<imax; i++) + int i = 0; + for (i=0; i<imax; i++) { dx += pfnt->nEltWidths[i]; if (xx < dx) break; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -279,6 +279,12 @@ _getdcwd(_getdrive(), wd, 255); m_csExecutablePath = wd; //Assume working dir is executable path at this stage. + //Relabs.note: m_csExecutablePath doesn't give right path + //at least for debug builds. + #ifdef DEBUG + m_csExecutablePath += "\\bin"; + #endif + m_bModTreeHasFocus = false; //rewbs.customKeys m_pNoteMapHasFocus = NULL; //rewbs.customKeys m_bOptionsLocked = false; //rewbs.customKeys @@ -1607,18 +1613,18 @@ UINT uVerLength; if (!(::GetFileVersionInfo((LPTSTR)szFullPath, (DWORD)dwVerHnd, (DWORD)dwVerInfoSize, (LPVOID)pVersionInfo))) { - delete pVersionInfo; + delete[] pVersionInfo; return 0; } if (!(::VerQueryValue(pVersionInfo, TEXT("\\StringFileInfo\\040904b0\\FileVersion"), (LPVOID*)&szVer, &uVerLength))) { - delete pVersionInfo; + delete[] pVersionInfo; return 0; } //version will be like: 1, 17, 2, 38 CString version = szVer; - delete pVersionInfo; + delete[] pVersionInfo; int v1, v2, v3, v4; sscanf(version, "%x, %x, %x, %x", &v1, &v2, &v3, &v4); @@ -1873,7 +1879,9 @@ } if (m_pSndFile) { - m_pSndFile->LoopPattern(-1); + //m_pSndFile->LoopPattern(-1); + //Relabs.note: Commented above line - why loop should be disabled when pausing? + m_pSndFile->m_dwSongFlags &= ~SONG_PAUSED; if (m_pSndFile == &m_WaveFile) { m_pSndFile = NULL; Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -1069,7 +1069,7 @@ fwrite(&zero, 1, 1, f); list.filesize++; } - delete pszComments; + delete[] pszComments; } } for (UINT iCmt=0; iCmt<=6; iCmt++) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -107,7 +107,6 @@ // -> DESC="channels management dlg" ReinitRecordState(); // -! NEW_FEATURE#0015 - } @@ -132,6 +131,7 @@ //--------------------------- { if (!CDocument::OnNewDocument()) return FALSE; + m_SndFile.Create(NULL, this, 0); m_SndFile.m_nType = CTrackApp::GetDefaultDocType(); @@ -349,6 +349,13 @@ // -> DESC="channels management dlg" ReinitRecordState(); // -! NEW_FEATURE#0015 + if (m_SndFile.m_dwLastSavedWithVersion>CMainFrame::GetFullVersionNumeric()) { + char s[256]; + wsprintf(s, "Warning: this song was last saved with a more recent version of OpenMPT.\r\nSong saved with: v%s. Current version: v%s.\r\n", + CMainFrame::GetVersionString(m_SndFile.m_dwLastSavedWithVersion), + CMainFrame::GetFullVersionString()); + ::AfxMessageBox(s); + } SetModifiedFlag(FALSE); // (bModified); m_bHasValidPath=true; @@ -364,7 +371,7 @@ CHAR fext[_MAX_EXT]=""; UINT nType = m_SndFile.m_nType, dwPacking = 0; BOOL bOk = FALSE; - + m_SndFile.m_dwLastSavedWithVersion=CMainFrame::GetFullVersionNumeric(); if (!lpszPathName) return FALSE; _splitpath(lpszPathName, NULL, NULL, NULL, fext); if (!lstrcmpi(fext, ".mod")) nType = MOD_TYPE_MOD; else @@ -558,7 +565,6 @@ { SetModified(FALSE); m_bHasValidPath=true; - m_SndFile.m_dwLastSavedWithVersion=CMainFrame::GetFullVersionNumeric(); return TRUE; } else { @@ -693,7 +699,7 @@ { strcpy(p, m_lpszLog); strcat(p, lpszLog); - delete m_lpszLog; + delete[] m_lpszLog; m_lpszLog = p; } } else @@ -710,7 +716,7 @@ { if (m_lpszLog) { - delete m_lpszLog; + delete[] m_lpszLog; m_lpszLog = NULL; } return TRUE; @@ -1406,6 +1412,9 @@ if(!wsdlg.m_bChannelMode || !(flags[i] & CHN_MUTE)){ // rewbs.fix3239 m_SndFile.SetCurrentPos(0); + //Relabs.note: Since I removed pattern loop disabling from certain + //methods, making sure that pattern loop is off. + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; if (wsdlg.m_bSelectPlay) { m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder); m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder; @@ -1477,6 +1486,9 @@ bplaying = TRUE; pMainFrm->PauseMod(); m_SndFile.SetCurrentPos(0); + + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; + // Saving file PTAGID3INFO pTag = (wsdlg.m_bSaveInfoField) ? &wsdlg.m_id3tag : NULL; CDoAcmConvert dwcdlg(&m_SndFile, s, &wfx.wfx, hadid, pTag, pMainFrm); @@ -1580,9 +1592,9 @@ if (pMainFrm) { CChildFrame *pChildFrm = (CChildFrame *) GetChildFrame(); - if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) == 0) // Relabsoluness.note: Using existing 'dirty HACK' + if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) == 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern checkbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -1604,7 +1616,9 @@ m_SndFile.ResumePlugins(); } END_CRITICAL(); - m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED); + //m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED); + //Relabs.note: Added SONG_PATTERNLOOP. + m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED|SONG_PATTERNLOOP); pMainFrm->PlayMod(this, m_hWndFollow, m_dwNotifyType); } } @@ -1679,7 +1693,9 @@ pMainFrm->PauseMod(); - m_SndFile.m_dwSongFlags &= ~SONG_STEP; + //m_SndFile.m_dwSongFlags &= ~SONG_STEP; + //Relabs.hack: Added SONG_PATTERNLOOP + m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PATTERNLOOP); m_SndFile.SetCurrentPos(0); pMainFrm->ResetElapsedTime(); BEGIN_CRITICAL(); @@ -2061,7 +2077,8 @@ BOOL bSupported; int fxndx = -1; pszDescription[0] = 0; - for (UINT i=0; i<MAX_FXINFO; i++) + UINT i = 0; + for (i=0; i<MAX_FXINFO; i++) { if ((command == gFXInfo[i].dwEffect) // Effect && ((param & gFXInfo[i].dwParamMask) == gFXInfo[i].dwParamValue)) // Value @@ -2837,6 +2854,8 @@ { pSndFile->Chn[i].dwFlags |= CHN_NOTEFADE | CHN_KEYOFF; } + if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] == nPat)) pSndFile->m_nCurrentPattern = pSndFile->m_nNextPattern = nOrd; + //Relabs.note: Some jumps occured when using pattern play and loop pattern checkbox - above line hopefully fixes it. pSndFile->m_dwSongFlags &= ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow = nRow; @@ -3041,7 +3060,8 @@ if (macroType==sfx_plug && MacroToPlugParam(macroText)==paramToUse) { CString message; message.Format("Param %d can already be controlled with macro %X", paramToUse, checkMacro); - ::MessageBox(NULL,message, "Macro exists for this param",MB_ICONINFORMATION | MB_OK); + CMainFrame::GetMainFrame()->MessageBox(message, "Macro exists for this param",MB_ICONINFORMATION | MB_OK); + //Relabs.expl: Modified to prevent notification box go 'under' ompt to block key messages. return; } } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -56,7 +56,8 @@ } // Resizing all patterns to 64 rows UINT nPatCvt = 0; - for (UINT i=0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) + UINT i = 0; + for (i=0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) { if (m_SndFile.PatternSize[i] < 64) { @@ -424,7 +425,8 @@ { UINT nRemainingChannels = 0; //First calculating how many channels are to be left - for(UINT i = 0; i<m_SndFile.m_nChannels; i++) + UINT i = 0; + for(i = 0; i<m_SndFile.m_nChannels; i++) { if(!m_bChnMask[i]) nRemainingChannels++; } @@ -439,7 +441,7 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - for (UINT i=0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (i=0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) { MODCOMMAND *p = m_SndFile.Patterns[i]; MODCOMMAND *newp = CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], nRemainingChannels); @@ -623,7 +625,8 @@ memset(pPatterns, 0, sizeof(pPatterns)); for (UINT irst=0; irst<MAX_PATTERNS; irst++) nPatMap[irst] = 0xFFFF; nPats = 0; - for (UINT imap=0; imap<MAX_ORDERS; imap++) + UINT imap = 0; + for (imap=0; imap<MAX_ORDERS; imap++) { UINT n = m_SndFile.Order[imap]; if (n < MAX_PATTERNS) @@ -1131,7 +1134,8 @@ //------------------------------------------------ { UINT maxpat = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 128 : MAX_PATTERNS; - for (UINT i=0; i<maxpat; i++) + UINT i = 0; + for (i=0; i<maxpat; i++) { if (!m_SndFile.Patterns[i]) break; } @@ -1172,7 +1176,8 @@ LONG CModDoc::InsertSample(BOOL bLimit) //------------------------------------- { - for (UINT i=1; i<=m_SndFile.m_nSamples; i++) + UINT i = 1; + for (i=1; i<=m_SndFile.m_nSamples; i++) { if ((!m_SndFile.m_szNames[i][0]) && (m_SndFile.Ins[i].pSample == NULL)) { @@ -2071,7 +2076,7 @@ { for (UINT i=0; i<MAX_UNDO_LEVEL; i++) { - if (PatternUndo[i].pbuffer) delete PatternUndo[i].pbuffer; + if (PatternUndo[i].pbuffer) delete[] PatternUndo[i].pbuffer; PatternUndo[i].cx = 0; PatternUndo[i].cy = 0; PatternUndo[i].pbuffer = NULL; @@ -2110,7 +2115,7 @@ bUpdate = (PatternUndo[0].pbuffer) ? FALSE : TRUE; if (PatternUndo[MAX_UNDO_LEVEL-1].pbuffer) { - delete PatternUndo[MAX_UNDO_LEVEL-1].pbuffer; + delete[] PatternUndo[MAX_UNDO_LEVEL-1].pbuffer; PatternUndo[MAX_UNDO_LEVEL-1].pbuffer = NULL; } for (UINT i=MAX_UNDO_LEVEL-1; i>=1; i--) @@ -2172,7 +2177,7 @@ pUndo += PatternUndo[0].cx; } } - delete PatternUndo[0].pbuffer; + delete[] PatternUndo[0].pbuffer; for (UINT i=0; i<MAX_UNDO_LEVEL-1; i++) { PatternUndo[i] = PatternUndo[i+1]; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -1158,12 +1158,12 @@ } if (m_lpRotoZoom) { - delete m_lpRotoZoom; + delete[] m_lpRotoZoom; m_lpRotoZoom = NULL; } if (m_lpCopy) { - delete m_lpCopy; + delete[] m_lpCopy; m_lpCopy = NULL; } } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -457,7 +457,8 @@ UINT nParams = pVstPlugin->GetNumParameters(); m_CbnParam.SetRedraw(FALSE); m_CbnParam.ResetContent(); - for (UINT i=0; i<nParams; i++) + UINT i = 0; + for (i=0; i<nParams; i++) { pVstPlugin->GetParamName(i, sname, sizeof(sname)); wsprintf(s, "%02X: %s", i|0x80, sname); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -2243,7 +2243,8 @@ penv->VolEnv[0] = 64; penv->nVolEnv = 1; } - for (UINT i=0; i<penv->nVolEnv; i++) if (nTick <= penv->VolPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nVolEnv; i++) if (nTick <= penv->VolPoints[i]) break; for (UINT j=penv->nVolEnv; j>i; j--) { penv->VolPoints[j] = penv->VolPoints[j-1]; @@ -2269,7 +2270,8 @@ penv->PanEnv[0] = 32; penv->nPanEnv = 1; } - for (UINT i=0; i<penv->nPanEnv; i++) if (nTick <= penv->PanPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nPanEnv; i++) if (nTick <= penv->PanPoints[i]) break; for (UINT j=penv->nPanEnv; j>i; j--) { penv->PanPoints[j] = penv->PanPoints[j-1]; @@ -2295,7 +2297,8 @@ penv->PitchEnv[0] = 32; penv->nPitchEnv = 1; } - for (UINT i=0; i<penv->nPitchEnv; i++) if (nTick <= penv->PitchPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nPitchEnv; i++) if (nTick <= penv->PitchPoints[i]) break; for (UINT j=penv->nPitchEnv; j>i; j--) { penv->PitchPoints[j] = penv->PitchPoints[j-1]; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -10,7 +10,7 @@ #include "dlsbank.h" #include "EffectVis.h" //rewbs.fxvis #include "OpenGLEditor.h" //rewbs.fxvis -#include "PatternGotoDialog.h" +#include "PatternGotoDialog.h" #include "PatternRandomizer.h" #include ".\arrayutils.h" #include ".\view_pat.h" @@ -63,7 +63,7 @@ // -> DESC="midi keyboard split" ON_COMMAND(ID_EDIT_SPLITRECSELECT, OnSplitRecordSelect) // -! NEW_FEATURE#0012 - ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) + ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick) @@ -187,6 +187,8 @@ pSndFile->PatternSize[npat] = 64; pSndFile->Patterns[npat] = CSoundFile::AllocatePattern(64, pSndFile->m_nChannels); } + + bUpdateScroll = FALSE; m_nPattern = npat; if ((nrow >= 0) && (nrow != (int)m_nRow) && (nrow < (int)pSndFile->PatternSize[m_nPattern])) @@ -200,12 +202,12 @@ UpdateSizes(); UpdateScrollSize(); UpdateIndicator(); - + if (m_bWholePatternFitsOnScreen) //rewbs.scrollFix SetScrollPos(SB_VERT, 0); else if (bUpdateScroll) //rewbs.fix3147 SetScrollPos(SB_VERT, m_nRow * GetColumnHeight()); - + UpdateScrollPos(); InvalidatePattern(TRUE); SendCtrlMessage(CTRLMSG_PATTERNCHANGED, m_nPattern); @@ -223,7 +225,7 @@ pSndFile = pModDoc->GetSoundFile(); CRect rect; UINT yofs = GetYScrollPos(); - + if ((bWrap) && (pSndFile->PatternSize[m_nPattern])) { if ((int)row < (int)0) @@ -331,14 +333,14 @@ SetCurSel(sel0, sel); UpdateIndicator(); - Log("Row: %d; Chan: %d; ColType: %d; cursor&0xFFFF: %x; cursor>>16: %x;\n", - GetRowFromCursor(sel0), + Log("Row: %d; Chan: %d; ColType: %d; cursor&0xFFFF: %x; cursor>>16: %x;\n", + GetRowFromCursor(sel0), GetChanFromCursor(sel0), GetColTypeFromCursor(sel0), (int)(sel0&0xFFFF), (int)(sel0>>16)); - + return TRUE; } @@ -457,7 +459,7 @@ CModDoc *pModDoc = GetDocument(); int yofs = GetYScrollPos(), xofs = GetXScrollPos(); int row, col; - + if ((!pModDoc) || (!m_szCell.cy)) return FALSE; GetClientRect(&rect); pSndFile = pModDoc->GetSoundFile(); @@ -570,28 +572,28 @@ { //rewbs.customKeys //We handle keypresses before Windows has a chance to handle them (for alt etc..) - if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || + if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) { CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); - + //Translate message manually UINT nChar = pMsg->wParam; UINT nRepCnt = LOWORD(pMsg->lParam); UINT nFlags = HIWORD(pMsg->lParam); KeyEventType kT = ih->GetKeyEventType(nFlags); InputTargetContext ctx = (InputTargetContext)(kCtxViewPatterns+1 + (m_dwCursor & 0x07)); - + if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. - } + } //HACK: fold kCtxViewPatternsFX and kCtxViewPatternsFXparam so that all commands of 1 are active in the other - else { + else { if (ctx==kCtxViewPatternsFX) { if (ih->KeyEvent(kCtxViewPatternsFXparam, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. } - } + } if (ctx==kCtxViewPatternsFXparam) { if (ih->KeyEvent(kCtxViewPatternsFX, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. @@ -601,9 +603,9 @@ //end HACK. } //end rewbs.customKeys - + } - + return CModScrollView::PreTranslateMessage(pMsg); } @@ -615,7 +617,7 @@ //---------------------------- { if (m_pEffectVis) { - m_pEffectVis->DoClose(); + m_pEffectVis->DoClose(); delete m_pEffectVis; m_pEffectVis = NULL; } @@ -638,7 +640,7 @@ } if (m_pOpenGLEditor) { - m_pOpenGLEditor->DoClose(); + m_pOpenGLEditor->DoClose(); delete m_pOpenGLEditor; m_pOpenGLEditor = NULL; } @@ -667,13 +669,13 @@ //------------------------------------------- { CScrollView::OnKillFocus(pNewWnd); - + //rewbs.customKeys //Unset all selection m_dwStatus &= ~PATSTATUS_KEYDRAGSEL; m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; // CMainFrame::GetMainFrame()->GetInputHandler()->SetModifierMask(0); - //end rewbs.customKeys + //end rewbs.customKeys m_dwStatus &= ~PATSTATUS_FOCUS; InvalidateRow(); @@ -689,7 +691,7 @@ MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; if (!p) return; BeginWaitCursor(); - + DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwBeginSel:m_dwEndSel; DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwEndSel:m_dwBeginSel; pModDoc->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->PatternSize[m_nPattern]); @@ -743,7 +745,7 @@ DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwBeginSel:m_dwEndSel; DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwEndSel:m_dwBeginSel; pModDoc->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->PatternSize[m_nPattern]); - + int finalDest = (startSel>>16)+((endSel>>16)-(startSel>>16))/2; for (int row=(startSel>>16)+1; row<=finalDest; row++) @@ -801,46 +803,51 @@ //----------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !(IsEditingEnabled_bmsg())) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; if (!p) return; + BeginWaitCursor(); + + if(ITStyle && GetColTypeFromCursor(m_dwEndSel) == NOTE_COLUMN) m_dwEndSel += 1; + //If selection ends to a note column, in ITStyle extending it to instrument column since the instrument data is + //removed with note data. + PrepareUndo(m_dwBeginSel, m_dwEndSel); DWORD tmp = m_dwEndSel; for (UINT row=(m_dwBeginSel >> 16); row<=(m_dwEndSel >> 16); row++) { // for all selected rows for (UINT i=(m_dwBeginSel & 0xFFFF); i<=(m_dwEndSel & 0xFFFF); i++) if ((i & 7) < 5) { // for all selected cols - + UINT chn = i >> 3; if ((chn >= pSndFile->m_nChannels) || (row >= pSndFile->PatternSize[m_nPattern])) continue; MODCOMMAND *m = &p[row * pSndFile->m_nChannels + chn]; - switch(i & 7) { case 0: // Clear note if (rm.note) { - m->note = 0; + m->note = 0; if (ITStyle) m->instr = 0; } break; case 1: // Clear instrument if (rm.instrument) { - m->instr = 0; + m->instr = 0; } break; case 2: // Clear volume if (rm.volume) { - m->volcmd = m->vol = 0; + m->volcmd = m->vol = 0; } - break; - case 3: // Clear Command + break; + case 3: // Clear Command if (rm.command) { m->command = 0; } break; case 4: // Clear Command Param if (rm.parameter) { - m->param = 0; + m->param = 0; } break; } //end switch @@ -882,8 +889,8 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg()) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, false); InvalidatePattern(FALSE); @@ -896,8 +903,8 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg()) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, true); InvalidatePattern(FALSE); @@ -909,8 +916,8 @@ //---------------------------------------- { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg() ) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, true, true); InvalidatePattern(FALSE); @@ -1046,7 +1053,7 @@ pModDoc->Record1Channel(nItemNo); InvalidateChannelsHeaders(); } - } + } else if (!(nFlags&MK_CONTROL)) { pModDoc->MuteChannel(nItemNo, (pSndFile->ChnSettings[nItemNo].dwFlags & CHN_MUTE) ? FALSE : TRUE); } @@ -1088,7 +1095,7 @@ HMENU hMenu; // Too far left to get a ctx menu: - if ((!pModDoc) || (pt.x < m_szHeader.cx)) { + if ((!pModDoc) || (pt.x < m_szHeader.cx)) { return; } @@ -1116,7 +1123,7 @@ pSndFile = pModDoc->GetSoundFile(); m_nMenuParam = GetPositionFromPoint(pt); - + // Right-click outside selection? Reposition cursor to the new location if (((m_nMenuParam >> 16) < (m_dwBeginSel >> 16)) || ((m_nMenuParam >> 16) > (m_dwEndSel >> 16)) @@ -1443,7 +1450,7 @@ CSoundFile *pSndFile; UINT row, maxrow; - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !( IsEditingEnabled_bmsg() )) return; pSndFile = pModDoc->GetSoundFile(); if (!pSndFile->Patterns[m_nPattern]) return; row = m_dwBeginSel >> 16; @@ -1509,7 +1516,7 @@ CSoundFile *pSndFile; UINT row, maxrow; - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !(IsEditingEnabled_bmsg())) return; pSndFile = pModDoc->GetSoundFile(); if (!pSndFile->Patterns[m_nPattern]) return; row = m_dwBeginSel >> 16; @@ -1556,7 +1563,7 @@ maxrow = pSndFile->PatternSize[m_nPattern]; colmin = (m_dwBeginSel & 0xFFFF) >> 3; colmax = (m_dwEndSel & 0xFFFF) >> 3; - + InsertRows(colmin, colmax); } //end rewbs.customKeys @@ -1629,16 +1636,16 @@ CSoundFile* pSndFile = pModDoc->GetSoundFile(); UINT nCurrentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); UINT nCurrentChannel = ((m_dwCursor & 0xFFFF) >> 3) + 1; - + m_pGotoWnd->UpdatePos(m_nRow, nCurrentChannel, m_nPattern, nCurrentOrder, pSndFile); if (m_pGotoWnd->DoModal() == IDOK) { //Position should be valididated. - + if (m_pGotoWnd->m_nPattern != m_nPattern) { SetCurrentPattern(m_pGotoWnd->m_nPattern); } - + if (m_pGotoWnd->m_nOrder != nCurrentOrder) { SendCtrlMessage(CTRLMSG_SETCURRENTORDER, m_pGotoWnd->m_nOrder); } @@ -1951,7 +1958,7 @@ //rewbs.customKeys CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); - + if ((pModDoc) && (pMainFrm)) { PrepareUndo(m_dwBeginSel, m_dwEndSel); @@ -2007,7 +2014,7 @@ m_pRandomizer = new CPatternRandomizer(this); if (m_pRandomizer) { m_pRandomizer->showGUI(); - } + } } } } @@ -2076,7 +2083,7 @@ bool changed = false; CArray<UINT,UINT> validChans; - + if (type==EFFECT_COLUMN || type==PARAM_COLUMN) { CArray<UINT,UINT> moreValidChans; ListChansWhereColSelected(EFFECT_COLUMN, validChans); @@ -2099,11 +2106,11 @@ if (!IsInterpolationPossible(row0, row1, nchn, type, pSndFile)) { continue; //skip chans where interpolation isn't possible } - + if (!changed) { //ensure we save undo buffer only before any channels are interpolated PrepareUndo(m_dwBeginSel, m_dwEndSel); } - + int vsrc, vdest, vcmd, verr, distance; distance = row1 - row0; @@ -2134,9 +2141,9 @@ if (vdest < vsrc) verr = -verr; pcmd += row0 * pSndFile->m_nChannels + nchn; - + for (UINT i=0; i<=distance; i++, pcmd += pSndFile->m_nChannels) { - + switch(type) { case NOTE_COLUMN: if ((!pcmd->note) || (pcmd->instr == vcmd)) { @@ -2163,7 +2170,7 @@ ASSERT(false); } } - + changed=true; } //end for all channels where type is selected @@ -2221,7 +2228,7 @@ int x1, y1, x2, y2, c1, c2, xc1, xc2, xmc1, xmc2, ym1, ym2; int dx, dy, nChannels, nRows; - if ((pModDoc = GetDocument()) == NULL || !(m_dwStatus&PATSTATUS_RECORD)) return; + if ((pModDoc = GetDocument()) == NULL || !(IsEditingEnabled_bmsg())) return; pSndFile = pModDoc->GetSoundFile(); nChannels = pSndFile->m_nChannels; nRows = pSndFile->PatternSize[m_nPattern]; @@ -2256,7 +2263,7 @@ for (int c=0; c<4; c++) { int xsrc=x, ysrc=y, xc=x*4+c; - + // Destination is from destination selection if ((xc >= xmc1) && (xc <= xmc2) && (y >= ym1) && (y <= ym2)) { @@ -2284,9 +2291,12 @@ p++; } } + BEGIN_CRITICAL(); pSndFile->Patterns[m_nPattern] = pNewPattern; END_CRITICAL(); + + x1 += dx; x2 += dx; y1 += dy; @@ -2318,7 +2328,7 @@ BYTE nIns = static_cast<BYTE>(GetCurrentInstrument()); MODCOMMAND *p; BOOL bModified; - + if (!nIns) return; if ((pModDoc = GetDocument()) == NULL) return; pSndFile = pModDoc->GetSoundFile(); @@ -2338,7 +2348,6 @@ for (UINT c=startChan; c<endChan+1; c++) { p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + c; - // If a note or an instr is present on the row, do the change, if required. // Do not set instr if note and instr are both blank. if ( (p->note||p->instr) && (p->instr!=nIns) ) { @@ -2394,11 +2403,11 @@ void CViewPattern::OnAddChannelFront() //------------------------------------ { - UINT nChn = ((m_nMenuParam&0xFFFF)>>3); + UINT nChn = GetChanFromCursor(m_nMenuParam); CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; - + BeginWaitCursor(); //First adding channel as the last channel... if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { @@ -2419,7 +2428,7 @@ void CViewPattern::OnAddChannelAfter() //------------------------------------ { - UINT nChn = ((m_nMenuParam&0xFFFF)>>3)+1; + UINT nChn = ((m_nMenuParam&0xFFFF)>>3)+1; CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; @@ -2503,7 +2512,7 @@ //----------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + if (pModDoc && IsEditingEnabled_bmsg()) { UINT nPat = pModDoc->DoUndo(); if (nPat < MAX_PATTERNS) @@ -2536,7 +2545,6 @@ if (pSndFile->Patterns[m_nPattern]) { MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; - for (UINT j=0; j<pSndFile->m_nChannels; j++) { for (UINT i=0; i<pSndFile->PatternSize[m_nPattern]; i++) @@ -2571,8 +2579,8 @@ { chvol[j] = (BYTE)(pSndFile->Ins[nSmp].nVolume >> 2); break; - } - else + } + else { //nonexistant sample and no volume present in patten? assume volume=64. m->volcmd = VOLCMD_VOLUME; chvol[j] = 64; @@ -2677,14 +2685,14 @@ updateOrderList = true; m_nLastPlayedOrder = nOrd; } - + if (nRow < m_nLastPlayedRow) { InvalidateChannelsHeaders(); } m_nLastPlayedRow = nRow; if (pSndFile->m_dwSongFlags & (SONG_PAUSED|SONG_STEP)) return 0; - + //rewbs.toCheck: is it safe to remove this? What if a pattern has no order? /* if (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP) @@ -2698,13 +2706,13 @@ nPat = pSndFile->Order[nOrd]; } */ - + if (pSndFile->Order[nOrd] != nPat) { //order doesn't correlate with pattern, so mark it as invalid - nOrd = 0xFFFF; + nOrd = 0xFFFF; } - if (m_pEffectVis && m_pEffectVis->m_hWnd) { + if (m_pEffectVis && m_pEffectVis->m_hWnd) { m_pEffectVis->SetPlayCursor(nPat, nRow); } @@ -2731,15 +2739,15 @@ SetPlayCursor(nPat, nRow); } - + } //Ends condition "if(pnotify->dwType & MPTNOTIFY_POSITION)" if ((pnotify->dwType & (MPTNOTIFY_VUMETERS|MPTNOTIFY_STOP)) && (m_dwStatus & PATSTATUS_VUMETERS)) { UpdateAllVUMeters(pnotify); } - + UpdateIndicator(); return 0; @@ -2791,20 +2799,20 @@ pRow->param = 0xF0 + (foundMacro&0x0F); InvalidateRow(); } - + } } - + //Write the data, but we only overwrite if the command is a macro anyway. if (pRow->command == 0 || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { pRow->command = CMD_SMOOTHMIDI; pRow->param = value; InvalidateRow(); } - + } @@ -2816,7 +2824,8 @@ if ((!pModDoc) || (!pMainFrm)) return 0; -//Midi message from our perspective: +//Midi message from our perspective: +//NOTE: Velocity and Note data may actually consist of 7 bits, not 8 as said here. // +---------------------------+---------------------------+-------------+-------------+ //bit: | 24.23.22.21 | 20.19.18.17 | 16.15.14.13 | 12.11.10.09 | 08.07.06.05 | 04.03.02.01 | // +---------------------------+---------------------------+-------------+-------------+ @@ -2830,16 +2839,21 @@ //. We only handle note-on and note off events. //. Basing the event solely on the velocity as follows is incorrect, // since a note-off can have a velocity too: - // BYTE event = (dwMidiData>>16) & 0x64; + // BYTE event = (dwMidiData>>16) & 0x64; BYTE nNote = ((dwMidiData >> 8) & 0xFF) +1; // +1 is for MPT, where middle C is 61 BYTE nVol = (dwMidiData >> 16) & 0xFF; // At this stage nVol is a non linear value in [0;127] // Need to convert to linear in [0;64] - see below - BYTE event = dwMidiData & 0xF0; + BYTE event = dwMidiData & 0xF0; //Event 'contains' bits 08-05 (0xF0 == 11110000 in base 10) if ((event == 0x90) && !nVol) event = 0x80; //Convert event to note-off if req'd - + //Event nibble: 8 if Note Off, 9 is Note on. Don't care about other events ATM. - switch(event) + + + //NOTE: Midi in code should also be updated in view_smp.cpp and view_ins.cpp + //Should something be done to prevent need for code copy? + + switch(event) { case 0x80: // Note Off // The following method takes care of: @@ -2850,7 +2864,7 @@ case 0x90: // Note On if (CMainFrame::m_dwMidiSetup & MIDISETUP_RECORDVELOCITY) - { + { //Convert non linear value in [0;127] to linear value in [0;64]: nVol = (CDLSBank::DLSMidiVolumeToLinear(nVol)+1023) >> 10; //Amplify if requested: @@ -2861,14 +2875,14 @@ } else { //Use default volume - nVol = -1; + nVol = -1; } TempEnterNote(nNote, true, nVol); break; } - + return 0; } @@ -3162,17 +3176,17 @@ case kcPatternSnapUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, true); return wParam; case kcPatternSnapDownh2Select: case kcPatternSnapDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, true); return wParam; - + case kcNavigateDownSelect: case kcNavigateDown: SetCurrentRow(m_nRow+1, TRUE); return wParam; case kcNavigateUpSelect: case kcNavigateUp: SetCurrentRow(m_nRow-1, TRUE); return wParam; - + case kcNavigateDownBySpacingSelect: case kcNavigateDownBySpacing: SetCurrentRow(m_nRow+m_nSpacing, TRUE); return wParam; case kcNavigateUpBySpacingSelect: case kcNavigateUpBySpacing: SetCurrentRow(m_nRow-m_nSpacing, TRUE); return wParam; - + case kcNavigateLeftSelect: case kcNavigateLeft: if ((CMainFrame::m_dwPatternSetup & PATTERN_WRAP) && (!m_dwCursor)) SetCurrentColumn((((pSndFile->m_nChannels-1) << 3) | 4)); @@ -3196,22 +3210,22 @@ SetCurSel(n, n); return wParam;} case kcHomeHorizontalSelect: - case kcHomeHorizontal: if (m_dwCursor) SetCurrentColumn(0); - else if (m_nRow > 0) SetCurrentRow(0); + case kcHomeHorizontal: if (m_dwCursor) SetCurrentColumn(0); + else if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcHomeVerticalSelect: - case kcHomeVertical: if (m_nRow > 0) SetCurrentRow(0); + case kcHomeVertical: if (m_nRow > 0) SetCurrentRow(0); else if (m_dwCursor) SetCurrentColumn(0); - return wParam; + return wParam; case kcHomeAbsoluteSelect: - case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; + case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcEndHorizontalSelect: case kcEndHorizontal: if (m_dwCursor!=(((pSndFile->m_nChannels-1) << 3) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); else if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); - return wParam; + return wParam; case kcEndVerticalSelect: - case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); + case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); else if (m_dwCursor!=(((pSndFile->m_nChannels-1) << 3) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); return wParam; case kcEndAbsoluteSelect: @@ -3219,7 +3233,7 @@ case kcNextPattern: { UINT n = m_nPattern + 1; while ((n < MAX_PATTERNS) && (!pSndFile->Patterns[n])) n++; - SetCurrentPattern((n < MAX_PATTERNS) ? n : 0); + SetCurrentPattern((n < MAX_PATTERNS) ? n : 0); int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true); SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder); @@ -3245,7 +3259,7 @@ case kcCopySelectOffWithSelect: case kcCopySelectOffWithNav: case kcCopySelectOff: m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; return wParam; - + case kcClearRow: OnClearField(-1, false); return wParam; case kcClearField: OnClearField(m_dwCursor & 0x07, false); return wParam; case kcClearFieldITStyle: OnClearField(m_dwCursor & 0x07, false, true); return wParam; @@ -3255,14 +3269,14 @@ case kcDeleteRows: OnDeleteRows(); return wParam; case kcDeleteAllRows: DeleteRows(0, pSndFile->m_nChannels-1,1); return wParam; case kcInsertRow: OnInsertRows(); return wParam; - case kcInsertAllRows: InsertRows(0, pSndFile->m_nChannels-1); return wParam; + case kcInsertAllRows: InsertRows(0, pSndFile->m_nChannels-1); return wParam; case kcShowNoteProperties: ShowEditWindow(); return wParam; case kcShowPatternProperties: OnPatternProperties(); return wParam; case kcShowMacroConfig: SendCtrlMessage(CTRLMSG_SETUPMACROS); return wParam; case kcShowEditMenu: {CPoint pt = GetPointFromPosition((m_nRow << 16) | m_dwCursor); OnRButtonDown(0, pt); } - return wParam; + return wParam; case kcPatternGoto: OnEditGoto(); return wParam; case kcNoteCut: TempEnterNote(254, false); return wParam; @@ -3277,7 +3291,7 @@ case kcEditCopy: OnEditCopy(); return wParam; case kcCopyAndLoseSelection: { - OnEditCopy(); + OnEditCopy(); int sel = m_dwCursor | (m_nRow << 16); SetCurSel(sel, sel); return wParam; @@ -3318,38 +3332,38 @@ if (wParam>=kcSetSpacing0 && wParam<kcSetSpacing9) { - SetSpacing(wParam - kcSetSpacing0); + SetSpacing(wParam - kcSetSpacing0); return wParam; } if (wParam>=kcSetIns0 && wParam<=kcSetIns9) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterIns(wParam-kcSetIns0); return wParam; } if (wParam>=kcSetOctave0 && wParam<=kcSetOctave9) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled()) TempEnterOctave(wParam-kcSetOctave0); return wParam; } if (wParam>=kcSetVolumeStart && wParam<=kcSetVolumeEnd) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterVol(wParam-kcSetVolumeStart); return wParam; } if (wParam>=kcSetFXStart && wParam<=kcSetFXEnd) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterFX(wParam-kcSetFXStart+1); return wParam; } if (wParam>=kcSetFXParam0 && wParam<=kcSetFXParamF) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterFXparam(wParam-kcSetFXParam0); return wParam; } @@ -3358,18 +3372,20 @@ } void CViewPattern::TempEnterVol(int v) +//------------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; + MODCOMMAND oldcmd; // This is the command we are about to overwrite PrepareUndo(m_dwBeginSel, m_dwEndSel); - + // -- Work out where to put the new data UINT nChn = (m_dwCursor & 0xFFFF) >> 3; prowbase = p + m_nRow * pSndFile->m_nChannels; @@ -3382,7 +3398,7 @@ { vol = ((vol * 10) + v) % 100; if (!volcmd) volcmd = VOLCMD_VOLUME; - } + } else switch(v+kcSetVolumeStart) { @@ -3414,7 +3430,7 @@ p->volcmd = volcmd; p->vol = vol; - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3435,6 +3451,7 @@ } void CViewPattern::SetSpacing(int n) +//---------------------------------- { if (n != m_nSpacing) { @@ -3444,12 +3461,13 @@ } void CViewPattern::TempEnterFX(int c) +//----------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; MODCOMMAND oldcmd; // This is the command we are about to overwrite @@ -3469,7 +3487,7 @@ m_cmdOld.command = c; } p->command = c; - + // Check for MOD/XM Speed/Tempo command if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) @@ -3478,7 +3496,7 @@ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; } - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3494,12 +3512,13 @@ } void CViewPattern::TempEnterFXparam(int v) +//---------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; MODCOMMAND oldcmd; // This is the command we are about to overwrite @@ -3515,7 +3534,7 @@ // { p->param = (p->param << 4) | v; if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; -/* } +/* } else if (v >= 10 && v <= 15) { p->param = (p->param << 4) | (v + 0x0A); @@ -3530,7 +3549,7 @@ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; } - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3564,13 +3583,13 @@ if (!ins) ins = m_nFoundInstrument; pModDoc->NoteOff(note, TRUE, ins, (m_dwCursor & 0xFFFF) >> 3); } - + //Enter note off in pattern? if ((note < 1) || (note > 120)) return; if ((m_dwCursor & 7) > 1 && !fromMidi) return; - if (!pModDoc || !pMainFrm || !(m_dwStatus & PATSTATUS_RECORD)) + if (!pModDoc || !pMainFrm || !(IsEditingEnabled())) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); @@ -3603,7 +3622,7 @@ prowbase = p + nRow * pSndFile->m_nChannels; if (releaseChan>=0 && releaseChan<pSndFile->m_nChannels) p=prowbase+releaseChan; - else + else p=prowbase+nChn; //don't overwrite: @@ -3616,9 +3635,9 @@ return; } } else { - return; + return; } - } + } // -- write sdx if playing live if (usePlaybackPosition && pSndFile->m_nTickCount) { // avoid SD0 which will be mis-interpreted @@ -3630,7 +3649,8 @@ //Enter note off p->note = 0xFF; - p->instr = 0; + p->instr = GetCurrentInstrument(); //p->instr = 0; + //Writing the instrument as well - probably someone finds this annoying :) p->volcmd = 0; p->vol = 0; @@ -3640,7 +3660,7 @@ UpdateIndicator();... [truncated message content] |