|
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.
|