You can subscribe to this list here.
| 2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
| 2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
| 2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
| 2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
| 2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
| 2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
| 2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
| 2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
| 2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
| 2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
| 2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
| 2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
| 2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
| 2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
| 2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
| 2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
| 2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
| 2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
| 2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(213) |
Aug
(203) |
Sep
(148) |
Oct
(109) |
Nov
(191) |
Dec
(209) |
| 2026 |
Jan
(127) |
Feb
(123) |
Mar
(160) |
Apr
(141) |
May
(49) |
Jun
(55) |
Jul
(91) |
Aug
(191) |
Sep
|
Oct
(68) |
Nov
|
Dec
|
|
From: <sag...@us...> - 2009-10-04 12:50:26
|
Revision: 385
http://modplug.svn.sourceforge.net/modplug/?rev=385&view=rev
Author: saga-games
Date: 2009-10-04 12:50:16 +0000 (Sun, 04 Oct 2009)
Log Message:
-----------
[Imp] Treeview: Double-clicking order items and pattern items should work now, dragondrop is not fully functional yet.
[Mod] Updated DE_jojo.mkb (Reset Channel shortcut, Note Cut / Off / Fade are now "old style".
[Mod] Pattern editor: It is impossible to enter something into the voluem column in mod format now.
[Ref] More refactoring (not much).
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-10-04 12:50:16 UTC (rev 385)
@@ -337,7 +337,8 @@
}
- } else {
+ } else
+ {
UINT nmax = m_pSndFile->m_nSamples;
while ((nmax > 1) && (m_pSndFile->Samples[nmax].pSample == NULL) && (!m_pSndFile->m_szNames[nmax][0])) nmax--;
for (UINT i=1; i<=nmax; i++) if ((m_pSndFile->m_szNames[i][0]) || (m_pSndFile->Samples[i].pSample)) {
@@ -413,7 +414,7 @@
break;
case CTRLMSG_SETCURRENTPATTERN:
- SetCurrentPattern(lParam);
+ SetCurrentPattern((PATTERNINDEX)lParam);
break;
case CTRLMSG_SETCURRENTORDER:
@@ -535,10 +536,10 @@
}
-void CCtrlPatterns::SetCurrentPattern(UINT nPat)
-//----------------------------------------------
+void CCtrlPatterns::SetCurrentPattern(PATTERNINDEX nPat)
+//------------------------------------------------------
{
- SendViewMessage(VIEWMSG_SETCURRENTPATTERN, nPat);
+ SendViewMessage(VIEWMSG_SETCURRENTPATTERN, (LPARAM)nPat);
}
@@ -576,10 +577,7 @@
void CCtrlPatterns::OnActivatePage(LPARAM lParam)
//-----------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- CSoundFile* pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
-
- if ((pModDoc) && (m_pParent))
+ if ((m_pModDoc) && (m_pParent))
{
int nIns = m_pParent->GetInstrumentChange();
if (nIns > 0)
@@ -588,30 +586,37 @@
}
m_pParent->InstrumentChanged(-1);
}
- if ((lParam >= 0) && (lParam < m_pSndFile->Patterns.Size()))
+ if (!(lParam & 0x8000) && m_pSndFile)
{
- if (pSndFile)
+ // Pattern item
+ PATTERNINDEX nPat = (PATTERNINDEX)(lParam & 0x7FFF);
+ if(m_pSndFile->Patterns.IsValidIndex(nPat))
{
- for (ORDERINDEX i=0; i<pSndFile->Order.size(); i++)
+ for (SEQUENCEINDEX nSeq = 0; nSeq < m_pSndFile->Order.GetNumSequences(); nSeq++)
{
- if (pSndFile->Order[i] == (UINT)lParam)
+ for (ORDERINDEX nOrd = 0; nOrd < m_pSndFile->Order.GetSequence(nSeq).GetLengthTailTrimmed(); nOrd++)
{
- m_OrderList.SetCurSel(i, TRUE);
- break;
+ if (m_pSndFile->Order.GetSequence(nSeq)[nOrd] == nPat)
+ {
+ m_OrderList.SelectSequence(nSeq);
+ m_OrderList.SetCurSel(nOrd, true);
+ break;
+ }
}
- if (pSndFile->Order[i] == pSndFile->Order.GetInvalidPatIndex()) break;
}
}
- SetCurrentPattern(lParam);
+ SetCurrentPattern(nPat);
}
- else if ((lParam >= 0x8000) && (lParam < int(pSndFile->Order.size()) + 0x8000))
+ else if ((lParam & 0x8000) && m_pSndFile)
{
- if (pSndFile)
+ // Order item
+ ORDERINDEX nOrd = (ORDERINDEX)(lParam & 0x7FFF);
+ SEQUENCEINDEX nSeq = (SEQUENCEINDEX)(lParam >> 16);
+ if((nSeq < m_pSndFile->Order.GetNumSequences()) && (nOrd < m_pSndFile->Order.GetSequence(nSeq).size()))
{
- lParam &= 0x7FFF;
- m_OrderList.OnSelectSequence(pSndFile->Order.GetCurrentSequenceIndex()); // new sequence already set in view_tre.cpp, GetModItem()
- m_OrderList.SetCurSel((ORDERINDEX)lParam);
- SetCurrentPattern(pSndFile->Order[lParam]);
+ m_OrderList.SelectSequence(nSeq);
+ m_OrderList.SetCurSel(nOrd);
+ SetCurrentPattern(m_pSndFile->Order[nOrd]);
}
}
if (m_hWndView)
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-10-04 12:50:16 UTC (rev 385)
@@ -81,6 +81,9 @@
// is not interpreted to be in margins regardless of the margin value.
bool IsOrderInMargins(int order, int startOrder);
+ // Set given sqeuence and update orderlist display.
+ void SelectSequence(const SEQUENCEINDEX nSeq);
+
public:
//{{AFX_VIRTUAL(COrderList)
virtual BOOL PreTranslateMessage(MSG *pMsg);
@@ -164,7 +167,7 @@
LONG* GetSplitPosRef() {return &CMainFrame::glPatternWindowHeight;} //rewbs.varWindowSize
public:
- void SetCurrentPattern(UINT nPat);
+ void SetCurrentPattern(PATTERNINDEX nPat);
BOOL SetCurrentInstrument(UINT nIns);
BOOL GetFollowSong() { return IsDlgButtonChecked(IDC_PATTERN_FOLLOWSONG); }
BOOL GetLoopPattern() {return IsDlgButtonChecked(IDC_PATTERN_LOOP);}
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-04 12:50:16 UTC (rev 385)
@@ -786,37 +786,7 @@
void COrderList::OnSelectSequence(UINT nid)
//-----------------------------------------
{
- BEGIN_CRITICAL();
- CMainFrame::GetMainFrame()->ResetNotificationBuffer();
- const SEQUENCEINDEX nId = static_cast<SEQUENCEINDEX>(nid - ID_SEQUENCE_ITEM);
- CSoundFile& rSf = *m_pModDoc->GetSoundFile();
- if (nId == MAX_SEQUENCES + 1)
- {
- CString strParam; strParam.Format(TEXT("%u: %s"), rSf.Order.GetCurrentSequenceIndex(), rSf.Order.m_sName);
- CString str;
- AfxFormatString1(str, IDS_CONFIRM_SEQUENCE_DELETE, strParam);
- if (AfxMessageBox(str, MB_YESNO | MB_ICONQUESTION) == IDYES)
- rSf.Order.RemoveSequence();
- else
- {
- END_CRITICAL();
- return;
- }
- }
- else if (nId == MAX_SEQUENCES)
- rSf.Order.AddSequence();
- else if (nId < rSf.Order.GetNumSequences())
- rSf.Order.SetSequence(nId);
- ORDERINDEX nPosCandidate = rSf.Order.GetLengthTailTrimmed() - 1;
- SetCurSel(min(m_nScrollPos, nPosCandidate), true, false, true);
- if (m_pParent)
- m_pParent->SetCurrentPattern(rSf.Order[m_nScrollPos]);
-
- UpdateScrollInfo();
- END_CRITICAL();
- UpdateView(HINT_MODSEQUENCE);
- m_pModDoc->SetModified();
- m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
+ SelectSequence(static_cast<SEQUENCEINDEX>(nid - ID_SEQUENCE_ITEM));
}
@@ -1168,3 +1138,38 @@
m_nOrderlistMargins = static_cast<BYTE>(i);
return GetMargins();
}
+
+void COrderList::SelectSequence(const SEQUENCEINDEX nSeq)
+//-------------------------------------------------------
+{
+ BEGIN_CRITICAL();
+ CMainFrame::GetMainFrame()->ResetNotificationBuffer();
+ CSoundFile& rSf = *m_pModDoc->GetSoundFile();
+ if (nSeq == MAX_SEQUENCES + 1)
+ {
+ CString strParam; strParam.Format(TEXT("%u: %s"), rSf.Order.GetCurrentSequenceIndex(), rSf.Order.m_sName);
+ CString str;
+ AfxFormatString1(str, IDS_CONFIRM_SEQUENCE_DELETE, strParam);
+ if (AfxMessageBox(str, MB_YESNO | MB_ICONQUESTION) == IDYES)
+ rSf.Order.RemoveSequence();
+ else
+ {
+ END_CRITICAL();
+ return;
+ }
+ }
+ else if (nSeq == MAX_SEQUENCES)
+ rSf.Order.AddSequence();
+ else if (nSeq < rSf.Order.GetNumSequences())
+ rSf.Order.SetSequence(nSeq);
+ ORDERINDEX nPosCandidate = rSf.Order.GetLengthTailTrimmed() - 1;
+ SetCurSel(min(m_nScrollPos, nPosCandidate), true, false, true);
+ if (m_pParent)
+ m_pParent->SetCurrentPattern(rSf.Order[m_nScrollPos]);
+
+ UpdateScrollInfo();
+ END_CRITICAL();
+ UpdateView(HINT_MODSEQUENCE);
+ m_pModDoc->SetModified();
+ m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
+}
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-10-04 12:50:16 UTC (rev 385)
@@ -242,7 +242,7 @@
BOOL IsChildSample(UINT nIns, UINT nSmp) const;
UINT FindSampleParent(UINT nSmp) const;
UINT FindInstrumentChild(UINT nIns) const;
- bool MoveOrder(UINT nSourceNdx, UINT nDestNdx, bool bUpdate = true, bool bCopy = false);
+ bool MoveOrder(ORDERINDEX nSourceNdx, ORDERINDEX nDestNdx, bool bUpdate = true, bool bCopy = false);
BOOL ExpandPattern(PATTERNINDEX nPattern);
BOOL ShrinkPattern(PATTERNINDEX nPattern);
BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-04 12:50:16 UTC (rev 385)
@@ -1022,13 +1022,18 @@
vector<MODCOMMAND*> pPatterns(maxPatIndex, NULL);
vector<BOOL> bPatUsed(maxPatIndex, false);
- const ORDERINDEX nLengthSub0 = m_SndFile.Order.GetLengthFirstEmpty();
- const ORDERINDEX nLengthUsed = m_SndFile.Order.GetLengthTailTrimmed();
+ bool bSubtunesDetected = false;
+ // detect subtunes (separated by "---")
+ for(SEQUENCEINDEX nSeq = 0; nSeq < m_SndFile.Order.GetNumSequences(); nSeq++)
+ {
+ if(m_SndFile.Order.GetSequence(nSeq).GetLengthFirstEmpty() != m_SndFile.Order.GetSequence(nSeq).GetLengthTailTrimmed())
+ bSubtunesDetected = true;
+ }
// Flag to tell whether keeping sequence items which are after the first empty('---') order.
bool bKeepSubSequences = false;
- if(nLengthUsed != nLengthSub0)
+ if(bSubtunesDetected)
{ // There are used sequence items after first '---'; ask user whether to remove those.
if (CMainFrame::GetMainFrame()->MessageBox(
_TEXT("Do you want to remove sequence items which are after the first '---' item?"),
@@ -2009,8 +2014,8 @@
}
-bool CModDoc::MoveOrder(UINT nSourceNdx, UINT nDestNdx, bool bUpdate, bool bCopy)
-//-------------------------------------------------------------------------------
+bool CModDoc::MoveOrder(ORDERINDEX nSourceNdx, ORDERINDEX nDestNdx, bool bUpdate, bool bCopy)
+//-------------------------------------------------------------------------------------------
{
if ((nSourceNdx >= m_SndFile.Order.size()) || (nDestNdx >= m_SndFile.Order.size())) return false;
if (nDestNdx >= m_SndFile.GetModSpecifications().ordersMax) return false;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-10-04 12:50:16 UTC (rev 385)
@@ -3707,6 +3707,7 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile->m_nType & MOD_TYPE_MOD) return; // no volume column
PrepareUndo(m_dwBeginSel, m_dwEndSel);
@@ -3745,7 +3746,7 @@
case kcSetVolumeITVelocity: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_VELOCITY; break; //rewbs.velocity
case kcSetVolumeITOffset: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_OFFSET; break; //rewbs.volOff
}
- if ((pSndFile->m_nType & MOD_TYPE_MOD) && (volcmd > VOLCMD_PANNING)) volcmd = vol = 0;
+ //if ((pSndFile->m_nType & MOD_TYPE_MOD) && (volcmd > VOLCMD_PANNING)) volcmd = vol = 0;
UINT max = 64;
if (volcmd > VOLCMD_PANNING)
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-04 12:50:16 UTC (rev 385)
@@ -6,7 +6,6 @@
#include "dlsbank.h"
#include "dlg_misc.h"
#include "vstplug.h"
-#include ".\view_tre.h"
#ifndef TVS_SINGLEEXPAND
#define TVS_SINGLEEXPAND 0x400
@@ -704,6 +703,8 @@
pInfo->tiOrders.resize(pSndFile->Order.GetNumSequences());
}
+ // TODO what to do when seq count changed from 2 to 1 or from 1 to 2?
+
/* // number of sequences changed: wipe tree first (is this necessary?)
if(pInfo->tiOrders.size() != pSndFile->Order.GetNumSequences())
{
@@ -728,11 +729,14 @@
if(pSndFile->Order.GetNumSequences() > 1)
{
// more than one sequence -> add folder
+ CString sSeqName = pSndFile->Order.GetSequence(nSeq).m_sName;
+ if(sSeqName.IsEmpty()) sSeqName.Format("Sequence %d", nSeq);
if(pInfo->tiSequences[nSeq] == NULL)
{
- CString sSeqName = pSndFile->Order.GetSequence(nSeq).m_sName;
- if(sSeqName.IsEmpty()) sSeqName.Format("Sequence %d", nSeq);
pInfo->tiSequences[nSeq] = InsertItem(sSeqName, IMAGE_FOLDER, IMAGE_FOLDER, pInfo->hOrders, TVI_LAST);
+ } else
+ {
+
}
hAncestorNode = pInfo->tiSequences[nSeq];
}
@@ -861,7 +865,7 @@
{
if (iSmp <= pSndFile->m_nSamples)
{
- BOOL bSamplePresent = (pSndFile->Samples[iSmp].pSample) ? TRUE : FALSE;
+ bool bSamplePresent = (pSndFile->Samples[iSmp].pSample) ? true : false;
UINT nImage = (bSamplePresent) ? IMAGE_SAMPLES : IMAGE_NOSAMPLE;
wsprintf(s, "%3d: %s", iSmp, pSndFile->m_szNames[iSmp]);
if (!pInfo->tiSamples[iSmp])
@@ -948,7 +952,7 @@
}
-DWORD CModTree::GetModItem(HTREEITEM hItem)
+uint64 CModTree::GetModItem(HTREEITEM hItem)
//-----------------------------------------
{
LPARAM lParam;
@@ -1025,8 +1029,8 @@
if (hItem == pSong->hSamples) return MODITEM_HDR_SAMPLES;
if (hItem == pSong->hInstruments) return MODITEM_HDR_INSTRUMENTS;
if (hItem == pSong->hComments) return MODITEM_COMMENTS;
- // Order List? (either "order list" or "sequence x" item as parent)
- if ((hItemParent == pSong->hOrders && pSong->tiSequences.size() == 1) || (hItemParentParent == pSong->hOrders))
+ // Order List or Sequence item?
+ if ((hItemParent == pSong->hOrders) || (hItemParentParent == pSong->hOrders))
{
// find sequence this item belongs to
for(SEQUENCEINDEX nSeq = 0; nSeq < pSong->tiOrders.size(); nSeq++)
@@ -1036,16 +1040,10 @@
{
if (hItem == pSong->tiOrders[nSeq][nOrd])
{
- if(pSong->pModDoc->GetSoundFile() != nullptr)
- {
- pSong->pModDoc->GetSoundFile()->Order.SetSequence(nSeq);
- // TODO this is buggy
- //OnSelectSequence must be called? Or send a message?
- }
- //if(nSeq != pSong->nSeqSel) // sequence change
- // return (MODITEM_ORDER_SEQUENCE | (nOrd << 16));
- //else // same sequence
- return (MODITEM_ORDER | (nOrd << 16));
+ return (MODITEM_ORDER | (nOrd << 16) | (((uint64)nSeq) << 32));
+ } else if(hItem == pSong->tiSequences[nSeq])
+ {
+ return (MODITEM_SEQUENCE | (nSeq << 16));
}
}
}
@@ -1111,11 +1109,11 @@
{
if (hItem)
{
- DWORD dwItemType = GetModItem(hItem);
- DWORD dwItem = dwItemType >> 16;
+ uint64 qwItemType = GetModItem(hItem);
+ DWORD dwItem = (DWORD)(qwItemType >> 16);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
- switch(dwItemType & 0xFFFF)
+ switch(qwItemType & 0xFFFF)
{
case MODITEM_COMMENTS:
if (pModDoc) pModDoc->ActivateView(IDD_CONTROL_COMMENTS, 0);
@@ -1155,7 +1153,7 @@
return TRUE;
default:
- if (dwItemType & 0x8000)
+ if (qwItemType & 0x8000)
{
PlayItem(hItem);
return TRUE;
@@ -1171,11 +1169,11 @@
{
if (hItem)
{
- DWORD dwItemType = GetModItem(hItem);
- DWORD dwItem = dwItemType >> 16;
+ uint64 qwItemType = GetModItem(hItem);
+ DWORD dwItem = (DWORD)(qwItemType >> 16);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
- switch(dwItemType & 0xFFFF)
+ switch(qwItemType & 0xFFFF)
{
case MODITEM_SAMPLE:
if (pModDoc)
@@ -1234,7 +1232,7 @@
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
if (pMainFrm)
{
- if ((dwItemType & 0xFFFF) == MODITEM_INSLIB_INSTRUMENT)
+ if ((qwItemType & 0xFFFF) == MODITEM_INSLIB_INSTRUMENT)
{
pMainFrm->PlaySoundFile(&m_SongFile, n, 0, nParam);
} else
@@ -1265,21 +1263,21 @@
break;
default:
- if (dwItemType & 0x8000)
+ if (qwItemType & 0x8000)
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
- UINT bank = (dwItemType & 0x3F000000) >> 24;
+ UINT bank = (qwItemType & 0x3F000000) >> 24;
if ((bank < MAX_DLS_BANKS) && (CTrackApp::gpDLSBanks[bank]) && (pMainFrm))
{
CDLSBank *pDLSBank = CTrackApp::gpDLSBanks[bank];
- UINT rgn = 0, instr = (dwItemType & 0x00007FFF);
+ UINT rgn = 0, instr = (qwItemType & 0x00007FFF);
// Drum
- if (dwItemType & 0x80000000)
+ if (qwItemType & 0x80000000)
{
- rgn = (dwItemType & 0x007F0000) >> 16;
+ rgn = (qwItemType & 0x007F0000) >> 16;
} else
// Melodic
- if (dwItemType & 0x40000000)
+ if (qwItemType & 0x40000000)
{
if ((!nParam) || (nParam > NOTE_MAX)) nParam = NOTE_MIDDLEC;
rgn = pDLSBank->GetRegionFromKey(instr, nParam-1);
@@ -1333,54 +1331,54 @@
BOOL CModTree::DeleteTreeItem(HTREEITEM hItem)
//--------------------------------------------
{
- DWORD dwItemType = GetModItem(hItem);
- WORD nItem = WORD(dwItemType >> 16);
+ uint64 qwItemType = GetModItem(hItem);
+ DWORD dwItem = (DWORD)(qwItemType >> 16);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
- switch(dwItemType & 0xFFFF)
+ switch(qwItemType & 0xFFFF)
{
case MODITEM_ORDER:
- if ((pModDoc) && (pModDoc->RemoveOrder(nItem)))
+ if ((pModDoc) && (pModDoc->RemoveOrder((ORDERINDEX)dwItem)))
{
pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL);
}
break;
case MODITEM_PATTERN:
- if ((pModDoc) && (pModDoc->RemovePattern(nItem)))
+ if ((pModDoc) && (pModDoc->RemovePattern((PATTERNINDEX)dwItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16)|HINT_PATTERNDATA|HINT_PATNAMES);
- pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES);
+ pModDoc->UpdateAllViews(NULL, (UINT(dwItem) << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES);
}
break;
case MODITEM_SAMPLE:
- if ((pModDoc) && (pModDoc->RemoveSample(nItem)))
+ if ((pModDoc) && (pModDoc->RemoveSample((SAMPLEINDEX)dwItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
- pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
+ pModDoc->UpdateAllViews(NULL, (UINT(dwItem) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
}
break;
case MODITEM_INSTRUMENT:
- if ((pModDoc) && (pModDoc->RemoveInstrument(nItem)))
+ if ((pModDoc) && (pModDoc->RemoveInstrument((INSTRUMENTINDEX)dwItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16)|HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
- pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
+ pModDoc->UpdateAllViews(NULL, (UINT(dwItem) << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
}
break;
case MODITEM_MIDIINSTRUMENT:
- SetMidiInstrument(nItem, "");
+ SetMidiInstrument(dwItem, "");
RefreshMidiLibrary();
break;
case MODITEM_MIDIPERCUSSION:
- SetMidiPercussion(nItem, "");
+ SetMidiPercussion(dwItem, "");
RefreshMidiLibrary();
break;
case MODITEM_DLSBANK_FOLDER:
- CTrackApp::RemoveDLSBank(nItem);
+ CTrackApp::RemoveDLSBank(dwItem);
RefreshDlsBanks();
break;
@@ -1408,12 +1406,12 @@
BOOL CModTree::OpenTreeItem(HTREEITEM hItem)
//------------------------------------------
{
- DWORD dwItemType = GetModItem(hItem);
+ uint64 qwItemType = GetModItem(hItem);
//DWORD dwItem = dwItemType >> 16;
//PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
//CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
- switch(dwItemType & 0xFFFF)
+ switch(qwItemType & 0xFFFF)
{
case MODITEM_INSLIB_SONG:
{
@@ -1853,9 +1851,9 @@
PMODTREEDOCINFO pInfo = DocInfo[m_nDragDocNdx];
pdropinfo->pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
pdropinfo->dwDropType = DRAGONDROP_NOTHING;
- pdropinfo->dwDropItem = m_dwItemDrag >> 16;
+ pdropinfo->dwDropItem = (DWORD)(m_qwItemDrag >> 16);
pdropinfo->lDropParam = 0;
- switch(m_dwItemDrag & 0xFFFF)
+ switch(m_qwItemDrag & 0xFFFF)
{
case MODITEM_ORDER:
pdropinfo->dwDropType = DRAGONDROP_ORDER;
@@ -1883,7 +1881,7 @@
if (s[0] >= '0') n += (s[0] - '0');
if ((s[1] >= '0') && (s[1] <= '9')) n = n*10 + (s[1] - '0');
if ((s[2] >= '0') && (s[2] <= '9')) n = n*10 + (s[2] - '0');
- pdropinfo->dwDropType = ((m_dwItemDrag & 0xFFFF) == MODITEM_INSLIB_SAMPLE) ? DRAGONDROP_SAMPLE : DRAGONDROP_INSTRUMENT;
+ pdropinfo->dwDropType = ((m_qwItemDrag & 0xFFFF) == MODITEM_INSLIB_SAMPLE) ? DRAGONDROP_SAMPLE : DRAGONDROP_INSTRUMENT;
pdropinfo->dwDropItem = n;
pdropinfo->pModDoc = NULL;
pdropinfo->lDropParam = (LPARAM)&m_SongFile;
@@ -1918,14 +1916,14 @@
break;
default:
- if (m_dwItemDrag & 0xC0000000)
+ if (m_qwItemDrag & 0xC0000000)
{
pdropinfo->dwDropType = DRAGONDROP_DLS;
// dwDropItem = DLS Bank #
- pdropinfo->dwDropItem = (m_dwItemDrag & 0x3F000000) >> 24; // bank #
+ pdropinfo->dwDropItem = (DWORD)((m_qwItemDrag & 0x3F000000) >> 24); // bank #
// Melodic: (Instrument)
// Drums: (0x80000000) | (Region << 16) | (Instrument)
- pdropinfo->lDropParam = (m_dwItemDrag & 0x80FF7FFF); //
+ pdropinfo->lDropParam = (LPARAM)((m_qwItemDrag & 0x80FF7FFF)); //
break;
}
}
@@ -1936,13 +1934,13 @@
BOOL CModTree::CanDrop(HTREEITEM hItem, BOOL bDoDrop)
//---------------------------------------------------
{
- DWORD dwItemDrop = GetModItem(hItem);
- DWORD dwItemDrag = m_dwItemDrag >> 16;
- DWORD dwDragType = m_dwItemDrag & 0xFFFF;
- DWORD dwDropType = dwItemDrop & 0xFFFF;
+ uint64 qwItemDrop = GetModItem(hItem);
+ DWORD dwItemDrag = (DWORD)(m_qwItemDrag >> 16);
+ DWORD dwDragType = m_qwItemDrag & 0xFFFF;
+ DWORD dwDropType = (DWORD)(qwItemDrop & 0xFFFF);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
- dwItemDrop >>= 16;
+ qwItemDrop >>= 16;
switch(dwDropType)
{
case MODITEM_ORDER:
@@ -1950,7 +1948,7 @@
{
if (bDoDrop)
{
- if (dwItemDrag != dwItemDrop) pModDoc->MoveOrder(dwItemDrag, dwItemDrop, true);
+ if (dwItemDrag != qwItemDrop) pModDoc->MoveOrder((ORDERINDEX)dwItemDrag, (ORDERINDEX)qwItemDrop, true);
}
return TRUE;
}
@@ -1969,9 +1967,9 @@
CHAR szFullPath[_MAX_PATH] = "";
InsLibGetFullPath(m_hItemDrag, szFullPath);
if (dwDropType == MODITEM_MIDIINSTRUMENT)
- SetMidiInstrument(dwItemDrop, szFullPath);
+ SetMidiInstrument((DWORD)qwItemDrop, szFullPath);
else
- SetMidiPercussion(dwItemDrop, szFullPath);
+ SetMidiPercussion((DWORD)qwItemDrop, szFullPath);
}
return TRUE;
}
@@ -2046,9 +2044,9 @@
{
if (!ItemHasChildren(m_hItemDrag)) SelectItem(m_hItemDrag);
}
- m_dwItemDrag = GetModItem(m_hItemDrag);
+ m_qwItemDrag = GetModItem(m_hItemDrag);
m_nDragDocNdx = m_nDocNdx;
- switch(m_dwItemDrag & 0xFFFF)
+ switch(m_qwItemDrag & 0xFFFF)
{
case MODITEM_ORDER:
case MODITEM_PATTERN:
@@ -2062,7 +2060,7 @@
bDrag = TRUE;
break;
default:
- if (m_dwItemDrag & 0x8000) bDrag = TRUE;
+ if (m_qwItemDrag & 0x8000) bDrag = TRUE;
}
if (bDrag)
{
@@ -2158,13 +2156,13 @@
{
UINT nDefault = 0;
BOOL bSep = FALSE;
- DWORD dwItemType;
+ uint64 qwItemType;
- dwItemType = GetModItem(hItem);
- const uint16 nItemNo = HIWORD(dwItemType);
- dwItemType &= 0xFFFF;
+ qwItemType = GetModItem(hItem);
+ const DWORD dwItemNo = (DWORD)(qwItemType >> 16);
+ qwItemType &= 0xFFFF;
SelectItem(hItem);
- switch(dwItemType)
+ switch(qwItemType)
{
case MODITEM_COMMENTS:
nDefault = ID_MODTREE_EXECUTE;
@@ -2176,9 +2174,17 @@
nDefault = ID_MODTREE_EXECUTE;
AppendMenu(hMenu, MF_STRING, nDefault, "&Edit Pattern");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE,
- (dwItemType == MODITEM_ORDER) ? "&Delete from list" : "&Delete Pattern");
+ (qwItemType == MODITEM_ORDER) ? "&Delete from list" : "&Delete Pattern");
break;
+ case MODITEM_SEQUENCE:
+ // TODO: Right-click menu for sequences
+ //nDefault = ID_MODTREE_EXECUTE;
+ //AppendMenu(hMenu, MF_STRING, nDefault, "&Switch to Seqeuence");
+ //AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Sequence");
+ //AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "D&uplicate Sequence");
+ break;
+
case MODITEM_SAMPLE:
{
CModDoc *pModDoc = GetDocumentFromItem(hItem);
@@ -2189,7 +2195,7 @@
if ((pModDoc) && (!pModDoc->GetNumInstruments()))
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, (pModDoc->IsSampleMuted(nItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Sample");
+ AppendMenu(hMenu, (pModDoc->IsSampleMuted((SAMPLEINDEX)dwItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Sample");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, "&Solo Sample");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, "&Unmute all");
}
@@ -2206,7 +2212,7 @@
if ((pModDoc) && (pModDoc->GetNumInstruments()))
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, (pModDoc->IsInstrumentMuted(nItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Instrument");
+ AppendMenu(hMenu, (pModDoc->IsInstrumentMuted((INSTRUMENTINDEX)dwItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Instrument");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, "&Solo Instrument");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, "&Unmute all");
// -> CODE#0023
@@ -2227,7 +2233,7 @@
CModDoc *pModDoc = GetDocumentFromItem(hItem);
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
if (pSndFile) {
- PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[nItemNo];
+ PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[dwItemNo];
if (pPlugin) {
bool bypassed = ((pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS) != 0);
AppendMenu(hMenu, (bypassed?MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Bypass");
@@ -2286,7 +2292,7 @@
break;
default:
- if (dwItemType & 0x8000)
+ if (qwItemType & 0x8000)
{
nDefault = ID_MODTREE_PLAY;
AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, "&Play Instrument");
@@ -2294,9 +2300,9 @@
break;
}
if (nDefault) SetMenuDefaultItem(hMenu, nDefault, FALSE);
- if ((dwItemType == MODITEM_INSLIB_FOLDER)
- || (dwItemType == MODITEM_INSLIB_SONG)
- || (dwItemType == MODITEM_HDR_INSTRUMENTLIB))
+ if ((qwItemType == MODITEM_INSLIB_FOLDER)
+ || (qwItemType == MODITEM_INSLIB_SONG)
+ || (qwItemType == MODITEM_HDR_INSTRUMENTLIB))
{
if ((bSep) || (nDefault)) AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
AppendMenu(hMenu, (m_bShowAllFiles) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_MODTREE_SHOWALLFILES, "Show All Files");
@@ -2325,8 +2331,8 @@
HTREEITEM hItem = HitTest(pt, &flags);
if (hItem != NULL)
{
- DWORD dwItem = GetModItem(hItem);
- switch(dwItem & 0xFFFF)
+ uint64 qwItem = GetModItem(hItem);
+ switch(qwItem & 0xFFFF)
{
case MODITEM_INSLIB_FOLDER:
case MODITEM_INSLIB_SONG:
@@ -2341,8 +2347,8 @@
if (pFrame)
{
pFrame->SendMessage(WM_MOD_INSTRSELECTED,
- ((dwItem & 0xffff) == MODITEM_INSTRUMENT) ? TRUE : FALSE,
- dwItem >> 16);
+ ((qwItem & 0xffff) == MODITEM_INSTRUMENT) ? TRUE : FALSE,
+ (LPARAM)(qwItem >> 16));
}
}
break;
@@ -2415,7 +2421,7 @@
// Bug?
if (!(nFlags & (MK_LBUTTON|MK_RBUTTON)))
{
- m_dwItemDrag = 0;
+ m_qwItemDrag = 0;
m_hItemDrag = NULL;
OnEndDrag(TREESTATUS_DRAGGING);
return;
@@ -2568,29 +2574,29 @@
//-----------------------------
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType;
+ uint64 qwItemType;
CModDoc *pModDoc;
- dwItemType = GetModItem(hItem);
- const uint16 nItemNo = HIWORD(dwItemType);
- dwItemType &= 0xFFFF;
+ qwItemType = GetModItem(hItem);
+ const DWORD dwItemNo = (DWORD)(qwItemType >> 16);
+ qwItemType &= 0xFFFF;
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
- if ((dwItemType == MODITEM_SAMPLE) && (!pModDoc->GetNumInstruments()))
+ if ((qwItemType == MODITEM_SAMPLE) && (!pModDoc->GetNumInstruments()))
{
- pModDoc->MuteSample(nItemNo, (pModDoc->IsSampleMuted(nItemNo)) ? FALSE : TRUE);
+ pModDoc->MuteSample((SAMPLEINDEX)dwItemNo, (pModDoc->IsSampleMuted((SAMPLEINDEX)dwItemNo)) ? false : true);
} else
- if ((dwItemType == MODITEM_INSTRUMENT) && (pModDoc->GetNumInstruments()))
+ if ((qwItemType == MODITEM_INSTRUMENT) && (pModDoc->GetNumInstruments()))
{
- pModDoc->MuteInstrument(nItemNo, (pModDoc->IsInstrumentMuted(nItemNo)) ? FALSE : TRUE);
+ pModDoc->MuteInstrument((INSTRUMENTINDEX)dwItemNo, (pModDoc->IsInstrumentMuted((INSTRUMENTINDEX)dwItemNo)) ? false : true);
}
- if ((dwItemType == MODITEM_EFFECT))
+ if ((qwItemType == MODITEM_EFFECT))
{
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
if (pSndFile) {
- PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[nItemNo];
+ PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[dwItemNo];
if (pPlugin) {
CVstPlugin *pVstPlugin = (CVstPlugin *)pPlugin->pMixPlugin;
if (pVstPlugin) pVstPlugin->Bypass();
@@ -2606,29 +2612,29 @@
//-----------------------------
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType;
+ uint64 qwItemType;
CModDoc *pModDoc;
- dwItemType = GetModItem(hItem);
- const uint16 nItemNo = HIWORD(dwItemType);
- dwItemType &= 0xFFFF;
+ qwItemType = GetModItem(hItem);
+ const DWORD dwItemNo = (DWORD)(qwItemType >> 16);
+ qwItemType &= 0xFFFF;
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
SAMPLEINDEX nSamples = pModDoc->GetNumSamples();
INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
- if ((dwItemType == MODITEM_SAMPLE) && (!nInstruments))
+ if ((qwItemType == MODITEM_SAMPLE) && (!nInstruments))
{
for (SAMPLEINDEX i=1; i<=nSamples; i++)
{
- pModDoc->MuteSample(i, (i == nItemNo) ? FALSE : TRUE);
+ pModDoc->MuteSample(i, (i == dwItemNo) ? false : true);
}
} else
- if ((dwItemType == MODITEM_INSTRUMENT) && (nInstruments))
+ if ((qwItemType == MODITEM_INSTRUMENT) && (nInstruments))
{
for (INSTRUMENTINDEX i=1; i<=nInstruments; i++)
{
- pModDoc->MuteInstrument(i, (i == nItemNo) ? FALSE : TRUE);
+ pModDoc->MuteInstrument(i, (i == dwItemNo) ? false : true);
}
}
}
@@ -2639,16 +2645,16 @@
//----------------------------------
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType;
+ uint64 qwItemType;
CModDoc *pModDoc;
- dwItemType = GetModItem(hItem) & 0xFFFF;
+ qwItemType = GetModItem(hItem) & 0xFFFF;
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
SAMPLEINDEX nSamples = pModDoc->GetNumSamples();
INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
- if ((dwItemType == MODITEM_SAMPLE) || (dwItemType == MODITEM_INSTRUMENT))
+ if ((qwItemType == MODITEM_SAMPLE) || (qwItemType == MODITEM_INSTRUMENT))
{
for (SAMPLEINDEX i=1; i<=nSamples; i++)
{
@@ -2668,9 +2674,9 @@
void CModTree::OnSetItemPath()
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType = GetModItem(hItem);
- DWORD dwItem = dwItemType >> 16;
- dwItemType &= 0xFFFF;
+ uint64 qwItemType = GetModItem(hItem);
+ DWORD dwItem = (DWORD)(qwItemType >> 16);
+ qwItemType &= 0xFFFF;
CModDoc *pModDoc = GetDocumentFromItem(hItem);
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
@@ -2700,15 +2706,15 @@
void CModTree::OnSaveItem()
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType = GetModItem(hItem);
- const uint16 nItem = HIWORD(dwItemType);
- dwItemType &= 0xFFFF;
+ uint64 qwItemType = GetModItem(hItem);
+ const DWORD dwItem = HIWORD(qwItemType);
+ qwItemType &= 0xFFFF;
CModDoc *pModDoc = GetDocumentFromItem(hItem);
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
- if(pSndFile && nItem){
+ if(pSndFile && dwItem){
- if(pSndFile->m_szInstrumentPath[nItem-1][0] == '\0'){
+ if(pSndFile->m_szInstrumentPath[dwItem-1][0] == '\0'){
CHAR pszFileNames[_MAX_PATH];
CFileDialog dlg(FALSE, (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? "iti" : "xi", NULL,
@@ -2724,23 +2730,23 @@
dlg.m_ofn.lpstrFile = pszFileNames;
dlg.m_ofn.nMaxFile = _MAX_PATH;
- if(dlg.DoModal() == IDOK) strcpy(pSndFile->m_szInstrumentPath[nItem-1], pszFileNames);
+ if(dlg.DoModal() == IDOK) strcpy(pSndFile->m_szInstrumentPath[dwItem - 1], pszFileNames);
dlg.m_ofn.lpstrFile = NULL;
dlg.m_ofn.nMaxFile = 0;
}
- if(pSndFile->m_szInstrumentPath[nItem-1][0] != '\0'){
- int size = strlen(pSndFile->m_szInstrumentPath[nItem-1]);
- BOOL iti = _stricmp(&pSndFile->m_szInstrumentPath[nItem-1][size-3],"iti") == 0;
- BOOL xi = _stricmp(&pSndFile->m_szInstrumentPath[nItem-1][size-2],"xi") == 0;
+ if(pSndFile->m_szInstrumentPath[dwItem - 1][0] != '\0'){
+ int size = strlen(pSndFile->m_szInstrumentPath[dwItem - 1]);
+ BOOL iti = _stricmp(&pSndFile->m_szInstrumentPath[dwItem - 1][size-3],"iti") == 0;
+ BOOL xi = _stricmp(&pSndFile->m_szInstrumentPath[dwItem - 1][size-2],"xi") == 0;
if(iti || (!iti && !xi && pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
- pSndFile->SaveITIInstrument(nItem, pSndFile->m_szInstrumentPath[nItem-1]);
+ pSndFile->SaveITIInstrument((INSTRUMENTINDEX)dwItem, pSndFile->m_szInstrumentPath[dwItem - 1]);
if(xi || (!xi && !iti && pSndFile->m_nType == MOD_TYPE_XM))
- pSndFile->SaveXIInstrument(nItem, pSndFile->m_szInstrumentPath[nItem-1]);
+ pSndFile->SaveXIInstrument((INSTRUMENTINDEX)dwItem, pSndFile->m_szInstrumentPath[dwItem - 1]);
- pSndFile->instrumentModified[nItem-1] = FALSE;
+ pSndFile->instrumentModified[dwItem - 1] = FALSE;
}
if(pModDoc) pModDoc->UpdateAllViews(NULL, HINT_MODTYPE);
@@ -2799,8 +2805,8 @@
{
UINT flags;
HTREEITEM hItem = HitTest(point, &flags);
- DWORD dwItemType = GetModItem(hItem);
- switch(dwItemType & 0xFFFF)
+ uint64 qwItemType = GetModItem(hItem);
+ switch(qwItemType & 0xFFFF)
{
case MODITEM_MIDIINSTRUMENT:
case MODITEM_MIDIPERCUSSION:
@@ -2810,7 +2816,7 @@
EnsureVisible(hItem);
}
m_hItemDrag = hItem;
- m_dwItemDrag = dwItemType;
+ m_qwItemDrag = qwItemType;
return DROPEFFECT_LINK;
// Folders:
case MODITEM_HDR_MIDILIB:
@@ -2842,8 +2848,8 @@
DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH);
if (szFileName[0])
{
- DWORD dwItem = m_dwItemDrag >> 16;
- switch(m_dwItemDrag & 0xFFFF)
+ DWORD dwItem = (DWORD)(m_qwItemDrag >> 16);
+ switch(m_qwItemDrag & 0xFFFF)
{
case MODITEM_MIDIINSTRUMENT:
bOk = SetMidiInstrument(dwItem, szFileName);
@@ -2918,10 +2924,10 @@
//------------------------------------
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType = GetModItem(hItem);
- if ((dwItemType & 0xFFFF) == MODITEM_DLSBANK_FOLDER)
+ uint64 qwItemType = GetModItem(hItem);
+ if ((qwItemType & 0xFFFF) == MODITEM_DLSBANK_FOLDER)
{
- UINT nBank = dwItemType >> 16;
+ UINT nBank = (UINT)(qwItemType >> 16);
if ((nBank < MAX_DLS_BANKS) && (CTrackApp::gpDLSBanks[nBank]))
{
CSoundBankProperties dlg(CTrackApp::gpDLSBanks[nBank], this);
Modified: trunk/OpenMPT/mptrack/View_tre.h
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.h 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/mptrack/View_tre.h 2009-10-04 12:50:16 UTC (rev 385)
@@ -32,6 +32,7 @@
MODITEM_INSLIB_SONG,
MODITEM_DLSBANK_FOLDER,
MODITEM_DLSBANK_INSTRUMENT,
+ MODITEM_SEQUENCE,
};
#define TREESTATUS_RDRAG 0x01
@@ -109,7 +110,7 @@
CModTree *m_pDataTree;
DWORD m_dwStatus;
HWND m_hDropWnd;
- DWORD m_dwItemDrag;
+ uint64 m_qwItemDrag;
BOOL m_bShowAllFiles;
UINT m_nDocNdx, m_nDragDocNdx;
HTREEITEM m_hItemDrag, m_hItemDrop;
@@ -135,7 +136,7 @@
VOID RefreshInstrumentLibrary();
VOID EmptyInstrumentLibrary();
VOID FillInstrumentLibrary();
- DWORD GetModItem(HTREEITEM hItem);
+ uint64 GetModItem(HTREEITEM hItem);
BOOL SetMidiInstrument(UINT nIns, LPCSTR lpszFileName);
BOOL SetMidiPercussion(UINT nPerc, LPCSTR lpszFileName);
BOOL ExecuteItem(HTREEITEM hItem);
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-10-02 15:49:41 UTC (rev 384)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-10-04 12:50:16 UTC (rev 385)
@@ -18,7 +18,7 @@
0:1027:0:118:5 //Play pattern from start: F7 (KeyDown|KeyHold)
0:1026:2:118:5 //Play pattern from cursor: Ctrl+F7 (KeyDown|KeyHold)
0:1376:0:120:1 //Toggle Midi Record: F9 (KeyDown)
-0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown)
+0:1359:2:90:5 //Undo: Ctrl+Z (KeyDown|KeyHold)
0:1360:2:88:1 //Cut: Ctrl+X (KeyDown)
0:1361:2:67:1 //Copy: Ctrl+C (KeyDown)
0:1361:2:45:1 //Copy: Ctrl+EINFG (KeyDown)
@@ -77,6 +77,7 @@
2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown)
2:1062:0:93:1 //Show note properties: ANWENDUNG (KeyDown)
2:1780:2:80:1 //Show playback time at current row: Ctrl+P (KeyDown)
+2:1786:2:82:1 //Reset channel: Ctrl+R (KeyDown)
2:1007:2:81:5 //Transpose +1: Ctrl+Q (KeyDown|KeyHold)
2:1008:2:65:5 //Transpose -1: Ctrl+A (KeyDown|KeyHold)
2:1009:3:81:5 //Transpose +12: Shift+Ctrl+Q (KeyDown|KeyHold)
@@ -155,9 +156,9 @@
3:1221:0:57:1 //Set octave 9: 9 (KeyDown)
3:1221:0:105:1 //Set octave 9: 9 (ZEHNERTASTATUR) (KeyDown)
3:1316:1:16:1 //Chord Modifier: Shift+UMSCHALT (KeyDown)
-3:1200:0:220:1 //Note Cut: ZIRKUMFLEX (KeyDown)
-3:1201:0:221:1 //Note Off: AKUT (KeyDown)
-3:1791:0:219:1 //Note Fade: \xDF (KeyDown)
+3:1667:0:220:1 //Note Cut (don't remember instrument): ZIRKUMFLEX (KeyDown)
+3:1668:0:221:1 //Note Off (don't remember instrument): AKUT (KeyDown)
+3:1792:0:219:1 //Note Fade (don't remember instrument): \xDF (KeyDown)
3:1788:0:226:1 //Parameter control(MPTm only): < (KeyDown)
3:1789:1:226:1 //Parameter control(smooth)(MPTm only): Shift+< (KeyDown)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-10-02 16:47:41
|
Revision: 384
http://modplug.svn.sourceforge.net/modplug/?rev=384&view=rev
Author: saga-games
Date: 2009-10-02 15:49:41 +0000 (Fri, 02 Oct 2009)
Log Message:
-----------
[Imp] Tree view: Show sequences in song treeview. Still slightly buggy, e.g. when removing everything but one sequence or when adding a sequence when there's only one sequence.
[Mod] Pattern editor: Slight redesign of the pattern control area
[Ref] Some minor internal changes
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-10-02 15:49:41 UTC (rev 384)
@@ -296,6 +296,7 @@
::EnableWindow(::GetDlgItem(m_hWnd, IDC_PATINSTROPLUGGUI2), false);
// Show/hide multisequence controls according the current modtype.
+ GetDlgItem(IDC_STATIC_SEQUENCE_NAME_FRAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
GetDlgItem(IDC_STATIC_SEQUENCE_NAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
GetDlgItem(IDC_EDIT_SEQUENCE_NAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
}
@@ -608,6 +609,7 @@
if (pSndFile)
{
lParam &= 0x7FFF;
+ m_OrderList.OnSelectSequence(pSndFile->Order.GetCurrentSequenceIndex()); // new sequence already set in view_tre.cpp, GetModItem()
m_OrderList.SetCurSel((ORDERINDEX)lParam);
SetCurrentPattern(pSndFile->Order[lParam]);
}
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-02 15:49:41 UTC (rev 384)
@@ -326,7 +326,9 @@
{
DWORD dwType;
DWORD dwLatency;
- UINT nOrder, nPattern, nRow; // Always valid
+ ORDERINDEX nOrder; // Always valid
+ PATTERNINDEX nPattern; // dito
+ ROWINDEX nRow; // dito
DWORD dwPos[MAX_CHANNELS]; // sample/envelope pos for each channel if >= 0
} MPTNOTIFICATION, *PMPTNOTIFICATION;
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-02 15:49:41 UTC (rev 384)
@@ -1736,9 +1736,9 @@
PATTERNINDEX CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows)
//------------------------------------------------------------------
{
- const int i = m_SndFile.Patterns.Insert(nRows);
- if(i < 0)
- return PATTERNINDEX_INVALID;
+ const PATTERNINDEX i = m_SndFile.Patterns.Insert(nRows);
+ if(i == PATTERNINDEX_INVALID)
+ return i;
//Increasing orderlist size if given order is beyond current limit,
//or if the last order already has a pattern.
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-02 15:49:41 UTC (rev 384)
@@ -296,7 +296,8 @@
if (pInfo)
{
pInfo->pModDoc = pModDoc;
- pInfo->nOrdSel = (UINT)-1;
+ pInfo->nSeqSel = SEQUENCEINDEX_INVALID;
+ pInfo->nOrdSel = ORDERINDEX_INVALID;
DocInfo[nNewNdx] = pInfo;
UpdateView(nNewNdx, HINT_MODTYPE);
if (pInfo->hSong)
@@ -688,62 +689,114 @@
if ((pInfo->hOrders) && (hintFlagPart != HINT_INSNAMES) && (hintFlagPart != HINT_SMPNAMES))
{
const DWORD nPat = (lHint >> HINT_SHIFT_PAT);
- // If there are items past the new sequence length, delete them.
- for(size_t i = pSndFile->Order.GetLength(); i < pInfo->tiOrders.size(); i++) if (pInfo->tiOrders[i])
- {DeleteItem(pInfo->tiOrders[i]); pInfo->tiOrders[i] = NULL;}
- if (pInfo->tiOrders.size() < pSndFile->Order.GetLength()) // Resize tiOrders if needed.
- pInfo->tiOrders.resize(pSndFile->Order.GetLength(), NULL);
- UINT imin=0, imax = pSndFile->Order.GetLastIndex();
- const bool patNamesOnly = (hintFlagPart == HINT_PATNAMES);
- //if (hintFlagPart == HINT_PATNAMES) && (dwHintParam < pSndFile->Order.size())) imin = imax = dwHintParam;
- BOOL bEnded = FALSE;
- for (UINT iOrd=imin; iOrd<=imax; iOrd++)
+ // If there are too many sequences, delete them.
+ for(size_t nSeq = pSndFile->Order.GetNumSequences(); nSeq < pInfo->tiSequences.size(); nSeq++) if (pInfo->tiSequences[nSeq])
{
- if (pSndFile->Order[iOrd] == pSndFile->Order.GetInvalidPatIndex()) bEnded = TRUE;
- if (bEnded)
+ for(size_t nOrd = 0; nOrd < pInfo->tiOrders[nSeq].size(); nOrd++) if (pInfo->tiOrders[nSeq][nOrd])
{
- if (pInfo->tiOrders[iOrd])
+ DeleteItem(pInfo->tiOrders[nSeq][nOrd]); pInfo->tiOrders[nSeq][nOrd] = NULL;
+ }
+ DeleteItem(pInfo->tiSequences[nSeq]); pInfo->tiSequences[nSeq] = NULL;
+ }
+ if (pInfo->tiSequences.size() < pSndFile->Order.GetNumSequences()) // Resize tiSequences if needed.
+ {
+ pInfo->tiSequences.resize(pSndFile->Order.GetNumSequences(), NULL);
+ pInfo->tiOrders.resize(pSndFile->Order.GetNumSequences());
+ }
+
+ /* // number of sequences changed: wipe tree first (is this necessary?)
+ if(pInfo->tiOrders.size() != pSndFile->Order.GetNumSequences())
+ {
+ for(size_t nSeq = 0; nSeq < pInfo->tiOrders.size(); nSeq++)
+ {
+ for(size_t nOrd = 0; nOrd < pInfo->tiOrders[nSeq].size(); nOrd++) if (pInfo->tiOrders[nSeq][nOrd])
{
- DeleteItem(pInfo->tiOrders[iOrd]);
- pInfo->tiOrders[iOrd] = NULL;
+ DeleteItem(pInfo->tiOrders[nSeq][nOrd]); pInfo->tiOrders[nSeq][nOrd] = NULL;
}
- } else
+ DeleteItem(pInfo->tiSequences[nSeq]); pInfo->tiSequences[nSeq] = NULL;
+ }
+ pInfo->tiOrders.resize(pSndFile->Order.GetNumSequences());
+ pInfo->tiSequences.resize(pSndFile->Order.GetNumSequences(), NULL);
+ }*/
+
+ HTREEITEM hAncestorNode = pInfo->hOrders;
+
+ // go through all sequences
+ for(SEQUENCEINDEX nSeq = 0; nSeq < pSndFile->Order.GetNumSequences(); nSeq++)
+ {
+ // TODO update sequence names
+ if(pSndFile->Order.GetNumSequences() > 1)
{
- if(patNamesOnly && pSndFile->Order[iOrd] != nPat)
- continue;
- UINT state = (iOrd == pInfo->nOrdSel) ? TVIS_BOLD : 0;
- if (pSndFile->Order[iOrd] < pSndFile->Patterns.Size())
+ // more than one sequence -> add folder
+ if(pInfo->tiSequences[nSeq] == NULL)
{
- stmp[0] = 0;
- pSndFile->GetPatternName(pSndFile->Order[iOrd], stmp, sizeof(stmp));
- if (stmp[0])
+ CString sSeqName = pSndFile->Order.GetSequence(nSeq).m_sName;
+ if(sSeqName.IsEmpty()) sSeqName.Format("Sequence %d", nSeq);
+ pInfo->tiSequences[nSeq] = InsertItem(sSeqName, IMAGE_FOLDER, IMAGE_FOLDER, pInfo->hOrders, TVI_LAST);
+ }
+ hAncestorNode = pInfo->tiSequences[nSeq];
+ }
+
+ // If there are items past the new sequence length, delete them.
+ for(size_t nOrd = pSndFile->Order.GetSequence(nSeq).GetLength(); nOrd < pInfo->tiOrders[nSeq].size(); nOrd++) if (pInfo->tiOrders[nSeq][nOrd])
+ {
+ DeleteItem(pInfo->tiOrders[nSeq][nOrd]); pInfo->tiOrders[nSeq][nOrd] = NULL;
+ }
+ if (pInfo->tiOrders[nSeq].size() < pSndFile->Order.GetSequence(nSeq).GetLength()) // Resize tiOrders if needed.
+ pInfo->tiOrders[nSeq].resize(pSndFile->Order.GetSequence(nSeq).GetLength(), NULL);
+ UINT imin = 0, imax = pSndFile->Order.GetSequence(nSeq).GetLastIndex();
+ const bool patNamesOnly = (hintFlagPart == HINT_PATNAMES);
+
+ //if (hintFlagPart == HINT_PATNAMES) && (dwHintParam < pSndFile->Order.size())) imin = imax = dwHintParam;
+ bool bEnded = false;
+ for (UINT iOrd=imin; iOrd<=imax; iOrd++)
+ {
+ if (pSndFile->Order.GetSequence(nSeq)[iOrd] == pSndFile->Order.GetInvalidPatIndex()) bEnded = true;
+ if (bEnded)
+ {
+ if (pInfo->tiOrders[nSeq][iOrd])
{
- wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] %d: %s" : "[%02d] %d: %s",
- iOrd, pSndFile->Order[iOrd], stmp);
+ DeleteItem(pInfo->tiOrders[nSeq][iOrd]);
+ pInfo->tiOrders[nSeq][iOrd] = NULL;
+ }
+ } else
+ {
+ if(patNamesOnly && pSndFile->Order.GetSequence(nSeq)[iOrd] != nPat)
+ continue;
+ UINT state = (iOrd == pInfo->nOrdSel && nSeq == pInfo->nSeqSel) ? TVIS_BOLD : 0;
+ if (pSndFile->Order.GetSequence(nSeq)[iOrd] < pSndFile->Patterns.Size())
+ {
+ stmp[0] = 0;
+ pSndFile->GetPatternName(pSndFile->Order.GetSequence(nSeq)[iOrd], stmp, sizeof(stmp));
+ if (stmp[0])
+ {
+ wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] %d: %s" : "[%02d] %d: %s",
+ iOrd, pSndFile->Order.GetSequence(nSeq)[iOrd], stmp);
+ } else
+ {
+ wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] Pattern %d" : "[%02d] Pattern %d",
+ iOrd, pSndFile->Order.GetSequence(nSeq)[iOrd]);
+ }
} else
{
- wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] Pattern %d" : "[%02d] Pattern %d",
- iOrd, pSndFile->Order[iOrd]);
+ wsprintf(s, "[%02d] Skip", iOrd);
}
- } else
- {
- wsprintf(s, "[%02d] Skip", iOrd);
+ if (pInfo->tiOrders[nSeq][iOrd])
+ {
+ tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_STATE;
+ tvi.state = 0;
+ tvi.stateMask = TVIS_BOLD;
+ tvi.hItem = pInfo->tiOrders[nSeq][iOrd];
+ tvi.pszText = stmp;
+ tvi.cchTextMax = sizeof(stmp);
+ GetItem(&tvi);
+ if ((strcmp(s, stmp)) || (tvi.state != state))
+ SetItem(pInfo->tiOrders[nSeq][iOrd], TVIF_TEXT | TVIF_STATE, s, 0, 0, state, TVIS_BOLD, 0);
+ } else
+ {
+ pInfo->tiOrders[nSeq][iOrd] = InsertItem(s, IMAGE_PARTITION, IMAGE_PARTITION, hAncestorNode, TVI_LAST);
+ }
}
- if (pInfo->tiOrders[iOrd])
- {
- tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_STATE;
- tvi.state = 0;
- tvi.stateMask = TVIS_BOLD;
- tvi.hItem = pInfo->tiOrders[iOrd];
- tvi.pszText = stmp;
- tvi.cchTextMax = sizeof(stmp);
- GetItem(&tvi);
- if ((strcmp(s, stmp)) || (tvi.state != state))
- SetItem(pInfo->tiOrders[iOrd], TVIF_TEXT | TVIF_STATE, s, 0, 0, state, TVIS_BOLD, 0);
- } else
- {
- pInfo->tiOrders[iOrd] = InsertItem(s, IMAGE_PARTITION, IMAGE_PARTITION, pInfo->hOrders, TVI_LAST);
- }
}
}
}
@@ -899,7 +952,7 @@
//-----------------------------------------
{
LPARAM lParam;
- HTREEITEM hItemParent, hRootParent;
+ HTREEITEM hItemParent, hItemParentParent, hRootParent;
if (!hItem) return 0;
// First, test root items
@@ -908,9 +961,10 @@
// Test DLS Banks
lParam = GetItemData(hItem);
hItemParent = GetParentItem(hItem);
+ hItemParentParent = GetParentItem(hItemParent);
hRootParent = hItemParent;
CModDoc *pModDoc = GetDocumentFromItem(hItem);
- CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
+ CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : nullptr;
if ((hRootParent != NULL) && (m_pDataTree))
{
HTREEITEM h;
@@ -971,13 +1025,29 @@
if (hItem == pSong->hSamples) return MODITEM_HDR_SAMPLES;
if (hItem == pSong->hInstruments) return MODITEM_HDR_INSTRUMENTS;
if (hItem == pSong->hComments) return MODITEM_COMMENTS;
- // Order List ?
- if (hItemParent == pSong->hOrders)
+ // Order List? (either "order list" or "sequence x" item as parent)
+ if ((hItemParent == pSong->hOrders && pSong->tiSequences.size() == 1) || (hItemParentParent == pSong->hOrders))
{
- ASSERT(pSong->tiOrders.size() == pSndFile->Order.size());
- for (UINT i=0; i<pSong->tiOrders.size(); i++)
+ // find sequence this item belongs to
+ for(SEQUENCEINDEX nSeq = 0; nSeq < pSong->tiOrders.size(); nSeq++)
{
- if (hItem == pSong->tiOrders[i]) return (MODITEM_ORDER | (i << 16));
+ ASSERT(pSong->tiOrders[nSeq].size() == pSndFile->Order.size());
+ for(ORDERINDEX nOrd = 0; nOrd < pSong->tiOrders[nSeq].size(); nOrd++)
+ {
+ if (hItem == pSong->tiOrders[nSeq][nOrd])
+ {
+ if(pSong->pModDoc->GetSoundFile() != nullptr)
+ {
+ pSong->pModDoc->GetSoundFile()->Order.SetSequence(nSeq);
+ // TODO this is buggy
+ //OnSelectSequence must be called? Or send a message?
+ }
+ //if(nSeq != pSong->nSeqSel) // sequence change
+ // return (MODITEM_ORDER_SEQUENCE | (nOrd << 16));
+ //else // same sequence
+ return (MODITEM_ORDER | (nOrd << 16));
+ }
+ }
}
}
// Pattern ?
@@ -1568,7 +1638,13 @@
|| (!lstrcmpi(s, ".dmf"))
|| (!lstrcmpi(s, ".mt2"))
|| (!lstrcmpi(s, ".med"))
- || (!lstrcmpi(s, ".wow")))))
+ || (!lstrcmpi(s, ".wow"))
+ || (!lstrcmpi(s, ".gdm"))
+ || (!lstrcmpi(s, ".imf"))
+#ifndef NO_MO3_SUPPORT
+ || (!lstrcmpi(s, ".mo3"))
+#endif
+ )))
{
if (m_pDataTree)
{
@@ -1910,10 +1986,12 @@
{
for (UINT i=0; i<MODTREE_MAX_DOCUMENTS; i++) if ((DocInfo[i]) && (DocInfo[i]->pModDoc == pModDoc))
{
- UINT nNewOrd = (pNotify) ? pNotify->nOrder : (UINT)-1;
- if (nNewOrd != DocInfo[i]->nOrdSel)
+ ORDERINDEX nNewOrd = (pNotify) ? pNotify->nOrder : ORDERINDEX_INVALID;
+ SEQUENCEINDEX nNewSeq = (pModDoc->GetSoundFile() != nullptr) ? pModDoc->GetSoundFile()->Order.GetCurrentSequenceIndex() : SEQUENCEINDEX_INVALID;
+ if (nNewOrd != DocInfo[i]->nOrdSel || nNewSeq != DocInfo[i]->nSeqSel)
{
DocInfo[i]->nOrdSel = nNewOrd;
+ DocInfo[i]->nSeqSel = nNewSeq;
UpdateView(i, HINT_MODSEQUENCE);
}
break;
Modified: trunk/OpenMPT/mptrack/View_tre.h
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.h 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/View_tre.h 2009-10-02 15:49:41 UTC (rev 384)
@@ -44,24 +44,32 @@
struct MODTREEDOCINFO
{
CModDoc *pModDoc;
- UINT nOrdSel;
+ SEQUENCEINDEX nSeqSel;
+ ORDERINDEX nOrdSel;
HTREEITEM hSong, hPatterns, hSamples, hInstruments, hComments, hOrders, hEffects;
vector<HTREEITEM> tiPatterns;
HTREEITEM tiSamples[MAX_SAMPLES];
HTREEITEM tiInstruments[MAX_INSTRUMENTS];
- vector<HTREEITEM> tiOrders;
+ vector<vector<HTREEITEM>> tiOrders;
+ vector<HTREEITEM> tiSequences;
HTREEITEM tiEffects[MAX_MIXPLUGINS];
MODTREEDOCINFO(const CSoundFile* const pSndFile)
{
pModDoc = NULL;
- nOrdSel = 0;
+ nSeqSel = SEQUENCEINDEX_INVALID;
+ nOrdSel = ORDERINDEX_INVALID;
hSong = hPatterns = hSamples = hInstruments = hComments = hOrders = hEffects = NULL;
if(pSndFile != NULL)
{
tiPatterns.resize(pSndFile->Patterns.Size(), NULL);
- tiOrders.resize(pSndFile->Order.GetLength(), NULL);
+ tiOrders.resize(pSndFile->Order.GetNumSequences());
+ for(SEQUENCEINDEX i = 0; i < tiOrders.size(); i++)
+ {
+ //tiOrders[i].resize(pSndFile->Order.GetSequence(i)->GetLength(), NULL);
+ }
+ tiSequences.resize(pSndFile->Order.GetNumSequences(), NULL);
}
memset(tiSamples, 0, sizeof(tiSamples));
memset(tiInstruments, 0, sizeof(tiInstruments));
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-10-02 15:49:41 UTC (rev 384)
@@ -13,7 +13,7 @@
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
-// German (Germany) resources
+// Deutsch (Deutschland) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
#ifdef _WIN32
@@ -55,12 +55,12 @@
END
#endif // APSTUDIO_INVOKED
-#endif // German (Germany) resources
+#endif // Deutsch (Deutschland) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
+// Englisch (USA) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
@@ -351,40 +351,41 @@
LTEXT "Song Message:",IDC_STATIC,4,2,76,8
END
-IDD_CONTROL_PATTERNS DIALOGEX 0, 0, 585, 156
+IDD_CONTROL_PATTERNS DIALOGEX 0, 0, 585, 114
STYLE DS_SETFONT | WS_CHILD
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
- CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,432,34,55,10
- COMBOBOX IDC_COMBO_INSTRUMENT,22,74,95,137,CBS_DROPDOWNLIST | WS_VSCROLL
- CTEXT "Row spacing",IDC_STATIC,172,32,54,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT_SPACING,225,32,28,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP
- CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,245,32,11,11
- PUSHBUTTON "<<",IDC_BUTTON2,2,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
- PUSHBUTTON ">>",IDC_BUTTON1,14,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
- CTEXT "Pattern name",IDC_STATIC,9,32,52,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT_PATTERNNAME,60,32,107,12,ES_AUTOHSCROLL
+ CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT,321,31,55,10
+ COMBOBOX IDC_COMBO_INSTRUMENT,19,61,96,137,CBS_DROPDOWNLIST | WS_VSCROLL
+ CTEXT "Row spacing",IDC_STATIC,171,32,42,8,SS_CENTERIMAGE
+ EDITTEXT IDC_EDIT_SPACING,219,30,28,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP
+ CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,239,30,11,11
+ PUSHBUTTON "<<",IDC_BUTTON2,3,84,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
+ PUSHBUTTON ">>",IDC_BUTTON1,15,84,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
+ CTEXT "Pattern name",IDC_STATIC,9,32,43,8,SS_CENTERIMAGE
+ EDITTEXT IDC_EDIT_PATTERNNAME,57,30,107,12,ES_AUTOHSCROLL
CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | 0x4d,2,4,372,18
- CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,9,74,9,12
- COMBOBOX IDC_COMBO_SPLITINSTRUMENT,209,74,95,125,CBS_DROPDOWNLIST | WS_VSCROLL
- COMBOBOX IDC_COMBO_SPLITNOTE,173,74,32,137,CBS_DROPDOWNLIST | WS_VSCROLL
- LTEXT "Note",IDC_STATIC,173,65,35,8
- LTEXT "Instrument",IDC_STATIC,209,65,58,8
- CONTROL "Transpose",IDC_PATTERN_OCTAVELINK,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,438,76,49,10
- COMBOBOX IDC_COMBO_OCTAVEMODIFIER,382,74,52,137,CBS_DROPDOWNLIST | WS_VSCROLL
- COMBOBOX IDC_COMBO_SPLITVOLUME,342,74,36,146,CBS_DROPDOWNLIST | WS_VSCROLL
- LTEXT "Volume",IDC_STATIC,342,65,25,8
- PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,122,74,33,13,0,WS_EX_STATICEDGE
- PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI2,308,74,30,13,0,WS_EX_STATICEDGE
- GROUPBOX "Main instrument",IDC_STATIC,2,53,160,40
- GROUPBOX "Keyboard Split",IDC_STATIC,167,53,328,40
- LTEXT "Octave shift",IDC_STATIC,382,65,52,8
- GROUPBOX "",IDC_STATIC,2,22,493,27
- CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,370,34,55,10
- EDITTEXT IDC_EDIT_ORDERLIST_MARGINS,2,113,28,12,ES_AUTOHSCROLL | ES_READONLY
- CONTROL "",IDC_SPIN_ORDERLIST_MARGINS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,15,118,11,11
- EDITTEXT IDC_EDIT_SEQUENCE_NAME,317,32,47,12,ES_AUTOHSCROLL
- CTEXT "Sequence name",IDC_STATIC_SEQUENCE_NAME,261,32,55,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
+ CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,7,61,11,12
+ COMBOBOX IDC_COMBO_SPLITINSTRUMENT,243,60,96,125,CBS_DROPDOWNLIST | WS_VSCROLL
+ COMBOBOX IDC_COMBO_SPLITNOTE,189,60,32,137,CBS_DROPDOWNLIST | WS_VSCROLL
+ LTEXT "Note",IDC_STATIC,171,62,16,8
+ LTEXT "Instr.",IDC_STATIC,225,62,16,8
+ CONTROL "Transpose",IDC_PATTERN_OCTAVELINK,"Button",BS_AUTOCHECKBOX | BS_FLAT,513,61,49,10
+ COMBOBOX IDC_COMBO_OCTAVEMODIFIER,465,60,44,137,CBS_DROPDOWNLIST | WS_VSCROLL
+ COMBOBOX IDC_COMBO_SPLITVOLUME,399,60,30,146,CBS_DROPDOWNLIST | WS_VSCROLL
+ LTEXT "Vol.",IDC_STATIC,381,62,13,8
+ PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,121,61,33,13,0,WS_EX_STATICEDGE
+ PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI2,345,60,30,13,0,WS_EX_STATICEDGE
+ GROUPBOX "Main instrument",IDC_STATIC,3,48,154,30
+ GROUPBOX "Keyboard Split",IDC_STATIC,165,48,402,30
+ LTEXT "Oct. shift",IDC_STATIC,435,62,29,8
+ GROUPBOX "",IDC_STATIC,3,22,376,24
+ CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,261,31,57,10
+ EDITTEXT IDC_EDIT_ORDERLIST_MARGINS,3,98,28,12,ES_AUTOHSCROLL | ES_READONLY
+ CONTROL "",IDC_SPIN_ORDERLIST_MARGINS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,16,103,11,11
+ EDITTEXT IDC_EDIT_SEQUENCE_NAME,453,30,108,12,ES_AUTOHSCROLL
+ CTEXT "Sequence name",IDC_STATIC_SEQUENCE_NAME,393,32,53,8,SS_CENTERIMAGE
+ GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,387,22,180,24
END
IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 544, 106
@@ -1428,7 +1429,7 @@
RIGHTMARGIN, 573
VERTGUIDE, 39
VERTGUIDE, 134
- BOTTOMMARGIN, 146
+ BOTTOMMARGIN, 104
HORZGUIDE, 37
HORZGUIDE, 61
HORZGUIDE, 73
@@ -2218,12 +2219,12 @@
"Removing unused patterns is not available when using multiple sequences."
END
-#endif // English (U.S.) resources
+#endif // Englisch (USA) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// English (U.K.) resources
+// Englisch (GB) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
#ifdef _WIN32
@@ -2592,7 +2593,7 @@
//
IDR_BUILTIN_TUNINGS TUNING "res\\built-inTunings.tc"
-#endif // English (U.K.) resources
+#endif // Englisch (GB) resources
/////////////////////////////////////////////////////////////////////////////
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-29 23:13:53 UTC (rev 383)
+++ trunk/OpenMPT/mptrack/resource.h 2009-10-02 15:49:41 UTC (rev 384)
@@ -889,6 +889,7 @@
#define IDC_SAVE_COLORSCHEME 2388
#define IDC_EDIT_SEQUENCE_NAME 2389
#define IDC_STATIC_SEQUENCE_NAME 2390
+#define IDC_STATIC_SEQUENCE_NAME_FRAME 2391
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1132,7 +1133,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59230
-#define _APS_NEXT_CONTROL_VALUE 2391
+#define _APS_NEXT_CONTROL_VALUE 2392
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-29 23:14:08
|
Revision: 383
http://modplug.svn.sourceforge.net/modplug/?rev=383&view=rev
Author: saga-games
Date: 2009-09-29 23:13:53 +0000 (Tue, 29 Sep 2009)
Log Message:
-----------
[Fix] Pattern Editor: Copying only the param column of PC notes overwrote the value column when pasting them
[Mod] Pattern Editor: When interpolating PC notes, the plugin number and note type won't get overriden if the note type is already PC or PCs. I find this more logical.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 22:30:10 UTC (rev 382)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 23:13:53 UTC (rev 383)
@@ -2349,7 +2349,7 @@
if(m[col].note == NOTE_PCS || m[col].note == NOTE_PC)
{
- if(s[8] != '.')
+ if(s[8] != '.' && s[8] > ' ')
{
char val[4];
memcpy(val, s+8, 3);
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-29 22:30:10 UTC (rev 382)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-29 23:13:53 UTC (rev 383)
@@ -2293,10 +2293,13 @@
case EFFECT_COLUMN:
if(doPCinterpolation)
{ // With PC/PCs notes, copy PCs note and plug index to all rows where
- // effect interpolation is done.
+ // effect interpolation is done, if no PC note is there.
const uint16 val = static_cast<uint16>(vsrc + ((vdest - vsrc) * (int)i + verr) / distance);
- pcmd->note = PCnote;
- pcmd->instr = PCinst;
+ if(pcmd->note != NOTE_PC && pcmd->note != NOTE_PCS)
+ {
+ pcmd->note = PCnote;
+ pcmd->instr = PCinst;
+ }
pcmd->SetValueVolCol(PCparam);
pcmd->SetValueEffectCol(val);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-29 22:30:25
|
Revision: 382
http://modplug.svn.sourceforge.net/modplug/?rev=382&view=rev
Author: saga-games
Date: 2009-09-29 22:30:10 +0000 (Tue, 29 Sep 2009)
Log Message:
-----------
[Imp] Mod Conversion: Detect and fix patterns with Bxx effect properly when merging sequences
[Fix] Pattern Editor: Entering Note Fade notes didn't work the "old style" way.
[Ref] Some minor code cleanup
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/soundlib/Load_gdm.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/patternContainer.cpp
trunk/OpenMPT/soundlib/patternContainer.h
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 22:30:10 UTC (rev 382)
@@ -104,11 +104,22 @@
// Merge multiple sequences
m_SndFile.Order.SetSequence(0);
m_SndFile.Order.resize(m_SndFile.Order.GetLengthTailTrimmed());
- SEQUENCEINDEX removedSequences = 0;
+ SEQUENCEINDEX removedSequences = 0; // sequence count
+ vector <SEQUENCEINDEX> patternsFixed; // pattern fixed by other sequence already?
+ patternsFixed.resize(m_SndFile.Patterns.Size(), SEQUENCEINDEX_INVALID);
+ // Set up vector
+ for(ORDERINDEX nOrd = 0; nOrd < m_SndFile.Order.GetLengthTailTrimmed(); nOrd++)
+ {
+ PATTERNINDEX nPat = m_SndFile.Order[nOrd];
+ if(!m_SndFile.Patterns.IsValidPat(nPat)) continue;
+ patternsFixed[nPat] = 0;
+ }
+
while(m_SndFile.Order.GetNumSequences() > 1)
{
removedSequences++;
- if(m_SndFile.Order.GetLengthTailTrimmed() + 1 + m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed() > m_SndFile.GetModSpecifications(nNewType).ordersMax)
+ const ORDERINDEX nFirstOrder = m_SndFile.Order.GetLengthTailTrimmed() + 1; // +1 for separator item
+ if(nFirstOrder + m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed() > m_SndFile.GetModSpecifications(nNewType).ordersMax)
{
wsprintf(s, "WARNING: Cannot merge Sequence %d (too long!)\n", removedSequences);
AddToLog(s);
@@ -118,7 +129,43 @@
m_SndFile.Order.Append(m_SndFile.Order.GetInvalidPatIndex()); // Separator item
for(ORDERINDEX nOrd = 0; nOrd < m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed(); nOrd++)
{
- m_SndFile.Order.Append(m_SndFile.Order.GetSequence(1)[nOrd]);
+ PATTERNINDEX nPat = m_SndFile.Order.GetSequence(1)[nOrd];
+ m_SndFile.Order.Append(nPat);
+
+ // Try to fix patterns (Bxx commands)
+ if(!m_SndFile.Patterns.IsValidPat(nPat)) continue;
+
+ MODCOMMAND *m = m_SndFile.Patterns[nPat];
+ for (UINT len = 0; len < m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; m++, len++)
+ {
+ if(m->command == CMD_POSITIONJUMP)
+ {
+ if(patternsFixed[nPat] != SEQUENCEINDEX_INVALID && patternsFixed[nPat] != removedSequences)
+ {
+ // Oops, some other sequence uses this pattern already.
+ const PATTERNINDEX nNewPat = m_SndFile.Patterns.Insert(m_SndFile.PatternSize[nPat]);
+ if(nNewPat != SEQUENCEINDEX_INVALID)
+ {
+ // could create new pattern - copy data over and continue from here.
+ m_SndFile.Order[nFirstOrder + nOrd] = nNewPat;
+ MODCOMMAND *pSrc = m_SndFile.Patterns[nPat];
+ MODCOMMAND *pDest = m_SndFile.Patterns[nNewPat];
+ memcpy(pDest, pSrc, m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels * sizeof(MODCOMMAND));
+ m = pDest + len;
+ patternsFixed.resize(max(nNewPat + 1, patternsFixed.size()), SEQUENCEINDEX_INVALID);
+ nPat = nNewPat;
+ } else
+ {
+ // cannot create new pattern: notify the user
+ wsprintf(s, "CONFLICT: Pattern break commands in Pattern %d might be broken since it has been used in several sequences!", nPat);
+ AddToLog(s);
+ }
+ }
+ m->param += nFirstOrder;
+ patternsFixed[nPat] = removedSequences;
+ }
+ }
+
}
m_SndFile.Order.RemoveSequence(1);
}
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-29 22:30:10 UTC (rev 382)
@@ -4180,7 +4180,7 @@
}
// -- old style note cut/off: erase instrument number
- if (oldStyle && ((p->note==NOTE_NOTECUT) || (p->note==NOTE_KEYOFF))) {
+ if (oldStyle && ((p->note == NOTE_NOTECUT) || (p->note == NOTE_KEYOFF) || (p->note == NOTE_FADE))) {
p->instr=0;
}
Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-09-29 22:30:10 UTC (rev 382)
@@ -96,7 +96,7 @@
// read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist
m_nChannels = 32;
- for(int i = 0; i < 32; i++)
+ for(CHANNELINDEX i = 0; i < 32; i++)
{
if(pHeader->PanMap[i] < 16)
{
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-29 22:30:10 UTC (rev 382)
@@ -847,7 +847,7 @@
DWORD length; // in bytes
DWORD loopStart; // in samples?
DWORD loopEnd; // in samples?
- CHAR finetune; // 0 ... 15 (useless?)
+ CHAR finetune; // 0 ... 15 (useless? also, why is this almost always 70?)
BYTE volume; // default volume
WORD c2freq;
};
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-29 22:30:10 UTC (rev 382)
@@ -1045,10 +1045,10 @@
}
-UINT CSoundFile::GetNumPatterns() const
+ORDERINDEX CSoundFile::GetNumPatterns() const
//-------------------------------------
{
- UINT i = 0;
+ ORDERINDEX i = 0;
while ((i < Order.size()) && (Order[i] < Order.GetInvalidPatIndex())) i++;
return i;
}
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-29 22:30:10 UTC (rev 382)
@@ -623,9 +623,9 @@
BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE);
UINT GetMasterVolume() const { return m_nMasterVolume; }
- UINT GetNumPatterns() const;
- UINT GetNumInstruments() const {return m_nInstruments;}
- UINT GetNumSamples() const { return m_nSamples; }
+ ORDERINDEX GetNumPatterns() const;
+ INSTRUMENTINDEX GetNumInstruments() const {return m_nInstruments;}
+ SAMPLEINDEX GetNumSamples() const { return m_nSamples; }
UINT GetCurrentPos() const;
UINT GetCurrentPattern() const { return m_nPattern; }
ORDERINDEX GetCurrentOrder() const { return static_cast<ORDERINDEX>(m_nCurrentPattern); }
Modified: trunk/OpenMPT/soundlib/patternContainer.cpp
===================================================================
--- trunk/OpenMPT/soundlib/patternContainer.cpp 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/soundlib/patternContainer.cpp 2009-09-29 22:30:10 UTC (rev 382)
@@ -5,14 +5,14 @@
#include "../mptrack/serialization_utils.h"
#include "../mptrack/version.h"
-int CPatternContainer::Insert(const ROWINDEX rows)
+PATTERNINDEX CPatternContainer::Insert(const ROWINDEX rows)
//---------------------------------------------
{
PATTERNINDEX i = 0;
for(i = 0; i<m_Patterns.size(); i++)
if(!m_Patterns[i]) break;
if(Insert(i, rows))
- return -1;
+ return PATTERNINDEX_INVALID;
else return i;
}
Modified: trunk/OpenMPT/soundlib/patternContainer.h
===================================================================
--- trunk/OpenMPT/soundlib/patternContainer.h 2009-09-29 12:43:52 UTC (rev 381)
+++ trunk/OpenMPT/soundlib/patternContainer.h 2009-09-29 22:30:10 UTC (rev 382)
@@ -38,9 +38,9 @@
//ignoring request.
bool Insert(const PATTERNINDEX index, const ROWINDEX rows);
- //Insert pattern to position with the lowest index, and return that index, -1
+ //Insert pattern to position with the lowest index, and return that index, PATTERNINDEX_INVALID
//on failure.
- int Insert(const ROWINDEX rows);
+ PATTERNINDEX Insert(const ROWINDEX rows);
//Remove pattern from given position. Currently it actually makes the pattern
//'invisible' - the pattern data is cleared but the actual pattern object won't get removed.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-29 13:27:55
|
Revision: 381
http://modplug.svn.sourceforge.net/modplug/?rev=381&view=rev
Author: saga-games
Date: 2009-09-29 12:43:52 +0000 (Tue, 29 Sep 2009)
Log Message:
-----------
[Imp] Mod Conversion: If possible, all MPTM sequences will be merged into the first seqeucne.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-27 19:55:54 UTC (rev 380)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 12:43:52 UTC (rev 381)
@@ -80,6 +80,7 @@
-User definable tunings.
-Extended pattern range
-Extended sequence
+ -Multiple sequences
Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats):
-plugs
@@ -100,6 +101,27 @@
-For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties()
*/
+ // Merge multiple sequences
+ m_SndFile.Order.SetSequence(0);
+ m_SndFile.Order.resize(m_SndFile.Order.GetLengthTailTrimmed());
+ SEQUENCEINDEX removedSequences = 0;
+ while(m_SndFile.Order.GetNumSequences() > 1)
+ {
+ removedSequences++;
+ if(m_SndFile.Order.GetLengthTailTrimmed() + 1 + m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed() > m_SndFile.GetModSpecifications(nNewType).ordersMax)
+ {
+ wsprintf(s, "WARNING: Cannot merge Sequence %d (too long!)\n", removedSequences);
+ AddToLog(s);
+ m_SndFile.Order.RemoveSequence(1);
+ continue;
+ }
+ m_SndFile.Order.Append(m_SndFile.Order.GetInvalidPatIndex()); // Separator item
+ for(ORDERINDEX nOrd = 0; nOrd < m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed(); nOrd++)
+ {
+ m_SndFile.Order.Append(m_SndFile.Order.GetSequence(1)[nOrd]);
+ }
+ m_SndFile.Order.RemoveSequence(1);
+ }
}
// Check if conversion to 64 rows is necessary
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-09-27 19:56:10
|
Revision: 380
http://modplug.svn.sourceforge.net/modplug/?rev=380&view=rev
Author: relabsoluness
Date: 2009-09-27 19:55:54 +0000 (Sun, 27 Sep 2009)
Log Message:
-----------
[Fix] MIDI mapping: Pattern record checkbox wasn't updated properly.
[Fix] Sample map: was broken when dealing with sample indexes greater than 255.
[Mod] Version: Changed version number.
[Ref] Minor code cleanup.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/dlg_misc.h
trunk/OpenMPT/mptrack/version.h
Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2009-09-27 19:55:54 UTC (rev 380)
@@ -134,8 +134,9 @@
if(i < 0 || (size_t)i >= m_rMIDIMapper.GetCount()) return;
m_Setting = m_rMIDIMapper.GetDirective(i);
CMIDIMappingDirective& activeSetting = m_Setting;
- CheckDlgButton(IDC_CHECKACTIVE, activeSetting.IsActive() ? MF_CHECKED : MF_UNCHECKED);
- CheckDlgButton(IDC_CHECKCAPTURE, activeSetting.GetCaptureMIDI() ? MF_CHECKED : MF_UNCHECKED);
+ CheckDlgButton(IDC_CHECKACTIVE, activeSetting.IsActive() ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(IDC_CHECKCAPTURE, activeSetting.GetCaptureMIDI() ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(IDC_CHECK_PATRECORD, activeSetting.GetAllowPatternEdit() ? BST_CHECKED : BST_UNCHECKED);
m_ChannelCBox.SetCurSel(activeSetting.GetChannel());
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-27 19:55:54 UTC (rev 380)
@@ -399,7 +399,7 @@
wsprintf(s, "Color%02d", ncol);
rgbCustomColors[ncol] = GetPrivateProfileDWord("Display", s, rgbCustomColors[ncol], iniFile);
}
- if(rgbCustomColors[MODCOLOR_SEPSHADOW] == rgbCustomColors[MODCOLOR_SEPFACE] == rgbCustomColors[MODCOLOR_SEPHILITE] == 0 && vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,02))
+ if(rgbCustomColors[MODCOLOR_SEPSHADOW] == rgbCustomColors[MODCOLOR_SEPFACE] == rgbCustomColors[MODCOLOR_SEPHILITE] == 0 && vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,03))
{
rgbCustomColors[MODCOLOR_SEPSHADOW] = GetSysColor(COLOR_BTNSHADOW);
rgbCustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE);
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-27 19:55:54 UTC (rev 380)
@@ -3159,7 +3159,7 @@
END_CRITICAL();
// set playback timer in the status bar
- SetElapsedTime(static_cast<ORDERINDEX>(nOrd), nRow, true);
+ SetElapsedTime(nOrd, nRow, true);
if (pModPlaying != this)
{
@@ -3214,7 +3214,7 @@
END_CRITICAL();
// set playback timer in the status bar
- SetElapsedTime(static_cast<ORDERINDEX>(nOrd), nRow, true);
+ SetElapsedTime(nOrd, nRow, true);
if (pModPlaying != this) {
pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977
@@ -3272,7 +3272,7 @@
END_CRITICAL();
// set playback timer in the status bar
- SetElapsedTime(static_cast<ORDERINDEX>(nOrd), nRow, true);
+ SetElapsedTime(nOrd, nRow, true);
if (pModPlaying != this) {
pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-27 19:55:54 UTC (rev 380)
@@ -2080,10 +2080,10 @@
{
UINT nDefault = 0;
BOOL bSep = FALSE;
- DWORD dwItemType, dwItemNo;
+ DWORD dwItemType;
dwItemType = GetModItem(hItem);
- dwItemNo = dwItemType >> 16;
+ const uint16 nItemNo = HIWORD(dwItemType);
dwItemType &= 0xFFFF;
SelectItem(hItem);
switch(dwItemType)
@@ -2111,7 +2111,7 @@
if ((pModDoc) && (!pModDoc->GetNumInstruments()))
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, (pModDoc->IsSampleMuted(dwItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Sample");
+ AppendMenu(hMenu, (pModDoc->IsSampleMuted(nItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Sample");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, "&Solo Sample");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, "&Unmute all");
}
@@ -2128,7 +2128,7 @@
if ((pModDoc) && (pModDoc->GetNumInstruments()))
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, (pModDoc->IsInstrumentMuted(dwItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Instrument");
+ AppendMenu(hMenu, (pModDoc->IsInstrumentMuted(nItemNo) ? MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Mute Instrument");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, "&Solo Instrument");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, "&Unmute all");
// -> CODE#0023
@@ -2149,7 +2149,7 @@
CModDoc *pModDoc = GetDocumentFromItem(hItem);
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
if (pSndFile) {
- PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[dwItemNo];
+ PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[nItemNo];
if (pPlugin) {
bool bypassed = ((pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS) != 0);
AppendMenu(hMenu, (bypassed?MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Bypass");
@@ -2490,29 +2490,29 @@
//-----------------------------
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType, dwItemNo;
+ DWORD dwItemType;
CModDoc *pModDoc;
dwItemType = GetModItem(hItem);
- dwItemNo = dwItemType >> 16;
+ const uint16 nItemNo = HIWORD(dwItemType);
dwItemType &= 0xFFFF;
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
if ((dwItemType == MODITEM_SAMPLE) && (!pModDoc->GetNumInstruments()))
{
- pModDoc->MuteSample(dwItemNo, (pModDoc->IsSampleMuted(dwItemNo)) ? FALSE : TRUE);
+ pModDoc->MuteSample(nItemNo, (pModDoc->IsSampleMuted(nItemNo)) ? FALSE : TRUE);
} else
if ((dwItemType == MODITEM_INSTRUMENT) && (pModDoc->GetNumInstruments()))
{
- pModDoc->MuteInstrument(dwItemNo, (pModDoc->IsInstrumentMuted(dwItemNo)) ? FALSE : TRUE);
+ pModDoc->MuteInstrument(nItemNo, (pModDoc->IsInstrumentMuted(nItemNo)) ? FALSE : TRUE);
}
if ((dwItemType == MODITEM_EFFECT))
{
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
if (pSndFile) {
- PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[dwItemNo];
+ PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[nItemNo];
if (pPlugin) {
CVstPlugin *pVstPlugin = (CVstPlugin *)pPlugin->pMixPlugin;
if (pVstPlugin) pVstPlugin->Bypass();
@@ -2528,11 +2528,11 @@
//-----------------------------
{
HTREEITEM hItem = GetSelectedItem();
- DWORD dwItemType, dwItemNo;
+ DWORD dwItemType;
CModDoc *pModDoc;
dwItemType = GetModItem(hItem);
- dwItemNo = dwItemType >> 16;
+ const uint16 nItemNo = HIWORD(dwItemType);
dwItemType &= 0xFFFF;
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
@@ -2541,16 +2541,16 @@
INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
if ((dwItemType == MODITEM_SAMPLE) && (!nInstruments))
{
- for (UINT i=1; i<=nSamples; i++)
+ for (SAMPLEINDEX i=1; i<=nSamples; i++)
{
- pModDoc->MuteSample(i, (i == dwItemNo) ? FALSE : TRUE);
+ pModDoc->MuteSample(i, (i == nItemNo) ? FALSE : TRUE);
}
} else
if ((dwItemType == MODITEM_INSTRUMENT) && (nInstruments))
{
- for (UINT i=1; i<=nInstruments; i++)
+ for (INSTRUMENTINDEX i=1; i<=nInstruments; i++)
{
- pModDoc->MuteInstrument(i, (i == dwItemNo) ? FALSE : TRUE);
+ pModDoc->MuteInstrument(i, (i == nItemNo) ? FALSE : TRUE);
}
}
}
@@ -2572,11 +2572,11 @@
INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
if ((dwItemType == MODITEM_SAMPLE) || (dwItemType == MODITEM_INSTRUMENT))
{
- for (UINT i=1; i<=nSamples; i++)
+ for (SAMPLEINDEX i=1; i<=nSamples; i++)
{
pModDoc->MuteSample(i, FALSE);
}
- for (UINT j=1; j<=nInstruments; j++)
+ for (INSTRUMENTINDEX j=1; j<=nInstruments; j++)
{
pModDoc->MuteInstrument(j, FALSE);
}
@@ -2623,14 +2623,14 @@
{
HTREEITEM hItem = GetSelectedItem();
DWORD dwItemType = GetModItem(hItem);
- DWORD dwItem = dwItemType >> 16;
+ const uint16 nItem = HIWORD(dwItemType);
dwItemType &= 0xFFFF;
CModDoc *pModDoc = GetDocumentFromItem(hItem);
CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
- if(pSndFile && dwItem){
+ if(pSndFile && nItem){
- if(pSndFile->m_szInstrumentPath[dwItem-1][0] == '\0'){
+ if(pSndFile->m_szInstrumentPath[nItem-1][0] == '\0'){
CHAR pszFileNames[_MAX_PATH];
CFileDialog dlg(FALSE, (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? "iti" : "xi", NULL,
@@ -2646,23 +2646,23 @@
dlg.m_ofn.lpstrFile = pszFileNames;
dlg.m_ofn.nMaxFile = _MAX_PATH;
- if(dlg.DoModal() == IDOK) strcpy(pSndFile->m_szInstrumentPath[dwItem-1], pszFileNames);
+ if(dlg.DoModal() == IDOK) strcpy(pSndFile->m_szInstrumentPath[nItem-1], pszFileNames);
dlg.m_ofn.lpstrFile = NULL;
dlg.m_ofn.nMaxFile = 0;
}
- if(pSndFile->m_szInstrumentPath[dwItem-1][0] != '\0'){
- int size = strlen(pSndFile->m_szInstrumentPath[dwItem-1]);
- BOOL iti = _stricmp(&pSndFile->m_szInstrumentPath[dwItem-1][size-3],"iti") == 0;
- BOOL xi = _stricmp(&pSndFile->m_szInstrumentPath[dwItem-1][size-2],"xi") == 0;
+ if(pSndFile->m_szInstrumentPath[nItem-1][0] != '\0'){
+ int size = strlen(pSndFile->m_szInstrumentPath[nItem-1]);
+ BOOL iti = _stricmp(&pSndFile->m_szInstrumentPath[nItem-1][size-3],"iti") == 0;
+ BOOL xi = _stricmp(&pSndFile->m_szInstrumentPath[nItem-1][size-2],"xi") == 0;
if(iti || (!iti && !xi && pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
- pSndFile->SaveITIInstrument(dwItem, pSndFile->m_szInstrumentPath[dwItem-1]);
+ pSndFile->SaveITIInstrument(nItem, pSndFile->m_szInstrumentPath[nItem-1]);
if(xi || (!xi && !iti && pSndFile->m_nType == MOD_TYPE_XM))
- pSndFile->SaveXIInstrument(dwItem, pSndFile->m_szInstrumentPath[dwItem-1]);
+ pSndFile->SaveXIInstrument(nItem, pSndFile->m_szInstrumentPath[nItem-1]);
- pSndFile->instrumentModified[dwItem-1] = FALSE;
+ pSndFile->instrumentModified[nItem-1] = FALSE;
}
if(pModDoc) pModDoc->UpdateAllViews(NULL, HINT_MODTYPE);
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-27 19:55:54 UTC (rev 380)
@@ -2787,7 +2787,7 @@
KeyboardMap[iNote] = pIns->Keyboard[iNote];
} else
{
- KeyboardMap[iNote] = (BYTE)nSample;
+ KeyboardMap[iNote] = (WORD)nSample;
}
/* rewbs.note: I don't think we need this with cust keys.
// -> CODE#0009
Modified: trunk/OpenMPT/mptrack/dlg_misc.h
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.h 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-09-27 19:55:54 UTC (rev 380)
@@ -535,7 +535,7 @@
CSliderCtrl m_SbOctave;
CSoundFile *m_pSndFile;
UINT m_nInstrument;
- BYTE KeyboardMap[NOTE_MAX];
+ WORD KeyboardMap[NOTE_MAX];
public:
CSampleMapDlg(CSoundFile *pSndFile, UINT nInstr, CWnd *parent=NULL):CDialog(IDD_EDITSAMPLEMAP, parent)
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2009-09-24 15:24:32 UTC (rev 379)
+++ trunk/OpenMPT/mptrack/version.h 2009-09-27 19:55:54 UTC (rev 380)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 17
#define VER_MINOR 03
-#define VER_MINORMINOR 02
+#define VER_MINORMINOR 03
//Creates version number from version parts that appears in version string.
//For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-24 15:24:42
|
Revision: 379
http://modplug.svn.sourceforge.net/modplug/?rev=379&view=rev
Author: saga-games
Date: 2009-09-24 15:24:32 +0000 (Thu, 24 Sep 2009)
Log Message:
-----------
[New] Can now import PSM16 files.
[Fix] Pattern editor: If the current pattern is the last possible pattern in the sequence, no "next pattern" is displayed
[Fix] Color Setup: When loading colour presets that have less colours are defined than required, the missing colours will be replaced by those from the "MPT" preset.
[Fix] IT Specs: As the last order in an IT file has to be "---", any other order item got overwritten when saving IT files with 256 orders. As a consequence, the maximum order count has been reduced by one.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-23 15:04:06 UTC (rev 378)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-24 15:24:32 UTC (rev 379)
@@ -616,6 +616,7 @@
const ORDERINDEX startOrder= static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER));
ORDERINDEX nNextOrder;
nNextOrder = pSndFile->Order.GetNextOrderIgnoringSkips(startOrder);
+ if(nNextOrder == startOrder) nNextOrder = ORDERINDEX_INVALID;
//Ignore skip items(+++) from sequence.
const ORDERINDEX ordCount = pSndFile->Order.GetLength();
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-23 15:04:06 UTC (rev 378)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-24 15:24:32 UTC (rev 379)
@@ -590,6 +590,8 @@
TCHAR sFilename[MAX_PATH];
strcpy(sFilename, dlg.GetPathName());
+ // Ensure that all colours are reset (for outdated colour schemes)
+ OnPresetMPT();
for(int i = 0; i < MAX_MODCOLORS; i++)
{
TCHAR sKeyName[16];
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-23 15:04:06 UTC (rev 378)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-24 15:24:32 UTC (rev 379)
@@ -1,5 +1,5 @@
/*
- * Purpose: Load new PSM (ProTracker Studio) modules
+ * Purpose: Load PSM16 and new PSM (ProTracker Studio) modules
* Authors: Johannes Schultz
*
* This is partly based on http://www.shikadi.net/moddingwiki/ProTracker_Studio_Module
@@ -7,11 +7,11 @@
* gave me a few clues. :)
*
* What's playing?
- * - Epic Pinball - Perfect! (the old tunes in PSM16 format are not supported)
+ * - Epic Pinball - Perfect! (I don't have an old version with the PSM16 tunes to compare, though - some of them differ from the new PSM tunes)
* - Extreme Pinball - Perfect! (subtunes included!)
* - Jazz Jackrabbit - Perfect!
* - One Must Fall! - Perfect! (it helped a lot to have the original MTM files...)
- * - Silverball - Currently not supported (old PSM16 format)
+ * - Silverball - Seems to work (I don't have all tables so I can't compare)
* - Sinaria - Seems to work (never played the game, so I can't really tell...)
*
* Effect conversion should be about right...
@@ -23,7 +23,14 @@
#pragma pack(1)
-struct PSMHEADER
+////////////////////////////////////////////////////////////
+//
+// New PSM support starts here. PSM16 structs are below.
+//
+
+
+
+struct PSMNEWHEADER
{
DWORD formatID; // "PSM " (new format)
DWORD fileSize; // Filesize - 12
@@ -98,6 +105,7 @@
// Portamento effect conversion (depending on format version)
inline BYTE convert_psm_porta(BYTE param, bool bNewFormat)
+//--------------------------------------------------------
{
return ((bNewFormat) ? (param) : ((param < 4) ? (param | 0xF0) : (param >> 2)));
}
@@ -111,12 +119,16 @@
DWORD dwMemPos = 0;
bool bNewFormat = false; // The game "Sinaria" uses a slightly modified PSM structure
- ASSERT_CAN_READ(12);
- PSMHEADER shdr;
- memcpy(&shdr, lpStream, sizeof(PSMHEADER));
- if(LittleEndian(shdr.formatID) != 0x204d5350 // "PSM "
- || LittleEndian(shdr.fileSize) != dwMemLength - 12
- || LittleEndian(shdr.fileInfoID) != 0x454C4946 // "FILE"
+ ASSERT_CAN_READ(sizeof(PSMNEWHEADER));
+ PSMNEWHEADER *shdr = (PSMNEWHEADER *)lpStream;
+
+ if(LittleEndian(shdr->formatID) == 0xFE4D5350) // "PSM\xFE" - PSM16 format
+ return ReadPSM16(lpStream, dwMemLength);
+
+ // Check header
+ if(LittleEndian(shdr->formatID) != 0x204D5350 // "PSM "
+ || LittleEndian(shdr->fileSize) != dwMemLength - 12
+ || LittleEndian(shdr->fileInfoID) != 0x454C4946 // "FILE"
) return false;
// Yep, this seems to be a valid file.
@@ -727,7 +739,6 @@
dwRowOffset += 2;
}
-
}
row_data += m_nChannels;
@@ -791,3 +802,399 @@
#undef ASSERT_CAN_READ
}
+
+////////////////////////////////
+//
+// PSM16 support starts here.
+//
+
+#pragma pack(1)
+
+struct PSM16HEADER
+{
+ DWORD formatID; // "PSM\xFE" (PSM16)
+ CHAR songName[59]; // Song title, padded with nulls
+ BYTE lineEnd; // $1A
+ BYTE songType; // Song Type bitfield
+ BYTE formatVersion; // $10
+ BYTE patternVersion; // 0 or 1
+ BYTE songSpeed; //
+ BYTE songTempo; // 32 ... 255
+ BYTE masterVolume; // 0 ... 255
+ WORD songLength; // 0 ... 255 (number of patterns to play in the song)
+ WORD songOrders; // 0 ... 255 (same as previous value as no subsongs are present)
+ WORD numPatterns; // 1 ... 255
+ WORD numSamples; // 1 ... 255
+ WORD numChannelsPlay; // 0 ... 32 (max. number of channels to play)
+ WORD numChannelsReal; // 0 ... 32 (max. number of channels to process)
+ DWORD orderOffset;
+ DWORD panOffset;
+ DWORD patOffset;
+ DWORD smpOffset;
+ DWORD commentsOffset;
+ DWORD patSize; // Size of all patterns
+ CHAR filler[40];
+};
+
+struct PSM16SMPHEADER
+{
+ CHAR filename[13]; // null-terminated
+ CHAR name[24]; // dito
+ DWORD offset; // in file
+ DWORD memoffset; // not used
+ WORD sampleNumber; // 1 ... 255
+ BYTE flags; // sample flag bitfield
+ DWORD length; // in bytes
+ DWORD loopStart; // in samples?
+ DWORD loopEnd; // in samples?
+ CHAR finetune; // 0 ... 15 (useless?)
+ BYTE volume; // default volume
+ WORD c2freq;
+};
+
+struct PSM16PATHEADER
+{
+ WORD size; // includes header bytes
+ BYTE numRows; // 1 ... 64
+ BYTE numChans; // 1 ... 31
+};
+
+#pragma pack()
+
+
+bool CSoundFile::ReadPSM16(const LPCBYTE lpStream, const DWORD dwMemLength)
+//-----------------------------------------------------------------------
+{
+ #define ASSERT_CAN_READ(x) \
+ if( dwMemPos > dwMemLength || x > dwMemLength - dwMemPos ) return false;
+
+ DWORD dwMemPos = 0;
+
+ ASSERT_CAN_READ(sizeof(PSM16HEADER));
+ PSM16HEADER *shdr = (PSM16HEADER *)lpStream;
+
+ // Check header
+ if((LittleEndian(shdr->formatID) != 0xFE4D5350) // "PSM\xFE"
+ || (shdr->lineEnd != 0x1A)
+ || (shdr->formatVersion != 0x10 && shdr->formatVersion != 0x01) // why is this sometimes 0x01?
+ || (shdr->patternVersion != 0) // 255ch pattern version not supported (did anyone use this?)
+ || ((shdr->songType & 3) != 0)
+ || (min(shdr->numChannelsPlay, shdr->numChannelsReal) == 0)
+ ) return false;
+
+ // Seems to be valid!
+
+ m_nType = MOD_TYPE_S3M;
+ m_nChannels = max(shdr->numChannelsPlay, shdr->numChannelsReal);
+ m_nMasterVolume = shdr->masterVolume;
+ m_nDefaultGlobalVolume = 256;
+ m_nDefaultSpeed = shdr->songSpeed;
+ m_nDefaultTempo = shdr->songTempo;
+
+ memset(m_szNames, 0, sizeof(m_szNames));
+ memcpy(m_szNames[0], shdr->songName, 31);
+ m_szNames[0][31] = 0;
+
+ // Read orders
+ dwMemPos = LittleEndian(shdr->orderOffset);
+ ASSERT_CAN_READ((DWORD)LittleEndianW(shdr->songOrders) + 2);
+ if(LittleEndian(shdr->orderOffset) > 4 && LittleEndian(*(DWORD *)(lpStream + dwMemPos - 4)) == 0x44524f50) // PORD
+ {
+ Order.ReadAsByte(lpStream + dwMemPos, LittleEndianW(shdr->songOrders), dwMemLength - dwMemPos);
+ }
+
+ // Read pan positions
+ dwMemPos = LittleEndian(shdr->panOffset);
+ ASSERT_CAN_READ(32);
+ if(LittleEndian(shdr->panOffset) > 4 && LittleEndian(*(DWORD *)(lpStream + dwMemPos - 4)) == 0x4E415050) // PPAN
+ {
+ for(CHANNELINDEX i = 0; i < 32; i++)
+ {
+ ChnSettings[i].nPan = lpStream[dwMemPos + i] << 4;
+ ChnSettings[i].nVolume = 64;
+ ChnSettings[i].dwFlags = (i >= shdr->numChannelsPlay) ? CHN_MUTE : 0;
+ }
+ }
+
+ // Read samples
+ dwMemPos = LittleEndian(shdr->smpOffset);
+ ASSERT_CAN_READ(0);
+ if(LittleEndian(shdr->smpOffset) > 4 && LittleEndian(*(DWORD *)(lpStream + dwMemPos - 4)) == 0x48415350) // PSAH
+ {
+ SAMPLEINDEX iSmpCount = 0;
+ m_nSamples = LittleEndianW(shdr->numSamples);
+ while(iSmpCount < LittleEndianW(shdr->numSamples))
+ {
+ ASSERT_CAN_READ(sizeof(PSM16SMPHEADER));
+ PSM16SMPHEADER *smphdr = (PSM16SMPHEADER *)(lpStream + dwMemPos);
+ dwMemPos += sizeof(PSM16SMPHEADER);
+
+ SAMPLEINDEX iSmp = LittleEndianW(smphdr->sampleNumber);
+ m_nSamples = max(m_nSamples, iSmp);
+
+ memcpy(m_szNames[iSmp], smphdr->name, 24);
+ m_szNames[iSmp][24] = 0;
+ memcpy(Samples[iSmp].filename, smphdr->filename, 13);
+ Samples[iSmp].filename[13] = 0;
+
+ Samples[iSmp].nLength = LittleEndian(smphdr->length);
+ Samples[iSmp].nLoopStart = LittleEndian(smphdr->loopStart);
+ Samples[iSmp].nLoopEnd = LittleEndian(smphdr->loopEnd);
+ Samples[iSmp].nC5Speed = LittleEndianW(smphdr->c2freq);
+ Samples[iSmp].nVolume = smphdr->volume << 2;
+ Samples[iSmp].nGlobalVol = 256;
+
+ UINT iSampleFormat = RS_PCM8S;
+ if(smphdr->flags & 0x04) // 16-Bit
+ {
+ Samples[iSmp].uFlags |= CHN_16BIT;
+ Samples[iSmp].nLength >>= 1;
+ iSampleFormat = RS_PCM16S;
+ }
+ if(smphdr->flags & 0x08) // Signed/Unsigned
+ {
+ if(Samples[iSmp].uFlags & CHN_16BIT)
+ iSampleFormat = RS_PCM16U;
+ else
+ iSampleFormat = RS_PCM8U;
+ }
+ if(smphdr->flags & 0x10) // Delta/Raw
+ {
+ if(Samples[iSmp].uFlags & CHN_16BIT)
+ iSampleFormat = RS_PCM16D;
+ else
+ iSampleFormat = RS_PCM8D;
+ }
+ if(smphdr->flags & 0x20) // Bidi Loop
+ {
+ Samples[iSmp].uFlags |= CHN_PINGPONGLOOP;
+ }
+ if(smphdr->flags & 0x80) // Loop
+ {
+ Samples[iSmp].uFlags |= CHN_LOOP;
+ }
+ if((smphdr->flags & 0x7F) == 0)
+ iSampleFormat = RS_PCM8D;
+
+ ReadSample(&Samples[iSmp], iSampleFormat, reinterpret_cast<LPCSTR>(lpStream + LittleEndianW(smphdr->offset)), dwMemLength - LittleEndianW(smphdr->offset));
+
+ iSmpCount++;
+ }
+ }
+
+ // Read patterns
+ dwMemPos = LittleEndian(shdr->patOffset);
+ ASSERT_CAN_READ(LittleEndian(shdr->patSize));
+ if(LittleEndian(shdr->patOffset) > 4 && LittleEndian(*(DWORD *)(lpStream + dwMemPos - 4)) == 0x54415050) // PPAT
+ {
+ DWORD dwPatEndPos = LittleEndian(shdr->patOffset) + LittleEndian(shdr->patSize);
+
+ for(PATTERNINDEX nPat = 0; nPat < LittleEndianW(shdr->numPatterns); nPat++)
+ {
+ ASSERT_CAN_READ(sizeof(PSM16PATHEADER));
+ PSM16PATHEADER *phdr = (PSM16PATHEADER *)(lpStream + dwMemPos);
+ ASSERT_CAN_READ(LittleEndianW(phdr->size));
+
+ DWORD dwNextPattern = dwMemPos + ((LittleEndianW(phdr->size) + 15) & ~15);
+ dwMemPos += sizeof(PSM16PATHEADER);
+
+ if(Patterns.Insert(nPat, phdr->numRows))
+ {
+ CString s;
+ s.Format(TEXT("Allocating patterns failed starting from pattern %u"), nPat);
+ MessageBox(NULL, s, TEXT("OpenMPT PSM16 import"), MB_ICONERROR);
+ break;
+ }
+
+ MODCOMMAND *row_data;
+ ROWINDEX iRow = 0;
+
+ while(dwMemPos < dwNextPattern && iRow < phdr->numRows)
+ {
+ ASSERT_CAN_READ(1);
+ BYTE bChnFlag = lpStream[dwMemPos++];
+ if(bChnFlag == 0)
+ {
+ iRow++;
+ continue;
+ }
+
+ row_data = Patterns[nPat] + iRow * m_nChannels + min(bChnFlag & 0x1F, m_nChannels - 1);
+
+ if(bChnFlag & 0x80)
+ {
+ // note + instr present
+ ASSERT_CAN_READ(2);
+ row_data->note = lpStream[dwMemPos++] + 37;
+ row_data->instr = lpStream[dwMemPos++];
+ }
+ if(bChnFlag & 0x40)
+ {
+ // volume present
+ ASSERT_CAN_READ(1);
+ row_data->volcmd = VOLCMD_VOLUME;
+ row_data->vol = lpStream[dwMemPos++];
+ }
+ if(bChnFlag & 0x20)
+ {
+ // effect present - convert
+ ASSERT_CAN_READ(2);
+ BYTE command = lpStream[dwMemPos++], param = lpStream[dwMemPos++];
+
+ switch(command)
+ {
+ // Volslides
+ case 0x01: // fine volslide up
+ command = CMD_VOLUMESLIDE;
+ param = (param << 4) | 0x0F;
+ break;
+ case 0x02: // volslide up
+ command = CMD_VOLUMESLIDE;
+ param = (param << 4) & 0xF0;
+ break;
+ case 0x03: // fine voslide down
+ command = CMD_VOLUMESLIDE;
+ param = 0xF0 | param;
+ break;
+ case 0x04: // volslide down
+ command = CMD_VOLUMESLIDE;
+ param = param & 0x0F;
+ break;
+
+ // Portamento
+ case 0x0A: // fine portamento up
+ command = CMD_PORTAMENTOUP;
+ param |= 0xF0;
+ break;
+ case 0x0B: // portamento down
+ command = CMD_PORTAMENTOUP;
+ break;
+ case 0x0C: // fine portamento down
+ command = CMD_PORTAMENTODOWN;
+ param |= 0xF0;
+ break;
+ case 0x0D: // portamento down
+ command = CMD_PORTAMENTODOWN;
+ break;
+ case 0x0E: // tone portamento
+ command = CMD_TONEPORTAMENTO;
+ break;
+ case 0x0F: // glissando control
+ command = CMD_S3MCMDEX;
+ param |= 0x10;
+ break;
+ case 0x10: // tone portamento + volslide up
+ command = CMD_TONEPORTAVOL;
+ param <<= 4;
+ break;
+ case 0x11: // tone portamento + volslide down
+ command = CMD_TONEPORTAVOL;
+ param &= 0x0F;
+ break;
+
+ // Vibrato
+ case 0x14: // vibrato
+ command = CMD_VIBRATO;
+ break;
+ case 0x15: // vibrato waveform
+ command = CMD_S3MCMDEX;
+ param |= 0x30;
+ break;
+ case 0x16: // vibrato + volslide up
+ command = CMD_VIBRATOVOL;
+ param <<= 4;
+ break;
+ case 0x17: // vibrato + volslide down
+ command = CMD_VIBRATOVOL;
+ param &= 0x0F;
+ break;
+
+ // Tremolo
+ case 0x1E: // tremolo
+ command = CMD_TREMOLO;
+ break;
+ case 0x1F: // tremolo waveform
+ command = CMD_S3MCMDEX;
+ param |= 0x40;
+ break;
+
+ // Sample commands
+ case 0x28: // 3-byte offset - we only support the middle byte.
+ ASSERT_CAN_READ(2);
+ command = CMD_OFFSET;
+ param = lpStream[dwMemPos++];
+ dwMemPos++;
+ break;
+ case 0x29: // retrigger
+ command = CMD_RETRIG;
+ param &= 0x0F;
+ break;
+ case 0x2A: // note cut
+ command = CMD_S3MCMDEX;
+ param |= 0xC0;
+ break;
+ case 0x2B: // note delay
+ command = CMD_S3MCMDEX;
+ param |= 0xD0;
+ break;
+
+ // Position change
+ case 0x32: // position jump
+ command = CMD_POSITIONJUMP;
+ break;
+ case 0x33: // pattern break
+ command = CMD_PATTERNBREAK;
+ break;
+ case 0x34: // loop pattern
+ command = CMD_S3MCMDEX;
+ param |= 0xB0;
+ break;
+ case 0x35: // pattern delay
+ command = CMD_S3MCMDEX;
+ param |= 0xE0;
+ break;
+
+ // speed change
+ case 0x3C: // set speed
+ command = CMD_SPEED;
+ break;
+ case 0x3D: // set tempo
+ command = CMD_TEMPO;
+ break;
+
+ // misc commands
+ case 0x46: // arpeggio
+ command = CMD_ARPEGGIO;
+ break;
+ case 0x47: // set finetune
+ command = CMD_S3MCMDEX;
+ param |= 0x20;
+ break;
+ case 0x48: // set balance (panning?)
+ command = CMD_PANNING8;
+ param = (param << 4) + 8;
+ break;
+
+ default:
+ command = CMD_NONE;
+ break;
+ }
+
+ row_data->command = command;
+ row_data->param = param;
+ }
+ }
+ // Pattern break for short patterns (so saving the modules as S3M won't break it)
+ if(phdr->numRows != 64)
+ TryWriteEffect(nPat, phdr->numRows - 1, CMD_PATTERNBREAK, 0, false, CHANNELINDEX_INVALID, false, false);
+
+ dwMemPos = dwNextPattern;
+ if(dwMemPos > dwPatEndPos) break;
+ }
+ }
+
+ return true;
+
+ #undef ASSERT_CAN_READ
+
+}
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-23 15:04:06 UTC (rev 378)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-24 15:24:32 UTC (rev 379)
@@ -698,6 +698,7 @@
bool ReadAMF(LPCBYTE lpStream, const DWORD dwMemLength);
bool ReadMT2(LPCBYTE lpStream, DWORD dwMemLength);
bool ReadPSM(LPCBYTE lpStream, DWORD dwMemLength);
+ bool ReadPSM16(LPCBYTE lpStream, DWORD dwMemLength);
bool ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength);
bool ReadUMX(LPCBYTE lpStream, DWORD dwMemLength);
bool ReadMO3(LPCBYTE lpStream, const DWORD dwMemLength);
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-23 15:04:06 UTC (rev 378)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-24 15:24:32 UTC (rev 379)
@@ -286,7 +286,7 @@
true, //Has noteoff.
true, //Has notefade.
240, //Pattern max.
- 256, //Order max.
+ 255, //Order max.
1, //Channel min
127, //Channel max
32, //Min tempo
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-23 15:04:17
|
Revision: 378
http://modplug.svn.sourceforge.net/modplug/?rev=378&view=rev
Author: saga-games
Date: 2009-09-23 15:04:06 +0000 (Wed, 23 Sep 2009)
Log Message:
-----------
[New] Colour setup: Can now specify the blend colour for prev/next patterns.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-23 11:57:10 UTC (rev 377)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-23 15:04:06 UTC (rev 378)
@@ -131,7 +131,7 @@
b = hilightcolor(GetBValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKHILIGHT]),
GetBValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKNORMAL]));
m_Dib.SetColor(MODCOLOR_2NDHIGHLIGHT, RGB(r,g,b));
- m_Dib.SetBlendColor(GetSysColor(COLOR_BTNFACE));
+ m_Dib.SetBlendColor(CMainFrame::rgbCustomColors[MODCOLOR_BLENDCOLOR]);
}
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-23 11:57:10 UTC (rev 377)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-23 15:04:06 UTC (rev 378)
@@ -257,6 +257,8 @@
0x00FF00, 0x00FFFF, 0x0000FF,
// Channel separators
GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNFACE), GetSysColor(COLOR_BTNHIGHLIGHT),
+ // Blend colour
+ GetSysColor(COLOR_BTNFACE),
};
// Directory Arrays (Default + Last)
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-23 11:57:10 UTC (rev 377)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-23 15:04:06 UTC (rev 378)
@@ -160,6 +160,7 @@
MODCOLOR_SEPSHADOW,
MODCOLOR_SEPFACE,
MODCOLOR_SEPHILITE,
+ MODCOLOR_BLENDCOLOR,
MAX_MODCOLORS,
// Internal color codes
MODCOLOR_2NDHIGHLIGHT,
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-23 11:57:10 UTC (rev 377)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-23 15:04:06 UTC (rev 378)
@@ -106,6 +106,7 @@
{"Note Highlight", 0, MODCOLOR_NOTE, MODCOLOR_INSTRUMENT, MODCOLOR_VOLUME, "Note:", "Instrument:", "Volume:"},
{"Effect Highlight",0, MODCOLOR_PANNING, MODCOLOR_PITCH, MODCOLOR_GLOBALS, "Panning Effects:", "Pitch Effects:", "Global Effects:"},
{"Channel Separator",0, MODCOLOR_SEPSHADOW, MODCOLOR_SEPFACE, MODCOLOR_SEPHILITE, "Shadow:", "Face:", "Highlight:"},
+ {"Next/Prev Pattern",0, MODCOLOR_BLENDCOLOR, 0, 0, "Blend color:", NULL, NULL},
{"Sample Editor", 1, MODCOLOR_SAMPLE, 0, 0, "Sample Data:", NULL, NULL},
{"Instrument Editor",2, MODCOLOR_ENVELOPES, 0, 0, "Envelopes:", NULL, NULL},
{"VU-Meters", 0, MODCOLOR_VUMETER_HI, MODCOLOR_VUMETER_MED, MODCOLOR_VUMETER_LO, "Hi:", "Med:", "Lo:"}
@@ -487,6 +488,7 @@
CustomColors[MODCOLOR_SEPSHADOW] = GetSysColor(COLOR_BTNSHADOW);
CustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE);
CustomColors[MODCOLOR_SEPHILITE] = GetSysColor(COLOR_BTNHIGHLIGHT);
+ CustomColors[MODCOLOR_BLENDCOLOR] = GetSysColor(COLOR_BTNFACE);
OnPreviewChanged();
}
@@ -514,6 +516,7 @@
CustomColors[MODCOLOR_SEPSHADOW] = RGB(0x18, 0x28, 0x2C);
CustomColors[MODCOLOR_SEPFACE] = RGB(0x49, 0x75, 0x82);
CustomColors[MODCOLOR_SEPHILITE] = RGB(0x8A, 0xDB, 0xF3);
+ CustomColors[MODCOLOR_BLENDCOLOR] = RGB(0x27, 0x41, 0x47);
OnPreviewChanged();
}
@@ -541,6 +544,7 @@
CustomColors[MODCOLOR_SEPSHADOW] = RGB(0xB6, 0x96, 0x79);
CustomColors[MODCOLOR_SEPFACE] = RGB(0xB6, 0x96, 0x79);
CustomColors[MODCOLOR_SEPHILITE] = RGB(0xB6, 0x96, 0x79);
+ CustomColors[MODCOLOR_BLENDCOLOR] = RGB(0x35, 0x27, 0x24);
OnPreviewChanged();
}
@@ -568,6 +572,7 @@
CustomColors[MODCOLOR_SEPSHADOW] = RGB(0x80, 0x80, 0x80);
CustomColors[MODCOLOR_SEPFACE] = RGB(0xD4, 0xD0, 0xC8);
CustomColors[MODCOLOR_SEPHILITE] = RGB(0xFF, 0xFF, 0xFF);
+ CustomColors[MODCOLOR_BLENDCOLOR] = 0x00d0dbe1;
OnPreviewChanged();
}
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-23 11:57:10 UTC (rev 377)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-23 15:04:06 UTC (rev 378)
@@ -2193,7 +2193,7 @@
m_CbnMacroCC.ShowWindow(TRUE);
m_CbnMacroPlug.ShowWindow(FALSE);
m_CbnMacroPlug.ShowWindow(FALSE);
- SetDlgItemText(IDC_GENMACROLABEL, "Midi CC");
+ SetDlgItemText(IDC_GENMACROLABEL, "MIDI CC");
m_CbnMacroCC.SetCurSel(m_pModDoc->MacroToMidiCC(&(m_MidiCfg.szMidiSFXExt[sfx*32])));
} else {
m_CbnMacroCC.EnableWindow(FALSE);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-23 11:57:27
|
Revision: 377
http://modplug.svn.sourceforge.net/modplug/?rev=377&view=rev
Author: saga-games
Date: 2009-09-23 11:57:10 +0000 (Wed, 23 Sep 2009)
Log Message:
-----------
[New] Pattern Editor: Sticky channels that always remain on the left side of the pattern editor. Still very buggy and a lot has to be done. Help is appreciated.
Modified Paths:
--------------
branches/devBranch_1_17_04/mptrack/Draw_pat.cpp
branches/devBranch_1_17_04/mptrack/View_pat.cpp
branches/devBranch_1_17_04/mptrack/View_pat.h
branches/devBranch_1_17_04/mptrack/resource.h
branches/devBranch_1_17_04/soundlib/Sndfile.cpp
branches/devBranch_1_17_04/soundlib/Sndfile.h
Modified: branches/devBranch_1_17_04/mptrack/Draw_pat.cpp
===================================================================
--- branches/devBranch_1_17_04/mptrack/Draw_pat.cpp 2009-09-23 11:51:18 UTC (rev 376)
+++ branches/devBranch_1_17_04/mptrack/Draw_pat.cpp 2009-09-23 11:57:10 UTC (rev 377)
@@ -446,16 +446,24 @@
HDC hdc;
UINT xofs, yofs, nColumnWidth, ncols, nrows, ncolhdr;
int xpaint, ypaint, mixPlug;
+ static CHANNELINDEX nOldChannels;
+ if ((pModDoc = GetDocument()) == nullptr) return;
+ pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile != nullptr && nOldChannels != pSndFile->m_nChannels)
+ {
+ // number of channels changed -> recalc
+ ResetStickyChannels();
+ nOldChannels = pSndFile->m_nChannels;
+ }
+
ASSERT(pDC);
UpdateSizes();
- if ((pModDoc = GetDocument()) == NULL) return;
GetClientRect(&rcClient);
hdc = pDC->m_hDC;
oldpen = ::SelectObject(hdc, CMainFrame::penDarkGray);
xofs = GetXScrollPos();
yofs = GetYScrollPos();
- pSndFile = pModDoc->GetSoundFile();
nColumnWidth = m_szCell.cx;
nrows = (pSndFile->Patterns[m_nPattern]) ? pSndFile->PatternSize[m_nPattern] : 0;
ncols = pSndFile->GetNumChannels();
@@ -475,16 +483,22 @@
rect.SetRect(xpaint, ypaint, xpaint+nColumnWidth, ypaint + m_szHeader.cy);
if (ncolhdr < ncols)
{
+ CHANNELINDEX nRealChannel;
+ if(ncolhdr - xofs < m_nStickyChannelCount) // sticky channel
+ nRealChannel = m_nChannelOrder[ncolhdr - xofs];
+ else
+ nRealChannel = m_nChannelOrder[ncolhdr]; // normal channel
+ ASSERT(nRealChannel < MAX_BASECHANNELS);
// -> CODE#0012
// -> DESC="midi keyboard split"
- const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]? "[Channel %d]" : "Channel %d";
+ const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[nRealChannel]? "[Channel %d]" : "Channel %d";
// const char *pszfmt = pModDoc->IsChannelRecord(ncolhdr) ? "Channel %d " : "Channel %d";
// -! NEW_FEATURE#0012
- if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] >= 0x20))
- pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"%d: [%s]":"%d: %s";
- else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Ch%d]":"Ch%d";
- else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Chn %d]":"Chn %d";
- wsprintf(s, pszfmt, ncolhdr+1, pSndFile->ChnSettings[ncolhdr].szName);
+ if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[nRealChannel].szName[0] >= 0x20))
+ pszfmt = pSndFile->m_bChannelMuteTogglePending[nRealChannel]?"%d: [%s]":"%d: %s";
+ else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[nRealChannel]?"[Ch%d]":"Ch%d";
+ else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[nRealChannel]?"[Chn %d]":"Chn %d";
+ wsprintf(s, pszfmt, nRealChannel + 1, pSndFile->ChnSettings[nRealChannel].szName);
// -> CODE#0012
// -> DESC="midi keyboard split"
// DrawButtonRect(hdc, &rect, s,
@@ -492,15 +506,15 @@
// ((m_bInItemRect) && ((m_nDragItem & DRAGITEM_MASK) == DRAGITEM_CHNHEADER) && ((m_nDragItem & 0xFFFF) == ncolhdr)) ? TRUE : FALSE, DT_CENTER);
// rect.bottom = rect.top + COLHDR_HEIGHT;
DrawButtonRect(hdc, &rect, s,
- (pSndFile->ChnSettings[ncolhdr].dwFlags & CHN_MUTE) ? TRUE : FALSE,
- ((m_bInItemRect) && ((m_nDragItem & DRAGITEM_MASK) == DRAGITEM_CHNHEADER) && ((m_nDragItem & 0xFFFF) == ncolhdr)) ? TRUE : FALSE,
- pModDoc->IsChannelRecord(ncolhdr) ? DT_RIGHT : DT_CENTER);
+ (pSndFile->ChnSettings[nRealChannel].dwFlags & CHN_MUTE) ? TRUE : FALSE,
+ ((m_bInItemRect) && ((m_nDragItem & DRAGITEM_MASK) == DRAGITEM_CHNHEADER) && ((m_nDragItem & 0xFFFF) == nRealChannel)) ? TRUE : FALSE,
+ pModDoc->IsChannelRecord(nRealChannel) ? DT_RIGHT : DT_CENTER);
rect.bottom = rect.top + COLHDR_HEIGHT;
CRect insRect;
insRect.SetRect(xpaint, ypaint, xpaint+nColumnWidth / 8 + 3, ypaint + 16);
// if (MultiRecordMask[ncolhdr>>3] & (1 << (ncolhdr&7)))
- if (pModDoc->IsChannelRecord1(ncolhdr))
+ if (pModDoc->IsChannelRecord1(nRealChannel))
{
// rect.DeflateRect(1, 1);
// InvertRect(hdc, &rect);
@@ -512,7 +526,7 @@
DrawButtonRect(hdc, &insRect, s, FALSE, FALSE, DT_CENTER);
FrameRect(hdc,&insRect,CMainFrame::brushBlack);
}
- else if (pModDoc->IsChannelRecord2(ncolhdr))
+ else if (pModDoc->IsChannelRecord2(nRealChannel))
{
FrameRect(hdc,&rect,CMainFrame::brushGray);
InvertRect(hdc, &rect);
@@ -525,8 +539,8 @@
if (m_dwStatus & PATSTATUS_VUMETERS)
{
- OldVUMeters[ncolhdr] = 0;
- DrawChannelVUMeter(hdc, rect.left + 1, rect.bottom, ncolhdr);
+ OldVUMeters[nRealChannel] = 0;
+ DrawChannelVUMeter(hdc, rect.left + 1, rect.bottom, nRealChannel);
rect.top+=VUMETERS_HEIGHT;
rect.bottom+=VUMETERS_HEIGHT;
}
@@ -534,14 +548,14 @@
{
rect.top+=PLUGNAME_HEIGHT;
rect.bottom+=PLUGNAME_HEIGHT;
- mixPlug=pSndFile->ChnSettings[ncolhdr].nMixPlugin;
+ mixPlug=pSndFile->ChnSettings[nRealChannel].nMixPlugin;
if (mixPlug) {
wsprintf(s, "%d: %s", mixPlug, (pSndFile->m_MixPlugins[mixPlug-1]).pMixPlugin?(pSndFile->m_MixPlugins[mixPlug-1]).Info.szName:"[empty]");
} else {
wsprintf(s, "---");
}
DrawButtonRect(hdc, &rect, s, FALSE,
- ((m_bInItemRect) && ((m_nDragItem & DRAGITEM_MASK) == DRAGITEM_PLUGNAME) && ((m_nDragItem & 0xFFFF) == ncolhdr)) ? TRUE : FALSE, DT_CENTER);
+ ((m_bInItemRect) && ((m_nDragItem & DRAGITEM_MASK) == DRAGITEM_PLUGNAME) && ((m_nDragItem & 0xFFFF) == nRealChannel)) ? TRUE : FALSE, DT_CENTER);
}
} else break;
ncolhdr++;
@@ -797,7 +811,13 @@
MODCOMMAND *m;
int x, bk_col, tx_col, col_sel, fx_col;
- m = (pPattern) ? &pPattern[row*ncols+col] : &m0;
+ CHANNELINDEX nRealChannel;
+ if(col - xofs < m_nStickyChannelCount) // sticky channel
+ nRealChannel = m_nChannelOrder[col - xofs];
+ else // normal channel
+ nRealChannel = m_nChannelOrder[col];
+
+ m = (pPattern) ? &pPattern[row*ncols+nRealChannel] : &m0;
dwSpeedUpMask = 0;
if ((bSpeedUp) && (bColSel[col] & 0x40) && (pPattern) && (row))
{
Modified: branches/devBranch_1_17_04/mptrack/View_pat.cpp
===================================================================
--- branches/devBranch_1_17_04/mptrack/View_pat.cpp 2009-09-23 11:51:18 UTC (rev 376)
+++ branches/devBranch_1_17_04/mptrack/View_pat.cpp 2009-09-23 11:57:10 UTC (rev 377)
@@ -66,6 +66,7 @@
ON_COMMAND(ID_EDIT_SPLITRECSELECT, OnSplitRecordSelect)
// -! NEW_FEATURE#0012
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
+ ON_COMMAND(ID_PATTERN_CHNTOGGLESTICKY, OnChannelTogglySticky)
ON_COMMAND(ID_PATTERN_CHNRESET, OnChannelReset)
ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys
ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys
@@ -133,6 +134,7 @@
m_nDetailLevel = 4;
m_pEditWnd = NULL;
m_pGotoWnd = NULL;
+ memset(m_nChannelOrder, 0, sizeof(m_nChannelOrder));
m_Dib.Init(CMainFrame::bmpNotes);
UpdateColors();
}
@@ -147,6 +149,7 @@
// -> DESC="midi keyboard split"
memset(splitActiveNoteChannel, 0xFF, sizeof(splitActiveNoteChannel));
memset(activeNoteChannel, 0xFF, sizeof(activeNoteChannel));
+ ResetStickyChannels();
oldrow = -1;
oldchn = -1;
oldsplitchn = -1;
@@ -1405,6 +1408,17 @@
}
}
+void CViewPattern::OnChannelTogglySticky()
+//---------------------------------------
+{
+ // Toggle "sticky" state (channel will always be visible)
+ const CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam);
+ CSoundFile* pSndFile;
+ if(GetDocument() == nullptr || (pSndFile = GetDocument()->GetSoundFile()) == nullptr) return;
+ pSndFile->ChnSettings[nChn].bIsSticky = !pSndFile->ChnSettings[nChn].bIsSticky;
+ ResetStickyChannels();
+}
+
void CViewPattern::OnChannelReset()
//---------------------------------
{
@@ -3006,8 +3020,8 @@
}
-ModCommandPos CViewPattern::GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const
-//-----------------------------------------------------------------------------------
+ModCommandPos CViewPattern::GetEditPos(CSoundFile& rSf, const bool bLiveRecord)
+//-----------------------------------------------------------------------------
{
ModCommandPos editpos;
if(bLiveRecord)
@@ -4658,6 +4672,8 @@
AppendMenu(hMenu, MF_STRING, ID_PATTERN_CHNRESET, "Reset Channel\t" + ih->GetKeyTextFromCommand(kcChannelReset));
+ AppendMenu(hMenu, MF_STRING | (pSndFile->ChnSettings[nChn].bIsSticky ? MF_CHECKED : 0), ID_PATTERN_CHNTOGGLESTICKY, "Sticky Channel");
+
return true;
}
@@ -4984,7 +5000,7 @@
ROWINDEX CViewPattern::GetRowFromCursor(DWORD cursor) {return cursor >> 16;}
//---------------------------------------------------
-CHANNELINDEX CViewPattern::GetChanFromCursor(DWORD cursor) {return static_cast<CHANNELINDEX>((cursor & 0xFFFF) >> 3);}
+CHANNELINDEX CViewPattern::GetChanFromCursor(DWORD cursor) {return m_nChannelOrder[(cursor & 0xFFFF) >> 3];}
//-------------------------------------------------------
UINT CViewPattern::GetColTypeFromCursor(DWORD cursor) {return cursor & 0x07;}
@@ -5141,3 +5157,33 @@
iRow = m_nRow;
}
}
+
+void CViewPattern::ResetStickyChannels()
+//--------------------------------------
+{
+ // precalc sticky channels, i.e. channels that are always visible
+ CSoundFile *pSndFile;
+ if(GetDocument() == nullptr || (pSndFile = GetDocument()->GetSoundFile()) == nullptr) return;
+
+ CHANNELINDEX iChn = 0;
+ for(CHANNELINDEX i = 0; i < pSndFile->m_nChannels; i++)
+ {
+ if(pSndFile->ChnSettings[i].bIsSticky == true)
+ {
+ m_nChannelOrder[iChn] = i;
+ iChn++;
+ }
+ }
+ m_nStickyChannelCount = iChn;
+ for(CHANNELINDEX i = 0; i < pSndFile->m_nChannels; i++)
+ {
+ if(pSndFile->ChnSettings[i].bIsSticky == false)
+ {
+ m_nChannelOrder[iChn] = i;
+ iChn++;
+ }
+ }
+ ASSERT(iChn == pSndFile->m_nChannels);
+ InvalidateChannelsHeaders();
+ InvalidatePattern();
+}
\ No newline at end of file
Modified: branches/devBranch_1_17_04/mptrack/View_pat.h
===================================================================
--- branches/devBranch_1_17_04/mptrack/View_pat.h 2009-09-23 11:51:18 UTC (rev 376)
+++ branches/devBranch_1_17_04/mptrack/View_pat.h 2009-09-23 11:57:10 UTC (rev 377)
@@ -110,6 +110,9 @@
int oldrow,oldchn,oldsplitchn;
// -! NEW_FEATURE#0012
+ CHANNELINDEX m_nChannelOrder[MAX_BASECHANNELS]; // for sticky channels
+ CHANNELINDEX m_nStickyChannelCount;
+
// -> CODE#0018
// -> DESC="route PC keyboard inputs to midi in mechanism"
int ignorekey;
@@ -240,6 +243,7 @@
afx_msg void OnEditGoto();
afx_msg void OnEditFindNext();
afx_msg void OnEditUndo();
+ afx_msg void OnChannelTogglySticky();
afx_msg void OnChannelReset();
afx_msg void OnMuteFromClick(); //rewbs.customKeys
afx_msg void OnSoloFromClick(); //rewbs.customKeys
@@ -331,9 +335,9 @@
UINT GetSelectionEndChan();
UINT ListChansWhereColSelected(UINT colType, CArray<UINT,UINT> &chans);
- static ROWINDEX GetRowFromCursor(DWORD cursor);
- static CHANNELINDEX GetChanFromCursor(DWORD cursor);
- static UINT GetColTypeFromCursor(DWORD cursor);
+ ROWINDEX GetRowFromCursor(DWORD cursor);
+ CHANNELINDEX GetChanFromCursor(DWORD cursor);
+ UINT GetColTypeFromCursor(DWORD cursor);
bool IsInterpolationPossible(UINT startRow, UINT endRow, UINT chan, UINT colType, CSoundFile* pSndFile);
void Interpolate(UINT type);
@@ -350,7 +354,7 @@
const ROWINDEX iRowCandidate, const PATTERNINDEX iPatCandidate) const;
// Returns edit position.
- ModCommandPos GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const;
+ ModCommandPos GetEditPos(CSoundFile& rSf, const bool bLiveRecord);
// Returns pointer to modcommand at given position. If the position is not valid, returns pointer
// to a dummy command.
@@ -360,6 +364,8 @@
//Like IsEditingEnabled(), but shows some notification when editing is not enabled.
bool IsEditingEnabled_bmsg();
+
+ void ResetStickyChannels();
public:
Modified: branches/devBranch_1_17_04/mptrack/resource.h
===================================================================
--- branches/devBranch_1_17_04/mptrack/resource.h 2009-09-23 11:51:18 UTC (rev 376)
+++ branches/devBranch_1_17_04/mptrack/resource.h 2009-09-23 11:57:10 UTC (rev 377)
@@ -1124,6 +1124,7 @@
#define ID_NOTEMAP_COPY_NOTE 59227
#define ID_CLEANUP_REARRANGESAMPLES 59228
#define ID_ORDERLIST_RENDER 59229
+#define ID_PATTERN_CHNTOGGLESTICKY 59230
// Next default values for new objects
//
@@ -1131,7 +1132,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
-#define _APS_NEXT_COMMAND_VALUE 59230
+#define _APS_NEXT_COMMAND_VALUE 59231
#define _APS_NEXT_CONTROL_VALUE 2391
#define _APS_NEXT_SYMED_VALUE 901
#endif
Modified: branches/devBranch_1_17_04/soundlib/Sndfile.cpp
===================================================================
--- branches/devBranch_1_17_04/soundlib/Sndfile.cpp 2009-09-23 11:51:18 UTC (rev 376)
+++ branches/devBranch_1_17_04/soundlib/Sndfile.cpp 2009-09-23 11:57:10 UTC (rev 377)
@@ -1418,7 +1418,7 @@
}
-bool CSoundFile::InitChannel(UINT nch)
+bool CSoundFile::InitChannel(CHANNELINDEX nch)
//-------------------------------------
{
if(nch >= MAX_BASECHANNELS) return true;
@@ -1427,6 +1427,7 @@
ChnSettings[nch].nVolume = 64;
ChnSettings[nch].dwFlags = 0;
ChnSettings[nch].nMixPlugin = 0;
+ ChnSettings[nch].bIsSticky = false;
ChnSettings[nch].szName[0] = 0;
ResetChannelState(nch, CHNRESET_TOTAL);
@@ -1608,8 +1609,8 @@
return static_cast<CHANNELINDEX>(m_nChannels);
}
-bool CSoundFile::MoveChannel(UINT chnFrom, UINT chnTo)
-//-----------------------------------------------------
+bool CSoundFile::MoveChannel(CHANNELINDEX chnFrom, CHANNELINDEX chnTo)
+//--------------------------------------------------------------------
{
//Implementation of move channel using ReArrangeChannels(...). So this function
//only creates correct newOrder-vector used in the ReArrangeChannels(...).
@@ -1630,7 +1631,7 @@
if(chnFrom < chnTo)
{
CHANNELINDEX temp = newOrder[chnFrom];
- for(UINT i = chnFrom; i<chnTo; i++)
+ for(CHANNELINDEX i = chnFrom; i<chnTo; i++)
{
newOrder[i] = newOrder[i+1];
}
@@ -1639,7 +1640,7 @@
else //case chnFrom > chnTo(can't be equal, since it has been examined earlier.)
{
CHANNELINDEX temp = newOrder[chnFrom];
- for(UINT i = chnFrom; i>=chnTo+1; i--)
+ for(CHANNELINDEX i = chnFrom; i>=chnTo+1; i--)
{
newOrder[i] = newOrder[i-1];
}
Modified: branches/devBranch_1_17_04/soundlib/Sndfile.h
===================================================================
--- branches/devBranch_1_17_04/soundlib/Sndfile.h 2009-09-23 11:51:18 UTC (rev 376)
+++ branches/devBranch_1_17_04/soundlib/Sndfile.h 2009-09-23 11:57:10 UTC (rev 377)
@@ -259,10 +259,11 @@
struct MODCHANNELSETTINGS
{
- UINT nPan;
- UINT nVolume;
- DWORD dwFlags;
+ UINT nPan; // 0...256
+ UINT nVolume; // 0...64
+ DWORD dwFlags; // Suround/Mute
UINT nMixPlugin;
+ bool bIsSticky; // Channel will always be visible in the pattern editor
CHAR szName[MAX_CHANNELNAME];
};
@@ -668,9 +669,9 @@
BOOL SetPatternName(UINT nPat, LPCSTR lpszName);
BOOL GetPatternName(UINT nPat, LPSTR lpszName, UINT cbSize=MAX_PATTERNNAME) const;
CHANNELINDEX ReArrangeChannels(const vector<CHANNELINDEX>& fromToArray);
- bool MoveChannel(UINT chn_from, UINT chn_to);
+ bool MoveChannel(CHANNELINDEX chnFrom, CHANNELINDEX chnTo);
- bool InitChannel(UINT nch);
+ bool InitChannel(CHANNELINDEX nch);
void ResetChannelState(CHANNELINDEX chn, BYTE resetStyle);
// Module Loaders
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-23 11:51:37
|
Revision: 376
http://modplug.svn.sourceforge.net/modplug/?rev=376&view=rev
Author: saga-games
Date: 2009-09-23 11:51:18 +0000 (Wed, 23 Sep 2009)
Log Message:
-----------
Added Paths:
-----------
branches/devBranch_1_17_04/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-22 17:07:29
|
Revision: 375
http://modplug.svn.sourceforge.net/modplug/?rev=375&view=rev
Author: saga-games
Date: 2009-09-22 17:07:04 +0000 (Tue, 22 Sep 2009)
Log Message:
-----------
[Mod] Compatibility Export: Use module working directory in "save as" dialog
[Fix] Color Setup: When no INI file was present, channel separators were completely black
[Fix] MED Loader: Possible error when loading orderlist
Modified Paths:
--------------
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/misc_util.h
trunk/OpenMPT/soundlib/Load_med.cpp
Removed Paths:
-------------
trunk/OpenMPT/mptrack/bin/default.mkb
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -255,6 +255,8 @@
0x800000, 0x808000, 0x008000, 0x808000, 0x008080, 0x000080, 0xFF0000,
// VU-Meters
0x00FF00, 0x00FFFF, 0x0000FF,
+ // Channel separators
+ GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNFACE), GetSysColor(COLOR_BTNHIGHLIGHT),
};
// Directory Arrays (Default + Last)
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -1635,6 +1635,8 @@
CFileDialog dlg(FALSE, ext, s,
OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
pattern, pMainFrm);
+ dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_MODS);
+
if (dlg.DoModal() != IDOK){
return;
}
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -742,6 +742,8 @@
MoveConfigFile("plugin.cache");
MoveConfigFile("mpt_intl.ini");
MoveConfigFile("default.mkb", "", "Keybindings.mkb");
+ MoveConfigFile("Keybindings.mkb");
+ // TODO - Check the old ini settings here
}
// Create tunings dir
Deleted: trunk/OpenMPT/mptrack/bin/default.mkb
===================================================================
--- trunk/OpenMPT/mptrack/bin/default.mkb 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/bin/default.mkb 2009-09-22 17:07:04 UTC (rev 375)
@@ -1,282 +0,0 @@
-//-------- OpenMPT key binding definition file -------
-//-Format is: -
-//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
-//----------------------------------------------------------------------
-
-//----( Global Context (0) )------------
-0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
-0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown)
-0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown)
-0:1030:2:119:1 //Play song/Pause song: Ctrl+F8 (KeyDown)
-0:1031:0:119:1 //Pause song: F8 (KeyDown)
-0:1375:0:27:1 //Stop Song: ESC (KeyDown)
-0:1029:0:116:5 //Play song from start: F5 (KeyDown|KeyHold)
-0:1028:0:118:5 //Play song from cursor: F7 (KeyDown|KeyHold)
-0:1027:0:117:5 //Play pattern from start: F6 (KeyDown|KeyHold)
-0:1026:2:117:5 //Play pattern from cursor: Ctrl+F6 (KeyDown|KeyHold)
-0:1687:6:66:1 //Show approx. real BPM: Ctrl+Alt+B (KeyDown)
-0:1376:2:120:1 //Toggle Midi Record: Ctrl+F9 (KeyDown)
-0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown)
-0:1360:2:88:1 //Cut: Ctrl+X (KeyDown)
-0:1361:2:67:1 //Copy: Ctrl+C (KeyDown)
-0:1361:4:67:1 //Copy: Alt+C (KeyDown)
-0:1362:2:86:1 //Paste: Ctrl+V (KeyDown)
-0:1362:4:86:1 //Paste: Alt+V (KeyDown)
-0:1363:2:77:1 //Mix Paste: Ctrl+M (KeyDown)
-0:1364:2:65:1 //SelectAll: Ctrl+A (KeyDown)
-0:1365:2:70:1 //Find: Ctrl+F (KeyDown)
-0:1366:2:114:1 //Find Next: Ctrl+F3 (KeyDown)
-0:1021:0:122:1 //View General: F11 (KeyDown)
-0:1022:0:113:1 //View Pattern: F2 (KeyDown)
-0:1023:0:114:1 //View Samples: F3 (KeyDown)
-0:1024:0:115:1 //View Instruments: F4 (KeyDown)
-0:1025:1:120:1 //View Comments: Shift+F9 (KeyDown)
-0:1368:2:113:1 //Toggle Tree View: Ctrl+F2 (KeyDown)
-0:1369:2:112:1 //View Options: Ctrl+F1 (KeyDown)
-0:1670:6:77:1 //View Channel Manager: Ctrl+Alt+M (KeyDown)
-0:1669:3:77:1 //View 'Add Plugin' Window: Shift+Ctrl+M (KeyDown)
-0:1032:0:219:5 //Previous instrument: [ (KeyDown|KeyHold)
-0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold)
-0:1033:0:221:5 //Next instrument: ] (KeyDown|KeyHold)
-0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold)
-0:1036:0:111:5 //Previous octave: NUM DIVIDE (KeyDown|KeyHold)
-0:1037:0:106:5 //Next octave: NUMMULT (KeyDown|KeyHold)
-0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold)
-0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold)
-0:1201:0:223:1 //Note off: ` (KeyDown)
-
-//----( General Context [bottom] (1) )------------
-
-//----( Pattern Context [bottom] (2) )------------
-2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold)
-2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold)
-2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold)
-2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold)
-2:1019:2:34:5 //Snap down to measure: Ctrl+PGDOWN (KeyDown|KeyHold)
-2:1020:2:33:5 //Snap up to measure: Ctrl+PGUP (KeyDown|KeyHold)
-2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold)
-2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold)
-2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold)
-2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold)
-2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold)
-2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold)
-2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold)
-2:1043:2:9:5 //Navigate to previous channel: Ctrl+TAB (KeyDown|KeyHold)
-2:1044:0:36:1 //Go to first channel: HOME (KeyDown)
-2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown)
-2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown)
-2:1047:0:35:1 //Go to last channel: END (KeyDown)
-2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown)
-2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown)
-2:1050:1:16:1 //Selection key: Shift (KeyDown)
-2:1011:4:76:1 //Select channel / Select all: Alt+L (KeyDown)
-2:1663:2:118:1 //Toggle follow song: Ctrl+F7 (KeyDown)
-2:1003:0:13:1 //Quick copy: ENTER (KeyDown)
-2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold)
-2:1001:1:120:1 //Enable recording: Shift+F9 (KeyDown)
-2:1002:2:13:1 //Play row: Ctrl+ENTER (KeyDown)
-2:1002:0:104:1 //Play row: NUM 8 (KeyDown)
-2:1002:0:56:1 //Play row: 8 (KeyDown)
-2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown)
-2:1685:6:9:1 //Switch to order list: Ctrl+Alt+TAB (KeyDown)
-2:1672:3:13:1 //Insert new pattern: Shift+Ctrl+ENTER (KeyDown)
-2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown)
-2:1062:0:93:1 //Show note properties: Application (KeyDown)
-2:1063:2:93:1 //Show context (right-click) menu: Ctrl+Application (KeyDown)
-2:1005:0:120:1 //Mute current channel: F9 (KeyDown)
-2:1006:0:121:1 //Solo current channel: F10 (KeyDown)
-2:1007:4:81:5 //Transpose +1: Alt+Q (KeyDown|KeyHold)
-2:1008:4:65:5 //Transpose -1: Alt+A (KeyDown|KeyHold)
-2:1009:6:81:5 //Transpose +12: Ctrl+Alt+Q (KeyDown|KeyHold)
-2:1010:6:65:5 //Transpose -12: Ctrl+Alt+A (KeyDown|KeyHold)
-2:1012:4:74:1 //Amplify selection: Alt+J (KeyDown)
-2:1014:4:73:1 //Interpolate volume: Alt+I (KeyDown)
-2:1015:4:88:1 //Interpolate effect: Alt+X (KeyDown)
-2:1016:4:66:1 //Open effect visualizer: Alt+B (KeyDown)
-2:1013:4:83:1 //Apply current instrument: Alt+S (KeyDown)
-2:1660:4:69:1 //Grow selection: Alt+E (KeyDown)
-2:1661:4:68:1 //Shrink selection: Alt+D (KeyDown)
-2:1057:0:46:1 //Clear row: DELETE (KeyDown)
-2:1058:0:110:1 //Clear field: NUM DECIMAL (KeyDown)
-2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown)
-2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown)
-2:1060:2:110:1 //Clear field and step: Ctrl+NUM DECIMAL (KeyDown)
-2:1665:3:190:1 //Clear field and step (IT Style): Shift+Ctrl+. (KeyDown)
-2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold)
-2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold)
-2:1378:0:45:5 //Insert Row: INSERT (KeyDown|KeyHold)
-2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown)
-2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold)
-2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold)
-
-//----( Pattern Context [bottom] - Note Col (3) )------------
-3:1064:0:90:1 //Base octave C: Z (KeyDown)
-3:1065:0:83:1 //Base octave C#: S (KeyDown)
-3:1066:0:88:1 //Base octave D: X (KeyDown)
-3:1067:0:68:1 //Base octave D#: D (KeyDown)
-3:1068:0:67:1 //Base octave E: C (KeyDown)
-3:1069:0:86:1 //Base octave F: V (KeyDown)
-3:1070:0:71:1 //Base octave F#: G (KeyDown)
-3:1071:0:66:1 //Base octave G: B (KeyDown)
-3:1072:0:72:1 //Base octave G#: H (KeyDown)
-3:1073:0:78:1 //Base octave +1 A: N (KeyDown)
-3:1074:0:74:1 //Base octave +1 A#: J (KeyDown)
-3:1075:0:77:1 //Base octave +1 B: M (KeyDown)
-3:1076:0:81:1 //Base octave +1 C: Q (KeyDown)
-3:1077:0:50:1 //Base octave +1 C#: 2 (KeyDown)
-3:1078:0:87:1 //Base octave +1 D: W (KeyDown)
-3:1079:0:51:1 //Base octave +1 D#: 3 (KeyDown)
-3:1080:0:69:1 //Base octave +1 E: E (KeyDown)
-3:1081:0:82:1 //Base octave +1 F: R (KeyDown)
-3:1082:0:53:1 //Base octave +1 F#: 5 (KeyDown)
-3:1083:0:84:1 //Base octave +1 G: T (KeyDown)
-3:1084:0:54:1 //Base octave +1 G#: 6 (KeyDown)
-3:1085:0:89:1 //Base octave +2 A: Y (KeyDown)
-3:1086:0:55:1 //Base octave +2 A#: 7 (KeyDown)
-3:1087:0:85:1 //Base octave +2 B: U (KeyDown)
-3:1088:0:73:1 //Base octave +2 C: I (KeyDown)
-3:1089:0:57:1 //Base octave +2 C#: 9 (KeyDown)
-3:1090:0:79:1 //Base octave +2 D: O (KeyDown)
-3:1091:0:48:1 //Base octave +2 D#: 0 (KeyDown)
-3:1092:0:80:1 //Base octave +2 E: P (KeyDown)
-3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown)
-3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown)
-3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown)
-3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown)
-3:1216:0:52:1 //Set octave 4: 4 (KeyDown)
-3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown)
-3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown)
-3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown)
-3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown)
-3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown)
-3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown)
-3:1316:1:16:1 //Chord Modifier: Shift (KeyDown)
-3:1200:0:49:1 //Note cut: 1 (KeyDown)
-3:1201:0:187:1 //Note off: = (KeyDown)
-3:1667:1:49:1 //Note cut (don't remember instrument): Shift+1 (KeyDown)
-3:1668:1:223:1 //Note off (don't remember instrument): Shift+` (KeyDown)
-
-//----( Pattern Context [bottom] - Ins Col (4) )------------
-4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown)
-4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown)
-4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown)
-4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown)
-4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown)
-4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown)
-4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown)
-4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown)
-4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown)
-4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown)
-4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown)
-4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown)
-4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown)
-4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown)
-4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown)
-4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown)
-4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown)
-4:1210:0:104:1 //Set instrument digit 8: NUM 8 (KeyDown)
-4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown)
-4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown)
-
-//----( Pattern Context [bottom] - Vol Col (5) )------------
-5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown)
-5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown)
-5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown)
-5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown)
-5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown)
-5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown)
-5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown)
-5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown)
-5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown)
-5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown)
-5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown)
-5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown)
-5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown)
-5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown)
-5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown)
-5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown)
-5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown)
-5:1230:0:104:1 //Set volume digit 8: NUM 8 (KeyDown)
-5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown)
-5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown)
-5:1232:0:86:1 //Vol command - volume: V (KeyDown)
-5:1233:0:80:1 //Vol command - pan: P (KeyDown)
-5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown)
-5:1235:0:68:1 //Vol command - vol slide down: D (KeyDown)
-5:1236:0:65:1 //Vol command - vol fine slide up: A (KeyDown)
-5:1237:0:66:1 //Vol command - vol fine slide down: B (KeyDown)
-5:1238:0:85:1 //Vol command - vibrato speed: U (KeyDown)
-5:1239:0:72:1 //Vol command - vibrato: H (KeyDown)
-5:1240:0:76:1 //Vol command - XM pan left: L (KeyDown)
-5:1241:0:82:1 //Vol command - XM pan right: R (KeyDown)
-5:1242:0:71:1 //Vol command - Portamento: G (KeyDown)
-5:1243:0:70:1 //Vol command - Portamento Up: F (KeyDown)
-5:1244:0:69:1 //Vol command - Portamento Down: E (KeyDown)
-5:1245:1:186:1 //Vol command - Velocity: Shift+; (KeyDown)
-5:1246:0:79:1 //Vol command - Offset: O (KeyDown)
-
-//----( Pattern Context [bottom] - FX Col (6) )------------
-6:1294:0:220:1 //FX midi macro slide: \ (KeyDown)
-6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown)
-6:1666:0:222:1 //FX parameter extension command: # (KeyDown)
-
-//----( Pattern Context [bottom] - Param Col (7) )------------
-7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown)
-7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown)
-7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown)
-7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown)
-7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown)
-7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown)
-7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown)
-7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown)
-7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown)
-7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown)
-7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown)
-7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown)
-7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown)
-7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown)
-7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown)
-7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown)
-7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown)
-7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown)
-7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown)
-7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown)
-7:1257:0:65:1 //FX Param digit A: A (KeyDown)
-7:1258:0:66:1 //FX Param digit B: B (KeyDown)
-7:1259:0:67:1 //FX Param digit C: C (KeyDown)
-7:1260:0:68:1 //FX Param digit D: D (KeyDown)
-7:1261:0:69:1 //FX Param digit E: E (KeyDown)
-7:1262:0:70:1 //FX Param digit F: F (KeyDown)
-
-//----( Sample Context [bottom] (8) )------------
-8:1673:4:76:1 //Load a Sample: Alt+L (KeyDown)
-8:1674:4:83:1 //Save Sample: Alt+S (KeyDown)
-8:1675:4:78:1 //New Sample: Alt+N (KeyDown)
-8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown)
-8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown)
-8:1384:3:78:1 //Normalise Sample: Shift+Ctrl+N (KeyDown)
-8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown)
-8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown)
-8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown)
-8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown)
-8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown)
-
-//----( Instrument Context [bottom] (9) )------------
-
-//----( Comments Context [bottom] (10) )------------
-
-//----( Unknown Context (11) )------------
-
-//----( Unknown Context (12) )------------
-
-//----( Plugin GUI Context (13) )------------
-
-//----( General Context [top] (14) )------------
-
-//----( Pattern Context [top] (15) )------------
-
-//----( Sample Context [top] (16) )------------
-
-//----( Instrument Context [top] (17) )------------
-
-//----( Comments Context [top] (18) )------------
Modified: trunk/OpenMPT/mptrack/misc_util.h
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.h 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/misc_util.h 2009-09-22 17:07:04 UTC (rev 375)
@@ -135,4 +135,30 @@
}
}
+// Convert a 0-terminated string to a space-padded string
+template <size_t size>
+void NullToSpaceString(char (&buffer)[size])
+{
+ size_t pos = size;
+ while (pos-- > 0)
+ if (buffer[pos] == 0)
+ buffer[pos] = 32;
+ buffer[size - 1] = 0;
+}
+// Convert a space-padded string to a 0-terminated string
+template <size_t size>
+void SpaceToNullString(char (&buffer)[size])
+{
+ // First, remove any Nulls
+ NullToSpaceString(buffer);
+ size_t pos = size;
+ while (pos-- > 0)
+ {
+ if (buffer[pos] == 32)
+ buffer[pos] = 0;
+ else if(buffer[pos] != 0)
+ break;
+ }
+ buffer[size - 1] = 0;
+}
#endif
Modified: trunk/OpenMPT/soundlib/Load_med.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_med.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/soundlib/Load_med.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -673,7 +673,7 @@
Order.resize(nOrders++);
for (UINT i=0; i<n; i++)
{
- WORD seqval = BigEndian(pmps->seq[i]);
+ WORD seqval = BigEndianW(pmps->seq[i]);
if ((seqval < wNumBlocks) && (nOrders < MAX_ORDERS-1))
{
Order[nOrders++] = (ORDERINDEX)seqval;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-21 20:03:56
|
Revision: 374
http://modplug.svn.sourceforge.net/modplug/?rev=374&view=rev
Author: saga-games
Date: 2009-09-21 20:03:46 +0000 (Mon, 21 Sep 2009)
Log Message:
-----------
[New] Color setup: Channel separators can now have custom colors.
[Mod] Color setup: Changed FT2 and IT presets to resemble those two trackers as much as possible.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -124,9 +124,6 @@
BYTE r,g,b;
m_Dib.SetAllColors(0, MAX_MODCOLORS, CMainFrame::rgbCustomColors);
- m_Dib.SetColor(MODSYSCOLOR_LO, GetSysColor(COLOR_BTNSHADOW));
- m_Dib.SetColor(MODSYSCOLOR_MED, GetSysColor(COLOR_BTNFACE));
- m_Dib.SetColor(MODSYSCOLOR_HI, GetSysColor(COLOR_BTNHIGHLIGHT));
r = hilightcolor(GetRValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKHILIGHT]),
GetRValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKNORMAL]));
g = hilightcolor(GetGValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKHILIGHT]),
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -364,8 +364,14 @@
{
CString iniFile = theApp.GetConfigFileName();
//CHAR collectedString[INIBUFFERSIZE];
+ MptVersion::VersionNum vIniVersion;
gcsPreviousVersion = GetPrivateProfileCString("Version", "Version", "", iniFile);
+ if(gcsPreviousVersion == "")
+ vIniVersion = MPT_VERSION_NUMERIC;
+ else
+ vIniVersion = MptVersion::ToNum(gcsPreviousVersion);
+
gcsInstallGUID = GetPrivateProfileCString("Version", "InstallGUID", "", iniFile);
gnCheckForUpdates = GetPrivateProfileInt("Version", "CheckForUpdates", 1, iniFile);
gbMdiMaximize = GetPrivateProfileLong("Display", "MDIMaximize", true, iniFile);
@@ -385,10 +391,16 @@
gnMsgBoxVisiblityFlags = GetPrivateProfileDWord("Display", "MsgBoxVisibilityFlags", uint32_max, iniFile);
CHAR s[16];
- for (int ncol=0; ncol<MAX_MODCOLORS; ncol++) {
+ for (int ncol = 0; ncol < MAX_MODCOLORS; ncol++) {
wsprintf(s, "Color%02d", ncol);
rgbCustomColors[ncol] = GetPrivateProfileDWord("Display", s, rgbCustomColors[ncol], iniFile);
}
+ if(rgbCustomColors[MODCOLOR_SEPSHADOW] == rgbCustomColors[MODCOLOR_SEPFACE] == rgbCustomColors[MODCOLOR_SEPHILITE] == 0 && vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,02))
+ {
+ rgbCustomColors[MODCOLOR_SEPSHADOW] = GetSysColor(COLOR_BTNSHADOW);
+ rgbCustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE);
+ rgbCustomColors[MODCOLOR_SEPHILITE] = GetSysColor(COLOR_BTNHIGHLIGHT);
+ }
m_nWaveDevice = GetPrivateProfileLong("Sound Settings", "WaveDevice", (SNDDEV_DSOUND<<8), iniFile);
m_dwSoundSetup = GetPrivateProfileDWord("Sound Settings", "SoundSetup", SOUNDSETUP_SECONDARY, iniFile);
@@ -414,9 +426,9 @@
gnMidiPatternLen = GetPrivateProfileLong("MIDI Settings", "MidiImportPatLen", gnMidiPatternLen, iniFile);
m_dwPatternSetup = GetPrivateProfileDWord("Pattern Editor", "PatternSetup", m_dwPatternSetup, iniFile);
- if(gcsPreviousVersion != "" && MptVersion::ToNum(gcsPreviousVersion) < MAKE_VERSION_NUMERIC(1,17,02,50))
+ if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,02,50))
m_dwPatternSetup |= PATTERN_NOTEFADE;
- if(gcsPreviousVersion != "" && MptVersion::ToNum(gcsPreviousVersion) < MAKE_VERSION_NUMERIC(1,17,03,01))
+ if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,01))
m_dwPatternSetup |= PATTERN_RESETCHANNELS;
m_nRowSpacing = GetPrivateProfileDWord("Pattern Editor", "RowSpacing", 16, iniFile);
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-21 20:03:46 UTC (rev 374)
@@ -157,11 +157,11 @@
MODCOLOR_VUMETER_LO,
MODCOLOR_VUMETER_MED,
MODCOLOR_VUMETER_HI,
+ MODCOLOR_SEPSHADOW,
+ MODCOLOR_SEPFACE,
+ MODCOLOR_SEPHILITE,
MAX_MODCOLORS,
// Internal color codes
- MODSYSCOLOR_LO,
- MODSYSCOLOR_MED,
- MODSYSCOLOR_HI,
MODCOLOR_2NDHIGHLIGHT,
MAX_MODPALETTECOLORS
};
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -105,6 +105,7 @@
{"Play Cursor", 0, MODCOLOR_BACKPLAYCURSOR, MODCOLOR_TEXTPLAYCURSOR, 0, "Background:", "Foreground:", NULL},
{"Note Highlight", 0, MODCOLOR_NOTE, MODCOLOR_INSTRUMENT, MODCOLOR_VOLUME, "Note:", "Instrument:", "Volume:"},
{"Effect Highlight",0, MODCOLOR_PANNING, MODCOLOR_PITCH, MODCOLOR_GLOBALS, "Panning Effects:", "Pitch Effects:", "Global Effects:"},
+ {"Channel Separator",0, MODCOLOR_SEPSHADOW, MODCOLOR_SEPFACE, MODCOLOR_SEPHILITE, "Shadow:", "Face:", "Highlight:"},
{"Sample Editor", 1, MODCOLOR_SAMPLE, 0, 0, "Sample Data:", NULL, NULL},
{"Instrument Editor",2, MODCOLOR_ENVELOPES, 0, 0, "Envelopes:", NULL, NULL},
{"VU-Meters", 0, MODCOLOR_VUMETER_HI, MODCOLOR_VUMETER_MED, MODCOLOR_VUMETER_LO, "Hi:", "Med:", "Lo:"}
@@ -483,6 +484,9 @@
CustomColors[MODCOLOR_PANNING] = RGB(0x00, 0x80, 0x80);
CustomColors[MODCOLOR_PITCH] = RGB(0x80, 0x80, 0x00);
CustomColors[MODCOLOR_GLOBALS] = RGB(0x80, 0x00, 0x00);
+ CustomColors[MODCOLOR_SEPSHADOW] = GetSysColor(COLOR_BTNSHADOW);
+ CustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE);
+ CustomColors[MODCOLOR_SEPHILITE] = GetSysColor(COLOR_BTNHIGHLIGHT);
OnPreviewChanged();
}
@@ -491,20 +495,25 @@
//--------------------------------
{
CustomColors[MODCOLOR_BACKNORMAL] = RGB(0x00, 0x00, 0x00);
- CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0xE0, 0xE0, 0x40);
- CustomColors[MODCOLOR_BACKCURROW] = RGB(0x70, 0x70, 0x70);
- CustomColors[MODCOLOR_TEXTCURROW] = RGB(0xF0, 0xF0, 0x50);
- CustomColors[MODCOLOR_BACKSELECTED] = RGB(0x40, 0x40, 0xA0);
+ CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_BACKCURROW] = RGB(0x49, 0x75, 0x82);
+ CustomColors[MODCOLOR_TEXTCURROW] = RGB(0xFF, 0xFF, 0x5F);
+ CustomColors[MODCOLOR_BACKSELECTED] = RGB(0x28, 0x28, 0x28);
CustomColors[MODCOLOR_TEXTSELECTED] = RGB(0xFF, 0xFF, 0xFF);
- CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x50, 0x50, 0x70);
- CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0xE0, 0xE0, 0x40);
- CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x40, 0x40, 0x80);
- CustomColors[MODCOLOR_NOTE] = RGB(0xE0, 0xE0, 0x40);
- CustomColors[MODCOLOR_INSTRUMENT] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_VOLUME] = RGB(0x00, 0xFF, 0x00);
- CustomColors[MODCOLOR_PANNING] = RGB(0x00, 0xFF, 0xFF);
- CustomColors[MODCOLOR_PITCH] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_GLOBALS] = RGB(0xFF, 0x40, 0x40);
+ CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x49, 0x75, 0x82);
+ CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0xFF, 0xFF, 0xFF);
+ CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x27, 0x41, 0x47);
+ CustomColors[MODCOLOR_NOTE] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_INSTRUMENT] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_VOLUME] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_PANNING] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_PITCH] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_GLOBALS] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_SAMPLE] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_ENVELOPES] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_SEPSHADOW] = RGB(0x18, 0x28, 0x2C);
+ CustomColors[MODCOLOR_SEPFACE] = RGB(0x49, 0x75, 0x82);
+ CustomColors[MODCOLOR_SEPHILITE] = RGB(0x8A, 0xDB, 0xF3);
OnPreviewChanged();
}
@@ -513,20 +522,25 @@
//-------------------------------
{
CustomColors[MODCOLOR_BACKNORMAL] = RGB(0x00, 0x00, 0x00);
- CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0x00, 0xE0, 0x00);
- CustomColors[MODCOLOR_BACKCURROW] = RGB(0x70, 0x70, 0x70);
- CustomColors[MODCOLOR_TEXTCURROW] = RGB(0x00, 0xE0, 0x00);
- CustomColors[MODCOLOR_BACKSELECTED] = RGB(0xE0, 0xE0, 0xE0);
- CustomColors[MODCOLOR_TEXTSELECTED] = RGB(0x00, 0x00, 0x00);
- CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x80, 0x80, 0x00);
- CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0x00, 0xE0, 0x00);
- CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x40, 0x68, 0x40);
- CustomColors[MODCOLOR_NOTE] = RGB(0x00, 0xFF, 0x00);
- CustomColors[MODCOLOR_INSTRUMENT] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_VOLUME] = RGB(0x00, 0xFF, 0x00);
- CustomColors[MODCOLOR_PANNING] = RGB(0x00, 0xFF, 0xFF);
- CustomColors[MODCOLOR_PITCH] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_GLOBALS] = RGB(0xFF, 0x40, 0x40);
+ CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_BACKCURROW] = RGB(0x10, 0x35, 0x00);
+ CustomColors[MODCOLOR_TEXTCURROW] = RGB(0xEB, 0xEB, 0xCB);
+ CustomColors[MODCOLOR_BACKSELECTED] = RGB(0x20, 0x55, 0x00);
+ CustomColors[MODCOLOR_TEXTSELECTED] = RGB(0xEB, 0xEB, 0xCB);
+ CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x59, 0x41, 0x3C);
+ CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x59, 0x41, 0x3C);
+ CustomColors[MODCOLOR_NOTE] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_INSTRUMENT] = RGB(0x38, 0x9E, 0x75);
+ CustomColors[MODCOLOR_VOLUME] = RGB(0xA2, 0xA2, 0xA2);
+ CustomColors[MODCOLOR_PANNING] = RGB(0x18, 0x75, 0x2C);
+ CustomColors[MODCOLOR_PITCH] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_GLOBALS] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_SAMPLE] = RGB(0x8E, 0x14, 0x55);
+ CustomColors[MODCOLOR_ENVELOPES] = RGB(0xA2, 0xA2, 0xA2);
+ CustomColors[MODCOLOR_SEPSHADOW] = RGB(0xB6, 0x96, 0x79);
+ CustomColors[MODCOLOR_SEPFACE] = RGB(0xB6, 0x96, 0x79);
+ CustomColors[MODCOLOR_SEPHILITE] = RGB(0xB6, 0x96, 0x79);
OnPreviewChanged();
}
@@ -540,7 +554,6 @@
CustomColors[MODCOLOR_TEXTCURROW] = 0x00000000;
CustomColors[MODCOLOR_BACKSELECTED] = 0x00000000;
CustomColors[MODCOLOR_TEXTSELECTED] = 0x00ccd7dd;
- CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
CustomColors[MODCOLOR_BACKPLAYCURSOR] = 0x007a99a9;
CustomColors[MODCOLOR_TEXTPLAYCURSOR] = 0x00000000;
CustomColors[MODCOLOR_BACKHILIGHT] = 0x00b5c5ce;
@@ -550,7 +563,11 @@
CustomColors[MODCOLOR_PANNING] = 0x00686800;
CustomColors[MODCOLOR_PITCH] = 0x00006262;
CustomColors[MODCOLOR_GLOBALS] = 0x00000066;
+ CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
CustomColors[MODCOLOR_ENVELOPES] = 0x000000ff;
+ CustomColors[MODCOLOR_SEPSHADOW] = RGB(0x80, 0x80, 0x80);
+ CustomColors[MODCOLOR_SEPFACE] = RGB(0xD4, 0xD0, 0xC8);
+ CustomColors[MODCOLOR_SEPHILITE] = RGB(0xFF, 0xFF, 0xFF);
OnPreviewChanged();
}
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -2255,9 +2255,9 @@
m_Dib.bmiHeader.biClrUsed = 0;
m_Dib.bmiHeader.biClrImportant = 256; // MAX_MODPALETTECOLORS;
m_n4BitPalette[0] = (BYTE)m_nTextColor;
- m_n4BitPalette[4] = MODSYSCOLOR_LO;
- m_n4BitPalette[12] = MODSYSCOLOR_MED;
- m_n4BitPalette[14] = MODSYSCOLOR_HI;
+ m_n4BitPalette[4] = MODCOLOR_SEPSHADOW;
+ m_n4BitPalette[12] = MODCOLOR_SEPFACE;
+ m_n4BitPalette[14] = MODCOLOR_SEPHILITE;
m_n4BitPalette[15] = (BYTE)m_nBkColor;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-21 13:05:20
|
Revision: 373
http://modplug.svn.sourceforge.net/modplug/?rev=373&view=rev
Author: saga-games
Date: 2009-09-21 13:05:09 +0000 (Mon, 21 Sep 2009)
Log Message:
-----------
[Imp] Tuning dialog: Using the default tuning path as default path for Import/Export dialog
[Imp] IT Loader: Removed unnecessary / wrong pre-amp limits
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/mptrack/TuningDialog.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-09-21 13:05:09 UTC (rev 373)
@@ -187,6 +187,7 @@
BOOL IsDebug() const { return m_bDebugMode; }
LPCSTR GetConfigFileName() const { return m_szConfigFileName; }
LPCSTR GetPluginCacheFileName() const { return m_szPluginCacheFileName; }
+ LPCSTR GetTuningsPath() const { return m_szTuningsDirectory; }
LPCSTR GetConfigPath() const { return m_szConfigDirectory; }
void SetupPaths();
Modified: trunk/OpenMPT/mptrack/TuningDialog.cpp
===================================================================
--- trunk/OpenMPT/mptrack/TuningDialog.cpp 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/mptrack/TuningDialog.cpp 2009-09-21 13:05:09 UTC (rev 373)
@@ -629,6 +629,7 @@
NULL,
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
filter.c_str(), this);
+ dlg.m_ofn.lpstrInitialDir = theApp.GetTuningsPath();
bool failure = true;
@@ -668,6 +669,7 @@
OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
filter.c_str(),
this);
+ dlg.m_ofn.lpstrInitialDir = theApp.GetTuningsPath();
if (dlg.DoModal() != IDOK) return;
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-21 13:05:09 UTC (rev 373)
@@ -1871,12 +1871,10 @@
if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20;
if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
- header.mv = m_nSamplePreAmp;
- if (header.mv < 0x20) header.mv = 0x20;
- if (header.mv > 0x7F) header.mv = 0x7F;
+ header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
header.speed = m_nDefaultSpeed;
- header.tempo = min(m_nDefaultTempo,255); //Limit this one to 255, we save the real one as an extension below.
- header.sep = 128;
+ header.tempo = min(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below.
+ header.sep = 128; // pan separation
dwHdrPos = sizeof(header) + header.ordnum;
// Channel Pan and Volume
memset(header.chnpan, 0xFF, 64);
@@ -2521,11 +2519,9 @@
if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
- if (header.mv < 0x20) header.mv = 0x20;
- if (header.mv > 0x7F) header.mv = 0x7F;
header.speed = m_nDefaultSpeed;
- header.tempo = min(m_nDefaultTempo,255); //Limit this one to 255, we save the real one as an extension below.
- header.sep = 128;
+ header.tempo = min(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below.
+ header.sep = 128; // pan separation
dwHdrPos = sizeof(header) + header.ordnum;
// Channel Pan and Volume
memset(header.chnpan, 0xFF, 64);
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-21 13:05:09 UTC (rev 373)
@@ -2896,7 +2896,7 @@
}
// Load local tunings.
- s_pTuningsSharedLocal->SetSavefilePath(std::string(std::string(theApp.GetConfigPath()) + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
+ s_pTuningsSharedLocal->SetSavefilePath(std::string(std::string(theApp.GetTuningsPath()) + "local_tunings" + CTuningCollection::s_FileExtension.c_str()));
s_pTuningsSharedLocal->Deserialize();
// Enabling adding/removing of tunings for standard collection
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-20 13:44:31
|
Revision: 372
http://modplug.svn.sourceforge.net/modplug/?rev=372&view=rev
Author: saga-games
Date: 2009-09-20 13:44:24 +0000 (Sun, 20 Sep 2009)
Log Message:
-----------
[Mod] Store configuration and tuning files in %APPDATA% if possible. Can be disabled by adding UseAppDataDirectory=0 to [Paths] in mptrack.ini.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/AutoSaver.cpp
trunk/OpenMPT/mptrack/InputHandler.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp
===================================================================
--- trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -191,8 +191,8 @@
if (m_bUseOriginalPath) {
if (pModDoc->m_bHasValidPath) { // Check that the file has a user-chosen path
name = pModDoc->GetPathName();
- } else { // if it doesnt, put it in executable dir
- name = CMainFrame::m_csExecutableDirectoryPath + pModDoc->GetTitle();
+ } else { // if it doesnt, put it in settings dir
+ name = theApp.GetConfigPath() + pModDoc->GetTitle();
}
} else {
@@ -271,7 +271,7 @@
CString fullPath = pModDoc->GetPathName();
path = fullPath.Left(fullPath.GetLength()-pModDoc->GetTitle().GetLength()); //remove file name if necessary
} else {
- path = CMainFrame::m_csExecutableDirectoryPath;
+ path = theApp.GetConfigPath();
}
} else {
path = m_csPath;
Modified: trunk/OpenMPT/mptrack/InputHandler.cpp
===================================================================
--- trunk/OpenMPT/mptrack/InputHandler.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/InputHandler.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -23,7 +23,7 @@
activeCommandSet = new CCommandSet();
CCommandSet::s_bShowErrorOnUnknownKeybinding = (CMainFrame::GetMainFrame()->GetPrivateProfileLong("Misc", "ShowErrorOnUnknownKeybinding", 1, theApp.GetConfigFileName()) != 0);
- CString sDefaultPath = CMainFrame::m_csExecutableDirectoryPath + TEXT("Keybindings.mkb");
+ CString sDefaultPath = CString(theApp.GetConfigPath()) + TEXT("Keybindings.mkb");
if (sDefaultPath.GetLength() > MAX_PATH - 1)
sDefaultPath = "";
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -267,8 +267,6 @@
CAutoSaver *CMainFrame::m_pAutoSaver = NULL; //rewbs.autosave
CPerformanceCounter *CMainFrame::m_pPerfCounter = NULL;
-CString CMainFrame::m_csExecutableDirectoryPath = "";
-
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
@@ -285,17 +283,6 @@
CMainFrame::CMainFrame()
//----------------------
{
- {
- char path[_MAX_PATH];
- char exedrive[_MAX_DRIVE];
- char exedir[_MAX_DIR];
- GetModuleFileName(NULL, path, MAX_PATH);
- _splitpath(path, exedrive, exedir, NULL, NULL);
- memset(path, 0, sizeof(path));
- _makepath(path, exedrive, exedir, NULL, NULL);
- m_csExecutableDirectoryPath = path; //path should end with \
- }
-
m_bModTreeHasFocus = false; //rewbs.customKeys
m_pNoteMapHasFocus = NULL; //rewbs.customKeys
m_bOptionsLocked = false; //rewbs.customKeys
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-20 13:44:24 UTC (rev 372)
@@ -383,7 +383,6 @@
CString m_csRegExt;
CString m_csRegSettings;
CString m_csRegWindow;
- static CString m_csExecutableDirectoryPath; //To contain path of executable directory
// Globals
static UINT m_nLastOptionsPage, m_nFilterIndex;
static BOOL gbMdiMaximize;
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -562,7 +562,7 @@
"OpenMPT Color Schemes|*.mptcolor|"
"All Files (*.*)|*.*||",
this);
- dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
+ dlg.m_ofn.lpstrInitialDir = theApp.GetConfigPath();
if (dlg.DoModal() != IDOK) return;
TCHAR sFilename[MAX_PATH];
@@ -584,7 +584,7 @@
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
"OpenMPT Color Schemes|*.mptcolor|",
this);
- dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
+ dlg.m_ofn.lpstrInitialDir = theApp.GetConfigPath();
if (dlg.DoModal() != IDOK) return;
TCHAR sFilename[MAX_PATH];
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -407,11 +407,11 @@
wsprintf(s, "Midi%d", iMidi);
else
wsprintf(s, "Perc%d", iMidi & 0x7F);
- if ((glpMidiLibrary->MidiMap[iMidi][1] == ':') && (lpszConfigFile[1] == ':')
+ /*if ((glpMidiLibrary->MidiMap[iMidi][1] == ':') && (lpszConfigFile[1] == ':')
&& ((glpMidiLibrary->MidiMap[iMidi][0]|0x20) == (lpszConfigFile[0]|0x20)))
{
strcpy(szFileName, glpMidiLibrary->MidiMap[iMidi]+2);
- } else
+ } else*/
{
strcpy(szFileName, glpMidiLibrary->MidiMap[iMidi]);
}
@@ -669,6 +669,129 @@
exit(-1);
}
+void CTrackApp::MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH], TCHAR sNewFileName[_MAX_PATH])
+//-----------------------------------------------------------------------------------------------------------------
+{
+ // copy a config file from the exe directory to the new config dirs
+ TCHAR sOldPath[_MAX_PATH], sNewPath[_MAX_PATH];
+ strcpy(sOldPath, m_szExePath);
+ if(sSubDir[0])
+ strcat(sOldPath, sSubDir);
+ strcat(sOldPath, sFileName);
+
+ strcpy(sNewPath, m_szConfigDirectory);
+ if(sSubDir[0])
+ strcat(sNewPath, sSubDir);
+ if(sNewFileName[0])
+ strcat(sNewPath, sNewFileName);
+ else
+ strcat(sNewPath, sFileName);
+
+ if(PathFileExists(sNewPath) == 0 && PathFileExists(sOldPath) != 0)
+ {
+ MoveFile(sOldPath, sNewPath);
+ }
+}
+
+
+void CTrackApp::SetupPaths()
+//--------------------------
+{
+ if(GetModuleFileName(NULL, m_szExePath, _MAX_PATH))
+ {
+ TCHAR szDrive[_MAX_DRIVE] = "", szDir[_MAX_PATH] = "";
+ _splitpath(m_szExePath, szDrive, szDir, NULL, NULL);
+ strcpy(m_szExePath, szDrive);
+ strcat(m_szExePath, szDir);
+ }
+
+ m_szConfigDirectory[0] = 0;
+ // Try to find a nice directory where we should store our settings (default: %APPDATA%)
+ bool bIsAppDir = false;
+ if(!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, m_szConfigDirectory)))
+ {
+ if(!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, m_szConfigDirectory)))
+ {
+ strcpy(m_szConfigDirectory, m_szExePath);
+ bIsAppDir = true;
+ }
+ }
+
+ // Check if the user prefers to use the app's directory
+ strcpy(m_szConfigFileName, m_szExePath); // config file
+ strcat(m_szConfigFileName, "mptrack.ini");
+ if(GetPrivateProfileInt("Paths", "UseAppDataDirectory", 1, m_szConfigFileName) == 0)
+ {
+ strcpy(m_szConfigDirectory, m_szExePath);
+ bIsAppDir = true;
+ }
+
+ if(!bIsAppDir)
+ {
+ // Store our app settings in %APPDATA% or "My Files"
+ strcat(m_szConfigDirectory, "\\OpenMPT\\");
+
+ // Path doesn't exist yet, so it has to be created
+ if(PathIsDirectory(m_szConfigDirectory) == 0)
+ {
+ CreateDirectory(m_szConfigDirectory, 0);
+ }
+
+ // Move files if necessary.
+ MoveConfigFile("mptrack.ini");
+ MoveConfigFile("plugin.cache");
+ MoveConfigFile("mpt_intl.ini");
+ MoveConfigFile("default.mkb", "", "Keybindings.mkb");
+ }
+
+ // Create tunings dir
+ strcpy(m_szTuningsDirectory, m_szConfigDirectory);
+ strcat(m_szTuningsDirectory, "tunings\\");
+
+ if(PathIsDirectory(m_szTuningsDirectory) == 0)
+ {
+ CreateDirectory(m_szTuningsDirectory, 0);
+ }
+
+ if(!bIsAppDir)
+ {
+ // Import old tunings
+ TCHAR sOldTunings[_MAX_PATH];
+ strcpy(sOldTunings, m_szExePath);
+ strcat(sOldTunings, "tunings\\");
+
+ if(PathIsDirectory(sOldTunings) != 0)
+ {
+ TCHAR sSearchPattern[_MAX_PATH];
+ strcpy(sSearchPattern, sOldTunings);
+ strcat(sSearchPattern, "*.*");
+ WIN32_FIND_DATA FindFileData;
+ HANDLE hFind;
+ hFind = FindFirstFile(sSearchPattern, &FindFileData);
+ if(hFind != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ MoveConfigFile(FindFileData.cFileName, "tunings\\");
+ } while(FindNextFile(hFind, &FindFileData) != 0);
+ }
+ FindClose(hFind);
+ RemoveDirectory(sOldTunings);
+ }
+ }
+
+ // Set up default file locations
+ strcpy(m_szConfigFileName, m_szConfigDirectory); // config file
+ strcat(m_szConfigFileName, "mptrack.ini");
+
+ strcpy(m_szStringsFileName, m_szConfigDirectory); // I18N file
+ strcat(m_szStringsFileName, "mpt_intl.ini");
+
+ strcpy(m_szPluginCacheFileName, m_szConfigDirectory); // plugin cache
+ strcat(m_szPluginCacheFileName, "plugin.cache");
+
+}
+
BOOL CTrackApp::InitInstance()
//----------------------------
{
@@ -711,35 +834,9 @@
// Disabled by rewbs for smoothVST. Might cause minor perf issues due to increased cache misses?
#endif
- m_szConfigFileName[0] = 0;
- m_szStringsFileName[0] = 0;
+ // Set up paths to store configuration in
+ SetupPaths();
- if (GetModuleFileName(NULL, m_szConfigFileName, sizeof(m_szConfigFileName)))
- {
- CHAR szDrive[_MAX_DRIVE]="", szDir[_MAX_PATH]="";
- _splitpath(m_szConfigFileName, szDrive, szDir, NULL, NULL);
- m_szConfigFileName[0] = 0;
- lstrcpyn(m_szConfigFileName, szDrive, sizeof(m_szConfigFileName));
- strncat(m_szConfigFileName, szDir, sizeof(m_szConfigFileName));
- m_szConfigFileName[sizeof(m_szConfigFileName)-1] = 0;
- strncat(m_szConfigFileName, "mptrack.ini", sizeof(m_szConfigFileName));
- m_szConfigFileName[sizeof(m_szConfigFileName)-1] = 0;
-
- m_szPluginCacheFileName[0] = 0;
- lstrcpyn(m_szPluginCacheFileName, szDrive, sizeof(m_szPluginCacheFileName));
- strncat(m_szPluginCacheFileName, szDir, sizeof(m_szPluginCacheFileName));
- m_szPluginCacheFileName[sizeof(m_szPluginCacheFileName)-1] = 0;
- strncat(m_szPluginCacheFileName, "plugin.cache", sizeof(m_szPluginCacheFileName));
- m_szPluginCacheFileName[sizeof(m_szPluginCacheFileName)-1] = 0;
-
- m_szStringsFileName[0] = 0;
- lstrcpyn(m_szStringsFileName, szDrive, sizeof(m_szStringsFileName));
- strncat(m_szStringsFileName, szDir, sizeof(m_szStringsFileName));
- m_szStringsFileName[sizeof(m_szStringsFileName)-1] = 0;
- strncat(m_szStringsFileName, "mpt_intl.ini", sizeof(m_szStringsFileName));
- m_szStringsFileName[sizeof(m_szStringsFileName)-1] = 0;
- }
-
//Force use of custom ini file rather than windowsDir\executableName.ini
if (m_pszProfileName) {
free((void *)m_pszProfileName);
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-09-20 13:44:24 UTC (rev 372)
@@ -140,9 +140,12 @@
HANDLE m_hAlternateResourceHandle;
// Default macro configuration
MODMIDICFG m_MidiCfg;
- CHAR m_szConfigFileName[_MAX_PATH];
- CHAR m_szPluginCacheFileName[_MAX_PATH];
- CHAR m_szStringsFileName[_MAX_PATH];
+ TCHAR m_szExePath[_MAX_PATH];
+ TCHAR m_szConfigDirectory[_MAX_PATH];
+ TCHAR m_szTuningsDirectory[_MAX_PATH];
+ TCHAR m_szConfigFileName[_MAX_PATH];
+ TCHAR m_szPluginCacheFileName[_MAX_PATH];
+ TCHAR m_szStringsFileName[_MAX_PATH];
#ifdef UPDATECHECKENABLED
// Internet request context
@@ -184,6 +187,8 @@
BOOL IsDebug() const { return m_bDebugMode; }
LPCSTR GetConfigFileName() const { return m_szConfigFileName; }
LPCSTR GetPluginCacheFileName() const { return m_szPluginCacheFileName; }
+ LPCSTR GetConfigPath() const { return m_szConfigDirectory; }
+ void SetupPaths();
// Splash Screen
protected:
@@ -261,6 +266,8 @@
private:
static void LoadRegistryDLS();
+
+ void MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = "");
};
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -2896,7 +2896,7 @@
}
// Load local tunings.
- s_pTuningsSharedLocal->SetSavefilePath(std::string(CMainFrame::m_csExecutableDirectoryPath + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
+ s_pTuningsSharedLocal->SetSavefilePath(std::string(std::string(theApp.GetConfigPath()) + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
s_pTuningsSharedLocal->Deserialize();
// Enabling adding/removing of tunings for standard collection
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-20 13:09:20
|
Revision: 371
http://modplug.svn.sourceforge.net/modplug/?rev=371&view=rev
Author: saga-games
Date: 2009-09-20 13:09:10 +0000 (Sun, 20 Sep 2009)
Log Message:
-----------
[Fix] Sequence Editor: Clicking on an order moved it when the mouse button was released after skipping to another order (e.g. during playback) - Bug was introduced with multi-order dragging.
[Fix] S3M Loader: Limit min sample preamp value to 0x10
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-20 13:04:44 UTC (rev 370)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-20 13:09:10 UTC (rev 371)
@@ -659,6 +659,7 @@
SetCurSel(nOrder, true, ih->ShiftPressed());
}
m_bDragging = IsOrderInMargins(m_nScrollPos, oldXScroll) ? false : true;
+
if(m_bDragging == true)
{
m_nDragOrder = GetCurSel(true).nOrdLo;
@@ -695,8 +696,8 @@
// drop before or after the selection
bool bMoveBack = !(m_nDragOrder < (UINT)m_nDropPos);
// don't do anything if drop position is inside the selection
- if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi) return;
- // drag or order or multiple orders?
+ if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi || m_nDragOrder == m_nDropPos) return;
+ // drag one order or multiple orders?
bool bMultiSelection = (selection.nOrdLo != selection.nOrdHi);
for(int i = 0; i <= nMoveCount; i++)
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-09-20 13:04:44 UTC (rev 370)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-09-20 13:09:10 UTC (rev 371)
@@ -276,7 +276,7 @@
m_nDefaultGlobalVolume = psfh.globalvol << 2;
if(!m_nDefaultGlobalVolume && psfh.cwtv < 0x1320) m_nDefaultGlobalVolume = 256; // not very reliable, but it fixes a few tunes
if(m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
- m_nSamplePreAmp = psfh.mastervol & 0x7F; // Bit 8 = Stereo (we always use stereo)
+ m_nSamplePreAmp = CLAMP(psfh.mastervol & 0x7F, 0x10, 0x7F); // Bit 8 = Stereo (we always use stereo)
// Channels
m_nChannels = 4;
for (UINT ich=0; ich<32; ich++)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-09-20 13:04:51
|
Revision: 370
http://modplug.svn.sourceforge.net/modplug/?rev=370&view=rev
Author: relabsoluness
Date: 2009-09-20 13:04:44 +0000 (Sun, 20 Sep 2009)
Log Message:
-----------
[Fix] Pattern tab: Sequence name control wasn't updated properly.
[Mod] Version: Changed version number.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/version.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-18 18:48:59 UTC (rev 369)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-20 13:04:44 UTC (rev 370)
@@ -190,6 +190,7 @@
SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing);
SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetMargins());
CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked
+ SetDlgItemText(IDC_EDIT_SEQUENCE_NAME, m_pSndFile->Order.m_sName);
m_OrderList.SetFocus();
UpdateView(HINT_MODTYPE|HINT_PATNAMES, NULL);
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2009-09-18 18:48:59 UTC (rev 369)
+++ trunk/OpenMPT/mptrack/version.h 2009-09-20 13:04:44 UTC (rev 370)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 17
#define VER_MINOR 03
-#define VER_MINORMINOR 01
+#define VER_MINORMINOR 02
//Creates version number from version parts that appears in version string.
//For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-18 18:49:14
|
Revision: 369
http://modplug.svn.sourceforge.net/modplug/?rev=369&view=rev
Author: saga-games
Date: 2009-09-18 18:48:59 +0000 (Fri, 18 Sep 2009)
Log Message:
-----------
[Fix] ITI Loader/Saver: Forgot to change vibrato sweep settings here in the last commit
[Ref] Some more refactoring
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-18 18:48:59 UTC (rev 369)
@@ -1017,13 +1017,13 @@
}
-BOOL CModDoc::MuteChannel(UINT nChn, BOOL doMute)
+bool CModDoc::MuteChannel(CHANNELINDEX nChn, bool doMute)
//----------------------------------------------
{
DWORD muteType = (CMainFrame::m_dwPatternSetup&PATTERN_SYNCMUTE)? CHN_SYNCMUTE:CHN_MUTE;
if (nChn >= m_SndFile.m_nChannels) {
- return FALSE;
+ return false;
}
//Mark channel as muted in channel settings
@@ -1067,43 +1067,43 @@
CMainFrame::GetMainFrame()->ThreadSafeSetModified(this);
}
- return TRUE;
+ return true;
}
// -> CODE#0012
// -> DESC="midi keyboard split"
-BOOL CModDoc::IsChannelSolo(UINT nChn) const
-//------------------------------------------
+bool CModDoc::IsChannelSolo(CHANNELINDEX nChn) const
+//--------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return TRUE;
- return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SOLO) ? TRUE : FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return true;
+ return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SOLO) ? true : false;
}
-BOOL CModDoc::SoloChannel(UINT nChn, BOOL bSolo)
-//---------------------------------------------
+bool CModDoc::SoloChannel(CHANNELINDEX nChn, bool bSolo)
+//------------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return false;
if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
if (bSolo) m_SndFile.ChnSettings[nChn].dwFlags |= CHN_SOLO;
else m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SOLO;
- return TRUE;
+ return true;
}
// -! NEW_FEATURE#0012
// -> CODE#0015
// -> DESC="channels management dlg"
-BOOL CModDoc::IsChannelNoFx(UINT nChn) const
+bool CModDoc::IsChannelNoFx(CHANNELINDEX nChn) const
//------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return TRUE;
- return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_NOFX) ? TRUE : FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return true;
+ return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_NOFX) ? true : false;
}
-BOOL CModDoc::NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix)
-//--------------------------------------------------------------
+bool CModDoc::NoFxChannel(CHANNELINDEX nChn, bool bNoFx, bool updateMix)
+//----------------------------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return false;
if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
if (bNoFx){
m_SndFile.ChnSettings[nChn].dwFlags |= CHN_NOFX;
@@ -1113,33 +1113,33 @@
m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_NOFX;
if(updateMix) m_SndFile.Chn[nChn].dwFlags &= ~CHN_NOFX;
}
- return TRUE;
+ return true;
}
-BOOL CModDoc::IsChannelRecord1(UINT channel)
-//------------------------------------------
+bool CModDoc::IsChannelRecord1(CHANNELINDEX channel)
+//--------------------------------------------------
{
UINT m = 1 << (channel&7);
- return (MultiRecordMask[channel>>3] & m) ? TRUE : FALSE;
+ return (MultiRecordMask[channel>>3] & m) ? true : false;
}
-BOOL CModDoc::IsChannelRecord2(UINT channel)
-//------------------------------------------
+bool CModDoc::IsChannelRecord2(CHANNELINDEX channel)
+//--------------------------------------------------
{
UINT m = 1 << (channel&7);
- return (MultiSplitRecordMask[channel>>3] & m) ? TRUE : FALSE;
+ return (MultiSplitRecordMask[channel>>3] & m) ? true : false;
}
-BYTE CModDoc::IsChannelRecord(UINT channel)
-//-----------------------------------------
+BYTE CModDoc::IsChannelRecord(CHANNELINDEX channel)
+//-------------------------------------------------
{
if(IsChannelRecord1(channel)) return 1;
if(IsChannelRecord2(channel)) return 2;
return 0;
}
-void CModDoc::Record1Channel(UINT channel, BOOL select)
-//-----------------------------------------------------
+void CModDoc::Record1Channel(CHANNELINDEX channel, bool select)
+//-------------------------------------------------------------
{
UINT m = 1 << (channel&7);
@@ -1153,8 +1153,8 @@
}
}
-void CModDoc::Record2Channel(UINT channel, BOOL select)
-//-----------------------------------------------------
+void CModDoc::Record2Channel(CHANNELINDEX channel, bool select)
+//-------------------------------------------------------------
{
UINT m = 1 << (channel&7);
@@ -1168,7 +1168,7 @@
}
}
-void CModDoc::ReinitRecordState(BOOL unselect)
+void CModDoc::ReinitRecordState(bool unselect)
//--------------------------------------------
{
memset(MultiRecordMask, unselect ? 0 : 0xff, sizeof(MultiRecordMask));
@@ -1177,31 +1177,31 @@
// -! NEW_FEATURE#0015
-BOOL CModDoc::MuteSample(UINT nSample, BOOL bMute)
-//------------------------------------------------
+bool CModDoc::MuteSample(SAMPLEINDEX nSample, bool bMute)
+//-------------------------------------------------------
{
- if ((nSample < 1) || (nSample > m_SndFile.m_nSamples)) return FALSE;
+ if ((nSample < 1) || (nSample > m_SndFile.m_nSamples)) return false;
if (bMute) m_SndFile.Samples[nSample].uFlags |= CHN_MUTE;
else m_SndFile.Samples[nSample].uFlags &= ~CHN_MUTE;
- return TRUE;
+ return true;
}
-BOOL CModDoc::MuteInstrument(UINT nInstr, BOOL bMute)
-//---------------------------------------------------
+bool CModDoc::MuteInstrument(INSTRUMENTINDEX nInstr, bool bMute)
+//--------------------------------------------------------------
{
- if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return FALSE;
+ if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false;
if (bMute) m_SndFile.Instruments[nInstr]->dwFlags |= ENV_MUTE;
else m_SndFile.Instruments[nInstr]->dwFlags &= ~ENV_MUTE;
- return TRUE;
+ return true;
}
-BOOL CModDoc::SurroundChannel(UINT nChn, BOOL bSurround)
-//------------------------------------------------------
+bool CModDoc::SurroundChannel(CHANNELINDEX nChn, bool bSurround)
+//--------------------------------------------------------------
{
DWORD d = (bSurround) ? CHN_SURROUND : 0;
- if (nChn >= m_SndFile.m_nChannels) return FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return false;
if (!(m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) d = 0;
if (d != (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SURROUND))
{
@@ -1212,68 +1212,68 @@
}
if (d) m_SndFile.Chn[nChn].dwFlags |= CHN_SURROUND;
else m_SndFile.Chn[nChn].dwFlags &= ~CHN_SURROUND;
- return TRUE;
+ return true;
}
-BOOL CModDoc::SetChannelGlobalVolume(UINT nChn, UINT nVolume)
-//-----------------------------------------------------------
+bool CModDoc::SetChannelGlobalVolume(CHANNELINDEX nChn, UINT nVolume)
+//-------------------------------------------------------------------
{
- BOOL bOk = FALSE;
- if ((nChn >= m_SndFile.m_nChannels) || (nVolume > 64)) return FALSE;
+ bool bOk = false;
+ if ((nChn >= m_SndFile.m_nChannels) || (nVolume > 64)) return false;
if (m_SndFile.ChnSettings[nChn].nVolume != nVolume)
{
m_SndFile.ChnSettings[nChn].nVolume = nVolume;
if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
- bOk = TRUE;
+ bOk = true;
}
m_SndFile.Chn[nChn].nGlobalVol = nVolume;
return bOk;
}
-BOOL CModDoc::SetChannelDefaultPan(UINT nChn, UINT nPan)
-//------------------------------------------------------
+bool CModDoc::SetChannelDefaultPan(CHANNELINDEX nChn, UINT nPan)
+//--------------------------------------------------------------
{
- BOOL bOk = FALSE;
- if ((nChn >= m_SndFile.m_nChannels) || (nPan > 256)) return FALSE;
+ bool bOk = false;
+ if ((nChn >= m_SndFile.m_nChannels) || (nPan > 256)) return false;
if (m_SndFile.ChnSettings[nChn].nPan != nPan)
{
m_SndFile.ChnSettings[nChn].nPan = nPan;
if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
- bOk = TRUE;
+ bOk = true;
}
m_SndFile.Chn[nChn].nPan = nPan;
return bOk;
}
-BOOL CModDoc::IsChannelMuted(UINT nChn) const
-//-------------------------------------------
+bool CModDoc::IsChannelMuted(CHANNELINDEX nChn) const
+//---------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return TRUE;
- return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_MUTE) ? TRUE : FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return true;
+ return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_MUTE) ? true : false;
}
-BOOL CModDoc::IsSampleMuted(UINT nSample) const
-//---------------------------------------------
+bool CModDoc::IsSampleMuted(SAMPLEINDEX nSample) const
+//----------------------------------------------------
{
- if ((!nSample) || (nSample > m_SndFile.m_nSamples)) return FALSE;
- return (m_SndFile.Samples[nSample].uFlags & CHN_MUTE) ? TRUE : FALSE;
+ if ((!nSample) || (nSample > m_SndFile.m_nSamples)) return false;
+ return (m_SndFile.Samples[nSample].uFlags & CHN_MUTE) ? true : false;
}
-BOOL CModDoc::IsInstrumentMuted(UINT nInstr) const
-//------------------------------------------------
+bool CModDoc::IsInstrumentMuted(INSTRUMENTINDEX nInstr) const
+//-----------------------------------------------------------
{
- if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return FALSE;
- return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? TRUE : FALSE;
+ if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false;
+ return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? true : false;
}
-UINT CModDoc::GetPatternSize(UINT nPat) const
-//-------------------------------------------
+UINT CModDoc::GetPatternSize(PATTERNINDEX nPat) const
+//---------------------------------------------------
{
if ((nPat < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[nPat])) return m_SndFile.PatternSize[nPat];
return 0;
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-18 18:48:59 UTC (rev 369)
@@ -150,8 +150,8 @@
void PostMessageToAllViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0);
void SendMessageToActiveViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0);
UINT GetModType() const { return m_SndFile.m_nType; }
- BOOL GetNumInstruments() const { return m_SndFile.m_nInstruments; }
- BOOL GetNumSamples() const { return m_SndFile.m_nSamples; }
+ INSTRUMENTINDEX GetNumInstruments() const { return m_SndFile.m_nInstruments; }
+ SAMPLEINDEX GetNumSamples() const { return m_SndFile.m_nSamples; }
BOOL AddToLog(LPCSTR lpszLog);
LPCSTR GetLog() const { return m_lpszLog; }
BOOL ClearLog();
@@ -211,33 +211,33 @@
BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params
BOOL IsNotePlaying(UINT note, UINT nsmp=0, UINT nins=0);
- BOOL MuteChannel(UINT nChn, BOOL bMute);
- BOOL MuteSample(UINT nSample, BOOL bMute);
- BOOL MuteInstrument(UINT nInstr, BOOL bMute);
+ bool MuteChannel(CHANNELINDEX nChn, bool bMute);
+ bool MuteSample(SAMPLEINDEX nSample, bool bMute);
+ bool MuteInstrument(INSTRUMENTINDEX nInstr, bool bMute);
// -> CODE#0012
// -> DESC="midi keyboard split"
- BOOL SoloChannel(UINT nChn, BOOL bSolo);
- BOOL IsChannelSolo(UINT nChn) const;
+ bool SoloChannel(CHANNELINDEX nChn, bool bSolo);
+ bool IsChannelSolo(CHANNELINDEX nChn) const;
// -! NEW_FEATURE#0012
- BOOL SurroundChannel(UINT nChn, BOOL bSurround);
- BOOL SetChannelGlobalVolume(UINT nChn, UINT nVolume);
- BOOL SetChannelDefaultPan(UINT nChn, UINT nPan);
- BOOL IsChannelMuted(UINT nChn) const;
- BOOL IsSampleMuted(UINT nSample) const;
- BOOL IsInstrumentMuted(UINT nInstr) const;
+ bool SurroundChannel(CHANNELINDEX nChn, bool bSurround);
+ bool SetChannelGlobalVolume(CHANNELINDEX nChn, UINT nVolume);
+ bool SetChannelDefaultPan(CHANNELINDEX nChn, UINT nPan);
+ bool IsChannelMuted(CHANNELINDEX nChn) const;
+ bool IsSampleMuted(SAMPLEINDEX nSample) const;
+ bool IsInstrumentMuted(INSTRUMENTINDEX nInstr) const;
// -> CODE#0015
// -> DESC="channels management dlg"
- BOOL NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix = TRUE);
- BOOL IsChannelNoFx(UINT nChn) const;
- BOOL IsChannelRecord1(UINT channel);
- BOOL IsChannelRecord2(UINT channel);
- BYTE IsChannelRecord(UINT channel);
- void Record1Channel(UINT channel, BOOL select = TRUE);
- void Record2Channel(UINT channel, BOOL select = TRUE);
- void ReinitRecordState(BOOL unselect = TRUE);
+ bool NoFxChannel(CHANNELINDEX nChn, bool bNoFx, bool updateMix = true);
+ bool IsChannelNoFx(CHANNELINDEX nChn) const;
+ bool IsChannelRecord1(CHANNELINDEX channel);
+ bool IsChannelRecord2(CHANNELINDEX channel);
+ BYTE IsChannelRecord(CHANNELINDEX channel);
+ void Record1Channel(CHANNELINDEX channel, bool select = true);
+ void Record2Channel(CHANNELINDEX channel, bool select = true);
+ void ReinitRecordState(bool unselect = true);
// -! NEW_FEATURE#0015
- UINT GetNumChannels() const { return m_SndFile.m_nChannels; }
- UINT GetPatternSize(UINT nPat) const;
+ CHANNELINDEX GetNumChannels() const { return m_SndFile.m_nChannels; }
+ UINT GetPatternSize(PATTERNINDEX nPat) const;
BOOL AdjustEndOfSample(UINT nSample);
BOOL IsChildSample(UINT nIns, UINT nSmp) const;
UINT FindSampleParent(UINT nSmp) const;
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-18 18:48:59 UTC (rev 369)
@@ -2537,8 +2537,8 @@
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
- UINT nSamples = pModDoc->GetNumSamples();
- UINT nInstruments = pModDoc->GetNumInstruments();
+ SAMPLEINDEX nSamples = pModDoc->GetNumSamples();
+ INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
if ((dwItemType == MODITEM_SAMPLE) && (!nInstruments))
{
for (UINT i=1; i<=nSamples; i++)
@@ -2568,8 +2568,8 @@
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
- UINT nSamples = pModDoc->GetNumSamples();
- UINT nInstruments = pModDoc->GetNumInstruments();
+ SAMPLEINDEX nSamples = pModDoc->GetNumSamples();
+ INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
if ((dwItemType == MODITEM_SAMPLE) || (dwItemType == MODITEM_INSTRUMENT))
{
for (UINT i=1; i<=nSamples; i++)
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-18 18:48:59 UTC (rev 369)
@@ -1362,9 +1362,9 @@
if (!k)
{
xih.vibtype = Samples[n].nVibType;
- xih.vibsweep = Samples[n].nVibSweep;
- xih.vibdepth = Samples[n].nVibDepth;
- xih.vibrate = Samples[n].nVibRate;
+ xih.vibsweep = min(Samples[n].nVibSweep, 255);
+ xih.vibdepth = min(Samples[n].nVibDepth, 15);
+ xih.vibrate = min(Samples[n].nVibRate, 63);
}
if (nsamples < 32) smptable[nsamples++] = n;
k = nsamples - 1;
@@ -1693,7 +1693,7 @@
if (pSmp->nPan > 256) pSmp->nPan = 256;
if (pis->dfp & 0x80) pSmp->uFlags |= CHN_PANNING;
pSmp->nVibType = autovibit2xm[pis->vit & 7];
- pSmp->nVibSweep = (pis->vir + 3) / 4;
+ pSmp->nVibSweep = pis->vir;
pSmp->nVibDepth = pis->vid;
pSmp->nVibRate = pis->vis;
UINT flags = (pis->cvt & 1) ? RS_PCM8S : RS_PCM8U;
@@ -1944,9 +1944,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep*4 : 255;
- itss.vid = psmp->nVibDepth;
- itss.vis = psmp->nVibRate;
+ itss.vir = min(psmp->nVibSweep, 255);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vis = min(psmp->nVibRate, 64);
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
itss.cvt = 0x01;
smpsize = psmp->nLength;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-18 18:48:59 UTC (rev 369)
@@ -40,6 +40,7 @@
BYTE nVibSweep;
BYTE nVibDepth;
BYTE nVibRate;
+ CHAR name[32];
CHAR filename[22];
// Return the size of one (elementary) sample in bytes.
@@ -545,7 +546,10 @@
public: // for Editing
CModDoc* m_pModDoc;
- UINT m_nType, m_nChannels, m_nSamples, m_nInstruments;
+ UINT m_nType;
+ CHANNELINDEX m_nChannels;
+ SAMPLEINDEX m_nSamples;
+ INSTRUMENTINDEX m_nInstruments;
UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume;
DWORD m_dwSongFlags; // Song flags SONG_XXXX
bool m_bIsRendering;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-17 16:11:58
|
Revision: 368
http://modplug.svn.sourceforge.net/modplug/?rev=368&view=rev
Author: saga-games
Date: 2009-09-17 16:11:47 +0000 (Thu, 17 Sep 2009)
Log Message:
-----------
[Fix] Sample Editor: Limit sample vibrato fields properly. Vibrato Sweep ranges from 0 to 255 now.
[Fix] IT Compatibility: Better sample vibrato compatibility. Vibrato Sweep isn't perfect yet, though.
[Mod] Sequence view: Also grey out "Render to wave" menu item if no valid order is selected
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -897,7 +897,7 @@
}
}
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_RENDER, "Render to &Wave");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_RENDER, "Render to &Wave");
ClientToScreen(&pt);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -228,14 +228,24 @@
m_SpinPanning.SetRange(0, 64);
}
//end rewbs.fix36944
+
+ // Auto vibrato
m_ComboAutoVib.AddString("Sine");
m_ComboAutoVib.AddString("Square");
m_ComboAutoVib.AddString("Ramp Up");
m_ComboAutoVib.AddString("Ramp Down");
m_ComboAutoVib.AddString("Random");
- m_SpinVibSweep.SetRange(0, 64);
- m_SpinVibDepth.SetRange(0, 64);
- m_SpinVibRate.SetRange(0, 64);
+ m_SpinVibSweep.SetRange(0, 255);
+ if(m_pSndFile->m_nType & MOD_TYPE_XM)
+ {
+ m_SpinVibDepth.SetRange(0, 15);
+ m_SpinVibRate.SetRange(0, 63);
+ } else
+ {
+ m_SpinVibDepth.SetRange(0, 32);
+ m_SpinVibRate.SetRange(0, 64);
+ }
+
for (UINT i=BASENOTE_MIN; i<BASENOTE_MAX; i++)
{
CHAR s[32];
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -751,7 +751,7 @@
pSmp->nVibType = autovibit2xm[pis.vit & 7];
pSmp->nVibRate = pis.vis;
pSmp->nVibDepth = pis.vid & 0x7F;
- pSmp->nVibSweep = (pis.vir + 3) / 4;
+ pSmp->nVibSweep = pis.vir;
if(pis.length){
pSmp->nLength = pis.length;
if (pSmp->nLength > MAX_SAMPLE_LENGTH) pSmp->nLength = MAX_SAMPLE_LENGTH;
@@ -1231,7 +1231,7 @@
pSmp->nVibType = autovibit2xm[pis->vit & 7];
pSmp->nVibRate = pis->vis;
pSmp->nVibDepth = pis->vid & 0x7F;
- pSmp->nVibSweep = (pis->vir + 3) / 4;
+ pSmp->nVibSweep = pis->vir; //(pis->vir + 3) / 4;
if ((pis->samplepointer) && (pis->samplepointer < dwMemLength) && (pis->length))
{
pSmp->nLength = pis->length;
@@ -1719,9 +1719,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vis = psmp->nVibRate;
- itss.vid = psmp->nVibDepth;
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
+ itss.vis = min(psmp->nVibRate, 64);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vir = min(psmp->nVibSweep, 255); //(psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
@@ -2351,9 +2351,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vis = psmp->nVibRate;
- itss.vid = psmp->nVibDepth;
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
+ itss.vis = min(psmp->nVibRate, 64);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vir = min(psmp->nVibSweep, 255); //(psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
@@ -2987,9 +2987,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vis = psmp->nVibRate;
- itss.vid = psmp->nVibDepth;
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
+ itss.vis = min(psmp->nVibRate, 64);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vir = min(psmp->nVibSweep, 255);
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -954,9 +954,9 @@
{
MODSAMPLE *pvib = &Samples[smptable[0]];
xmsh.vibtype = pvib->nVibType;
- xmsh.vibsweep = pvib->nVibSweep;
- xmsh.vibdepth = pvib->nVibDepth;
- xmsh.vibrate = pvib->nVibRate;
+ xmsh.vibsweep = min(pvib->nVibSweep, 0xFF);
+ xmsh.vibdepth = min(pvib->nVibDepth, 0x0F);
+ xmsh.vibrate = min(pvib->nVibRate, 0x3F);
}
WORD samples = xmih.samples;
xmih.samples = LittleEndianW(xmih.samples);
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -1448,19 +1448,28 @@
//if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPan = pChn->nRealPan; // TODO
}
int nPeriodFrac = 0;
- // Instrument Auto-Vibrato
+ // Sample Auto-Vibrato
if ((pChn->pModSample) && (pChn->pModSample->nVibDepth))
{
MODSAMPLE *pSmp = pChn->pModSample;
- if (pSmp->nVibSweep == 0)
+ if (pSmp->nVibSweep == 0 && !IsCompatibleMode(TRK_IMPULSETRACKER))
{
pChn->nAutoVibDepth = pSmp->nVibDepth << 8;
} else
{
if (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))
{
- pChn->nAutoVibDepth += pSmp->nVibSweep << 3;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ {
+ // TODO
+ pChn->nAutoVibDepth += pSmp->nVibSweep << 3;
+ } else
+ {
+ /* Note: changed bitshift from 3 to 1 as the variable is not divided by 4 in the IT loader anymore
+ - so we divide sweep by 4 here. */
+ pChn->nAutoVibDepth += pSmp->nVibSweep << 1;
+ }
} else
if (!(pChn->dwFlags & CHN_KEYOFF))
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-16 22:46:55
|
Revision: 367
http://modplug.svn.sourceforge.net/modplug/?rev=367&view=rev
Author: saga-games
Date: 2009-09-16 22:46:46 +0000 (Wed, 16 Sep 2009)
Log Message:
-----------
[Fix] XM Loader: Can now load XM Version 1.02 and 1.03. Made XM Loader and Saver a bit more readable.
[Imp] XM Loader: Detect non-mpt modules more reliably
[Mod] Color Presets: Use app directory as default directory in file dialog
[Ref] Made GetZxxType / CreateZxxFromType static so they can be used in CTrackApp for initialization
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-16 22:46:46 UTC (rev 367)
@@ -181,8 +181,8 @@
int MacroToPlugParam(CString value); //rewbs.xinfo
int MacroToMidiCC(CString value);
int FindMacroForParam(long param);
- int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
- void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
+ static int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
+ static void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
void SongProperties();
// operations
public:
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-16 22:46:46 UTC (rev 367)
@@ -562,8 +562,8 @@
"OpenMPT Color Schemes|*.mptcolor|"
"All Files (*.*)|*.*||",
this);
+ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
if (dlg.DoModal() != IDOK) return;
-
TCHAR sFilename[MAX_PATH];
strcpy(sFilename, dlg.GetPathName());
@@ -584,6 +584,7 @@
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
"OpenMPT Color Schemes|*.mptcolor|",
this);
+ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
if (dlg.DoModal() != IDOK) return;
TCHAR sFilename[MAX_PATH];
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-16 22:46:46 UTC (rev 367)
@@ -622,7 +622,7 @@
strcpy(&m_MidiCfg.szMidiGlb[MIDIOUT_NOTEOFF*32], "9c n 0");
strcpy(&m_MidiCfg.szMidiGlb[MIDIOUT_PROGRAM*32], "Cc p");
strcpy(&m_MidiCfg.szMidiSFXExt[0], "F0F000z");
- for (int iz=0; iz<16; iz++) wsprintf(&m_MidiCfg.szMidiZXXExt[iz*32], "F0F001%02X", iz*8);
+ CModDoc::CreateZxxFromType(m_MidiCfg.szMidiZXXExt, 1);
#ifdef UPDATECHECKENABLED
m_pRequestContext = NULL;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 22:46:46 UTC (rev 367)
@@ -24,16 +24,16 @@
#pragma pack(1)
typedef struct tagXMFILEHEADER
{
- DWORD size;
- WORD norder;
- WORD restartpos;
- WORD channels;
- WORD patterns;
- WORD instruments;
- WORD flags;
- WORD speed;
- WORD tempo;
- BYTE order[256];
+ WORD xmversion; // current: 0x0104
+ DWORD size; // header size
+ WORD orders; // number of orders
+ WORD restartpos; // restart position
+ WORD channels; // number of channels
+ WORD patterns; // number of patterns
+ WORD instruments; // number of instruments
+ WORD flags; // song flags
+ WORD speed; // default speed
+ WORD tempo; // default tempo
} XMFILEHEADER;
@@ -57,8 +57,13 @@
BYTE vtype, ptype;
BYTE vibtype, vibsweep, vibdepth, vibrate;
WORD volfade;
- WORD res;
- BYTE reserved1[20];
+ // midi extensions (not read by MPT)
+ BYTE midienabled; // 0/1
+ BYTE midichannel; // 0...15
+ WORD midiprogram; // 0...127
+ WORD pitchwheelrange; // 0...36 (halftones)
+ BYTE mutecomputer; // 0/1
+ BYTE reserved1[15];
} XMSAMPLEHEADER;
typedef struct tagXMSAMPLESTRUCT
@@ -77,138 +82,80 @@
#pragma pack()
-bool CSoundFile::ReadXM(const BYTE *lpStream, DWORD dwMemLength)
-//--------------------------------------------------------------
+// Read .XM patterns
+DWORD ReadXMPatterns(const BYTE *lpStream, DWORD dwMemLength, DWORD dwMemPos, XMFILEHEADER *xmheader, CSoundFile *pSndFile)
+//-------------------------------------------------------------------------------------------------------------------------
{
- XMSAMPLEHEADER xmsh;
- XMSAMPLESTRUCT xmss;
- DWORD dwMemPos, dwHdrSize;
- WORD norders=0, restartpos=0, channels=0, patterns=0, instruments=0;
- WORD xmflags=0;
- BYTE InstUsed[256];
-// -> CODE#0006
-// -> DESC="misc quantity changes"
-// BYTE channels_used[MAX_CHANNELS];
- BYTE channels_used[MAX_BASECHANNELS];
-// -! BEHAVIOUR_CHANGE#0006
+ BYTE patterns_used[256];
BYTE pattern_map[256];
- BYTE samples_used[(MAX_SAMPLES+7)/8];
- UINT unused_samples;
- bool bMadeWithModPlug = false, bProbablyMadeWithModPlug = false;
- // set this here already because XMs compressed with BoobieSqueezer will exit the function early
- SetModFlag(MSF_COMPATIBLE_PLAY, true);
-
- m_nChannels = 0;
- if ((!lpStream) || (dwMemLength < 0xAA)) return false; // the smallest XM I know is 174 Bytes
- if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return false;
-
- memcpy(m_szNames[0], lpStream + 17, 20);
- // look for null-terminated song name - that's most likely a tune made with modplug
- for(int i = 0; i < 20; i++)
- if(lpStream[17 + i] == 0) bProbablyMadeWithModPlug = true;
-
- dwHdrSize = LittleEndian(*((DWORD *)(lpStream+60)));
- norders = LittleEndianW(*((WORD *)(lpStream+64)));
- if ((!norders) || (norders > MAX_ORDERS)) return false;
- restartpos = LittleEndianW(*((WORD *)(lpStream+66)));
- channels = LittleEndianW(*((WORD *)(lpStream+68)));
-// -> CODE#0006
-// -> DESC="misc quantity changes"
-// if ((!channels) || (channels > 64)) return false;
- if ((!channels) || (channels > MAX_BASECHANNELS)) return false;
-// -! BEHAVIOUR_CHANGE#0006
-
- m_nType = MOD_TYPE_XM;
- m_nMinPeriod = 27;
- m_nMaxPeriod = 54784;
- m_nChannels = channels;
- if (restartpos < norders) m_nRestartPos = restartpos;
- patterns = CLAMP(LittleEndianW(*((WORD *)(lpStream+70))), 0, 256);
- instruments = LittleEndianW(*((WORD *)(lpStream+72)));
- if (instruments >= MAX_INSTRUMENTS) instruments = MAX_INSTRUMENTS-1;
- m_nInstruments = instruments;
- m_nSamples = 0;
- memcpy(&xmflags, lpStream + 74, 2);
- xmflags = LittleEndianW(xmflags);
- if (xmflags & 1) m_dwSongFlags |= SONG_LINEARSLIDES;
- if (xmflags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE;
- m_nDefaultSpeed = CLAMP(LittleEndianW(*((WORD *)(lpStream+76))), 1, 31);
-// -> CODE#0016
-// -> DESC="default tempo update"
- m_nDefaultTempo = CLAMP(LittleEndianW(*((WORD *)(lpStream+78))), 32, 512);
-// -! BEHAVIOUR_CHANGE#0016
- Order.ReadAsByte(lpStream+80, norders, dwMemLength-80);
- memset(InstUsed, 0, sizeof(InstUsed));
- if (patterns > MAX_PATTERNS)
+ memset(patterns_used, 0, sizeof(patterns_used));
+ if (xmheader->patterns > MAX_PATTERNS)
{
UINT i, j;
- for (i=0; i<norders; i++)
+ for (i = 0; i < xmheader->orders; i++)
{
- if (Order[i] < patterns) InstUsed[Order[i]] = true;
+ if (pSndFile->Order[i] < xmheader->patterns) patterns_used[pSndFile->Order[i]] = true;
}
j = 0;
- for (i=0; i<256; i++)
+ for (i = 0; i < 256; i++)
{
- if (InstUsed[i]) pattern_map[i] = j++;
+ if (patterns_used[i]) pattern_map[i] = j++;
}
- for (i=0; i<256; i++)
+ for (i = 0; i < 256; i++)
{
- if (!InstUsed[i])
+ if (!patterns_used[i])
{
pattern_map[i] = (j < MAX_PATTERNS) ? j : 0xFE;
j++;
}
}
- for (i=0; i<norders; i++)
+ for (i = 0; i < xmheader->orders; i++)
{
- Order[i] = pattern_map[Order[i]];
+ pSndFile->Order[i] = pattern_map[pSndFile->Order[i]];
}
} else
{
- for (UINT i=0; i<256; i++) pattern_map[i] = i;
+ for (UINT i = 0; i < 256; i++) pattern_map[i] = i;
}
- memset(InstUsed, 0, sizeof(InstUsed));
- dwMemPos = dwHdrSize + 60;
- if (dwMemPos + 8 >= dwMemLength) return true;
+ if (dwMemPos + 8 >= dwMemLength) return dwMemPos;
// Reading patterns
- memset(channels_used, 0, sizeof(channels_used));
- for (UINT ipat=0; ipat<patterns; ipat++)
+ for (UINT ipat = 0; ipat < xmheader->patterns; ipat++)
{
UINT ipatmap = pattern_map[ipat];
DWORD dwSize = 0;
- WORD rows=64, packsize=0;
+ WORD rows = 64, packsize = 0;
dwSize = LittleEndian(*((DWORD *)(lpStream + dwMemPos)));
- /*while ((dwMemPos + dwSize >= dwMemLength) || (dwSize & 0xFFFFFF00))
+
+ if(xmheader->xmversion == 0x0102)
{
- if (dwMemPos + 4 >= dwMemLength) break;
- dwMemPos++;
- dwSize = LittleEndian(*((DWORD *)(lpStream+dwMemPos)));
- }*/
- rows = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 5)));
-// -> CODE#0008
-// -> DESC="#define to set pattern size"
-// if ((!rows) || (rows > 256)) rows = 64;
+ rows = *((BYTE *)(lpStream + dwMemPos + 5)) + 1;
+ packsize = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 6)));
+ }
+ else
+ {
+ rows = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 5)));
+ packsize = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 7)));
+ }
+
if ((!rows) || (rows > MAX_PATTERN_ROWS)) rows = 64;
-// -> BEHAVIOUR_CHANGE#0008
- packsize = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 7)));
- if (dwMemPos + dwSize + 4 > dwMemLength) return true;
+ if (dwMemPos + dwSize + 4 > dwMemLength) return 0;
dwMemPos += dwSize;
- if (dwMemPos + packsize > dwMemLength) return true;
+ if (dwMemPos + packsize > dwMemLength) return 0;
MODCOMMAND *p;
if (ipatmap < MAX_PATTERNS)
{
- if(Patterns.Insert(ipatmap, rows))
+ if(pSndFile->Patterns.Insert(ipatmap, rows))
return true;
if (!packsize) continue;
- p = Patterns[ipatmap];
+ p = pSndFile->Patterns[ipatmap];
} else p = NULL;
const BYTE *src = lpStream+dwMemPos;
UINT j=0;
for (UINT row=0; row<rows; row++)
{
- for (UINT chn=0; chn<m_nChannels; chn++)
+ for (UINT chn=0; chn < xmheader->channels; chn++)
{
if ((p) && (j < packsize))
{
@@ -231,10 +178,8 @@
}
if (p->note == 97) p->note = 0xFF; else
if ((p->note) && (p->note < 97)) p->note += 12;
- if (p->note) channels_used[chn] = 1;
- if (p->command | p->param) ConvertModCommand(p);
+ if (p->command | p->param) pSndFile->ConvertModCommand(p);
if (p->instr == 0xff) p->instr = 0;
- if (p->instr) InstUsed[p->instr] = TRUE;
if ((vol >= 0x10) && (vol <= 0x50))
{
p->volcmd = VOLCMD_VOLUME;
@@ -287,17 +232,77 @@
}
dwMemPos += packsize;
}
- // Wrong offset check
- while (dwMemPos + 4 < dwMemLength)
+ return dwMemPos;
+}
+
+bool CSoundFile::ReadXM(const BYTE *lpStream, DWORD dwMemLength)
+//--------------------------------------------------------------
+{
+ XMFILEHEADER xmheader;
+ XMSAMPLEHEADER xmsh;
+ XMSAMPLESTRUCT xmss;
+ DWORD dwMemPos;
+ BYTE samples_used[(MAX_SAMPLES + 7) / 8]; // for removing unused samples
+ UINT unused_samples; // dito
+
+ bool bMadeWithModPlug = false, bProbablyMadeWithModPlug = false, bIsFT2 = false;
+ // set this here already because XMs compressed with BoobieSqueezer will exit the function early
+ SetModFlag(MSF_COMPATIBLE_PLAY, true);
+
+ m_nChannels = 0;
+ if ((!lpStream) || (dwMemLength < 0xAA)) return false; // the smallest XM I know is 174 Bytes
+ if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return false;
+
+ memcpy(m_szNames[0], lpStream + 17, 20);
+ // look for null-terminated song name - that's most likely a tune made with modplug
+ for(int i = 0; i < 20; i++)
+ if(lpStream[17 + i] == 0) bProbablyMadeWithModPlug = true;
+
+ // load and convert header
+ memcpy(&xmheader, lpStream + 58, sizeof(XMFILEHEADER));
+ xmheader.size = LittleEndian(xmheader.size);
+ xmheader.xmversion = LittleEndianW(xmheader.xmversion);
+ xmheader.orders = LittleEndianW(xmheader.orders);
+ xmheader.restartpos = LittleEndianW(xmheader.restartpos);
+ xmheader.channels = LittleEndianW(xmheader.channels);
+ xmheader.patterns = LittleEndianW(xmheader.patterns);
+ xmheader.instruments = LittleEndianW(xmheader.instruments);
+ xmheader.flags = LittleEndianW(xmheader.flags);
+ xmheader.speed = LittleEndianW(xmheader.speed);
+ xmheader.tempo = LittleEndianW(xmheader.tempo);
+
+ m_nType = MOD_TYPE_XM;
+ m_nMinPeriod = 27;
+ m_nMaxPeriod = 54784;
+
+ if ((!xmheader.orders) || (xmheader.orders > MAX_ORDERS)) return false;
+ if ((!xmheader.channels) || (xmheader.channels > MAX_BASECHANNELS)) return false;
+ if (xmheader.channels > 32) bMadeWithModPlug = true;
+ m_nRestartPos = xmheader.restartpos;
+ m_nChannels = xmheader.channels;
+ m_nInstruments = min(xmheader.instruments, MAX_INSTRUMENTS - 1);
+ m_nSamples = 0;
+ m_nDefaultSpeed = CLAMP(xmheader.speed, 1, 31);
+ m_nDefaultTempo = CLAMP(xmheader.tempo, 32, 512);
+
+ if(xmheader.flags & 1) m_dwSongFlags |= SONG_LINEARSLIDES;
+ if(xmheader.flags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE;
+
+ Order.ReadAsByte(lpStream + 80, xmheader.orders, dwMemLength - 80);
+
+ dwMemPos = xmheader.size + 60;
+
+ if(xmheader.xmversion >= 0x0104)
{
- DWORD d = LittleEndian(*((DWORD *)(lpStream+dwMemPos)));
- if (d < 0x300) break;
- dwMemPos++;
+ if (dwMemPos + 8 >= dwMemLength) return true;
+ dwMemPos = ReadXMPatterns(lpStream, dwMemLength, dwMemPos, &xmheader, this);
+ if(dwMemPos == 0) return true;
}
+
memset(samples_used, 0, sizeof(samples_used));
unused_samples = 0;
// Reading instruments
- for (UINT iIns=1; iIns<=instruments; iIns++)
+ for (INSTRUMENTINDEX iIns = 1; iIns <= m_nInstruments; iIns++)
{
XMINSTRUMENTHEADER *pih;
BYTE flags[32];
@@ -318,9 +323,6 @@
Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
memcpy(Instruments[iIns]->name, pih->name, 22);
- // look for null-terminated instr name - that's most likely a tune made with modplug
- for(int i = 0; i < 22; i++)
- if(pih->name[i] == 0) bProbablyMadeWithModPlug = true;
if ((nsamples = pih->samples) > 0)
{
@@ -344,7 +346,12 @@
xmsh.penv[i] = LittleEndianW(xmsh.penv[i]);
}
xmsh.volfade = LittleEndianW(xmsh.volfade);
- xmsh.res = LittleEndianW(xmsh.res);
+ xmsh.midiprogram = LittleEndianW(xmsh.midiprogram);
+ xmsh.pitchwheelrange = LittleEndianW(xmsh.pitchwheelrange);
+
+ if(xmsh.midichannel != 0 || xmsh.midienabled != 0 || xmsh.midiprogram != 0 || xmsh.mutecomputer != 0 || xmsh.pitchwheelrange != 0)
+ bIsFT2 = true; // definitely not MPT. (or any other tracker)
+
dwMemPos += LittleEndian(pih->size);
} else
{
@@ -547,9 +554,6 @@
pSmp->nVibRate = xmsh.vibrate;
memcpy(pSmp->filename, xmss.name, 22);
pSmp->filename[21] = 0;
- // look for null-terminated sample name - that's most likely a tune made with modplug
- for(int i = 0; i < 22; i++)
- if(xmss.name[i] == 0) bProbablyMadeWithModPlug = true;
}
#if 0
if ((xmsh.reserved2 > nsamples) && (xmsh.reserved2 <= 16))
@@ -557,16 +561,35 @@
dwMemPos += (((UINT)xmsh.reserved2) - nsamples) * xmsh.shsize;
}
#endif
- for (UINT ismpd=0; ismpd<nsamples; ismpd++)
+ if(xmheader.xmversion >= 0x0104)
{
- if ((samplemap[ismpd]) && (samplesize[ismpd]) && (dwMemPos < dwMemLength))
+ for (UINT ismpd = 0; ismpd < nsamples; ismpd++)
{
- ReadSample(&Samples[samplemap[ismpd]], flags[ismpd], (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
+ if ((samplemap[ismpd]) && (samplesize[ismpd]) && (dwMemPos < dwMemLength))
+ {
+ ReadSample(&Samples[samplemap[ismpd]], flags[ismpd], (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
+ }
+ dwMemPos += samplesize[ismpd];
+ if (dwMemPos >= dwMemLength) break;
}
- dwMemPos += samplesize[ismpd];
+ }
+ }
+
+ if(xmheader.xmversion < 0x0104)
+ {
+ // Load Patterns and Samples (Version 1.02 and 1.03)
+ if (dwMemPos + 8 >= dwMemLength) return true;
+ dwMemPos = ReadXMPatterns(lpStream, dwMemLength, dwMemPos, &xmheader, this);
+ if(dwMemPos == 0) return true;
+
+ for(SAMPLEINDEX iSmp = 1; iSmp <= m_nSamples; iSmp++)
+ {
+ ReadSample(&Samples[iSmp], (Samples[iSmp].uFlags & CHN_16BIT) ? RS_PCM16D : RS_PCM8D, (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
+ dwMemPos += Samples[iSmp].GetSampleSizeInBytes();
if (dwMemPos >= dwMemLength) break;
}
}
+
// Read song comments: "TEXT"
if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x74786574))
{
@@ -640,7 +663,7 @@
// Check various things to find out whether this has been made with MPT.
// Null chars in names -> most likely made with MPT, which disguises as FT2
- if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug) bMadeWithModPlug = true;
+ if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug && !bIsFT2) bMadeWithModPlug = true;
if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v 2.00 ", 20))
{
// Early MPT 1.0 alpha/beta versions
@@ -701,7 +724,7 @@
//BYTE s[64*64*5];
vector<BYTE> s(64*64*5, 0);
- XMFILEHEADER header;
+ XMFILEHEADER xmheader;
XMINSTRUMENTHEADER xmih;
XMSAMPLEHEADER xmsh;
XMSAMPLESTRUCT xmss;
@@ -718,21 +741,22 @@
fwrite(m_szNames[0], 20, 1, f);
s[0] = 0x1A;
lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "OpenMPT " MPT_VERSION_STR " ");
- s[21] = 0x04; // Version number
- s[22] = 0x01; // XM Format v1.04
- fwrite(&s[0], 23, 1, f);
+ fwrite(&s[0], 21, 1, f);
+
// Writing song header
- memset(&header, 0, sizeof(header));
- header.size = sizeof(XMFILEHEADER);
- header.norder = 0;
- header.restartpos = m_nRestartPos;
+ memset(&xmheader, 0, sizeof(xmheader));
+ xmheader.xmversion = LittleEndianW(0x0104); // XM Format v1.04
+ xmheader.size = sizeof(XMFILEHEADER) - 2; // minus the version field
+ xmheader.restartpos = LittleEndianW(m_nRestartPos);
- header.channels = (m_nChannels + 1) & 0xFFFE; // avoid odd channel count for FT2 compatibility
+ xmheader.channels = (m_nChannels + 1) & 0xFFFE; // avoid odd channel count for FT2 compatibility
if(m_nChannels & 1) bAddChannel = true;
- if(bCompatibilityExport && header.channels > 32)
- header.channels = 32;
+ if(bCompatibilityExport && xmheader.channels > 32)
+ xmheader.channels = 32;
+ if(xmheader.channels > MAX_BASECHANNELS) xmheader.channels = MAX_BASECHANNELS;
+ xmheader.channels = LittleEndianW(xmheader.channels);
- header.patterns = 0;
+ xmheader.patterns = 0;
/*for (i=0; i<MAX_ORDERS; i++) {
header.norder++;
if ((Order[i] >= header.patterns) && (Order[i] < MAX_PATTERNS)) header.patterns = Order[i]+1;
@@ -740,33 +764,37 @@
if(Order.GetLength() < MAX_ORDERS)
Order.resize(MAX_ORDERS);
- for (i=MAX_ORDERS-1; i>=0; i--) { // walk backwards over orderlist
- if ((Order[i]!=0xFF) && (header.norder==0)) {
- header.norder=i+1; //find last used order
+ WORD nOrders = Order.GetLengthTailTrimmed(), nPatterns = 0;
+ xmheader.orders = LittleEndianW(nOrders);
+ xmheader.size = LittleEndian(xmheader.size + nOrders);
+
+ for (i = 0; i < nOrders; i++) { // walk over orderlist and find last used pattern
+ if((Order[i] >= nPatterns) && (Order[i] < MAX_PATTERNS)) {
+ nPatterns = Order[i] + 1;
}
- if ((Order[i] >= header.patterns) && (Order[i] < MAX_PATTERNS)) {
- header.patterns = Order[i]+1; //find last pattern
- }
}
+ xmheader.patterns = LittleEndianW(nPatterns);
- header.instruments = m_nInstruments;
- if (!header.instruments) header.instruments = m_nSamples;
- header.flags = (m_dwSongFlags & SONG_LINEARSLIDES) ? 0x01 : 0x00;
- if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
+ if(m_nInstruments > 0)
+ xmheader.instruments = LittleEndianW(m_nInstruments);
+ else
+ xmheader.instruments = LittleEndianW(m_nSamples);
+
+ xmheader.flags = (m_dwSongFlags & SONG_LINEARSLIDES) ? 0x01 : 0x00;
+ if (m_dwSongFlags & SONG_EXFILTERRANGE) xmheader.flags |= 0x1000;
+ xmheader.flags = LittleEndianW(xmheader.flags);
+
if(bCompatibilityExport)
- {
- header.tempo = CLAMP(m_nDefaultTempo, 32, 255);
- }
+ xmheader.tempo = LittleEndianW(CLAMP(m_nDefaultTempo, 32, 255));
else
- {
- header.tempo = m_nDefaultTempo;
- }
- header.speed = CLAMP(m_nDefaultSpeed, 1, 31);
- Order.WriteToByteArray(header.order, header.norder, 256);
+ xmheader.tempo = LittleEndianW(CLAMP(m_nDefaultTempo, 32, 512));
+ xmheader.speed = LittleEndianW(CLAMP(m_nDefaultSpeed, 1, 31));
- fwrite(&header, 1, sizeof(header), f);
+ fwrite(&xmheader, 1, sizeof(xmheader), f);
+ Order.WriteAsByte(f, nOrders);
+
// Writing patterns
- for (i=0; i<header.patterns; i++) if (Patterns[i])
+ for (i = 0; i < nPatterns; i++) if (Patterns[i])
{
MODCOMMAND *p = Patterns[i];
UINT len = 0;
@@ -851,7 +879,7 @@
fwrite(xmph, 1, 9, f);
}
// Writing instruments
- for (i=1; i<=header.instruments; i++)
+ for (i = 1; i <= xmheader.instruments; i++)
{
MODSAMPLE *pSmp;
WORD smptable[32];
@@ -860,7 +888,7 @@
memset(&smptable, 0, sizeof(smptable));
memset(&xmih, 0, sizeof(xmih));
memset(&xmsh, 0, sizeof(xmsh));
- xmih.size = sizeof(xmih) + sizeof(xmsh);
+ xmih.size = LittleEndian(sizeof(xmih) + sizeof(xmsh));
memcpy(xmih.name, m_szNames[i], 22);
xmih.type = 0;
xmih.samples = 0;
@@ -871,17 +899,17 @@
{
memcpy(xmih.name, pIns->name, 22);
xmih.type = pIns->nMidiProgram;
- xmsh.volfade = min(pIns->nFadeOut, 0xFFF); // FFF is maximum in FT2
+ xmsh.volfade = LittleEndianW(min(pIns->nFadeOut, 0xFFF)); // FFF is maximum in FT2
xmsh.vnum = (BYTE)pIns->VolEnv.nNodes;
xmsh.pnum = (BYTE)pIns->PanEnv.nNodes;
if (xmsh.vnum > 12) xmsh.vnum = 12;
if (xmsh.pnum > 12) xmsh.pnum = 12;
for (UINT ienv=0; ienv<12; ienv++)
{
- xmsh.venv[ienv*2] = pIns->VolEnv.Ticks[ienv];
- xmsh.venv[ienv*2+1] = pIns->VolEnv.Values[ienv];
- xmsh.penv[ienv*2] = pIns->PanEnv.Ticks[ienv];
- xmsh.penv[ienv*2+1] = pIns->PanEnv.Values[ienv];
+ xmsh.venv[ienv*2] = LittleEndianW(pIns->VolEnv.Ticks[ienv]);
+ xmsh.venv[ienv*2+1] = LittleEndianW(pIns->VolEnv.Values[ienv]);
+ xmsh.penv[ienv*2] = LittleEndianW(pIns->PanEnv.Ticks[ienv]);
+ xmsh.penv[ienv*2+1] = LittleEndianW(pIns->PanEnv.Values[ienv]);
}
if (pIns->dwFlags & ENV_VOLUME) xmsh.vtype |= 1;
if (pIns->dwFlags & ENV_VOLSUSTAIN) xmsh.vtype |= 2;
@@ -914,15 +942,13 @@
if (xmih.samples >= 32) break;
xmsh.snum[j] = k; //record sample table offset in instrument's note map
}
-// xmsh.reserved2 = xmih.samples;
}
} else
{
xmih.samples = 1;
-// xmsh.reserved2 = 1;
smptable[0] = i;
}
- xmsh.shsize = (xmih.samples) ? 40 : 0;
+ xmsh.shsize = LittleEndianW((xmih.samples) ? 40 : 0);
fwrite(&xmih, 1, sizeof(xmih), f);
if (smptable[0])
{
@@ -932,9 +958,11 @@
xmsh.vibdepth = pvib->nVibDepth;
xmsh.vibrate = pvib->nVibRate;
}
- fwrite(&xmsh, 1, xmih.size - sizeof(xmih), f);
+ WORD samples = xmih.samples;
+ xmih.samples = LittleEndianW(xmih.samples);
+ fwrite(&xmsh, 1, sizeof(xmsh), f);
if (!xmih.samples) continue;
- for (UINT ins=0; ins<xmih.samples; ins++)
+ for (UINT ins = 0; ins < samples; ins++)
{
memset(&xmss, 0, sizeof(xmss));
if (smptable[ins]) memcpy(xmss.name, m_szNames[smptable[ins]], 22);
@@ -979,6 +1007,9 @@
xmss.pan = 255;
if (pSmp->nPan < 256) xmss.pan = (BYTE)pSmp->nPan;
xmss.relnote = (signed char)pSmp->RelativeTone;
+ xmss.samplen = LittleEndianW(xmss.samplen);
+ xmss.loopstart = LittleEndianW(xmss.loopstart);
+ xmss.looplen = LittleEndianW(xmss.looplen);
fwrite(&xmss, 1, xmsh.shsize, f);
}
for (UINT ismpd=0; ismpd<xmih.samples; ismpd++)
@@ -1050,7 +1081,7 @@
//Save hacked-on extra info
SaveMixPlugins(f);
- SaveExtendedInstrumentProperties(Instruments, header.instruments, f);
+ SaveExtendedInstrumentProperties(Instruments, xmheader.instruments, f);
SaveExtendedSongProperties(f);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-09-16 19:05:12
|
Revision: 366
http://modplug.svn.sourceforge.net/modplug/?rev=366&view=rev
Author: relabsoluness
Date: 2009-09-16 19:05:00 +0000 (Wed, 16 Sep 2009)
Log Message:
-----------
[New] MPTM: Can now have multiple sequences in a module (access from orderlist context menu).
[Fix] MPTM save/load: Loading extensions was broken in the case of not having any instruments.
[Ref] Internal: minor changes and cleanup.
Modified Paths:
--------------
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/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/mptrack/serialization_utils.cpp
trunk/OpenMPT/mptrack/serialization_utils.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/ModSequence.cpp
trunk/OpenMPT/soundlib/ModSequence.h
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -66,6 +66,7 @@
ON_COMMAND(IDC_PATINSTROPLUGGUI2, ToggleSplitPluginEditor) //rewbs.instroVST
ON_EN_CHANGE(IDC_EDIT_SPACING, OnSpacingChanged)
ON_EN_CHANGE(IDC_EDIT_PATTERNNAME, OnPatternNameChanged)
+ ON_EN_CHANGE(IDC_EDIT_SEQUENCE_NAME, OnSequenceNameChanged)
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)
@@ -278,6 +279,9 @@
m_OrderList.UpdateView(dwHintMask, pObj);
if (!m_pSndFile) return;
+ if (dwHintMask & HINT_MODSEQUENCE)
+ SetDlgItemText(IDC_EDIT_SEQUENCE_NAME, m_pSndFile->Order.m_sName);
+
//rewbs.instroVST
if (dwHintMask & (HINT_MIXPLUGINS|HINT_MODTYPE))
{
@@ -289,6 +293,10 @@
::EnableWindow(::GetDlgItem(m_hWnd, IDC_PATINSTROPLUGGUI2), true);
else
::EnableWindow(::GetDlgItem(m_hWnd, IDC_PATINSTROPLUGGUI2), false);
+
+ // Show/hide multisequence controls according the current modtype.
+ GetDlgItem(IDC_STATIC_SEQUENCE_NAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
+ GetDlgItem(IDC_EDIT_SEQUENCE_NAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
}
//end rewbs.instroVST
if (dwHintMask & HINT_MPTOPTIONS)
@@ -611,7 +619,7 @@
//Restore all save pattern state, except pattern number which we might have just set.
PATTERNVIEWSTATE* patternViewState = pFrame->GetPatternViewState();
- patternViewState->nPattern = SendViewMessage(VIEWMSG_GETCURRENTPATTERN);
+ patternViewState->nPattern = static_cast<PATTERNINDEX>(SendViewMessage(VIEWMSG_GETCURRENTPATTERN));
if (pFrame) SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)patternViewState);
SwitchToView();
@@ -919,7 +927,7 @@
nNewPat = pReplaceIndex[nCurPat]; // take care of patterns that have been duplicated before
else
nNewPat= pSndFile->Order[selection.nOrdLo + i];
- if (selection.nOrdLo + i + nInsertCount + 1 < pSndFile->Order.GetCount())
+ if (selection.nOrdLo + i + nInsertCount + 1 < pSndFile->Order.GetLength())
pSndFile->Order[selection.nOrdLo + i + nInsertCount + 1] = nNewPat;
}
}
@@ -927,7 +935,7 @@
{
m_OrderList.InvalidateRect(NULL, FALSE);
m_OrderList.SetCurSel(nInsertWhere);
- SetCurrentPattern(pSndFile->Order[min(nInsertWhere, pSndFile->Order.GetCount()-1)]);
+ SetCurrentPattern(pSndFile->Order[min(nInsertWhere, pSndFile->Order.GetLastIndex())]);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this);
if(selection.nOrdHi != selection.nOrdLo) m_OrderList.m_nScrollPos2nd = nInsertWhere + nInsertCount;
@@ -1140,6 +1148,22 @@
}
+void CCtrlPatterns::OnSequenceNameChanged()
+//-----------------------------------------
+{
+ if (m_pSndFile)
+ {
+ CString str;
+ GetDlgItemText(IDC_EDIT_SEQUENCE_NAME, str);
+ if (str != m_pSndFile->Order.m_sName)
+ {
+ m_pSndFile->Order.m_sName = str;
+ m_pModDoc->SetModified();
+ }
+ }
+}
+
+
void CCtrlPatterns::OnSetupZxxMacros()
//------------------------------------
{
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -47,13 +47,15 @@
// make the current selection the secondary selection (used for keyboard orderlist navigation)
inline void SetCurSelTo2ndSel()
{if(m_bShift && m_nScrollPos2nd == ORDERINDEX_INVALID) m_nScrollPos2nd = m_nScrollPos; else if(!m_bShift && m_nScrollPos2nd != ORDERINDEX_INVALID) m_nScrollPos2nd = ORDERINDEX_INVALID;};
- bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false);
+ bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false, bool bIgnoreCurSel = false);
BOOL ProcessKeyDown(UINT nChar);
BOOL ProcessChar(UINT nChar);
BOOL UpdateScrollInfo();
void UpdateInfoText();
int GetFontWidth();
+ ORDERINDEX GetOrderFromPoint(const CRect& rect, const CPoint& pt) const;
+
// Sets target margin value and returns the effective margin value.
BYTE SetMargins(int);
@@ -113,6 +115,7 @@
afx_msg void OnPatternPaste();
afx_msg LRESULT OnDragonDropping(WPARAM bDoDrop, LPARAM lParam);
afx_msg LRESULT OnHelpHitTest(WPARAM, LPARAM lParam);
+ afx_msg void OnSelectSequence(UINT nid);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
@@ -218,6 +221,7 @@
afx_msg void OnNextInstrument();
afx_msg void OnSpacingChanged();
afx_msg void OnPatternNameChanged();
+ afx_msg void OnSequenceNameChanged();
afx_msg void OnOrderListMarginsChanged();
afx_msg void OnSetupZxxMacros();
afx_msg void OnChordEditor();
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -54,6 +54,7 @@
ON_COMMAND(ID_ORDERLIST_COPY, OnDuplicatePattern)
ON_COMMAND(ID_PATTERNCOPY, OnPatternCopy)
ON_COMMAND(ID_PATTERNPASTE, OnPatternPaste)
+ ON_COMMAND_RANGE(ID_SEQUENCE_ITEM, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, OnSelectSequence)
ON_MESSAGE(WM_MOD_DRAGONDROPPING, OnDragonDropping)
ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
//}}AFX_MSG_MAP
@@ -87,6 +88,13 @@
}
+ORDERINDEX COrderList::GetOrderFromPoint(const CRect& rect, const CPoint& pt) const
+//---------------------------------------------------------------------------------
+{
+ return static_cast<ORDERINDEX>(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+}
+
+
BOOL COrderList::Init(const CRect &rect, CCtrlPatterns *pParent, CModDoc *pModDoc, HFONT hFont)
//---------------------------------------------------------------------------------------------
{
@@ -216,18 +224,20 @@
else
result.nOrdHi = m_nScrollPos2nd;
}
+ LimitMax(result.nOrdLo, m_pModDoc->GetSoundFile()->Order.GetLastIndex());
+ LimitMax(result.nOrdHi, m_pModDoc->GetSoundFile()->Order.GetLastIndex());
return result;
}
-bool COrderList::SetCurSel(ORDERINDEX sel, bool bEdit, bool bShiftClick)
-//----------------------------------------------------------------------
+bool COrderList::SetCurSel(ORDERINDEX sel, bool bEdit, bool bShiftClick, bool bIgnoreCurSel)
+//------------------------------------------------------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
ORDERINDEX *nOrder = (bShiftClick) ? &m_nScrollPos2nd : &m_nScrollPos;
- if ((sel < 0) || (sel >= int(pSndFile->Order.size())) || (!m_pParent) || (!pMainFrm)) return false;
- if (sel == *nOrder) return true;
+ if ((sel < 0) || (sel >= pSndFile->Order.GetLength()) || (!m_pParent) || (!pMainFrm)) return false;
+ if (!bIgnoreCurSel && sel == *nOrder) return true;
const BYTE nShownLength = GetLength();
InvalidateSelection();
*nOrder = sel;
@@ -281,7 +291,7 @@
END_CRITICAL();
}
m_pParent->SetCurrentPattern(n);
- m_pModDoc->SetElapsedTime(static_cast<ORDERINDEX>(m_nScrollPos), 0);
+ m_pModDoc->SetElapsedTime(m_nScrollPos, 0);
}
}
UpdateInfoText();
@@ -294,7 +304,7 @@
//----------------------------------------
{
CSoundFile* pSndFile = m_pModDoc ? m_pModDoc->GetSoundFile() : NULL;
- if ((pSndFile) && (m_nScrollPos < pSndFile->Patterns.Size()))
+ if ((pSndFile) && (m_nScrollPos < pSndFile->Order.GetLength()))
{
return pSndFile->Order[m_nScrollPos];
}
@@ -316,11 +326,11 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- ORDERINDEX i = 0;
- const int nSeqLength = pSndFile->Order.size();
- for (i=0; i+1 < nSeqLength; i++) if (pSndFile->Order[i+1] == pSndFile->Order.GetInvalidPatIndex()) break;
+ ORDERINDEX nLast = pSndFile->Order.GetLengthFirstEmpty();
+ if (nLast)
+ nLast--;
SetCurSelTo2ndSel();
- SetCurSel(i);
+ SetCurSel(nLast);
}
break;
case VK_DELETE: OnDeleteOrder(); break;
@@ -484,7 +494,7 @@
m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns());
}
- if (m_nScrollPos < int(pSndFile->Order.size()))
+ if (m_nScrollPos < pSndFile->Order.GetLength())
{
UINT nPat = pSndFile->Order[m_nScrollPos];
if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNames))
@@ -535,7 +545,7 @@
while (rect.left < rcClient.right)
{
bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false;
- ORDERINDEX nOrder = ((nIndex >= 0) && (nIndex < int(pSndFile->Order.size()))) ? pSndFile->Order[nIndex] : -1;
+ const PATTERNINDEX nPat = ((nIndex >= 0) && (nIndex < pSndFile->Order.GetLength())) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID;
if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right;
rect.right--;
if (bHighLight) {
@@ -546,7 +556,7 @@
//Drawing the shown pattern-indicator or drag position.
- if (nIndex == ((m_bDragging) ? (int)m_nDropPos : m_nScrollPos))
+ if (nIndex == ((m_bDragging) ? m_nDropPos : m_nScrollPos))
{
rect.InflateRect(-1, -1);
dc.DrawFocusRect(&rect);
@@ -555,7 +565,7 @@
MoveToEx(dc.m_hDC, rect.right, rect.top, NULL);
LineTo(dc.m_hDC, rect.right, rect.bottom);
//Drawing the 'ctrl-transition' indicator
- if (nIndex == (int)pSndFile->m_nSeqOverride-1)
+ if (nIndex == pSndFile->m_nSeqOverride-1)
{
MoveToEx(dc.m_hDC, rect.left+4, rect.bottom-4, NULL);
LineTo(dc.m_hDC, rect.right-4, rect.bottom-4);
@@ -564,21 +574,18 @@
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
//Drawing 'playing'-indicator.
- if(nIndex == (int)pSndFile->GetCurrentOrder() && pMainFrm->IsPlaying() )
+ if(nIndex == pSndFile->GetCurrentOrder() && pMainFrm->IsPlaying() )
{
MoveToEx(dc.m_hDC, rect.left+4, rect.top+2, NULL);
LineTo(dc.m_hDC, rect.right-4, rect.top+2);
}
s[0] = 0;
- if ((nOrder >= 0) && (rect.left + m_cxFont - 4 <= rcClient.right))
+ if ((nIndex < pSndFile->Order.GetLength()) && (rect.left + m_cxFont - 4 <= rcClient.right))
{
- if (nIndex < pSndFile->Order.GetCount())
- {
- if (nOrder == pSndFile->Order.GetInvalidPatIndex()) strcpy(s, "---");
- else if (nOrder == pSndFile->Order.GetIgnoreIndex()) strcpy(s, "+++");
- else if (nOrder < pSndFile->Patterns.Size()) wsprintf(s, "%d", nOrder);
- else strcpy(s, "???");
- }
+ if (nPat == pSndFile->Order.GetInvalidPatIndex()) strcpy(s, "---");
+ else if (nPat == pSndFile->Order.GetIgnoreIndex()) strcpy(s, "+++");
+ else if (nPat < pSndFile->Patterns.Size()) wsprintf(s, "%u", nPat);
+ else strcpy(s, "???");
}
dc.SetTextColor((bHighLight) ? colorTextSel : colorText);
dc.DrawText(s, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
@@ -626,8 +633,8 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if ((nOrder >= 0) && (nOrder < int(pSndFile->Order.size())))
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
+ if ((nOrder >= 0) && (nOrder < pSndFile->Order.GetLength()))
{
if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder)+1) {
pSndFile->m_nSeqOverride=0;
@@ -642,7 +649,7 @@
// mark pattern (+skip to)
const int oldXScroll = m_nXScroll;
- ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
ORD_SELECTION selection = GetCurSel(false);
// check if cursor is in selection - if it is, only react on MouseUp as the user might want to drag those orders
@@ -678,7 +685,7 @@
ReleaseCapture();
if (rect.PtInRect(pt))
{
- int n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX n = GetOrderFromPoint(rect, pt);
if ((n >= 0) && (n == m_nDropPos) && (m_pModDoc))
{
// drag multiple orders (not quite as easy...)
@@ -719,7 +726,7 @@
}
else
{
- ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
ORD_SELECTION selection = GetCurSel(false);
// this should actually have equal signs but that breaks multiselect: nOrder >= selection.nOrdLo && nOrder <= section.nOrdHi
@@ -728,7 +735,7 @@
// Remove selection if we didn't drag anything but multiselect was active
m_nScrollPos2nd = ORDERINDEX_INVALID;
SetFocus();
- SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+ SetCurSel(GetOrderFromPoint(rect, pt));
}
}
}
@@ -752,8 +759,8 @@
if (rect.PtInRect(pt))
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if (n >= int(pSndFile->Order.size()) || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID;
+ n = GetOrderFromPoint(rect, pt);
+ if (n >= pSndFile->Order.GetLength() || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID;
}
if (n != (int)m_nDropPos)
{
@@ -775,6 +782,43 @@
}
+void COrderList::OnSelectSequence(UINT nid)
+//-----------------------------------------
+{
+ BEGIN_CRITICAL();
+ CMainFrame::GetMainFrame()->ResetNotificationBuffer();
+ const SEQUENCEINDEX nId = static_cast<SEQUENCEINDEX>(nid - ID_SEQUENCE_ITEM);
+ CSoundFile& rSf = *m_pModDoc->GetSoundFile();
+ if (nId == MAX_SEQUENCES + 1)
+ {
+ CString strParam; strParam.Format(TEXT("%u: %s"), rSf.Order.GetCurrentSequenceIndex(), rSf.Order.m_sName);
+ CString str;
+ AfxFormatString1(str, IDS_CONFIRM_SEQUENCE_DELETE, strParam);
+ if (AfxMessageBox(str, MB_YESNO | MB_ICONQUESTION) == IDYES)
+ rSf.Order.RemoveSequence();
+ else
+ {
+ END_CRITICAL();
+ return;
+ }
+ }
+ else if (nId == MAX_SEQUENCES)
+ rSf.Order.AddSequence();
+ else if (nId < rSf.Order.GetNumSequences())
+ rSf.Order.SetSequence(nId);
+ ORDERINDEX nPosCandidate = rSf.Order.GetLengthTailTrimmed() - 1;
+ SetCurSel(min(m_nScrollPos, nPosCandidate), true, false, true);
+ if (m_pParent)
+ m_pParent->SetCurrentPattern(rSf.Order[m_nScrollPos]);
+
+ UpdateScrollInfo();
+ END_CRITICAL();
+ UpdateView(HINT_MODSEQUENCE);
+ m_pModDoc->SetModified();
+ m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
+}
+
+
void COrderList::OnRButtonDown(UINT nFlags, CPoint pt)
//----------------------------------------------------
{
@@ -791,7 +835,7 @@
bool bMultiSelection = (m_nScrollPos2nd != ORDERINDEX_INVALID);
- if(!bMultiSelection) SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+ if(!bMultiSelection) SetCurSel(GetOrderFromPoint(rect, pt));
SetFocus();
HMENU hMenu = ::CreatePopupMenu();
if(!hMenu) return;
@@ -826,11 +870,31 @@
AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern");
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNCOPY, "&Copy Pattern");
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNPASTE, "P&aste Pattern");
- if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
+ if (pSndFile->TypeIsIT_MPT_XM())
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Properties...");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Pattern properties...");
}
+ if (pSndFile->GetType() == MOD_TYPE_MPT)
+ {
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+
+ HMENU menuSequence = ::CreatePopupMenu();
+ AppendMenu(hMenu, MF_POPUP, (UINT_PTR)menuSequence, TEXT("Sequences"));
+
+ const SEQUENCEINDEX numSequences = pSndFile->Order.GetNumSequences();
+ for(SEQUENCEINDEX i = 0; i < numSequences; i++)
+ {
+ CString str;
+ str.Format(TEXT("%u: %s"), i, (LPCTSTR)pSndFile->Order.GetSequence(i).m_sName);
+ const UINT flags = (pSndFile->Order.GetCurrentSequenceIndex() == i) ? MF_STRING|MF_CHECKED : MF_STRING;
+ AppendMenu(menuSequence, flags, ID_SEQUENCE_ITEM + i, str);
+ }
+ if (pSndFile->Order.GetNumSequences() < MAX_SEQUENCES)
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES, TEXT("Create new sequence"));
+ if (pSndFile->Order.GetNumSequences() > 1)
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, TEXT("Delete current sequence"));
+ }
}
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_RENDER, "Render to &Wave");
@@ -857,7 +921,7 @@
void COrderList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*)
//--------------------------------------------------------------
{
- ORDERINDEX nNewPos = m_nXScroll;
+ UINT nNewPos = m_nXScroll;
UINT smin, smax;
GetScrollRange(SB_HORZ, (LPINT)&smin, (LPINT)&smax);
@@ -874,9 +938,9 @@
case SB_ENDSCROLL: m_bScrolling = false; break;
}
if (nNewPos > smax) nNewPos = smax;
- if (nNewPos != (UINT)m_nXScroll)
+ if (nNewPos != m_nXScroll)
{
- m_nXScroll = nNewPos;
+ m_nXScroll = static_cast<ORDERINDEX>(nNewPos);
SetScrollPos(SB_HORZ, m_nXScroll);
InvalidateRect(NULL, FALSE);
}
@@ -886,17 +950,17 @@
void COrderList::OnSize(UINT nType, int cx, int cy)
//-------------------------------------------------
{
- ORDERINDEX nPos;
+ int nPos;
int smin, smax;
CWnd::OnSize(nType, cx, cy);
UpdateScrollInfo();
GetScrollRange(SB_HORZ, &smin, &smax);
- nPos = (ORDERINDEX)GetScrollPos(SB_HORZ);
+ nPos = GetScrollPos(SB_HORZ);
if (nPos > smax) nPos = smax;
if (m_nXScroll != nPos)
{
- m_nXScroll = nPos;
+ m_nXScroll = static_cast<ORDERINDEX>(nPos);
SetScrollPos(SB_HORZ, m_nXScroll);
InvalidateRect(NULL, FALSE);
}
@@ -916,25 +980,26 @@
for(ORDERINDEX i = 0; i <= nInsertCount; i++)
{
-
//Checking whether there is some pattern at the end of orderlist.
- if(pSndFile->Order[pSndFile->Order.size() - 1] < pSndFile->Patterns.Size())
+ if (pSndFile->Order.GetLength() < 1 || pSndFile->Order.Last() < pSndFile->Patterns.Size())
{
- if(pSndFile->Order.size() < pSndFile->GetModSpecifications().ordersMax)
- pSndFile->Order.push_back(pSndFile->Order.GetInvalidPatIndex());
+ if(pSndFile->Order.GetLength() < pSndFile->GetModSpecifications().ordersMax)
+ pSndFile->Order.Append();
}
-
- for(int j = pSndFile->Order.size() - 1; j > nInsertEnd; j--) pSndFile->Order[j] = pSndFile->Order[j - 1];
+ for(int j = pSndFile->Order.GetLastIndex(); j > nInsertEnd; j--)
+ pSndFile->Order[j] = pSndFile->Order[j - 1];
}
// now that there is enough space in the order list, overwrite the orders
for(ORDERINDEX i = 0; i <= nInsertCount; i++)
{
- if(nInsertEnd + i + 1 < pSndFile->GetModSpecifications().ordersMax)
+ if(nInsertEnd + i + 1 < pSndFile->GetModSpecifications().ordersMax
+ &&
+ nInsertEnd + i + 1 < pSndFile->Order.GetLength())
pSndFile->Order[nInsertEnd + i + 1] = pSndFile->Order[nInsertEnd - nInsertCount + i];
}
- m_nScrollPos = min(nInsertEnd + 1, pSndFile->Order.GetCount() - 1);
+ m_nScrollPos = min(nInsertEnd + 1, pSndFile->Order.GetLastIndex());
if(nInsertCount > 0)
- m_nScrollPos2nd = min(m_nScrollPos + nInsertCount, pSndFile->Order.GetCount() - 1);
+ m_nScrollPos2nd = min(m_nScrollPos + nInsertCount, pSndFile->Order.GetLastIndex());
else
m_nScrollPos2nd = ORDERINDEX_INVALID;
InvalidateRect(NULL, FALSE);
@@ -1053,7 +1118,7 @@
//-----------------------------------------------------------------
{
LPDRAGONDROP pDropInfo = (LPDRAGONDROP)lParam;
- UINT posdest;
+ ORDERINDEX posdest;
BOOL bCanDrop;
CSoundFile *pSndFile;
CPoint pt;
@@ -1073,8 +1138,8 @@
GetCursorPos(&pt);
ScreenToClient(&pt);
if (pt.x < 0) pt.x = 0;
- posdest = m_nXScroll + (pt.x / m_cxFont);
- if (posdest >= pSndFile->Order.size()) return FALSE;
+ posdest = static_cast<ORDERINDEX>(m_nXScroll + (pt.x / m_cxFont));
+ if (posdest >= pSndFile->Order.GetLength()) return FALSE;
switch(pDropInfo->dwDropType)
{
case DRAGONDROP_PATTERN:
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -620,7 +620,7 @@
ORDERINDEX nNextOrder;
nNextOrder = pSndFile->Order.GetNextOrderIgnoringSkips(startOrder);
//Ignore skip items(+++) from sequence.
- const ORDERINDEX ordCount = pSndFile->Order.GetCount();
+ const ORDERINDEX ordCount = pSndFile->Order.GetLength();
if ((nNextOrder < ordCount) && (pSndFile->Order[startOrder] == m_nPattern))
{
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -2977,7 +2977,7 @@
//ensure order correlates with pattern.
if (pSndFile->Order[ord]!=pat) {
ORDERINDEX tentativeOrder = pSndFile->FindOrder(pat);
- if (tentativeOrder != -1) { //ensure a valid order exists.
+ if (tentativeOrder != ORDERINDEX_INVALID) { //ensure a valid order exists.
ord = tentativeOrder;
}
}
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -940,6 +940,12 @@
BOOL CModDoc::RemoveUnusedPatterns(BOOL bRemove)
//----------------------------------------------
{
+ if (GetSoundFile()->GetType() == MOD_TYPE_MPT && GetSoundFile()->Order.GetNumSequences() > 1)
+ { // Multiple sequences are not taken into account in the code below. For now just make
+ // removing unused patterns disabled in this case.
+ AfxMessageBox(IDS_PATTERN_CLEANUP_UNAVAILABLE, MB_ICONINFORMATION);
+ return FALSE;
+ }
const UINT maxPatIndex = m_SndFile.Patterns.Size();
const UINT maxOrdIndex = m_SndFile.Order.size();
vector<UINT> nPatMap(maxPatIndex, 0);
@@ -1668,10 +1674,10 @@
//Increasing orderlist size if given order is beyond current limit,
//or if the last order already has a pattern.
if((nOrd == m_SndFile.Order.size() ||
- m_SndFile.Order.back() < m_SndFile.Patterns.Size() ) &&
- m_SndFile.Order.size() < m_SndFile.GetModSpecifications().ordersMax)
+ m_SndFile.Order.Last() < m_SndFile.Patterns.Size() ) &&
+ m_SndFile.Order.GetLength() < m_SndFile.GetModSpecifications().ordersMax)
{
- m_SndFile.Order.push_back(m_SndFile.Order.GetInvalidPatIndex());
+ m_SndFile.Order.Append();
}
for (UINT j=0; j<m_SndFile.Order.size(); j++)
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -2853,9 +2853,6 @@
}
-
-
-
LRESULT CViewPattern::OnPlayerNotify(MPTNOTIFICATION *pnotify)
//------------------------------------------------------------
{
@@ -2897,7 +2894,7 @@
}
*/
- if (pSndFile->Order[nOrd] != nPat) {
+ if (nOrd >= pSndFile->Order.GetLength() || pSndFile->Order[nOrd] != nPat) {
//order doesn't correlate with pattern, so mark it as invalid
nOrd = 0xFFFF;
}
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -688,8 +688,12 @@
if ((pInfo->hOrders) && (hintFlagPart != HINT_INSNAMES) && (hintFlagPart != HINT_SMPNAMES))
{
const DWORD nPat = (lHint >> HINT_SHIFT_PAT);
- pInfo->tiOrders.resize(pSndFile->Order.size(), NULL);
- UINT imin=0, imax=pSndFile->Order.size()-1;
+ // If there are items past the new sequence length, delete them.
+ for(size_t i = pSndFile->Order.GetLength(); i < pInfo->tiOrders.size(); i++) if (pInfo->tiOrders[i])
+ {DeleteItem(pInfo->tiOrders[i]); pInfo->tiOrders[i] = NULL;}
+ if (pInfo->tiOrders.size() < pSndFile->Order.GetLength()) // Resize tiOrders if needed.
+ pInfo->tiOrders.resize(pSndFile->Order.GetLength(), NULL);
+ UINT imin=0, imax = pSndFile->Order.GetLastIndex();
const bool patNamesOnly = (hintFlagPart == HINT_PATNAMES);
//if (hintFlagPart == HINT_PATNAMES) && (dwHintParam < pSndFile->Order.size())) imin = imax = dwHintParam;
BOOL bEnded = FALSE;
@@ -1260,53 +1264,53 @@
//--------------------------------------------
{
DWORD dwItemType = GetModItem(hItem);
- DWORD dwItem = dwItemType >> 16;
+ WORD nItem = WORD(dwItemType >> 16);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
switch(dwItemType & 0xFFFF)
{
case MODITEM_ORDER:
- if ((pModDoc) && (pModDoc->RemoveOrder(dwItem)))
+ if ((pModDoc) && (pModDoc->RemoveOrder(nItem)))
{
pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL);
}
break;
case MODITEM_PATTERN:
- if ((pModDoc) && (pModDoc->RemovePattern(dwItem)))
+ if ((pModDoc) && (pModDoc->RemovePattern(nItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16)|HINT_PATTERNDATA|HINT_PATNAMES);
- pModDoc->UpdateAllViews(NULL, (dwItem << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES);
+ pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES);
}
break;
case MODITEM_SAMPLE:
- if ((pModDoc) && (pModDoc->RemoveSample(dwItem)))
+ if ((pModDoc) && (pModDoc->RemoveSample(nItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
- pModDoc->UpdateAllViews(NULL, (dwItem << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
+ pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
}
break;
case MODITEM_INSTRUMENT:
- if ((pModDoc) && (pModDoc->RemoveInstrument(dwItem)))
+ if ((pModDoc) && (pModDoc->RemoveInstrument(nItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16)|HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
- pModDoc->UpdateAllViews(NULL, (dwItem << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
+ pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
}
break;
case MODITEM_MIDIINSTRUMENT:
- SetMidiInstrument(dwItem, "");
+ SetMidiInstrument(nItem, "");
RefreshMidiLibrary();
break;
case MODITEM_MIDIPERCUSSION:
- SetMidiPercussion(dwItem, "");
+ SetMidiPercussion(nItem, "");
RefreshMidiLibrary();
break;
case MODITEM_DLSBANK_FOLDER:
- CTrackApp::RemoveDLSBank(dwItem);
+ CTrackApp::RemoveDLSBank(nItem);
RefreshDlsBanks();
break;
@@ -2147,7 +2151,7 @@
if (pSndFile) {
PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[dwItemNo];
if (pPlugin) {
- bool bypassed = pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS;
+ bool bypassed = ((pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS) != 0);
AppendMenu(hMenu, (bypassed?MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Bypass");
}
}
Modified: trunk/OpenMPT/mptrack/View_tre.h
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/View_tre.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -61,7 +61,7 @@
if(pSndFile != NULL)
{
tiPatterns.resize(pSndFile->Patterns.Size(), NULL);
- tiOrders.resize(pSndFile->Order.size(), NULL);
+ tiOrders.resize(pSndFile->Order.GetLength(), NULL);
}
memset(tiSamples, 0, sizeof(tiSamples));
memset(tiInstruments, 0, sizeof(tiInstruments));
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-09-16 19:05:00 UTC (rev 366)
@@ -358,8 +358,8 @@
CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,432,34,55,10
COMBOBOX IDC_COMBO_INSTRUMENT,22,74,95,137,CBS_DROPDOWNLIST | WS_VSCROLL
CTEXT "Row spacing",IDC_STATIC,172,32,54,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT_SPACING,225,32,40,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP
- CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,256,33,9,11
+ EDITTEXT IDC_EDIT_SPACING,225,32,28,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP
+ CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,245,32,11,11
PUSHBUTTON "<<",IDC_BUTTON2,2,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
PUSHBUTTON ">>",IDC_BUTTON1,14,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
CTEXT "Pattern name",IDC_STATIC,9,32,52,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
@@ -380,9 +380,11 @@
GROUPBOX "Keyboard Split",IDC_STATIC,167,53,328,40
LTEXT "Octave shift",IDC_STATIC,382,65,52,8
GROUPBOX "",IDC_STATIC,2,22,493,27
- CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,355,34,57,10
+ CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,370,34,55,10
EDITTEXT IDC_EDIT_ORDERLIST_MARGINS,2,113,28,12,ES_AUTOHSCROLL | ES_READONLY
CONTROL "",IDC_SPIN_ORDERLIST_MARGINS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,15,118,11,11
+ EDITTEXT IDC_EDIT_SEQUENCE_NAME,317,32,47,12,ES_AUTOHSCROLL
+ CTEXT "Sequence name",IDC_STATIC_SEQUENCE_NAME,261,32,55,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
END
IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 544, 106
@@ -2211,6 +2213,9 @@
IDS_UNABLE_TO_LOAD_KEYBINDINGS
"Loading keybindings failed. The keyboard won't work properly."
IDS_CANT_OPEN_FILE_FOR_WRITING "Can't open file for writing."
+ IDS_CONFIRM_SEQUENCE_DELETE "Delete sequence %1?"
+ IDS_PATTERN_CLEANUP_UNAVAILABLE
+ "Removing unused patterns is not available when using multiple sequences."
END
#endif // English (U.S.) resources
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -50,6 +50,8 @@
#define IDS_CANT_OPEN_KEYBINDING_FILE 211
#define IDS_UNABLE_TO_LOAD_KEYBINDINGS 212
#define IDS_CANT_OPEN_FILE_FOR_WRITING 213
+#define IDS_CONFIRM_SEQUENCE_DELETE 214
+#define IDS_PATTERN_CLEANUP_UNAVAILABLE 215
#define IDB_MAINBAR 300
#define IDB_IMAGELIST 301
#define IDB_PATTERNS 302
@@ -885,6 +887,8 @@
#define IDC_CHECK_PATRECORD 2386
#define IDC_LOAD_COLORSCHEME 2387
#define IDC_SAVE_COLORSCHEME 2388
+#define IDC_EDIT_SEQUENCE_NAME 2389
+#define IDC_STATIC_SEQUENCE_NAME 2390
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1078,6 +1082,7 @@
#define ID_CLEAR_SELECTION 38000
#define ID_PLUG_PASSKEYS 38001
#define ID_VIEW_SONGPROPERTIES 38002
+#define ID_SEQUENCE_ITEM 38003
#define ID_GROW_SELECTION 40001
#define ID_SHRINK_SELECTION 40002
#define ID_RUN_SCRIPT 40003
@@ -1127,7 +1132,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59230
-#define _APS_NEXT_CONTROL_VALUE 2389
+#define _APS_NEXT_CONTROL_VALUE 2391
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/mptrack/serialization_utils.cpp
===================================================================
--- trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -131,15 +131,15 @@
}
-void WriteItemString(OutStream& oStrm, const std::string& str)
-//------------------------------------------------------------
+void WriteItemString(OutStream& oStrm, const char* const pStr, const size_t nSize)
+//--------------------------------------------------------------------------------
{
- uint32 id = (std::min)(str.size(), (uint32_max >> 4)) << 4;
+ uint32 id = (std::min)(nSize, (uint32_max >> 4)) << 4;
id |= 12; // 12 == 1100b
Binarywrite<uint32>(oStrm, id);
id >>= 4;
if(id > 0)
- oStrm.write(str.c_str(), id);
+ oStrm.write(pStr, id);
}
Modified: trunk/OpenMPT/mptrack/serialization_utils.h
===================================================================
--- trunk/OpenMPT/mptrack/serialization_utils.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/serialization_utils.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -344,11 +344,13 @@
Binarywrite(oStrm, data);
}
-void WriteItemString(OutStream& oStrm, const std::string& str);
+void WriteItemString(OutStream& oStrm, const char* const pStr, const size_t nSize);
template <>
-inline void WriteItem<std::string>(OutStream& oStrm, const std::string& str) {WriteItemString(oStrm, str);}
+inline void WriteItem<std::string>(OutStream& oStrm, const std::string& str) {WriteItemString(oStrm, str.c_str(), str.length());}
+template <>
+inline void WriteItem<LPCSTR>(OutStream& oStrm, const LPCSTR& psz) {WriteItemString(oStrm, psz, strlen(psz));}
template<class T>
inline void Binaryread(InStream& iStrm, T& data)
@@ -416,6 +418,25 @@
ReadItemString(iStrm, str, nSize);
}
+
+template <class T>
+struct ArrayWriter
+//================
+{
+ ArrayWriter(size_t nCount) : m_nCount(nCount) {}
+ void operator()(srlztn::OutStream& oStrm, const T* pData) {oStrm.write(reinterpret_cast<const char*>(pData), m_nCount * sizeof(T));}
+ size_t m_nCount;
+};
+
+template <class T>
+struct ArrayReader
+//================
+{
+ ArrayReader(size_t nCount) : m_nCount(nCount) {}
+ void operator()(srlztn::InStream& iStrm, T* pData, const size_t) {iStrm.read(reinterpret_cast<char*>(pData), m_nCount * sizeof(T));}
+ size_t m_nCount;
+};
+
} //namespace srlztn.
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -1004,8 +1004,8 @@
Order.ReadAsByte(lpStream + dwMemPos, nordsize, dwMemLength - dwMemPos);
dwMemPos += pifh->ordnum;
//Replacing 0xFF and 0xFE with new corresponding indexes
- replace(Order.begin(), Order.end(), static_cast<PATTERNINDEX>(0xFE), Order.GetIgnoreIndex());
- replace(Order.begin(), Order.end(), static_cast<PATTERNINDEX>(0xFF), Order.GetInvalidPatIndex());
+ Order.Replace(0xFE, Order.GetIgnoreIndex());
+ Order.Replace(0xFF, Order.GetInvalidPatIndex());
}
}
@@ -1493,8 +1493,9 @@
ssb.BeginRead("mptm", 1);
ssb.ReadItem(GetTuneSpecificTunings(), "0", 1, &ReadTuningCollection);
ssb.ReadItem(*this, "1", 1, &ReadTuningMap);
- ssb.ReadItem(Order, "2", 1, &ReadModSequence);
+ ssb.ReadItem(Order, "2", 1, &ReadModSequenceOld);
ssb.ReadItem(Patterns, FileIdPatterns, strlen(FileIdPatterns), &ReadModPatterns);
+ ssb.ReadItem(Order, FileIdSequences, strlen(FileIdSequences), &ReadModSequences);
if (ssb.m_Status & srlztn::SNT_FAILURE)
AfxMessageBox("Unknown error occured.", MB_ICONERROR);
@@ -2421,9 +2422,10 @@
if (AreNonDefaultTuningsUsed(*this))
ssb.WriteItem(*this, "1", 1, &WriteTuningMap);
if (Order.NeedsExtraDatafield())
- ssb.WriteItem(Order, "2", 1, &WriteModSequence);
+ ssb.WriteItem(Order, "2", 1, &WriteModSequenceOld);
if (bNeedsMptPatSave)
ssb.WriteItem(Patterns, FileIdPatterns, strlen(FileIdPatterns), &WriteModPatterns);
+ ssb.WriteItem(Order, FileIdSequences, strlen(FileIdSequences), &WriteModSequences);
ssb.FinishWrite();
@@ -3463,6 +3465,9 @@
code = 'MPTX'; // write extension header code
fwrite(&code, 1, sizeof(__int32), f);
+
+ if (nInstruments == 0)
+ return;
WriteInstrumentPropertyForAllInstruments('VR..', sizeof(m_defaultInstrument.nVolRamp), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('MiP.', sizeof(m_defaultInstrument.nMixPlug), f, instruments, nInstruments);
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -259,7 +259,7 @@
// every pattern in the order will be unique, so store the pointer + pattern ID
orderOffsets.push_back(patternOffsets[i]);
- Order.push_back(numPatterns);
+ Order.Append(numPatterns);
numPatterns++;
break;
}
@@ -359,7 +359,7 @@
}
// separate subsongs by "---" patterns
orderOffsets.push_back(nullptr);
- Order.push_back(Order.GetInvalidPatIndex());
+ Order.Append();
}
break;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -737,8 +737,8 @@
header.norder++;
if ((Order[i] >= header.patterns) && (Order[i] < MAX_PATTERNS)) header.patterns = Order[i]+1;
}*/
- if(Order.GetCount() < MAX_ORDERS)
- Order.resize(MAX_ORDERS, Order.GetInvalidPatIndex());
+ if(Order.GetLength() < MAX_ORDERS)
+ Order.resize(MAX_ORDERS);
for (i=MAX_ORDERS-1; i>=0; i--) { // walk backwards over orderlist
if ((Order[i]!=0xFF) && (header.norder==0)) {
Modified: trunk/OpenMPT/soundlib/ModSequence.cpp
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/ModSequence.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -1,127 +1,96 @@
#include "stdafx.h"
#include "sndfile.h"
#include "ModSequence.h"
+#include "../mptrack/version.h"
#include "../mptrack/serialization_utils.h"
#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u."))))
-DWORD COrderToPatternTable::Deserialize(const BYTE* const src, const DWORD memLength)
-//-------------------------------------------------------------------------
-{
- if(memLength < 2 + 4) return 0;
- uint16 version = 0;
- uint32 s = 0;
- DWORD memPos = 0;
- memcpy(&version, src, sizeof(version));
- memPos += sizeof(version);
- if(version != 0) return memPos;
- memcpy(&s, src+memPos, sizeof(s));
- memPos += sizeof(s);
- if(s > 65000) return true;
- if(memLength < memPos+s*4) return memPos;
+#define new DEBUG_NEW
- const uint32 nOriginalSize = s;
- if(s > ModSpecs::mptm.ordersMax)
- s = ModSpecs::mptm.ordersMax;
- resize(max(s, MAX_ORDERS));
- for(size_t i = 0; i<s; i++, memPos +=4 )
- {
- uint32 temp;
- memcpy(&temp, src+memPos, 4);
- (*this)[i] = static_cast<PATTERNINDEX>(temp);
- }
- memPos += 4*(nOriginalSize - s);
- return memPos;
-}
+ModSequence::ModSequence(const CSoundFile& rSf,
+ PATTERNINDEX* pArray,
+ ORDERINDEX nSize,
+ ORDERINDEX nCapacity,
+ const bool bDeletableArray) :
+ m_pSndFile(&rSf),
+ m_pArray(pArray),
+ m_nSize(nSize),
+ m_nCapacity(nCapacity),
+ m_bDeletableArray(bDeletableArray),
+ m_nInvalidIndex(0xFF),
+ m_nIgnoreIndex(0xFE)
+//-------------------------------------------------------
+{}
-size_t COrderToPatternTable::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize)
-//-----------------------------------------------------------------------------
+ModSequence::ModSequence(const CSoundFile& rSf, ORDERINDEX nSize) :
+ m_pSndFile(&rSf),
+ m_bDeletableArray(true),
+ m_nInvalidIndex(GetInvalidPatIndex(MOD_TYPE_MPT)),
+ m_nIgnoreIndex(GetIgnoreIndex(MOD_TYPE_MPT))
+//-------------------------------------------------------------------
{
- if(numOfBytes > destSize) return true;
- if(size() < numOfBytes) resize(numOfBytes, 0xFF);
- UINT i = 0;
- for(i = 0; i<numOfBytes; i++)
- {
- dest[i] = static_cast<BYTE>((*this)[i]);
- }
- return i; //Returns the number of bytes written.
+ m_nSize = nSize;
+ m_nCapacity = m_nSize;
+ m_pArray = new PATTERNINDEX[m_nCapacity];
+ std::fill(begin(), end(), GetInvalidPatIndex(MOD_TYPE_MPT));
}
-size_t COrderToPatternTable::WriteAsByte(FILE* f, const UINT count)
-//---------------------------------------------------------------
+ModSequence::ModSequence(const ModSequence& seq) :
+ m_pSndFile(seq.m_pSndFile),
+ m_bDeletableArray(false),
+ m_nInvalidIndex(0xFF),
+ m_nIgnoreIndex(0xFE),
+ m_nSize(0),
+ m_nCapacity(0),
+ m_pArray(nullptr)
+//------------------------------------------
{
- if(size() < count) resize(count, GetInvalidPatIndex());
-
- size_t i = 0;
-
- for(i = 0; i<count; i++)
- {
- const PATTERNINDEX pat = (*this)[i];
- BYTE temp = static_cast<BYTE>((*this)[i]);
-
- if(pat > 0xFD)
- {
- if(pat == GetInvalidPatIndex()) temp = 0xFF;
- else temp = 0xFE;
- }
- fwrite(&temp, 1, 1, f);
- }
- return i; //Returns the number of bytes written.
+ *this = seq;
}
-bool COrderToPatternTable::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength)
-//-------------------------------------------------------------------------
-{
- if(howMany < 0 || howMany > memLength) return true;
- if(m_rSndFile.GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true;
-
- if(size() < static_cast<size_t>(howMany))
- resize(howMany, GetInvalidPatIndex());
-
- for(int i = 0; i<howMany; i++, pFrom++)
- (*this)[i] = *pFrom;
- return false;
-}
-
-bool COrderToPatternTable::NeedsExtraDatafield() const
-//----------------------------------------------
+bool ModSequence::NeedsExtraDatafield() const
+//-------------------------------------------
{
- if(m_rSndFile.GetType() == MOD_TYPE_MPT && m_rSndFile.Patterns.Size() > 0xFD)
+ if(m_pSndFile->GetType() == MOD_TYPE_MPT && m_pSndFile->Patterns.Size() > 0xFD)
return true;
else
return false;
}
-void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype)
-//----------------------------------------------------------------
+void ModSequence::OnModTypeChanged(const MODTYPE oldtype)
+//-------------------------------------------------------
{
- const CModSpecifications specs = m_rSndFile.GetModSpecifications();
+ const CModSpecifications specs = m_pSndFile->GetModSpecifications();
+ m_nInvalidIndex = GetInvalidPatIndex(m_pSndFile->GetType());
+ m_nIgnoreIndex = GetIgnoreIndex(m_pSndFile->GetType());
+
//Resize orderlist if needed. Because old orderlist had MAX_ORDERS(256) elements, not making it
//smaller than that even if the modtype doesn't support that many orders.
- if(specs.ordersMax < GetCount())
+ if (specs.ordersMax < GetLength())
{
resize(max(MAX_ORDERS, specs.ordersMax));
- for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex();
+ std::fill(begin() + specs.ordersMax, end(), GetInvalidPatIndex());
}
- if (GetCount() < MAX_ORDERS)
- resize(MAX_ORDERS, GetInvalidPatIndex());
+ if (GetLength() < MAX_ORDERS)
+ resize(MAX_ORDERS, GetInvalidPatIndex(oldtype));
//Replace items used to denote end of song/skip order.
- replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex());
- replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex());
+ Replace(GetInvalidPatIndex(oldtype), GetInvalidPatIndex());
+ Replace(GetIgnoreIndex(oldtype), GetIgnoreIndex());
}
-ORDERINDEX COrderToPatternTable::GetLengthTailTrimmed() const
-//-----------------------------------------------------------
+ORDERINDEX ModSequence::GetLengthTailTrimmed() const
+//--------------------------------------------------
{
- ORDERINDEX nEnd = GetCount();
+ ORDERINDEX nEnd = GetLength();
if(nEnd == 0) return 0;
nEnd--;
const PATTERNINDEX iInvalid = GetInvalidPatIndex();
@@ -131,59 +100,275 @@
}
-ORDERINDEX COrderToPatternTable::GetLengthFirstEmpty() const
-//----------------------------------------------------------
+ORDERINDEX ModSequence::GetLengthFirstEmpty() const
+//-------------------------------------------------
{
- const ORDERINDEX nLength = GetCount();
- ORDERINDEX nMax = 0;
- while ((nMax < nLength) && ((*this)[nMax] != (*this).GetInvalidPatIndex())) nMax++;
- return nMax;
+ return static_cast<ORDERINDEX>(std::find(begin(), end(), GetInvalidPatIndex()) - begin());
}
-ORDERINDEX COrderToPatternTable::GetNextOrderIgnoringSkips(const ORDERINDEX start) const
-//-------------------------------------------------------------------------------------
+ORDERINDEX ModSequence::GetNextOrderIgnoringSkips(const ORDERINDEX start) const
+//-----------------------------------------------------------------------------
{
- const ORDERINDEX count = GetCount();
- if(count == 0) return 0;
- ORDERINDEX next = min(count-1, start+1);
- while(next+1 < count && (*this)[next] == GetIgnoreIndex()) next++;
+ const ORDERINDEX nLength = GetLength();
+ if(nLength == 0) return 0;
+ ORDERINDEX next = min(nLength-1, start+1);
+ while(next+1 < nLength && (*this)[next] == GetIgnoreIndex()) next++;
return next;
}
-ORDERINDEX COrderToPatternTable::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const
-//-------------------------------------------------------------------------------------
+
+ORDERINDEX ModSequence::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const
+//---------------------------------------------------------------------------------
{
- const ORDERINDEX count = GetCount();
- if(start == 0 || count == 0) return 0;
- ORDERINDEX prev = min(start-1, count-1);
+ const ORDERINDEX nLength = GetLength();
+ if(start == 0 || nLength == 0) return 0;
+ ORDERINDEX prev = min(start-1, nLength-1);
while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--;
return prev;
}
-void COrderToPatternTable::Init()
-//-------------------------------
+void ModSequence::Init()
+//----------------------
{
- resize(MAX_ORDERS, GetInvalidPatIndex());
- for(ORDERINDEX i = 0; i < GetCount(); i++)
+ resize(MAX_ORDERS);
+ std::fill(begin(), end(), GetInvalidPatIndex());
+}
+
+
+void ModSequence::Append(PATTERNINDEX nPat)
+//-----------------------------------------
+{
+ resize(m_nSize + 1, nPat);
+}
+
+
+void ModSequence::resize(ORDERINDEX nNewSize, PATTERNINDEX nFill)
+//---------------------------------------------------------------
+{
+ if (nNewSize == m_nSize) return;
+ if (nNewSize <= m_nCapacity)
{
- (*this)[i] = GetInvalidPatIndex();
+ if (nNewSize > m_nSize)
+ std::fill(begin() + m_nSize, begin() + nNewSize, nFill);
+ m_nSize = nNewSize;
}
+ else
+ {
+ const PATTERNINDEX* const pOld = m_pArray;
+ m_nCapacity = nNewSize + 100;
+ m_pArray = new PATTERNINDEX[m_nCapacity];
+ ArrayCopy(m_pArray, pOld, m_nSize);
+ std::fill(m_pArray + m_nSize, m_pArray + nNewSize, nFill);
+ m_nSize = nNewSize;
+ if (m_bDeletableArray)
+ delete[] pOld;
+ m_bDeletableArray = true;
+ }
}
+void ModSequence::clear()
+//-----------------------
+{
+ m_nSize = 0;
+}
-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());}
+ModSequence& ModSequence::operator=(const ModSequence& seq)
+//---------------------------------------------------------
+{
+ if (&seq == this)
+ return *this;
+ m_nIgnoreIndex = seq.m_nIgnoreIndex;
+ m_nInvalidIndex = seq.m_nInvalidIndex;
+ resize(seq.GetLength());
+ ArrayCopy(begin(), seq.begin(), m_nSize);
+ m_sName = seq.m_sName;
+ return *this;
+}
-void ReadModSequence(std::istream& iStrm, COrderToPatternTable& seq, const size_t)
-//--------------------------------------------------------------------------------
+
+/////////////////////////////////////
+// ModSequenceSet
+/////////////////////////////////////
+
+
+ModSequenceSet::ModSequenceSet(const CSoundFile& sndFile)
+ : ModSequence(sndFile, m_Cache, s_nCacheSize, s_nCacheSize, NoArrayDelete),
+ m_nCurrentSeq(0)
+//-------------------------------------------------------------------
{
+ m_Sequences.push_back(ModSequence(sndFile, s_nCacheSize));
+}
+
+
+const ModSequence& ModSequenceSet::GetSequence(SEQUENCEINDEX nSeq)
+//----------------------------------------------------------------
+{
+ if (nSeq == GetCurrentSequenceIndex())
+ CopyCacheToStorage();
+ return m_Sequences[nSeq];
+}
+
+
+void ModSequenceSet::CopyCacheToStorage()
+//---------------------------------------
+{
+ m_Sequences[m_nCurrentSeq] = *this;
+}
+
+
+void ModSequenceSet::CopyStorageToCache()
+//---------------------------------------
+{
+ const ModSequence& rSeq = m_Sequences[m_nCurrentSeq];
+ if (rSeq.GetLength() <= s_nCacheSize)
+ {
+ PATTERNINDEX* pOld = m_pArray;
+ m_pArray = m_Cache;
+ m_nSize = rSeq.GetLength();
+ m_nCapacity = s_nCacheSize;
+ m_sName = rSeq.m_sName;
+ ArrayCopy(m_pArray, rSeq.m_pArray, m_nSize);
+ if (m_bDeletableArray)
+ delete[] pOld;
+ m_bDeletableArray = false;
+ }
+ else
+ ModSequence::operator=(rSeq);
+}
+
+
+void ModSequenceSet::SetSequence(SEQUENCEINDEX n)
+//-----------------------------------------------
+{
+ CopyCacheToStorage();
+ m_nCurrentSeq = n;
+ CopyStorageToCache();
+}
+
+
+void ModSequenceSet::AddSequence(bool bDuplicate)
+//-----------------------------------------------
+{
+ m_Sequences.push_back(ModSequence(*m_pSndFile, s_nCacheSize));
+ if (bDuplicate)
+ {
+ m_Sequences.back() = *this;
+ m_Sequences.back().m_sName = ""; // Don't copy sequence name.
+ }
+ SetSequence(GetNumSequences() - 1);
+}
+
+
+void ModSequenceSet::RemoveSequence(SEQUENCEINDEX i)
+//--------------------------------------------------
+{
+ // Do nothing if index is invalid or if there's only one sequence left.
+ if (i >= m_Sequences.size() || m_Sequences.size() <= 1)
+ return;
+ const bool bSequenceChanges = (i == m_nCurrentSeq);
+ m_Sequences.erase(m_Sequences.begin() + i);
+ if (i < m_nCurrentSeq || m_nCurrentSeq >= GetNumSequences())
+ m_nCurrentSeq--;
+ if (bSequenceChanges)
+ CopyStorageToCache();
+}
+
+
+/////////////////////////////////////
+// Read/Write
+/////////////////////////////////////
+
+
+DWORD ModSequence::Deserialize(const BYTE* const src, const DWORD memLength)
+//--------------------------------------------------------------------------
+{
+ if(memLength < 2 + 4) return 0;
+ uint16 version = 0;
+ uint16 s = 0;
+ DWORD memPos = 0;
+ memcpy(&version, src, sizeof(version));
+ memPos += sizeof(version);
+ if(version != 0) return memPos;
+ memcpy(&s, src+memPos, sizeof(s));
+ memPos += 4;
+ if(s > 65000) return true;
+ if(memLength < memPos+s*4) return memPos;
+
+ const uint16 nOriginalSize = s;
+ LimitMax(s, ModSpecs::mptm.ordersMax);
+
+ resize(max(s, MAX_ORDERS));
+ for(size_t i = 0; i<s; i++, memPos +=4 )
+ {
+ uint32 temp;
+ memcpy(&temp, src+memPos, 4);
+ (*this)[i] = static_cast<PATTERNINDEX>(temp);
+ }
+ memPos += 4*(nOriginalSize - s);
+ return memPos;
+}
+
+
+size_t ModSequence::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize)
+//-----------------------------------------------------------------------------
+{
+ if(numOfBytes > destSize || numOfBytes > MAX_ORDERS) return true;
+ if(GetLength() < numOfBytes) resize(ORDERINDEX(numOfBytes), 0xFF);
+ UINT i = 0;
+ for(i = 0; i<numOfBytes; i++)
+ {
+ dest[i] = static_cast<BYTE>((*this)[i]);
+ }
+ return i; //Returns the number of bytes written.
+}
+
+
+size_t ModSequence::WriteAsByte(FILE* f, const uint16 count)
+//----------------------------------------------------------
+{
+ if(GetLength() < count) resize(count);
+
+ size_t i = 0;
+
+ for(i = 0; i<count; i++)
+ {
+ const PATTERNINDEX pat = (*this)[i];
+ BYTE temp = static_cast<BYTE>((*this)[i]);
+
+ if(pat > 0xFD)
+ {
+ if(pat == GetInvalidPatIndex()) temp = 0xFF;
+ else temp = 0xFE;
+ }
+ fwrite(&temp, 1, 1, f);
+ }
+ return i; //Returns the number of bytes written.
+}
+
+
+bool ModSequence::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength)
+//-------------------------------------------------------------------------------------
+{
+ if(howMany < 0 || howMany > memLength) return true;
+ if(m_pSndFile->GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true;
+
+ if(GetLength() < static_cast<size_t>(howMany))
+ resize(ORDERINDEX(howMany));
+
+ for(int i = 0; i<howMany; i++, pFrom++)
+ (*this)[i] = *pFrom;
+ return false;
+}
+
+
+void ReadModSequenceOld(std::istream& iStrm, ModSequenceSet& seq, const size_t)
+//-----------------------------------------------------------------------------
+{
uint16 size;
srlztn::Binaryread<uint16>(iStrm, size);
if(size > ModSpecs::mptm.ordersMax)
@@ -193,7 +378,7 @@
AfxMessageBox(str, MB_ICONWARNING);
size = ModSpecs::mptm.ordersMax;
}
- seq.resize(max(size, MAX_ORDERS), seq.GetInvalidPatIndex());
+ seq.resize(max(size, MAX_ORDERS));
if(size == 0)
{ seq.Init(); return; }
@@ -206,16 +391,91 @@
}
-void WriteModSequence(std::ostream& oStrm, const COrderToPatternTable& seq)
+void WriteModSequenceOld(std::ostream& oStrm, const ModSequenceSet& seq)
//-------------------------------------------------------------------------
{
- uint16 size = seq.GetCount();
+ const uint16 size = seq.GetLength();
srlztn::Binarywrite<uint16>(oStrm, size);
- const COrderToPatternTable::const_iterator endIter = seq.end();
- for(COrderToPatternTable::const_iterator citer = seq.begin(); citer != endIter; citer++)
+ const ModSequenceSet::const_iterator endIter = seq.end();
+ for(ModSequenceSet::const_iterator citer = seq.begin(); citer != endIter; citer++)
{
const uint16 temp = static_cast<uint16>(*citer);
srlztn::Binarywrite<uint16>(oStrm, temp);
}
}
+
+void WriteModSequence(std::ostream& oStrm, const ModSequence& seq)
+//----------------------------------------------------------------
+{
+ srlztn::Ssb ssb(oStrm);
+ ssb.BeginWrite(FileIdSequence, MptVersion::num);
+ ssb.WriteItem((LPCSTR)seq.m_sName, "n");
+ const uint16 nLength = seq.GetLengthTailTrimmed();
+ ssb.WriteItem<uint16>(nLength, "l");
+ ssb.WriteItem(seq.m_pArray, "a", 1, srlztn::ArrayWriter<uint16>(nLength));
+ ssb.FinishWrite();
+}
+
+
+void ReadModSequence(std::istream& iStrm, ModSequence& seq, const size_t)
+//-----------------------------------------------------------------------
+{
+ srlztn::Ssb ssb(iStrm);
+ ssb.BeginRead(FileIdSequence, MptVersion::num);
+ if ((ssb.m_Status & srlztn::SNT_FAILURE) != 0)
+ return;
+ std::string str;
+ ssb.ReadItem(str, "n");
+ seq.m_sName = str.c_str();
+ uint16 nSize = MAX_ORDERS;
+ ssb.ReadItem<uint16>(nSize, "l");
+ LimitMax(nSize, ModSpecs::mptm.ordersMax);
+ seq.resize(max(nSize, ModSequenceSet::s_nCacheSize));
+ ssb.ReadItem(seq.m_pArray, "a", 1, srlztn::ArrayReader<uint16>(nSize));
+}
+
+
+void WriteModSequences(std::ostream& oStrm, const ModSequenceSet& seq)
+//--------------------------------------------------------------------
+{
+ srlztn::Ssb ssb(oStrm);
+ ssb.BeginWrite(FileIdSequences, MptVersion::num);
+ const uint8 nSeqs = seq.GetNumSequences();
+ const uint8 nCurrent = seq.GetCurrentSequenceIndex();
+ ssb.WriteItem(nSeqs, "n");
+ ssb.WriteItem(nCurrent, "c");
+ for(uint8 i = 0; i < nSeqs; i++)
+ {
+ if (i == seq.GetCurrentSequenceIndex())
+ ssb.WriteItem(seq, &i, sizeof(i), &WriteModSequence);
+ else
+ ssb.WriteItem(seq.m_Sequences[i], &i, sizeof(i), &WriteModSequence);
+ }
+ ssb.FinishWrite();
+}
+
+
+void ReadModSequences(std::istream& iStrm, ModSequenceSet& seq, const size_t)
+//---------------------------------------------------------------------------
+{
+ srlztn::Ssb ssb(iStrm);
+ ssb.BeginRead(FileIdSequences, MptVersion::num);
+ if ((ssb.m_Status & srlztn::SNT_FAILURE) != 0)
+ return;
+ uint8 nSeqs;
+ uint8 nCurrent;
+ ssb.ReadItem(nSeqs, "n");
+ if (nSeqs == 0)
+ return;
+ LimitMax(nSeqs, MAX_SEQUENCES);
+ ssb.ReadItem(nCurrent, "c");
+ if (seq.GetNumSequences() < nSeqs)
+ seq.m_Sequences.resize(nSeqs, ModSequence(*seq.m_pSndFile, seq.s_nCacheSize));
+
+ for(uint8 i = 0; i < nSeqs; i++)
+ ssb.ReadItem(seq.m_Sequences[i], &i, sizeof(i), &ReadModSequence);
+ seq.m_nCurrentSeq = (nCurrent < seq.GetNumSequences()) ? nCurrent : 0;
+ seq.CopyStorageToCache();
+}
+
Modified: trunk/OpenMPT/soundlib/ModSequence.h
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/ModSequence.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -1,68 +1,160 @@
-#ifndef ORDERTOPATTERNTABLE_H
-#define ORDERTOPATTERNTABLE_H
+#ifndef MOD_SEQUENCE_H
+#define MOD_SEQUENCE_H
#include <vector>
-using std::vector;
class CSoundFile;
+class ModSequenceSet;
-
-#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data.
-
-
-//==============================================
-class COrderToPatternTable : public vector<PATTERNINDEX>
-//==============================================
+class ModSequence
+//===============
{
public:
- COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {}
+ friend class ModSequenceSet;
+ typedef PATTERNINDEX* iterator;
+ typedef const PATTERNINDEX* const_iterator;
+
+ friend void WriteModSequence(std::ostream& oStrm, const ModSequence& seq);
+ friend void ReadModSequence(std::istream& iStrm, ModSequence& seq, const size_t);
+ virtual ~ModSequence() {if (m_bDeletableArray) delete[] m_pArray;}
+ ModSequence(const ModSequence&);
+ ModSequence(const CSoundFile& rSf, ORDERINDEX nSize);
+ ModSequence(const CSoundFile& rSf, PATTERNINDEX* pArray, ORDERINDEX nSize, ORDERINDEX nCapacity, bool bDeletableArray);
+
// Initialize default sized sequence.
void Init();
- bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength);
+ PATTERNINDEX& operator[](const size_t i) {ASSERT(i < m_nSize); return m_pArray[i];}
+ const PATTERNINDEX& operator[](const size_t i) const {ASSERT(i < m_nSize); return m_pArray[i];}
- size_t WriteAsByte(FILE* f, const UINT count);
+ PATTERNINDEX& Last() {ASSERT(m_nSize > 0); return m_pArray[m_nSize-1];}
+ const PATTERNINDEX& L...
[truncated message content] |
|
From: <sag...@us...> - 2009-09-15 22:10:56
|
Revision: 365
http://modplug.svn.sourceforge.net/modplug/?rev=365&view=rev
Author: saga-games
Date: 2009-09-15 22:10:35 +0000 (Tue, 15 Sep 2009)
Log Message:
-----------
[New] Shareable color schemes (via config dialog)
[Fix] Instrument tab: Pitch/Pan input field allows negative values
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Moptions.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-15 22:10:35 UTC (rev 365)
@@ -117,21 +117,23 @@
BEGIN_MESSAGE_MAP(COptionsColors, CPropertyPage)
ON_WM_DRAWITEM()
- ON_CBN_SELCHANGE(IDC_COMBO1, OnColorSelChanged)
- ON_EN_CHANGE(IDC_PRIMARYHILITE,OnSettingsChanged)
+ ON_CBN_SELCHANGE(IDC_COMBO1, OnColorSelChanged)
+ ON_EN_CHANGE(IDC_PRIMARYHILITE, OnSettingsChanged)
ON_EN_CHANGE(IDC_SECONDARYHILITE, OnSettingsChanged)
- ON_COMMAND(IDC_BUTTON1, OnSelectColor1)
- ON_COMMAND(IDC_BUTTON2, OnSelectColor2)
- ON_COMMAND(IDC_BUTTON3, OnSelectColor3)
- ON_COMMAND(IDC_BUTTON5, OnPresetMPT)
- ON_COMMAND(IDC_BUTTON6, OnPresetFT2)
- ON_COMMAND(IDC_BUTTON7, OnPresetIT)
- ON_COMMAND(IDC_BUTTON8, OnPresetBuzz)
- ON_COMMAND(IDC_CHECK1, OnSettingsChanged)
- ON_COMMAND(IDC_CHECK2, OnPreviewChanged)
- ON_COMMAND(IDC_CHECK3, OnSettingsChanged)
- ON_COMMAND(IDC_CHECK4, OnPreviewChanged)
- ON_COMMAND(IDC_CHECK5, OnHiliteTimeSigsChanged)
+ ON_COMMAND(IDC_BUTTON1, OnSelectColor1)
+ ON_COMMAND(IDC_BUTTON2, OnSelectColor2)
+ ON_COMMAND(IDC_BUTTON3, OnSelectColor3)
+ ON_COMMAND(IDC_BUTTON5, OnPresetMPT)
+ ON_COMMAND(IDC_BUTTON6, OnPresetFT2)
+ ON_COMMAND(IDC_BUTTON7, OnPresetIT)
+ ON_COMMAND(IDC_BUTTON8, OnPresetBuzz)
+ ON_COMMAND(IDC_LOAD_COLORSCHEME, OnLoadColorScheme)
+ ON_COMMAND(IDC_SAVE_COLORSCHEME, OnSaveColorScheme)
+ ON_COMMAND(IDC_CHECK1, OnSettingsChanged)
+ ON_COMMAND(IDC_CHECK2, OnPreviewChanged)
+ ON_COMMAND(IDC_CHECK3, OnSettingsChanged)
+ ON_COMMAND(IDC_CHECK4, OnPreviewChanged)
+ ON_COMMAND(IDC_CHECK5, OnHiliteTimeSigsChanged)
END_MESSAGE_MAP()
@@ -538,7 +540,7 @@
CustomColors[MODCOLOR_TEXTCURROW] = 0x00000000;
CustomColors[MODCOLOR_BACKSELECTED] = 0x00000000;
CustomColors[MODCOLOR_TEXTSELECTED] = 0x00ccd7dd;
- //CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
+ CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
CustomColors[MODCOLOR_BACKPLAYCURSOR] = 0x007a99a9;
CustomColors[MODCOLOR_TEXTPLAYCURSOR] = 0x00000000;
CustomColors[MODCOLOR_BACKHILIGHT] = 0x00b5c5ce;
@@ -548,10 +550,54 @@
CustomColors[MODCOLOR_PANNING] = 0x00686800;
CustomColors[MODCOLOR_PITCH] = 0x00006262;
CustomColors[MODCOLOR_GLOBALS] = 0x00000066;
- //CustomColors[MODCOLOR_ENVELOPES] = 0x000000ff;
+ CustomColors[MODCOLOR_ENVELOPES] = 0x000000ff;
OnPreviewChanged();
}
+void COptionsColors::OnLoadColorScheme()
+//--------------------------------------
+{
+ CFileDialog dlg(TRUE, NULL, NULL,
+ OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ "OpenMPT Color Schemes|*.mptcolor|"
+ "All Files (*.*)|*.*||",
+ this);
+ if (dlg.DoModal() != IDOK) return;
+
+
+ TCHAR sFilename[MAX_PATH];
+ strcpy(sFilename, dlg.GetPathName());
+
+ for(int i = 0; i < MAX_MODCOLORS; i++)
+ {
+ TCHAR sKeyName[16];
+ wsprintf(sKeyName, "Color%02d", i);
+ CustomColors[i] = CMainFrame::GetPrivateProfileLong("Colors", sKeyName, CustomColors[i], sFilename);
+ }
+ OnPreviewChanged();
+}
+
+void COptionsColors::OnSaveColorScheme()
+//--------------------------------------
+{
+ CFileDialog dlg(FALSE, "mptcolor", NULL,
+ OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
+ "OpenMPT Color Schemes|*.mptcolor|",
+ this);
+ if (dlg.DoModal() != IDOK) return;
+
+ TCHAR sFilename[MAX_PATH];
+ strcpy(sFilename, dlg.GetPathName());
+
+ for(int i = 0; i < MAX_MODCOLORS; i++)
+ {
+ TCHAR sKeyName[16];
+ wsprintf(sKeyName, "Color%02d", i);
+ CMainFrame::WritePrivateProfileLong("Colors", sKeyName, CustomColors[i], sFilename);
+ }
+}
+
+
/////////////////////////////////////////////////////////////////////////////////
// COptionsGeneral
Modified: trunk/OpenMPT/mptrack/Moptions.h
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.h 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/Moptions.h 2009-09-15 22:10:35 UTC (rev 365)
@@ -81,6 +81,8 @@
afx_msg void OnPresetFT2();
afx_msg void OnPresetIT();
afx_msg void OnPresetBuzz();
+ afx_msg void OnLoadColorScheme();
+ afx_msg void OnSaveColorScheme();
afx_msg void OnPreviewChanged();
DECLARE_MESSAGE_MAP();
};
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-09-15 22:10:35 UTC (rev 365)
@@ -210,7 +210,7 @@
PUSHBUTTON "Clear Log",IDC_CLEARLOG,227,85,37,9
END
-IDD_OPTIONS_COLORS DIALOGEX 0, 0, 272, 231
+IDD_OPTIONS_COLORS DIALOGEX 0, 0, 272, 281
STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Colors"
FONT 8, "MS Sans Serif", 0, 0, 0x0
@@ -222,24 +222,26 @@
EDITTEXT IDC_SECONDARYHILITE,114,108,21,12,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10
CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10
- PUSHBUTTON "MPT",IDC_BUTTON5,159,26,22,12
- PUSHBUTTON "FT2",IDC_BUTTON6,185,26,22,12
- PUSHBUTTON "IT",IDC_BUTTON7,210,25,22,12
- PUSHBUTTON "Buzz",IDC_BUTTON8,235,25,22,12
+ PUSHBUTTON "MPT",IDC_BUTTON5,144,246,24,15
+ PUSHBUTTON "FT2",IDC_BUTTON6,204,246,24,15
+ PUSHBUTTON "IT",IDC_BUTTON7,174,246,24,15
+ PUSHBUTTON "Buzz",IDC_BUTTON8,234,246,24,15
CONTROL "Color",IDC_BUTTON1,"Button",BS_OWNERDRAW,25,194,51,15
CONTROL "Color",IDC_BUTTON2,"Button",BS_OWNERDRAW,98,194,51,15
CONTROL "Color",IDC_BUTTON3,"Button",BS_OWNERDRAW,168,194,51,15
LTEXT "Background:",IDC_TEXT1,25,183,60,8
LTEXT "Foreground:",IDC_TEXT2,98,183,62,8
LTEXT "Highlight:",IDC_TEXT3,169,185,61,8
- GROUPBOX "",IDC_STATIC,5,5,260,220
+ GROUPBOX "",IDC_STATIC,5,5,260,211
LTEXT "Select color for:",IDC_STATIC,15,15,63,8
LTEXT "rows",IDC_STATIC,138,92,16,8
- LTEXT "Presets:",IDC_STATIC,159,15,28,8
LTEXT "rows",IDC_STATIC,138,110,16,8
CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43
CONTROL "Set highlights to songs' time signatures",IDC_CHECK5,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10
+ PUSHBUTTON "Load...",IDC_LOAD_COLORSCHEME,18,246,48,15
+ PUSHBUTTON "Save...",IDC_SAVE_COLORSCHEME,72,246,48,15
+ GROUPBOX "Color Presets",IDC_STATIC,6,228,264,42
END
IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281
@@ -478,7 +480,7 @@
CONTROL "Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,55,71,29,10
EDITTEXT IDC_EDIT9,87,70,34,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11
- EDITTEXT IDC_EDIT15,33,99,27,13,ES_NUMBER
+ EDITTEXT IDC_EDIT15,33,99,27,13
CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103,7,11
COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS,47,135,36,10
@@ -1399,7 +1401,7 @@
IDD_OPTIONS_COLORS, DIALOG
BEGIN
RIGHTMARGIN, 247
- BOTTOMMARGIN, 151
+ BOTTOMMARGIN, 201
END
IDD_OPTIONS_MIDI, DIALOG
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-15 22:10:35 UTC (rev 365)
@@ -883,6 +883,8 @@
#define IDC_RADIO_RESIZETO 2384
#define IDC_EDIT_MODLOADING_WARNINGS 2385
#define IDC_CHECK_PATRECORD 2386
+#define IDC_LOAD_COLORSCHEME 2387
+#define IDC_SAVE_COLORSCHEME 2388
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1116,7 +1118,7 @@
#define ID_OVERFLOWPASTE 59226
#define ID_NOTEMAP_COPY_NOTE 59227
#define ID_CLEANUP_REARRANGESAMPLES 59228
-#define ID_ORDERLIST_RENDER 59229
+#define ID_ORDERLIST_RENDER 59229
// Next default values for new objects
//
@@ -1125,7 +1127,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59230
-#define _APS_NEXT_CONTROL_VALUE 2387
+#define _APS_NEXT_CONTROL_VALUE 2389
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-15 17:15:39
|
Revision: 364
http://modplug.svn.sourceforge.net/modplug/?rev=364&view=rev
Author: saga-games
Date: 2009-09-15 17:15:29 +0000 (Tue, 15 Sep 2009)
Log Message:
-----------
[Fix] Wave Export: Order mode was always enabled by default.
[Fix] IT Compatibility: Special case of Retrigger + Envelopes
[Fix] Instrument / Sample tab: Remove special chars from sample filenames so the "save as" dialog will show up on OSs < Vista
[Mod] Instrument tab: Also show values from 0 to 64 for filter envelope (instead of -32 to 32)
[Imp] Macro Config: Also show the current preset for Zxx config (Z80 - ZFF)
[Ref] Changed some BOOLs into bools, usage of *INDEX types
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/misc_util.h
trunk/OpenMPT/mptrack/mod2midi.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1603,7 +1603,7 @@
void CCtrlInstruments::OnInstrumentSave()
//---------------------------------------
{
- CHAR szFileName[_MAX_PATH] = "", drive[_MAX_DRIVE], path[_MAX_PATH], ext[_MAX_EXT];
+ TCHAR szFileName[_MAX_PATH] = "", drive[_MAX_DRIVE], path[_MAX_PATH], ext[_MAX_EXT];
MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument];
if (!pIns) return;
@@ -1616,6 +1616,8 @@
memcpy(szFileName, pIns->name, 22);
szFileName[22] = 0;
}
+ SanitizeFilename(szFileName);
+
// -> CODE#0019
// -> DESC="correctly load ITI & XI instruments sample note map"
// CFileDialog dlg(FALSE, (m_pSndFile->m_nType & MOD_TYPE_IT) ? "iti" : "xi",
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -975,8 +975,8 @@
{
if(!m_pSndFile) return;
- CHAR szFileName[_MAX_PATH] = "";
- BOOL bBatchSave = CMainFrame::GetInputHandler()->ShiftPressed();
+ TCHAR szFileName[_MAX_PATH];
+ bool bBatchSave = CMainFrame::GetInputHandler()->ShiftPressed();
if(!bBatchSave)
{
@@ -993,8 +993,7 @@
} else
{
memcpy(szFileName, m_pSndFile->m_szNames[m_nSample], 32);
- szFileName[32] = 0;
- }
+ szFileName[32] = 0; }
if (!szFileName[0]) strcpy(szFileName, "untitled");
}
else
@@ -1011,6 +1010,7 @@
sPath += ".wav";
_splitpath(sPath, NULL, NULL, szFileName, NULL);
}
+ SanitizeFilename(szFileName);
CFileDialog dlg(FALSE, "wav",
szFileName,
@@ -1027,7 +1027,7 @@
TCHAR ext[_MAX_EXT];
_splitpath(dlg.GetPathName(), NULL, NULL, NULL, ext);
- BOOL bOk = FALSE;
+ bool bOk = false;
UINT iMinSmp = m_nSample, iMaxSmp = m_nSample;
CString sFilename = dlg.GetPathName(), sNumberFormat;
if(bBatchSave)
@@ -1037,24 +1037,20 @@
sNumberFormat.Format("%s%d%s", "%.", ((int)log10((float)iMaxSmp)) + 1, "d");
}
- const CString sForbiddenChars = "\\/:\"?<>*";
-
for(UINT iSmp = iMinSmp; iSmp <= iMaxSmp; iSmp++)
{
if (m_pSndFile->Samples[iSmp].pSample)
{
if(bBatchSave)
{
- CString sSampleNumber, sSampleName, sSampleFilename;
+ CString sSampleNumber;
+ TCHAR sSampleName[64], sSampleFilename[64];
sSampleNumber.Format(sNumberFormat, iSmp);
- sSampleName = (m_pSndFile->m_szNames[iSmp]) ? m_pSndFile->m_szNames[iSmp] : "untitled";
- sSampleFilename = (m_pSndFile->Samples[iSmp].filename[0]) ? m_pSndFile->Samples[iSmp].filename : m_pSndFile->m_szNames[iSmp];
- for(UINT i = 0; i < sForbiddenChars.GetLength(); i++)
- {
- sSampleName.Remove(sForbiddenChars.GetAt(i));
- sSampleFilename.Remove(sForbiddenChars.GetAt(i));
- }
+ strcpy(sSampleName, (m_pSndFile->m_szNames[iSmp]) ? m_pSndFile->m_szNames[iSmp] : "untitled");
+ strcpy(sSampleFilename, (m_pSndFile->Samples[iSmp].filename[0]) ? m_pSndFile->Samples[iSmp].filename : m_pSndFile->m_szNames[iSmp]);
+ SanitizeFilename(sSampleName);
+ SanitizeFilename(sSampleFilename);
sFilename = dlg.GetPathName();
sFilename.Replace("%sample_number%", sSampleNumber);
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1388,7 +1388,7 @@
void CModDoc::OnFileWaveConvert()
//-------------------------------
{
- OnFileWaveConvert(0, 0);
+ OnFileWaveConvert(ORDERINDEX_INVALID, ORDERINDEX_INVALID);
}
void CModDoc::OnFileWaveConvert(ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder)
@@ -2935,7 +2935,7 @@
}
HWND CModDoc::GetEditPosition(ROWINDEX &row, PATTERNINDEX &pat, ORDERINDEX &ord)
-//------------------------------------------------------------
+//------------------------------------------------------------------------------
{
HWND followSonghWnd;
PATTERNVIEWSTATE *patternViewState;
@@ -2976,7 +2976,7 @@
//ensure order correlates with pattern.
if (pSndFile->Order[ord]!=pat) {
- int tentativeOrder = pSndFile->FindOrder(pat);
+ ORDERINDEX tentativeOrder = pSndFile->FindOrder(pat);
if (tentativeOrder != -1) { //ensure a valid order exists.
ord = tentativeOrder;
}
@@ -3041,7 +3041,68 @@
return -1;
}
+// Retrieve Zxx (Z80-ZFF) type from current macro configuration
+int CModDoc::GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32])
+//-----------------------------------------------------------
+{
+ // Compare with all possible preset patterns
+ for(int i = 1; i <= 5; i++)
+ {
+ // Prepare pattern to compare
+ CHAR szPatterns[128 * 32];
+ CreateZxxFromType(szPatterns, i);
+ bool bFound = true;
+ for(int j = 0; j < 128; j++)
+ {
+ if(strncmp(&szPatterns[j * 32], &szMidiZXXExt[j * 32], 32))
+ bFound = false;
+ }
+ if(bFound) return i;
+ }
+ return 0; // Type 0 - Custom setup
+}
+
+// Create Zxx (Z80 - ZFF) from one out of five presets
+void CModDoc::CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType)
+//---------------------------------------------------------------------------
+{
+ for(int i = 0; i < 128; i++)
+ {
+ switch(iZxxType)
+ {
+ case 1:
+ // Type 1 - Z80 - Z8F controls resonance
+ if (i < 16) wsprintf(&szMidiZXXExt[i * 32], "F0F001%02X", i * 8);
+ else szMidiZXXExt[i * 32] = 0;
+ break;
+
+ case 2:
+ // Type 2 - Z80 - ZFF controls resonance
+ wsprintf(&szMidiZXXExt[i * 32], "F0F001%02X", i);
+ break;
+
+ case 3:
+ // Type 3 - Z80 - ZFF controls cutoff
+ wsprintf(&szMidiZXXExt[i * 32], "F0F000%02X", i);
+ break;
+
+ case 4:
+ // Type 4 - Z80 - ZFF controls filter mode
+ wsprintf(&szMidiZXXExt[i * 32], "F0F002%02X", i);
+ break;
+
+ case 5:
+ // Type 5 - Z80 - Z9F controls resonance + filter mode
+ if (i < 16) wsprintf(&szMidiZXXExt[i * 32], "F0F001%02X", i * 8);
+ else if (i < 32) wsprintf(&szMidiZXXExt[i * 32], "F0F002%02X", (i - 16) * 8);
+ else szMidiZXXExt[i * 32] = 0;
+ break;
+ }
+ }
+}
+
+
////////////////////////////////////////////////////////////////////////////////////////
// Playback
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-15 17:15:29 UTC (rev 364)
@@ -181,6 +181,8 @@
int MacroToPlugParam(CString value); //rewbs.xinfo
int MacroToMidiCC(CString value);
int FindMacroForParam(long param);
+ int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
+ void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
void SongProperties();
// operations
public:
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1433,7 +1433,7 @@
}
}
- for (UINT i=1; i<=m_SndFile.m_nInstruments; i++)
+ for (INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++)
{
m_SndFile.DestroyInstrument(i,removeSamples);
}
@@ -1453,7 +1453,7 @@
CHAR s[512];
UINT nRemoved = 0;
UINT nSwap, nIndex;
- BOOL bReorg = FALSE;
+ bool bReorg = false;
if (!m_SndFile.m_nInstruments) return FALSE;
@@ -1469,7 +1469,7 @@
BeginWaitCursor();
memset(usedmap, 0, sizeof(usedmap));
- for (UINT i=m_SndFile.m_nInstruments; i>=1; i--)
+ for(INSTRUMENTINDEX i = m_SndFile.m_nInstruments; i >= 1; i--)
{
if (!m_SndFile.IsInstrumentUsed(i))
{
@@ -1477,9 +1477,9 @@
// -> CODE#0003
// -> DESC="remove instrument's samples"
// m_SndFile.DestroyInstrument(i);
- m_SndFile.DestroyInstrument(i,removeSamples);
+ m_SndFile.DestroyInstrument(i, removeSamples);
// -! BEHAVIOUR_CHANGE#0003
- if ((i == m_SndFile.m_nInstruments) && (i>1)) m_SndFile.m_nInstruments--; else bReorg = TRUE;
+ if ((i == m_SndFile.m_nInstruments) && (i>1)) m_SndFile.m_nInstruments--; else bReorg = true;
END_CRITICAL();
nRemoved++;
} else
@@ -1701,8 +1701,8 @@
SAMPLEINDEX CModDoc::InsertSample(bool bLimit)
//--------------------------------------------
{
- UINT i = 1;
- for (i=1; i<=m_SndFile.m_nSamples; i++)
+ SAMPLEINDEX i = 1;
+ for(i = 1; i <= m_SndFile.m_nSamples; i++)
{
if ((!m_SndFile.m_szNames[i][0]) && (m_SndFile.Samples[i].pSample == NULL))
{
@@ -1802,7 +1802,7 @@
} else
if (!pDup)
{
- for (UINT k=1; k<=m_SndFile.m_nSamples; k++)
+ for(SAMPLEINDEX k = 1; k <= m_SndFile.m_nSamples; k++)
{
if (!m_SndFile.IsSampleUsed(k))
{
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1614,6 +1614,11 @@
//------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
+ if(pModDoc == nullptr) return;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+
BOOL bSplitCursor = FALSE;
CHAR s[256];
@@ -1632,7 +1637,7 @@
if (nVal > 64) nVal = 64;
if (nTick < 0) nTick = 0;
if (nTick <= EnvGetReleaseNodeTick() + 1 || EnvGetReleaseNode() == ENV_RELEASE_NODE_UNSET) {
- int displayVal = (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal;
+ int displayVal = (m_nEnv != ENV_VOLUME && !(m_nEnv == ENV_PITCH && (pIns->dwFlags & ENV_FILTER))) ? nVal - 32 : nVal;
wsprintf(s, "Tick %d, [%d]", nTick, displayVal);
} else {
int displayVal = (nVal - EnvGetReleaseNodeValue()) * 2;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -3542,15 +3542,15 @@
case kcNextPattern: { UINT n = m_nPattern + 1;
while ((n < pSndFile->Patterns.Size()) && (!pSndFile->Patterns[n])) n++;
SetCurrentPattern((n < pSndFile->Patterns.Size()) ? n : 0);
- int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
- int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true);
+ ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
+ ORDERINDEX newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true);
SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder);
return wParam; }
case kcPrevPattern: { UINT n = (m_nPattern) ? m_nPattern - 1 : pSndFile->Patterns.Size()-1;
while ((n > 0) && (!pSndFile->Patterns[n])) n--;
SetCurrentPattern(n);
- int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
- int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, false);
+ ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
+ ORDERINDEX newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, false);
SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder);
return wParam; }
case kcSelectWithCopySelect:
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1799,6 +1799,11 @@
BOOL CMidiMacroSetup::OnInitDialog()
//----------------------------------
{
+ m_pModDoc = CMainFrame::GetMainFrame()->GetActiveDoc();
+ if (m_pModDoc) m_pSndFile = CMainFrame::GetMainFrame()->GetActiveDoc()->GetSoundFile();
+ if (!m_pSndFile)
+ return FALSE;
+
CHAR s[128];
CDialog::OnInitDialog();
CheckDlgButton(IDC_CHECK1, m_bEmbed);
@@ -1837,7 +1842,7 @@
m_CbnZxxPreset.AddString("Z80-ZFF controls cutoff");
m_CbnZxxPreset.AddString("Z80-ZFF controls filter mode");
m_CbnZxxPreset.AddString("Z80-Z9F controls resonance+mode");
- m_CbnZxxPreset.SetCurSel(0);
+ m_CbnZxxPreset.SetCurSel(m_pModDoc->GetZxxType(m_MidiCfg.szMidiZXXExt));
UpdateDialog();
int offsetx=108, offsety=30, separatorx=4, separatory=2,
@@ -1863,10 +1868,6 @@
}
UpdateMacroList();
- m_pModDoc = CMainFrame::GetMainFrame()->GetActiveDoc();
- if (m_pModDoc) m_pSndFile = CMainFrame::GetMainFrame()->GetActiveDoc()->GetSoundFile();
- if (!m_pSndFile)
- return FALSE;
for (UINT plug=0; plug<MAX_MIXPLUGINS; plug++)
{
PSNDMIXPLUGIN p = &(m_pSndFile->m_MixPlugins[plug]);
@@ -2034,39 +2035,10 @@
{
UINT zxx_preset = m_CbnZxxPreset.GetCurSel();
- if (zxx_preset)
+ if (zxx_preset && m_pModDoc != nullptr)
{
- BeginWaitCursor();
- for (UINT i=0; i<128; i++)
- {
- switch(zxx_preset)
- {
- case 1:
- if (i<16) wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F001%02X", i*8);
- else m_MidiCfg.szMidiZXXExt[i*32] = 0;
- break;
-
- case 2:
- wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F001%02X", i);
- break;
-
- case 3:
- wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F000%02X", i);
- break;
-
- case 4:
- wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F002%02X", i);
- break;
-
- case 5:
- if (i<16) wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F001%02X", i*8);
- else if (i<32) wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F002%02X", (i-16)*8);
- else m_MidiCfg.szMidiZXXExt[i*32] = 0;
- break;
- }
- }
+ m_pModDoc->CreateZxxFromType(m_MidiCfg.szMidiZXXExt, zxx_preset);
UpdateDialog();
- EndWaitCursor();
}
}
Modified: trunk/OpenMPT/mptrack/misc_util.h
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.h 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/misc_util.h 2009-09-15 17:15:29 UTC (rev 364)
@@ -110,4 +110,29 @@
utilImpl::ArrayCopyImpl<std::tr1::has_trivial_assign<T>::value>::Do(pDst, pSrc, n);
}
+// Sanitize a filename (remove special chars)
+template <size_t size>
+inline void SanitizeFilename(char (&buffer)[size])
+{
+ STATIC_ASSERT(size > 0);
+ for(int i = 0; i < size; i++)
+ {
+ if( buffer[i] == '\\' ||
+ buffer[i] == '\"' ||
+ buffer[i] == '/' ||
+ buffer[i] == ':' ||
+ buffer[i] == '?' ||
+ buffer[i] == '<' ||
+ buffer[i] == '>' ||
+ buffer[i] == '*')
+ {
+ for(int j = i + 1; j < size; j++)
+ {
+ buffer[j - 1] = buffer[j];
+ }
+ buffer[size - 1] = 0;
+ }
+ }
+}
+
#endif
Modified: trunk/OpenMPT/mptrack/mod2midi.cpp
===================================================================
--- trunk/OpenMPT/mptrack/mod2midi.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/mod2midi.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -167,7 +167,7 @@
m_nCurrInstr = 1;
if (m_pSndFile->m_nInstruments)
{
- for (UINT nIns=1; nIns<=m_pSndFile->m_nInstruments; nIns++)
+ for(INSTRUMENTINDEX nIns = 1; nIns <= m_pSndFile->m_nInstruments; nIns++)
{
MODINSTRUMENT *pIns = m_pSndFile->Instruments[nIns];
if ((pIns) && (m_pSndFile->IsInstrumentUsed(nIns)))
@@ -180,15 +180,15 @@
}
} else
{
- for (UINT nIns=1; nIns<=m_pSndFile->m_nSamples; nIns++)
+ for(SAMPLEINDEX nSmp = 1; nSmp <= m_pSndFile->m_nSamples; nSmp++)
{
- if ((m_pSndFile->Samples[nIns].pSample)
- && (m_pSndFile->IsSampleUsed(nIns)))
+ if ((m_pSndFile->Samples[nSmp].pSample)
+ && (m_pSndFile->IsSampleUsed(nSmp)))
{
memset(s, 0, sizeof(s));
- wsprintf(s, "%02d: ", nIns);
- memcpy(s+strlen(s), m_pSndFile->m_szNames[nIns], 32);
- m_CbnInstrument.SetItemData(m_CbnInstrument.AddString(s), nIns);
+ wsprintf(s, "%02d: ", nSmp);
+ memcpy(s+strlen(s), m_pSndFile->m_szNames[nSmp], 32);
+ m_CbnInstrument.SetItemData(m_CbnInstrument.AddString(s), nSmp);
}
}
}
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -14,10 +14,10 @@
#pragma warning(disable:4244)
-BOOL CSoundFile::ReadSampleFromFile(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//-------------------------------------------------------------------------------------
+bool CSoundFile::ReadSampleFromFile(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//--------------------------------------------------------------------------------------------
{
- if ((!nSample) || (nSample >= MAX_SAMPLES)) return FALSE;
+ if ((!nSample) || (nSample >= MAX_SAMPLES)) return false;
if ((!ReadWAVSample(nSample, lpMemFile, dwFileLength))
&& (!ReadXISample(nSample, lpMemFile, dwFileLength))
&& (!ReadAIFFSample(nSample, lpMemFile, dwFileLength))
@@ -25,30 +25,30 @@
&& (!ReadPATSample(nSample, lpMemFile, dwFileLength))
&& (!Read8SVXSample(nSample, lpMemFile, dwFileLength))
&& (!ReadS3ISample(nSample, lpMemFile, dwFileLength)))
- return FALSE;
- return TRUE;
+ return false;
+ return true;
}
-BOOL CSoundFile::ReadInstrumentFromFile(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//----------------------------------------------------------------------------------------
+bool CSoundFile::ReadInstrumentFromFile(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------------------
{
- if ((!nInstr) || (nInstr >= MAX_INSTRUMENTS)) return FALSE;
+ if ((!nInstr) || (nInstr >= MAX_INSTRUMENTS)) return false;
if ((!ReadXIInstrument(nInstr, lpMemFile, dwFileLength))
&& (!ReadPATInstrument(nInstr, lpMemFile, dwFileLength))
&& (!ReadITIInstrument(nInstr, lpMemFile, dwFileLength))
// Generic read
- && (!ReadSampleAsInstrument(nInstr, lpMemFile, dwFileLength))) return FALSE;
+ && (!ReadSampleAsInstrument(nInstr, lpMemFile, dwFileLength))) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
- return TRUE;
+ return true;
}
-BOOL CSoundFile::ReadSampleAsInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//----------------------------------------------------------------------------------------
+bool CSoundFile::ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------------------
{
LPDWORD psig = (LPDWORD)lpMemFile;
- if ((!lpMemFile) || (dwFileLength < 128)) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < 128)) return false;
if (((psig[0] == 0x46464952) && (psig[2] == 0x45564157)) // RIFF....WAVE signature
|| ((psig[0] == 0x5453494C) && (psig[2] == 0x65766177)) // LIST....wave
|| (psig[76/4] == 0x53524353) // S3I signature
@@ -59,7 +59,7 @@
{
// Loading Instrument
MODINSTRUMENT *pIns = new MODINSTRUMENT;
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
// -> CODE#0003
@@ -91,21 +91,20 @@
pIns->NoteMap[iinit] = iinit+1;
}
if (nSample) ReadSampleFromFile(nSample, lpMemFile, dwFileLength);
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
// -> CODE#0003
// -> DESC="remove instrument's samples"
// BOOL CSoundFile::DestroyInstrument(UINT nInstr)
-BOOL CSoundFile::DestroyInstrument(UINT nInstr, char removeSamples)
-// -! BEHAVIOUR_CHANGE#0003
-//---------------------------------------------
+bool CSoundFile::DestroyInstrument(INSTRUMENTINDEX nInstr, char removeSamples)
+//----------------------------------------------------------------------------
{
- if ((!nInstr) || (nInstr > m_nInstruments)) return FALSE;
- if (!Instruments[nInstr]) return TRUE;
+ if ((!nInstr) || (nInstr > m_nInstruments)) return false;
+ if (!Instruments[nInstr]) return true;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -117,7 +116,7 @@
// -> CODE#0023
// -> DESC="IT project files (.itp)"
m_szInstrumentPath[nInstr-1][0] = '\0';
- instrumentModified[nInstr-1] = FALSE;
+ instrumentModified[nInstr-1] = false;
// -! NEW_FEATURE#0023
MODINSTRUMENT *pIns = Instruments[nInstr];
@@ -130,14 +129,14 @@
}
}
delete pIns;
- return TRUE;
+ return true;
}
-BOOL CSoundFile::IsSampleUsed(UINT nSample)
-//-----------------------------------------
+bool CSoundFile::IsSampleUsed(SAMPLEINDEX nSample)
+//------------------------------------------------
{
- if ((!nSample) || (nSample > m_nSamples)) return FALSE;
+ if ((!nSample) || (nSample > m_nSamples)) return false;
if (m_nInstruments)
{
for (UINT i=1; i<=m_nInstruments; i++) if (Instruments[i])
@@ -145,7 +144,7 @@
MODINSTRUMENT *pIns = Instruments[i];
for (UINT j=0; j<128; j++)
{
- if (pIns->Keyboard[j] == nSample) return TRUE;
+ if (pIns->Keyboard[j] == nSample) return true;
}
}
} else
@@ -155,33 +154,33 @@
MODCOMMAND *m = Patterns[i];
for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--)
{
- if (m->instr == nSample) return TRUE;
+ if (m->instr == nSample) return true;
}
}
}
- return FALSE;
+ return false;
}
-BOOL CSoundFile::IsInstrumentUsed(UINT nInstr)
-//--------------------------------------------
+bool CSoundFile::IsInstrumentUsed(INSTRUMENTINDEX nInstr)
+//-------------------------------------------------------
{
- if ((!nInstr) || (nInstr > m_nInstruments) || (!Instruments[nInstr])) return FALSE;
+ if ((!nInstr) || (nInstr > m_nInstruments) || (!Instruments[nInstr])) return false;
for (UINT i=0; i<Patterns.Size(); i++) if (Patterns[i])
{
MODCOMMAND *m = Patterns[i];
for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--)
{
- if (m->instr == nInstr) return TRUE;
+ if (m->instr == nInstr) return true;
}
}
- return FALSE;
+ return false;
}
// Removing all unused samples
-BOOL CSoundFile::RemoveInstrumentSamples(UINT nInstr)
-//---------------------------------------------------
+bool CSoundFile::RemoveInstrumentSamples(INSTRUMENTINDEX nInstr)
+//--------------------------------------------------------------
{
BYTE sampleused[MAX_SAMPLES/8];
@@ -194,23 +193,23 @@
UINT n = p->Keyboard[r];
if (n < MAX_SAMPLES) sampleused[n>>3] |= (1<<(n&7));
}
- for (UINT smp=1; smp<MAX_INSTRUMENTS; smp++) if ((Instruments[smp]) && (smp != nInstr))
+ for (SAMPLEINDEX nSmp=1; nSmp<MAX_INSTRUMENTS; nSmp++) if ((Instruments[nSmp]) && (nSmp != nInstr))
{
- p = Instruments[smp];
+ p = Instruments[nSmp];
for (UINT r=0; r<128; r++)
{
UINT n = p->Keyboard[r];
if (n < MAX_SAMPLES) sampleused[n>>3] &= ~(1<<(n&7));
}
}
- for (UINT d=1; d<=m_nSamples; d++) if (sampleused[d>>3] & (1<<(d&7)))
+ for (SAMPLEINDEX d = 1; d <= m_nSamples; d++) if (sampleused[d>>3] & (1<<(d&7)))
{
DestroySample(d);
m_szNames[d][0] = 0;
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
////////////////////////////////////////////////////////////////////////////////
@@ -218,11 +217,11 @@
// I/O From another song
//
-BOOL CSoundFile::ReadInstrumentFromSong(UINT nInstr, CSoundFile *pSrcSong, UINT nSrcInstr)
-//----------------------------------------------------------------------------------------
+bool CSoundFile::ReadInstrumentFromSong(INSTRUMENTINDEX nInstr, CSoundFile *pSrcSong, UINT nSrcInstr)
+//---------------------------------------------------------------------------------------------------
{
if ((!pSrcSong) || (!nSrcInstr) || (nSrcInstr > pSrcSong->m_nInstruments)
- || (nInstr >= MAX_INSTRUMENTS) || (!pSrcSong->Instruments[nSrcInstr])) return FALSE;
+ || (nInstr >= MAX_INSTRUMENTS) || (!pSrcSong->Instruments[nSrcInstr])) return false;
if (m_nInstruments < nInstr) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -277,16 +276,16 @@
{
ReadSampleFromSong(samplemap[k], pSrcSong, samplesrc[k]);
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-BOOL CSoundFile::ReadSampleFromSong(UINT nSample, CSoundFile *pSrcSong, UINT nSrcSample)
-//--------------------------------------------------------------------------------------
+bool CSoundFile::ReadSampleFromSong(SAMPLEINDEX nSample, CSoundFile *pSrcSong, UINT nSrcSample)
+//---------------------------------------------------------------------------------------------
{
- if ((!pSrcSong) || (!nSrcSample) || (nSrcSample > pSrcSong->m_nSamples) || (nSample >= MAX_SAMPLES)) return FALSE;
+ if ((!pSrcSong) || (!nSrcSample) || (nSrcSample > pSrcSong->m_nSamples) || (nSample >= MAX_SAMPLES)) return false;
MODSAMPLE *psmp = &pSrcSong->Samples[nSrcSample];
UINT nSize = psmp->nLength;
if (psmp->uFlags & CHN_16BIT) nSize *= 2;
@@ -318,7 +317,7 @@
{
FrequencyToTranspose(&Samples[nSample]);
}
- return TRUE;
+ return true;
}
@@ -330,8 +329,8 @@
extern BOOL IMAADPCMUnpack16(signed short *pdest, UINT nLen, LPBYTE psrc, DWORD dwBytes, UINT pkBlkAlign);
-BOOL CSoundFile::ReadWAVSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset)
-//------------------------------------------------------------------------------------------------------
+bool CSoundFile::ReadWAVSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset)
+//-------------------------------------------------------------------------------------------------------------
{
DWORD dwMemPos = 0, dwDataPos;
WAVEFILEHEADER *phdr = (WAVEFILEHEADER *)lpMemFile;
@@ -341,9 +340,9 @@
WAVEEXTRAHEADER *pxh;
DWORD dwInfoList, dwFact, dwSamplesPerBlock;
- if ((!nSample) || (!lpMemFile) || (dwFileLength < (DWORD)(sizeof(WAVEFILEHEADER)+sizeof(WAVEFORMATHEADER)))) return FALSE;
+ if ((!nSample) || (!lpMemFile) || (dwFileLength < (DWORD)(sizeof(WAVEFILEHEADER)+sizeof(WAVEFORMATHEADER)))) return false;
if (((phdr->id_RIFF != IFFID_RIFF) && (phdr->id_RIFF != IFFID_LIST))
- || ((phdr->id_WAVE != IFFID_WAVE) && (phdr->id_WAVE != IFFID_wave))) return FALSE;
+ || ((phdr->id_WAVE != IFFID_WAVE) && (phdr->id_WAVE != IFFID_wave))) return false;
dwMemPos = sizeof(WAVEFILEHEADER);
dwDataPos = 0;
pfmt = NULL;
@@ -410,7 +409,7 @@
}
dwMemPos += dwLen + 8;
}
- if ((!pdata) || (!pfmt) || (pdata->length < 4)) return FALSE;
+ if ((!pdata) || (!pfmt) || (pdata->length < 4)) return false;
if ((pfmtpk) && (pfmt))
{
if (pfmt->format != 1)
@@ -419,7 +418,7 @@
pfmt = pfmtpk;
pfmtpk = tmp;
if ((pfmtpk->format != 0x11) || (pfmtpk->bitspersample != 4)
- || (pfmtpk->channels != 1)) return FALSE;
+ || (pfmtpk->channels != 1)) return false;
} else pfmtpk = NULL;
}
// WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT, WAVE_FORMAT_EXTENSIBLE
@@ -430,7 +429,7 @@
|| (pfmt->bitspersample & 7)
|| (!pfmt->bitspersample)
|| (pfmt->bitspersample > 32)
- ) return FALSE;
+ ) return false;
DestroySample(nSample);
UINT nType = RS_PCM8U;
@@ -570,14 +569,14 @@
}
}
}
- return TRUE;
+ return true;
}
///////////////////////////////////////////////////////////////
// Save WAV
-BOOL CSoundFile::SaveWAVSample(UINT nSample, LPCSTR lpszFileName)
+bool CSoundFile::SaveWAVSample(UINT nSample, LPCSTR lpszFileName)
//---------------------------------------------------------------
{
LPCSTR lpszMPT = "Modplug Tracker\0";
@@ -590,7 +589,7 @@
MODSAMPLE *pSmp = &Samples[nSample];
FILE *f;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
memset(&extra, 0, sizeof(extra));
memset(&smpl, 0, sizeof(smpl));
header.id_RIFF = IFFID_RIFF;
@@ -679,19 +678,19 @@
extra.nVibRate = pSmp->nVibRate;
fwrite(&extra, 1, sizeof(extra), f);
fclose(f);
- return TRUE;
+ return true;
}
///////////////////////////////////////////////////////////////
// Save RAW
-BOOL CSoundFile::SaveRAWSample(UINT nSample, LPCSTR lpszFileName)
+bool CSoundFile::SaveRAWSample(UINT nSample, LPCSTR lpszFileName)
//---------------------------------------------------------------
{
MODSAMPLE *pSmp = &Samples[nSample];
FILE *f;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
UINT nType;
if (pSmp->uFlags & CHN_STEREO)
@@ -700,7 +699,7 @@
nType = (pSmp->uFlags & CHN_16BIT) ? RS_PCM16S : RS_PCM8S;
WriteSample(f, pSmp, nType);
fclose(f);
- return TRUE;
+ return true;
}
/////////////////////////////////////////////////////////////
@@ -867,8 +866,8 @@
}
-BOOL CSoundFile::ReadPATSample(UINT nSample, LPBYTE lpStream, DWORD dwMemLength)
-//------------------------------------------------------------------------------
+bool CSoundFile::ReadPATSample(SAMPLEINDEX nSample, LPBYTE lpStream, DWORD dwMemLength)
+//-------------------------------------------------------------------------------------
{
DWORD dwMemPos = sizeof(GF1PATCHFILEHEADER)+sizeof(GF1INSTRUMENT)+sizeof(GF1LAYER);
GF1PATCHFILEHEADER *phdr = (GF1PATCHFILEHEADER *)lpStream;
@@ -877,7 +876,7 @@
if ((!lpStream) || (dwMemLength < 512)
|| (phdr->gf1p != 0x50314647) || (phdr->atch != 0x48435441)
|| (phdr->version[3] != 0) || (phdr->id[9] != 0) || (phdr->instrum < 1)
- || (!phdr->samples) || (!pinshdr->layers)) return FALSE;
+ || (!phdr->samples) || (!pinshdr->layers)) return false;
DestroySample(nSample);
PatchToSample(this, nSample, lpStream+dwMemPos, dwMemLength-dwMemPos);
if (pinshdr->name[0] > ' ')
@@ -885,13 +884,13 @@
memcpy(m_szNames[nSample], pinshdr->name, 16);
m_szNames[nSample][16] = 0;
}
- return TRUE;
+ return true;
}
// PAT Instrument
-BOOL CSoundFile::ReadPATInstrument(UINT nInstr, LPBYTE lpStream, DWORD dwMemLength)
-//---------------------------------------------------------------------------------
+bool CSoundFile::ReadPATInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpStream, DWORD dwMemLength)
+//--------------------------------------------------------------------------------------------
{
GF1PATCHFILEHEADER *phdr = (GF1PATCHFILEHEADER *)lpStream;
GF1INSTRUMENT *pih = (GF1INSTRUMENT *)(lpStream+sizeof(GF1PATCHFILEHEADER));
@@ -904,7 +903,7 @@
|| (phdr->gf1p != 0x50314647) || (phdr->atch != 0x48435441)
|| (phdr->version[3] != 0) || (phdr->id[9] != 0)
|| (phdr->instrum < 1) || (!phdr->samples)
- || (!pih->layers) || (!plh->samples)) return FALSE;
+ || (!pih->layers) || (!plh->samples)) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -912,7 +911,7 @@
DestroyInstrument(nInstr,1);
// -! BEHAVIOUR_CHANGE#0003
pIns = new MODINSTRUMENT;
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
Instruments[nInstr] = pIns;
@@ -1004,7 +1003,7 @@
}
}
}
- return TRUE;
+ return true;
}
@@ -1032,8 +1031,8 @@
DWORD scrs;
} S3ISAMPLESTRUCT;
-BOOL CSoundFile::ReadS3ISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//--------------------------------------------------------------------------------
+bool CSoundFile::ReadS3ISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------
{
S3ISAMPLESTRUCT *pss = (S3ISAMPLESTRUCT *)lpMemFile;
MODSAMPLE *pSmp = &Samples[nSample];
@@ -1042,7 +1041,7 @@
if ((!lpMemFile) || (dwFileLength < sizeof(S3ISAMPLESTRUCT))
|| (pss->id != 0x01) || (((DWORD)pss->offset << 4) >= dwFileLength)
- || (pss->scrs != 0x53524353)) return FALSE;
+ || (pss->scrs != 0x53524353)) return false;
DestroySample(nSample);
dwMemPos = pss->offset << 4;
memcpy(pSmp->filename, pss->filename, 12);
@@ -1063,7 +1062,7 @@
flags = (pss->flags & 0x04) ? RS_PCM16U : RS_PCM8U;
if (pss->flags & 0x02) flags |= RSF_STEREO;
ReadSample(pSmp, flags, (LPSTR)(lpMemFile+dwMemPos), dwFileLength-dwMemPos);
- return TRUE;
+ return true;
}
@@ -1112,8 +1111,8 @@
-BOOL CSoundFile::ReadXIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//----------------------------------------------------------------------------------
+bool CSoundFile::ReadXIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------------
{
XIFILEHEADER *pxh = (XIFILEHEADER *)lpMemFile;
XIINSTRUMENTHEADER *pih = (XIINSTRUMENTHEADER *)(lpMemFile+sizeof(XIFILEHEADER));
@@ -1123,11 +1122,11 @@
DWORD dwMemPos = sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER);
UINT nsamples;
- if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return FALSE;
- if (dwMemPos + pxh->shsize - 0x102 >= dwFileLength) return FALSE;
- if (memcmp(pxh->extxi, "Extended Instrument", 19)) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return false;
+ if (dwMemPos + pxh->shsize - 0x102 >= dwFileLength) return false;
+ if (memcmp(pxh->extxi, "Extended Instrument", 19)) return false;
dwMemPos += pxh->shsize - 0x102;
- if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return FALSE;
+ if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -1136,7 +1135,7 @@
// -! BEHAVIOUR_CHANGE#0003
Instruments[nInstr] = new MODINSTRUMENT;
MODINSTRUMENT *pIns = Instruments[nInstr];
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
memcpy(pIns->name, pxh->name, 22);
@@ -1295,18 +1294,18 @@
// -> DESC="per-instrument volume ramping setup (refered as attack)"
// Leave if no extra instrument settings are available (end of file reached)
- if(dwMemPos >= dwFileLength) return TRUE;
+ if(dwMemPos >= dwFileLength) return true;
ReadExtendedInstrumentProperties(pIns, lpMemFile + dwMemPos, dwFileLength - dwMemPos);
// -! NEW_FEATURE#0027
- return TRUE;
+ return true;
}
-BOOL CSoundFile::SaveXIInstrument(UINT nInstr, LPCSTR lpszFileName)
-//-----------------------------------------------------------------
+bool CSoundFile::SaveXIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName)
+//----------------------------------------------------------------------------
{
XIFILEHEADER xfh;
XIINSTRUMENTHEADER xih;
@@ -1316,8 +1315,8 @@
UINT nsamples;
FILE *f;
- if ((!pIns) || (!lpszFileName)) return FALSE;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((!pIns) || (!lpszFileName)) return false;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
// XI File Header
memset(&xfh, 0, sizeof(xfh));
memset(&xih, 0, sizeof(xih));
@@ -1431,12 +1430,12 @@
fclose(f);
- return TRUE;
+ return true;
}
-BOOL CSoundFile::ReadXISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//-------------------------------------------------------------------------------
+bool CSoundFile::ReadXISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//--------------------------------------------------------------------------------------
{
XIFILEHEADER *pxh = (XIFILEHEADER *)lpMemFile;
XIINSTRUMENTHEADER *pih = (XIINSTRUMENTHEADER *)(lpMemFile+sizeof(XIFILEHEADER));
@@ -1445,10 +1444,10 @@
MODSAMPLE *pSmp = &Samples[nSample];
UINT nsamples;
- if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return FALSE;
- if (memcmp(pxh->extxi, "Extended Instrument", 19)) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return false;
+ if (memcmp(pxh->extxi, "Extended Instrument", 19)) return false;
dwMemPos += pxh->shsize - 0x102;
- if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return FALSE;
+ if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return false;
DestroySample(nSample);
nsamples = 0;
for (UINT i=0; i<96; i++)
@@ -1516,9 +1515,9 @@
memcpy(pSmp->filename, psh->name, 22);
pSmp->filename[21] = 0;
}
- if (dwMemPos >= dwFileLength) return TRUE;
+ if (dwMemPos >= dwFileLength) return true;
ReadSample(pSmp, sampleflags, (LPSTR)(lpMemFile+dwMemPos), dwFileLength-dwMemPos);
- return TRUE;
+ return true;
}
@@ -1580,8 +1579,8 @@
-BOOL CSoundFile::ReadAIFFSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//---------------------------------------------------------------------------------
+bool CSoundFile::ReadAIFFSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//----------------------------------------------------------------------------------------
{
DWORD dwMemPos = sizeof(AIFFFILEHEADER);
DWORD dwFORMLen, dwCOMMLen, dwSSNDLen;
@@ -1590,22 +1589,22 @@
AIFFSSND *psnd;
UINT nType;
- if ((!lpMemFile) || (dwFileLength < (DWORD)sizeof(AIFFFILEHEADER))) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < (DWORD)sizeof(AIFFFILEHEADER))) return false;
dwFORMLen = BigEndian(phdr->dwLen);
if ((phdr->dwFORM != 0x4D524F46) || (phdr->dwAIFF != 0x46464941)
- || (dwFORMLen > dwFileLength) || (dwFORMLen < (DWORD)sizeof(AIFFCOMM))) return FALSE;
+ || (dwFORMLen > dwFileLength) || (dwFORMLen < (DWORD)sizeof(AIFFCOMM))) return false;
pcomm = (AIFFCOMM *)(lpMemFile+dwMemPos);
dwCOMMLen = BigEndian(pcomm->dwLen);
- if ((pcomm->dwCOMM != 0x4D4D4F43) || (dwCOMMLen < 0x12) || (dwCOMMLen >= dwFileLength)) return FALSE;
- if ((pcomm->wChannels != 0x0100) && (pcomm->wChannels != 0x0200)) return FALSE;
- if ((pcomm->wSampleSize != 0x0800) && (pcomm->wSampleSize != 0x1000)) return FALSE;
+ if ((pcomm->dwCOMM != 0x4D4D4F43) || (dwCOMMLen < 0x12) || (dwCOMMLen >= dwFileLength)) return false;
+ if ((pcomm->wChannels != 0x0100) && (pcomm->wChannels != 0x0200)) return false;
+ if ((pcomm->wSampleSize != 0x0800) && (pcomm->wSampleSize != 0x1000)) return false;
dwMemPos += dwCOMMLen + 8;
- if (dwMemPos + sizeof(AIFFSSND) >= dwFileLength) return FALSE;
+ if (dwMemPos + sizeof(AIFFSSND) >= dwFileLength) return false;
psnd = (AIFFSSND *)(lpMemFile+dwMemPos);
dwSSNDLen = BigEndian(psnd->dwLen);
- if ((psnd->dwSSND != 0x444E5353) || (dwSSNDLen >= dwFileLength) || (dwSSNDLen < 8)) return FALSE;
+ if ((psnd->dwSSND != 0x444E5353) || (dwSSNDLen >= dwFileLength) || (dwSSNDLen < 8)) return false;
dwMemPos += sizeof(AIFFSSND);
- if (dwMemPos >= dwFileLength) return FALSE;
+ if (dwMemPos >= dwFileLength) return false;
DestroySample(nSample);
if (pcomm->wChannels == 0x0100)
{
@@ -1641,7 +1640,7 @@
m_szNames[nSample][0] = 0;
if (pSmp->nLength > MAX_SAMPLE_LENGTH) pSmp->nLength = MAX_SAMPLE_LENGTH;
ReadSample(pSmp, nType, (LPSTR)(lpMemFile+dwMemPos), dwFileLength-dwMemPos);
- return TRUE;
+ return true;
}
@@ -1651,9 +1650,8 @@
// -> CODE#0027
// -> DESC="per-instrument volume ramping setup (refered as attack)"
//BOOL CSoundFile::ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset)
-UINT CSoundFile::ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset)
-// -! NEW_FEATURE#0027
-//------------------------------------------------------------------------------------------------
+UINT CSoundFile::ReadITSSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset)
+//-------------------------------------------------------------------------------------------------------
{
ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)lpMemFile;
MODSAMPLE *pSmp = &Samples[nSample];
@@ -1728,8 +1726,8 @@
}
-BOOL CSoundFile::ReadITIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//-----------------------------------------------------------------------------------
+bool CSoundFile::ReadITIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//----------------------------------------------------------------------------------------------
{
ITINSTRUMENT *pinstr = (ITINSTRUMENT *)lpMemFile;
WORD samplemap[NOTE_MAX]; //rewbs.noSamplePerInstroLimit (120 was 64)
@@ -1737,7 +1735,7 @@
UINT nsmp, nsamples;
if ((!lpMemFile) || (dwFileLength < sizeof(ITINSTRUMENT))
- || (pinstr->id != 0x49504D49)) return FALSE;
+ || (pinstr->id != 0x49504D49)) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -1746,7 +1744,7 @@
// -! BEHAVIOUR_CHANGE#0003
Instruments[nInstr] = new MODINSTRUMENT;
MODINSTRUMENT *pIns = Instruments[nInstr];
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
memset(samplemap, 0, sizeof(samplemap));
@@ -1805,18 +1803,18 @@
ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)ptr;
dwMemPos += pis->samplepointer - dwMemPos + lastSampleSize;
// Leave if no extra instrument settings are available (end of file reached)
- if(dwMemPos >= dwFileLength) return TRUE;
+ if(dwMemPos >= dwFileLength) return true;
ReadExtendedInstrumentProperties(pIns, lpMemFile + dwMemPos, dwFileLength - dwMemPos);
// -! NEW_FEATURE#0027
- return TRUE;
+ return true;
}
-BOOL CSoundFile::SaveITIInstrument(UINT nInstr, LPCSTR lpszFileName)
-//------------------------------------------------------------------
+bool CSoundFile::SaveITIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName)
+//-----------------------------------------------------------------------------
{
BYTE buffer[554];
ITINSTRUMENT *iti = (ITINSTRUMENT *)buffer;
@@ -1826,8 +1824,8 @@
DWORD dwPos;
FILE *f;
- if ((!pIns) || (!lpszFileName)) return FALSE;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((!pIns) || (!lpszFileName)) return false;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
memset(buffer, 0, sizeof(buffer));
memset(smpcount, 0, sizeof(smpcount));
memset(smptable, 0, sizeof(smptable));
@@ -1999,7 +1997,7 @@
WriteInstrumentHeaderStruct(pIns, f); // Write full extended header.
fclose(f);
- return TRUE;
+ return true;
}
@@ -2112,8 +2110,8 @@
-BOOL CSoundFile::Read8SVXSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//--------------------------------------------------------------------------------
+bool CSoundFile::Read8SVXSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------
{
IFF8SVXFILEHEADER *pfh = (IFF8SVXFILEHEADER *)lpMemFile;
IFFVHDR *pvh = (IFFVHDR *)(lpMemFile + 12);
@@ -2122,7 +2120,7 @@
if ((!lpMemFile) || (dwFileLength < sizeof(IFFVHDR)+12) || (pfh->dwFORM != IFFID_FORM)
|| (pfh->dw8SVX != IFFID_8SVX) || (BigEndian(pfh->dwSize) >= dwFileLength)
- || (pvh->dwVHDR != IFFID_VHDR) || (BigEndian(pvh->dwSize) >= dwFileLength)) return FALSE;
+ || (pvh->dwVHDR != IFFID_VHDR) || (BigEndian(pvh->dwSize) >= dwFileLength)) return false;
DestroySample(nSample);
// Default values
pSmp->nGlobalVol = 64;
@@ -2174,7 +2172,7 @@
}
dwMemPos += dwChunkLen + 8;
}
- return TRUE;
+ return true;
}
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -3083,7 +3083,7 @@
MODCHANNEL *pChn = &Chn[nChn];
UINT nRetrigSpeed = param & 0x0F;
UINT nRetrigCount = pChn->nRetrigCount;
- BOOL bDoRetrig = FALSE;
+ bool bDoRetrig = false;
if(IsCompatibleMode(TRK_IMPULSETRACKER))
{
@@ -3095,7 +3095,7 @@
else if (!pChn->nRetrigCount || !--pChn->nRetrigCount)
{
pChn->nRetrigCount = param & 0xf;
- bDoRetrig = TRUE;
+ bDoRetrig = true;
}
}
else
@@ -3103,7 +3103,7 @@
if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
if (!nRetrigSpeed) nRetrigSpeed = 1;
- if ((nRetrigCount) && (!(nRetrigCount % nRetrigSpeed))) bDoRetrig = TRUE;
+ if ((nRetrigCount) && (!(nRetrigCount % nRetrigSpeed))) bDoRetrig = true;
nRetrigCount++;
} else
{
@@ -3112,12 +3112,12 @@
if ((m_nTickCount) || (param & 0x100))
{
if (!realspeed) realspeed = 1;
- if ((!(param & 0x100)) && (m_nMusicSpeed) && (!(m_nTickCount % realspeed))) bDoRetrig = TRUE;
+ if ((!(param & 0x100)) && (m_nMusicSpeed) && (!(m_nTickCount % realspeed))) bDoRetrig = true;
nRetrigCount++;
} else if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) nRetrigCount = 0;
if (nRetrigCount >= realspeed)
{
- if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = TRUE;
+ if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = true;
}
}
}
@@ -3152,12 +3152,13 @@
if ((pChn->nRowInstr) && (param < 0x100)) { InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE); bResetEnv = TRUE; }
if (param < 0x100) bResetEnv = TRUE;
}
- NoteChange(nChn, nNote, false, bResetEnv);
+ NoteChange(nChn, nNote, IsCompatibleMode(TRK_IMPULSETRACKER) ? true : false, bResetEnv);
if (m_nInstruments) {
ProcessMidiOut(nChn, pChn); //Send retrig to Midi
}
if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!pChn->nRowNote) && (nOldPeriod)) pChn->nPeriod = nOldPeriod;
if (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) nRetrigCount = 0;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPos = pChn->nPosLo = 0;
if (offset) //rewbs.volOffset: apply offset on retrig
{
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1337,10 +1337,10 @@
//m_nSeqOverride = 0;
}
-int CSoundFile::FindOrder(PATTERNINDEX pat, UINT startFromOrder, bool direction)
-//----------------------------------------------------------------------
+ORDERINDEX CSoundFile::FindOrder(PATTERNINDEX pat, UINT startFromOrder, bool direction)
+//-------------------------------------------------------------------------------------
{
- int foundAtOrder = -1;
+ int foundAtOrder = ORDERINDEX_INVALID;
int candidateOrder = 0;
for (UINT p=0; p<Order.size(); p++) {
@@ -1708,15 +1708,15 @@
}
-BOOL CSoundFile::CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result)
-//-----------------------------------------------------------------------------------
+bool CSoundFile::CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result/*=NULL*/)
+//--------------------------------------------------------------------------------------------
{
int pos, old, oldpos, besttable = 0;
DWORD dwErr, dwTotal, dwResult;
int i,j;
if (result) *result = 0;
- if ((!pSample) || (nLen < 1024)) return FALSE;
+ if ((!pSample) || (nLen < 1024)) return false;
// Try packing with different tables
dwResult = 0;
for (j=1; j<MAX_PACK_TABLES; j++)
@@ -1746,7 +1746,7 @@
{
if (dwResult > 100) *result = 100; else *result = (BYTE)dwResult;
}
- return (dwResult >= nPacking) ? TRUE : FALSE;
+ return (dwResult >= nPacking) ? true : false;
}
#endif // NO_PACKING
@@ -2743,10 +2743,10 @@
}
-BOOL CSoundFile::RemoveSelectedSamples(BOOL *pbIns)
+bool CSoundFile::RemoveSelectedSamples(bool *pbIns)
//-------------------------------------------------
{
- if (!pbIns) return FALSE;
+ if (!pbIns) return false;
for (UINT j=1; j<MAX_SAMPLES; j++)
{
if ((!pbIns[j]) && (Samples[j].pSample))
@@ -2755,15 +2755,15 @@
if ((j == m_nSamples) && (j > 1)) m_nSamples--;
}
}
- return TRUE;
+ return true;
}
-BOOL CSoundFile::DestroySample(UINT nSample)
-//------------------------------------------
+bool CSoundFile::DestroySample(SAMPLEINDEX nSample)
+//-------------------------------------------------
{
- if ((!nSample) || (nSample >= MAX_SAMPLES)) return FALSE;
- if (!Samples[nSample].pSample) return TRUE;
+ if ((!nSample) || (nSample >= MAX_SAMPLES)) return false;
+ if (!Samples[nSample].pSample) return true;
MODSAMPLE *pSmp = &Samples[nSample];
LPSTR pSample = pSmp->pSample;
pSmp->pSample = nullptr;
@@ -2778,13 +2778,13 @@
}
}
FreeSample(pSample);
- return TRUE;
+ return true;
}
// -> CODE#0020
// -> DESC="rearrange sample list"
-bool CSoundFile::MoveSample(UINT from, UINT to)
-//---------------------------------------------
+bool CSoundFile::MoveSample(SAMPLEINDEX from, SAMPLEINDEX to)
+//-----------------------------------------------------------
{
if (!from || from >= MAX_SAMPLES || !to || to >= MAX_SAMPLES) return false;
if (/*!Ins[from].pSample ||*/ Samples[to].pSample) return true;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-15 17:15:29 UTC (rev 364)
@@ -634,7 +634,7 @@
static const CModSpecifications& GetModSpecifications(const MODTYPE type);
double GetCurrentBPM() const;
- int FindOrder(PATTERNINDEX pat, UINT startFromOrder=0, bool direction=true); //rewbs.playSongFromCursor
+ ORDERINDEX FindOrder(PATTERNINDEX pat, UINT startFromOrder=0, bool direction=true); //rewbs.playSongFromCursor
void DontLoopPattern(int nPat, int nRow=0); //rewbs.playSongFromCursor
void SetCurrentPos(UINT nPos);
void SetCurrentOrder(UINT nOrder);
@@ -848,55 +848,54 @@
// Read/Write sample functions
char GetDeltaValue(char prev, UINT n) const { return (char)(prev + CompressionTable[n & 0x0F]); }
UINT PackSample(int &sample, int next);
- BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
+ bool CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
UINT ReadSample(MODSAMPLE *pSmp, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength, const WORD format = 1);
- BOOL DestroySample(UINT nSample);
+ bool DestroySample(SAMPLEINDEX nSample);
// -> CODE#0020
// -> DESC="rearrange sample list"
- bool MoveSample(UINT from,UINT to);
+ bool MoveSample(SAMPLEINDEX from, SAMPLEINDEX to);
// -! NEW_FEATURE#0020
// -> CODE#0003
// -> DESC="remove instrument's samples"
//BOOL DestroyInstrument(UINT nInstr);
- BOOL DestroyInstrument(UINT nInstr, char removeSamples = 0);
+ bool DestroyInstrument(INSTRUMENTINDEX nInstr, char removeSamples = 0);
// -! BEHAVIOUR_CHANGE#0003
- BOOL IsSampleUsed(UINT nSample);
- BOOL IsInstrumentUsed(UINT nInstr);
- BOOL RemoveInstrumentSamples(UINT nInstr);
+ bool IsSampleUsed(SAMPLEINDEX nSample);
+ bool IsInstrumentUsed(INSTRUMENTINDEX nInstr);
+ bool RemoveInstrumentSamples(INSTRUMENTINDEX nInstr);
UINT DetectUnusedSamples(BYTE *); // bitmask
- BOOL RemoveSelectedSamples(BOOL *);
+ bool RemoveSelectedSamples(bool *pbIns);
void AdjustSampleLoop(MODSAMPLE *pSmp);
// Samples file I/O
- BOOL ReadSampleFromFile(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadWAVSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset=NULL);
- BOOL ReadPATSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadS3ISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadAIFFSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadXISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadSampleFromFile(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadWAVSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset=NULL);
+ bool ReadPATSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadS3ISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadAIFFSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadXISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
// -> CODE#0027
// -> DESC="per-instrument volume ramping setup (refered as attack)"
// BOOL ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset=0);
- UINT ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset=0);
+ UINT ReadITSSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset=0);
// -! NEW_FEATURE#0027
- BOOL ReadITISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL Read8SVXSample(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL SaveWAVSample(UINT nSample, LPCSTR lpszFileName);
- BOOL SaveRAWSample(UINT nSample, LPCSTR lpszFileName);
+ bool Read8SVXSample(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool SaveWAVSample(UINT nSample, LPCSTR lpszFileName);
+ bool SaveRAWSample(UINT nSample, LPCSTR lpszFileName);
// Instrument file I/O
- BOOL ReadInstrumentFromFile(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadXIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadITIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadPATInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadSampleAsInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL SaveXIInstrument(UINT nInstr, LPCSTR lpszFileName);
- BOOL SaveITIInstrument(UINT nInstr, LPCSTR lpszFileName);
+ bool ReadInstrumentFromFile(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadXIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadITIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadPATInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool SaveXIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName);
+ bool SaveITIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName);
// I/O from another sound file
- BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument);
- BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample);
+ bool ReadInstrumentFromSong(INSTRUMENTINDEX nInstr, CSoundFile *pSrcSong, UINT nSrcInstrument);
+ bool ReadSampleFromSong(SAMPLEINDEX nSample, CSoundFile *pSrcSong, UINT nSrcSample);
// Period/Note functions
UINT GetNoteFromPeriod(UINT period) const;
UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC5Speed) const;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-13 20:41:39
|
Revision: 363
http://modplug.svn.sourceforge.net/modplug/?rev=363&view=rev
Author: saga-games
Date: 2009-09-13 20:41:27 +0000 (Sun, 13 Sep 2009)
Log Message:
-----------
[New] Sequence Editor: Added context menu item "Render to wave", to render one ore more patterns to wave.
[New] Sample Editor: Added setting "FinetuneStep" to INI section "Sample Editor"
[Fix] Sample Editor: When using the spin control, frequency is not clamped to [2000, 96000] anymore.
[Imp] Pattern Editor: Don't reset "replace all" flag after every search
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.h
trunk/OpenMPT/mptrack/Mod2wave.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/mod2wave.h
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -101,6 +101,7 @@
afx_msg void OnSwitchToView();
afx_msg void OnInsertOrder();
afx_msg void OnDeleteOrder();
+ afx_msg void OnRenderOrder();
afx_msg void OnPatternProperties();
afx_msg void OnPlayerPlay();
afx_msg void OnPlayerPause();
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -43,6 +43,7 @@
ON_COMMAND(ID_CONTROLTAB, OnSwitchToView)
ON_COMMAND(ID_ORDERLIST_INSERT, OnInsertOrder)
ON_COMMAND(ID_ORDERLIST_DELETE, OnDeleteOrder)
+ ON_COMMAND(ID_ORDERLIST_RENDER, OnRenderOrder)
ON_COMMAND(ID_PATTERN_PROPERTIES, OnPatternProperties)
ON_COMMAND(ID_PLAYER_PLAY, OnPlayerPlay)
ON_COMMAND(ID_PLAYER_PAUSE, OnPlayerPause)
@@ -831,6 +832,9 @@
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Properties...");
}
}
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_RENDER, "Render to &Wave");
+
ClientToScreen(&pt);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
::DestroyMenu(hMenu);
@@ -939,7 +943,14 @@
}
}
+void COrderList::OnRenderOrder()
+//------------------------------
+{
+ ORD_SELECTION selection = GetCurSel(false);
+ m_pModDoc->OnFileWaveConvert(selection.nOrdLo, selection.nOrdHi);
+}
+
void COrderList::OnDeleteOrder()
//------------------------------
{
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -402,6 +402,9 @@
}
}
SetCurrentSample((lParam > 0) ? lParam : m_nSample);
+
+ m_nFinetuneStep = CMainFrame::GetPrivateProfileLong("Sample Editor", "FinetuneStep", 25, theApp.GetConfigFileName());
+
// Initial Update
// 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
if (!m_bInitialized) UpdateView((m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_MODTYPE, NULL);
@@ -3121,12 +3124,10 @@
{
if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
- LONG d = pSmp->nC5Speed;
+ UINT d = pSmp->nC5Speed;
if (d < 1) d = 8363;
- d += (pos * 25);
- if (d > 96000) d = 96000;
- if (d < 2000) d = 2000;
- pSmp->nC5Speed = d;
+ d += (pos * m_nFinetuneStep);
+ pSmp->nC5Speed = CLAMP(d, 579, 139921); // B-8, C-1
int transp = CSoundFile::FrequencyToTranspose(pSmp->nC5Speed) >> 7;
int basenote = 60 - transp;
if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN;
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -23,6 +23,7 @@
uint32 m_nSequenceMs;
uint32 m_nSeekWindowMs;
uint32 m_nOverlapMs;
+ uint16 m_nFinetuneStep; // Increment finetune by x when using spin control. Default = 25
enum {nDefaultStretchChunkSize = 8192};
CComboBox m_ComboPitch, m_ComboQuality, m_ComboFFT;
Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -57,14 +57,24 @@
END_MESSAGE_MAP()
-CWaveConvert::CWaveConvert(CWnd *parent):CDialog(IDD_WAVECONVERT, parent)
-//-----------------------------------------------------------------------
+CWaveConvert::CWaveConvert(CWnd *parent, ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder):
+ CDialog(IDD_WAVECONVERT, parent)
+//-----------------------------------------------------------------------------------
{
m_bGivePlugsIdleTime = false;
m_bNormalize = FALSE;
m_bHighQuality = FALSE;
m_bSelectPlay = FALSE;
- m_nMinOrder = m_nMaxOrder = 0;
+ if(nMinOrder != ORDERINDEX_INVALID && nMaxOrder != ORDERINDEX_INVALID)
+ {
+ // render selection
+ m_nMinOrder = nMinOrder;
+ m_nMaxOrder = nMaxOrder;
+ m_bSelectPlay = true;
+ } else
+ {
+ m_nMinOrder = m_nMaxOrder = 0;
+ }
m_dwFileLimit = 0;
m_dwSongLimit = 0;
memset(&WaveFormat, 0, sizeof(WaveFormat));
@@ -110,6 +120,8 @@
SetDlgItemInt(IDC_EDIT3, m_nMinOrder);
SetDlgItemInt(IDC_EDIT4, m_nMaxOrder);
+
+
for (UINT i=0; i<NUMMIXRATE; i++)
{
UINT n = nMixingRates[i];
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -1388,6 +1388,12 @@
void CModDoc::OnFileWaveConvert()
//-------------------------------
{
+ OnFileWaveConvert(0, 0);
+}
+
+void CModDoc::OnFileWaveConvert(ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder)
+//-------------------------------------------------------------------------
+{
TCHAR fname[_MAX_FNAME]="";
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
@@ -1398,7 +1404,7 @@
"Wave Files (*.wav)|*.wav||", pMainFrm);
dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_EXPORT);
- CWaveConvert wsdlg(pMainFrm);
+ CWaveConvert wsdlg(pMainFrm, nMinOrder, nMaxOrder);
if (wsdlg.DoModal() != IDOK) return;
if (dlg.DoModal() != IDOK) return; //rewbs: made filename dialog appear after wav settings dialog
@@ -1409,9 +1415,7 @@
strcpy(s, dlg.GetPathName());
// Saving as wave file
-// -> CODE#0024
-// -> DESC="wav export update"
- UINT p = 0,n = 1;
+ UINT p = 0, n = 1;
DWORD flags[MAX_BASECHANNELS];
CHAR channel[MAX_CHANNELNAME+10];
@@ -1434,38 +1438,12 @@
dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit;
dwcdlg.m_nMaxPatterns = (wsdlg.m_bSelectPlay) ? wsdlg.m_nMaxOrder - wsdlg.m_nMinOrder + 1 : 0;
//if(wsdlg.m_bHighQuality) CSoundFile::SetResamplingMode(SRCMODE_POLYPHASE);
-// -! NEW_FEATURE#0024
BOOL bplaying = FALSE;
UINT pos = m_SndFile.GetCurrentPos();
bplaying = TRUE;
pMainFrm->PauseMod();
-// rewbs.fix3239: moved position definition into loop below
-/* m_SndFile.SetCurrentPos(0);
- if (wsdlg.m_bSelectPlay)
- {
- m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder);
- m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder;
- m_SndFile.GetLength(TRUE, FALSE);
- m_SndFile.m_nMaxOrderPosition = wsdlg.m_nMaxOrder + 1;
- }
-*/
-//end rewbs.fix3239: moved position definition into loop below
- // Saving file
-
-// -> CODE#0024
-// -> DESC="wav export update"
-// CDoWaveConvert dwcdlg(&m_SndFile, s, &wsdlg.WaveFormat.Format, wsdlg.m_bNormalize, pMainFrm);
-// dwcdlg.m_dwFileLimit = wsdlg.m_dwFileLimit;
-// dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit;
-// dwcdlg.m_nMaxPatterns = (wsdlg.m_bSelectPlay) ? wsdlg.m_nMaxOrder - wsdlg.m_nMinOrder + 1 : 0;
-// if (wsdlg.m_bHighQuality)
-// {
-// CSoundFile::SetResamplingMode(SRCMODE_POLYPHASE);
-// }
-// dwcdlg.DoModal();
-
for(UINT i = 0 ; i < n ; i++){
// Channel mode
@@ -1504,7 +1482,6 @@
if(wsdlg.m_bChannelMode){
for(UINT i = 0 ; i < n ; i++) m_SndFile.ChnSettings[i].dwFlags = flags[i];
}
-// -! NEW_FEATURE#0024
m_SndFile.SetCurrentPos(pos);
m_SndFile.GetLength(TRUE);
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -268,6 +268,8 @@
CSize GetOldPatternScrollbarsPos() const { return m_szOldPatternScrollbarsPos; };
void SetOldPatternScrollbarsPos( CSize s ){ m_szOldPatternScrollbarsPos = s; };
+ void OnFileWaveConvert(ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder);
+
// protected members
protected:
CSize m_szOldPatternScrollbarsPos;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -1946,7 +1946,7 @@
m_bContinueSearch = TRUE;
EndWaitCursor();
// Display search results
- m_dwReplaceFlags &= ~PATSEARCH_REPLACEALL;
+ //m_dwReplaceFlags &= ~PATSEARCH_REPLACEALL;
if (!nFound)
{
if (m_dwFindFlags & PATSEARCH_NOTE)
Modified: trunk/OpenMPT/mptrack/mod2wave.h
===================================================================
--- trunk/OpenMPT/mptrack/mod2wave.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/mod2wave.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -14,7 +14,7 @@
ULONGLONG m_dwFileLimit;
DWORD m_dwSongLimit;
BOOL m_bSelectPlay, m_bNormalize, m_bHighQuality, m_bGivePlugsIdleTime;
- UINT m_nMinOrder, m_nMaxOrder;
+ ORDERINDEX m_nMinOrder, m_nMaxOrder;
CComboBox m_CbnSampleRate, m_CbnSampleFormat;
CEdit m_EditMinOrder, m_EditMaxOrder;
@@ -24,7 +24,7 @@
// -! NEW_FEATURE#0024
public:
- CWaveConvert(CWnd *parent);
+ CWaveConvert(CWnd *parent, ORDERINDEX nMinOrder = ORDERINDEX_INVALID, ORDERINDEX nMaxOrder = ORDERINDEX_INVALID);
public:
void UpdateDialog();
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -1116,6 +1116,7 @@
#define ID_OVERFLOWPASTE 59226
#define ID_NOTEMAP_COPY_NOTE 59227
#define ID_CLEANUP_REARRANGESAMPLES 59228
+#define ID_ORDERLIST_RENDER 59229
// Next default values for new objects
//
@@ -1123,7 +1124,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
-#define _APS_NEXT_COMMAND_VALUE 59229
+#define _APS_NEXT_COMMAND_VALUE 59230
#define _APS_NEXT_CONTROL_VALUE 2387
#define _APS_NEXT_SYMED_VALUE 901
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-13 13:44:34
|
Revision: 362
http://modplug.svn.sourceforge.net/modplug/?rev=362&view=rev
Author: saga-games
Date: 2009-09-13 13:44:24 +0000 (Sun, 13 Sep 2009)
Log Message:
-----------
[Fix] XM Compatibility: Portamento + New Note with no previous note (tentative fix), Offset beyond sample range
[Fix] IT Compatibility: Offset beyond sample range
[Ref] Replaced some NULLs and BOOL variables by nullptrs and bools
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_flt.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -849,7 +849,7 @@
else if ((nsmp) && (nsmp < MAX_SAMPLES)) { //Or set sample
MODSAMPLE *pSmp = &m_SndFile.Samples[nsmp];
pChn->pCurrentSample = pSmp->pSample;
- pChn->pModInstrument = NULL;
+ pChn->pModInstrument = nullptr;
pChn->pModSample = pSmp;
pChn->pSample = pSmp->pSample;
pChn->nFineTune = pSmp->nFineTune;
@@ -864,13 +864,13 @@
pChn->nFadeOutVol = 0x10000;
}
- m_SndFile.NoteChange(nChn, note, FALSE, TRUE, TRUE);
+ m_SndFile.NoteChange(nChn, note, false, true, true);
if (nVol >= 0) pChn->nVolume = nVol;
// handle sample looping.
// Fix: Bug report 1700.
//if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) {
- if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != 0))
+ if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != nullptr))
{
pChn->nPos = loopstart;
pChn->nPosLo = 0;
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -142,7 +142,7 @@
// Removing all instrument headers
for (UINT i1=0; i1<MAX_CHANNELS; i1++)
{
- m_SndFile.Chn[i1].pModInstrument = NULL;
+ m_SndFile.Chn[i1].pModInstrument = nullptr;
}
for (UINT i2=0; i2<m_SndFile.m_nInstruments; i2++) if (m_SndFile.Instruments[i2])
{
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -126,7 +126,7 @@
{
if (Chn[i].pModInstrument == pIns)
{
- Chn[i].pModInstrument = NULL;
+ Chn[i].pModInstrument = nullptr;
}
}
delete pIns;
@@ -450,7 +450,7 @@
if (pSmp->pSample)
{
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
pSmp->nLength = 0;
}
pSmp->nLength = pdata->length / samplesize;
@@ -1620,7 +1620,7 @@
if (pSmp->pSample)
{
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
pSmp->nLength = 0;
}
pSmp->nLength = dwSSNDLen / samplesize;
Modified: trunk/OpenMPT/soundlib/Snd_flt.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_flt.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Snd_flt.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -70,7 +70,7 @@
// Simple 2-poles resonant filter
-void CSoundFile::SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier) const
+void CSoundFile::SetupChannelFilter(MODCHANNEL *pChn, bool bReset, int flt_modifier) const
//----------------------------------------------------------------------------------------
{
float fs = (float)gdwMixingFreq;
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -538,7 +538,7 @@
// Invalid sample ?
if (!pSmp)
{
- pChn->pModSample = NULL;
+ pChn->pModSample = nullptr;
pChn->nInsVol = 0;
return;
}
@@ -612,7 +612,7 @@
}
-void CSoundFile::NoteChange(UINT nChn, int note, BOOL bPorta, BOOL bResetEnv, BOOL bManual)
+void CSoundFile::NoteChange(UINT nChn, int note, bool bPorta, bool bResetEnv, bool bManual)
//-----------------------------------------------------------------------------------------
{
if (note < 1) return;
@@ -677,6 +677,10 @@
// IT Compatibility: Update multisample instruments frequency even if instrument is not specified
if(!bPorta && pSmp && IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nC5Speed = pSmp->nC5Speed;
+ // XM Compatibility: Ignore notes with portamento if there was no note
+ if(bPorta && (pChn->nPeriod == 0) && IsCompatibleMode(TRK_FASTTRACKER2))
+ return;
+
if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose;
note = CLAMP(note, 1, 132);
pChn->nNote = note;
@@ -723,7 +727,7 @@
if (pChn->nPos >= pChn->nLength) pChn->nPos = pChn->nLoopStart;
}
else
- bPorta = FALSE;
+ bPorta = false;
if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
|| ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
@@ -804,12 +808,12 @@
pChn->nAutoVibPos = 0;
}
pChn->nLeftVol = pChn->nRightVol = 0;
- BOOL bFlt = (m_dwSongFlags & SONG_MPTFILTERMODE) ? FALSE : TRUE;
+ bool bFlt = (m_dwSongFlags & SONG_MPTFILTERMODE) ? false : true;
// Setup Initial Filter for this note
if (pIns)
{
- if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = TRUE; }
- if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = TRUE; }
+ if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = true; }
+ if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = true; }
if (bFlt && (pIns->nFilterMode != FLTMODE_UNCHANGED)) {
pChn->nFilterMode = pIns->nFilterMode;
}
@@ -819,7 +823,7 @@
pChn->nCutSwing = pChn->nResSwing = 0;
}
#ifndef NO_FILTER
- if ((pChn->nCutOff < 0x7F) && (bFlt)) SetupChannelFilter(pChn, TRUE);
+ if ((pChn->nCutOff < 0x7F) && (bFlt)) SetupChannelFilter(pChn, true);
#endif // NO_FILTER
}
// Special case for MPT
@@ -913,7 +917,7 @@
note = pHeader->NoteMap[note-1];
if ((n) && (n < MAX_SAMPLES)) pSample = Samples[n].pSample;
}
- } else pSample = NULL;
+ } else pSample = nullptr;
}
MODCHANNEL *p = pChn;
//if (!pIns) return;
@@ -1337,7 +1341,7 @@
InstrumentChange(pChn, pChn->nNewIns, bPorta, FALSE, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? FALSE : TRUE);
pChn->nNewIns = 0;
}
- NoteChange(nChn, note, bPorta, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? FALSE : TRUE);
+ NoteChange(nChn, note, bPorta, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? false : true);
if ((bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) && (instr))
{
pChn->dwFlags |= CHN_FASTVOLRAMP;
@@ -2780,7 +2784,7 @@
if (oldcutoff < 0) oldcutoff = -oldcutoff;
if ((pChn->nVolume > 0) || (oldcutoff < 0x10)
|| (!(pChn->dwFlags & CHN_FILTER)) || (!(pChn->nLeftVol|pChn->nRightVol)))
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
break;
@@ -2794,7 +2798,7 @@
}
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
break;
@@ -2804,7 +2808,7 @@
{
pChn->nFilterMode = (dwParam>>4);
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
break;
@@ -2916,7 +2920,7 @@
if (oldcutoff < 0) oldcutoff = -oldcutoff;
if ((pChn->nVolume > 0) || (oldcutoff < 0x10)
|| (!(pChn->dwFlags & CHN_FILTER)) || (!(pChn->nLeftVol|pChn->nRightVol)))
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
} break;
@@ -2935,7 +2939,7 @@
pChn->nResonance = (BYTE) (pChn->m_nPlugInitialParamValue + (m_nTickCount+1)*pChn->m_nPlugParamValueStep + 0.5);
pChn->nRestoreResonanceOnNewNote = 0;
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
@@ -2947,7 +2951,7 @@
{
pChn->nFilterMode = (dwParam>>4);
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
break;
@@ -3044,13 +3048,22 @@
pChn->nPos += param;
if (pChn->nPos >= pChn->nLength)
{
+ // Offset beyond sample size
if (!(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)))
{
- pChn->nPos = pChn->nLoopStart;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ pChn->nPos = 0; // IT Compatibility: Reset to beginning of sample
+ else
+ pChn->nPos = pChn->nLoopStart;
if ((m_dwSongFlags & SONG_ITOLDEFFECTS) && (pChn->nLength > 4))
{
pChn->nPos = pChn->nLength - 2;
}
+ } else if(IsCompatibleMode(TRK_FASTTRACKER2))
+ {
+ // XM Compatibility: Don't play note
+ pChn->dwFlags |= CHN_FASTVOLRAMP;
+ pChn->nVolume = pChn->nPeriod = 0;
}
}
} else
@@ -3139,7 +3152,7 @@
if ((pChn->nRowInstr) && (param < 0x100)) { InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE); bResetEnv = TRUE; }
if (param < 0x100) bResetEnv = TRUE;
}
- NoteChange(nChn, nNote, FALSE, bResetEnv);
+ NoteChange(nChn, nNote, false, bResetEnv);
if (m_nInstruments) {
ProcessMidiOut(nChn, pChn); //Send retrig to Midi
}
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -806,7 +806,7 @@
if (pSmp->pSample)
{
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
}
}
for (i=0; i<MAX_INSTRUMENTS; i++)
@@ -1449,8 +1449,8 @@
if(resetMask & 2)
{
Chn[i].nNote = Chn[i].nNewNote = Chn[i].nNewIns = 0;
- Chn[i].pModSample = NULL;
- Chn[i].pModInstrument = NULL;
+ Chn[i].pModSample = nullptr;
+ Chn[i].pModInstrument = nullptr;
Chn[i].nPortamentoDest = 0;
Chn[i].nCommand = 0;
Chn[i].nPatternLoopCount = 0;
@@ -1473,9 +1473,9 @@
Chn[i].nLoopStart = 0;
Chn[i].nLoopEnd = 0;
Chn[i].nROfs = Chn[i].nLOfs = 0;
- Chn[i].pSample = NULL;
- Chn[i].pModSample = NULL;
- Chn[i].pModInstrument = NULL;
+ Chn[i].pSample = nullptr;
+ Chn[i].pModSample = nullptr;
+ Chn[i].pModInstrument = nullptr;
Chn[i].nCutOff = 0x7F;
Chn[i].nResonance = 0;
Chn[i].nFilterMode = 0;
@@ -2001,7 +2001,7 @@
{
pSmp->nLength = 0;
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
MessageBox(0, str_SampleAllocationError, str_Error, MB_ICONERROR);
return 0;
}
@@ -2438,7 +2438,7 @@
{
pSmp->nLength = 0;
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
}
return 0;
}
@@ -2766,7 +2766,7 @@
if (!Samples[nSample].pSample) return TRUE;
MODSAMPLE *pSmp = &Samples[nSample];
LPSTR pSample = pSmp->pSample;
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
pSmp->nLength = 0;
pSmp->uFlags &= ~(CHN_16BIT);
for (UINT i=0; i<MAX_CHANNELS; i++)
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-13 13:44:24 UTC (rev 362)
@@ -796,7 +796,7 @@
BOOL ProcessEffects();
UINT GetNNAChannel(UINT nChn) const;
void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut);
- void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE, BOOL bManual=FALSE);
+ void NoteChange(UINT nChn, int note, bool bPorta = false, bool bResetEnv = true, bool bManual = false);
void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE);
// Channel Effects
@@ -834,7 +834,7 @@
void ExtendedChannelEffect(MODCHANNEL *, UINT param);
void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0);
void ProcessSmoothMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); //rewbs.smoothVST
- void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const;
+ void SetupChannelFilter(MODCHANNEL *pChn, bool bReset, int flt_modifier = 256) const;
// Low-Level effect processing
void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide);
void GlobalVolSlide(UINT param, UINT * nOldGlobalVolSlide);
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -698,9 +698,9 @@
Chn[i].dwFlags = ChnSettings[i].dwFlags;
Chn[i].nLoopStart = 0;
Chn[i].nLoopEnd = 0;
- Chn[i].pModInstrument = NULL;
- Chn[i].pSample = NULL;
- Chn[i].pModSample = NULL;
+ Chn[i].pModInstrument = nullptr;
+ Chn[i].pSample = nullptr;
+ Chn[i].pModSample = nullptr;
}
}
}
@@ -1302,7 +1302,7 @@
if (pIns->dwFlags & ENV_FILTER)
{
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE, envpitch);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true, envpitch);
#endif // NO_FILTER
} else
// Pitch Envelope
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-11 19:33:12
|
Revision: 361
http://modplug.svn.sourceforge.net/modplug/?rev=361&view=rev
Author: saga-games
Date: 2009-09-11 19:32:52 +0000 (Fri, 11 Sep 2009)
Log Message:
-----------
[Fix] MPTM Saving: Save Note Fade (~~) properly
[Fix] Mod Conversion: Unset release nodes were corrupted when converting modules
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-10 21:00:57 UTC (rev 360)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-11 19:32:52 UTC (rev 361)
@@ -778,7 +778,7 @@
TRIMENV(mptEnv->nLoopEnd);
TRIMENV(mptEnv->nSustainStart);
TRIMENV(mptEnv->nSustainEnd);
- TRIMENV(mptEnv->nReleaseNode);
+ if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET) TRIMENV(mptEnv->nReleaseNode);
#undef TRIMENV
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-10 21:00:57 UTC (rev 360)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-11 19:32:52 UTC (rev 361)
@@ -2190,7 +2190,7 @@
UINT note = m->note;
if (note) b |= 1;
if ((note) && (note < NOTE_MIN_SPECIAL)) note--;
- if (note == NOTE_FADE) note = 0xF6;
+ if (note == NOTE_FADE && GetType() != MOD_TYPE_MPT) note = 0xF6;
if (m->instr) b |= 2;
if (m->volcmd)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|