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
(45) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <sag...@us...> - 2009-11-28 14:44:55
|
Revision: 426
http://modplug.svn.sourceforge.net/modplug/?rev=426&view=rev
Author: saga-games
Date: 2009-11-28 14:44:48 +0000 (Sat, 28 Nov 2009)
Log Message:
-----------
[Fix] Keymap files have a version number now (currently version 1). If keymap file doesn't have a version number (that's version 0), the orderlist keys will be added automatically so that orderlist remains usable in new builds.
[Fix] Orderlist: Show correct shortcuts in context menus
[Imp] Orderlist: 0...9, + and - keys are now also configurable.
[Imp] Orderlist: Duplicate / Create new pattern shortcuts do also work now here.
[Imp] When loading a keymap file and unrecognized lines are found, only one messagebox is shown.
[Mod] All keymaps have been updated to version 1.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-28 14:44:48 UTC (rev 426)
@@ -2415,6 +2415,66 @@
commands[kcDuplicatePattern].isHidden = false;
commands[kcDuplicatePattern].isDummy = false;
+ commands[kcOrderlistPat0].UID = 1807;
+ commands[kcOrderlistPat0].isHidden = false;
+ commands[kcOrderlistPat0].isDummy = false;
+ commands[kcOrderlistPat0].Message = "Pattern index digit 0";
+
+ commands[kcOrderlistPat1].UID = 1808;
+ commands[kcOrderlistPat1].isHidden = false;
+ commands[kcOrderlistPat1].isDummy = false;
+ commands[kcOrderlistPat1].Message = "Pattern index digit 1";
+
+ commands[kcOrderlistPat2].UID = 1809;
+ commands[kcOrderlistPat2].isHidden = false;
+ commands[kcOrderlistPat2].isDummy = false;
+ commands[kcOrderlistPat2].Message = "Pattern index digit 2";
+
+ commands[kcOrderlistPat3].UID = 1810;
+ commands[kcOrderlistPat3].isHidden = false;
+ commands[kcOrderlistPat3].isDummy = false;
+ commands[kcOrderlistPat3].Message = "Pattern index digit 3";
+
+ commands[kcOrderlistPat4].UID = 1811;
+ commands[kcOrderlistPat4].isHidden = false;
+ commands[kcOrderlistPat4].isDummy = false;
+ commands[kcOrderlistPat4].Message = "Pattern index digit 4";
+
+ commands[kcOrderlistPat5].UID = 1812;
+ commands[kcOrderlistPat5].isHidden = false;
+ commands[kcOrderlistPat5].isDummy = false;
+ commands[kcOrderlistPat5].Message = "Pattern index digit 5";
+
+ commands[kcOrderlistPat6].UID = 1813;
+ commands[kcOrderlistPat6].isHidden = false;
+ commands[kcOrderlistPat6].isDummy = false;
+ commands[kcOrderlistPat6].Message = "Pattern index digit 6";
+
+ commands[kcOrderlistPat7].UID = 1814;
+ commands[kcOrderlistPat7].isHidden = false;
+ commands[kcOrderlistPat7].isDummy = false;
+ commands[kcOrderlistPat7].Message = "Pattern index digit 7";
+
+ commands[kcOrderlistPat8].UID = 1815;
+ commands[kcOrderlistPat8].isHidden = false;
+ commands[kcOrderlistPat8].isDummy = false;
+ commands[kcOrderlistPat8].Message = "Pattern index digit 8";
+
+ commands[kcOrderlistPat9].UID = 1816;
+ commands[kcOrderlistPat9].isHidden = false;
+ commands[kcOrderlistPat9].isDummy = false;
+ commands[kcOrderlistPat9].Message = "Pattern index digit 9";
+
+ commands[kcOrderlistPatPlus].UID = 1817;
+ commands[kcOrderlistPatPlus].isHidden = false;
+ commands[kcOrderlistPatPlus].isDummy = false;
+ commands[kcOrderlistPatPlus].Message = "Increase pattern index ";
+
+ commands[kcOrderlistPatMinus].UID = 1818;
+ commands[kcOrderlistPatMinus].isHidden = false;
+ commands[kcOrderlistPatMinus].isDummy = false;
+ commands[kcOrderlistPatMinus].Message = "Decrease pattern index";
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
@@ -2574,7 +2634,7 @@
}
}
// Same applies for orderlist navigation
- else if (inCmd>=kcStartOrderlistCommands&& inCmd<=kcEndOrderlistNavigationSelect)
+ else if (inCmd>=kcStartOrderlistNavigation && inCmd<=kcEndOrderlistNavigation)
{//Check that it is a nav cmd
CommandID cmdNavSelection = (CommandID)(kcStartOrderlistNavigationSelect+ (inCmd-kcStartOrderlistNavigation));
for (int kSel=0; kSel<commands[kcSelect].kcList.GetSize(); kSel++)
@@ -3232,6 +3292,7 @@
fprintf(outStream, "//-Format is: -\n");
fprintf(outStream, "//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -\n");
fprintf(outStream, "//----------------------------------------------------------------------\n");
+ fprintf(outStream, "version:%d\n", KEYMAP_VERSION);
for (int ctx=0; ctx<kCtxMaxInputContexts; ctx++)
{
@@ -3272,9 +3333,13 @@
int commentStart;
CCommandSet *pTempCS;
int l=0;
+ int fileVersion = 0;
pTempCS = new CCommandSet();
+
int errorCount=0;
+ CString errText = "";
+
while(iStrm.getline(s, sizeof(s)))
{
//::MessageBox(NULL, s, "", MB_ICONEXCLAMATION|MB_OK);
@@ -3289,6 +3354,8 @@
if (!curLine.IsEmpty() && curLine.Compare("\n") !=0)
{
+ bool ignoreLine = false;
+
//ctx:UID:Description:Modifier:Key:EventMask
int spos = 0;
@@ -3296,6 +3363,21 @@
token=curLine.Tokenize(":",spos);
kc.ctx = (InputTargetContext) atoi(token);
+ // this line indicates the version of this keymap file instead. (e.g. "version:1")
+ if((token.Trim().CompareNoCase("version") == 0) && (spos != -1))
+ {
+ fileVersion = atoi(curLine.Mid(spos));
+ if(fileVersion > KEYMAP_VERSION)
+ {
+ CString err;
+ err.Format("Key binding file %s has version %d. Your version of OpenMPT only supports loading files up to version %d.", szFilename, fileVersion, KEYMAP_VERSION);
+ errText += err + "\n";
+ Log(err);
+ }
+ spos = -1;
+ ignoreLine = true;
+ }
+
//UID
if (spos != -1)
{
@@ -3324,31 +3406,37 @@
kc.event = (KeyEventType) atoi(token);
}
- //Error checking (TODO):
- if (cmd<0 || cmd>=kcNumCommands || spos==-1)
+ if(!ignoreLine)
{
- errorCount++;
- CString err;
- if (errorCount<10) {
- err.Format("Line %d in key binding file %s was not understood.", l, szFilename);
- if(s_bShowErrorOnUnknownKeybinding) ::MessageBox(NULL, err, "", MB_ICONEXCLAMATION|MB_OK);
- Log(err);
- } else if (errorCount==10) {
- err.Format("Too many errors detected, not reporting any more.");
- if(s_bShowErrorOnUnknownKeybinding) ::MessageBox(NULL, err, "", MB_ICONEXCLAMATION|MB_OK);
- Log(err);
+ //Error checking (TODO):
+ if (cmd<0 || cmd>=kcNumCommands || spos==-1)
+ {
+ errorCount++;
+ CString err;
+ if (errorCount<10) {
+ err.Format("Line %d in key binding file %s was not understood.", l, szFilename);
+ errText += err + "\n";
+ Log(err);
+ } else if (errorCount==10) {
+ err = "Too many errors detected, not reporting any more.";
+ errText += err + "\n";
+ Log(err);
+ }
}
+ else
+ {
+ pTempCS->Add(kc, cmd, true);
+ }
}
- else
- {
- pTempCS->Add(kc, cmd, true);
- }
}
l++;
}
+ if(s_bShowErrorOnUnknownKeybinding && !errText.IsEmpty()) ::MessageBox(NULL, errText, "", MB_ICONEXCLAMATION|MB_OK);
+ if(fileVersion < KEYMAP_VERSION) UpgradeKeymap(pTempCS, fileVersion);
+
Copy(pTempCS);
delete pTempCS;
@@ -3370,6 +3458,111 @@
}
+// Fix outdated keymap files
+void CCommandSet::UpgradeKeymap(CCommandSet *pCommands, int oldVersion)
+//---------------------------------------------------------------------
+{
+ KeyCombination kc;
+
+ // no orderlist context
+ if(oldVersion == 0)
+ {
+ kc.ctx = kCtxCtrlOrderlist;
+ kc.event = (KeyEventType) (kKeyEventDown | kKeyEventRepeat);
+ kc.mod = 0;
+
+ kc.code = VK_DELETE;
+ pCommands->Add(kc, kcOrderlistEditDelete, false);
+
+ kc.code = VK_INSERT;
+ pCommands->Add(kc, kcOrderlistEditInsert, false);
+
+ kc.code = VK_RETURN;
+ pCommands->Add(kc, kcOrderlistEditPattern, false);
+
+ kc.code = VK_TAB;
+ pCommands->Add(kc, kcOrderlistSwitchToPatternView, false);
+
+ kc.code = VK_LEFT;
+ pCommands->Add(kc, kcOrderlistNavigateLeft, false);
+ kc.code = VK_UP;
+ pCommands->Add(kc, kcOrderlistNavigateLeft, false);
+
+ kc.code = VK_RIGHT;
+ pCommands->Add(kc, kcOrderlistNavigateRight, false);
+ kc.code = VK_DOWN;
+ pCommands->Add(kc, kcOrderlistNavigateRight, false);
+
+ kc.code = VK_HOME;
+ pCommands->Add(kc, kcOrderlistNavigateFirst, false);
+
+ kc.code = VK_END;
+ pCommands->Add(kc, kcOrderlistNavigateLast, false);
+
+ kc.code = VK_ADD;
+ pCommands->Add(kc, kcOrderlistPatPlus, false);
+ kc.code = VK_OEM_PLUS;
+ pCommands->Add(kc, kcOrderlistPatPlus, false);
+
+ kc.code = VK_SUBTRACT;
+ pCommands->Add(kc, kcOrderlistPatMinus, false);
+ kc.code = VK_OEM_MINUS;
+ pCommands->Add(kc, kcOrderlistPatMinus, false);
+
+ kc.code = '0';
+ pCommands->Add(kc, kcOrderlistPat0, false);
+ kc.code = VK_NUMPAD0;
+ pCommands->Add(kc, kcOrderlistPat0, false);
+
+ kc.code = '1';
+ pCommands->Add(kc, kcOrderlistPat1, false);
+ kc.code = VK_NUMPAD1;
+ pCommands->Add(kc, kcOrderlistPat1, false);
+
+ kc.code = '2';
+ pCommands->Add(kc, kcOrderlistPat2, false);
+ kc.code = VK_NUMPAD2;
+ pCommands->Add(kc, kcOrderlistPat2, false);
+
+ kc.code = '3';
+ pCommands->Add(kc, kcOrderlistPat3, false);
+ kc.code = VK_NUMPAD3;
+ pCommands->Add(kc, kcOrderlistPat3, false);
+
+ kc.code = '4';
+ pCommands->Add(kc, kcOrderlistPat4, false);
+ kc.code = VK_NUMPAD4;
+ pCommands->Add(kc, kcOrderlistPat4, false);
+
+ kc.code = '5';
+ pCommands->Add(kc, kcOrderlistPat5, false);
+ kc.code = VK_NUMPAD5;
+ pCommands->Add(kc, kcOrderlistPat5, false);
+
+ kc.code = '6';
+ pCommands->Add(kc, kcOrderlistPat6, false);
+ kc.code = VK_NUMPAD6;
+ pCommands->Add(kc, kcOrderlistPat6, false);
+
+ kc.code = '7';
+ pCommands->Add(kc, kcOrderlistPat7, false);
+ kc.code = VK_NUMPAD7;
+ pCommands->Add(kc, kcOrderlistPat7, false);
+
+ kc.code = '8';
+ pCommands->Add(kc, kcOrderlistPat8, false);
+ kc.code = VK_NUMPAD8;
+ pCommands->Add(kc, kcOrderlistPat8, false);
+
+ kc.code = '9';
+ pCommands->Add(kc, kcOrderlistPat9, false);
+ kc.code = VK_NUMPAD9;
+ pCommands->Add(kc, kcOrderlistPat9, false);
+
+ }
+}
+
+
//Could do better search algo but this is not perf critical.
int CCommandSet::FindCmd(int uid)
{
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2009-11-28 14:44:48 UTC (rev 426)
@@ -6,6 +6,8 @@
//#define VK_ALT 0x12
+#define KEYMAP_VERSION 1 // Version of the .mkb format
+
enum InputTargetContext
{
kCtxUnknownContext = -1,
@@ -964,7 +966,15 @@
kcEndVSTGUICommands=kcVSTGUIRandParams,
kcStartOrderlistCommands,
- kcStartOrderlistNavigation=kcStartOrderlistCommands,
+ // Orderlist edit
+ kcStartOrderlistEdit=kcStartOrderlistCommands,
+ kcOrderlistEditDelete=kcStartOrderlistEdit,
+ kcOrderlistEditInsert,
+ kcOrderlistEditPattern,
+ kcOrderlistSwitchToPatternView,
+ kcEndOrderlistEdit=kcOrderlistSwitchToPatternView,
+ // Orderlist navigation
+ kcStartOrderlistNavigation,
kcOrderlistNavigateLeft=kcStartOrderlistNavigation,
kcOrderlistNavigateRight,
kcOrderlistNavigateFirst,
@@ -977,13 +987,23 @@
kcOrderlistNavigateFirstSelect,
kcOrderlistNavigateLastSelect,
kcEndOrderlistNavigationSelect = kcOrderlistNavigateLastSelect,
+ // Orderlist pattern list edit
+ kcStartOrderlistNum,
+ kcOrderlistPat0=kcStartOrderlistNum,
+ kcOrderlistPat1,
+ kcOrderlistPat2,
+ kcOrderlistPat3,
+ kcOrderlistPat4,
+ kcOrderlistPat5,
+ kcOrderlistPat6,
+ kcOrderlistPat7,
+ kcOrderlistPat8,
+ kcOrderlistPat9,
+ kcOrderlistPatPlus,
+ kcOrderlistPatMinus,
+ kcEndOrderlistNum=kcOrderlistPatMinus,
+ kcEndOrderlistCommands=kcEndOrderlistNum,
- kcOrderlistEditDelete,
- kcOrderlistEditInsert,
- kcOrderlistEditPattern,
- kcOrderlistSwitchToPatternView,
- kcEndOrderlistCommands=kcOrderlistSwitchToPatternView,
-
kcNumCommands,
};
@@ -1125,6 +1145,7 @@
bool SaveFile(CString FileName, bool debug);
bool LoadFile(CString FileName);
bool LoadFile(std::istream& iStrm, LPCTSTR szFilename);
+ void UpgradeKeymap(CCommandSet *pCommands, int oldVersion);
static DWORD GetKeymapLabel(InputTargetContext ctx, UINT mod, UINT code, KeyEventType ke);
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-28 14:44:48 UTC (rev 426)
@@ -51,7 +51,6 @@
else if(!isSelectionKeyPressed && m_nScrollPos2nd != ORDERINDEX_INVALID) m_nScrollPos2nd = ORDERINDEX_INVALID;
};
bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false, bool bIgnoreCurSel = false);
- BOOL ProcessChar(UINT nChar);
BOOL UpdateScrollInfo();
void UpdateInfoText();
int GetFontWidth();
@@ -95,6 +94,9 @@
void OnEditCut();
void OnEditPaste();
+ // Helper function for entering pattern number
+ void EnterPatternNum(int enterNum);
+
//{{AFX_VIRTUAL(COrderList)
virtual BOOL PreTranslateMessage(MSG *pMsg);
virtual void UpdateView(DWORD dwHintMask=0, CObject *pObj=NULL);
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-28 14:44:48 UTC (rev 426)
@@ -318,55 +318,6 @@
}
-BOOL COrderList::ProcessChar(UINT nChar)
-//--------------------------------------
-{
- if (m_pModDoc)
- {
- CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- int ord = pSndFile->Order[m_nScrollPos];
- int maxpat = 0;
- for (int i=0; i<pSndFile->Patterns.Size(); i++) if (pSndFile->Patterns[i]) maxpat = i;
- if ((nChar >= '0') && (nChar <= '9'))
- {
- if (ord >= pSndFile->Patterns.Size()) ord = 0;
-
- ord = ord * 10 + (nChar - '0');
- if ((ord >= 100) && (ord > maxpat)) ord %= 100;
- if ((ord >= 10) && (ord > maxpat)) ord %= 10;
- } else
- if (nChar == '+')
- {
- ord++;
- if(ord > pSndFile->Order.GetInvalidPatIndex())
- ord = 0;
- else
- {
- const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex();
- if(ord > maxpat && ord < nFirstInvalid)
- ord = nFirstInvalid;
- }
- } else
- if (nChar == '-')
- {
- const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex();
- ord--;
- if (ord < 0) ord = pSndFile->Order.GetInvalidPatIndex(); else
- if ((ord > maxpat) && (ord < nFirstInvalid)) ord = maxpat;
- }
- if (ord != pSndFile->Order[m_nScrollPos])
- {
- pSndFile->Order[m_nScrollPos] = static_cast<PATTERNINDEX>(ord);
- m_pModDoc->SetModified();
- m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
- InvalidateSelection();
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
BOOL COrderList::PreTranslateMessage(MSG *pMsg)
//---------------------------------------------
{
@@ -397,13 +348,6 @@
}
//end rewbs.customKeys
-
- switch(pMsg->message)
- {
- case WM_CHAR:
- if (ProcessChar(pMsg->wParam)) return true;
- break;
- }
return CWnd::PreTranslateMessage(pMsg);
}
@@ -423,6 +367,7 @@
case kcEditPaste:
OnEditPaste(); return wParam;
+ // Orderlist navigation
case kcOrderlistNavigateLeftSelect:
case kcOrderlistNavigateLeft:
SetCurSelTo2ndSel(wParam == kcOrderlistNavigateLeftSelect); SetCurSel(m_nScrollPos - 1); return wParam;
@@ -442,6 +387,8 @@
SetCurSel(nLast);
}
return wParam;
+
+ // Orderlist edit
case kcOrderlistEditDelete:
OnDeleteOrder(); return wParam;
case kcOrderlistEditInsert:
@@ -451,6 +398,23 @@
case kcOrderlistEditPattern:
OnLButtonDblClk(0, CPoint(0,0)); OnSwitchToView(); return wParam;
+ // Enter pattern number
+ case kcOrderlistPat0:
+ case kcOrderlistPat1:
+ case kcOrderlistPat2:
+ case kcOrderlistPat3:
+ case kcOrderlistPat4:
+ case kcOrderlistPat5:
+ case kcOrderlistPat6:
+ case kcOrderlistPat7:
+ case kcOrderlistPat8:
+ case kcOrderlistPat9:
+ EnterPatternNum(wParam - kcOrderlistPat0); return wParam;
+ case kcOrderlistPatMinus:
+ EnterPatternNum(10); return wParam;
+ case kcOrderlistPatPlus:
+ EnterPatternNum(11); return wParam;
+
// kCtxViewPatternsNote messages
case kcSwitchToOrderList:
OnSwitchToView();
@@ -462,12 +426,74 @@
case kcChannelUnmuteAll:
case kcUnmuteAllChnOnPatTransition:
::PostMessage(m_pParent->GetViewWnd(), WM_MOD_KEYCOMMAND, wParam, 0); return wParam;
+
+ case kcDuplicatePattern:
+ OnDuplicatePattern(); return wParam;
+ case kcNewPattern:
+ OnCreateNewPattern(); return wParam;
}
return 0;
}
+// Helper function to enter pattern index into the orderlist.
+// Call with param 0...9 (enter digit), 10 (decrease) or 11 (increase).
+void COrderList::EnterPatternNum(int enterNum)
+//--------------------------------------------
+{
+ if (m_pModDoc == nullptr) return;
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return;
+
+ PATTERNINDEX nCurNdx = (m_nScrollPos < pSndFile->Order.GetLength()) ? pSndFile->Order[m_nScrollPos] : pSndFile->Order.GetInvalidPatIndex();
+ PATTERNINDEX nMaxNdx = 0;
+ for(PATTERNINDEX nPat = 0; nPat < pSndFile->Patterns.Size(); nPat++)
+ if (pSndFile->Patterns.IsValidPat(nPat)) nMaxNdx = nPat;
+
+ if (enterNum >= 0 && enterNum <= 9) // enter 0...9
+ {
+ if (nCurNdx >= pSndFile->Patterns.Size()) nCurNdx = 0;
+
+ nCurNdx = nCurNdx * 10 + static_cast<PATTERNINDEX>(enterNum);
+ if ((nCurNdx >= 1000) && (nCurNdx > nMaxNdx)) nCurNdx %= 1000;
+ if ((nCurNdx >= 100) && (nCurNdx > nMaxNdx)) nCurNdx %= 100;
+ if ((nCurNdx >= 10) && (nCurNdx > nMaxNdx)) nCurNdx %= 10;
+ } else if (enterNum == 11) // increase pattern index
+ {
+ if(nCurNdx >= pSndFile->Order.GetInvalidPatIndex())
+ {
+ nCurNdx = 0;
+ }
+ else
+ {
+ nCurNdx++;
+ const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex();
+ if(nCurNdx > nMaxNdx && nCurNdx < nFirstInvalid)
+ nCurNdx = nFirstInvalid;
+ }
+ } else if (enterNum == 10) // decrease pattern index
+ {
+ const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex();
+ if (nCurNdx == 0)
+ nCurNdx = pSndFile->Order.GetInvalidPatIndex();
+ else
+ {
+ nCurNdx--;
+ if ((nCurNdx > nMaxNdx) && (nCurNdx < nFirstInvalid)) nCurNdx = nMaxNdx;
+ }
+ }
+ // apply
+ if (nCurNdx != pSndFile->Order[m_nScrollPos])
+ {
+ pSndFile->Order[m_nScrollPos] = nCurNdx;
+ m_pModDoc->SetModified();
+ m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
+ InvalidateSelection();
+ }
+}
+
+
static const char szClipboardOrdersHdr[] = "OpenMPT %3s\x0D\x0A";
static const char szClipboardOrdCountFieldHdr[] = "OrdNum: %u\x0D\x0A";
static const char szClipboardOrdersFieldHdr[] = "OrdLst: ";
@@ -977,23 +1003,23 @@
if(bMultiSelection)
{
// several patterns are selected.
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Patterns\tIns");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Patterns\tDel");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Patterns\t" + ih->GetKeyTextFromCommand(kcOrderlistEditInsert));
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Patterns\t" + ih->GetKeyTextFromCommand(kcOrderlistEditDelete));
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_COPY, "&Copy Orders\t" + ih->GetKeyTextFromCommand(kcEditCopy));
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_CUT, "&C&ut Orders\t" + ih->GetKeyTextFromCommand(kcEditCut));
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_PASTE, "&Paste Orders\t" + ih->GetKeyTextFromCommand(kcEditPaste));
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Patterns");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Patterns\t" + ih->GetKeyTextFromCommand(kcDuplicatePattern));
}
else
{
// only one pattern is selected
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\t" + ih->GetKeyTextFromCommand(kcOrderlistEditInsert));
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\t" + ih->GetKeyTextFromCommand(kcOrderlistEditDelete));
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern");
- AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern\t" + ih->GetKeyTextFromCommand(kcNewPattern));
+ AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern\t" + ih->GetKeyTextFromCommand(kcDuplicatePattern));
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNCOPY, "&Copy Pattern");
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNPASTE, "P&aste Pattern");
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_PASTE, "&Paste Orders\t" + ih->GetKeyTextFromCommand(kcEditPaste));
Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2009-11-28 14:44:48 UTC (rev 426)
@@ -212,6 +212,8 @@
for (int c=kcStartOrderlistCommands; c<=kcEndOrderlistCommands; c++)
newCat->commands.Add(c);
+ newCat->separators.Add(kcEndOrderlistNavigation); //--------------------------------------
+ newCat->separators.Add(kcEndOrderlistEdit); //--------------------------------------
commandCategories.Add(*newCat);
delete newCat;
Modified: trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb
===================================================================
--- trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -278,13 +279,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -179,6 +180,7 @@
4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown)
4:1209:0:103:1 //Set instrument digit 7: 7 (ZEHNERTASTATUR) (KeyDown)
4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown)
+4:1210:0:104:1 //Set instrument digit 8: 8 (ZEHNERTASTATUR) (KeyDown)
4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown)
4:1211:0:105:1 //Set instrument digit 9: 9 (ZEHNERTASTATUR) (KeyDown)
4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown)
@@ -293,13 +295,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: ENTF (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: EINFG (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: EINGABE (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TABULATOR (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: NACH-LINKS (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: NACH-OBEN (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: NACH-RECHTS (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: NACH-UNTEN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: POS1 (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: ENDE (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: ENTF (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: EINFG (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: EINGABE (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TABULATOR (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: 0 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: 1 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: 2 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: 3 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: 4 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: 5 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: 6 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: 7 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: 8 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: 9 (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : + (ZEHNERTASTATUR) (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: - (ZEHNERTASTATUR) (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -277,13 +278,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -263,13 +264,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -187,13 +188,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -282,13 +283,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -255,13 +256,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -270,13 +271,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb 2009-11-27 21:17:33 UTC (rev 425)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb 2009-11-28 14:44:48 UTC (rev 426)
@@ -2,6 +2,7 @@
//-Format is: -
//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
//----------------------------------------------------------------------
+version:1
//----( Global Context (0) )------------
0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
@@ -258,13 +259,37 @@
//----( Comments Context [top] (18) )------------
//----( Orderlist (19) )------------
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
-19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
-19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
-19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
-19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
+19:1807:0:48:5 //Pattern index digit 0: 0 (KeyDown|KeyHold)
+19:1807:0:96:5 //Pattern index digit 0: NUM 0 (KeyDown|KeyHold)
+19:1808:0:49:5 //Pattern index digit 1: 1 (KeyDown|KeyHold)
+19:1808:0:97:5 //Pattern index digit 1: NUM 1 (KeyDown|KeyHold)
+19:1809:0:50:5 //Pattern index digit 2: 2 (KeyDown|KeyHold)
+19:1809:0:98:5 //Pattern index digit 2: NUM 2 (KeyDown|KeyHold)
+19:1810:0:51:5 //Pattern index digit 3: 3 (KeyDown|KeyHold)
+19:1810:0:99:5 //Pattern index digit 3: NUM 3 (KeyDown|KeyHold)
+19:1811:0:52:5 //Pattern index digit 4: 4 (KeyDown|KeyHold)
+19:1811:0:100:5 //Pattern index digit 4: NUM 4 (KeyDown|KeyHold)
+19:1812:0:53:5 //Pattern index digit 5: 5 (KeyDown|KeyHold)
+19:1812:0:101:5 //Pattern index digit 5: NUM 5 (KeyDown|KeyHold)
+19:1813:0:54:5 //Pattern index digit 6: 6 (KeyDown|KeyHold)
+19:1813:0:102:5 //Pattern index digit 6: NUM 6 (KeyDown|KeyHold)
+19:1814:0:55:5 //Pattern index digit 7: 7 (KeyDown|KeyHold)
+19:1814:0:103:5 //Pattern index digit 7: NUM 7 (KeyDown|KeyHold)
+19:1815:0:56:5 //Pattern index digit 8: 8 (KeyDown|KeyHold)
+19:1815:0:104:5 //Pattern index digit 8: NUM 8 (KeyDown|KeyHold)
+19:1816:0:57:5 //Pattern index digit 9: 9 (KeyDown|KeyHold)
+19:1816:0:105:5 //Pattern index digit 9: NUM 9 (KeyDown|KeyHold)
+19:1817:0:107:5 //Increase pattern index : NUM PLUS (KeyDown|KeyHold)
+19:1817:0:187:5 //Increase pattern index : + (KeyDown|KeyHold)
+19:1818:0:109:1 //Decrease pattern index: NUM SUB (KeyDown)
+19:1818:0:189:1 //Decrease pattern index: - (KeyDown)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-27 21:17:42
|
Revision: 425
http://modplug.svn.sourceforge.net/modplug/?rev=425&view=rev
Author: saga-games
Date: 2009-11-27 21:17:33 +0000 (Fri, 27 Nov 2009)
Log Message:
-----------
[New] New keyboard shortcut in pattern context: Duplicate pattern
[Fix] Cleanup dialog: The preset checkboxes were slightly wrong.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CleanupSong.cpp
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/View_pat.cpp
Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-27 19:17:19 UTC (rev 424)
+++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-27 21:17:33 UTC (rev 425)
@@ -146,14 +146,14 @@
// patterns
CheckDlgButton(IDC_CHK_CLEANUP_PATTERNS, MF_CHECKED);
CheckDlgButton(IDC_CHK_REMOVE_PATTERNS, MF_UNCHECKED);
- CheckDlgButton(IDC_CHK_REARRANGE_PATTERNS, MF_UNCHECKED);
+ CheckDlgButton(IDC_CHK_REARRANGE_PATTERNS, MF_CHECKED);
// orders
CheckDlgButton(IDC_CHK_MERGE_SEQUENCES, MF_UNCHECKED);
CheckDlgButton(IDC_CHK_REMOVE_ORDERS, MF_UNCHECKED);
// samples
CheckDlgButton(IDC_CHK_CLEANUP_SAMPLES, MF_CHECKED);
CheckDlgButton(IDC_CHK_REMOVE_SAMPLES, MF_UNCHECKED);
- CheckDlgButton(IDC_CHK_REARRANGE_SAMPLES, MF_CHECKED);
+ CheckDlgButton(IDC_CHK_REARRANGE_SAMPLES, MF_UNCHECKED);
CheckDlgButton(IDC_CHK_OPTIMIZE_SAMPLES, MF_CHECKED);
// instruments
CheckDlgButton(IDC_CHK_CLEANUP_INSTRUMENTS, MF_CHECKED);
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-27 19:17:19 UTC (rev 424)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-27 21:17:33 UTC (rev 425)
@@ -2410,6 +2410,11 @@
commands[kcOrderlistSwitchToPatternView].isHidden = false;
commands[kcOrderlistSwitchToPatternView].isDummy = false;
+ commands[kcDuplicatePattern].UID = 1806;
+ commands[kcDuplicatePattern].Message = "Duplicate pattern";
+ commands[kcDuplicatePattern].isHidden = false;
+ commands[kcDuplicatePattern].isDummy = false;
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2009-11-27 19:17:19 UTC (rev 424)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2009-11-27 21:17:33 UTC (rev 425)
@@ -217,6 +217,7 @@
kcSetSpacing9,
kcSwitchToOrderList,
kcNewPattern,
+ kcDuplicatePattern,
kcTogglePluginEditor,
kcShowNoteProperties,
kcShowPatternProperties,
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-27 19:17:19 UTC (rev 424)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-27 21:17:33 UTC (rev 425)
@@ -520,6 +520,10 @@
OnPatternNew();
break;
+ case CTRLMSG_PAT_DUPPATTERN:
+ OnPatternDuplicate();
+ break;
+
case CTRLMSG_SETUPMACROS:
OnSetupZxxMacros();
break;
@@ -1262,7 +1266,7 @@
void CCtrlPatterns::TogglePluginEditor(bool split)
-//----------------------------------------
+//------------------------------------------------
{
if ((m_nInstrument) && (m_pModDoc))
{
@@ -1279,7 +1283,7 @@
}
void CCtrlPatterns::ToggleSplitPluginEditor()
-//----------------------------------------
+//-------------------------------------------
{
TogglePluginEditor(true);
}
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-11-27 19:17:19 UTC (rev 424)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-11-27 21:17:33 UTC (rev 425)
@@ -71,6 +71,7 @@
CTRLMSG_INS_NEWINSTRUMENT,
CTRLMSG_INS_SONGDROP,
CTRLMSG_INS_SAMPLEMAP,
+ CTRLMSG_PAT_DUPPATTERN,
};
enum {
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-27 19:17:19 UTC (rev 424)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-27 21:17:33 UTC (rev 425)
@@ -3634,6 +3634,7 @@
case kcToggleFollowSong: SendCtrlMessage(CTRLMSG_PAT_FOLLOWSONG); return wParam;
case kcChangeLoopStatus: SendCtrlMessage(CTRLMSG_PAT_LOOP, -1); return wParam;
case kcNewPattern: SendCtrlMessage(CTRLMSG_PAT_NEWPATTERN); return wParam;
+ case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam;
case kcSwitchToOrderList: OnSwitchToOrderList();
case kcSwitchOverflowPaste: CMainFrame::m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-27 19:18:03
|
Revision: 424
http://modplug.svn.sourceforge.net/modplug/?rev=424&view=rev
Author: saga-games
Date: 2009-11-27 19:17:19 +0000 (Fri, 27 Nov 2009)
Log Message:
-----------
[Imp] Orderlist: Using the keyboard manager for shortcuts. The selection code in the keyboard manager always was and still IS very dirty and all those hacks should be rewritten at some point.
[Fix] Treeview: Sequence context menu was slightly buggy.
[Mod] Default keymaps have been updated to contain the orderlist shortcuts.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb
trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-27 19:17:19 UTC (rev 424)
@@ -2350,6 +2350,66 @@
commands[kcEditPasteFlood].isHidden = false;
commands[kcEditPasteFlood].isDummy = false;
+ commands[kcOrderlistNavigateLeft].UID = 1794;
+ commands[kcOrderlistNavigateLeft].Message = "Previous Order";
+ commands[kcOrderlistNavigateLeft].isHidden = false;
+ commands[kcOrderlistNavigateLeft].isDummy = false;
+
+ commands[kcOrderlistNavigateRight].UID = 1795;
+ commands[kcOrderlistNavigateRight].Message = "Next Order";
+ commands[kcOrderlistNavigateRight].isHidden = false;
+ commands[kcOrderlistNavigateRight].isDummy = false;
+
+ commands[kcOrderlistNavigateFirst].UID = 1796;
+ commands[kcOrderlistNavigateFirst].Message = "First Order";
+ commands[kcOrderlistNavigateFirst].isHidden = false;
+ commands[kcOrderlistNavigateFirst].isDummy = false;
+
+ commands[kcOrderlistNavigateLast].UID = 1797;
+ commands[kcOrderlistNavigateLast].Message = "Last Order";
+ commands[kcOrderlistNavigateLast].isHidden = false;
+ commands[kcOrderlistNavigateLast].isDummy = false;
+
+ commands[kcOrderlistNavigateLeftSelect].UID = 1798;
+ commands[kcOrderlistNavigateLeftSelect].Message = "kcOrderlistNavigateLeftSelect";
+ commands[kcOrderlistNavigateLeftSelect].isHidden = true;
+ commands[kcOrderlistNavigateLeftSelect].isDummy = false;
+
+ commands[kcOrderlistNavigateRightSelect].UID = 1799;
+ commands[kcOrderlistNavigateRightSelect].Message = "kcOrderlistNavigateRightSelect";
+ commands[kcOrderlistNavigateRightSelect].isHidden = true;
+ commands[kcOrderlistNavigateRightSelect].isDummy = false;
+
+ commands[kcOrderlistNavigateFirstSelect].UID = 1800;
+ commands[kcOrderlistNavigateFirstSelect].Message = "kcOrderlistNavigateFirstSelect";
+ commands[kcOrderlistNavigateFirstSelect].isHidden = true;
+ commands[kcOrderlistNavigateFirstSelect].isDummy = false;
+
+ commands[kcOrderlistNavigateLastSelect].UID = 1801;
+ commands[kcOrderlistNavigateLastSelect].Message = "kcOrderlistNavigateLastSelect";
+ commands[kcOrderlistNavigateLastSelect].isHidden = true;
+ commands[kcOrderlistNavigateLastSelect].isDummy = false;
+
+ commands[kcOrderlistEditDelete].UID = 1802;
+ commands[kcOrderlistEditDelete].Message = "Delete Order";
+ commands[kcOrderlistEditDelete].isHidden = false;
+ commands[kcOrderlistEditDelete].isDummy = false;
+
+ commands[kcOrderlistEditInsert].UID = 1803;
+ commands[kcOrderlistEditInsert].Message = "Insert Order";
+ commands[kcOrderlistEditInsert].isHidden = false;
+ commands[kcOrderlistEditInsert].isDummy = false;
+
+ commands[kcOrderlistEditPattern].UID = 1804;
+ commands[kcOrderlistEditPattern].Message = "Edit Pattern";
+ commands[kcOrderlistEditPattern].isHidden = false;
+ commands[kcOrderlistEditPattern].isDummy = false;
+
+ commands[kcOrderlistSwitchToPatternView].UID = 1805;
+ commands[kcOrderlistSwitchToPatternView].Message = "Switch to pattern editor";
+ commands[kcOrderlistSwitchToPatternView].isHidden = false;
+ commands[kcOrderlistSwitchToPatternView].isDummy = false;
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
@@ -2508,7 +2568,28 @@
}
}
}
- // When we get a new slection key, we need to make sure that
+ // Same applies for orderlist navigation
+ else if (inCmd>=kcStartOrderlistCommands&& inCmd<=kcEndOrderlistNavigationSelect)
+ {//Check that it is a nav cmd
+ CommandID cmdNavSelection = (CommandID)(kcStartOrderlistNavigationSelect+ (inCmd-kcStartOrderlistNavigation));
+ for (int kSel=0; kSel<commands[kcSelect].kcList.GetSize(); kSel++)
+ {//for all selection modifiers
+ curKc=commands[kcSelect].kcList[kSel];
+ newKc=inKc;
+ newKc.mod|=curKc.mod; //Add selection modifier's modifiers to this command
+ if (adding)
+ {
+ Log("Enforcing rule krAllowNavigationWithSelection - adding key:%d with modifier:%d to command: %d\n", kSel, newKc.mod, cmdNavSelection);
+ Add(newKc, cmdNavSelection, false);
+ }
+ else
+ {
+ Log("Enforcing rule krAllowNavigationWithSelection - removing key:%d with modifier:%d to command: %d\n", kSel, newKc.mod, cmdNavSelection);
+ Remove(newKc, cmdNavSelection);
+ }
+ }
+ }
+ // When we get a new selection key, we need to make sure that
// all navigation commands will work with this selection key pressed
else if (inCmd==kcSelect)
{// check that is is a selection
@@ -2531,6 +2612,25 @@
}
}
} // end all nav commands
+ for (int curCmd=kcStartOrderlistNavigation; curCmd<=kcEndOrderlistNavigation; curCmd++)
+ {// for all nav commands
+ for (int k=0; k<commands[curCmd].kcList.GetSize(); k++)
+ {// for all keys for this command
+ CommandID cmdNavSelection = (CommandID)(kcStartOrderlistNavigationSelect+ (curCmd-kcStartOrderlistNavigation));
+ newKc=commands[curCmd].kcList[k]; // get all properties from the current nav cmd key
+ newKc.mod|=inKc.mod; // and the new selection modifier
+ if (adding)
+ {
+ Log("Enforcing rule krAllowNavigationWithSelection - adding key:%d with modifier:%d to command: %d\n", curCmd, inKc.mod, cmdNavSelection);
+ Add(newKc, cmdNavSelection, false);
+ }
+ else
+ {
+ Log("Enforcing rule krAllowNavigationWithSelection - removing key:%d with modifier:%d to command: %d\n", curCmd, inKc.mod, cmdNavSelection);
+ Remove(newKc, cmdNavSelection);
+ }
+ }
+ } // end all nav commands
}
} // end krAllowNavigationWithSelection
@@ -2556,6 +2656,23 @@
}
}
}
+ // Same for orderlist navigation
+ if (inCmd>=kcStartOrderlistNavigation&& inCmd<=kcEndOrderlistNavigation)
+ {//if this is a navigation command
+ for (int kSel=0; kSel<commands[kcSelect].kcList.GetSize(); kSel++)
+ {//for all deselection modifiers
+ newKcSel=commands[kcSelect].kcList[kSel]; // get all properties from the selection key
+ newKcSel.mod|=inKc.mod; // add modifiers from the new nav command
+ if (adding) {
+ Log("Enforcing rule krAllowSelectionWithNavigation: adding removing kcSelectWithNav and kcSelectOffWithNav\n");
+ Add(newKcSel, kcSelectWithNav, false);
+ }
+ else {
+ Log("Enforcing rule krAllowSelectionWithNavigation: removing kcSelectWithNav and kcSelectOffWithNav\n");
+ Remove(newKcSel, kcSelectWithNav);
+ }
+ }
+ }
// When we get a new selection key, we need to ensure it will work even when
// any navigation key is pressed
else if (inCmd==kcSelect)
@@ -2576,6 +2693,22 @@
}
}
} // end all nav commands
+ for (int curCmd=kcStartOrderlistNavigation; curCmd<=kcEndOrderlistNavigation; curCmd++)
+ {//for all nav commands
+ for (int k=0; k<commands[curCmd].kcList.GetSize(); k++)
+ {// for all keys for this command
+ newKcSel=inKc; // get all properties from the selection key
+ newKcSel.mod|=commands[curCmd].kcList[k].mod; //add the nav keys' modifiers
+ if (adding) {
+ Log("Enforcing rule krAllowSelectionWithNavigation - adding key:%d with modifier:%d to command: %d\n", curCmd, inKc.mod, kcSelectWithNav);
+ Add(newKcSel, kcSelectWithNav, false);
+ }
+ else {
+ Log("Enforcing rule krAllowSelectionWithNavigation - removing key:%d with modifier:%d to command: %d\n", curCmd, inKc.mod, kcSelectWithNav);
+ Remove(newKcSel, kcSelectWithNav);
+ }
+ }
+ } // end all nav commands
}
}
@@ -2999,14 +3132,20 @@
//ASSERT(eventTypes.GetSize()>0);
//Handle super-contexts (contexts that represent a set of sub contexts)
- if (curKc.ctx == kCtxViewPatterns) {
+ if (curKc.ctx == kCtxViewPatterns)
+ {
contexts.Add(kCtxViewPatternsNote);
contexts.Add(kCtxViewPatternsIns);
contexts.Add(kCtxViewPatternsVol);
contexts.Add(kCtxViewPatternsFX);
contexts.Add(kCtxViewPatternsFXparam);
}
- else {
+ else if(curKc.ctx == kCtxCtrlPatterns)
+ {
+ contexts.Add(kCtxCtrlOrderlist);
+ }
+ else
+ {
contexts.Add(curKc.ctx);
}
@@ -3259,6 +3398,7 @@
case kCtxCtrlSamples: return "Sample Context [top]";
case kCtxCtrlInstruments: return "Instrument Context [top]";
case kCtxCtrlComments: return "Comments Context [top]";
+ case kCtxCtrlOrderlist: return "Orderlist";
case kCtxVSTGUI: return "Plugin GUI Context";
case kCtxUnknownContext:
default: return "Unknown Context";
@@ -3494,12 +3634,14 @@
m_isParentContext[kCtxCtrlInstruments][kCtxAllContexts] = true;
m_isParentContext[kCtxCtrlComments][kCtxAllContexts] = true;
m_isParentContext[kCtxCtrlSamples][kCtxAllContexts] = true;
+ m_isParentContext[kCtxCtrlOrderlist][kCtxAllContexts] = true;
m_isParentContext[kCtxViewPatternsNote][kCtxViewPatterns] = true;
m_isParentContext[kCtxViewPatternsIns][kCtxViewPatterns] = true;
m_isParentContext[kCtxViewPatternsVol][kCtxViewPatterns] = true;
m_isParentContext[kCtxViewPatternsFX][kCtxViewPatterns] = true;
m_isParentContext[kCtxViewPatternsFXparam][kCtxViewPatterns] = true;
+ m_isParentContext[kCtxCtrlOrderlist][kCtxCtrlPatterns] = true;
}
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2009-11-27 19:17:19 UTC (rev 424)
@@ -962,6 +962,27 @@
kcVSTGUIRandParams,
kcEndVSTGUICommands=kcVSTGUIRandParams,
+ kcStartOrderlistCommands,
+ kcStartOrderlistNavigation=kcStartOrderlistCommands,
+ kcOrderlistNavigateLeft=kcStartOrderlistNavigation,
+ kcOrderlistNavigateRight,
+ kcOrderlistNavigateFirst,
+ kcOrderlistNavigateLast,
+ kcEndOrderlistNavigation= kcOrderlistNavigateLast,
+ // with selection key(must match order above)
+ kcStartOrderlistNavigationSelect,
+ kcOrderlistNavigateLeftSelect=kcStartOrderlistNavigationSelect,
+ kcOrderlistNavigateRightSelect,
+ kcOrderlistNavigateFirstSelect,
+ kcOrderlistNavigateLastSelect,
+ kcEndOrderlistNavigationSelect = kcOrderlistNavigateLastSelect,
+
+ kcOrderlistEditDelete,
+ kcOrderlistEditInsert,
+ kcOrderlistEditPattern,
+ kcOrderlistSwitchToPatternView,
+ kcEndOrderlistCommands=kcOrderlistSwitchToPatternView,
+
kcNumCommands,
};
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-27 19:17:19 UTC (rev 424)
@@ -699,10 +699,7 @@
void CCtrlPatterns::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
//------------------------------------------------------------------
{
- if (!m_OrderList.ProcessKeyDown(nChar))
- {
- CModControlDlg::OnKeyDown(nChar, nRepCnt, nFlags);
- }
+ CModControlDlg::OnKeyDown(nChar, nRepCnt, nFlags);
}
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-27 19:17:19 UTC (rev 424)
@@ -26,7 +26,7 @@
//m_nScrollPos2nd: 2nd selection point if multiple orders are selected
// (not neccessarily the higher order - GetCurSel() is taking care of that.)
ORDERINDEX m_nXScroll, m_nScrollPos, m_nScrollPos2nd, m_nDropPos;
- bool m_bScrolling, m_bDragging, m_bShift;
+ bool m_bScrolling, m_bDragging;
ORDERINDEX m_nDragOrder;
//To tell how many orders('orderboxes') to show at least
//on both sides of current order(when updating orderslist position).
@@ -46,10 +46,11 @@
UINT GetCurrentPattern() const;
ORD_SELECTION GetCurSel(bool bIgnoreSelection) const;
// 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;};
+ inline void SetCurSelTo2ndSel(bool isSelectionKeyPressed)
+ { if(isSelectionKeyPressed && m_nScrollPos2nd == ORDERINDEX_INVALID) m_nScrollPos2nd = m_nScrollPos;
+ else if(!isSelectionKeyPressed && m_nScrollPos2nd != ORDERINDEX_INVALID) m_nScrollPos2nd = ORDERINDEX_INVALID;
+ };
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();
@@ -86,6 +87,9 @@
// Set given sqeuence and update orderlist display.
void SelectSequence(const SEQUENCEINDEX nSeq);
+ // Little helper function to avoid copypasta
+ bool IsSelectionKeyPressed() {return CMainFrame::GetInputHandler()->SelectionPressed();}
+
// Clipboard.
void OnEditCopy();
void OnEditCut();
@@ -245,6 +249,7 @@
afx_msg void TogglePluginEditor(); //rewbs.instroVST
afx_msg void ToggleSplitPluginEditor(); //rewbs.instroVST
afx_msg void OnToggleOverflowPaste();
+ afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-27 19:17:19 UTC (rev 424)
@@ -91,7 +91,6 @@
m_nOrderlistMargins = s_nDefaultMargins;
m_bScrolling = false;
m_bDragging = false;
- m_bShift = false;
}
@@ -319,48 +318,6 @@
}
-BOOL COrderList::ProcessKeyDown(UINT nChar)
-//-----------------------------------------
-{
- switch(nChar)
- {
- case VK_UP:
- case VK_LEFT: SetCurSelTo2ndSel(); SetCurSel(m_nScrollPos - 1); break;
- case VK_DOWN:
- case VK_RIGHT: SetCurSelTo2ndSel(); SetCurSel(m_nScrollPos + 1); break;
- case VK_HOME: SetCurSelTo2ndSel(); SetCurSel(0); break;
- case VK_END:
- if (m_pModDoc)
- {
- CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- ORDERINDEX nLast = pSndFile->Order.GetLengthFirstEmpty();
- if (nLast)
- nLast--;
- SetCurSelTo2ndSel();
- SetCurSel(nLast);
- }
- break;
- case VK_DELETE: OnDeleteOrder(); break;
- case VK_INSERT: OnInsertOrder(); break;
- case VK_TAB: OnSwitchToView(); break;
- case VK_RETURN: OnLButtonDblClk(0, CPoint(0,0)); OnSwitchToView(); break;
-
- //rewbs.customKeys: these are now global commands handled via the inputInhandler
-/* case VK_F5: OnPlayerPlay(); break;
- case VK_F6: OnPlayerPlayFromStart(); break;
- case VK_F7: OnPatternPlayFromStart(); break;
- case VK_ESCAPE:
- case VK_F8: OnPlayerPause(); break;
-*/
- default:
- return FALSE;
- }
-
- return TRUE;
-
-}
-
-
BOOL COrderList::ProcessChar(UINT nChar)
//--------------------------------------
{
@@ -425,45 +382,92 @@
UINT nRepCnt = LOWORD(pMsg->lParam);
UINT nFlags = HIWORD(pMsg->lParam);
KeyEventType kT = ih->GetKeyEventType(nFlags);
+
+ InputTargetContext ctx = (InputTargetContext)(kCtxCtrlOrderlist);
+ if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull)
+ return true; // Mapped to a command, no need to pass message on.
+
//HACK: masquerade as kCtxViewPatternsNote context until we implement appropriate
// command propagation to kCtxCtrlOrderlist context.
- //InputTargetContext ctx = (InputTargetContext)(kCtxCtrlOrderlist);
- InputTargetContext ctx = (InputTargetContext)(kCtxViewPatternsNote);
-
- CommandID kc = ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT);
- switch (kc)
- {
- case kcSwitchToOrderList: OnSwitchToView(); return true;
- case kcChangeLoopStatus: m_pParent->OnModCtrlMsg(CTRLMSG_PAT_LOOP, -1); return true;
- case kcToggleFollowSong: m_pParent->OnFollowSong(); return true;
+ ctx = (InputTargetContext)(kCtxViewPatternsNote);
+ if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull)
+ return true; // Mapped to a command, no need to pass message on.
- case kcChannelUnmuteAll:
- case kcUnmuteAllChnOnPatTransition:
- ::PostMessage(m_pParent->GetViewWnd(), WM_MOD_KEYCOMMAND, kc, 0);
- return true;
- }
}
//end rewbs.customKeys
switch(pMsg->message)
{
- case WM_KEYUP:
- if ((pMsg->wParam == VK_SHIFT) || (pMsg->wParam == VK_LSHIFT) || (pMsg->wParam == VK_RSHIFT)) m_bShift = FALSE;
- break;
- case WM_KEYDOWN:
- if ((pMsg->wParam == VK_SHIFT) || (pMsg->wParam == VK_LSHIFT) || (pMsg->wParam == VK_RSHIFT)) m_bShift = TRUE;
- if (ProcessKeyDown(pMsg->wParam)) return TRUE;
- break;
case WM_CHAR:
- if (ProcessChar(pMsg->wParam)) return TRUE;
+ if (ProcessChar(pMsg->wParam)) return true;
break;
}
return CWnd::PreTranslateMessage(pMsg);
}
+LRESULT COrderList::OnCustomKeyMsg(WPARAM wParam, LPARAM)
+//-------------------------------------------------------
+{
+ if (wParam == kcNull)
+ return 0;
+
+ switch(wParam)
+ {
+ case kcEditCopy:
+ OnEditCopy(); return wParam;
+ case kcEditCut:
+ OnEditCut(); return wParam;
+ case kcEditPaste:
+ OnEditPaste(); return wParam;
+
+ case kcOrderlistNavigateLeftSelect:
+ case kcOrderlistNavigateLeft:
+ SetCurSelTo2ndSel(wParam == kcOrderlistNavigateLeftSelect); SetCurSel(m_nScrollPos - 1); return wParam;
+ case kcOrderlistNavigateRightSelect:
+ case kcOrderlistNavigateRight:
+ SetCurSelTo2ndSel(wParam == kcOrderlistNavigateRightSelect); SetCurSel(m_nScrollPos + 1); return wParam;
+ case kcOrderlistNavigateFirstSelect:
+ case kcOrderlistNavigateFirst:
+ SetCurSelTo2ndSel(wParam == kcOrderlistNavigateFirstSelect); SetCurSel(0); return wParam;
+ case kcOrderlistNavigateLastSelect:
+ case kcOrderlistNavigateLast:
+ if((m_pModDoc != nullptr) && (m_pModDoc->GetSoundFile() != nullptr))
+ {
+ SetCurSelTo2ndSel(wParam == kcOrderlistNavigateLast);
+ ORDERINDEX nLast = m_pModDoc->GetSoundFile()->Order.GetLengthTailTrimmed();
+ if(nLast > 0) nLast--;
+ SetCurSel(nLast);
+ }
+ return wParam;
+ case kcOrderlistEditDelete:
+ OnDeleteOrder(); return wParam;
+ case kcOrderlistEditInsert:
+ OnInsertOrder(); return wParam;
+ case kcOrderlistSwitchToPatternView:
+ OnSwitchToView(); return wParam;
+ case kcOrderlistEditPattern:
+ OnLButtonDblClk(0, CPoint(0,0)); OnSwitchToView(); return wParam;
+
+ // kCtxViewPatternsNote messages
+ case kcSwitchToOrderList:
+ OnSwitchToView();
+ return wParam;
+ case kcChangeLoopStatus:
+ m_pParent->OnModCtrlMsg(CTRLMSG_PAT_LOOP, -1); return wParam;
+ case kcToggleFollowSong: m_pParent->OnFollowSong(); return wParam;
+
+ case kcChannelUnmuteAll:
+ case kcUnmuteAllChnOnPatTransition:
+ ::PostMessage(m_pParent->GetViewWnd(), WM_MOD_KEYCOMMAND, wParam, 0); return wParam;
+ }
+
+ return 0;
+}
+
+
static const char szClipboardOrdersHdr[] = "OpenMPT %3s\x0D\x0A";
static const char szClipboardOrdCountFieldHdr[] = "OrdNum: %u\x0D\x0A";
static const char szClipboardOrdersFieldHdr[] = "OrdLst: ";
@@ -613,23 +617,6 @@
}
-LRESULT COrderList::OnCustomKeyMsg(WPARAM wParam, LPARAM)
-//-------------------------------------------------------
-{
- if (wParam == kcNull)
- return 0;
-
- switch(wParam)
- {
- case kcEditCopy: OnEditCopy(); return wParam;
- case kcEditCut: OnEditCut(); return wParam;
- case kcEditPaste: OnEditPaste(); return wParam;
- }
-
- return 0;
-}
-
-
void COrderList::UpdateView(DWORD dwHintMask, CObject *pObj)
//----------------------------------------------------------
{
@@ -645,7 +632,6 @@
//-------------------------------
{
if (m_pParent) m_pParent->PostViewMessage(VIEWMSG_SETFOCUS);
- m_bShift = FALSE;
}
@@ -788,7 +774,6 @@
{
CWnd::OnKillFocus(pWnd);
InvalidateSelection();
- m_bShift = FALSE;
CMainFrame::GetMainFrame()->m_pOrderlistHasFocus = nullptr;
}
@@ -842,6 +827,7 @@
{
CRect rect;
GetClientRect(&rect);
+ bool bSelection = IsSelectionKeyPressed();
if (m_bDragging)
{
@@ -865,13 +851,13 @@
for(int i = 0; i <= nMoveCount; i++)
{
- if(!m_pModDoc->MoveOrder(nMovePos, m_nDropPos, true, m_bShift)) return;
- if((bMoveBack ^ m_bShift) == true && bMultiSelection)
+ if(!m_pModDoc->MoveOrder(nMovePos, m_nDropPos, true, bSelection)) return;
+ if((bMoveBack ^ bSelection) == true && bMultiSelection)
{
nMovePos++;
m_nDropPos++;
}
- if(bMoveBack && m_bShift && bMultiSelection) {
+ if(bMoveBack && bSelection && bMultiSelection) {
nMovePos += 2;
m_nDropPos++;
}
@@ -881,10 +867,10 @@
// adjust selection
m_nScrollPos2nd = m_nDropPos - 1;
m_nDropPos -= nMoveCount + (bMoveBack ? 0 : 1);
- SetCurSel((bMoveBack && (!m_bShift)) ? m_nDropPos - 1 : m_nDropPos);
+ SetCurSel((bMoveBack && (!bSelection)) ? m_nDropPos - 1 : m_nDropPos);
} else
{
- SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!m_bShift)) ? m_nDropPos - 1 : m_nDropPos);
+ SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!bSelection)) ? m_nDropPos - 1 : m_nDropPos);
}
m_pModDoc->SetModified();
}
Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2009-11-27 19:17:19 UTC (rev 424)
@@ -204,10 +204,18 @@
commandCategories.Add(*newCat);
delete newCat;
- newCat = new CommandCategory(" Pattern [Top]", kCtxCtrlPatterns);
+ newCat = new CommandCategory(" Pattern Editor [Top]", kCtxCtrlPatterns);
commandCategories.Add(*newCat);
delete newCat;
+ newCat = new CommandCategory(" Pattern Editor - Orderlist", kCtxCtrlOrderlist);
+
+ for (int c=kcStartOrderlistCommands; c<=kcEndOrderlistCommands; c++)
+ newCat->commands.Add(c);
+
+ commandCategories.Add(*newCat);
+ delete newCat;
+
newCat = new CommandCategory(" Pattern Editor - General", kCtxViewPatterns);
for (int c=kcStartPlainNavigate; c<=kcEndPlainNavigate; c++)
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-11-27 19:17:19 UTC (rev 424)
@@ -1081,15 +1081,10 @@
// find sequence this item belongs to
for(SEQUENCEINDEX nSeq = 0; nSeq < pSong->tiOrders.size(); nSeq++)
{
+ if(hItem == pSong->tiSequences[nSeq]) return (MODITEM_SEQUENCE | (nSeq << 16));
for(ORDERINDEX nOrd = 0; nOrd < pSong->tiOrders[nSeq].size(); nOrd++)
{
- if (hItem == pSong->tiOrders[nSeq][nOrd])
- {
- return (MODITEM_ORDER | (nOrd << 16) | (((uint64)nSeq) << 32));
- } else if(hItem == pSong->tiSequences[nSeq])
- {
- return (MODITEM_SEQUENCE | (nSeq << 16));
- }
+ if (hItem == pSong->tiOrders[nSeq][nOrd]) return (MODITEM_ORDER | (nOrd << 16) | (((uint64)nSeq) << 32));
}
}
}
@@ -2319,9 +2314,12 @@
case MODITEM_HDR_ORDERS:
{
CModDoc *pModDoc = GetDocumentFromItem(hItem);
- if(pModDoc && (pModDoc->GetModType() == MOD_TYPE_MPT))
+ CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr;
+ if(pModDoc && pSndFile && (pModDoc->GetModType() == MOD_TYPE_MPT))
{
AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Sequence");
+ if(pSndFile->Order.GetNumSequences() == 1) // this is a sequence
+ AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "D&uplicate Sequence");
}
}
break;
@@ -2832,7 +2830,7 @@
pModDoc = GetDocumentFromItem(hItem);
CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr;
- if (pModDoc && pSndFile && (qwItemType == MODITEM_SEQUENCE))
+ if (pModDoc && pSndFile && ((qwItemType == MODITEM_SEQUENCE) || (qwItemType == MODITEM_HDR_ORDERS)))
{
pSndFile->Order.SetSequence((SEQUENCEINDEX)dwItemNo);
pSndFile->Order.AddSequence(true);
Modified: trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb
===================================================================
--- trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -277,4 +277,14 @@
//----( Comments Context [top] (18) )------------
-//----( Unknown Context (19) )------------
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -24,7 +24,7 @@
0:1361:2:45:1 //Copy: Ctrl+EINFG (KeyDown)
0:1362:2:86:1 //Paste: Ctrl+V (KeyDown)
0:1363:3:86:1 //Mix Paste: Shift+Ctrl+V (KeyDown)
-0:1686:1:86:1 //Mix Paste (old IT Style): Shift+V (KeyDown)
+0:1793:1:86:1 //Paste Flood: Shift+V (KeyDown)
0:1364:2:53:1 //SelectAll: Ctrl+5 (KeyDown)
0:1365:2:70:1 //Find: Ctrl+F (KeyDown)
0:1366:0:114:1 //Find Next: F3 (KeyDown)
@@ -292,4 +292,14 @@
//----( Comments Context [top] (18) )------------
-//----( Unknown Context (19) )------------
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: NACH-LINKS (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: NACH-OBEN (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: NACH-RECHTS (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: NACH-UNTEN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: POS1 (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: ENDE (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: ENTF (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: EINFG (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: EINGABE (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TABULATOR (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/FR_FT2Style_(goor00).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -264,12 +264,26 @@
//----( Unknown Context (12) )------------
-//----( General Context [top] (13) )------------
+//----( Plugin GUI Context (13) )------------
-//----( Pattern Context [top] (14) )------------
+//----( General Context [top] (14) )------------
-//----( Sample Context [top] (15) )------------
+//----( Pattern Context [top] (15) )------------
-//----( Instrument Context [top] (16) )------------
+//----( Sample Context [top] (16) )------------
-//----( Comments Context [top] (17) )------------
+//----( Instrument Context [top] (17) )------------
+
+//----( Comments Context [top] (18) )------------
+
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/FR_mpt_classic_(vanisherIII).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -250,12 +250,26 @@
//----( Unknown Context (12) )------------
-//----( General Context [top] (13) )------------
+//----( Plugin GUI Context (13) )------------
-//----( Pattern Context [top] (14) )------------
+//----( General Context [top] (14) )------------
-//----( Sample Context [top] (15) )------------
+//----( Pattern Context [top] (15) )------------
-//----( Instrument Context [top] (16) )------------
+//----( Sample Context [top] (16) )------------
-//----( Comments Context [top] (17) )------------
+//----( Instrument Context [top] (17) )------------
+
+//----( Comments Context [top] (18) )------------
+
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/SE_laptop_(ganja).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -174,12 +174,26 @@
//----( Unknown Context (12) )------------
-//----( General Context [top] (13) )------------
+//----( Plugin GUI Context (13) )------------
-//----( Pattern Context [top] (14) )------------
+//----( General Context [top] (14) )------------
-//----( Sample Context [top] (15) )------------
+//----( Pattern Context [top] (15) )------------
-//----( Instrument Context [top] (16) )------------
+//----( Sample Context [top] (16) )------------
-//----( Comments Context [top] (17) )------------
+//----( Instrument Context [top] (17) )------------
+
+//----( Comments Context [top] (18) )------------
+
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -281,4 +281,14 @@
//----( Comments Context [top] (18) )------------
-//----( Unknown Context (19) )------------
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/US_it2_(lpchip).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -242,12 +242,26 @@
//----( Unknown Context (12) )------------
-//----( General Context [top] (13) )------------
+//----( Plugin GUI Context (13) )------------
-//----( Pattern Context [top] (14) )------------
+//----( General Context [top] (14) )------------
-//----( Sample Context [top] (15) )------------
+//----( Pattern Context [top] (15) )------------
-//----( Instrument Context [top] (16) )------------
+//----( Sample Context [top] (16) )------------
-//----( Comments Context [top] (17) )------------
+//----( Instrument Context [top] (17) )------------
+
+//----( Comments Context [top] (18) )------------
+
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/US_mpt_classic_(diamond).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -257,13 +257,26 @@
//----( Unknown Context (12) )------------
-//----( General Context [top] (13) )------------
+//----( Plugin GUI Context (13) )------------
-//----( Pattern Context [top] (14) )------------
+//----( General Context [top] (14) )------------
-//----( Sample Context [top] (15) )------------
+//----( Pattern Context [top] (15) )------------
-//----( Instrument Context [top] (16) )------------
+//----( Sample Context [top] (16) )------------
-//----( Comments Context [top] (17) )------------
+//----( Instrument Context [top] (17) )------------
+//----( Comments Context [top] (18) )------------
+
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb 2009-11-27 18:52:15 UTC (rev 423)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/dvorak_(snu).mkb 2009-11-27 19:17:19 UTC (rev 424)
@@ -256,3 +256,15 @@
//----( Instrument Context [top] (17) )------------
//----( Comments Context [top] (18) )------------
+
+//----( Orderlist (19) )------------
+19:1794:0:37:5 //Previous Order: LEFT (KeyDown|KeyHold)
+19:1794:0:38:5 //Previous Order: UP (KeyDown|KeyHold)
+19:1795:0:39:5 //Next Order: RIGHT (KeyDown|KeyHold)
+19:1795:0:40:5 //Next Order: DOWN (KeyDown|KeyHold)
+19:1796:0:36:5 //First Order: HOME (KeyDown|KeyHold)
+19:1797:0:35:5 //Last Order: END (KeyDown|KeyHold)
+19:1802:0:46:5 //Delete Order: DELETE (KeyDown|KeyHold)
+19:1803:0:45:5 //Insert Order: INSERT (KeyDown|KeyHold)
+19:1804:0:13:5 //Edit Pattern: ENTER (KeyDown|KeyHold)
+19:1805:0:9:5 //Switch to pattern editor: TAB (KeyDown|KeyHold)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-27 18:52:27
|
Revision: 423
http://modplug.svn.sourceforge.net/modplug/?rev=423&view=rev
Author: saga-games
Date: 2009-11-27 18:52:15 +0000 (Fri, 27 Nov 2009)
Log Message:
-----------
[New] Treeview: Sequences can be inserted, duplicated and deleted by right-clicking the sequence items
[Fix] Pattern editor: When recording live from the keyboard, SDx shouldn't exceed the song speed anymore.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-23 22:00:32 UTC (rev 422)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-27 18:52:15 UTC (rev 423)
@@ -608,11 +608,14 @@
// 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()))
+ if(nSeq < m_pSndFile->Order.GetNumSequences())
{
m_OrderList.SelectSequence(nSeq);
- m_OrderList.SetCurSel(nOrd);
- SetCurrentPattern(m_pSndFile->Order[nOrd]);
+ if((nOrd < m_pSndFile->Order.GetSequence(nSeq).size()))
+ {
+ m_OrderList.SetCurSel(nOrd);
+ SetCurrentPattern(m_pSndFile->Order[nOrd]);
+ }
}
}
if (m_hWndView)
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-23 22:00:32 UTC (rev 422)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-27 18:52:15 UTC (rev 423)
@@ -4210,7 +4210,9 @@
if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted
if (p->command == 0) { //make sure we don't overwrite any existing commands.
p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX;
- p->param = 0xD0 + min(0xF, nTick);
+ UINT maxSpeed = 0x0F;
+ if(pSndFile->m_nMusicSpeed > 0) maxSpeed = min(0x0F, pSndFile->m_nMusicSpeed - 1);
+ p->param = 0xD0 + min(maxSpeed, nTick);
}
}
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-11-23 22:00:32 UTC (rev 422)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-11-27 18:52:15 UTC (rev 423)
@@ -73,6 +73,8 @@
ON_COMMAND(ID_MODTREE_MUTE, OnMuteTreeItem)
ON_COMMAND(ID_MODTREE_SOLO, OnSoloTreeItem)
ON_COMMAND(ID_MODTREE_UNMUTEALL, OnUnmuteAllTreeItem)
+ ON_COMMAND(ID_MODTREE_DUPLICATE, OnDuplicateTreeItem)
+ ON_COMMAND(ID_MODTREE_INSERT, OnInsertTreeItem)
// -> CODE#0023
// -> DESC="IT project files (.itp)"
@@ -700,6 +702,7 @@
if ((pInfo->hOrders) && (hintFlagPart != HINT_INSNAMES) && (hintFlagPart != HINT_SMPNAMES))
{
const DWORD nPat = (lHint >> HINT_SHIFT_PAT);
+ bool adjustParentNode = false; // adjust sequence name of "Sequence" node?
// (only one seq remaining || previously only one sequence): update parent item
if((pInfo->tiSequences.size() > 1 && pSndFile->Order.GetNumSequences() == 1) || (pInfo->tiSequences.size() == 1 && pSndFile->Order.GetNumSequences() > 1))
@@ -714,6 +717,7 @@
}
pInfo->tiOrders.resize(pSndFile->Order.GetNumSequences());
pInfo->tiSequences.resize(pSndFile->Order.GetNumSequences(), NULL);
+ adjustParentNode = true;
}
// If there are too many sequences, delete them.
@@ -736,6 +740,15 @@
SEQUENCEINDEX nSeqMin = 0, nSeqMax = pSndFile->Order.GetNumSequences() - 1;
SEQUENCEINDEX nHintParam = lHint >> HINT_SHIFT_SEQUENCE;
if ((hintFlagPart == HINT_SEQNAMES) && (nHintParam <= nSeqMax)) nSeqMin = nSeqMax = nHintParam;
+
+ // Adjust caption of the "Sequence" node (if only one sequence exists, it should be labeled with the sequence name)
+ if(((hintFlagPart == HINT_SEQNAMES) && pSndFile->Order.GetNumSequences() == 1) || adjustParentNode)
+ {
+ CString sSeqName = pSndFile->Order.GetSequence(0).m_sName;
+ if(sSeqName.IsEmpty() || pSndFile->Order.GetNumSequences() > 1) sSeqName = "Sequence";
+ SetItem(pInfo->hOrders, TVIF_TEXT, sSeqName, 0, 0, 0, 0, 0);
+ }
+
// go through all sequences
for(SEQUENCEINDEX nSeq = nSeqMin; nSeq <= nSeqMax; nSeq++)
{
@@ -1151,6 +1164,10 @@
if (pModDoc) pModDoc->ActivateView(IDD_CONTROL_COMMENTS, 0);
return TRUE;
+ case MODITEM_SEQUENCE:
+ if (pModDoc) pModDoc->ActivateView(IDD_CONTROL_PATTERNS, (dwItem << 16) | 0x8000);
+ return TRUE;
+
case MODITEM_ORDER:
if (pModDoc) pModDoc->ActivateView(IDD_CONTROL_PATTERNS, dwItem | 0x8000);
return TRUE;
@@ -1370,9 +1387,18 @@
uint64 qwItemType = GetModItem(hItem);
DWORD dwItem = (DWORD)(qwItemType >> 16);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
- CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
+ CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : nullptr;
+ CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr;
switch(qwItemType & 0xFFFF)
{
+ case MODITEM_SEQUENCE:
+ if (pModDoc && pSndFile)
+ {
+ pSndFile->Order.RemoveSequence((SEQUENCEINDEX)(dwItem & 0xFFFF));
+ pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL);
+ }
+ break;
+
case MODITEM_ORDER:
if ((pModDoc) && (pModDoc->RemoveOrder((SEQUENCEINDEX)(dwItem >> 16), (ORDERINDEX)(dwItem & 0xFFFF))))
{
@@ -2282,13 +2308,24 @@
break;
case MODITEM_SEQUENCE:
- // TODO: Right-click menu for sequences
- //nDefault = ID_MODTREE_EXECUTE;
+ //nDefault = ID_MODTREE_EXECUTE; // don't do it, double-clicking sequences shouldn't switch to the automatically!
//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");
+ AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Sequence");
+ AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "D&uplicate Sequence");
+ AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Sequence");
break;
+
+ case MODITEM_HDR_ORDERS:
+ {
+ CModDoc *pModDoc = GetDocumentFromItem(hItem);
+ if(pModDoc && (pModDoc->GetModType() == MOD_TYPE_MPT))
+ {
+ AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Sequence");
+ }
+ }
+ break;
+
case MODITEM_SAMPLE:
{
CModDoc *pModDoc = GetDocumentFromItem(hItem);
@@ -2781,9 +2818,55 @@
}
+void CModTree::OnDuplicateTreeItem()
+//----------------------------------
+{
+ HTREEITEM hItem = GetSelectedItem();
+ uint64 qwItemType;
+ CModDoc *pModDoc;
+
+ qwItemType = GetModItem(hItem);
+ const DWORD dwItemNo = (DWORD)(qwItemType >> 16);
+ qwItemType &= 0xFFFF;
+
+ pModDoc = GetDocumentFromItem(hItem);
+ CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr;
+
+ if (pModDoc && pSndFile && (qwItemType == MODITEM_SEQUENCE))
+ {
+ pSndFile->Order.SetSequence((SEQUENCEINDEX)dwItemNo);
+ pSndFile->Order.AddSequence(true);
+ UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE);
+ pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE);
+ }
+}
+
+
+void CModTree::OnInsertTreeItem()
+//-------------------------------
+{
+ HTREEITEM hItem = GetSelectedItem();
+ uint64 qwItemType;
+ CModDoc *pModDoc;
+
+ qwItemType = GetModItem(hItem) & 0xFFFF;
+
+ pModDoc = GetDocumentFromItem(hItem);
+ CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr;
+
+ if (pModDoc && pSndFile && ((qwItemType == MODITEM_SEQUENCE) || (qwItemType == MODITEM_HDR_ORDERS)))
+ {
+ pSndFile->Order.AddSequence(false);
+ UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE);
+ pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE);
+ }
+}
+
+
// -> CODE#0023
// -> DESC="IT project files (.itp)"
void CModTree::OnSetItemPath()
+//----------------------------
{
HTREEITEM hItem = GetSelectedItem();
uint64 qwItemType = GetModItem(hItem);
@@ -2816,6 +2899,7 @@
}
void CModTree::OnSaveItem()
+//-------------------------
{
HTREEITEM hItem = GetSelectedItem();
uint64 qwItemType = GetModItem(hItem);
Modified: trunk/OpenMPT/mptrack/View_tre.h
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.h 2009-11-23 22:00:32 UTC (rev 422)
+++ trunk/OpenMPT/mptrack/View_tre.h 2009-11-27 18:52:15 UTC (rev 423)
@@ -204,6 +204,8 @@
afx_msg void OnMuteTreeItem();
afx_msg void OnSoloTreeItem();
afx_msg void OnUnmuteAllTreeItem();
+ afx_msg void OnDuplicateTreeItem();
+ afx_msg void OnInsertTreeItem();
// -> CODE#0023
// -> DESC="IT project files (.itp)"
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-11-23 22:00:32 UTC (rev 422)
+++ trunk/OpenMPT/mptrack/resource.h 2009-11-27 18:52:15 UTC (rev 423)
@@ -1153,6 +1153,8 @@
#define ID_ORDERLIST_EDIT_PASTE 59233
#define ID_CHANNEL_RENAME 59234
#define ID_EDIT_PASTEFLOOD 59235
+#define ID_MODTREE_DUPLICATE 59236
+#define ID_MODTREE_INSERT 59237
// Next default values for new objects
//
@@ -1160,7 +1162,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 523
-#define _APS_NEXT_COMMAND_VALUE 59236
+#define _APS_NEXT_COMMAND_VALUE 59238
#define _APS_NEXT_CONTROL_VALUE 2412
#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-11-23 22:00:41
|
Revision: 422
http://modplug.svn.sourceforge.net/modplug/?rev=422&view=rev
Author: saga-games
Date: 2009-11-23 22:00:32 +0000 (Mon, 23 Nov 2009)
Log Message:
-----------
[Fix] FX Editing: Min value for XM arpeggio is now 001, max value for channel volume is M40
[Imp] Mod Conversion: Removing channel features (pan/vol) in formats where they're not supported
[Imp] MPTM: Only write full envelope info if at least one envelope has more than 25 envelope points.
[Ref] Switched to British English in setup dialog ("Colour" instead of "Color")
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-21 18:24:39 UTC (rev 421)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-23 22:00:32 UTC (rev 422)
@@ -2268,9 +2268,10 @@
switch(gFXInfo[ndx].dwEffect)
{
case CMD_ARPEGGIO:
- if (nType & MOD_TYPE_MOD) nmin = 1;
+ if (nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) nmin = 1;
break;
case CMD_VOLUME:
+ case CMD_CHANNELVOLUME:
nmax = 0x40;
break;
case CMD_SPEED:
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-21 18:24:39 UTC (rev 421)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-23 22:00:32 UTC (rev 422)
@@ -344,6 +344,20 @@
}
}
+ // Fix channel settings (pan/vol)
+ for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++)
+ {
+ if(newTypeIsMOD_XM || newTypeIsS3M)
+ {
+ m_SndFile.ChnSettings->nVolume = 64;
+ m_SndFile.ChnSettings->dwFlags &= ~CHN_SURROUND;
+ }
+ if(newTypeIsXM)
+ {
+ m_SndFile.ChnSettings->nPan = 128;
+ }
+ }
+
BEGIN_CRITICAL();
m_SndFile.ChangeModTypeTo(nNewType);
if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES))
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-11-21 18:24:39 UTC (rev 421)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-11-23 22:00:32 UTC (rev 422)
@@ -701,7 +701,7 @@
{PATTERN_OVERFLOWPASTE, "Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."},
{PATTERN_POSITIONAWARETIMER, "Position aware timer", "If enabled, timer will show the playback position time if possible instead of running timer."},
{PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands)"},
- {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a differnt icon in the treeview."}
+ {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."}
};
void COptionsGeneral::DoDataExchange(CDataExchange* pDX)
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-11-21 18:24:39 UTC (rev 421)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-11-23 22:00:32 UTC (rev 422)
@@ -273,7 +273,7 @@
IDD_OPTIONS_COLORS DIALOGEX 0, 0, 272, 281
STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Colors"
+CAPTION "Colours"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
@@ -287,14 +287,14 @@
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
+ CONTROL "Colour",IDC_BUTTON1,"Button",BS_OWNERDRAW,25,194,51,15
+ CONTROL "Colour",IDC_BUTTON2,"Button",BS_OWNERDRAW,98,194,51,15
+ CONTROL "Colour",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,211
- LTEXT "Select color for:",IDC_STATIC,15,15,63,8
+ LTEXT "Select colour for:",IDC_STATIC,15,15,63,8
LTEXT "rows",IDC_STATIC,138,92,16,8
LTEXT "rows",IDC_STATIC,138,110,16,8
CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43
@@ -302,7 +302,7 @@
"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
+ GROUPBOX "Colour Presets",IDC_STATIC,6,228,264,42
END
IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-21 18:24:39 UTC (rev 421)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-23 22:00:32 UTC (rev 422)
@@ -3413,15 +3413,25 @@
if(m_nType & MOD_TYPE_MPT)
{
+ UINT maxNodes = 0;
+ for(INSTRUMENTINDEX nIns = 1; nIns <= m_nInstruments; nIns++) if(Instruments[nIns] != nullptr)
+ {
+ maxNodes = max(maxNodes, Instruments[nIns]->VolEnv.nNodes);
+ maxNodes = max(maxNodes, Instruments[nIns]->PanEnv.nNodes);
+ maxNodes = max(maxNodes, Instruments[nIns]->PitchEnv.nNodes);
+ }
// write full envelope information for MPTM files (more env points)
- WriteInstrumentPropertyForAllInstruments('VP[.', sizeof(m_defaultInstrument.VolEnv.Ticks ), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('VE[.', sizeof(m_defaultInstrument.VolEnv.Values), f, instruments, nInstruments);
+ if(maxNodes > 25)
+ {
+ WriteInstrumentPropertyForAllInstruments('VP[.', sizeof(m_defaultInstrument.VolEnv.Ticks ), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('VE[.', sizeof(m_defaultInstrument.VolEnv.Values), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('PP[.', sizeof(m_defaultInstrument.PanEnv.Ticks), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('PE[.', sizeof(m_defaultInstrument.PanEnv.Values), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PP[.', sizeof(m_defaultInstrument.PanEnv.Ticks), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PE[.', sizeof(m_defaultInstrument.PanEnv.Values), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('PiP[', sizeof(m_defaultInstrument.PitchEnv.Ticks), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('PiE[', sizeof(m_defaultInstrument.PitchEnv.Values), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PiP[', sizeof(m_defaultInstrument.PitchEnv.Ticks), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PiE[', sizeof(m_defaultInstrument.PitchEnv.Values), f, instruments, nInstruments);
+ }
}
return;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-21 18:25:18
|
Revision: 421
http://modplug.svn.sourceforge.net/modplug/?rev=421&view=rev
Author: saga-games
Date: 2009-11-21 18:24:39 +0000 (Sat, 21 Nov 2009)
Log Message:
-----------
[Fix] When jumping around in a module, high offest value is also memorized in XM files now.
[Fix] XM Compatibility: Command X modplug extensions are now ignored in FT2 compat mode.
[Fix] IT Compatibility: IT files with empty sample slots will now FINALLY save correctly in Impulse Tracker.
[Fix] IT Compatibility: IT files with global volume 0 are now loaded correctly
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-21 15:40:57 UTC (rev 420)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-21 18:24:39 UTC (rev 421)
@@ -965,18 +965,11 @@
SpaceToNullStringFixed(m_szNames[0], 26);
// Global Volume
- if (pifh->globalvol)
- {
- m_nDefaultGlobalVolume = pifh->globalvol << 1;
- if (!m_nDefaultGlobalVolume) m_nDefaultGlobalVolume = 256;
- if (m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
- }
+ m_nDefaultGlobalVolume = pifh->globalvol << 1;
+ if (m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
if (pifh->speed) m_nDefaultSpeed = pifh->speed;
m_nDefaultTempo = max(32, pifh->tempo); // tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32.
m_nSamplePreAmp = min(pifh->mv, 128);
- /*if (m_nSamplePreAmp<0x20) {
- m_nSamplePreAmp=100;
- }*/
// Reading Channels Pan Positions
for (int ipan=0; ipan</*MAX_BASECHANNELS*/64; ipan++) if (pifh->chnpan[ipan] != 0xFF) //Header only has room for settings for 64 chans...
@@ -1474,8 +1467,10 @@
static char autodetectITplaymode = -1;
if(GetType() == MOD_TYPE_IT)
{
+#ifdef MODPLUG_TRACKER
if(autodetectITplaymode == -1)
autodetectITplaymode = CMainFrame::GetPrivateProfileLong("Misc", "AutodetectITplaystyle", 1, theApp.GetConfigFileName());
+#endif
if(autodetectITplaymode)
{
@@ -2344,7 +2339,10 @@
flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S;
}
}
- itss.samplepointer = dwPos;
+ if ((psmp->pSample) && (psmp->nLength))
+ itss.samplepointer = dwPos;
+ else
+ itss.samplepointer = itss.flags = 0;
fseek(f, smppos[nsmp-1], SEEK_SET);
fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f);
fseek(f, dwPos, SEEK_SET);
@@ -2920,7 +2918,10 @@
itss.flags |= 0x02;
flags = RS_PCM16S;
}
- itss.samplepointer = dwPos;
+ if ((psmp->pSample) && (psmp->nLength))
+ itss.samplepointer = dwPos;
+ else
+ itss.samplepointer = itss.flags = 0;
fseek(f, smppos[nsmp-1], SEEK_SET);
fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f);
fseek(f, dwPos, SEEK_SET);
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-21 15:40:57 UTC (rev 420)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-21 18:24:39 UTC (rev 421)
@@ -271,6 +271,9 @@
else patloop[nChn] = dwElapsedTime;
}
break;
+ case CMD_XFINEPORTAUPDOWN:
+ if (((param & 0xF0) == 0xA0) && !IsCompatibleMode(TRK_FASTTRACKER2)) pChn->nOldHiOffset = param & 0x0F;
+ break;
}
if (!bAdjust) continue;
switch(command)
@@ -1761,7 +1764,8 @@
case 0x60:
case 0x70:
case 0x90:
- case 0xA0: ExtendedS3MCommands(nChn, param); break;
+ case 0xA0: if(!IsCompatibleMode(TRK_FASTTRACKER2)) ExtendedS3MCommands(nChn, param);
+ break;
}
break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-21 15:41:10
|
Revision: 420
http://modplug.svn.sourceforge.net/modplug/?rev=420&view=rev
Author: saga-games
Date: 2009-11-21 15:40:57 +0000 (Sat, 21 Nov 2009)
Log Message:
-----------
[Fix] When jumping around in a module, high offest value is also memorized
[Fix] XM Saver: +++ and --- orders are preserved when not using compatibility mode for now.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-20 13:04:34 UTC (rev 419)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-21 15:40:57 UTC (rev 420)
@@ -770,6 +770,8 @@
if(Order[nOrd] >= nPatterns) nPatterns = Order[nOrd] + 1;
}
}
+ if(!bCompatibilityExport) nMaxOrds = Order.GetLengthTailTrimmed(); // should really be removed at some point
+
xmheader.orders = LittleEndianW((WORD)nMaxOrds);
xmheader.patterns = LittleEndianW((WORD)nPatterns);
xmheader.size = LittleEndian((DWORD)(xmheader.size + nMaxOrds));
@@ -793,7 +795,7 @@
// write order list (wihout +++ and ---, explained above)
for(ORDERINDEX nOrd = 0; nOrd < Order.GetLengthTailTrimmed(); nOrd++)
{
- if(Patterns.IsValidIndex(Order[nOrd]))
+ if(Patterns.IsValidIndex(Order[nOrd]) || !bCompatibilityExport)
{
BYTE nOrdval = static_cast<BYTE>(Order[nOrd]);
fwrite(&nOrdval, 1, sizeof(BYTE), f);
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-20 13:04:34 UTC (rev 419)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-21 15:40:57 UTC (rev 420)
@@ -261,6 +261,7 @@
// Pattern Delay
case CMD_S3MCMDEX:
if ((param & 0xF0) == 0x60) { nSpeedCount = param & 0x0F; break; } else
+ if ((param & 0xF0) == 0xA0) { pChn->nOldHiOffset = param & 0x0F; break; } else
if ((param & 0xF0) == 0xB0) { param &= 0x0F; param |= 0x60; }
case CMD_MODCMDEX:
if ((param & 0xF0) == 0xE0) nSpeedCount = (param & 0x0F) * nMusicSpeed; else
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-20 13:04:44
|
Revision: 419
http://modplug.svn.sourceforge.net/modplug/?rev=419&view=rev
Author: saga-games
Date: 2009-11-20 13:04:34 +0000 (Fri, 20 Nov 2009)
Log Message:
-----------
[Fix] Instrument Editor: When pasting envelopes, the enabled and filter flags were lost.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-11-19 21:34:59 UTC (rev 418)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-11-20 13:04:34 UTC (rev 419)
@@ -243,8 +243,8 @@
bool CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel);
bool PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, bool mix, bool ITStyleMix = false, bool PasteFlood = false);
- BOOL CopyEnvelope(UINT nIns, UINT nEnv);
- BOOL PasteEnvelope(UINT nIns, UINT nEnv);
+ bool CopyEnvelope(UINT nIns, enmEnvelopeTypes nEnv);
+ bool PasteEnvelope(UINT nIns, enmEnvelopeTypes nEnv);
LRESULT ActivateView(UINT nIdView, DWORD dwParam);
void UpdateAllViews(CView *pSender, LPARAM lHint=0L, CObject *pHint=NULL);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-19 21:34:59 UTC (rev 418)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-20 13:04:34 UTC (rev 419)
@@ -1403,8 +1403,8 @@
static LPCSTR pszEnvHdr = "Modplug Tracker Envelope\x0D\x0A";
static LPCSTR pszEnvFmt = "%d,%d,%d,%d,%d,%d,%d,%d\x0D\x0A";
-BOOL CModDoc::CopyEnvelope(UINT nIns, UINT nEnv)
-//----------------------------------------------
+bool CModDoc::CopyEnvelope(UINT nIns, enmEnvelopeTypes nEnv)
+//----------------------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
HANDLE hCpy;
@@ -1412,7 +1412,7 @@
MODINSTRUMENT *pIns;
DWORD dwMemSize;
- if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return FALSE;
+ if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return false;
BeginWaitCursor();
pIns = m_SndFile.Instruments[nIns];
@@ -1454,21 +1454,21 @@
CloseClipboard();
}
EndWaitCursor();
- return TRUE;
+ return true;
}
-BOOL CModDoc::PasteEnvelope(UINT nIns, UINT nEnv)
-//-----------------------------------------------
+bool CModDoc::PasteEnvelope(UINT nIns, enmEnvelopeTypes nEnv)
+//-----------------------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
- if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return FALSE;
+ if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return false;
BeginWaitCursor();
if (!pMainFrm->OpenClipboard())
{
EndWaitCursor();
- return FALSE;
+ return false;
}
HGLOBAL hCpy = ::GetClipboardData(CF_TEXT);
LPCSTR p;
@@ -1523,7 +1523,7 @@
pEnv->nLoopStart = loopBegin;
pEnv->nLoopEnd = loopEnd;
pEnv->nReleaseNode = releaseNode;
- pEnv->dwFlags = (bLoop ? ENV_LOOP : 0) | (bSus ? ENV_SUSTAIN : 0) | (bCarry ? ENV_CARRY: 0);
+ pEnv->dwFlags = (pEnv->dwFlags & ~(ENV_LOOP|ENV_SUSTAIN|ENV_CARRY)) | (bLoop ? ENV_LOOP : 0) | (bSus ? ENV_SUSTAIN : 0) | (bCarry ? ENV_CARRY: 0);
int oldn = 0;
for (UINT i=0; i<nPoints; i++)
@@ -1557,7 +1557,7 @@
UpdateAllViews(NULL, (nIns << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
}
EndWaitCursor();
- return TRUE;
+ return true;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-19 21:35:09
|
Revision: 418
http://modplug.svn.sourceforge.net/modplug/?rev=418&view=rev
Author: saga-games
Date: 2009-11-19 21:34:59 +0000 (Thu, 19 Nov 2009)
Log Message:
-----------
[Fix] When moving program files to %APPDATA%, take care of the keyboard settings path in the INI file.
[Ref] Use enum for toolbar image list IDs
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/view_com.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-11-19 21:34:59 UTC (rev 418)
@@ -777,10 +777,10 @@
if ((!m_pModDoc) || (!m_pSndFile)) return TRUE;
m_NoteMap.Init(this);
m_ToolBar.Init();
- m_ToolBar.AddButton(IDC_INSTRUMENT_NEW, 7);
- m_ToolBar.AddButton(IDC_INSTRUMENT_OPEN, 12);
- m_ToolBar.AddButton(IDC_INSTRUMENT_SAVEAS, 13);
- m_ToolBar.AddButton(IDC_INSTRUMENT_PLAY, 14);
+ m_ToolBar.AddButton(IDC_INSTRUMENT_NEW, TIMAGE_INSTR_NEW);
+ m_ToolBar.AddButton(IDC_INSTRUMENT_OPEN, TIMAGE_OPEN);
+ m_ToolBar.AddButton(IDC_INSTRUMENT_SAVEAS, TIMAGE_SAVE);
+ m_ToolBar.AddButton(IDC_INSTRUMENT_PLAY, TIMAGE_PREVIEW);
m_SpinInstrument.SetRange(0, 0);
m_SpinInstrument.EnableWindow(FALSE);
m_EditName.SetLimitText(32);
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-19 21:34:59 UTC (rev 418)
@@ -131,34 +131,31 @@
m_OrderList.Init(rcOrderList, this, m_pModDoc, pMainFrm->GetGUIFont());
// Toolbar buttons
m_ToolBar.Init();
- m_ToolBar.AddButton(IDC_PATTERN_NEW, 0);
- m_ToolBar.AddButton(IDC_PATTERN_PLAY, 2);
- m_ToolBar.AddButton(IDC_PATTERN_PLAYFROMSTART, 3);
- m_ToolBar.AddButton(IDC_PATTERN_STOP, 1);
- m_ToolBar.AddButton(ID_PATTERN_PLAYROW, 28);
- m_ToolBar.AddButton(IDC_PATTERN_RECORD, 4, TBSTYLE_CHECK, ((m_bRecord) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED);
+ m_ToolBar.AddButton(IDC_PATTERN_NEW, TIMAGE_PATTERN_NEW);
+ m_ToolBar.AddButton(IDC_PATTERN_PLAY, TIMAGE_PATTERN_PLAY);
+ m_ToolBar.AddButton(IDC_PATTERN_PLAYFROMSTART, TIMAGE_PATTERN_RESTART);
+ m_ToolBar.AddButton(IDC_PATTERN_STOP, TIMAGE_PATTERN_STOP);
+ m_ToolBar.AddButton(ID_PATTERN_PLAYROW, TIMAGE_PATTERN_PLAYROW);
+ m_ToolBar.AddButton(IDC_PATTERN_RECORD, TIMAGE_PATTERN_RECORD, TBSTYLE_CHECK, ((m_bRecord) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED);
m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP);
- m_ToolBar.AddButton(ID_PATTERN_VUMETERS, 16, TBSTYLE_CHECK, ((m_bVUMeters) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED);
- m_ToolBar.AddButton(ID_VIEWPLUGNAMES, 33, TBSTYLE_CHECK, ((m_bPluginNames) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED); //rewbs.patPlugNames
-// -> CODE#0015
-// -> DESC="channels management dlg"
- m_ToolBar.AddButton(ID_PATTERN_CHANNELMANAGER, 34);
-// -! NEW_FEATURE#0015
+ m_ToolBar.AddButton(ID_PATTERN_VUMETERS, TIMAGE_PATTERN_VUMETERS, TBSTYLE_CHECK, ((m_bVUMeters) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED);
+ m_ToolBar.AddButton(ID_VIEWPLUGNAMES, TIMAGE_PATTERN_PLUGINS, TBSTYLE_CHECK, ((m_bPluginNames) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED); //rewbs.patPlugNames
+ m_ToolBar.AddButton(ID_PATTERN_CHANNELMANAGER, TIMAGE_CHANNELMANAGER);
m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP);
- m_ToolBar.AddButton(ID_PATTERN_MIDIMACRO, 17);
- m_ToolBar.AddButton(ID_PATTERN_CHORDEDIT, 18);
+ m_ToolBar.AddButton(ID_PATTERN_MIDIMACRO, TIMAGE_MACROEDITOR);
+ m_ToolBar.AddButton(ID_PATTERN_CHORDEDIT, TIMAGE_CHORDEDITOR);
m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP);
- m_ToolBar.AddButton(ID_EDIT_UNDO, 26);
- m_ToolBar.AddButton(ID_PATTERN_PROPERTIES, 19);
- m_ToolBar.AddButton(ID_PATTERN_EXPAND, 20);
- m_ToolBar.AddButton(ID_PATTERN_SHRINK, 21);
-// m_ToolBar.AddButton(ID_PATTERN_AMPLIFY, 9);
+ m_ToolBar.AddButton(ID_EDIT_UNDO, TIMAGE_UNDO);
+ m_ToolBar.AddButton(ID_PATTERN_PROPERTIES, TIMAGE_PATTERN_PROPERTIES);
+ m_ToolBar.AddButton(ID_PATTERN_EXPAND, TIMAGE_PATTERN_EXPAND);
+ m_ToolBar.AddButton(ID_PATTERN_SHRINK, TIMAGE_PATTERN_SHRINK);
+ // m_ToolBar.AddButton(ID_PATTERN_AMPLIFY, TIMAGE_SAMPLE_AMPLIFY);
m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP);
- m_ToolBar.AddButton(ID_PATTERNDETAIL_LO, 30, TBSTYLE_CHECK, TBSTATE_ENABLED);
- m_ToolBar.AddButton(ID_PATTERNDETAIL_MED, 31, TBSTYLE_CHECK, TBSTATE_ENABLED);
- m_ToolBar.AddButton(ID_PATTERNDETAIL_HI, 32, TBSTYLE_CHECK, TBSTATE_ENABLED|TBSTATE_CHECKED);
+ m_ToolBar.AddButton(ID_PATTERNDETAIL_LO, TIMAGE_PATTERN_DETAIL_LO, TBSTYLE_CHECK, TBSTATE_ENABLED);
+ m_ToolBar.AddButton(ID_PATTERNDETAIL_MED, TIMAGE_PATTERN_DETAIL_MED, TBSTYLE_CHECK, TBSTATE_ENABLED);
+ m_ToolBar.AddButton(ID_PATTERNDETAIL_HI, TIMAGE_PATTERN_DETAIL_HI, TBSTYLE_CHECK, TBSTATE_ENABLED|TBSTATE_CHECKED);
m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP);
- m_ToolBar.AddButton(ID_OVERFLOWPASTE, 38, TBSTYLE_CHECK, ((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
+ m_ToolBar.AddButton(ID_OVERFLOWPASTE, TIMAGE_PATTERN_OVERFLOWPASTE, TBSTYLE_CHECK, ((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
// Special edit controls -> tab switch to view
m_EditSpacing.SetParent(this);
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-11-19 21:34:59 UTC (rev 418)
@@ -194,21 +194,21 @@
m_ComboZoom.SetCurSel(0);
// File ToolBar
m_ToolBar1.Init();
- m_ToolBar1.AddButton(IDC_SAMPLE_NEW, 6);
- m_ToolBar1.AddButton(IDC_SAMPLE_OPEN, 12);
- m_ToolBar1.AddButton(IDC_SAMPLE_SAVEAS, 13);
+ m_ToolBar1.AddButton(IDC_SAMPLE_NEW, TIMAGE_SAMPLE_NEW);
+ m_ToolBar1.AddButton(IDC_SAMPLE_OPEN, TIMAGE_OPEN);
+ m_ToolBar1.AddButton(IDC_SAMPLE_SAVEAS, TIMAGE_SAVE);
// Edit ToolBar
m_ToolBar2.Init();
- m_ToolBar2.AddButton(IDC_SAMPLE_PLAY, 14);
- m_ToolBar2.AddButton(IDC_SAMPLE_NORMALIZE, 8);
- m_ToolBar2.AddButton(IDC_SAMPLE_AMPLIFY, 9);
- m_ToolBar2.AddButton(IDC_SAMPLE_DCOFFSET, 37);
- m_ToolBar2.AddButton(IDC_SAMPLE_UPSAMPLE, 10);
- m_ToolBar2.AddButton(IDC_SAMPLE_DOWNSAMPLE, 29);
- m_ToolBar2.AddButton(IDC_SAMPLE_REVERSE, 11);
- m_ToolBar2.AddButton(IDC_SAMPLE_SILENCE, 22);
- m_ToolBar2.AddButton(IDC_SAMPLE_INVERT, 35);
- m_ToolBar2.AddButton(IDC_SAMPLE_SIGN_UNSIGN, 36);
+ m_ToolBar2.AddButton(IDC_SAMPLE_PLAY, TIMAGE_PREVIEW);
+ m_ToolBar2.AddButton(IDC_SAMPLE_NORMALIZE, TIMAGE_SAMPLE_NORMALIZE);
+ m_ToolBar2.AddButton(IDC_SAMPLE_AMPLIFY, TIMAGE_SAMPLE_AMPLIFY);
+ m_ToolBar2.AddButton(IDC_SAMPLE_DCOFFSET, TIMAGE_SAMPLE_DCOFFSET);
+ m_ToolBar2.AddButton(IDC_SAMPLE_UPSAMPLE, TIMAGE_SAMPLE_UPSAMPLE);
+ m_ToolBar2.AddButton(IDC_SAMPLE_DOWNSAMPLE, TIMAGE_SAMPLE_DOWNSAMPLE);
+ m_ToolBar2.AddButton(IDC_SAMPLE_REVERSE, TIMAGE_SAMPLE_REVERSE);
+ m_ToolBar2.AddButton(IDC_SAMPLE_SILENCE, TIMAGE_SAMPLE_SILENCE);
+ m_ToolBar2.AddButton(IDC_SAMPLE_INVERT, TIMAGE_SAMPLE_INVERT);
+ m_ToolBar2.AddButton(IDC_SAMPLE_SIGN_UNSIGN, TIMAGE_SAMPLE_UNSIGN);
// Setup Controls
m_EditName.SetLimitText(32);
m_EditFileName.SetLimitText(22);
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-11-19 21:34:59 UTC (rev 418)
@@ -261,6 +261,50 @@
IMAGE_PLUGININSTRUMENT,
};
+
+// Toolbar Image List index
+enum {
+ TIMAGE_PATTERN_NEW=0,
+ TIMAGE_PATTERN_STOP,
+ TIMAGE_PATTERN_PLAY,
+ TIMAGE_PATTERN_RESTART,
+ TIMAGE_PATTERN_RECORD,
+ TIMAGE_MIDI_RECORD, // unused?
+ TIMAGE_SAMPLE_NEW,
+ TIMAGE_INSTR_NEW,
+ TIMAGE_SAMPLE_NORMALIZE,
+ TIMAGE_SAMPLE_AMPLIFY,
+ TIMAGE_SAMPLE_UPSAMPLE,
+ TIMAGE_SAMPLE_REVERSE,
+ TIMAGE_OPEN,
+ TIMAGE_SAVE,
+ TIMAGE_PREVIEW,
+ TIMAGE_PAUSE, // unused?
+ TIMAGE_PATTERN_VUMETERS,
+ TIMAGE_MACROEDITOR,
+ TIMAGE_CHORDEDITOR,
+ TIMAGE_PATTERN_PROPERTIES,
+ TIMAGE_PATTERN_EXPAND,
+ TIMAGE_PATTERN_SHRINK,
+ TIMAGE_SAMPLE_SILENCE,
+ TIMAGE_TAB_SAMPLES,
+ TIMAGE_TAB_INSTRUMENTS,
+ TIMAGE_TAB_PATTERNS,
+ TIMAGE_UNDO,
+ TIMAGE_REDO,
+ TIMAGE_PATTERN_PLAYROW,
+ TIMAGE_SAMPLE_DOWNSAMPLE,
+ TIMAGE_PATTERN_DETAIL_LO,
+ TIMAGE_PATTERN_DETAIL_MED,
+ TIMAGE_PATTERN_DETAIL_HI,
+ TIMAGE_PATTERN_PLUGINS,
+ TIMAGE_CHANNELMANAGER,
+ TIMAGE_SAMPLE_INVERT,
+ TIMAGE_SAMPLE_UNSIGN,
+ TIMAGE_SAMPLE_DCOFFSET,
+ TIMAGE_PATTERN_OVERFLOWPASTE,
+};
+
//////////////////////////////////////////////////////////////////////////
// MPT Hot Keys
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-11-19 21:34:59 UTC (rev 418)
@@ -669,7 +669,8 @@
exit(-1);
}
-void CTrackApp::MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH], TCHAR sNewFileName[_MAX_PATH])
+#ifdef WIN32 // Legacy stuff
+bool 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
@@ -690,8 +691,11 @@
if(PathFileExists(sNewPath) == 0 && PathFileExists(sOldPath) != 0)
{
MoveFile(sOldPath, sNewPath);
+ return true;
}
+ return false;
}
+#endif // WIN32 Legacy Stuff
void CTrackApp::SetupPaths()
@@ -732,18 +736,57 @@
strcat(m_szConfigDirectory, "\\OpenMPT\\");
// Path doesn't exist yet, so it has to be created
+ bool justCreated = false;
if(PathIsDirectory(m_szConfigDirectory) == 0)
{
CreateDirectory(m_szConfigDirectory, 0);
+ justCreated = true;
}
+ #ifdef WIN32 // Legacy stuff
+
+ bool movedKeyboardFiles = false;
// Move files if necessary.
+ movedKeyboardFiles = MoveConfigFile("default.mkb", "", "Keybindings.mkb");
+ movedKeyboardFiles |= MoveConfigFile("Keybindings.mkb");
+
+ // Check the old ini settings
+ if(justCreated && movedKeyboardFiles)
+ {
+ TCHAR szOldPath[_MAX_PATH], szTestPath[_MAX_PATH];
+
+ GetPrivateProfileString("Paths", "Key_Config_File", szOldPath, szOldPath, INIBUFFERSIZE, m_szConfigFileName);
+ _strlwr(szOldPath); // compare all in lower case
+
+ bool overwritePath = false;
+ strcpy(szTestPath, m_szExePath);
+ strcat(szTestPath, "default.mkb");
+ _strlwr(szTestPath);
+ overwritePath = (strcmp(szTestPath, szOldPath) == 0);
+
+ if(overwritePath == false)
+ {
+ strcpy(szTestPath, m_szExePath);
+ strcat(szTestPath, "Keybindings.mkb");
+ _strlwr(szTestPath);
+ overwritePath = (strcmp(szTestPath, szOldPath) == 0);
+ }
+
+ if(overwritePath)
+ {
+ // if old INI entry points to a file that's going to be moved, change it.
+ strcpy(szTestPath, m_szConfigDirectory);
+ strcat(szTestPath, "Keybindings.mkb");
+ WritePrivateProfileString("Paths", "Key_Config_File", szTestPath, m_szConfigFileName);
+ }
+
+ }
+ // Move some more files
MoveConfigFile("mptrack.ini");
MoveConfigFile("plugin.cache");
MoveConfigFile("mpt_intl.ini");
- MoveConfigFile("default.mkb", "", "Keybindings.mkb");
- MoveConfigFile("Keybindings.mkb");
- // TODO - Check the old ini settings here
+
+ #endif // WIN32 Legacy Stuff
}
// Create tunings dir
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-11-19 21:34:59 UTC (rev 418)
@@ -268,7 +268,9 @@
private:
static void LoadRegistryDLS();
- void MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = "");
+ #ifdef WIN32 // Legacy stuff
+ bool MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = "");
+ #endif
};
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-19 21:34:59 UTC (rev 418)
@@ -109,8 +109,8 @@
memset(m_dwNotifyPos, 0, sizeof(m_dwNotifyPos));
memset(m_NcButtonState, 0, sizeof(m_NcButtonState));
m_bmpEnvBar.Create(IDB_ENVTOOLBAR, 20, 0, RGB(192,192,192));
- memset(m_baPlayingNote, 0, sizeof(bool)*NOTE_MAX); //rewbs.customKeys
- m_nPlayingChannel = UINT_MAX; //rewbs.customKeys
+ memset(m_baPlayingNote, 0, sizeof(bool)*NOTE_MAX); //rewbs.customKeys
+ m_nPlayingChannel = CHANNELINDEX_INVALID; //rewbs.customKeys
//rewbs.envRowGrid
m_bGrid=true;
m_bGridForceRedraw=false;
@@ -1105,7 +1105,7 @@
break;
}
memset(m_baPlayingNote, 0, sizeof(bool)*NOTE_MAX); //rewbs.instViewNNA
- m_nPlayingChannel = UINT_MAX; //rewbs.instViewNNA
+ m_nPlayingChannel = CHANNELINDEX_INVALID; //rewbs.instViewNNA
}
} else
if ((pnotify->dwType & dwType) && ((pnotify->dwType & 0xFFFF) == m_nInstrument))
Modified: trunk/OpenMPT/mptrack/view_com.cpp
===================================================================
--- trunk/OpenMPT/mptrack/view_com.cpp 2009-11-12 21:32:08 UTC (rev 417)
+++ trunk/OpenMPT/mptrack/view_com.cpp 2009-11-19 21:34:59 UTC (rev 418)
@@ -138,9 +138,9 @@
m_ItemList.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_SINGLESEL|LVS_EDITLABELS|LVS_NOSORTHEADER, rect, this, IDC_LIST_DETAILS);
m_ItemList.ModifyStyleEx(0, WS_EX_STATICEDGE);
// Add ToolBar Buttons
- m_ToolBar.AddButton(IDC_LIST_SAMPLES, 23);
- m_ToolBar.AddButton(IDC_LIST_INSTRUMENTS, 24);
- //m_ToolBar.AddButton(IDC_LIST_PATTERNS, 25);
+ m_ToolBar.AddButton(IDC_LIST_SAMPLES, TIMAGE_TAB_SAMPLES);
+ m_ToolBar.AddButton(IDC_LIST_INSTRUMENTS, TIMAGE_TAB_INSTRUMENTS);
+ //m_ToolBar.AddButton(IDC_LIST_PATTERNS, TIMAGE_TAB_PATTERNS);
m_ToolBar.SetIndent(4);
UpdateButtonState();
OnUpdate(NULL, HINT_MODTYPE, NULL);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-12 22:29:04
|
Revision: 417
http://modplug.svn.sourceforge.net/modplug/?rev=417&view=rev
Author: saga-games
Date: 2009-11-12 21:32:08 +0000 (Thu, 12 Nov 2009)
Log Message:
-----------
[New] Pattern Editor: The "paste flood" command pastes the clipboard content again and again until it hits the bottom of the pattern (overflow paste will be disabled autmatically if paste flood is used, for obvious reasons)
[Fix] Instrument Editor: Last patch changed semantic of CViewInstrument::EnvGetValue a bit.
[Fix] Further fixes to Invert Loop. Still not perfect.
[Ref] Updated modular code dictionary description.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Undo.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -2345,6 +2345,11 @@
commands[kcNoteFadeOld].isHidden = false;
commands[kcNoteFadeOld].isDummy = false;
+ commands[kcEditPasteFlood].UID = 1793;
+ commands[kcEditPasteFlood].Message = "Paste Flood";
+ commands[kcEditPasteFlood].isHidden = false;
+ commands[kcEditPasteFlood].isDummy = false;
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2009-11-12 21:32:08 UTC (rev 417)
@@ -84,6 +84,7 @@
kcEditPaste,
kcEditMixPaste,
kcEditMixPasteITStyle,
+ kcEditPasteFlood,
kcSwitchOverflowPaste,
kcEditSelectAll,
kcEditFind,
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-11-12 21:32:08 UTC (rev 417)
@@ -240,8 +240,8 @@
BOOL ShrinkPattern(PATTERNINDEX nPattern);
// Copy&Paste
- BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel);
- BOOL PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix=FALSE); //rewbs.mixpaste
+ bool CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel);
+ bool PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, bool mix, bool ITStyleMix = false, bool PasteFlood = false);
BOOL CopyEnvelope(UINT nIns, UINT nEnv);
BOOL PasteEnvelope(UINT nIns, UINT nEnv);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -995,8 +995,8 @@
static LPCSTR lpszClipboardPatternHdr = "ModPlug Tracker %3s\x0D\x0A";
-BOOL CModDoc::CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel)
-//------------------------------------------------------------------------
+bool CModDoc::CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel)
+//--------------------------------------------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
DWORD dwMemSize;
@@ -1004,7 +1004,7 @@
UINT nrows = (dwEndSel >> 16) - (dwBeginSel >> 16) + 1;
UINT ncols = ((dwEndSel & 0xFFFF) >> 3) - ((dwBeginSel & 0xFFFF) >> 3) + 1;
- if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return FALSE;
+ if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return false;
BeginWaitCursor();
dwMemSize = strlen(lpszClipboardPatternHdr) + 1;
dwMemSize += nrows * (ncols * 12 + 2);
@@ -1138,20 +1138,16 @@
CloseClipboard();
}
EndWaitCursor();
- return TRUE;
+ return true;
}
-//rewbs.mixpaste: using eric's method, as it is fat more elegant.
-// -> CODE#0014
-// -> DESC="vst wet/dry slider"
//BOOL CModDoc::PastePattern(UINT nPattern, DWORD dwBeginSel)
-BOOL CModDoc::PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix)
-// -! NEW_FEATURE#0014
-//---------------------------------------------------------
+bool CModDoc::PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, bool mix, bool ITStyleMix, bool PasteFlood)
+//-------------------------------------------------------------------------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
- if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return FALSE;
+ if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return false;
BeginWaitCursor();
if (pMainFrm->OpenClipboard())
{
@@ -1168,11 +1164,11 @@
UINT col;
bool bS3MCommands = false, bOk = false;
MODTYPE origFormat = MOD_TYPE_IT;
- UINT len = 0;
+ UINT len = 0, startLen;
MODCOMMAND origModCmd;
ORDERINDEX oCurrentOrder; //jojo.echopaste
- ROWINDEX rTemp;
+ ROWINDEX rTemp, startRow;
PATTERNINDEX pTemp;
GetEditPosition(rTemp, pTemp, oCurrentOrder);
@@ -1199,15 +1195,24 @@
bOk = true;
GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
+ startLen = len;
+ startRow = nrow;
- while ((nrow < m_SndFile.PatternSize[nPattern]) && (len + 11 < dwMemSize))
+ while ((nrow < m_SndFile.PatternSize[nPattern]))
{
- // Search for column separator
- while (p[len] != '|')
+ // Search for column separator or end of paste data
+ while ((len + 11 >= dwMemSize) || p[len] != '|')
{
- if (len + 11 >= dwMemSize) goto PasteDone;
- if (!p[len]) goto PasteDone;
- len++;
+ if (len + 11 >= dwMemSize || !p[len])
+ {
+ if((PasteFlood == true) && (nrow != startRow)) // prevent infinite loop with malformed clipboard data
+ len = startLen; // paste from beginning
+ else
+ goto PasteDone;
+ } else
+ {
+ len++;
+ }
}
col = ncol;
// Paste columns
@@ -1359,8 +1364,9 @@
m += m_SndFile.m_nChannels;
nrow++;
- //jojo.echopaste
- if(CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE)
+ // Overflow paste. Continue pasting in next pattern if enabled.
+ // If Paste Flood is enabled, this won't be called due to obvious reasons.
+ if((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) && !PasteFlood)
{
while(nrow >= m_SndFile.PatternSize[nPattern])
{
@@ -1387,7 +1393,7 @@
CloseClipboard();
}
EndWaitCursor();
- return TRUE;
+ return true;
}
Modified: trunk/OpenMPT/mptrack/Undo.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Undo.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/Undo.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -31,6 +31,12 @@
// Create undo point.
+// Parameter list:
+// - pattern: Pattern of which an undo step should be created from.
+// - x: first channel
+// - y: first row
+// - cx: last channel
+// - cy: last row
bool CPatternUndo::PrepareUndo(PATTERNINDEX pattern, UINT x, UINT y, UINT cx, UINT cy)
//------------------------------------------------------------------------------------
{
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -246,7 +246,7 @@
{
INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
if(envelope == nullptr) return 0;
- if(nPoint < (int)envelope->nNodes) return envelope->Values[nPoint];
+ if(nPoint >= 0 && nPoint < (int)envelope->nNodes) return envelope->Values[nPoint];
return 0;
}
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -53,7 +53,8 @@
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
- ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) //rewbs.mixPaste
+ ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste)
+ ON_COMMAND(ID_EDIT_PASTEFLOOD, OnEditPasteFlood)
ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll)
ON_COMMAND(ID_EDIT_SELECTCOLUMN,OnEditSelectColumn)
ON_COMMAND(ID_EDIT_SELECTCOLUMN2,OnSelectCurrentColumn)
@@ -1004,10 +1005,24 @@
}
}
+
//end rewbs.mixPaste
+void CViewPattern::OnEditPasteFlood()
+//-----------------------------------
+{
+ CModDoc *pModDoc = GetDocument();
+ if (pModDoc && IsEditingEnabled_bmsg())
+ {
+ pModDoc->PastePattern(m_nPattern, m_dwBeginSel, false, false, true);
+ InvalidatePattern(FALSE);
+ SetFocus();
+ }
+}
+
+
void CViewPattern::OnLButtonDown(UINT nFlags, CPoint point)
//--------------------------------------------------
{
@@ -3613,6 +3628,7 @@
case kcEditPaste: OnEditPaste(); return wParam;
case kcEditMixPaste: OnEditMixPaste(); return wParam;
case kcEditMixPasteITStyle: OnEditMixPasteITStyle(); return wParam;
+ case kcEditPasteFlood: OnEditPasteFlood(); return wParam;
case kcEditSelectAll: OnEditSelectAll(); return wParam;
case kcTogglePluginEditor: TogglePluginEditor((m_dwCursor & 0xFFFF) >> 3); return wParam;
case kcToggleFollowSong: SendCtrlMessage(CTRLMSG_PAT_FOLLOWSONG); return wParam;
@@ -4824,6 +4840,7 @@
AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY, "Copy\t" + ih->GetKeyTextFromCommand(kcEditCopy));
AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTE, "Paste\t" + ih->GetKeyTextFromCommand(kcEditPaste));
AppendMenu(hMenu, MF_STRING, ID_EDIT_MIXPASTE, "Mix Paste\t" + ih->GetKeyTextFromCommand(kcEditMixPaste));
+ AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTEFLOOD, "Paste Flood\t" + ih->GetKeyTextFromCommand(kcEditPasteFlood));
DWORD greyed = pModDoc->GetPatternUndo()->CanUndo()?FALSE:MF_GRAYED;
if (!greyed || !(CMainFrame::m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) {
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/View_pat.h 2009-11-12 21:32:08 UTC (rev 417)
@@ -230,6 +230,7 @@
afx_msg void OnEditPaste();
afx_msg void OnEditMixPaste(); //rewbs.mixPaste
afx_msg void OnEditMixPasteITStyle(); //rewbs.mixPaste
+ afx_msg void OnEditPasteFlood();
afx_msg void OnClearSelection(bool ITStyle=false, RowMask sb = DefaultRowMask); //rewbs.customKeys
afx_msg void OnGrowSelection(); //rewbs.customKeys
afx_msg void OnShrinkSelection(); //rewbs.customKeys
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/mptrack/resource.h 2009-11-12 21:32:08 UTC (rev 417)
@@ -1152,6 +1152,7 @@
#define ID_ORDERLIST_EDIT_CUT 59232
#define ID_ORDERLIST_EDIT_PASTE 59233
#define ID_CHANNEL_RENAME 59234
+#define ID_EDIT_PASTEFLOOD 59235
// Next default values for new objects
//
@@ -1159,7 +1160,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 523
-#define _APS_NEXT_COMMAND_VALUE 59235
+#define _APS_NEXT_COMMAND_VALUE 59236
#define _APS_NEXT_CONTROL_VALUE 2412
#define _APS_NEXT_SYMED_VALUE 901
#endif
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -2530,7 +2530,6 @@
if((m_nType & MOD_TYPE_MOD) != 0) // MOD: Invert Loop
{
pChn->nEFxSpeed = param;
- pChn->pEFxSample = pChn->pModSample;
if(m_dwSongFlags & SONG_FIRSTTICK) InvertLoop(pChn);
}
else // XM: Set Active Midi Macro
@@ -2701,7 +2700,7 @@
if((m_nType & MOD_TYPE_MOD) == 0 || pChn->nEFxSpeed == 0) return;
// we obviously also need a sample for this
- MODSAMPLE *pModSample = pChn->pEFxSample;
+ MODSAMPLE *pModSample = pChn->pModSample;
if(pModSample == nullptr || pModSample->pSample == nullptr || !(pModSample->uFlags & CHN_LOOP)) return;
pChn->nEFxDelay += ModEFxTable[pChn->nEFxSpeed & 0x0F];
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-12 21:32:08 UTC (rev 417)
@@ -127,8 +127,8 @@
- use 'VE[.' for VolEnv.Values[MAX_ENVPOINTS]
-* In use CODE tag dictionnary (alphabetical order): [ see in Sndfile.cpp ]
---------------------------------------------------------------------------
+* In use CODE tag dictionary (alphabetical order): [ see in Sndfile.cpp ]
+-------------------------------------------------------------------------
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! SECTION TO BE UPDATED !!!
@@ -209,6 +209,9 @@
PERN PitchEnv.nReleaseNode
AERN PanEnv.nReleaseNode
VERN VolEnv.nReleaseNode
+PFLG PitchEnv.dwFlag
+AFLG PanEnv.dwFlags
+VFLG VolEnv.dwFlags
-----------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------*/
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-11-07 23:38:07 UTC (rev 416)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-11-12 21:32:08 UTC (rev 417)
@@ -205,7 +205,6 @@
LONG nRestorePanOnNewNote; //If > 0, nPan should be set to nRestorePanOnNewNote - 1 on new note. Used to recover from panswing.
UINT nOldGlobalVolSlide;
DWORD nEFxOffset; // offset memory for Invert Loop (EFx, .MOD only)
- MODSAMPLE *pEFxSample; // sample memory for Invert Loop (EFx, .MOD only)
// 8-bit members
BYTE nRestoreResonanceOnNewNote; //Like above
BYTE nRestoreCutoffOnNewNote; //Like above
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-07 23:38:23
|
Revision: 416
http://modplug.svn.sourceforge.net/modplug/?rev=416&view=rev
Author: saga-games
Date: 2009-11-07 23:38:07 +0000 (Sat, 07 Nov 2009)
Log Message:
-----------
[Fix] A wrong #define was used in the plugin finding algorithm which broke plugin handling for instruments in some cases in the last revision.
[Fix] Various fixes to the MDL loader (taken from Schism Tracker)
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mdl.cpp
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-11-07 21:40:01 UTC (rev 415)
+++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-11-07 23:38:07 UTC (rev 416)
@@ -80,8 +80,30 @@
}
break;
case 0x0F: command = CMD_SPEED; break;
- case 0x10: if ((param & 0xF0) != 0xE0) { command = CMD_VOLUMESLIDE; if ((param & 0xF0) == 0xF0) param = ((param << 4) | 0x0F); else param >>= 2; } break;
- case 0x20: if ((param & 0xF0) != 0xE0) { command = CMD_VOLUMESLIDE; if ((param & 0xF0) != 0xF0) param >>= 2; } break;
+ case 0x10:
+ if ((param & 0xF0) != 0xE0) {
+ command = CMD_VOLUMESLIDE;
+ if ((param & 0xF0) == 0xF0) {
+ param = ((param << 4) | 0x0F);
+ } else {
+ param >>= 2;
+ if (param > 0xF)
+ param = 0xF;
+ param <<= 4;
+ }
+ }
+ break;
+ case 0x20:
+ if ((param & 0xF0) != 0xE0) {
+ command = CMD_VOLUMESLIDE;
+ if ((param & 0xF0) != 0xF0) {
+ param >>= 2;
+ if (param > 0xF)
+ param = 0xF;
+ }
+ }
+ break;
+
case 0x30: command = CMD_RETRIG; break;
case 0x40: command = CMD_TREMOLO; break;
case 0x50: command = CMD_TREMOR; break;
@@ -392,6 +414,10 @@
pIns->PanEnv.dwFlags |= ENV_ENABLED;
inspanenv[nins] = (ps[5] & 0x3F) + 1;
}
+
+ // taken from load_xm.cpp - seems to fix wakingup.mdl
+ if (!(pIns->VolEnv.dwFlags & ENV_ENABLED) && !pIns->nFadeOut)
+ pIns->nFadeOut = 8192;
}
}
dwPos += 34 + 14*lpStream[dwPos+1];
@@ -457,7 +483,6 @@
pSmp->nLoopStart = *((DWORD *)(p+4));
pSmp->nLoopEnd = pSmp->nLoopStart + *((DWORD *)(p+8));
if (pSmp->nLoopEnd > pSmp->nLoopStart) pSmp->uFlags |= CHN_LOOP;
- pSmp->nVolume = 256;
pSmp->nGlobalVol = 64;
if (p[13] & 0x01)
{
Modified: trunk/OpenMPT/soundlib/Snd_defs.h
===================================================================
--- trunk/OpenMPT/soundlib/Snd_defs.h 2009-11-07 21:40:01 UTC (rev 415)
+++ trunk/OpenMPT/soundlib/Snd_defs.h 2009-11-07 23:38:07 UTC (rev 416)
@@ -130,7 +130,7 @@
#define CHN_PINGPONGSUSTAIN 0x10
#define CHN_PANNING 0x20
#define CHN_STEREO 0x40
-#define CHN_PINGPONGFLAG 0x80 //When flag is on, bidiloop is processed backwards?
+#define CHN_PINGPONGFLAG 0x80 //When flag is on, sample is processed backwards
// Bits 8-31: Channel Flags
#define CHN_MUTE 0x100
#define CHN_KEYOFF 0x200
@@ -157,10 +157,10 @@
#define CHN_SYNCMUTE 0x40000000
// instrument envelope-specific flags
-#define ENV_LOOP 0x01 // env loop
-#define ENV_SUSTAIN 0x02 // env sustain
-#define ENV_CARRY 0x04 // env carry
-#define ENV_ENABLED 0x08 // env is enabled
+#define ENV_ENABLED 0x01 // env is enabled
+#define ENV_LOOP 0x02 // env loop
+#define ENV_SUSTAIN 0x04 // env sustain
+#define ENV_CARRY 0x08 // env carry
#define ENV_FILTER 0x10 // filter env enabled (this has to be combined with ENV_ENABLED in the pitch envelope's flags)
// instrument-specific flags
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-07 21:40:01 UTC (rev 415)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-07 23:38:07 UTC (rev 416)
@@ -3754,7 +3754,7 @@
UINT nPlugin=0;
if (pChn && pChn->pModInstrument) {
- if (respectMutes && pChn->pModSample && pChn->pModSample->uFlags&INS_MUTE) {
+ if (respectMutes && pChn->pModSample && (pChn->pModSample->uFlags & CHN_MUTE)) {
nPlugin = 0;
} else {
nPlugin = pChn->pModInstrument->nMixPlug;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-07 21:40:15
|
Revision: 415
http://modplug.svn.sourceforge.net/modplug/?rev=415&view=rev
Author: saga-games
Date: 2009-11-07 21:40:01 +0000 (Sat, 07 Nov 2009)
Log Message:
-----------
[Mod] Envelope editor: Middle line is also shown for volume envelope.
[Ref] Envelope flags (enabled/loop/sustain/carry/filter) are now stored in the INSTRUMENTENVELOPE struct for ease of use. I did some tests, but I still hope this didn't break anything...
[Ref] A lot of code cleanup and optimization due to the change above.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Childfrm.h
trunk/OpenMPT/mptrack/CleanupSong.cpp
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/mptrack/view_com.cpp
trunk/OpenMPT/soundlib/Dlsbank.cpp
trunk/OpenMPT/soundlib/LOAD_DBM.CPP
trunk/OpenMPT/soundlib/Load_ams.cpp
trunk/OpenMPT/soundlib/Load_imf.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mdl.cpp
trunk/OpenMPT/soundlib/Load_mid.cpp
trunk/OpenMPT/soundlib/Load_mt2.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_defs.h
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/Childfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Childfrm.h 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/Childfrm.h 2009-11-07 21:40:01 UTC (rev 415)
@@ -48,7 +48,7 @@
typedef struct INSTRUMENTVIEWSTATE
{
DWORD cbStruct;
- DWORD nEnv;
+ enmEnvelopeTypes nEnv;
bool bGrid;
} INSTRUMENTVIEWSTATE;
Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -862,21 +862,13 @@
pSndFile->Instruments[i]->nFadeOut = 256;
pSndFile->Instruments[i]->nGlobalVol = 64;
pSndFile->Instruments[i]->nPan = 128;
- pSndFile->Instruments[i]->dwFlags &= ~ENV_SETPANNING;
+ pSndFile->Instruments[i]->dwFlags &= ~INS_SETPANNING;
pSndFile->Instruments[i]->nMixPlug = 0;
pSndFile->Instruments[i]->nVolSwing = 0;
pSndFile->Instruments[i]->nPanSwing = 0;
pSndFile->Instruments[i]->nCutSwing = 0;
pSndFile->Instruments[i]->nResSwing = 0;
-
- //might be a good idea to leave those enabled...
- /*
- pSndFile->Instruments[i]->dwFlags &= ~ENV_VOLUME;
- pSndFile->Instruments[i]->dwFlags &= ~ENV_PANNING;
- pSndFile->Instruments[i]->dwFlags &= ~ENV_PITCH;
- pSndFile->Instruments[i]->dwFlags &= ~ENV_FILTER;
- */
}
// reset samples
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -1101,7 +1101,7 @@
SetDlgItemInt(IDC_EDIT8, pIns->nGlobalVol);
// Panning
SetDlgItemInt(IDC_EDIT9, pIns->nPan);
- m_CheckPanning.SetCheck((pIns->dwFlags & ENV_SETPANNING) ? TRUE : FALSE);
+ m_CheckPanning.SetCheck((pIns->dwFlags & INS_SETPANNING) ? TRUE : FALSE);
// Midi
if (pIns->nMidiProgram>0 && pIns->nMidiProgram<=128)
SetDlgItemInt(IDC_EDIT10, pIns->nMidiProgram);
@@ -1774,8 +1774,8 @@
{
const BOOL b = m_CheckPanning.GetCheck();
- if (b) pIns->dwFlags |= ENV_SETPANNING;
- else pIns->dwFlags &= ~ENV_SETPANNING;
+ if (b) pIns->dwFlags |= INS_SETPANNING;
+ else pIns->dwFlags &= ~INS_SETPANNING;
if(b && m_pSndFile->GetType() & MOD_TYPE_IT|MOD_TYPE_MPT)
{
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -1189,8 +1189,8 @@
//--------------------------------------------------------------
{
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;
+ if (bMute) m_SndFile.Instruments[nInstr]->dwFlags |= INS_MUTE;
+ else m_SndFile.Instruments[nInstr]->dwFlags &= ~INS_MUTE;
return true;
}
@@ -1267,7 +1267,7 @@
//-----------------------------------------------------------
{
if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false;
- return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? true : false;
+ return (m_SndFile.Instruments[nInstr]->dwFlags & INS_MUTE) ? true : false;
}
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -283,7 +283,10 @@
pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart;
bBrokenSustainLoop = true;
}
- pIns->dwFlags &= ~(ENV_SETPANNING|ENV_VOLCARRY|ENV_PANCARRY|ENV_PITCHCARRY|ENV_FILTER|ENV_PITCH);
+ pIns->VolEnv.dwFlags &= ~ENV_CARRY;
+ pIns->PanEnv.dwFlags &= ~ENV_CARRY;
+ pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER);
+ pIns->dwFlags &= ~INS_SETPANNING;
pIns->nIFC &= 0x7F;
pIns->nIFR &= 0x7F;
}
@@ -1402,7 +1405,6 @@
CHAR s[4096];
MODINSTRUMENT *pIns;
DWORD dwMemSize;
- UINT bSus, bLoop, bCarry;
if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return FALSE;
BeginWaitCursor();
@@ -1414,27 +1416,17 @@
{
case ENV_PANNING:
pEnv = &pIns->PanEnv;
- bLoop = (pIns->dwFlags & ENV_PANLOOP) ? 1 : 0;
- bSus = (pIns->dwFlags & ENV_PANSUSTAIN) ? 1 : 0;
- bCarry = (pIns->dwFlags & ENV_PANCARRY) ? 1 : 0;
break;
-
case ENV_PITCH:
pEnv = &pIns->PitchEnv;
- bLoop = (pIns->dwFlags & ENV_PITCHLOOP) ? 1 : 0;
- bSus = (pIns->dwFlags & ENV_PITCHSUSTAIN) ? 1 : 0;
- bCarry = (pIns->dwFlags & ENV_PITCHCARRY) ? 1 : 0;
break;
-
default:
pEnv = &pIns->VolEnv;
- bLoop = (pIns->dwFlags & ENV_VOLLOOP) ? 1 : 0;
- bSus = (pIns->dwFlags & ENV_VOLSUSTAIN) ? 1 : 0;
- bCarry = (pIns->dwFlags & ENV_VOLCARRY) ? 1 : 0;
break;
}
+
strcpy(s, pszEnvHdr);
- wsprintf(s + strlen(s), pszEnvFmt, pEnv->nNodes, pEnv->nSustainStart, pEnv->nSustainEnd, pEnv->nLoopStart, pEnv->nLoopEnd, bSus, bLoop, bCarry);
+ wsprintf(s + strlen(s), pszEnvFmt, pEnv->nNodes, pEnv->nSustainStart, pEnv->nSustainEnd, pEnv->nLoopStart, pEnv->nLoopEnd, (pEnv->dwFlags & ENV_SUSTAIN) ? 1 : 0, (pEnv->dwFlags & ENV_LOOP) ? 1 : 0, (pEnv->dwFlags & ENV_CARRY) ? 1 : 0);
for (UINT i = 0; i < pEnv->nNodes; i++)
{
if (strlen(s) >= sizeof(s)-32) break;
@@ -1511,26 +1503,12 @@
{
case ENV_PANNING:
pEnv = &pIns->PanEnv;
- pIns->dwFlags &= ~(ENV_PANLOOP|ENV_PANSUSTAIN|ENV_PANCARRY);
- if (bLoop) pIns->dwFlags |= ENV_PANLOOP;
- if (bSus) pIns->dwFlags |= ENV_PANSUSTAIN;
- if (bCarry) pIns->dwFlags |= ENV_PANCARRY;
break;
-
case ENV_PITCH:
pEnv = &pIns->PitchEnv;
- pIns->dwFlags &= ~(ENV_PITCHLOOP|ENV_PITCHSUSTAIN|ENV_PITCHCARRY);
- if (bLoop) pIns->dwFlags |= ENV_PITCHLOOP;
- if (bSus) pIns->dwFlags |= ENV_PITCHSUSTAIN;
- if (bCarry) pIns->dwFlags |= ENV_PITCHCARRY;
break;
-
default:
pEnv = &pIns->VolEnv;
- pIns->dwFlags &= ~(ENV_VOLLOOP|ENV_VOLSUSTAIN|ENV_VOLCARRY);
- if (bLoop) pIns->dwFlags |= ENV_VOLLOOP;
- if (bSus) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (bCarry) pIns->dwFlags |= ENV_VOLCARRY;
break;
}
pEnv->nNodes = nPoints;
@@ -1539,6 +1517,7 @@
pEnv->nLoopStart = loopBegin;
pEnv->nLoopEnd = loopEnd;
pEnv->nReleaseNode = releaseNode;
+ pEnv->dwFlags = (bLoop ? ENV_LOOP : 0) | (bSus ? ENV_SUSTAIN : 0) | (bCarry ? ENV_CARRY: 0);
int oldn = 0;
for (UINT i=0; i<nPoints; i++)
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -152,8 +152,8 @@
}
-BOOL CViewInstrument::SetCurrentInstrument(INSTRUMENTINDEX nIns, UINT nEnv)
-//-------------------------------------------------------------------------
+BOOL CViewInstrument::SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes nEnv)
+//-------------------------------------------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
DWORD dwNotify;
@@ -244,27 +244,9 @@
UINT CViewInstrument::EnvGetValue(int nPoint) const
//-------------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if ((pIns) && (nPoint >= 0))
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (nPoint < (int)pIns->VolEnv.nNodes) return pIns->VolEnv.Values[nPoint];
- break;
- case ENV_PANNING:
- if (nPoint < (int)pIns->PanEnv.nNodes) return pIns->PanEnv.Values[nPoint];
- break;
- case ENV_PITCH:
- if (nPoint < (int)pIns->PitchEnv.nNodes) return pIns->PitchEnv.Values[nPoint];
- break;
- }
- }
- }
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ if(nPoint < (int)envelope->nNodes) return envelope->Values[nPoint];
return 0;
}
@@ -272,54 +254,39 @@
bool CViewInstrument::EnvSetValue(int nPoint, int nTick, int nValue)
//------------------------------------------------------------------
{
- bool bOk = false;
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if ((pIns) && (nPoint >= 0))
- {
- LPWORD pPoints = NULL;
- LPBYTE pData = NULL;
- UINT maxpoints = 0;
+ if(nPoint < 0) return false;
- INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
- if(envelope == nullptr) return false;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
- maxpoints = envelope->nNodes;
- pPoints = envelope->Ticks;
- pData = envelope->Values;
-
- if (!nPoint) nTick = 0;
- if ((nPoint < (int)maxpoints) && (pPoints) && (pData))
+ bool bOK = false;
+ if (!nPoint) nTick = 0;
+ if (nPoint < (int)envelope->nNodes)
+ {
+ if (nTick >= 0)
+ {
+ int mintick = (nPoint) ? envelope->Ticks[nPoint-1] : 0;
+ int maxtick = envelope->Ticks[nPoint+1];
+ if (nPoint + 1 == (int)envelope->nNodes) maxtick = 16383;
+ if (nTick < mintick) nTick = mintick;
+ if (nTick > maxtick) nTick = maxtick;
+ if (nTick != envelope->Ticks[nPoint])
{
- if (nTick >= 0)
- {
- int mintick = (nPoint) ? pPoints[nPoint-1] : 0;
- int maxtick = pPoints[nPoint+1];
- if (nPoint+1 == (int)maxpoints) maxtick = 16383;
- if (nTick < mintick) nTick = mintick;
- if (nTick > maxtick) nTick = maxtick;
- if (nTick != pPoints[nPoint])
- {
- pPoints[nPoint] = (WORD)nTick;
- bOk = true;
- }
- }
- if (nValue >= 0)
- {
- if (nValue > 64) nValue = 64;
- if (nValue != pData[nPoint])
- {
- pData[nPoint] = (BYTE)nValue;
- bOk = true;
- }
- }
+ envelope->Ticks[nPoint] = (WORD)nTick;
+ bOK = true;
}
}
+ if (nValue >= 0)
+ {
+ if (nValue > 64) nValue = 64;
+ if (nValue != envelope->Values[nPoint])
+ {
+ envelope->Values[nPoint] = (BYTE)nValue;
+ bOK = true;
+ }
+ }
}
- return bOk;
+ return bOK;
}
@@ -341,90 +308,16 @@
}
-bool CViewInstrument::EnvGetLoop() const
-//--------------------------------------
+// Return if an envelope flag is set.
+bool CViewInstrument::EnvGetFlag(const DWORD dwFlag) const
+//--------------------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (pIns->dwFlags & ENV_VOLLOOP) return true;
- break;
- case ENV_PANNING:
- if (pIns->dwFlags & ENV_PANLOOP) return true;
- break;
- case ENV_PITCH:
- if (pIns->dwFlags & ENV_PITCHLOOP) return true;
- break;
- }
- }
- }
+ INSTRUMENTENVELOPE *pEnv = GetEnvelopePtr();
+ if(pEnv != nullptr && pEnv->dwFlags & dwFlag) return true;
return false;
}
-bool CViewInstrument::EnvGetSustain() const
-//-----------------------------------------
-{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (pIns->dwFlags & ENV_VOLSUSTAIN) return true;
- break;
- case ENV_PANNING:
- if (pIns->dwFlags & ENV_PANSUSTAIN) return true;
- break;
- case ENV_PITCH:
- if (pIns->dwFlags & ENV_PITCHSUSTAIN) return true;
- break;
- }
- }
- }
- return false;
-}
-
-
-bool CViewInstrument::EnvGetCarry() const
-//---------------------------------------
-{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (pIns->dwFlags & ENV_VOLCARRY) return true;
- break;
- case ENV_PANNING:
- if (pIns->dwFlags & ENV_PANCARRY) return true;
- break;
- case ENV_PITCH:
- if (pIns->dwFlags & ENV_PITCHCARRY) return true;
- break;
- }
- }
- }
- return false;
-}
-
-
UINT CViewInstrument::EnvGetLoopStart() const
//-------------------------------------------
{
@@ -469,7 +362,7 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return (pIns->dwFlags & ENV_VOLUME) ? true : false;
+ if (pIns) return (pIns->VolEnv.dwFlags & ENV_ENABLED) ? true : false;
}
return false;
}
@@ -483,7 +376,7 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return (pIns->dwFlags & ENV_PANNING) ? true : false;
+ if (pIns) return (pIns->PanEnv.dwFlags & ENV_ENABLED) ? true : false;
}
return false;
}
@@ -497,7 +390,7 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == ENV_PITCH) ? true : false;
+ if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == ENV_ENABLED) ? true : false;
}
return false;
}
@@ -511,7 +404,7 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == (ENV_PITCH|ENV_FILTER)) ? true : false;
+ if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == (ENV_ENABLED|ENV_FILTER)) ? true : false;
}
return false;
}
@@ -599,120 +492,57 @@
}
-bool CViewInstrument::EnvSetLoop(bool bLoop)
-//------------------------------------------
+// Enable or disable a flag of the current envelope
+bool CViewInstrument::EnvSetFlag(const DWORD dwFlag, const bool bEnable) const
+//----------------------------------------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+ if(bEnable)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
+ if(!(envelope->dwFlags & dwFlag))
{
- DWORD dwMask = 0;
- switch(m_nEnv)
- {
- case ENV_VOLUME: dwMask = ENV_VOLLOOP; break;
- case ENV_PANNING: dwMask = ENV_PANLOOP; break;
- case ENV_PITCH: dwMask = ENV_PITCHLOOP; break;
- }
- if (!dwMask) return false;
- if (bLoop)
- {
- if (!(pIns->dwFlags & dwMask))
- {
- pIns->dwFlags |= dwMask;
- return true;
- }
- } else
- {
- if (pIns->dwFlags & dwMask)
- {
- pIns->dwFlags &= ~dwMask;
- return true;
- }
- }
+ envelope->dwFlags |= dwFlag;
+ return true;
}
+ } else
+ {
+ if(envelope->dwFlags & dwFlag)
+ {
+ envelope->dwFlags &= ~dwFlag;
+ return true;
+ }
}
return false;
}
-bool CViewInstrument::EnvSetSustain(bool bSustain)
-//------------------------------------------------
+bool CViewInstrument::EnvToggleEnv(INSTRUMENTENVELOPE *pEnv, CSoundFile *pSndFile, MODINSTRUMENT *pIns, bool bEnable, BYTE cDefaultValue, DWORD dwChanFlag, DWORD dwExtraFlags)
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
+ if(pEnv == nullptr) return false;
+
+ if (bEnable)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
+ pEnv->dwFlags |= (ENV_ENABLED|dwExtraFlags);
+ if (!pEnv->nNodes)
{
- DWORD dwMask = 0;
- switch(m_nEnv)
- {
- case ENV_VOLUME: dwMask = ENV_VOLSUSTAIN; break;
- case ENV_PANNING: dwMask = ENV_PANSUSTAIN; break;
- case ENV_PITCH: dwMask = ENV_PITCHSUSTAIN; break;
- }
- if (!dwMask) return false;
- if (bSustain)
- {
- if (!(pIns->dwFlags & dwMask))
- {
- pIns->dwFlags |= dwMask;
- return true;
- }
- } else
- {
- if (pIns->dwFlags & dwMask)
- {
- pIns->dwFlags &= ~dwMask;
- return true;
- }
- }
+ pEnv->Values[0] = pEnv->Values[1] = cDefaultValue;
+ pEnv->Ticks[0] = 0;
+ pEnv->Ticks[1] = 10;
+ pEnv->nNodes = 2;
+ InvalidateRect(NULL, FALSE);
}
- }
- return false;
-}
-
-
-bool CViewInstrument::EnvSetCarry(bool bCarry)
-//--------------------------------------------
-{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
+ } else
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
+ pEnv->dwFlags &= ~(ENV_ENABLED|dwExtraFlags);
+ for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
{
- DWORD dwMask = 0;
- switch(m_nEnv)
- {
- case ENV_VOLUME: dwMask = ENV_VOLCARRY; break;
- case ENV_PANNING: dwMask = ENV_PANCARRY; break;
- case ENV_PITCH: dwMask = ENV_PITCHCARRY; break;
- }
- if (!dwMask) return false;
- if (bCarry)
- {
- if (!(pIns->dwFlags & dwMask))
- {
- pIns->dwFlags |= dwMask;
- return true;
- }
- } else
- {
- if (pIns->dwFlags & dwMask)
- {
- pIns->dwFlags &= ~dwMask;
- return true;
- }
- }
+ if(pSndFile->Chn[nChn].pModInstrument == pIns)
+ pSndFile->Chn[nChn].dwFlags &= ~dwChanFlag;
}
}
- return false;
+ return true;
}
@@ -720,37 +550,13 @@
//----------------------------------------------
{
CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- if (bEnable)
- {
- pIns->dwFlags |= ENV_VOLUME;
- if (!pIns->VolEnv.nNodes)
- {
- pIns->VolEnv.Values[0] = 64;
- pIns->VolEnv.Values[1] = 64;
- pIns->VolEnv.Ticks[0] = 0;
- pIns->VolEnv.Ticks[1] = 10;
- pIns->VolEnv.nNodes = 2;
- InvalidateRect(NULL, FALSE);
- }
- } else
- {
- pIns->dwFlags &= ~ENV_VOLUME;
- for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
- {
- if(pSndFile->Chn[nChn].pModInstrument == pIns)
- pSndFile->Chn[nChn].dwFlags &= ~CHN_VOLENV;
- }
- }
- return true;
- }
- }
- return false;
+ if(pModDoc == nullptr) return false;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if(pIns == nullptr) return false;
+
+ return EnvToggleEnv(&pIns->VolEnv, pSndFile, pIns, bEnable, 64, CHN_VOLENV);
}
@@ -758,37 +564,13 @@
//----------------------------------------------
{
CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- if (bEnable)
- {
- pIns->dwFlags |= ENV_PANNING;
- if (!pIns->PanEnv.nNodes)
- {
- pIns->PanEnv.Values[0] = 32;
- pIns->PanEnv.Values[1] = 32;
- pIns->PanEnv.Ticks[0] = 0;
- pIns->PanEnv.Ticks[1] = 10;
- pIns->PanEnv.nNodes = 2;
- InvalidateRect(NULL, FALSE);
- }
- } else
- {
- pIns->dwFlags &= ~ENV_PANNING;
- for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
- {
- if(pSndFile->Chn[nChn].pModInstrument == pIns)
- pSndFile->Chn[nChn].dwFlags &= ~CHN_PANENV;
- }
- }
- return true;
- }
- }
- return false;
+ if(pModDoc == nullptr) return false;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if(pIns == nullptr) return false;
+
+ return EnvToggleEnv(&pIns->PanEnv, pSndFile, pIns, bEnable, 32, CHN_PANENV);
}
@@ -796,38 +578,14 @@
//------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- if ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
- {
- pIns->dwFlags |= ENV_PITCH;
- pIns->dwFlags &= ~ENV_FILTER;
- if (!pIns->PitchEnv.nNodes)
- {
- pIns->PitchEnv.Values[0] = 32;
- pIns->PitchEnv.Values[1] = 32;
- pIns->PitchEnv.Ticks[0] = 0;
- pIns->PitchEnv.Ticks[1] = 10;
- pIns->PitchEnv.nNodes = 2;
- InvalidateRect(NULL, FALSE);
- }
- } else
- {
- pIns->dwFlags &= ~(ENV_PITCH|ENV_FILTER);
- for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
- {
- if(pSndFile->Chn[nChn].pModInstrument == pIns)
- pSndFile->Chn[nChn].dwFlags &= ~CHN_PITCHENV;
- }
- }
- return true;
- }
- }
- return false;
+ if(pModDoc == nullptr) return false;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if(pIns == nullptr) return false;
+
+ pIns->PitchEnv.dwFlags &= ~ENV_FILTER;
+ return EnvToggleEnv(&pIns->PitchEnv, pSndFile, pIns, bEnable, 32, CHN_PITCHENV);
}
@@ -835,38 +593,14 @@
//-------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- if ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
- {
- pIns->dwFlags |= (ENV_PITCH|ENV_FILTER);
- if (!pIns->PitchEnv.nNodes)
- {
- pIns->PitchEnv.Values[0] = 64;
- pIns->PitchEnv.Values[1] = 64;
- pIns->PitchEnv.Ticks[0] = 0;
- pIns->PitchEnv.Ticks[1] = 10;
- pIns->PitchEnv.nNodes = 2;
- InvalidateRect(NULL, FALSE);
- }
- } else
- {
- pIns->dwFlags &= ~(ENV_PITCH|ENV_FILTER);
- // prevent filter envelop from turning into a pitch envelope :)
- for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
- {
- if(pSndFile->Chn[nChn].pModInstrument == pIns)
- pSndFile->Chn[nChn].dwFlags &= ~CHN_PITCHENV;
- }
- }
- return true;
- }
- }
- return false;
+ if(pModDoc == nullptr) return false;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if(pIns == nullptr) return false;
+
+ pIns->PitchEnv.dwFlags &= ~ENV_FILTER;
+ return EnvToggleEnv(&pIns->PitchEnv, pSndFile, pIns, bEnable, 64, CHN_PITCHENV, ENV_FILTER);
}
@@ -1123,11 +857,11 @@
{
DrawGrid(&m_dcMemMain, pSndFile->m_nMusicSpeed);
}
- if (m_nEnv != ENV_VOLUME)
- {
- m_dcMemMain.MoveTo(0, ymed);
- m_dcMemMain.LineTo(m_rcClient.right, ymed);
- }
+
+ // Middle line (half volume or pitch / panning center)
+ m_dcMemMain.MoveTo(0, ymed);
+ m_dcMemMain.LineTo(m_rcClient.right, ymed);
+
m_dcMemMain.SelectObject(CMainFrame::penDarkGray);
// Drawing Loop Start/End
if (EnvGetLoop())
@@ -1226,7 +960,7 @@
}
bool CViewInstrument::EnvRemovePoint()
-//--------------------------------------
+//------------------------------------
{
CModDoc *pModDoc = GetDocument();
if ((pModDoc) && (m_nDragItem) && (m_nDragItem-1 <= EnvGetLastPoint()))
@@ -1292,7 +1026,7 @@
cDefaultValue = 32;
break;
case ENV_PITCH:
- cDefaultValue = (pIns->dwFlags & ENV_FILTER) ? 64 : 32;
+ cDefaultValue = (pIns->PitchEnv.dwFlags & ENV_FILTER) ? 64 : 32;
break;
default:
return false;
@@ -1659,7 +1393,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 && !(m_nEnv == ENV_PITCH && (pIns->dwFlags & ENV_FILTER))) ? nVal - 32 : nVal;
+ int displayVal = (m_nEnv != ENV_VOLUME && !(m_nEnv == ENV_PITCH && (pIns->PitchEnv.dwFlags & ENV_FILTER))) ? nVal - 32 : nVal;
wsprintf(s, "Tick %d, [%d]", nTick, displayVal);
} else {
int displayVal = (nVal - EnvGetReleaseNodeValue()) * 2;
@@ -2468,10 +2202,11 @@
}
+
+// Get a pointer to the currently selected envelope.
INSTRUMENTENVELOPE *CViewInstrument::GetEnvelopePtr() const
//---------------------------------------------------------
{
- // Get a pointer to the currently selected envelope.
// First do some standard checks...
CModDoc *pModDoc = GetDocument();
if(pModDoc == nullptr) return nullptr;
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/View_ins.h 2009-11-07 21:40:01 UTC (rev 415)
@@ -18,7 +18,8 @@
RECT m_rcClient;
bool m_baPlayingNote[128]; //rewbs.instViewNNA
INSTRUMENTINDEX m_nInstrument;
- UINT m_nEnv, m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel;
+ enmEnvelopeTypes m_nEnv;
+ UINT m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel;
DWORD m_dwStatus;
DWORD m_NcButtonState[ENV_LEFTBAR_BUTTONS];
DWORD m_dwNotifyPos[MAX_CHANNELS];
@@ -39,37 +40,64 @@
CViewInstrument();
DECLARE_SERIAL(CViewInstrument)
-public:
- void UpdateScrollSize();
- BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, UINT m_nEnv=0);
- INSTRUMENTENVELOPE *GetEnvelopePtr() const;
+protected:
+ ////////////////////////
+ // Envelope get stuff
+
+ // Flags
+ bool EnvGetFlag(const DWORD dwFlag) const;
+ bool EnvGetLoop() const {return EnvGetFlag(ENV_LOOP);};
+ bool EnvGetSustain() const {return EnvGetFlag(ENV_SUSTAIN);};
+ bool EnvGetCarry() const {return EnvGetFlag(ENV_CARRY);};
+
+ // Misc.
UINT EnvGetTick(int nPoint) const;
UINT EnvGetValue(int nPoint) const;
UINT EnvGetLastPoint() const;
UINT EnvGetNumPoints() const;
+
+ // Get loop points
UINT EnvGetLoopStart() const;
UINT EnvGetLoopEnd() const;
UINT EnvGetSustainStart() const;
UINT EnvGetSustainEnd() const;
- bool EnvGetLoop() const;
- bool EnvGetSustain() const;
- bool EnvGetCarry() const;
+
+ // Get envelope status
bool EnvGetVolEnv() const;
bool EnvGetPanEnv() const;
bool EnvGetPitchEnv() const;
bool EnvGetFilterEnv() const;
+
+ ////////////////////////
+ // Envelope set stuff
+
+ // Flags
+ bool EnvSetFlag(const DWORD dwFlag, const bool bEnable) const;
+ bool EnvSetLoop(bool bEnable) const {return EnvSetFlag(ENV_LOOP, bEnable);};
+ bool EnvSetSustain(bool bEnable) const {return EnvSetFlag(ENV_SUSTAIN, bEnable);};
+ bool EnvSetCarry(bool bEnable) const {return EnvSetFlag(ENV_CARRY, bEnable);};
+
+ // Misc.
bool EnvSetValue(int nPoint, int nTick=-1, int nValue=-1);
+
+ // Set loop points
bool EnvSetLoopStart(int nPoint);
bool EnvSetLoopEnd(int nPoint);
bool EnvSetSustainStart(int nPoint);
bool EnvSetSustainEnd(int nPoint);
- bool EnvSetLoop(bool bLoop);
- bool EnvSetSustain(bool bSustain);
- bool EnvSetCarry(bool bCarry);
+
+ // Set envelope status
+ bool EnvToggleEnv(INSTRUMENTENVELOPE *pEnv, CSoundFile *pSndFile, MODINSTRUMENT *pIns, bool bEnable, BYTE cDefaultValue, DWORD dwChanFlag, DWORD dwExtraFlags = 0);
bool EnvSetVolEnv(bool bEnable);
bool EnvSetPanEnv(bool bEnable);
bool EnvSetPitchEnv(bool bEnable);
bool EnvSetFilterEnv(bool bEnable);
+
+ ////////////////////////
+ // Misc stuff
+ void UpdateScrollSize();
+ BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes m_nEnv = ENV_VOLUME);
+ INSTRUMENTENVELOPE *GetEnvelopePtr() const;
UINT EnvInsertPoint();
bool EnvRemovePoint();
int TickToScreen(int nTick) const;
Modified: trunk/OpenMPT/mptrack/view_com.cpp
===================================================================
--- trunk/OpenMPT/mptrack/view_com.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/mptrack/view_com.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -383,9 +383,9 @@
case INSLIST_ENVELOPES:
if (pIns)
{
- if (pIns->dwFlags & ENV_VOLUME) strcat(s, "Vol");
- if (pIns->dwFlags & ENV_PANNING) { if (s[0]) strcat(s, ", "); strcat(s, "Pan"); }
- if (pIns->dwFlags & ENV_PITCH) { if (s[0]) strcat(s, ", "); strcat(s, (pIns->dwFlags & ENV_FILTER) ? "Filter" : "Pitch"); }
+ if (pIns->VolEnv.dwFlags & ENV_ENABLED) strcat(s, "Vol");
+ if (pIns->PanEnv.dwFlags & ENV_ENABLED) { if (s[0]) strcat(s, ", "); strcat(s, "Pan"); }
+ if (pIns->PitchEnv.dwFlags & ENV_ENABLED) { if (s[0]) strcat(s, ", "); strcat(s, (pIns->PitchEnv.dwFlags & ENV_FILTER) ? "Filter" : "Pitch"); }
}
break;
case INSLIST_FILENAME:
Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -1772,7 +1772,7 @@
// Volume Envelope
if ((part->wVolAttack) || (part->wVolDecay < 20*50) || (part->nVolSustainLevel) || (part->wVolRelease < 20*50))
{
- pIns->dwFlags |= ENV_VOLUME;
+ pIns->VolEnv.dwFlags |= ENV_ENABLED;
// Delay section
// -> DLS level 2
// Attack section
@@ -1830,10 +1830,10 @@
nPoint++;
}
}
- pIns->dwFlags |= ENV_VOLSUSTAIN;
+ pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
} else
{
- pIns->dwFlags |= ENV_VOLSUSTAIN;
+ pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
pIns->VolEnv.Ticks[nPoint] = (WORD)(pIns->VolEnv.Ticks[nPoint-1]+1);
pIns->VolEnv.Values[nPoint] = pIns->VolEnv.Values[nPoint-1];
nPoint++;
@@ -1884,10 +1884,10 @@
if (pDlsIns->ulBank & F_INSTRUMENT_DRUMS)
{
// Create a default envelope for drums
- pIns->dwFlags &= ~ENV_VOLSUSTAIN;
- if (!(pIns->dwFlags & ENV_VOLUME))
+ pIns->VolEnv.dwFlags &= ~ENV_SUSTAIN;
+ if (!(pIns->VolEnv.dwFlags & ENV_ENABLED))
{
- pIns->dwFlags |= ENV_VOLUME;
+ pIns->VolEnv.dwFlags |= ENV_ENABLED;
pIns->VolEnv.Ticks[0] = 0;
pIns->VolEnv.Values[0] = 64;
pIns->VolEnv.Ticks[1] = 5;
Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-11-07 21:40:01 UTC (rev 415)
@@ -166,7 +166,7 @@
pIns->nGlobalVol = 64;
pIns->nPan = BigEndianW(pih->panning);
if ((pIns->nPan) && (pIns->nPan < 256))
- pIns->dwFlags = ENV_SETPANNING;
+ pIns->dwFlags = INS_SETPANNING;
else
pIns->nPan = 128;
pIns->nPPC = 5*12;
@@ -218,9 +218,9 @@
{
MODINSTRUMENT *pIns = Instruments[nins];
- if (peh->flags & 1) pIns->dwFlags |= ENV_VOLUME;
- if (peh->flags & 2) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (peh->flags & 4) pIns->dwFlags |= ENV_VOLLOOP;
+ if (peh->flags & 1) pIns->VolEnv.dwFlags |= ENV_ENABLED;
+ if (peh->flags & 2) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
+ if (peh->flags & 4) pIns->VolEnv.dwFlags |= ENV_LOOP;
pIns->VolEnv.nNodes = peh->numpoints + 1;
if (pIns->VolEnv.nNodes > MAX_ENVPOINTS) pIns->VolEnv.nNodes = MAX_ENVPOINTS;
pIns->VolEnv.nLoopStart = peh->loopbegin;
Modified: trunk/OpenMPT/soundlib/Load_ams.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ams.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_ams.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -401,9 +401,9 @@
}
pIns->nFadeOut = (((lpStream[dwMemPos+2] & 0x0F) << 8) | (lpStream[dwMemPos+1])) << 3;
UINT envflags = lpStream[dwMemPos+3];
- if (envflags & 0x01) pIns->dwFlags |= ENV_VOLLOOP;
- if (envflags & 0x02) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (envflags & 0x04) pIns->dwFlags |= ENV_VOLUME;
+ if (envflags & 0x01) pIns->VolEnv.dwFlags |= ENV_LOOP;
+ if (envflags & 0x02) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
+ if (envflags & 0x04) pIns->VolEnv.dwFlags |= ENV_ENABLED;
dwMemPos += 5;
// Read Samples
for (UINT ismp=0; ismp<pSmp->samples; ismp++)
Modified: trunk/OpenMPT/soundlib/Load_imf.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -135,6 +135,7 @@
};
static void import_imf_effect(MODCOMMAND *note)
+//---------------------------------------------
{
BYTE n;
// fix some of them
@@ -224,17 +225,13 @@
}
}
-static unsigned int envflags[3][3] = {
- {ENV_VOLUME, ENV_VOLSUSTAIN, ENV_VOLLOOP},
- {ENV_PANNING, ENV_PANSUSTAIN, ENV_PANLOOP},
- {ENV_PITCH | ENV_FILTER, ENV_PITCHSUSTAIN, ENV_PITCHLOOP},
-};
-
-static void load_imf_envelope(MODINSTRUMENT *ins, INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e)
+static void load_imf_envelope(INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e)
+//----------------------------------------------------------------------------------
{
UINT min = 0; // minimum tick value for next node
int shift = (e == IMF_ENV_VOL) ? 0 : 2;
+ env->dwFlags = ((imfins->env[e].flags & 1) ? ENV_ENABLED : 0) | ((imfins->env[e].flags & 2) ? ENV_SUSTAIN : 0) | ((imfins->env[e].flags & 4) ? ENV_LOOP : 0);
env->nNodes = CLAMP(imfins->env[e].points, 2, 25);
env->nLoopStart = imfins->env[e].loop_start;
env->nLoopEnd = imfins->env[e].loop_end;
@@ -249,16 +246,10 @@
env->Values[n] = (BYTE)min(nValue, 64);
min = nTick + 1;
}
- // this would be less retarded if the envelopes all had their own flags...
- if (imfins->env[e].flags & 1)
- ins->dwFlags |= envflags[e][0];
- if (imfins->env[e].flags & 2)
- ins->dwFlags |= envflags[e][1];
- if (imfins->env[e].flags & 4)
- ins->dwFlags |= envflags[e][2];
}
bool CSoundFile::ReadIMF(const LPCBYTE lpStream, const DWORD dwMemLength)
+//-----------------------------------------------------------------------
{
#define ASSERT_CAN_READ(x) \
if( dwMemPos > dwMemLength || x > dwMemLength - dwMemPos ) return false;
@@ -487,12 +478,13 @@
pIns->nFadeOut = imfins.fadeout;
pIns->nGlobalVol = 128;
- load_imf_envelope(pIns, &pIns->VolEnv, &imfins, IMF_ENV_VOL);
- load_imf_envelope(pIns, &pIns->PanEnv, &imfins, IMF_ENV_PAN);
- load_imf_envelope(pIns, &pIns->PitchEnv, &imfins, IMF_ENV_FILTER);
+ load_imf_envelope(&pIns->VolEnv, &imfins, IMF_ENV_VOL);
+ load_imf_envelope(&pIns->PanEnv, &imfins, IMF_ENV_PAN);
+ load_imf_envelope(&pIns->PitchEnv, &imfins, IMF_ENV_FILTER);
+ if((pIns->PitchEnv.dwFlags & ENV_ENABLED) != 0) pIns->PitchEnv.dwFlags |= ENV_FILTER;
// hack to get === to stop notes (from modplug's xm loader)
- if (!(pIns->dwFlags & ENV_VOLUME) && !pIns->nFadeOut)
+ if (!(pIns->VolEnv.dwFlags & ENV_ENABLED) && !pIns->nFadeOut)
pIns->nFadeOut = 8192;
// read this instrument's samples
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -216,10 +216,37 @@
return (value > 9) ? 9 : value;
}
+// Convert MPT's internal nvelope format into an IT/MPTM envelope.
+void MPTEnvToIT(const INSTRUMENTENVELOPE *mptEnv, ITENVELOPE *itEnv, const BYTE envOffset)
+//----------------------------------------------------------------------------------------
+{
+ if(mptEnv->dwFlags & ENV_ENABLED) itEnv->flags |= 1;
+ if(mptEnv->dwFlags & ENV_LOOP) itEnv->flags |= 2;
+ if(mptEnv->dwFlags & ENV_SUSTAIN) itEnv->flags |= 4;
+ if(mptEnv->dwFlags & ENV_CARRY) itEnv->flags |= 8;
+ itEnv->num = (BYTE)min(mptEnv->nNodes, 25);
+ itEnv->lpb = (BYTE)mptEnv->nLoopStart;
+ itEnv->lpe = (BYTE)mptEnv->nLoopEnd;
+ itEnv->slb = (BYTE)mptEnv->nSustainStart;
+ itEnv->sle = (BYTE)mptEnv->nSustainEnd;
+
+ // Attention: Full MPTM envelope is stored in extended instrument properties
+ for (UINT ev = 0; ev < 25; ev++)
+ {
+ itEnv->data[ev * 3] = mptEnv->Values[ev] - envOffset;
+ itEnv->data[ev * 3 + 1] = mptEnv->Ticks[ev] & 0xFF;
+ itEnv->data[ev * 3 + 2] = mptEnv->Ticks[ev] >> 8;
+ }
+}
+
// Convert IT/MPTM envelope data into MPT's internal envelope format - To be used by ITInstrToMPT()
void ITEnvToMPT(const ITENVELOPE *itEnv, INSTRUMENTENVELOPE *mptEnv, const BYTE envOffset, const int iEnvMax)
//-----------------------------------------------------------------------------------------------------------
{
+ if(itEnv->flags & 1) mptEnv->dwFlags |= ENV_ENABLED;
+ if(itEnv->flags & 2) mptEnv->dwFlags |= ENV_LOOP;
+ if(itEnv->flags & 4) mptEnv->dwFlags |= ENV_SUSTAIN;
+ if(itEnv->flags & 8) mptEnv->dwFlags |= ENV_CARRY;
mptEnv->nNodes = min(itEnv->num, iEnvMax);
mptEnv->nLoopStart = itEnv->lpb;
mptEnv->nLoopEnd = itEnv->lpe;
@@ -262,9 +289,9 @@
if (note < 128) pIns->NoteMap[j] = note+1;
else if (note >= 0xFE) pIns->NoteMap[j] = note;
}
- if (pis->flags & 0x01) pIns->dwFlags |= ENV_VOLUME;
- if (pis->flags & 0x02) pIns->dwFlags |= ENV_VOLLOOP;
- if (pis->flags & 0x04) pIns->dwFlags |= ENV_VOLSUSTAIN;
+ if (pis->flags & 0x01) pIns->VolEnv.dwFlags |= ENV_ENABLED;
+ if (pis->flags & 0x02) pIns->VolEnv.dwFlags |= ENV_LOOP;
+ if (pis->flags & 0x04) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
pIns->VolEnv.nLoopStart = pis->vls;
pIns->VolEnv.nLoopEnd = pis->vle;
pIns->VolEnv.nSustainStart = pis->sls;
@@ -373,24 +400,12 @@
// Volume Envelope
- if (pis->volenv.flags & 1) pIns->dwFlags |= ENV_VOLUME;
- if (pis->volenv.flags & 2) pIns->dwFlags |= ENV_VOLLOOP;
- if (pis->volenv.flags & 4) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (pis->volenv.flags & 8) pIns->dwFlags |= ENV_VOLCARRY;
ITEnvToMPT(&pis->volenv, &pIns->VolEnv, 0, iEnvMax);
// Panning Envelope
- if (pis->panenv.flags & 1) pIns->dwFlags |= ENV_PANNING;
- if (pis->panenv.flags & 2) pIns->dwFlags |= ENV_PANLOOP;
- if (pis->panenv.flags & 4) pIns->dwFlags |= ENV_PANSUSTAIN;
- if (pis->panenv.flags & 8) pIns->dwFlags |= ENV_PANCARRY;
ITEnvToMPT(&pis->panenv, &pIns->PanEnv, 32, iEnvMax);
// Pitch Envelope
- if (pis->pitchenv.flags & 1) pIns->dwFlags |= ENV_PITCH;
- if (pis->pitchenv.flags & 2) pIns->dwFlags |= ENV_PITCHLOOP;
- if (pis->pitchenv.flags & 4) pIns->dwFlags |= ENV_PITCHSUSTAIN;
- if (pis->pitchenv.flags & 8) pIns->dwFlags |= ENV_PITCHCARRY;
- if (pis->pitchenv.flags & 0x80) pIns->dwFlags |= ENV_FILTER;
ITEnvToMPT(&pis->pitchenv, &pIns->PitchEnv, 32, iEnvMax);
+ if (pis->pitchenv.flags & 0x80) pIns->PitchEnv.dwFlags |= ENV_FILTER;
pIns->nNNA = pis->nna;
pIns->nDCT = pis->dct;
@@ -406,11 +421,11 @@
pIns->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
pIns->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
if (pIns->nPan > 256) pIns->nPan = 128;
- if (pis->dfp < 0x80) pIns->dwFlags |= ENV_SETPANNING;
+ if (pis->dfp < 0x80) pIns->dwFlags |= INS_SETPANNING;
}
- if ((pIns->VolEnv.nLoopStart >= iEnvMax) || (pIns->VolEnv.nLoopEnd >= iEnvMax)) pIns->dwFlags &= ~ENV_VOLLOOP;
- if ((pIns->VolEnv.nSustainStart >= iEnvMax) || (pIns->VolEnv.nSustainEnd >= iEnvMax)) pIns->dwFlags &= ~ENV_VOLSUSTAIN;
+ if ((pIns->VolEnv.nLoopStart >= iEnvMax) || (pIns->VolEnv.nLoopEnd >= iEnvMax)) pIns->VolEnv.dwFlags &= ~ENV_LOOP;
+ if ((pIns->VolEnv.nSustainStart >= iEnvMax) || (pIns->VolEnv.nSustainEnd >= iEnvMax)) pIns->VolEnv.dwFlags &= ~ENV_SUSTAIN;
return returnVal; //return offset
}
@@ -1995,7 +2010,7 @@
iti.ppc = pIns->nPPC;
iti.gbv = (BYTE)(pIns->nGlobalVol << 1);
iti.dfp = (BYTE)pIns->nPan >> 2;
- if (!(pIns->dwFlags & ENV_SETPANNING)) iti.dfp |= 0x80;
+ if (!(pIns->dwFlags & INS_SETPANNING)) iti.dfp |= 0x80;
iti.rv = pIns->nVolSwing;
iti.rp = pIns->nPanSwing;
iti.ifc = pIns->nIFC;
@@ -2015,49 +2030,12 @@
keyboardex[i] = (smp>>8);
} else keyboardex[i] = 0;
// Writing Volume envelope
- if (pIns->dwFlags & ENV_VOLUME) iti.volenv.flags |= 0x01;
- if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02;
- if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04;
- if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08;
- iti.volenv.num = (BYTE)pIns->VolEnv.nNodes;
- iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart;
- iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd;
- iti.volenv.slb = pIns->VolEnv.nSustainStart;
- iti.volenv.sle = pIns->VolEnv.nSustainEnd;
+ MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0);
// Writing Panning envelope
- if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01;
- if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02;
- if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04;
- if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08;
- iti.panenv.num = (BYTE)pIns->PanEnv.nNodes;
- iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart;
- iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd;
- iti.panenv.slb = pIns->PanEnv.nSustainStart;
- iti.panenv.sle = pIns->PanEnv.nSustainEnd;
+ MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32);
// Writing Pitch Envelope
- if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01;
- if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02;
- if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04;
- if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08;
- if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
- iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes;
- iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart;
- iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd;
- iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart;
- iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd;
- // Writing Envelopes data
- for (UINT ev=0; ev<25; ev++)
- {
- iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev];
- iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF;
- iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8;
- iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32;
- iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF;
- iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8;
- iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32;
- iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF;
- iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8;
- }
+ MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32);
+ if (pIns->PitchEnv.dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
} else
// Save Empty Instrument
{
@@ -2636,7 +2614,7 @@
iti.ppc = pIns->nPPC;
iti.gbv = (BYTE)(pIns->nGlobalVol << 1);
iti.dfp = (BYTE)pIns->nPan >> 2;
- if (!(pIns->dwFlags & ENV_SETPANNING)) iti.dfp |= 0x80;
+ if (!(pIns->dwFlags & INS_SETPANNING)) iti.dfp |= 0x80;
iti.rv = pIns->nVolSwing;
iti.rp = pIns->nPanSwing;
iti.ifc = pIns->nIFC;
@@ -2656,49 +2634,12 @@
keyboardex[i] = (smp>>8);
} else keyboardex[i] = 0;
// Writing Volume envelope
- if (pIns->dwFlags & ENV_VOLUME) iti.volenv.flags |= 0x01;
- if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02;
- if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04;
- if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08;
- iti.volenv.num = (BYTE)pIns->VolEnv.nNodes;
- iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart;
- iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd;
- iti.volenv.slb = pIns->VolEnv.nSustainStart;
- iti.volenv.sle = pIns->VolEnv.nSustainEnd;
+ MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0);
// Writing Panning envelope
- if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01;
- if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02;
- if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04;
- if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08;
- iti.panenv.num = (BYTE)pIns->PanEnv.nNodes;
- iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart;
- iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd;
- iti.panenv.slb = pIns->PanEnv.nSustainStart;
- iti.panenv.sle = pIns->PanEnv.nSustainEnd;
+ MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32);
// Writing Pitch Envelope
- if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01;
- if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02;
- if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04;
- if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08;
- if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
- iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes;
- iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart;
- iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd;
- iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart;
- iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd;
- // Writing Envelopes data
- for (UINT ev=0; ev<25; ev++)
- {
- iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev];
- iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF;
- iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8;
- iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32;
- iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF;
- iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8;
- iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32;
- iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF;
- iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8;
- }
+ MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32);
+ if (pIns->PitchEnv.dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
} else
// Save Empty Instrument
{
Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -95,6 +95,30 @@
}
+// Convert MDL envelope data (env points and flags)
+void ConvertMDLEnvelope(const unsigned char *pMDLEnv, INSTRUMENTENVELOPE *pMPTEnv)
+//--------------------------------------------------------------------------------
+{
+ WORD nCurTick = 1;
+ pMPTEnv->nNodes = 15;
+ for (UINT nTick = 0; nTick < 15; nTick++)
+ {
+ if (nTick) nCurTick += pMDLEnv[nTick * 2 + 1];
+ pMPTEnv->Ticks[nTick] = nCurTick;
+ pMPTEnv->Values[nTick] = pMDLEnv[nTick * 2 + 2];
+ if (!pMDLEnv[nTick * 2 + 1]) // last point reached
+ {
+ pMPTEnv->nNodes = nTick + 1;
+ break;
+ }
+ }
+ pMPTEnv->nSustainStart = pMPTEnv->nSustainEnd = pMDLEnv[31] & 0x0F;
+ pMPTEnv->dwFlags |= ((pMDLEnv[31] & 0x10) ? ENV_SUSTAIN : 0) | ((pMDLEnv[31] & 0x20) ? ENV_LOOP : 0);
+ pMPTEnv->nLoopStart = pMDLEnv[32] & 0x0F;
+ pMPTEnv->nLoopEnd = pMDLEnv[32] >> 4;
+}
+
+
void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, const BYTE *lpTracks)
//-------------------------------------------------------------------------------------------------
{
@@ -359,13 +383,13 @@
// Use volume envelope ?
if (ps[3] & 0x80)
{
- pIns->dwFlags |= ENV_VOLUME;
+ pIns->VolEnv.dwFlags |= ENV_ENABLED;
insvolenv[nins] = (ps[3] & 0x3F) + 1;
}
// Use panning envelope ?
if (ps[5] & 0x80)
{
- pIns->dwFlags |= ENV_PANNING;
+ pIns->PanEnv.dwFlags |= ENV_ENABLED;
inspanenv[nins] = (ps[5] & 0x3F) + 1;
}
}
@@ -495,56 +519,24 @@
// Set up envelopes
for (UINT iIns=1; iIns<=m_nInstruments; iIns++) if (Instruments[iIns])
{
- MODINSTRUMENT *pIns = Instruments[iIns];
// Setup volume envelope
if ((nvolenv) && (pvolenv) && (insvolenv[iIns]))
{
LPCBYTE pve = pvolenv;
- for (UINT nve=0; nve<nvolenv; nve++, pve+=33) if (pve[0]+1 == insvolenv[iIns])
+ for (UINT nve = 0; nve < nvolenv; nve++, pve += 33)
{
- WORD vtick = 1;
- pIns->VolEnv.nNodes = 15;
- for (UINT iv=0; iv<15; iv++)
- {
- if (iv) vtick += pve[iv*2+1];
- pIns->VolEnv.Ticks[iv] = vtick;
- pIns->VolEnv.Values[iv] = pve[iv*2+2];
- if (!pve[iv*2+1])
- {
- pIns->VolEnv.nNodes = iv+1;
- break;
- }
- }
- pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = pve[31] & 0x0F;
- if (pve[31] & 0x10) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (pve[31] & 0x20) pIns->dwFlags |= ENV_VOLLOOP;
- pIns->VolEnv.nLoopStart = pve[32] & 0x0F;
- pIns->VolEnv.nLoopEnd = pve[32] >> 4;
+ if (pve[0] + 1 == insvolenv[iIns])
+ ConvertMDLEnvelope(pve, &Instruments[iIns]->VolEnv);
}
}
// Setup panning envelope
if ((npanenv) && (ppanenv) && (inspanenv[iIns]))
{
LPCBYTE ppe = ppanenv;
- for (UINT npe=0; npe<npanenv; npe++, ppe+=33) if (ppe[0]+1 == inspanenv[iIns])
+ for (UINT npe = 0; npe < npanenv; npe++, ppe += 33)
{
- WORD vtick = 1;
- pIns->PanEnv.nNodes = 15;
- for (UINT iv=0; iv<15; iv++)
- {
- if (iv) vtick += ppe[iv*2+1];
- pIns->PanEnv.Ticks[iv] = vtick;
- pIns->PanEnv.Values[iv] = ppe[iv*2+2];
- if (!ppe[iv*2+1])
- {
- pIns->PanEnv.nNodes = iv+1;
- break;
- }
- }
- if (ppe[31] & 0x10) pIns->dwFlags |= ENV_PANSUSTAIN;
- if (ppe[31] & 0x20) pIns->dwFlags |= ENV_PANLOOP;
- pIns->PanEnv.nLoopStart = ppe[32] & 0x0F;
- pIns->PanEnv.nLoopEnd = ppe[32] >> 4;
+ if (ppe[0] + 1 == inspanenv[iIns])
+ ConvertMDLEnvelope(ppe, &Instruments[iIns]->PanEnv);
}
}
}
Modified: trunk/OpenMPT/soundlib/Load_mid.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mid.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_mid.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -439,8 +439,8 @@
pIns->Keyboard[j] = m_nSamples;
pIns->NoteMap[j] = (BYTE)mapnote;
}
- pIns->dwFlags |= ENV_VOLUME;
- if (nChannel != MIDI_DRUMCHANNEL) pIns->dwFlags |= ENV_VOLSUSTAIN;
+ pIns->VolEnv.dwFlags |= ENV_ENABLED;
+ if (nChannel != MIDI_DRUMCHANNEL) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
pIns->VolEnv.nNodes = 4;
pIns->VolEnv.Ticks[0] = 0;
pIns->VolEnv.Values[0] = 64;
Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mt2.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -270,7 +270,7 @@
}
// Load Patterns
dwMemPos = dwExtraDataPos + nExtraDataLen;
- for (UINT iPat=0; iPat<pfh->wPatterns; iPat++) if (dwMemPos < dwMemLength-6)
+ for (PATTERNINDEX iPat=0; iPat < pfh->wPatterns; iPat++) if (dwMemPos < dwMemLength - 6)
{
MT2PATTERN *pmp = (MT2PATTERN *)(lpStream+dwMemPos);
UINT wDataLen = (pmp->wDataLen + 1) & ~1;
@@ -411,7 +411,7 @@
SpaceToNullStringFixed(pIns->name, 32);
pIns->nGlobalVol = 64;
pIns->nPan = 128;
- for (UINT i=0; i<NOTE_MAX; i++)
+ for (BYTE i = 0; i < NOTE_MAX; i++)
{
pIns->NoteMap[i] = i+1;
}
@@ -461,59 +461,40 @@
for (UINT iEnv=0; iEnv<4; iEnv++) if (pehdr[iEnv])
{
MT2ENVELOPE *pme = pehdr[iEnv];
- WORD *pEnvPoints = NULL;
- BYTE *pEnvData = NULL;
+ INSTRUMENTENVELOPE *pEnv;
#ifdef MT2DEBUG
Log(" Env %d.%d @%04X: %d points\n", iIns, iEnv, (UINT)(((BYTE *)pme)-lpStream), pme->nPoints);
#endif
+
switch(iEnv)
- {
- // Volume Envelope
- case 0:
- if (pme->nFlags & 1) pIns->dwFlags |= ENV_VOLUME;
- if (pme->nFlags & 2) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (pme->nFlags & 4) pIns->dwFlags |= ENV_VOLLOOP;
- pIns->VolEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
- pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = pme->nSustainPos;
- pIns->VolEnv.nLoopStart = pme->nLoopStart;
- pIns->VolEnv.nLoopEnd = pme->nLoopEnd;
- pEnvPoints = pIns->VolEnv.Ticks;
- pEnvData = pIns->VolEnv.Values;
+ {
+ case 0: // Volume Envelope
+ pEnv = &pIns->VolEnv;
break;
-
- // Panning Envelope
- case 1:
- if (pme->nFlags & 1) pIns->dwFlags |= ENV_PANNING;
- if (pme->nFlags & 2) pIns->dwFlags |= ENV_PANSUSTAIN;
- if (pme->nFlags & 4) pIns->dwFlags |= ENV_PANLOOP;
- pIns->PanEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
- pIns->PanEnv.nSustainStart = pIns->PanEnv.nSustainEnd = pme->nSustainPos;
- pIns->PanEnv.nLoopStart = pme->nLoopStart;
- pIns->PanEnv.nLoopEnd = pme->nLoopEnd;
- pEnvPoints = pIns->PanEnv.Ticks;
- pEnvData = pIns->PanEnv.Values;
+ case 1: // Panning Envelope
+ pEnv = &pIns->PanEnv;
break;
-
- // Pitch/Filter envelope
- default:
- if (pme->nFlags & 1) pIns->dwFlags |= (iEnv==3) ? (ENV_PITCH|ENV_FILTER) : ENV_PITCH;
- if (pme->nFlags & 2) pIns->dwFlags |= ENV_PITCHSUSTAIN;
- if (pme->nFlags & 4) pIns->dwFlags |= ENV_PITCHLOOP;
- pIns->PitchEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
- pIns->PitchEnv.nSustainStart = pIns->PitchEnv.nSustainEnd = pme->nSustainPos;
- pIns->PitchEnv.nLoopStart = pme->nLoopStart;
- pIns->PitchEnv.nLoopEnd = pme->nLoopEnd;
- pEnvPoints = pIns->PitchEnv.Ticks;
- pEnvData = pIns->PitchEnv.Values;
+ default: // Pitch/Filter envelope
+ pEnv = &pIns->PitchEnv;
+ if ((pme->nFlags & 1) && (iEnv == 3)) pIns->PitchEnv.dwFlags |= ENV_FILTER;
}
+
+ if (pme->nFlags & 1) pEnv->dwFlags |= ENV_ENABLED;
+ if (pme->nFlags & 2) pEnv->dwFlags |= ENV_SUSTAIN;
+ if (pme->nFlags & 4) pEnv->dwFlags |= ENV_LOOP;
+ pEnv->nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
+ pEnv->nSustainStart = pEnv->nSustainEnd = pme->nSustainPos;
+ pEnv->nLoopStart = pme->nLoopStart;
+ pEnv->nLoopEnd = pme->nLoopEnd;
+
// Envelope data
- if ((pEnvPoints) && (pEnvData) && (pedata[iEnv]))
+ if (pedata[iEnv])
{
WORD *psrc = pedata[iEnv];
for (UINT i=0; i<16; i++)
{
- pEnvPoints[i] = psrc[i*2];
- pEnvData[i] = (BYTE)psrc[i*2+1];
+ pEnv->Ticks[i] = psrc[i*2];
+ pEnv->Values[i] = (BYTE)psrc[i*2+1];
}
}
}
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -440,30 +440,30 @@
SetDefaultInstrumentValues(pIns);
pIns->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
pIns->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
- if (xmsh.vtype & 1) pIns->dwFlags |= ENV_VOLUME;
- if (xmsh.vtype & 2) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (xmsh.vtype & 4) pIns->dwFlags |= ENV_VOLLOOP;
- if (xmsh.ptype & 1) pIns->dwFlags |= ENV_PANNING;
- if (xmsh.ptype & 2) pIns->dwFlags |= ENV_PANSUSTAIN;
- if (xmsh.ptype & 4) pIns->dwFlags |= ENV_PANLOOP;
+ if (xmsh.vtype & 1) pIns->VolEnv.dwFlags |= ENV_ENABLED;
+ if (xmsh.vtype & 2) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
+ if (xmsh.vtype & 4) pIns->VolEnv.dwFlags |= ENV_LOOP;
+ if (xmsh.ptype & 1) pIns->PanEnv.dwFlags |= ENV_ENABLED;
+ if (xmsh.ptype & 2) pIns->PanEnv.dwFlags |= ENV_SUSTAIN;
+ if (xmsh.ptype & 4) pIns->PanEnv.dwFlags |= ENV_LOOP;
if (xmsh.vnum > 12) xmsh.vnum = 12;
if (xmsh.pnum > 12) xmsh.pnum = 12;
pIns->VolEnv.nNodes = xmsh.vnum;
- if (!xmsh.vnum) pIns->dwFlags &= ~ENV_VOLUME;
- if (!xmsh.pnum) pIns->dwFlags &= ~ENV_PANNING;
+ if (!xmsh.vnum) pIns->VolEnv.dwFlags &= ~ENV_ENABLED;
+ if (!xmsh.pnum) pIns->PanEnv.dwFlags &= ~ENV_ENABLED;
pIns->PanEnv.nNodes = xmsh.pnum;
pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = xmsh.vsustain;
- if (xmsh.vsustain >= 12) pIns->dwFlags &= ~ENV_VOLSUSTAIN;
+ if (xmsh.vsustain >= 12) pIns->VolEnv.dwFlags &= ~ENV_SUSTAIN;
pIns->VolEnv.nLoopStart = xmsh.vloops;
pIns->VolEnv.nLoopEnd = xmsh.vloope;
if (pIns->VolEnv.nLoopEnd >= 12) pIns->VolEnv.nLoopEnd = 0;
- if (pIns->VolEnv.nLoopStart >= pIns->VolEnv.nLoopEnd) pIns->dwFlags &= ~ENV_VOLLOOP;
+ if (pIns->VolEnv.nLoopStart >= pIns->VolEnv.nLoopEnd) pIns->VolEnv.dwFlags &= ~ENV_LOOP;
pIns->PanEnv.nSustainStart = pIns->PanEnv.nSustainEnd = xmsh.psustain;
- if (xmsh.psustain >= 12) pIns->dwFlags &= ~ENV_PANSUSTAIN;
+ if (xmsh.psustain >= 12) pIns->PanEnv.dwFlags &= ~ENV_SUSTAIN;
pIns->PanEnv.nLoopStart = xmsh.ploops;
pIns->PanEnv.nLoopEnd = xmsh.ploope;
if (pIns->PanEnv.nLoopEnd >= 12) pIns->PanEnv.nLoopEnd = 0;
- if (pIns->PanEnv.nLoopStart >= pIns->PanEnv.nLoopEnd) pIns->dwFlags &= ~ENV_PANLOOP;
+ if (pIns->PanEnv.nLoopStart >= pIns->PanEnv.nLoopEnd) pIns->PanEnv.dwFlags &= ~ENV_LOOP;
pIns->nGlobalVol = 64;
for (UINT ienv=0; ienv<12; ienv++)
{
@@ -918,12 +918,12 @@
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;
- if (pIns->dwFlags & ENV_VOLLOOP) xmsh.vtype |= 4;
- if (pIns->dwFlags & ENV_PANNING) xmsh.ptype |= 1;
- if (pIns->dwFlags & ENV_PANSUSTAIN) xmsh.ptype |= 2;
- if (pIns->dwFlags & ENV_PANLOOP) xmsh.ptype |= 4;
+ if (pIns->VolEnv.dwFlags & ENV_ENABLED) xmsh.vtype |= 1;
+ if (pIns->VolEnv.dwFlags & ENV_SUSTAIN) xmsh.vtype |= 2;
+ if (pIns->VolEnv.dwFlags & ENV_LOOP) xmsh.vtype |= 4;
+ if (pIns->PanEnv.dwFlags & ENV_ENABLED) xmsh.ptype |= 1;
+ if (pIns->PanEnv.dwFlags & ENV_SUSTAIN) xmsh.ptype |= 2;
+ if (pIns->PanEnv.dwFlags & ENV_LOOP) xmsh.ptype |= 4;
xmsh.vsustain = (BYTE)pIns->VolEnv.nSustainStart;
xmsh.vloops = (BYTE)pIns->VolEnv.nLoopStart;
xmsh.vloope = (BYTE)pIns->VolEnv.nLoopEnd;
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-11-07 15:47:35 UTC (rev 414)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-11-07 21:40:01 UTC (rev 415)
@@ -1165,32 +1165,32 @@
if (n < nsamples) pIns->Keyboard[k+12] = samplemap[n];
}
pIns->nFadeOut = pih->volfade;
- if (pih->vtype & 1) pIns->dwFlags |= ENV_VOLUME;
- if (pih->vtype & 2) pIns->dwFlags |= ENV_VOLSUSTAIN;
- if (pih->vtype & 4) pIns->dwFlags |= ENV_VOLLOOP;
- if (pih->ptype & 1) pIns->dwFlags |= ENV_PANNING;
- if (pih->ptype & 2) pIns->dwFlags |= ENV_PANSUSTAIN;
- if (pih->ptype & 4) pIns->dwFlags |= ENV_PANLOOP;
+ if (pih->vtype & 1) pIns->VolEnv.dwFlags |= ENV_ENABLED;
+ if (pih->vtype & 2) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
+ if (pih->vtype & 4) pIns->VolEnv.dwFlags |= ENV_LOOP;
+ if (pih->ptype & 1) pIns->PanEnv.dwFlags |= ENV_ENABLED;
+ if (pih->ptype & 2) pIns->PanEnv.dwFlags |= ENV_SUSTAIN;
+ if (pih->ptype & 4) pIns->PanEnv.dwFlags |= ENV_LOOP;
pIns->VolEnv.nNodes = pih->vnum;
pIns->PanEnv.nNodes = pih->pnum;
if (pIns->VolEnv.nNodes > 12) pIns->VolEnv.nNodes = 12;
if (pIns->PanEnv.nNodes > 12) pIns->PanEnv.nNodes = 12;
- if (!pIns->VolEnv.nNodes) pIns->dwFlags &= ~ENV_VOLUME;
- if (!pIns->PanEnv.nNodes) pIns->dwFlags &= ~ENV_PANNING;
+ if (!pIns->VolEnv.nNodes) pIns->VolEnv.dwFlags &= ~ENV_ENABLED;
+ if (!pIns->PanEnv.nNodes) pIns->PanEnv.dwFlags &= ~ENV_ENABLED;
pIns->VolEnv.nSustainStart = pih->vsustain;
pIns->VolEnv.nSustainEnd = pih->vsustain;
- if (pih->vsustain ...
[truncated message content] |
|
From: <sag...@us...> - 2009-11-07 15:47:47
|
Revision: 414
http://modplug.svn.sourceforge.net/modplug/?rev=414&view=rev
Author: saga-games
Date: 2009-11-07 15:47:35 +0000 (Sat, 07 Nov 2009)
Log Message:
-----------
[Fix] Orderlist: Pasting orders now removes "+++" items if they are not supported by the current format.
[Fix] Pattern paste: Got rid of possible redundant undo points.
[Imp] Pattern paste: Assume that the clipboard pattern format is IT (instead of MOD) if no information about the format is available.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-06 20:40:06 UTC (rev 413)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-07 15:47:35 UTC (rev 414)
@@ -525,7 +525,10 @@
continue;
PATTERNINDEX nPat = pSf->Order.GetInvalidPatIndex();
if (bufItem[0] == '+')
+ {
nPat = pSf->Order.GetIgnoreIndex();
+ if(!pSf->GetModSpecifications().hasIgnoreIndex) continue;
+ }
else if (isdigit(bufItem[0]))
{
nPat = ConvertStrTo<PATTERNINDEX>(bufItem);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-06 20:40:06 UTC (rev 413)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 15:47:35 UTC (rev 414)
@@ -1157,7 +1157,6 @@
if ((hCpy) && ((p = (LPSTR)GlobalLock(hCpy)) != NULL))
{
- GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
TEMPO spdmax = m_SndFile.GetModSpecifications().speedMax;
DWORD dwMemSize = GlobalSize(hCpy);
MODCOMMAND *m = m_SndFile.Patterns[nPattern];
@@ -1165,7 +1164,7 @@
UINT ncol = (dwBeginSel & 0xFFFF) >> 3;
UINT col;
bool bS3MCommands = false, bOk = false;
- MODTYPE origFormat = MOD_TYPE_MOD;
+ MODTYPE origFormat = MOD_TYPE_IT;
UINT len = 0;
MODCOMMAND origModCmd;
@@ -1176,6 +1175,7 @@
if ((nrow >= m_SndFile.PatternSize[nPattern]) || (ncol >= m_SndFile.m_nChannels)) goto PasteDone;
m += nrow * m_SndFile.m_nChannels;
+
// Search for signature
for (;;)
{
@@ -1188,11 +1188,15 @@
if(p[len - 3] == 'P') origFormat = MOD_TYPE_MPT;
if(p[len - 4] == 'S') origFormat = MOD_TYPE_S3M;
if(p[len - 3] == 'X') origFormat = MOD_TYPE_XM;
+ if(p[len - 3] == 'O') origFormat = MOD_TYPE_MOD;
break;
}
}
bS3MCommands = (origFormat & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M)) != 0 ? true : false;
bOk = true;
+
+ GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
+
while ((nrow < m_SndFile.PatternSize[nPattern]) && (len + 11 < dwMemSize))
{
// Search for column separator
@@ -1359,11 +1363,11 @@
{
nrow = 0;
ORDERINDEX oNextOrder = m_SndFile.Order.GetNextOrderIgnoringSkips(oCurrentOrder);
- if((oNextOrder <= 0) || (oNextOrder >= m_SndFile.Order.size())) goto PasteDone;
+ if((oNextOrder == 0) || (oNextOrder >= m_SndFile.Order.size())) goto PasteDone;
nPattern = m_SndFile.Order[oNextOrder];
if(m_SndFile.Patterns.IsValidPat(nPattern) == false) goto PasteDone;
m = m_SndFile.Patterns[nPattern];
- GetPatternUndo()->PrepareUndo(nPattern, 0,0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
+ GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
oCurrentOrder = oNextOrder;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-06 20:40:35
|
Revision: 413
http://modplug.svn.sourceforge.net/modplug/?rev=413&view=rev
Author: saga-games
Date: 2009-11-06 20:40:06 +0000 (Fri, 06 Nov 2009)
Log Message:
-----------
[New] Pattern editor: Channel rename dialog in channel header context menu
[Fix] Mod Specs: The XM and MOD format does not support "---" or "+++" items in the order list. "+++" and "---" are left out when saving as XM. The XM format supports up to 255 patterns in theory, but pattern 254/255 are still loaded as "+++"/"---" for now.
[Fix] General tab: Channel name input field was not limited properly.
[Imp] Orderlist: Middle click can now also be used for queuing patterns.
[Imp] Orderlist: "+++" pattern item cannot be entered when writing an MOD / XM file.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_gen.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/dlg_misc.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Load_med.cpp
trunk/OpenMPT/soundlib/Load_mod.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-06 20:40:06 UTC (rev 413)
@@ -54,6 +54,7 @@
BOOL UpdateScrollInfo();
void UpdateInfoText();
int GetFontWidth();
+ void QueuePattern(CPoint pt);
ORDERINDEX GetOrderFromPoint(const CRect& rect, const CPoint& pt) const;
@@ -105,6 +106,7 @@
afx_msg void OnLButtonDblClk(UINT, CPoint);
afx_msg void OnRButtonDown(UINT, CPoint);
afx_msg void OnLButtonUp(UINT, CPoint);
+ afx_msg void OnMButtonDown(UINT, CPoint);
afx_msg void OnMouseMove(UINT, CPoint);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*);
afx_msg void OnSize(UINT nType, int cx, int cy);
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -36,6 +36,7 @@
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
+ ON_WM_MBUTTONDOWN()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
ON_WM_HSCROLL()
@@ -384,15 +385,17 @@
ord = 0;
else
{
- if(ord > maxpat && ord < pSndFile->Order.GetIgnoreIndex())
- ord = pSndFile->Order.GetIgnoreIndex();
+ const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex();
+ if(ord > maxpat && ord < nFirstInvalid)
+ ord = nFirstInvalid;
}
} else
if (nChar == '-')
{
+ const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex();
ord--;
if (ord < 0) ord = pSndFile->Order.GetInvalidPatIndex(); else
- if ((ord > maxpat) && (ord < pSndFile->Order.GetIgnoreIndex())) ord = maxpat;
+ if ((ord > maxpat) && (ord < nFirstInvalid)) ord = maxpat;
}
if (ord != pSndFile->Order[m_nScrollPos])
{
@@ -714,7 +717,7 @@
while (rect.left < rcClient.right)
{
bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false;
- const PATTERNINDEX nPat = ((nIndex >= 0) && (nIndex < pSndFile->Order.GetLength())) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID;
+ const PATTERNINDEX nPat = (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) {
@@ -800,21 +803,7 @@
if (ih->CtrlPressed())
{
// queue pattern
- //m_nScrollPos2nd = ORDERINDEX_INVALID;
- if (m_pModDoc)
- {
- CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- 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;
- } else {
- pSndFile->m_nSeqOverride = nOrder+1;
- }
- InvalidateRect(NULL, FALSE);
- }
- }
+ QueuePattern(pt);
} else
{
// mark pattern (+skip to)
@@ -858,7 +847,7 @@
if (rect.PtInRect(pt))
{
ORDERINDEX n = GetOrderFromPoint(rect, pt);
- if ((n >= 0) && (n == m_nDropPos) && (m_pModDoc))
+ if ((n != ORDERINDEX_INVALID) && (n == m_nDropPos) && (m_pModDoc))
{
// drag multiple orders (not quite as easy...)
ORD_SELECTION selection = GetCurSel(false);
@@ -934,9 +923,9 @@
n = GetOrderFromPoint(rect, pt);
if (n >= pSndFile->Order.GetLength() || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID;
}
- if (n != (int)m_nDropPos)
+ if (n != m_nDropPos)
{
- if (n >= 0)
+ if (n != ORDERINDEX_INVALID)
{
m_nDropPos = n;
InvalidateRect(NULL, FALSE);
@@ -1067,6 +1056,14 @@
}
+void COrderList::OnMButtonDown(UINT nFlags, CPoint pt)
+//----------------------------------------------------
+{
+ UNREFERENCED_PARAMETER(nFlags);
+ QueuePattern(pt);
+}
+
+
void COrderList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*)
//--------------------------------------------------------------
{
@@ -1349,3 +1346,28 @@
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
}
+
+
+void COrderList::QueuePattern(CPoint pt)
+//--------------------------------------
+{
+ CRect rect;
+ GetClientRect(&rect);
+
+ if(!rect.PtInRect(pt)) return;
+ if (m_pModDoc == nullptr) return;
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return;
+
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
+
+ if (nOrder < pSndFile->Order.GetLength())
+ {
+ if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder) + 1) {
+ pSndFile->m_nSeqOverride = 0;
+ } else {
+ pSndFile->m_nSeqOverride = nOrder + 1;
+ }
+ InvalidateRect(NULL, FALSE);
+ }
+}
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -329,6 +329,18 @@
}
}
+ // If not supported, remove "+++" separator order items.
+ if(CSoundFile::GetModSpecifications(nNewType).hasIgnoreIndex == false)
+ {
+ for(ORDERINDEX nOrd = m_SndFile.Order.GetLengthTailTrimmed() - 1; nOrd > 0; nOrd--)
+ {
+ if(m_SndFile.Order[nOrd] == m_SndFile.Order.GetIgnoreIndex())
+ {
+ m_SndFile.Order.Remove(nOrd, nOrd);
+ }
+ }
+ }
+
BEGIN_CRITICAL();
m_SndFile.ChangeModTypeTo(nNewType);
if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES))
Modified: trunk/OpenMPT/mptrack/View_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_gen.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/View_gen.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -362,9 +362,13 @@
int pan = pSndFile->ChnSettings[nChn].nPan;
m_sbPan[ichn].SetPos(pan/4);
SetDlgItemInt(IDC_EDIT2+ichn*2, pan);
+
+ // Channel name
memcpy(s, pSndFile->ChnSettings[nChn].szName, MAX_CHANNELNAME);
- s[MAX_CHANNELNAME-1] = 0;
- SetDlgItemText(IDC_EDIT9+ichn, s);
+ s[MAX_CHANNELNAME - 1] = 0;
+ SetDlgItemText(IDC_EDIT9 + ichn, s);
+ ((CEdit*)(GetDlgItem(IDC_EDIT9 + ichn)))->LimitText(MAX_CHANNELNAME - 1);
+
// Channel effect
m_CbnEffects[ichn].SetRedraw(FALSE);
m_CbnEffects[ichn].ResetContent();
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -108,6 +108,7 @@
ON_COMMAND(ID_PATTERN_AMPLIFY, OnPatternAmplify)
ON_COMMAND(ID_CLEAR_SELECTION, OnClearSelectionFromMenu)
ON_COMMAND(ID_SHOWTIMEATROW, OnShowTimeAtRow)
+ ON_COMMAND(ID_CHANNEL_RENAME, OnRenameChannel)
ON_COMMAND_RANGE(ID_CHANGE_INSTRUMENT, ID_CHANGE_INSTRUMENT+MAX_INSTRUMENTS, OnSelectInstrument)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateUndo)
ON_COMMAND_RANGE(ID_PLUGSELECT, ID_PLUGSELECT+MAX_MIXPLUGINS, OnSelectPlugin) //rewbs.patPlugName
@@ -1242,6 +1243,7 @@
AppendMenu(hMenu, MF_SEPARATOR, 0, "");
BuildRecordCtxMenu(hMenu, nChn, pModDoc);
BuildChannelControlCtxMenu(hMenu);
+ BuildChannelMiscCtxMenu(hMenu, pSndFile);
}
}
@@ -2533,13 +2535,13 @@
return;
}
- UINT nChn = GetChanFromCursor(m_nMenuParam);
+ CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam);
CString str;
str.Format("Remove channel %d?\nNote: Affects all patterns and no undo", nChn+1);
if(CMainFrame::GetMainFrame()->MessageBox(str , "Remove channel", MB_YESNO | MB_ICONQUESTION) == IDYES)
{
BOOL chnMask[MAX_CHANNELS];
- for(UINT i = 0; i<MAX_CHANNELS; chnMask[i] = FALSE, i++) {}
+ for(CHANNELINDEX i = 0; i < MAX_CHANNELS; chnMask[i] = FALSE, i++) {}
chnMask[nChn] = TRUE;
pModDoc->RemoveChannels(chnMask);
SetCurrentPattern(m_nPattern); //Updating the screen.
@@ -4961,6 +4963,16 @@
}
+bool CViewPattern::BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile)
+//---------------------------------------------------------------------------
+{
+ if((pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) == 0) return false;
+ AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
+ AppendMenu(hMenu, MF_STRING, ID_CHANNEL_RENAME, "Rename channel");
+ return true;
+}
+
+
UINT CViewPattern::GetSelectionStartRow() {
//-----------------------------------------
return min(GetRowFromCursor(m_dwBeginSel), GetRowFromCursor(m_dwEndSel));
@@ -5160,3 +5172,20 @@
iRow = m_nRow;
}
}
+
+
+void CViewPattern::OnRenameChannel()
+//----------------------------------
+{
+ CModDoc *pModDoc = GetDocument();
+ if(pModDoc == nullptr) return;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return;
+
+ CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam);
+ CChannelRenameDlg dlg(this, pSndFile->ChnSettings[nChn].szName, nChn + 1);
+ if(dlg.DoModal() != IDOK || dlg.bChanged == false) return;
+
+ strcpy(pSndFile->ChnSettings[nChn].szName, dlg.m_sName);
+ pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS);
+}
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/View_pat.h 2009-11-06 20:40:06 UTC (rev 413)
@@ -298,6 +298,7 @@
afx_msg void OnSelectInstrument(UINT nid);
afx_msg void OnRunScript();
afx_msg void OnShowTimeAtRow();
+ afx_msg void OnRenameChannel();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
@@ -324,6 +325,7 @@
bool BuildTransposeCtxMenu(HMENU hMenu, CInputHandler* ih);
bool BuildSetInstCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile);
bool BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler* ih);
+ bool BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile);
UINT GetSelectionStartRow();
UINT GetSelectionEndRow();
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -635,6 +635,43 @@
}
//end rewbs.removeChansDlgCleanup
+
+///////////////////////////////////////////////////////////
+// CChannelRenameDlg
+
+BOOL CChannelRenameDlg::OnInitDialog()
+//------------------------------------
+{
+ CDialog::OnInitDialog();
+
+ CHAR s[32];
+ wsprintf(s, "Set name for channel %d:", m_nChannel);
+ SetDlgItemText(IDC_STATIC_CHANNEL_NAME, s);
+ SetDlgItemText(IDC_EDIT_CHANNEL_NAME, m_sName);
+ ((CEdit*)(GetDlgItem(IDC_EDIT_CHANNEL_NAME)))->LimitText(MAX_CHANNELNAME - 1);
+
+ return TRUE;
+}
+
+
+void CChannelRenameDlg::OnOK()
+//----------------------------
+{
+ CHAR sNewName[MAX_CHANNELNAME];
+ GetDlgItemText(IDC_EDIT_CHANNEL_NAME, sNewName, MAX_CHANNELNAME);
+ if(!strcmp(sNewName, m_sName))
+ {
+ bChanged = false;
+ CDialog::OnCancel();
+ } else
+ {
+ strcpy(m_sName, sNewName);
+ bChanged = true;
+ CDialog::OnOK();
+ }
+}
+
+
//////////////////////////////////////////////////////////////////////////////////////////
// Find/Replace Dialog
Modified: trunk/OpenMPT/mptrack/dlg_misc.h
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.h 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-11-06 20:40:06 UTC (rev 413)
@@ -111,6 +111,33 @@
/////////////////////////////////////////////////////////////////////////
+// Channel rename dialog
+
+//=====================================
+class CChannelRenameDlg: public CDialog
+//=====================================
+{
+protected:
+ CHANNELINDEX m_nChannel;
+
+public:
+ CHAR m_sName[MAX_CHANNELNAME];
+ bool bChanged;
+
+public:
+ CChannelRenameDlg(CWnd *parent, CHAR *sName, CHANNELINDEX nChannel) : CDialog(IDD_CHANNEL_NAME, parent)
+ {
+ strcpy(m_sName, sName);
+ m_nChannel = nChannel;
+ bChanged = false;
+ }
+
+ virtual BOOL OnInitDialog();
+ virtual void OnOK();
+};
+
+
+/////////////////////////////////////////////////////////////////////////
// Search/Replace
#define PATSEARCH_NOTE 0x01
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-11-06 20:40:06 UTC (rev 413)
@@ -70,7 +70,18 @@
GROUPBOX "Presets",IDC_STATIC,6,234,294,36
END
+IDD_CHANNEL_NAME DIALOGEX 0, 0, 154, 58
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Channel name"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ LTEXT "IDC_STATIC_CHANNEL_NAME",IDC_STATIC_CHANNEL_NAME,6,6,138,8
+ EDITTEXT IDC_EDIT_CHANNEL_NAME,6,18,138,12,ES_AUTOHSCROLL
+ DEFPUSHBUTTON "OK",IDOK,42,36,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,96,36,50,14
+END
+
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
@@ -94,6 +105,14 @@
TOPMARGIN, 7
BOTTOMMARGIN, 274
END
+
+ IDD_CHANNEL_NAME, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 147
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 51
+ END
END
#endif // APSTUDIO_INVOKED
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/mptrack/resource.h 2009-11-06 20:40:06 UTC (rev 413)
@@ -115,6 +115,7 @@
#define IDR_DEFAULT_KEYBINDINGS 519
#define IDR_BUILTIN_TUNINGS 520
#define IDD_CLEANUP_SONG 521
+#define IDD_CHANNEL_NAME 522
#define IDC_BUTTON1 1001
#define IDC_BUTTON2 1002
#define IDC_BUTTON3 1003
@@ -909,6 +910,8 @@
#define IDC_CHK_OPTIMIZE_SAMPLES 2406
#define IDC_CHK_MERGE_SEQUENCES 2408
#define IDC_CHECK_PT1X 2409
+#define IDC_STATIC_CHANNEL_NAME 2410
+#define IDC_EDIT_CHANNEL_NAME 2411
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1145,18 +1148,19 @@
#define ID_CLEANUP_REARRANGESAMPLES 59228
#define ID_ORDERLIST_RENDER 59229
#define ID_EDIT_CLEANUP 59230
-#define ID_ORDERLIST_EDIT_COPY 59231
-#define ID_ORDERLIST_EDIT_CUT 59232
-#define ID_ORDERLIST_EDIT_PASTE 59233
+#define ID_ORDERLIST_EDIT_COPY 59231
+#define ID_ORDERLIST_EDIT_CUT 59232
+#define ID_ORDERLIST_EDIT_PASTE 59233
+#define ID_CHANNEL_RENAME 59234
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
-#define _APS_NEXT_RESOURCE_VALUE 522
-#define _APS_NEXT_COMMAND_VALUE 59234
-#define _APS_NEXT_CONTROL_VALUE 2410
+#define _APS_NEXT_RESOURCE_VALUE 523
+#define _APS_NEXT_COMMAND_VALUE 59235
+#define _APS_NEXT_CONTROL_VALUE 2412
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/soundlib/Load_med.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_med.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/soundlib/Load_med.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -636,7 +636,7 @@
} else
{
UINT nOrders, nSections;
- UINT nTrks = BigEndianW(pmsh2->numtracks);
+ WORD nTrks = BigEndianW(pmsh2->numtracks);
if ((nTrks >= 4) && (nTrks <= 32)) m_nChannels = nTrks;
DWORD playseqtable = BigEndian(pmsh2->playseqtable);
UINT numplayseqs = BigEndianW(pmsh2->numpseqs);
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -507,7 +507,7 @@
UINT nbp=0, norders=128;
for (UINT iord=0; iord<128; iord++)
{
- if (Order[iord] == 0xFF)
+ if (Order[iord] == Order.GetInvalidPatIndex())
{
norders = iord;
break;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-06 20:40:06 UTC (rev 413)
@@ -758,17 +758,21 @@
if(xmheader.channels > MAX_BASECHANNELS) xmheader.channels = MAX_BASECHANNELS;
xmheader.channels = LittleEndianW(xmheader.channels);
- xmheader.patterns = 0;
- 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;
+ // Find out number of orders and patterns used.
+ // +++ and --- patterns are not taken into consideration as FastTracker does not support them.
+ ORDERINDEX nMaxOrds = 0;
+ PATTERNINDEX nPatterns = 0;
+ for(ORDERINDEX nOrd = 0; nOrd < Order.GetLengthTailTrimmed(); nOrd++)
+ {
+ if(Patterns.IsValidIndex(Order[nOrd]))
+ {
+ nMaxOrds++;
+ if(Order[nOrd] >= nPatterns) nPatterns = Order[nOrd] + 1;
}
}
- xmheader.patterns = LittleEndianW(nPatterns);
+ xmheader.orders = LittleEndianW((WORD)nMaxOrds);
+ xmheader.patterns = LittleEndianW((WORD)nPatterns);
+ xmheader.size = LittleEndian((DWORD)(xmheader.size + nMaxOrds));
if(m_nInstruments > 0)
xmheader.instruments = LittleEndianW(m_nInstruments);
@@ -786,7 +790,15 @@
xmheader.speed = LittleEndianW(CLAMP(m_nDefaultSpeed, 1, 31));
fwrite(&xmheader, 1, sizeof(xmheader), f);
- Order.WriteAsByte(f, nOrders);
+ // write order list (wihout +++ and ---, explained above)
+ for(ORDERINDEX nOrd = 0; nOrd < Order.GetLengthTailTrimmed(); nOrd++)
+ {
+ if(Patterns.IsValidIndex(Order[nOrd]))
+ {
+ BYTE nOrdval = static_cast<BYTE>(Order[nOrd]);
+ fwrite(&nOrdval, 1, sizeof(BYTE), f);
+ }
+ }
// Writing patterns
for (i = 0; i < nPatterns; i++) if (Patterns[i])
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-11-06 17:48:42 UTC (rev 412)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-11-06 20:40:06 UTC (rev 413)
@@ -41,6 +41,7 @@
UINT envelopePointsMax; // Maximum number of points of each envelope
char commands[MAX_EFFECTS + 1]; // An array holding all commands this format supports; commands that are not supported are marked with "?"
char volcommands[MAX_VOLCMDS + 1]; // dito, but for volume column
+ bool hasIgnoreIndex; // Does "+++" pattern exist?
};
@@ -79,6 +80,7 @@
240, //Envelope point count
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects
" vpcdabuhlrgfe:o", // Supported Volume Column commands
+ true, // Has "+++" pattern
};
@@ -112,6 +114,7 @@
0, //No instrument envelopes
" 0123456789ABCD?FF?E???????????????", // Supported Effects
" ???????????????", // Supported Volume Column commands
+ false, // Doesn't have "+++" pattern
};
// MOD with MPT extensions.
@@ -143,6 +146,7 @@
0, //No instrument envelopes
" 0123456789ABCD?FF?E???????????????", // Supported Effects
" ???????????????", // Supported Volume Column commands
+ false, // Doesn't have "+++" pattern
};
const CModSpecifications xm =
@@ -154,8 +158,8 @@
false, //No notecut.
true, //Has noteoff.
false, //No notefade.
- 64, //Pattern max.
- 128, //Order max.
+ 255, //Pattern max.
+ 255, //Order max.
1, //Channel min
32, //Channel max
32, //Min tempo
@@ -173,6 +177,7 @@
12, //Envelope point count
" 0123456789ABCDRFFTE???GHK?YXPLZ\\:#", // Supported Effects
" vpcdabuhlrg????", // Supported Volume Column commands
+ false, // Doesn't have "+++" pattern
};
// XM with MPT extensions
@@ -185,7 +190,7 @@
false, //No notecut.
true, //Has noteoff.
false, //No notefade.
- 240, //Pattern max.
+ 255, //Pattern max.
256, //Order max.
1, //Channel min
127, //Channel max
@@ -204,18 +209,20 @@
12, //Envelope point count
" 0123456789ABCDRFFTE???GHK?YXPLZ\\:#", // Supported Effects
" vpcdabuhlrgfe:o", // Supported Volume Column commands
+ false, // Doesn't have "+++" pattern
};
const CModSpecifications s3m =
{
+ //TODO: Set correct values.
"s3m", //File extension
13, //Minimum note index
120, //Maximum note index
true, //Has notecut.
false, //No noteoff.
false, //No notefade.
- 240, //Pattern max.
- 256, //Order max.
+ 99, //Pattern max.
+ 255, //Order max.
1, //Channel min
32, //Channel max
32, //Min tempo
@@ -233,6 +240,7 @@
0, //No instrument envelopes
" JFEGHLKRXODB?CQATI?SMNVW?U????????", // Supported Effects
" vp?????????????", // Supported Volume Column commands
+ true, // Has "+++" pattern
};
// S3M with MPT extensions
@@ -246,7 +254,7 @@
false, //No noteoff.
false, //No notefade.
240, //Pattern max.
- 256, //Order max.
+ 255, //Order max.
1, //Channel min
32, //Channel max
32, //Min tempo
@@ -264,6 +272,7 @@
0, //No instrument envelopes
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects
" vp?????????????", // Supported Volume Column commands
+ true, // Has "+++" pattern
};
const CModSpecifications it =
@@ -294,6 +303,7 @@
25, //Envelope point count
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z???", // Supported Effects
" vpcdab?h??gfe??", // Supported Volume Column commands
+ true, // Has "+++" pattern
};
const CModSpecifications itEx =
@@ -324,6 +334,7 @@
25, //Envelope point count
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects
" vpcdab?h??gfe:o", // Supported Volume Column commands
+ true, // Has "+++" pattern
};
} //namespace ModSpecs
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-06 17:48:58
|
Revision: 412
http://modplug.svn.sourceforge.net/modplug/?rev=412&view=rev
Author: saga-games
Date: 2009-11-06 17:48:42 +0000 (Fri, 06 Nov 2009)
Log Message:
-----------
[Fix] MOD Loader: 8Chn Startrekker modules ("FLT8") are loaded correctly now.
[Imp] MOD Playback: if PT1.x playback flag is set, 8xx and E8x panning commands are now ignored.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mod.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-11-03 09:42:38 UTC (rev 411)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-11-06 17:48:42 UTC (rev 412)
@@ -214,9 +214,9 @@
#pragma pack()
-BOOL IsMagic(LPCSTR s1, LPCSTR s2)
+bool IsMagic(LPCSTR s1, LPCSTR s2)
{
- return ((*(DWORD *)s1) == (*(DWORD *)s2)) ? TRUE : FALSE;
+ return ((*(DWORD *)s1) == (*(DWORD *)s2)) ? true : false;
}
@@ -246,6 +246,7 @@
if ((s[0]=='T') && (s[1]=='D') && (s[2]=='Z') && (s[3]>='4') && (s[3]<='9')) m_nChannels = s[3] - '0'; else
if (IsMagic(s,"16CN")) m_nChannels = 16; else
if (IsMagic(s,"32CN")) m_nChannels = 32; else m_nSamples = 15;
+ bool bFLT8 = IsMagic(s, "FLT8") ? true : false;
// Load Samples
nErr = 0;
dwTotalSampleLen = 0;
@@ -321,8 +322,24 @@
if (iord<norders) nbpbuggy = nbp;
}
if (i >= nbpbuggy2) nbpbuggy2 = i+1;
+
+ // from mikmod: if the file says FLT8, but the orderlist has odd numbers, it's probably really an FLT4
+ if(bFLT8 && (Order[iord] & 1))
+ {
+ m_nChannels = 4;
+ bFLT8 = false;
+ }
}
- for (UINT iend = norders; iend < 0x80; iend++) Order[iend] = Order.GetInvalidPatIndex();
+
+ if(bFLT8)
+ {
+ // FLT8 has only equal order items, so divide by two.
+ for(ORDERINDEX nOrd = 0; nOrd < Order.GetLength(); nOrd++)
+ Order[nOrd] >>= 1;
+ }
+
+ for(UINT iend = norders; iend < 0x80; iend++) Order[iend] = Order.GetInvalidPatIndex();
+
norders--;
m_nRestartPos = pMagic->nRestartPos;
if (m_nRestartPos >= 0x78) m_nRestartPos = 0;
@@ -352,27 +369,53 @@
// Setup channel pan positions and volume
SetupMODPanning();
- // Reading channels
- for (UINT ipat=0; ipat<nbp; ipat++)
+ const CHANNELINDEX nMaxChn = (bFLT8) ? 4 : m_nChannels; // 4 channels per pattern in FLT8 format.
+ if(bFLT8) nbp++; // as one logical pattern consists of two real patterns in FLT8 format, the highest pattern number has to be increased by one.
+
+ // Reading patterns
+ for (PATTERNINDEX ipat = 0; ipat < nbp; ipat++)
{
if (ipat < MAX_PATTERNS)
{
- if(Patterns.Insert(ipat, 64)) break;
- if (dwMemPos + m_nChannels * 256 > dwMemLength) break;
- MODCOMMAND *m = Patterns[ipat];
- LPCBYTE p = lpStream + dwMemPos;
- for (UINT j=m_nChannels*64; j; m++,p+=4,j--)
+ if (dwMemPos + nMaxChn * 256 > dwMemLength) break;
+
+ MODCOMMAND *m;
+ if(bFLT8)
{
- BYTE A0=p[0], A1=p[1], A2=p[2], A3=p[3];
- UINT n = ((((UINT)A0 & 0x0F) << 8) | (A1));
- if ((n) && (n != 0xFFF)) m->note = GetNoteFromPeriod(n << 2);
- m->instr = ((UINT)A2 >> 4) | (A0 & 0x10);
- m->command = A2 & 0x0F;
- m->param = A3;
- if ((m->command) || (m->param)) ConvertModCommand(m);
+ if((ipat & 1) == 0)
+ {
+ // only create "even" patterns
+ if(Patterns.Insert(ipat >> 1, 64)) break;
+ }
+ m = Patterns[ipat >> 1];
+ } else
+ {
+ if(Patterns.Insert(ipat, 64)) break;
+ m = Patterns[ipat];
}
+
+ const BYTE *p = lpStream + dwMemPos;
+ for(ROWINDEX nRow = 0; nRow < 64; nRow++)
+ {
+ if(bFLT8)
+ {
+ // FLT8: either write to channel 1 to 4 (even patterns) or 5 to 8 (odd patterns).
+ m = Patterns[ipat >> 1] + nRow * 8 + ((ipat & 1) ? 4 : 0);
+ }
+ for(CHANNELINDEX nChn = 0; nChn < nMaxChn; nChn++, m++, p += 4)
+ {
+ BYTE A0 = p[0], A1 = p[1], A2 = p[2], A3 = p[3];
+ UINT n = ((((UINT)A0 & 0x0F) << 8) | (A1));
+ if ((n) && (n != 0xFFF)) m->note = GetNoteFromPeriod(n << 2);
+ m->instr = ((UINT)A2 >> 4) | (A0 & 0x10);
+ m->command = A2 & 0x0F;
+ m->param = A3;
+ if ((m->command) || (m->param)) ConvertModCommand(m);
+
+ }
+ }
}
- dwMemPos += m_nChannels*256;
+ dwMemPos += nMaxChn * 256;
}
// Reading samples
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-03 09:42:38 UTC (rev 411)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-06 17:48:42 UTC (rev 412)
@@ -1670,6 +1670,7 @@
// Set 8-bit Panning
case CMD_PANNING8:
if (!(m_dwSongFlags & SONG_FIRSTTICK)) break;
+ if ((m_dwSongFlags & SONG_PT1XMODE)) break;
if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND;
if (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_XM|MOD_TYPE_MOD|MOD_TYPE_MT2))
{
@@ -2504,7 +2505,7 @@
// E7x: Set Tremolo WaveForm
case 0x70: pChn->nTremoloType = param & 0x07; break;
// E8x: Set 4-bit Panning
- case 0x80: if(m_dwSongFlags & SONG_FIRSTTICK)
+ case 0x80: if((m_dwSongFlags & SONG_FIRSTTICK) && !(m_dwSongFlags & SONG_PT1XMODE))
{
//IT compatibility 20. (Panning always resets surround state)
if(IsCompatibleMode(TRK_ALLTRACKERS))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-03 09:43:02
|
Revision: 411
http://modplug.svn.sourceforge.net/modplug/?rev=411&view=rev
Author: saga-games
Date: 2009-11-03 09:42:38 +0000 (Tue, 03 Nov 2009)
Log Message:
-----------
[New] Tree view: Clicking on a mod item (only filename node) switches to the corresponding window.
[Fix] Updating 16bit and stereo channel flags when replacing a sample, in order to avoid broken sound when using undo (f.e. when undoing a 16->8 Bit conversion).
[Fix] Mod Loading: Setting mod specs when loading MPTMs as well (mod specs pointer seems to be set somewhere else already, but the order list was not resized properly in all cases).
[Fix] IT Saver: Save at least 2 order items.
[Imp] Order list: Show cut/copy/paste orders in context menu
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-03 09:42:38 UTC (rev 411)
@@ -41,9 +41,14 @@
ON_WM_HSCROLL()
ON_WM_SIZE()
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_ORDERLIST_EDIT_COPY, OnEditCopy)
+ ON_COMMAND(ID_ORDERLIST_EDIT_CUT, OnEditCut)
+ ON_COMMAND(ID_ORDERLIST_EDIT_PASTE, OnEditPaste)
+
ON_COMMAND(ID_PATTERN_PROPERTIES, OnPatternProperties)
ON_COMMAND(ID_PLAYER_PLAY, OnPlayerPlay)
ON_COMMAND(ID_PLAYER_PAUSE, OnPlayerPause)
@@ -989,12 +994,18 @@
DWORD greyed = bPatternExists ? 0 : MF_GRAYED;
+ CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler();
+
if(bMultiSelection)
{
// several patterns are selected.
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Patterns\tIns");
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Patterns\tDel");
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_COPY, "&Copy Orders\t" + ih->GetKeyTextFromCommand(kcEditCopy));
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_CUT, "&C&ut Orders\t" + ih->GetKeyTextFromCommand(kcEditCut));
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_PASTE, "&Paste Orders\t" + ih->GetKeyTextFromCommand(kcEditPaste));
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Patterns");
}
else
@@ -1007,6 +1018,7 @@
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");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_EDIT_PASTE, "&Paste Orders\t" + ih->GetKeyTextFromCommand(kcEditPaste));
if (pSndFile->TypeIsIT_MPT_XM())
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-03 09:42:38 UTC (rev 411)
@@ -1372,6 +1372,16 @@
}
+// Activate document's window.
+void CModDoc::ActivateWindow()
+//----------------------------
+{
+
+ CChildFrame *pChildFrm = (CChildFrame *)GetChildFrame();
+ if(pChildFrm) pChildFrm->MDIActivate();
+}
+
+
void CModDoc::UpdateAllViews(CView *pSender, LPARAM lHint, CObject *pHint)
//------------------------------------------------------------------------
{
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-11-03 09:42:38 UTC (rev 411)
@@ -154,6 +154,9 @@
void ViewInstrument(UINT nIns);
HWND GetFollowWnd() const { return m_hWndFollow; }
void SetFollowWnd(HWND hwnd, DWORD dwType);
+
+ void ActivateWindow();
+
// Effects Description
bool GetEffectName(LPSTR pszDescription, UINT command, UINT param, bool bXX = false, CHANNELINDEX nChn = CHANNELINDEX_INVALID); // bXX: Nxx: ...
UINT GetNumEffects() const;
@@ -189,7 +192,7 @@
BOOL ConvertInstrumentsToSamples();
UINT RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]);
- PATTERNINDEX InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64);
+ PATTERNINDEX InsertPattern(ORDERINDEX nOrd = ORDERINDEX_INVALID, ROWINDEX nRows = 64);
SAMPLEINDEX InsertSample(bool bLimit = false);
INSTRUMENTINDEX InsertInstrument(LONG lSample = 0, LONG lDuplicate = 0);
void InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample=0);
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-11-03 09:42:38 UTC (rev 411)
@@ -1184,6 +1184,10 @@
InstrumentLibraryChDir(GetItemText(hItem));
return TRUE;
+ case MODITEM_HDR_SONG:
+ if (pModDoc) pModDoc->ActivateWindow();
+ return TRUE;
+
default:
if (qwItemType & 0x8000)
{
@@ -2452,6 +2456,10 @@
}
}
break;
+
+ case MODITEM_HDR_SONG:
+ ExecuteItem(hItem);
+ break;
}
}
}
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/mptrack/resource.h 2009-11-03 09:42:38 UTC (rev 411)
@@ -1145,6 +1145,9 @@
#define ID_CLEANUP_REARRANGESAMPLES 59228
#define ID_ORDERLIST_RENDER 59229
#define ID_EDIT_CLEANUP 59230
+#define ID_ORDERLIST_EDIT_COPY 59231
+#define ID_ORDERLIST_EDIT_CUT 59232
+#define ID_ORDERLIST_EDIT_PASTE 59233
// Next default values for new objects
//
@@ -1152,7 +1155,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 522
-#define _APS_NEXT_COMMAND_VALUE 59231
+#define _APS_NEXT_COMMAND_VALUE 59234
#define _APS_NEXT_CONTROL_VALUE 2410
#define _APS_NEXT_SYMED_VALUE 901
#endif
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-03 09:42:38 UTC (rev 411)
@@ -1816,8 +1816,9 @@
} else
{
// An additional "---" pattern is appended so Impulse Tracker won't ignore the last order item.
- // Interestingly, this can exceed IT's 256 order limit.
+ // Interestingly, this can exceed IT's 256 order limit. Also, IT will always save at least two orders.
header.ordnum = min(Order.GetLengthTailTrimmed(), ModSpecs::itEx.ordersMax) + 1;
+ if(header.ordnum < 2) header.ordnum = 2;
}
@@ -2479,8 +2480,9 @@
header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF);
// An additional "---" pattern is appended so Impulse Tracker won't ignore the last order item.
- // Interestingly, this can exceed IT's 256 order limit.
+ // Interestingly, this can exceed IT's 256 order limit. Also, IT will always save at least two orders.
header.ordnum = min(Order.GetLengthTailTrimmed(), ModSpecs::it.ordersMax) + 1;
+ if(header.ordnum < 2) header.ordnum = 2;
header.patnum = MAX_PATTERNS;
while ((header.patnum > 0) && (!Patterns[header.patnum-1])) {
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-03 09:42:38 UTC (rev 411)
@@ -774,7 +774,7 @@
m_pConfig->SetMixLevels(m_nMixLevels);
RecalculateGainForAllPlugs();
- if (m_nType && (m_nType != MOD_TYPE_MPT))
+ if (m_nType)
{
SetModSpecsPointer(m_pModSpecs, m_nType);
Order.resize(GetModSpecifications().ordersMax);
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-11-03 09:42:38 UTC (rev 411)
@@ -971,7 +971,7 @@
inline uint32 MODSAMPLE::GetSampleRate(const MODTYPE type) const
-//------------------------------------------------------------------
+//--------------------------------------------------------------
{
uint32 nRate;
if(type & (MOD_TYPE_MOD|MOD_TYPE_XM))
@@ -983,7 +983,7 @@
inline IMixPlugin* CSoundFile::GetInstrumentPlugin(INSTRUMENTINDEX instr)
-//----------------------------------------------------------------
+//-----------------------------------------------------------------------
{
if(instr > 0 && instr < MAX_INSTRUMENTS && Instruments[instr] && Instruments[instr]->nMixPlug && Instruments[instr]->nMixPlug <= MAX_MIXPLUGINS)
return m_MixPlugins[Instruments[instr]->nMixPlug-1].pMixPlugin;
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-11-02 21:54:36 UTC (rev 410)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-11-03 09:42:38 UTC (rev 411)
@@ -15,9 +15,20 @@
//----------------------------------------------------------------------------------------------------------
{
LPSTR const pOldSmp = smp.pSample;
+ DWORD dwOrFlags = 0;
+ DWORD dwAndFlags = MAXDWORD;
+ if(smp.uFlags & CHN_16BIT)
+ dwOrFlags |= CHN_16BIT;
+ else
+ dwAndFlags &= ~CHN_16BIT;
+ if(smp.uFlags & CHN_STEREO)
+ dwOrFlags |= CHN_STEREO;
+ else
+ dwAndFlags &= ~CHN_STEREO;
+
BEGIN_CRITICAL();
if (pSndFile != nullptr)
- ctrlChn::ReplaceSample(pSndFile->Chn, pOldSmp, pNewSample, nNewLength);
+ ctrlChn::ReplaceSample(pSndFile->Chn, pOldSmp, pNewSample, nNewLength, dwOrFlags, dwAndFlags);
smp.pSample = pNewSample;
smp.nLength = nNewLength;
CSoundFile::FreeSample(pOldSmp);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-11-02 21:54:46
|
Revision: 410
http://modplug.svn.sourceforge.net/modplug/?rev=410&view=rev
Author: relabsoluness
Date: 2009-11-02 21:54:36 +0000 (Mon, 02 Nov 2009)
Log Message:
-----------
[Fix] Instrument tab: OnMouseMove could cause a crash when moving cursor on Pitch/Filter envelope when not having any instruments.
[Ref] Changes to param control note update done on reordering plugs (see rev. 407)
[Ref] Minor tweaking (cleaned compiler warnings etc.).
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Childfrm.h
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/View_gen.cpp
trunk/OpenMPT/mptrack/View_gen.h
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/soundlib/ModSequence.h
trunk/OpenMPT/soundlib/modcommand.h
trunk/OpenMPT/soundlib/patternContainer.h
Modified: trunk/OpenMPT/mptrack/Childfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Childfrm.h 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/mptrack/Childfrm.h 2009-11-02 21:54:36 UTC (rev 410)
@@ -17,7 +17,7 @@
typedef struct _GENERALVIEWSTATE
{
DWORD cbStruct;
- DWORD nPlugin;
+ PLUGINDEX nPlugin;
DWORD nParam;
DWORD nTab;
} GENERALVIEWSTATE;
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-02 21:54:36 UTC (rev 410)
@@ -151,7 +151,7 @@
m_SndFile.m_nMixLevels = m_SndFile.GetModSpecifications().defaultMixLevels;
m_SndFile.m_pConfig->SetMixLevels(m_SndFile.m_nMixLevels);
// ...and the order length
- m_SndFile.Order.resize(m_SndFile.GetModSpecifications().ordersMax);
+ m_SndFile.Order.resize(min(ModSequenceSet::s_nCacheSize, m_SndFile.GetModSpecifications().ordersMax));
theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg);
ReinitRecordState();
@@ -281,7 +281,7 @@
if (f.Open(pszMidiMapName, CFile::modeRead))
{
- DWORD len = f.GetLength();
+ DWORD len = static_cast<DWORD>(f.GetLength());
LPBYTE lpFile;
if ((len) && ((lpFile = (LPBYTE)GlobalAllocPtr(GHND, len)) != NULL))
{
@@ -831,7 +831,7 @@
pChn->nResonance = 0;
pChn->nVolume = 256;
pChn->nMasterChn = 0; //remove NNA association
- pChn->nNewNote = note;
+ pChn->nNewNote = static_cast<BYTE>(note);
if (nins) { //Set instrument
m_SndFile.resetEnvelopes(pChn);
@@ -1043,7 +1043,7 @@
//mute any NNA'd channels
for (UINT i=m_SndFile.m_nChannels; i<MAX_CHANNELS; i++) {
- if (m_SndFile.Chn[i].nMasterChn == nChn+1) {
+ if (m_SndFile.Chn[i].nMasterChn == nChn + 1u) {
if (doMute) {
m_SndFile.Chn[i].dwFlags |= muteType;
} else {
@@ -1432,7 +1432,7 @@
}
CDoWaveConvert dwcdlg(&m_SndFile, s, &wsdlg.WaveFormat.Format, wsdlg.m_bNormalize, pMainFrm);
- dwcdlg.m_dwFileLimit = wsdlg.m_dwFileLimit;
+ dwcdlg.m_dwFileLimit = static_cast<DWORD>(wsdlg.m_dwFileLimit);
dwcdlg.m_bGivePlugsIdleTime = wsdlg.m_bGivePlugsIdleTime;
dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit;
dwcdlg.m_nMaxPatterns = (wsdlg.m_bSelectPlay) ? wsdlg.m_nMaxOrder - wsdlg.m_nMinOrder + 1 : 0;
@@ -2220,7 +2220,7 @@
}
}
if (gFXInfo[ndx].dwFlags) {
- if (refParam > gFXInfo[ndx].dwFlags) {
+ if (refParam > static_cast<int>(gFXInfo[ndx].dwFlags)) {
refParam = gFXInfo[ndx].dwFlags; //used for Zxx macro control: limit to 7F max.
}
}
@@ -2852,6 +2852,7 @@
//rewbs.customKeys
void* CModDoc::GetChildFrame()
+//----------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
if (!pMainFrm) return 0;
Modified: trunk/OpenMPT/mptrack/View_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_gen.cpp 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/mptrack/View_gen.cpp 2009-11-02 21:54:36 UTC (rev 410)
@@ -823,7 +823,7 @@
if ((nfx >= 0) && (nfx <= MAX_MIXPLUGINS) && (nChn < pSndFile->m_nChannels)
&& (pSndFile->ChnSettings[nChn].nMixPlugin != (UINT)nfx))
{
- pSndFile->ChnSettings[nChn].nMixPlugin = nfx;
+ pSndFile->ChnSettings[nChn].nMixPlugin = (PLUGINDEX)nfx;
if (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) pModDoc->SetModified();
pModDoc->UpdateAllViews(this, HINT_MODCHANNELS | (m_nActiveTab << HINT_SHIFT_CHNTAB));
}
@@ -898,7 +898,7 @@
int nPlugin = m_CbnPlugin.GetCurSel();
if ((pModDoc) && (nPlugin >= 0) && (nPlugin < MAX_MIXPLUGINS))
{
- m_nCurrentPlugin = nPlugin;
+ m_nCurrentPlugin = (PLUGINDEX)nPlugin;
pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS | HINT_MODCHANNELS | (m_nActiveTab << HINT_SHIFT_CHNTAB));
}
// -> CODE#0002
@@ -1314,12 +1314,35 @@
}
-bool CViewGlobals::MovePlug(PLUGINDEX src, PLUGINDEX dest)
-//--------------------------------------------------------
+
+// Functor for adjusting plug indexes in modcommands. Adjusts all instrument column values in
+// range [m_nInstrMin, m_nInstrMax] by m_nDiff.
+struct PlugIndexModifier
+//======================
{
+ PlugIndexModifier(PLUGINDEX nMin, PLUGINDEX nMax, int nDiff) :
+ m_nInstrMin(nMin), m_nInstrMax(nMax), m_nDiff(nDiff) {}
+ void operator()(MODCOMMAND& m)
+ {
+ if (m.IsInstrPlug() && m.instr >= m_nInstrMin && m.instr <= m_nInstrMax)
+ m.instr = (MODCOMMAND::INSTR)((int)m.instr + m_nDiff);
+ }
+ int m_nDiff;
+ MODCOMMAND::INSTR m_nInstrMin;
+ MODCOMMAND::INSTR m_nInstrMax;
+};
+
+
+bool CViewGlobals::MovePlug(PLUGINDEX src, PLUGINDEX dest, bool bAdjustPat)
+//-------------------------------------------------------------------------
+{
+ if (src == dest)
+ return false;
//AfxMessageBox("Moving %d to %d", src, dest);
CModDoc *pModDoc = GetDocument();
CSoundFile* pSndFile = pModDoc->GetSoundFile();
+
+ BeginWaitCursor();
BEGIN_CRITICAL();
@@ -1363,24 +1386,20 @@
}
}
- // Update patterns (param control notes)
- for (PATTERNINDEX nPat = 0; nPat < pSndFile->Patterns.Size(); nPat++) if (pSndFile->Patterns[nPat])
- {
- MODCOMMAND *m = pSndFile->Patterns[nPat];
- for (UINT len = pSndFile->PatternSize[nPat] * pSndFile->m_nChannels; len; m++, len--)
- {
- if((m->note == NOTE_PC || m->note == NOTE_PCS) && m->instr == src + 1)
- m->instr = dest + 1;
- }
- }
+ // Update MODCOMMANDs so that they won't be referring to old indexes (e.g. with NOTE_PC).
+ if (bAdjustPat && pSndFile->GetType() == MOD_TYPE_MPT)
+ pSndFile->Patterns.ForEachModCommand(PlugIndexModifier(src + 1, src + 1, int(dest) - int(src)));
END_CRITICAL();
pModDoc->SetModified();
+ EndWaitCursor();
+
return true;
}
+
void CViewGlobals::BuildEmptySlotList(CArray<UINT, UINT> &emptySlots)
//-------------------------------------------------------------------
{
@@ -1416,9 +1435,14 @@
//possible mem leak here...
}
- for (PLUGINDEX nSlot = MAX_MIXPLUGINS-1; nSlot > (PLUGINDEX)m_nCurrentPlugin; nSlot--) {
+ // Update MODCOMMANDs so that they won't be referring to old indexes (e.g. with NOTE_PC).
+ if (pSndFile->GetType() == MOD_TYPE_MPT)
+ pSndFile->Patterns.ForEachModCommand(PlugIndexModifier(m_nCurrentPlugin + 1, MAX_MIXPLUGINS - 1, 1));
+
+
+ for (PLUGINDEX nSlot = MAX_MIXPLUGINS-1; nSlot > m_nCurrentPlugin; nSlot--) {
if (pSndFile->m_MixPlugins[nSlot-1].pMixPlugin) {
- MovePlug(nSlot-1, nSlot);
+ MovePlug(nSlot-1, nSlot, NoPatternAdjust);
}
}
Modified: trunk/OpenMPT/mptrack/View_gen.h
===================================================================
--- trunk/OpenMPT/mptrack/View_gen.h 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/mptrack/View_gen.h 2009-11-02 21:54:36 UTC (rev 410)
@@ -42,6 +42,8 @@
CSpinButtonCtrl m_SpinMixGain; // update#02
// -! NEW_FEATURE#0028
+ enum {AdjustPattern = true, NoPatternAdjust = false};
+
protected:
CViewGlobals():CFormView(IDD_VIEW_GLOBALS) { m_nLockCount = 1; }
DECLARE_SERIAL(CViewGlobals)
@@ -57,7 +59,7 @@
BOOL IsLocked() const { return (m_nLockCount > 0); }
int GetDlgItemIntEx(UINT nID);
void BuildEmptySlotList(CArray<UINT, UINT> &emptySlots);
- bool MovePlug(PLUGINDEX src, PLUGINDEX dest);
+ bool MovePlug(PLUGINDEX src, PLUGINDEX dest, bool bAdjustPat = AdjustPattern);
public:
//{{AFX_VIRTUAL(CViewGlobals)
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-02 21:54:36 UTC (rev 410)
@@ -110,7 +110,7 @@
memset(m_NcButtonState, 0, sizeof(m_NcButtonState));
m_bmpEnvBar.Create(IDB_ENVTOOLBAR, 20, 0, RGB(192,192,192));
memset(m_baPlayingNote, 0, sizeof(bool)*NOTE_MAX); //rewbs.customKeys
- m_nPlayingChannel =-1; //rewbs.customKeys
+ m_nPlayingChannel = UINT_MAX; //rewbs.customKeys
//rewbs.envRowGrid
m_bGrid=true;
m_bGridForceRedraw=false;
@@ -152,8 +152,8 @@
}
-BOOL CViewInstrument::SetCurrentInstrument(UINT nIns, UINT nEnv)
-//--------------------------------------------------------------
+BOOL CViewInstrument::SetCurrentInstrument(INSTRUMENTINDEX nIns, UINT nEnv)
+//-------------------------------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
DWORD dwNotify;
@@ -1042,7 +1042,7 @@
}
- if (windowResized || m_bGridForceRedraw || (cachedScrollPos != m_GridScrollPos) || (speed != m_GridSpeed)) {
+ if (windowResized || m_bGridForceRedraw || (cachedScrollPos != m_GridScrollPos) || (speed != (UINT)m_GridSpeed)) {
m_GridSpeed = speed;
m_GridScrollPos = cachedScrollPos;
@@ -1161,7 +1161,7 @@
{
maxpoint--;
m_dcMemMain.SelectObject(CMainFrame::penEnvelope);
- int releaseNode = EnvGetReleaseNode();
+ UINT releaseNode = EnvGetReleaseNode();
for (UINT i=0; i<=maxpoint; i++)
{
int x = (EnvGetTick(i) + 1) * ENV_ZOOM - nScrollPos;
@@ -1175,7 +1175,7 @@
} else {
m_dcMemMain.MoveTo(x, y);
}
- if (i==releaseNode) {
+ if (i == releaseNode) {
m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushHighLightRed));
m_dcMemMain.SelectObject(CMainFrame::penEnvelopeHighlight);
} else {
@@ -1371,7 +1371,7 @@
break;
}
memset(m_baPlayingNote, 0, sizeof(bool)*NOTE_MAX); //rewbs.instViewNNA
- m_nPlayingChannel=-1; //rewbs.instViewNNA
+ m_nPlayingChannel = UINT_MAX; //rewbs.instViewNNA
}
} else
if ((pnotify->dwType & dwType) && ((pnotify->dwType & 0xFFFF) == m_nInstrument))
@@ -1639,6 +1639,7 @@
CSoundFile *pSndFile = pModDoc->GetSoundFile();
if(pSndFile == nullptr) return;
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns == nullptr) return;
BOOL bSplitCursor = FALSE;
CHAR s[256];
@@ -1991,7 +1992,7 @@
void CViewInstrument::OnEnvToggleReleasNode()
//---------------------------------------------------
{
- int node = m_nDragItem-1;
+ UINT node = m_nDragItem-1;
CModDoc *pModDoc = GetDocument();
if ((pModDoc) && (node>0) && (node <= EnvGetLastPoint()))
@@ -2002,7 +2003,7 @@
if (envelope->nReleaseNode == node) {
envelope->nReleaseNode = ENV_RELEASE_NODE_UNSET;
} else {
- envelope->nReleaseNode = node;
+ envelope->nReleaseNode = static_cast<BYTE>(node);
}
pModDoc->SetModified();
@@ -2137,11 +2138,11 @@
MODINSTRUMENT *pIns = pModDoc->GetSoundFile()->Instruments[m_nInstrument];
if ((!pIns) || (!pIns->Keyboard[note-1] && !pIns->nMixPlug)) return;
m_baPlayingNote[note] = true; //rewbs.instViewNNA
- m_nPlayingChannel= pModDoc->PlayNote(note, m_nInstrument, 0, FALSE); //rewbs.instViewNNA
+ m_nPlayingChannel = pModDoc->PlayNote(note, m_nInstrument, 0, FALSE); //rewbs.instViewNNA
s[0] = 0;
if ((note) && (note <= NOTE_MAX))
{
- const std::string temp = pModDoc->GetSoundFile()->GetNoteName(note, m_nInstrument);
+ const std::string temp = pModDoc->GetSoundFile()->GetNoteName(static_cast<int16>(note), m_nInstrument);
if(temp.size() >= sizeofS)
wsprintf(s, "%s", "...");
else
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/mptrack/View_ins.h 2009-11-02 21:54:36 UTC (rev 410)
@@ -41,7 +41,7 @@
public:
void UpdateScrollSize();
- BOOL SetCurrentInstrument(UINT nIns, UINT m_nEnv=0);
+ BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, UINT m_nEnv=0);
INSTRUMENTENVELOPE *GetEnvelopePtr() const;
UINT EnvGetTick(int nPoint) const;
UINT EnvGetValue(int nPoint) const;
Modified: trunk/OpenMPT/soundlib/ModSequence.h
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.h 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/soundlib/ModSequence.h 2009-11-02 21:54:36 UTC (rev 410)
@@ -140,13 +140,12 @@
ModSequenceSet& operator=(const ModSequence& seq) {ModSequence::operator=(seq); return *this;}
+ static const ORDERINDEX s_nCacheSize = MAX_ORDERS;
private:
void CopyCacheToStorage();
void CopyStorageToCache();
- static const ORDERINDEX s_nCacheSize = MAX_ORDERS;
-
PATTERNINDEX m_Cache[s_nCacheSize]; // Local cache array.
std::vector<ModSequence> m_Sequences; // Array of sequences.
SEQUENCEINDEX m_nCurrentSeq; // Index of current sequence.
Modified: trunk/OpenMPT/soundlib/modcommand.h
===================================================================
--- trunk/OpenMPT/soundlib/modcommand.h 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/soundlib/modcommand.h 2009-11-02 21:54:36 UTC (rev 410)
@@ -2,6 +2,19 @@
#define MODCOMMAND_H
+// Note definitions
+#define NOTE_NONE 0
+#define NOTE_MIDDLEC (5*12+1)
+#define NOTE_KEYOFF 0xFF //255
+#define NOTE_NOTECUT 0xFE //254
+#define NOTE_FADE 0xFD //253, IT's action for illegal notes - DO NOT SAVE AS 253 as this is IT's internal representation of "no note"!
+#define NOTE_PC 0xFC //252, Param Control 'note'. Changes param value on first tick.
+#define NOTE_PCS 0xFB //251, Param Control(Smooth) 'note'. Changes param value during the whole row.
+#define NOTE_MAX 120 //Defines maximum notevalue(with index starting from 1) as well as maximum number of notes.
+#define NOTE_MAX_SPECIAL NOTE_KEYOFF
+#define NOTE_MIN_SPECIAL NOTE_PCS
+
+
//==============
class MODCOMMAND
//==============
@@ -21,16 +34,9 @@
// Returns empty modcommand.
static MODCOMMAND Empty() {MODCOMMAND m = {0,0,0,0,0,0}; return m;}
- inline bool operator==(const MODCOMMAND& mc) const
- {
- return (memcmp(this, &mc, sizeof(MODCOMMAND)) == 0);
- }
+ bool operator==(const MODCOMMAND& mc) const { return (memcmp(this, &mc, sizeof(MODCOMMAND)) == 0); }
+ bool operator!=(const MODCOMMAND& mc) const { return !(*this == mc); }
- inline bool operator !=(const MODCOMMAND& mc) const
- {
- return !(*this == mc);
- }
-
void Set(NOTE n, INSTR ins, uint16 volcol, uint16 effectcol) {note = n; instr = ins; SetValueVolCol(volcol); SetValueEffectCol(effectcol);}
uint16 GetValueVolCol() const {return GetValueVolCol(volcmd, vol);}
@@ -45,8 +51,11 @@
void Clear() {memset(this, 0, sizeof(MODCOMMAND));}
// Returns true if modcommand is empty, false otherwise.
- inline bool MODCOMMAND::IsEmpty() const {return (*this == Empty());}
+ bool IsEmpty() const {return (*this == Empty());}
+ // Returns true if instrument column represents plugin index.
+ bool IsInstrPlug() const {return note == NOTE_PC || note == NOTE_PCS;}
+
public:
BYTE note;
BYTE instr;
@@ -60,19 +69,6 @@
typedef MODCOMMAND MODCOMMAND_ORIGINAL;
-// Note definitions
-#define NOTE_NONE 0
-#define NOTE_MIDDLEC (5*12+1)
-#define NOTE_KEYOFF 0xFF //255
-#define NOTE_NOTECUT 0xFE //254
-#define NOTE_FADE 0xFD //253, IT's action for illegal notes - DO NOT SAVE AS 253 as this is IT's internal representation of "no note"!
-#define NOTE_PC 0xFC //252, Param Control 'note'. Changes param value on first tick.
-#define NOTE_PCS 0xFB //251, Param Control(Smooth) 'note'. Changes param value during the whole row.
-#define NOTE_MAX 120 //Defines maximum notevalue(with index starting from 1) as well as maximum number of notes.
-#define NOTE_MAX_SPECIAL NOTE_KEYOFF
-#define NOTE_MIN_SPECIAL NOTE_PCS
-
-
// Volume Column commands
#define VOLCMD_NONE 0
#define VOLCMD_VOLUME 1
Modified: trunk/OpenMPT/soundlib/patternContainer.h
===================================================================
--- trunk/OpenMPT/soundlib/patternContainer.h 2009-11-01 16:27:14 UTC (rev 409)
+++ trunk/OpenMPT/soundlib/patternContainer.h 2009-11-02 21:54:36 UTC (rev 410)
@@ -46,6 +46,13 @@
//'invisible' - the pattern data is cleared but the actual pattern object won't get removed.
bool Remove(const PATTERNINDEX index);
+ // Applies function object for modcommands in patterns in given range.
+ // Return: Copy of the function object.
+ template <class Func>
+ Func ForEachModCommand(PATTERNINDEX nStartPat, PATTERNINDEX nLastPat, Func func);
+ template <class Func>
+ Func ForEachModCommand(Func func) {return ForEachModCommand(0, Size() - 1, func);}
+
PATTERNINDEX Size() const {return static_cast<PATTERNINDEX>(m_Patterns.size());}
CSoundFile& GetSoundFile() {return m_rSndFile;}
@@ -76,6 +83,18 @@
};
+template <class Func>
+Func CPatternContainer::ForEachModCommand(PATTERNINDEX nStartPat, PATTERNINDEX nLastPat, Func func)
+//-------------------------------------------------------------------------------------------------
+{
+ if (nStartPat > nLastPat || nLastPat >= Size())
+ return func;
+ for (PATTERNINDEX nPat = nStartPat; nPat <= nLastPat; nPat++) if (m_Patterns[nPat])
+ std::for_each(m_Patterns[nPat].Begin(), m_Patterns[nPat].End(), func);
+ return func;
+}
+
+
const char FileIdPatterns[] = "mptPc";
void ReadModPatterns(std::istream& iStrm, CPatternContainer& patc, const size_t nSize = 0);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-01 16:27:20
|
Revision: 409
http://modplug.svn.sourceforge.net/modplug/?rev=409&view=rev
Author: saga-games
Date: 2009-11-01 16:27:14 +0000 (Sun, 01 Nov 2009)
Log Message:
-----------
[Fix] Pitch shift: Was slightly broken for 8-bit samples.
[Fix] Sample editor: Time Stretch / Pitch Shift button's caption was not updated properly.
[Imp] Sample undo limitation: Slightly improved handling of INI value
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-11-01 13:53:08 UTC (rev 408)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-11-01 16:27:14 UTC (rev 409)
@@ -306,9 +306,6 @@
// Stretch ratio
SetDlgItemInt(IDC_EDIT6,100,FALSE);
- // Processing state text label
- SetDlgItemText(IDC_STATIC1,"");
-
// Stretch to size check box
OnEnableStretchToSize();
@@ -1686,7 +1683,7 @@
GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(bTimeStretch ? SW_SHOW : SW_HIDE);
GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
GetDlgItem(IDC_COMBO4)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
- SetDlgItemText(IDC_BUTTON1, "Time Stretch");
+ SetDlgItemText(IDC_BUTTON1, bTimeStretch ? "Time Stretch" : "Pitch Shift");
if(bTimeStretch) UpdateTimeStretchParameterString();
}
@@ -1700,7 +1697,7 @@
//Ensure m_dTimeStretchRatio is up-to-date with textbox content
UpdateData(TRUE);
- //Calculate/verify samplerate at C4.
+ //Calculate/verify samplerate at C5.
long lSampleRate = pSmp->nC5Speed;
if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
lSampleRate = (double)CSoundFile::TransposeToFrequency(pSmp->RelativeTone, pSmp->nFineTune);
@@ -1801,18 +1798,6 @@
const uint32 nSampleRate = pSmp->GetSampleRate(m_pSndFile->GetType());
- // SoundTouch(v1.4.0) documentation says that sample rates 8000-48000 are supported.
- // Check whether sample rate is within that range, and if not,
- // ask user whether to proceed.
- if(nSampleRate < 8000 || nSampleRate > 48000)
- {
- CString str;
- str.Format(TEXT(GetStrI18N("Current samplerate, %u Hz, is not in the supported samplerate range 8000 Hz - 48000 Hz. Continue?")), nSampleRate);
- if(AfxMessageBox(str, MB_ICONQUESTION|MB_YESNO) != IDYES)
- return -1;
-
- }
-
// SoundTouch(1.3.1) seems to crash with short samples. Don't know what
// the actual limit or whether it depends on sample rate,
// but simply set some semiarbitrary threshold here.
@@ -1850,6 +1835,18 @@
smpsize = pSmp->GetElementarySampleSize();
}
+ // SoundTouch(v1.4.0) documentation says that sample rates 8000-48000 are supported.
+ // Check whether sample rate is within that range, and if not,
+ // ask user whether to proceed.
+ if(nSampleRate < 8000 || nSampleRate > 48000)
+ {
+ CString str;
+ str.Format(TEXT(GetStrI18N("Current samplerate, %u Hz, is not in the supported samplerate range 8000 Hz - 48000 Hz. Continue?")), nSampleRate);
+ if(AfxMessageBox(str, MB_ICONQUESTION|MB_YESNO) != IDYES)
+ return -1;
+
+ }
+
// Allocate new sample. Returned sample may not be exactly the size what ratio would suggest
// so allocate a bit more(1.03*).
const DWORD nNewSampleLength = (DWORD)(1.03 * ratio * (double)pSmp->nLength);
@@ -1881,7 +1878,6 @@
// Show wait mouse cursor
BeginWaitCursor();
- SetDlgItemText(IDC_STATIC1, "Stretching...");
UINT pos = 0;
UINT len = 0; //To contain length of processing step.
@@ -1981,7 +1977,6 @@
SetDlgItemText(IDC_BUTTON1, oldText);
// Restore mouse cursor
- SetDlgItemText(IDC_STATIC1,"");
EndWaitCursor();
return 0;
@@ -2011,14 +2006,6 @@
UINT fft = 1 << (combo->GetCurSel() + 8);
while(fft > MAX_BUFFER_LENGTH) fft >>= 1;
- // Get original sample rate
- long lSampleRate = pSmp->nC5Speed;
- if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) lSampleRate = CSoundFile::TransposeToFrequency(pSmp->RelativeTone, pSmp->nFineTune);
- if(lSampleRate <= 0) lSampleRate = 8363;
-
- // Deduce max sample value (float conversion step)
- float maxSampleValue = ( 1 << (smpsize * 8 - 1) ) - 1;
-
// Save process button text (to be used as "progress bar" indicator while processing)
CHAR oldText[255];
GetDlgItemText(IDC_BUTTON1, oldText, 255);
@@ -2039,7 +2026,6 @@
// Show wait mouse cursor
BeginWaitCursor();
- SetDlgItemText(IDC_STATIC1,"Pitch shifting...");
// PitchShift seems to work only with 16-bit samples.
@@ -2050,6 +2036,12 @@
smpsize = pSmp->GetElementarySampleSize();
}
+ // Get original sample rate
+ long lSampleRate = pSmp->GetSampleRate(m_pSndFile->GetType());
+
+ // Deduce max sample value (float conversion step)
+ float maxSampleValue = ( 1 << (smpsize * 8 - 1) ) - 1;
+
// Allocate working buffers
float * buffer = new float[MAX_BUFFER_LENGTH + fft];
float * outbuf = new float[MAX_BUFFER_LENGTH + fft];
@@ -2159,7 +2151,6 @@
SetDlgItemText(IDC_BUTTON1, oldText);
// Restore mouse cursor
- SetDlgItemText(IDC_STATIC1,"");
EndWaitCursor();
return 0;
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-11-01 13:53:08 UTC (rev 408)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-11-01 16:27:14 UTC (rev 409)
@@ -204,7 +204,7 @@
| PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE;
DWORD CMainFrame::m_nRowSpacing = 16;
DWORD CMainFrame::m_nRowSpacing2 = 4;
-UINT CMainFrame::m_nSampleUndoMaxBuffer = 100;
+UINT CMainFrame::m_nSampleUndoMaxBuffer = 100 << 20;
// GDI
HICON CMainFrame::m_hIcon = NULL;
@@ -444,7 +444,8 @@
CSoundFile::s_DefaultPlugVolumeHandling = static_cast<uint8>(GetPrivateProfileInt("Misc", "DefaultPlugVolumeHandling", PLUGIN_VOLUMEHANDLING_IGNORE, iniFile));
if(CSoundFile::s_DefaultPlugVolumeHandling > 2) CSoundFile::s_DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
- m_nSampleUndoMaxBuffer = GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer, iniFile) << 20;
+ m_nSampleUndoMaxBuffer = GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer, iniFile);
+ m_nSampleUndoMaxBuffer = max(1, m_nSampleUndoMaxBuffer) << 20;
TCHAR szPath[_MAX_PATH] = "";
GetPrivateProfileString("Paths", "Songs_Directory", GetDefaultDirectory(DIR_MODS), szPath, INIBUFFERSIZE, iniFile);
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-11-01 13:53:08 UTC (rev 408)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-11-01 16:27:14 UTC (rev 409)
@@ -829,7 +829,7 @@
if (gMemStatus.dwTotalPhys < 16*1024*1024) gMemStatus.dwTotalPhys = 16*1024*1024;
CMainFrame::m_nSampleUndoMaxBuffer = gMemStatus.dwTotalPhys / 10; // set sample undo buffer size
- if(CMainFrame::m_nSampleUndoMaxBuffer < 1) CMainFrame::m_nSampleUndoMaxBuffer = 1;
+ if(CMainFrame::m_nSampleUndoMaxBuffer < (1 << 20)) CMainFrame::m_nSampleUndoMaxBuffer = (1 << 20);
ASSERT(NULL == m_pDocManager);
m_pDocManager = new CModDocManager();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-11-01 13:53:27
|
Revision: 408
http://modplug.svn.sourceforge.net/modplug/?rev=408&view=rev
Author: saga-games
Date: 2009-11-01 13:53:08 +0000 (Sun, 01 Nov 2009)
Log Message:
-----------
[New] Sample editor: Sample Undo. 100 steps per sample (independent), undo buffer is cut off at a tenth of physical memory (that would be 400 MB for a system with 4 GB of RAM). Cutoff size can be specified by setting UndoBufferSize (in Megabytes) in section [Sample Editor] of mptrack.ini.
[Mod] Sample editor: Removed time stretcher's / pitch shifter's preview function as it's unnecessary now.
[Imp] Sample editor: When sample is 8-bit, it will automatically be converted to 16-bit when applying time stretching / pitch shifting.
[Imp] Comments tab: If sample size is < 1 KB, amount of bytes is shown instead of "0 KB"
[Fix] Sample editor: Insert Silence: Loop points were not updated when adding silence at the beginning of the sample
[Fix] IT Loader: Use correct header size (1.xx or 2.xx header) for comparison when checking instrument headers
[Ref] Pattern undo uses vectors now.
[Ref] Added GetBytesPerSample() in MODSAMPLE to get the bytes per sampling point (Basically a shorter version of GetElementarySampleSize() * GetNumChannels())
[Ref] More refactoring especially in the sample editor code to make undo more easy.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CleanupSong.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.h
trunk/OpenMPT/mptrack/EffectVis.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_smp.cpp
trunk/OpenMPT/mptrack/View_smp.h
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/dlg_misc.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/mptrack.vcproj
trunk/OpenMPT/mptrack/mptrack_08.vcproj
trunk/OpenMPT/mptrack/view_com.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mod.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
trunk/OpenMPT/soundlib/modsmp_ctrl.h
trunk/OpenMPT/soundlib/pattern.cpp
Added Paths:
-----------
trunk/OpenMPT/mptrack/Undo.cpp
trunk/OpenMPT/mptrack/Undo.h
Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -441,7 +441,7 @@
EndWaitCursor();
if ((nPatRemoved) || (bReordered))
{
- m_pModDoc->ClearPatternUndo();
+ m_pModDoc->GetPatternUndo()->ClearUndo();
if (nPatRemoved)
{
wsprintf(s, "%d pattern%s removed.\n", nPatRemoved, (nPatRemoved == 1) ? "" : "s");
@@ -535,6 +535,7 @@
if ((j == pSndFile->m_nSamples) && (j > 1)) pSndFile->m_nSamples--;
END_CRITICAL();
nRemoved++;
+ m_pModDoc->GetSampleUndo()->ClearUndo(j);
}
}
wsprintf(s, "%d unused sample%s removed\n" ,nRemoved, (nRemoved == 1) ? "" : "s");
@@ -573,7 +574,11 @@
&& (pSndFile->Samples[nSmp].nLength > pSndFile->Samples[nSmp].nLoopEnd + 2))
{
UINT lmax = pSndFile->Samples[nSmp].nLoopEnd + 2;
- if ((lmax < pSndFile->Samples[nSmp].nLength) && (lmax >= 16)) pSndFile->Samples[nSmp].nLength = lmax;
+ if ((lmax < pSndFile->Samples[nSmp].nLength) && (lmax >= 2))
+ {
+ m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete, lmax, pSndFile->Samples[nSmp].nLength);
+ ctrlSmp::ResizeSample(pSndFile->Samples[nSmp], lmax, pSndFile);
+ }
}
}
wsprintf(s, "%d sample loop%s optimized\n" ,nLoopOpt, (nLoopOpt == 1) ? "" : "s");
@@ -651,6 +656,9 @@
}
}
+ // Too lazy to fix sample undo...
+ m_pModDoc->GetSampleUndo()->ClearUndo();
+
pSndFile->m_nSamples -= nRemap;
return true;
@@ -927,7 +935,8 @@
if (pSndFile->m_nSamples == 0) return false;
for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->m_nSamples; nSmp++)
{
- if (pSndFile->Samples[nSmp].pSample)
+ m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete, 0, pSndFile->Samples[nSmp].nLength);
+ if(pSndFile->Samples[nSmp].pSample)
{
BEGIN_CRITICAL();
pSndFile->DestroySample(nSmp);
@@ -962,6 +971,8 @@
}
}
+ if(removeSamples == -1) m_pModDoc->GetSampleUndo()->ClearUndo();
+
for (INSTRUMENTINDEX i = 1; i <= pSndFile->m_nInstruments; i++)
{
pSndFile->DestroyInstrument(i, removeSamples);
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -377,7 +377,7 @@
}
if (dwHintMask & (HINT_MODTYPE|HINT_UNDO))
{
- m_ToolBar.EnableButton(ID_EDIT_UNDO, m_pModDoc->CanPatternUndo());
+ m_ToolBar.EnableButton(ID_EDIT_UNDO, m_pModDoc->GetPatternUndo()->CanUndo());
}
}
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -74,8 +74,6 @@
ON_COMMAND(ID_NEXTINSTRUMENT, OnNextInstrument)
ON_COMMAND(IDC_BUTTON1, OnPitchShiftTimeStretch)
ON_COMMAND(IDC_BUTTON2, OnEstimateSampleSize)
- ON_COMMAND(IDC_BUTTON3, OnPitchShiftTimeStretchAccept)
- ON_COMMAND(IDC_BUTTON4, OnPitchShiftTimeStretchCancel)
ON_COMMAND(IDC_CHECK3, OnEnableStretchToSize)
ON_EN_CHANGE(IDC_SAMPLE_NAME, OnNameChanged)
ON_EN_CHANGE(IDC_SAMPLE_FILENAME, OnFileNameChanged)
@@ -159,8 +157,6 @@
{
m_nSample = 1;
m_nLockCount = 1;
- pSampleUndoBuffer = NULL;
- UndoBufferSize = 0;
}
@@ -168,9 +164,6 @@
CCtrlSamples::~CCtrlSamples()
//---------------------------
{
- if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer);
- pSampleUndoBuffer = NULL;
- UndoBufferSize = 0;
}
@@ -261,18 +254,13 @@
GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_SHOW); // PitchShiftTimeStretch
GetDlgItem(IDC_BUTTON2)->ShowWindow(SW_SHOW); // EstimateSampleSize
- GetDlgItem(IDC_BUTTON3)->ShowWindow(SW_SHOW); // PitchShiftTimeStretchAccept
- GetDlgItem(IDC_BUTTON4)->ShowWindow(SW_SHOW); // PitchShiftTimeStretchCancel
- GetDlgItem(IDC_CHECK2)->ShowWindow(SW_SHOW); // Preview mode
GetDlgItem(IDC_CHECK3)->ShowWindow(SW_SHOW); // EnableStretchToSize
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW); //
GetDlgItem(IDC_GROUPBOX_PITCH_TIME)->ShowWindow(SW_SHOW); //
GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_SHOW); //
GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_SHOW); //
GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_SHOW); //
- GetDlgItem(IDC_TEXT_PREVIEW)->ShowWindow(SW_SHOW); //
GetDlgItem(IDC_GROUPBOX_PITCH_TIME)->ShowWindow(SW_SHOW); //
- GetDlgItem(IDC_TEXT_PERCENT)->ShowWindow(SW_SHOW); //
CHAR str[16];
@@ -315,10 +303,6 @@
combo->SetCurSel(3);
}
- //Disable preview buttons
- ((CButton *)GetDlgItem(IDC_BUTTON3))->ShowWindow(SW_HIDE);
- ((CButton *)GetDlgItem(IDC_BUTTON4))->ShowWindow(SW_HIDE);
-
// Stretch ratio
SetDlgItemInt(IDC_EDIT6,100,FALSE);
@@ -348,8 +332,6 @@
if (pSndFile->m_nSamples < 1) pSndFile->m_nSamples = 1;
if ((nSmp < 1) || (nSmp > pSndFile->m_nSamples)) return FALSE;
- if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-
LockControls();
if (m_nSample != nSmp)
{
@@ -713,8 +695,6 @@
DWORD len;
BOOL bOk;
- if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-
BeginWaitCursor();
if ((!lpszFileName) || (!f.Open(lpszFileName)))
{
@@ -727,6 +707,9 @@
lpFile = f.Lock(len);
if (!lpFile) goto OpenError;
BEGIN_CRITICAL();
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace);
+
if (m_pSndFile->ReadSampleFromFile(m_nSample, lpFile, len))
{
bOk = TRUE;
@@ -779,6 +762,9 @@
bOk = TRUE;
}
END_CRITICAL();
+ } else
+ {
+ m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample);
}
}
f.Unlock();
@@ -830,10 +816,9 @@
{
if ((!pSndFile) || (!nSample) || (nSample > pSndFile->m_nSamples)) return FALSE;
- if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-
BeginWaitCursor();
BEGIN_CRITICAL();
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace);
m_pSndFile->DestroySample(m_nSample);
m_pSndFile->ReadSampleFromSong(m_nSample, pSndFile, nSample);
MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
@@ -859,8 +844,6 @@
{
if ((!IsLocked()) && (m_pSndFile))
{
- if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-
UINT n = GetDlgItemInt(IDC_EDIT_SAMPLE);
if ((n > 0) && (n <= m_pSndFile->m_nSamples) && (n != m_nSample))
{
@@ -899,8 +882,6 @@
LONG smp = m_pModDoc->InsertSample(TRUE);
if (smp != SAMPLEINDEX_INVALID)
{
- if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
SetCurrentSample(smp);
// 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
@@ -1156,6 +1137,9 @@
iEnd = pSmp->nLength;
}
}
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(iSmp, sundo_update, iStart, iEnd);
+
if (pSmp->uFlags & CHN_STEREO) { iStart *= 2; iEnd *= 2; }
if (pSmp->uFlags & CHN_16BIT)
@@ -1218,31 +1202,23 @@
void CCtrlSamples::ApplyAmplify(LONG lAmp, bool bFadeIn, bool bFadeOut)
//-----------------------------------------------------------------------
{
- SAMPLEVIEWSTATE viewstate;
- DWORD dwStart, dwEnd;
MODSAMPLE *pSmp;
- memset(&viewstate, 0, sizeof(viewstate));
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
if ((!m_pModDoc) || (!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
BeginWaitCursor();
pSmp = &m_pSndFile->Samples[m_nSample];
- dwStart = viewstate.dwBeginSel;
- dwEnd = viewstate.dwEndSel;
- if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength;
- if (dwStart > dwEnd) dwStart = dwEnd;
- if (dwStart >= dwEnd)
- {
- dwStart = 0;
- dwEnd = pSmp->nLength;
- }
- if (pSmp->uFlags & CHN_STEREO) { dwStart *= 2; dwEnd *= 2; }
- UINT len = dwEnd - dwStart;
+
+ SELECTIONPOINTS selection = GetSelectionPoints();
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_update, selection.nStart, selection.nEnd);
+
+ if (pSmp->uFlags & CHN_STEREO) { selection.nStart *= 2; selection.nEnd *= 2; }
+ UINT len = selection.nEnd - selection.nStart;
if ((bFadeIn) && (bFadeOut)) lAmp *= 4;
if (pSmp->uFlags & CHN_16BIT)
{
- signed short *p = ((signed short *)pSmp->pSample) + dwStart;
+ signed short *p = ((signed short *)pSmp->pSample) + selection.nStart;
for (UINT i=0; i<len; i++)
{
@@ -1255,7 +1231,7 @@
}
} else
{
- signed char *p = ((signed char *)pSmp->pSample) + dwStart;
+ signed char *p = ((signed char *)pSmp->pSample) + selection.nStart;
for (UINT i=0; i<len; i++)
{
@@ -1282,12 +1258,8 @@
if(!m_pModDoc || !m_pSndFile)
return;
- SAMPLEVIEWSTATE viewstate;
UINT iMinSample = m_nSample, iMaxSample = m_nSample;
- memset(&viewstate, 0, sizeof(viewstate));
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
-
//Shift -> Process all samples
if(CMainFrame::GetInputHandler()->ShiftPressed())
{
@@ -1317,9 +1289,13 @@
}
else
{
- iStart = viewstate.dwBeginSel;
- iEnd = viewstate.dwEndSel;
+ SELECTIONPOINTS selection = GetSelectionPoints();
+ iStart = selection.nStart;
+ iEnd = selection.nEnd;
}
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(iSmp, sundo_update, iStart, iEnd);
+
const float fOffset = ctrlSmp::RemoveDCOffset(m_pSndFile->Samples[iSmp], iStart, iEnd, m_pSndFile->GetType(), m_pSndFile);
if(fOffset == 0.0f) // No offset removed.
@@ -1379,24 +1355,25 @@
void CCtrlSamples::OnUpsample()
//-----------------------------
{
- SAMPLEVIEWSTATE viewstate;
MODSAMPLE *pSmp;
DWORD dwStart, dwEnd, dwNewLen;
UINT smplsize, newsmplsize;
PVOID pOriginal, pNewSample;
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
BeginWaitCursor();
pSmp = &m_pSndFile->Samples[m_nSample];
- dwStart = viewstate.dwBeginSel;
- dwEnd = viewstate.dwEndSel;
+ SELECTIONPOINTS selection = GetSelectionPoints();
+
+ dwStart = selection.nStart;
+ dwEnd = selection.nEnd;
if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength;
if (dwStart >= dwEnd)
{
dwStart = 0;
dwEnd = pSmp->nLength;
}
+
smplsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1;
if (pSmp->uFlags & CHN_STEREO) smplsize *= 2;
newsmplsize = (pSmp->uFlags & CHN_STEREO) ? 4 : 2;
@@ -1406,6 +1383,8 @@
if (dwNewLen+4 <= MAX_SAMPLE_LENGTH) pNewSample = CSoundFile::AllocateSample((dwNewLen+4)*newsmplsize);
if (pNewSample)
{
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace);
+
UINT nCh = (pSmp->uFlags & CHN_STEREO) ? 2 : 1;
for (UINT iCh=0; iCh<nCh; iCh++)
{
@@ -1495,10 +1474,7 @@
m_pSndFile->Chn[iFix].dwFlags |= CHN_16BIT;
}
}
- pSmp->uFlags |= CHN_16BIT;
- pSmp->pSample = (LPSTR)pNewSample;
- pSmp->nLength = dwNewLen;
- if (viewstate.dwEndSel <= viewstate.dwBeginSel)
+ if (selection.bSelected == false)
{
if(!(m_pSndFile->m_nType & MOD_TYPE_MOD))
{
@@ -1506,11 +1482,19 @@
if (pSmp->RelativeTone < 84) pSmp->RelativeTone += 12;
}
}
+ pSmp->uFlags |= CHN_16BIT;
+ pSmp->pSample = (LPSTR)pNewSample;
+ pSmp->nLength = dwNewLen;
+
CSoundFile::FreeSample(pOriginal);
END_CRITICAL();
m_pModDoc->AdjustEndOfSample(m_nSample);
- if (viewstate.dwEndSel > viewstate.dwBeginSel)
+ if (selection.bSelected == true)
{
+ SAMPLEVIEWSTATE viewstate;
+ memset(&viewstate, 0, sizeof(viewstate));
+ SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
+
viewstate.dwBeginSel = dwStart;
viewstate.dwEndSel = dwEnd + (dwEnd-dwStart);
SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)&viewstate);
@@ -1527,18 +1511,18 @@
void CCtrlSamples::OnDownsample()
//-------------------------------
{
- SAMPLEVIEWSTATE viewstate;
MODSAMPLE *pSmp;
DWORD dwStart, dwEnd, dwRemove, dwNewLen;
UINT smplsize;
PVOID pOriginal, pNewSample;
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
BeginWaitCursor();
pSmp = &m_pSndFile->Samples[m_nSample];
- dwStart = viewstate.dwBeginSel;
- dwEnd = viewstate.dwEndSel;
+ SELECTIONPOINTS selection = GetSelectionPoints();
+
+ dwStart = selection.nStart;
+ dwEnd = selection.nEnd;
if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength;
if (dwStart >= dwEnd)
{
@@ -1555,6 +1539,9 @@
if ((dwNewLen > 32) && (dwRemove)) pNewSample = CSoundFile::AllocateSample((dwNewLen+4)*smplsize);
if (pNewSample)
{
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace);
+
UINT nCh = (pSmp->uFlags & CHN_STEREO) ? 2 : 1;
for (UINT iCh=0; iCh<nCh; iCh++)
{
@@ -1624,7 +1611,7 @@
m_pSndFile->Chn[iFix].nLength = 0;
}
}
- if (viewstate.dwEndSel <= viewstate.dwBeginSel)
+ if (selection.bSelected == false)
{
if(!(m_pSndFile->m_nType & MOD_TYPE_MOD))
{
@@ -1637,8 +1624,12 @@
CSoundFile::FreeSample(pOriginal);
END_CRITICAL();
m_pModDoc->AdjustEndOfSample(m_nSample);
- if (viewstate.dwEndSel > viewstate.dwBeginSel)
+ if (selection.bSelected == true)
{
+ SAMPLEVIEWSTATE viewstate;
+ memset(&viewstate, 0, sizeof(viewstate));
+ SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
+
viewstate.dwBeginSel = dwStart;
viewstate.dwEndSel = dwStart + dwRemove;
SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)&viewstate);
@@ -1682,40 +1673,21 @@
//----------------------------------------
{
// Enable time-stretching / disable unused pitch-shifting UI elements
- if(IsDlgButtonChecked(IDC_CHECK3)){
- ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(FALSE);
- ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(TRUE);
- ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(TRUE); //rewbs.timeStretchMods
- GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_COMBO5)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_COMBO6)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_COMBO4)->ShowWindow(SW_HIDE);
- //if(CMainFrame::gbShowHackControls == true)
- //{
- GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(SW_SHOW);
- GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(SW_SHOW);
- //}
- SetDlgItemText(IDC_BUTTON1, "Time Stretch");
- UpdateTimeStretchParameterString();
- }
- // Enable pitch-shifting / disable unused time-stretching UI elements
- else{
- ReadTimeStretchParameters();
- GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_SHOW);
- GetDlgItem(IDC_COMBO5)->ShowWindow(SW_SHOW);
- GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_SHOW);
- GetDlgItem(IDC_COMBO6)->ShowWindow(SW_SHOW);
- ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(TRUE);
- ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(FALSE);
- ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(FALSE); //rewbs.timeStretchMods
- GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(SW_HIDE);
- GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_SHOW);
- GetDlgItem(IDC_COMBO4)->ShowWindow(SW_SHOW);
- SetDlgItemText(IDC_BUTTON1, "Pitch Shift");
- }
+ bool bTimeStretch = IsDlgButtonChecked(IDC_CHECK3) ? true : false;
+ if(!bTimeStretch) ReadTimeStretchParameters();
+ ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(bTimeStretch ? false : true);
+ ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(bTimeStretch ? true : false);
+ ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(bTimeStretch ? true : false); //rewbs.timeStretchMods
+ GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
+ GetDlgItem(IDC_COMBO5)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
+ GetDlgItem(IDC_TEXT_FFT)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
+ GetDlgItem(IDC_COMBO6)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
+ GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(bTimeStretch ? SW_SHOW : SW_HIDE);
+ GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(bTimeStretch ? SW_SHOW : SW_HIDE);
+ GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
+ GetDlgItem(IDC_COMBO4)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW);
+ SetDlgItemText(IDC_BUTTON1, "Time Stretch");
+ if(bTimeStretch) UpdateTimeStretchParameterString();
}
void CCtrlSamples::OnEstimateSampleSize()
@@ -1758,25 +1730,6 @@
MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
if(!pSmp || pSmp->nLength == 0) goto error;
- // Preview management
- if(IsDlgButtonChecked(IDC_CHECK2)){
- // Free previous undo buffer
- if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer);
- // Allocate sample undo buffer
- BYTE smpsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1;
- UINT nChn = (pSmp->uFlags & CHN_STEREO) ? 2 : 1;
- UndoBufferSize = pSmp->nLength * nChn * smpsize;
- pSampleUndoBuffer = CSoundFile::AllocateSample(UndoBufferSize);
- // Not enough memory...
- if(pSampleUndoBuffer == NULL){
- UndoBufferSize = 0;
- errorcode = 3;
- goto error;
- }
- // Copy sample to sample undo buffer
- memcpy(pSampleUndoBuffer,pSmp->pSample,UndoBufferSize);
- }
-
// Time stretching
if(IsDlgButtonChecked(IDC_CHECK3)){
//rewbs.timeStretchMods
@@ -1811,24 +1764,6 @@
errorcode = PitchShift(pitch);
}
- // Preview management
- if(errorcode == 0 && IsDlgButtonChecked(IDC_CHECK2)){
- ((CButton *)GetDlgItem(IDC_BUTTON1))->ShowWindow(SW_HIDE);
- ((CButton *)GetDlgItem(IDC_BUTTON3))->ShowWindow(SW_SHOW);
- ((CButton *)GetDlgItem(IDC_BUTTON4))->ShowWindow(SW_SHOW);
- SetDlgItemText(IDC_STATIC1,"Preview...");
-
- //rewbs.timeStretchMods
- //Disable all pitch shift / timestrech buttons until accepted or restored:
- GetDlgItem(IDC_COMBO5)->EnableWindow(FALSE);
- GetDlgItem(IDC_COMBO6)->EnableWindow(FALSE);
- GetDlgItem(IDC_CHECK3)->EnableWindow(FALSE);
- GetDlgItem(IDC_COMBO4)->EnableWindow(FALSE);
- GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
- //end rewbs.timeStretchMods
- }
-
// Error management
error:
@@ -1841,8 +1776,6 @@
break;
case 3 : wsprintf(str,"Not enough memory...");
break;
- case 4 : wsprintf(str, "Action can be applied only to 16-bit samples.");
- break;
case 5 : wsprintf(str, "Too low sample rate");
break;
case 6 : wsprintf(str, "Too short sample");
@@ -1858,85 +1791,7 @@
m_pModDoc->SetModified();
}
-void CCtrlSamples::OnPitchShiftTimeStretchAccept()
-//------------------------------------------------
-{
- // Free sample undo buffer
- if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer);
- pSampleUndoBuffer = NULL;
- UndoBufferSize = 0;
- // Restore UI buttons
- ((CButton *)GetDlgItem(IDC_BUTTON1))->ShowWindow(SW_SHOW);
- ((CButton *)GetDlgItem(IDC_BUTTON3))->ShowWindow(SW_HIDE);
- ((CButton *)GetDlgItem(IDC_BUTTON4))->ShowWindow(SW_HIDE);
- SetDlgItemText(IDC_STATIC1,"");
- //rewbs.timeStretchMods
- //Disable all pitch shift / timestrech buttons until accepted or restored:
- GetDlgItem(IDC_COMBO5)->EnableWindow(TRUE);
- GetDlgItem(IDC_COMBO6)->EnableWindow(TRUE);
- GetDlgItem(IDC_CHECK3)->EnableWindow(TRUE);
- if (IsDlgButtonChecked(IDC_CHECK3))
- {
- GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE);
- GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
- }
- else
- {
- GetDlgItem(IDC_COMBO4)->EnableWindow(TRUE);
- }
- //end rewbs.timeStretchMods
-}
-
-void CCtrlSamples::OnPitchShiftTimeStretchCancel()
-{
- if((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
- MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
- if(!pSmp) return;
-
- // Save processed sample buffer pointer
- PVOID oldbuffer = pSmp->pSample;
- BYTE smpsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1;
- UINT nChn = (pSmp->uFlags & CHN_STEREO) ? 2 : 1;
-
- // Restore undo buffer pointer & update song data
- BEGIN_CRITICAL();
- for(UINT i=0 ; i < MAX_CHANNELS ; i++){
- if((PVOID)m_pSndFile->Chn[i].pSample == oldbuffer){
- m_pSndFile->Chn[i].pSample = (LPSTR)pSampleUndoBuffer;
- m_pSndFile->Chn[i].pCurrentSample = (LPSTR)pSampleUndoBuffer;
- m_pSndFile->Chn[i].nLength = 0;
- }
- }
- pSmp->pSample = (LPSTR)pSampleUndoBuffer;
- pSmp->nLength = UndoBufferSize / (smpsize * nChn);
-
- //rewbs.timeStretchMods
- // Restore loop points, if they were time stretched:
- // Note: m_dTimeStretchRatio will not have changed since we disable
- // GUI controls until preview is accepted/restored.
- if(IsDlgButtonChecked(IDC_CHECK3)) {
- pSmp->nLoopStart /= m_dTimeStretchRatio/100.0;
- pSmp->nLoopEnd /= m_dTimeStretchRatio/100.0;
- pSmp->nSustainStart /= m_dTimeStretchRatio/100.0;
- pSmp->nSustainEnd /= m_dTimeStretchRatio/100.0;
- }
- //end rewbs.timeStretchMods
-
- END_CRITICAL();
-
- // Set processed sample buffer pointer as undo sample buffer pointer
- pSampleUndoBuffer = oldbuffer;
-
- // Free sample undo buffer & restore UI buttons
- OnPitchShiftTimeStretchAccept();
-
- // Update sample view
- m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); // !!!! see CODE#0006, update#3
- m_pModDoc->SetModified();
-}
-
-
int CCtrlSamples::TimeStretch(double ratio)
//-----------------------------------------
{
@@ -1958,11 +1813,6 @@
}
- // Stretching is implemented only for 16-bit samples. Return with
- // error if trying to use wtih non 16-bit samples.
- if(pSmp->GetElementarySampleSize() != 2)
- return 4;
-
// SoundTouch(1.3.1) seems to crash with short samples. Don't know what
// the actual limit or whether it depends on sample rate,
// but simply set some semiarbitrary threshold here.
@@ -1989,14 +1839,21 @@
}
// Get number of channels & sample size
- const BYTE smpsize = pSmp->GetElementarySampleSize();
+ BYTE smpsize = pSmp->GetElementarySampleSize();
const UINT nChn = pSmp->GetNumChannels();
+ // Stretching is implemented only for 16-bit samples.
+ if(smpsize != 2)
+ {
+ // This has to be converted to 16-bit first.
+ OnUpsample();
+ smpsize = pSmp->GetElementarySampleSize();
+ }
+
// Allocate new sample. Returned sample may not be exactly the size what ratio would suggest
// so allocate a bit more(1.03*).
const DWORD nNewSampleLength = (DWORD)(1.03 * ratio * (double)pSmp->nLength);
//const DWORD nNewSampleLength = (DWORD)(0.5 + ratio * (double)pSmp->nLength);
- PVOID pSample = pSmp->pSample;
PVOID pNewSample = CSoundFile::AllocateSample(nNewSampleLength * nChn * smpsize);
if(pNewSample == NULL)
{
@@ -2112,19 +1969,9 @@
ASSERT(nNewSampleLength >= nLengthCounter);
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace);
// Swap sample buffer pointer to new buffer, update song + sample data & free old sample buffer
- BEGIN_CRITICAL();
- for(UINT i=0 ; i < MAX_CHANNELS ; i++){
- if((PVOID)m_pSndFile->Chn[i].pSample == pSample){
- m_pSndFile->Chn[i].pSample = (LPSTR)pNewSample;
- m_pSndFile->Chn[i].pCurrentSample = (LPSTR)pNewSample;
- m_pSndFile->Chn[i].nLength = 0;
- }
- }
- pSmp->pSample = (LPSTR)pNewSample;
- CSoundFile::FreeSample(pSample);
- pSmp->nLength = min(nLengthCounter, nNewSampleLength);
- END_CRITICAL();
+ ctrlSmp::ReplaceSample(*pSmp, (LPSTR)pNewSample, min(nLengthCounter, nNewSampleLength), m_pSndFile);
// Free progress bar brushes
DeleteObject((HBRUSH)green);
@@ -2151,14 +1998,9 @@
MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
if(!pSmp) return 2;
- // PitchShift seems to work only with 16-bit samples. Return with
- // error if trying to use non 16-bit samples.
- if(pSmp->GetElementarySampleSize() != 2)
- return 4;
-
// Get number of channels & sample size
- BYTE smpsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1;
- UINT nChn = (pSmp->uFlags & CHN_STEREO) ? 2 : 1;
+ BYTE smpsize = pSmp->GetElementarySampleSize();
+ UINT nChn = pSmp->GetNumChannels();
// Get selected oversampling - quality - (also refered as FFT overlapping) factor
CComboBox *combo = (CComboBox *)GetDlgItem(IDC_COMBO5);
@@ -2199,10 +2041,21 @@
BeginWaitCursor();
SetDlgItemText(IDC_STATIC1,"Pitch shifting...");
+
+ // PitchShift seems to work only with 16-bit samples.
+ if(smpsize != 2)
+ {
+ // This has to be converted to 16-bit first.
+ OnUpsample();
+ smpsize = pSmp->GetElementarySampleSize();
+ }
+
// Allocate working buffers
float * buffer = new float[MAX_BUFFER_LENGTH + fft];
float * outbuf = new float[MAX_BUFFER_LENGTH + fft];
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace);
+
// Process each channel separately
for(UINT i = 0 ; i < nChn ; i++){
@@ -2316,73 +2169,18 @@
void CCtrlSamples::OnReverse()
//----------------------------
{
- SAMPLEVIEWSTATE viewstate;
- MODSAMPLE *pSmp;
- DWORD dwBeginSel, dwEndSel;
- LPVOID pSample;
- UINT rlen, smplsize;
-
- memset(&viewstate, 0, sizeof(viewstate));
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
- if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
- BeginWaitCursor();
- dwBeginSel = viewstate.dwBeginSel;
- dwEndSel = viewstate.dwEndSel;
- pSmp = &m_pSndFile->Samples[m_nSample];
- rlen = pSmp->nLength;
- pSample = pSmp->pSample;
- smplsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1;
- if (pSmp->uFlags & CHN_STEREO) smplsize *= 2;
- if ((dwEndSel > dwBeginSel) && (dwEndSel <= rlen))
- {
- rlen = dwEndSel - dwBeginSel;
- pSample = ((LPBYTE)pSmp->pSample) + dwBeginSel * smplsize;
- }
- if (rlen >= 2)
- {
-
- if (smplsize == 4)
- {
- UINT len = rlen / 2;
- UINT max = rlen - 1;
- int *p = (int *)pSample;
+ MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
- for (UINT i=0; i<len; i++)
- {
- int tmp = p[max-i];
- p[max-i] = p[i];
- p[i] = tmp;
- }
- } else
- if (smplsize == 2)
- {
- UINT len = rlen / 2;
- UINT max = rlen - 1;
- signed short *p = (signed short *)pSample;
+ SELECTIONPOINTS selection = GetSelectionPoints();
- for (UINT i=0; i<len; i++)
- {
- signed short tmp = p[max-i];
- p[max-i] = p[i];
- p[i] = tmp;
- }
- } else
- {
- UINT len = rlen / 2;
- UINT max = rlen - 1;
- signed char *p = (signed char *)pSample;
-
- for (UINT i=0; i<len; i++)
- {
- signed char tmp = p[max-i];
- p[max-i] = p[i];
- p[i] = tmp;
- }
- }
- m_pModDoc->AdjustEndOfSample(m_nSample);
- // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_reverse, selection.nStart, selection.nEnd);
+ if(ctrlSmp::ReverseSample(pSmp, selection.nStart, selection.nEnd, m_pSndFile) == true)
+ {
m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL);
m_pModDoc->SetModified();
+ } else
+ {
+ m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample);
}
EndWaitCursor();
SwitchToView();
@@ -2390,22 +2188,31 @@
void CCtrlSamples::OnInvert()
-//--------------------------------
+//---------------------------
{
- ApplyAmplify(-100);
+ MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
+
+ SELECTIONPOINTS selection = GetSelectionPoints();
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_invert, selection.nStart, selection.nEnd);
+ if(ctrlSmp::InvertSample(pSmp, selection.nStart, selection.nEnd, m_pSndFile) == true)
+ {
+ m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL);
+ m_pModDoc->SetModified();
+ } else
+ {
+ m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample);
+ }
+ EndWaitCursor();
+ SwitchToView();
}
void CCtrlSamples::OnSignUnSign()
//-------------------------------
{
- // purpose: sign/unsign a sample ("distortion")
- SAMPLEVIEWSTATE viewstate;
- DWORD dwStart, dwEnd;
MODSAMPLE *pSmp;
- memset(&viewstate, 0, sizeof(viewstate));
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
if ((!m_pModDoc) || (!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
if(m_pModDoc->IsNotePlaying(0, m_nSample, 0) == TRUE)
@@ -2413,29 +2220,17 @@
BeginWaitCursor();
pSmp = &m_pSndFile->Samples[m_nSample];
- dwStart = viewstate.dwBeginSel;
- dwEnd = viewstate.dwEndSel;
- if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength;
- if (dwStart > dwEnd) dwStart = dwEnd;
- if (dwStart >= dwEnd)
+ SELECTIONPOINTS selection = GetSelectionPoints();
+
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_unsign, selection.nStart, selection.nEnd);
+ if(ctrlSmp::UnsignSample(pSmp, selection.nStart, selection.nEnd, m_pSndFile) == true)
{
- dwStart = 0;
- dwEnd = pSmp->nLength;
- }
- if (pSmp->uFlags & CHN_STEREO) { dwStart *= 2; dwEnd *= 2; }
- UINT len = dwEnd - dwStart;
- if (pSmp->uFlags & CHN_16BIT)
+ m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL);
+ m_pModDoc->SetModified();
+ } else
{
- signed short *p = ((signed short *)pSmp->pSample) + dwStart;
- for (UINT i=0; i<len; ++i) p[i] += 0x8000; //unsign
- } else {
- signed char *p = ((signed char *)pSmp->pSample) + dwStart;
- for (UINT i=0; i<len; ++i) p[i] += 0x80; //unsign
+ m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample);
}
-
- m_pModDoc->AdjustEndOfSample(m_nSample);
- m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL);
- m_pModDoc->SetModified();
EndWaitCursor();
SwitchToView();
}
@@ -2444,55 +2239,54 @@
void CCtrlSamples::OnSilence()
//----------------------------
{
- SAMPLEVIEWSTATE viewstate;
MODSAMPLE *pSmp;
- DWORD dwBeginSel, dwEndSel;
- memset(&viewstate, 0, sizeof(viewstate));
- SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return;
BeginWaitCursor();
- dwBeginSel = viewstate.dwBeginSel;
- dwEndSel = viewstate.dwEndSel;
- pSmp = &m_pSndFile->Samples[m_nSample];
- if (dwEndSel > pSmp->nLength) dwEndSel = pSmp->nLength;
- if (dwEndSel > dwBeginSel+1)
+ SELECTIONPOINTS selection = GetSelectionPoints();
+
+ // never apply silence to a sample that has no selection
+ if(selection.bSelected == true)
{
- int len = dwEndSel - dwBeginSel;
+ pSmp = &m_pSndFile->Samples[m_nSample];
+ m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_update, selection.nStart, selection.nEnd);
+
+ int len = selection.nEnd - selection.nStart;
if (pSmp->uFlags & CHN_STEREO)
{
int smplsize = (pSmp->uFlags & CHN_16BIT) ? 4 : 2;
- signed char *p = ((signed char *)pSmp->pSample) + dwBeginSel*smplsize;
+ signed char *p = ((signed char *)pSmp->pSample) + selection.nStart * smplsize;
memset(p, 0, len*smplsize);
} else
- if (pSmp->uFlags & CHN_16BIT)
- {
- short int *p = ((short int *)pSmp->pSample) + dwBeginSel;
- int dest = (dwEndSel < pSmp->nLength) ? p[len-1] : 0;
- int base = (dwBeginSel) ? p[0] : 0;
- int delta = dest - base;
- for (int i=0; i<len; i++)
+ if (pSmp->uFlags & CHN_16BIT)
{
- int n = base + (int)(((LONGLONG)delta * (LONGLONG)i) / (len-1));
- p[i] = (signed short)n;
- }
- } else
- {
- signed char *p = ((signed char *)pSmp->pSample) + dwBeginSel;
- int dest = (dwEndSel < pSmp->nLength) ? p[len-1] : 0;
- int base = (dwBeginSel) ? p[0] : 0;
- int delta = dest - base;
- for (int i=0; i<len; i++)
+ short int *p = ((short int *)pSmp->pSample) + selection.nStart;
+ int dest = (selection.nEnd < pSmp->nLength) ? p[len-1] : 0;
+ int base = (selection.nStart) ? p[0] : 0;
+ int delta = dest - base;
+ for (int i=0; i<len; i++)
+ {
+ int n = base + (int)(((LONGLONG)delta * (LONGLONG)i) / (len-1));
+ p[i] = (signed short)n;
+ }
+ } else
{
- int n = base + (delta * i) / (len-1);
- p[i] = (signed char)n;
+ signed char *p = ((signed char *)pSmp->pSample) + selection.nStart;
+ int dest = (selection.nEnd < pSmp->nLength) ? p[len-1] : 0;
+ int base = (selection.nStart) ? p[0] : 0;
+ int delta = dest - base;
+ for (int i=0; i<len; i++)
+ {
+ int n = base + (delta * i) / (len-1);
+ p[i] = (signed char)n;
+ }
}
- }
- m_pModDoc->AdjustEndOfSample(m_nSample);
- // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
- m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL);
- m_pModDoc->SetModified();
+ m_pModDoc->AdjustEndOfSample(m_nSample);
+ // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
+ m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL);
+ m_pModDoc->SetModified();
}
+
EndWaitCursor();
SwitchToView();
}
@@ -3207,3 +3001,31 @@
return 0;
}
//end rewbs.customKeys
+
+
+// Return currently selected part of the sample.
+// The whole sample size will be returned if no part of the sample is selected.
+// However, point.bSelected indicates whether a sample selection exists or not.
+SELECTIONPOINTS CCtrlSamples::GetSelectionPoints()
+//------------------------------------------------
+{
+ SELECTIONPOINTS points;
+ SAMPLEVIEWSTATE viewstate;
+ MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
+
+ memset(&viewstate, 0, sizeof(viewstate));
+ SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate);
+ points.nStart = viewstate.dwBeginSel;
+ points.nEnd = viewstate.dwEndSel;
+ if(points.nEnd > pSmp->nLength) points.nEnd = pSmp->nLength;
+ if(points.nStart > points.nEnd) points.nStart = points.nEnd;
+ points.bSelected = true;
+ if(points.nStart >= points.nEnd)
+ {
+ points.nStart = 0;
+ points.nEnd = pSmp->nLength;
+ points.bSelected = false;
+ }
+ return points;
+}
+
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-11-01 13:53:08 UTC (rev 408)
@@ -2,6 +2,13 @@
#define _CONTROL_SAMPLES_H_
+struct SELECTIONPOINTS
+{
+ UINT nStart;
+ UINT nEnd;
+ bool bSelected; // does sample selection exist or not?
+};
+
//=======================================
class CCtrlSamples: public CModControlDlg
//=======================================
@@ -27,8 +34,6 @@
enum {nDefaultStretchChunkSize = 8192};
CComboBox m_ComboPitch, m_ComboQuality, m_ComboFFT;
- PVOID pSampleUndoBuffer;
- UINT UndoBufferSize;
int PitchShift(float pitch);
int TimeStretch(double ratio);
@@ -38,6 +43,7 @@
// Applies amplification to sample. Negative values
// can be used to invert phase.
void ApplyAmplify(LONG nAmp, bool bFadeIn = false, bool bFadeOut = false);
+ SELECTIONPOINTS GetSelectionPoints();
public:
CCtrlSamples();
@@ -104,8 +110,6 @@
afx_msg void OnPitchShiftTimeStretch();
afx_msg void OnEnableStretchToSize();
afx_msg void OnEstimateSampleSize();
- afx_msg void OnPitchShiftTimeStretchAccept();
- afx_msg void OnPitchShiftTimeStretchCancel();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
Modified: trunk/OpenMPT/mptrack/EffectVis.cpp
===================================================================
--- trunk/OpenMPT/mptrack/EffectVis.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/EffectVis.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -578,7 +578,7 @@
rect.SetRect(x-NODEHALF, y-NODEHALF, x+NODEHALF+1, y+NODEHALF+1);
if (rect.PtInRect(point))
{
- m_pModDoc->PreparePatternUndo(m_nPattern, m_nChan, row, m_nChan+1, row+1);
+ m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChan, row, m_nChan+1, row+1);
m_nDragItem = row;
}
}
@@ -669,7 +669,7 @@
SetFocus();
SetCapture();
- m_pModDoc->PreparePatternUndo(m_nPattern, m_nChan, m_startRow, m_nChan+1, m_endRow);
+ m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChan, m_startRow, m_nChan+1, m_endRow);
m_dwStatus |= FXVSTATUS_LDRAGGING;
}
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -204,6 +204,7 @@
| PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE;
DWORD CMainFrame::m_nRowSpacing = 16;
DWORD CMainFrame::m_nRowSpacing2 = 4;
+UINT CMainFrame::m_nSampleUndoMaxBuffer = 100;
// GDI
HICON CMainFrame::m_hIcon = NULL;
@@ -443,6 +444,8 @@
CSoundFile::s_DefaultPlugVolumeHandling = static_cast<uint8>(GetPrivateProfileInt("Misc", "DefaultPlugVolumeHandling", PLUGIN_VOLUMEHANDLING_IGNORE, iniFile));
if(CSoundFile::s_DefaultPlugVolumeHandling > 2) CSoundFile::s_DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
+ m_nSampleUndoMaxBuffer = GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer, iniFile) << 20;
+
TCHAR szPath[_MAX_PATH] = "";
GetPrivateProfileString("Paths", "Songs_Directory", GetDefaultDirectory(DIR_MODS), szPath, INIBUFFERSIZE, iniFile);
SetDefaultDirectory(szPath, DIR_MODS);
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-11-01 13:53:08 UTC (rev 408)
@@ -406,6 +406,9 @@
static BOOL gbPatternVUMeters, gbPatternPluginNames, gbPatternRecord;
static DWORD m_dwPatternSetup, m_dwMidiSetup, m_nRowSpacing, m_nRowSpacing2, m_nKeyboardCfg, gnHotKeyMask;
static bool m_bHideUnavailableCtxMenuItems;
+ // Sample Editor Setup
+ static UINT m_nSampleUndoMaxBuffer;
+
// GDI
static HICON m_hIcon;
static HFONT m_hGUIFont, m_hFixedFont, m_hLargeFixedFont;
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -95,7 +95,10 @@
m_bPaused = TRUE;
m_lpszLog = NULL;
m_hWndFollow = NULL;
- memset(PatternUndo, 0, sizeof(PatternUndo));
+
+ m_PatternUndo.SetParent(this);
+ m_SampleUndo.SetParent(this);
+
#ifdef _DEBUG
MODCHANNEL *p = m_SndFile.Chn;
if (((DWORD)p) & 7) Log("MODCHANNEL is not aligned (0x%08X)\n", p);
@@ -113,7 +116,6 @@
CModDoc::~CModDoc()
//-----------------
{
- ClearPatternUndo();
ClearLog();
}
@@ -149,7 +151,7 @@
m_SndFile.m_nMixLevels = m_SndFile.GetModSpecifications().defaultMixLevels;
m_SndFile.m_pConfig->SetMixLevels(m_SndFile.m_nMixLevels);
// ...and the order length
- m_SndFile.Order.resize(min(MAX_ORDERS, m_SndFile.GetModSpecifications().ordersMax));
+ m_SndFile.Order.resize(m_SndFile.GetModSpecifications().ordersMax);
theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg);
ReinitRecordState();
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-11-01 13:53:08 UTC (rev 408)
@@ -11,9 +11,9 @@
#include "sndfile.h"
#include "misc_util.h"
+#include "Undo.h"
-
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bit Mask for updating view (hints of what changed)
@@ -89,20 +89,6 @@
STATIC_ASSERT( ((-1 << HINT_SHIFT_SEQUENCE) & HINT_MASK_ITEM) == (-1 << HINT_SHIFT_SEQUENCE) );
-
-// Undo
-#define MAX_UNDO_LEVEL 100
-
-// Pattern Undo
-typedef struct PATTERNUNDOBUFFER
-{
- UINT pattern, patternsize;
- UINT column, row;
- UINT cx, cy;
- MODCOMMAND *pbuffer;
-} PATTERNUNDOBUFFER, *PPATTERNUNDOBUFFER;
-
-
//parametered macro presets:
enum
{
@@ -128,7 +114,6 @@
BOOL m_bPaused;
HWND m_hWndFollow;
DWORD m_dwNotifyType;
- PATTERNUNDOBUFFER PatternUndo[MAX_UNDO_LEVEL];
bool bModifiedAutosave; // Modified since last autosave?
@@ -140,6 +125,9 @@
std::bitset<MAX_BASECHANNELS> m_bsMultiSplitRecordMask;
// -! NEW_FEATURE#0015
+ CPatternUndo m_PatternUndo;
+ CSampleUndo m_SampleUndo;
+
protected: // create from serialization only
CModDoc();
DECLARE_SERIAL(CModDoc)
@@ -189,6 +177,10 @@
static int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
static void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
void SongProperties();
+
+ CPatternUndo *GetPatternUndo() { return &m_PatternUndo; }
+ CSampleUndo *GetSampleUndo() { return &m_SampleUndo; }
+
// operations
public:
BOOL ChangeModType(MODTYPE wType);
@@ -243,15 +235,14 @@
bool MoveOrder(ORDERINDEX nSourceNdx, ORDERINDEX nDestNdx, bool bUpdate = true, bool bCopy = false, SEQUENCEINDEX nSourceSeq = SEQUENCEINDEX_INVALID, SEQUENCEINDEX nDestSeq = SEQUENCEINDEX_INVALID);
BOOL ExpandPattern(PATTERNINDEX nPattern);
BOOL ShrinkPattern(PATTERNINDEX nPattern);
+
+ // Copy&Paste
BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel);
BOOL PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix=FALSE); //rewbs.mixpaste
BOOL CopyEnvelope(UINT nIns, UINT nEnv);
BOOL PasteEnvelope(UINT nIns, UINT nEnv);
- BOOL ClearPatternUndo();
- BOOL PreparePatternUndo(UINT pattern, UINT x, UINT y, UINT cx, UINT cy);
- UINT DoPatternUndo();
- BOOL CanPatternUndo();
+
LRESULT ActivateView(UINT nIdView, DWORD dwParam);
void UpdateAllViews(CView *pSender, LPARAM lHint=0L, CObject *pHint=NULL);
HWND GetEditPosition(ROWINDEX &row, PATTERNINDEX &pat, ORDERINDEX &ord); //rewbs.customKeys
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -369,7 +369,8 @@
AddToLog("WARNING: Instrument envelopes have been shortened.\n");
SetModified();
- ClearPatternUndo();
+ GetPatternUndo()->ClearUndo();
+ GetSampleUndo()->ClearUndo();
UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL);
EndWaitCursor();
return TRUE;
@@ -470,7 +471,7 @@
EndWaitCursor();
}
SetModified();
- ClearPatternUndo();
+ GetPatternUndo()->ClearUndo();
UpdateAllViews(NULL, HINT_MODTYPE);
return TRUE;
}
@@ -543,7 +544,7 @@
END_CRITICAL();
EndWaitCursor();
SetModified();
- ClearPatternUndo();
+ GetPatternUndo()->ClearUndo();
UpdateAllViews(NULL, HINT_MODTYPE);
return FALSE;
}
@@ -1144,7 +1145,7 @@
if ((hCpy) && ((p = (LPSTR)GlobalLock(hCpy)) != NULL))
{
- PreparePatternUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
+ GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
TEMPO spdmax = m_SndFile.GetModSpecifications().speedMax;
DWORD dwMemSize = GlobalSize(hCpy);
MODCOMMAND *m = m_SndFile.Patterns[nPattern];
@@ -1350,7 +1351,7 @@
nPattern = m_SndFile.Order[oNextOrder];
if(m_SndFile.Patterns.IsValidPat(nPattern) == false) goto PasteDone;
m = m_SndFile.Patterns[nPattern];
- PreparePatternUndo(nPattern, 0,0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
+ GetPatternUndo()->PrepareUndo(nPattern, 0,0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
oCurrentOrder = oNextOrder;
}
}
@@ -1559,126 +1560,6 @@
}
-/////////////////////////////////////////////////////////////////////////////////////////
-// Pattern Undo Functions
-
-BOOL CModDoc::ClearPatternUndo()
-//------------------------------
-{
- for (UINT i=0; i<MAX_UNDO_LEVEL; i++)
- {
- if (PatternUndo[i].pbuffer) delete[] PatternUndo[i].pbuffer;
- PatternUndo[i].cx = 0;
- PatternUndo[i].cy = 0;
- PatternUndo[i].pbuffer = NULL;
- }
- return TRUE;
-}
-
-
-BOOL CModDoc::CanPatternUndo()
-//----------------------------
-{
- return (PatternUndo[0].pbuffer) ? TRUE : FALSE;
-}
-
-
-BOOL CModDoc::PreparePatternUndo(UINT pattern, UINT x, UINT y, UINT cx, UINT cy)
-//------------------------------------------------------------------------------
-{
- MODCOMMAND *pUndo, *pPattern;
- UINT nRows;
- BOOL bUpdate;
-
- if ((pattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[pattern])) return FALSE;
- nRows = m_SndFile.PatternSize[pattern];
- pPattern = m_SndFile.Patterns[pattern];
- if ((y >= nRows) || (cx < 1) || (cy < 1) || (x >= m_SndFile.m_nChannels)) return FALSE;
- if (y+cy >= nRows) cy = nRows-y;
- if (x+cx >= m_SndFile.m_nChannels) cx = m_SndFile.m_nChannels - x;
- BeginWaitCursor();
- pUndo = new MODCOMMAND[cx*cy];
- if (!pUndo)
- {
- EndWaitCursor();
- return FALSE;
- }
- bUpdate = (PatternUndo[0].pbuffer) ? FALSE : TRUE;
- if (PatternUndo[MAX_UNDO_LEVEL-1].pbuffer)
- {
- delete[] PatternUndo[MAX_UNDO_LEVEL-1].pbuffer;
- PatternUndo[MAX_UNDO_LEVEL-1].pbuffer = NULL;
- }
- for (UINT i=MAX_UNDO_LEVEL-1; i>=1; i--)
- {
- PatternUndo[i] = PatternUndo[i-1];
- }
- PatternUndo[0].pattern = pattern;
- PatternUndo[0].patternsize = m_SndFile.PatternSize[pattern];
- PatternUndo[0].column = x;
- PatternUndo[0].row = y;
- PatternUndo[0].cx = cx;
- PatternUndo[0].cy = cy;
- PatternUndo[0].pbuffer = pUndo;
- pPattern += x + y*m_SndFile.m_nChannels;
- for (UINT iy=0; iy<cy; iy++)
- {
- memcpy(pUndo, pPattern, cx*sizeof(MODCOMMAND));
- pUndo += cx;
- pPattern += m_SndFile.m_nChannels;
- }
- EndWaitCursor();
- if (bUpdate) UpdateAllViews(NULL, HINT_UNDO);
- return TRUE;
-}
-
-
-UINT CModDoc::DoPatternUndo()
-//---------------------------
-{
- MODCOMMAND *pUndo, *pPattern;
- UINT nPattern, nRows;
-
- if ((!PatternUndo[0].pbuffer) || (PatternUndo[0].pattern >= m_SndFile.Patterns.Size())) return (UINT)-1;
- nPattern = PatternUndo[0].pattern;
- nRows = PatternUndo[0].patternsize;
- if (PatternUndo[0].column + PatternUndo[0].cx <= m_SndFile.m_nChannels)
- {
- if ((!m_SndFile.Patterns[nPattern]) || (m_SndFile.PatternSize[nPattern] < nRows))
- {
- MODCOMMAND *newPattern = CSoundFile::AllocatePattern(nRows, m_SndFile.m_nChannels);
- MODCOMMAND *oldPattern = m_SndFile.Patterns[nPattern];
- if (!newPattern) return (UINT)-1;
- const ROWINDEX nOldRowCount = m_SndFile.Patterns[nPattern].GetNumRows();
- m_SndFile.Patterns[nPattern].SetData(newPattern, nRows);
- if (oldPattern)
- {
- memcpy(newPattern, oldPattern, m_SndFile.m_nChannels*nOldRowCount*sizeof(MODCOMMAND));
- CSoundFile::FreePattern(oldPattern);
- }
- }
- pUndo = PatternUndo[0].pbuffer;
- pPattern = m_SndFile.Patterns[nPattern];
- if (!m_SndFile.Patterns[nPattern]) return (UINT)-1;
- pPattern += PatternUndo[0].column + (PatternUndo[0].row * m_SndFile.m_nChannels);
- for (UINT iy=0; iy<PatternUndo[0].cy; iy++)
- {
- memcpy(pPattern, pUndo, PatternUndo[0].cx * sizeof(MODCOMMAND));
- pPattern += m_SndFile.m_nChannels;
- pUndo += PatternUndo[0].cx;
- }
- }
- delete[] PatternUndo[0].pbuffer;
- for (UINT i=0; i<MAX_UNDO_LEVEL-1; i++)
- {
- PatternUndo[i] = PatternUndo[i+1];
- }
- PatternUndo[MAX_UNDO_LEVEL-1].pbuffer = NULL;
- if (!PatternUndo[0].pbuffer) UpdateAllViews(NULL, HINT_UNDO);
- return nPattern;
-}
-
-
void CModDoc::CheckUnusedChannels(BOOL mask[MAX_CHANNELS], CHANNELINDEX maxRemoveCount)
//--------------------------------------------------------
{
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-10-30 22:47:43 UTC (rev 407)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -828,6 +828,9 @@
// Allow allocations of at least 16MB
if (gMemStatus.dwTotalPhys < 16*1024*1024) gMemStatus.dwTotalPhys = 16*1024*1024;
+ CMainFrame::m_nSampleUndoMaxBuffer = gMemStatus.dwTotalPhys / 10; // set sample undo buffer size
+ if(CMainFrame::m_nSampleUndoMaxBuffer < 1) CMainFrame::m_nSampleUndoMaxBuffer = 1;
+
ASSERT(NULL == m_pDocManager);
m_pDocManager = new CModDocManager();
Added: trunk/OpenMPT/mptrack/Undo.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Undo.cpp (rev 0)
+++ trunk/OpenMPT/mptrack/Undo.cpp 2009-11-01 13:53:08 UTC (rev 408)
@@ -0,0 +1,460 @@
+/*
+ * Undo.cpp
+ * --------
+ * Purpose: Undo functions for pattern and sample editor
+ * Notes : (currently none)
+ * Authors: Olivier Lapicque
+ * OpenMPT Devs
+ */
+
+
+#include "stdafx.h"
+#include "moddoc.h"
+#include "MainFrm.h"
+#include "modsmp_ctrl.h"
+#include "Undo.h"
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Pattern Undo Functions
+
+
+// Remove all undo steps.
+void CPatternUndo::ClearUndo()
+//----------------------------
+{
+ while(UndoBuffer.size() > 0)
+ {
+ DeleteUndoStep(0);
+ }
+}
+
+
+// Create undo point.
+bool CPatternUndo::PrepareUndo(PATTERNINDEX pattern, UINT x, UINT y, UINT cx, UINT cy)
+//------------------------------------------------------------------------------------
+{
+ if(m_pModDoc == nullptr) return false;
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+
+ PATTERNUNDOBUFFER sUndo;
+ MODCOMMAND *pUndoData, *pPattern;
+ UINT nRows;
+
+ if (!pSndFile->Patterns.IsValidPat(pattern)) return false;
+ nRows = pSndFile->PatternSize[pattern];
+ pPattern = pSndFile->Patterns[pattern];
+ if ((y >= nRows) || (cx < 1) || (cy < 1) || (x >= pSndFile->m_nChannels)) return false;
+ if (y + cy >= nRows) cy = nRows - y;
+ if (x + cx >= pSndFile->m_nChannels) cx = pSndFile->m_nChannels - x;
+
+ pUndoData = new MODCOMMAND[cx * cy];
+ if (!pUndoData) return false;
+
+ const bool bUpdate = !CanUndo(); // update undo status?
+
+ // Remove an undo step if there are too many.
+ while(UndoBuffer.size() >= MAX_UNDO_LEVEL)
+ {
+ DeleteUndoStep(0);
+ }
+
+ sUndo.pattern = pattern;
+ sUndo.patternsize = pSndFile->PatternSize[pattern];
+ sUndo.column = x;
+ sUndo.row = y;
+ sUndo.cx = cx;
+ sUndo.cy = cy;
+ sUndo.pbuffer = pUndoData;
+ pPattern += x + y * pSndFile->m_nChannels;
+ for (UINT iy = 0; iy < cy; iy++)
+ {
+ memcpy(pUndoData, pPattern, cx * sizeof(MODCOMMAND));
+ pUndoData += cx;
+ pPattern += pSndFile->m_nChannels;
+ }
+
+ UndoBuffer.push_back(sUndo);
+
+ if (bUpdate) m_pModDoc->UpdateAllViews(NULL, HINT_UNDO);
+ return true;
+}
+
+
+// Restore an undo point. Returns which pattern has been modified.
+PATTERNINDEX CPatternUndo::Undo()
+//-------------------------------
+{
+ if(m_pModDoc == nullptr) return PATTERNINDEX_INVALID;
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return PATTERNINDEX_INVALID;
+
+ MODCOMMAND *pUndoData, *pPattern;
+ PATTERNINDEX nPattern;
+ ROWINDEX nRows;
+
+ if (CanUndo() == false) return PATTERNINDEX_INVALID;
+
+ // If the most recent undo step is invalid, trash it.
+ while(UndoBuffer.back().pattern >= pSndFile->Patterns.Size())
+ {
+ RemoveLastUndoStep();
+ }
+
+ // Select most recent undo slot
+ const PATTERNUNDOBUFFER *pUndo = &UndoBuffer.back();
+
+ nPattern = pUndo->pattern;
+ nRows = pUndo->patternsize;
+ if(pUndo->column + pUndo->cx <= pSndFile->m_nChannels)
+ {
+ if((!pSndFile->Patterns[nPattern]) || (pSndFile->PatternSize[nPattern] < nRows))
+ {
+ MODCOMMAND *newPattern = CSoundFile::AllocatePattern(nRows, pSndFile->m_nChannels);
+ MODCOMMAND *oldPattern = pSndFile->Patterns[nPattern];
+ if (!newPattern) return PATTERNINDEX_INVALID;
+ const ROWINDEX nOldRowCount = pSndFile->Patterns[nPattern].GetNumRows();
+ pSndFile->Patterns[nPattern].SetData(newPattern, nRows);
+ if(oldPattern)
+ {
+ memcpy(newPattern, oldPattern, pSndFile->m_nChannels * nOldRowCount * sizeof(MODCOMMAND));
+ CSoundFile::FreePattern(oldPattern);
+ }
+ }
+ pUndoData = pUndo->pbuffer;
+ pPattern = pSndFile->Patterns[nPattern];
+ if (!pSndFile->Patterns[nPattern]) return PATTERNINDEX_INVALID;
+ pPattern += pUndo->column + (pUndo->row * pSndFile->m_nChannels);
+ for(UINT iy = 0; iy < pUndo->cy; iy++)
+ {
+ memcpy(pPattern, pUndoData, pUndo->cx * sizeof(MODCOMMAND));
+ pPattern += pSndFile->m_nChannels;
+ pUndoData += pUndo->cx;
+ }
+ }
+
+ RemoveLastUndoStep();
+
+ if (CanUndo() == false) m_pModDoc->UpdateAllViews(NULL, HINT_UNDO);
+ return nPattern;
+}
+
+
+// Check if an undo buffer actually exists.
+bool CPatternUndo::CanUndo()
+//--------------------------
+{
+ return (UndoBuffer.size() > 0) ? true : false;
+}
+
+
+// Delete a given undo step.
+void CPatternUndo::DeleteUndoStep(UINT nStep)
+//-------------------------------------------
+{
+ if(nStep >= UndoBuffer.size()) return;
+ if (UndoBuffer[nStep].pbuffer) delete[] UndoBuffer[nStep].pbuffer;
+ UndoBuffer.erase(UndoBuffer.begin() + nStep);
+}
+
+
+// Public helper function to remove the most recent undo point.
+void CPatternUndo::RemoveLastUndoStep()
+//-------------------------------------
+{
+ if(CanUndo() == false) return;
+ DeleteUndoStep(UndoBuffer.size() - 1);
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Sample Undo Functions
+
+
+// Remove all undo steps for all samples.
+void CSampleUndo::ClearUndo()
+//---------------------------
+{
+ for(SAMPLEINDEX nSmp = 1; nSmp <= MAX_SAMPLES; nSmp++)
+ {
+ ClearUndo(nSmp);
+ }
+ UndoBuffer.clear();
+}
+
+
+// Remove all undo steps of a given sample.
+void CSampleUndo::ClearUndo(const SAMPLEINDEX nSmp)
+//-------------------------------------------------
+{
+ if(!SampleBufferExists(nSmp, false)) return;
+
+ while(UndoBuffer[nSmp - 1].size() > 0)
+ {
+ DeleteUndoStep(nSmp, 0);
+ }
+}
+
+
+// Create undo point for given sample.
+// The main program has to tell what kind of changes are going to be made to the sample.
+// That way, a lot of RAM can be saved, because some actions don't even require an undo sample buffer.
+bool CSampleUndo::PrepareUndo(const SAMPLEINDEX nSmp, sampleUndoTypes nChangeType, UINT nChangeStart, UINT nChangeEnd)
+//--------------------------------------------------------------------------------------------------------------------
+{
+ if(m_pModDoc == nullptr || !SampleBufferExists(nSmp)) return false;
+
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+
+ // Remove an undo step if there are too many.
+ while(UndoBuffer[nSmp - 1].size() >= MAX_UNDO_LEVEL)
+ {
+ DeleteUndoStep(nSmp, 0);
+ }
+
+ // Restrict amount of memory that's being used
+ RestrictBufferSize();
+
+ // Create new undo slot
+ SAMPLEUNDOBUFFER sUndo;
+
+ // Save old sample header
+ memcpy(&sUndo.OldSample, &pSndFile->Samples[nSmp], sizeof(MODSAMPLE));
+ sUndo.nChangeType = nChangeType;
+
+ if(nChangeType == sundo_replace)
+ {
+ // ensure that size information is correct here.
+ nChangeStart = 0;
+ nChangeEnd = pSndFile->Samples[nSmp].nLength;
+ } else if(nChangeType == sundo_none)
+ {
+ // we do nothing...
+ nChangeStart = nChangeEnd = 0;
+ }
+
+ sUndo.nChangeStart = nChangeStart;
+ sUndo.nChangeEnd = nChangeEnd;
+ sUndo.SamplePtr = nullptr;
+
+ switch(nChangeType)
+ {
+ case sundo_none: // we are done, no sample changes here.
+ case sundo_invert: // no action necessary, since those effects can be applied again to be undone.
+ case sundo_reverse: // dito
+ case sundo_unsign: // dito
+ case sundo_insert: // no action necessary, we already have stored the variables that are necessary.
+ break;
+
+ case sundo_update:
+ case sundo_delete:
+ case sundo_replace:
+ {
+ UINT nBytesPerSample = pSndFile->Samples[nSmp].GetBytesPerSample();
+ UINT nChangeLen = nChangeEnd - nChangeStart;
+
+ sUndo.SamplePtr = pSndFile->AllocateSample(nChangeLen * nBytesPerSample + 4 * nBytesPerSample);
+ if(sUndo.SamplePtr == nullptr) return false;
+ memcpy(sUndo.SamplePtr, pSndFile->Samples[nSmp].pSample + nChangeStart * nBytesPerSample, nChangeLen * nBytesPerSample);
+
+#ifdef DEBUG
+ char s[64];
+ const UINT nSize = (GetUndoBufferCapacity() + nChangeLen * nBytesPerSample) >> 10;
+ wsprintf(s, "Sample undo buffer size is now %u.%u MB\n", nSize >> 10, (nSize & 1023) * 100 / 1024);
+ Log(s);
+#endif
+
+ }
+ break;
+
+ default:
+ ASSERT(false); // whoops, what's this? someone forgot to implement it, some code is obviously missing here!
+ return false;
+ }
+
+ UndoBuffer[nSmp - 1].push_back(sUndo);
+
+ m_pModDoc->UpdateAllViews(NULL, HINT_UNDO);
+
+ return true;
+}
+
+
+// Restore undo point for given sample
+bool CSampleUndo::Undo(const SAMPLEINDEX nSmp)
+//--------------------------------------------
+{
+ if(m_pModDoc == nullptr || CanUndo(nSmp) == false) return false;
+
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return false;
+
+ // Select most recent undo slot
+ SAMPLEUNDOBUFFER *pUndo = &UndoBuffer[nSmp - 1].back();
+
+ LPSTR pCurrentSample = pSndFile->Samples[nSmp].pSample;
+ LPSTR pNewSample = nullptr; // a new sample is possibly going to be allocated, depending on what's going to be undone.
+
+ UINT nBytesPerSample = pUndo->OldSample.GetBytesPerSample();
+ UINT nChangeLen = pUndo->nChangeEnd - pUndo->nChangeStart;
+
+ switch(pUndo->nChangeType)
+ {
+ case sundo_none:
+ break;
+
+ case sundo_invert:
+ // invert again
+ ctrlSmp::InvertSample(&pSndFile->Samples[nSmp], pUndo->nChangeStart, pUndo->nChangeEnd, pSndFile);
+ break;
+
+ case sundo_reverse:
+ // reverse again
+ ctrlSmp::ReverseSample(&pSndFile->Samples[nSmp], pUndo->nChangeStart, pUndo->nChangeEnd, pSndFile);
+ break;
+
+ case sundo_unsign:
+ // unsign again
+ ctrlSmp::UnsignSample(&pSndFile->Samples[nSmp], pUndo->nChangeStart, pUndo->nChangeEnd, pSndFile);
+ break;
+
+ case sundo_insert:
+ // delete inserted data
+ ASSERT(nChangeLen == pSndFile->Samples[nSmp].nLength - pUndo->OldSample.nLength);
+ memcpy(pCurrentSample + pUndo->nChangeStart * nBytesPerSample, pCurrentSample + pUndo->nChangeEnd * nBytesPerSample, (pSndFile->Samples[nSmp].nLength - pUndo->nChangeEnd) * nBytesPerSample);
+ // also clean the sample end
+ memset(pCurrentSample + pUndo->OldSample.nLength * nBytesPerSample, 0, (pSndFile->Samples[nSmp].nLength - pUndo->OldSample.nLength) * nBytesPerSample);
+ break;
+
+ case sundo_update:
+ // simply replace what has been updated.
+ if(pSndFile->Samples[nSmp].nLength < pUndo->nChangeEnd) return false;
+ memcpy(pCurrentSample + pUndo->nChangeStart * nBytesPerSample, pUndo->SamplePtr, nChangeLen * nBytesPerSample);
+ break;
+
+ case sundo_delete:
+ // insert deleted data
+ pNewSample = pSndFile->AllocateSamp...
[truncated message content] |
|
From: <sag...@us...> - 2009-10-30 22:47:59
|
Revision: 407
http://modplug.svn.sourceforge.net/modplug/?rev=407&view=rev
Author: saga-games
Date: 2009-10-30 22:47:43 +0000 (Fri, 30 Oct 2009)
Log Message:
-----------
[Fix] VST: When moving around plugins, param control notes are now also updated.
[Fix] Mod Conversion: Remove sample vibrato and sustain loops for MOD/S3M
[Fix] Mod Conversion: When converting to .MOD, order list won't be too long anymore.
[Fix] IT Compatiblity Export: Don't store "extended filter range" flag
[Ref] Small code cleanup
Modified Paths:
--------------
trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/MoveFXSlotDialog.h
trunk/OpenMPT/mptrack/View_gen.cpp
trunk/OpenMPT/mptrack/View_gen.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/Load_stm.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/ModSequence.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
trunk/OpenMPT/soundlib/modsmp_ctrl.h
Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -376,7 +376,6 @@
//----------------------------------------
{
CommandID nCmd = (CommandID)m_lbnCommandKeys.GetItemData( m_lbnCommandKeys.GetCurSel() );
- int nCat = m_cmbCategory.GetItemData( m_cmbCategory.GetCurSel() );
CString str;
//Separator
@@ -407,7 +406,6 @@
m_bKeyUp.EnableWindow(TRUE);
m_nCurHotKey = nCmd;
- BOOL bEnable = FALSE;
char s[20];
m_cmbKeyChoice.ResetContent();
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -166,7 +166,7 @@
/////////////////////////////
// Converting pattern data
- for (UINT nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
+ for (PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
{
MODCOMMAND *m = m_SndFile.Patterns[nPat];
@@ -222,30 +222,46 @@
// Converting instrument / sample / etc. data
- // Convert MOD/XM to S3M/IT/MPT
- if (oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT)
+ // Do some sample conversion
+ for (SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++)
{
- for (SAMPLEINDEX i=1; i<=m_SndFile.m_nSamples; i++)
+ // No Sustain loops for MOD/S3M
+ if(newTypeIsMOD || newTypeIsS3M)
{
- m_SndFile.Samples[i].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[i].RelativeTone, m_SndFile.Samples[i].nFineTune);
- m_SndFile.Samples[i].RelativeTone = 0;
- m_SndFile.Samples[i].nFineTune = 0;
+ m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0;
}
- if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE;
- } else
- // Convert S3M/IT/MPT to XM
- if (oldTypeIsS3M_IT_MPT && newTypeIsXM)
- {
- for (SAMPLEINDEX i=1; i<=m_SndFile.m_nSamples; i++)
+ // Transpose to Frequency (MOD/XM to S3M/IT/MPT)
+ if (oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT)
{
- CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[i]);
- if (!(m_SndFile.Samples[i].uFlags & CHN_PANNING)) m_SndFile.Samples[i].nPan = 128;
+ m_SndFile.Samples[nSmp].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[nSmp].RelativeTone, m_SndFile.Samples[nSmp].nFineTune);
+ m_SndFile.Samples[nSmp].RelativeTone = 0;
+ m_SndFile.Samples[nSmp].nFineTune = 0;
}
+
+ // Frequency to Transpose (S3M/IT/MPT to MOD/XM)
+ if (oldTypeIsS3M_IT_MPT && newTypeIsXM)
+ {
+ CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]);
+ if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128;
+ }
+ }
+
+ // No Vibrato for MOD/S3M
+ if(newTypeIsMOD || newTypeIsS3M)
+ {
+ ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetVibrato);
+ }
+
+ if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE;
+
+ // Convert IT/MPT to XM (instruments)
+ if (oldTypeIsIT_MPT && newTypeIsXM)
+ {
bool bBrokenNoteMap = false, bBrokenSustainLoop = false;
- for (INSTRUMENTINDEX j = 1; j <= m_SndFile.m_nInstruments; j++)
+ for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.m_nInstruments; nIns++)
{
- MODINSTRUMENT *pIns = m_SndFile.Instruments[j];
+ MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns];
if (pIns)
{
for (UINT k = 0; k < NOTE_MAX; k++)
@@ -285,12 +301,12 @@
m_SndFile.m_nSamplePreAmp = 48;
m_SndFile.m_nVSTiVolume = 48;
AddToLog("WARNING: Default speed, tempo and global volume will be lost.\n");
- }
- // Too many samples?
- if (newTypeIsMOD && (m_SndFile.m_nSamples > 31))
- {
- AddToLog("WARNING: Samples above 31 will be lost when saving as MOD!\n");
+ // Too many samples?
+ if(m_SndFile.m_nSamples > 31)
+ {
+ AddToLog("WARNING: Samples above 31 will be lost when saving as MOD!\n");
+ }
}
// Order list too long? -> remove unnecessary order items first.
Modified: trunk/OpenMPT/mptrack/MoveFXSlotDialog.h
===================================================================
--- trunk/OpenMPT/mptrack/MoveFXSlotDialog.h 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/mptrack/MoveFXSlotDialog.h 2009-10-30 22:47:43 UTC (rev 407)
@@ -11,7 +11,7 @@
CMoveFXSlotDialog(CWnd* pParent = NULL); // standard constructor
virtual ~CMoveFXSlotDialog();
void SetupMove(UINT currentSlot, CArray<UINT, UINT> &emptySlots);
- UINT m_nToSlot;
+ PLUGINDEX m_nToSlot;
Modified: trunk/OpenMPT/mptrack/View_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_gen.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/mptrack/View_gen.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -1314,8 +1314,8 @@
}
-bool CViewGlobals::MovePlug(UINT src, UINT dest)
-//----------------------------------------------
+bool CViewGlobals::MovePlug(PLUGINDEX src, PLUGINDEX dest)
+//--------------------------------------------------------
{
//AfxMessageBox("Moving %d to %d", src, dest);
CModDoc *pModDoc = GetDocument();
@@ -1363,6 +1363,17 @@
}
}
+ // Update patterns (param control notes)
+ for (PATTERNINDEX nPat = 0; nPat < pSndFile->Patterns.Size(); nPat++) if (pSndFile->Patterns[nPat])
+ {
+ MODCOMMAND *m = pSndFile->Patterns[nPat];
+ for (UINT len = pSndFile->PatternSize[nPat] * pSndFile->m_nChannels; len; m++, len--)
+ {
+ if((m->note == NOTE_PC || m->note == NOTE_PCS) && m->instr == src + 1)
+ m->instr = dest + 1;
+ }
+ }
+
END_CRITICAL();
pModDoc->SetModified();
@@ -1405,7 +1416,7 @@
//possible mem leak here...
}
- for (int nSlot=MAX_MIXPLUGINS-1; nSlot>(int)m_nCurrentPlugin; nSlot--) {
+ for (PLUGINDEX nSlot = MAX_MIXPLUGINS-1; nSlot > (PLUGINDEX)m_nCurrentPlugin; nSlot--) {
if (pSndFile->m_MixPlugins[nSlot-1].pMixPlugin) {
MovePlug(nSlot-1, nSlot);
}
Modified: trunk/OpenMPT/mptrack/View_gen.h
===================================================================
--- trunk/OpenMPT/mptrack/View_gen.h 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/mptrack/View_gen.h 2009-10-30 22:47:43 UTC (rev 407)
@@ -29,7 +29,8 @@
CSpinButtonCtrl m_spinVolume[4], m_spinPan[4];
CButton m_BtnSelect, m_BtnEdit;
int m_nActiveTab, m_nLockCount;
- UINT m_nCurrentPlugin, m_nCurrentParam;
+ PLUGINDEX m_nCurrentPlugin;
+ UINT m_nCurrentParam;
// -> CODE#0002
// -> DESC="VST plugins presets"
UINT m_nCurrentPreset;
@@ -56,7 +57,7 @@
BOOL IsLocked() const { return (m_nLockCount > 0); }
int GetDlgItemIntEx(UINT nID);
void BuildEmptySlotList(CArray<UINT, UINT> &emptySlots);
- bool MovePlug(UINT src, UINT dest);
+ bool MovePlug(PLUGINDEX src, PLUGINDEX dest);
public:
//{{AFX_VIRTUAL(CViewGlobals)
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -2499,7 +2499,7 @@
if (m_dwSongFlags & SONG_LINEARSLIDES) header.flags |= 0x08;
if (m_dwSongFlags & SONG_ITOLDEFFECTS) header.flags |= 0x10;
if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20;
- if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
+ //if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
header.speed = m_nDefaultSpeed;
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -542,8 +542,8 @@
header[0x22] = nbi & 0xFF;
header[0x23] = nbi >> 8;
nbp = 0;
- for (i=0; Patterns[i]; i++) { nbp = i+1; if (nbp >= MAX_PATTERNS) break; }
- for (i=0; i<MAX_ORDERS; i++) if ((Order[i] < MAX_PATTERNS) && (Order[i] >= nbp)) nbp = Order[i] + 1;
+ for (i = 0; Patterns[i]; i++) { nbp = i+1; if (nbp >= MAX_PATTERNS) break; }
+ for (ORDERINDEX nOrd = 0; nOrd < Order.GetLengthTailTrimmed(); nOrd++) if ((Order[nOrd] < MAX_PATTERNS) && (Order[nOrd] >= nbp)) nbp = Order[nOrd] + 1;
header[0x24] = nbp & 0xFF;
header[0x25] = nbp >> 8;
if (m_dwSongFlags & SONG_FASTVOLSLIDES) header[0x26] |= 0x40;
Modified: trunk/OpenMPT/soundlib/Load_stm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_stm.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/Load_stm.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -111,7 +111,7 @@
if ((pIns->nLoopEnd > pIns->nLoopStart) && (pIns->nLoopEnd != 0xFFFF)) pIns->uFlags |= CHN_LOOP;
}
dwMemPos = sizeof(STMHEADER);
- for (UINT nOrd=0; nOrd<MAX_ORDERS; nOrd++) if (Order[nOrd] >= 99) Order[nOrd] = 0xFF;
+ for (UINT nOrd = 0; nOrd < 128; nOrd++) if (Order[nOrd] >= 99) Order[nOrd] = Order.GetInvalidPatIndex();
UINT nPatterns = phdr->numpat;
for (UINT nPat=0; nPat<nPatterns; nPat++)
{
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -759,13 +759,6 @@
xmheader.channels = LittleEndianW(xmheader.channels);
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;
- }*/
- if(Order.GetLength() < MAX_ORDERS)
- Order.resize(MAX_ORDERS);
-
WORD nOrders = Order.GetLengthTailTrimmed(), nPatterns = 0;
xmheader.orders = LittleEndianW(nOrders);
xmheader.size = LittleEndian(xmheader.size + nOrders);
@@ -783,7 +776,7 @@
xmheader.instruments = LittleEndianW(m_nSamples);
xmheader.flags = (m_dwSongFlags & SONG_LINEARSLIDES) ? 0x01 : 0x00;
- if (m_dwSongFlags & SONG_EXFILTERRANGE) xmheader.flags |= 0x1000;
+ if ((m_dwSongFlags & SONG_EXFILTERRANGE) && !bCompatibilityExport) xmheader.flags |= 0x1000;
xmheader.flags = LittleEndianW(xmheader.flags);
if(bCompatibilityExport)
Modified: trunk/OpenMPT/soundlib/ModSequence.cpp
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/ModSequence.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -71,15 +71,13 @@
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.
+ //Resize orderlist if needed.
if (specs.ordersMax < GetLength())
{
- resize(max(MAX_ORDERS, specs.ordersMax));
- std::fill(begin() + specs.ordersMax, end(), GetInvalidPatIndex());
+ resize(specs.ordersMax);
+ /*resize(max(MAX_ORDERS, specs.ordersMax));
+ std::fill(begin() + specs.ordersMax, end(), GetInvalidPatIndex());*/
}
- if (GetLength() < MAX_ORDERS)
- resize(MAX_ORDERS, GetInvalidPatIndex(oldtype));
//Replace items used to denote end of song/skip order.
Replace(GetInvalidPatIndex(oldtype), GetInvalidPatIndex());
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-10-30 22:47:43 UTC (rev 407)
@@ -265,7 +265,7 @@
UINT nPan;
UINT nVolume;
DWORD dwFlags;
- UINT nMixPlugin;
+ PLUGINDEX nMixPlugin;
CHAR szName[MAX_CHANNELNAME];
};
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-10-30 22:47:43 UTC (rev 407)
@@ -215,6 +215,12 @@
rSndFile.Samples[i].nVibType = 0;
rSndFile.Samples[i].uFlags &= ~CHN_PANNING;
break;
+ case SmpResetVibrato:
+ rSndFile.Samples[i].nVibDepth = 0;
+ rSndFile.Samples[i].nVibRate = 0;
+ rSndFile.Samples[i].nVibSweep = 0;
+ rSndFile.Samples[i].nVibType = 0;
+ break;
default:
break;
}
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-10-25 22:17:12 UTC (rev 406)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-10-30 22:47:43 UTC (rev 407)
@@ -15,7 +15,8 @@
enum ResetFlag
{
SmpResetCompo = 1,
- SmpResetInit = 2,
+ SmpResetInit,
+ SmpResetVibrato,
};
// Insert silence to given location.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-10-25 22:17:22
|
Revision: 406
http://modplug.svn.sourceforge.net/modplug/?rev=406&view=rev
Author: relabsoluness
Date: 2009-10-25 22:17:12 +0000 (Sun, 25 Oct 2009)
Log Message:
-----------
[New] Sequence editor: Can now copy/cut/paste order selections.
[Fix] Autosave: 'Modified since last autosave'-flag wasn't updated when document was set modified using ThreadSafeSetModified.
[Mod] VC2003 build: Added command line optimization options to zlib project.
[Ref] Minor cleanup.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CreditStatic.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/soundlib/ModSequence.cpp
trunk/OpenMPT/soundlib/ModSequence.h
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj
Modified: trunk/OpenMPT/mptrack/CreditStatic.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CreditStatic.cpp 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/CreditStatic.cpp 2009-10-25 22:17:12 UTC (rev 406)
@@ -226,6 +226,7 @@
BOOL CCreditStatic::OnEraseBkgnd(CDC* pDC)
{
+ UNREFERENCED_PARAMETER(pDC);
return TRUE;
// return CStatic::OnEraseBkgnd(pDC);
@@ -539,8 +540,8 @@
CFont* pOldFont = NULL;
BOOL bSuccess = FALSE;
- BOOL bUnderline;
- BOOL bItalic;
+ BYTE bUnderline;
+ BYTE bItalic;
int rmcode = 0;
if (!m_szWork.IsEmpty()) {
@@ -668,7 +669,7 @@
}
CRect r(m_ClientRect);
r.top = r.bottom-m_nClip;
- int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
+ memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
DT_NOPREFIX | DT_SINGLELINE);
m_bDrawText=FALSE;
}
@@ -737,8 +738,8 @@
BOOL bSuccess = FALSE;
BOOL bIsBitmap = FALSE;
- BOOL bUnderline;
- BOOL bItalic;
+ BYTE bUnderline;
+ BYTE bItalic;
int rmcode = 0;
CBitmap bitmap;
@@ -839,7 +840,7 @@
CSize size;
if(m_szWork.GetLength()-rmcode != 0)
{
- int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
+ memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
DT_NOPREFIX | DT_SINGLELINE);
size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
}
@@ -923,7 +924,7 @@
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
- pLP->palNumEntries = nColors;
+ pLP->palNumEntries = (WORD)nColors;
for( int i=0; i < nColors; i++)
{
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-10-25 22:17:12 UTC (rev 406)
@@ -9,6 +9,7 @@
{
ORDERINDEX nOrdLo;
ORDERINDEX nOrdHi;
+ ORDERINDEX GetSelCount() const {return nOrdHi - nOrdLo + 1;}
};
//===========================
@@ -84,7 +85,11 @@
// Set given sqeuence and update orderlist display.
void SelectSequence(const SEQUENCEINDEX nSeq);
-public:
+ // Clipboard.
+ void OnEditCopy();
+ void OnEditCut();
+ void OnEditPaste();
+
//{{AFX_VIRTUAL(COrderList)
virtual BOOL PreTranslateMessage(MSG *pMsg);
virtual void UpdateView(DWORD dwHintMask=0, CObject *pObj=NULL);
@@ -119,6 +124,7 @@
afx_msg LRESULT OnDragonDropping(WPARAM bDoDrop, LPARAM lParam);
afx_msg LRESULT OnHelpHitTest(WPARAM, LPARAM lParam);
afx_msg void OnSelectSequence(UINT nid);
+ afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-25 22:17:12 UTC (rev 406)
@@ -57,6 +57,7 @@
ON_COMMAND_RANGE(ID_SEQUENCE_ITEM, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, OnSelectSequence)
ON_MESSAGE(WM_MOD_DRAGONDROPPING, OnDragonDropping)
ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
+ ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@@ -455,6 +456,169 @@
}
+static const char szClipboardOrdersHdr[] = "OpenMPT %3s\x0D\x0A";
+static const char szClipboardOrdCountFieldHdr[] = "OrdNum: %u\x0D\x0A";
+static const char szClipboardOrdersFieldHdr[] = "OrdLst: ";
+
+
+void COrderList::OnEditCut()
+//--------------------------
+{
+ OnEditCopy();
+ OnDeleteOrder();
+}
+
+
+void COrderList::OnEditPaste()
+//----------------------------
+{
+ CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
+ CSoundFile* pSf = m_pModDoc->GetSoundFile();
+ if (!pMainFrm)
+ return;
+ BeginWaitCursor();
+ if (pMainFrm->OpenClipboard())
+ {
+ HGLOBAL hCpy = ::GetClipboardData(CF_TEXT);
+ LPCSTR p;
+
+ if ((hCpy) && ((p = (LPCSTR)GlobalLock(hCpy)) != NULL))
+ {
+ const DWORD dwMemSize = GlobalSize(hCpy);
+
+ if (dwMemSize > sizeof(szClipboardOrdersHdr) &&
+ memcmp(p, "OpenMPT ", 8) == 0 &&
+ memcmp(p + 11, "\x0D\x0A", 2) == 0)
+ {
+ char buf[8];
+ p += sizeof(szClipboardOrdersHdr) - 1;
+ std::istrstream iStrm(p, dwMemSize - sizeof(szClipboardOrdersHdr) + 1);
+ ORDERINDEX nCount = 0;
+ std::vector<PATTERNINDEX> vecPat;
+ while (iStrm.get(buf, sizeof(buf), '\n'))
+ {
+ if (memcmp(buf, "OrdNum:", 8) == 0) // Read expected order count.
+ iStrm >> nCount;
+ else if (memcmp(buf, "OrdLst:", 8) != 0)
+ { // Unrecognized data -> skip line.
+ iStrm.ignore((std::numeric_limits<std::streamsize>::max)(), '\n');
+ continue;
+ }
+ else // Read orders.
+ {
+ LimitMax(nCount, pSf->GetModSpecifications().ordersMax);
+ vecPat.reserve(nCount);
+ char bufItem[16];
+ while (iStrm.peek() >= 32 && iStrm.getline(bufItem, sizeof(bufItem), ' '))
+ {
+ if (vecPat.size() >= pSf->GetModSpecifications().ordersMax)
+ break;
+ if (!(isdigit(bufItem[0]) || bufItem[0] == '+' || bufItem[0] == '-'))
+ continue;
+ PATTERNINDEX nPat = pSf->Order.GetInvalidPatIndex();
+ if (bufItem[0] == '+')
+ nPat = pSf->Order.GetIgnoreIndex();
+ else if (isdigit(bufItem[0]))
+ {
+ nPat = ConvertStrTo<PATTERNINDEX>(bufItem);
+ if (nPat >= pSf->GetModSpecifications().patternsMax)
+ nPat = pSf->Order.GetInvalidPatIndex();
+ }
+ vecPat.push_back(nPat);
+ }
+ nCount = pSf->Order.Insert(m_nScrollPos, (ORDERINDEX)vecPat.size());
+ for (ORDERINDEX nOrd = 0; nOrd < nCount; nOrd++)
+ pSf->Order[m_nScrollPos + nOrd] = vecPat[nOrd];
+ }
+ m_pModDoc->SetModified();
+ m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL);
+ }
+ }
+ GlobalUnlock(hCpy);
+ }
+ CloseClipboard();
+ }
+ EndWaitCursor();
+}
+
+
+void COrderList::OnEditCopy()
+//---------------------------
+{
+ CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
+ if ((!pMainFrm)) return;
+
+ const ORD_SELECTION ordsel = GetCurSel(false);
+
+ DWORD dwMemSize;
+ HGLOBAL hCpy;
+
+ BeginWaitCursor();
+ dwMemSize = sizeof(szClipboardOrdersHdr) + sizeof(szClipboardOrdersFieldHdr) + sizeof(szClipboardOrdCountFieldHdr);
+ dwMemSize += ordsel.GetSelCount() * 6 + 8;
+ if ((pMainFrm->OpenClipboard()) && ((hCpy = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, dwMemSize))!=NULL))
+ {
+ LPCSTR pszFormatName;
+ EmptyClipboard();
+ switch(m_pModDoc->GetSoundFile()->GetType())
+ {
+ case MOD_TYPE_S3M: pszFormatName = "S3M"; break;
+ case MOD_TYPE_XM: pszFormatName = "XM"; break;
+ case MOD_TYPE_IT: pszFormatName = "IT"; break;
+ case MOD_TYPE_MPT: pszFormatName = "MPT"; break;
+ default: pszFormatName = "MOD"; break;
+ }
+ LPSTR p = (LPSTR)GlobalLock(hCpy);
+ if (p)
+ {
+ const ModSequence& seq = m_pModDoc->GetSoundFile()->Order;
+ wsprintf(p, szClipboardOrdersHdr, pszFormatName);
+ p += strlen(p);
+ wsprintf(p, szClipboardOrdCountFieldHdr, ordsel.GetSelCount());
+ strcat(p, szClipboardOrdersFieldHdr);
+ p += strlen(p);
+ for(ORDERINDEX i = ordsel.nOrdLo; i <= ordsel.nOrdHi; i++)
+ {
+ std::string str;
+ if (seq[i] == seq.GetInvalidPatIndex())
+ str = "-";
+ else if (seq[i] == seq.GetIgnoreIndex())
+ str = "+";
+ else
+ str = Stringify(seq[i]);
+ memcpy(p, str.c_str(), str.size());
+ p += str.size();
+ *p++ = ' ';
+ }
+ *p++ = 0x0D;
+ *p++ = 0x0A;
+ *p = 0;
+ }
+ GlobalUnlock(hCpy);
+ SetClipboardData(CF_TEXT, (HANDLE) hCpy);
+ CloseClipboard();
+ }
+ EndWaitCursor();
+}
+
+
+LRESULT COrderList::OnCustomKeyMsg(WPARAM wParam, LPARAM)
+//-------------------------------------------------------
+{
+ if (wParam == kcNull)
+ return 0;
+
+ switch(wParam)
+ {
+ case kcEditCopy: OnEditCopy(); return wParam;
+ case kcEditCut: OnEditCut(); return wParam;
+ case kcEditPaste: OnEditPaste(); return wParam;
+ }
+
+ return 0;
+}
+
+
void COrderList::UpdateView(DWORD dwHintMask, CObject *pObj)
//----------------------------------------------------------
{
@@ -604,6 +768,7 @@
CWnd::OnSetFocus(pWnd);
InvalidateSelection();
UpdateInfoText();
+ CMainFrame::GetMainFrame()->m_pOrderlistHasFocus = this;
}
@@ -613,6 +778,7 @@
CWnd::OnKillFocus(pWnd);
InvalidateSelection();
m_bShift = FALSE;
+ CMainFrame::GetMainFrame()->m_pOrderlistHasFocus = nullptr;
}
@@ -998,10 +1164,8 @@
// remove selection
m_nScrollPos2nd = ORDERINDEX_INVALID;
- for(int i = 0; i <= (selection.nOrdHi - selection.nOrdLo); i++)
- {
- m_pModDoc->RemoveOrder(pSndFile->Order.GetCurrentSequenceIndex(), selection.nOrdLo);
- }
+ pSndFile->Order.Remove(selection.nOrdLo, selection.nOrdHi);
+
InvalidateRect(NULL, FALSE);
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-10-25 22:17:12 UTC (rev 406)
@@ -289,6 +289,7 @@
{
m_bModTreeHasFocus = false; //rewbs.customKeys
m_pNoteMapHasFocus = NULL; //rewbs.customKeys
+ m_pOrderlistHasFocus = nullptr;
m_bOptionsLocked = false; //rewbs.customKeys
m_pJustModifiedDoc = NULL;
@@ -2523,7 +2524,7 @@
pModDoc->m_bModifiedChanged=false;
}*/
if (m_pJustModifiedDoc) {
- m_pJustModifiedDoc->SetModifiedFlag(true);
+ m_pJustModifiedDoc->SetModified(true);
m_pJustModifiedDoc = NULL;
}
@@ -2720,7 +2721,7 @@
// case ID_NETLINK_UT: pszURL = "http://www.united-trackers.org"; break;
// case ID_NETLINK_OSMUSIC: pszURL = "http://www.osmusic.net/"; break;
// case ID_NETLINK_HANDBOOK: pszURL = "http://www.modplug.com/mods/handbook/handbook.htm"; break;
- case ID_NETLINK_MPTFR: pszURL = "http://mpt.new.fr/"; break;
+// case ID_NETLINK_MPTFR: pszURL = "http://mpt.new.fr/"; break;
case ID_NETLINK_FORUMS: pszURL = "http://www.lpchip.com/modplug"; break;
case ID_NETLINK_PLUGINS: pszURL = "http://www.kvraudio.com"; break;
case ID_NETLINK_MODARCHIVE: pszURL = "http://modarchive.org/"; break;
@@ -2828,6 +2829,8 @@
return m_wndTree.PostMessageToModTree(WM_MOD_KEYCOMMAND, wParam, lParam);
if (m_pNoteMapHasFocus)
return m_pNoteMapHasFocus->PostMessage(WM_MOD_KEYCOMMAND, wParam, lParam);
+ if (m_pOrderlistHasFocus)
+ return m_pOrderlistHasFocus->PostMessage(WM_MOD_KEYCOMMAND, wParam, lParam);
//Else send it to the active view
CView* pView = GetActiveView();
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-25 22:17:12 UTC (rev 406)
@@ -544,6 +544,7 @@
static CInputHandler* GetInputHandler() { return m_InputHandler; } //rewbs.customKeys
bool m_bModTreeHasFocus; //rewbs.customKeys
CWnd *m_pNoteMapHasFocus; //rewbs.customKeys
+ CWnd* m_pOrderlistHasFocus;
long GetSampleRate(); //rewbs.VSTTimeInfo
long GetTotalSampleCount(); //rewbs.VSTTimeInfo
double GetApproxBPM(); //rewbs.VSTTimeInfo
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-25 22:17:12 UTC (rev 406)
@@ -149,7 +149,7 @@
m_SndFile.m_nMixLevels = m_SndFile.GetModSpecifications().defaultMixLevels;
m_SndFile.m_pConfig->SetMixLevels(m_SndFile.m_nMixLevels);
// ...and the order length
- m_SndFile.Order.resize(m_SndFile.GetModSpecifications().ordersMax);
+ m_SndFile.Order.resize(min(MAX_ORDERS, m_SndFile.GetModSpecifications().ordersMax));
theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg);
ReinitRecordState();
@@ -1105,22 +1105,22 @@
return true;
}
-bool CModDoc::IsChannelRecord1(CHANNELINDEX channel)
-//--------------------------------------------------
+
+bool CModDoc::IsChannelRecord1(CHANNELINDEX channel) const
+//--------------------------------------------------------
{
- UINT m = 1 << (channel&7);
- return (MultiRecordMask[channel>>3] & m) ? true : false;
+ return m_bsMultiRecordMask[channel];
}
-bool CModDoc::IsChannelRecord2(CHANNELINDEX channel)
-//--------------------------------------------------
+
+bool CModDoc::IsChannelRecord2(CHANNELINDEX channel) const
+//--------------------------------------------------------
{
- UINT m = 1 << (channel&7);
- return (MultiSplitRecordMask[channel>>3] & m) ? true : false;
+ return m_bsMultiSplitRecordMask[channel];
}
-BYTE CModDoc::IsChannelRecord(CHANNELINDEX channel)
-//-------------------------------------------------
+BYTE CModDoc::IsChannelRecord(CHANNELINDEX channel) const
+//-------------------------------------------------------
{
if(IsChannelRecord1(channel)) return 1;
if(IsChannelRecord2(channel)) return 2;
@@ -1130,38 +1130,46 @@
void CModDoc::Record1Channel(CHANNELINDEX channel, bool select)
//-------------------------------------------------------------
{
- UINT m = 1 << (channel&7);
-
- if(!select){
- if(MultiRecordMask[channel>>3] & m) MultiRecordMask[channel>>3] ^= m;
- if(MultiSplitRecordMask[channel>>3] & m) MultiSplitRecordMask[channel>>3] ^= m;
+ if (!select)
+ {
+ m_bsMultiRecordMask.reset(channel);
+ m_bsMultiSplitRecordMask.reset(channel);
}
- else{
- MultiRecordMask[channel>>3] ^= m;
- if(MultiSplitRecordMask[channel>>3] & m) MultiSplitRecordMask[channel>>3] ^= m;
+ else
+ {
+ m_bsMultiRecordMask.flip(channel);
+ m_bsMultiSplitRecordMask.reset(channel);
}
}
void CModDoc::Record2Channel(CHANNELINDEX channel, bool select)
//-------------------------------------------------------------
{
- UINT m = 1 << (channel&7);
-
- if(!select){
- if(MultiRecordMask[channel>>3] & m) MultiRecordMask[channel>>3] ^= m;
- if(MultiSplitRecordMask[channel>>3] & m) MultiSplitRecordMask[channel>>3] ^= m;
+ if (!select)
+ {
+ m_bsMultiRecordMask.reset(channel);
+ m_bsMultiSplitRecordMask.reset(channel);
}
- else{
- MultiSplitRecordMask[channel>>3] ^= m;
- if(MultiRecordMask[channel>>3] & m) MultiRecordMask[channel>>3] ^= m;
+ else
+ {
+ m_bsMultiSplitRecordMask.flip(channel);
+ m_bsMultiRecordMask.reset(channel);
}
}
void CModDoc::ReinitRecordState(bool unselect)
//--------------------------------------------
{
- memset(MultiRecordMask, unselect ? 0 : 0xff, sizeof(MultiRecordMask));
- memset(MultiSplitRecordMask, unselect ? 0 : 0xff, sizeof(MultiSplitRecordMask));
+ if (unselect)
+ {
+ m_bsMultiRecordMask.reset();
+ m_bsMultiSplitRecordMask.reset();
+ }
+ else
+ {
+ m_bsMultiRecordMask.set();
+ m_bsMultiSplitRecordMask.set();
+ }
}
// -! NEW_FEATURE#0015
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-10-25 22:17:12 UTC (rev 406)
@@ -38,7 +38,7 @@
#define HINT_SPEEDCHANGE 0x40000 //rewbs.envRowGrid
#define HINT_SEQNAMES 0x80000
#define HINT_MAXHINTFLAG HINT_SEQNAMES
-//Bits 0-18 are reserved.
+//Bits 0-19 are reserved.
#define HINT_MASK_FLAGS (2*HINT_MAXHINTFLAG - 1) //When applied to hint parameter, should give the flag part.
#define HINT_MASK_ITEM (~HINT_MASK_FLAGS) //To nullify update hintbits from hint parameter.
#define HintFlagPart(x) ((x) & HINT_MASK_FLAGS)
@@ -136,8 +136,8 @@
// -> CODE#0015
// -> DESC="channels management dlg"
- BYTE MultiRecordMask[(MAX_CHANNELS+7)/8];
- BYTE MultiSplitRecordMask[(MAX_CHANNELS+7)/8];
+ std::bitset<MAX_BASECHANNELS> m_bsMultiRecordMask;
+ std::bitset<MAX_BASECHANNELS> m_bsMultiSplitRecordMask;
// -! NEW_FEATURE#0015
protected: // create from serialization only
@@ -227,9 +227,9 @@
// -> DESC="channels management dlg"
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);
+ bool IsChannelRecord1(CHANNELINDEX channel) const;
+ bool IsChannelRecord2(CHANNELINDEX channel) const;
+ BYTE IsChannelRecord(CHANNELINDEX channel) const;
void Record1Channel(CHANNELINDEX channel, bool select = true);
void Record2Channel(CHANNELINDEX channel, bool select = true);
void ReinitRecordState(bool unselect = true);
Modified: trunk/OpenMPT/soundlib/ModSequence.cpp
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.cpp 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/soundlib/ModSequence.cpp 2009-10-25 22:17:12 UTC (rev 406)
@@ -137,6 +137,47 @@
}
+void ModSequence::Remove(ORDERINDEX nPosBegin, ORDERINDEX nPosEnd)
+//----------------------------------------------------------------
+{
+ const ORDERINDEX nLengthTt = GetLengthTailTrimmed();
+ if (nPosEnd < nPosBegin || nPosEnd >= nLengthTt)
+ return;
+ const ORDERINDEX nMoveCount = nLengthTt - (nPosEnd + 1);
+ // Move orders left.
+ if (nMoveCount > 0)
+ memmove(m_pArray + nPosBegin, m_pArray + nPosEnd + 1, sizeof(PATTERNINDEX) * nMoveCount);
+ // Clear tail orders.
+ std::fill(m_pArray + nPosBegin + nMoveCount, m_pArray + nLengthTt, GetInvalidPatIndex());
+}
+
+
+ORDERINDEX ModSequence::Insert(ORDERINDEX nPos, ORDERINDEX nCount, PATTERNINDEX nFill)
+//------------------------------------------------------------------------------------
+{
+ if (nPos >= m_pSndFile->GetModSpecifications().ordersMax || nCount == 0)
+ return (nCount = 0);
+ const ORDERINDEX nLengthTt = GetLengthTailTrimmed();
+ // Limit number of orders to be inserted.
+ LimitMax(nCount, ORDERINDEX(m_pSndFile->GetModSpecifications().ordersMax - nPos));
+ // Calculate new length.
+ const ORDERINDEX nNewLength = min(nLengthTt + nCount, m_pSndFile->GetModSpecifications().ordersMax);
+ // Resize if needed.
+ if (nNewLength > GetLength())
+ resize(nNewLength);
+ // Calculate how many orders would need to be moved(nNeededSpace) and how many can actually
+ // be moved(nFreeSpace).
+ const ORDERINDEX nNeededSpace = nLengthTt - nPos;
+ const ORDERINDEX nFreeSpace = GetLength() - (nPos + nCount);
+ // Move orders nCount steps right starting from nPos.
+ if (nPos < nLengthTt)
+ memmove(m_pArray + nPos + nCount, m_pArray + nPos, min(nFreeSpace, nNeededSpace) * sizeof(PATTERNINDEX));
+ // Set nFill to new orders.
+ std::fill(begin() + nPos, begin() + nPos + nCount, nFill);
+ return nCount;
+}
+
+
void ModSequence::Append(PATTERNINDEX nPat)
//-----------------------------------------
{
@@ -209,8 +250,9 @@
//----------------------------------------------------------------
{
if (nSeq == GetCurrentSequenceIndex())
- CopyCacheToStorage();
- return m_Sequences[nSeq];
+ return *this;
+ else
+ return m_Sequences[nSeq];
}
Modified: trunk/OpenMPT/soundlib/ModSequence.h
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.h 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/soundlib/ModSequence.h 2009-10-25 22:17:12 UTC (rev 406)
@@ -37,6 +37,16 @@
void Append() {Append(GetInvalidPatIndex());} // Appends InvalidPatIndex.
void Append(PATTERNINDEX nPat); // Appends given patindex.
+ // Inserts nCount orders starting from nPos using nFill as the pattern index for all inserted orders.
+ // Sequence will automatically grow if needed and if it can't grow enough, some tail
+ // orders will be discarded.
+ // Return: Number of orders inserted.
+ ORDERINDEX Insert(ORDERINDEX nPos, ORDERINDEX nCount) {return Insert(nPos, nCount, GetInvalidPatIndex());}
+ ORDERINDEX Insert(ORDERINDEX nPos, ORDERINDEX nCount, PATTERNINDEX nFill);
+
+ // Removes orders from range [nPosBegin, nPosEnd].
+ void Remove(ORDERINDEX nPosBegin, ORDERINDEX nPosEnd);
+
void clear();
void resize(ORDERINDEX nNewSize) {resize(nNewSize, GetInvalidPatIndex());}
void resize(ORDERINDEX nNewSize, PATTERNINDEX nFill);
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-10-25 22:17:12 UTC (rev 406)
@@ -727,12 +727,12 @@
void WriteInstrumentPropertyForAllInstruments(__int32 code, __int16 size, FILE* f, MODINSTRUMENT* instruments[], UINT nInstruments);
void SaveExtendedInstrumentProperties(MODINSTRUMENT *instruments[], UINT nInstruments, FILE* f);
void SaveExtendedSongProperties(FILE* f);
- void LoadExtendedSongProperties(const MODTYPE modtype, LPCBYTE ptr, const LPCBYTE startpos, const size_t seachlimit, bool* pInterpretMptMade = false);
+ void LoadExtendedSongProperties(const MODTYPE modtype, LPCBYTE ptr, const LPCBYTE startpos, const size_t seachlimit, bool* pInterpretMptMade = nullptr);
// Reads extended instrument properties(XM/IT/MPTM).
// If no errors occur and song extension tag is found, returns pointer to the beginning
// of the tag, else returns NULL.
- LPCBYTE LoadExtendedInstrumentProperties(const LPCBYTE pStart, const LPCBYTE pEnd, bool* pInterpretMptMade = false);
+ LPCBYTE LoadExtendedInstrumentProperties(const LPCBYTE pStart, const LPCBYTE pEnd, bool* pInterpretMptMade = nullptr);
#endif // MODPLUG_NO_FILESAVE
// MOD Convert function
Modified: trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj
===================================================================
--- trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj 2009-10-24 19:05:56 UTC (rev 405)
+++ trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj 2009-10-25 22:17:12 UTC (rev 406)
@@ -68,6 +68,7 @@
ATLMinimizesCRunTimeLibraryUsage="FALSE">
<Tool
Name="VCCLCompilerTool"
+ AdditionalOptions="/O2 /Ob1"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI"
@@ -116,6 +117,7 @@
ATLMinimizesCRunTimeLibraryUsage="FALSE">
<Tool
Name="VCCLCompilerTool"
+ AdditionalOptions="/O2 /Ob1"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;ASMV;ASMINF"
@@ -165,6 +167,7 @@
ATLMinimizesCRunTimeLibraryUsage="FALSE">
<Tool
Name="VCCLCompilerTool"
+ AdditionalOptions="/O2 /Ob1"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-10-24 19:42:53
|
Revision: 405
http://modplug.svn.sourceforge.net/modplug/?rev=405&view=rev
Author: saga-games
Date: 2009-10-24 19:05:56 +0000 (Sat, 24 Oct 2009)
Log Message:
-----------
[New] Wav/Mp3 export: Show estimated remaining time
[Fix] Mp3 export: use uint64 like in wav export (instead of uint32), to prevent wraparounds with very long modules like Skaven's "Beyond the Network".
[Imp] Mp3 export: Removed 60 minutes limit.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Mod2wave.cpp
Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-10-24 14:50:32 UTC (rev 404)
+++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-10-24 19:05:56 UTC (rev 405)
@@ -595,7 +595,7 @@
WAVEDATAHEADER datahdr, fmthdr;
MSG msg;
BYTE buffer[WAVECONVERTBUFSIZE];
- CHAR s[64];
+ CHAR s[80];
HWND progress = ::GetDlgItem(m_hWnd, IDC_PROGRESS1);
UINT ok = IDOK, pos;
ULONGLONG ullSamples, ullMaxSamples;
@@ -661,20 +661,27 @@
ULONGLONG l = (ULONGLONG)m_dwSongLimit * m_pWaveFormat->nSamplesPerSec;
if (l < ullMaxSamples) ullMaxSamples = l;
}
+
+ // calculate maximum samples
+ ULONGLONG max = ullMaxSamples;
+ ULONGLONG l = ((ULONGLONG)m_pSndFile->GetSongTime()) * m_pWaveFormat->nSamplesPerSec;
+ if (m_nMaxPatterns > 0)
+ {
+ DWORD dwOrds = m_pSndFile->GetNumPatterns();
+ if ((m_nMaxPatterns < dwOrds) && (dwOrds > 0)) l = (l*m_nMaxPatterns) / dwOrds;
+ }
+ if (l < max) max = l;
+
if (progress != NULL)
{
- ULONGLONG max = ullMaxSamples;
- ULONGLONG l = ((ULONGLONG)m_pSndFile->GetSongTime()) * m_pWaveFormat->nSamplesPerSec;
- if (m_nMaxPatterns > 0)
- {
- DWORD dwOrds = m_pSndFile->GetNumPatterns();
- if ((m_nMaxPatterns < dwOrds) && (dwOrds > 0)) l = (l*m_nMaxPatterns) / dwOrds;
- }
- if (l < max) max = l;
::SendMessage(progress, PBM_SETRANGE, 0, MAKELPARAM(0, (DWORD)(max >> 14)));
}
+
// Process the conversion
UINT nBytesPerSample = (CSoundFile::gnBitsPerSample * CSoundFile::gnChannels) / 8;
+ // For calculating the remaining time
+ DWORD dwStartTime = timeGetTime();
+
CMainFrame::GetMainFrame()->InitRenderer(m_pSndFile); //rewbs.VSTTimeInfo
for (UINT n=0; ; n++)
{
@@ -735,7 +742,14 @@
if (!(n % 10))
{
DWORD l = (DWORD)(ullSamples / CSoundFile::gdwMixingFreq);
- wsprintf(s, "Writing file... (%uKB, %umn%02us)", datahdr.length >> 10, l / 60, l % 60);
+
+ DWORD timeRemaining = 0; // estimated remainig time
+ if((ullSamples > 0) && (ullSamples < max))
+ {
+ timeRemaining = static_cast<DWORD>(((timeGetTime() - dwStartTime) * (max - ullSamples) / ullSamples) / 1000);
+ }
+
+ wsprintf(s, "Writing file... (%uKB, %umn%02us, %umn%02us remaining)", datahdr.length >> 10, l / 60, l % 60, timeRemaining / 60, timeRemaining % 60);
SetDlgItemText(IDC_TEXT1, s);
}
if ((progress != NULL) && ((DWORD)(ullSamples >> 14) != pos))
@@ -857,7 +871,7 @@
//-----------------------------
{
BOOL bSaveWave;
- CHAR s[64], fext[_MAX_EXT];
+ CHAR s[80], fext[_MAX_EXT];
WAVEFILEHEADER wfh;
WAVEDATAHEADER wdh, chunk;
ACMSTREAMHEADER ash;
@@ -868,7 +882,8 @@
MSG msg;
LPBYTE pcmBuffer, dstBuffer;
UINT retval = IDCANCEL, pos, n;
- DWORD oldsndcfg, dwDstBufSize, dwMaxSamples, dwSamples, pcmBufSize, data_ofs;
+ DWORD dwDstBufSize, pcmBufSize, data_ofs;
+ uint64 ullMaxSamples, ullSamples;
int oldrepeat;
BOOL bPrepared, bFinished;
FILE *f;
@@ -940,7 +955,7 @@
m_FileTags.WriteID3v2Tags(f);
}
- oldsndcfg = CSoundFile::gdwSoundSetup;
+ static DWORD oldsndcfg = CSoundFile::gdwSoundSetup;
oldrepeat = m_pSndFile->GetRepeatCount();
CSoundFile::gdwMixingFreq = wfxSrc.nSamplesPerSec;
CSoundFile::gnBitsPerSample = 16;
@@ -954,20 +969,26 @@
// Setting up file limits and progress range
if ((!m_dwFileLimit) || (m_dwFileLimit > 512000)) m_dwFileLimit = 512000;
m_dwFileLimit <<= 10;
- dwMaxSamples = 60*60*wfxSrc.nSamplesPerSec; // 1 hour
+ ullMaxSamples = uint64_max; //60*60*wfxSrc.nSamplesPerSec; // 1 hour
if (m_dwSongLimit)
{
- DWORD l = m_dwSongLimit * wfxSrc.nSamplesPerSec;
- if (l < dwMaxSamples) dwMaxSamples = l;
+ uint64 l = m_dwSongLimit * wfxSrc.nSamplesPerSec;
+ if (l < ullMaxSamples) ullMaxSamples = l;
}
+
+ // calculate maximum samples
+ uint64 max = ullMaxSamples;
+ uint64 l = m_pSndFile->GetSongTime() * wfxSrc.nSamplesPerSec;
+ if (l < max) max = l;
if (progress != NULL)
{
- DWORD max = dwMaxSamples;
- DWORD l = m_pSndFile->GetSongTime() * wfxSrc.nSamplesPerSec;
- if (l < max) max = l;
::SendMessage(progress, PBM_SETRANGE, 0, MAKELPARAM(0, max >> 14));
}
- dwSamples = 0;
+
+ // For calculating the remaining time
+ DWORD dwStartTime = timeGetTime();
+
+ ullSamples = 0;
pos = 0;
pcmBufSize = WAVECONVERTBUFSIZE;
bFinished = FALSE;
@@ -981,7 +1002,7 @@
lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize);
if (!lRead) bFinished = TRUE;
}
- dwSamples += lRead;
+ ullSamples += lRead;
ash.cbSrcLength = lRead * wfxSrc.nBlockAlign + WAVECONVERTBUFSIZE - pcmBufSize;
ash.cbDstLengthUsed = 0;
if (theApp.AcmStreamConvert(has, &ash, (lRead) ? ACM_STREAMCONVERTF_BLOCKALIGN : ACM_STREAMCONVERTF_END) != MMSYSERR_NOERROR) break;
@@ -1007,16 +1028,23 @@
if (!lWrite) break;
wdh.length += lWrite;
}
- if ((!lRead) || (dwSamples >= dwMaxSamples) || (wdh.length >= m_dwFileLimit)) break;
+ if ((!lRead) || (ullSamples >= ullMaxSamples) || (wdh.length >= m_dwFileLimit)) break;
if (!(n % 10))
{
- DWORD l = dwSamples / wfxSrc.nSamplesPerSec;
- wsprintf(s, "Writing file... (%uKB, %umn%02us)", wdh.length >> 10, l / 60, l % 60);
+ DWORD l = (DWORD)(ullSamples / wfxSrc.nSamplesPerSec);
+
+ DWORD timeRemaining = 0; // estimated remainig time
+ if((ullSamples > 0) && (ullSamples < max))
+ {
+ timeRemaining = static_cast<DWORD>(((timeGetTime() - dwStartTime) * (max - ullSamples) / ullSamples) / 1000);
+ }
+
+ wsprintf(s, "Writing file... (%uKB, %umn%02us) %umn%02us remaining)", wdh.length >> 10, l / 60, l % 60, timeRemaining / 60, timeRemaining % 60);
SetDlgItemText(IDC_TEXT1, s);
}
- if ((progress != NULL) && ((dwSamples >> 14) != pos))
+ if ((progress != NULL) && ((ullSamples >> 14) != pos))
{
- pos = dwSamples >> 14;
+ pos = (DWORD)(ullSamples >> 14);
::SendMessage(progress, PBM_SETPOS, pos, 0);
}
if (m_bAbort) break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-10-24 14:50:44
|
Revision: 404
http://modplug.svn.sourceforge.net/modplug/?rev=404&view=rev
Author: saga-games
Date: 2009-10-24 14:50:32 +0000 (Sat, 24 Oct 2009)
Log Message:
-----------
[Imp] Treeview / VST Selector: Different icons for effects / instruments
[Ref] Slightly rewrote alternative VST magic code
[Ref] Slightly rewrote VST Selector dialog code
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/Vstplug.cpp
trunk/OpenMPT/mptrack/Vstplug.h
trunk/OpenMPT/mptrack/res/img_list.bmp
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-23 23:12:00 UTC (rev 403)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-24 14:50:32 UTC (rev 404)
@@ -256,6 +256,9 @@
IMAGE_INSTRMUTE,
IMAGE_SAMPLEACTIVE,
IMAGE_INSTRACTIVE,
+ IMAGE_NOPLUGIN,
+ IMAGE_EFFECTPLUGIN,
+ IMAGE_PLUGININSTRUMENT,
};
//////////////////////////////////////////////////////////////////////////
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-23 23:12:00 UTC (rev 403)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-24 14:50:32 UTC (rev 404)
@@ -681,7 +681,9 @@
pInfo->hEffects = InsertItem("Plugins", IMAGE_FOLDER, IMAGE_FOLDER, pInfo->hSong, TVI_LAST);
}
wsprintf(s, "FX%d: %s", iFx+1, pPlugin->Info.szName);
- pInfo->tiEffects[iFx] = InsertItem(s, IMAGE_WAVEOUT, IMAGE_WAVEOUT, pInfo->hEffects, TVI_LAST);
+ int nImage = IMAGE_NOPLUGIN;
+ if(pPlugin->pMixPlugin != nullptr) nImage = (pPlugin->pMixPlugin->isInstrument()) ? IMAGE_PLUGININSTRUMENT : IMAGE_EFFECTPLUGIN;
+ pInfo->tiEffects[iFx] = InsertItem(s, nImage, nImage, pInfo->hEffects, TVI_LAST);
nFx++;
}
}
Modified: trunk/OpenMPT/mptrack/Vstplug.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Vstplug.cpp 2009-10-23 23:12:00 UTC (rev 403)
+++ trunk/OpenMPT/mptrack/Vstplug.cpp 2009-10-24 14:50:32 UTC (rev 404)
@@ -16,7 +16,8 @@
#include "version.h"
#include "midimappingdialog.h"
#ifdef VST_USE_ALTERNATIVE_MAGIC //Pelya's plugin ID fix. Breaks fx presets, so let's avoid it for now.
-#include "Unzip32.h" //For CRC calculation (to detect plugins with same UID)
+#define ZLIB_WINAPI
+#include "../zlib/zlib.h" //For CRC32 calculation (to detect plugins with same UID)
#endif
#ifndef NO_VST
@@ -38,27 +39,17 @@
AEffect *DmoToVst(PVSTPLUGINLIB pLib);
#ifdef VST_USE_ALTERNATIVE_MAGIC
-class CalculateCRC32: public CZipArchive // Make Plugin ID unique for sure
+UINT32 CalculateCRC32fromFilename(const char * s)
+//-----------------------------------------------
{
- public:
- DWORD calculate( BYTE *s, int len )
- {
- CZipArchive::crc32val = 0xFFFFFFFFL;
- CZipArchive::UpdateCRC( s, len );
- return CZipArchive::crc32val;
- };
- DWORD calculateFilename( const char * s )
- {
- char fn[_MAX_PATH];
- strncpy( fn, s, sizeof(fn) );
- fn[sizeof(fn)-1] = 0;
- int f;
- for( f=0; fn[f] != 0; f++ ) fn[f] = toupper( fn[f] );
- return calculate( (BYTE *)fn, f );
- };
-};
+ char fn[_MAX_PATH];
+ strncpy(fn, s, sizeof(fn));
+ fn[sizeof(fn)-1] = 0;
+ int f;
+ for(f = 0; fn[f] != 0; f++) fn[f] = toupper(fn[f]);
+ return crc32(0, (BYTE *)fn, f);
-CalculateCRC32 CRC32;
+}
#endif
long VSTCALLBACK CVstPluginManager::MasterCallBack(AEffect *effect, long opcode, long index, long value, void *ptr, float opt)
@@ -260,7 +251,7 @@
#ifdef VST_USE_ALTERNATIVE_MAGIC
if( p->dwPluginId1 == kEffectMagic )
{
- p->dwPluginId1 = CRC32.calculateFilename( p->szLibraryName ); // Make Plugin ID unique for sure (for VSTs with same UID)
+ p->dwPluginId1 = CalculateCRC32fromFilename(p->szLibraryName); // Make Plugin ID unique for sure (for VSTs with same UID)
};
#endif
#ifdef VST_LOG
@@ -329,7 +320,7 @@
{
pEffect->dispatcher(pEffect, effOpen, 0,0,0,0);
#ifdef VST_USE_ALTERNATIVE_MAGIC
- p->dwPluginId1 = CRC32.calculateFilename( p->szLibraryName ); // Make Plugin ID unique for sure
+ p->dwPluginId1 = CalculateCRC32fromFilename(p->szLibraryName); // Make Plugin ID unique for sure
#else
p->dwPluginId1 = pEffect->magic;
#endif
@@ -1276,41 +1267,23 @@
VOID CSelectPluginDlg::UpdatePluginsList(DWORD forceSelect/*=0*/)
//---------------------------------------------------------------
{
- TVINSERTSTRUCT tvis;
CVstPluginManager *pManager = theApp.GetPluginManager();
HTREEITEM cursel, hDmo, hVst, hSynth;
m_treePlugins.SetRedraw(FALSE);
m_treePlugins.DeleteAllItems();
- memset(&tvis, 0, sizeof(tvis));
- tvis.hParent = TVI_ROOT;
- tvis.hInsertAfter = TVI_FIRST;
- tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_TEXT;
- tvis.item.pszText = "VST Instruments";
- tvis.item.iImage = IMAGE_FOLDER;
- tvis.item.iSelectedImage = IMAGE_FOLDER;
- tvis.item.lParam = NULL;
- hSynth = m_treePlugins.InsertItem(&tvis);
- tvis.item.pszText = "DirectX Media Audio Effects";
- hDmo = m_treePlugins.InsertItem(&tvis);
- tvis.item.pszText = "VST Audio Effects";
- hVst = m_treePlugins.InsertItem(&tvis);
- tvis.item.pszText = " No plugin (empty slot)";
- tvis.item.iImage = IMAGE_WAVEOUT;
- tvis.item.iSelectedImage = IMAGE_WAVEOUT;
- cursel = m_treePlugins.InsertItem(&tvis);
+
+ hSynth = AddTreeItem("VST Instruments", IMAGE_FOLDER, false);
+ hDmo = AddTreeItem("DirectX Media Audio Effects", IMAGE_FOLDER, false);
+ hVst = AddTreeItem("VST Audio Effects", IMAGE_FOLDER, false);
+ cursel = AddTreeItem("No plugin (empty slot)", IMAGE_NOPLUGIN, false);
+
if (pManager)
{
PVSTPLUGINLIB pCurrent = NULL;
PVSTPLUGINLIB p = pManager->GetFirstPlugin();
while (p)
{
- if (p->dwPluginId1 == kDmoMagic) {
- tvis.hParent = hDmo;
- } else {
- tvis.hParent = (p->bIsInstrument) ? hSynth : hVst;
- }
-
// Apply name filter
if (m_sNameFilter != "") {
CString displayName = p->szLibraryName;
@@ -1320,34 +1293,41 @@
}
}
- tvis.hInsertAfter = TVI_SORT;
- tvis.item.pszText = p->szLibraryName;
- tvis.item.lParam = (LPARAM)p;
- HTREEITEM h = m_treePlugins.InsertItem(&tvis);
+ HTREEITEM hParent;
+ if (p->dwPluginId1 == kDmoMagic) {
+ hParent = hDmo;
+ } else {
+ hParent = (p->bIsInstrument) ? hSynth : hVst;
+ }
+ HTREEITEM h = AddTreeItem(p->szLibraryName, p->bIsInstrument ? IMAGE_PLUGININSTRUMENT : IMAGE_EFFECTPLUGIN, true, hParent, (LPARAM)p);
+
//If filter is active, expand nodes.
- if (m_sNameFilter != "") {
- m_treePlugins.EnsureVisible(h);
- }
+ if (m_sNameFilter != "") m_treePlugins.EnsureVisible(h);
//Which plugin should be selected?
- if (m_pPlugin) {
+ if (m_pPlugin)
+ {
//forced selection (e.g. just after add plugin)
- if (forceSelect != 0) {
- if (p->dwPluginId2 == forceSelect) {
+ if (forceSelect != 0)
+ {
+ if (p->dwPluginId2 == forceSelect)
+ {
pCurrent = p;
}
}
//Current slot's plugin
- else if (m_pPlugin->pMixPlugin) {
+ else if (m_pPlugin->pMixPlugin)
+ {
CVstPlugin *pVstPlug = (CVstPlugin *)m_pPlugin->pMixPlugin;
if (pVstPlug->GetPluginFactory() == p) pCurrent = p;
}
//Plugin with matching ID to current slot's plug
- else if (/* (!pCurrent) && */ m_pPlugin->Info.dwPluginId1 !=0 || m_pPlugin->Info.dwPluginId2 != 0 ) {
+ else if (/* (!pCurrent) && */ m_pPlugin->Info.dwPluginId1 !=0 || m_pPlugin->Info.dwPluginId2 != 0)
+ {
if ((p->dwPluginId1 == m_pPlugin->Info.dwPluginId1)
&& (p->dwPluginId2 == m_pPlugin->Info.dwPluginId2)) {
pCurrent = p;
@@ -1355,7 +1335,8 @@
}
//Last selected plugin
- else {
+ else
+ {
if (p->dwPluginId2 == CMainFrame::GetMainFrame()->gnPlugWindowLast) {
pCurrent = p;
}
@@ -1373,7 +1354,22 @@
}
}
+HTREEITEM CSelectPluginDlg::AddTreeItem(LPSTR szTitle, int iImage, bool bSort, HTREEITEM hParent, LPARAM lParam)
+//--------------------------------------------------------------------------------------------------------------
+{
+ TVINSERTSTRUCT tvis;
+ memset(&tvis, 0, sizeof(tvis));
+ tvis.hParent = hParent;
+ tvis.hInsertAfter = (bSort) ? TVI_SORT : TVI_FIRST;
+ tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_TEXT;
+ tvis.item.pszText = szTitle;
+ tvis.item.iImage = tvis.item.iSelectedImage = iImage;
+ tvis.item.lParam = lParam;
+ return m_treePlugins.InsertItem(&tvis);
+}
+
+
VOID CSelectPluginDlg::OnSelDblClk(NMHDR *, LRESULT *result)
//----------------------------------------------------------
{
@@ -1385,7 +1381,8 @@
HTREEITEM hSel = m_treePlugins.GetSelectedItem();
int nImage, nSelectedImage;
m_treePlugins.GetItemImage(hSel, nImage, nSelectedImage);
- if ((hSel) && (nImage == IMAGE_WAVEOUT)) OnOK();
+
+ if ((hSel) && (nImage != IMAGE_FOLDER)) OnOK();
if (result) *result = 0;
}
Modified: trunk/OpenMPT/mptrack/Vstplug.h
===================================================================
--- trunk/OpenMPT/mptrack/Vstplug.h 2009-10-23 23:12:00 UTC (rev 403)
+++ trunk/OpenMPT/mptrack/Vstplug.h 2009-10-24 14:50:32 UTC (rev 404)
@@ -275,6 +275,8 @@
CTreeCtrl m_treePlugins;
CString m_sNameFilter;
+ HTREEITEM AddTreeItem(LPSTR szTitle, int iImage, bool bSort, HTREEITEM hParent = TVI_ROOT, LPARAM lParam = NULL);
+
public:
CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent); //rewbs.plugDocAware
VOID DoClose();
Modified: trunk/OpenMPT/mptrack/res/img_list.bmp
===================================================================
(Binary files differ)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-10-23 23:12:16
|
Revision: 403
http://modplug.svn.sourceforge.net/modplug/?rev=403&view=rev
Author: saga-games
Date: 2009-10-23 23:12:00 +0000 (Fri, 23 Oct 2009)
Log Message:
-----------
[Fix] Pattern c&p: invalid commands are not pasted anymore
[Fix] Mod conversion: "orderlist fixing" did not work as expected
[Imp] Pattern c&p: convert pasted commands if necessary
[Imp] Mod conversion: insert pattern break commands when resizing patterns to 64 rows that were smaller
[Imp] Note Properties: Better explanation of "Invert Loop" parameter
[Ref] Added "HasCommand" / "HasVolCommand" to the Mod Specifications
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/soundlib/LOAD_AMF.CPP
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mdl.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/mod_specifications.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
trunk/OpenMPT/soundlib/modcommand.h
trunk/OpenMPT/soundlib/pattern.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -2721,10 +2721,17 @@
strcat(s, " rows");
break;
case 0xF0:
- if(m_SndFile.m_nType & MOD_TYPE_MOD)
- wsprintf(s, "Speed %d", param & 0x0F); // invert loop
- else
- wsprintf(s, "SF%X", param & 0x0F); // macro
+ if(m_SndFile.m_nType & MOD_TYPE_MOD) // invert loop
+ {
+ if((param & 0x0F) == 0)
+ strcpy(s, "Stop");
+ else
+ wsprintf(s, "Speed %d", param & 0x0F);
+ }
+ else // macro
+ {
+ wsprintf(s, "SF%X", param & 0x0F);
+ }
break;
default:
break;
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -68,6 +68,8 @@
newTypeIsXM_IT_MPT = (newTypeIsXM || newTypeIsIT || newTypeIsMPT),
newTypeIsIT_MPT = (newTypeIsIT || newTypeIsMPT);
+ const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType);
+
if(oldTypeIsMPT)
{
if(::MessageBox(NULL, str_mptm_conversion_warning, 0, MB_YESNO) != IDYES)
@@ -126,7 +128,12 @@
UINT i = 0;
for (i=0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64))
{
- m_SndFile.Patterns[i].Resize(64);
+ if(m_SndFile.PatternSize[i] < 64)
+ {
+ // try to save short patterns by inserting a pattern break.
+ m_SndFile.TryWriteEffect(i, m_SndFile.PatternSize[i] - 1, CMD_PATTERNBREAK, 0, false, CHANNELINDEX_INVALID, false, true);
+ }
+ m_SndFile.Patterns[i].Resize(64, false);
if (b64 < 5)
{
wsprintf(s, "WARNING: Pattern %d resized to 64 rows\n", i);
@@ -285,6 +292,27 @@
{
AddToLog("WARNING: Samples above 31 will be lost when saving as MOD!\n");
}
+
+ // Order list too long? -> remove unnecessary order items first.
+ if(m_SndFile.Order.GetLengthTailTrimmed() > specs.ordersMax)
+ {
+ for(ORDERINDEX nOrd = m_SndFile.Order.GetLengthTailTrimmed() - 1; nOrd > 0; nOrd--)
+ {
+ if(m_SndFile.Patterns.IsValidPat(m_SndFile.Order[nOrd]) == false)
+ {
+ for(ORDERINDEX nMoveOrd = nOrd; nMoveOrd < m_SndFile.Order.GetLengthTailTrimmed() - 1; nMoveOrd++)
+ {
+ m_SndFile.Order[nMoveOrd] = m_SndFile.Order[nMoveOrd + 1];
+ }
+ m_SndFile.Order[m_SndFile.Order.GetLengthTailTrimmed() - 1] = m_SndFile.Order.GetInvalidPatIndex();
+ }
+ }
+ if(m_SndFile.Order.GetLengthTailTrimmed() > specs.ordersMax)
+ {
+ AddToLog("WARNING: Order list has been trimmed!\n");
+ }
+ }
+
BEGIN_CRITICAL();
m_SndFile.ChangeModTypeTo(nNewType);
if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES))
@@ -311,7 +339,6 @@
//end rewbs.cutomKeys
// Check mod specifications
- const CModSpecifications& specs = m_SndFile.GetModSpecifications();
m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax);
m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax);
@@ -325,26 +352,6 @@
if(bTrimmedEnvelopes == true)
AddToLog("WARNING: Instrument envelopes have been shortened.\n");
- // Order list too long -> remove unnecessary order items first.
- if(m_SndFile.Order.GetLengthTailTrimmed() > specs.ordersMax)
- {
- for(ORDERINDEX nOrd = m_SndFile.Order.GetLengthTailTrimmed() - 1; nOrd >= 0; nOrd--)
- {
- if(m_SndFile.Patterns.IsValidPat(m_SndFile.Order[nOrd]) == false)
- {
- for(ORDERINDEX nMoveOrd = nOrd; nMoveOrd < m_SndFile.Order.GetLengthTailTrimmed(); nMoveOrd++)
- {
- m_SndFile.Order[nMoveOrd] = m_SndFile.Order[nMoveOrd + 1];
- }
- }
- }
- if(m_SndFile.Order.GetLengthTailTrimmed() > specs.ordersMax)
- {
- AddToLog("WARNING: Order list has been trimmed!");
- }
- m_SndFile.Order.resize(specs.ordersMax);
- }
-
SetModified();
ClearPatternUndo();
UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL);
@@ -1122,13 +1129,14 @@
if ((hCpy) && ((p = (LPSTR)GlobalLock(hCpy)) != NULL))
{
PreparePatternUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]);
- BYTE spdmax = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 0x20 : 0x1F;
+ TEMPO spdmax = m_SndFile.GetModSpecifications().speedMax;
DWORD dwMemSize = GlobalSize(hCpy);
MODCOMMAND *m = m_SndFile.Patterns[nPattern];
UINT nrow = dwBeginSel >> 16;
UINT ncol = (dwBeginSel & 0xFFFF) >> 3;
UINT col;
- BOOL bS3M = FALSE, bOk = FALSE;
+ bool bS3MCommands = false, bOk = false;
+ MODTYPE origFormat = MOD_TYPE_MOD;
UINT len = 0;
MODCOMMAND origModCmd;
@@ -1147,13 +1155,15 @@
if (!c) goto PasteDone;
if ((c == 0x0D) && (len > 3))
{
- //if ((p[len-3] == 'I') || (p[len-4] == 'S')) bS3M = TRUE;
- // IT? S3M? MPT?
- if ((p[len-3] == 'I') || (p[len-4] == 'S') || (p[len-3] == 'P')) bS3M = TRUE;
+ if(p[len - 3] == 'I') origFormat = MOD_TYPE_IT;
+ if(p[len - 3] == 'P') origFormat = MOD_TYPE_MPT;
+ if(p[len - 4] == 'S') origFormat = MOD_TYPE_S3M;
+ if(p[len - 3] == 'X') origFormat = MOD_TYPE_XM;
break;
}
}
- bOk = TRUE;
+ bS3MCommands = (origFormat & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M)) != 0 ? true : false;
+ bOk = true;
while ((nrow < m_SndFile.PatternSize[nPattern]) && (len + 11 < dwMemSize))
{
// Search for column separator
@@ -1255,7 +1265,7 @@
m[col].command = 0;
if (s[8] != '.')
{
- LPCSTR psc = (bS3M) ? gszS3mCommands : gszModCommands;
+ LPCSTR psc = (bS3MCommands) ? gszS3mCommands : gszModCommands;
for (UINT i=1; i<MAX_EFFECTS; i++)
{
if ((s[8] == psc[i]) && (psc[i] != '?')) m[col].command = i;
@@ -1283,7 +1293,7 @@
{
case CMD_SPEED:
case CMD_TEMPO:
- if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
+ if (!bS3MCommands) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
else
{
if ((m[col].command == CMD_SPEED) && (m[col].param > spdmax)) m[col].param = CMD_TEMPO; else
@@ -1297,12 +1307,15 @@
{
case CMD_SPEED:
case CMD_TEMPO:
- if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
+ if (!bS3MCommands) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
break;
}
}
}
}
+ // convert some commands, if necessary.
+ if(origFormat != m_SndFile.m_nType) m_SndFile.ConvertCommand(&(m[col]), origFormat, m_SndFile.m_nType);
+
len += 12;
col++;
}
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-10-23 23:12:00 UTC (rev 403)
@@ -406,9 +406,6 @@
///////////////////////////////////////////////////
// Tables
-#define MAX_EFFECTS 37 //rewbs.smoothVST & rewbs.velocity: increased from 32. Wonder what this will break...
- //+1 for eric's multiplier
-#define MAX_VOLCMDS 16 //rewbs.voloff & rewbs.velocity: increased from 14
extern const BYTE gEffectColors[MAX_EFFECTS];
extern const LPCSTR szNoteNames[12];
@@ -422,8 +419,8 @@
STATIC_ASSERT(ARRAYELEMCOUNT(szSpecialNoteShortDesc) == ARRAYELEMCOUNT(szSpecialNoteNames));
const LPCSTR szHexChar = "0123456789ABCDEF";
-const LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last :
-const LPCSTR gszS3mCommands = " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last :
+const LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#??"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last :
+const LPCSTR gszS3mCommands = " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#??"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last :
const LPCSTR gszVolCommands = " vpcdabuhlrgfe:o"; //rewbs.velocity: added last : ; rewbs.volOff added last o
// Defined in load_mid.cpp
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/mptrack/View_ins.h 2009-10-23 23:12:00 UTC (rev 403)
@@ -17,7 +17,8 @@
POINT m_ptMenu;
RECT m_rcClient;
bool m_baPlayingNote[128]; //rewbs.instViewNNA
- UINT m_nInstrument, m_nEnv, m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel;
+ INSTRUMENTINDEX m_nInstrument;
+ UINT m_nEnv, m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel;
DWORD m_dwStatus;
DWORD m_NcButtonState[ENV_LEFTBAR_BUTTONS];
DWORD m_dwNotifyPos[MAX_CHANNELS];
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -3827,8 +3827,7 @@
if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
&& ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO)))
{
- UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20;
- p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO;
+ p->command = (p->param <= pSndFile->GetModSpecifications().speedMax) ? CMD_SPEED : CMD_TEMPO;
}
}
@@ -3886,8 +3885,7 @@
if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
&& ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO)))
{
- UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20;
- p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO;
+ p->command = (p->param <= pSndFile->GetModSpecifications().speedMax) ? CMD_SPEED : CMD_TEMPO;
}
}
Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-10-23 23:12:00 UTC (rev 403)
@@ -311,7 +311,7 @@
for (UINT iOrd=0; iOrd < pfh->numorders; iOrd++)
{
Order[iOrd] = iOrd;
- Patterns[iOrd].Resize(64);
+ Patterns[iOrd].Resize(64, false);
if (pfh->version >= 14)
{
Patterns[iOrd].Resize(LittleEndianW(*(USHORT *)(lpStream+dwMemPos)));
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -664,7 +664,7 @@
ASSERT_CAN_READ(4);
memcpy(&id,lpStream+streamPos,sizeof(DWORD));
if(id > MAX_PATTERN_ROWS) return false;
- Patterns[npat].Resize(id);
+ Patterns[npat].Resize(id, false);
streamPos += sizeof(DWORD);
// Try to allocate & read only sized patterns
Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -291,7 +291,7 @@
} else
{
pdata = (const WORD *)(lpStream + dwPos);
- Patterns[i].Resize(64);
+ Patterns[i].Resize(64, false);
if (m_nChannels < 32) m_nChannels = 32;
dwPos += 2*32;
ch = 32;
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -3733,4 +3733,11 @@
if(!CSoundFile::GetModSpecifications(nNewType).HasNote(m->note))
m->note = NOTE_NONE;
+
+ // ensure the commands really exist in this format
+ if(CSoundFile::GetModSpecifications(nNewType).HasCommand(m->command) == false)
+ m->command = CMD_NONE;
+ if(CSoundFile::GetModSpecifications(nNewType).HasVolCommand(m->volcmd) == false)
+ m->volcmd = CMD_NONE;
+
}
\ No newline at end of file
Modified: trunk/OpenMPT/soundlib/mod_specifications.cpp
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/mod_specifications.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -21,4 +21,20 @@
return false;
}
+bool CModSpecifications::HasVolCommand(MODCOMMAND::VOLCMD volcmd) const
+//---------------------------------------------------------------------
+{
+ if(volcmd >= MAX_VOLCMDS) return false;
+ if(volcommands[volcmd] == '?') return false;
+ return true;
+}
+bool CModSpecifications::HasCommand(MODCOMMAND::COMMAND cmd) const
+//----------------------------------------------------------------
+{
+ if(cmd >= MAX_EFFECTS) return false;
+ if(commands[cmd] == '?') return false;
+ return true;
+}
+
+
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-10-23 23:12:00 UTC (rev 403)
@@ -12,6 +12,8 @@
{
// Return true if format supports given note.
bool HasNote(MODCOMMAND::NOTE note) const;
+ bool HasVolCommand(MODCOMMAND::VOLCMD volcmd) const;
+ bool HasCommand(MODCOMMAND::COMMAND cmd) const;
//NOTE: If changing order, update all initializations below.
char fileExtension[6]; // File extension without dot.
@@ -37,6 +39,8 @@
UINT speedMax; // Maximum ticks per frame
bool hasComments; // True if format has a comments field
UINT envelopePointsMax; // Maximum number of points of each envelope
+ char commands[MAX_EFFECTS + 1]; // An array holding all commands this format supports; commands that are not supported are marked with "?"
+ char volcommands[MAX_VOLCMDS + 1]; // dito, but for volume column
};
@@ -73,6 +77,8 @@
255, //Max Speed
true, //Has song comments
240, //Envelope point count
+ " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects
+ " vpcdabuhlrgfe:o", // Supported Volume Column commands
};
@@ -104,6 +110,8 @@
31, //Max Speed
false, //No song comments
0, //No instrument envelopes
+ " 0123456789ABCD?FF?E???????????????", // Supported Effects
+ " ???????????????", // Supported Volume Column commands
};
// MOD with MPT extensions.
@@ -133,6 +141,8 @@
31, //Max Speed
false, //No song comments
0, //No instrument envelopes
+ " 0123456789ABCD?FF?E???????????????", // Supported Effects
+ " ???????????????", // Supported Volume Column commands
};
const CModSpecifications xm =
@@ -161,6 +171,8 @@
31, //Max Speed
false, //No song comments
12, //Envelope point count
+ " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#", // Supported Effects
+ " vpcdabuhlrg????", // Supported Volume Column commands
};
// XM with MPT extensions
@@ -190,6 +202,8 @@
31, //Max Speed
true, //Has song comments
12, //Envelope point count
+ " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#", // Supported Effects
+ " vpcdabuhlrgfe:o", // Supported Volume Column commands
};
const CModSpecifications s3m =
@@ -217,6 +231,8 @@
255, //Max Speed
false, //No song comments
0, //No instrument envelopes
+ " JFEGHLKRXODB?CQATI?SMNVW?U????????", // Supported Effects
+ " vp?????????????", // Supported Volume Column commands
};
// S3M with MPT extensions
@@ -246,6 +262,8 @@
255, //Max Speed
false, //No song comments
0, //No instrument envelopes
+ " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects
+ " vp?????????????", // Supported Volume Column commands
};
const CModSpecifications it =
@@ -274,6 +292,8 @@
255, //Max Speed
true, //Has song comments
25, //Envelope point count
+ " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z???", // Supported Effects
+ " vpcdab?h??gfe??", // Supported Volume Column commands
};
const CModSpecifications itEx =
@@ -302,6 +322,8 @@
255, //Max Speed
true, //Has song comments
25, //Envelope point count
+ " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects
+ " vpcdab?h??gfe:o", // Supported Volume Column commands
};
} //namespace ModSpecs
Modified: trunk/OpenMPT/soundlib/modcommand.h
===================================================================
--- trunk/OpenMPT/soundlib/modcommand.h 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/modcommand.h 2009-10-23 23:12:00 UTC (rev 403)
@@ -90,6 +90,7 @@
#define VOLCMD_PORTADOWN 13
#define VOLCMD_VELOCITY 14 //rewbs.velocity
#define VOLCMD_OFFSET 15 //rewbs.volOff
+#define MAX_VOLCMDS 16
// Effect column commands
@@ -130,6 +131,7 @@
#define CMD_XPARAM 34 // -> CODE#0010 -> DESC="add extended parameter mechanism to pattern effects" -! NEW_FEATURE#0010
#define CMD_NOTESLIDEUP 35 // IMF Gxy
#define CMD_NOTESLIDEDOWN 36 // IMF Hxy
+#define MAX_EFFECTS 37
#endif
Modified: trunk/OpenMPT/soundlib/pattern.cpp
===================================================================
--- trunk/OpenMPT/soundlib/pattern.cpp 2009-10-20 18:24:29 UTC (rev 402)
+++ trunk/OpenMPT/soundlib/pattern.cpp 2009-10-23 23:12:00 UTC (rev 403)
@@ -18,7 +18,7 @@
bool CPattern::Resize(const ROWINDEX newRowCount, const bool showDataLossWarning)
-//-------------------------------------------
+//-------------------------------------------------------------------------------
{
if(m_ModCommands == NULL)
{
@@ -69,7 +69,7 @@
{
END_CRITICAL();
rModDoc.EndWaitCursor();
- if (CMainFrame::GetMainFrame()->MessageBox("Data at the end of the pattern will be lost.\nDo you want to continue",
+ if (CMainFrame::GetMainFrame()->MessageBox("Data at the end of the pattern will be lost.\nDo you want to continue?",
"Shrink Pattern", MB_YESNO|MB_ICONQUESTION) == IDYES) bOk = TRUE;
rModDoc.BeginWaitCursor();
BEGIN_CRITICAL();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-10-20 18:24:38
|
Revision: 402
http://modplug.svn.sourceforge.net/modplug/?rev=402&view=rev
Author: saga-games
Date: 2009-10-20 18:24:29 +0000 (Tue, 20 Oct 2009)
Log Message:
-----------
[Imp] Treeview: Sample / instrument live playback status is now only updated when those nodes are actually expanded
[Ref] Rewrote the "general options" code, it's much cleaner and easier to use now.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-10-18 16:54:18 UTC (rev 401)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-10-20 18:24:29 UTC (rev 402)
@@ -642,6 +642,7 @@
typedef struct OPTGENDESC
{
+ DWORD dwFlagID;
LPCSTR pszListName, pszDescription;
} OPTGENDESC;
@@ -676,34 +677,33 @@
static OPTGENDESC gOptGenDesc[OPTGEN_MAXOPTIONS] =
{
- {"Play new notes while recording", "When this option is enabled, notes entered in the pattern editor will always be played (If not checked, notes won't be played in record mode)."},
- {"Always center active row", "Turn on this option to have the active row always centered in the pattern editor (requires \"Always center active row\")."},
- {"Use large font for comments", "With this option enabled, the song message editor will use a larger font."},
- {"Display rows in hex", "With this option enabled, row numbers and sequence numbers will be displayed in hexadecimal."},
- {"Cursor wrap in pattern editor", "When this option is active, going past the end of a pattern row or channel will move the cursor to the beginning. When \"Continuous scroll\"-option is enabled, row wrap is disabled."},
- {"Create backup files (*.bak)", "When this option is active, saving a file will create a backup copy of the original."},
- {"Drag and Drop Editing", "Enable moving a selection in the pattern editor (copying if pressing shift while dragging)\n"},
- {"Flat Buttons", "Use flat buttons in toolbars"},
- {"Single click to expand tree", "Single-clicking in the left tree view will expand a branch"},
- {"Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."},
- {"Quick cursor paste Auto-Repeat", "Leaving the space bar pressed will auto-repeat the action"},
- {"No loud samples", "Disable loud playback of samples in the sample/instrument editor"},
- {"Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."},
- {"Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"},
- {"Record note off", "Record note off when a key is released on the PC keyboard (Only works in instrument mode)."},
- {"Follow song off by default", "Ensure follow song is off when opening or starting a new song."},
- {"Midi record", "Enable midi in record by default."},
- {"Old style pattern context menu", "Check this option to hide unavailable items in the pattern editor context menu. Uncheck to grey-out unavailable items instead."},
- {"Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"},
- {"Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."},
- {"Note fade on key up", "Enable to fade/stop notes on key up in pattern tab." },
- {"Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."},
- {"Position aware timer", "If enabled, timer will show the playback position time if possible instead of running timer."},
- {"Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands)"},
- {"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a differnt icon in the treeview."}
+ {PATTERN_PLAYNEWNOTE, "Play new notes while recording", "When this option is enabled, notes entered in the pattern editor will always be played (If not checked, notes won't be played in record mode)."},
+ {PATTERN_CENTERROW, "Always center active row", "Turn on this option to have the active row always centered in the pattern editor (requires \"Always center active row\")."},
+ {PATTERN_LARGECOMMENTS, "Use large font for comments", "With this option enabled, the song message editor will use a larger font."},
+ {PATTERN_HEXDISPLAY, "Display rows in hex", "With this option enabled, row numbers and sequence numbers will be displayed in hexadecimal."},
+ {PATTERN_WRAP, "Cursor wrap in pattern editor", "When this option is active, going past the end of a pattern row or channel will move the cursor to the beginning. When \"Continuous scroll\"-option is enabled, row wrap is disabled."},
+ {PATTERN_CREATEBACKUP, "Create backup files (*.bak)", "When this option is active, saving a file will create a backup copy of the original."},
+ {PATTERN_DRAGNDROPEDIT, "Drag and Drop Editing", "Enable moving a selection in the pattern editor (copying if pressing shift while dragging)\n"},
+ {PATTERN_FLATBUTTONS, "Flat Buttons", "Use flat buttons in toolbars"},
+ {PATTERN_SINGLEEXPAND, "Single click to expand tree", "Single-clicking in the left tree view will expand a branch"},
+ {PATTERN_MUTECHNMODE, "Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."},
+ {PATTERN_AUTOSPACEBAR, "Quick cursor paste Auto-Repeat", "Leaving the space bar pressed will auto-repeat the action"},
+ {PATTERN_NOEXTRALOUD, "No loud samples", "Disable loud playback of samples in the sample/instrument editor"},
+ {PATTERN_SHOWPREVIOUS, "Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."},
+ {PATTERN_CONTSCROLL, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"},
+ {PATTERN_KBDNOTEOFF, "Record note off", "Record note off when a key is released on the PC keyboard (Only works in instrument mode)."},
+ {PATTERN_FOLLOWSONGOFF, "Follow song off by default", "Ensure follow song is off when opening or starting a new song."},
+ {PATTERN_MIDIRECORD, "Midi record", "Enable midi in record by default."},
+ {PATTERN_OLDCTXMENUSTYLE, "Old style pattern context menu", "Check this option to hide unavailable items in the pattern editor context menu. Uncheck to grey-out unavailable items instead."},
+ {PATTERN_SYNCMUTE, "Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"},
+ {PATTERN_AUTODELAY, "Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."},
+ {PATTERN_NOTEFADE, "Note fade on key up", "Enable to fade/stop notes on key up in pattern tab." },
+ {PATTERN_OVERFLOWPASTE, "Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."},
+ {PATTERN_POSITIONAWARETIMER, "Position aware timer", "If enabled, timer will show the playback position time if possible instead of running timer."},
+ {PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands)"},
+ {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a differnt icon in the treeview."}
};
-
void COptionsGeneral::DoDataExchange(CDataExchange* pDX)
//------------------------------------------------------
{
@@ -720,43 +720,15 @@
CHAR sname[32], s[256];
CPropertyPage::OnInitDialog();
- for (UINT i=0; i<OPTGEN_MAXOPTIONS; i++)
+ for (UINT i = 0; i < OPTGEN_MAXOPTIONS; i++)
{
- BOOL bCheck;
+ bool bCheck;
wsprintf(sname, "Setup.Gen.Opt%d.Name", i+1);
if ((theApp.GetLocalizedString(sname, s, sizeof(s))) && (s[0]))
m_CheckList.AddString(s);
else
m_CheckList.AddString(gOptGenDesc[i].pszListName);
- bCheck = FALSE;
- switch(i)
- {
- case OPTGEN_PLAYNEWNOTES: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_PLAYNEWNOTE); break;
- case OPTGEN_CENTERROW: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_CENTERROW); break;
- case OPTGEN_LARGECOMMENTSFONT: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_LARGECOMMENTS); break;
- case OPTGEN_HEXROWDISP: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY); break;
- case OPTGEN_CURSORWRAP: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_WRAP); break;
- case OPTGEN_CREATEBACKUP: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_CREATEBACKUP); break;
- case OPTGEN_DRAGNDROPEDIT: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_DRAGNDROPEDIT); break;
- case OPTGEN_FLATBUTTONS: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_FLATBUTTONS); break;
- case OPTGEN_SINGLEEXPAND: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_SINGLEEXPAND); break;
- case OPTGEN_MUTECHNMODE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_MUTECHNMODE); break;
- case OPTGEN_AUTOSPACEBAR: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_AUTOSPACEBAR); break;
- case OPTGEN_NOEXTRALOUD: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_NOEXTRALOUD); break;
- case OPTGEN_SHOWPREVIOUS: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_SHOWPREVIOUS); break;
- case OPTGEN_CONTSCROLL: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_CONTSCROLL); break;
- case OPTGEN_KBDNOTEOFF: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_KBDNOTEOFF); break;
- case OPTGEN_FOLLOWSONGOFF: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF); break;
- case OPTGEN_MIDIRECORD: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_MIDIRECORD); break;
- case OPTGEN_PATTERNCTXMENUSTYLE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE); break;
- case OPTGEN_SYNCMUTE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_SYNCMUTE); break;
- case OPTGEN_AUTODELAY: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY); break;
- case OPTGEN_PATNOTEFADE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_NOTEFADE); break;
- case OPTGEN_OVERFLOWPASTE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE); break;
- case OPTGEN_POSITIONAWARETIMER: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_POSITIONAWARETIMER); break;
- case OPTGEN_RESETCHANNELS: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_RESETCHANNELS); break;
- case OPTGEN_LIVEUPDATETREE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_LIVEUPDATETREE); break;
- }
+ bCheck = (CMainFrame::m_dwPatternSetup & gOptGenDesc[i].dwFlagID) != 0 ? true : false;
m_CheckList.SetCheck(i, (bCheck) ? TRUE : FALSE);
}
m_CheckList.SetCurSel(0);
@@ -784,40 +756,13 @@
GetDlgItemText(IDC_OPTIONS_DIR_VSTS, szVstDir, _MAX_PATH);
GetDlgItemText(IDC_OPTIONS_DIR_VSTPRESETS, szPresetDir, _MAX_PATH);
- for (UINT i=0; i < OPTGEN_MAXOPTIONS; i++)
+ for (UINT i = 0; i < OPTGEN_MAXOPTIONS; i++)
{
- DWORD mask = 0;
BOOL bCheck = m_CheckList.GetCheck(i);
- switch(i)
- {
- case OPTGEN_PLAYNEWNOTES: mask = PATTERN_PLAYNEWNOTE; break;
- case OPTGEN_CENTERROW: mask = PATTERN_CENTERROW; break;
- case OPTGEN_LARGECOMMENTSFONT: mask = PATTERN_LARGECOMMENTS; break;
- case OPTGEN_HEXROWDISP: mask = PATTERN_HEXDISPLAY; break;
- case OPTGEN_CURSORWRAP: mask = PATTERN_WRAP; break;
- case OPTGEN_CREATEBACKUP: mask = PATTERN_CREATEBACKUP; break;
- case OPTGEN_DRAGNDROPEDIT: mask = PATTERN_DRAGNDROPEDIT; break;
- case OPTGEN_FLATBUTTONS: mask = PATTERN_FLATBUTTONS; break;
- case OPTGEN_SINGLEEXPAND: mask = PATTERN_SINGLEEXPAND; break;
- case OPTGEN_MUTECHNMODE: mask = PATTERN_MUTECHNMODE; break;
- case OPTGEN_AUTOSPACEBAR: mask = PATTERN_AUTOSPACEBAR; break;
- case OPTGEN_NOEXTRALOUD: mask = PATTERN_NOEXTRALOUD; break;
- case OPTGEN_SHOWPREVIOUS: mask = PATTERN_SHOWPREVIOUS; break;
- case OPTGEN_CONTSCROLL: mask = PATTERN_CONTSCROLL; break;
- case OPTGEN_KBDNOTEOFF: mask = PATTERN_KBDNOTEOFF; break;
- case OPTGEN_FOLLOWSONGOFF: mask = PATTERN_FOLLOWSONGOFF; break;
- case OPTGEN_MIDIRECORD: mask = PATTERN_MIDIRECORD; break;
- case OPTGEN_PATTERNCTXMENUSTYLE: mask = PATTERN_OLDCTXMENUSTYLE; break;
- case OPTGEN_SYNCMUTE: mask = PATTERN_SYNCMUTE; break;
- case OPTGEN_AUTODELAY: mask = PATTERN_AUTODELAY; break;
- case OPTGEN_PATNOTEFADE: mask = PATTERN_NOTEFADE; break;
- case OPTGEN_OVERFLOWPASTE: mask = PATTERN_OVERFLOWPASTE; break;
- case OPTGEN_POSITIONAWARETIMER: mask = PATTERN_POSITIONAWARETIMER; break;
- case OPTGEN_RESETCHANNELS: mask = PATTERN_RESETCHANNELS; break;
- case OPTGEN_LIVEUPDATETREE: mask = PATTERN_LIVEUPDATETREE; break;
-
- }
- if (bCheck) CMainFrame::m_dwPatternSetup |= mask; else CMainFrame::m_dwPatternSetup &= ~mask;
+
+ if(bCheck) CMainFrame::m_dwPatternSetup |= gOptGenDesc[i].dwFlagID;
+ else CMainFrame::m_dwPatternSetup &= ~gOptGenDesc[i].dwFlagID;
+
m_CheckList.SetCheck(i, (bCheck) ? TRUE : FALSE);
}
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-18 16:54:18 UTC (rev 401)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-20 18:24:29 UTC (rev 402)
@@ -2043,41 +2043,54 @@
// Update sample / instrument playing status icons (will only detect instruments with samples, though)
if((CMainFrame::m_dwPatternSetup & PATTERN_LIVEUPDATETREE) == 0) return;
- // TODO: Is there a way to find out if the treeview is actually visible? Or if the Sample and Instrument folders are collapsed?
+ // TODO: Is there a way to find out if the treeview is actually visible?
/*static int nUpdateCount = 0;
nUpdateCount++;
if(nUpdateCount < 5) return; // don't update too often
nUpdateCount = 0;*/
+ // check whether the lists are actually visible (don't waste resources)
+ bool bUpdateSamples = IsItemExpanded(DocInfo[nDocNdx]->hSamples), bUpdateInstruments = IsItemExpanded(DocInfo[nDocNdx]->hInstruments);
+
memset(DocInfo[nDocNdx]->bIsSamplePlaying, false, MAX_SAMPLES * sizeof(bool));
memset(DocInfo[nDocNdx]->bIsInstrPlaying, false, MAX_INSTRUMENTS * sizeof(bool));
+ if((bUpdateSamples == false) && (bUpdateInstruments == false)) return;
+
CSoundFile *pSndFile = pModDoc->GetSoundFile();
if(pSndFile == nullptr) return;
for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
{
- if(pSndFile->Chn[nChn].nPos > 0)
+ if(pSndFile->Chn[nChn].pCurrentSample != nullptr)
{
- for(SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->m_nSamples; nSmp++)
+ if(bUpdateSamples)
{
- if(pSndFile->Chn[nChn].pModSample == &pSndFile->Samples[nSmp])
+ for(SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->m_nSamples; nSmp++)
{
- DocInfo[nDocNdx]->bIsSamplePlaying[nSmp - 1] = true;
- break;
+ if(pSndFile->Chn[nChn].pModSample == &pSndFile->Samples[nSmp])
+ {
+ DocInfo[nDocNdx]->bIsSamplePlaying[nSmp - 1] = true;
+ break;
+ }
}
}
- for(INSTRUMENTINDEX nIns = 1; nIns <= pSndFile->m_nInstruments; nIns++)
+ if(bUpdateInstruments)
{
- if(pSndFile->Chn[nChn].pModInstrument == pSndFile->Instruments[nIns])
+ for(INSTRUMENTINDEX nIns = 1; nIns <= pSndFile->m_nInstruments; nIns++)
{
- DocInfo[nDocNdx]->bIsInstrPlaying[nIns - 1] = true;
- break;
+ if(pSndFile->Chn[nChn].pModInstrument == pSndFile->Instruments[nIns])
+ {
+ DocInfo[nDocNdx]->bIsInstrPlaying[nIns - 1] = true;
+ break;
+ }
}
}
}
}
- UpdateView(nDocNdx, HINT_SAMPLEINFO | HINT_INSTRUMENT);
+ // what should be updated?
+ DWORD dwHintFlags = (bUpdateSamples ? HINT_SAMPLEINFO : 0) | (bUpdateInstruments ? HINT_INSTRUMENT : 0);
+ if(dwHintFlags != 0) UpdateView(nDocNdx, dwHintFlags);
}
@@ -3058,3 +3071,18 @@
CTreeCtrl::OnSetFocus(pOldWnd);
CMainFrame::GetMainFrame()->m_bModTreeHasFocus=true;
}
+
+
+bool CModTree::IsItemExpanded(HTREEITEM hItem)
+//--------------------------------------------
+{
+ // checks if a treeview item is expanded.
+ if(hItem == NULL) return false;
+ TV_ITEM tvi;
+ tvi.mask = TVIF_HANDLE | TVIF_STATE;
+ tvi.state = 0;
+ tvi.stateMask = TVIS_EXPANDED;
+ tvi.hItem = hItem;
+ GetItem(&tvi);
+ return (tvi.state & TVIS_EXPANDED) != 0 ? true : false;
+}
Modified: trunk/OpenMPT/mptrack/View_tre.h
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.h 2009-10-18 16:54:18 UTC (rev 401)
+++ trunk/OpenMPT/mptrack/View_tre.h 2009-10-20 18:24:29 UTC (rev 402)
@@ -158,6 +158,7 @@
VOID OnUpdate(CModDoc *pModDoc, DWORD dwHint, CObject *pHint);
BOOL CanDrop(HTREEITEM hItem, BOOL bDoDrop);
VOID UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify);
+ bool IsItemExpanded(HTREEITEM hItem);
// Overrides
// ClassWizard generated virtual function overrides
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|