From: <rel...@us...> - 2008-01-29 21:00:47
|
Revision: 199 http://modplug.svn.sourceforge.net/modplug/?rev=199&view=rev Author: relabsoluness Date: 2008-01-29 13:00:25 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Miscellaneous minor changes . Fix for faulty tabs when switching between modtypes with and without instrumenttab. (http://lpchip.com/modplug/viewtopic.php?t=1614) / Modified flag is not set when sliding tempo/global volume slider for MOD file / When setting instrument pan, checking whether instrument samples have set pan enabled and optionally disabling them. + Unmute all(on transition) shortcutkeys should now work in orderlist context / Disabled Set Pan in sample tab for XM + Half/double pattern rownumber buttons to pattern properties dialog. / Show prev/next pattern now shows pattern over +++ orderlist items. + Channel status in status bar now show channel volume info. / Disabled setting channel pan for MOD/XM in general view. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/OrderToPatternTable.cpp trunk/OpenMPT/mptrack/OrderToPatternTable.h trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/pattern.h trunk/OpenMPT/mptrack/patternContainer.cpp trunk/OpenMPT/mptrack/patternContainer.h trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/typedefs.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -80,17 +80,19 @@ BOOL CCtrlGeneral::OnInitDialog() //------------------------------- { + const CModSpecifications specs = m_pSndFile->GetModSpecifications(); CModControlDlg::OnInitDialog(); // Song Title if(m_pSndFile) - m_EditTitle.SetLimitText(m_pSndFile->GetModSpecifications().modNameLengthMax); + m_EditTitle.SetLimitText(specs.modNameLengthMax); else m_EditTitle.SetLimitText(25); // -> CODE#0016 // -> DESC="default tempo update" // m_SpinTempo.SetRange(32, 255); // 255 bpm max - m_SpinTempo.SetRange(32, 512); + //m_SpinTempo.SetRange(32, 512); + m_SpinTempo.SetRange(specs.tempoMin, specs.tempoMax); m_SpinSpeed.SetRange(1, 64); // -! BEHAVIOUR_CHANGE#0016 m_SpinGlobalVol.SetRange(0, 128); @@ -98,7 +100,7 @@ m_SpinVSTiVol.SetRange(0, 2000); m_SpinRestartPos.SetRange(0, 255); - m_SliderTempo.SetRange(0, 480); + m_SliderTempo.SetRange(0, specs.tempoMax - specs.tempoMin); m_SliderGlobalVol.SetRange(0, MAX_SLIDER_GLOBAL_VOL); m_SliderVSTiVol.SetRange(0, MAX_SLIDER_VSTI_VOL); m_SliderSamplePreAmp.SetRange(0, MAX_SLIDER_SAMPLE_VOL); @@ -190,13 +192,17 @@ m_SliderGlobalVol.SetPos(MAX_SLIDER_GLOBAL_VOL-m_pSndFile->m_nDefaultGlobalVolume); m_SliderVSTiVol.SetPos(MAX_SLIDER_VSTI_VOL-m_pSndFile->m_nVSTiVolume); m_SliderSamplePreAmp.SetPos(MAX_SLIDER_SAMPLE_VOL-m_pSndFile->m_nSamplePreAmp); - m_SliderTempo.SetPos(480 - m_pSndFile->m_nDefaultTempo + 32); + m_SliderTempo.SetPos(m_pSndFile->GetModSpecifications().tempoMax - m_pSndFile->m_nDefaultTempo); } if (dwHint & HINT_MODTYPE) { + CModSpecifications specs = m_pSndFile->GetModSpecifications(); + m_SpinTempo.SetRange(specs.tempoMin, specs.tempoMax); + m_SliderTempo.SetRange(0, specs.tempoMax - specs.tempoMin); + BOOL b = TRUE; if (m_pSndFile->m_nType == MOD_TYPE_MOD) b = FALSE; m_EditTempo.EnableWindow(b); @@ -211,6 +217,8 @@ m_SpinSamplePA.EnableWindow(b); m_SliderSamplePreAmp.EnableWindow(b); m_SliderVSTiVol.EnableWindow(b); + //Note: Global volume slider is not disabled for MOD + //on purpose(can be used to control play volume) // MOD Type LPCSTR pszModType = "MOD (ProTracker)"; @@ -258,11 +266,15 @@ CSliderCtrl* pSlider = (CSliderCtrl*) pscroll; if (pSlider==&m_SliderTempo) { - int tempo = 480 - m_SliderTempo.GetPos() + 32; - if ((tempo >= 32) && (tempo <= 512) && (tempo != m_pSndFile->m_nDefaultTempo)) { + int min, max; + m_SpinTempo.GetRange(min, max); + int tempo = max - m_SliderTempo.GetPos(); + if ((tempo >= m_pSndFile->GetModSpecifications().tempoMin) && (tempo <= m_pSndFile->GetModSpecifications().tempoMax) && (tempo != m_pSndFile->m_nDefaultTempo)) { m_pSndFile->m_nDefaultTempo = tempo; m_pSndFile->m_nMusicTempo = tempo; - m_pModDoc->SetModified(); + if(m_pSndFile->GetType() != MOD_TYPE_MOD) + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); } } @@ -272,7 +284,9 @@ if ((gv >= 0) && (gv <= MAX_SLIDER_GLOBAL_VOL) && (gv != m_pSndFile->m_nDefaultGlobalVolume)) { m_pSndFile->m_nGlobalVolume = gv; m_pSndFile->m_nDefaultGlobalVolume = gv; - m_pModDoc->SetModified(); + if(m_pSndFile->GetType() != MOD_TYPE_MOD) + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); } } @@ -327,7 +341,8 @@ if (s[0]) { UINT n = atoi(s); - if ((n >= 32) && (n <= 512) && (n != m_pSndFile->m_nDefaultTempo)) + CModSpecifications specs = m_pSndFile->GetModSpecifications(); + if ((n >= specs.tempoMin) && (n <= specs.tempoMax) && (n != m_pSndFile->m_nDefaultTempo)) { m_bEditsLocked=true; m_EditTempo.SetModify(FALSE); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -14,7 +14,7 @@ using std::string; using std::vector; -#pragma warning(disable:4244) +#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data const pair<string, WORD> CCtrlInstruments::s_TuningNotFound("Tuning was not found. Setting to default tuning", 7); @@ -1741,9 +1741,44 @@ INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; if ((!IsLocked()) && (penv)) { - BOOL b = m_CheckPanning.GetCheck(); + const BOOL b = m_CheckPanning.GetCheck(); + if (b) penv->dwFlags |= ENV_SETPANNING; else penv->dwFlags &= ~ENV_SETPANNING; + + if(b && m_pSndFile->GetType() & MOD_TYPE_IT|MOD_TYPE_MPT) + { + bool smpPanningInUse = false; + for(BYTE i = 0; i<ARRAYELEMCOUNT(penv->Keyboard); i++) + { + const SAMPLEINDEX smp = penv->Keyboard[i]; + if(smp <= m_pSndFile->GetNumSamples() && m_pSndFile->Ins[smp].uFlags & CHN_PANNING) + { + smpPanningInUse = true; + break; + } + } + if(smpPanningInUse) + { + if(MessageBox("Some of the samples used in the instrument have \"Set Pan\" enabled. " + "When instrument is played with such sample, sample pan setting overrides instrument pan. " + "Do you wish to disable panning from those samples so that instrument pan setting is effective " + "for the whole instrument?", + "", + MB_YESNO) == IDYES) + { + for(BYTE i = 0; i<ARRAYELEMCOUNT(penv->Keyboard); i++) + { + const SAMPLEINDEX smp = penv->Keyboard[i]; + if(smp <= m_pSndFile->GetNumSamples()) + m_pSndFile->Ins[smp].uFlags &= ~CHN_PANNING; + } + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_SAMPLEINFO | HINT_MODTYPE); + } + } + } + // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -316,7 +316,7 @@ } if (ord != pSndFile->Order[m_nScrollPos]) { - pSndFile->Order[m_nScrollPos] = static_cast<UINT>(ord); + pSndFile->Order[m_nScrollPos] = static_cast<PATTERNINDEX>(ord); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); InvalidateSelection(); @@ -351,12 +351,17 @@ switch (kc) { - case kcSwitchToOrderList: OnSwitchToView(); return true; + case kcSwitchToOrderList: OnSwitchToView(); return true; case kcChangeLoopStatus: m_pParent->OnModCtrlMsg(CTRLMSG_PAT_LOOP, -1); return true; case kcToggleFollowSong: m_pParent->OnFollowSong(); return true; + + case kcChannelUnmuteAll: + case kcUnmuteAllChnOnPatTransition: + ::PostMessage(m_pParent->GetViewWnd(), WM_MOD_KEYCOMMAND, kc, 0); + return true; } } - //end rewbs.customKeys + //end rewbs.customKeys switch(pMsg->message) @@ -889,7 +894,7 @@ switch(pDropInfo->dwDropType) { case DRAGONDROP_PATTERN: - pSndFile->Order[posdest] = static_cast<UINT>(pDropInfo->dwDropItem); + pSndFile->Order[posdest] = static_cast<PATTERNINDEX>(pDropInfo->dwDropItem); break; case DRAGONDROP_ORDER: @@ -925,4 +930,4 @@ else m_nOrderlistMargins = maxMargins; } return m_nOrderlistMargins; -} +} \ No newline at end of file Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -570,8 +570,8 @@ m_EditGlobalVol.EnableWindow(b); m_SpinGlobalVol.EnableWindow(b); // Panning - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; - m_CheckPanning.EnableWindow(b); + b = (m_pSndFile->GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; + m_CheckPanning.EnableWindow(b && !(m_pSndFile->GetType() & MOD_TYPE_XM)); m_EditPanning.EnableWindow(b); m_SpinPanning.EnableWindow(b); } @@ -599,7 +599,7 @@ // Global Volume SetDlgItemInt(IDC_EDIT8, pins->nGlobalVol); // Panning - CheckDlgButton(IDC_CHECK1, (pins->uFlags & CHN_PANNING) ? MF_CHECKED : 0); + CheckDlgButton(IDC_CHECK1, (pins->uFlags & CHN_PANNING) ? MF_CHECKED : MF_UNCHECKED); //rewbs.fix36944 if (m_pSndFile->m_nType == MOD_TYPE_XM) { SetDlgItemInt(IDC_EDIT9, pins->nPan); //displayed panning with XM is 0-256, just like MPT's internal engine @@ -2236,7 +2236,7 @@ { if (IsLocked()) return; BOOL b = FALSE; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) { b = IsDlgButtonChecked(IDC_CHECK1); } @@ -2245,14 +2245,14 @@ if (!(m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING)) { m_pSndFile->Ins[m_nSample].uFlags |= CHN_PANNING; - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); + m_pModDoc->SetModified(); } } else { if (m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING) { m_pSndFile->Ins[m_nSample].uFlags &= ~CHN_PANNING; - if (m_pSndFile->m_nType == (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); + m_pModDoc->SetModified(); } } } @@ -2818,7 +2818,7 @@ return CModControlDlg::PreTranslateMessage(pMsg); } -LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM /*lParam*/) //---------------------------------------------------------------- { if (wParam == kcNull) Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -99,12 +99,14 @@ // CViewPattern Drawing Implementation inline PCPATTERNFONT GetCurrentPatternFont() +//------------------------------------------ { return (CMainFrame::m_dwPatternSetup & PATTERN_SMALLFONT) ? &gSmallPatternFont : &gDefaultPatternFont; } static BYTE hilightcolor(int c0, int c1) +//-------------------------------------- { int cf0, cf1; @@ -510,14 +512,21 @@ UINT nPrevPat = m_nPattern; BOOL bPrevPatFound = FALSE; + // Display previous pattern if (CMainFrame::m_dwPatternSetup & PATTERN_SHOWPREVIOUS) { - UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - - if ((nCurOrder > 0) && (nCurOrder < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder] == m_nPattern)) + const ORDERINDEX startOrder = static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); + if(startOrder > 0) { - nPrevPat = pSndFile->Order[nCurOrder-1]; - bPrevPatFound = TRUE; + ORDERINDEX prevOrder = startOrder - 1; + //Skip +++ items + while(prevOrder > 0 && pSndFile->Order[prevOrder] == pSndFile->Order.GetIgnoreIndex()) --prevOrder; + + if(startOrder < pSndFile->Order.size() && pSndFile->Order[startOrder] == m_nPattern) + { + nPrevPat = pSndFile->Order[prevOrder]; + bPrevPatFound = TRUE; + } } } if ((bPrevPatFound) && (nPrevPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nPrevPat])) @@ -556,11 +565,16 @@ { UINT nNextPat = m_nPattern; BOOL bNextPatFound = FALSE; - UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - - if ((nCurOrder+1 < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder] == m_nPattern)) + const ORDERINDEX startOrder= static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); + ORDERINDEX nNextOrder = 1 + startOrder; + + //Ignore skip items(+++) from sequence. + const ORDERINDEX ordCount = pSndFile->Order.GetCount(); + while(nNextOrder < ordCount && pSndFile->Order[nNextOrder] == pSndFile->Order.GetIgnoreIndex()) nNextOrder++; + + if ((nNextOrder < ordCount) && (pSndFile->Order[startOrder] == m_nPattern)) { - nNextPat = pSndFile->Order[nCurOrder+1]; + nNextPat = pSndFile->Order[nNextOrder]; bNextPatFound = TRUE; } if ((bNextPatFound) && (nNextPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNextPat])) @@ -1423,6 +1437,7 @@ //rewbs.xinfo void CViewPattern::UpdateXInfoText() +//---------------------------------- { UINT nChn = GetCurrentChannel(); CString xtraInfo; @@ -1434,8 +1449,10 @@ CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return; - xtraInfo.Format("Chan: %d; macro: %X; cutoff: %X; reso: %X; pan: %X", + //xtraInfo.Format("Chan: %d; macro: %X; cutoff: %X; reso: %X; pan: %X", + xtraInfo.Format("Chn:%d; Vol:%X; Mac:%X; Cut:%X; Res:%X; Pan:%X", nChn+1, + pSndFile->Chn[nChn].nGlobalVol, pSndFile->Chn[nChn].nActiveMacro, pSndFile->Chn[nChn].nCutOff, pSndFile->Chn[nChn].nResonance, Modified: trunk/OpenMPT/mptrack/Globals.cpp =================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Globals.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -289,9 +289,39 @@ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModControlDlg *pDlg = NULL; - UINT nID; + if (nIndex == -1) nIndex = m_TabCtrl.GetCurSel(); + + const UINT nID = m_TabCtrl.GetItemData(nIndex); + if(nID == 0) return FALSE; + + switch(nID) + { + //rewbs.graph + case IDD_CONTROL_GRAPH: + nIndex = 5; + break; + //end rewbs.graph + case IDD_CONTROL_COMMENTS: + nIndex = 4; + break; + case IDD_CONTROL_GLOBALS: + nIndex = 0; + break; + case IDD_CONTROL_PATTERNS: + nIndex = 1; + break; + case IDD_CONTROL_SAMPLES: + nIndex = 2; + break; + case IDD_CONTROL_INSTRUMENTS: + nIndex = 3; + break; + default: + return FALSE; + } + if ((nIndex < 0) || (nIndex >= MAX_PAGES) || (!pMainFrm)) return FALSE; //rewbs.varWindowSize @@ -304,7 +334,6 @@ PostMessage(WM_MOD_CTRLMSG, CTRLMSG_ACTIVATEPAGE, lParam); return TRUE; } - if ((nID = m_TabCtrl.GetItemData(nIndex)) == 0) return FALSE; if ((m_nActiveDlg >= 0) && (m_nActiveDlg < MAX_PAGES)) { if (m_Pages[m_nActiveDlg]) @@ -314,11 +343,11 @@ } m_nActiveDlg = -1; } - if (m_Pages[nIndex]) + if (m_Pages[nIndex]) //Ctrl window already created? { m_nActiveDlg = nIndex; pDlg = m_Pages[nIndex]; - } else + } else //Ctrl window is not created yet - creating one. { switch(nID) { Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -192,18 +192,13 @@ static void ShowChangesDialog() //----------------------------- { + /* CString firstOpenMessage = "OpenMPT version " + CMainFrame::GetFullVersionString(); firstOpenMessage += ". This is a development build.\n\nChanges:\n\n" - "[New] Ability to control plug params with MIDI controllers.\n" - "[New] Ability to pass MIDI to plugin.\n" - "[Imp] Ability to take MIDI volume into account when playing notes.\n" - "[Fix/Imp] Plugin volume command fix. In addition now there are options how to interpret it.\n" - "[Imp] Keyshortcut for preset navigation jumps in VST editor.\n" - "[Mod] .bak files won't be shown in load dialog with 'All modules' filter.\n" - "[Fix/Mod] Instrument random variation fix/behavior change.\n\n" - "And various other fixes and changes."; + "TODO"; CMainFrame::GetMainFrame()->MessageBox(firstOpenMessage, "OpenMPT v." + CMainFrame::GetFullVersionString(), MB_ICONINFORMATION); + */ } Modified: trunk/OpenMPT/mptrack/OrderToPatternTable.cpp =================================================================== --- trunk/OpenMPT/mptrack/OrderToPatternTable.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/OrderToPatternTable.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -89,10 +89,34 @@ } -PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return m_rSndFile.GetType() == MOD_TYPE_MPT ? 65535 : 0xFF;} -PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return m_rSndFile.GetType() == MOD_TYPE_MPT ? 65534 : 0xFE;} +void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype) +//---------------------------------------------------------------- +{ + const CModSpecifications specs = m_rSndFile.GetModSpecifications(); + //Resize orderlist if needed. Because old orderlist had 256 elements, not making it + //smaller than that even if the modtype doesn't support that many orders. + if(specs.ordersMax < GetCount()) + { + resize(max(MAX_PATTERNS, specs.ordersMax)); + for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex(); + } + //Replace items used to denote end of song/skip order. + replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex()); + replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex()); +} + + +PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;} +PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;} + +PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return GetInvalidPatIndex(m_rSndFile.GetType());} +PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return GetIgnoreIndex(m_rSndFile.GetType());} + + + + //-------------------------------------------------- //-------------------------------------------------- //-------------------------------------------------- @@ -131,3 +155,5 @@ } } + + Modified: trunk/OpenMPT/mptrack/OrderToPatternTable.h =================================================================== --- trunk/OpenMPT/mptrack/OrderToPatternTable.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/OrderToPatternTable.h 2008-01-29 21:00:25 UTC (rev 199) @@ -32,14 +32,21 @@ size_t WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize); + ORDERINDEX GetCount() const {return static_cast<ORDERINDEX>(size());} + //Deprecated function used for MPTm's created in 1.17.02.46 - 1.17.02.48. DWORD Unserialize(const BYTE* const src, const DWORD memLength); //Returns true if the IT orderlist datafield is not sufficient to store orderlist information. bool NeedsExtraDatafield() const; + void OnModTypeChanged(const MODTYPE oldtype); + PATTERNINDEX GetInvalidPatIndex() const; //To correspond 0xFF + static PATTERNINDEX GetInvalidPatIndex(const MODTYPE type); + PATTERNINDEX GetIgnoreIndex() const; //To correspond 0xFE + static PATTERNINDEX GetIgnoreIndex(const MODTYPE type); COrderSerialization* NewReadWriteObject() {return new COrderSerialization(*this);} Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -318,7 +318,8 @@ m_TabCtrl.DeleteAllItems(); for (int iItem=0; iItem<nTabCount; iItem++) { - wsprintf(s, "%d - %d", iItem * 4 + 1, iItem * 4 + 4); + const int lastItem = min(iItem * 4 + 4, MAX_BASECHANNELS); + wsprintf(s, "%d - %d", iItem * 4 + 1, lastItem); tci.mask = TCIF_TEXT | TCIF_PARAM; tci.pszText = s; tci.lParam = iItem * 4; @@ -337,58 +338,65 @@ m_nActiveTab = nTabIndex; for (int ichn=0; ichn<4; ichn++) { - UINT nChn = nTabIndex*4+ichn; - BOOL bEnable = (nChn < pSndFile->m_nChannels) ? TRUE : FALSE; - // Text - s[0] = 0; - if (bEnable) wsprintf(s, "Channel %d", nChn+1); - SetDlgItemText(IDC_TEXT1+ichn, s); - // Mute - CheckDlgButton(IDC_CHECK1+ichn*2, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? TRUE : FALSE); - // Surround - CheckDlgButton(IDC_CHECK2+ichn*2, (pSndFile->ChnSettings[nChn].dwFlags & CHN_SURROUND) ? TRUE : FALSE); - // Volume - int vol = pSndFile->ChnSettings[nChn].nVolume; - m_sbVolume[ichn].SetPos(vol); - SetDlgItemInt(IDC_EDIT1+ichn*2, vol); - // Pan - int pan = pSndFile->ChnSettings[nChn].nPan; - m_sbPan[ichn].SetPos(pan/4); - SetDlgItemInt(IDC_EDIT2+ichn*2, pan); - memcpy(s, pSndFile->ChnSettings[nChn].szName, MAX_CHANNELNAME); - s[MAX_CHANNELNAME-1] = 0; - SetDlgItemText(IDC_EDIT9+ichn, s); - // Channel effect - m_CbnEffects[ichn].SetRedraw(FALSE); - m_CbnEffects[ichn].ResetContent(); - m_CbnEffects[ichn].SetItemData(m_CbnEffects[ichn].AddString("No plugin"), 0); - int fxsel = 0; - for (UINT ifx=0; ifx<MAX_MIXPLUGINS; ifx++) + const UINT nChn = nTabIndex*4+ichn; + const BOOL bEnable = (nChn < pSndFile->GetNumChannels()) ? TRUE : FALSE; + if(nChn < MAX_BASECHANNELS) { - if ((pSndFile->m_MixPlugins[ifx].Info.dwPluginId1) - || (pSndFile->m_MixPlugins[ifx].Info.dwPluginId2) - || (pSndFile->m_MixPlugins[ifx].Info.szName[0] - || (pSndFile->ChnSettings[nChn].nMixPlugin == ifx+1))) + // Text + s[0] = 0; + if (bEnable) wsprintf(s, "Channel %d", nChn+1); + SetDlgItemText(IDC_TEXT1+ichn, s); + // Mute + CheckDlgButton(IDC_CHECK1+ichn*2, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? TRUE : FALSE); + // Surround + CheckDlgButton(IDC_CHECK2+ichn*2, (pSndFile->ChnSettings[nChn].dwFlags & CHN_SURROUND) ? TRUE : FALSE); + // Volume + int vol = pSndFile->ChnSettings[nChn].nVolume; + m_sbVolume[ichn].SetPos(vol); + SetDlgItemInt(IDC_EDIT1+ichn*2, vol); + // Pan + int pan = pSndFile->ChnSettings[nChn].nPan; + m_sbPan[ichn].SetPos(pan/4); + SetDlgItemInt(IDC_EDIT2+ichn*2, pan); + memcpy(s, pSndFile->ChnSettings[nChn].szName, MAX_CHANNELNAME); + s[MAX_CHANNELNAME-1] = 0; + SetDlgItemText(IDC_EDIT9+ichn, s); + // Channel effect + m_CbnEffects[ichn].SetRedraw(FALSE); + m_CbnEffects[ichn].ResetContent(); + m_CbnEffects[ichn].SetItemData(m_CbnEffects[ichn].AddString("No plugin"), 0); + int fxsel = 0; + for (UINT ifx=0; ifx<MAX_MIXPLUGINS; ifx++) { - wsprintf(s, "FX%d: %s", ifx+1, pSndFile->m_MixPlugins[ifx].Info.szName); - int n = m_CbnEffects[ichn].AddString(s); - m_CbnEffects[ichn].SetItemData(n, ifx+1); - if (pSndFile->ChnSettings[nChn].nMixPlugin == ifx+1) fxsel = n; + if ((pSndFile->m_MixPlugins[ifx].Info.dwPluginId1) + || (pSndFile->m_MixPlugins[ifx].Info.dwPluginId2) + || (pSndFile->m_MixPlugins[ifx].Info.szName[0] + || (pSndFile->ChnSettings[nChn].nMixPlugin == ifx+1))) + { + wsprintf(s, "FX%d: %s", ifx+1, pSndFile->m_MixPlugins[ifx].Info.szName); + int n = m_CbnEffects[ichn].AddString(s); + m_CbnEffects[ichn].SetItemData(n, ifx+1); + if (pSndFile->ChnSettings[nChn].nMixPlugin == ifx+1) fxsel = n; + } } + m_CbnEffects[ichn].SetRedraw(TRUE); + m_CbnEffects[ichn].SetCurSel(fxsel); } - m_CbnEffects[ichn].SetRedraw(TRUE); - m_CbnEffects[ichn].SetCurSel(fxsel); + else + SetDlgItemText(IDC_TEXT1+ichn, ""); + // Enable/Disable controls for this channel BOOL bIT = ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK1+ichn*2), bEnable); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK2+ichn*2), bIT); ::EnableWindow(m_sbVolume[ichn].m_hWnd, bEnable); - ::EnableWindow(m_sbPan[ichn].m_hWnd, bEnable); + ::EnableWindow(m_sbPan[ichn].m_hWnd, bEnable && !(pSndFile->GetType() & MOD_TYPE_XM|MOD_TYPE_MOD)); ::EnableWindow(m_spinVolume[ichn], bEnable); - ::EnableWindow(m_spinPan[ichn], bEnable); + ::EnableWindow(m_spinPan[ichn], bEnable && !(pSndFile->GetType() & MOD_TYPE_XM|MOD_TYPE_MOD)); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT1+ichn*2), bEnable); - ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT2+ichn*2), bEnable); + ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT2+ichn*2), bEnable && !(pSndFile->GetType() & MOD_TYPE_XM|MOD_TYPE_MOD)); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT9+ichn), ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))); + m_CbnEffects[ichn].EnableWindow(bEnable); } UnlockControls(); } @@ -1622,7 +1630,7 @@ } // Update all other plugs' outputs - for (int nPlug=0; nPlug<src; nPlug++) { + for (PLUGINDEX nPlug=0; nPlug<src; nPlug++) { if (pSndFile->m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) { if ((pSndFile->m_MixPlugins[nPlug].Info.dwOutputRouting & 0x7f) == src) { pSndFile->m_MixPlugins[nPlug].Info.dwOutputRouting = ((BYTE)dest)|0x80; @@ -1630,14 +1638,14 @@ } } // Update channels - for (int nChn=0; nChn<pSndFile->m_nChannels; nChn++) { + for (CHANNELINDEX nChn=0; nChn<pSndFile->m_nChannels; nChn++) { if (pSndFile->ChnSettings[nChn].nMixPlugin == src+1) { pSndFile->ChnSettings[nChn].nMixPlugin = dest+1; } } // Update instruments - for (int nIns=1; nIns<=pSndFile->m_nInstruments; nIns++) { + for (INSTRUMENTINDEX nIns=1; nIns<=pSndFile->m_nInstruments; nIns++) { if (pSndFile->Headers[nIns] && (pSndFile->Headers[nIns]->nMixPlug == src+1)) { pSndFile->Headers[nIns]->nMixPlug = dest+1; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -2910,10 +2910,10 @@ const BYTE nByte1 = GetFromMIDIMsg_DataByte1(dwMidiData); const BYTE nByte2 = GetFromMIDIMsg_DataByte2(dwMidiData); - const BYTE nNote = nByte1 + 1; // +1 is for MPT, where middle C is 61 - int nVol = nByte2; // At this stage nVol is a non linear value in [0;127] + const BYTE nNote = nByte1 + 1; // +1 is for MPT, where middle C is 61 + int nVol = nByte2; // At this stage nVol is a non linear value in [0;127] // Need to convert to linear in [0;64] - see below - BYTE event = GetFromMIDIMsg_Event(dwMidiData); + BYTE event = GetFromMIDIMsg_Event(dwMidiData); if ((event == 0x9) && !nVol) event = 0x8; //Convert event to note-off if req'd @@ -3241,7 +3241,7 @@ case kcChannelMute: OnMuteChannel(true); return wParam; case kcChannelSolo: OnSoloChannel(true); return wParam; case kcChannelUnmuteAll: OnUnmuteAll(); return wParam; - case kcToggleChanMuteOnPatTransition: TogglePendingMute((m_dwCursor&0xFFFF)>>3); return wParam; + case kcToggleChanMuteOnPatTransition: TogglePendingMute(GetChanFromCursor(m_dwCursor)); return wParam; case kcUnmuteAllChnOnPatTransition: OnPendingUnmuteAllChnFromClick(); return wParam; case kcTimeAtRow: OnShowTimeAtRow(); return wParam; case kcSoloChnOnPatTransition: PendingSoloChn(GetCurrentChannel()); return wParam; @@ -3701,8 +3701,7 @@ return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; - UINT nChn = (m_dwCursor & 0xFFFF) >> 3; + UINT nChn = GetChanFromCursor(m_dwCursor); PrepareUndo(m_dwBeginSel, m_dwEndSel); BYTE* activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; @@ -3725,11 +3724,7 @@ //Work out where to put the note off UINT nRow = usePlaybackPosition ? pSndFile->m_nRow : m_nRow; - prowbase = p + nRow * pSndFile->m_nChannels; - if (releaseChan < pSndFile->GetNumChannels()) - p=prowbase+releaseChan; - else - p=prowbase+nChn; + MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, (releaseChan < pSndFile->GetNumChannels()) ? releaseChan : nChn); //don't overwrite: if (p->note || p->instr || p->volcmd) { @@ -3802,8 +3797,7 @@ return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; - UINT nChn = (m_dwCursor & 0xFFFF) >> 3; + UINT nChn = GetChanFromCursor(m_dwCursor); PrepareUndo(m_dwBeginSel, m_dwEndSel); BYTE* activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; @@ -3816,9 +3810,7 @@ if (!(CMainFrame::m_dwPatternSetup&PATTERN_KBDNOTEOFF )) return; - //Work out where to put the note off - prowbase = p + m_nRow * pSndFile->m_nChannels; - p=prowbase+nChn; + MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); //don't overwrite: if (p->note) @@ -3863,15 +3855,11 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; - MODCOMMAND oldcmd; // This is the command we are about to overwrite - UINT nChn = (m_dwCursor & 0xFFFF) >> 3; + UINT nChn = GetChanFromCursor(m_dwCursor); PrepareUndo(m_dwBeginSel, m_dwEndSel); - // -- Work out where to put the new oct - prowbase = p + m_nRow * pSndFile->m_nChannels; - p = prowbase + nChn; - oldcmd = *p; + MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); + MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite if (oldcmd.note) TempEnterNote(((oldcmd.note-1)%12)+val*12+1); } Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -844,6 +844,11 @@ ///////////////////////////////////////////////////////////////////////////////////////////// // CPatternPropertiesDlg +BEGIN_MESSAGE_MAP(CPatternPropertiesDlg, CDialog) + ON_COMMAND(IDC_BUTTON_HALF, OnHalfRowNumber) + ON_COMMAND(IDC_BUTTON_DOUBLE, OnDoubleRowNumber) +END_MESSAGE_MAP() + BOOL CPatternPropertiesDlg::OnInitDialog() //---------------------------------------- { @@ -871,13 +876,50 @@ wsprintf(s, "Pattern #%d:\x0d\x0a %d rows (%dK)", m_nPattern, pSndFile->PatternSize[m_nPattern], - (pSndFile->PatternSize[m_nPattern] * pSndFile->m_nChannels * 6)/1024); + (pSndFile->PatternSize[m_nPattern] * pSndFile->m_nChannels * sizeof(MODCOMMAND))/1024); SetDlgItemText(IDC_TEXT1, s); } return TRUE; } +void CPatternPropertiesDlg::OnHalfRowNumber() +//------------------------------------------- +{ + CComboBox *combo; + CString str; + combo = (CComboBox *)GetDlgItem(IDC_COMBO1); + if(combo->GetCount() < 1) return; + if(combo->GetCurSel() == CB_ERR) combo->SetCurSel(0); + + combo->GetLBText(combo->GetCurSel(), str); + int sel = atoi(str)/2; + combo->GetLBText(0, str); + const int row0 = atoi(str); + if(sel < row0) sel = row0; + combo->SetCurSel(sel - row0); +} + + +void CPatternPropertiesDlg::OnDoubleRowNumber() +//--------------------------------------------- +{ + CComboBox *combo; + CString str; + combo = (CComboBox *)GetDlgItem(IDC_COMBO1); + if(combo->GetCount() < 1) return; + if(combo->GetCurSel() == CB_ERR) combo->SetCurSel(0); + + combo->GetLBText(combo->GetCurSel(), str); + int sel = 2*atoi(str); + combo->GetLBText(0, str); + const int row0 = atoi(str); + combo->GetLBText(combo->GetCount()-1, str); + if(sel > atoi(str)) sel = atoi(str); + combo->SetCurSel(sel - row0); +} + + void CPatternPropertiesDlg::OnOK() //-------------------------------- { Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2008-01-29 21:00:25 UTC (rev 199) @@ -159,6 +159,9 @@ protected: virtual BOOL OnInitDialog(); virtual void OnOK(); + afx_msg void OnHalfRowNumber(); + afx_msg void OnDoubleRowNumber(); + DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/mptrack.rc 2008-01-29 21:00:25 UTC (rev 199) @@ -1239,6 +1239,8 @@ LTEXT "Pattern Info",IDC_TEXT1,10,36,95,25 DEFPUSHBUTTON "OK",IDOK,115,4,50,14 PUSHBUTTON "Cancel",IDCANCEL,115,22,50,14 + PUSHBUTTON "/2",IDC_BUTTON_HALF,117,47,21,14 + PUSHBUTTON "x2",IDC_BUTTON_DOUBLE,144,47,21,14 END IDD_PATTERN_EDITCOMMAND DIALOGEX 0, 0, 214, 65 @@ -1945,7 +1947,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,50 + FILEVERSION 1,17,2,51 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1963,7 +1965,7 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 50" + VALUE "FileVersion", "1, 17, 2, 51" VALUE "InternalName", "Modplug Tracker" VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2007 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" Modified: trunk/OpenMPT/mptrack/pattern.h =================================================================== --- trunk/OpenMPT/mptrack/pattern.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/pattern.h 2008-01-29 21:00:25 UTC (rev 199) @@ -31,8 +31,8 @@ //BEGIN: INTERFACE METHODS public: - MODCOMMAND* GetpModCommand(const UINT r, const UINT c) {return &m_ModCommands[r*GetNumChannels()+c];} - const MODCOMMAND* GetpModCommand(const UINT r, const UINT c) const {return &m_ModCommands[r*GetNumChannels()+c];} + MODCOMMAND* GetpModCommand(const ROWINDEX r, const CHANNELINDEX c) {return &m_ModCommands[r*GetNumChannels()+c];} + const MODCOMMAND* GetpModCommand(const ROWINDEX r, const CHANNELINDEX c) const {return &m_ModCommands[r*GetNumChannels()+c];} ROWINDEX GetNumRows() const {return m_Rows;} Modified: trunk/OpenMPT/mptrack/patternContainer.cpp =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/patternContainer.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -6,10 +6,10 @@ int CPatternContainer::Insert(const ROWINDEX rows) //--------------------------------------------- { - size_t i = 0; + PATTERNINDEX i = 0; for(i = 0; i<m_Patterns.size(); i++) if(!m_Patterns[i]) break; - if(Insert(static_cast<WORD>(i), rows)) + if(Insert(i, rows)) return -1; else return i; @@ -20,7 +20,7 @@ //--------------------------------------------------------------- { const CModSpecifications& specs = m_rSndFile.GetModSpecifications(); - if(index > m_Patterns.size() || rows > specs.patternRowsMax) + if(index >= specs.patternsMax || index > m_Patterns.size() || rows > specs.patternRowsMax) return true; if(index < m_Patterns.size() && m_Patterns[index]) return true; @@ -75,3 +75,13 @@ m_Patterns.resize(newSize, MODPATTERN(*this)); } } + + +void CPatternContainer::OnModTypeChanged(const MODTYPE /*oldtype*/) +//---------------------------------------------------------- +{ + const CModSpecifications specs = m_rSndFile.GetModSpecifications(); + if(specs.patternsMax < Size()) ResizeArray(max(MAX_PATTERNS, specs.patternsMax)); + else if(Size() < MAX_PATTERNS) ResizeArray(MAX_PATTERNS); +} + Modified: trunk/OpenMPT/mptrack/patternContainer.h =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/patternContainer.h 2008-01-29 21:00:25 UTC (rev 199) @@ -54,6 +54,8 @@ void ResizeArray(const PATTERNINDEX newSize); + void OnModTypeChanged(const MODTYPE oldtype); + //END: INTERFACE METHODS Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/resource.h 2008-01-29 21:00:25 UTC (rev 199) @@ -810,6 +810,8 @@ #define IDC_EDIT_FLAGS 2323 #define IDC_CHECKCAPTURE 2324 #define IDC_SPINMOVEMAPPING 2325 +#define IDC_BUTTON_HALF 2326 +#define IDC_BUTTON_DOUBLE 2327 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1032,7 +1034,7 @@ #define ID_Menu59207 59207 #define ID_ENVELOPE_SCALEPOINTS 59208 #define ID_NETLINK_OPENMPTWIKI 59210 -#define ID_VIEW_MIDIMAPPING 59211 +#define ID_VIEW_MIDIMAPPING 59211 // Next default values for new objects // @@ -1041,7 +1043,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 516 #define _APS_NEXT_COMMAND_VALUE 59212 -#define _APS_NEXT_CONTROL_VALUE 2326 +#define _APS_NEXT_CONTROL_VALUE 2328 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/mptrack/typedefs.h =================================================================== --- trunk/OpenMPT/mptrack/typedefs.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/mptrack/typedefs.h 2008-01-29 21:00:25 UTC (rev 199) @@ -39,6 +39,7 @@ typedef uint16 TEMPO; typedef uint16 SAMPLEINDEX; typedef uint16 INSTRUMENTINDEX; +typedef uint32 MODTYPE; const ORDERINDEX ORDERINDEX_MAX = (std::numeric_limits<ORDERINDEX>::max)(); const ROWINDEX ROWINDEX_MAX = (std::numeric_limits<ROWINDEX>::max)(); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -1105,13 +1105,14 @@ { dwMemPos += LoadMixPlugins(lpStream+dwMemPos, dwMemLength-dwMemPos); } - // Checking for unused channels + //UINT npatterns = pifh->patnum; UINT npatterns = patpos.size(); if (npatterns > GetModSpecifications().patternsMax) npatterns = GetModSpecifications().patternsMax; + // Checking for unused channels for (UINT patchk=0; patchk<npatterns; patchk++) { memset(chnmask, 0, sizeof(chnmask)); @@ -1331,6 +1332,8 @@ LoadExtendedSongProperties(GetType(), ptr, lpStream, mptStartPos); } + Patterns.ResizeArray(max(MAX_PATTERNS, npatterns)); + // Reading Patterns for (UINT npat=0; npat<npatterns; npat++) { @@ -1338,8 +1341,10 @@ { if(Patterns.Insert(npat, 64)) { - MessageBox(NULL, "Error occured while loading file, error code 1101080209", "", MB_ICONERROR); - return FALSE; + CString s; + s.Format("Allocating patterns failed starting from pattern %u", npat); + MessageBox(NULL, s, "", MB_ICONERROR); + break; } continue; } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2008-01-29 21:00:25 UTC (rev 199) @@ -1534,11 +1534,11 @@ if(chnFrom == chnTo) return false; if(chnFrom >= m_nChannels || chnTo >= m_nChannels) { - CString str = "Error: Bad move indexes in CSoundFile::MoveChannel(...)"; - CMainFrame::GetMainFrame()->MessageBox(str , "MoveChannel(...)", MB_OK | MB_ICONINFORMATION); - return true; + CString str = "Error: Bad move indexes in CSoundFile::MoveChannel(...)"; + CMainFrame::GetMainFrame()->MessageBox(str , "MoveChannel(...)", MB_OK | MB_ICONINFORMATION); + return true; } - std::vector<CHANNELINDEX> newOrder; + vector<CHANNELINDEX> newOrder; //First creating new order identical to current order... for(CHANNELINDEX i = 0; i<GetNumChannels(); i++) { @@ -2913,27 +2913,16 @@ //--------------------------------------------------- { const MODTYPE oldtype = m_nType; - const PATTERNINDEX oldInvalidIndex = Order.GetInvalidPatIndex(); - const PATTERNINDEX oldIgnoreIndex = Order.GetIgnoreIndex(); m_nType = newType; SetModSpecsPointer(m_pModSpecs, m_nType); m_ModFlags = m_ModFlags & GetModFlagMask(oldtype, newType); - - const CModSpecifications& specs = GetModSpecifications(); - if(specs.ordersMax < Order.size()) - { - Order.resize(max(MAX_PATTERNS, specs.ordersMax)); - for(ORDERINDEX i = Order.size(); i>specs.ordersMax; --i) Order[i-1] = Order.GetInvalidPatIndex(); - } - replace(Order.begin(), Order.end(), oldInvalidIndex, Order.GetInvalidPatIndex()); - replace(Order.begin(), Order.end(), oldIgnoreIndex, Order.GetIgnoreIndex()); - if(specs.patternsMax < Patterns.Size()) Patterns.ResizeArray(specs.patternsMax); - else if(Patterns.Size() < MAX_PATTERNS) Patterns.ResizeArray(MAX_PATTERNS); - + Order.OnModTypeChanged(oldtype); + Patterns.OnModTypeChanged(oldtype); } + bool CSoundFile::SetTitle(const char* titleCandidate, size_t strSize) //------------------------------------------------------------------- { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/soundlib/Sndfile.h 2008-01-29 21:00:25 UTC (rev 199) @@ -819,7 +819,6 @@ const BYTE MSF_OLDVOLSWING = 1; //IT/MPT const BYTE MSF_MIDICC_BUGEMULATION = 2; //IT/MPT/XM -typedef UINT MODTYPE; class CTuningCollection; @@ -965,7 +964,7 @@ //Return the number of channels in the pattern. In 1.17.02.45 //it returned the number of channels with volume != 0 - CHANNELINDEX GetNumChannels() const {return static_cast<CHANNELINDEX>(m_nChannels);} + CHANNELINDEX GetNumChannels() const {return static_cast<CHANNELINDEX>(m_nChannels);} BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); UINT GetMasterVolume() const { return m_nMasterVolume; } @@ -980,7 +979,7 @@ UINT GetMaxPosition() const; IMixPlugin* GetInstrumentPlugin(INSTRUMENTINDEX instr); - const CModSpecifications& GetModSpecifications() {return *m_pModSpecs;} + const CModSpecifications& GetModSpecifications() const {return *m_pModSpecs;} static const CModSpecifications& GetModSpecifications(const MODTYPE type); double GetCurrentBPM() const; @@ -1013,7 +1012,7 @@ void CheckCPUUsage(UINT nCPU); BOOL SetPatternName(UINT nPat, LPCSTR lpszName); BOOL GetPatternName(UINT nPat, LPSTR lpszName, UINT cbSize=MAX_PATTERNNAME) const; - CHANNELINDEX ReArrangeChannels(const std::vector<CHANNELINDEX>& fromToArray); + CHANNELINDEX ReArrangeChannels(const vector<CHANNELINDEX>& fromToArray); bool MoveChannel(UINT chn_from, UINT chn_to); bool InitChannel(UINT nch); Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2008-01-26 20:02:01 UTC (rev 198) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2008-01-29 21:00:25 UTC (rev 199) @@ -176,7 +176,7 @@ //TODO: Set correct values. "it", //File extension 240, //Pattern max. - 256, //Order max. + 200, //Order max. 4, //Channel min 64, //Channel max 32, //Min tempo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |