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
(46) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <rel...@us...> - 2007-04-13 22:43:47
|
Revision: 178 http://svn.sourceforge.net/modplug/?rev=178&view=rev Author: relabsoluness Date: 2007-04-13 15:43:39 -0700 (Fri, 13 Apr 2007) Log Message: ----------- . v1.17.02.46 (Still no binaries) + <Relabs> Time calculator for pattern rows using existing modlength calculator function. . <Relabs> The songtitle limit in general tab should now work properly for every format. / <Relabs> Various minor modifications. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/pattern.h trunk/OpenMPT/mptrack/patternContainer.h trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/typedefs.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -2268,6 +2268,11 @@ commands[kcSoloChnOnPatTransition].isDummy = false; commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition"; + commands[kcTimeAtRow].UID = 1780; + commands[kcTimeAtRow].isHidden = false; + commands[kcTimeAtRow].isDummy = false; + commands[kcTimeAtRow].Message = "Show playback time at current row"; + #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 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/CommandSet.h 2007-04-13 22:43:39 UTC (rev 178) @@ -220,7 +220,8 @@ kcShowMacroConfig, kcChangeLoopStatus, kcShowEditMenu, - kcEndPatternEditMisc=kcShowEditMenu, + kcTimeAtRow, + kcEndPatternEditMisc=kcTimeAtRow, kcChannelMute, kcChannelSolo, Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -11,6 +11,7 @@ // -> CODE#0015 // -> DESC="channels management dlg" #include "Ctrl_pat.h" +#include ".\ctrl_gen.h" // -! NEW_FEATURE#0015 BEGIN_MESSAGE_MAP(CCtrlGeneral, CModControlDlg) @@ -33,6 +34,7 @@ ON_EN_CHANGE(IDC_EDIT_SAMPLEPA, OnSamplePAChanged) ON_CBN_SELCHANGE(IDC_COMBO_RESAMPLING, OnResamplingChanged) ON_MESSAGE(WM_MOD_UPDATEPOSITION, OnUpdatePosition) + ON_EN_SETFOCUS(IDC_EDIT_SONGTITLE, OnEnSetfocusEditSongtitle) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -83,7 +85,7 @@ if(m_pSndFile) m_EditTitle.SetLimitText(m_pSndFile->GetModNameLengthMax()); else - m_EditTitle.SetLimitText(31); + m_EditTitle.SetLimitText(25); // -> CODE#0016 // -> DESC="default tempo update" @@ -302,20 +304,15 @@ void CCtrlGeneral::OnTitleChanged() //--------------------------------- { - CHAR s[35]; if ((!m_pSndFile) || (!m_EditTitle.m_hWnd) || (!m_EditTitle.GetModify())) return; - memset(s, 0, sizeof(s)); - m_EditTitle.GetWindowText(s, sizeof(s)); - s[25] = 0; - if (strcmp(m_pSndFile->m_szNames[0], s)) + + CString title; + m_EditTitle.GetWindowText(title); + if(m_pSndFile->SetTitle(title, title.GetLength()) && m_pModDoc) { - memcpy(m_pSndFile->m_szNames[0], s, 26); - if (m_pModDoc) - { - m_EditTitle.SetModify(FALSE); - m_pModDoc->SetModified(); - m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); - } + m_EditTitle.SetModify(FALSE); + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); } } @@ -661,7 +658,17 @@ } +void CCtrlGeneral::OnEnSetfocusEditSongtitle() +//-------------------------------------------- +{ + if(m_pSndFile) + { + m_EditTitle.SetLimitText(m_pSndFile->GetModNameLengthMax()); + } +} + + //////////////////////////////////////////////////////////////////////////////// // // CVuMeter Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h 2007-04-13 22:43:39 UTC (rev 178) @@ -82,6 +82,7 @@ afx_msg void OnReverbChanged(); afx_msg void OnSurroundChanged(); afx_msg void OnEqualizerChanged(); + afx_msg void OnEnSetfocusEditSongtitle(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -1923,7 +1923,7 @@ //---------------------------------- { CHAR s[256]; - DWORD dwSongLength = m_SndFile.GetLength(FALSE, TRUE); + DWORD dwSongLength = m_SndFile.GetSongTime(); wsprintf(s, "Approximate song length: %dmn%02ds", dwSongLength/60, dwSongLength%60); CMainFrame::GetMainFrame()->MessageBox(s, NULL, MB_OK|MB_ICONINFORMATION); } Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -13,7 +13,7 @@ #include "CreditStatic.h" #include "hyperEdit.h" #include "bladedll.h" -#include "commctrl.h"; +#include "commctrl.h" // rewbs.memLeak #define CRTDBG_MAP_ALLOC @@ -1382,7 +1382,7 @@ m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_MPTRACK)); wsprintf(s, "Build Date: %s", buildDateTime.c_str()); SetDlgItemText(IDC_EDIT2, s); - SetDlgItemText(IDC_EDIT3, CMainFrame::GetFullVersionString()); + SetDlgItemText(IDC_EDIT3, CString("Open Modplug Tracker, version ") + CMainFrame::GetFullVersionString()); m_heContact.SetWindowText( "Contact:\r\n\ @@ -1398,7 +1398,7 @@ "|" "Development:|" "Robin Fernandes: mo...@so... (2004-2006)|" - "Relabsoluness: lk...@me... (2005-2006)|" + "rel...@us... (2005-2006)|" "Eric Chavanon: co...@er... (2004-2005)|" "Trevor Nunes: mo...@pl... (2004)|" "Olivier Lapicque: ol...@mo... (1997-2003)|" Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -104,10 +104,12 @@ ON_COMMAND(ID_CURSORPASTE, OnCursorPaste) ON_COMMAND(ID_PATTERN_AMPLIFY, OnPatternAmplify) ON_COMMAND(ID_CLEAR_SELECTION, OnClearSelectionFromMenu) + ON_COMMAND(ID_SHOWTIMEATROW, OnShowTimeAtRow) 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 + //}}AFX_MSG_MAP ON_WM_INITMENU() ON_WM_RBUTTONDBLCLK() @@ -1151,7 +1153,7 @@ BuildPluginCtxMenu(hMenu, nChn, pSndFile); } - //------ Header Menu ---------- : + //------ Channel Header Menu ---------- : else if (pt.y <= m_szHeader.cy){ if (ih->ShiftPressed()) { //Don't bring up menu if shift is pressed, else we won't get button up msg. @@ -1183,7 +1185,10 @@ AppendMenu(hMenu, MF_SEPARATOR, 0, ""); if (BuildGrowShrinkCtxMenu(hMenu, ih)) AppendMenu(hMenu, MF_SEPARATOR, 0, ""); + if(BuildMiscCtxMenu(hMenu, ih)) + AppendMenu(hMenu, MF_SEPARATOR, 0, ""); BuildRowInsDelCtxMenu(hMenu, ih); + } ClientToScreen(&pt); @@ -3154,6 +3159,7 @@ case kcChannelUnmuteAll: OnUnmuteAll(); return wParam; case kcToggleChanMuteOnPatTransition: TogglePendingMute((m_dwCursor&0xFFFF)>>3); return wParam; case kcUnmuteAllChnOnPatTransition: OnPendingUnmuteAllChnFromClick(); return wParam; + case kcTimeAtRow: OnShowTimeAtRow(); return wParam; case kcSoloChnOnPatTransition: PendingSoloChn(GetCurrentChannel()); return wParam; case kcTransposeUp: OnTransposeUp(); return wParam; case kcTransposeDown: OnTransposeDown(); return wParam; @@ -4442,6 +4448,16 @@ return true; } +bool CViewPattern::BuildMiscCtxMenu(HMENU hMenu, CInputHandler* ih) +//----------------------------------------------------------------- +{ + if (CMainFrame::m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE) return false; + + AppendMenu(hMenu, MF_STRING, ID_SHOWTIMEATROW, "Show row play time\t" + ih->GetKeyTextFromCommand(kcTimeAtRow)); + return true; + +} + bool CViewPattern::BuildSelectionCtxMenu(HMENU hMenu, CInputHandler* ih) //---------------------------------------------------------------------- { @@ -4842,4 +4858,32 @@ } +void CViewPattern::OnShowTimeAtRow() +//---------------------------------- +{ + CModDoc* pModDoc = GetDocument(); + CSoundFile* pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : 0; + if(!pSndFile) return; + CString msg; + ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); + if(pSndFile->Order[currentOrder] == m_nPattern) + { + double t = pSndFile->GetPlaybackTimeAt(currentOrder, m_nRow); + if(t < 0) + msg.Format("Unable to determine the time. Possible cause: No order %d, row %d found from play sequence", currentOrder, m_nRow); + else + { + const uint32 minutes = static_cast<uint32>(t/60); + const float seconds = t - minutes*60; + msg.Format("Estimate for playback time at order %d(pattern %d), row %d: %d minute(s) %.2f seconds", currentOrder, m_nPattern, m_nRow, minutes, seconds); + } + } + else + msg.Format("Unable to determine the time: pattern at current order(=%d) does not correspond to pattern at pattern view(=pattern %d).", currentOrder, m_nPattern); + + MessageBox(msg); +} + + + Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/View_pat.h 2007-04-13 22:43:39 UTC (rev 178) @@ -291,6 +291,7 @@ afx_msg void OnClearSelectionFromMenu(); afx_msg void OnSelectInstrument(UINT nid); afx_msg void OnRunScript(); + afx_msg void OnShowTimeAtRow(); //}}AFX_MSG DECLARE_MESSAGE_MAP() @@ -305,6 +306,7 @@ bool BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc* pModDoc); bool BuildSoloMuteCtxMenu(HMENU hMenu, CInputHandler* ih, UINT nChn, CSoundFile* pSndFile); bool BuildRowInsDelCtxMenu(HMENU hMenu, CInputHandler* ih); + bool BuildMiscCtxMenu(HMENU hMenu, CInputHandler* ih); bool BuildSelectionCtxMenu(HMENU hMenu, CInputHandler* ih); bool BuildGrowShrinkCtxMenu(HMENU hMenu, CInputHandler* ih); bool BuildNoteInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); Modified: trunk/OpenMPT/mptrack/pattern.h =================================================================== --- trunk/OpenMPT/mptrack/pattern.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/pattern.h 2007-04-13 22:43:39 UTC (rev 178) @@ -8,8 +8,6 @@ class CPatternContainer; -typedef size_t ROWINDEX; -typedef size_t CHANNELINDEX; //============ class CPattern Modified: trunk/OpenMPT/mptrack/patternContainer.h =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/patternContainer.h 2007-04-13 22:43:39 UTC (rev 178) @@ -18,7 +18,6 @@ //BEGIN: TYPEDEFS public: typedef vector<MODPATTERN> PATTERNVECTOR; - typedef UINT PATTERNINDEX; //END: TYPEDEFS Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/resource.h 2007-04-13 22:43:39 UTC (rev 178) @@ -969,6 +969,7 @@ #define ID_MOVETUNING 36025 #define ID_COPYTUNING 36026 #define ID_REMOVETUNINGCOLLECTION 36027 +#define ID_SHOWTIMEATROW 36028 #define ID_SELECTINST 36100 #define ID_NETLINK_MPTFR 37001 #define ID_PLUG_RECORDAUTOMATION 37003 Modified: trunk/OpenMPT/mptrack/typedefs.h =================================================================== --- trunk/OpenMPT/mptrack/typedefs.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/mptrack/typedefs.h 2007-04-13 22:43:39 UTC (rev 178) @@ -1,6 +1,8 @@ #ifndef TYPEDEFS_H #define TYPEDEFS_H +#include <limits> + #ifdef WIN32 typedef __int8 int8; typedef __int16 int16; @@ -13,7 +15,18 @@ typedef size_t uint64; typedef float float32; +#endif //End WIN32 specific. -#endif +typedef uint32 ROWINDEX; +typedef uint16 CHANNELINDEX; +typedef uint16 ORDERINDEX; +typedef uint16 PATTERNINDEX; +typedef uint16 TEMPO; +typedef uint16 SAMPLEINDEX; +typedef uint16 INSTRUMENTINDEX; +const ORDERINDEX ORDERINDEX_MAX = (std::numeric_limits<ORDERINDEX>::max)(); +const ROWINDEX ROWINDEX_MAX = (std::numeric_limits<ROWINDEX>::max)(); + + #endif Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -250,6 +250,7 @@ memcpy(&id,lpStream+streamPos,sizeof(DWORD)); if(id != 0x2e697470) return FALSE; // .itp + m_nType = MOD_TYPE_IT; streamPos += sizeof(DWORD); memcpy(&id,lpStream+streamPos,sizeof(DWORD)); @@ -264,9 +265,10 @@ streamPos += sizeof(DWORD); // name string - if (streamPos+len<=dwMemLength && len<=MAX_SAMPLES*32) { - memcpy(&m_szNames[0],lpStream+streamPos,len); + if (streamPos+len<=dwMemLength && len<=sizeof(m_szNames[0])) { + memcpy(m_szNames[0],lpStream+streamPos,len); streamPos += len; + m_szNames[0][sizeof(m_szNames[0])-1] = '\0'; } // Song comments @@ -654,7 +656,8 @@ } // Leave - m_nType = MOD_TYPE_IT; + //m_nType = MOD_TYPE_IT; Relabs.note: Moved to the beginning of loading(April 2007) + m_nMaxPeriod = 0xF000; m_nMinPeriod = 8; @@ -1215,6 +1218,7 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" BOOL CSoundFile::SaveITProject(LPCSTR lpszFileName) +//------------------------------------------------- { // Check song type Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -71,7 +71,14 @@ } */ -DWORD CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal) +double CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal) +//------------------------------------------- +{ + bool dummy = false; + return GetLength(dummy, bAdjust, bTotal); +} + +double CSoundFile::GetLength(bool& targetReached, BOOL bAdjust, BOOL bTotal, ORDERINDEX endOrder, ROWINDEX endRow) //---------------------------------------------------- { // -> CODE#0022 @@ -109,6 +116,12 @@ UINT nSpeedCount = 0; nRow = nNextRow; nCurrentPattern = nNextPattern; + if(nCurrentPattern == endOrder && nRow == endRow) + { + targetReached = true; + goto EndMod; + } + // Check if pattern is valid nPattern = Order[nCurrentPattern]; bool positionJumpOnThisRow=false; @@ -365,6 +378,10 @@ } } } + + return dwElapsedTime / 1000.0; + + /* // -> CODE#0022 // -> DESC="alternative BPM/Speed interpretation method" // return (UINT)((dwElapsedTime+500.0) / 1000.0); @@ -375,6 +392,7 @@ return (UINT)((dwElapsedTime + 500.0) / 1000.0); } // -! NEW_FEATURE#0022 + */ } @@ -442,6 +460,7 @@ } if (psmp->uFlags & CHN_PANNING) pChn->nPan = psmp->nPan; } + // Reset envelopes if (bResetEnv) { @@ -2611,6 +2630,7 @@ //rewbs.volOffset: moved offset code to own method as it will be used in several places now void CSoundFile::SampleOffset(UINT nChn, UINT param, bool bPorta) +//--------------------------------------------------------------- { MODCHANNEL *pChn = &Chn[nChn]; @@ -3340,3 +3360,4 @@ } + Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2007-04-13 22:43:39 UTC (rev 178) @@ -377,7 +377,12 @@ CTuningCollection CSoundFile::s_TuningsSharedLocal("Local Tunings"); -CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this), m_PlaybackEventer(*this) +CSoundFile::CSoundFile() : + m_TuningsTuneSpecific("Tune specific tunings"), + PatternSize(*this), Patterns(*this), + Order(*this), + m_PlaybackEventer(*this), + m_pModSpecs(&IT_SPECS) //---------------------- { m_nType = MOD_TYPE_NONE; @@ -690,6 +695,7 @@ if (m_nType) { + SetModSpecsPointer(); return TRUE; } @@ -1531,37 +1537,37 @@ CMainFrame::GetMainFrame()->MessageBox(str , "MoveChannel(...)", MB_OK | MB_ICONINFORMATION); return true; } - std::vector<UINT> newOrder; - //First creating new order identical to current order... - for(UINT i = 0; i<m_nChannels; i++) - { - newOrder.push_back(i); + std::vector<CHANNELINDEX> newOrder; + //First creating new order identical to current order... + for(UINT i = 0; i<m_nChannels; i++) + { + newOrder.push_back(i); + } + //...and then add the move channel effect. + if(chnFrom < chnTo) + { + CHANNELINDEX temp = newOrder[chnFrom]; + for(UINT i = chnFrom; i<chnTo; i++) + { + newOrder[i] = newOrder[i+1]; + } + newOrder[chnTo] = temp; + } + else //case chnFrom > chnTo(can't be equal, since it has been examined earlier.) + { + CHANNELINDEX temp = newOrder[chnFrom]; + for(UINT i = chnFrom; i>=chnTo+1; i--) + { + newOrder[i] = newOrder[i-1]; + } + newOrder[chnTo] = temp; } - //...and then add the move channel effect. - if(chnFrom < chnTo) - { - UINT temp = newOrder[chnFrom]; - for(UINT i = chnFrom; i<chnTo; i++) - { - newOrder[i] = newOrder[i+1]; - } - newOrder[chnTo] = temp; - } - else //case chnFrom > chnTo(can't be equal, since it has been examined earlier.) - { - UINT temp = newOrder[chnFrom]; - for(UINT i = chnFrom; i>=chnTo+1; i--) - { - newOrder[i] = newOrder[i-1]; - } - newOrder[chnTo] = temp; - } - if(newOrder.size() != ReArrangeChannels(newOrder)) - { - CMainFrame::GetMainFrame()->MessageBox("BUG: Channel number changed in MoveChannel()" , "", MB_OK | MB_ICONINFORMATION); - } - return false; + if(newOrder.size() != ReArrangeChannels(newOrder)) + { + CMainFrame::GetMainFrame()->MessageBox("BUG: Channel number changed in MoveChannel()" , "", MB_OK | MB_ICONINFORMATION); + } + return false; } @@ -2825,74 +2831,38 @@ return string(szNoteNames[abs(note-1)%12]) + Stringify((note-1)/12); } -WORD CSoundFile::GetTempoMin() const {return 32;} -WORD CSoundFile::GetTempoMax() const {return 512;} -ROWINDEX CSoundFile::GetRowMax() const -//------------------------------------ +void CSoundFile::SetModSpecsPointer() +//----------------------------------- { - switch(m_nType) + switch(GetModType()) { case MOD_TYPE_MPT: - return MPTM_SPECS.patternRowsMax; - case MOD_TYPE_MOD: - return MOD_SPECS.patternRowsMax; - case MOD_TYPE_XM: - return XM_SPECS.patternRowsMax; + m_pModSpecs = &MPTM_SPECS; + break; case MOD_TYPE_IT: - return IT_SPECS.patternRowsMax; - case MOD_TYPE_S3M: - return S3M_SPECS.patternRowsMax; - default: - return MAX_PATTERN_ROWS; - } -} - -ROWINDEX CSoundFile::GetRowMin() const -//------------------------------------ -{ - switch(m_nType) - { - case MOD_TYPE_MPT: - return MPTM_SPECS.patternRowsMin; - case MOD_TYPE_MOD: - return MOD_SPECS.patternRowsMin; + m_pModSpecs = &IT_SPECS; + break; case MOD_TYPE_XM: - return XM_SPECS.patternRowsMin; - case MOD_TYPE_IT: - return IT_SPECS.patternRowsMin; + m_pModSpecs = &XM_SPECS; + break; case MOD_TYPE_S3M: - return S3M_SPECS.patternRowsMin; + m_pModSpecs = &S3M_SPECS; + break; + case MOD_TYPE_MOD: default: - return 2; + m_pModSpecs = &MOD_SPECS; + break; } } - -CHANNELINDEX CSoundFile::GetNumChannelMax() const -//----------------------------------- -{ - if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMax; - if(m_nType == MOD_TYPE_IT) return max_chans_IT; - if(m_nType == MOD_TYPE_XM) return max_chans_XM; - if(m_nType == MOD_TYPE_MOD) return max_chans_MOD; - if(m_nType == MOD_TYPE_S3M) return max_chans_S3M; - return 4; -} - -CHANNELINDEX CSoundFile::GetNumChannelMin() const -//----------------------------------- -{ - if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMin; - else return 4; -} - void CSoundFile::ChangeModTypeTo(const int& newType) //--------------------------------------------------- { const UINT oldInvalidIndex = Patterns.GetInvalidIndex(); const UINT oldIgnoreIndex = Patterns.GetIgnoreIndex(); m_nType = newType; + SetModSpecsPointer(); m_ModFlags.reset(); @@ -2900,6 +2870,27 @@ replace(Order.begin(), Order.end(), oldIgnoreIndex, Patterns.GetIgnoreIndex()); } +bool CSoundFile::SetTitle(const char* titleCandidate, size_t strSize) +//------------------------------------------------------------------- +{ + if(strcmp(m_szNames[0], titleCandidate)) + { + memset(m_szNames[0], 0, sizeof(m_szNames[0])); + memcpy(m_szNames[0], titleCandidate, min(sizeof(m_szNames[0])-1, strSize)); + return true; + } + return false; +} + +double CSoundFile::GetPlaybackTimeAt(ORDERINDEX ord, ROWINDEX row) +//---------------------------------------------------------------- +{ + bool targetReached = false; + const double t = GetLength(targetReached, FALSE, TRUE, ord, row); + if(targetReached) return t; + else return -1; //Given position not found from play sequence. +} + #ifndef TRADITIONAL_MODCOMMAND void CSoundFile::OnSetEffect(MODCOMMAND& mc, EFFECT_ID eID) //--------------------------------------------------------- Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/soundlib/Sndfile.h 2007-04-13 22:43:39 UTC (rev 178) @@ -767,8 +767,6 @@ #include "../mptrack/patternContainer.h" #include "../mptrack/ordertopatterntable.h" -typedef CPatternContainer::PATTERNINDEX PATTERNINDEX; - #include "../mptrack/playbackEventer.h" @@ -789,31 +787,35 @@ const BYTE IT_STANDARD = 0; + //============== class CSoundFile //============== { public: //Typedefs - typedef CPatternContainer::PATTERNINDEX PATTERNINDEX; typedef UINT MODTYPE; public: //Get details(TODO?: Move detail asking to a 'controller') - WORD GetTempoMin() const; - WORD GetTempoMax() const; + TEMPO GetTempoMin() const {return m_pModSpecs->tempoMin;} + TEMPO GetTempoMax() const {return m_pModSpecs->tempoMax;} - ROWINDEX GetRowMax() const; - ROWINDEX GetRowMin() const; + //Using special hack for OMPTs modifed ITs and XMs. + ROWINDEX GetRowMax() const {return (GetType() == MOD_TYPE_IT || GetType() == MOD_TYPE_XM) ? 1024 : min(MAX_PATTERN_ROWS, m_pModSpecs->patternRowsMax);} - CHANNELINDEX GetNumChannelMax() const; - CHANNELINDEX GetNumChannelMin() const; + ROWINDEX GetRowMin() const {return m_pModSpecs->patternRowsMin;} + CHANNELINDEX GetNumChannelMax() const {return min(MAX_BASECHANNELS, m_pModSpecs->channelsMax);} + CHANNELINDEX GetNumChannelMin() const {return m_pModSpecs->channelsMin;} + uint16 GetModNameLengthMax() {return (GetModType() == MOD_TYPE_MPT) ? 25 : m_pModSpecs->modNameLengthMax;} - size_t GetModNameLengthMax() {return 25;} + //Return true if title was changed. + bool SetTitle(const char*, size_t strSize); public: //Misc void ChangeModTypeTo(const int& newType); - // - + MODTYPE GetModType() const {return m_nType;} - // + + //Return value in seconds. + double GetPlaybackTimeAt(ORDERINDEX, ROWINDEX); #ifndef TRADITIONAL_MODCOMMAND void OnSetEffect(MODCOMMAND& mc, EFFECT_ID); @@ -853,11 +855,15 @@ void PortamentoMPT(MODCHANNEL*, int); void PortamentoFineMPT(MODCHANNEL*, int); +private: //Misc private methods. + void SetModSpecsPointer(); + private: //'Controllers' CPlaybackEventer m_PlaybackEventer; private: //Misc data bitset<8> m_ModFlags; + const CModSpecifications* m_pModSpecs; @@ -910,7 +916,7 @@ MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; // Channels settings CPatternContainer Patterns; //Patterns CPatternSizesMimic PatternSize; // Mimics old PatternsSize-array(is read-only). - COrderToPatternTable Order; //Order[x] gives the pattern index at order x. + COrderToPatternTable Order; // Order[x] gives the index of the pattern located at order x. MODINSTRUMENT Ins[MAX_SAMPLES]; // Instruments INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; // Instrument Headers INSTRUMENTHEADER m_defaultInstrument; // Currently only used to get default values for extented properties. @@ -974,8 +980,18 @@ CString GetPatternViewInstrumentName(UINT nInstr, bool returnEmptyInsteadOfNoName = false) const; UINT GetMusicSpeed() const { return m_nMusicSpeed; } UINT GetMusicTempo() const { return m_nMusicTempo; } - DWORD GetLength(BOOL bAdjust, BOOL bTotal=FALSE); - DWORD GetSongTime() { return GetLength(FALSE, TRUE); } + + //Get modlength in various cases: total length, length to + //specific order&row etc. Return value is in seconds. + //NOTE: Also seems to be used for some 'simulate playback'-purposes (Relabs, April 2007) + double GetLength(BOOL bAdjust, BOOL bTotal=FALSE); +private: + double GetLength(bool& targetReached, BOOL bAdjust, BOOL bTotal=FALSE, ORDERINDEX ord = ORDERINDEX_MAX, ROWINDEX row = ROWINDEX_MAX); + +public: + //Returns song length in seconds. + DWORD GetSongTime() { return static_cast<DWORD>((m_nTempoMode == tempo_mode_alternative) ? GetLength(FALSE, TRUE)+1.0 : GetLength(FALSE, TRUE)+0.5); } + void SetRepeatCount(int n) { m_nRepeatCount = n; } int GetRepeatCount() const { return m_nRepeatCount; } BOOL IsPaused() const { return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE; } @@ -992,7 +1008,6 @@ //channel settings. Flag can be used to tell whether to completely //reset channels, not only a few settings(for maintaining old behavior). void ResetChannelSettings(CHANNELINDEX chn, BYTE resetStyle); - //For all channels. void ResetChannelSettings(BYTE resetStyle); Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2007-04-01 00:28:16 UTC (rev 177) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2007-04-13 22:43:39 UTC (rev 178) @@ -7,20 +7,20 @@ { //NOTE: If changing order, update all initializations below. char fileExtension[10]; - UINT patternsMax; - UINT ordersMax; - UINT channelsMin; - UINT channelsMax; + PATTERNINDEX patternsMax; + ORDERINDEX ordersMax; + CHANNELINDEX channelsMin; + CHANNELINDEX channelsMax; //NOTE: The two above refer to the user editable pattern channels, //not to the internal sound channels. Maybe there should be a separate //setting for those(comment by: Relabs, January 2007). - UINT tempoMin; - UINT tempoMax; - UINT patternRowsMin; - UINT patternRowsMax; - UINT modNameLengthMax; //Meaning 'usable letters', possible null character is not included. - UINT samplesMax; - UINT instrumentsMax; + TEMPO tempoMin; + TEMPO tempoMax; + ROWINDEX patternRowsMin; + ROWINDEX patternRowsMax; + uint16 modNameLengthMax; //Meaning 'usable letters', possible null character is not included. + SAMPLEINDEX samplesMax; + INSTRUMENTINDEX instrumentsMax; }; enum { @@ -48,7 +48,7 @@ 256, //Channel max 32, //Min tempo 512, //Max tempo - 2, //Min pattern rows + 1, //Min pattern rows 1024, //Max pattern rows 256, //Max mod name length 4000, //SamplesMax @@ -70,7 +70,7 @@ 256, //Max tempo 64, //Min pattern rows 64, //Max pattern rows - 25, //Max mod name length + 20, //Max mod name length 31, //SamplesMax 0, //instrumentMax }; @@ -87,10 +87,10 @@ 32, //Min tempo 256, //Max tempo 4, //Min pattern rows - 256, //Max pattern rows - 25, //Max mod name length + 256, //Max pattern rows + 20, //Max mod name length 31, //SamplesMax - 256, //instrumentMax + 256, //instrumentMax }; @@ -106,7 +106,7 @@ 256, //Max tempo 64, //Min pattern rows 64, //Max pattern rows - 25, //Max mod name length + 27, //Max mod name length 31, //SamplesMax 0, //instrumentMax }; @@ -125,7 +125,7 @@ 256, //Max pattern rows 25, //Max mod name length(in ittech.txt: "0000: \xB3'I'\xB3'M'\xB3'P'\xB3'M'\xB3 Song Name, max 26 characters, includes NULL \xB3") 256, //SamplesMax - 256, //instrumentMax + 256, //instrumentMax }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2007-04-01 00:28:21
|
Revision: 177 http://svn.sourceforge.net/modplug/?rev=177&view=rev Author: relabsoluness Date: 2007-03-31 17:28:16 -0700 (Sat, 31 Mar 2007) Log Message: ----------- . v1.17.02.46 (Still in progress, no binaries) <Relabs> . No longer possible to enter a tunename which is longer than the maximum length that can be stored to an IT-file(yet to be fixed for other formats). <Relabs> . When opening instruments, load dialog didn't remember its previous path. <Relabs> / Changed the way channels are reset when jumping between patterns in orderlist. <Relabs> / Added version number to the mainframe title. <Relabs> ./ Changed the way panning is treated(sndmix.cpp, lines around 1620) since I think for example that the behavior of panbrello had changed for RC2 plugin levels in rev. 174. Please correct if it's wrong now. <Relabs> / Serialization related tweaking(tuning related). MPTm/tuning files created with this version (likely) won't open in the tuning-branch('RC3') version. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Node.h trunk/OpenMPT/mptrack/Stdafx.h trunk/OpenMPT/mptrack/TuningDialog.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/misc_util.cpp trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/serialization_utils.cpp trunk/OpenMPT/mptrack/serialization_utils.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/tuning.cpp trunk/OpenMPT/soundlib/tuningCollection.cpp trunk/OpenMPT/soundlib/tuning_template.h trunk/OpenMPT/soundlib/tuningcollection.h Added Paths: ----------- trunk/OpenMPT/mptrack/typedefs.h Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -80,7 +80,11 @@ { CModControlDlg::OnInitDialog(); // Song Title - m_EditTitle.SetLimitText(31); + if(m_pSndFile) + m_EditTitle.SetLimitText(m_pSndFile->GetModNameLengthMax()); + else + m_EditTitle.SetLimitText(31); + // -> CODE#0016 // -> DESC="default tempo update" // m_SpinTempo.SetRange(32, 255); // 255 bpm max @@ -98,7 +102,6 @@ m_SliderSamplePreAmp.SetRange(0, MAX_SLIDER_SAMPLE_VOL); - // -! BEHAVIOUR_CHANGE#0016 m_ComboResampling.AddString("None"); m_ComboResampling.AddString("Linear"); @@ -299,14 +302,14 @@ void CCtrlGeneral::OnTitleChanged() //--------------------------------- { - CHAR s[80]; + CHAR s[35]; if ((!m_pSndFile) || (!m_EditTitle.m_hWnd) || (!m_EditTitle.GetModify())) return; memset(s, 0, sizeof(s)); m_EditTitle.GetWindowText(s, sizeof(s)); - s[31] = 0; + s[25] = 0; if (strcmp(m_pSndFile->m_szNames[0], s)) { - memcpy(m_pSndFile->m_szNames[0], s, 32); + memcpy(m_pSndFile->m_szNames[0], s, 26); if (m_pModDoc) { m_EditTitle.SetModify(FALSE); @@ -723,5 +726,3 @@ SelectObject(hdc, oldpen); m_nDisplayedVu = m_nVuMeter; } - - Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -1262,9 +1262,10 @@ if (penv) { CHAR szPath[_MAX_PATH], szNewPath[_MAX_PATH]; - _splitpath(lpszFileName, szPath, szNewPath, szName, szExt); + _splitpath(lpszFileName, szNewPath, szPath, szName, szExt); strcat(szNewPath, szPath); strcpy(CMainFrame::m_szCurInsDir, szNewPath); + if (!penv->name[0]) { szName[31] = 0; Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -207,6 +207,7 @@ pSndFile->m_nCurrentPattern = pSndFile->m_nNextPattern = m_nScrollPos; pMainFrm->ResetNotificationBuffer(); //rewbs.toCheck pSndFile->m_nNextRow = 0; + pSndFile->ResetChannelSettings(CHNRESET_BASIC); END_CRITICAL(); } else if (m_pParent->GetFollowSong()) @@ -216,6 +217,8 @@ pSndFile->m_nCurrentPattern = m_nScrollPos; pSndFile->SetCurrentOrder(m_nScrollPos); pSndFile->m_dwSongFlags |= dwPaused; + pSndFile->ResetChannelSettings(CHNRESET_BASIC); + //if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); //Relabs.note: Commented above line for it seems to cause //significant slowdown when changing patterns without Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -113,8 +113,8 @@ END_MESSAGE_MAP() // Static -static gdwLastLowLatencyTime = 0; -static gdwLastMixActiveTime = 0; +static int gdwLastLowLatencyTime = 0; +static int gdwLastMixActiveTime = 0; static DWORD gsdwTotalSamples = 0; static DWORD gdwPlayLatency = 0; @@ -443,6 +443,7 @@ } void CMainFrame::LoadRegistrySettings() +//------------------------------------- { HKEY key; @@ -600,6 +601,16 @@ { CHAR s[256]; + //Adding version number to the frame title + CString title = GetTitle(); + #ifdef DEBUG + title += CString(" DEBUG"); + #endif + title += CString(" ") + GetFullVersionString(); + SetTitle(title); + OnUpdateFrameTitle(false); + + // Load Chords theApp.LoadChords(Chords); // Check for valid sound device Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -1042,6 +1042,7 @@ } BOOL CModDoc::NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix) +//-------------------------------------------------------------- { if (nChn >= m_SndFile.m_nChannels) return FALSE; if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); @@ -2791,6 +2792,7 @@ void CModDoc::OnPatternRestart() +//------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CChildFrame *pChildFrm = (CChildFrame *) GetChildFrame(); @@ -2811,6 +2813,12 @@ CModDoc *pModPlaying = pMainFrm->GetModPlaying(); BEGIN_CRITICAL(); + + m_SndFile.SetCurrentPos(0); + //Relabs.note: Dirty hack to try to make replay pattern to be + //more like 'play song from start' - a little clean up for + //these playback calls would be nice (March 2007). + // Cut instruments/samples for (UINT i=0; i<MAX_CHANNELS; i++) { @@ -2842,6 +2850,7 @@ } void CModDoc::OnPatternPlay() +//--------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CChildFrame *pChildFrm = (CChildFrame *) GetChildFrame(); @@ -2890,6 +2899,7 @@ } void CModDoc::OnPatternPlayNoLoop() +//--------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CChildFrame *pChildFrm = (CChildFrame *) GetChildFrame(); @@ -3115,4 +3125,4 @@ if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame()); SetModified(); } -} \ No newline at end of file +} Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -520,10 +520,8 @@ { if ((m[i].note) || (m[i].instr) || (m[i].volcmd) || (m[i].command)) goto NotEmpty; } - BEGIN_CRITICAL(); m_SndFile.Patterns.Remove(ipat); nPatRemoved++; - END_CRITICAL(); NotEmpty: ; } @@ -2054,3 +2052,4 @@ return nPattern; } + Modified: trunk/OpenMPT/mptrack/Node.h =================================================================== --- trunk/OpenMPT/mptrack/Node.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Node.h 2007-04-01 00:28:16 UTC (rev 177) @@ -20,7 +20,7 @@ virtual CString GetLabel() = 0; virtual HPEN GetBorderPen() = 0; - ConnectInput(int input, CNode sourceNode, int sourceNodeOutput); + int ConnectInput(int input, CNode sourceNode, int sourceNodeOutput); protected: int x,y; Modified: trunk/OpenMPT/mptrack/Stdafx.h =================================================================== --- trunk/OpenMPT/mptrack/Stdafx.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/Stdafx.h 2007-04-01 00:28:16 UTC (rev 177) @@ -69,6 +69,8 @@ void Log(LPCSTR format,...); +#include "typedefs.h" + //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. Modified: trunk/OpenMPT/mptrack/TuningDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/TuningDialog.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/TuningDialog.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -1249,6 +1249,7 @@ } else { + MessageBox("Saving succesful."); m_ModifiedTCs[m_pActiveTuningCollection] = false; } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -3472,6 +3472,8 @@ } } + +#ifdef TRADITIONAL_MODCOMMAND void CViewPattern::TempEnterFX(int c) //----------------------------------- { @@ -3522,7 +3524,53 @@ } } // end if mainframe & moddoc exist } +#else +void CViewPattern::TempEnterFX(int e /*EFFECT_ID eID*/) +//----------------------------------- +{ + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + CModDoc *pModDoc = GetDocument(); + CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : NULL; + if(!pSndFile || !pMainFrm) + return; + + EFFECT_ID eID = e; + + const ROWINDEX r = m_nRow; + const CHANNELINDEX c = GetChanFromCursor(m_dwCursor); + const MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(r, c); + MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite + + PrepareUndo(m_dwBeginSel, m_dwEndSel); + + //Checking whether to use the param of previous effect. + if (eID) + { + if ((eID == m_cmdOld.GetEffect()) && (!p->GetEffectParam()) && (!p->GetEffect())) + pSndFile->Patterns[m_nPattern].SetModCommandEffectParam(r, c, m_cmdOld.GetEffectParam()); + else + m_cmdOld.SetEffectParam(0); + + m_cmdOld.SetEffectByID(eID); + } + pSndFile->Patterns[m_nPattern].SetModCommandEffect(r, c, eID); + + if (IsEditingEnabled_bmsg()) + { + DWORD sel = (m_nRow << 16) | m_dwCursor; + SetCurSel(sel, sel); + sel &= ~7; + if(oldcmd != *p) + { + pModDoc->SetModified(); + InvalidateArea(sel, sel+5); + UpdateIndicator(); + } + } +} +#endif + void CViewPattern::TempEnterFXparam(int v) //---------------------------------------- { @@ -4793,3 +4841,5 @@ return false; } + + Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -785,8 +785,8 @@ CComboBox *combo; CDialog::OnInitDialog(); combo = (CComboBox *)GetDlgItem(IDC_COMBO1); - CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((m_pModDoc) && (m_nPattern < pSndFile->Patterns.Size()) && (combo)) + CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : NULL; + if ((pSndFile) && (m_nPattern < pSndFile->Patterns.Size()) && (combo)) { CHAR s[256]; UINT nrows = pSndFile->PatternSize[m_nPattern]; @@ -794,17 +794,14 @@ // -> CODE#0008 // -> DESC="#define to set pattern size" // for (UINT irow=32; irow<=256; irow++) - for (UINT irow=32; irow<=MAX_PATTERN_ROWS; irow++) +// for (UINT irow=32; irow<=MAX_PATTERN_ROWS; irow++) + for (UINT irow=pSndFile->GetRowMin(); irow<=pSndFile->GetRowMax(); irow++) // -! BEHAVIOUR_CHANGE#0008 { wsprintf(s, "%d", irow); combo->AddString(s); } - if (nrows < 32) - { - wsprintf(s, "%d", nrows); - combo->SetWindowText(s); - } else combo->SetCurSel(nrows-32); + combo->SetCurSel(nrows-pSndFile->GetRowMin()); wsprintf(s, "Pattern #%d:\x0d\x0a %d rows (%dK)", m_nPattern, pSndFile->PatternSize[m_nPattern], @@ -1272,36 +1269,75 @@ BEGIN_MESSAGE_MAP(CPageEditEffect, CPageEditCommand) ON_WM_HSCROLL() ON_CBN_SELCHANGE(IDC_COMBO1, OnCommandChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, OnCommand2Changed) END_MESSAGE_MAP() void CPageEditEffect::UpdateDialog() //---------------------------------- { - CHAR s[128]; - CComboBox *combo; - CSoundFile *pSndFile; - - if ((!m_pModDoc) || (!m_bInitialized)) return; - pSndFile = m_pModDoc->GetSoundFile(); - if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) - { - UINT numfx = m_pModDoc->GetNumEffects(); - UINT fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); - combo->ResetContent(); - combo->SetItemData(combo->AddString(" None"), (DWORD)-1); - if (!m_nCommand) combo->SetCurSel(0); - for (UINT i=0; i<numfx; i++) + #ifdef TRADITIONAL_MODCOMMAND + CHAR s[128]; + CComboBox *combo; + CSoundFile *pSndFile; + + if ((!m_pModDoc) || (!m_bInitialized)) return; + pSndFile = m_pModDoc->GetSoundFile(); + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) { - if (m_pModDoc->GetEffectInfo(i, s, TRUE)) + UINT numfx = m_pModDoc->GetNumEffects(); + UINT fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); + combo->ResetContent(); + combo->SetItemData(combo->AddString(" None"), (DWORD)-1); + if (!m_nCommand) combo->SetCurSel(0); + for (UINT i=0; i<numfx; i++) { - int k = combo->AddString(s); - combo->SetItemData(k, i); - if (i == fxndx) combo->SetCurSel(k); + if (m_pModDoc->GetEffectInfo(i, s, TRUE)) + { + int k = combo->AddString(s); + combo->SetItemData(k, i); + if (i == fxndx) combo->SetCurSel(k); + } } } - } - UpdateRange(FALSE); + UpdateRange(FALSE); + #else //Modcommand testing + CHAR s[128]; + CComboBox *combo = (CComboBox *)GetDlgItem(IDC_COMBO1); + CComboBox *combo2 = (CComboBox *)GetDlgItem(IDC_COMBO2); + CSoundFile *pSndFile; + + if ((!m_pModDoc) || (!m_bInitialized)) return; + pSndFile = m_pModDoc->GetSoundFile(); + if (combo && combo2) + { + combo->ResetContent(); + combo2->ResetContent(); + combo->SetItemData(combo->AddString(" None"), (DWORD)-1); + combo2->SetItemData(combo2->AddString(" None"), (DWORD)-1); + + UINT numfx = m_pModDoc->GetNumEffects(); + const UINT fxndx1 = m_pModDoc->GetIndexFromEffect(m_pModcommand->GetEffect(0), m_pModcommand->GetEffectParam(0)); + const UINT fxndx2 = m_pModDoc->GetIndexFromEffect(m_pModcommand->GetEffect(1), m_pModcommand->GetEffectParam(1)); + + if(!m_pModcommand->GetEffect(0)) combo->SetCurSel(0); + if(!m_pModcommand->GetEffect(1)) combo2->SetCurSel(0); + + for (UINT i=0; i<numfx; i++) + { + if (m_pModDoc->GetEffectInfo(i, s, TRUE)) + { + int k = combo->AddString(s); + combo->SetItemData(k, i); + int k2 = combo2->AddString(s); + combo2->SetItemData(k2, i); + if (i == fxndx1) combo->SetCurSel(k); + if (i == fxndx2) combo2->SetCurSel(k2); + } + } + } + UpdateRange(FALSE); + #endif } Modified: trunk/OpenMPT/mptrack/misc_util.cpp =================================================================== --- trunk/OpenMPT/mptrack/misc_util.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/misc_util.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -1,44 +1,2 @@ #include "stdafx.h" #include "misc_util.h" - - -bool StringToBinaryStream(ostream& outStream, const string& str) -//---------------------------------------------------- -{ - if(!outStream.good()) return true; - size_t size = str.size(); - outStream.write(reinterpret_cast<char*>(&size), sizeof(size)); - outStream << str; - if(outStream.good()) - return false; - else - return true; - -} - -bool StringFromBinaryStream(istream& inStrm, string& str, const size_t maxSize) -//--------------------------------------------------------- -{ - if(!inStrm.good()) return true; - size_t strSize; - inStrm.read(reinterpret_cast<char*>(&strSize), sizeof(strSize)); - - if(strSize > maxSize) - return true; - - str.resize(strSize); - - //Inefficiently reading to temporary buffer first and - //then setting that to the string. - char* buffer = new char[strSize+1]; - inStrm.read(buffer, strSize); - buffer[strSize] = '\0'; - str = buffer; - delete[] buffer; buffer = 0; - - - if(inStrm.good()) - return false; - else - return true; -} Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/misc_util.h 2007-04-01 00:28:16 UTC (rev 177) @@ -4,21 +4,20 @@ #include <vector> #include <sstream> #include <string> +#include <limits> using namespace std; -const UINT STRINGMAXSIZE = 1000; -const UINT VECTORMAXSIZE = 1000; -//Default sizelimits to string/vector load methods. -//Size limits are there to prevent corrupted streams from -//causing e.g. program to try to load of vector of size 2 000 000 000. +#include "typedefs.h" -template<class T> +template<class T, class SIZETYPE> bool VectorToBinaryStream(ostream& outStrm, const vector<T>& v) //------------------------------------------------------------ { if(!outStrm.good()) return true; - size_t s = v.size(); + if((std::numeric_limits<SIZETYPE>::max)() < v.size()) return true; + + SIZETYPE s = static_cast<SIZETYPE>(v.size()); outStrm.write(reinterpret_cast<const char*>(&s), sizeof(s)); vector<T>::const_iterator iter = v.begin(); for(iter; iter != v.end(); iter++) @@ -30,19 +29,20 @@ return true; } -template<class T> -bool VectorFromBinaryStream(istream& inStrm, vector<T>& v, const size_t maxSize = VECTORMAXSIZE) + +template<class T, class SIZETYPE> +bool VectorFromBinaryStream(istream& inStrm, vector<T>& v, const SIZETYPE maxSize = (std::numeric_limits<SIZETYPE>::max)()) //--------------------------------------------------------- { if(!inStrm.good()) return true; - size_t size; + + SIZETYPE size; inStrm.read(reinterpret_cast<char*>(&size), sizeof(size)); if(size > maxSize) return true; v.resize(size); - ASSERT(v.size() == size); for(size_t i = 0; i<size; i++) { inStrm.read(reinterpret_cast<char*>(&v[i]), sizeof(T)); @@ -53,10 +53,49 @@ return true; } -bool StringToBinaryStream(ostream& outStream, const string& str); -bool StringFromBinaryStream(istream& inStrm, string& str, const size_t maxSize = STRINGMAXSIZE); +template<class SIZETYPE> +bool StringToBinaryStream(ostream& outStream, const string& str) +//-------------------------------------------------------------- +{ + if(!outStream.good()) return true; + if((std::numeric_limits<SIZETYPE>::max)() < str.size()) return true; + SIZETYPE size = static_cast<SIZETYPE>(str.size()); + outStream.write(reinterpret_cast<char*>(&size), sizeof(size)); + outStream << str; + if(outStream.good()) + return false; + else + return true; +} + + +template<class SIZETYPE> +bool StringFromBinaryStream(istream& inStrm, string& str, const SIZETYPE maxSize = (std::numeric_limits<SIZETYPE>::max)()) +//-------------------------------------------------------------------------------------------- +{ + if(!inStrm.good()) return true; + + SIZETYPE strSize; + inStrm.read(reinterpret_cast<char*>(&strSize), sizeof(strSize)); + + if(strSize > maxSize) + return true; + + str.resize(strSize); + + //Copying string from stream one character at a time. + for(SIZETYPE i = 0; i<strSize; i++) + inStrm.read(&str[i], 1); + + if(inStrm.good()) + return false; + else + return true; +} + + template<class T> inline string Stringify(const T& x) //-------------------------- Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/mptrack.rc 2007-04-01 00:28:16 UTC (rev 177) @@ -1269,6 +1269,12 @@ CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,104,15,114,12 LTEXT "Effect Type:",IDC_STATIC,0,4,55,8 + LTEXT "Value:",IDC_TEXT2,183,1,35,8,NOT WS_VISIBLE + COMBOBOX IDC_COMBO2,78,0,16,83,CBS_DROPDOWNLIST | CBS_SORT | NOT + WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH | + TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,134,0,43,12 + LTEXT "Effect Type:",IDC_STATIC,54,1,19,8,NOT WS_VISIBLE END IDD_SAMPLE_AMPLIFY DIALOGEX 0, 0, 175, 66 Modified: trunk/OpenMPT/mptrack/serialization_utils.cpp =================================================================== --- trunk/OpenMPT/mptrack/serialization_utils.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/serialization_utils.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -1,37 +1,7 @@ #include "stdafx.h" #include "serialization_utils.h" -#include "misc_util.h" -bool ReadTuningMap(istream& fin, map<WORD, string>& shortToTNameMap, const size_t maxNum) -//---------------------------------------- -{ - typedef map<WORD, string> MAP; - typedef MAP::iterator MAP_ITER; - size_t numTuning = 0; - fin.read(reinterpret_cast<char*>(&numTuning), sizeof(numTuning)); - if(numTuning > maxNum) - { - fin.setstate(ios::failbit); - return true; - } - for(size_t i = 0; i<numTuning; i++) - { - string temp; - unsigned short ui; - if(StringFromBinaryStream(fin, temp)) - { - fin.setstate(ios::failbit); - return true; - } - fin.read(reinterpret_cast<char*>(&ui), sizeof(ui)); - shortToTNameMap[ui] = temp; - } - if(fin.good()) - return false; - else - return true; -} Modified: trunk/OpenMPT/mptrack/serialization_utils.h =================================================================== --- trunk/OpenMPT/mptrack/serialization_utils.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/mptrack/serialization_utils.h 2007-04-01 00:28:16 UTC (rev 177) @@ -5,13 +5,49 @@ #include <string> #include <map> #include <fstream> +#include "misc_util.h" + + using namespace std; const size_t MAX_TUNING_NUM_DEFAULT = 1000; -bool ReadTuningMap(istream&, map<WORD, string>&, const size_t maxNum = MAX_TUNING_NUM_DEFAULT); +template<class TUNNUMTYPE, class STRSIZETYPE> +bool ReadTuningMap(istream& fin, map<WORD, string>& shortToTNameMap, const size_t maxNum = MAX_TUNING_NUM_DEFAULT) +//---------------------------------------------------------------------------------------- +{ + //In first versions: SIZETYPE1 == SIZETYPE2 == size_t == uint64. + typedef map<WORD, string> MAP; + typedef MAP::iterator MAP_ITER; + TUNNUMTYPE numTuning = 0; + fin.read(reinterpret_cast<char*>(&numTuning), sizeof(numTuning)); + if(numTuning > maxNum) + { + fin.setstate(ios::failbit); + return true; + } + for(size_t i = 0; i<numTuning; i++) + { + string temp; + uint16 ui; + if(StringFromBinaryStream<STRSIZETYPE>(fin, temp)) + { + fin.setstate(ios::failbit); + return true; + } + + fin.read(reinterpret_cast<char*>(&ui), sizeof(ui)); + shortToTNameMap[ui] = temp; + } + if(fin.good()) + return false; + else + return true; +} + + enum //Serialization Message { SM_UNKNOWN = 0, @@ -19,7 +55,7 @@ }; //============================================== -class CCharStreamBufFrom : public std::streambuf +class CCharBufferStreamIn : public std::streambuf //============================================== { private: @@ -29,7 +65,7 @@ return rv; } public: - CCharStreamBufFrom() {} + CCharBufferStreamIn() {} protected: streambuf* setbuf(char_type* buffer, std::streamsize count) Added: trunk/OpenMPT/mptrack/typedefs.h =================================================================== --- trunk/OpenMPT/mptrack/typedefs.h (rev 0) +++ trunk/OpenMPT/mptrack/typedefs.h 2007-04-01 00:28:16 UTC (rev 177) @@ -0,0 +1,19 @@ +#ifndef TYPEDEFS_H +#define TYPEDEFS_H + +#ifdef WIN32 + typedef __int8 int8; + typedef __int16 int16; + typedef __int32 int32; + typedef __int64 int64; + + typedef unsigned __int8 uint8; + typedef unsigned __int16 uint16; + typedef unsigned __int32 uint32; + typedef size_t uint64; + + typedef float float32; + +#endif + +#endif Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -3252,12 +3252,13 @@ while ((header.patnum > 0) && (!Patterns[header.patnum-1])) header.patnum--; //VERSION - //header.cwtv = 0x888; // We don't use these version info fields any more. - header.cwtv = 0x88B; // But now they are in use again :) + header.cwtv = 0x88C; // Used in OMPT-hack versioning. header.cmwt = 0x888; // Might come up as "Impulse Tracker 8" file in XMPlay. :) /* Version history: + 0x88B -> 0x88C: Changed type in which tuning number is printed + to file: size_t -> uint16. 0x88A -> 0x88B: Changed order-to-pattern-index table type from BYTE-array to vector<UINT>. */ @@ -3836,7 +3837,7 @@ //...and write the map with tuning names replacing //the addresses. - const size_t tuningMapSize = tNameToShort_Map.size(); + const uint16 tuningMapSize = tNameToShort_Map.size(); fout.write(reinterpret_cast<const char*>(&tuningMapSize), sizeof(tuningMapSize)); if(tuningMapSize == 0) { @@ -3847,9 +3848,9 @@ for(TNTS_MAP_ITER iter = tNameToShort_Map.begin(); iter != tNameToShort_Map.end(); iter++) { if(iter->first) - StringToBinaryStream(fout, iter->first->GetName()); + StringToBinaryStream<uint8>(fout, iter->first->GetName()); else //Case: Using original IT tuning. - StringToBinaryStream(fout, "->MPT_ORIGINAL_IT<-"); + StringToBinaryStream<uint8>(fout, "->MPT_ORIGINAL_IT<-"); fout.write(reinterpret_cast<const char*>(&(iter->second)), sizeof(iter->second)); } @@ -4469,7 +4470,9 @@ //START - mpt specific: //Using member cwtv on pifh as the version number. - if(pifh->cwtv > 0x889) + const uint16 version = pifh->cwtv; + try{ + if(version > 0x889) { const char* const cpcMPTStart = reinterpret_cast<const char*>(lpStream + mptStartPos); @@ -4483,21 +4486,23 @@ //std::streambuf which can be used in the istream //methods. So this was new to me, and checking this //might be a good idea. - CCharStreamBufFrom cbs; + CCharBufferStreamIn cbs; cbs.pubsetbuf((char*)cpcMPTStart, dwMemLength-mptStartPos); istream fin(&cbs); if(m_TuningsTuneSpecific.UnSerializeBinary(fin)) { - ::MessageBox(NULL, "Error occured - loading failed while trying to load tune specific tunings.", 0, MB_OK); - return FALSE; + throw(exception("Error occured - loading failed while trying to load tune specific tunings.")); } //2. Reading tuning id <-> tuning name map. typedef map<WORD, string> MAP; typedef MAP::iterator MAP_ITER; MAP shortToTNameMap; - ReadTuningMap(fin, shortToTNameMap); + if(version < 0x88C) + ReadTuningMap<uint64, uint64>(fin, shortToTNameMap); + else + ReadTuningMap<uint16, uint8>(fin, shortToTNameMap); //Read & set tunings for instruments list<string> notFoundTunings; @@ -4556,6 +4561,12 @@ //End read&set instrument tunings } //version condition(MPT) + } //try block ends + catch(exception& e) + { + ::MessageBox(0, e.what(), "", MB_ICONERROR); + return TRUE; //Return value to be revised. + } Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -143,13 +143,13 @@ case CMD_GLOBALVOLSLIDE: command = 'W'; break; case CMD_PANNING8: command = 'X'; - if ((bIT) && (m_nType != MOD_TYPE_IT) && (m_nType != MOD_TYPE_XM)) + if ((bIT) && (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) && (m_nType != MOD_TYPE_XM)) { if (param == 0xA4) { command = 'S'; param = 0x91; } else if (param <= 0x80) { param <<= 1; if (param > 255) param = 255; } else command = param = 0; } else - if ((!bIT) && ((m_nType == MOD_TYPE_IT) || (m_nType == MOD_TYPE_XM))) + if ((!bIT) && ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) || (m_nType == MOD_TYPE_XM))) { param >>= 1; } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -349,7 +349,7 @@ GET_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) GET_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) GET_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) -GET_MPTHEADER_sized_member( wPitchToTempoLock , WORD , PTTL , ) +GET_MPTHEADER_sized_member( wPitchToTempoLock , WORD , PTTL ) GET_MPTHEADER_sized_member( nPitchEnvReleaseNode, BYTE , PERN ) GET_MPTHEADER_sized_member( nPanEnvReleaseNode , BYTE , AERN ) GET_MPTHEADER_sized_member( nVolEnvReleaseNode , BYTE , VERN ) @@ -1033,51 +1033,13 @@ //--------------------------------------- { UINT i, nPattern; + BYTE resetMask = (!nPos) ? CHNRESET_TOTAL : CHNRESET_MOST; for (i=0; i<MAX_CHANNELS; i++) - { - Chn[i].nNote = Chn[i].nNewNote = Chn[i].nNewIns = 0; - Chn[i].pInstrument = NULL; - Chn[i].pHeader = NULL; - Chn[i].nPortamentoDest = 0; - Chn[i].nCommand = 0; - Chn[i].nPatternLoopCount = 0; - Chn[i].nPatternLoop = 0; - Chn[i].nFadeOutVol = 0; - Chn[i].dwFlags |= CHN_KEYOFF|CHN_NOTEFADE; - Chn[i].nTremorCount = 0; - } + ResetChannelSettings(i, resetMask); + if (!nPos) { - for (i=0; i<MAX_CHANNELS; i++) - { - Chn[i].nPeriod = 0; - Chn[i].nPos = Chn[i].nLength = 0; - Chn[i].nLoopStart = 0; - Chn[i].nLoopEnd = 0; - Chn[i].nROfs = Chn[i].nLOfs = 0; - Chn[i].pSample = NULL; - Chn[i].pInstrument = NULL; - Chn[i].pHeader = NULL; - Chn[i].nCutOff = 0x7F; - Chn[i].nResonance = 0; - Chn[i].nFilterMode = 0; - Chn[i].nLeftVol = Chn[i].nRightVol = 0; - Chn[i].nNewLeftVol = Chn[i].nNewRightVol = 0; - Chn[i].nLeftRamp = Chn[i].nRightRamp = 0; - Chn[i].nVolume = 256; - if (i < MAX_BASECHANNELS) - { - Chn[i].dwFlags = ChnSettings[i].dwFlags; - Chn[i].nPan = ChnSettings[i].nPan; - Chn[i].nGlobalVol = ChnSettings[i].nVolume; - } else - { - Chn[i].dwFlags = 0; - Chn[i].nPan = 128; - Chn[i].nGlobalVol = 64; - } - } m_nGlobalVolume = m_nDefaultGlobalVolume; m_nMusicSpeed = m_nDefaultSpeed; m_nMusicTempo = m_nDefaultTempo; @@ -1382,10 +1344,11 @@ if(nch > MAX_BASECHANNELS) return true; + ResetChannelSettings(nch, CHNRESET_TOTAL); + ChnSettings[nch].nPan = 128; ChnSettings[nch].nVolume = 64; ChnSettings[nch].dwFlags = 0; - ChnSettings[nch].dwFlags &= ~CHN_MUTE; //Unmuting ChnSettings[nch].nMixPlugin = 0; ChnSettings[nch].szName[0] = 0; @@ -1401,8 +1364,74 @@ return false; } +void CSoundFile::ResetChannelSettings(CHANNELINDEX i, BYTE resetMask) +//------------------------------------------------------- +{ + //Relabs.Hack + if(i >= MAX_CHANNELS) return; + + if(resetMask & CHNRESET_BASIC) + { + if(i < MAX_BASECHANNELS) + { + //Chn[i].dwFlags = ChnSettings[i].dwFlags; + Chn[i].nPan = ChnSettings[i].nPan; + Chn[i].nGlobalVol = ChnSettings[i].nVolume; + } + else + { + Chn[i].dwFlags = 0; + Chn[i].nPan = 128; + Chn[i].nGlobalVol = 64; + } + + } + if(resetMask == CHNRESET_BASIC) return; + if(resetMask & CHNRESET_MOST) + { + Chn[i].nNote = Chn[i].nNewNote = Chn[i].nNewIns = 0; + Chn[i].pInstrument = NULL; + Chn[i].pHeader = NULL; + Chn[i].nPortamentoDest = 0; + Chn[i].nCommand = 0; + Chn[i].nPatternLoopCount = 0; + Chn[i].nPatternLoop = 0; + Chn[i].nFadeOutVol = 0; + Chn[i].dwFlags |= CHN_KEYOFF|CHN_NOTEFADE; + Chn[i].nTremorCount = 0; + } + if(resetMask == CHNRESET_MOST) return; + if(resetMask & CHNRESET_TOTAL) + { + Chn[i].nPeriod = 0; + Chn[i].nPos = Chn[i].nLength = 0; + Chn[i].nLoopStart = 0; + Chn[i].nLoopEnd = 0; + Chn[i].nROfs = Chn[i].nLOfs = 0; + Chn[i].pSample = NULL; + Chn[i].pInstrument = NULL; + Chn[i].pHeader = NULL; + Chn[i].nCutOff = 0x7F; + Chn[i].nResonance = 0; + Chn[i].nFilterMode = 0; + Chn[i].nLeftVol = Chn[i].nRightVol = 0; + Chn[i].nNewLeftVol = Chn[i].nNewRightVol = 0; + Chn[i].nLeftRamp = Chn[i].nRightRamp = 0; + Chn[i].nVolume = 256; + } +} + +void CSoundFile::ResetChannelSettings(BYTE resetMask) +//------------------------------------- +{ + for(CHANNELINDEX i = 0; i<GetNumChannels(); i++) + ResetChannelSettings(i, resetMask); +} + + + CHANNELINDEX CSoundFile::ReArrangeChannels(const std::vector<CHANNELINDEX>& newOrder) //------------------------------------------------------------------- { @@ -2799,9 +2828,47 @@ WORD CSoundFile::GetTempoMin() const {return 32;} WORD CSoundFile::GetTempoMax() const {return 512;} -ROWINDEX CSoundFile::GetRowMax() const {return MAX_PATTERN_ROWS;} -ROWINDEX CSoundFile::GetRowMin() const {return 2;} +ROWINDEX CSoundFile::GetRowMax() const +//------------------------------------ +{ + switch(m_nType) + { + case MOD_TYPE_MPT: + return MPTM_SPECS.patternRowsMax; + case MOD_TYPE_MOD: + return MOD_SPECS.patternRowsMax; + case MOD_TYPE_XM: + return XM_SPECS.patternRowsMax; + case MOD_TYPE_IT: + return IT_SPECS.patternRowsMax; + case MOD_TYPE_S3M: + return S3M_SPECS.patternRowsMax; + default: + return MAX_PATTERN_ROWS; + } +} +ROWINDEX CSoundFile::GetRowMin() const +//------------------------------------ +{ + switch(m_nType) + { + case MOD_TYPE_MPT: + return MPTM_SPECS.patternRowsMin; + case MOD_TYPE_MOD: + return MOD_SPECS.patternRowsMin; + case MOD_TYPE_XM: + return XM_SPECS.patternRowsMin; + case MOD_TYPE_IT: + return IT_SPECS.patternRowsMin; + case MOD_TYPE_S3M: + return S3M_SPECS.patternRowsMin; + default: + return 2; + } +} + + CHANNELINDEX CSoundFile::GetNumChannelMax() const //----------------------------------- { @@ -2833,3 +2900,30 @@ replace(Order.begin(), Order.end(), oldIgnoreIndex, Patterns.GetIgnoreIndex()); } +#ifndef TRADITIONAL_MODCOMMAND +void CSoundFile::OnSetEffect(MODCOMMAND& mc, EFFECT_ID eID) +//--------------------------------------------------------- +{ + // Check for MOD/XM Speed/Tempo command + if( + (GetModType() & (MOD_TYPE_MOD|MOD_TYPE_XM)) && + (eID == CMD_SPEED || eID == CMD_TEMPO) + ) + { + UINT maxspd = (GetModType() == MOD_TYPE_XM) ? 0x1F : 0x20; + mc.SetEffectByID((mc.GetEffectParam() <= maxspd) ? CMD_SPEED : CMD_TEMPO); + } + else + { + mc.SetEffectByID(eID); + } +} + + +void CSoundFile::OnSetEffectParam(MODCOMMAND& mc, EFFECT_PARAM eParam) +//--------------------------------------------------------- +{ + mc.SetEffectParam(eParam); +} + +#endif Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/Sndfile.h 2007-04-01 00:28:16 UTC (rev 177) @@ -604,7 +604,11 @@ //<---- } MODCHANNEL; +#define CHNRESET_BASIC 1 +#define CHNRESET_MOST 3 +#define CHNRESET_TOTAL 255 + typedef struct _MODCHANNELSETTINGS { UINT nPan; @@ -802,6 +806,8 @@ CHANNELINDEX GetNumChannelMax() const; CHANNELINDEX GetNumChannelMin() const; + size_t GetModNameLengthMax() {return 25;} + public: //Misc void ChangeModTypeTo(const int& newType); // @@ -933,10 +939,12 @@ BOOL Create(LPCBYTE lpStream, CModDoc *pModDoc, DWORD dwMemLength=0); BOOL Destroy(); UINT GetType() const { return m_nType; } + + //Return the number of channels in the pattern. In 1.17.02.45 + //it returned the number of channels with volume != 0 UINT GetNumChannels() const {return m_nChannels;} - //Return the number of channels in the pattern. In 1.17.02.45 - //it returned the number of channels with volume != 0 + BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); UINT GetMasterVolume() const { return m_nMasterVolume; } UINT GetNumPatterns() const; @@ -978,6 +986,17 @@ CHANNELINDEX ReArrangeChannels(const std::vector<CHANNELINDEX>& fromToArray); bool MoveChannel(UINT chn_from, UINT chn_to); bool SetChannelSettingsToDefault(UINT nch); + + + //Sets default channels settings from MODCHANNELSETTINGS to current + //channel settings. Flag can be used to tell whether to completely + //reset channels, not only a few settings(for maintaining old behavior). + void ResetChannelSettings(CHANNELINDEX chn, BYTE resetStyle); + + //For all channels. + void ResetChannelSettings(BYTE resetStyle); + + // Module Loaders BOOL ReadXM(LPCBYTE lpStream, DWORD dwMemLength); BOOL ReadS3M(LPCBYTE lpStream, DWORD dwMemLength); Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -1619,6 +1619,9 @@ } if (m_pConfig->getTreatPanLikeBalance()) { + pChn->nNewLeftVol = (realvol * pan) >> 8; + pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; + } else { if (pan < 128) { pChn->nNewLeftVol = (realvol * pan) >> 8; pChn->nNewRightVol = (realvol * 128) >> 8; @@ -1626,9 +1629,6 @@ pChn->nNewLeftVol = (realvol * 128) >> 8; pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; } - } else { - pChn->nNewLeftVol = (realvol * pan) >> 8; - pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; } } else { Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2007-04-01 00:28:16 UTC (rev 177) @@ -18,7 +18,7 @@ UINT tempoMax; UINT patternRowsMin; UINT patternRowsMax; - UINT modNameLengthMax; + UINT modNameLengthMax; //Meaning 'usable letters', possible null character is not included. UINT samplesMax; UINT instrumentsMax; }; @@ -50,32 +50,87 @@ 512, //Max tempo 2, //Min pattern rows 1024, //Max pattern rows - 100, //Max mod name length + 256, //Max mod name length 4000, //SamplesMax 256, //instrumentMax }; -/* -const CModSpecifications MOD_TYPE_MOD = + +const CModSpecifications MOD_SPECS = { - "mod", - + //TODO: Set correct values. + "mod", //File extension + 64, //Pattern max. + 128, //Order max. + 4, //Channel min + 4, //Channel max + 32, //Min tempo + 256, //Max tempo + 64, //Min pattern rows + 64, //Max pattern rows + 25, //Max mod name length + 31, //SamplesMax + 0, //instrumentMax }; -const CModSpecifications MOD_TYPE_XM = + +const CModSpecifications XM_SPECS = { - "xm", + //TODO: Set correct values. + "xm", //File extension + 64, //Pattern max. + 128, //Order max. + 4, //Channel min + 64, //Channel max + 32, //Min tempo + 256, //Max tempo + 4, //Min pattern rows + 256, //Max pattern rows + 25, //Max mod name length + 31, //SamplesMax + 256, //instrumentMax }; -const CModSpecifications MOD_TYPE_IT = +const CModSpecifications S3M_SPECS = { - "it", + //TODO: Set correct values. + "s3m", //File extension + 240, //Pattern max. + 256, //Order max. + 4, //Channel min + 32, //Channel max + 32, //Min tempo + 256, //Max tempo + 64, //Min pattern rows + 64, //Max pattern rows + 25, //Max mod name length + 31, //SamplesMax + 0, //instrumentMax }; -*/ +const CModSpecifications IT_SPECS = +{ + //TODO: Set correct values. + "it", //File extension + 240, //Pattern max. + 256, //Order max. + 4, //Channel min + 64, //Channel max + 32, //Min tempo + 256, //Max tempo + 4, //Min pattern rows + 256, //Max pattern rows + 25, //Max mod name length(in ittech.txt: "0000: \xB3'I'\xB3'M'\xB3'P'\xB3'M'\xB3 Song Name, max 26 characters, includes NULL \xB3") + 256, //SamplesMax + 256, //instrumentMax +}; + + + + #endif Modified: trunk/OpenMPT/soundlib/tuning.cpp =================================================================== --- trunk/OpenMPT/soundlib/tuning.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/tuning.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -8,8 +8,14 @@ //CTuningRTi-statics const CTuning::SERIALIZATION_MARKER CTuningRTI::s_SerializationBeginMarker("CTRTI_B."); const CTuning::SERIALIZATION_MARKER CTuningRTI::s_SerializationEndMarker("CTRTI_E."); -const CTuning::SERIALIZATION_VERSION CTuningRTI::s_SerializationVersion(2); +const CTuning::SERIALIZATION_VERSION CTuningRTI::s_SerializationVersion(3); +/* +Version changes: + 2->3: The type for the size_type in the serialisation changed + from default(size_t, uint64) to unsigned STEPTYPE. (March 2007) +*/ + //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// @@ -178,11 +184,12 @@ if(CTuning::SerializeBinary(outStrm) == SERIALIZATION_FAILURE) return SERIALIZATION_FAILURE; //Main Ratios - if(VectorToBinaryStream(outStrm, m_RatioTable)) + if(VectorToBinaryStream<RATIOTYPE, USTEPTYPE>(outStrm, m_RatioTable)) return SERIALIZATION_FAILURE; + //Fine ratios - if(VectorToBinaryStream(outStrm, m_RatioTableFine)) + if(VectorToBinaryStream<RATIOTYPE, UFINESTEPTYPE>(outStrm, m_RatioTableFine)) return SERIALIZATION_FAILURE; //m_StepMin @@ -235,7 +242,7 @@ //Version inStrm.read(reinterpret_cast<char*>(&version), sizeof(version)); - if(version != 1 && version != s_SerializationVersion) + if(version > s_SerializationVersion) return SERIALIZATION_FAILURE; //Baseclass Unserialization @@ -243,14 +250,31 @@ return SERIALIZATION_FAILURE; //Ratiotable - if(VectorFromBinaryStream(inStrm, m_RatioTable)) - return SERIALIZATION_FAILURE; + if(version < 3) + { + if(VectorFromBinaryStream<RATIOTYPE, uint64>(inStrm, m_RatioTable)) + return SERIALIZATION_FAILURE; + } + else //Version >= 3 + { + if(VectorFromBinaryStream<RATIOTYPE, USTEPTYPE>(inStrm, m_RatioTable)) + return SERIALIZATION_FAILURE; + } + //Ratiotable fine if(version > 1) { - if(VectorFromBinaryStream(inStrm, m_RatioTableFine)) - return SERIALIZATION_FAILURE; + if(version < 3) + { + if(VectorFromBinaryStream<RATIOTYPE, uint64>(inStrm, m_RatioTableFine)) + return SERIALIZATION_FAILURE; + } + else //Version >= 3 + { + if(VectorFromBinaryStream<RATIOTYPE, UFINESTEPTYPE>(inStrm, m_RatioTableFine)) + return SERIALIZATION_FAILURE; + } } Modified: trunk/OpenMPT/soundlib/tuningCollection.cpp =================================================================== --- trunk/OpenMPT/soundlib/tuningCollection.cpp 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/tuningCollection.cpp 2007-04-01 00:28:16 UTC (rev 177) @@ -5,8 +5,15 @@ //Serializations statics: const CTuningCollection::SERIALIZATION_MARKER CTuningCollection::s_SerializationBeginMarker = 0x54435348; //ascii of TCSH(TuningCollectionSerialisationHeader) in hex. const CTuningCollection::SERIALIZATION_MARKER CTuningCollection::s_SerializationEndMarker = 0x54435346; //ascii of TCSF(TuningCollectionSerialisationFooter) in hex. -const CTuningCollection::SERIALIZATION_MARKER CTuningCollection::s_SerializationVersion = 1; +const CTuningCollection::SERIALIZATION_MARKER CTuningCollection::s_SerializationVersion = 2; +/* +Version history: + 1->2: Sizetypes of string serialisation from size_t(uint64) + to uint8. (March 2007) +*/ + + const CTuningCollection::SERIALIZATION_RETURN_TYPE CTuningCollection::SERIALIZATION_SUCCESS = false; const CTuningCollection::SERIALIZATION_RETURN_TYPE CTuningCollection::SERIALIZATION_FAILURE = true; @@ -29,6 +36,7 @@ CTuningCollection::CTuningCollection(const string& name) : m_Name(name) //------------------------------------ { + if(m_Name.size() > GetNameLengthMax()) m_Name.resize(GetNameLengthMax()); m_EditMask.set(); } @@ -132,7 +140,7 @@ outStrm.write(reinterpret_cast<const char*>(&s_SerializationVersion), sizeof(s_SerializationVersion)); //3. Name - if(StringToBinaryStream(outStrm, m_Name)) + if(StringToBinaryStream<uint8>(outStrm, m_Name)) return SERIALIZATION_FAILURE; //4. Edit mask @@ -202,11 +210,19 @@ //2. Serialization version inStrm.read(reinterpret_cast<char*>(&version), sizeof(version)); - if(version != s_SerializationVersion) return SERIALIZATION_FAILURE; + if(version > s_SerializationVersion) return SERIALIZATION_FAILURE; //3. Name - if(StringFromBinaryStream(inStrm, m_Name)) - return SERIALIZATION_FAILURE; + if(version < 2) + { + if(StringFromBinaryStream<uint64>(inStrm, m_Name)) + return SERIALIZATION_FAILURE; + } + else + { + if(StringFromBinaryStream<uint8>(inStrm, m_Name)) + return SERIALIZATION_FAILURE; + } //4. Editmask __int16 em = 0; Modified: trunk/OpenMPT/soundlib/tuning_template.h =================================================================== --- trunk/OpenMPT/soundlib/tuning_template.h 2007-03-14 01:04:11 UTC (rev 176) +++ trunk/OpenMPT/soundlib/tuning_template.h 2007-04-01 00:28:16 UTC (rev 177) @@ -68,7 +68,9 @@ */ //Class defining tuning which is fundamentally based on discrete steps. -template<class TSTEPTYPE = short int, class TRATIOTYPE = float, class TFINESTEPTYPE = TSTEPTYPE> +template<class TSTEPTYPE = short int, class TUSTEPTYPE = unsigned short int, + class TRATIOTYPE = float, + class TFINESTEPTYPE = TSTEPTYPE, class TUFINESTEPTYPE = TUSTEPTYPE> class CTuningBase { //STEPTYPE: Some type that has properties that of 'ordinary' signed and discrete figures. @@ -81,8 +83,10 @@ public: //BEING TYPEDEFS: typedef TSTEPTYPE STEPTYPE; + typedef TUSTEPTYPE USTEPTYPE; //Unsigned steptype typedef TRATIOTYPE RATIOTYPE; typedef TFINESTEPTYPE FINESTEPTYPE; + typedef TUFINESTEPTYPE UFINESTEPTYPE; //Unsigned finesteptype typedef std::exception TUNINGEXCEPTION; @@ -103,6 +107,7 @@ typedef std::string NOTESTR; typedef std::map<STEPTYPE, NOTESTR> NOTENAMEMAP; + typedef USTEPTYPE SIZETYPE; typedef typename NOTENAMEMAP::iterator NNM_ITER; typedef typename NOTENAMEMAP::const_iterator NNM_CITER; @@ -277,7 +282,8 @@ CTuningBase& operator=(const CTuningBase&); CTuningBase(const CTuningBase&); //When copying tunings, the name must not be exact copy - //since it is to be unique for every tuning. + //since it is to be unique for every tuning, or maybe some + //better identification could be introduced. CTUNINGTYPE GetType() const {return m_TuningType;} @@ -288,7 +294,7 @@ //BEGIN PRIVATE METHODS private: SERIALIZATION_RETURN_TYPE NotenameMapToBinary(ostream&) const; - SERIALIZATION_RETURN_TYPE NotenameMapFromBinary(istream&); + SERIALIZATION_RETURN_TYPE NotenameMapFromBinary(istream&, const SERIALIZATION_VERSION); bool SetType(const CTUNINGTYPE& tt) { @@ -342,63 +348,64 @@ //Specialising tuning for ompt. -typedef short int MPT_TUNING_STEPTYPE; -typedef float MPT_TUNING_RATIOTYPE; -typedef MPT_TUNING_STEPTYPE MPT_TUNING_FINESTEPTYPE; +typedef CTuningBase<int16, uint16, float32, int16, uint16> CTuning; -typedef CTuningBase<MPT_TUNING_STEPTYPE, MPT_TUNING_RATIOTYPE, MPT_TUNING_FINESTEPTYPE> CTuning; - const CTuning::SERIALIZATION_MARKER CTuning::s_SerializationBeginMarker("CT<sfs>B"); const CTuning::SERIALIZATION_MARKER CTuning::s_SerializationEndMarker("CT<sfs>E"); //<sfs> <-> Short Float Short -template<class A, class B, class C> -const CTuningBase<>::SERIALIZATION_MARKER CTuningBase<A, B, C>::s_SerializationBeginMarker("CTB<ABC>"); +template<class A, class B, class C, class D, class E> +const CTuningBase<>::SERIALIZATION_MARKER CTuningBase<A, B, C, D, E>::s_SerializationBeginMarker("CTB<ABC>"); -template<class A, class B, class C> -const CTuningBase<>::SERIALIZATION_MARKER CTuningBase<A, B, C>::s_SerializationEndMarker("CTB<ABC>"); +template<class A, class B, class C, class D, class E> +const CTuningBase<>::SERIALIZATION_MARKER CTuningBase<A, B, C, D, E>::s_SerializationEndMarker("CTB<ABC>"); -template<class A, class B, class C> -const CTuningBase<>::SERIALIZATION_VERSION CTuningBase<A, B, C>::s_SerializationVersion(3); +template<class A, class B, class C, class D, class E> +const CTuningBase<>::SERIALIZATION_VERSION CTuningBase<A, B, C, D, E>::s_SerializationVersion(4); +/* +Version history: + 3->4: Changed sizetypes in serialisation from size_t(uint64) to + smaller types (uint8, USTEPTYPE) (March 2007) +*/ -template<class A, class B, class C> -const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C>::SERIALIZATION_SUCCESS = false; +template<class A, class B, class C, class D, class E> +const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C, D, E>::SERIALIZATION_SUCCESS = false; -template<class A, class B, class C> -const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C>::SERIALIZATION_FAILURE = true; +template<class A, class B, class C, class D, class E> +const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C, D, E>::SERIALIZATION_FAILURE = true; -template<class A, class B, class C> -const string CTuningBase<A, B, C>::s_FileExtension = ".tun"; +template<class A, class B, class C, class D, class E> +const string CTuningBase<A, B, C, D, E>::s_FileExtension = ".tun"; -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_MAINRATIOS = 0x1; //1b -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_NOTENAME = 0x2; //10b -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_TYPE = 0x4; //100b -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_NAME = 0x8; //1000b -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_FINETUNE = 0x10; //10000b -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_ALLOWALL = 0xFFFF; //All editing allowed. -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_EDITMASK = 0x8000; //Whether to allow modifications to editmask. -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_CONST = 0x8000; //All editing except changing const status disable. -template<class A, class B, class C> -const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_CONST_STRICT = 0; //All bits are zero. +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_MAINRATIOS = 0x1; //1b +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_NOTENAME = 0x2; //10b +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_TYPE = 0x4; //100b +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_NAME = 0x8; //1000b +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_FINETUNE = 0x10; //10000b +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_ALLOWALL = 0xFFFF; //All editing allowed. +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_EDITMASK = 0x8000; //Whether to allow modifications to editmask. +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_CONST = 0x8000; //All editing except changing const status disable. +template<class A, class B, class C, class D, class E> +const CTuning::CEDITMASK CTuningBase<A, B, C, D, E>::EM_CONST_STRICT = 0; //All bits are zero. -template<class A, class B, class C> -const CTuning::CTUNINGTYPE CTuningBase<A, B, C>::TT_GENERAL = 0; //0...00b -template<class A, class B, class C> -const CTuning::CTUNINGTYPE CTuningBase<A, B, C>::TT_RATIOPERIODIC = 1; //0...10b -template<class A, class B, class C> -const CTuning::CTUNINGTYPE CTuningBase<A, B, C>::TT_TET = 3; //0...11b +template<class A, class B, class C, class D, class E> +const CTuning::CTUNINGTYPE CTuningBase<A, B, C, D, E>::TT_GENERAL = 0; //0...00b +template<class A, class B, class C, class D, class E> +const CTuning::CTUNINGTYPE CTuningBase<A, B, C, D, E>::TT_RATIOPERIODIC = 1; //0...10b +template<class A, class B, class C, class D, class E> +const CTuning::CTUNINGTYPE CTuningBase<A, B, C, D, E>::TT_TET = 3; //0...11b -template<class A, class B, class C> -CTuningBase<A,B,C>& CTuningBase<A,B,C>::operator =(const CTuningBase& pt) +template<class A, class B, class C, class D, class E> +CTuningBase<A,B,C,D,E>& CTuningBase<A,B,C,D,E>::operator =(const CTuningBase& pt) //----------------------------------------------------------------------- { if(!MayEdit(EM_ALLOWALL)) @@ -437,15 +444,15 @@ return *this; } -template<class A, class B, class C> -CTuningBase<A,B,C>::CTuningBase(const CTuningBase& pt) +template<class A, class B, class C, class D, class E> +CTuningBase<A,B,C,D,E>::CTuningBase(const CTuningBase& pt) //----------------------------------------------------------------------- { *this = pt; } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::SetRatio(const STEPTYPE& s, const RATIOTYPE& r) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::SetRatio(const STEPTYPE& s, const RATIOTYPE& r) //----------------------------------------------------------------- { if(MayEdit(EM_MAINRATIOS)) @@ -461,8 +468,8 @@ } -template<class A, class B, class C> -string CTuningBase<A,B,C>::GetTuningTypeStr(const CTUNINGTYPE& tt) +template<class A, class B, class C, class D, class E> +string CTuningBase<A,B,C,D,E>::GetTuningTypeStr(const CTUNINGTYPE& tt) //---------------------------------------------------------------- { if(tt == TT_GENERAL) @@ -476,8 +483,8 @@ -template<class A, class B, class C> -CTuningBase<>::NOTESTR CTuningBase<A,B,C>::GetNoteName(const STEPTYPE& x) const +template<class A, class B, class C, class D, class E> +CTuningBase<>::NOTESTR CTuningBase<A,B,C,D,E>::GetNoteName(const STEPTYPE& x) const //----------------------------------------------------------------------- { NNM_CITER i = m_NoteNameMap.find(x); @@ -488,8 +495,8 @@ } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::DoesTypeInclude(const CTUNINGTYPE& type) const +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::DoesTypeInclude(const CTUNINGTYPE& type) const //----------------------------------------------------------------------------- { if(type == TT_GENERAL) @@ -508,8 +515,8 @@ return false; } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::SetNoteName(const STEPTYPE& n, const string& str) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::SetNoteName(const STEPTYPE& n, const string& str) //----------------------------------------------------------------------- { if(MayEdit(EM_NOTENAME)) @@ -520,8 +527,8 @@ return true; } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::ClearNoteName(const STEPTYPE& n, const bool eraseAll) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::ClearNoteName(const STEPTYPE& n, const bool eraseAll) //------------------------------------------------------- { if(MayEdit(EM_NOTENAME)) @@ -545,8 +552,8 @@ } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::Multiply(const RATIOTYPE& r) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::Multiply(const RATIOTYPE& r) //--------------------------------------------------- { if(r <= 0 || !MayEdit(EM_MAINRATIOS)) @@ -563,8 +570,8 @@ return false; } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::CreateRatioPeriodic(const STEPTYPE& s, const RATIOTYPE& r) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::CreateRatioPeriodic(const STEPTYPE& s, const RATIOTYPE& r) //------------------------------------------------------------- { if(s < 1 || r <= 0) @@ -577,8 +584,8 @@ return CreateRatioPeriodic(v, r); } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::CreateRatioPeriodic(const vector<RATIOTYPE>& v, const RATIOTYPE& r) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::CreateRatioPeriodic(const vector<RATIOTYPE>& v, const RATIOTYPE& r) //------------------------------------------------------------------------------------------ { if(MayEdit(EM_MAINRATIOS) && @@ -599,8 +606,8 @@ } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::CreateTET(const STEPTYPE& s, const RATIOTYPE& r) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::CreateTET(const STEPTYPE& s, const RATIOTYPE& r) //------------------------------------------------------------------- { if(MayEdit(EM_MAINRATIOS) && @@ -621,8 +628,8 @@ } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::ChangePeriod(const STEPTYPE& s) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::ChangePeriod(const STEPTYPE& s) //--------------------------------------------------- { if(!MayEdit(EM_MAINRATIOS) || s < 1) @@ -638,8 +645,8 @@ } -template<class A, class B, class C> -bool CTuningBase<A,B,C>::ChangePeriodRatio(const RATIOTYPE& r) +template<class A, class B, class C, class D, class E> +bool CTuningBase<A,B,C,D,E>::ChangePeriodRatio(const RATIOTYPE& r) //--------------------------------------------------- { if(!MayEdit(EM_MAINRATIOS) || r <= 0) @@ -655,8 +662,8 @@ } -template<class TSTEPTYPE, class TRATIOTYPE, class TFINESTEPTYPE> -CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<TSTEPTYPE, TRATIOTYPE, TFINESTEPTYPE>::SerializeBinary(ostream& outStrm, const int mode) const +template<class A, class B, class C, class D, class E> +CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C, D, E>::SerializeBinary(ostream& outStrm, const int mode) const //------------------------------------------------------------------------------------------------------------------------------ { //Writing the tuning name here. @@ -667,7 +674,7 @@ outStrm.write(reinterpret_cast<const char*>(&s_SerializationVersion), sizeof(s_SerializationVersion)); //Tuning name - if(StringToBinaryStream(outStrm, m_TuningName)) return SERIALIZATION_FAILURE; + if(StringToBinaryStream<uint8>(outStrm, m_TuningName)) return SERIALIZATION_FAILURE; //Const mask const __int16 cm = static_cast<__int16>(m_EditMask.to_ulong()); @@ -693,8 +700,8 @@ } -template<class TSTEPTYPE, class TRATIOTYPE, class TFINESTEPTYPE> -CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<TSTEPTYPE, TRATIOTYPE, TFINESTEPTYPE>::UnSerializeBinary(istream& inStrm, const int mode) +template<class A, class B, class C, class D, class E> +CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A,B,C,D,E>::UnSerializeBinary(istream& inStrm,... [truncated message content] |
From: <re...@us...> - 2007-03-14 01:04:18
|
Revision: 176 http://svn.sourceforge.net/modplug/?rev=176&view=rev Author: rewbs Date: 2007-03-13 18:04:11 -0700 (Tue, 13 Mar 2007) Log Message: ----------- Missing break in case statement. Modified Paths: -------------- trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp Modified: trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp =================================================================== --- trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp 2007-03-14 00:19:33 UTC (rev 175) +++ trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp 2007-03-14 01:04:11 UTC (rev 176) @@ -43,23 +43,9 @@ setNormalGlobalVol(128.0); break; - // FOR TEST PURPOSES ONLY: - case plugmix_mode_Test: - setVSTiAttenuation(1.0f); - setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); - setFloatToInt(static_cast<float>(MIXING_CLIPMAX)); - setGlobalVolumeAppliesToMaster(true); - setUseGlobalPreAmp(false); - setTreatPanLikeBalance(true); - setDisplayDBValues(true); - setNormalSamplePreAmp(128.0); - setNormalVSTiVol(128.0); - setNormalGlobalVol(256.0); - break; - // 117RC2 gives us floats in [-1.0; 1.0] and hopefully plays VSTis at // the right volume... but we attenuate by 2x to approx. match sample volume. - default: + case plugmix_mode_117RC2: setVSTiAttenuation(2.0f); setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); @@ -71,10 +57,12 @@ setNormalSamplePreAmp(128.0); setNormalVSTiVol(100.0); setNormalGlobalVol(128.0); + break; // 117RC3 ignores the horrible global, system-specific pre-amp, // treats panning as balance to avoid saturation on loud sample (and because I think it's better :), // and allows display of attenuation in decibels. + default: case plugmix_mode_117RC3: setVSTiAttenuation(1.0f); setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); @@ -87,6 +75,23 @@ setNormalVSTiVol(128.0); setNormalGlobalVol(256.0); break; + + // FOR TEST PURPOSES ONLY: + /* + case plugmix_mode_Test: + setVSTiAttenuation(1.0f); + setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); + setFloatToInt(static_cast<float>(MIXING_CLIPMAX)); + setGlobalVolumeAppliesToMaster(true); + setUseGlobalPreAmp(false); + setTreatPanLikeBalance(true); + setDisplayDBValues(true); + setNormalSamplePreAmp(128.0); + setNormalVSTiVol(128.0); + setNormalGlobalVol(256.0); + break; + */ + } return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2007-03-14 00:19:40
|
Revision: 175 http://svn.sourceforge.net/modplug/?rev=175&view=rev Author: rewbs Date: 2007-03-13 17:19:33 -0700 (Tue, 13 Mar 2007) Log Message: ----------- . v1.17.02.46 (in progress, no binary yet) First pass merge from tuning branch. Modified Paths: -------------- trunk/OpenMPT/mptrack/AutoSaver.cpp trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/ChannelManagerDlg.h trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/KeyConfigDlg.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/Moptions.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/PatternGotoDialog.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/Tables.cpp Added Paths: ----------- trunk/OpenMPT/mptrack/OrderToPatternTable.cpp trunk/OpenMPT/mptrack/OrderToPatternTable.h trunk/OpenMPT/mptrack/PlaybackEventer.cpp trunk/OpenMPT/mptrack/PlaybackEventer.h trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h trunk/OpenMPT/mptrack/TuningDialog.cpp trunk/OpenMPT/mptrack/TuningDialog.h trunk/OpenMPT/mptrack/misc_util.cpp trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/mptrack/pattern.cpp trunk/OpenMPT/mptrack/pattern.h trunk/OpenMPT/mptrack/patternContainer.cpp trunk/OpenMPT/mptrack/patternContainer.h trunk/OpenMPT/mptrack/serialization_utils.cpp trunk/OpenMPT/mptrack/serialization_utils.h trunk/OpenMPT/mptrack/tuningRatioMapWnd.cpp trunk/OpenMPT/mptrack/tuningRatioMapWnd.h trunk/OpenMPT/soundlib/MPT_module.cpp trunk/OpenMPT/soundlib/MPT_module.h trunk/OpenMPT/soundlib/midi.h trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.h trunk/OpenMPT/soundlib/tuning.cpp trunk/OpenMPT/soundlib/tuning.h trunk/OpenMPT/soundlib/tuningCollection.cpp trunk/OpenMPT/soundlib/tuning_template.h trunk/OpenMPT/soundlib/tuningcollection.h trunk/OpenMPT/soundlib/wavConverter.h Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -206,6 +206,9 @@ name.Append(".it"); } break; + case MOD_TYPE_MPT: + name.Append(".mptm"); + break; case MOD_TYPE_XM: name.Append(".xm"); break; @@ -241,6 +244,9 @@ pSndFile->SaveITProject(fileName) : pSndFile->SaveIT(fileName, 0); break; + case MOD_TYPE_MPT: + success = pSndFile->SaveMPT(fileName, 0); + break; //default: //Do nothing } Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -181,7 +181,7 @@ EnterCriticalSection(&applying); - MODCOMMAND *p,*newp; + MODCOMMAND *p = NULL,*newp = NULL; MODCHANNELSETTINGS settings[MAX_BASECHANNELS]; UINT i,j,k,nChannels,newpat[MAX_BASECHANNELS],newMemory[4][MAX_BASECHANNELS]; @@ -199,40 +199,28 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - // Rearrange patterns content - for(i = 0 ; i < MAX_PATTERNS ; i++){ + //Creating new order-vector for ReArrangeChannels. + vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels); + for(i = 0; i<nChannels; i++) + { + newChnOrder.push_back(newpat[i]); + } + if(m_pSndFile->ReArrangeChannels(newChnOrder) != nChannels) + { + MessageBox("Rearranging channels failed"); + END_CRITICAL(); + EndWaitCursor(); - // Allocate a new empty pattern to replace current pattern at i'th position in pattern array - p = m_pSndFile->Patterns[i]; - if(p) newp = CSoundFile::AllocatePattern(m_pSndFile->PatternSize[i], nChannels); + ResetState(TRUE,TRUE,TRUE,TRUE,TRUE); + LeaveCriticalSection(&applying); - if(p && !newp){ - END_CRITICAL(); - EndWaitCursor(); - LeaveCriticalSection(&applying); - ::MessageBox(NULL, "Pattern Data is corrupted!!!", "ERROR: Not enough memory to rearrange channels!", MB_ICONERROR | MB_OK); - return; - } - - // Copy data from old pattern taking care of new channel reodering - if(p != NULL){ - for(j = 0 ; j < m_pSndFile->PatternSize[i] ; j++){ - for(k = 0 ; k < nChannels ; k++) - memcpy(&newp[j*nChannels + k],&p[j*m_pSndFile->m_nChannels + newpat[k]],sizeof(MODCOMMAND)); - } - // Set new pattern in pattern array & free previous pattern - m_pSndFile->Patterns[i] = newp; - CSoundFile::FreePattern(p); - } + return; } + - // Copy channel settings - for(i = 0 ; i < m_pSndFile->m_nChannels ; i++) settings[i] = m_pSndFile->ChnSettings[i]; - // Redistribute channel setting & update manager internal store memory for(i = 0 ; i < nChannels ; i++){ if(i != newpat[i]){ - m_pSndFile->ChnSettings[i] = settings[newpat[i]]; memory[0][i] = newMemory[0][newpat[i]]; memory[1][i] = newMemory[1][newpat[i]]; memory[2][i] = newMemory[2][newpat[i]]; @@ -240,23 +228,13 @@ memory[3][i] = i; } - // Also update record states (unfortunetely they are not part of channel settings) - for(i = 0 ; i < nChannels ; i++) newMemory[1][i] = pModDoc->IsChannelRecord(i); - - pModDoc->ReinitRecordState(); - for(i = 0 ; i < nChannels ; i++){ - if(newMemory[1][newpat[i]] == 1) pModDoc->Record1Channel(i,TRUE); - if(newMemory[1][newpat[i]] == 2) pModDoc->Record2Channel(i,TRUE); - } - - // Update new number of channels - m_pSndFile->m_nChannels = nChannels; if(pActiveMod == pModDoc){ i = m_pSndFile->GetCurrentPos(); m_pSndFile->m_dwSongFlags &= ~SONG_STEP; m_pSndFile->SetCurrentPos(0); m_pSndFile->SetCurrentPos(i); } + END_CRITICAL(); EndWaitCursor(); Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.h =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.h 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.h 2007-03-14 00:19:33 UTC (rev 175) @@ -12,6 +12,7 @@ public: static CChannelManagerDlg * sharedInstance(BOOL autoCreate = TRUE); + static void DestroySharedInstance() {delete sharedInstance_; sharedInstance_ = NULL;} void SetDocument(void * parent); BOOL IsOwner(void * ctrl); BOOL IsDisplayed(void); Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -2258,6 +2258,16 @@ commands[kcFileExportCompat].isHidden = false; commands[kcFileExportCompat].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].UID = 1778; + commands[kcUnmuteAllChnOnPatTransition].isHidden = false; + commands[kcUnmuteAllChnOnPatTransition].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].Message = "Unmute all channels on pattern transition"; + + commands[kcSoloChnOnPatTransition].UID = 1779; + commands[kcSoloChnOnPatTransition].isHidden = false; + commands[kcSoloChnOnPatTransition].isDummy = false; + commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition"; + #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 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/CommandSet.h 2007-03-14 00:19:33 UTC (rev 175) @@ -226,6 +226,8 @@ kcChannelSolo, kcChannelUnmuteAll, kcToggleChanMuteOnPatTransition, + kcUnmuteAllChnOnPatTransition, + kcSoloChnOnPatTransition, kcCopyAndLoseSelection, kcTransposeUp, kcTransposeDown, Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -159,7 +159,7 @@ { // Detecting max valid restart position UINT i = 0; - for (i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; + for (i=0; i<m_pSndFile->Order.size(); i++) if (m_pSndFile->Order[i] == m_pSndFile->Patterns.GetInvalidIndex()) break; m_SpinRestartPos.SetRange(0, i); } if (dwHint & HINT_MODGENERAL) @@ -217,6 +217,8 @@ // -> DESC="IT project files (.itp)" // case MOD_TYPE_IT: pszModType = "IT (Impulse Tracker)"; break; case MOD_TYPE_IT: pszModType = m_pSndFile->m_dwSongFlags & SONG_ITPROJECT ? "ITP (IT Project)" : "IT (Impulse Tracker)"; break; + case MOD_TYPE_MPT: pszModType = "MPTM (OpenMPT)"; break; + // -! NEW_FEATURE#0023 } wsprintf(s, "%s, %d channels", pszModType, m_pSndFile->m_nChannels); @@ -446,9 +448,9 @@ if (s[0]) { UINT n = atoi(s); - if (n < MAX_ORDERS) + if(n < m_pSndFile->Order.size()) { - for (UINT i=0; i<=n; i++) if (m_pSndFile->Order[i] == 0xFF) return; + for (UINT i=0; i<=n; i++) if (m_pSndFile->Order[i] == m_pSndFile->Patterns.GetInvalidIndex()) return; if (n != m_pSndFile->m_nRestartPos) { m_EditRestartPos.SetModify(FALSE); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -7,6 +7,7 @@ #include "ctrl_ins.h" #include "view_ins.h" #include "dlg_misc.h" +#include "tuningDialog.h" #include "misc_util.h" #include <vector> #include <string> @@ -15,6 +16,8 @@ #pragma warning(disable:4244) +const pair<string, WORD> CCtrlInstruments::s_TuningNotFound("Tuning was not found. Setting to default tuning", 7); + ///////////////////////////////////////////////////////////////////////// // CNoteMapWnd @@ -160,7 +163,10 @@ // Note s[0] = 0; - if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s%d", szNoteNames[nPos % 12], nPos/12); + + string temp = pSndFile->GetNoteName(nPos+1, m_nInstrument); + temp.resize(4); + if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", temp.c_str()); rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note @@ -173,7 +179,12 @@ UINT n = penv->NoteMap[nPos]; if (n == 0xFF) strcpy(s, "==="); else if (n == 0xFE) strcpy(s, "^^^"); else - if (n <= 120) wsprintf(s, "%s%d", szNoteNames[(n-1)%12], (n-1)/12); + if (n <= 120) + { + string temp = pSndFile->GetNoteName(n, m_nInstrument); + temp.resize(4); + wsprintf(s, "%s", temp.c_str()); + } } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow); if ((nPos == (int)m_nNote) && (!m_bIns)) @@ -439,7 +450,7 @@ INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; if ((penv) && (m_nNote < 120)) { - if (!m_bIns && (pSndFile->m_nType & MOD_TYPE_IT)) + if (!m_bIns && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { UINT n = penv->NoteMap[m_nNote]; BOOL bOk = FALSE; @@ -496,7 +507,7 @@ return true; } - else if ((!m_bIns) && (pSndFile->m_nType & MOD_TYPE_IT)) { //in note column + else if ((!m_bIns) && (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { //in note column UINT n = penv->NoteMap[m_nNote]; @@ -649,6 +660,7 @@ ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP + ON_CBN_SELCHANGE(IDC_COMBOTUNING, OnCbnSelchangeCombotuning) ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock) ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock) @@ -696,6 +708,7 @@ DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack); DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); // -! NEW_FEATURE#0027 + DDX_Control(pDX, IDC_COMBOTUNING, m_ComboTuning); DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); //}}AFX_DATA_MAP @@ -815,12 +828,12 @@ m_SpinInstrument.SetFocus(); + BuildTuningComboBox(); + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); - //OnBnClickedCheckPitchtempolock(); + OnBnClickedCheckPitchtempolock(); m_EditPitchTempoLock.SetLimitText(4); - - return FALSE; } @@ -864,6 +877,7 @@ } PostViewMessage(VIEWMSG_SETCURRENTINSTRUMENT, m_nInstrument); UnlockControls(); + return TRUE; } @@ -1010,9 +1024,10 @@ if (!m_bInitialized) dwHintMask |= HINT_MODTYPE; if (dwHintMask & HINT_MODTYPE) { - BOOL bITonly = ((m_pSndFile->m_nType == MOD_TYPE_IT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + BOOL bITonly = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; //rewbs.instroVSTi - BOOL bITandXM = (((m_pSndFile->m_nType == MOD_TYPE_IT) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + BOOL bITandXM = (((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + bool bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT10), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT11), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT7), bITandXM); @@ -1052,8 +1067,9 @@ m_SliderResonance.EnableWindow(bITonly); m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); - m_EditPitchTempoLock.EnableWindow(bITonly); - m_CheckPitchTempoLock.EnableWindow(bITonly); + m_ComboTuning.EnableWindow(bMPTOnly); + m_EditPitchTempoLock.EnableWindow(bMPTOnly); + m_CheckPitchTempoLock.EnableWindow(bMPTOnly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { @@ -1124,7 +1140,7 @@ m_ComboPPC.SetCurSel(penv->nPPC); SetDlgItemInt(IDC_EDIT15, penv->nPPS); // Filter - if (m_pSndFile->m_nType & MOD_TYPE_IT) + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { m_CheckCutOff.SetCheck((penv->nIFC & 0x80) ? TRUE : FALSE); m_CheckResonance.SetCheck((penv->nIFR & 0x80) ? TRUE : FALSE); @@ -1145,6 +1161,8 @@ if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 + + UpdateTuningComboBox(); if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); else @@ -1323,7 +1341,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { - //NOTE: pszText seems to point to char array of length 256. + //NOTE: pszText seems to point to char array of length 256 (Noverber 2006). if ((pszText) && (uId)) { switch(uId) @@ -1340,8 +1358,8 @@ case IDC_CHECK_PITCHTEMPOLOCK: if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) { - const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); - ASSERT(str.size() < 256); + string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + if(str.size() >= 250) str.resize(250); wsprintf(pszText, str.c_str()); return TRUE; } @@ -1411,7 +1429,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((pSndFile->m_nType & MOD_TYPE_IT) + if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0) && (CMainFrame::GetInputHandler()->ShiftPressed())) //rewbs.customKeys { @@ -1438,7 +1456,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_nInstruments > 0)) + if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0)) { BOOL bFirst = (pSndFile->m_nInstruments) ? FALSE : TRUE; LONG smp = m_pModDoc->InsertInstrument(0, m_nInstrument); @@ -1461,7 +1479,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Instruments|*.xi;*.pat;*.iti;*.wav;*.aif;*.aiff|" "FastTracker II Instruments (*.xi)|*.xi|" "GF1 Patches (*.pat)|*.pat|" @@ -1472,8 +1490,36 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurInsDir; } + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size. + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; - if (!OpenInstrument(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple instruments, advancing to next instrument and creating + //new instrument if necessary. + if(counter > 0) + { + if(m_nInstrument >= MAX_INSTRUMENTS-1) + break; + else + m_nInstrument++; + + if(m_nInstrument > m_pSndFile->GetNumInstruments()) + OnInstrumentNew(); + } + + if(!OpenInstrument(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); if (m_pParent) m_pParent->InstrumentChanged(m_nInstrument); SwitchToView(); } @@ -1503,10 +1549,10 @@ // "FastTracker II Instruments (*.xi)|*.xi|" // "Impulse Tracker Instruments (*.iti)|*.iti||", // this); - CFileDialog dlg(FALSE, (m_pSndFile->m_nType & MOD_TYPE_IT) ? "iti" : "xi", + CFileDialog dlg(FALSE, (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? "iti" : "xi", szFileName, OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, - ( m_pSndFile->m_nType & MOD_TYPE_IT ? "Impulse Tracker Instruments (*.iti)|*.iti|" + ( m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT) ? "Impulse Tracker Instruments (*.iti)|*.iti|" "FastTracker II Instruments (*.xi)|*.xi||" : "FastTracker II Instruments (*.xi)|*.xi|" "Impulse Tracker Instruments (*.iti)|*.iti||" ), @@ -1649,7 +1695,7 @@ if (nVol != (int)penv->nGlobalVol) { penv->nGlobalVol = nVol; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; @@ -1691,7 +1737,7 @@ if (nPan != (int)penv->nPan) { penv->nPan = nPan; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; @@ -2362,7 +2408,134 @@ return 0; } + //end rewbs.customKeys + +void CCtrlInstruments::OnCbnSelchangeCombotuning() +//------------------------------------------------ +{ + if (IsLocked() || m_pModDoc == NULL || m_pSndFile == NULL) return; + + INSTRUMENTHEADER* pInstH = m_pSndFile->Headers[m_nInstrument]; + if(pInstH == 0) + return; + + size_t sel = m_ComboTuning.GetCurSel(); + if(sel == 0) //Setting IT behavior + { + BEGIN_CRITICAL(); + pInstH->SetTuning(NULL); + END_CRITICAL(); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); + return; + } + + sel -= 1; + CTuningCollection* tc = 0; + + if(sel < CSoundFile::s_TuningsSharedStandard.GetNumTunings()) + tc = &CSoundFile::s_TuningsSharedStandard; + else + { + sel -= CSoundFile::s_TuningsSharedStandard.GetNumTunings(); + if(sel < CSoundFile::s_TuningsSharedLocal.GetNumTunings()) + tc = &CSoundFile::s_TuningsSharedLocal; + else + { + sel -= CSoundFile::s_TuningsSharedLocal.GetNumTunings(); + if(sel < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings()) + tc = &m_pSndFile->m_TuningsTuneSpecific; + } + } + + if(tc) + { + BEGIN_CRITICAL(); + pInstH->SetTuning(&tc->GetTuning(sel)); + END_CRITICAL(); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); + return; + } + + //Case: Chosen tuning editor to be displayed. + //Creating vector for the CTuningDialog. + vector<CTuningCollection*> v; + v.push_back(&m_pSndFile->s_TuningsSharedStandard); + v.push_back(&m_pSndFile->s_TuningsSharedLocal); + v.push_back(&m_pSndFile->m_TuningsTuneSpecific); + CTuningDialog td(this, v, pInstH->pTuning); + td.DoModal(); + if(td.GetModifiedStatus(&m_pSndFile->s_TuningsSharedLocal)) + { + if(MsgBox(IDS_APPLY_TUNING_MODIFICATIONS, this, "", MB_OKCANCEL) == IDOK) + m_pSndFile->SaveStaticTunings(); + } + if(td.GetModifiedStatus(&m_pSndFile->m_TuningsTuneSpecific)) + { + m_pModDoc->SetModified(); + } + + //Recreating tuning combobox so that possible + //new tuning(s) come visible. + BuildTuningComboBox(); + + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); +} + + +void CCtrlInstruments::UpdateTuningComboBox() +//------------------------------------------- +{ + if (m_pModDoc == 0 || m_pSndFile == 0 + || m_nInstrument > m_pSndFile->GetNumInstruments() + || m_pSndFile->Headers[m_nInstrument] == NULL) return; + + INSTRUMENTHEADER* const penv = m_pSndFile->Headers[m_nInstrument]; + if(penv->pTuning == NULL) + { + m_ComboTuning.SetCurSel(0); + return; + } + + for(size_t i = 0; i < CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + if(penv->pTuning == &CSoundFile::s_TuningsSharedStandard.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+1); + return; + } + } + + for(size_t i = 0; i < CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + if(penv->pTuning == &CSoundFile::s_TuningsSharedLocal.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings()+1); + return; + } + } + + for(size_t i = 0; i < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + if(penv->pTuning == &m_pSndFile->m_TuningsTuneSpecific.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()+1); + return; + } + } + + string str = s_TuningNotFound.first; + str.insert(s_TuningNotFound.second, m_pSndFile->Headers[m_nInstrument]->pTuning->GetName()); + MessageBox(str.c_str()); + BEGIN_CRITICAL(); + penv->SetTuning(penv->s_DefaultTuning); + END_CRITICAL(); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); +} + void CCtrlInstruments::OnEnChangeEditPitchtempolock() //---------------------------------------------------- { @@ -2397,7 +2570,7 @@ if(!penv) return; - //Checking to what value to put for the wPitchToTempoLock. + //Checking what value to put for the wPitchToTempoLock. m_EditPitchTempoLock.EnableWindow(); WORD ptl = penv->wPitchToTempoLock; if(ptl == 0) @@ -2412,7 +2585,7 @@ ptl = m_pSndFile->m_nDefaultTempo; } m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); - //SetModified() comes with this. + //SetModified() comes with SetWindowText(.). } else { @@ -2428,9 +2601,12 @@ } } + void CCtrlInstruments::OnEnKillfocusEditPitchtempolock() //------------------------------------------------------ { + //Checking that tempo value is in correct range. + if(!m_pSndFile || IsLocked()) return; char buffer[6]; @@ -2438,7 +2614,6 @@ int ptlTempo = atoi(buffer); bool changed = false; - if(ptlTempo < m_pSndFile->GetTempoMin()) { ptlTempo = m_pSndFile->GetTempoMin(); @@ -2450,6 +2625,29 @@ changed = true; } - if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str()); } + + +void CCtrlInstruments::BuildTuningComboBox() +//------------------------------------------ +{ + while(m_ComboTuning.GetCount() > 0) + m_ComboTuning.DeleteString(0); + + m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL + for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).GetName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); +} Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2007-03-14 00:19:33 UTC (rev 175) @@ -78,10 +78,18 @@ CSpinButtonCtrl m_SpinAttack; // -! NEW_FEATURE#0027 + //Tuning + CComboBox m_ComboTuning; + void UpdateTuningComboBox(); + void BuildTuningComboBox(); + static const pair<string, WORD> s_TuningNotFound; + //first <-> string, second <-> place where to put tuning name. + //Pitch/Tempo lock CEdit m_EditPitchTempoLock; CButton m_CheckPitchTempoLock; + public: CCtrlInstruments(); virtual ~CCtrlInstruments(); @@ -94,6 +102,8 @@ VOID UpdateFilterText(); LONG* GetSplitPosRef() {return &CMainFrame::glInstrumentWindowHeight;} //rewbs.varWindowSize + + public: //{{AFX_VIRTUAL(CCtrlInstruments) virtual BOOL OnInitDialog(); @@ -148,6 +158,7 @@ afx_msg void OnEditSampleMap(); afx_msg void TogglePluginEditor(); //rewbs.instroVSTi afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void OnCbnSelchangeCombotuning(); afx_msg void OnEnChangeEditPitchtempolock(); afx_msg void OnBnClickedCheckPitchtempolock(); afx_msg void OnEnKillfocusEditPitchtempolock(); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -166,10 +166,13 @@ // Spin controls m_SpinSpacing.SetRange(0, 16); m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); + m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); + m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax()); m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins()); + SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing); SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins()); CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked @@ -178,6 +181,8 @@ UpdateView(HINT_MODTYPE|HINT_PATNAMES, NULL); RecalcLayout(); + + // -> CODE#0012 // -> DESC="midi keyboard split" //rewbs.merge: fix buffer overrun: @@ -222,6 +227,7 @@ m_bInitialized = TRUE; UnlockControls(); + return FALSE; } @@ -338,7 +344,7 @@ } m_pSndFile->GetPatternName(nPat, s, sizeof(s)); m_EditPatName.SetWindowText(s); - BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ToolBar.EnableButton(ID_PATTERN_MIDIMACRO, bXMIT); m_ToolBar.EnableButton(ID_PATTERN_PROPERTIES, bXMIT); m_ToolBar.EnableButton(ID_PATTERN_EXPAND, bXMIT); @@ -550,6 +556,7 @@ //----------------------------------------------- { CModDoc *pModDoc = GetDocument(); + CSoundFile* pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL; if ((pModDoc) && (m_pParent)) { @@ -560,28 +567,26 @@ } m_pParent->InstrumentChanged(-1); } - if ((lParam >= 0) && (lParam < MAX_PATTERNS)) + if ((lParam >= 0) && (lParam < m_pSndFile->Patterns.Size())) { - if (pModDoc) + if (pSndFile) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - for (UINT i=0; i<MAX_ORDERS; i++) + for (UINT i=0; i<pSndFile->Order.size(); i++) { if (pSndFile->Order[i] == (UINT)lParam) { m_OrderList.SetCurSel(i, TRUE); break; } - if (pSndFile->Order[i] == 0xFF) break; + if (pSndFile->Order[i] == pSndFile->Patterns.GetInvalidIndex()) break; } } SetCurrentPattern(lParam); } - else if ((lParam >= 0x8000) && (lParam < MAX_ORDERS + 0x8000)) + else if ((lParam >= 0x8000) && (lParam < pSndFile->Order.size() + 0x8000)) { - if (pModDoc) + if (pSndFile) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); lParam &= 0x7FFF; m_OrderList.SetCurSel(lParam); SetCurrentPattern(pSndFile->Order[lParam]); @@ -693,6 +698,8 @@ SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i); } + + void CCtrlPatterns::OnSpacingChanged() //------------------------------------ { @@ -822,13 +829,13 @@ UINT nCurOrd = m_OrderList.GetCurSel(); UINT pat = pSndFile->Order[nCurOrd]; UINT rows = 64; - if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[pat]; if (rows < 32) rows = 32; } LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >= 0) && (nNewPat < MAX_PATTERNS)) + if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size())) { m_OrderList.SetCurSel(nCurOrd+1); m_OrderList.InvalidateRect(NULL, FALSE); @@ -850,15 +857,15 @@ UINT nCurOrd = m_OrderList.GetCurSel(); UINT nCurPat = pSndFile->Order[nCurOrd]; UINT rows = 64; - if (nCurPat < MAX_PATTERNS) + if (nCurPat < pSndFile->Patterns.Size()) { - if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[nCurPat]; if (rows < 16) rows = 16; } LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >= 0) && (nNewPat < MAX_PATTERNS)) + if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size())) { MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat]; MODCOMMAND *pDest = pSndFile->Patterns[nNewPat]; @@ -1074,7 +1081,7 @@ if (strcmp(s, sold)) { m_pSndFile->SetPatternName(nPat, s); - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, (nPat << 24) | HINT_PATNAMES, this); } } @@ -1204,4 +1211,5 @@ return false; } + //end rewbs.instroVST \ No newline at end of file Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2007-03-14 00:19:33 UTC (rev 175) @@ -37,10 +37,14 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); - BYTE SetOrderlistMargins(int); //Returns the number that was set. + + //Returns the number that was set. + BYTE SetOrderlistMargins(int); BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;} - BYTE GetShownOrdersMax(); //Should return the maximum number of shown orders. + //Should return the maximum number of shown orders. + BYTE GetShownOrdersMax(); + public: //{{AFX_VIRTUAL(COrderList) virtual BOOL PreTranslateMessage(MSG *pMsg); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -105,7 +105,7 @@ UINT nPage; int nMax=0; - while ((nMax < MAX_ORDERS) && (pSndFile->Order[nMax] != 0xFF)) nMax++; + while ((nMax < pSndFile->Order.size()) && (pSndFile->Order[nMax] != pSndFile->Patterns.GetInvalidIndex())) nMax++; GetScrollInfo(SB_HORZ, &info, SIF_PAGE|SIF_RANGE); info.fMask = SIF_PAGE|SIF_RANGE; info.nMin = 0; @@ -166,9 +166,10 @@ //--------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); CRect rcClient; - if ((sel < 0) || (sel >= MAX_ORDERS) || (!m_pParent) || (!pMainFrm)) return FALSE; + if ((sel < 0) || (sel >= pSndFile->Order.size()) || (!m_pParent) || (!pMainFrm)) return FALSE; if (sel == m_nScrollPos) return TRUE; GetClientRect(&rcClient); InvalidateSelection(); @@ -195,9 +196,8 @@ InvalidateSelection(); if ((m_pParent) && (m_pModDoc) && (bEdit)) { - CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); UINT n = pSndFile->Order[m_nScrollPos]; - if ((n < MAX_PATTERNS) && (pSndFile->Patterns[n])) + if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n])) { BOOL bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc); if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP)) @@ -216,7 +216,11 @@ pSndFile->m_nCurrentPattern = m_nScrollPos; pSndFile->SetCurrentOrder(m_nScrollPos); pSndFile->m_dwSongFlags |= dwPaused; - if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); + //if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); + //Relabs.note: Commented above line for it seems to cause + //significant slowdown when changing patterns without + //pattern-loop enabled. What is it's purpose anyway? + if (bIsPlaying) pMainFrm->ResetNotificationBuffer(); END_CRITICAL(); } @@ -231,9 +235,9 @@ UINT COrderList::GetCurrentPattern() const //---------------------------------------- { - if ((m_pModDoc) && (m_nScrollPos < MAX_PATTERNS)) + CSoundFile* pSndFile = m_pModDoc ? m_pModDoc->GetSoundFile() : NULL; + if ((pSndFile) && (m_nScrollPos < pSndFile->Patterns.Size())) { - CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); return pSndFile->Order[m_nScrollPos]; } return 0; @@ -255,7 +259,7 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); int i = 0; - for (i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; + for (i=0; i<pSndFile->Order.size()-1; i++) if (pSndFile->Order[i+1] == pSndFile->Patterns.GetInvalidIndex()) break; SetCurSel(i); } break; @@ -288,10 +292,11 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); int ord = pSndFile->Order[m_nScrollPos]; int maxpat = 0; - for (int i=0; i<MAX_PATTERNS; i++) if (pSndFile->Patterns[i]) maxpat = i; + for (int i=0; i<pSndFile->Patterns.Size(); i++) if (pSndFile->Patterns[i]) maxpat = i; if ((nChar >= '0') && (nChar <= '9')) { - if (ord >= MAX_PATTERNS) ord = 0; + 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; @@ -299,18 +304,23 @@ if (nChar == '+') { ord++; - if (ord > 0xFF) ord = 0; else - if ((ord > maxpat) && (ord < 0xFE)) ord = 0xFE; + if(ord > pSndFile->Patterns.GetInvalidIndex()) + ord = 0; + else + { + if(ord > maxpat && ord < pSndFile->Patterns.GetIgnoreIndex()) + ord = pSndFile->Patterns.GetIgnoreIndex(); + } } else if (nChar == '-') { ord--; - if (ord < 0) ord = 0xFF; else - if ((ord > maxpat) && (ord < 0xFE)) ord = maxpat; + if (ord < 0) ord = pSndFile->Patterns.GetInvalidIndex(); else + if ((ord > maxpat) && (ord < pSndFile->Patterns.GetIgnoreIndex())) ord = maxpat; } if (ord != pSndFile->Order[m_nScrollPos]) { - pSndFile->Order[m_nScrollPos] = (BYTE)ord; + pSndFile->Order[m_nScrollPos] = static_cast<UINT>(ord); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); InvalidateSelection(); @@ -399,12 +409,20 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); s[0] = 0; - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position %02Xh of %02Xh" : "Position %d of %d", - m_nScrollPos, pSndFile->GetNumPatterns()); - if (m_nScrollPos < MAX_ORDERS) + if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) { + wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->GetNumPatterns()); + } + else + { + wsprintf(s, "Position %d of %d (%02Xh of %02Xh)", + m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns()); + } + + if (m_nScrollPos < pSndFile->Order.size()) + { UINT nPat = pSndFile->Order[m_nScrollPos]; - if ((nPat < MAX_PATTERNS) && (nPat < pSndFile->m_nPatternNames)) + if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNames)) { CHAR szpat[40] = ""; if (pSndFile->GetPatternName(nPat, szpat)) @@ -450,7 +468,7 @@ while (rect.left < rcClient.right) { BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE; - int nOrder = ((nIndex >= 0) && (nIndex < MAX_ORDERS)) ? pSndFile->Order[nIndex] : -1; + int nOrder = ((nIndex >= 0) && (nIndex < pSndFile->Order.size())) ? pSndFile->Order[nIndex] : -1; if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right; rect.right--; FillRect(dc.m_hDC, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow); @@ -482,9 +500,16 @@ s[0] = 0; if ((nOrder >= 0) && (rect.left + m_cxFont - 4 <= rcClient.right)) { - if (nOrder == 0xFF) strcpy(s, "---"); else - if (nOrder < MAX_PATTERNS) wsprintf(s, "%d", nOrder); - else strcpy(s, "+++"); + if (nOrder == pSndFile->Patterns.GetInvalidIndex()) strcpy(s, "---"); //Print the 'dots' + else + { + if (nOrder < pSndFile->Patterns.Size()) wsprintf(s, "%d", nOrder); + else + { + if(nOrder == pSndFile->Patterns.GetIgnoreIndex()) strcpy(s, "+++"); + else strcpy(s, "BUG"); + } + } } dc.SetTextColor((bHighLight) ? colorTextSel : colorText); dc.DrawText(s, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); @@ -531,7 +556,7 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); int nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((nOrder >= 0) && (nOrder < MAX_ORDERS)) + if ((nOrder >= 0) && (nOrder < pSndFile->Order.size())) { if (pSndFile->m_nSeqOverride == nOrder+1) { pSndFile->m_nSeqOverride=0; @@ -599,7 +624,7 @@ if (rect.PtInRect(pt)) { n = m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((n < 0) || (n >= MAX_ORDERS)) n = -1; + if ((n < 0) || (n >= m_pModDoc->GetSoundFile()->Order.size())) n = -1; } if (n != (int)m_nDropPos) { @@ -638,7 +663,7 @@ HMENU hMenu = ::CreatePopupMenu(); UINT nCurrentPattern = GetCurrentPattern(); - bool patternExists = (nCurrentPattern<MAX_PATTERNS + bool patternExists = (nCurrentPattern < m_pModDoc->GetSoundFile()->Patterns.Size() && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] != NULL); DWORD greyed = patternExists?FALSE:MF_GRAYED; @@ -651,7 +676,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"); - if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_PROPERTIES, "&Properties..."); @@ -729,7 +754,14 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - for (int i=MAX_ORDERS-1; i>m_nScrollPos; i--) pSndFile->Order[i] = pSndFile->Order[i-1]; + //Checking whether there is some pattern at the end of orderlist. + + if(pSndFile->Order[pSndFile->Order.size()-1] < pSndFile->Patterns.Size()) + { + if(pSndFile->Order.size() < pSndFile->Order.GetOrderNumberLimitMax()) + pSndFile->Order.push_back(pSndFile->Patterns.GetInvalidIndex()); + } + for (int i=pSndFile->Order.size()-1; i>m_nScrollPos; i--) pSndFile->Order[i] = pSndFile->Order[i-1]; InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); @@ -743,13 +775,13 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - for (int i=m_nScrollPos; i<MAX_ORDERS-1; i++) pSndFile->Order[i] = pSndFile->Order[i+1]; - pSndFile->Order[MAX_ORDERS-1] = 0xFF; + for (int i=m_nScrollPos; i<pSndFile->Order.size()-1; i++) pSndFile->Order[i] = pSndFile->Order[i+1]; + pSndFile->Order[pSndFile->Order.size()-1] = pSndFile->Patterns.GetInvalidIndex(); InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); UINT nNewOrd = pSndFile->Order[m_nScrollPos]; - if ((nNewOrd < MAX_PATTERNS) && (pSndFile->Patterns[nNewOrd]) && (m_pParent)) + if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]) && (m_pParent)) { m_pParent->SetCurrentPattern(nNewOrd); } @@ -837,11 +869,12 @@ CPoint pt; if ((!pDropInfo) || (!m_pModDoc) || (m_pModDoc != pDropInfo->pModDoc) || (!m_cxFont)) return FALSE; + pSndFile = m_pModDoc->GetSoundFile(); bCanDrop = FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_ORDER: - if (pDropInfo->dwDropItem >= MAX_ORDERS) break; + if (pDropInfo->dwDropItem >= pSndFile->Order.size()) break; case DRAGONDROP_PATTERN: bCanDrop = TRUE; break; @@ -851,12 +884,11 @@ ScreenToClient(&pt); if (pt.x < 0) pt.x = 0; posdest = m_nXScroll + (pt.x / m_cxFont); - if (posdest >= MAX_ORDERS) return FALSE; - pSndFile = m_pModDoc->GetSoundFile(); + if (posdest >= pSndFile->Order.size()) return FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_PATTERN: - pSndFile->Order[posdest] = (BYTE)pDropInfo->dwDropItem; + pSndFile->Order[posdest] = static_cast<UINT>(pDropInfo->dwDropItem); break; case DRAGONDROP_ORDER: Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -527,7 +527,7 @@ m_ComboSustainType.AddString("Off"); m_ComboSustainType.AddString("On"); // Bidirectional Loops - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { m_ComboLoopType.AddString("Bidi"); m_ComboSustainType.AddString("Bidi"); @@ -545,19 +545,19 @@ m_SpinSustainEnd.SetRange(-1, 1); m_SpinSustainEnd.SetPos(0); // Sustain Loops only available in IT - b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ComboSustainType.EnableWindow(b); m_SpinSustainStart.EnableWindow(b); m_SpinSustainEnd.EnableWindow(b); m_EditSustainStart.EnableWindow(b); m_EditSustainEnd.EnableWindow(b); // Finetune / C-4 Speed / BaseNote - b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; SetDlgItemText(IDC_TEXT7, (b) ? "Freq. (Hz)" : "Finetune"); m_SpinFineTune.SetRange(-1, 1); m_EditFileName.EnableWindow(b); // AutoVibrato - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ComboAutoVib.EnableWindow(b); m_SpinVibSweep.EnableWindow(b); m_SpinVibDepth.EnableWindow(b); @@ -566,11 +566,11 @@ m_EditVibDepth.EnableWindow(b); m_EditVibRate.EnableWindow(b); // Global Volume - b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_EditGlobalVol.EnableWindow(b); m_SpinGlobalVol.EnableWindow(b); // Panning - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_CheckPanning.EnableWindow(b); m_EditPanning.EnableWindow(b); m_SpinPanning.EnableWindow(b); @@ -609,7 +609,7 @@ //end rewbs.fix36944 // FineTune / C-4 Speed / BaseNote int transp = 0; - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { wsprintf(s, "%lu", pins->nC4Speed); m_EditFineTune.SetWindowText(s); @@ -893,7 +893,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Samples|*.wav;*.pat;*.s3i;*.smp;*.snd;*.raw;*.xi;*.aif;*.aiff;*.its;*.8sv;*.8svx;*.svx;*.pcm|" "Wave Files (*.wav)|*.wav|" "XI Samples (*.xi)|*.xi|" @@ -909,9 +909,38 @@ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurSmpDir; } dlg.m_ofn.nFilterIndex = nLastIndex; + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; + nLastIndex = dlg.m_ofn.nFilterIndex; - if (!OpenSample(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple samples, advancing to next sample and creating + //new one if necessary. + if(counter > 0) + { + if(m_nSample >= MAX_SAMPLES-1) + break; + else + m_nSample++; + + if(m_nSample > m_pSndFile->GetNumSamples()) + OnSampleNew(); + } + + if(!OpenSample(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); SwitchToView(); } @@ -926,7 +955,7 @@ SwitchToView(); return; } - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { memcpy(szFileName, m_pSndFile->Ins[m_nSample].name, 22); szFileName[22] = 0; @@ -2166,7 +2195,7 @@ memcpy(m_pSndFile->Ins[m_nSample].name, s, 22); // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] m_pModDoc->UpdateAllViews(NULL, (m_nSample << 20) | HINT_SAMPLEINFO, this); - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2207,7 +2236,7 @@ { if (IsLocked()) return; BOOL b = FALSE; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { b = IsDlgButtonChecked(IDC_CHECK1); } @@ -2216,14 +2245,14 @@ if (!(m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING)) { m_pSndFile->Ins[m_nSample].uFlags |= CHN_PANNING; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } else { if (m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING) { m_pSndFile->Ins[m_nSample].uFlags &= ~CHN_PANNING; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType == (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } } @@ -2246,7 +2275,7 @@ if (nPan != m_pSndFile->Ins[m_nSample].nPan) { m_pSndFile->Ins[m_nSample].nPan = nPan; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2256,7 +2285,7 @@ { if (IsLocked()) return; int n = GetDlgItemInt(IDC_EDIT5); - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M)) + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC4Speed)) { @@ -2290,7 +2319,7 @@ { if (IsLocked()) return; int n = 60 - (m_CbnBaseNote.GetCurSel() + BASENOTE_MIN); - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M)) + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Ins[m_nSample].nC4Speed) & 0x7f; n = CSoundFile::TransposeToFrequency(n, ft); @@ -2724,7 +2753,7 @@ // FineTune / C-5 Speed if ((pos = (short int)m_SpinFineTune.GetPos()) != 0) { - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { LONG d = pins->nC4Speed; if (d < 1) d = 8363; @@ -2790,6 +2819,7 @@ } LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +//---------------------------------------------------------------- { if (wParam == kcNull) return NULL; Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -7,7 +7,11 @@ #include "view_pat.h" #include "EffectVis.h" //rewbs.fxvis #include "ChannelManagerDlg.h" +#include "../soundlib/tuning_template.h" +#include <string> +using std::string; + // Headers #define ROWHDR_WIDTH 32 // Row header #define COLHDR_HEIGHT 16 // Column header @@ -284,16 +288,24 @@ srcy = pfnt->nAlphaNZ_Y + 15 * COLUMN_HEIGHT; break; //end rewbs.velocity - + case ' ': + srcx = pfnt->nClrX; + srcy = pfnt->nClrY; + break; + case '-': + srcx = pfnt->nNoteX + pfnt->nNoteWidth/2; + srcy = pfnt->nNoteY + COLUMN_HEIGHT; + break; } m_Dib.TextBlt(x, y, sizex, COLUMN_HEIGHT, srcx+ofsx, srcy); } -void CViewPattern::DrawNote(int x, int y, UINT note) -//-------------------------------------------------- +void CViewPattern::DrawNote(int x, int y, UINT note, CTuning* pTuning) +//--------------------------------------------------------------------------- { PCPATTERNFONT pfnt = GetCurrentPatternFont(); + UINT xsrc = pfnt->nNoteX, ysrc = pfnt->nNoteY, dx = pfnt->nEltWidths[0]; if (!note) { @@ -308,11 +320,22 @@ m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT); } else { - UINT o = (note-1) / 12; - UINT n = (note-1) % 12; - m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COLUMN_HEIGHT); - m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT, - pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT); + if(pTuning) + { + string noteStr = pTuning->GetNoteName(static_cast<CTuning::STEPTYPE>(note-NOTE_MIDDLEC)); + noteStr.resize(3, ' '); + DrawLetter(x, y, noteStr[0]); + DrawLetter(x + pfnt->nNoteWidth/2, y, noteStr[1]); + DrawLetter(x + pfnt->nNoteWidth, y, noteStr[2]); + } + else //Original + { + UINT o = (note-1) / 12; //Octave + UINT n = (note-1) % 12; //Note + m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COLUMN_HEIGHT); + m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT, + pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT); + } } } @@ -407,7 +430,7 @@ const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]? "[Channel %d]" : "Channel %d"; // const char *pszfmt = pModDoc->IsChannelRecord(ncolhdr) ? "Channel %d " : "Channel %d"; // -! NEW_FEATURE#0012 - if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) + if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"%d: [%s]":"%d: %s"; else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Ch%d]":"Ch%d"; else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Chn %d]":"Chn %d"; @@ -491,13 +514,13 @@ { UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder > 0) && (nCurOrder < MAX_ORDERS) && (pSndFile->Order[nCurOrder] == m_nPattern)) + if ((nCurOrder > 0) && (nCurOrder < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder] == m_nPattern)) { nPrevPat = pSndFile->Order[nCurOrder-1]; bPrevPatFound = TRUE; } } - if ((bPrevPatFound) && (nPrevPat < MAX_PATTERNS) && (pSndFile->Patterns[nPrevPat])) + if ((bPrevPatFound) && (nPrevPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nPrevPat])) { UINT nPrevRows = pSndFile->PatternSize[nPrevPat]; UINT n = (nSkip < nPrevRows) ? nSkip : nPrevRows; @@ -535,12 +558,12 @@ BOOL bNextPatFound = FALSE; UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder+1 < MAX_ORDERS) && (pSndFile->Order[nCurOrder] == m_nPattern)) + if ((nCurOrder+1 < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder] == m_nPattern)) { nNextPat = pSndFile->Order[nCurOrder+1]; bNextPatFound = TRUE; } - if ((bNextPatFound) && (nNextPat < MAX_PATTERNS) && (pSndFile->Patterns[nNextPat])) + if ((bNextPatFound) && (nNextPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNextPat])) { UINT nNextRows = pSndFile->PatternSize[nNextPat]; UINT n = ((UINT)nVisRows < nNextRows) ? nVisRows : nNextRows; @@ -757,7 +780,10 @@ } // Drawing note m_Dib.SetTextColor(tx_col, bk_col); - DrawNote(xbmp+x, 0, m->note); + if(pSndFile->m_nType == MOD_TYPE_MPT && m->instr < MAX_INSTRUMENTS && pSndFile->Headers[m->instr]) + DrawNote(xbmp+x, 0, m->note, pSndFile->Headers[m->instr]->pTuning); + else //Original + DrawNote(xbmp+x, 0, m->note); } x += pfnt->nEltWidths[0]; // Instrument Modified: trunk/OpenMPT/mptrack/Globals.cpp =================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Globals.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -395,7 +395,7 @@ UINT nType = pSndFile->GetType(); UINT mask = 1 | 2 | 4 | 16; - if (nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { mask |= 8; //mask |= 32; //rewbs.graph Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -229,9 +229,9 @@ for (int c=kcClearRow; c<=kcInsertAllRows; c++) newCat->commands.Add(c); newCat->separators.Add(kcInsertAllRows); //-------------------------------------- - for (int c=kcChannelMute; c<=kcToggleChanMuteOnPatTransition; c++) + for (int c=kcChannelMute; c<=kcSoloChnOnPatTransition; c++) newCat->commands.Add(c); - newCat->separators.Add(kcToggleChanMuteOnPatTransition); //-------------------------------------- + newCat->separators.Add(kcSoloChnOnPatTransition); //-------------------------------------- for (int c=kcTransposeUp; c<=kcTransposeOctDown; c++) newCat->commands.Add(c); newCat->separators.Add(kcTransposeOctDown); //-------------------------------------- Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2007-03-14 00:19:33 UTC (rev 175) @@ -352,6 +352,8 @@ m_InputHandler = new CInputHandler(this); //rewbs.customKeys m_pPerfCounter= new CPerformanceCounter(); + //Loading static tunings here - probably not the best place to do that but anyway. + CSoundFile::LoadStaticTunings(); } void CMainFrame::LoadIniSettings() @@ -644,6 +646,8 @@ delete m_InputHandler; //rewbs.customKeys delete m_pAutoSaver; //rewbs.autosaver delete m_pPerfCounter; + + CChannelManagerDlg::DestroySharedInstance(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) @@ -1988,11 +1992,9 @@ m_WaveFile.m_nSamples = 1; m_WaveFile.Order[0] = 0; m_WaveFile.Order[1] = 1; - m_WaveFile.Order[2] = 0xFF; - m_WaveFile.PatternSize[0] = 64; - m_WaveFile.PatternSize[1] = 64; - m_WaveFile.Patterns[0] = CSoundFile::AllocatePattern(64, 4); - m_WaveFile.Patterns[1] = CSoundFile::AllocatePattern(64, 4); + m_WaveFile.Order[2] = m_WaveFile.Patterns.GetInvalidIndex(); + m_WaveFile.Patterns.Insert(0,64); + m_WaveFile.Patterns.Insert(1,64); if (m_WaveFile.Patterns[0]) { if (!nNote) nNote = 5*12+1; @@ -2063,11 +2065,9 @@ } m_WaveFile.Order[0] = 0; m_WaveFile.Order[1] = 1; - m_WaveFile.Order[2] = 0xFF; - m_WaveFile.PatternSize[0] = 64; - m_WaveFile.PatternSize[1] = 64; - m_WaveFile.Patterns[0] = CSoundFile::AllocatePattern(64, 4); - m_WaveFile.Patterns[1] = CSoundFile::AllocatePattern(64, 4); + m_WaveFile.Order[2] = m_WaveFile.Patterns.GetInvalidIndex(); + m_WaveFile.Patterns.Insert(0, 64); + m_WaveFile.Patterns.Insert(1, 64); if (m_WaveFile.Patterns[0]) { if (!nNote) nNote = 5*12+1; @@ -2543,7 +2543,7 @@ if (m_pSndFile != &m_WaveFile) { UINT nPat = m_pSndFile->m_nPattern; - if (nPat < MAX_PATTERNS) + if(nPat < m_pSndFile->Patterns.Size()) { if (nPat < 10) strcat(s, " "); if (nPat < 100) strcat(s, " "); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2007-03-13 22:14:22 UTC (rev 174) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2007... [truncated message content] |
From: <re...@us...> - 2007-03-13 22:14:26
|
Revision: 174 http://svn.sourceforge.net/modplug/?rev=174&view=rev Author: rewbs Date: 2007-03-13 15:14:22 -0700 (Tue, 13 Mar 2007) Log Message: ----------- . v1.17.02.46 (in progress, no binary yet) / <rewbs> internal: renamed m_nSongPreAmp to m_nSamplePreAmp, to avoid confusion with global preamp. / <rewbs> internal: stubs for launching scripted pattern transforms. + <rewbs> new mixmode: bypass global preamp, provide explicit dB value for sample attenuation. WARNING: subject to change. + <rewbs> SCx now sends note off to VSTis at tick x. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp trunk/OpenMPT/mptrack/SoundFilePlayConfig.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -6,6 +6,7 @@ #include "dlg_misc.h" #include "ctrl_gen.h" #include "view_gen.h" +#include "math.h" // -> CODE#0015 // -> DESC="channels management dlg" @@ -58,7 +59,7 @@ DDX_Control(pDX, IDC_SLIDER_SONGTEMPO, m_SliderTempo); DDX_Control(pDX, IDC_SLIDER_VSTIVOL, m_SliderVSTiVol); DDX_Control(pDX, IDC_SLIDER_GLOBALVOL, m_SliderGlobalVol); - DDX_Control(pDX, IDC_SLIDER_SONGPREAMP, m_SliderPreAmp); + DDX_Control(pDX, IDC_SLIDER_SAMPLEPREAMP, m_SliderSamplePreAmp); DDX_Control(pDX, IDC_EDIT_MODTYPE, m_EditModType); DDX_Control(pDX, IDC_COMBO_RESAMPLING, m_ComboResampling); @@ -91,12 +92,13 @@ m_SpinVSTiVol.SetRange(0, 2000); m_SpinRestartPos.SetRange(0, 255); - m_SliderPreAmp.SetRange(0, 500); m_SliderTempo.SetRange(0, 480); - m_SliderVSTiVol.SetRange(0, 500); - m_SliderGlobalVol.SetRange(0, 256); + m_SliderGlobalVol.SetRange(0, MAX_SLIDER_GLOBAL_VOL); + m_SliderVSTiVol.SetRange(0, MAX_SLIDER_VSTI_VOL); + m_SliderSamplePreAmp.SetRange(0, MAX_SLIDER_SAMPLE_VOL); + // -! BEHAVIOUR_CHANGE#0016 m_ComboResampling.AddString("None"); m_ComboResampling.AddString("Linear"); @@ -174,15 +176,15 @@ m_EditRestartPos.SetWindowText(s); wsprintf(s, "%d", m_pSndFile->m_nVSTiVolume); m_EditVSTiVol.SetWindowText(s); - wsprintf(s, "%d", m_pSndFile->m_nSongPreAmp); + wsprintf(s, "%d", m_pSndFile->m_nSamplePreAmp); m_EditSamplePA.SetWindowText(s); wsprintf(s, "%d", m_pSndFile->m_nRestartPos); m_EditRestartPos.SetWindowText(s); } - m_SliderGlobalVol.SetPos(256-m_pSndFile->m_nDefaultGlobalVolume); - m_SliderVSTiVol.SetPos(500-m_pSndFile->m_nVSTiVolume); - m_SliderPreAmp.SetPos(500-m_pSndFile->m_nSongPreAmp); + m_SliderGlobalVol.SetPos(MAX_SLIDER_GLOBAL_VOL-m_pSndFile->m_nDefaultGlobalVolume); + m_SliderVSTiVol.SetPos(MAX_SLIDER_VSTI_VOL-m_pSndFile->m_nVSTiVolume); + m_SliderSamplePreAmp.SetPos(MAX_SLIDER_SAMPLE_VOL-m_pSndFile->m_nSamplePreAmp); m_SliderTempo.SetPos(480 - m_pSndFile->m_nDefaultTempo + 32); @@ -202,7 +204,7 @@ m_SpinVSTiVol.EnableWindow(b); m_EditSamplePA.EnableWindow(b); m_SpinSamplePA.EnableWindow(b); - m_SliderPreAmp.EnableWindow(b); + m_SliderSamplePreAmp.EnableWindow(b); m_SliderVSTiVol.EnableWindow(b); // MOD Type @@ -259,8 +261,8 @@ } else if (pSlider==&m_SliderGlobalVol) { - int gv = 256 - m_SliderGlobalVol.GetPos(); - if ((gv >= 0) && (gv <= 256) && (gv != m_pSndFile->m_nDefaultGlobalVolume)) { + int gv = MAX_SLIDER_GLOBAL_VOL - m_SliderGlobalVol.GetPos(); + if ((gv >= 0) && (gv <= MAX_SLIDER_GLOBAL_VOL) && (gv != m_pSndFile->m_nDefaultGlobalVolume)) { m_pSndFile->m_nGlobalVolume = gv; m_pSndFile->m_nDefaultGlobalVolume = gv; m_pModDoc->SetModified(); @@ -268,18 +270,18 @@ } } - else if (pSlider==&m_SliderPreAmp) { - int spa = 500 - m_SliderPreAmp.GetPos(); - if ((spa >= 0) && (spa <= 500) && (spa != m_pSndFile->m_nSongPreAmp)) { - m_pSndFile->m_nSongPreAmp = spa; + else if (pSlider==&m_SliderSamplePreAmp) { + int spa = MAX_SLIDER_SAMPLE_VOL - m_SliderSamplePreAmp.GetPos(); + if ((spa >= 0) && (spa <= MAX_SLIDER_SAMPLE_VOL) && (spa != m_pSndFile->m_nSamplePreAmp)) { + m_pSndFile->m_nSamplePreAmp = spa; m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); } } else if (pSlider==&m_SliderVSTiVol) { - int vv = 500 - m_SliderVSTiVol.GetPos(); - if ((vv >= 0) && (vv <= 500) && (vv != m_pSndFile->m_nVSTiVolume)) { + int vv = MAX_SLIDER_VSTI_VOL - m_SliderVSTiVol.GetPos(); + if ((vv >= 0) && (vv <= MAX_SLIDER_VSTI_VOL) && (vv != m_pSndFile->m_nVSTiVolume)) { m_pSndFile->m_nVSTiVolume = vv; m_pSndFile->RecalculateGainForAllPlugs(); m_pModDoc->SetModified(); @@ -392,9 +394,9 @@ m_EditSamplePA.GetWindowText(s, sizeof(s)); if (s[0]) { int n = atoi(s); - if ((n >= 0) && (n <= 2000) && (n != m_pSndFile->m_nSongPreAmp)) { + if ((n >= 0) && (n <= 2000) && (n != m_pSndFile->m_nSamplePreAmp)) { m_bEditsLocked=true; - m_pSndFile->m_nSongPreAmp = n; + m_pSndFile->m_nSamplePreAmp = n; m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); UpdateView(HINT_MODGENERAL, NULL); @@ -607,7 +609,54 @@ } +BOOL CCtrlGeneral::GetToolTipText(UINT uId, LPSTR pszText) { +//---------------------------------------------------------- + if ((pszText) && (uId)) + { + if (!m_pSndFile->m_pConfig->getDisplayDBValues()) { + wsprintf(pszText, "Use a more recent mixmode to see dB offsets."); + return TRUE; + } + + switch(uId) { + case IDC_SLIDER_SAMPLEPREAMP: + setAsDecibels(pszText, m_pSndFile->m_nSamplePreAmp, m_pSndFile->m_pConfig->getNormalSamplePreAmp()); + return TRUE; + break; + case IDC_SLIDER_VSTIVOL: + setAsDecibels(pszText, m_pSndFile->m_nVSTiVolume, m_pSndFile->m_pConfig->getNormalVSTiVol()); + return TRUE; + break; + case IDC_SLIDER_GLOBALVOL: + setAsDecibels(pszText, m_pSndFile->m_nGlobalVolume, m_pSndFile->m_pConfig->getNormalGlobalVol()); + return TRUE; + break; + } + } + return FALSE; + +} + +void CCtrlGeneral::setAsDecibels(LPSTR stringToSet, double value, double valueAtZeroDB) { +//------------------------------------------------------------------------------------- + + if (value==0) { + wsprintf(stringToSet, "-inf"); + return; + } + + double changeFactor = value / valueAtZeroDB; + double dB = 10*log(changeFactor); + + char sign = (dB>=0)?'+':' '; + sprintf(stringToSet, "%c%.2f dB", sign, dB); + return; + +} + + + //////////////////////////////////////////////////////////////////////////////// // // CVuMeter @@ -672,3 +721,5 @@ SelectObject(hdc, oldpen); m_nDisplayedVu = m_nVuMeter; } + + Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h 2007-03-13 22:14:22 UTC (rev 174) @@ -20,7 +20,13 @@ DECLARE_MESSAGE_MAP(); }; +enum { + MAX_SLIDER_GLOBAL_VOL=256, + MAX_SLIDER_VSTI_VOL=256, + MAX_SLIDER_SAMPLE_VOL=256 +}; + //======================================= class CCtrlGeneral: public CModControlDlg //======================================= @@ -29,6 +35,9 @@ CCtrlGeneral(); LONG* GetSplitPosRef() {return &CMainFrame::glGeneralWindowHeight;} //rewbs.varWindowSize +private: + void setAsDecibels(LPSTR stringToSet, double value, double valueAtZeroDB); + public: bool m_bEditsLocked; //{{AFX_DATA(CCtrlGeneral) @@ -39,7 +48,7 @@ CSpinButtonCtrl m_SpinTempo, m_SpinSpeed, m_SpinGlobalVol, m_SpinRestartPos, m_SpinSamplePA, m_SpinVSTiVol; - CSliderCtrl m_SliderTempo, m_SliderPreAmp, m_SliderGlobalVol, m_SliderVSTiVol; + CSliderCtrl m_SliderTempo, m_SliderSamplePreAmp, m_SliderGlobalVol, m_SliderVSTiVol; CComboBox m_ComboResampling; CVuMeter m_VuMeterLeft, m_VuMeterRight; //}}AFX_DATA @@ -51,6 +60,7 @@ virtual CRuntimeClass *GetAssociatedViewClass(); virtual void OnActivatePage(LPARAM); virtual void OnDeactivatePage(); + virtual BOOL GetToolTipText(UINT uId, LPSTR pszText); //}}AFX_VIRTUAL protected: //{{AFX_MSG(CCtrlGeneral) Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -1973,7 +1973,13 @@ StopSoundFile(&m_WaveFile); m_WaveFile.Destroy(); m_WaveFile.Create(NULL, 0); + + //Avoid global volume ramping when trying samples in the treeview. + m_WaveFile.m_pConfig->setGlobalVolumeAppliesToMaster(false); + m_WaveFile.m_nDefaultGlobalVolume=64; + m_WaveFile.m_nDefaultTempo = 125; + m_WaveFile.m_nGlobalVolume=64; m_WaveFile.m_nDefaultSpeed = 4; m_WaveFile.m_nRepeatCount = 0; m_WaveFile.m_nType = MOD_TYPE_IT; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -604,7 +604,7 @@ strcpy(m_SndFile.m_szNames[0], "untitled"); m_SndFile.m_nMusicTempo = m_SndFile.m_nDefaultTempo = 125; m_SndFile.m_nMusicSpeed = m_SndFile.m_nDefaultSpeed = 6; - m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 128; + m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 256; for (UINT init=0; init<MAX_BASECHANNELS; init++) { m_SndFile.ChnSettings[init].dwFlags = 0; Modified: trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp =================================================================== --- trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/SoundFilePlayConfig.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -3,7 +3,7 @@ CSoundFilePlayConfig::CSoundFilePlayConfig(void) { - SetPluginMixLevels(plugmix_mode_117RC2); + SetPluginMixLevels(plugmix_mode_117RC3); setVSTiVolume(1.0f); } @@ -20,6 +20,12 @@ setIntToFloat(1.0f/static_cast<float>(1<<28)); setFloatToInt(static_cast<float>(1<<28)); setGlobalVolumeAppliesToMaster(false); + setUseGlobalPreAmp(true); + setTreatPanLikeBalance(false); + setDisplayDBValues(false); + setNormalSamplePreAmp(128.0); + setNormalVSTiVol(100.0); + setNormalGlobalVol(128.0); break; // Ericus' version gives us floats in [-0.06;0.06] and requires attenuation to @@ -29,18 +35,29 @@ setIntToFloat(1.0f/static_cast<float>(0x07FFFFFFF)); setFloatToInt(static_cast<float>(0x07FFFFFFF)); setGlobalVolumeAppliesToMaster(false); + setUseGlobalPreAmp(true); + setTreatPanLikeBalance(false); + setDisplayDBValues(false); + setNormalSamplePreAmp(128.0); + setNormalVSTiVol(100.0); + setNormalGlobalVol(128.0); break; // FOR TEST PURPOSES ONLY: case plugmix_mode_Test: - setVSTiAttenuation(2.0f); + setVSTiAttenuation(1.0f); setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); setFloatToInt(static_cast<float>(MIXING_CLIPMAX)); - setGlobalVolumeAppliesToMaster(false); + setGlobalVolumeAppliesToMaster(true); + setUseGlobalPreAmp(false); + setTreatPanLikeBalance(true); + setDisplayDBValues(true); + setNormalSamplePreAmp(128.0); + setNormalVSTiVol(128.0); + setNormalGlobalVol(256.0); break; - - // 117RC2 applies Rewbs' version gives us floats in [-1.0; 1.0] and hopefully plays VSTis at + // 117RC2 gives us floats in [-1.0; 1.0] and hopefully plays VSTis at // the right volume... but we attenuate by 2x to approx. match sample volume. default: case plugmix_mode_117RC2: @@ -48,6 +65,28 @@ setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); setFloatToInt(static_cast<float>(MIXING_CLIPMAX)); setGlobalVolumeAppliesToMaster(true); + setUseGlobalPreAmp(true); + setTreatPanLikeBalance(false); + setDisplayDBValues(false); + setNormalSamplePreAmp(128.0); + setNormalVSTiVol(100.0); + setNormalGlobalVol(128.0); + + // 117RC3 ignores the horrible global, system-specific pre-amp, + // treats panning as balance to avoid saturation on loud sample (and because I think it's better :), + // and allows display of attenuation in decibels. + case plugmix_mode_117RC3: + setVSTiAttenuation(1.0f); + setIntToFloat(1.0f/static_cast<float>(MIXING_CLIPMAX)); + setFloatToInt(static_cast<float>(MIXING_CLIPMAX)); + setGlobalVolumeAppliesToMaster(true); + setUseGlobalPreAmp(false); + setTreatPanLikeBalance(true); + setDisplayDBValues(true); + setNormalSamplePreAmp(128.0); + setNormalVSTiVol(128.0); + setNormalGlobalVol(256.0); + break; } return; @@ -57,12 +96,12 @@ //getters and setters. bool CSoundFilePlayConfig::getGlobalVolumeAppliesToMaster() { - return m_bGlobalVolumeAppliesToMaster; + return m_globalVolumeAppliesToMaster; } void CSoundFilePlayConfig::setGlobalVolumeAppliesToMaster(bool inGlobalVolumeAppliesToMaster){ - m_bGlobalVolumeAppliesToMaster=inGlobalVolumeAppliesToMaster; + m_globalVolumeAppliesToMaster=inGlobalVolumeAppliesToMaster; } float CSoundFilePlayConfig::getVSTiGainFactor() { @@ -105,3 +144,54 @@ m_FloatToInt=inFloatToInt; } +bool CSoundFilePlayConfig::getUseGlobalPreAmp() { + return m_ignorePreAmp; +} + +void CSoundFilePlayConfig::setUseGlobalPreAmp(bool inUseGlobalPreAmp) { + m_ignorePreAmp=inUseGlobalPreAmp; +} + + +bool CSoundFilePlayConfig::getTreatPanLikeBalance() { + return m_treatPanLikeBalance; +} + +void CSoundFilePlayConfig::setTreatPanLikeBalance(bool inTreatPanLikeBalance) { + m_treatPanLikeBalance=inTreatPanLikeBalance; +} + +void CSoundFilePlayConfig::setDisplayDBValues(bool in) { + m_displayDBValues=in; +} + +void CSoundFilePlayConfig::setNormalSamplePreAmp(double in) { + m_normalSamplePreAmp=in; +} + +void CSoundFilePlayConfig::setNormalVSTiVol(double in) { + m_normalVSTiVol=in; +} + +void CSoundFilePlayConfig::setNormalGlobalVol(double in) { + m_normalGlobalVol=in; +} + +bool CSoundFilePlayConfig::getDisplayDBValues() { + return m_displayDBValues; +} + +double CSoundFilePlayConfig::getNormalSamplePreAmp() { + return m_normalSamplePreAmp; +} + +double CSoundFilePlayConfig::getNormalVSTiVol() { + return m_normalVSTiVol; +} + +double CSoundFilePlayConfig::getNormalGlobalVol() { + return m_normalGlobalVol; +} + + + Modified: trunk/OpenMPT/mptrack/SoundFilePlayConfig.h =================================================================== --- trunk/OpenMPT/mptrack/SoundFilePlayConfig.h 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/SoundFilePlayConfig.h 2007-03-13 22:14:22 UTC (rev 174) @@ -16,7 +16,8 @@ plugmix_mode_original = 0, plugmix_mode_117RC1 = 1, plugmix_mode_117RC2 = 2, - plugmix_mode_Test = 3, + plugmix_mode_117RC3 = 3, + plugmix_mode_Test = 4, }; // Class used to store settings for a song file. @@ -34,30 +35,55 @@ float getFloatToInt(); void setFloatToInt(float); + // default VSTi gain factor, different depending on the MPT version we're "emulating" void setVSTiAttenuation(float); float getVSTiAttenuation(); + + // user-controllable VSTi gain factor. void setVSTiVolume(float); float getVSTiVolume(); - void setGlobalVolumeAppliesToMaster(bool); + void setGlobalVolumeAppliesToMaster(bool); bool getGlobalVolumeAppliesToMaster(); + void setUseGlobalPreAmp(bool); + bool getUseGlobalPreAmp(); -//calculated internally (getters only): - float getVSTiGainFactor(); + void setTreatPanLikeBalance(bool); + bool getTreatPanLikeBalance(); + void setDisplayDBValues(bool); + bool getDisplayDBValues(); + //Values at which volumes are unchanged + double getNormalSamplePreAmp(); + double getNormalVSTiVol(); + double getNormalGlobalVol(); + void setNormalSamplePreAmp(double); + void setNormalVSTiVol(double); + void setNormalGlobalVol(double); -// private: + +//calculated internally (getters only): + float getVSTiGainFactor(); + float m_IntToFloat; float m_FloatToInt; - float m_VSTiAttenuation; // default VSTi gain factor, different depending on the MPT version we're "emulating" - float m_VSTiVolume; // user-controllable VSTi gain factor. + float m_VSTiAttenuation; + float m_VSTiVolume; float m_VSTiGainFactor; // always m_VSTiAttenuation * m_VSTiVolume. No public setter. - bool m_bGlobalVolumeAppliesToMaster; + float m_normalSamplePreAmp; + float m_normalVSTiVol; + float m_normalGlobalVol; + bool m_globalVolumeAppliesToMaster; + bool m_ignorePreAmp; + bool m_treatPanLikeBalance; + bool m_displayDBValues; + DWORD m_LastSavedWithVersion; DWORD m_CreatedWithVersion; }; + Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -79,6 +79,7 @@ ON_COMMAND(ID_PREVORDER, OnPrevOrder) ON_COMMAND(ID_NEXTORDER, OnNextOrder) ON_COMMAND(IDC_PATTERN_RECORD, OnPatternRecord) + ON_COMMAND(ID_RUN_SCRIPT, OnRunScript) ON_COMMAND(ID_TRANSPOSE_UP, OnTransposeUp) ON_COMMAND(ID_TRANSPOSE_DOWN, OnTransposeDown) ON_COMMAND(ID_TRANSPOSE_OCTUP, OnTransposeOctUp) @@ -2447,7 +2448,13 @@ EndWaitCursor(); } +void CViewPattern::OnRunScript() +//-------------------------------- +{ + ; +} + void CViewPattern::OnTransposeUp() //-------------------------------- { @@ -4525,6 +4532,8 @@ CArray<UINT, UINT> validChans; DWORD greyed = (ListChansWhereColSelected(NOTE_COLUMN, validChans)>0)?FALSE:MF_GRAYED; + //AppendMenu(hMenu, MF_STRING, ID_RUN_SCRIPT, "Run script"); + if (!greyed || !(CMainFrame::m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) { AppendMenu(hMenu, MF_STRING|greyed, ID_TRANSPOSE_UP, "Transpose +1\t" + ih->GetKeyTextFromCommand(kcTransposeUp)); AppendMenu(hMenu, MF_STRING|greyed, ID_TRANSPOSE_DOWN, "Transpose -1\t" + ih->GetKeyTextFromCommand(kcTransposeDown)); Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/View_pat.h 2007-03-13 22:14:22 UTC (rev 174) @@ -266,6 +266,7 @@ afx_msg void OnInterpolateNote(); afx_msg void OnVisualizeEffect(); //rewbs.fxvis afx_msg void OnOpenRandomizer(); //rewbs.fxvis + afx_msg void OnRunScript(); afx_msg void OnTransposeUp(); afx_msg void OnTransposeDown(); afx_msg void OnTransposeOctUp(); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -2035,7 +2035,7 @@ if (m_bIsInstrument) { gain /= m_pSndFile->m_pConfig->getVSTiAttenuation(); - gain *= (m_pSndFile->m_nVSTiVolume / 100.0f); + gain *= (m_pSndFile->m_nVSTiVolume / m_pSndFile->m_pConfig->getNormalVSTiVol()); } m_fGain = gain; } @@ -2091,6 +2091,7 @@ } } */ + void CVstPlugin::Process(float *pOutL, float *pOutR, unsigned long nSamples) //-------------------------------------------------------------------------- { Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/bin/version 2007-03-13 22:14:22 UTC (rev 174) @@ -1 +1 @@ -1.17.02.45 \ No newline at end of file +1.17.02.46 \ No newline at end of file Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -248,21 +248,21 @@ default: m_TempoModeBox.SetCurSel(0); break; } + m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC3"), plugmix_mode_117RC3); m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC2"), plugmix_mode_117RC2); m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC1"), plugmix_mode_117RC1); m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Original"), plugmix_mode_original); -// m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Test"), plugmix_mode_Test); + m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Test"), plugmix_mode_Test); switch(m_pSndFile->m_nPlugMixMode) { - case plugmix_mode_original: m_PlugMixBox.SetCurSel(2); break; - case plugmix_mode_117RC1: m_PlugMixBox.SetCurSel(1); break; -// case plugmix_mode_Test: m_PlugMixBox.SetCurSel(3); break; - case plugmix_mode_117RC2: + //case plugmix_mode_Test: m_PlugMixBox.SetCurSel(3); break; + case plugmix_mode_original: m_PlugMixBox.SetCurSel(3); break; + case plugmix_mode_117RC1: m_PlugMixBox.SetCurSel(2); break; + case plugmix_mode_117RC2: m_PlugMixBox.SetCurSel(1); break; + case plugmix_mode_117RC3: default: m_PlugMixBox.SetCurSel(0); break; } -; - SetDlgItemText(IDC_EDIT5, "Created with:"); SetDlgItemText(IDC_EDIT6, "Last saved with:"); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/mptrack.rc 2007-03-13 22:14:22 UTC (rev 174) @@ -542,21 +542,22 @@ GROUPBOX "",IDC_STATIC,83,14,175,78 LTEXT "Initial global vol:",IDC_STATIC,90,20,52,8 CONTROL "",IDC_SLIDER_GLOBALVOL,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_NOTICKS,105,28,15,50 + TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,105,28,15,50 EDITTEXT IDC_EDIT_GLOBALVOL,95,78,36,12,ES_NUMBER CONTROL "",IDC_SPIN_GLOBALVOL,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,120,76, 11,14 LTEXT "VSTi vol:",IDC_STATIC,159,20,33,8 CONTROL "",IDC_SLIDER_VSTIVOL,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_NOTICKS,164,28,15,50 + TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,164,28,15,50 EDITTEXT IDC_EDIT_VSTIVOL,156,78,36,12,ES_NUMBER CONTROL "",IDC_SPIN_VSTIVOL,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,180,76, 11,14 LTEXT "Sample vol:",IDC_STATIC,212,20,38,8 - CONTROL "Slider1",IDC_SLIDER_SONGPREAMP,"msctls_trackbar32", - TBS_VERT | TBS_BOTH | TBS_NOTICKS,221,28,15,50 + CONTROL "Slider1",IDC_SLIDER_SAMPLEPREAMP,"msctls_trackbar32", + TBS_VERT | TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,221,28, + 15,50 EDITTEXT IDC_EDIT_SAMPLEPA,212,78,36,12,ES_NUMBER CONTROL "",IDC_SPIN_SAMPLEPA,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,238,75, @@ -931,10 +932,10 @@ WS_TABSTOP GROUPBOX "Tempo",IDC_STATIC,4,51,235,38 LTEXT "Mode:",IDC_STATIC,7,62,21,8 - COMBOBOX IDC_COMBO4,156,129,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | + COMBOBOX IDC_COMBO4,153,129,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP GROUPBOX "Playback",IDC_STATIC,4,95,235,51 - LTEXT "Plugin levels:",IDC_STATIC,111,131,43,10 + LTEXT "Mix Levels:",IDC_STATIC,111,131,40,10 GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,150,235,42 EDITTEXT IDC_EDIT1,67,161,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE @@ -1905,7 +1906,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,45 + FILEVERSION 1,17,2,46 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1923,7 +1924,7 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 45" + VALUE "FileVersion", "1, 17, 2, 46" VALUE "InternalName", "Modplug Tracker" VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2007 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/mptrack/resource.h 2007-03-13 22:14:22 UTC (rev 174) @@ -533,7 +533,7 @@ #define IDC_EDIT_SPEED 2008 #define IDC_EDIT_GLOBALVOL 2009 #define IDC_EDIT_RESTARTPOS 2010 -#define IDC_SLIDER_SONGPREAMP 2011 +#define IDC_SLIDER_SAMPLEPREAMP 2011 #define IDC_BUTTON_MODTYPE 2012 #define IDC_EDIT_SAMPLEPA 2013 #define IDC_EDIT_MODTYPE 2014 @@ -728,7 +728,7 @@ #define IDC_AUTOSAVE_USECUSTOMDIR 2245 #define IDC_BUTTON_MODTYPE2 2246 #define IDC_BUTTON_PLAYERPROPS 2247 -#define IDC_SLIDER_SONGPREAMP3 2248 +#define IDC_SLIDER_SAMPLEPREAMP3 2248 #define IDC_SLIDER_GLOBALVOL 2249 #define IDC_EDIT_VSTIVOL 2250 #define IDC_SLIDER_VSTIVOL 2251 @@ -930,6 +930,7 @@ #define ID_VIEW_SONGPROPERTIES 38002 #define ID_GROW_SELECTION 40001 #define ID_SHRINK_SELECTION 40002 +#define ID_RUN_SCRIPT 40003 #define IDS_ERR_FILEOPEN 55001 #define IDS_ERR_FILETYPE 55002 #define IDS_ERR_SAVEINS 55003 Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb =================================================================== --- trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2007-03-13 22:14:22 UTC (rev 174) @@ -9,7 +9,7 @@ 0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown) 0:1030:2:119:1 //Play song/Pause song: Ctrl+F8 (KeyDown) 0:1031:0:119:1 //Pause song: F8 (KeyDown) -0:1375:0:27:1 //Stop Song: ESC (KeyDown) +0:1375:0:27:1 //Stop Song: Esc (KeyDown) 0:1029:0:116:5 //Play song from start: F5 (KeyDown|KeyHold) 0:1028:0:118:5 //Play song from cursor: F7 (KeyDown|KeyHold) 0:1027:0:117:5 //Play pattern from start: F6 (KeyDown|KeyHold) @@ -36,49 +36,49 @@ 0:1670:6:77:1 //View Channel Manager: Ctrl+Alt+M (KeyDown) 0:1669:3:77:1 //View Plugin Manager: Shift+Ctrl+M (KeyDown) 0:1032:0:219:5 //Previous instrument: [ (KeyDown|KeyHold) -0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold) +0:1032:2:38:5 //Previous instrument: Ctrl+Up (KeyDown|KeyHold) 0:1033:0:221:5 //Next instrument: ] (KeyDown|KeyHold) -0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold) -0:1036:0:111:5 //Previous octave: NUM DIVIDE (KeyDown|KeyHold) -0:1037:0:106:5 //Next octave: NUMMULT (KeyDown|KeyHold) -0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold) -0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold) +0:1033:2:40:5 //Next instrument: Ctrl+Down (KeyDown|KeyHold) +0:1036:0:111:5 //Previous octave: Num / (KeyDown|KeyHold) +0:1037:0:106:5 //Next octave: Num * (KeyDown|KeyHold) +0:1034:2:37:5 //Previous order: Ctrl+Left (KeyDown|KeyHold) +0:1035:2:39:5 //Next order: Ctrl+Right (KeyDown|KeyHold) //----( General Context [bottom] (1) )------------ //----( Pattern Context [bottom] (2) )------------ -2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold) -2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold) -2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold) -2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold) -2:1019:2:34:5 //Snap down to measure: Ctrl+PGDOWN (KeyDown|KeyHold) -2:1020:2:33:5 //Snap up to measure: Ctrl+PGUP (KeyDown|KeyHold) -2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold) -2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold) -2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold) -2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold) -2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold) -2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold) -2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold) -2:1043:2:9:5 //Navigate to previous channel: Ctrl+TAB (KeyDown|KeyHold) -2:1044:0:36:1 //Go to first channel: HOME (KeyDown) -2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown) -2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown) -2:1047:0:35:1 //Go to last channel: END (KeyDown) -2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown) -2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown) -2:1050:1:16:1 //Selection key: Shift (KeyDown) +2:1017:0:34:5 //Jump down by measure: Page Down (KeyDown|KeyHold) +2:1018:0:33:5 //Jump up by measure: Page Up (KeyDown|KeyHold) +2:1338:4:34:5 //Jump down by beat: Alt+Page Down (KeyDown|KeyHold) +2:1339:4:33:5 //Jump up by beat: Alt+Page Up (KeyDown|KeyHold) +2:1019:2:34:5 //Snap down to measure: Ctrl+Page Down (KeyDown|KeyHold) +2:1020:2:33:5 //Snap up to measure: Ctrl+Page Up (KeyDown|KeyHold) +2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+Page Down (KeyDown|KeyHold) +2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+Page Up (KeyDown|KeyHold) +2:1038:0:40:5 //Navigate down by 1 row: Down (KeyDown|KeyHold) +2:1039:0:38:5 //Navigate up by 1 row: Up (KeyDown|KeyHold) +2:1040:0:37:5 //Navigate left: Left (KeyDown|KeyHold) +2:1041:0:39:5 //Navigate right: Right (KeyDown|KeyHold) +2:1042:0:9:5 //Navigate to next channel: Tab (KeyDown|KeyHold) +2:1043:2:9:5 //Navigate to previous channel: Ctrl+Tab (KeyDown|KeyHold) +2:1044:0:36:1 //Go to first channel: Home (KeyDown) +2:1045:2:36:1 //Go to first row: Ctrl+Home (KeyDown) +2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+Home (KeyDown) +2:1047:0:35:1 //Go to last channel: End (KeyDown) +2:1048:2:35:1 //Go to last row: Ctrl+End (KeyDown) +2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+End (KeyDown) +2:1050:1:16:1 //Selection key: Shift+Shift (KeyDown) 2:1011:4:76:1 //Select channel / Select all: Alt+L (KeyDown) 2:1663:2:118:1 //Toggle follow song: Ctrl+F7 (KeyDown) -2:1003:0:13:1 //Quick copy: ENTER (KeyDown) -2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold) +2:1003:0:13:1 //Quick copy: Enter (KeyDown) +2:1004:0:32:5 //Quick paste: Space (KeyDown|KeyHold) 2:1001:1:120:1 //Enable recording: Shift+F9 (KeyDown) -2:1002:2:13:1 //Play row: Ctrl+ENTER (KeyDown) -2:1002:0:104:1 //Play row: NUM 8 (KeyDown) +2:1002:2:13:1 //Play row: Ctrl+Enter (KeyDown) +2:1002:0:104:1 //Play row: Num 8 (KeyDown) 2:1002:0:56:1 //Play row: 8 (KeyDown) -2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown) -2:1685:6:9:1 //Switch to order list: Ctrl+Alt+TAB (KeyDown) -2:1672:3:13:1 //Insert new pattern: Shift+Ctrl+ENTER (KeyDown) +2:1317:4:18:1 //Set row jump on note entry: Alt+Alt (KeyDown) +2:1685:6:9:1 //Switch to order list: Ctrl+Alt+Tab (KeyDown) +2:1672:3:13:1 //Insert new pattern: Shift+Ctrl+Enter (KeyDown) 2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown) 2:1062:0:93:1 //Show note properties: Application (KeyDown) 2:1063:2:93:1 //Show context (right-click) menu: Ctrl+Application (KeyDown) @@ -95,110 +95,110 @@ 2:1013:4:83:1 //Apply current instrument: Alt+S (KeyDown) 2:1660:4:69:1 //Grow selection: Alt+E (KeyDown) 2:1661:4:68:1 //Shrink selection: Alt+D (KeyDown) -2:1057:0:46:1 //Clear row: DELETE (KeyDown) -2:1058:0:110:1 //Clear field: NUM DECIMAL (KeyDown) +2:1057:0:46:1 //Clear row: Delete (KeyDown) +2:1058:0:110:1 //Clear field: Num Del (KeyDown) 2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown) -2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown) -2:1060:2:110:1 //Clear field and step: Ctrl+NUM DECIMAL (KeyDown) +2:1059:2:46:1 //Clear row and step: Ctrl+Delete (KeyDown) +2:1060:2:110:1 //Clear field and step: Ctrl+Num Del (KeyDown) 2:1665:3:190:1 //Clear field and step (IT Style): Shift+Ctrl+. (KeyDown) -2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold) -2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold) -2:1378:0:45:5 //Insert Row: INSERT (KeyDown|KeyHold) -2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown) -2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold) -2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold) +2:1061:0:8:5 //Delete rows: Backspace (KeyDown|KeyHold) +2:1377:2:8:5 //Delete all rows: Ctrl+Backspace (KeyDown|KeyHold) +2:1378:0:45:5 //Insert Row: Insert (KeyDown|KeyHold) +2:1379:2:45:1 //Insert All Rows: Ctrl+Insert (KeyDown) +2:1055:0:109:5 //Previous pattern: Num - (KeyDown|KeyHold) +2:1054:0:107:5 //Next pattern: Num + (KeyDown|KeyHold) //----( Pattern Context [bottom] - Note Col (3) )------------ -3:1064:0:90:5 //Base octave C: Z (KeyDown|KeyHold) -3:1065:0:83:5 //Base octave C#: S (KeyDown|KeyHold) -3:1066:0:88:5 //Base octave D: X (KeyDown|KeyHold) -3:1067:0:68:5 //Base octave D#: D (KeyDown|KeyHold) -3:1068:0:67:5 //Base octave E: C (KeyDown|KeyHold) -3:1069:0:86:5 //Base octave F: V (KeyDown|KeyHold) -3:1070:0:71:5 //Base octave F#: G (KeyDown|KeyHold) -3:1071:0:66:5 //Base octave G: B (KeyDown|KeyHold) -3:1072:0:72:5 //Base octave G#: H (KeyDown|KeyHold) -3:1073:0:78:5 //Base octave +1 A: N (KeyDown|KeyHold) -3:1074:0:74:5 //Base octave +1 A#: J (KeyDown|KeyHold) -3:1075:0:77:5 //Base octave +1 B: M (KeyDown|KeyHold) -3:1076:0:81:5 //Base octave +1 C: Q (KeyDown|KeyHold) -3:1077:0:50:5 //Base octave +1 C#: 2 (KeyDown|KeyHold) -3:1078:0:87:5 //Base octave +1 D: W (KeyDown|KeyHold) -3:1079:0:51:5 //Base octave +1 D#: 3 (KeyDown|KeyHold) -3:1080:0:69:5 //Base octave +1 E: E (KeyDown|KeyHold) -3:1081:0:82:5 //Base octave +1 F: R (KeyDown|KeyHold) -3:1082:0:53:5 //Base octave +1 F#: 5 (KeyDown|KeyHold) -3:1083:0:84:5 //Base octave +1 G: T (KeyDown|KeyHold) -3:1084:0:54:5 //Base octave +1 G#: 6 (KeyDown|KeyHold) -3:1085:0:89:5 //Base octave +2 A: Y (KeyDown|KeyHold) -3:1086:0:55:5 //Base octave +2 A#: 7 (KeyDown|KeyHold) -3:1087:0:85:5 //Base octave +2 B: U (KeyDown|KeyHold) -3:1088:0:73:5 //Base octave +2 C: I (KeyDown|KeyHold) -3:1089:0:57:5 //Base octave +2 C#: 9 (KeyDown|KeyHold) -3:1090:0:79:5 //Base octave +2 D: O (KeyDown|KeyHold) -3:1091:0:48:5 //Base octave +2 D#: 0 (KeyDown|KeyHold) -3:1092:0:80:5 //Base octave +2 E: P (KeyDown|KeyHold) -3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown) -3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown) -3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown) -3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown) +3:1064:0:90:1 //Base octave C: Z (KeyDown) +3:1065:0:83:1 //Base octave C#: S (KeyDown) +3:1066:0:88:1 //Base octave D: X (KeyDown) +3:1067:0:68:1 //Base octave D#: D (KeyDown) +3:1068:0:67:1 //Base octave E: C (KeyDown) +3:1069:0:86:1 //Base octave F: V (KeyDown) +3:1070:0:71:1 //Base octave F#: G (KeyDown) +3:1071:0:66:1 //Base octave G: B (KeyDown) +3:1072:0:72:1 //Base octave G#: H (KeyDown) +3:1073:0:78:1 //Base octave +1 A: N (KeyDown) +3:1074:0:74:1 //Base octave +1 A#: J (KeyDown) +3:1075:0:77:1 //Base octave +1 B: M (KeyDown) +3:1076:0:81:1 //Base octave +1 C: Q (KeyDown) +3:1077:0:50:1 //Base octave +1 C#: 2 (KeyDown) +3:1078:0:87:1 //Base octave +1 D: W (KeyDown) +3:1079:0:51:1 //Base octave +1 D#: 3 (KeyDown) +3:1080:0:69:1 //Base octave +1 E: E (KeyDown) +3:1081:0:82:1 //Base octave +1 F: R (KeyDown) +3:1082:0:53:1 //Base octave +1 F#: 5 (KeyDown) +3:1083:0:84:1 //Base octave +1 G: T (KeyDown) +3:1084:0:54:1 //Base octave +1 G#: 6 (KeyDown) +3:1085:0:89:1 //Base octave +2 A: Y (KeyDown) +3:1086:0:55:1 //Base octave +2 A#: 7 (KeyDown) +3:1087:0:85:1 //Base octave +2 B: U (KeyDown) +3:1088:0:73:1 //Base octave +2 C: I (KeyDown) +3:1089:0:57:1 //Base octave +2 C#: 9 (KeyDown) +3:1090:0:79:1 //Base octave +2 D: O (KeyDown) +3:1091:0:48:1 //Base octave +2 D#: 0 (KeyDown) +3:1092:0:80:1 //Base octave +2 E: P (KeyDown) +3:1212:0:96:1 //Set octave 0: Num 0 (KeyDown) +3:1213:0:97:1 //Set octave 1: Num 1 (KeyDown) +3:1214:0:98:1 //Set octave 2: Num 2 (KeyDown) +3:1215:0:99:1 //Set octave 3: Num 3 (KeyDown) 3:1216:0:52:1 //Set octave 4: 4 (KeyDown) -3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown) -3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown) -3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown) -3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown) -3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown) -3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown) -3:1316:1:16:1 //Chord Modifier: Shift (KeyDown) +3:1216:0:100:1 //Set octave 4: Num 4 (KeyDown) +3:1217:0:101:1 //Set octave 5: Num 5 (KeyDown) +3:1218:0:102:1 //Set octave 6: Num 6 (KeyDown) +3:1219:0:103:1 //Set octave 7: Num 7 (KeyDown) +3:1220:0:104:1 //Set octave 8: Num 8 (KeyDown) +3:1221:0:105:1 //Set octave 9: Num 9 (KeyDown) +3:1316:1:16:1 //Chord Modifier: Shift+Shift (KeyDown) 3:1200:0:49:1 //Note cut: 1 (KeyDown) -3:1201:0:223:1 //Note off: ` (KeyDown) +3:1201:0:223:1 //Note off: (KeyDown) 3:1201:0:187:1 //Note off: = (KeyDown) 3:1667:1:49:1 //Note cut (don't remember instrument): Shift+1 (KeyDown) -3:1668:1:223:1 //Note off (don't remember instrument): Shift+` (KeyDown) +3:1668:1:223:1 //Note off (don't remember instrument): Shift+ (KeyDown) //----( Pattern Context [bottom] - Ins Col (4) )------------ -4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown) +4:1202:0:96:1 //Set instrument digit 0: Num 0 (KeyDown) 4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown) -4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown) +4:1203:0:97:1 //Set instrument digit 1: Num 1 (KeyDown) 4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown) -4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown) +4:1204:0:98:1 //Set instrument digit 2: Num 2 (KeyDown) 4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown) -4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown) +4:1205:0:99:1 //Set instrument digit 3: Num 3 (KeyDown) 4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown) -4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown) +4:1206:0:100:1 //Set instrument digit 4: Num 4 (KeyDown) 4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown) -4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown) +4:1207:0:101:1 //Set instrument digit 5: Num 5 (KeyDown) 4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown) -4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown) +4:1208:0:102:1 //Set instrument digit 6: Num 6 (KeyDown) 4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown) -4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown) +4:1209:0:103:1 //Set instrument digit 7: Num 7 (KeyDown) 4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown) 4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown) -4:1210:0:104:1 //Set instrument digit 8: NUM 8 (KeyDown) -4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown) +4:1210:0:104:1 //Set instrument digit 8: Num 8 (KeyDown) +4:1211:0:105:1 //Set instrument digit 9: Num 9 (KeyDown) 4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown) //----( Pattern Context [bottom] - Vol Col (5) )------------ 5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown) -5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown) +5:1222:0:96:1 //Set volume digit 0: Num 0 (KeyDown) 5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown) -5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown) +5:1223:0:97:1 //Set volume digit 1: Num 1 (KeyDown) 5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown) -5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown) +5:1224:0:98:1 //Set volume digit 2: Num 2 (KeyDown) 5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown) -5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown) +5:1225:0:99:1 //Set volume digit 3: Num 3 (KeyDown) 5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown) -5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown) +5:1226:0:100:1 //Set volume digit 4: Num 4 (KeyDown) 5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown) -5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown) +5:1227:0:101:1 //Set volume digit 5: Num 5 (KeyDown) 5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown) -5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown) +5:1228:0:102:1 //Set volume digit 6: Num 6 (KeyDown) 5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown) -5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown) +5:1229:0:103:1 //Set volume digit 7: Num 7 (KeyDown) 5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown) -5:1230:0:104:1 //Set volume digit 8: NUM 8 (KeyDown) +5:1230:0:104:1 //Set volume digit 8: Num 8 (KeyDown) 5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown) -5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown) +5:1231:0:105:1 //Set volume digit 9: Num 9 (KeyDown) 5:1232:0:86:1 //Vol command - volume: V (KeyDown) 5:1233:0:80:1 //Vol command - pan: P (KeyDown) 5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown) @@ -216,31 +216,31 @@ 5:1246:0:79:1 //Vol command - Offset: O (KeyDown) //----( Pattern Context [bottom] - FX Col (6) )------------ -6:1294:0:220:1 //FX midi macro slide: \ (KeyDown) +6:1294:0:226:1 //FX midi macro slide: \ (KeyDown) 6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown) -6:1666:0:222:1 //FX parameter extension command: # (KeyDown) +6:1666:0:222:1 //FX parameter extension command: ' (KeyDown) //----( Pattern Context [bottom] - Param Col (7) )------------ 7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown) -7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown) +7:1247:0:96:1 //FX Param digit 0: Num 0 (KeyDown) 7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown) -7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown) +7:1248:0:97:1 //FX Param digit 1: Num 1 (KeyDown) 7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown) -7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown) +7:1249:0:98:1 //FX Param digit 2: Num 2 (KeyDown) 7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown) -7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown) +7:1250:0:99:1 //FX Param digit 3: Num 3 (KeyDown) 7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown) -7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown) +7:1251:0:100:1 //FX Param digit 4: Num 4 (KeyDown) 7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown) -7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown) +7:1252:0:101:1 //FX Param digit 5: Num 5 (KeyDown) 7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown) -7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown) +7:1253:0:102:1 //FX Param digit 6: Num 6 (KeyDown) 7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown) -7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown) +7:1254:0:103:1 //FX Param digit 7: Num 7 (KeyDown) 7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown) -7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown) +7:1255:0:104:1 //FX Param digit 8: Num 8 (KeyDown) 7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown) -7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown) +7:1256:0:105:1 //FX Param digit 9: Num 9 (KeyDown) 7:1257:0:65:1 //FX Param digit A: A (KeyDown) 7:1258:0:66:1 //FX Param digit B: B (KeyDown) 7:1259:0:67:1 //FX Param digit C: C (KeyDown) @@ -253,13 +253,13 @@ 8:1674:4:83:1 //Save Sample: Alt+S (KeyDown) 8:1675:4:78:1 //New Sample: Alt+N (KeyDown) 8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown) -8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown) +8:1383:0:8:1 //Silence sample selection: Backspace (KeyDown) 8:1384:3:78:1 //Normalise Sample: Shift+Ctrl+N (KeyDown) 8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown) 8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown) -8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown) -8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown) -8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown) +8:1382:0:46:1 //Delete sample selection: Delete (KeyDown) +8:1386:0:107:1 //Zoom Out: Num + (KeyDown) +8:1387:0:109:1 //Zoom In: Num - (KeyDown) //----( Instrument Context [bottom] (9) )------------ Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2007-03-13 22:14:22 UTC (rev 174) @@ -109,7 +109,7 @@ m_nDefaultTempo = psong->bpm; m_nDefaultGlobalVolume = psong->globalvol << 2; if ((!m_nDefaultGlobalVolume) || (m_nDefaultGlobalVolume > 256)) m_nDefaultGlobalVolume = 256; - m_nSongPreAmp = psong->mastervol & 0x7F; + m_nSamplePreAmp = psong->mastervol & 0x7F; for (UINT iOrd=0; iOrd<MAX_ORDERS; iOrd++) { Order[iOrd] = (BYTE)((iOrd < psong->numord) ? psong->orders[iOrd] : 0xFF); Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -76,7 +76,7 @@ m_nChannels = 16; m_nInstruments = 0; m_nSamples = 0; - m_nSongPreAmp = 0x20; + m_nSamplePreAmp = 0x20; m_nDefaultSpeed = pmh1->speed; m_nDefaultTempo = 80; m_nDefaultGlobalVolume = 256; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -285,9 +285,9 @@ m_nDefaultGlobalVolume = id; streamPos += sizeof(DWORD); - // m_nSongPreAmp + // m_nSamplePreAmp memcpy(&id,lpStream+streamPos,sizeof(DWORD)); - m_nSongPreAmp = id; + m_nSamplePreAmp = id; streamPos += sizeof(DWORD); // m_nDefaultSpeed @@ -615,7 +615,7 @@ case 'PMM.': fadr = reinterpret_cast<BYTE*>(&m_nPlugMixMode); break; case 'CWV.': fadr = reinterpret_cast<BYTE*>(&m_dwCreatedWithVersion); break; case 'LSWV': fadr = reinterpret_cast<BYTE*>(&m_dwLastSavedWithVersion); break; - case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; + case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSamplePreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; case 'RP..': fadr = reinterpret_cast<BYTE*>(&m_nRestartPos); break; @@ -677,9 +677,9 @@ } if (pifh->speed) m_nDefaultSpeed = pifh->speed; if (pifh->tempo) m_nDefaultTempo = pifh->tempo; - m_nSongPreAmp = pifh->mv & 0x7F; - if (m_nSongPreAmp<0x20) { - m_nSongPreAmp=100; + m_nSamplePreAmp = pifh->mv & 0x7F; + 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... @@ -1019,7 +1019,7 @@ case 'PMM.': fadr = reinterpret_cast<BYTE*>(&m_nPlugMixMode); break; case 'CWV.': fadr = reinterpret_cast<BYTE*>(&m_dwCreatedWithVersion); break; case 'LSWV': fadr = reinterpret_cast<BYTE*>(&m_dwLastSavedWithVersion); break; - case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; + case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSamplePreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; case 'RP..': fadr = reinterpret_cast<BYTE*>(&m_nRestartPos); break; @@ -1238,7 +1238,7 @@ fwrite(&id, 1, sizeof(id), f); id = m_nDefaultGlobalVolume; fwrite(&id, 1, sizeof(id), f); - id = m_nSongPreAmp; + id = m_nSamplePreAmp; fwrite(&id, 1, sizeof(id), f); id = m_nDefaultSpeed; fwrite(&id, 1, sizeof(id), f); @@ -1502,7 +1502,7 @@ if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20; if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000; header.globalvol = m_nDefaultGlobalVolume >> 1; - header.mv = m_nSongPreAmp; + header.mv = m_nSamplePreAmp; if (header.mv < 0x20) header.mv = 0x20; if (header.mv > 0x7F) header.mv = 0x7F; header.speed = m_nDefaultSpeed; @@ -2085,7 +2085,7 @@ if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20; if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000; header.globalvol = m_nDefaultGlobalVolume >> 1; - header.mv = m_nSongPreAmp; + header.mv = m_nSamplePreAmp; if (header.mv < 0x20) header.mv = 0x20; if (header.mv > 0x7F) header.mv = 0x7F; header.speed = m_nDefaultSpeed; @@ -3139,11 +3139,11 @@ fwrite(&size, 1, sizeof(__int16), f); fwrite(&m_dwLastSavedWithVersion, 1, size, f); - code = 'SPA.'; //write m_nSongPreAmp + code = 'SPA.'; //write m_nSamplePreAmp fwrite(&code, 1, sizeof(__int32), f); - size = sizeof(m_nSongPreAmp); + size = sizeof(m_nSamplePreAmp); fwrite(&size, 1, sizeof(__int16), f); - fwrite(&m_nSongPreAmp, 1, size, f); + fwrite(&m_nSamplePreAmp, 1, size, f); code = 'VSTV'; //write m_nVSTiVolume fwrite(&code, 1, sizeof(__int32), f); Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -515,7 +515,7 @@ Log("\n"); #endif m_nType = MOD_TYPE_MED; - m_nSongPreAmp = 0x20; + m_nSamplePreAmp = 0x20; dwBlockArr = BigEndian(pmmh->blockarr); dwSmplArr = BigEndian(pmmh->smplarr); dwExpData = BigEndian(pmmh->expdata); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -226,7 +226,7 @@ // Global Volume m_nDefaultGlobalVolume = psfh->globalvol << 2; if ((!m_nDefaultGlobalVolume) || (m_nDefaultGlobalVolume > 256)) m_nDefaultGlobalVolume = 256; - m_nSongPreAmp = psfh->mastervol & 0x7F; + m_nSamplePreAmp = psfh->mastervol & 0x7F; // Channels m_nChannels = 4; for (UINT ich=0; ich<32; ich++) @@ -456,7 +456,7 @@ header[0x30] = m_nDefaultGlobalVolume >> 2; header[0x31] = m_nDefaultSpeed; header[0x32] = m_nDefaultTempo; - header[0x33] = ((m_nSongPreAmp < 0x20) ? 0x20 : m_nSongPreAmp) | 0x80; // Stereo + header[0x33] = ((m_nSamplePreAmp < 0x20) ? 0x20 : m_nSamplePreAmp) | 0x80; // Stereo header[0x35] = 0xFC; for (i=0; i<32; i++) { Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -642,7 +642,7 @@ case 'PMM.': fadr = reinterpret_cast<BYTE*>(&m_nPlugMixMode); break; case 'CWV.': fadr = reinterpret_cast<BYTE*>(&m_dwCreatedWithVersion); break; case 'LSWV': fadr = reinterpret_cast<BYTE*>(&m_dwLastSavedWithVersion); break; - case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; + case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSamplePreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -2668,6 +2668,18 @@ // if (m_nInstruments) KeyOff(pChn); ? pChn->nVolume = 0; pChn->dwFlags |= CHN_FASTVOLRAMP; + + INSTRUMENTHEADER *pHeader = pChn->pHeader; + if (pHeader && pHeader->nMidiChannel>0 && pHeader->nMidiChannel<17) { // instro sends to a midi chan + UINT nPlug = pHeader->nMixPlug; + if ((nPlug) && (nPlug <= MAX_MIXPLUGINS)) { + IMixPlugin *pPlug = (IMixPlugin*)m_MixPlugins[nPlug-1].pMixPlugin; + if (pPlug) { + pPlug->MidiCommand(pHeader->nMidiChannel, pHeader->nMidiProgram, pHeader->wMidiBank, /*pChn->nNote+*/0xFF, 0, nChn); + } + } + } + } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -178,7 +178,7 @@ RPM. [EXT] nRowsPerMeasure; RS.. nResSwing; SEP@ [EXT] chunk SEPARATOR tag -SPA. [EXT] m_nSongPreAmp; +SPA. [EXT] m_nSamplePreAmp; TM.. [EXT] nTempoMode; VE.. nVolEnv; VE[. VolEnv[MAX_ENVPOINTS]; @@ -411,7 +411,7 @@ memset(&m_SongEQ, 0, sizeof(m_SongEQ)); m_lTotalSampleCount=0; - m_nPlugMixMode=plugmix_mode_117RC2; + m_nPlugMixMode=plugmix_mode_Test; m_pConfig = new CSoundFilePlayConfig(); BuildDefaultInstrument(); @@ -438,8 +438,8 @@ m_nInstruments = 0; m_nFreqFactor = m_nTempoFactor = 128; m_nMasterVolume = 128; - m_nDefaultGlobalVolume = 128; - m_nGlobalVolume = 128; + m_nDefaultGlobalVolume = 256; + m_nGlobalVolume = 256; m_nOldGlbVolSlide = 0; m_nDefaultSpeed = 6; m_nDefaultTempo = 125; @@ -454,8 +454,8 @@ m_nRestartPos = 0; m_nMinPeriod = 16; m_nMaxPeriod = 32767; - m_nSongPreAmp = 100; - m_nVSTiVolume = 100; + m_nSamplePreAmp = 128; + m_nVSTiVolume = 128; m_nPatternNames = 0; m_nMaxOrderPosition = 0; m_lpszPatternNames = NULL; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Sndfile.h 2007-03-13 22:14:22 UTC (rev 174) @@ -847,7 +847,7 @@ UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos, m_nSeqOverride; bool m_bPatternTransitionOccurred; UINT m_nMasterVolume, m_nGlobalVolume, m_nSamplesToGlobalVolRampDest, - m_nGlobalVolumeDestination, m_nSongPreAmp, m_nVSTiVolume; + m_nGlobalVolumeDestination, m_nSamplePreAmp, m_nVSTiVolume; long m_lHighResRampingGlobalVolume; UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide; LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2007-02-26 21:38:06 UTC (rev 173) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2007-03-13 22:14:22 UTC (rev 174) @@ -828,22 +828,33 @@ if(nchn32 < 1) nchn32 = 1; if(nchn32 > 31) nchn32 = 31; - int realmastervol = m_nMasterVolume; - if (realmastervol > 0x80) - { - realmastervol = 0x80 + ((realmastervol - 0x80) * (nchn32+4)) / 16; + + DWORD mastervol; + + if (m_pConfig->getUseGlobalPreAmp()) { + int realmastervol = m_nMasterVolume; + if (realmastervol > 0x80) { + //Attenuate global pre-amp depending on num channels + realmastervol = 0x80 + ((realmastervol - 0x80) * (nchn32+4)) / 16; + } + mastervol = (realmastervol * (m_nSamplePreAmp)) >> 6; + } else { + //Preferred option: don't use global pre-amp at all. + mastervol = m_nSamplePreAmp; } - DWORD mastervol = (realmastervol * (m_nSongPreAmp)) >> 6; if ((m_dwSongFlags & SONG_GLOBALFADE) && (m_nGlobalFadeMaxSamples)) { mastervol = _muldiv(mastervol, m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples); } - UINT attenuation = (gdwSoundSetup & SNDMIX_AGC) ? PreAmpAGCTable[nchn32>>1] : PreAmpTable[nchn32>>1]; - if(attenuation < 1) attenuation = 1; - - nMasterVol = (mastervol << 7) / attenuation; + if (m_pConfig->getUseGlobalPreAmp()) { + UINT attenuation = (gdwSoundSetup & SNDMIX_AGC) ? PreAmpAGCTable[nchn32>>1] : PreAmpTable[nchn32>>1]; + if(attenuation < 1) attenuation = 1; + nMasterVol = (mastervol << 7) / attenuation; + } else { + nMasterVol = mastervol; + } } //////////////////////////////////////////////////////////////////////////////////// // Update channels data @@ -1459,8 +1470,7 @@ #define kChnMasterVol nMasterVol #endif // MODPLUG_TRACKER // Adjusting volumes - if (gnChannels >= 2) - { + if (gnChannels >= 2) { int pan = ((int)pChn->nRealPan) - 128; pan *= (int)m_nStereoSeparation; pan /= 128; @@ -1470,25 +1480,29 @@ #ifndef FASTSOUNDLIB if (gdwSoundSetup & SNDMIX_REVERSESTEREO) pan = 256 - pan; #endif - LONG realvol = (pChn->nRealVolume * kChnMasterVol) >> (8-1); - if (gdwSoundSetup & SNDMIX_SOFTPANNING) - { - if (pan < 128) - { + + LONG realvol; + if (m_pConfig->getUseGlobalPreAmp()) { + realvol = (pChn->nRealVolume * kChnMasterVol) >> 7; + } else { + //Extra attenuation required here if we're bypassing pre-amp. + realvol = (pChn->nRealVolume * kChnMasterVol) >> 8; + } + + if (m_pConfig->getTreatPanLikeBalance()) { + if (pan < 128) { pChn->nNewLeftVol = (realvol * pan) >> 8; pChn->nNewRightVol = (realvol * 128) >> 8; - } else - { + } else { pChn->nNewLeftVol = (realvol * 128) >> 8; pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; } - } else - { + } else { pChn->nNewLeftVol = (realvol * pan) >> 8; pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; } - } else - { + + } else { pChn->nNewRightVol = (pChn->nRealVolume * kChnMasterVol) >> 8; pChn->nNewLeftVol = pChn->nNewRightVol; } @@ -1544,8 +1558,11 @@ if (pChn->nInc >= 0xFE00) pChn->dwFlags |= CHN_NOIDO; #endif // FASTSOUNDLIB } - pChn->nNewRightVol >>= MIXING_ATTENUATION; - pChn->nNewLeftVol >>= MIXING_ATTENUATION; + if (m_pConfig->getUseGlobalPreAmp()) { + pChn->nNewRightVol >>= MIXING_ATTENUATION; + pChn->nNewLeftVol >>= MIXING_ATTENUATION; + } + pChn->nRightRamp = pChn->nLeftRamp = 0; // Dolby Pro-Logic Surround if ((pChn->dwFlags & CHN_SURROUND) && (gnChannels == 2)) pChn->nNewLeftVol = - pChn->nNewLeftVol; @@ -1732,7 +1749,7 @@ VOID CSoundFile::ApplyGlobalVolume(int SoundBuffer[], long lTotalSampleCount) -//-------------------------------------------------------- +//--------------------------------------------------------------------------- { long delta=0; long step=0; @@ -1754,7 +1771,6 @@ step = delta/static_cast<long>(m_nSamplesToGlobalVolRampDest); } } - for (int pos=0; pos<lTotalSampleCount; pos++) { if (m_nSamplesToGlobalVolRampDest>0) { //ramping required @@ -1767,3 +1783,4 @@ } } + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Rel...@us...> - 2007-02-26 21:38:15
|
Revision: 173 http://svn.sourceforge.net/modplug/?rev=173&view=rev Author: Relabsoluness Date: 2007-02-26 13:38:06 -0800 (Mon, 26 Feb 2007) Log Message: ----------- . <Relabs> Quick fix for a bug created in Rev. 172 related to VST volume parameter(it was quarter of the value it should have been(I guess)). Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2007-02-03 21:24:42 UTC (rev 172) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2007-02-26 21:38:06 UTC (rev 173) @@ -585,7 +585,7 @@ float m_nPlugInitialParamValue; //rewbs.smoothVST typedef UINT VOLUME; - VOLUME GetVSTVolume() {return (pHeader) ? pHeader->nGlobalVol : nVolume;} + VOLUME GetVSTVolume() {return (pHeader) ? pHeader->nGlobalVol*4 : nVolume;} //-->Relabs.Tuning-modes-to-work-properly-with-effects-variables bool m_ReCalculateFreqOnFirstTick; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Rel...@us...> - 2007-02-03 21:24:47
|
Revision: 172 http://svn.sourceforge.net/modplug/?rev=172&view=rev Author: Relabsoluness Date: 2007-02-03 13:24:42 -0800 (Sat, 03 Feb 2007) Log Message: ----------- (Note: This doesn't include the patch from pelya; I wanted to get my modifications committed before merging it.) + <Relabs> Ability to 'scale' envelope points, i.e. to move envelope points by given factor; try right click in envelope views. . <Relabs> Fixed 24-bit wav loading again :) . <Relabs> Fixed an ITP-saving bug I had created when extending the pattern/order-limit(messes orderlist up). . <Relabs> Fixed an ITP-loading bug concerning loading empty comments; could be noticed as trash characters in the comments when there shouldn't have been any. . <Relabs> Bug fix related to handling of finesteps when creating tunings. . <Relabs> Fixed the way modified flag appears when modifying tunings. . <Relabs> Fixed bug that VSTi was making no sound when corresponding instrument had no associated sample - Can cause some tracks using VSTi's to play differently. / <Relabs> Modified the way pattern data is saved/loaded with ITP in order to be able to hack the MODCOMMAND-class. / <Relabs> The tuning dialog now has a treeview instead of the comboboxes. / <Relabs> Local tunings are no longer saved to file everytime the program closes. / <Relabs> Changed the 'order message' at the bottom bar of the screen "Position x of y" to "Position x of y (x_in_hex of y_in_hex)". / <Relabs> To orderlist context menu, changed "Insert Pattern" and "Remove Pattern" to "Insert Order" and "Remove Order" because I find the former somewhat misleading. - Sometimes loading multiple files from openfile dialog fails. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.cpp branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/mod_specifications.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h branches/OpenMPT_MPTm_Tuning/soundlib/midi.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -877,6 +877,7 @@ } PostViewMessage(VIEWMSG_SETCURRENTINSTRUMENT, m_nInstrument); UnlockControls(); + return TRUE; } @@ -2466,6 +2467,15 @@ v.push_back(&m_pSndFile->m_TuningsTuneSpecific); CTuningDialog td(this, v, pInstH->pTuning); td.DoModal(); + if(td.GetModifiedStatus(&m_pSndFile->s_TuningsSharedLocal)) + { + if(MsgBox(IDS_APPLY_TUNING_MODIFICATIONS, this, "", MB_OKCANCEL) == IDOK) + m_pSndFile->SaveStaticTunings(); + } + if(td.GetModifiedStatus(&m_pSndFile->m_TuningsTuneSpecific)) + { + m_pModDoc->SetModified(); + } //Recreating tuning combobox so that possible //new tuning(s) come visible. Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -409,8 +409,16 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); s[0] = 0; - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position %02Xh of %02Xh" : "Position %d of %d", - m_nScrollPos, pSndFile->GetNumPatterns()); + if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) + { + wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->GetNumPatterns()); + } + else + { + wsprintf(s, "Position %d of %d (%02Xh of %02Xh)", + m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns()); + } + if (m_nScrollPos < pSndFile->Order.size()) { UINT nPat = pSndFile->Order[m_nScrollPos]; @@ -661,8 +669,8 @@ if (hMenu) { - 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 Order\tIns"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Order\tDel"); 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"); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -273,11 +273,8 @@ srcy = pfnt->nAlphaNZ_Y + 13 * COLUMN_HEIGHT; break; case '#': - srcx = pfnt->nNoteX + pfnt->nNoteWidth/2; - srcy = pfnt->nNoteY + 2*COLUMN_HEIGHT; - //TODO: '#' doesn't show properly in effect column. - //srcx = pfnt->nAlphaAM_X; - //srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; + srcx = pfnt->nAlphaAM_X; + srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; break; //rewbs.smoothVST case '\\': Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -648,10 +648,6 @@ delete m_pPerfCounter; CChannelManagerDlg::DestroySharedInstance(); - - - //Saving statictunings here. - CSoundFile::SaveStaticTunings(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -872,7 +872,8 @@ if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; - if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + //if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); } } } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -83,7 +83,6 @@ //--------------------------------------------------------------- { if(size() < count) resize(count, 0xFF); - ASSERT(count == size()); size_t i = 0; Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,94 @@ +// ScaleEnvPointsDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "mptrack.h" +#include "ScaleEnvPointsDlg.h" + + +// CScaleEnvPointsDlg dialog + +IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog) +CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env) + : CDialog(CScaleEnvPointsDlg::IDD, pParent), + m_pInstrument(pInst), + m_Env(env) +//---------------------------------------------------------------------- +{ +} + +CScaleEnvPointsDlg::~CScaleEnvPointsDlg() +//--------------------------------------- +{ +} + +void CScaleEnvPointsDlg::DoDataExchange(CDataExchange* pDX) +//-------------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_FACTOR, m_EditFactor); +} + + +BEGIN_MESSAGE_MAP(CScaleEnvPointsDlg, CDialog) + +END_MESSAGE_MAP() + + +// CScaleEnvPointsDlg message handlers + +void CScaleEnvPointsDlg::OnOK() +//------------------------------ +{ + char buffer[10]; + GetDlgItemText(IDC_EDIT_FACTOR, buffer, 9); + float factor = static_cast<float>(atof(buffer)); + if(factor > 0) + { + WORD (*array)[MAX_ENVPOINTS] = NULL; + UINT* arraySize = NULL; + switch(m_Env) + { + case ENV_VOLUME: + array = &m_pInstrument->VolPoints; + arraySize = &m_pInstrument->nVolEnv; + break; + + case ENV_PANNING: + array = &m_pInstrument->PanPoints; + arraySize = &m_pInstrument->nPanEnv; + break; + + case ENV_PITCH: + array = &m_pInstrument->PitchPoints; + arraySize = &m_pInstrument->nPitchEnv; + break; + } + + if(array && arraySize) + { + for(UINT i = 0; i<*arraySize; i++) + { + (*array)[i] *= factor; + + //Checking that the order of points is preserved. + if(i > 0 && (*array)[i] <= (*array)[i-1]) + (*array)[i] = (*array)[i-1]+1; + } + } + } + + CDialog::OnOK(); +} + +BOOL CScaleEnvPointsDlg::OnInitDialog() +//------------------------------------- +{ + CDialog::OnInitDialog(); + + SetDlgItemText(IDC_EDIT_FACTOR, ""); + m_EditFactor.SetFocus(); + + + return FALSE; // return TRUE unless you set the focus to a control +} Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,33 @@ +#pragma once +#include "sndfile.h" +#include "afxwin.h" + +// CScaleEnvPointsDlg dialog + +//======================================= +class CScaleEnvPointsDlg : public CDialog +//======================================= +{ + DECLARE_DYNAMIC(CScaleEnvPointsDlg) + +public: + CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env); // standard constructor + virtual ~CScaleEnvPointsDlg(); + +// Dialog Data + enum { IDD = IDD_SCALE_ENV_POINTS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() + +private: + INSTRUMENTHEADER* m_pInstrument; + BYTE m_Env; //To tell which envelope to process. + CEdit m_EditFactor; +protected: + virtual void OnOK(); +public: + virtual BOOL OnInitDialog(); +}; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -3,17 +3,20 @@ #include "TuningDialog.h" #include <algorithm> #include "misc_util.h" +#include ".\tuningdialog.h" const string CTuningDialog::s_stringTypeGEN = "General"; const string CTuningDialog::s_stringTypeRP = "Ratio periodic"; const string CTuningDialog::s_stringTypeTET = "TET"; +const CTuningDialog::TUNINGTREEITEM CTuningDialog::s_notFoundItemTuning = TUNINGTREEITEM(); +const HTREEITEM CTuningDialog::s_notFoundItemTree = NULL; + /* TODOS: --Clear tuning(when copying existing tuning, it might have - e.g. unwanted note names which should able to be removed. --Drag'n'drop tuningfiles +-Clear tuning -Tooltips. +-Create own dialogs for Tuning collection part, and Tuning part. */ @@ -25,7 +28,11 @@ m_TuningCollections(rVec), m_TempTunings("Sandbox"), m_NoteEditApply(true), - m_RatioEditApply(true) + m_RatioEditApply(true), + m_pActiveTuningCollection(NULL), + m_TreeItemTuningItemMap(s_notFoundItemTree, s_notFoundItemTuning), + m_TreeCtrlTuning(this), + m_DoErrorExit(false) //---------------------------------------- { m_pActiveTuning = pTun; @@ -39,37 +46,129 @@ { for(size_t i = 0; i<m_TuningCollections.size(); i++) { - vector<CTuningCollection*>::iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), m_TuningCollections[i]); - if(iter != m_DeletableTuningCollections.end()) + if(IsDeletable(m_TuningCollections[i])) { delete m_TuningCollections[i]; - m_DeletableTuningCollections.erase(iter); + m_TuningCollections[i] = NULL; } } m_TuningCollections.clear(); m_DeletableTuningCollections.clear(); } +HTREEITEM CTuningDialog::AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter) +//--------------------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pTC->GetName().c_str(), parent, insertAfter); + HTREEITEM temp2 = NULL; + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pTC)); + for(size_t i = 0; i<pTC->GetNumTunings(); i++) + { + temp2 = AddTreeItem(&pTC->GetTuning(i), temp, temp2); + } + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +HTREEITEM CTuningDialog::AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter) +//----------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pT->GetName().c_str(), parent, insertAfter); + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pT)); + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +void CTuningDialog::DeleteTreeItem(CTuning* pT) +//--------------------------------------------- +{ + if(!pT) + return; + + HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pT)); + if(temp) + { + HTREEITEM nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT); + if(!nextitem) nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS); + m_pActiveTuning = m_TreeItemTuningItemMap.GetMapping_12(nextitem).GetT(); + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + + } +} + +void CTuningDialog::DeleteTreeItem(CTuningCollection* pTC) +//--------------------------------------------- +{ + if(!pTC) + return; + + m_pActiveTuning = NULL; + const HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)); + if(temp) + { + TUNINGTREEITEM prevTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS)); + TUNINGTREEITEM nextTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT)); + + CTuningCollection* pTCprev = prevTTI.GetTC(); + CTuningCollection* pTCnext = nextTTI.GetTC(); + if(pTCnext == NULL) + pTCnext = GetpTuningCollection(nextTTI.GetT()); + if(pTCprev == NULL) + pTCprev = GetpTuningCollection(prevTTI.GetT()); + + if(pTCnext != NULL && pTCnext != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCnext; + else + { + if(pTCprev != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCprev; + else + m_pActiveTuningCollection = NULL; + } + + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + } + else + { + ASSERT(false); + m_DoErrorExit = true; + m_pActiveTuningCollection = NULL; + } +} + BOOL CTuningDialog::OnInitDialog() //-------------------------------- { CDialog::OnInitDialog(); - + m_RatioMapWnd.Init(this, 0); - //Adding tuning collection names to the combobox. + //-->Creating treeview + m_TreeItemTuningItemMap.ClearMapping(); for(size_t i = 0; i<m_TuningCollections.size(); i++) { - m_CombobTuningCollection.AddString(m_TuningCollections[i]->GetName().c_str()); + AddTreeItem(m_TuningCollections[i], NULL, NULL); } + //<-- Creating treeview - //Adding tuning type names to corresponding combobox + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + //Adding tuning type names to corresponding combobox. m_CombobTuningType.AddString(s_stringTypeGEN.c_str()); m_CombobTuningType.AddString(s_stringTypeRP.c_str()); m_CombobTuningType.AddString(s_stringTypeTET.c_str()); m_ButtonSet.EnableWindow(FALSE); + //#ifdef DEBUG + m_EditTuningCollectionVersion.ShowWindow(SW_SHOW); + m_EditTuningCollectionEditMask.ShowWindow(SW_SHOW); + //#endif + m_EditFineTuneSteps.SetLimitText(3); UpdateView(); @@ -77,117 +176,155 @@ return TRUE; } -void CTuningDialog::UpdateView() + +void CTuningDialog::UpdateView(const int updateMask) //------------------------------ { - - if(m_pActiveTuning == NULL && (m_TuningCollections.size() == 0 || m_TuningCollections[0]->GetNumTunings() == 0)) + if(m_DoErrorExit) { - ASSERT(false); + DoErrorExit(); return; } - if(m_pActiveTuning == NULL) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - - - //Finding out where given tuning belongs to. - size_t curTCol = 0, curT = 0; //cur <-> Current, T <-> Tuning, Col <-> Collection. - bool found = false; - for(size_t i = 0; i<m_TuningCollections.size(); i++) + //-->Updating treeview + if(updateMask != UM_TUNINGDATA) { - CTuningCollection& rCurTCol = *m_TuningCollections.at(i); - for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + TUNINGTREEITEM tuningitem; + if(m_pActiveTuning) + tuningitem.Set(m_pActiveTuning); + else { - if(m_pActiveTuning == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) - { - curTCol = i; - curT = j; - found = true; - break; - } + if(m_pActiveTuningCollection) + tuningitem.Set(m_pActiveTuningCollection); } + HTREEITEM treeitem = m_TreeItemTuningItemMap.GetMapping_21(tuningitem); + if(treeitem) + { + m_TreeCtrlTuning.Select(treeitem, TVGN_CARET); + if(m_pActiveTuning) + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuning->GetName().c_str()); + else + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuningCollection->GetName().c_str()); + } } - ASSERT(found); + //<--Updating treeview + - m_CombobTuningCollection.SetCurSel(curTCol); - OnCbnSelchangeComboTcol(); - m_CombobTuningCollection.Invalidate(); + if(m_pActiveTuningCollection == NULL) + { + return; + } - m_CombobTuningName.SetCurSel(curT); - m_CombobTuningName.Invalidate(); + //Updating tuning collection part--> + if(updateMask == 0 || updateMask & UM_TUNINGCOLLECTION) + { + m_EditTuningCollectionName.SetWindowText(m_pActiveTuningCollection->GetName().c_str()); + m_EditTuningCollectionVersion.SetWindowText(m_pActiveTuningCollection->GetVersionString().c_str()); + m_EditTuningCollectionEditMask.SetWindowText(m_pActiveTuningCollection->GetEditMaskString().c_str()); + m_EditTuningCollectionItemNum.SetWindowText(Stringify(m_pActiveTuningCollection->GetNumTunings()).c_str()); + m_EditTuningCollectionPath.SetWindowText(m_pActiveTuningCollection->GetSaveFilePath().c_str()); + } + //<-- Updating tuning collection part + //Updating tuning part--> + if(m_pActiveTuning != NULL && (updateMask & UM_TUNINGDATA || updateMask == 0)) + { + UpdateTuningType(); - UpdateTuningType(); + m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); + m_EditName.Invalidate(); - m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); - m_EditName.Invalidate(); + //Finetunesteps-edit + m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); + m_EditFineTuneSteps.Invalidate(); - //Finetunesteps-edit - m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); - m_EditFineTuneSteps.Invalidate(); + //Making sure that ratiomap window is showing and + //updating its content. + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_RatioMapWnd.m_pTuning = m_pActiveTuning; + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - //.Making sure that ratiomap window is showing and - //updating its content. - m_RatioMapWnd.ShowWindow(SW_SHOW); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - m_RatioMapWnd.Invalidate(); - UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - - const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); - const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); - if(period > 0) - { - m_EditSteps.EnableWindow(); - m_EditSteps.SetWindowText(Stringify(period).c_str()); + const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); + const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); + if(period > 0) + { + m_EditSteps.EnableWindow(); + m_EditSteps.SetWindowText(Stringify(period).c_str()); - m_EditRatioPeriod.EnableWindow(); - m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); - } - else //case: m_pActiveTuning is of type general. - { - m_EditSteps.EnableWindow(false); - m_EditRatioPeriod.EnableWindow(false); - } + m_EditRatioPeriod.EnableWindow(); + m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); + } + else //case: m_pActiveTuning is of type general. + { + m_EditSteps.EnableWindow(false); + m_EditRatioPeriod.EnableWindow(false); + } - m_EditRatioPeriod.Invalidate(); - m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); + m_EditSteps.Invalidate(); - bool enableControls = true; - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || + bool enableControls = true; + + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - { - CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - m_ButtonReadOnly.EnableWindow(FALSE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) + m_ButtonReadOnly.EnableWindow(FALSE); + else + m_ButtonReadOnly.EnableWindow(TRUE); + + enableControls = false; + } else - m_ButtonReadOnly.EnableWindow(TRUE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); + m_ButtonReadOnly.EnableWindow(); + } - enableControls = false; + m_CombobTuningType.EnableWindow(enableControls); + m_EditTableSize.SetReadOnly(!enableControls); + m_EditBeginNote.SetReadOnly(!enableControls); + m_EditSteps.SetReadOnly(!enableControls); + m_EditRatioPeriod.SetReadOnly(!enableControls); + m_EditRatio.SetReadOnly(!enableControls); + m_EditNotename.SetReadOnly(!enableControls); + m_EditMiscActions.SetReadOnly(!enableControls); + m_EditFineTuneSteps.SetReadOnly(!enableControls); + m_EditName.SetReadOnly(!enableControls); + + m_ButtonSet.EnableWindow(enableControls); + + m_CombobTuningType.Invalidate(); + m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); } - else + else { - CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); - m_ButtonReadOnly.EnableWindow(); - } + if(m_pActiveTuning == NULL) //No active tuning, clearing tuning part. + { + m_EditName.SetWindowText(""); + m_EditTableSize.SetWindowText(""); + m_EditBeginNote.SetWindowText(""); + m_EditSteps.SetWindowText(""); + m_EditRatioPeriod.SetWindowText(""); + m_EditRatio.SetWindowText(""); + m_EditNotename.SetWindowText(""); + m_EditMiscActions.SetWindowText(""); + m_EditFineTuneSteps.SetWindowText(""); + m_EditName.SetWindowText(""); - m_CombobTuningType.EnableWindow(enableControls); - m_EditTableSize.SetReadOnly(!enableControls); - m_EditBeginNote.SetReadOnly(!enableControls); - m_EditSteps.SetReadOnly(!enableControls); - m_EditRatioPeriod.SetReadOnly(!enableControls); - m_EditRatio.SetReadOnly(!enableControls); - m_EditNotename.SetReadOnly(!enableControls); - m_EditMiscActions.SetReadOnly(!enableControls); - m_EditFineTuneSteps.SetReadOnly(!enableControls); - m_EditName.SetReadOnly(!enableControls); - - m_ButtonSet.EnableWindow(enableControls); - - m_CombobTuningType.Invalidate(); - m_EditSteps.Invalidate(); - m_EditRatioPeriod.Invalidate(); + m_CombobTuningType.SetCurSel(-1); + m_ButtonReadOnly.EnableWindow(FALSE); + + m_RatioMapWnd.ShowWindow(SW_HIDE); + m_RatioMapWnd.m_pTuning = NULL; + m_RatioMapWnd.Invalidate(); + } + } + //<--Updating tuning part } @@ -196,16 +333,11 @@ { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATICRATIOMAP, m_RatioMapWnd); - DDX_Control(pDX, IDC_COMBO_TCOL, m_CombobTuningCollection); - DDX_Control(pDX, IDC_COMBO_T, m_CombobTuningName); DDX_Control(pDX, IDC_COMBO_TTYPE, m_CombobTuningType); DDX_Control(pDX, IDC_EDIT_TABLESIZE, m_EditTableSize); DDX_Control(pDX, IDC_EDIT_BEGINNOTE, m_EditBeginNote); DDX_Control(pDX, IDC_EDIT_STEPS, m_EditSteps); DDX_Control(pDX, IDC_EDIT_RATIOPERIOD, m_EditRatioPeriod); - DDX_Control(pDX, IDC_CHECK_NEWTUNING, m_CheckNewTuning); - DDX_Control(pDX, IDC_ADD_TUNING, m_ButtonAddTuning); - DDX_Control(pDX, IDC_REMOVE_TUNING, m_ButtonRemoveTuning); DDX_Control(pDX, IDC_EDIT_RATIOVALUE, m_EditRatio); DDX_Control(pDX, IDC_EDIT_NOTENAME, m_EditNotename); DDX_Control(pDX, IDC_BUTTON_SETVALUES, m_ButtonSet); @@ -215,19 +347,20 @@ DDX_Control(pDX, IDC_EDIT_FINETUNESTEPS, m_EditFineTuneSteps); DDX_Control(pDX, IDC_CHECK_READONLY, m_ButtonReadOnly); DDX_Control(pDX, IDC_EDIT_NAME, m_EditName); + DDX_Control(pDX, IDC_TREE_TUNING, m_TreeCtrlTuning); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_NAME, m_EditTuningCollectionName); + DDX_Control(pDX, IDC_EDIT_TUNINGC_VERSION, m_EditTuningCollectionVersion); + DDX_Control(pDX, IDC_EDIT_TUNINGC_EDITMASK, m_EditTuningCollectionEditMask); + DDX_Control(pDX, IDC_EDIT_TUNINGNUM, m_EditTuningCollectionItemNum); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_PATH, m_EditTuningCollectionPath); } + BEGIN_MESSAGE_MAP(CTuningDialog, CDialog) - ON_CBN_SELCHANGE(IDC_COMBO_TCOL, OnCbnSelchangeComboTcol) - ON_CBN_SELCHANGE(IDC_COMBO_T, OnCbnSelchangeComboT) - ON_BN_CLICKED(IDC_CHECK_NEWTUNING, OnBnClickedCheckNewtuning) ON_CBN_SELCHANGE(IDC_COMBO_TTYPE, OnCbnSelchangeComboTtype) ON_EN_CHANGE(IDC_EDIT_STEPS, OnEnChangeEditSteps) ON_EN_CHANGE(IDC_EDIT_RATIOPERIOD, OnEnChangeEditRatioperiod) - ON_BN_CLICKED(IDC_ADD_TUNING, OnBnClickedAddTuning) - ON_BN_CLICKED(IDC_REMOVE_TUNING, OnBnClickedRemoveTuning) - ON_CBN_EDITCHANGE(IDC_COMBO_T, OnCbnEditchangeComboT) ON_EN_CHANGE(IDC_EDIT_NOTENAME, OnEnChangeEditNotename) ON_BN_CLICKED(IDC_BUTTON_SETVALUES, OnBnClickedButtonSetvalues) ON_EN_CHANGE(IDC_EDIT_RATIOVALUE, OnEnChangeEditRatiovalue) @@ -241,72 +374,39 @@ ON_EN_KILLFOCUS(IDC_EDIT_RATIOPERIOD, OnEnKillfocusEditRatioperiod) ON_EN_KILLFOCUS(IDC_EDIT_RATIOVALUE, OnEnKillfocusEditRatiovalue) ON_EN_KILLFOCUS(IDC_EDIT_NOTENAME, OnEnKillfocusEditNotename) + ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_TUNING, OnTvnSelchangedTreeTuning) + ON_NOTIFY(TVN_DELETEITEM, IDC_TREE_TUNING, OnTvnDeleteitemTreeTuning) + ON_NOTIFY(NM_RCLICK, IDC_TREE_TUNING, OnNMRclickTreeTuning) + ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_TUNING, OnTvnBegindragTreeTuning) + ON_COMMAND(ID_REMOVETUNING, OnRemoveTuning) + ON_COMMAND(ID_ADDTUNING, OnAddTuning) + ON_COMMAND(ID_MOVETUNING, OnMoveTuning) + ON_COMMAND(ID_COPYTUNING, OnCopyTuning) + ON_COMMAND(ID_REMOVETUNINGCOLLECTION, OnRemoveTuningCollection) + ON_BN_CLICKED(IDC_BUTTON_TUNINGCOLLECTION_SAVE, OnBnClickedButtonTuningcollectionSave) END_MESSAGE_MAP() -// CTuningDialog message handlers - -void CTuningDialog::OnCbnSelchangeComboTcol() -//------------------------------------------- +void CTuningDialog::DoErrorExit() +//------------------------------- { - const int curTCol = m_CombobTuningCollection.GetCurSel(); - if(curTCol < 0 || curTCol >= static_cast<int>(m_TuningCollections.size())) return; - - //Checking whether collection allows removing - if(m_TuningCollections[curTCol]->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(true); - else - m_ButtonRemoveTuning.EnableWindow(false); - - //Clearing existing items from name-combobox... - while(m_CombobTuningName.GetCount() > 0) - m_CombobTuningName.DeleteString(0); - - //...adding names of tunings in the current tuning collection... - CTuningCollection& rTCol = *m_TuningCollections.at(curTCol); - for(size_t i = 0; i<rTCol.GetNumTunings(); i++) - { - m_CombobTuningName.AddString(rTCol.GetTuning(static_cast<unsigned short>(i)).GetName().c_str()); - } - - //Checking whether tuning collection allows adding - //tunings... - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_ADD)) - m_ButtonAddTuning.EnableWindow(); - else - m_ButtonAddTuning.EnableWindow(false); - - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(); - else - m_ButtonRemoveTuning.EnableWindow(FALSE); + m_DoErrorExit = false; + m_pActiveTuning = NULL; + m_pActiveTuningCollection = NULL; + MsgBox(IDS_ERR_DIALOG, this, NULL, MB_ICONINFORMATION); + OnOK(); } -void CTuningDialog::OnCbnSelchangeComboT() -//---------------------------------------- -{ - const int TCol = m_CombobTuningCollection.GetCurSel(); - if(TCol < 0 || TCol >= static_cast<int>(m_TuningCollections.size())) return; - CTuningCollection& rTCol = *m_TuningCollections.at(TCol); +// CTuningDialog message handlers - //...checking that tuning index is valid... - const unsigned short T = static_cast<unsigned short>(m_CombobTuningName.GetCurSel()); - if(T < 0 || T >= rTCol.GetNumTunings()) - return; - - m_pActiveTuning = &rTCol.GetTuning(T); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - - UpdateView(); -} - void CTuningDialog::UpdateTuningType() //------------------------------------ { if(m_pActiveTuning) { - ASSERT(m_CombobTuningType.GetCount() > 0); + if(m_CombobTuningType.GetCount() < 3) m_DoErrorExit = true; + if(m_pActiveTuning->GetTuningType() == CTuning::TT_TET) m_CombobTuningType.SetCurSel(2); else @@ -317,12 +417,7 @@ } } -void CTuningDialog::OnBnClickedCheckNewtuning() -//--------------------------------------------- -{ -} - CTuning::CTUNINGTYPE CTuningDialog::GetTuningTypeFromStr(const string& str) const //-------------------------------------------------------------------------------- { @@ -350,6 +445,8 @@ { if(MessageBox("This will change the ratio values; continue?", 0, MB_YESNO) == IDYES) { + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + const size_t BS = 20; char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); @@ -369,7 +466,7 @@ if(newType == CTuning::TT_TET) m_pActiveTuning->CreateTET(steps, pr); - UpdateView(); + UpdateView(UM_TUNINGDATA); } else //Not wanting to discard current values. { @@ -399,88 +496,6 @@ } -void CTuningDialog::OnBnClickedAddTuning() -//----------------------------------------- -{ - if(m_pActiveTuning == NULL) //Should never be true. - return; - - if(m_pActiveTuning->GetName().length() == 0) - { - MessageBox("Please give name for the tuning", 0, MB_OK); - return; - } - - if(m_CombobTuningCollection.GetCurSel() < 0 || m_CombobTuningCollection.GetCurSel() >= static_cast<int>(m_TuningCollections.size())) - { - MessageBox("No tuning collection chosen", 0, MB_OK); - return; - } - - CTuningCollection& rTCol = *m_TuningCollections[m_CombobTuningCollection.GetCurSel()]; - - string detailStr = string("Add tuning to '") + rTCol.GetName() + string("'(it will be create as a copy of current tuning)?"); - if(MessageBox(detailStr.c_str(), 0, MB_YESNO) == IDYES) - { - CTuning* pNewTuning = new CTuningRTI(m_pActiveTuning); - if(rTCol.AddTuning(pNewTuning)) - { - MessageBox("Add tuning failed"); - delete pNewTuning; - return; - } - m_pActiveTuning = pNewTuning; - UpdateView(); - } -} - -void CTuningDialog::OnBnClickedRemoveTuning() -//------------------------------------------- -{ - UpdateView(); - //Now TCol and T should have the values pointing to m_pActiveTuning. - const size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - const size_t T = static_cast<size_t>(m_CombobTuningName.GetCurSel()); - if(TCol >= m_TuningCollections.size() || - T >= m_TuningCollections[TCol]->GetNumTunings()) - return; - - CTuningCollection& rTCol = *m_TuningCollections[TCol]; - const CTuning& rT = m_TuningCollections[TCol]->GetTuning(static_cast<WORD>(T)); - ASSERT(&rT == m_pActiveTuning); - string str = string("Remove tuning '") + rT.GetName() + string("' from collection ") + rTCol.GetName() + string("?"); - if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) - { - if(m_TuningCollections[TCol]->Remove(T)) - { - MessageBox("Tuning removal failed"); - return; - } - if(rTCol.GetNumTunings() > 0) - m_pActiveTuning = &rTCol.GetTuning(static_cast<WORD>(min(T, rTCol.GetNumTunings()-1))); - else - if(m_TuningCollections.size() > 0 && m_TuningCollections[0] && m_TuningCollections[0]->GetNumTunings() > 0) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - else - m_pActiveTuning = NULL; - - UpdateView(); - } -} - -void CTuningDialog::OnCbnEditchangeComboT() -//----------------------------------------- -{ - if(m_pActiveTuning != NULL) - { - const size_t BS = 40; - char buffer[BS]; - m_CombobTuningName.GetWindowText(buffer, BS); - m_pActiveTuning->SetName(buffer); - UpdateView(); - } -} - void CTuningDialog::OnEnChangeEditNotename() //------------------------------------------ { @@ -508,6 +523,7 @@ else m_pActiveTuning->ClearNoteName(currentNote); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_RatioMapWnd.Invalidate(); } @@ -534,6 +550,7 @@ if(str.length() > 0) { m_pActiveTuning->SetRatio(currentNote, static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; UpdateTuningType(); m_RatioMapWnd.Invalidate(); } @@ -552,6 +569,7 @@ char buffer[BS]; m_EditMiscActions.GetWindowText(buffer, BS); m_pActiveTuning->Multiply(static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditMiscActions.SetWindowText(""); m_RatioMapWnd.Invalidate(); } @@ -577,18 +595,18 @@ void CTuningDialog::OnBnClickedButtonExport() //------------------------------------------- { - CTuningCollection* pTC = NULL; //Used if exporting tuning collection. - const CTuning* pT = m_pActiveTuning; + const CTuningCollection* pTC = m_pActiveTuningCollection; - if(pT == NULL) + if(pT == NULL && pTC == NULL) + { + MsgBox(IDS_ERR_NO_TUNING_SELECTION, this, NULL, MB_ICONINFORMATION); return; - - size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - if(TCol < m_TuningCollections.size()) - pTC = m_TuningCollections[TCol]; + } - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); + string filter; + if(pT != NULL) + filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); if(pTC != NULL) filter += string("Tuning collection files (") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); @@ -626,8 +644,9 @@ //------------------------------------------- { //TODO: Ability to import ratios from text file. - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|") + - string("Tuning collection files (*") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); + string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(", *") + CTuningCollection::s_FileExtension + string(")|*") + + CTuning::s_FileExtension + string(";*") + CTuningCollection::s_FileExtension + string("|"); + CFileDialog dlg(TRUE, NULL, NULL, @@ -653,6 +672,8 @@ { m_TempTunings.AddTuning(pT); m_pActiveTuning = pT; + + AddTreeItem(m_pActiveTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(&m_TempTunings)), NULL); UpdateView(); } } @@ -664,8 +685,8 @@ //a separate collection - no possibility to //directly replace some collection. CTuningCollection* pNewTCol = new CTuningCollection; - ifstream fin(dlg.GetPathName(), ios::binary); - failure = pNewTCol->UnSerializeBinary(fin); + pNewTCol->SetSavefilePath(static_cast<LPCTSTR>(dlg.GetPathName())); + failure = pNewTCol->UnSerializeBinary(); if(failure) { delete pNewTCol; pNewTCol = 0; @@ -674,8 +695,7 @@ { m_TuningCollections.push_back(pNewTCol); m_DeletableTuningCollections.push_back(pNewTCol); - m_CombobTuningCollection.AddString(pNewTCol->GetName().c_str()); - m_CombobTuningCollection.SetCurSel(m_CombobTuningCollection.GetCount()-1); + AddTreeItem(pNewTCol, NULL, NULL); UpdateView(); } @@ -703,6 +723,7 @@ char buffer[BS]; m_EditFineTuneSteps.GetWindowText(buffer, BS); m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->SetFineStepCount(static_cast<CTuning::FINESTEPTYPE>(atoi(buffer)))).c_str()); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditFineTuneSteps.Invalidate(); } } @@ -719,15 +740,16 @@ if(m_pActiveTuning->SetEditMask(CTuning::EM_CONST)) CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } else { if(m_pActiveTuning->SetEditMask(CTuning::EM_ALLOWALL)) CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; } @@ -740,7 +762,9 @@ char buffer[BS]; m_EditName.GetWindowText(buffer, BS); m_pActiveTuning->SetName(buffer); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); + UpdateView(UM_TUNINGCOLLECTION); } } @@ -754,7 +778,8 @@ char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriod(static_cast<CTuning::STEPTYPE>(atoi(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } @@ -768,20 +793,489 @@ char buffer[BS]; m_EditRatioPeriod.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriodRatio(static_cast<CTuning::RATIOTYPE>(atof(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } void CTuningDialog::OnEnKillfocusEditRatiovalue() //----------------------------------------------- { - UpdateView(); + UpdateView(UM_TUNINGDATA); } void CTuningDialog::OnEnKillfocusEditNotename() //----------------------------------------------- { + UpdateView(UM_TUNINGDATA); +} + +bool CTuningDialog::GetModifiedStatus(const CTuningCollection* const pTc) const +//----------------------------------------------------------------------------- +{ + MODIFIED_MAP::const_iterator iter = m_ModifiedTCs.find(pTc); + if(iter != m_ModifiedTCs.end()) + return (*iter).second; + else + return false; + +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(HTREEITEM ti) const +//------------------------------------------------------------------------ +{ + //If treeitem is that of a tuningcollection, return address of + //that tuning collection. If treeitem is that of a tuning, return + //the owning tuningcollection + TUNINGTREEITEM tunItem = m_TreeItemTuningItemMap.GetMapping_12(ti); + CTuningCollection* pTC = tunItem.GetTC(); + if(pTC) + return pTC; + else + { + CTuning* pT = tunItem.GetT(); + return GetpTuningCollection(pT); + } +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(const CTuning* const pT) const +//----------------------------------------------------------------- +{ + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + CTuningCollection& rCurTCol = *m_TuningCollections.at(i); + for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + { + if(pT == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) + { + return &rCurTCol; + } + } + } + return NULL; +} + + +void CTuningDialog::OnTvnSelchangedTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + //This methods gets called when selected item in the treeview + //changes. + + //TODO: This gets called before killfocus messages of edits, this + // can be a problem. + + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + + TUNINGTREEITEM ti = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(ti) + { + int updateMask = UM_TUNINGDATA; + CTuningCollection* pPrevTuningCollection = m_pActiveTuningCollection; + CTuning* pT = ti.GetT(); + CTuningCollection* pTC = ti.GetTC(); + if(pTC) + { + m_pActiveTuningCollection = pTC; + ASSERT(pT == NULL); + m_pActiveTuning = NULL; + } + else + { + m_pActiveTuning = pT; + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + } + if(m_pActiveTuningCollection != pPrevTuningCollection) updateMask |= UM_TUNINGCOLLECTION; + UpdateView(updateMask); + } + else + { + m_DoErrorExit = true; + } + + *pResult = 0; +} + +void CTuningDialog::OnTvnDeleteitemTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + // TODO: Add your control notification handler code here + *pResult = 0; + if(pNMTreeView->itemOld.mask & TVIF_HANDLE && pNMTreeView->itemOld.hItem) + { + m_TreeItemTuningItemMap.RemoveValue_1(pNMTreeView->itemOld.hItem); + } + else + m_DoErrorExit = true; +} + +void CTuningDialog::OnNMRclickTreeTuning(NMHDR *, LRESULT *pResult) +//----------------------------------------------------------------------- +{ + *pResult = 0; + + HTREEITEM hItem; + POINT point, ptClient; + + GetCursorPos(&point); + ptClient = point; + m_TreeCtrlTuning.ScreenToClient(&ptClient); + hItem = m_TreeCtrlTuning.HitTest(ptClient, NULL); + if(hItem == NULL) + return; + + m_TreeCtrlTuning.Select(hItem, TVGN_CARET); + + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(hItem); + + if(!tunitem) + { + m_DoErrorExit = true; + return; + } + + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + CTuning* pT = tunitem.GetT(); + CTuningCollection* pTC = tunitem.GetTC(); + + if(pT) //Creating context menu for tuning-item + { + pTC = GetpTuningCollection(pT); + if(pTC != NULL) + { + UINT mask = MF_STRING; + if(!pTC->CanEdit(CTuningCollection::EM_REMOVE)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNING, "Remove"); + + m_CommandItemDest.Set(pT); + } + } + else //Creating context menu for tuning collection item. + { + if(pTC != NULL) + { + UINT mask = MF_STRING; + + if(!pTC->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_ADDTUNING, "Add tuning"); + + mask = MF_STRING; + if(!IsDeletable(pTC)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNINGCOLLECTION, "Delete tuning collection"); + + m_CommandItemDest.Set(pTC); + } + } + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); +} + +bool CTuningDialog::IsDeletable(const CTuningCollection* const pTC) const +//-------------------------------------------------------------------------------- +{ + vector<CTuningCollection*>::const_iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), pTC); + if(iter != m_DeletableTuningCollections.end()) + return true; + else + return false; +} + + +void CTuningDialog::OnTvnBegindragTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//--------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + *pResult = 0; + + m_CommandItemDest.Reset(); + m_CommandItemSrc.Reset(); + if(pNMTreeView == NULL || pNMTreeView->itemNew.hItem == NULL) return; + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(tunitem.GetT() == NULL) + { + MsgBox(IDS_UNSUPPORTED_TUNING_DnD, this); + return; + } + + m_TreeCtrlTuning.SetDragging(); + m_DragItem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + m_TreeCtrlTuning.Select(pNMTreeView->itemNew.hItem, TVGN_CARET); +} + +void CTuningDialog::OnEndDrag(HTREEITEM dragDestItem) +//-------------------------------------------------- +{ + m_TreeCtrlTuning.SetDragging(false); + if(m_DragItem == NULL) + return; + + m_CommandItemSrc = m_DragItem; + m_DragItem.Reset(); + + TUNINGTREEITEM destTunItem = m_TreeItemTuningItemMap.GetMapping_12(dragDestItem); + if(!destTunItem) + return; + + CTuningCollection* pTCdest = NULL; + CTuningCollection* pTCsrc = m_CommandItemSrc.GetTC(); + + if(pTCsrc == NULL) + pTCsrc = GetpTuningCollection(m_CommandItemSrc.GetT()); + + if(pTCsrc == NULL) + { + ASSERT(false); + return; + } + + if(destTunItem.GetT()) //Item dragged on tuning + pTCdest = GetpTuningCollection(destTunItem.GetT()); + else //Item dragged on tuningcollecition + pTCdest = destTunItem.GetTC(); + + //For now, ignoring drags within a tuning collection. + if(pTCdest == pTCsrc) + return; + + if(pTCdest) + { + UINT mask = MF_STRING; + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + POINT point; + GetCursorPos(&point); + + if(!pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + AppendMenu(popUpMenu, mask, ID_COPYTUNING, "Copy here"); + + if(!pTCsrc->CanEdit(CTuningCollection::EM_REMOVE) || + !pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask = MF_STRING | MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_MOVETUNING, "Move here"); + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); + + m_CommandItemDest.Set(pTCdest); + } +} + +bool CTuningDialog::AddTuning(CTuningCollection* pTC, CTuning* pT) +//---------------------------------------------------------------- +{ + //Default: pT == NULL + + if(!pTC) + { + MessageBox("No tuning collection chosen", 0, MB_OK); + return true; + } + + CTuning* pNewTuning = new CTuningRTI(pT); + if(pTC->AddTuning(pNewTuning)) + { + MessageBox("Add tuning failed"); + delete pNewTuning; + return true; + } + AddTreeItem(pNewTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)), NULL); + m_pActiveTuning = pNewTuning; + m_ModifiedTCs[pTC] = true; UpdateView(); + + return false; } +void CTuningDialog::OnAddTuning() +//------------------------------- +{ + if(!m_CommandItemDest.GetTC()) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + m_CommandItemDest = s_notFoundItemTuning; + m_ModifiedTCs[pTC]; + AddTuning(pTC); +} + +void CTuningDialog::OnRemoveTuning() +//---------------------------------- +{ + CTuning* pT = m_CommandItemDest.GetT(); + if(m_CommandItemDest.GetT()) + { + CTuningCollection* pTC = GetpTuningCollection(pT); + if(pTC) + { + string str = string("Remove tuning '") + pT->GetName() + string("' from ' ") + pTC->GetName() + string("'?"); + if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) + { + if(!pTC->Remove(pT)) + { + m_ModifiedTCs[pTC] = true; + DeleteTreeItem(pT); + UpdateView(); + } + else + { + MessageBox("Tuning removal failed"); + } + } + } + } + + m_CommandItemDest = s_notFoundItemTuning; +} + +void CTuningDialog::OnMoveTuning() +//-------------------------------- +{ + if(!m_CommandItemDest) + return; + + CTuning* pT = m_CommandItemSrc.GetT(); + CTuningCollection* pTCsrc = GetpTuningCollection(pT); + + if(pT == NULL) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTCdest = NULL; + if(m_CommandItemDest.GetT()) + pTCdest = GetpTuningCollection(m_CommandItemDest.GetT()); + else + pTCdest = m_CommandItemDest.GetTC(); + + + HTREEITEM treeItemSrcTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCsrc)); + HTREEITEM treeItemDestTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCdest)); + DeleteTreeItem(pT); + m_ModifiedTCs[pTCsrc] = true; + if(CTuningCollection::TransferTuning(pTCsrc, pTCdest, pT)) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_OK); + AddTreeItem(pT, treeItemSrcTC, NULL); + } + else + AddTreeItem(pT, treeItemDestTC, NULL); + + UpdateView(); +} + + +void CTuningDialog::OnCopyTuning() +//-------------------------------- +{ + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + + if(!pTC) + return; + + m_CommandItemDest = s_notFoundItemTuning; + + CTuning* pT = m_CommandItemSrc.GetT(); + if(pT == NULL) + { + return; + } + m_ModifiedTCs[pTC] = true; + AddTuning(pTC, pT); +} + +void CTuningDialog::OnRemoveTuningCollection() +//-------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(!IsDeletable(m_pActiveTuningCollection)) + { + ASSERT(false); + return; + } + + TUNINGVECTOR::iterator iter = find(m_TuningCollections.begin(), m_TuningCollections.end(), m_pActiveTuningCollection); + if(iter == m_TuningCollections.end()) + { + ASSERT(false); + return; + } + TUNINGVECTOR::iterator DTCiter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), *iter); + CTuningCollection* deletableTC = m_pActiveTuningCollection; + //Note: Order matters in the following lines. + m_DeletableTuningCollections.erase(DTCiter); + m_TuningCollections.erase(iter); + DeleteTreeItem(m_pActiveTuningCollection); + delete deletableTC; deletableTC = 0; + + UpdateView(); +} + + +void CTuningDialog::OnBnClickedButtonTuningcollectionSave() +//--------------------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(m_pActiveTuningCollection->SerializeBinary()) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_ICONINFORMATION); + } + else + { + m_ModifiedTCs[m_pActiveTuningCollection] = false; + } +} + + +//////////////////////////////////////////////////////// +//*************** +//CTuningTreeCtrl +//*************** +//////////////////////////////////////////////////////// + +BEGIN_MESSAGE_MAP(CTuningTreeCtrl, CTreeCtrl) + ON_WM_LBUTTONUP() +END_MESSAGE_MAP() + + +void CTuningTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) +//----------------------------------------------------------- +{ + if(IsDragging()) + { + HTREEITEM hItem; + hItem = HitTest(point, NULL); + m_rParentDialog.OnEndDrag(hItem); + + CTreeCtrl::OnLButtonUp(nFlags, point); + } +} + + Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-02-03 21:24:42 UTC (rev 172) @@ -5,11 +5,179 @@ #include "tuningcollection.h" #include <vector> #include <string> +#include "afxcmn.h" +#include "afxwin.h" using std::vector; using std::string; +//========================== +template<class T1, class T2> +class CBijectiveMap +//========================== +{ +public: + CBijectiveMap(const T1& a, const T2& b) + : m_NotFoundT1(a), + m_NotFoundT2(b) + {} + void AddPair(const T1& a, const T2& b) + { + m_T1.push_back(a); + m_T2.push_back(b); + } + + void ClearMapping() + { + m_T1.clear(); + m_T2.clear(); + } + + size_t Size() const + { + ASSERT(m_T1.size() == m_T2.size()); + return m_T1.size(); + } + + void RemoveValue_1(const T1& a) + { + vector<T1>::iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + m_T2.erase(m_T2.begin() + (iter-m_T1.begin())); + m_T1.erase(iter); + } + } + + void RemoveValue_2(const T2& b) + { + vector<T2>::iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + m_T1.erase(m_T1.begin() + (iter-m_T2.begin())); + m_T2.erase(iter); + } + } + + T2 GetMapping_12(const T1& a) const + { + vector<T1>::const_iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + return m_T2[iter-m_T1.begin()]; + } + else + return m_NotFoundT2; + } + + T1 GetMapping_21(const T2& b) const + { + vector<T2>::const_iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + return m_T1[iter-m_T2.begin()]; + } + else + return m_NotFoundT1; + } + +private: + vector<T1> m_T1; + vector<T2> m_T2; + //Elements are collected to two arrays so that elements with the + //same index are mapped to each other. + + T1 m_NotFoundT1; + T2 m_NotFoundT2; +}; + +class CTuningDialog; + +//====================================== +class CTuningTreeCtrl : public CTreeCtrl +//====================================== +{ +private: + CTuningDialog& m_rParentDialog; +public: + CTuningTreeCtrl(CTuningDialog* parent) : m_rParentDialog(*parent) {} + //Note: Parent address may be given in initialiser list so + //do not use it. + + void SetDragging(bool state = true) {m_Dragging = state;} + bool IsDragging() {return m_Dragging;} + +private: + bool m_Dragging; + + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + DECLARE_MESSAGE_MAP() +}; + +//=================== +class CTuningTreeItem +//=================== +{ +private: + CTuning* m_pTuning; + CTuningCollection* m_pTuningCollection; + +public: + CTuningTreeItem() : m_pTuning(NULL), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuning* pT) : + m_pTuning(pT), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuningCollection* pTC) : + m_pTuning(NULL), + m_pTuningCollection(pTC) + {} + + bool operator==(const CTuningTreeItem& ti) const + { + if(m_pTuning == ti.m_pTuning && + m_pTuningCollection == ti.m_pTuningCollection) + return true; + else + return false; + } + + void Reset() {m_pTuning = NULL; m_pTuningCollection = NULL;} + + + void Set(CTuning* pT) + { + m_pTuning = pT; + m_pTuningCollection = NULL; + } + + void Set(CTuningCollection* pTC) + { + m_pTuning = NULL; + m_pTuningCollection = pTC; + } + + operator void*() + { + //Mimicing pointer behavior: if(CTuningTreeItemInstance) equals + //if(CTuningTreeItemInstance.m_pTuning != NULL || + // CTuningTreeItemInstance.m_pTuningCollection != NULL) + if(m_pTuning) + return m_pTuning; + else + return m_pTuningCollection; + } + + CTuningCollection* GetTC() {return m_pTuningCollection;} + + CTuning* GetT() {return m_pTuning;} +}; + // CTuningDialog dialog //================================== @@ -18,6 +186,8 @@ { DECLARE_DYNAMIC(CTuningDialog) + friend class CTuningTreeCtrl; + public: typedef vector<CTuningCollection*> TUNINGVECTOR; @@ -30,33 +200,52 @@ void AddTuningCollection(CTuningCollection* pTC) {if(pTC) m_TuningCollections.push_back(pTC);} void UpdateRatioMapEdits(const CTuning::STEPTYPE&); + bool GetModifiedStatus(const CTuningCollection* const pTc) const; + // Dialog Data enum { IDD = IDD_TUNING }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - DECLARE_MESSAGE_MAP() - private: CTuning::CTUNINGTYPE GetTuningTypeFromStr(const string& str) const; - void UpdateView(); + void UpdateView(const int UpdateMask = 0); void UpdateTuningType(); - + HTREEITEM AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter); + HTREEITEM AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter); + + void DeleteTreeItem(CTuning* pT); + void DeleteTreeItem(CTuningCollection* pTC); + + void OnEndDrag(HTREEITEM dragDestItem); + + CTuningCollection* GetpTuningCollection(const CTuning* const) const; + //Returns pointer to the tuning collection where tuning given as argument + //belongs to. + + CTuningCollection* GetpTuningCollection(HTREEITEM ti) const; + //Returns the address of corresponding tuningcollection; if it points + //to tuning-entry, returning the owning tuningcollection + + bool IsDeletable(const CTuningCollection* const pTC) const; + //Checks whether tuning collection can be deleted. + private: CTuningRatioMapWnd m_RatioMapWnd; TUNINGVECTOR m_TuningCollections; vector<CTuningCollection*> m_DeletableTuningCollections; CTuning* m_pActiveTuning; + CTuningCollection* m_pActiveTuningCollection; + CTuningCollection m_TempTunings; - CComboBox m_CombobTuningCollection; - CComboBox m_CombobTuningName; CComboBox m_CombobTuningType; + //Tuning Edits--> CEdit m_EditTableSize; CEdit m_EditBeginNote; CEdit m_EditSteps; @@ -66,26 +255,87 @@ CEdit m_EditMiscActions; CEdit m_EditFineTuneSteps; CEdit m_EditName; + //<--Tuning Edits + + //-->Tuning collection edits + CEdit m_EditTuningCollectionName; + CEdit m_EditTuningCollectionVersion; + CEdit m_EditTuningCollectionEditMask; + CEdit m_EditTuningCollectionItemNum; + CEdit m_EditTuningCollectionPath; + //<--Tuningcollection edits - CButton m_CheckNewTuning; - CButton m_ButtonAddTuning; - CButton m_ButtonRemoveTuning; CButton m_ButtonSet; CButton m_ButtonExport; CButton m_ButtonImport; CButton m_ButtonReadOnly; + CTuningTreeCtrl m_TreeCtrlTuning; +private: + static const string s_stringTypeGEN; + static const string s_stringTypeRP; + static const string s_stringTypeTET; + + typedef CTuningTreeItem TUNINGTREEITEM; + typedef CBijectiveMap<HTREEITEM, TUNINGTREEITEM> TREETUNING_MAP; + TREETUNING_MAP m_TreeItemTuningItemMap; + + TUNINGTREEITEM m_DragItem; + TUNINGTREEITEM m_CommandItemSrc; + TUNINGTREEITEM m_CommandItemDest; + //Commanditem is used when receiving context menu-commands, + //m_CommandItemDest is used when the command really need only + //one argument. + + typedef map<const CTuningCollection* const, bool> MODIFIED_MAP; + MODIFIED_MAP m_ModifiedTCs; + //If tuning collection seems to have been modified, its address + //is added to this map. + + enum + { + TT_TUNINGCOLLECTION = 1, + TT_TUNING + }; + + bool m_NoteEditApply; + bool m_RatioEditApply; + //To indicate whether to apply changes made to + //to those edit boxes(they are modified by non-user + //activies and in these cases the value should be applied + //to the tuning data. + + enum + { + UM_TUNINGDATA = 1, //UM <-> Update Mask + UM_TUNINGCOLLECTION = 2, + }; + + static const TUNINGTREEITEM s_notFoundItemTuning; + static const HTREEITEM s_notFoundItemTree; + + bool AddTuning(CTuningCollection*, CTuning* pT = NULL); + + bool m_DoErrorExit; + //Flag to prevent multiple exit error-messages. + + void DoErrorExit(); + + +//Treectrl context menu functions. public: - afx_msg void OnCbnSelchangeComboTcol(); - afx_msg void OnCbnSelchangeComboT(); - afx_msg void OnBnClickedCheckNewtuning(); + afx_msg void OnRemoveTuning(); + afx_msg void OnAddTuning(); + afx_msg void OnMoveTuning(); + afx_msg void OnCopyTuning(); + afx_msg void OnRemoveTuningCollection(); + +//Event-functions +public: afx_msg void OnCbnSelchangeComboTtype... [truncated message content] |
From: <Rel...@us...> - 2007-01-29 21:50:48
|
Revision: 171 http://svn.sourceforge.net/modplug/?rev=171&view=rev Author: Relabsoluness Date: 2007-01-29 13:50:16 -0800 (Mon, 29 Jan 2007) Log Message: ----------- <Relabs> Added missing misc_util.cpp and misc_util.h files. Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h Added: branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp 2007-01-29 21:50:16 UTC (rev 171) @@ -0,0 +1,44 @@ +#include "stdafx.h" +#include "misc_util.h" + + +bool StringToBinaryStream(ostream& outStream, const string& str) +//---------------------------------------------------- +{ + if(!outStream.good()) return true; + size_t size = str.size(); + outStream.write(reinterpret_cast<char*>(&size), sizeof(size)); + outStream << str; + if(outStream.good()) + return false; + else + return true; + +} + +bool StringFromBinaryStream(istream& inStrm, string& str, const size_t maxSize) +//--------------------------------------------------------- +{ + if(!inStrm.good()) return true; + size_t strSize; + inStrm.read(reinterpret_cast<char*>(&strSize), sizeof(strSize)); + + if(strSize > maxSize) + return true; + + str.resize(strSize); + + //Inefficiently reading to temporary buffer first and + //then setting that to the string. + char* buffer = new char[strSize+1]; + inStrm.read(buffer, strSize); + buffer[strSize] = '\0'; + str = buffer; + delete[] buffer; buffer = 0; + + + if(inStrm.good()) + return false; + else + return true; +} Added: branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h 2007-01-29 21:50:16 UTC (rev 171) @@ -0,0 +1,70 @@ +#ifndef MISC_UTIL_H +#define MISC_UTIL_H + +#include <vector> +#include <sstream> +#include <string> + +using namespace std; + +const UINT STRINGMAXSIZE = 1000; +const UINT VECTORMAXSIZE = 1000; +//Default sizelimits to string/vector load methods. +//Size limits are there to prevent corrupted streams from +//causing e.g. program to try to load of vector of size 2 000 000 000. + +template<class T> +bool VectorToBinaryStream(ostream& outStrm, const vector<T>& v) +//------------------------------------------------------------ +{ + if(!outStrm.good()) return true; + size_t s = v.size(); + outStrm.write(reinterpret_cast<const char*>(&s), sizeof(s)); + vector<T>::const_iterator iter = v.begin(); + for(iter; iter != v.end(); iter++) + outStrm.write(reinterpret_cast<const char*>(&(*iter)), sizeof(T)); + + if(outStrm.good()) + return false; + else + return true; +} + +template<class T> +bool VectorFromBinaryStream(istream& inStrm, vector<T>& v, const size_t maxSize = VECTORMAXSIZE) +//--------------------------------------------------------- +{ + if(!inStrm.good()) return true; + size_t size; + inStrm.read(reinterpret_cast<char*>(&size), sizeof(size)); + + if(size > maxSize) + return true; + + v.resize(size); + ASSERT(v.size() == size); + for(size_t i = 0; i<size; i++) + { + inStrm.read(reinterpret_cast<char*>(&v[i]), sizeof(T)); + } + if(inStrm.good()) + return false; + else + return true; +} + +bool StringToBinaryStream(ostream& outStream, const string& str); +bool StringFromBinaryStream(istream& inStrm, string& str, const size_t maxSize = STRINGMAXSIZE); + + +template<class T> +inline string Stringify(const T& x) +//-------------------------- +{ + std::ostringstream o; + if(!(o << x)) return "STRINGIFY() FAILURE"; + else return o.str(); +} + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <qua...@lu...> - 2006-12-28 22:16:21
|
This svn-commit never ended up to the list, so sending it manually. ------------------------------------------------------- Revision: 168 http://svn.sourceforge.net/modplug/?rev=3D168&view=3Drev Author: Relabsoluness Date: 2006-10-02 14:41:06 -0700 (Mon, 02 Oct 2006) Log Message: ----------- + <Relabs> Tuning advancements(GUI improvements, better modeffect handling = when using new tuning things, finesteps, export/import tunings/tuning colle= ctions...) / <Relabs> Pattern&order code rewriting. Increased limit of patterns and or= ders to 65000(only for MPTm) ? <Relabs> Various smaller modifications including memoryleak fix in patter= n expand. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moptions.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/PatternGotoDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/View_tre.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_tre.h branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/local_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/standard/std_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/mod2midi.cpp branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.h branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_AMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DBM.CPP branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DSM.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_669.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_ams.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_far.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mdl.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_med.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mid.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mod.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mt2.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mtm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_okt.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_psm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_ptm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_s3m.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_stm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_ult.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_wav.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_xm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.h branches/OpenMPT_MPTm_Tuning/mptrack/pattern.cpp branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.h branches/OpenMPT_MPTm_Tuning/soundlib/mod_specifications.h Property Changed: ---------------- branches/OpenMPT_MPTm_Tuning/ Property changes on: branches/OpenMPT_MPTm_Tuning ___________________________________________________________________ Name: svn:ignore + *.vcproj *.sln Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-08-20 2= 1:39:55 UTC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-10-02 2= 1:41:06 UTC (rev 168) @@ -200,7 +200,7 @@ BEGIN_CRITICAL(); // Rearrange patterns content - for(i =3D 0 ; i < MAX_PATTERNS ; i++){ + for(i =3D 0; i < m_pSndFile->Patterns.Size(); i++){ // Allocate a new empty pattern to replace current pattern at i'th position= in pattern array p =3D m_pSndFile->Patterns[i]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -157,7 +157,7 @@ { // Detecting max valid restart position UINT i =3D 0; - for (i=3D0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] =3D=3D 0xFF) brea= k; + for (i=3D0; i<m_pSndFile->Order.size(); i++) if (m_pSndFile->Order[i] =3D= =3D m_pSndFile->Patterns.GetInvalidIndex()) break; m_SpinRestartPos.SetRange(0, i); } if (dwHint & HINT_MODGENERAL) @@ -446,9 +446,9 @@ if (s[0]) { UINT n =3D atoi(s); - if (n < MAX_ORDERS) + if(n < m_pSndFile->Order.size()) { - for (UINT i=3D0; i<=3Dn; i++) if (m_pSndFile->Order[i] =3D=3D 0xFF) retur= n; + for (UINT i=3D0; i<=3Dn; i++) if (m_pSndFile->Order[i] =3D=3D m_pSndFile-= >Patterns.GetInvalidIndex()) return; if (n !=3D m_pSndFile->m_nRestartPos) { m_EditRestartPos.SetModify(FALSE); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -16,6 +16,8 @@ #pragma warning(disable:4244) +const pair<string, WORD> CCtrlInstruments::s_TuningNotFound("Tuning was no= t found. Setting to default tuning", 7); + ///////////////////////////////////////////////////////////////////////// // CNoteMapWnd @@ -161,7 +163,9 @@ // Note s[0] =3D 0; - if ((nPos >=3D 0) && (nPos < 120)) wsprintf(s, "%s%d", szNoteNames[nPos %= 12], nPos/12); + + + if ((nPos >=3D 0) && (nPos < 120)) wsprintf(s, "%s", pSndFile->GetNoteNam= e(nPos+1, m_nInstrument).c_str()); rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note @@ -174,7 +178,7 @@ UINT n =3D penv->NoteMap[nPos]; if (n =3D=3D 0xFF) strcpy(s, "=3D=3D=3D"); else if (n =3D=3D 0xFE) strcpy(s, "^^^"); else - if (n <=3D 120) wsprintf(s, "%s%d", szNoteNames[(n-1)%12], (n-1)/12); + if (n <=3D 120) wsprintf(s, "%s", pSndFile->GetNoteName(n, m_nInstrument)= .c_str()); } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame= ::brushWindow); if ((nPos =3D=3D (int)m_nNote) && (!m_bIns)) @@ -818,30 +822,12 @@ m_SpinInstrument.SetFocus(); - //-->Setting tunings to Combobox - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).= GetName().c_str()); - } - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).Get= Name().c_str()); - } - for(size_t i =3D 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) - { - m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).Ge= tName().c_str()); - } - m_ComboTuning.AddString("Control tunings..."); - m_ComboTuning.SetCurSel(0); - - //<--Setting tunings to Combobox - + BuildTuningComboBox(); +=20 CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); - //OnBnClickedCheckPitchtempolock(); + OnBnClickedCheckPitchtempolock(); m_EditPitchTempoLock.SetLimitText(4); - - return FALSE; } @@ -1075,8 +1061,8 @@ m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); m_ComboTuning.EnableWindow(bMPTOnly); - m_EditPitchTempoLock.EnableWindow(bITonly); - m_CheckPitchTempoLock.EnableWindow(bITonly); + m_EditPitchTempoLock.EnableWindow(bMPTOnly); + m_CheckPitchTempoLock.EnableWindow(bMPTOnly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { @@ -2387,6 +2373,7 @@ return 0; } + //end rewbs.customKeys void CCtrlInstruments::OnCbnSelchangeCombotuning() @@ -2398,8 +2385,20 @@ if(pInstH =3D=3D 0) return; + size_t sel =3D m_ComboTuning.GetCurSel(); + if(sel =3D=3D 0) //Setting IT behavior. + { + BEGIN_CRITICAL(); + pInstH->SetTuning(NULL); + END_CRITICAL(); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); + return; + } + + sel -=3D 1; CTuningCollection* tc =3D 0; - size_t sel =3D m_ComboTuning.GetCurSel(); +=20 if(sel < CSoundFile::s_TuningsSharedStandard.GetNumTunings()) tc =3D &CSoundFile::s_TuningsSharedStandard; else @@ -2418,13 +2417,14 @@ if(tc) { BEGIN_CRITICAL(); - pInstH->pTuning =3D &tc->GetTuning(sel); + pInstH->SetTuning(&tc->GetTuning(sel)); END_CRITICAL(); m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); return; } -=20 + //Case: Chosen tuning editor to be displayed. //Creating vector for the CTuningDialog. vector<CTuningCollection*> v; v.push_back(&m_pSndFile->s_TuningsSharedStandard); @@ -2435,27 +2435,9 @@ //Recreating tuning combobox so that possible //new tuning(s) come visible. - while(m_ComboTuning.GetCount() > 0) - m_ComboTuning.DeleteString(0); - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).= GetName().c_str()); - } - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).Get= Name().c_str()); - } - for(size_t i =3D 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) - { - m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).Ge= tName().c_str()); - } - m_ComboTuning.AddString("Control tunings..."); - m_ComboTuning.SetCurSel(0); - - UpdateTuningComboBox(); - - - //TODO: Update notemap window with correct notenames. + BuildTuningComboBox(); +=20 + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); } @@ -2464,43 +2446,50 @@ { if (m_pModDoc =3D=3D 0 || m_pSndFile =3D=3D 0=20 || m_nInstrument > m_pSndFile->GetNumInstruments() - || m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D 0) return; + || m_pSndFile->Headers[m_nInstrument] =3D=3D NULL) return; + INSTRUMENTHEADER* const penv =3D m_pSndFile->Headers[m_nInstrument]; + if(penv->pTuning =3D=3D NULL) + { + m_ComboTuning.SetCurSel(0); + return; + } + for(size_t i =3D 0; i < CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) { - if(m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D &CSoundFile::s_Tuni= ngsSharedStandard.GetTuning(i)) + if(penv->pTuning =3D=3D &CSoundFile::s_TuningsSharedStandard.GetTuning(i)= ) { - m_ComboTuning.SetCurSel(i); + m_ComboTuning.SetCurSel(i+1); return; } } for(size_t i =3D 0; i < CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) { - if(m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D &CSoundFile::s_Tuni= ngsSharedLocal.GetTuning(i)) + if(penv->pTuning =3D=3D &CSoundFile::s_TuningsSharedLocal.GetTuning(i)) { - m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs()); + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs()+1); return; } } for(size_t i =3D 0; i < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) { - if(m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D &m_pSndFile->m_Tuni= ngsTuneSpecific.GetTuning(i)) + if(penv->pTuning =3D=3D &m_pSndFile->m_TuningsTuneSpecific.GetTuning(i)) { - m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()); + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()+1); return; } } - - string str =3D string("Tuning ") + m_pSndFile->Headers[m_nInstrument]->pT= uning->GetName() - + string(" was not found. Setting to default tuning."); + string str =3D s_TuningNotFound.first; + str.insert(s_TuningNotFound.second, m_pSndFile->Headers[m_nInstrument]->p= Tuning->GetName()); MessageBox(str.c_str()); BEGIN_CRITICAL(); - m_pSndFile->Headers[m_nInstrument]->pTuning =3D m_pSndFile->Headers[m_nIn= strument]->s_DefaultTuning; + penv->SetTuning(penv->s_DefaultTuning); END_CRITICAL(); - m_ComboTuning.SetCurSel(0); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); } void CCtrlInstruments::OnEnChangeEditPitchtempolock() @@ -2537,7 +2526,7 @@ if(!penv) return; - //Checking to what value to put for the wPitchToTempoLock. + //Checking what value to put for the wPitchToTempoLock. m_EditPitchTempoLock.EnableWindow(); WORD ptl =3D penv->wPitchToTempoLock; if(ptl =3D=3D 0) @@ -2552,7 +2541,7 @@ ptl =3D m_pSndFile->m_nDefaultTempo; } m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); - //SetModified() comes with this. + //SetModified() comes with SetWindowText(.). } else { @@ -2568,9 +2557,12 @@ } } + void CCtrlInstruments::OnEnKillfocusEditPitchtempolock() //------------------------------------------------------ { + //Checking that tempo value is in correct range. + if(!m_pSndFile || IsLocked()) return; char buffer[6]; @@ -2578,7 +2570,6 @@ int ptlTempo =3D atoi(buffer); bool changed =3D false; -=20 if(ptlTempo < m_pSndFile->GetTempoMin()) { ptlTempo =3D m_pSndFile->GetTempoMin(); @@ -2590,6 +2581,29 @@ changed =3D true; } - if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str())= ; } + + +void CCtrlInstruments::BuildTuningComboBox() +//------------------------------------------ +{ + while(m_ComboTuning.GetCount() > 0) + m_ComboTuning.DeleteString(0); + + m_ComboTuning.AddString("IT behavior"); //<-> Instrument pTuning pointer = =3D=3D NULL + for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).= GetName().c_str()); + } + for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).Get= Name().c_str()); + } + for(size_t i =3D 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).Ge= tName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); +} Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-08-20 21:39:55 UTC= (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-10-02 21:41:06 UTC= (rev 168) @@ -81,11 +81,15 @@ //Tuning CComboBox m_ComboTuning; void UpdateTuningComboBox(); + void BuildTuningComboBox(); + static const pair<string, WORD> s_TuningNotFound; + //first <-> string, second <-> place where to put tuning name. //Pitch/Tempo lock CEdit m_EditPitchTempoLock; CButton m_CheckPitchTempoLock; +=20 public: CCtrlInstruments(); virtual ~CCtrlInstruments(); @@ -98,6 +102,8 @@ VOID UpdateFilterText(); LONG* GetSplitPosRef() {return &CMainFrame::glInstrumentWindowHeight;} //re= wbs.varWindowSize +=20 + public: //{{AFX_VIRTUAL(CCtrlInstruments) virtual BOOL OnInitDialog(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -166,10 +166,13 @@ // Spin controls m_SpinSpacing.SetRange(0, 16); m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); + m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); + m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax()); m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins()); + SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing); SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins()= ); CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PAT= TERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked @@ -178,6 +181,8 @@ UpdateView(HINT_MODTYPE|HINT_PATNAMES, NULL); RecalcLayout(); +=20 + // -> CODE#0012 // -> DESC=3D"midi keyboard split" //rewbs.merge: fix buffer overrun: @@ -222,6 +227,7 @@ m_bInitialized =3D TRUE; UnlockControls(); + return FALSE; } @@ -550,6 +556,7 @@ //----------------------------------------------- { CModDoc *pModDoc =3D GetDocument(); + CSoundFile* pSndFile =3D pModDoc ? pModDoc->GetSoundFile() : NULL; if ((pModDoc) && (m_pParent)) { @@ -560,28 +567,26 @@ } m_pParent->InstrumentChanged(-1); } - if ((lParam >=3D 0) && (lParam < MAX_PATTERNS)) + if ((lParam >=3D 0) && (lParam < m_pSndFile->Patterns.Size())) { - if (pModDoc) + if (pSndFile) { - CSoundFile *pSndFile =3D pModDoc->GetSoundFile(); - for (UINT i=3D0; i<MAX_ORDERS; i++) + for (UINT i=3D0; i<pSndFile->Order.size(); i++) { if (pSndFile->Order[i] =3D=3D (UINT)lParam) { m_OrderList.SetCurSel(i, TRUE); break; } - if (pSndFile->Order[i] =3D=3D 0xFF) break; + if (pSndFile->Order[i] =3D=3D pSndFile->Patterns.GetInvalidIndex()) break= ; } } SetCurrentPattern(lParam); }=20 - else if ((lParam >=3D 0x8000) && (lParam < MAX_ORDERS + 0x8000))=20 + else if ((lParam >=3D 0x8000) && (lParam < pSndFile->Order.size() + 0x800= 0))=20 { - if (pModDoc) + if (pSndFile) { - CSoundFile *pSndFile =3D pModDoc->GetSoundFile(); lParam &=3D 0x7FFF; m_OrderList.SetCurSel(lParam); SetCurrentPattern(pSndFile->Order[lParam]); @@ -693,6 +698,8 @@ SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i); } + + void CCtrlPatterns::OnSpacingChanged() //------------------------------------ { @@ -822,13 +829,13 @@ UINT nCurOrd =3D m_OrderList.GetCurSel(); UINT pat =3D pSndFile->Order[nCurOrd]; UINT rows =3D 64; - if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nTy= pe & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) + if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pS= ndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows =3D pSndFile->PatternSize[pat]; if (rows < 32) rows =3D 32; } LONG nNewPat =3D m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >=3D 0) && (nNewPat < MAX_PATTERNS)) + if ((nNewPat >=3D 0) && (nNewPat < pSndFile->Patterns.Size())) { m_OrderList.SetCurSel(nCurOrd+1); m_OrderList.InvalidateRect(NULL, FALSE); @@ -850,7 +857,7 @@ UINT nCurOrd =3D m_OrderList.GetCurSel(); UINT nCurPat =3D pSndFile->Order[nCurOrd]; UINT rows =3D 64; - if (nCurPat < MAX_PATTERNS) + if (nCurPat < pSndFile->Patterns.Size()) { if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_= TYPE_IT|MOD_TYPE_MPT))) { @@ -858,7 +865,7 @@ if (rows < 16) rows =3D 16; } LONG nNewPat =3D m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >=3D 0) && (nNewPat < MAX_PATTERNS)) + if ((nNewPat >=3D 0) && (nNewPat < pSndFile->Patterns.Size())) { MODCOMMAND *pSrc =3D pSndFile->Patterns[nCurPat]; MODCOMMAND *pDest =3D pSndFile->Patterns[nNewPat]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h 2006-08-20 21:39:55 UTC= (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h 2006-10-02 21:41:06 UTC= (rev 168) @@ -12,11 +12,13 @@ HFONT m_hFont; COLORREF colorText, colorTextSel; int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos; + //m_nXScroll : The order at the beginning of shown orderlist? //m_nScrollPos: The same as order? BYTE m_nOrderlistMargins; //To tell how many orders('orderboxes') to show at least //on both sides of current order(when updating orderslist position). + UINT m_nDragOrder; BOOL m_bScrolling, m_bDragging, m_bShift; CModDoc *m_pModDoc; @@ -37,10 +39,15 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); - BYTE SetOrderlistMargins(int); //Returns the number that was set. + + BYTE SetOrderlistMargins(int); + //Returns the number that was set. + BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;} - BYTE GetShownOrdersMax(); //Should return the maximum number of shown ord= ers. + BYTE GetShownOrdersMax(); + //Should return the maximum number of shown orders. + public: //{{AFX_VIRTUAL(COrderList) virtual BOOL PreTranslateMessage(MSG *pMsg); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -105,7 +105,7 @@ UINT nPage; int nMax=3D0; - while ((nMax < MAX_ORDERS) && (pSndFile->Order[nMax] !=3D 0xFF)) nMax++; + while ((nMax < pSndFile->Order.size()) && (pSndFile->Order[nMax] !=3D pSn= dFile->Patterns.GetInvalidIndex())) nMax++; GetScrollInfo(SB_HORZ, &info, SIF_PAGE|SIF_RANGE); info.fMask =3D SIF_PAGE|SIF_RANGE; info.nMin =3D 0; @@ -166,9 +166,10 @@ //--------------------------------------------- { CMainFrame *pMainFrm =3D CMainFrame::GetMainFrame(); + CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); CRect rcClient; - if ((sel < 0) || (sel >=3D MAX_ORDERS) || (!m_pParent) || (!pMainFrm)) re= turn FALSE; + if ((sel < 0) || (sel >=3D pSndFile->Order.size()) || (!m_pParent) || (!p= MainFrm)) return FALSE; if (sel =3D=3D m_nScrollPos) return TRUE; GetClientRect(&rcClient); InvalidateSelection(); @@ -195,9 +196,8 @@ InvalidateSelection(); if ((m_pParent) && (m_pModDoc) && (bEdit)) { - CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); UINT n =3D pSndFile->Order[m_nScrollPos]; - if ((n < MAX_PATTERNS) && (pSndFile->Patterns[n])) + if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n])) { BOOL bIsPlaying =3D (pMainFrm->GetModPlaying() =3D=3D m_pModDoc); if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP)) @@ -216,7 +216,11 @@ pSndFile->m_nCurrentPattern =3D m_nScrollPos; pSndFile->SetCurrentOrder(m_nScrollPos); pSndFile->m_dwSongFlags |=3D dwPaused; - if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); + //if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); + //Relabs.note: Commented above line for it seems to cause + //significant slowdown when changing patterns without + //pattern-loop enabled. What is it's purpose anyway? + if (bIsPlaying) pMainFrm->ResetNotificationBuffer(); END_CRITICAL(); } @@ -231,9 +235,9 @@ UINT COrderList::GetCurrentPattern() const //---------------------------------------- { - if ((m_pModDoc) && (m_nScrollPos < MAX_PATTERNS)) + CSoundFile* pSndFile =3D m_pModDoc ? m_pModDoc->GetSoundFile() : NULL; + if ((pSndFile) && (m_nScrollPos < pSndFile->Patterns.Size())) { - CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); return pSndFile->Order[m_nScrollPos]; } return 0; @@ -255,7 +259,7 @@ { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); int i =3D 0; - for (i=3D0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] =3D=3D 0xFF) br= eak; + for (i=3D0; i<pSndFile->Order.size()-1; i++) if (pSndFile->Order[i+1] =3D= =3D pSndFile->Patterns.GetInvalidIndex()) break; SetCurSel(i); } break; @@ -288,10 +292,11 @@ CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); int ord =3D pSndFile->Order[m_nScrollPos]; int maxpat =3D 0; - for (int i=3D0; i<MAX_PATTERNS; i++) if (pSndFile->Patterns[i]) maxpat = =3D i; + for (int i=3D0; i<pSndFile->Patterns.Size(); i++) if (pSndFile->Patterns[= i]) maxpat =3D i; if ((nChar >=3D '0') && (nChar <=3D '9')) { - if (ord >=3D MAX_PATTERNS) ord =3D 0; + if (ord >=3D pSndFile->Patterns.Size()) ord =3D 0; + ord =3D ord * 10 + (nChar - '0'); if ((ord >=3D 100) && (ord > maxpat)) ord %=3D 100; if ((ord >=3D 10) && (ord > maxpat)) ord %=3D 10; @@ -299,18 +304,23 @@ if (nChar =3D=3D '+') { ord++; - if (ord > 0xFF) ord =3D 0; else - if ((ord > maxpat) && (ord < 0xFE)) ord =3D 0xFE; + if(ord > pSndFile->Patterns.GetInvalidIndex()) + ord =3D 0; + else + { + if(ord > maxpat && ord < pSndFile->Patterns.GetIgnoreIndex()) + ord =3D pSndFile->Patterns.GetIgnoreIndex(); + } } else if (nChar =3D=3D '-') { ord--; - if (ord < 0) ord =3D 0xFF; else - if ((ord > maxpat) && (ord < 0xFE)) ord =3D maxpat; + if (ord < 0) ord =3D pSndFile->Patterns.GetInvalidIndex(); else + if ((ord > maxpat) && (ord < pSndFile->Patterns.GetIgnoreIndex())) ord = =3D maxpat; } if (ord !=3D pSndFile->Order[m_nScrollPos]) { - pSndFile->Order[m_nScrollPos] =3D (BYTE)ord; + pSndFile->Order[m_nScrollPos] =3D static_cast<UINT>(ord); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); InvalidateSelection(); @@ -401,10 +411,10 @@ s[0] =3D 0; wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position= %02Xh of %02Xh" : "Position %d of %d", m_nScrollPos, pSndFile->GetNumPatterns()); - if (m_nScrollPos < MAX_ORDERS) + if (m_nScrollPos < pSndFile->Order.size()) { UINT nPat =3D pSndFile->Order[m_nScrollPos]; - if ((nPat < MAX_PATTERNS) && (nPat < pSndFile->m_nPatternNames)) + if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNam= es)) { CHAR szpat[40] =3D ""; if (pSndFile->GetPatternName(nPat, szpat)) @@ -450,7 +460,7 @@ while (rect.left < rcClient.right) { BOOL bHighLight =3D ((bFocus) && (nIndex =3D=3D m_nScrollPos)) ? TRUE : FAL= SE; - int nOrder =3D ((nIndex >=3D 0) && (nIndex < MAX_ORDERS)) ? pSndFile->Ord= er[nIndex] : -1; + int nOrder =3D ((nIndex >=3D 0) && (nIndex < pSndFile->Order.size())) ? p= SndFile->Order[nIndex] : -1; if ((rect.right =3D rect.left + m_cxFont) > rcClient.right) rect.right =3D = rcClient.right; rect.right--; FillRect(dc.m_hDC, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMain= Frame::brushWindow); @@ -482,9 +492,16 @@ s[0] =3D 0; if ((nOrder >=3D 0) && (rect.left + m_cxFont - 4 <=3D rcClient.right)) { - if (nOrder =3D=3D 0xFF) strcpy(s, "---"); else - if (nOrder < MAX_PATTERNS) wsprintf(s, "%d", nOrder); - else strcpy(s, "+++"); + if (nOrder =3D=3D pSndFile->Patterns.GetInvalidIndex()) strcpy(s, "---");= //Print the 'dots' + else=20 + { + if (nOrder < pSndFile->Patterns.Size()) wsprintf(s, "%d", nOrder); + else + { + if(nOrder =3D=3D pSndFile->Patterns.GetIgnoreIndex()) strcpy(s, "+++"); + else strcpy(s, "BUG"); + } + } } dc.SetTextColor((bHighLight) ? colorTextSel : colorText); dc.DrawText(s, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); @@ -531,7 +548,7 @@ { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); int nOrder =3D m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((nOrder >=3D 0) && (nOrder < MAX_ORDERS)) + if ((nOrder >=3D 0) && (nOrder < pSndFile->Order.size())) { if (pSndFile->m_nSeqOverride =3D=3D nOrder+1) { pSndFile->m_nSeqOverride=3D0; @@ -599,7 +616,7 @@ if (rect.PtInRect(pt)) { n =3D m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((n < 0) || (n >=3D MAX_ORDERS)) n =3D -1; + if ((n < 0) || (n >=3D m_pModDoc->GetSoundFile()->Order.size())) n =3D -1= ; } if (n !=3D (int)m_nDropPos) { @@ -638,7 +655,7 @@ HMENU hMenu =3D ::CreatePopupMenu(); UINT nCurrentPattern =3D GetCurrentPattern(); - bool patternExists =3D (nCurrentPattern<MAX_PATTERNS + bool patternExists =3D (nCurrentPattern < m_pModDoc->GetSoundFile()->Patt= erns.Size() && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] !=3D NULL); DWORD greyed =3D patternExists?FALSE:MF_GRAYED; @@ -729,7 +746,14 @@ if (m_pModDoc) { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); - for (int i=3DMAX_ORDERS-1; i>m_nScrollPos; i--) pSndFile->Order[i] =3D pS= ndFile->Order[i-1]; + //Checking whether there is some pattern at the end of orderlist. + + if(pSndFile->Order[pSndFile->Order.size()-1] < pSndFile->Patterns.Size()) + { + if(pSndFile->Order.size() < pSndFile->Order.GetOrderNumberLimitMax()) + pSndFile->Order.push_back(pSndFile->Patterns.GetInvalidIndex()); + } + for (int i=3DpSndFile->Order.size()-1; i>m_nScrollPos; i--) pSndFile->Ord= er[i] =3D pSndFile->Order[i-1]; InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); @@ -743,13 +767,13 @@ if (m_pModDoc) { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); - for (int i=3Dm_nScrollPos; i<MAX_ORDERS-1; i++) pSndFile->Order[i] =3D pS= ndFile->Order[i+1]; - pSndFile->Order[MAX_ORDERS-1] =3D 0xFF; + for (int i=3Dm_nScrollPos; i<pSndFile->Order.size()-1; i++) pSndFile->Ord= er[i] =3D pSndFile->Order[i+1]; + pSndFile->Order[pSndFile->Order.size()-1] =3D pSndFile->Patterns.GetInval= idIndex(); InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); UINT nNewOrd =3D pSndFile->Order[m_nScrollPos]; - if ((nNewOrd < MAX_PATTERNS) && (pSndFile->Patterns[nNewOrd]) && (m_pPare= nt)) + if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]= ) && (m_pParent)) { m_pParent->SetCurrentPattern(nNewOrd); } @@ -837,11 +861,12 @@ CPoint pt; if ((!pDropInfo) || (!m_pModDoc) || (m_pModDoc !=3D pDropInfo->pModDoc) || = (!m_cxFont)) return FALSE; + pSndFile =3D m_pModDoc->GetSoundFile(); bCanDrop =3D FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_ORDER: - if (pDropInfo->dwDropItem >=3D MAX_ORDERS) break; + if (pDropInfo->dwDropItem >=3D pSndFile->Order.size()) break; case DRAGONDROP_PATTERN: bCanDrop =3D TRUE; break; @@ -851,12 +876,11 @@ ScreenToClient(&pt); if (pt.x < 0) pt.x =3D 0; posdest =3D m_nXScroll + (pt.x / m_cxFont); - if (posdest >=3D MAX_ORDERS) return FALSE; - pSndFile =3D m_pModDoc->GetSoundFile(); + if (posdest >=3D pSndFile->Order.size()) return FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_PATTERN: - pSndFile->Order[posdest] =3D (BYTE)pDropInfo->dwDropItem; + pSndFile->Order[posdest] =3D static_cast<UINT>(pDropInfo->dwDropItem); break; case DRAGONDROP_ORDER: Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -7,7 +7,11 @@ #include "view_pat.h" #include "EffectVis.h" //rewbs.fxvis #include "ChannelManagerDlg.h" +#include "../soundlib/tuning_template.h" +#include <string> +using std::string; + // Headers #define ROWHDR_WIDTH 32 // Row header #define COLHDR_HEIGHT 16 // Column header @@ -269,8 +273,11 @@ srcy =3D pfnt->nAlphaNZ_Y + 13 * COLUMN_HEIGHT; break; case '#': - srcx =3D pfnt->nAlphaAM_X; - srcy =3D pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; + srcx =3D pfnt->nNoteX + pfnt->nNoteWidth/2; + srcy =3D pfnt->nNoteY + 2*COLUMN_HEIGHT; + //TODO: '#' doesn't show properly in effect column. + //srcx =3D pfnt->nAlphaAM_X; + //srcy =3D pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; break; //rewbs.smoothVST case '\\': @@ -284,16 +291,24 @@ srcy =3D pfnt->nAlphaNZ_Y + 15 * COLUMN_HEIGHT; break; //end rewbs.velocity - + case ' ': + srcx =3D pfnt->nClrX; + srcy =3D pfnt->nClrY; + break; + case '-': + srcx =3D pfnt->nNoteX + pfnt->nNoteWidth/2; + srcy =3D pfnt->nNoteY + COLUMN_HEIGHT; + break; } m_Dib.TextBlt(x, y, sizex, COLUMN_HEIGHT, srcx+ofsx, srcy); } -void CViewPattern::DrawNote(int x, int y, UINT note) -//-------------------------------------------------- +void CViewPattern::DrawNote(int x, int y, UINT note, CTuning* pTuning) +//------------------------------------------------------------------------= --- { PCPATTERNFONT pfnt =3D GetCurrentPatternFont(); +=20 UINT xsrc =3D pfnt->nNoteX, ysrc =3D pfnt->nNoteY, dx =3D pfnt->nEltWidths[= 0]; if (!note) { @@ -308,11 +323,22 @@ m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT); } else { - UINT o =3D (note-1) / 12; - UINT n =3D (note-1) % 12; - m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COL= UMN_HEIGHT); - m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT, - pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT); + if(pTuning) + { + string noteStr =3D pTuning->GetNoteName(static_cast<CTuning::STEPTYPE>(no= te-NOTE_MIDDLEC)); + noteStr.resize(3, ' '); + DrawLetter(x, y, noteStr[0]); + DrawLetter(x + pfnt->nNoteWidth/2, y, noteStr[1]); + DrawLetter(x + pfnt->nNoteWidth, y, noteStr[2]); + } + else //Original + { + UINT o =3D (note-1) / 12; //Octave + UINT n =3D (note-1) % 12; //Note + m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COL= UMN_HEIGHT); + m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT, + pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT); + } } } @@ -491,13 +517,13 @@ { UINT nCurOrder =3D SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder > 0) && (nCurOrder < MAX_ORDERS) && (pSndFile->Order[nCurO= rder] =3D=3D m_nPattern)) + if ((nCurOrder > 0) && (nCurOrder < pSndFile->Order.size()) && (pSndFile-= >Order[nCurOrder] =3D=3D m_nPattern)) { nPrevPat =3D pSndFile->Order[nCurOrder-1]; bPrevPatFound =3D TRUE; } } - if ((bPrevPatFound) && (nPrevPat < MAX_PATTERNS) && (pSndFile->Patterns[n= PrevPat])) + if ((bPrevPatFound) && (nPrevPat < pSndFile->Patterns.Size()) && (pSndFil= e->Patterns[nPrevPat])) { UINT nPrevRows =3D pSndFile->PatternSize[nPrevPat]; UINT n =3D (nSkip < nPrevRows) ? nSkip : nPrevRows; @@ -535,12 +561,12 @@ BOOL bNextPatFound =3D FALSE; UINT nCurOrder =3D SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder+1 < MAX_ORDERS) && (pSndFile->Order[nCurOrder] =3D=3D m_nP= attern)) + if ((nCurOrder+1 < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder]= =3D=3D m_nPattern)) { nNextPat =3D pSndFile->Order[nCurOrder+1]; bNextPatFound =3D TRUE; } - if ((bNextPatFound) && (nNextPat < MAX_PATTERNS) && (pSndFile->Patterns[n= NextPat])) + if ((bNextPatFound) && (nNextPat < pSndFile->Patterns.Size()) && (pSndFil= e->Patterns[nNextPat])) { UINT nNextRows =3D pSndFile->PatternSize[nNextPat]; UINT n =3D ((UINT)nVisRows < nNextRows) ? nVisRows : nNextRows; @@ -757,7 +783,10 @@ } // Drawing note m_Dib.SetTextColor(tx_col, bk_col); - DrawNote(xbmp+x, 0, m->note); + if(pSndFile->m_nType =3D=3D MOD_TYPE_MPT && m->instr < MAX_INSTRUMENTS &&= pSndFile->Headers[m->instr]) + DrawNote(xbmp+x, 0, m->note, pSndFile->Headers[m->instr]->pTuning); + else //Original + DrawNote(xbmp+x, 0, m->note); } x +=3D pfnt->nEltWidths[0]; // Instrument Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-08-20 21:39:55 UT= C (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-10-02 21:41:06 UT= C (rev 168) @@ -646,6 +646,9 @@ delete m_InputHandler; //rewbs.customKeys delete m_pAutoSaver; //rewbs.autosaver delete m_pPerfCounter; + + //Saving statictunings here. + CSoundFile::SaveStaticTunings(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) @@ -1984,11 +1987,9 @@ m_WaveFile.m_nSamples =3D 1; m_WaveFile.Order[0] =3D 0; m_WaveFile.Order[1] =3D 1; - m_WaveFile.Order[2] =3D 0xFF; - m_WaveFile.PatternSize[0] =3D 64; - m_WaveFile.PatternSize[1] =3D 64; - m_WaveFile.Patterns[0] =3D CSoundFile::AllocatePattern(64, 4); - m_WaveFile.Patterns[1] =3D CSoundFile::AllocatePattern(64, 4); + m_WaveFile.Order[2] =3D m_WaveFile.Patterns.GetInvalidIndex(); + m_WaveFile.Patterns.Insert(0,64); + m_WaveFile.Patterns.Insert(1,64); if (m_WaveFile.Patterns[0]) { if (!nNote) nNote =3D 5*12+1; @@ -2059,11 +2060,9 @@ } m_WaveFile.Order[0] =3D 0; m_WaveFile.Order[1] =3D 1; - m_WaveFile.Order[2] =3D 0xFF; - m_WaveFile.PatternSize[0] =3D 64; - m_WaveFile.PatternSize[1] =3D 64; - m_WaveFile.Patterns[0] =3D CSoundFile::AllocatePattern(64, 4); - m_WaveFile.Patterns[1] =3D CSoundFile::AllocatePattern(64, 4); + m_WaveFile.Order[2] =3D m_WaveFile.Patterns.GetInvalidIndex(); + m_WaveFile.Patterns.Insert(0, 64); + m_WaveFile.Patterns.Insert(1, 64); if (m_WaveFile.Patterns[0]) { if (!nNote) nNote =3D 5*12+1; @@ -2539,7 +2538,7 @@ if (m_pSndFile !=3D &m_WaveFile) { UINT nPat =3D m_pSndFile->m_nPattern; - if (nPat < MAX_PATTERNS) + if(nPat < m_pSndFile->Patterns.Size()) { if (nPat < 10) strcat(s, " "); if (nPat < 100) strcat(s, " "); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-08-20 21:39:55 UTC = (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-10-02 21:41:06 UTC = (rev 168) @@ -11,6 +11,7 @@ #include "sndfile.h" #include "CommandSet.h" #include "inputhandler.h" +#include "mptrack.h" class CInputHandler; class CMainFrame; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-08-20 21:39:55 UTC= (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-10-02 21:41:06 UTC= (rev 168) @@ -97,7 +97,8 @@ m_lpszLog =3D NULL; m_hWndFollow =3D NULL; memset(PatternUndo, 0, sizeof(PatternUndo)); - memset(OrderUndo, 0, sizeof(OrderUndo)); //rewbs.orderListUndo + vector<BYTE> temp; temp.resize(MAX_UNDO_LEVEL, 0); + OrderUndo.resize(m_SndFile.Order.size(), temp); #ifdef _DEBUG MODCHANNEL *p =3D m_SndFile.Chn; if (((DWORD)p) & 7) Log("MODCHANNEL is not aligned (0x%08X)\n", p); @@ -133,7 +134,7 @@ if (!CDocument::OnNewDocument()) return FALSE; m_SndFile.Create(NULL, this, 0); - m_SndFile.m_nType =3D CTrackApp::GetDefaultDocType(); + m_SndFile.ChangeModTypeTo(CTrackApp::GetDefaultDocType()); // -> CODE#0023 // -> DESC=3D"IT project files (.itp)" @@ -190,7 +191,7 @@ pEmbeddedBank =3D new CDLSBank(); pEmbeddedBank->Open(lpszPathName); } - m_SndFile.m_nType =3D MOD_TYPE_IT; + m_SndFile.ChangeModTypeTo(MOD_TYPE_IT); BeginWaitCursor(); LPMIDILIBSTRUCT lpMidiLib =3D CTrackApp::GetMidiLibrary(); // Scan Instruments @@ -319,17 +320,17 @@ case MOD_TYPE_AMF0: case MOD_TYPE_MTM: case MOD_TYPE_669: - m_SndFile.m_nType =3D MOD_TYPE_MOD; + m_SndFile.ChangeModTypeTo(MOD_TYPE_MOD); break; case MOD_TYPE_MED: case MOD_TYPE_OKT: case MOD_TYPE_AMS: case MOD_TYPE_MT2: - m_SndFile.m_nType =3D MOD_TYPE_XM; + m_SndFile.ChangeModTypeTo(MOD_TYPE_XM); if ((m_SndFile.m_nDefaultTempo =3D=3D 125) && (m_SndFile.m_nDefaultSpeed = =3D=3D 6) && (!m_SndFile.m_nInstruments)) { m_SndFile.m_nType =3D MOD_TYPE_MOD; - for (UINT i=3D0; i<MAX_PATTERNS; i++) + for (UINT i=3D0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] !=3D 64)) m_SndFile.m_nType =3D MOD_TYPE_XM; } @@ -603,11 +604,10 @@ // m_SndFile.m_nChannels =3D (m_SndFile.m_nType & MOD_TYPE_MOD) ? 8 : 16; m_SndFile.m_nChannels =3D (m_SndFile.m_nType & MOD_TYPE_MOD) ? 8 : 32; // -! BEHAVIOUR_CHANGE#0006 - if (m_SndFile.Order[0] >=3D MAX_PATTERNS) m_SndFile.Order[0] =3D 0; + if (m_SndFile.Order[0] >=3D m_SndFile.Patterns.Size()) m_SndFile.Order[0]= =3D 0; if (!m_SndFile.Patterns[0]) { - m_SndFile.PatternSize[0] =3D 64; - m_SndFile.Patterns[0] =3D CSoundFile::AllocatePattern(m_SndFile.PatternSi= ze[0], m_SndFile.m_nChannels); + m_SndFile.Patterns.Insert(0, 64); } strcpy(m_SndFile.m_szNames[0], "untitled"); m_SndFile.m_nMusicTempo =3D m_SndFile.m_nDefaultTempo =3D 125; @@ -1208,7 +1208,7 @@ UINT CModDoc::GetPatternSize(UINT nPat) const //------------------------------------------- { - if ((nPat < MAX_PATTERNS) && (m_SndFile.Patterns[nPat])) return m_SndFile= .PatternSize[nPat]; + if ((nPat < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[nPat])) ret= urn m_SndFile.PatternSize[nPat]; return 0; } @@ -1346,7 +1346,7 @@ // Saving as wave file // -> CODE#0024 // -> DESC=3D"wav export update" - UINT p,n =3D 1; + UINT p =3D 0,n =3D 1; DWORD flags[MAX_BASECHANNELS]; CHAR channel[MAX_CHANNELNAME+2]; @@ -1646,18 +1646,18 @@ UINT nNextRow =3D m_SndFile.m_nNextRow; pMainFrm->PauseMod(); BEGIN_CRITICAL(); - if ((bLoop) && (nPat < MAX_PATTERNS)) + if ((bLoop) && (nPat < m_SndFile.Patterns.Size())) { - if ((m_SndFile.m_nCurrentPattern < MAX_ORDERS) && (m_SndFile.Order[m_SndF= ile.m_nCurrentPattern] =3D=3D nPat)) + if ((m_SndFile.m_nCurrentPattern < m_SndFile.Order.size()) && (m_SndFile.= Order[m_SndFile.m_nCurrentPattern] =3D=3D nPat)) { m_SndFile.m_nNextPattern =3D m_SndFile.m_nCurrentPattern; m_SndFile.m_nNextRow =3D nNextRow; m_SndFile.m_nRow =3D nRow; } else { - for (UINT i=3D0; i<MAX_ORDERS; i++) + for (UINT i=3D0; i<m_SndFile.Order.size(); i++) { - if (m_SndFile.Order[i] =3D=3D 0xFF) break; + if (m_SndFile.Order[i] =3D=3D m_SndFile.Patterns.GetInvalidIndex()) break= ; if (m_SndFile.Order[i] =3D=3D nPat) { m_SndFile.m_nCurrentPattern =3D i; @@ -1695,7 +1695,7 @@ CChildFrame *pChildFrm =3D (CChildFrame *) GetChildFrame(); if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern c= heckbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -1866,10 +1866,10 @@ if (pat >=3D 0) { UINT ord =3D 0; - for (UINT i=3D0; i<MAX_ORDERS; i++) + for (UINT i=3D0; i<m_SndFile.Order.size(); i++) { if (m_SndFile.Order[i] =3D=3D pat) ord =3D i; - if (m_SndFile.Order[i] =3D=3D 0xFF) break; + if (m_SndFile.Order[i] =3D=3D m_SndFile.Patterns.GetInvalidIndex()) break= ; } ViewPattern(pat, ord); } @@ -1990,6 +1990,7 @@ #define MOD_TYPE_ITMPT (MOD_TYPE_IT|MOD_TYPE_MPT) #define MAX_FXINFO 66 //rewbs.smoothVST, increased from 64... I wonder what= this will break? + const MPTEFFECTINFO gFXInfo[MAX_FXINFO] =3D { {CMD_ARPEGGIO, 0,0, 0, 0xFFFFFFFF, "Arpeggio"}, @@ -2704,14 +2705,14 @@ ord =3D patternViewState->nOrder; } //rewbs.fix3185: if position is invalid, go to start of song. - if (ord > MAX_ORDERS) { + if (ord >=3D m_SndFile.Order.size()) { ord =3D 0; pat =3D pSndFile->Order[ord]; } - if (pat > MAX_PATTERNS) { + if (pat >=3D m_SndFile.Patterns.Size()) { pat=3D0; } - if (row > pSndFile->PatternSize[pat]) { + if (row >=3D pSndFile->PatternSize[pat]) { row=3D0; } //end rewbs.fix3185 @@ -2797,7 +2798,7 @@ { if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play pattern command: set loop patter= n checkbox to true. + //User has sent play pattern command: set loop pattern checkbox to true. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 1); } @@ -2817,7 +2818,7 @@ pSndFile->Chn[i].nFadeOutVol =3D 0; pSndFile->Chn[i].dwFlags |=3D CHN_NOTEFADE | CHN_KEYOFF; } - if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] =3D=3D nPat)) pSndFil= e->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; + if ((nOrd < m_SndFile.Order.size()) && (pSndFile->Order[nOrd] =3D=3D nPat= )) pSndFile->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; pSndFile->m_dwSongFlags &=3D ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow =3D 0; @@ -2848,7 +2849,7 @@ { if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play pattern command: set loop patter= n checkbox to true. + //User has sent play pattern command: set loop pattern checkbox to true. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 1); } @@ -2865,8 +2866,7 @@ { pSndFile->Chn[i].dwFlags |=3D CHN_NOTEFADE | CHN_KEYOFF; } - if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] =3D=3D nPat)) pSndFil= e->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; - //Relabs.note: Some jumps occured when using pattern play and loop patter= n checkbox - above line hopefully fixes it. + if ((nOrd < m_SndFile.Order.size()) && (pSndFile->Order[nOrd] =3D=3D nPat= )) pSndFile->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; pSndFile->m_dwSongFlags &=3D ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow =3D nRow; @@ -2897,7 +2897,7 @@ { if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern c= heckbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -3114,4 +3114,4 @@ if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame()); SetModified(); } -} \ No newline at end of file +} Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h 2006-08-20 21:39:55 UTC (= rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h 2006-10-02 21:41:06 UTC (= rev 168) @@ -83,11 +83,12 @@ protected: LPSTR m_lpszLog; CSoundFile m_SndFile; + BOOL m_bPaused; HWND m_hWndFollow; DWORD m_dwNotifyType; PATTERNUNDOBUFFER PatternUndo[MAX_UNDO_LEVEL]; - BYTE OrderUndo[MAX_UNDO_LEVEL][MAX_ORDERS]; //rewbs.orderListUndo + vector<vector<BYTE> > OrderUndo; // -> CODE#0015 // -> DESC=3D"channels management dlg" @@ -143,7 +144,6 @@ public: BOOL ChangeModType(UINT nNewType); BOOL ChangeNumChannels(UINT nNewChannels); - BOOL ResizePattern(UINT nPattern, UINT nRows); BOOL ConvertInstrumentsToSamples();; BOOL RemoveUnusedSamples(); BOOL RemoveUnusedInstruments(); @@ -217,7 +217,7 @@ void RecordParamChange(int slot, long param); void LearnMacro(int macro, long param); - BOOL RemoveChannels(BOOL bChnMask[MAX_CHANNELS]); //Relabsoluness 20.12.2= 005 + BOOL RemoveChannels(BOOL bChnMask[MAX_CHANNELS]); bool m_bHasValidPath; //becomes true if document is loaded or saved. Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-08-20 21:39:55 UT= C (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-10-02 21:41:06 UT= C (rev 168) @@ -42,7 +42,7 @@ } // Check if conversion to 64 rows is necessary - for (UINT ipat=3D0; ipat<MAX_PATTERNS; ipat++) + for (UINT ipat=3D0; ipat<m_SndFile.Patterns.Size(); ipat++) { if ((m_SndFile.Patterns[ipat]) && (m_SndFile.PatternSize[ipat] !=3D 64)) b6= 4++; } @@ -63,29 +63,9 @@ // Resizing all patterns to 64 rows UINT nPatCvt =3D 0; UINT i =3D 0; - for (i=3D0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFil= e.PatternSize[i] !=3D 64)) + for (i=3D0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i])= && (m_SndFile.PatternSize[i] !=3D 64)) { - if (m_SndFile.PatternSize[i] < 64) - { - MODCOMMAND *p =3D CSoundFile::AllocatePattern(64, m_SndFile.m_nChannels); - if (p) - { - memcpy(p, m_SndFile.Patterns[i], m_SndFile.m_nChannels*m_SndFile.PatternS= ize[i]*sizeof(MODCOMMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[i]); - m_SndFile.Patterns[i] =3D p; - m_SndFile.PatternSize[i] =3D 64; - } else AddToLog("ERROR: Not enough memory to resize pattern!\n"); - } else - { - MODCOMMAND *pnew =3D CSoundFile::AllocatePattern(64, m_SndFile.m_nChannel= s); - if (pnew) - { - memcpy(pnew, m_SndFile.Patterns[i], m_SndFile.m_nChannels*64*sizeof(MODCO= MMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[i]); - m_SndFile.Patterns[i] =3D pnew; - } - m_SndFile.PatternSize[i] =3D 64; - } + m_SndFile.Patterns[i].Resize(64); if (b64 < 5) { wsprintf(s, "WARNING: Pattern %d resized to 64 rows\n", i); @@ -116,7 +96,7 @@ // Adjust pattern data if ((m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && (nNewType & (MOD_TY= PE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) { - for (UINT nPat=3D0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPa= t]) + for (UINT nPat=3D0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile= .Patterns[nPat]) { MODCOMMAND *m =3D m_SndFile.Patterns[nPat]; for (UINT len =3D m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len;= m++, len--) @@ -172,7 +152,7 @@ } else if ((m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (nNewT= ype & (MOD_TYPE_MOD|MOD_TYPE_XM))) { - for (UINT nPat=3D0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPa= t]) + for (UINT nPat=3D0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile= .Patterns[nPat]) { MODCOMMAND *m =3D m_SndFile.Patterns[nPat]; for (UINT len =3D m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len-= -; m++) @@ -295,7 +275,7 @@ AddToLog("WARNING: Samples above 31 will be lost when saving this file as M= OD!\n"); } BEGIN_CRITICAL(); - m_SndFile.m_nType =3D nNewType; + m_SndFile.ChangeModTypeTo(nNewType); if ((!(nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_XM))) && (m_SndFile.m_= dwSongFlags & SONG_LINEARSLIDES)) { AddToLog("WARNING: Linear Frequency Slides not supported by the new format.= \n"); @@ -368,7 +348,7 @@ for (int iRst=3Dm_SndFile.m_nChannels-1; iRst>=3D0; iRst--) //rewbs.removeC= hanWindowCleanup { rem.m_bChnMask[iRst] =3D TRUE; - for (UINT ipat=3D0; ipat<MAX_PATTERNS; ipat++) if (m_SndFile.Patterns[ipa= t]) + for (UINT ipat=3D0; ipat<m_SndFile.Patterns.Size(); ipat++) if (m_SndFile= .Patterns[ipat]) { MODCOMMAND *p =3D m_SndFile.Patterns[ipat] + iRst; UINT len =3D m_SndFile.PatternSize[ipat]; @@ -395,7 +375,7 @@ BeginWaitCursor(); // Increasing number of channels BEGIN_CRITICAL(); - for (UINT i=3D0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (UINT i=3D0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns= [i]) { MODCOMMAND *p =3D m_SndFile.Patterns[i]; MODCOMMAND *newp =3D CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], = nNewChannels); @@ -447,7 +427,7 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - for (i=3D0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (i=3D0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns[i]) { MODCOMMAND *p =3D m_SndFile.Patterns[i]; MODCOMMAND *newp =3D CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], = nRemainingChannels); @@ -495,102 +475,36 @@ return FALSE; } -BOOL CModDoc::ResizePattern(UINT nPattern, UINT nRows) -//---------------------------------------------------- -{ -// -> CODE#0008 -// -> DESC=3D"#define to set pattern size" -// if ((nPattern >=3D MAX_PATTERNS) || (nRows < 2) || (nRows > 256)) retur= n FALSE; - if ((nPattern >=3D MAX_PATTERNS) || (nRows < 2) || (nRows > MAX_PATTERN_R= OWS)) return FALSE; -// -! BEHAVIOUR_CHANGE#0008 - if (m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) nRows =3D 64; - if (nRows =3D=3D m_SndFile.PatternSize[nPattern]) return TRUE; - BeginWaitCursor(); - BEGIN_CRITICAL(); - if (!m_SndFile.Patterns[nPattern]) - { - m_SndFile.Patterns[nPattern] =3D CSoundFile::AllocatePattern(nRows, m_Snd= File.m_nChannels); - m_SndFile.PatternSize[nPattern] =3D nRows; - } else - if (nRows > m_SndFile.PatternSize[nPattern]) - { - MODCOMMAND *p =3D CSoundFile::AllocatePattern(nRows, m_SndFile.m_nChannel= s); - if (p) - { - memcpy(p, m_SndFile.Patterns[nPattern], m_SndFile.m_nChannels*m_SndFile.P= atternSize[nPattern]*sizeof(MODCOMMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[nPattern]); - m_SndFile.Patterns[nPattern] =3D p; - m_SndFile.PatternSize[nPattern] =3D nRows; - } - } else - { - BOOL bOk =3D TRUE; - MODCOMMAND *p =3D m_SndFile.Patterns[nPattern]; - UINT ndif =3D (m_SndFile.PatternSize[nPattern] - nRows) * m_SndFile.m_nCh= annels; - UINT npos =3D nRows * m_SndFile.m_nChannels; - for (UINT i=3D0; i<ndif; i++) - { - if (*((DWORD *)(p+i+npos))) - { - bOk =3D FALSE; - break; - } - } - if (!bOk) - { - END_CRITICAL(); - EndWaitCursor(); - if (CMainFrame::GetMainFrame()->MessageBox("Data at the end of the patter= n will be lost.\nDo you want to continue", - "Shrink Pattern", MB_YESNO|MB_ICONQUESTION) =3D=3D IDYES) bOk =3D TRUE; - BeginWaitCursor(); - BEGIN_CRITICAL(); - } - if (bOk) - { - MODCOMMAND *pnew =3D CSoundFile::AllocatePattern(nRows, m_SndFile.m_nChan= nels); - if (pnew) - { - memcpy(pnew, m_SndFile.Patterns[nPattern], m_SndFile.m_nChannels*nRows*si= zeof(MODCOMMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[nPattern]); - m_SndFile.Patterns[nPattern] =3D pnew; - m_SndFile.PatternSize[nPattern] =3D nRows; - } - } - } - END_CRITICAL(); - EndWaitCursor(); - SetModified(); - return (nRows =3D=3D m_SndFile.PatternSize[nPattern]) ? TRUE : FALSE; -} - BOOL CModDoc::RemoveUnusedPatterns(BOOL bRemove) //---------------------------------------------- { - UINT nPatMap[MAX_PATTERNS]; - UINT nPatRows[MAX_PATTERNS]; - MODCOMMAND *pPatterns[MAX_PATTERNS]; - BOOL bPatUsed[MAX_PATTERNS]; + const UINT maxPatIndex =3D m_SndFile.Patterns.Size(); + const UINT maxOrdIndex =3D m_SndFile.Order.size(); + vector<UINT> nPatMap(maxPatIndex, 0); + vector<UINT> nPatRows(maxPatIndex, 0); + vector<MODCOMMAND*> pPatterns(maxPatIndex, NULL); + vector<BOOL> bPatUsed(maxPatIndex, false); +=20 CHAR s[512]; BOOL bEnd =3D FALSE, bReordered =3D FALSE; UINT nPatRemoved =3D 0, nMinToRemove, nPats; BeginWaitCursor(); - memset(bPatUsed, 0, sizeof(bPatUsed)); UINT maxpat =3D 0; - for (UINT iord=3D0; iord<MAX_ORDERS; iord++) + for (UINT iord=3D0; iord<maxOrdIndex; iord++) { UINT n =3D m_SndFile.Order[iord]; - if (n < MAX_PATTERNS) + if (n < maxPatIndex) { if (n >=3D maxpat) maxpat =3D n+1; if (!bEnd) bPatUsed[n] =3D TRUE; - } else if (n =3D=3D 0xFF) bEnd =3D TRUE; + } else if (n =3D=3D m_SndFile.Patterns.GetInvalidIndex()) bEnd =3D TRUE; } nMinToRemove =3D 0; if (!bRemove) { - UINT imax=3DMAX_PATTERNS; + UINT imax =3D maxPatIndex; while (imax > 0) { imax--; @@ -598,7 +512,7 @@ } nMinToRemove =3D imax+1; } - for (UINT ipat=3Dmaxpat; ipat<MAX_PATTERNS; ipat++) if ((m_SndFile.Patter= ns[ipat]) && (ipat >=3D nMinToRemove)) + for (UINT ipat=3Dmaxpat; ipat<maxPatIndex; ipat++) if ((m_SndFile.Pattern= s[ipat]) && (ipat >=3D nMinToRemove)) { MODCOMMAND *m =3D m_SndFile.Patterns[ipat]; UINT ncmd =3D m_SndFile.m_nChannels * m_SndFile.PatternSize[ipat]; @@ -606,17 +520,13 @@ { if ((m[i].note) || (m[i].instr) || (m[i].volcmd) || (m[i].command)) goto No= tEmpty; } - BEGIN_CRITICAL(); - m_SndFile.PatternSize[ipat] =3D 0; - m_SndFile.FreePattern(m_SndFile.Patterns[ipat]); - m_SndFile.Patterns[ipat] =3D NULL; + m_SndFile.Patterns.Remove(ipat); nPatRemoved++; - END_CRITICAL(); NotEmpty: ; } UINT bWaste =3D 0; - for (UINT ichk=3D0; ichk<MAX_PATTERNS; ichk++) + for (UINT ichk=3D0; ichk < maxPatIndex; ichk++) { if ((m_SndFile.Patterns[ichk]) && (!bPatUsed[ichk])) bWaste++; } @@ -627,34 +537,32 @@ if (CMainFrame::GetMainFrame()->MessageBox(s, "Pattern Cleanup", MB_YESNO) = !=3D IDYES) return TRUE; BeginWaitCursor(); } - memset(nPatRows, 0, sizeof(nPatRows)); - memset(pPatterns, 0, sizeof(pPatterns)); - for (UINT irst=3D0; irst<MAX_PATTERNS; irst++) nPatMap[irst] =3D 0xFFFF; + for (UINT irst=3D0; irst<maxPatIndex; irst++) nPatMap[irst] =3D 0xFFFF; nPats =3D 0; UINT imap =3D 0; - for (imap=3D0; imap<MAX_ORDERS; imap++) + for (imap=3D0; imap<maxOrdIndex; imap++) { UINT n =3D m_SndFile.Order[imap]; - if (n < MAX_PATTERNS) + if (n < maxPatIndex) { - if (nPatMap[n] > MAX_PATTERNS) nPatMap[n] =3D nPats++; + if (nPatMap[n] > maxPatIndex) nPatMap[n] =3D nPats++; m_SndFile.Order[imap] =3D nPatMap[n]; } else if (n =3D=3D 0xFF) break; } // Add unused patterns at the end if ((!bRemove) || (!bWaste)) { - for (UINT iadd=3D0; iadd<MAX_PATTERNS; iadd++) + for (UINT iadd=3D0; iadd<maxPatIndex; iadd++) { - if ((m_SndFile.Patterns[iadd]) && (nPatMap[iadd] >=3D MAX_PATTERNS)) + if ((m_SndFile.Patterns[iadd]) && (nPatMap[iadd] >=3D maxPatIndex)) { nPatMap[iadd] =3D nPats++; } } } - while (imap < MAX_ORDERS) + while (imap < maxOrdIndex) { - m_SndFile.Order[imap++] =3D 0xFF; + m_SndFile.Order[imap++] =3D m_SndFile.Patterns.GetInvalidIndex(); } BEGIN_CRITICAL(); // Reorder patterns & Delete unused patterns @@ -663,10 +571,10 @@ LPSTR lpszpatnames =3D m_SndFile.m_lpszPatternNames; m_SndFile.m_nPatternNames =3D 0; m_SndFile.m_lpszPatternNames =3D NULL; - for (UINT i=3D0; i<MAX_PATTERNS; i++) + for (UINT i=3D0; i<maxPatIndex; i++) { UINT k =3D nPatMap[i]; - if (k < MAX_PATTERNS) + if (k < maxPatIndex) { if (i !=3D k) bReordered =3D TRUE; // Remap pattern names @@ -686,16 +594,13 @@ } else if (m_SndFile.Patterns[i]) { - m_SndFile.FreePattern(m_SndFile.Patterns[i]); - m_SndFile.Patterns[i] =3D NULL; - m_SndFile.PatternSize[i] =3D 0; + m_SndFile.Patterns.Remove(i); nPatRemoved++; } } - for (UINT j=3D0; j<MAX_PATTERNS;j++) + for (UINT j=3D0; j<maxPatIndex;j++) { - m_SndFile.PatternSize[j] =3D nPatRows[j]; - m_SndFile.Patterns[j] =3D pPatterns[j]; + m_SndFile.Patterns[j].SetData(pPatterns[j], nPatRows[j]); } } END_CRITICAL(); @@ -719,7 +624,7 @@ //----------------------------------------- { if (!m_SndFile.m_nInstruments) return FALSE; - for (UINT i=3D0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (UINT i=3D0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns= [i]) { MODCOMMAND *p =3D m_SndFile.Patterns[i]; for (UINT j=3Dm_SndFile.m_nChannels*m_SndFile.PatternSize[i]; j; j--, p++) = if (p->instr) @@ -765,7 +670,7 @@ if (m_SndFile.m_nInstruments) { memset(bIns, 0, sizeof(bIns)); - for (UINT ipat=3D0; ipat<MAX_PATTERNS; ipat++) + for (UINT ipat=3D0; ipat<m_SndFile.Patterns.Size(); ipat++) { MODCOMMAND *p =3D m_SndFile.Patterns[ipat]; if (p) @@ -898,7 +803,7 @@ } //all outputs of used plugins count as used - if (usedmap[nPlug]=3D=3Dtrue) { + if (usedmap[nPlug]!=3D0) { if (m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) { int output =3D m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x7f; usedmap[output]=3Dtrue; @@ -1021,7 +926,7 @@ END_CRITICAL(); if (nSwap > 0) { - for (UINT iPat=3D0; iPat<MAX_PATTERNS; iPat++) if (m_SndFile.Patterns[iPa= t]) + for (UINT iPat=3D0; iPat<m_SndFile.Patterns.Size(); iPat++) if (m_SndFile= .Patterns[iPat]) { MODCOMMAND *p =3D m_SndFile.Patterns[iPat]; UINT nLen =3D m_SndFile.m_nChannels * m_SndFile.PatternSize[iPat]; @@ -1139,28 +1044,30 @@ LONG CModDoc::InsertPattern(LONG nOrd, UINT nRows) //------------------------------------------------ { - UINT maxpat =3D (m_SndFile.m_nType & MOD_TYPE_MOD) ? 128 : MAX_PATTERNS; - UINT i =3D 0; - for (i=3D0; i<maxpat; i++) + const int i =3D m_SndFile.Patterns.Insert(nRows); + if(i < 0) + return -1; + + //Increasing orderlist size if given order is beyond current limit, + //or if the last order already has a pattern. + if((nOrd =3D=3D m_SndFile.Order.size() || + m_SndFile.Order.back() < m_SndFile.Patterns.S... [truncated message content] |
From: <Rel...@us...> - 2006-12-28 17:09:57
|
Revision: 170 http://svn.sourceforge.net/modplug/?rev=170&view=rev Author: Relabsoluness Date: 2006-12-28 09:09:51 -0800 (Thu, 28 Dec 2006) Log Message: ----------- <Relabs> Added mptrack_generic.exe to the test branch. . <Relabs> Fixed a few possibilities of creating buffer overruns related to tuning notename handling. . <Relabs> Fixed channelmanager not updating channel states correctly when reordering channels. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/bin/mptrack_Generic.exe branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -199,40 +199,28 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - // Rearrange patterns content - for(i = 0; i < m_pSndFile->Patterns.Size(); i++){ + //Creating new order-vector for ReArrangeChannels. + vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels); + for(i = 0; i<nChannels; i++) + { + newChnOrder.push_back(newpat[i]); + } + if(m_pSndFile->ReArrangeChannels(newChnOrder) != nChannels) + { + MessageBox("Rearranging channels failed"); + END_CRITICAL(); + EndWaitCursor(); - // Allocate a new empty pattern to replace current pattern at i'th position in pattern array - p = m_pSndFile->Patterns[i]; - if(p) newp = CSoundFile::AllocatePattern(m_pSndFile->PatternSize[i], nChannels); + ResetState(TRUE,TRUE,TRUE,TRUE,TRUE); + LeaveCriticalSection(&applying); - if(p && !newp){ - END_CRITICAL(); - EndWaitCursor(); - LeaveCriticalSection(&applying); - ::MessageBox(NULL, "Pattern Data is corrupted!!!", "ERROR: Not enough memory to rearrange channels!", MB_ICONERROR | MB_OK); - return; - } - - // Copy data from old pattern taking care of new channel reodering - if(p != NULL){ - for(j = 0 ; j < m_pSndFile->PatternSize[i] ; j++){ - for(k = 0 ; k < nChannels ; k++) - memcpy(&newp[j*nChannels + k],&p[j*m_pSndFile->m_nChannels + newpat[k]],sizeof(MODCOMMAND)); - } - // Set new pattern in pattern array & free previous pattern - m_pSndFile->Patterns[i] = newp; - CSoundFile::FreePattern(p); - } + return; } + - // Copy channel settings - for(i = 0 ; i < m_pSndFile->m_nChannels ; i++) settings[i] = m_pSndFile->ChnSettings[i]; - // Redistribute channel setting & update manager internal store memory for(i = 0 ; i < nChannels ; i++){ if(i != newpat[i]){ - m_pSndFile->ChnSettings[i] = settings[newpat[i]]; memory[0][i] = newMemory[0][newpat[i]]; memory[1][i] = newMemory[1][newpat[i]]; memory[2][i] = newMemory[2][newpat[i]]; @@ -240,23 +228,13 @@ memory[3][i] = i; } - // Also update record states (unfortunetely they are not part of channel settings) - for(i = 0 ; i < nChannels ; i++) newMemory[1][i] = pModDoc->IsChannelRecord(i); - - pModDoc->ReinitRecordState(); - for(i = 0 ; i < nChannels ; i++){ - if(newMemory[1][newpat[i]] == 1) pModDoc->Record1Channel(i,TRUE); - if(newMemory[1][newpat[i]] == 2) pModDoc->Record2Channel(i,TRUE); - } - - // Update new number of channels - m_pSndFile->m_nChannels = nChannels; if(pActiveMod == pModDoc){ i = m_pSndFile->GetCurrentPos(); m_pSndFile->m_dwSongFlags &= ~SONG_STEP; m_pSndFile->SetCurrentPos(0); m_pSndFile->SetCurrentPos(i); } + END_CRITICAL(); EndWaitCursor(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -164,8 +164,9 @@ // Note s[0] = 0; - - if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", pSndFile->GetNoteName(nPos+1, m_nInstrument).c_str()); + string temp = pSndFile->GetNoteName(nPos+1, m_nInstrument); + temp.resize(4); + if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", temp.c_str()); rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note @@ -178,7 +179,12 @@ UINT n = penv->NoteMap[nPos]; if (n == 0xFF) strcpy(s, "==="); else if (n == 0xFE) strcpy(s, "^^^"); else - if (n <= 120) wsprintf(s, "%s", pSndFile->GetNoteName(n, m_nInstrument).c_str()); + if (n <= 120) + { + string temp = pSndFile->GetNoteName(n, m_nInstrument); + temp.resize(4); + wsprintf(s, "%s", temp.c_str()); + } } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow); if ((nPos == (int)m_nNote) && (!m_bIns)) @@ -1351,8 +1357,8 @@ case IDC_CHECK_PITCHTEMPOLOCK: if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) { - const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); - ASSERT(str.size() < 256); + string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + if(str.size() >= 250) str.resize(250); wsprintf(pszText, str.c_str()); return TRUE; } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -1366,6 +1366,7 @@ } } } + return ENV_RELEASE_NODE_UNSET; } WORD CViewInstrument::EnvGetReleaseNodeValue() @@ -1388,6 +1389,7 @@ } } } + return 0; } WORD CViewInstrument::EnvGetReleaseNodeTick() @@ -1410,6 +1412,7 @@ } } } + return 0; } @@ -1456,7 +1459,6 @@ } else if ((pnotify->dwType & dwType) && ((pnotify->dwType & 0xFFFF) == m_nInstrument)) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); BOOL bUpdate = FALSE; for (UINT i=0; i<MAX_CHANNELS; i++) { @@ -2353,6 +2355,7 @@ if ((pModDoc) && (pMainFrm) && (note<128)) { CHAR s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); if (note >= 0xFE) { pModDoc->NoteOff(0, (note == 0xFE) ? TRUE : FALSE, m_nInstrument); @@ -2379,7 +2382,14 @@ m_baPlayingNote[note] = true; //rewbs.instViewNNA m_nPlayingChannel= pModDoc->PlayNote(note, m_nInstrument, 0, FALSE); //rewbs.instViewNNA s[0] = 0; - if ((note) && (note <= 120)) wsprintf(s, "%s", pModDoc->GetSoundFile()->GetNoteName(static_cast<CTuning::STEPTYPE>(note), m_nInstrument).c_str()); + if ((note) && (note <= 120)) + { + const string temp = pModDoc->GetSoundFile()->GetNoteName(static_cast<CTuning::STEPTYPE>(note), m_nInstrument); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + } pMainFrm->SetInfoText(s); } } @@ -2602,7 +2612,7 @@ return CModScrollView::PreTranslateMessage(pMsg); } -LRESULT CViewInstrument::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +LRESULT CViewInstrument::OnCustomKeyMsg(WPARAM wParam, LPARAM) { if (wParam == kcNull) return NULL; @@ -2610,7 +2620,7 @@ CModDoc *pModDoc = GetDocument(); if (!pModDoc) return NULL; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); + //CSoundFile *pSndFile = pModDoc->GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); switch(wParam) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -1135,6 +1135,7 @@ //-------------------------------- { char s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); CComboBox *combo; CSoundFile *pSndFile; @@ -1147,7 +1148,12 @@ combo->SetItemData(combo->AddString("No note"), 0); for (UINT i=1; i<=120; i++) { - wsprintf(s, "%s", pSndFile->GetNoteName(i, m_nInstr).c_str()); + const string temp = pSndFile->GetNoteName(i, m_nInstr); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + combo->SetItemData(combo->AddString(s), i); } if (pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) @@ -2577,13 +2583,18 @@ //------------------------------------------------------------------- { CHAR s[32] = "--"; + const size_t sizeofS = sizeof(s)/sizeof(s[0]); if ((lParam >= 0) && (lParam < 3*12) && (m_pSndFile)) { UINT nSample = m_CbnSample.GetItemData(m_CbnSample.GetCurSel()); UINT nBaseOctave = m_SbOctave.GetPos() & 7; - wsprintf(s, "%s", m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str()); + const string temp = m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str(); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; if ((wParam == KBDNOTIFY_LBUTTONDOWN) && (nSample > 0) && (nSample < MAX_SAMPLES) && (penv)) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -46,6 +46,7 @@ { BOOL bFocus = (::GetFocus() == m_hWnd) ? TRUE : FALSE; CHAR s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); CRect rect; CTuning::STEPTYPE nNotes = static_cast<CTuning::STEPTYPE>((rcClient.bottom + m_cyFont - 1) / m_cyFont); @@ -59,7 +60,12 @@ BOOL bHighLight; // Note s[0] = 0; - wsprintf(s, "%s", m_pTuning->GetNoteName(nPos - 61).c_str()); + const string temp = m_pTuning->GetNoteName(nPos - 61).c_str(); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note Modified: branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h 2006-12-28 17:09:51 UTC (rev 170) @@ -368,7 +368,7 @@ const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C>::SERIALIZATION_FAILURE = true; template<class A, class B, class C> -const string CTuningBase<A, B, C>::s_FileExtension = ".mptt"; +const string CTuningBase<A, B, C>::s_FileExtension = ".tun"; template<class A, class B, class C> const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_MAINRATIOS = 0x1; //1b This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Rel...@us...> - 2006-12-21 15:02:49
|
Revision: 169 http://svn.sourceforge.net/modplug/?rev=169&view=rev Author: Relabsoluness Date: 2006-12-21 07:02:44 -0800 (Thu, 21 Dec 2006) Log Message: ----------- + <Relabs> Multiple samples/instruments/mods can be loaded from the load dialogs. + <Relabs> Pending solo channel and pending unmute all channels. + <Relabs> 32 bit float sample import . <Relabs> 24/32 bit PCM sample import. (+ <Relabs> Option to try to play files in a IT-compatible manner; affects only a couple of things for the time being.) ? Miscellaneous changes in the code Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -181,7 +181,7 @@ EnterCriticalSection(&applying); - MODCOMMAND *p,*newp; + MODCOMMAND *p = NULL,*newp = NULL; MODCHANNELSETTINGS settings[MAX_BASECHANNELS]; UINT i,j,k,nChannels,newpat[MAX_BASECHANNELS],newMemory[4][MAX_BASECHANNELS]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-12-21 15:02:44 UTC (rev 169) @@ -12,6 +12,7 @@ public: static CChannelManagerDlg * sharedInstance(BOOL autoCreate = TRUE); + static void DestroySharedInstance() {delete sharedInstance_; sharedInstance_ = NULL;} void SetDocument(void * parent); BOOL IsOwner(void * ctrl); BOOL IsDisplayed(void); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -2258,6 +2258,16 @@ commands[kcFileExportCompat].isHidden = false; commands[kcFileExportCompat].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].UID = 1778; + commands[kcUnmuteAllChnOnPatTransition].isHidden = false; + commands[kcUnmuteAllChnOnPatTransition].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].Message = "Unmute all channels on pattern transition"; + + commands[kcSoloChnOnPatTransition].UID = 1779; + commands[kcSoloChnOnPatTransition].isHidden = false; + commands[kcSoloChnOnPatTransition].isDummy = false; + commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition"; + #ifdef _DEBUG for (int i=0; i<kcNumCommands; i++) { if (commands[i].UID != 0) { // ignore unset UIDs Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-12-21 15:02:44 UTC (rev 169) @@ -226,6 +226,8 @@ kcChannelSolo, kcChannelUnmuteAll, kcToggleChanMuteOnPatTransition, + kcUnmuteAllChnOnPatTransition, + kcSoloChnOnPatTransition, kcCopyAndLoseSelection, kcTransposeUp, kcTransposeDown, Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1334,7 +1334,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { - //NOTE: pszText seems to point to char array of length 256. + //NOTE: pszText seems to point to char array of length 256 (Noverber 2006). if ((pszText) && (uId)) { switch(uId) @@ -1472,7 +1472,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Instruments|*.xi;*.pat;*.iti;*.wav;*.aif;*.aiff|" "FastTracker II Instruments (*.xi)|*.xi|" "GF1 Patches (*.pat)|*.pat|" @@ -1483,8 +1483,36 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurInsDir; } + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size. + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; - if (!OpenInstrument(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple instruments, advancing to next instrument and creating + //new instrument if necessary. + if(counter > 0) + { + if(m_nInstrument >= MAX_INSTRUMENTS-1) + break; + else + m_nInstrument++; + + if(m_nInstrument > m_pSndFile->GetNumInstruments()) + OnInstrumentNew(); + } + + if(!OpenInstrument(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); if (m_pParent) m_pParent->InstrumentChanged(m_nInstrument); SwitchToView(); } @@ -2386,7 +2414,7 @@ return; size_t sel = m_ComboTuning.GetCurSel(); - if(sel == 0) //Setting IT behavior. + if(sel == 0) //Setting IT behavior { BEGIN_CRITICAL(); pInstH->SetTuning(NULL); @@ -2591,7 +2619,7 @@ while(m_ComboTuning.GetCount() > 0) m_ComboTuning.DeleteString(0); - m_ComboTuning.AddString("IT behavior"); //<-> Instrument pTuning pointer == NULL + m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) { m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -893,7 +893,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Samples|*.wav;*.pat;*.s3i;*.smp;*.snd;*.raw;*.xi;*.aif;*.aiff;*.its;*.8sv;*.8svx;*.svx;*.pcm|" "Wave Files (*.wav)|*.wav|" "XI Samples (*.xi)|*.xi|" @@ -909,9 +909,38 @@ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurSmpDir; } dlg.m_ofn.nFilterIndex = nLastIndex; + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; + nLastIndex = dlg.m_ofn.nFilterIndex; - if (!OpenSample(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple samples, advancing to next sample and creating + //new one if necessary. + if(counter > 0) + { + if(m_nSample >= MAX_SAMPLES-1) + break; + else + m_nSample++; + + if(m_nSample > m_pSndFile->GetNumSamples()) + OnSampleNew(); + } + + if(!OpenSample(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); SwitchToView(); } @@ -2790,6 +2819,7 @@ } LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +//---------------------------------------------------------------- { if (wParam == kcNull) return NULL; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -229,9 +229,9 @@ for (int c=kcClearRow; c<=kcInsertAllRows; c++) newCat->commands.Add(c); newCat->separators.Add(kcInsertAllRows); //-------------------------------------- - for (int c=kcChannelMute; c<=kcToggleChanMuteOnPatTransition; c++) + for (int c=kcChannelMute; c<=kcSoloChnOnPatTransition; c++) newCat->commands.Add(c); - newCat->separators.Add(kcToggleChanMuteOnPatTransition); //-------------------------------------- + newCat->separators.Add(kcSoloChnOnPatTransition); //-------------------------------------- for (int c=kcTransposeUp; c<=kcTransposeOctDown; c++) newCat->commands.Add(c); newCat->separators.Add(kcTransposeOctDown); //-------------------------------------- Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -647,6 +647,9 @@ delete m_pAutoSaver; //rewbs.autosaver delete m_pPerfCounter; + CChannelManagerDlg::DestroySharedInstance(); + + //Saving statictunings here. CSoundFile::SaveStaticTunings(); } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-12-21 15:02:44 UTC (rev 169) @@ -630,7 +630,8 @@ }; -const CHAR gszBuildDate[] = __TIMESTAMP__; +//const CHAR gszBuildDate[] = __TIMESTAMP__; +const string buildDateTime = string(__DATE__) + string(" ") + string(__TIME__); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -982,7 +982,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_ALLOWMULTISELECT, // -> CODE#0023 // -> DESC="IT project files (.itp)" // "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|" @@ -1008,15 +1008,25 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurModDir; } - if (dlg.DoModal() == IDOK) + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() == IDOK) { - CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH]; - _splitpath(dlg.GetPathName(), szDrive, szDir, NULL, NULL); - strcpy(CMainFrame::m_szCurModDir, szDrive); - strcat(CMainFrame::m_szCurModDir, szDir); - CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex; - OpenDocumentFile(dlg.GetPathName()); + POSITION pos = dlg.GetStartPosition(); + while(pos != NULL) + { + CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH]; + CString pathName = dlg.GetNextPathName(pos); + _splitpath(pathName, szDrive, szDir, NULL, NULL); + strcpy(CMainFrame::m_szCurModDir, szDrive); + strcat(CMainFrame::m_szCurModDir, szDir); + CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex; + OpenDocumentFile(pathName); + } } + filenameBuffer.clear(); } @@ -1370,7 +1380,7 @@ CDialog::OnInitDialog(); m_bmp.SubclassDlgItem(IDC_BITMAP1, this); m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_MPTRACK)); - wsprintf(s, "Build Date: %s", gszBuildDate); + wsprintf(s, "Build Date: %s", buildDateTime.c_str()); SetDlgItemText(IDC_EDIT2, s); SetDlgItemText(IDC_EDIT3, CMainFrame::GetFullVersionString()); Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "PlaybackEventer.h" +#include "sndfile.h" + +CPlaybackEventer::~CPlaybackEventer() +//--------------------------------- +{ +} + +void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) +//------------------------------------------------------------------------- +{ + if(chnIndex >= m_rSndFile.m_nChannels) + return; + + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? false : true; + } + m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = (m_rSndFile.ChnSettings[chnIndex].dwFlags & CHN_MUTE) ? true : false; +} + + +void CPlaybackEventer::PatternTransitionChnUnmuteAll() +//---------------------------------------------------- +{ + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? true : false; + } +} \ No newline at end of file Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,25 @@ +#ifndef PLAYBACKEVENTER_H +#define PLAYBACKEVENTER_H + +#include "pattern.h" + +class CSoundFile; + +//==================== +class CPlaybackEventer +//==================== +{ +public: + CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {} + ~CPlaybackEventer(); + + //SetPatternEvent(const PATTERNINDEX pattern, const ROWINDEX row, const CHANNELINDEX column); + + void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); + void PatternTransitionChnUnmuteAll(); + +private: + CSoundFile& m_rSndFile; +}; + +#endif Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1,11 +1,7 @@ -// TuningDialog.cpp : implementation file -// - #include "stdafx.h" #include "mptrack.h" #include "TuningDialog.h" #include <algorithm> -#include ".\tuningdialog.h" #include "misc_util.h" const string CTuningDialog::s_stringTypeGEN = "General"; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-12-21 15:02:44 UTC (rev 169) @@ -2,9 +2,9 @@ #define TUNINGDIALOG_H #include "tuningratiomapwnd.h" +#include "tuningcollection.h" #include <vector> #include <string> -#include "afxwin.h" using std::vector; using std::string; @@ -111,6 +111,7 @@ //to those edit boxes(they are modified by non-user //activies and in these cases the value should be applied //to the tuning data. + }; #endif Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -68,6 +68,8 @@ ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick) + ON_COMMAND(ID_PATTERN_TRANSITIONSOLO, OnPendingSoloChnFromClick) + ON_COMMAND(ID_PATTERN_TRANSITION_UNMUTEALL, OnPendingUnmuteAllChnFromClick) ON_COMMAND(ID_PATTERN_UNMUTEALL,OnUnmuteAll) ON_COMMAND(ID_PATTERN_DELETEROW,OnDeleteRows) ON_COMMAND(ID_PATTERN_DELETEALLROW,OnDeleteRowsEx) @@ -1092,7 +1094,6 @@ { CModDoc *pModDoc = GetDocument(); CSoundFile *pSndFile; - CHAR s[256]; //rewbs.patPlugNames HMENU hMenu; // Too far left to get a ctx menu: @@ -2813,6 +2814,7 @@ InvalidateRow(); } + return 0; } @@ -3144,6 +3146,8 @@ case kcChannelSolo: OnSoloChannel(true); return wParam; case kcChannelUnmuteAll: OnUnmuteAll(); return wParam; case kcToggleChanMuteOnPatTransition: TogglePendingMute((m_dwCursor&0xFFFF)>>3); return wParam; + case kcUnmuteAllChnOnPatTransition: OnPendingUnmuteAllChnFromClick(); return wParam; + case kcSoloChnOnPatTransition: PendingSoloChn(GetCurrentChannel()); return wParam; case kcTransposeUp: OnTransposeUp(); return wParam; case kcTransposeDown: OnTransposeDown(); return wParam; case kcTransposeOctUp: OnTransposeOctUp(); return wParam; @@ -3797,7 +3801,7 @@ UINT instr = p->instr; instr = ((instr * 10) + val) % 1000; - if (instr > MAX_INSTRUMENTS) instr = instr % 100; + if (instr >= MAX_INSTRUMENTS) instr = instr % 100; if ( ((pSndFile->m_nInstruments==0) && (pSndFile->m_nSamples<100)) || // if we're using samples & have less than 100 samples (pSndFile->m_nInstruments < 100)) { // or if we're using instruments and have less than 100 instruments instr = instr % 100; // --> ensure the entered instrument value is less than 100. @@ -4247,6 +4251,7 @@ void CViewPattern::OnSelectPlugin(UINT nID) +//----------------------------------------- { CModDoc *pModDoc = GetDocument(); if (!pModDoc) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return; @@ -4342,15 +4347,18 @@ } if (b) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); if (bAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); - + AppendMenu(hMenu, pSndFile->m_bChannelMuteTogglePending[nChn] ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_PATTERN_TRANSITIONMUTE, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? - "Unmute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : - "Mute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); + "On transition: Unmute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : + "On transition: Mute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); + AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); + AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); + return true; } @@ -4587,10 +4595,9 @@ HMENU instrumentChangeMenu = ::CreatePopupMenu(); AppendMenu(hMenu, MF_POPUP|greyed, (UINT)instrumentChangeMenu, "Change Instrument\t" + ih->GetKeyTextFromCommand(kcPatternSetInstrument)); - CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - CModDoc *pModDoc = GetDocument(); - CSoundFile* pSndFile; - if(pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return true; + if(pSndFile == NULL) + return false; + if (pSndFile->m_nInstruments) { for (UINT i=1; i<=pSndFile->m_nInstruments; i++) { @@ -4652,7 +4659,7 @@ if (GetColTypeFromCursor(m_dwBeginSel) <= colType) { chans.Add(startChan); //first selected chan includes this col type } - for (int chan=startChan+1; chan<endChan; chan++) { + for (UINT chan=startChan+1; chan<endChan; chan++) { chans.Add(chan); //All chans between first & last must include this col type } if ((startChan != endChan) && colType <= GetColTypeFromCursor(m_dwEndSel)) { @@ -4723,6 +4730,26 @@ TogglePendingMute((m_nMenuParam&0xFFFF)>>3); } +void CViewPattern::OnPendingSoloChnFromClick() +//----------------------------------------------- +{ + PendingSoloChn(GetChanFromCursor(m_nMenuParam)); +} + +void CViewPattern::OnPendingUnmuteAllChnFromClick() +//---------------------------------------------- +{ + GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTransitionChnUnmuteAll(); + InvalidateChannelsHeaders(); +} + +void CViewPattern::PendingSoloChn(const CHANNELINDEX nChn) +//--------------------------------------------- +{ + GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTranstionChnSolo(nChn); + InvalidateChannelsHeaders(); +} + void CViewPattern::TogglePendingMute(UINT nChn) //--------------------------------------------- { @@ -4745,15 +4772,11 @@ CPoint pt = GetPointFromPosition(m_dwCursor); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "Record is disabled(editing blocked)."); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------"); AppendMenu(hMenu, MF_STRING, IDC_PATTERN_RECORD, "Editing(record) is disabled; click here to enable it."); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------"); //To check: It seems to work the way it should, but still is it ok to use IDC_PATTERN_RECORD here since it is not //'aimed' to be used here. ClientToScreen(&pt); - //::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_NONOTIFY, pt.x, pt.y, 0, m_hWnd, NULL); ::TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, m_hWnd, NULL); ::DestroyMenu(hMenu); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-12-21 15:02:44 UTC (rev 169) @@ -239,6 +239,8 @@ afx_msg void OnMuteFromClick(); //rewbs.customKeys afx_msg void OnSoloFromClick(); //rewbs.customKeys afx_msg void OnTogglePendingMuteFromClick(); //rewbs.customKeys + afx_msg void OnPendingSoloChnFromClick(); + afx_msg void OnPendingUnmuteAllChnFromClick(); afx_msg void OnSoloChannel(BOOL current); //rewbs.customKeys afx_msg void OnMuteChannel(BOOL current); //rewbs.customKeys afx_msg void OnUnmuteAll(); @@ -336,6 +338,8 @@ private: void TogglePendingMute(UINT nChn); + void PendingSoloChn(const CHANNELINDEX nChn); + void PendingUnmuteAllChn(); public: afx_msg void OnRButtonUp(UINT nFlags, CPoint point); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1305,7 +1305,10 @@ if (result) *result = 0; } -#define MAX_FILEOPEN_BUFSIZE 32000 +#define MAX_FILEOPEN_BUFSIZE 2048 +//Note: Above value might be the maximum size the buffer can be; +//it might be worthwhile to check the CFileDialog documentation +//if wanting the increase that. VOID CSelectPluginDlg::OnAddPlugin() //---------------------------------- Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -169,6 +169,7 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" ON_COMMAND(IDC_CHECK6, OnCheck6) + ON_COMMAND(IDC_IT_STANDARD, OnITStandard) ON_CBN_SELCHANGE(IDC_COMBO1,UpdateDialog) // -! NEW_FEATURE#0023 //}}AFX_MSG_MAP @@ -193,6 +194,7 @@ // -> DESC="IT project files (.itp)" DDX_Control(pDX, IDC_CHECK6, m_CheckBox6); // -! NEW_FEATURE#0023 + DDX_Control(pDX, IDC_IT_STANDARD, m_CheckBoxITStandard); //}}AFX_DATA_MAP } @@ -284,6 +286,7 @@ m_CheckBox3.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITOLDEFFECTS) ? MF_CHECKED : 0); m_CheckBox4.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITCOMPATMODE) ? MF_CHECKED : 0); m_CheckBox5.SetCheck((m_pSndFile->m_dwSongFlags & SONG_EXFILTERRANGE) ? MF_CHECKED : 0); + m_CheckBoxITStandard.SetCheck( (m_pSndFile->GetModSpecificFlag(IT_STANDARD) && m_pSndFile->GetType() == MOD_TYPE_IT) ? MF_CHECKED : MF_UNCHECKED); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -300,6 +303,8 @@ // -> DESC="IT project files (.itp)" m_CheckBox6.EnableWindow(m_TypeBox.GetCurSel() == 4 ? TRUE : FALSE); // -! NEW_FEATURE#0023 + + m_CheckBoxITStandard.EnableWindow((m_pSndFile->GetType() == MOD_TYPE_IT) ? TRUE : FALSE); m_TempoModeBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); @@ -370,6 +375,12 @@ } // -! NEW_FEATURE#0023 +void CModTypeDlg::OnITStandard() +//------------------------------ +{ + m_pSndFile->SetModSpecificFlag(IT_STANDARD, m_CheckBoxITStandard.GetCheck()); +} + BOOL CModTypeDlg::VerifyData() //--------------------------------- { Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-12-21 15:02:44 UTC (rev 169) @@ -20,6 +20,8 @@ CButton m_CheckBox6; // -! NEW_FEATURE#0023 + CButton m_CheckBoxITStandard; + public: CModTypeDlg(CSoundFile *pSndFile, CWnd *parent):CDialog(IDD_MODDOC_MODTYPE, parent) { m_pSndFile = pSndFile; m_nType = m_nChannels = 0; } BOOL VerifyData(); @@ -42,6 +44,7 @@ // -> DESC="IT project files (.itp)" afx_msg void OnCheck6(); // -! NEW_FEATURE#0023 + afx_msg void OnITStandard(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-12-21 15:02:44 UTC (rev 169) @@ -903,51 +903,54 @@ GROUPBOX "Sample Map",IDC_STATIC,461,27,62,141 END -IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 243, 198 +IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 247, 215 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Song Properties" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,189,8,50,14 - PUSHBUTTON "Cancel",IDCANCEL,189,26,50,14 - GROUPBOX "Type",IDC_STATIC,4,4,174,41 + DEFPUSHBUTTON "OK",IDOK,193,8,50,14 + PUSHBUTTON "Cancel",IDCANCEL,193,26,50,14 + GROUPBOX "Type",IDC_STATIC,4,4,174,45 COMBOBOX IDC_COMBO1,8,16,101,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,114,16,60,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,106,93,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,113,93,10 CONTROL "Fast Volume Slides",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,118,75,10 + WS_TABSTOP,7,124,75,10 CONTROL "IT Old Effects",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,111,106,76,10 + WS_TABSTOP,111,113,76,10 CONTROL "IT Compatible Gxx",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,111,118,76,10 + WS_TABSTOP,111,124,76,10 CONTROL "Extended filter range",IDC_CHECK5,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,130,82,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,137,82,10 CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,33,128,10 - EDITTEXT IDC_ROWSPERBEAT,114,60,16,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_ROWSPERMEASURE,114,72,16,12,ES_AUTOHSCROLL | + EDITTEXT IDC_ROWSPERBEAT,114,65,16,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_ROWSPERMEASURE,114,76,16,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows/beat",IDC_STATIC,132,62,36,8 - LTEXT "Rows/measure",IDC_STATIC,132,74,49,8 - COMBOBOX IDC_COMBO3,7,72,99,77,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "Rows/beat",IDC_STATIC,132,65,36,8 + LTEXT "Rows/measure",IDC_STATIC,132,78,49,8 + COMBOBOX IDC_COMBO3,7,76,99,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Tempo",IDC_STATIC,4,51,235,38 - LTEXT "Mode:",IDC_STATIC,7,62,21,8 - COMBOBOX IDC_COMBO4,156,129,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | + GROUPBOX "Tempo",IDC_STATIC,4,55,235,38 + LTEXT "Mode:",IDC_STATIC,7,65,21,8 + COMBOBOX IDC_COMBO4,156,135,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Playback",IDC_STATIC,4,95,235,51 - LTEXT "Plugin levels:",IDC_STATIC,111,131,43,10 - GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,150,235,42 - EDITTEXT IDC_EDIT1,67,161,166,13,ES_AUTOHSCROLL | ES_READONLY, + GROUPBOX "Playback",IDC_STATIC,4,99,240,62 + LTEXT "Plugin levels:",IDC_STATIC,111,138,43,10 + GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,165,235,44 + EDITTEXT IDC_EDIT1,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE - EDITTEXT IDC_EDIT2,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY, + EDITTEXT IDC_EDIT2,67,190,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE - EDITTEXT IDC_EDIT5,7,161,58,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_EDIT6,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_EDIT5,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_EDIT6,7,190,58,13,ES_AUTOHSCROLL | ES_READONLY + CONTROL "Aim for Impulse Tracker playback (for IT)", + IDC_IT_STANDARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, + 149,143,10 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 Modified: branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-12-21 15:02:44 UTC (rev 169) @@ -1,17 +1,15 @@ -#ifndef __SNDFILE_H -#include "../soundlib/sndfile.h" -#endif - #ifndef PATTERN_H #define PATTERN_H #include <vector> +#include "modcommand.h" using std::vector; class CPatternContainer; -typedef UINT ROWINDEX; +typedef size_t ROWINDEX; +typedef size_t CHANNELINDEX; //============ class CPattern Modified: branches/OpenMPT_MPTm_Tuning/mptrack/resource.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-12-21 15:02:44 UTC (rev 169) @@ -438,7 +438,7 @@ #define IDC_CHECK67 1767 #define IDC_CHECK68 1768 #define IDC_CHECK69 1769 -#define IDC_CHECK70 1770 +#define IDC_IT_STANDARD 1770 #define IDC_CHECK71 1771 #define IDC_CHECK72 1772 #define IDC_CHECK73 1773 @@ -946,6 +946,8 @@ #define ID_EDIT_GOTO 36018 #define ID_VIEW_GRAPH 36019 #define ID_PATTERN_TRANSITIONMUTE 36020 +#define ID_PATTERN_TRANSITIONSOLO 36021 +#define ID_PATTERN_TRANSITION_UNMUTEALL 36022 #define ID_SELECTINST 36100 #define ID_NETLINK_MPTFR 37001 #define ID_PLUG_RECORDAUTOMATION 37003 Modified: branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-12-21 15:02:44 UTC (rev 169) @@ -39,7 +39,7 @@ } //Gets called on seekg - pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::binary) + pos_type seekpos(pos_type sp, ios_base::openmode) // which = ios_base::in | ios_base::binary) { DWORD offset = static_cast<DWORD>(sp); if(offset >= 0 && offset < GetStrmSize()) @@ -52,7 +52,7 @@ } //Gets called on tellg - pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::binary) + pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode) // which = ios_base::in | ios_base::binary) { DWORD beginOffset = 0; if(way == ios::cur) Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -4478,7 +4478,11 @@ cbs.pubsetbuf((char*)cpcMPTStart, dwMemLength-mptStartPos); istream fin(&cbs); - m_TuningsTuneSpecific.UnSerializeBinary(fin); + if(m_TuningsTuneSpecific.UnSerializeBinary(fin)) + { + ::MessageBox(NULL, "Error occured - loading failed while trying to load tune specific tunings.", 0, MB_OK); + return FALSE; + } //2. Reading tuning id <-> tuning name map. typedef map<WORD, string> MAP; Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -10,6 +10,7 @@ #include "stdafx.h" #include "sndfile.h" #include "it_defs.h" +#include "wavConverter.h" #pragma warning(disable:4244) @@ -421,26 +422,28 @@ || (pfmtpk->channels != 1)) return FALSE; } else pfmtpk = NULL; } - // WAVE_FORMAT_PCM, WAVE_FORMAT_EXTENSIBLE - if (((pfmt->format != 1) && (pfmt->format != 0xFFFE)) + // WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT, WAVE_FORMAT_EXTENSIBLE + if ((((pfmt->format != 1) && (pfmt->format != 0xFFFE)) + && (pfmt->format != 3 || pfmt->bitspersample != 32)) //Microsoft IEEE FLOAT || (pfmt->channels > 2) || (!pfmt->channels) || (pfmt->bitspersample & 7) || (!pfmt->bitspersample) || (pfmt->bitspersample > 32) ) return FALSE; + DestroySample(nSample); UINT nType = RS_PCM8U; if (pfmt->channels == 1) { if (pfmt->bitspersample == 24) nType = RS_PCM24S; - if (pfmt->bitspersample == 32) nType = RS_PCM32S; - else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U; + else if (pfmt->bitspersample == 32) nType = RS_PCM32S; + else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U; } else { if (pfmt->bitspersample == 24) nType = RS_STIPCM24S; else if (pfmt->bitspersample == 32) nType = RS_STIPCM32S; - else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U; + else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U; } UINT samplesize = pfmt->channels * (pfmt->bitspersample >> 3); MODINSTRUMENT *pins = &Ins[nSample]; @@ -477,7 +480,7 @@ AdjustSampleLoop(pins); } else { - ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos); + ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos, pfmt->format); } // smpl field if (psh) Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1045,7 +1045,7 @@ note = instr = 0; } } - if ((!note) && (instr)) + if ((!note) && (instr)) //Case: instrument with no note data. { if (m_nInstruments) { @@ -1059,9 +1059,11 @@ pChn->dwFlags &= ~CHN_NOTEFADE; pChn->nFadeOutVol = 65536; } - } else + } else //Case: Only samples are used; no instruments. { if (instr < MAX_SAMPLES) pChn->nVolume = Ins[instr].nVolume; + if (m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD)) + note = pChn->nNote; } if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) instr = 0; } @@ -1089,7 +1091,6 @@ InstrumentChange(pChn, instr, bPorta, TRUE); pChn->nNewIns = 0; // Special IT case: portamento+note causes sample change -> ignore portamento - //if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) && (psmp != pChn->pInstrument) && (note) && (note < 0x80)) { @@ -3281,7 +3282,7 @@ } // Channel mutes - for (int chan=0; chan<m_nChannels; chan++) { + for (UINT chan=0; chan<m_nChannels; chan++) { if (m_bChannelMuteTogglePending[chan]) { m_pModDoc->MuteChannel(chan, !m_pModDoc->IsChannelMuted(chan)); m_bChannelMuteTogglePending[chan]=false; Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -13,6 +13,7 @@ #include "../mptrack/moddoc.h" #include "sndfile.h" #include "aeffectx.h" +#include "wavConverter.h" #include <vector> #include <algorithm> @@ -26,6 +27,7 @@ #define UNLHA_SUPPORT #define ZIPPED_MOD_SUPPORT LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx"; +//Should there be mptm? #endif // NO_ARCHIVE_SUPPORT #else // NO_COPYRIGHT: EarSaver only loads mod/s3m/xm/it/wav #define MODPLUG_BASIC_SUPPORT @@ -375,7 +377,7 @@ CTuningCollection CSoundFile::s_TuningsSharedLocal("Local Tunings"); -CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this) +CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this), m_PlaybackEventer(*this) //---------------------- { m_nType = MOD_TYPE_NONE; @@ -400,6 +402,8 @@ m_bIsRendering = false; m_nMaxSample = 0; + m_ModFlags.reset(); + m_pModDoc = NULL; m_dwLastSavedWithVersion=0; m_dwCreatedWithVersion=0; @@ -698,7 +702,7 @@ BOOL CSoundFile::Destroy() //------------------------ { - int i; + size_t i; for (i=0; i<Patterns.Size(); i++) if (Patterns[i]) { FreePattern(Patterns[i]); @@ -1422,7 +1426,7 @@ UINT nRemainingChannels = newOrder.size(); - if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < 4) + if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < GetNumChannelMin()) { CString str = "Error: Bad newOrder vector in CSoundFile::ReArrangeChannels(...)"; CMainFrame::GetMainFrame()->MessageBox(str , "ReArrangeChannels", MB_OK | MB_ICONINFORMATION); @@ -1856,9 +1860,8 @@ // 5 = signed 16-bit PCM data // 6 = unsigned 16-bit PCM data - -UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength) -//------------------------------------------------------------------------------------------------ +UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength, const WORD format) +//----------------------------------------------------------------------------------------------------------------------- { UINT len = 0, mem = pIns->nLength+6; @@ -1888,7 +1891,7 @@ len = pIns->nLength; if (len > dwMemLength) len = pIns->nLength = dwMemLength; LPSTR pSample = pIns->pSample; - for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80); + for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80); } break; @@ -2207,7 +2210,7 @@ break; #ifdef MODPLUG_TRACKER - // PCM 24-bit signed -> load sample, and normalize it to 16-bit + // Mono PCM 24/32-bit signed & 32 bit float -> load sample, and normalize it to 16-bit case RS_PCM24S: case RS_PCM32S: len = pIns->nLength * 3; @@ -2215,56 +2218,66 @@ if (len > dwMemLength) break; if (len > 4*8) { - UINT slsize = (nFlags == RS_PCM32S) ? 4 : 3; - LPBYTE pSrc = (LPBYTE)lpMemFile; - LONG max = 255; - if (nFlags == RS_PCM32S) pSrc++; - for (UINT j=0; j<len; j+=slsize) + if(nFlags == RS_PCM24S) { - LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8; - l /= 256; - if (l > max) max = l; - if (-l > max) max = -l; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + CopyWavBuffer<3, 2, WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } - max = (max / 128) + 1; - signed short *pDest = (signed short *)pIns->pSample; - for (UINT k=0; k<len; k+=slsize) + else //RS_PCM32S { - LONG l = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - *pDest++ = (signed short)(l / max); + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if(format == 3) + CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + else + CopyWavBuffer<4, 2, WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } } break; - // Stereo PCM 24-bit signed -> load sample, and normalize it to 16-bit + // Stereo PCM 24/32-bit signed & 32 bit float -> convert sample to 16 bit case RS_STIPCM24S: case RS_STIPCM32S: - len = pIns->nLength * 6; - if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2; - if (len > dwMemLength) break; - if (len > 8*8) + if(format == 3 && nFlags == RS_STIPCM32S) //Microsoft IEEE float { - UINT slsize = (nFlags == RS_STIPCM32S) ? 4 : 3; - LPBYTE pSrc = (LPBYTE)lpMemFile; - LONG max = 255; - if (nFlags == RS_STIPCM32S) pSrc++; - for (UINT j=0; j<len; j+=slsize) + len = pIns->nLength * 6; + //pIns->nLength tells(?) the number of frames there + //are. One 'frame' of 1 byte(== 8 bit) mono data requires + //1 byte of space, while one frame of 3 byte(24 bit) + //stereo data requires 3*2 = 6 bytes. This is(?) + //why there is factor 6. + + len += pIns->nLength * 2; + //Compared to 24 stereo, 32 bit stereo needs 16 bits(== 2 bytes) + //more per frame. + + if(len > dwMemLength) break; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if (len > 8*8) { - LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8; - l /= 256; - if (l > max) max = l; - if (-l > max) max = -l; + CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } - max = (max / 128) + 1; - signed short *pDest = (signed short *)pIns->pSample; - for (UINT k=0; k<len; k+=slsize) + } + else + { + len = pIns->nLength * 6; + if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2; + if (len > dwMemLength) break; + if (len > 8*8) { - LONG lr = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - k += slsize; - LONG ll = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - pDest[0] = (signed short)ll; - pDest[1] = (signed short)lr; - pDest += 2; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if(nFlags == RS_STIPCM32S) + { + CopyWavBuffer<4,2,WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + } + if(nFlags == RS_STIPCM24S) + { + CopyWavBuffer<3,2,WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + } + } } break; @@ -2800,12 +2813,33 @@ ROWINDEX CSoundFile::GetRowMax() const {return MAX_PATTERN_ROWS;} ROWINDEX CSoundFile::GetRowMin() const {return 2;} +CHANNELINDEX CSoundFile::GetNumChannelMax() const +//----------------------------------- +{ + if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMax; + if(m_nType == MOD_TYPE_IT) return max_chans_IT; + if(m_nType == MOD_TYPE_XM) return max_chans_XM; + if(m_nType == MOD_TYPE_MOD) return max_chans_MOD; + if(m_nType == MOD_TYPE_S3M) return max_chans_S3M; + return 4; +} + +CHANNELINDEX CSoundFile::GetNumChannelMin() const +//----------------------------------- +{ + if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMin; + else return 4; +} + void CSoundFile::ChangeModTypeTo(const int& newType) //--------------------------------------------------- { const UINT oldInvalidIndex = Patterns.GetInvalidIndex(); const UINT oldIgnoreIndex = Patterns.GetIgnoreIndex(); m_nType = newType; + + m_ModFlags.reset(); + replace(Order.begin(), Order.end(), oldInvalidIndex, Patterns.GetInvalidIndex()); replace(Order.begin(), Order.end(), oldIgnoreIndex, Patterns.GetIgnoreIndex()); } Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-12-21 15:02:44 UTC (rev 169) @@ -261,9 +261,12 @@ // 24-bit signed #define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed -#define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed -#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 24-bit signed +// 32-bit +#define RS_PCM32S (RS_PCM16S|0xC0) // mono 32-bit signed +#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 32-bit signed + + // NNA types #define NNA_NOTECUT 0 #define NNA_CONTINUE 1 @@ -469,6 +472,7 @@ typedef struct _MODINSTRUMENT { UINT nLength,nLoopStart,nLoopEnd; + //nLength <-> Number of 'frames'? UINT nSustainStart, nSustainEnd; LPSTR pSample; UINT nC4Speed; @@ -483,6 +487,16 @@ BYTE nVibDepth; BYTE nVibRate; CHAR name[22]; + + //Returns size which pSample is at least. + //Very dirty implementation. + DWORD GetSampleSizeInBytes() const + { + DWORD len = nLength; + if(uFlags & CHN_16BIT) len *= 2; + if(uFlags & CHN_STEREO) len *= 2; + return len; + } } MODINSTRUMENT; @@ -678,17 +692,8 @@ CHAR szName[MAX_CHANNELNAME]; } MODCHANNELSETTINGS; +#include "modcommand.h" -typedef struct _MODCOMMAND -{ - BYTE note; - BYTE instr; - BYTE volcmd; - BYTE command; - BYTE vol; - BYTE param; -} MODCOMMAND, *LPMODCOMMAND; - //////////////////////////////////////////////////////////////////// // Mix Plugins #define MIXPLUG_MIXREADY 0x01 // Set when cleared @@ -836,6 +841,12 @@ #include "../mptrack/patternContainer.h" #include "../mptrack/ordertopatterntable.h" +typedef CPatternContainer::PATTERNINDEX PATTERNINDEX; + +#include "../mptrack/playbackEventer.h" + + + class CSoundFile; //====================== @@ -849,6 +860,9 @@ const CSoundFile& m_rSndFile; }; + +const BYTE IT_STANDARD = 0; + //============== class CSoundFile //============== @@ -862,8 +876,22 @@ ROWINDEX GetRowMax() const; ROWINDEX GetRowMin() const; + CHANNELINDEX GetNumChannelMax() const; + CHANNELINDEX GetNumChannelMin() const; + void ChangeModTypeTo(const int& newType); UINT GetModType() const {return m_nType;} + + bitset<8> m_ModFlags; + virtual bool GetModSpecificFlag(BYTE i) + { + return (i < m_ModFlags.size()) ? m_ModFlags[i] : false; + } + virtual void SetModSpecificFlag(BYTE i, bool val) + { + if(i < m_ModFlags.size()) + m_ModFlags[i] = val; + } //Tuning--> public: @@ -877,12 +905,20 @@ static CTuningCollection s_TuningsSharedLocal; //<--Tuning +public: + CPlaybackEventer& GetPlaybackEventer() {return m_PlaybackEventer;} + //const CPlaybackEventer& GetPlaybackEventer() const {return m_playbackEventer;} + private: void PortamentoMPT(MODCHANNEL*, int); void PortamentoFineMPT(MODCHANNEL*, int); +private: + CPlaybackEventer m_PlaybackEventer; + + public: // Static Members static UINT m_nXBassDepth, m_nXBassRange; static float m_nMaxSample; @@ -1172,7 +1208,7 @@ char GetDeltaValue(char prev, UINT n) const { return (char)(prev + CompressionTable[n & 0x0F]); } UINT PackSample(int &sample, int next); BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL); - UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength); + UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength, const WORD format = 1); BOOL DestroySample(UINT nSample); // -> CODE#0020 Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1099,11 +1099,27 @@ } else //Original { - switch(m_nTickCount % 3) + BYTE note = pChn->nNote; + bool apply = true; + + if(m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD)) { - case 1: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break; - case 2: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break; + if(pChn->nArpeggio >> 4 == 0 && (pChn->nArpeggio & 0x0F) == 0) + apply = false; + //Ignoring J00. + + if(apply) note = GetNoteFromPeriod(pChn->nPeriod); + //Using actual note instead of channel note. } + + if(apply) + { + switch(m_nTickCount % 3) + { + case 1: period = GetPeriodFromNote(note + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break; + case 2: period = GetPeriodFromNote(note + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break; + } + } } } Added: branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,14 @@ +#ifndef MODCOMMAND_H +#define MODCOMMAND_H + +typedef struct _MODCOMMAND +{ + BYTE note; + BYTE instr; + BYTE volcmd; + BYTE command; + BYTE vol; + BYTE param; +} MODCOMMAND, *LPMODCOMMAND; + +#endif Added: branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,137 @@ +#ifndef WAVCONVERTER_H +#define WAVCONVERTER_H + +#include <limits> + +typedef void (*DATACONV)(char* const, char*, const double); +//srcBuffer, destBuffer, maximum value in srcBuffer. + +typedef double MAXFINDER(const char* const, const size_t); +//Buffer, bufferSize. + +inline void WavSigned8To16(char* const inBuffer, char* outBuffer, const double max) +//---------------------------------------------------------------------- +{ + outBuffer[0] = 0; + outBuffer[1] = inBuffer[0]; +} + + +template<BYTE INBYTES> +inline double MaxFinderInt(const char* const buffer, const size_t bs) +//---------------------------------------------------------------------- +{ + if(INBYTES > 8) return 0; + if(bs < INBYTES) return 0; + + __int64 max = 0; + for(size_t i = 0; i <= bs-INBYTES; i += INBYTES) + { + __int64 temp = 0; + memcpy((char*)(&temp)+(8-INBYTES), buffer + i, INBYTES); + if(temp < 0) temp = -temp; + temp >>= 8*INBYTES; + if(temp > max) + max = temp; + } + return static_cast<double>(max); +} + + +inline double MaxFinderFloat32(const char* const buffer, const size_t bs) +//---------------------------------------------------------------------- +{ + float max = 0; + for(size_t i = 0; i<=bs-4; i+=4) + { + float temp = *reinterpret_cast<const float*>(buffer+i); + temp = fabs(temp); + if(temp > max) + max = temp; + } + return max; +} + + +inline void WavSigned24To16(char* const inBuffer, char* outBuffer, const double max) +//-------------------------------------------------------------------------------- +{ + __int32 val = 0; + memcpy((char*)(&val)+1, inBuffer, 3); + //Reading 24 bit data to three last bytes in 32 bit int. + + ASSERT((val << 24) == 0); + + bool negative = (val < 0) ? true : false; + if(negative) val = -val; + if(val < 0) val = (std::numeric_limits<__int32>::max)(); + //Handling special case that val is at minimum of int32 limit. + + val >>= 8; + + const __int64 NC = 32766; //Normalisation constant (2^16 / 2)-1. + const __int64 maxInt = static_cast<__int64>(max); + val = static_cast<__int32>(val*NC/maxInt); + + ASSERT((val >> 15) == 0); + + __int16 outVal = static_cast<__int16>(val); + + if(negative) outVal = -outVal; + + memcpy(outBuffer, &outVal, 2); +} + +inline void WavFloat32To16(char* const inBuffer, char* outBuffer, double max) +//---------------------------------------------------------------------- +{ + __int16* pOut = reinterpret_cast<__int16*>(outBuffer); + float* pIn = reinterpret_cast<float*>(inBuffer); + *pOut = static_cast<__int16>((*pIn / max) * 32766); +} + +inline void WavSigned32To16(char* const inBuffer, char* outBuffer, double max) +//---------------------------------------------------------------------- +{ + if(max >= 1) + { + double temp = *reinterpret_cast<const __int32*>(inBuffer); + __int16& pOut = *reinterpret_cast<__int16*>(outBuffer); + ASSERT(static_cast<__int16>(fabs(temp) / max * 32766) <= 32766); + pOut = static_cast<__int16>(temp / max * 32766); + } + else //No normalisation + { + outBuffer[0] = inBuffer[2]; + outBuffer[1] = inBuffer[3]; + } +} + + +template<size_t inBytes, size_t outBytes, DATACONV CopyAndConvert, MAXFINDER MaxFinder> +bool CopyWavBuffer(char* const readBuffer, const size_t rbSize, char* writeBuffer, const size_t wbSize) +//---------------------------------------------------------------------- +{ + if(inBytes > rbSize || outBytes > wbSize) return true; + if(inBytes > 8) return true; + size_t rbCounter = 0; + size_t wbCounter = 0; + + //Finding max value + const double max = MaxFinder(readBuffer, rbSize); + + if(max == 0) return true; + + //Copying buffer. + while(rbCounter <= rbSize-inBytes && wbCounter <= wbSize-outBytes) + { + CopyAndConvert(readBuffer+rbCounter, writeBuffer+wbCounter, max); + rbCounter += inBytes; + wbCounter += outBytes; + } + return false; +} + + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-20 21:40:58
|
Revision: 167 Author: rewbs Date: 2006-08-20 14:39:55 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=167&view=rev Log Message: ----------- <rewbs> First attempt at providing initial MPTm and tuning mode code in new branch. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h branches/OpenMPT_MPTm_Tuning/mptrack/View_gen.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_tre.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.vcproj branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/soundlib/Dlsbank.cpp branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DBM.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_ams.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mdl.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mid.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mod.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mt2.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_s3m.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_xm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Tables.cpp Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/ branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/local_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/standard/ branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/standard/std_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.cpp branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.h branches/OpenMPT_MPTm_Tuning/soundlib/MPT_module.cpp branches/OpenMPT_MPTm_Tuning/soundlib/MPT_module.h branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -206,6 +206,9 @@ name.Append(".it"); } break; + case MOD_TYPE_MPT: + name.Append(".mptm"); + break; case MOD_TYPE_XM: name.Append(".xm"); break; @@ -241,6 +244,9 @@ pSndFile->SaveITProject(fileName) : pSndFile->SaveIT(fileName, 0); break; + case MOD_TYPE_MPT: + success = pSndFile->SaveMPT(fileName, 0); + break; //default: //Do nothing } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -215,6 +215,8 @@ // -> DESC="IT project files (.itp)" // case MOD_TYPE_IT: pszModType = "IT (Impulse Tracker)"; break; case MOD_TYPE_IT: pszModType = m_pSndFile->m_dwSongFlags & SONG_ITPROJECT ? "ITP (IT Project)" : "IT (Impulse Tracker)"; break; + case MOD_TYPE_MPT: pszModType = "MPTM (OpenMPT)"; break; + // -! NEW_FEATURE#0023 } wsprintf(s, "%s, %d channels", pszModType, m_pSndFile->m_nChannels); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -7,6 +7,7 @@ #include "ctrl_ins.h" #include "view_ins.h" #include "dlg_misc.h" +#include "tuningDialog.h" #include "misc_util.h" #include <vector> #include <string> @@ -439,7 +440,7 @@ INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; if ((penv) && (m_nNote < 120)) { - if (!m_bIns && (pSndFile->m_nType & MOD_TYPE_IT)) + if (!m_bIns && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { UINT n = penv->NoteMap[m_nNote]; BOOL bOk = FALSE; @@ -496,7 +497,7 @@ return true; } - else if ((!m_bIns) && (pSndFile->m_nType & MOD_TYPE_IT)) { //in note column + else if ((!m_bIns) && (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { //in note column UINT n = penv->NoteMap[m_nNote]; @@ -649,6 +650,7 @@ ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP + ON_CBN_SELCHANGE(IDC_COMBOTUNING, OnCbnSelchangeCombotuning) ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock) ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock) @@ -696,6 +698,7 @@ DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack); DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); // -! NEW_FEATURE#0027 + DDX_Control(pDX, IDC_COMBOTUNING, m_ComboTuning); DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); //}}AFX_DATA_MAP @@ -815,6 +818,24 @@ m_SpinInstrument.SetFocus(); + //-->Setting tunings to Combobox + for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).GetName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); + + //<--Setting tunings to Combobox + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); //OnBnClickedCheckPitchtempolock(); m_EditPitchTempoLock.SetLimitText(4); @@ -1010,9 +1031,10 @@ if (!m_bInitialized) dwHintMask |= HINT_MODTYPE; if (dwHintMask & HINT_MODTYPE) { - BOOL bITonly = ((m_pSndFile->m_nType == MOD_TYPE_IT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + BOOL bITonly = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; //rewbs.instroVSTi - BOOL bITandXM = (((m_pSndFile->m_nType == MOD_TYPE_IT) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + BOOL bITandXM = (((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + bool bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT10), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT11), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT7), bITandXM); @@ -1052,6 +1074,7 @@ m_SliderResonance.EnableWindow(bITonly); m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); + m_ComboTuning.EnableWindow(bMPTOnly); m_EditPitchTempoLock.EnableWindow(bITonly); m_CheckPitchTempoLock.EnableWindow(bITonly); } @@ -1124,7 +1147,7 @@ m_ComboPPC.SetCurSel(penv->nPPC); SetDlgItemInt(IDC_EDIT15, penv->nPPS); // Filter - if (m_pSndFile->m_nType & MOD_TYPE_IT) + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { m_CheckCutOff.SetCheck((penv->nIFC & 0x80) ? TRUE : FALSE); m_CheckResonance.SetCheck((penv->nIFR & 0x80) ? TRUE : FALSE); @@ -1145,6 +1168,8 @@ if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 + + UpdateTuningComboBox(); if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); else @@ -1411,7 +1436,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((pSndFile->m_nType & MOD_TYPE_IT) + if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0) && (CMainFrame::GetInputHandler()->ShiftPressed())) //rewbs.customKeys { @@ -1438,7 +1463,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_nInstruments > 0)) + if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0)) { BOOL bFirst = (pSndFile->m_nInstruments) ? FALSE : TRUE; LONG smp = m_pModDoc->InsertInstrument(0, m_nInstrument); @@ -1503,10 +1528,10 @@ // "FastTracker II Instruments (*.xi)|*.xi|" // "Impulse Tracker Instruments (*.iti)|*.iti||", // this); - CFileDialog dlg(FALSE, (m_pSndFile->m_nType & MOD_TYPE_IT) ? "iti" : "xi", + CFileDialog dlg(FALSE, (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? "iti" : "xi", szFileName, OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, - ( m_pSndFile->m_nType & MOD_TYPE_IT ? "Impulse Tracker Instruments (*.iti)|*.iti|" + ( m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT) ? "Impulse Tracker Instruments (*.iti)|*.iti|" "FastTracker II Instruments (*.xi)|*.xi||" : "FastTracker II Instruments (*.xi)|*.xi|" "Impulse Tracker Instruments (*.iti)|*.iti||" ), @@ -1649,7 +1674,7 @@ if (nVol != (int)penv->nGlobalVol) { penv->nGlobalVol = nVol; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; @@ -1691,7 +1716,7 @@ if (nPan != (int)penv->nPan) { penv->nPan = nPan; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; @@ -2363,6 +2388,121 @@ return 0; } //end rewbs.customKeys + +void CCtrlInstruments::OnCbnSelchangeCombotuning() +//------------------------------------------------ +{ + if (IsLocked() || m_pModDoc == NULL || m_pSndFile == NULL) return; + + INSTRUMENTHEADER* pInstH = m_pSndFile->Headers[m_nInstrument]; + if(pInstH == 0) + return; + + CTuningCollection* tc = 0; + size_t sel = m_ComboTuning.GetCurSel(); + if(sel < CSoundFile::s_TuningsSharedStandard.GetNumTunings()) + tc = &CSoundFile::s_TuningsSharedStandard; + else + { + sel -= CSoundFile::s_TuningsSharedStandard.GetNumTunings(); + if(sel < CSoundFile::s_TuningsSharedLocal.GetNumTunings()) + tc = &CSoundFile::s_TuningsSharedLocal; + else + { + sel -= CSoundFile::s_TuningsSharedLocal.GetNumTunings(); + if(sel < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings()) + tc = &m_pSndFile->m_TuningsTuneSpecific; + } + } + + if(tc) + { + BEGIN_CRITICAL(); + pInstH->pTuning = &tc->GetTuning(sel); + END_CRITICAL(); + m_pModDoc->SetModified(); + return; + } + + + //Creating vector for the CTuningDialog. + vector<CTuningCollection*> v; + v.push_back(&m_pSndFile->s_TuningsSharedStandard); + v.push_back(&m_pSndFile->s_TuningsSharedLocal); + v.push_back(&m_pSndFile->m_TuningsTuneSpecific); + CTuningDialog td(this, v, pInstH->pTuning); + td.DoModal(); + + //Recreating tuning combobox so that possible + //new tuning(s) come visible. + while(m_ComboTuning.GetCount() > 0) + m_ComboTuning.DeleteString(0); + for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).GetName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); + + UpdateTuningComboBox(); + + + //TODO: Update notemap window with correct notenames. +} + + +void CCtrlInstruments::UpdateTuningComboBox() +//------------------------------------------- +{ + if (m_pModDoc == 0 || m_pSndFile == 0 + || m_nInstrument > m_pSndFile->GetNumInstruments() + || m_pSndFile->Headers[m_nInstrument]->pTuning == 0) return; + + for(size_t i = 0; i < CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + if(m_pSndFile->Headers[m_nInstrument]->pTuning == &CSoundFile::s_TuningsSharedStandard.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i); + return; + } + } + + for(size_t i = 0; i < CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + if(m_pSndFile->Headers[m_nInstrument]->pTuning == &CSoundFile::s_TuningsSharedLocal.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings()); + return; + } + } + + for(size_t i = 0; i < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + if(m_pSndFile->Headers[m_nInstrument]->pTuning == &m_pSndFile->m_TuningsTuneSpecific.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()); + return; + } + } + + + string str = string("Tuning ") + m_pSndFile->Headers[m_nInstrument]->pTuning->GetName() + + string(" was not found. Setting to default tuning."); + MessageBox(str.c_str()); + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->pTuning = m_pSndFile->Headers[m_nInstrument]->s_DefaultTuning; + END_CRITICAL(); + m_ComboTuning.SetCurSel(0); +} + void CCtrlInstruments::OnEnChangeEditPitchtempolock() //---------------------------------------------------- { Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-08-20 21:39:55 UTC (rev 167) @@ -78,6 +78,10 @@ CSpinButtonCtrl m_SpinAttack; // -! NEW_FEATURE#0027 + //Tuning + CComboBox m_ComboTuning; + void UpdateTuningComboBox(); + //Pitch/Tempo lock CEdit m_EditPitchTempoLock; CButton m_CheckPitchTempoLock; @@ -148,6 +152,7 @@ afx_msg void OnEditSampleMap(); afx_msg void TogglePluginEditor(); //rewbs.instroVSTi afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void OnCbnSelchangeCombotuning(); afx_msg void OnEnChangeEditPitchtempolock(); afx_msg void OnBnClickedCheckPitchtempolock(); afx_msg void OnEnKillfocusEditPitchtempolock(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -338,7 +338,7 @@ } m_pSndFile->GetPatternName(nPat, s, sizeof(s)); m_EditPatName.SetWindowText(s); - BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ToolBar.EnableButton(ID_PATTERN_MIDIMACRO, bXMIT); m_ToolBar.EnableButton(ID_PATTERN_PROPERTIES, bXMIT); m_ToolBar.EnableButton(ID_PATTERN_EXPAND, bXMIT); @@ -822,7 +822,7 @@ UINT nCurOrd = m_OrderList.GetCurSel(); UINT pat = pSndFile->Order[nCurOrd]; UINT rows = 64; - if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[pat]; if (rows < 32) rows = 32; @@ -852,7 +852,7 @@ UINT rows = 64; if (nCurPat < MAX_PATTERNS) { - if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[nCurPat]; if (rows < 16) rows = 16; @@ -1074,7 +1074,7 @@ if (strcmp(s, sold)) { m_pSndFile->SetPatternName(nPat, s); - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, (nPat << 24) | HINT_PATNAMES, this); } } @@ -1204,4 +1204,5 @@ return false; } + //end rewbs.instroVST \ No newline at end of file Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -651,7 +651,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"); - if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_PROPERTIES, "&Properties..."); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -527,7 +527,7 @@ m_ComboSustainType.AddString("Off"); m_ComboSustainType.AddString("On"); // Bidirectional Loops - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { m_ComboLoopType.AddString("Bidi"); m_ComboSustainType.AddString("Bidi"); @@ -545,19 +545,19 @@ m_SpinSustainEnd.SetRange(-1, 1); m_SpinSustainEnd.SetPos(0); // Sustain Loops only available in IT - b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ComboSustainType.EnableWindow(b); m_SpinSustainStart.EnableWindow(b); m_SpinSustainEnd.EnableWindow(b); m_EditSustainStart.EnableWindow(b); m_EditSustainEnd.EnableWindow(b); // Finetune / C-4 Speed / BaseNote - b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; SetDlgItemText(IDC_TEXT7, (b) ? "Freq. (Hz)" : "Finetune"); m_SpinFineTune.SetRange(-1, 1); m_EditFileName.EnableWindow(b); // AutoVibrato - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ComboAutoVib.EnableWindow(b); m_SpinVibSweep.EnableWindow(b); m_SpinVibDepth.EnableWindow(b); @@ -566,11 +566,11 @@ m_EditVibDepth.EnableWindow(b); m_EditVibRate.EnableWindow(b); // Global Volume - b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_EditGlobalVol.EnableWindow(b); m_SpinGlobalVol.EnableWindow(b); // Panning - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_CheckPanning.EnableWindow(b); m_EditPanning.EnableWindow(b); m_SpinPanning.EnableWindow(b); @@ -609,7 +609,7 @@ //end rewbs.fix36944 // FineTune / C-4 Speed / BaseNote int transp = 0; - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { wsprintf(s, "%lu", pins->nC4Speed); m_EditFineTune.SetWindowText(s); @@ -926,7 +926,7 @@ SwitchToView(); return; } - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { memcpy(szFileName, m_pSndFile->Ins[m_nSample].name, 22); szFileName[22] = 0; @@ -2166,7 +2166,7 @@ memcpy(m_pSndFile->Ins[m_nSample].name, s, 22); // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] m_pModDoc->UpdateAllViews(NULL, (m_nSample << 20) | HINT_SAMPLEINFO, this); - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2207,7 +2207,7 @@ { if (IsLocked()) return; BOOL b = FALSE; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { b = IsDlgButtonChecked(IDC_CHECK1); } @@ -2216,14 +2216,14 @@ if (!(m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING)) { m_pSndFile->Ins[m_nSample].uFlags |= CHN_PANNING; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } else { if (m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING) { m_pSndFile->Ins[m_nSample].uFlags &= ~CHN_PANNING; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType == (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } } @@ -2246,7 +2246,7 @@ if (nPan != m_pSndFile->Ins[m_nSample].nPan) { m_pSndFile->Ins[m_nSample].nPan = nPan; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2256,7 +2256,7 @@ { if (IsLocked()) return; int n = GetDlgItemInt(IDC_EDIT5); - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M)) + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC4Speed)) { @@ -2290,7 +2290,7 @@ { if (IsLocked()) return; int n = 60 - (m_CbnBaseNote.GetCurSel() + BASENOTE_MIN); - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M)) + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Ins[m_nSample].nC4Speed) & 0x7f; n = CSoundFile::TransposeToFrequency(n, ft); @@ -2724,7 +2724,7 @@ // FineTune / C-5 Speed if ((pos = (short int)m_SpinFineTune.GetPos()) != 0) { - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { LONG d = pins->nC4Speed; if (d < 1) d = 8363; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -407,7 +407,7 @@ const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]? "[Channel %d]" : "Channel %d"; // const char *pszfmt = pModDoc->IsChannelRecord(ncolhdr) ? "Channel %d " : "Channel %d"; // -! NEW_FEATURE#0012 - if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) + if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"%d: [%s]":"%d: %s"; else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Ch%d]":"Ch%d"; else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Chn %d]":"Chn %d"; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -395,7 +395,7 @@ UINT nType = pSndFile->GetType(); UINT mask = 1 | 2 | 4 | 16; - if (nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { mask |= 8; //mask |= 32; //rewbs.graph Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -352,6 +352,8 @@ m_InputHandler = new CInputHandler(this); //rewbs.customKeys m_pPerfCounter= new CPerformanceCounter(); + //Loading static tunings here - probably not the best place to do that but anyway. + CSoundFile::LoadStaticTunings(); } void CMainFrame::LoadIniSettings() @@ -1976,7 +1978,7 @@ m_WaveFile.m_nDefaultTempo = 125; m_WaveFile.m_nDefaultSpeed = 4; m_WaveFile.m_nRepeatCount = 0; - m_WaveFile.m_nType = MOD_TYPE_IT; + m_WaveFile.m_nType = MOD_TYPE_IT; //MOD_TYPE_MPT? m_WaveFile.m_nChannels = 4; m_WaveFile.m_nInstruments = 1; m_WaveFile.m_nSamples = 1; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -140,9 +140,9 @@ if(CTrackApp::IsProject()) m_SndFile.m_dwSongFlags |= SONG_ITPROJECT; // -! NEW_FEATURE#0023 - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; //rewbs.MacroGUI: enable embedded macros by default. - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_SndFile.m_dwSongFlags |= SONG_EMBEDMIDICFG; + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) m_SndFile.m_dwSongFlags |= SONG_EMBEDMIDICFG; theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg); // -> CODE#0015 @@ -313,6 +313,7 @@ case MOD_TYPE_S3M: case MOD_TYPE_XM: case MOD_TYPE_IT: + case MOD_TYPE_MPT: bModified = FALSE; break; case MOD_TYPE_AMF0: @@ -381,6 +382,7 @@ // -> DESC="IT project files (.itp)" // if (!lstrcmpi(fext, ".it")) nType = MOD_TYPE_IT; else if (!lstrcmpi(fext, ".it") || !lstrcmpi(fext, ".itp")) nType = MOD_TYPE_IT; else + if (!lstrcmpi(fext, ".mptm")) nType = MOD_TYPE_MPT; else // -! NEW_FEATURE#0023 if (!greccount) { @@ -396,6 +398,7 @@ case MOD_TYPE_S3M: bOk = m_SndFile.SaveS3M(lpszPathName, dwPacking); break; case MOD_TYPE_XM: bOk = m_SndFile.SaveXM(lpszPathName, dwPacking); break; case MOD_TYPE_IT: bOk = (m_SndFile.m_dwSongFlags & SONG_ITPROJECT || !lstrcmpi(fext, ".itp")) ? m_SndFile.SaveITProject(lpszPathName) : m_SndFile.SaveIT(lpszPathName, dwPacking); break; + case MOD_TYPE_MPT: bOk = m_SndFile.SaveMPT(lpszPathName, dwPacking); break; } EndWaitCursor(); if (bOk) @@ -414,7 +417,7 @@ // -> DESC="IT project files (.itp)" BOOL CModDoc::SaveModified() { - if(m_SndFile.m_nType == MOD_TYPE_IT && m_SndFile.m_dwSongFlags & SONG_ITPROJECT && !(m_SndFile.m_dwSongFlags & SONG_ITPEMBEDIH)){ + if((m_SndFile.m_nType & MOD_TYPE_IT) && m_SndFile.m_dwSongFlags & SONG_ITPROJECT && !(m_SndFile.m_dwSongFlags & SONG_ITPEMBEDIH)){ BOOL unsavedInstrument = FALSE; @@ -430,7 +433,7 @@ BOOL iti = stricmp(&m_SndFile.m_szInstrumentPath[i][size-3],"iti") == 0; BOOL xi = stricmp(&m_SndFile.m_szInstrumentPath[i][size-2],"xi") == 0; - if(iti || (!iti && !xi && m_SndFile.m_nType == MOD_TYPE_IT)) + if(iti || (!iti && !xi && m_SndFile.m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) m_SndFile.SaveITIInstrument(i+1, m_SndFile.m_szInstrumentPath[i]); if(xi || (!xi && !iti && m_SndFile.m_nType == MOD_TYPE_XM)) m_SndFile.SaveXIInstrument(i+1, m_SndFile.m_szInstrumentPath[i]); @@ -509,6 +512,11 @@ } // -! NEW_FEATURE#0023 break; + case MOD_TYPE_MPT: + lpszDefExt = "mptm"; + lpszFilter = "OpenMPT Modules (*.mptm)|*.mptm||"; + strcpy(fext, ".mptm"); + break; default: ErrorBox(IDS_ERR_SAVESONG, CMainFrame::GetMainFrame()); return FALSE; @@ -609,7 +617,7 @@ { m_SndFile.ChnSettings[init].dwFlags = 0; m_SndFile.ChnSettings[init].nVolume = 64; - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) m_SndFile.ChnSettings[init].nPan = 128; else m_SndFile.ChnSettings[init].nPan = (init & 0x01) ? 64 : 192; @@ -630,7 +638,7 @@ m_SndFile.Headers[1] = new INSTRUMENTHEADER; InitializeInstrument(m_SndFile.Headers[1], 1); } - if (m_SndFile.m_nType & (MOD_TYPE_IT|MOD_TYPE_XM)) + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT|MOD_TYPE_XM)) { m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; } @@ -998,7 +1006,7 @@ } //Mark IT as modified - if (m_SndFile.m_nType == MOD_TYPE_IT) { + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { CMainFrame::GetMainFrame()->ThreadSafeSetModified(this); } @@ -1016,7 +1024,7 @@ BOOL CModDoc::SoloChannel(UINT nChn, BOOL bSolo) { if (nChn >= m_SndFile.m_nChannels) return FALSE; - if (m_SndFile.m_nType == MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); if (bSolo) m_SndFile.ChnSettings[nChn].dwFlags |= CHN_SOLO; else m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SOLO; return TRUE; @@ -1035,7 +1043,7 @@ BOOL CModDoc::NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix) { if (nChn >= m_SndFile.m_nChannels) return FALSE; - if (m_SndFile.m_nType == MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); if (bNoFx){ m_SndFile.ChnSettings[nChn].dwFlags |= CHN_NOFX; if(updateMix) m_SndFile.Chn[nChn].dwFlags |= CHN_NOFX; @@ -1127,10 +1135,10 @@ DWORD d = (bSurround) ? CHN_SURROUND : 0; if (nChn >= m_SndFile.m_nChannels) return FALSE; - if (m_SndFile.m_nType != MOD_TYPE_IT) d = 0; + if (!(m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) d = 0; if (d != (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SURROUND)) { - if (m_SndFile.m_nType == MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); if (d) m_SndFile.ChnSettings[nChn].dwFlags |= CHN_SURROUND; else m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SURROUND; @@ -1149,7 +1157,7 @@ if (m_SndFile.ChnSettings[nChn].nVolume != nVolume) { m_SndFile.ChnSettings[nChn].nVolume = nVolume; - if (m_SndFile.m_nType & MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); bOk = TRUE; } m_SndFile.Chn[nChn].nGlobalVol = nVolume; @@ -1165,7 +1173,7 @@ if (m_SndFile.ChnSettings[nChn].nPan != nPan) { m_SndFile.ChnSettings[nChn].nPan = nPan; - if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); bOk = TRUE; } m_SndFile.Chn[nChn].nPan = nPan; @@ -1754,14 +1762,14 @@ void CModDoc::OnEditComments() //---------------------------- { - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_COMMENTS); + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_COMMENTS); } //rewbs.graph void CModDoc::OnEditGraph() //---------------------------- { - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_GRAPH); + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_GRAPH); } //end rewbs.graph @@ -1840,7 +1848,7 @@ //--------------------------------------- { if (p) p->Enable(((m_SndFile.m_nType == MOD_TYPE_XM) - || (m_SndFile.m_nType == MOD_TYPE_IT)) ? TRUE : FALSE); + || (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) ? TRUE : FALSE); } @@ -1975,8 +1983,11 @@ #define MOD_TYPE_MODXM (MOD_TYPE_MOD|MOD_TYPE_XM) #define MOD_TYPE_S3MIT (MOD_TYPE_S3M|MOD_TYPE_IT) -#define MOD_TYPE_NOMOD (MOD_TYPE_S3M|MOD_TYPE_XM|MOD_TYPE_IT) +#define MOD_TYPE_S3MITMPT (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT) +#define MOD_TYPE_NOMOD (MOD_TYPE_S3M|MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) #define MOD_TYPE_XMIT (MOD_TYPE_XM|MOD_TYPE_IT) +#define MOD_TYPE_XMITMPT (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) +#define MOD_TYPE_ITMPT (MOD_TYPE_IT|MOD_TYPE_MPT) #define MAX_FXINFO 66 //rewbs.smoothVST, increased from 64... I wonder what this will break? const MPTEFFECTINFO gFXInfo[MAX_FXINFO] = @@ -1999,12 +2010,12 @@ {CMD_SPEED, 0,0, 0, 0xFFFFFFFF, "Set Speed"}, {CMD_TEMPO, 0,0, 0, 0xFFFFFFFF, "Set Tempo"}, {CMD_TREMOR, 0,0, 0, MOD_TYPE_NOMOD, "Tremor"}, - {CMD_CHANNELVOLUME, 0,0, 0, MOD_TYPE_S3MIT, "Set channel volume"}, - {CMD_CHANNELVOLSLIDE,0,0, 0, MOD_TYPE_S3MIT, "Channel volslide"}, + {CMD_CHANNELVOLUME, 0,0, 0, MOD_TYPE_S3MITMPT, "Set channel volume"}, + {CMD_CHANNELVOLSLIDE,0,0, 0, MOD_TYPE_S3MITMPT, "Channel volslide"}, {CMD_GLOBALVOLUME, 0,0, 0, MOD_TYPE_NOMOD, "Set global volume"}, {CMD_GLOBALVOLSLIDE,0,0, 0, MOD_TYPE_NOMOD, "Global volume slide"}, {CMD_KEYOFF, 0,0, 0, MOD_TYPE_XM, "Key off"}, - {CMD_FINEVIBRATO, 0,0, 0, MOD_TYPE_S3MIT, "Fine vibrato"}, + {CMD_FINEVIBRATO, 0,0, 0, MOD_TYPE_S3MITMPT, "Fine vibrato"}, {CMD_PANBRELLO, 0,0, 0, MOD_TYPE_NOMOD, "Panbrello"}, {CMD_PANNINGSLIDE, 0,0, 0, MOD_TYPE_NOMOD, "Panning slide"}, {CMD_SETENVPOSITION,0,0, 0, MOD_TYPE_XM, "Envelope position"}, @@ -2027,19 +2038,19 @@ {CMD_MODCMDEX, 0xF0,0xE0, 0, MOD_TYPE_MODXM, "Pattern delay"}, {CMD_MODCMDEX, 0xF0,0xF0, 0, MOD_TYPE_XM, "Set active macro"}, // Extended S3M/IT effects - {CMD_S3MCMDEX, 0xF0,0x10, 0, MOD_TYPE_S3MIT, "Glissando control"}, + {CMD_S3MCMDEX, 0xF0,0x10, 0, MOD_TYPE_S3MITMPT, "Glissando control"}, {CMD_S3MCMDEX, 0xF0,0x20, 0, MOD_TYPE_S3M, "Set finetune"}, - {CMD_S3MCMDEX, 0xF0,0x30, 0, MOD_TYPE_S3MIT, "Vibrato waveform"}, - {CMD_S3MCMDEX, 0xF0,0x40, 0, MOD_TYPE_S3MIT, "Tremolo waveform"}, - {CMD_S3MCMDEX, 0xF0,0x50, 0, MOD_TYPE_S3MIT, "Panbrello waveform"}, - {CMD_S3MCMDEX, 0xF0,0x60, 0, MOD_TYPE_S3MIT, "Fine pattern delay"}, - {CMD_S3MCMDEX, 0xF0,0x80, 0, MOD_TYPE_S3MIT, "Set panning"}, - {CMD_S3MCMDEX, 0xF0,0xA0, 0, MOD_TYPE_S3MIT, "Set high offset"}, - {CMD_S3MCMDEX, 0xF0,0xB0, 0, MOD_TYPE_S3MIT, "Pattern loop"}, - {CMD_S3MCMDEX, 0xF0,0xC0, 0, MOD_TYPE_S3MIT, "Note cut"}, - {CMD_S3MCMDEX, 0xF0,0xD0, 0, MOD_TYPE_S3MIT, "Note delay"}, - {CMD_S3MCMDEX, 0xF0,0xE0, 0, MOD_TYPE_S3MIT, "Pattern delay"}, - {CMD_S3MCMDEX, 0xF0,0xF0, 0, MOD_TYPE_IT, "Set active macro"}, + {CMD_S3MCMDEX, 0xF0,0x30, 0, MOD_TYPE_S3MITMPT, "Vibrato waveform"}, + {CMD_S3MCMDEX, 0xF0,0x40, 0, MOD_TYPE_S3MITMPT, "Tremolo waveform"}, + {CMD_S3MCMDEX, 0xF0,0x50, 0, MOD_TYPE_S3MITMPT, "Panbrello waveform"}, + {CMD_S3MCMDEX, 0xF0,0x60, 0, MOD_TYPE_S3MITMPT, "Fine pattern delay"}, + {CMD_S3MCMDEX, 0xF0,0x80, 0, MOD_TYPE_S3MITMPT, "Set panning"}, + {CMD_S3MCMDEX, 0xF0,0xA0, 0, MOD_TYPE_S3MITMPT, "Set high offset"}, + {CMD_S3MCMDEX, 0xF0,0xB0, 0, MOD_TYPE_S3MITMPT, "Pattern loop"}, + {CMD_S3MCMDEX, 0xF0,0xC0, 0, MOD_TYPE_S3MITMPT, "Note cut"}, + {CMD_S3MCMDEX, 0xF0,0xD0, 0, MOD_TYPE_S3MITMPT, "Note delay"}, + {CMD_S3MCMDEX, 0xF0,0xE0, 0, MOD_TYPE_S3MITMPT, "Pattern delay"}, + {CMD_S3MCMDEX, 0xF0,0xF0, 0, MOD_TYPE_ITMPT, "Set active macro"}, // MPT XM extensions and special effects {CMD_XFINEPORTAUPDOWN,0xF0,0x10,0, MOD_TYPE_XM, "Extra fine porta up"}, {CMD_XFINEPORTAUPDOWN,0xF0,0x20,0, MOD_TYPE_XM, "Extra fine porta down"}, @@ -2048,11 +2059,11 @@ {CMD_XFINEPORTAUPDOWN,0xF0,0x90,0, MOD_TYPE_XM, "Sound control"}, {CMD_XFINEPORTAUPDOWN,0xF0,0xA0,0, MOD_TYPE_XM, "Set high offset"}, // MPT IT extensions and special effects - {CMD_S3MCMDEX, 0xF0,0x90, 0, MOD_TYPE_S3MIT, "Sound control"}, - {CMD_S3MCMDEX, 0xF0,0x70, 0, MOD_TYPE_IT, "Instr. control"}, + {CMD_S3MCMDEX, 0xF0,0x90, 0, MOD_TYPE_S3MITMPT, "Sound control"}, + {CMD_S3MCMDEX, 0xF0,0x70, 0, MOD_TYPE_ITMPT, "Instr. control"}, // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" - {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMIT, "X param"} + {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMITMPT, "X param"} // -! NEW_FEATURE#0010 }; @@ -2258,7 +2269,7 @@ // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" // if (nType & MOD_TYPE_S3MIT) nmin = 1; - if (nType & MOD_TYPE_S3MIT) nmin = 0; + if (nType & MOD_TYPE_S3MITMPT) nmin = 0; // -! NEW_FEATURE#0010 break; case CMD_VOLUMESLIDE: @@ -2266,13 +2277,13 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: - nmax = (nType & MOD_TYPE_S3MIT) ? 58 : 30; + nmax = (nType & MOD_TYPE_S3MITMPT) ? 58 : 30; break; case CMD_PANNING8: if (nType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) nmax = 0x80; break; case CMD_GLOBALVOLUME: - nmax = (nType & MOD_TYPE_IT) ? 128 : 64; + nmax = (nType & MOD_TYPE_IT | MOD_TYPE_MPT) ? 128 : 64; break; } *prangeMin = nmin; @@ -2301,7 +2312,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: - if (m_SndFile.m_nType & MOD_TYPE_S3MIT) + if (m_SndFile.m_nType & MOD_TYPE_S3MITMPT) { if (!param) pos = 29; else if (((param & 0x0F) == 0x0F) && (param & 0xF0)) @@ -2338,7 +2349,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: - if (m_SndFile.m_nType & MOD_TYPE_S3MIT) + if (m_SndFile.m_nType & MOD_TYPE_S3MITMPT) { if (pos < 15) param = 15-pos; else if (pos < 29) param = (29-pos) | 0xF0; else @@ -2426,11 +2437,11 @@ { wsprintf(s, "continue"); } else - if ((m_SndFile.m_nType & MOD_TYPE_S3MIT) && ((param & 0x0F) == 0x0F) && (param & 0xF0)) + if ((m_SndFile.m_nType & MOD_TYPE_S3MITMPT) && ((param & 0x0F) == 0x0F) && (param & 0xF0)) { wsprintf(s, "fine +%d", param >> 4); } else - if ((m_SndFile.m_nType & MOD_TYPE_S3MIT) && ((param & 0xF0) == 0xF0) && (param & 0x0F)) + if ((m_SndFile.m_nType & MOD_TYPE_S3MITMPT) && ((param & 0xF0) == 0xF0) && (param & 0x0F)) { wsprintf(s, "fine -%d", param & 0x0F); } else @@ -2569,19 +2580,19 @@ { {VOLCMD_VOLUME, MOD_TYPE_NOMOD, "v: Set Volume"}, {VOLCMD_PANNING, MOD_TYPE_NOMOD, "p: Set Panning"}, - {VOLCMD_VOLSLIDEUP, MOD_TYPE_XMIT, "c: Volume slide up"}, - {VOLCMD_VOLSLIDEDOWN, MOD_TYPE_XMIT, "d: Volume slide down"}, - {VOLCMD_FINEVOLUP, MOD_TYPE_XMIT, "a: Fine volume up"}, - {VOLCMD_FINEVOLDOWN, MOD_TYPE_XMIT, "b: Fine volume down"}, - {VOLCMD_VIBRATOSPEED, MOD_TYPE_XMIT, "u: Vibrato speed"}, + {VOLCMD_VOLSLIDEUP, MOD_TYPE_XMITMPT, "c: Volume slide up"}, + {VOLCMD_VOLSLIDEDOWN, MOD_TYPE_XMITMPT, "d: Volume slide down"}, + {VOLCMD_FINEVOLUP, MOD_TYPE_XMITMPT, "a: Fine volume up"}, + {VOLCMD_FINEVOLDOWN, MOD_TYPE_XMITMPT, "b: Fine volume down"}, + {VOLCMD_VIBRATOSPEED, MOD_TYPE_XMITMPT, "u: Vibrato speed"}, {VOLCMD_VIBRATO, MOD_TYPE_XM, "h: Vibrato depth"}, {VOLCMD_PANSLIDELEFT, MOD_TYPE_XM, "l: Pan slide left"}, {VOLCMD_PANSLIDERIGHT, MOD_TYPE_XM, "r: Pan slide right"}, - {VOLCMD_TONEPORTAMENTO, MOD_TYPE_XMIT, "g: Tone portamento"}, - {VOLCMD_PORTAUP, MOD_TYPE_IT, "f: Portamento up"}, - {VOLCMD_PORTADOWN, MOD_TYPE_IT, "e: Portamento down"}, - {VOLCMD_VELOCITY, MOD_TYPE_IT, ":: velocity"}, //rewbs.velocity - {VOLCMD_OFFSET, MOD_TYPE_IT, "o: offset"}, //rewbs.volOff + {VOLCMD_TONEPORTAMENTO, MOD_TYPE_XMITMPT, "g: Tone portamento"}, + {VOLCMD_PORTAUP, MOD_TYPE_ITMPT, "f: Portamento up"}, + {VOLCMD_PORTADOWN, MOD_TYPE_ITMPT, "e: Portamento down"}, + {VOLCMD_VELOCITY, MOD_TYPE_ITMPT, ":: velocity"}, //rewbs.velocity + {VOLCMD_OFFSET, MOD_TYPE_ITMPT, "o: offset"}, //rewbs.volOff }; @@ -3002,6 +3013,7 @@ { case MOD_TYPE_XM: newPath += ".xm"; break; case MOD_TYPE_IT: m_SndFile.m_dwSongFlags & SONG_ITPROJECT ? newPath+=".itp" : newPath+=".it"; break; + case MOD_TYPE_MPT: newPath += ".mptm"; break; case MOD_TYPE_S3M: newPath += ".s3m"; break; case MOD_TYPE_MOD: newPath += ".mod"; break; default: ASSERT(false); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -34,6 +34,12 @@ return TRUE; } + if(m_SndFile.m_nType == MOD_TYPE_MPT) + { + if(::MessageBox(NULL, "Convertion from MPT to any other modtype makes certain features unavailable and is not assured to work properly; Do the convertion anyway? If yes, backupping the mod might be a good idea", + "Notice", MB_YESNO) != IDYES) + return FALSE; + } // Check if conversion to 64 rows is necessary for (UINT ipat=0; ipat<MAX_PATTERNS; ipat++) @@ -105,10 +111,10 @@ m_SndFile.m_nInstruments = 0; END_CRITICAL(); EndWaitCursor(); - } + } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) BeginWaitCursor(); // Adjust pattern data - if ((m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && (nNewType & (MOD_TYPE_S3M|MOD_TYPE_IT))) + if ((m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && (nNewType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) { for (UINT nPat=0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPat]) { @@ -164,7 +170,7 @@ } } } else - if ((m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_XM))) + if ((m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_XM))) { for (UINT nPat=0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPat]) { @@ -243,7 +249,7 @@ if ((m_SndFile.m_nType == MOD_TYPE_MOD) && (nNewType == MOD_TYPE_XM)) { } else - // Convert XM to S3M/IT + // Convert XM to S3M/IT/MPT if ((m_SndFile.m_nType == MOD_TYPE_XM) && (nNewType != MOD_TYPE_XM)) { for (UINT i=1; i<=m_SndFile.m_nSamples; i++) @@ -252,9 +258,9 @@ m_SndFile.Ins[i].RelativeTone = 0; m_SndFile.Ins[i].nFineTune = 0; } - if (nNewType & MOD_TYPE_IT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE; + if (nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE; } else - // Convert S3M/IT to XM + // Convert S3M/IT/MPT to XM if ((m_SndFile.m_nType != MOD_TYPE_XM) && (nNewType == MOD_TYPE_XM)) { for (UINT i=1; i<=m_SndFile.m_nSamples; i++) @@ -290,12 +296,12 @@ } BEGIN_CRITICAL(); m_SndFile.m_nType = nNewType; - if ((!(nNewType & (MOD_TYPE_IT|MOD_TYPE_XM))) && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) + if ((!(nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_XM))) && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) { AddToLog("WARNING: Linear Frequency Slides not supported by the new format.\n"); m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES; } - if (nNewType != MOD_TYPE_IT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATMODE); + if (!(nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT))) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATMODE); if (nNewType != MOD_TYPE_S3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES; END_CRITICAL(); ChangeFileExtension(nNewType); @@ -326,7 +332,7 @@ //------------------------------------------------ { int maxChans; - if (m_SndFile.m_nType&MOD_TYPE_IT) { + if (m_SndFile.m_nType&(MOD_TYPE_IT|MOD_TYPE_MPT)) { maxChans=max_chans_IT; } else if (m_SndFile.m_nType&MOD_TYPE_XM) { maxChans=max_chans_XM; @@ -799,7 +805,7 @@ } } EndWaitCursor(); - if (nExt && !((m_SndFile.m_nType==MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT))) + if (nExt && !(m_SndFile.m_nType & MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT)) { //We don't remove an instrument's unused samples in an ITP. wsprintf(s, "OpenMPT detected %d sample(s) referenced by an instrument,\n" "but not used in the song. Do you want to remove them ?", nExt); @@ -952,7 +958,7 @@ if (!m_SndFile.m_nInstruments) return FALSE; char removeSamples = -1; - if ( !((m_SndFile.m_nType==MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT))) { //never remove an instrument's samples in ITP. + if ( !((m_SndFile.m_nType & MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT))) { //never remove an instrument's samples in ITP. if(::MessageBox(NULL, "Remove samples associated with an instrument if they are unused?", "Removing instrument", MB_YESNO | MB_ICONQUESTION) == IDYES) { removeSamples = 1; } @@ -1215,7 +1221,7 @@ //----------------------------------------------------------- { INSTRUMENTHEADER *pDup = NULL; - if ((m_SndFile.m_nType != MOD_TYPE_XM) && (m_SndFile.m_nType != MOD_TYPE_IT)) return -1; + if ((m_SndFile.m_nType != MOD_TYPE_XM) && !(m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) return -1; if ((lDuplicate > 0) && (lDuplicate <= (LONG)m_SndFile.m_nInstruments)) { pDup = m_SndFile.Headers[lDuplicate]; @@ -1329,6 +1335,7 @@ penv->Keyboard[n] = nsample; penv->NoteMap[n] = n+1; } + penv->pTuning = penv->s_DefaultTuning; } @@ -1582,6 +1589,7 @@ 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); @@ -1654,7 +1662,7 @@ { if (m->command) { - if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) p[9] = gszS3mCommands[m->command]; else p[9] = gszModCommands[m->command]; @@ -1722,7 +1730,8 @@ if (!c) goto PasteDone; if ((c == 0x0D) && (len > 3)) { - if ((p[len-3] == 'I') || (p[len-4] == 'S')) bS3M = TRUE; + //if ((p[len-3] == 'I') || (p[len-4] == 'S')) bS3M = TRUE; + if ((p[len-3] == 'I') || (p[len-4] == 'S') || (p[len-4] == 'M')) bS3M = TRUE; break; } } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -527,6 +527,7 @@ // -> DESC="IT project files (.itp)" ON_COMMAND(ID_NEW_ITPROJECT,OnFileNewITProject) // -! NEW_FEATURE#0023 + ON_COMMAND(ID_NEW_MPT, OnFileNewMPT) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_HELP_INDEX, CWinApp::OnHelpIndex) @@ -953,10 +954,20 @@ if (m_pModTemplate) m_pModTemplate->OpenDocumentFile(NULL); } +void CTrackApp::OnFileNewMPT() +//--------------------------- +{ + SetAsProject(FALSE); + SetDefaultDocType(MOD_TYPE_MPT); + if (m_pModTemplate) m_pModTemplate->OpenDocumentFile(NULL); +} + + // -> CODE#0023 // -> DESC="IT project files (.itp)" void CTrackApp::OnFileNewITProject() +//---------------------------------- { SetAsProject(TRUE); SetDefaultDocType(MOD_TYPE_IT); @@ -986,6 +997,7 @@ // -> DESC="IT project files (.itp)" "Impulse Tracker Projects (*.itp)|*.itp;*.itpz|" // -! NEW_FEATURE#0023 + "Open MPT Modules (*.mptm)|*.mptm;*.mptmz|" "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2|" "Wave Files (*.wav)|*.wav|" "Midi Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|" Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h 2006-08-20 21:39:55 UTC (rev 167) @@ -218,6 +218,7 @@ afx_msg void OnFileNewS3M(); afx_msg void OnFileNewXM(); afx_msg void OnFileNewIT(); + afx_msg void OnFileNewMPT(); // -> CODE#0023 // -> DESC="IT project files (.itp)" afx_msg void OnFileNewITProject(); Added: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -0,0 +1,675 @@ +// TuningDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "mptrack.h" +#include "TuningDialog.h" +#include ".\tuningdialog.h" + +const string CTuningDialog::s_stringTypeGEN = "General"; +const string CTuningDialog::s_stringTypeRP = "Ratio periodic"; +const string CTuningDialog::s_stringTypeTET = "TET"; + +/* +TODOS: +-Clear tuning(when copying existing tuning, it might have + e.g. unwanted note names which should able to be removed. +-Show note name and ratio value also in the set-editboxes + (->clear note names) +*/ + + +// CTuningDialog dialog + +IMPLEMENT_DYNAMIC(CTuningDialog, CDialog) +CTuningDialog::CTuningDialog(CWnd* pParent, const TUNINGVECTOR& rVec, CTuning* pTun) + : CDialog(CTuningDialog::IDD, pParent), + m_TuningCollections(rVec), + m_pTempTuning(0), + m_pTempTuningCol(0), + m_NoteEditApply(true), + m_RatioEditApply(true) +//---------------------------------------- +{ + m_RatioMapWnd.m_pTuning = pTun; //pTun is the tuning to show when dialog opens. + + //Requiring that there is always at least one tuning collection. + if(m_TuningCollections.size() == 0) + { + m_pTempTuningCol = new CTuningCollection("Tuning dialog temp"); + m_TuningCollections.push_back(m_pTempTuningCol); + } + +} + +CTuningDialog::~CTuningDialog() +//---------------------------- +{ + delete m_pTempTuning; + delete m_pTempTuningCol; +} + +BOOL CTuningDialog::OnInitDialog() +//-------------------------------- +{ + CDialog::OnInitDialog(); + + //CWnd::EnableToolTips(true); + //Todo: Tooltips. + + m_RatioMapWnd.Init(this, 0); + + //Adding tuning collection names to the combobox. + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + m_CombobTuningCollection.AddString(m_TuningCollections[i]->GetName().c_str()); + } + + //Adding tuning type names to corresponding combobox + m_CombobTuningType.AddString(s_stringTypeGEN.c_str()); + m_CombobTuningType.AddString(s_stringTypeRP.c_str()); + m_CombobTuningType.AddString(s_stringTypeTET.c_str()); + + m_ButtonSet.EnableWindow(FALSE); + + SetView(m_RatioMapWnd.m_pTuning); + + return TRUE; +} + +void CTuningDialog::SetView(const CTuning* pTun) +//-------------------------------------------- +{ + if(!m_TuningCollections[0]) {ASSERT(false); return;} + if(m_TuningCollections[0]->GetNumTunings() == 0) + { + ASSERT(false); + return; + } + + if(!pTun) pTun = &m_TuningCollections[0]->GetTuning(0); + + //Finding out where given tuning belongs to. + size_t curTCol = 0, curT = 0; //cur <-> Current, T <-> Tuning, Col <-> Collection. + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + CTuningCollection& rCurTCol = *m_TuningCollections.at(i); + for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + { + if(pTun == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) + { + curTCol = i; + curT = j; + break; + } + } + } + + m_CombobTuningCollection.SetCurSel(curTCol); + OnCbnSelchangeComboTcol(); + m_CombobTuningName.SetCurSel(curT); + OnCbnSelchangeComboT(); +} + + +void CTuningDialog::DoDataExchange(CDataExchange* pDX) +//----------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_STATICRATIOMAP, m_RatioMapWnd); + DDX_Control(pDX, IDC_COMBO_TCOL, m_CombobTuningCollection); + DDX_Control(pDX, IDC_COMBO_T, m_CombobTuningName); + DDX_Control(pDX, IDC_COMBO_TTYPE, m_CombobTuningType); + DDX_Control(pDX, IDC_EDIT_TABLESIZE, m_EditTableSize); + DDX_Control(pDX, IDC_EDIT_BEGINNOTE, m_EditBeginNote); + DDX_Control(pDX, IDC_EDIT_STEPS, m_EditSteps); + DDX_Control(pDX, IDC_EDIT_RATIOPERIOD, m_EditRatioPeriod); + DDX_Control(pDX, IDC_CHECK_NEWTUNING, m_CheckNewTuning); + DDX_Control(pDX, IDC_ADD_TUNING, m_ButtonAddTuning); + DDX_Control(pDX, IDC_REMOVE_TUNING, m_ButtonRemoveTuning); + DDX_Control(pDX, IDC_EDIT_RATIOVALUE, m_EditRatio); + DDX_Control(pDX, IDC_EDIT_NOTENAME, m_EditNotename); + DDX_Control(pDX, IDC_BUTTON_SETVALUES, m_ButtonSet); +} + + +BEGIN_MESSAGE_MAP(CTuningDialog, CDialog) + ON_CBN_SELCHANGE(IDC_COMBO_TCOL, OnCbnSelchangeComboTcol) + ON_CBN_SELCHANGE(IDC_COMBO_T, OnCbnSelchangeComboT) + ON_BN_CLICKED(IDC_CHECK_NEWTUNING, OnBnClickedCheckNewtuning) + ON_CBN_SELCHANGE(IDC_COMBO_TTYPE, OnCbnSelchangeComboTtype) + ON_EN_CHANGE(IDC_EDIT_STEPS, OnEnChangeEditSteps) + ON_EN_CHANGE(IDC_EDIT_RATIOPERIOD, OnEnChangeEditRatioperiod) + ON_BN_CLICKED(IDC_ADD_TUNING, OnBnClickedAddTuning) + ON_BN_CLICKED(IDC_REMOVE_TUNING, OnBnClickedRemoveTuning) + ON_CBN_EDITCHANGE(IDC_COMBO_T, OnCbnEditchangeComboT) + ON_EN_CHANGE(IDC_EDIT_NOTENAME, OnEnChangeEditNotename) + ON_BN_CLICKED(IDC_BUTTON_SETVALUES, OnBnClickedButtonSetvalues) + ON_EN_CHANGE(IDC_EDIT_RATIOVALUE, OnEnChangeEditRatiovalue) +END_MESSAGE_MAP() + + +// CTuningDialog message handlers + +void CTuningDialog::OnCbnSelchangeComboTcol() +//------------------------------------------- +{ + const int curTCol = m_CombobTuningCollection.GetCurSel(); + const int curT = m_CombobTuningName.GetCurSel(); + if(curTCol < 0 || curTCol >= static_cast<int>(m_TuningCollections.size())) return; + + //Checking whether collection allows removing + if(m_TuningCollections[curTCol]->CanEdit(CTuningCollection::EM_REMOVE)) + m_ButtonRemoveTuning.EnableWindow(true); + else + m_ButtonRemoveTuning.EnableWindow(false); + + if(IsDlgButtonChecked(IDC_CHECK_NEWTUNING)) + { + //Checking whether tuning collection allows adding + //tunings... + if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_ADD)) + m_ButtonAddTuning.EnableWindow(); + else + m_ButtonAddTuning.EnableWindow(false); + + return; + } + + //Clearing existing items from name-combobox... + while(m_CombobTuningName.GetCount() > 0) + m_CombobTuningName.DeleteString(0); + + //...checking does the tuning collection have any + //tunings in it... + if(m_TuningCollections[curTCol]->GetNumTunings() == 0) + { + m_CombobTuningName.AddString("No tunings"); + m_CombobTuningName.SetCurSel(0); + m_RatioMapWnd.m_pTuning = 0; + //Hiding ratiomap window in this case. + m_RatioMapWnd.ShowWindow(SW_HIDE); + UpdateTuningType(0); + return; + } + + //...adding names of tunings in the current tuning collection... + CTuningCollection& rTCol = *m_TuningCollections.at(curTCol); + for(size_t i = 0; i<rTCol.GetNumTunings(); i++) + { + m_CombobTuningName.AddString(rTCol.GetTuning(static_cast<unsigned short>(i)).GetName().c_str()); + } + + //...checking can previous tuning item be used... + if(curT < 0 || curT >= m_CombobTuningName.GetCount()) + m_CombobTuningName.SetCurSel(0); + else + m_CombobTuningName.SetCurSel(curT); + + OnCbnSelchangeComboT(); +} + +void CTuningDialog::OnCbnSelchangeComboT() +//---------------------------------------- +{ + //Checking that there is valid Tuning collection index... + const int TCol = m_CombobTuningCollection.GetCurSel(); + if(TCol < 0 || TCol >= static_cast<int>(m_TuningCollections.size())) return; + + CTuningCollection& rTCol = *m_TuningCollections.at(TCol); + + //...checking that tuning index is valid... + const unsigned short T = static_cast<unsigned short>(m_CombobTuningName.GetCurSel()); + if(T < 0 || T >= rTCol.GetNumTunings()) + return; + + //...updating tuning type-combob... + UpdateTuningType(&rTCol.GetTuning(T)); + + //...and making sure that ratiomap window is showing and + //updating its content. + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_RatioMapWnd.m_pTuning = &rTCol.GetTuning(T); + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); +} + +void CTuningDialog::UpdateTuningType(const CTuning* pT) +//----------------------------------------------------- +{ + if(pT) + { + ASSERT(m_CombobTuningType.GetCount() > 0); + if(pT->GetTuningType() == CTuning::TT_TET) + m_CombobTuningType.SetCurSel(2); + else + //if(pT->GetPeriod()) + if(pT->GetTuningType() == CTuning::TT_RATIOPERIODIC) + m_CombobTuningType.SetCurSel(1); + else + m_CombobTuningType.SetCurSel(0); + + + //Updating ratioperiod and steps in ratio fields... + CTuning::RATIOTYPE rp = pT->GetPeriodRatio(); + CTuning::STEPTYPE period = pT->GetPeriod(); + if(period) + { + m_EditSteps.EnableWindow(); + m_EditSteps.SetWindowText(Stringify(period).c_str()); + + m_EditRatioPeriod.EnableWindow(); + m_EditRatioPeriod.SetWindowText(Stringify(rp).c_str()); + } + else + { + if(!IsDlgButtonChecked(IDC_CHECK_NEWTUNING)) + { + m_EditSteps.EnableWindow(false); + m_EditRatioPeriod.EnableWindow(false); + } + } + } + m_CombobTuningType.Invalidate(); + m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); + +} + +void CTuningDialog::OnBnClickedCheckNewtuning() +//--------------------------------------------- +{ + + if(IsDlgButtonChecked(IDC_CHECK_NEWTUNING)) + { + //Bug? + if(m_pTempTuning != NULL) + { + MessageBox("Bug: m_pTempTuning != NULL in CTuningDialog::OnBnClickedCheckNewtuning()", 0); + delete m_pTempTuning; m_pTempTuning = NULL; + m_RatioMapWnd.m_pTuning = NULL; + return; + } + + m_ButtonSet.EnableWindow(); + m_ButtonRemoveTuning.ShowWindow(SW_HIDE); + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_ButtonAddTuning.ShowWindow(SW_SHOW); + + const size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); + if(TCol >= 0 && TCol < m_TuningCollections.size()) + if(m_TuningCollections[TCol]->CanEdit(CTuningCollection::EM_ADD)) + m_ButtonAddTuning.EnableWindow(); + else + m_ButtonAddTuning.EnableWindow(FALSE); + + //Deleting tuning names from combob. + while(m_CombobTuningName.GetCount() > 0) + m_CombobTuningName.DeleteString(0); + //Invalidating later. + + + //Creating temporary tuning object and using + //previously shown tuning as 'template'. + m_pTempTuning = new CTuningRTI(m_RatioMapWnd.m_pTuning); + m_RatioMapWnd.m_pTuning = m_pTempTuning; + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_Rati... [truncated message content] |
From: <re...@us...> - 2006-08-20 20:53:41
|
Revision: 166 Author: rewbs Date: 2006-08-20 13:53:27 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=166&view=rev Log Message: ----------- <rewbs> Creating branch for MPT module format and tuning modes. Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/ Copied: branches/OpenMPT_MPTm_Tuning (from rev 165, trunk/OpenMPT) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-20 20:32:51
|
Revision: 165 Author: rewbs Date: 2006-08-20 13:29:31 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=165&view=rev Log Message: ----------- v1.17.02.45 + <Relabsoluness & Alex> "Pitch to tempo lock" instrument setting: define the tempo at which your instrument loops correctly, and it will be pitched automatically to match the song's current tempo. + <Relabsoluness> Notification when attempting to modify pattern but pattern record is off. + <Relabsoluness> Orderlist margins: you can define how many slots to keep visible around the active pattern as the orderlist scrolls . <Relabsoluness> Fixes for various unexpected pattern loop state changes. . <Relabsoluness> Fixes to IT Style clear. . <Relabsoluness> Memory management fixes and misc other bug fixes. . <rewbs> ITP loading fixed (I broke it in v1.17.02.44) . <rewbs> Time estimation fixed for tracks with pattern break+XParam. . <rewbs> "Last saved with" version number was not always saved correctly - fixed Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/fxp.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/Tables.cpp trunk/OpenMPT/unlha/Unlha.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -186,13 +186,13 @@ if (p[0]) m_pSndFile->m_lpszSongComments = p; else - delete p; + delete[] p; if (oldcomments) { BOOL bSame = FALSE; if ((m_pSndFile->m_lpszSongComments) && (!strcmp(m_pSndFile->m_lpszSongComments, oldcomments))) bSame = TRUE; - delete oldcomments; + delete[] oldcomments; if (bSame) return; } else { Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -156,7 +156,8 @@ if (dwHint & HINT_MODSEQUENCE) { // Detecting max valid restart position - for (UINT i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; + UINT i = 0; + for (i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; m_SpinRestartPos.SetRange(0, i); } if (dwHint & HINT_MODGENERAL) Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -7,6 +7,11 @@ #include "ctrl_ins.h" #include "view_ins.h" #include "dlg_misc.h" +#include "misc_util.h" +#include <vector> +#include <string> +using std::string; +using std::vector; #pragma warning(disable:4244) @@ -215,7 +220,7 @@ { CWnd::OnSetFocus(pOldWnd); InvalidateRect(NULL, FALSE); - CMainFrame::GetMainFrame()->m_pNoteMapHasFocus= (CWnd*) this; //rewbs.customKeys + CMainFrame::GetMainFrame()->m_pNoteMapHasFocus = (CWnd*) this; //rewbs.customKeys } @@ -644,6 +649,9 @@ ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP + ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) + ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock) + ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock) END_MESSAGE_MAP() void CCtrlInstruments::DoDataExchange(CDataExchange* pDX) @@ -688,6 +696,8 @@ DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack); DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); // -! NEW_FEATURE#0027 + DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); + DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); //}}AFX_DATA_MAP } @@ -805,8 +815,12 @@ m_SpinInstrument.SetFocus(); + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); + //OnBnClickedCheckPitchtempolock(); + m_EditPitchTempoLock.SetLimitText(4); + return FALSE; } @@ -1038,6 +1052,8 @@ m_SliderResonance.EnableWindow(bITonly); m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); + m_EditPitchTempoLock.EnableWindow(bITonly); + m_CheckPitchTempoLock.EnableWindow(bITonly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { @@ -1129,6 +1145,12 @@ if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 + if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); + else + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); + + OnBnClickedCheckPitchtempolock(); } else { m_EditName.SetWindowText(""); @@ -1301,6 +1323,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { + //NOTE: pszText seems to point to char array of length 256. if ((pszText) && (uId)) { switch(uId) @@ -1313,6 +1336,23 @@ return TRUE; } break; + case IDC_EDIT_PITCHTEMPOLOCK: + case IDC_CHECK_PITCHTEMPOLOCK: + if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) + { + const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + ASSERT(str.size() < 256); + wsprintf(pszText, str.c_str()); + return TRUE; + } + break; + case IDC_EDIT7: //Fade out + if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) + { + wsprintf(pszText, "Higher value <-> Faster fade out"); + return TRUE; + } + break; } } return FALSE; @@ -2322,4 +2362,94 @@ return 0; } -//end rewbs.customKeys \ No newline at end of file +//end rewbs.customKeys +void CCtrlInstruments::OnEnChangeEditPitchtempolock() +//---------------------------------------------------- +{ + if(IsLocked() || !m_pModDoc || !m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) return; + + const WORD MINTEMPO = m_pSndFile->GetTempoMin(); + const WORD MAXTEMPO = m_pSndFile->GetTempoMax(); + char buffer[7]; + m_EditPitchTempoLock.GetWindowText(buffer, 6); + int ptlTempo = atoi(buffer); + if(ptlTempo < MINTEMPO) + ptlTempo = MINTEMPO; + if(ptlTempo > MAXTEMPO) + ptlTempo = MAXTEMPO; + + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = ptlTempo; + END_CRITICAL(); + m_pModDoc->SetModified(); +} + +void CCtrlInstruments::OnBnClickedCheckPitchtempolock() +//----------------------------------------------------- +{ + if(!m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) + return; + + if(IsDlgButtonChecked(IDC_CHECK_PITCHTEMPOLOCK)) + { + + INSTRUMENTHEADER* penv = m_pSndFile->Headers[m_nInstrument]; + if(!penv) + return; + + //Checking to what value to put for the wPitchToTempoLock. + m_EditPitchTempoLock.EnableWindow(); + WORD ptl = penv->wPitchToTempoLock; + if(ptl == 0) + { + if(m_EditPitchTempoLock.GetWindowTextLength() > 0) + { + char buffer[7]; + m_EditPitchTempoLock.GetWindowText(buffer, 6); + ptl = atoi(buffer); + } + else + ptl = m_pSndFile->m_nDefaultTempo; + } + m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); + //SetModified() comes with this. + } + else + { + m_EditPitchTempoLock.EnableWindow(FALSE); + if(m_pSndFile && m_nInstrument && m_pSndFile->Headers[m_nInstrument] && + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock > 0) + { + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = 0; + END_CRITICAL(); + m_pModDoc->SetModified(); + } + } +} + +void CCtrlInstruments::OnEnKillfocusEditPitchtempolock() +//------------------------------------------------------ +{ + if(!m_pSndFile || IsLocked()) return; + + char buffer[6]; + m_EditPitchTempoLock.GetWindowText(buffer, 5); + int ptlTempo = atoi(buffer); + bool changed = false; + + + if(ptlTempo < m_pSndFile->GetTempoMin()) + { + ptlTempo = m_pSndFile->GetTempoMin(); + changed = true; + } + if(ptlTempo > m_pSndFile->GetTempoMax()) + { + ptlTempo = m_pSndFile->GetTempoMax(); + changed = true; + + } + + if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str()); +} Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2006-08-20 20:29:31 UTC (rev 165) @@ -78,6 +78,10 @@ CSpinButtonCtrl m_SpinAttack; // -! NEW_FEATURE#0027 + //Pitch/Tempo lock + CEdit m_EditPitchTempoLock; + CButton m_CheckPitchTempoLock; + public: CCtrlInstruments(); virtual ~CCtrlInstruments(); @@ -144,6 +148,9 @@ afx_msg void OnEditSampleMap(); afx_msg void TogglePluginEditor(); //rewbs.instroVSTi afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void OnEnChangeEditPitchtempolock(); + afx_msg void OnBnClickedCheckPitchtempolock(); + afx_msg void OnEnKillfocusEditPitchtempolock(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -64,6 +64,7 @@ ON_COMMAND(IDC_PATINSTROPLUGGUI2, ToggleSplitPluginEditor) //rewbs.instroVST ON_EN_CHANGE(IDC_EDIT_SPACING, OnSpacingChanged) ON_EN_CHANGE(IDC_EDIT_PATTERNNAME, OnPatternNameChanged) + ON_EN_KILLFOCUS(IDC_EDIT_ORDERLIST_MARGINS, OnOrderListMarginsChanged) ON_UPDATE_COMMAND_UI(IDC_PATTERN_RECORD,OnUpdateRecord) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) //}}AFX_MSG_MAP @@ -85,8 +86,10 @@ DDX_Control(pDX, IDC_COMBO_OCTAVEMODIFIER, m_CbnOctaveModifier); DDX_Control(pDX, IDC_COMBO_SPLITVOLUME, m_CbnSplitVolume); DDX_Control(pDX, IDC_EDIT_SPACING, m_EditSpacing); + DDX_Control(pDX, IDC_EDIT_ORDERLIST_MARGINS,m_EditOrderListMargins); DDX_Control(pDX, IDC_EDIT_PATTERNNAME, m_EditPatName); DDX_Control(pDX, IDC_SPIN_SPACING, m_SpinSpacing); + DDX_Control(pDX, IDC_SPIN_ORDERLIST_MARGINS,m_SpinOrderListMargins); DDX_Control(pDX, IDC_SPIN_INSTRUMENT, m_SpinInstrument); DDX_Control(pDX, IDC_TOOLBAR1, m_ToolBar); //}}AFX_DATA_MAP @@ -157,13 +160,18 @@ // Special edit controls -> tab switch to view m_EditSpacing.SetParent(this); m_EditPatName.SetParent(this); + m_EditPatName.SetLimitText(MAX_PATTERNNAME); + m_EditOrderListMargins.SetParent(this); + m_EditOrderListMargins.SetLimitText(3); // Spin controls m_SpinSpacing.SetRange(0, 16); + m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); - m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); - m_EditPatName.SetLimitText(MAX_PATTERNNAME); + m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax()); + m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins()); SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing); + SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins()); CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked m_OrderList.SetFocus(); @@ -240,6 +248,7 @@ { m_OrderList.SetWindowPos(NULL, 0,0, cx, cy, SWP_NOMOVE|SWP_NOZORDER|SWP_DRAWFRAME); } + OnOrderListMarginsChanged(); } } @@ -410,6 +419,7 @@ SendViewMessage(VIEWMSG_PATTERNLOOP, (SONG_PATTERNLOOP & m_pSndFile->m_dwSongFlags)); } OnSpacingChanged(); + OnOrderListMarginsChanged(); //mimicry SendViewMessage(VIEWMSG_SETSPLITINSTRUMENT, m_nSplitInstrument); SendViewMessage(VIEWMSG_SETSPLITNOTE, m_nSplitNote); @@ -580,6 +590,7 @@ if (m_hWndView) { OnSpacingChanged(); + OnOrderListMarginsChanged(); //mimicry... if (m_bRecord) SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); CChildFrame *pFrame = (CChildFrame *)GetParentFrame(); @@ -664,6 +675,24 @@ } +void CCtrlPatterns::OnOrderListMarginsChanged() +//--------------------------------------------- +{ + BYTE i; + BYTE maxOrders = m_OrderList.GetShownOrdersMax(); + if((m_EditOrderListMargins.m_hWnd) && (m_EditOrderListMargins.GetWindowTextLength() > 0)) + { + i = m_OrderList.SetOrderlistMargins(GetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS)); + } + else + { + i = m_OrderList.GetOrderlistMargins(); + } + + m_SpinOrderListMargins.SetRange(0, maxOrders); + SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i); + +} void CCtrlPatterns::OnSpacingChanged() //------------------------------------ { Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2006-08-20 20:29:31 UTC (rev 165) @@ -12,6 +12,11 @@ HFONT m_hFont; COLORREF colorText, colorTextSel; int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos; + //m_nXScroll : The order at the beginning of shown orderlist? + //m_nScrollPos: The same as order? + BYTE m_nOrderlistMargins; + //To tell how many orders('orderboxes') to show at least + //on both sides of current order(when updating orderslist position). UINT m_nDragOrder; BOOL m_bScrolling, m_bDragging, m_bShift; CModDoc *m_pModDoc; @@ -32,6 +37,9 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); + BYTE SetOrderlistMargins(int); //Returns the number that was set. + BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;} + BYTE GetShownOrdersMax(); //Should return the maximum number of shown orders. public: //{{AFX_VIRTUAL(COrderList) @@ -98,8 +106,8 @@ // -> DESC="midi keyboard split" CComboBox m_CbnSplitInstrument,m_CbnSplitNote,m_CbnOctaveModifier,m_CbnSplitVolume; // -! NEW_FEATURE#0012 - CPatEdit m_EditSpacing, m_EditPatName; - CSpinButtonCtrl m_SpinInstrument, m_SpinSpacing; + CPatEdit m_EditSpacing, m_EditPatName, m_EditOrderListMargins; + CSpinButtonCtrl m_SpinInstrument, m_SpinSpacing, m_SpinOrderListMargins; CModControlBar m_ToolBar; UINT m_nInstrument, m_nDetailLevel; BOOL m_bRecord, m_bVUMeters, m_bPluginNames; @@ -171,6 +179,7 @@ afx_msg void OnNextInstrument(); afx_msg void OnSpacingChanged(); afx_msg void OnPatternNameChanged(); + afx_msg void OnOrderListMarginsChanged(); afx_msg void OnSetupZxxMacros(); afx_msg void OnChordEditor(); afx_msg void OnDetailLo(); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -67,7 +67,8 @@ m_pParent = NULL; m_cxFont = m_cyFont = 0; m_pModDoc = NULL; - m_nScrollPos = m_nXScroll = 0; + m_nScrollPos = m_nXScroll = 0; + m_nOrderlistMargins = 2; m_bScrolling = FALSE; m_bDragging = FALSE; m_bShift = FALSE; @@ -151,6 +152,16 @@ } +BYTE COrderList::GetShownOrdersMax() +//---------------------------------- +{ + CRect rcClient; + GetClientRect(&rcClient); + if(m_cxFont>0) return static_cast<BYTE>(rcClient.right / m_cxFont); + else return static_cast<BYTE>(rcClient.right / GetFontWidth()); +} + + BOOL COrderList::SetCurSel(int sel, BOOL bEdit) //--------------------------------------------- { @@ -164,18 +175,18 @@ m_nScrollPos = sel; if (!m_bScrolling) { - if ((m_nScrollPos < m_nXScroll) || (!m_cxFont) || (!m_cyFont)) + if ((m_nScrollPos < m_nXScroll+m_nOrderlistMargins) || (!m_cxFont) || (!m_cyFont)) { - m_nXScroll = m_nScrollPos; + m_nXScroll = max(0, m_nScrollPos - m_nOrderlistMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } else { - int maxsel = (rcClient.right / m_cxFont); + int maxsel = GetShownOrdersMax(); if (maxsel) maxsel--; - if (m_nScrollPos - m_nXScroll >= maxsel) + if (m_nScrollPos - m_nXScroll >= maxsel-m_nOrderlistMargins) { - m_nXScroll = m_nScrollPos - maxsel; + m_nXScroll = m_nScrollPos - (maxsel-m_nOrderlistMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } @@ -243,7 +254,8 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - for (int i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; + int i = 0; + for (i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; SetCurSel(i); } break; @@ -434,6 +446,7 @@ GetClientRect(&rcClient); rect = rcClient; int nIndex = m_nXScroll; + //Scrolling the shown orders(the showns rectangles)? while (rect.left < rcClient.right) { BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE; @@ -859,3 +872,24 @@ } return bCanDrop; } + + +BYTE COrderList::SetOrderlistMargins(int i) +//---------------------------------------------- +{ + const BYTE maxOrders = GetShownOrdersMax(); + const BYTE maxMargins = (maxOrders % 2 == 0) ? maxOrders/2 - 1 : maxOrders/2; + //For example: If maximum is 4 orders -> maxMargins = 4/2 - 1 = 1; + //if maximum is 5 -> maxMargins = (int)5/2 = 2 + + if(i >= 0 && i < maxMargins) + { + m_nOrderlistMargins = static_cast<BYTE>(i); + } + else + { + if(i<0) m_nOrderlistMargins = 0; + else m_nOrderlistMargins = maxMargins; + } + return m_nOrderlistMargins; +} Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -194,7 +194,7 @@ } -POINT CViewPattern::GetPointFromPosition(DWORD dwPos) +POINT CViewPattern::GetPointFromPosition(DWORD dwPos) //--------------------------------------------------- { PCPATTERNFONT pfnt = GetCurrentPatternFont(); @@ -231,7 +231,8 @@ int xx = (pt.x - m_szHeader.cx) % GetColumnWidth(), dx = 0; int imax = 4; if (imax > (int)m_nDetailLevel+1) imax = m_nDetailLevel+1; - for (int i=0; i<imax; i++) + int i = 0; + for (i=0; i<imax; i++) { dx += pfnt->nEltWidths[i]; if (xx < dx) break; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -279,6 +279,12 @@ _getdcwd(_getdrive(), wd, 255); m_csExecutablePath = wd; //Assume working dir is executable path at this stage. + //Relabs.note: m_csExecutablePath doesn't give right path + //at least for debug builds. + #ifdef DEBUG + m_csExecutablePath += "\\bin"; + #endif + m_bModTreeHasFocus = false; //rewbs.customKeys m_pNoteMapHasFocus = NULL; //rewbs.customKeys m_bOptionsLocked = false; //rewbs.customKeys @@ -1607,18 +1613,18 @@ UINT uVerLength; if (!(::GetFileVersionInfo((LPTSTR)szFullPath, (DWORD)dwVerHnd, (DWORD)dwVerInfoSize, (LPVOID)pVersionInfo))) { - delete pVersionInfo; + delete[] pVersionInfo; return 0; } if (!(::VerQueryValue(pVersionInfo, TEXT("\\StringFileInfo\\040904b0\\FileVersion"), (LPVOID*)&szVer, &uVerLength))) { - delete pVersionInfo; + delete[] pVersionInfo; return 0; } //version will be like: 1, 17, 2, 38 CString version = szVer; - delete pVersionInfo; + delete[] pVersionInfo; int v1, v2, v3, v4; sscanf(version, "%x, %x, %x, %x", &v1, &v2, &v3, &v4); @@ -1873,7 +1879,9 @@ } if (m_pSndFile) { - m_pSndFile->LoopPattern(-1); + //m_pSndFile->LoopPattern(-1); + //Relabs.note: Commented above line - why loop should be disabled when pausing? + m_pSndFile->m_dwSongFlags &= ~SONG_PAUSED; if (m_pSndFile == &m_WaveFile) { m_pSndFile = NULL; Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -1069,7 +1069,7 @@ fwrite(&zero, 1, 1, f); list.filesize++; } - delete pszComments; + delete[] pszComments; } } for (UINT iCmt=0; iCmt<=6; iCmt++) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -107,7 +107,6 @@ // -> DESC="channels management dlg" ReinitRecordState(); // -! NEW_FEATURE#0015 - } @@ -132,6 +131,7 @@ //--------------------------- { if (!CDocument::OnNewDocument()) return FALSE; + m_SndFile.Create(NULL, this, 0); m_SndFile.m_nType = CTrackApp::GetDefaultDocType(); @@ -349,6 +349,13 @@ // -> DESC="channels management dlg" ReinitRecordState(); // -! NEW_FEATURE#0015 + if (m_SndFile.m_dwLastSavedWithVersion>CMainFrame::GetFullVersionNumeric()) { + char s[256]; + wsprintf(s, "Warning: this song was last saved with a more recent version of OpenMPT.\r\nSong saved with: v%s. Current version: v%s.\r\n", + CMainFrame::GetVersionString(m_SndFile.m_dwLastSavedWithVersion), + CMainFrame::GetFullVersionString()); + ::AfxMessageBox(s); + } SetModifiedFlag(FALSE); // (bModified); m_bHasValidPath=true; @@ -364,7 +371,7 @@ CHAR fext[_MAX_EXT]=""; UINT nType = m_SndFile.m_nType, dwPacking = 0; BOOL bOk = FALSE; - + m_SndFile.m_dwLastSavedWithVersion=CMainFrame::GetFullVersionNumeric(); if (!lpszPathName) return FALSE; _splitpath(lpszPathName, NULL, NULL, NULL, fext); if (!lstrcmpi(fext, ".mod")) nType = MOD_TYPE_MOD; else @@ -558,7 +565,6 @@ { SetModified(FALSE); m_bHasValidPath=true; - m_SndFile.m_dwLastSavedWithVersion=CMainFrame::GetFullVersionNumeric(); return TRUE; } else { @@ -693,7 +699,7 @@ { strcpy(p, m_lpszLog); strcat(p, lpszLog); - delete m_lpszLog; + delete[] m_lpszLog; m_lpszLog = p; } } else @@ -710,7 +716,7 @@ { if (m_lpszLog) { - delete m_lpszLog; + delete[] m_lpszLog; m_lpszLog = NULL; } return TRUE; @@ -1406,6 +1412,9 @@ if(!wsdlg.m_bChannelMode || !(flags[i] & CHN_MUTE)){ // rewbs.fix3239 m_SndFile.SetCurrentPos(0); + //Relabs.note: Since I removed pattern loop disabling from certain + //methods, making sure that pattern loop is off. + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; if (wsdlg.m_bSelectPlay) { m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder); m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder; @@ -1477,6 +1486,9 @@ bplaying = TRUE; pMainFrm->PauseMod(); m_SndFile.SetCurrentPos(0); + + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; + // Saving file PTAGID3INFO pTag = (wsdlg.m_bSaveInfoField) ? &wsdlg.m_id3tag : NULL; CDoAcmConvert dwcdlg(&m_SndFile, s, &wfx.wfx, hadid, pTag, pMainFrm); @@ -1580,9 +1592,9 @@ if (pMainFrm) { CChildFrame *pChildFrm = (CChildFrame *) GetChildFrame(); - if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) == 0) // Relabsoluness.note: Using existing 'dirty HACK' + if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) == 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern checkbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -1604,7 +1616,9 @@ m_SndFile.ResumePlugins(); } END_CRITICAL(); - m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED); + //m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED); + //Relabs.note: Added SONG_PATTERNLOOP. + m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED|SONG_PATTERNLOOP); pMainFrm->PlayMod(this, m_hWndFollow, m_dwNotifyType); } } @@ -1679,7 +1693,9 @@ pMainFrm->PauseMod(); - m_SndFile.m_dwSongFlags &= ~SONG_STEP; + //m_SndFile.m_dwSongFlags &= ~SONG_STEP; + //Relabs.hack: Added SONG_PATTERNLOOP + m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PATTERNLOOP); m_SndFile.SetCurrentPos(0); pMainFrm->ResetElapsedTime(); BEGIN_CRITICAL(); @@ -2061,7 +2077,8 @@ BOOL bSupported; int fxndx = -1; pszDescription[0] = 0; - for (UINT i=0; i<MAX_FXINFO; i++) + UINT i = 0; + for (i=0; i<MAX_FXINFO; i++) { if ((command == gFXInfo[i].dwEffect) // Effect && ((param & gFXInfo[i].dwParamMask) == gFXInfo[i].dwParamValue)) // Value @@ -2837,6 +2854,8 @@ { pSndFile->Chn[i].dwFlags |= CHN_NOTEFADE | CHN_KEYOFF; } + if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] == nPat)) pSndFile->m_nCurrentPattern = pSndFile->m_nNextPattern = nOrd; + //Relabs.note: Some jumps occured when using pattern play and loop pattern checkbox - above line hopefully fixes it. pSndFile->m_dwSongFlags &= ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow = nRow; @@ -3041,7 +3060,8 @@ if (macroType==sfx_plug && MacroToPlugParam(macroText)==paramToUse) { CString message; message.Format("Param %d can already be controlled with macro %X", paramToUse, checkMacro); - ::MessageBox(NULL,message, "Macro exists for this param",MB_ICONINFORMATION | MB_OK); + CMainFrame::GetMainFrame()->MessageBox(message, "Macro exists for this param",MB_ICONINFORMATION | MB_OK); + //Relabs.expl: Modified to prevent notification box go 'under' ompt to block key messages. return; } } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -56,7 +56,8 @@ } // Resizing all patterns to 64 rows UINT nPatCvt = 0; - for (UINT i=0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) + UINT i = 0; + for (i=0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) { if (m_SndFile.PatternSize[i] < 64) { @@ -424,7 +425,8 @@ { UINT nRemainingChannels = 0; //First calculating how many channels are to be left - for(UINT i = 0; i<m_SndFile.m_nChannels; i++) + UINT i = 0; + for(i = 0; i<m_SndFile.m_nChannels; i++) { if(!m_bChnMask[i]) nRemainingChannels++; } @@ -439,7 +441,7 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - for (UINT i=0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (i=0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) { MODCOMMAND *p = m_SndFile.Patterns[i]; MODCOMMAND *newp = CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], nRemainingChannels); @@ -623,7 +625,8 @@ memset(pPatterns, 0, sizeof(pPatterns)); for (UINT irst=0; irst<MAX_PATTERNS; irst++) nPatMap[irst] = 0xFFFF; nPats = 0; - for (UINT imap=0; imap<MAX_ORDERS; imap++) + UINT imap = 0; + for (imap=0; imap<MAX_ORDERS; imap++) { UINT n = m_SndFile.Order[imap]; if (n < MAX_PATTERNS) @@ -1131,7 +1134,8 @@ //------------------------------------------------ { UINT maxpat = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 128 : MAX_PATTERNS; - for (UINT i=0; i<maxpat; i++) + UINT i = 0; + for (i=0; i<maxpat; i++) { if (!m_SndFile.Patterns[i]) break; } @@ -1172,7 +1176,8 @@ LONG CModDoc::InsertSample(BOOL bLimit) //------------------------------------- { - for (UINT i=1; i<=m_SndFile.m_nSamples; i++) + UINT i = 1; + for (i=1; i<=m_SndFile.m_nSamples; i++) { if ((!m_SndFile.m_szNames[i][0]) && (m_SndFile.Ins[i].pSample == NULL)) { @@ -2071,7 +2076,7 @@ { for (UINT i=0; i<MAX_UNDO_LEVEL; i++) { - if (PatternUndo[i].pbuffer) delete PatternUndo[i].pbuffer; + if (PatternUndo[i].pbuffer) delete[] PatternUndo[i].pbuffer; PatternUndo[i].cx = 0; PatternUndo[i].cy = 0; PatternUndo[i].pbuffer = NULL; @@ -2110,7 +2115,7 @@ bUpdate = (PatternUndo[0].pbuffer) ? FALSE : TRUE; if (PatternUndo[MAX_UNDO_LEVEL-1].pbuffer) { - delete PatternUndo[MAX_UNDO_LEVEL-1].pbuffer; + delete[] PatternUndo[MAX_UNDO_LEVEL-1].pbuffer; PatternUndo[MAX_UNDO_LEVEL-1].pbuffer = NULL; } for (UINT i=MAX_UNDO_LEVEL-1; i>=1; i--) @@ -2172,7 +2177,7 @@ pUndo += PatternUndo[0].cx; } } - delete PatternUndo[0].pbuffer; + delete[] PatternUndo[0].pbuffer; for (UINT i=0; i<MAX_UNDO_LEVEL-1; i++) { PatternUndo[i] = PatternUndo[i+1]; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -1158,12 +1158,12 @@ } if (m_lpRotoZoom) { - delete m_lpRotoZoom; + delete[] m_lpRotoZoom; m_lpRotoZoom = NULL; } if (m_lpCopy) { - delete m_lpCopy; + delete[] m_lpCopy; m_lpCopy = NULL; } } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -457,7 +457,8 @@ UINT nParams = pVstPlugin->GetNumParameters(); m_CbnParam.SetRedraw(FALSE); m_CbnParam.ResetContent(); - for (UINT i=0; i<nParams; i++) + UINT i = 0; + for (i=0; i<nParams; i++) { pVstPlugin->GetParamName(i, sname, sizeof(sname)); wsprintf(s, "%02X: %s", i|0x80, sname); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -2243,7 +2243,8 @@ penv->VolEnv[0] = 64; penv->nVolEnv = 1; } - for (UINT i=0; i<penv->nVolEnv; i++) if (nTick <= penv->VolPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nVolEnv; i++) if (nTick <= penv->VolPoints[i]) break; for (UINT j=penv->nVolEnv; j>i; j--) { penv->VolPoints[j] = penv->VolPoints[j-1]; @@ -2269,7 +2270,8 @@ penv->PanEnv[0] = 32; penv->nPanEnv = 1; } - for (UINT i=0; i<penv->nPanEnv; i++) if (nTick <= penv->PanPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nPanEnv; i++) if (nTick <= penv->PanPoints[i]) break; for (UINT j=penv->nPanEnv; j>i; j--) { penv->PanPoints[j] = penv->PanPoints[j-1]; @@ -2295,7 +2297,8 @@ penv->PitchEnv[0] = 32; penv->nPitchEnv = 1; } - for (UINT i=0; i<penv->nPitchEnv; i++) if (nTick <= penv->PitchPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nPitchEnv; i++) if (nTick <= penv->PitchPoints[i]) break; for (UINT j=penv->nPitchEnv; j>i; j--) { penv->PitchPoints[j] = penv->PitchPoints[j-1]; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -10,7 +10,7 @@ #include "dlsbank.h" #include "EffectVis.h" //rewbs.fxvis #include "OpenGLEditor.h" //rewbs.fxvis -#include "PatternGotoDialog.h" +#include "PatternGotoDialog.h" #include "PatternRandomizer.h" #include ".\arrayutils.h" #include ".\view_pat.h" @@ -63,7 +63,7 @@ // -> DESC="midi keyboard split" ON_COMMAND(ID_EDIT_SPLITRECSELECT, OnSplitRecordSelect) // -! NEW_FEATURE#0012 - ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) + ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick) @@ -187,6 +187,8 @@ pSndFile->PatternSize[npat] = 64; pSndFile->Patterns[npat] = CSoundFile::AllocatePattern(64, pSndFile->m_nChannels); } + + bUpdateScroll = FALSE; m_nPattern = npat; if ((nrow >= 0) && (nrow != (int)m_nRow) && (nrow < (int)pSndFile->PatternSize[m_nPattern])) @@ -200,12 +202,12 @@ UpdateSizes(); UpdateScrollSize(); UpdateIndicator(); - + if (m_bWholePatternFitsOnScreen) //rewbs.scrollFix SetScrollPos(SB_VERT, 0); else if (bUpdateScroll) //rewbs.fix3147 SetScrollPos(SB_VERT, m_nRow * GetColumnHeight()); - + UpdateScrollPos(); InvalidatePattern(TRUE); SendCtrlMessage(CTRLMSG_PATTERNCHANGED, m_nPattern); @@ -223,7 +225,7 @@ pSndFile = pModDoc->GetSoundFile(); CRect rect; UINT yofs = GetYScrollPos(); - + if ((bWrap) && (pSndFile->PatternSize[m_nPattern])) { if ((int)row < (int)0) @@ -331,14 +333,14 @@ SetCurSel(sel0, sel); UpdateIndicator(); - Log("Row: %d; Chan: %d; ColType: %d; cursor&0xFFFF: %x; cursor>>16: %x;\n", - GetRowFromCursor(sel0), + Log("Row: %d; Chan: %d; ColType: %d; cursor&0xFFFF: %x; cursor>>16: %x;\n", + GetRowFromCursor(sel0), GetChanFromCursor(sel0), GetColTypeFromCursor(sel0), (int)(sel0&0xFFFF), (int)(sel0>>16)); - + return TRUE; } @@ -457,7 +459,7 @@ CModDoc *pModDoc = GetDocument(); int yofs = GetYScrollPos(), xofs = GetXScrollPos(); int row, col; - + if ((!pModDoc) || (!m_szCell.cy)) return FALSE; GetClientRect(&rect); pSndFile = pModDoc->GetSoundFile(); @@ -570,28 +572,28 @@ { //rewbs.customKeys //We handle keypresses before Windows has a chance to handle them (for alt etc..) - if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || + if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) { CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); - + //Translate message manually UINT nChar = pMsg->wParam; UINT nRepCnt = LOWORD(pMsg->lParam); UINT nFlags = HIWORD(pMsg->lParam); KeyEventType kT = ih->GetKeyEventType(nFlags); InputTargetContext ctx = (InputTargetContext)(kCtxViewPatterns+1 + (m_dwCursor & 0x07)); - + if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. - } + } //HACK: fold kCtxViewPatternsFX and kCtxViewPatternsFXparam so that all commands of 1 are active in the other - else { + else { if (ctx==kCtxViewPatternsFX) { if (ih->KeyEvent(kCtxViewPatternsFXparam, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. } - } + } if (ctx==kCtxViewPatternsFXparam) { if (ih->KeyEvent(kCtxViewPatternsFX, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. @@ -601,9 +603,9 @@ //end HACK. } //end rewbs.customKeys - + } - + return CModScrollView::PreTranslateMessage(pMsg); } @@ -615,7 +617,7 @@ //---------------------------- { if (m_pEffectVis) { - m_pEffectVis->DoClose(); + m_pEffectVis->DoClose(); delete m_pEffectVis; m_pEffectVis = NULL; } @@ -638,7 +640,7 @@ } if (m_pOpenGLEditor) { - m_pOpenGLEditor->DoClose(); + m_pOpenGLEditor->DoClose(); delete m_pOpenGLEditor; m_pOpenGLEditor = NULL; } @@ -667,13 +669,13 @@ //------------------------------------------- { CScrollView::OnKillFocus(pNewWnd); - + //rewbs.customKeys //Unset all selection m_dwStatus &= ~PATSTATUS_KEYDRAGSEL; m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; // CMainFrame::GetMainFrame()->GetInputHandler()->SetModifierMask(0); - //end rewbs.customKeys + //end rewbs.customKeys m_dwStatus &= ~PATSTATUS_FOCUS; InvalidateRow(); @@ -689,7 +691,7 @@ MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; if (!p) return; BeginWaitCursor(); - + DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwBeginSel:m_dwEndSel; DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwEndSel:m_dwBeginSel; pModDoc->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->PatternSize[m_nPattern]); @@ -743,7 +745,7 @@ DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwBeginSel:m_dwEndSel; DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwEndSel:m_dwBeginSel; pModDoc->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->PatternSize[m_nPattern]); - + int finalDest = (startSel>>16)+((endSel>>16)-(startSel>>16))/2; for (int row=(startSel>>16)+1; row<=finalDest; row++) @@ -801,46 +803,51 @@ //----------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !(IsEditingEnabled_bmsg())) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; if (!p) return; + BeginWaitCursor(); + + if(ITStyle && GetColTypeFromCursor(m_dwEndSel) == NOTE_COLUMN) m_dwEndSel += 1; + //If selection ends to a note column, in ITStyle extending it to instrument column since the instrument data is + //removed with note data. + PrepareUndo(m_dwBeginSel, m_dwEndSel); DWORD tmp = m_dwEndSel; for (UINT row=(m_dwBeginSel >> 16); row<=(m_dwEndSel >> 16); row++) { // for all selected rows for (UINT i=(m_dwBeginSel & 0xFFFF); i<=(m_dwEndSel & 0xFFFF); i++) if ((i & 7) < 5) { // for all selected cols - + UINT chn = i >> 3; if ((chn >= pSndFile->m_nChannels) || (row >= pSndFile->PatternSize[m_nPattern])) continue; MODCOMMAND *m = &p[row * pSndFile->m_nChannels + chn]; - switch(i & 7) { case 0: // Clear note if (rm.note) { - m->note = 0; + m->note = 0; if (ITStyle) m->instr = 0; } break; case 1: // Clear instrument if (rm.instrument) { - m->instr = 0; + m->instr = 0; } break; case 2: // Clear volume if (rm.volume) { - m->volcmd = m->vol = 0; + m->volcmd = m->vol = 0; } - break; - case 3: // Clear Command + break; + case 3: // Clear Command if (rm.command) { m->command = 0; } break; case 4: // Clear Command Param if (rm.parameter) { - m->param = 0; + m->param = 0; } break; } //end switch @@ -882,8 +889,8 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg()) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, false); InvalidatePattern(FALSE); @@ -896,8 +903,8 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg()) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, true); InvalidatePattern(FALSE); @@ -909,8 +916,8 @@ //---------------------------------------- { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg() ) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, true, true); InvalidatePattern(FALSE); @@ -1046,7 +1053,7 @@ pModDoc->Record1Channel(nItemNo); InvalidateChannelsHeaders(); } - } + } else if (!(nFlags&MK_CONTROL)) { pModDoc->MuteChannel(nItemNo, (pSndFile->ChnSettings[nItemNo].dwFlags & CHN_MUTE) ? FALSE : TRUE); } @@ -1088,7 +1095,7 @@ HMENU hMenu; // Too far left to get a ctx menu: - if ((!pModDoc) || (pt.x < m_szHeader.cx)) { + if ((!pModDoc) || (pt.x < m_szHeader.cx)) { return; } @@ -1116,7 +1123,7 @@ pSndFile = pModDoc->GetSoundFile(); m_nMenuParam = GetPositionFromPoint(pt); - + // Right-click outside selection? Reposition cursor to the new location if (((m_nMenuParam >> 16) < (m_dwBeginSel >> 16)) || ((m_nMenuParam >> 16) > (m_dwEndSel >> 16)) @@ -1443,7 +1450,7 @@ CSoundFile *pSndFile; UINT row, maxrow; - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !( IsEditingEnabled_bmsg() )) return; pSndFile = pModDoc->GetSoundFile(); if (!pSndFile->Patterns[m_nPattern]) return; row = m_dwBeginSel >> 16; @@ -1509,7 +1516,7 @@ CSoundFile *pSndFile; UINT row, maxrow; - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !(IsEditingEnabled_bmsg())) return; pSndFile = pModDoc->GetSoundFile(); if (!pSndFile->Patterns[m_nPattern]) return; row = m_dwBeginSel >> 16; @@ -1556,7 +1563,7 @@ maxrow = pSndFile->PatternSize[m_nPattern]; colmin = (m_dwBeginSel & 0xFFFF) >> 3; colmax = (m_dwEndSel & 0xFFFF) >> 3; - + InsertRows(colmin, colmax); } //end rewbs.customKeys @@ -1629,16 +1636,16 @@ CSoundFile* pSndFile = pModDoc->GetSoundFile(); UINT nCurrentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); UINT nCurrentChannel = ((m_dwCursor & 0xFFFF) >> 3) + 1; - + m_pGotoWnd->UpdatePos(m_nRow, nCurrentChannel, m_nPattern, nCurrentOrder, pSndFile); if (m_pGotoWnd->DoModal() == IDOK) { //Position should be valididated. - + if (m_pGotoWnd->m_nPattern != m_nPattern) { SetCurrentPattern(m_pGotoWnd->m_nPattern); } - + if (m_pGotoWnd->m_nOrder != nCurrentOrder) { SendCtrlMessage(CTRLMSG_SETCURRENTORDER, m_pGotoWnd->m_nOrder); } @@ -1951,7 +1958,7 @@ //rewbs.customKeys CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); - + if ((pModDoc) && (pMainFrm)) { PrepareUndo(m_dwBeginSel, m_dwEndSel); @@ -2007,7 +2014,7 @@ m_pRandomizer = new CPatternRandomizer(this); if (m_pRandomizer) { m_pRandomizer->showGUI(); - } + } } } } @@ -2076,7 +2083,7 @@ bool changed = false; CArray<UINT,UINT> validChans; - + if (type==EFFECT_COLUMN || type==PARAM_COLUMN) { CArray<UINT,UINT> moreValidChans; ListChansWhereColSelected(EFFECT_COLUMN, validChans); @@ -2099,11 +2106,11 @@ if (!IsInterpolationPossible(row0, row1, nchn, type, pSndFile)) { continue; //skip chans where interpolation isn't possible } - + if (!changed) { //ensure we save undo buffer only before any channels are interpolated PrepareUndo(m_dwBeginSel, m_dwEndSel); } - + int vsrc, vdest, vcmd, verr, distance; distance = row1 - row0; @@ -2134,9 +2141,9 @@ if (vdest < vsrc) verr = -verr; pcmd += row0 * pSndFile->m_nChannels + nchn; - + for (UINT i=0; i<=distance; i++, pcmd += pSndFile->m_nChannels) { - + switch(type) { case NOTE_COLUMN: if ((!pcmd->note) || (pcmd->instr == vcmd)) { @@ -2163,7 +2170,7 @@ ASSERT(false); } } - + changed=true; } //end for all channels where type is selected @@ -2221,7 +2228,7 @@ int x1, y1, x2, y2, c1, c2, xc1, xc2, xmc1, xmc2, ym1, ym2; int dx, dy, nChannels, nRows; - if ((pModDoc = GetDocument()) == NULL || !(m_dwStatus&PATSTATUS_RECORD)) return; + if ((pModDoc = GetDocument()) == NULL || !(IsEditingEnabled_bmsg())) return; pSndFile = pModDoc->GetSoundFile(); nChannels = pSndFile->m_nChannels; nRows = pSndFile->PatternSize[m_nPattern]; @@ -2256,7 +2263,7 @@ for (int c=0; c<4; c++) { int xsrc=x, ysrc=y, xc=x*4+c; - + // Destination is from destination selection if ((xc >= xmc1) && (xc <= xmc2) && (y >= ym1) && (y <= ym2)) { @@ -2284,9 +2291,12 @@ p++; } } + BEGIN_CRITICAL(); pSndFile->Patterns[m_nPattern] = pNewPattern; END_CRITICAL(); + + x1 += dx; x2 += dx; y1 += dy; @@ -2318,7 +2328,7 @@ BYTE nIns = static_cast<BYTE>(GetCurrentInstrument()); MODCOMMAND *p; BOOL bModified; - + if (!nIns) return; if ((pModDoc = GetDocument()) == NULL) return; pSndFile = pModDoc->GetSoundFile(); @@ -2338,7 +2348,6 @@ for (UINT c=startChan; c<endChan+1; c++) { p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + c; - // If a note or an instr is present on the row, do the change, if required. // Do not set instr if note and instr are both blank. if ( (p->note||p->instr) && (p->instr!=nIns) ) { @@ -2394,11 +2403,11 @@ void CViewPattern::OnAddChannelFront() //------------------------------------ { - UINT nChn = ((m_nMenuParam&0xFFFF)>>3); + UINT nChn = GetChanFromCursor(m_nMenuParam); CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; - + BeginWaitCursor(); //First adding channel as the last channel... if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { @@ -2419,7 +2428,7 @@ void CViewPattern::OnAddChannelAfter() //------------------------------------ { - UINT nChn = ((m_nMenuParam&0xFFFF)>>3)+1; + UINT nChn = ((m_nMenuParam&0xFFFF)>>3)+1; CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; @@ -2503,7 +2512,7 @@ //----------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + if (pModDoc && IsEditingEnabled_bmsg()) { UINT nPat = pModDoc->DoUndo(); if (nPat < MAX_PATTERNS) @@ -2536,7 +2545,6 @@ if (pSndFile->Patterns[m_nPattern]) { MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; - for (UINT j=0; j<pSndFile->m_nChannels; j++) { for (UINT i=0; i<pSndFile->PatternSize[m_nPattern]; i++) @@ -2571,8 +2579,8 @@ { chvol[j] = (BYTE)(pSndFile->Ins[nSmp].nVolume >> 2); break; - } - else + } + else { //nonexistant sample and no volume present in patten? assume volume=64. m->volcmd = VOLCMD_VOLUME; chvol[j] = 64; @@ -2677,14 +2685,14 @@ updateOrderList = true; m_nLastPlayedOrder = nOrd; } - + if (nRow < m_nLastPlayedRow) { InvalidateChannelsHeaders(); } m_nLastPlayedRow = nRow; if (pSndFile->m_dwSongFlags & (SONG_PAUSED|SONG_STEP)) return 0; - + //rewbs.toCheck: is it safe to remove this? What if a pattern has no order? /* if (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP) @@ -2698,13 +2706,13 @@ nPat = pSndFile->Order[nOrd]; } */ - + if (pSndFile->Order[nOrd] != nPat) { //order doesn't correlate with pattern, so mark it as invalid - nOrd = 0xFFFF; + nOrd = 0xFFFF; } - if (m_pEffectVis && m_pEffectVis->m_hWnd) { + if (m_pEffectVis && m_pEffectVis->m_hWnd) { m_pEffectVis->SetPlayCursor(nPat, nRow); } @@ -2731,15 +2739,15 @@ SetPlayCursor(nPat, nRow); } - + } //Ends condition "if(pnotify->dwType & MPTNOTIFY_POSITION)" if ((pnotify->dwType & (MPTNOTIFY_VUMETERS|MPTNOTIFY_STOP)) && (m_dwStatus & PATSTATUS_VUMETERS)) { UpdateAllVUMeters(pnotify); } - + UpdateIndicator(); return 0; @@ -2791,20 +2799,20 @@ pRow->param = 0xF0 + (foundMacro&0x0F); InvalidateRow(); } - + } } - + //Write the data, but we only overwrite if the command is a macro anyway. if (pRow->command == 0 || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { pRow->command = CMD_SMOOTHMIDI; pRow->param = value; InvalidateRow(); } - + } @@ -2816,7 +2824,8 @@ if ((!pModDoc) || (!pMainFrm)) return 0; -//Midi message from our perspective: +//Midi message from our perspective: +//NOTE: Velocity and Note data may actually consist of 7 bits, not 8 as said here. // +---------------------------+---------------------------+-------------+-------------+ //bit: | 24.23.22.21 | 20.19.18.17 | 16.15.14.13 | 12.11.10.09 | 08.07.06.05 | 04.03.02.01 | // +---------------------------+---------------------------+-------------+-------------+ @@ -2830,16 +2839,21 @@ //. We only handle note-on and note off events. //. Basing the event solely on the velocity as follows is incorrect, // since a note-off can have a velocity too: - // BYTE event = (dwMidiData>>16) & 0x64; + // BYTE event = (dwMidiData>>16) & 0x64; BYTE nNote = ((dwMidiData >> 8) & 0xFF) +1; // +1 is for MPT, where middle C is 61 BYTE nVol = (dwMidiData >> 16) & 0xFF; // At this stage nVol is a non linear value in [0;127] // Need to convert to linear in [0;64] - see below - BYTE event = dwMidiData & 0xF0; + BYTE event = dwMidiData & 0xF0; //Event 'contains' bits 08-05 (0xF0 == 11110000 in base 10) if ((event == 0x90) && !nVol) event = 0x80; //Convert event to note-off if req'd - + //Event nibble: 8 if Note Off, 9 is Note on. Don't care about other events ATM. - switch(event) + + + //NOTE: Midi in code should also be updated in view_smp.cpp and view_ins.cpp + //Should something be done to prevent need for code copy? + + switch(event) { case 0x80: // Note Off // The following method takes care of: @@ -2850,7 +2864,7 @@ case 0x90: // Note On if (CMainFrame::m_dwMidiSetup & MIDISETUP_RECORDVELOCITY) - { + { //Convert non linear value in [0;127] to linear value in [0;64]: nVol = (CDLSBank::DLSMidiVolumeToLinear(nVol)+1023) >> 10; //Amplify if requested: @@ -2861,14 +2875,14 @@ } else { //Use default volume - nVol = -1; + nVol = -1; } TempEnterNote(nNote, true, nVol); break; } - + return 0; } @@ -3162,17 +3176,17 @@ case kcPatternSnapUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, true); return wParam; case kcPatternSnapDownh2Select: case kcPatternSnapDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, true); return wParam; - + case kcNavigateDownSelect: case kcNavigateDown: SetCurrentRow(m_nRow+1, TRUE); return wParam; case kcNavigateUpSelect: case kcNavigateUp: SetCurrentRow(m_nRow-1, TRUE); return wParam; - + case kcNavigateDownBySpacingSelect: case kcNavigateDownBySpacing: SetCurrentRow(m_nRow+m_nSpacing, TRUE); return wParam; case kcNavigateUpBySpacingSelect: case kcNavigateUpBySpacing: SetCurrentRow(m_nRow-m_nSpacing, TRUE); return wParam; - + case kcNavigateLeftSelect: case kcNavigateLeft: if ((CMainFrame::m_dwPatternSetup & PATTERN_WRAP) && (!m_dwCursor)) SetCurrentColumn((((pSndFile->m_nChannels-1) << 3) | 4)); @@ -3196,22 +3210,22 @@ SetCurSel(n, n); return wParam;} case kcHomeHorizontalSelect: - case kcHomeHorizontal: if (m_dwCursor) SetCurrentColumn(0); - else if (m_nRow > 0) SetCurrentRow(0); + case kcHomeHorizontal: if (m_dwCursor) SetCurrentColumn(0); + else if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcHomeVerticalSelect: - case kcHomeVertical: if (m_nRow > 0) SetCurrentRow(0); + case kcHomeVertical: if (m_nRow > 0) SetCurrentRow(0); else if (m_dwCursor) SetCurrentColumn(0); - return wParam; + return wParam; case kcHomeAbsoluteSelect: - case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; + case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcEndHorizontalSelect: case kcEndHorizontal: if (m_dwCursor!=(((pSndFile->m_nChannels-1) << 3) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); else if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); - return wParam; + return wParam; case kcEndVerticalSelect: - case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); + case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); else if (m_dwCursor!=(((pSndFile->m_nChannels-1) << 3) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); return wParam; case kcEndAbsoluteSelect: @@ -3219,7 +3233,7 @@ case kcNextPattern: { UINT n = m_nPattern + 1; while ((n < MAX_PATTERNS) && (!pSndFile->Patterns[n])) n++; - SetCurrentPattern((n < MAX_PATTERNS) ? n : 0); + SetCurrentPattern((n < MAX_PATTERNS) ? n : 0); int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true); SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder); @@ -3245,7 +3259,7 @@ case kcCopySelectOffWithSelect: case kcCopySelectOffWithNav: case kcCopySelectOff: m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; return wParam; - + case kcClearRow: OnClearField(-1, false); return wParam; case kcClearField: OnClearField(m_dwCursor & 0x07, false); return wParam; case kcClearFieldITStyle: OnClearField(m_dwCursor & 0x07, false, true); return wParam; @@ -3255,14 +3269,14 @@ case kcDeleteRows: OnDeleteRows(); return wParam; case kcDeleteAllRows: DeleteRows(0, pSndFile->m_nChannels-1,1); return wParam; case kcInsertRow: OnInsertRows(); return wParam; - case kcInsertAllRows: InsertRows(0, pSndFile->m_nChannels-1); return wParam; + case kcInsertAllRows: InsertRows(0, pSndFile->m_nChannels-1); return wParam; case kcShowNoteProperties: ShowEditWindow(); return wParam; case kcShowPatternProperties: OnPatternProperties(); return wParam; case kcShowMacroConfig: SendCtrlMessage(CTRLMSG_SETUPMACROS); return wParam; case kcShowEditMenu: {CPoint pt = GetPointFromPosition((m_nRow << 16) | m_dwCursor); OnRButtonDown(0, pt); } - return wParam; + return wParam; case kcPatternGoto: OnEditGoto(); return wParam; case kcNoteCut: TempEnterNote(254, false); return wParam; @@ -3277,7 +3291,7 @@ case kcEditCopy: OnEditCopy(); return wParam; case kcCopyAndLoseSelection: { - OnEditCopy(); + OnEditCopy(); int sel = m_dwCursor | (m_nRow << 16); SetCurSel(sel, sel); return wParam; @@ -3318,38 +3332,38 @@ if (wParam>=kcSetSpacing0 && wParam<kcSetSpacing9) { - SetSpacing(wParam - kcSetSpacing0); + SetSpacing(wParam - kcSetSpacing0); return wParam; } if (wParam>=kcSetIns0 && wParam<=kcSetIns9) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterIns(wParam-kcSetIns0); return wParam; } if (wParam>=kcSetOctave0 && wParam<=kcSetOctave9) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled()) TempEnterOctave(wParam-kcSetOctave0); return wParam; } if (wParam>=kcSetVolumeStart && wParam<=kcSetVolumeEnd) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterVol(wParam-kcSetVolumeStart); return wParam; } if (wParam>=kcSetFXStart && wParam<=kcSetFXEnd) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterFX(wParam-kcSetFXStart+1); return wParam; } if (wParam>=kcSetFXParam0 && wParam<=kcSetFXParamF) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterFXparam(wParam-kcSetFXParam0); return wParam; } @@ -3358,18 +3372,20 @@ } void CViewPattern::TempEnterVol(int v) +//------------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; + MODCOMMAND oldcmd; // This is the command we are about to overwrite PrepareUndo(m_dwBeginSel, m_dwEndSel); - + // -- Work out where to put the new data UINT nChn = (m_dwCursor & 0xFFFF) >> 3; prowbase = p + m_nRow * pSndFile->m_nChannels; @@ -3382,7 +3398,7 @@ { vol = ((vol * 10) + v) % 100; if (!volcmd) volcmd = VOLCMD_VOLUME; - } + } else switch(v+kcSetVolumeStart) { @@ -3414,7 +3430,7 @@ p->volcmd = volcmd; p->vol = vol; - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3435,6 +3451,7 @@ } void CViewPattern::SetSpacing(int n) +//---------------------------------- { if (n != m_nSpacing) { @@ -3444,12 +3461,13 @@ } void CViewPattern::TempEnterFX(int c) +//----------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; MODCOMMAND oldcmd; // This is the command we are about to overwrite @@ -3469,7 +3487,7 @@ m_cmdOld.command = c; } p->command = c; - + // Check for MOD/XM Speed/Tempo command if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) @@ -3478,7 +3496,7 @@ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; } - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3494,12 +3512,13 @@ } void CViewPattern::TempEnterFXparam(int v) +//---------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; MODCOMMAND oldcmd; // This is the command we are about to overwrite @@ -3515,7 +3534,7 @@ // { p->param = (p->param << 4) | v; if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; -/* } +/* } else if (v >= 10 && v <= 15) { p->param = (p->param << 4) | (v + 0x0A); @@ -3530,7 +3549,7 @@ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; } - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3564,13 +3583,13 @@ if (!ins) ins = m_nFoundInstrument; pModDoc->NoteOff(note, TRUE, ins, (m_dwCursor & 0xFFFF) >> 3); } - + //Enter note off in pattern? if ((note < 1) || (note > 120)) return; if ((m_dwCursor & 7) > 1 && !fromMidi) return; - if (!pModDoc || !pMainFrm || !(m_dwStatus & PATSTATUS_RECORD)) + if (!pModDoc || !pMainFrm || !(IsEditingEnabled())) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); @@ -3603,7 +3622,7 @@ prowbase = p + nRow * pSndFile->m_nChannels; if (releaseChan>=0 && releaseChan<pSndFile->m_nChannels) p=prowbase+releaseChan; - else + else p=prowbase+nChn; //don't overwrite: @@ -3616,9 +3635,9 @@ return; } } else { - return; + return; } - } + } // -- write sdx if playing live if (usePlaybackPosition && pSndFile->m_nTickCount) { // avoid SD0 which will be mis-interpreted @@ -3630,7 +3649,8 @@ //Enter note off p->note = 0xFF; - p->instr = 0; + p->instr = GetCurrentInstrument(); //p->instr = 0; + //Writing the instrument as well - probably someone finds this annoying :) p->volcmd = 0; p->vol = 0; @@ -3640,7 +3660,7 @@ UpdateIndicator();... [truncated message content] |
From: <re...@us...> - 2006-08-16 23:47:48
|
Revision: 164 Author: rewbs Date: 2006-08-16 16:47:38 -0700 (Wed, 16 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=164&view=rev Log Message: ----------- <rewbs> ITP fixes Modified Paths: -------------- trunk/OpenMPT/soundlib/Load_it.cpp Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-08-13 15:52:29 UTC (rev 163) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-08-16 23:47:38 UTC (rev 164) @@ -248,7 +248,7 @@ streamPos += sizeof(DWORD); // name string - if (streamPos+len<=dwMemLength && len<MAX_SAMPLES*32) { + if (streamPos+len<=dwMemLength && len<=MAX_SAMPLES*32) { memcpy(&m_szNames[0],lpStream+streamPos,len); streamPos += len; } @@ -331,7 +331,7 @@ streamPos += sizeof(DWORD); // ChnSettings[i].szName - if (streamPos+len<=dwMemLength && len<MAX_CHANNELNAME) { + if (streamPos+len<=dwMemLength && len<=MAX_CHANNELNAME) { memcpy(&ChnSettings[i].szName[0],lpStream+streamPos,len); streamPos += len; } @@ -372,7 +372,7 @@ // instruments' paths for(i=0; i<m_nInstruments; i++){ - if (len+streamPos<=dwMemLength && len<_MAX_PATH) { + if (len+streamPos<=dwMemLength && len<=_MAX_PATH) { memcpy(&m_szInstrumentPath[i][0],lpStream+streamPos,len); streamPos += len; } @@ -386,7 +386,7 @@ streamPos += sizeof(DWORD); // order data - if (size+streamPos<=dwMemLength && size<MAX_ORDERS) { + if (size+streamPos<=dwMemLength && size<=MAX_ORDERS) { memcpy(&Order[0],lpStream+streamPos,size); streamPos += size; } @@ -410,8 +410,8 @@ streamPos += sizeof(DWORD); // m_lpszPatternNames - m_lpszPatternNames = new char[m_nPatternNames * len]; - if (m_lpszPatternNames) { + if (len<=MAX_PATTERNNAME && m_nPatternNames<=MAX_PATTERNS) { + m_lpszPatternNames = new char[m_nPatternNames * len]; memcpy(&m_lpszPatternNames[0],lpStream+streamPos,m_nPatternNames * len); } streamPos += m_nPatternNames * len; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 15:52:41
|
Revision: 163 Author: rewbs Date: 2006-08-13 08:52:29 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=163&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-13 15:52:29 UTC (rev 163) @@ -85,6 +85,7 @@ ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) ON_MESSAGE(WM_MOD_MIDIMSG, OnMidiMsg) ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg) //rewbs.customKeys + ON_COMMAND(ID_ENVELOPE_TOGGLERELEASENODE, OnEnvToggleReleasNode) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -1305,6 +1306,7 @@ { maxpoint--; m_dcMemMain.SelectObject(CMainFrame::penEnvelope); + int releaseNode = EnvGetReleaseNode(); for (UINT i=0; i<=maxpoint; i++) { int x = (EnvGetTick(i) + 1) * ENV_ZOOM - nScrollPos; @@ -1313,11 +1315,18 @@ rect.top = y - 3; rect.right = x + 4; rect.bottom = y + 4; - m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushWhite)); - if (i) + if (i) { m_dcMemMain.LineTo(x, y); - else + } else { m_dcMemMain.MoveTo(x, y); + } + if (i==releaseNode) { + m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushHighLightRed)); + m_dcMemMain.SelectObject(CMainFrame::penEnvelopeHighlight); + } else { + m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushWhite)); + } + } } DrawPositionMarks(m_dcMemMain.m_hDC); @@ -1337,7 +1346,73 @@ // -! NEW_FEATURE#0015 } +BYTE CViewInstrument::EnvGetReleaseNode() +//-------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + if (penv) { + switch(m_nEnv) { + case ENV_VOLUME: + return penv->nVolEnvReleaseNode; + case ENV_PANNING: + return penv->nPanEnvReleaseNode; + case ENV_PITCH: + return penv->nPitchEnvReleaseNode; + default: + return ENV_RELEASE_NODE_UNSET; + } + } + } +} +WORD CViewInstrument::EnvGetReleaseNodeValue() +//-------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + if (penv) { + switch(m_nEnv) { + case ENV_VOLUME: + return penv->VolEnv[EnvGetReleaseNode()]; + case ENV_PANNING: + return penv->PanEnv[EnvGetReleaseNode()]; + case ENV_PITCH: + return penv->PitchEnv[EnvGetReleaseNode()]; + default: + return 0; + } + } + } +} + +WORD CViewInstrument::EnvGetReleaseNodeTick() +//-------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + if (penv) { + switch(m_nEnv) { + case ENV_VOLUME: + return penv->VolPoints[EnvGetReleaseNode()]; + case ENV_PANNING: + return penv->PanPoints[EnvGetReleaseNode()]; + case ENV_PITCH: + return penv->PitchPoints[EnvGetReleaseNode()]; + default: + return 0; + } + } + } +} + + void CViewInstrument::DrawPositionMarks(HDC hdc) //---------------------------------------------- { @@ -1654,7 +1729,14 @@ if (nVal < 0) nVal = 0; if (nVal > 64) nVal = 64; if (nTick < 0) nTick = 0; - wsprintf(s, "Tick %d, [%d]", nTick, (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal); + if (nTick<=EnvGetReleaseNodeTick()+1) { + int displayVal = (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal; + wsprintf(s, "Tick %d, [%d]", nTick, displayVal); + } else { + int displayVal = (nVal-EnvGetReleaseNodeValue())*2; + displayVal = (m_nEnv != ENV_VOLUME) ? displayVal-32 : displayVal; + wsprintf(s, "Tick %d, [Rel%c%d]", nTick, displayVal>0?'+':'-', abs(displayVal)); + } UpdateIndicator(s); if ((m_dwStatus & INSSTATUS_DRAGGING) && (m_nDragItem)) { @@ -1860,9 +1942,11 @@ pSubMenu->EnableMenuItem(ID_ENVELOPE_INSERTPOINT, (lastpoint < maxpoint) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_REMOVEPOINT, ((m_nDragItem) && (lastpoint > 1)) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_CARRY, (pSndFile->m_nType & MOD_TYPE_IT) ? MF_ENABLED : MF_GRAYED); + pSubMenu->EnableMenuItem(ID_ENVELOPE_TOGGLERELEASENODE, (pSndFile->m_nType&MOD_TYPE_IT && m_nEnv==ENV_VOLUME) ? MF_ENABLED : MF_GRAYED); pSubMenu->CheckMenuItem(ID_ENVELOPE_SETLOOP, (EnvGetLoop()) ? MF_CHECKED : MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ENVELOPE_SUSTAIN, (EnvGetSustain()) ? MF_CHECKED : MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ENVELOPE_CARRY, (EnvGetCarry()) ? MF_CHECKED : MF_UNCHECKED); + pSubMenu->CheckMenuItem(ID_ENVELOPE_TOGGLERELEASENODE, (EnvGetReleaseNode()==m_nDragItem-1) ? MF_CHECKED : MF_UNCHECKED); m_ptMenu = pt; ClientToScreen(&pt); pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this); @@ -1950,7 +2034,45 @@ } } +void CViewInstrument::OnEnvToggleReleasNode() +//--------------------------------------------------- +{ + int node = m_nDragItem-1; + CModDoc *pModDoc = GetDocument(); + if ((pModDoc) && (node>0) && (node <= EnvGetLastPoint())) + { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + switch(m_nEnv) { + case ENV_VOLUME: + if (penv->nVolEnvReleaseNode == node) { + penv->nVolEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + } else { + penv->nVolEnvReleaseNode = node; + } + break; + case ENV_PANNING: + if (penv->nPanEnvReleaseNode == node) { + penv->nPanEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + } else { + penv->nPanEnvReleaseNode = node; + } + break; + case ENV_PITCH: + if (penv->nPitchEnvReleaseNode == node) { + penv->nPitchEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + } else { + penv->nPitchEnvReleaseNode = node; + } + break; + } + pModDoc->SetModified(); + InvalidateRect(NULL, FALSE); + } +} + + void CViewInstrument::OnEnvVolChanged() //------------------------------------- { @@ -2040,6 +2162,7 @@ if (penv->nVolLoopEnd > nPoint) penv->nVolLoopEnd--; if (penv->nVolSustainBegin > nPoint) penv->nVolSustainBegin--; if (penv->nVolSustainEnd > nPoint) penv->nVolSustainEnd--; + if (penv->nVolEnvReleaseNode>nPoint && penv->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nVolEnvReleaseNode--; penv->VolPoints[0] = 0; bOk = TRUE; } @@ -2058,6 +2181,7 @@ if (penv->nPanLoopEnd > nPoint) penv->nPanLoopEnd--; if (penv->nPanSustainBegin > nPoint) penv->nPanSustainBegin--; if (penv->nPanSustainEnd > nPoint) penv->nPanSustainEnd--; + if (penv->nPanEnvReleaseNode>nPoint && penv->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPanEnvReleaseNode--; penv->PanPoints[0] = 0; bOk = TRUE; } @@ -2076,6 +2200,7 @@ if (penv->nPitchLoopEnd > nPoint) penv->nPitchLoopEnd--; if (penv->nPitchSustainBegin > nPoint) penv->nPitchSustainBegin--; if (penv->nPitchSustainEnd > nPoint) penv->nPitchSustainEnd--; + if (penv->nPitchEnvReleaseNode>nPoint && penv->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPitchEnvReleaseNode--; penv->PitchPoints[0] = 0; bOk = TRUE; } @@ -2131,6 +2256,7 @@ if (penv->nVolLoopEnd >= i) penv->nVolLoopEnd++; if (penv->nVolSustainBegin >= i) penv->nVolSustainBegin++; if (penv->nVolSustainEnd >= i) penv->nVolSustainEnd++; + if (penv->nVolEnvReleaseNode>=i && penv->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nVolEnvReleaseNode++; bOk = TRUE; } break; @@ -2156,6 +2282,7 @@ if (penv->nPanLoopEnd >= i) penv->nPanLoopEnd++; if (penv->nPanSustainBegin >= i) penv->nPanSustainBegin++; if (penv->nPanSustainEnd >= i) penv->nPanSustainEnd++; + if (penv->nPanEnvReleaseNode>=i && penv->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPanEnvReleaseNode++; bOk = TRUE; } break; @@ -2181,6 +2308,7 @@ if (penv->nPitchLoopEnd >= i) penv->nPitchLoopEnd++; if (penv->nPitchSustainBegin >= i) penv->nPitchSustainBegin++; if (penv->nPitchSustainEnd >= i) penv->nPitchSustainEnd++; + if (penv->nPitchEnvReleaseNode>=i && penv->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPitchEnvReleaseNode++; bOk = TRUE; } break; Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/mptrack/View_ins.h 2006-08-13 15:52:29 UTC (rev 163) @@ -115,6 +115,7 @@ afx_msg void OnEnvLoopChanged(); afx_msg void OnEnvSustainChanged(); afx_msg void OnEnvCarryChanged(); + afx_msg void OnEnvToggleReleasNode(); afx_msg void OnEnvInsertPoint(); afx_msg void OnEnvRemovePoint(); afx_msg void OnSelectVolumeEnv(); @@ -134,6 +135,11 @@ virtual BOOL PreTranslateMessage(MSG *pMsg); //rewbs.customKeys //}}AFX_MSG DECLARE_MESSAGE_MAP() + +private: + BYTE EnvGetReleaseNode(); + WORD EnvGetReleaseNodeValue(); + WORD EnvGetReleaseNodeTick(); }; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2006-08-13 15:52:29 UTC (rev 163) @@ -437,25 +437,17 @@ || (!pChn->nLength) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))) { pChn->dwFlags |= CHN_FASTVOLRAMP; - if ((m_nType & MOD_TYPE_IT) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) - { - if (!(penv->dwFlags & ENV_VOLCARRY)) pChn->nVolEnvPosition = 0; - if (!(penv->dwFlags & ENV_PANCARRY)) pChn->nPanEnvPosition = 0; - if (!(penv->dwFlags & ENV_PITCHCARRY)) pChn->nPitchEnvPosition = 0; - } else - { - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + if ((m_nType & MOD_TYPE_IT) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) { + if (!(penv->dwFlags & ENV_VOLCARRY)) resetEnvelopes(pChn, ENV_RESET_VOL); + if (!(penv->dwFlags & ENV_PANCARRY)) resetEnvelopes(pChn, ENV_RESET_PAN); + if (!(penv->dwFlags & ENV_PITCHCARRY)) resetEnvelopes(pChn, ENV_RESET_PITCH); + } else { + resetEnvelopes(pChn); } pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; - } else - if ((penv) && (!(penv->dwFlags & ENV_VOLUME))) - { - pChn->nVolEnvPosition = 0; - pChn->nAutoVibDepth = 0; - pChn->nAutoVibPos = 0; + } else if ((penv) && (!(penv->dwFlags & ENV_VOLUME))) { + resetEnvelopes(pChn); } } // Invalid sample ? @@ -593,9 +585,7 @@ { if ((m_nType & MOD_TYPE_IT) && (pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) { - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + resetEnvelopes(pChn); pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; pChn->dwFlags &= ~CHN_NOTEFADE; @@ -1013,9 +1003,7 @@ if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) { pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + resetEnvelopes(pChn); pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; pChn->dwFlags &= ~CHN_NOTEFADE; @@ -1069,9 +1057,7 @@ if ((bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) && (instr)) { pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + resetEnvelopes(pChn); pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; } @@ -1566,7 +1552,33 @@ return TRUE; } +void CSoundFile::resetEnvelopes(MODCHANNEL* pChn, int envToReset) +{ + switch (envToReset) { + case ENV_RESET_ALL: + pChn->nVolEnvPosition = 0; + pChn->nPanEnvPosition = 0; + pChn->nPitchEnvPosition = 0; + pChn->nVolEnvValueAtReleaseJump = NOT_YET_RELEASED; + pChn->nPitchEnvValueAtReleaseJump = NOT_YET_RELEASED; + pChn->nPanEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + case ENV_RESET_VOL: + pChn->nVolEnvPosition = 0; + pChn->nVolEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + case ENV_RESET_PAN: + pChn->nPanEnvPosition = 0; + pChn->nPanEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + case ENV_RESET_PITCH: + pChn->nPitchEnvPosition = 0; + pChn->nPitchEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + } +} + //////////////////////////////////////////////////////////// // Channels effects @@ -2689,8 +2701,15 @@ if (pChn->pHeader) { INSTRUMENTHEADER *penv = pChn->pHeader; - if (((penv->dwFlags & ENV_VOLLOOP) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) && (penv->nFadeOut)) + if (((penv->dwFlags & ENV_VOLLOOP) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) && (penv->nFadeOut)) { pChn->dwFlags |= CHN_NOTEFADE; + } + + if (penv->nVolEnvReleaseNode != ENV_RELEASE_NODE_UNSET) { + pChn->nVolEnvValueAtReleaseJump=getVolEnvValueFromPosition(pChn->nVolEnvPosition, penv); + pChn->nVolEnvPosition= penv->VolPoints[penv->nVolEnvReleaseNode]; + } + } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2006-08-13 15:52:29 UTC (rev 163) @@ -189,6 +189,9 @@ VSB. nVolSustainBegin; VSE. nVolSustainEnd; VSTV [EXT] nVSTiVolume; +PERN nPitchEnvReleaseNode +AERN nPanEnvReleaseNode +VERN nVolEnvReleaseNode ----------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------*/ @@ -265,6 +268,9 @@ WRITE_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) WRITE_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) WRITE_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) +WRITE_MPTHEADER_sized_member( nPitchEnvReleaseNode, BYTE , PERN ) +WRITE_MPTHEADER_sized_member( nPanEnvReleaseNode , BYTE , AERN ) +WRITE_MPTHEADER_sized_member( nVolEnvReleaseNode , BYTE , VERN ) } // -------------------------------------------------------------------------------------------- @@ -338,6 +344,9 @@ GET_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) GET_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) GET_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) +GET_MPTHEADER_sized_member( nPitchEnvReleaseNode, BYTE , PERN ) +GET_MPTHEADER_sized_member( nPanEnvReleaseNode , BYTE , AERN ) +GET_MPTHEADER_sized_member( nVolEnvReleaseNode , BYTE , VERN ) } return pointer; @@ -748,6 +757,8 @@ LPSTR CSoundFile::AllocateSample(UINT nbytes) //------------------------------------------- { + if (nbytes>0xFFFFFFD6) + return NULL; LPSTR p = (LPSTR)GlobalAllocPtr(GHND, (nbytes+39) & ~7); if (p) p += 16; return p; @@ -2650,8 +2661,20 @@ m_defaultInstrument.nResampling = SRCMODE_DEFAULT; m_defaultInstrument.nFilterMode = FLTMODE_UNCHANGED; m_defaultInstrument.nPPC = 5*12; - m_defaultInstrument.nGlobalVol=128; + m_defaultInstrument.nGlobalVol=64; m_defaultInstrument.nPan = 0x20 << 2; m_defaultInstrument.nIFC = 0xFF; + m_defaultInstrument.nPanEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + m_defaultInstrument.nPitchEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + m_defaultInstrument.nVolEnvReleaseNode=ENV_RELEASE_NODE_UNSET; } +void CSoundFile::SetDefaultInstrumentValues(INSTRUMENTHEADER *penv) +//----------------------------------------------------------------- +{ + penv->nResampling = m_defaultInstrument.nResampling; + penv->nFilterMode = m_defaultInstrument.nFilterMode; + penv->nPitchEnvReleaseNode = m_defaultInstrument.nPitchEnvReleaseNode; + penv->nPanEnvReleaseNode = m_defaultInstrument.nPanEnvReleaseNode; + penv->nVolEnvReleaseNode = m_defaultInstrument.nVolEnvReleaseNode; +} \ No newline at end of file Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/soundlib/Sndfile.h 2006-08-13 15:52:29 UTC (rev 163) @@ -62,6 +62,7 @@ #define MAX_MIXPLUGINS 100 //50 // -! BEHAVIOUR_CHANGE#0006 #define MAX_PLUGPRESETS 1000 //rewbs.plugPresets +#define MED_MAX_COMMENT_LENGTH 5*1024 //I think 5kB should be enough, though I admit this is a guess. #define MOD_TYPE_NONE 0x00 #define MOD_TYPE_MOD 0x01 @@ -353,6 +354,15 @@ NUM_SRC_MODES }; +enum { + ENV_RESET_ALL, + ENV_RESET_VOL, + ENV_RESET_PAN, + ENV_RESET_PITCH, + ENV_RELEASE_NODE_UNSET=0xFF, + NOT_YET_RELEASED=-1 +}; + // Midi Continuous Controller Codes // http://www.borg.com/~jglatt/tech/midispec/ctllist.htm enum { @@ -537,6 +547,9 @@ BYTE nCutSwing; BYTE nResSwing; BYTE nFilterMode; + BYTE nPitchEnvReleaseNode; + BYTE nPanEnvReleaseNode; + BYTE nVolEnvReleaseNode; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // WHEN adding new members here, ALSO update Sndfile.cpp (instructions near the top of this file)! @@ -588,6 +601,7 @@ INSTRUMENTHEADER *pHeader; MODINSTRUMENT *pInstrument; DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; + LONG nVolEnvValueAtReleaseJump, nPanEnvValueAtReleaseJump, nPitchEnvValueAtReleaseJump; DWORD nMasterChn, nVUMeter; LONG nGlobalVol, nInsVol; LONG nFineTune, nTranspose; @@ -1153,6 +1167,10 @@ static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); UINT GetBestPlugin(UINT nChn, UINT priority, bool respectMutes); + + int getVolEnvValueFromPosition(int position, INSTRUMENTHEADER* penv); + void resetEnvelopes(MODCHANNEL* pChn, int envToReset = ENV_RESET_ALL); + void SetDefaultInstrumentValues(INSTRUMENTHEADER *penv); private: UINT __cdecl GetChannelPlugin(UINT nChan, bool respectMutes); UINT __cdecl GetActiveInstrumentPlugin(UINT nChan, bool respectMutes); @@ -1160,6 +1178,9 @@ void HandlePatternTransitionEvents(); void BuildDefaultInstrument(); + + + }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 15:51:24
|
Revision: 162 Author: rewbs Date: 2006-08-13 08:51:11 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=162&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2006-08-13 15:49:22 UTC (rev 161) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2006-08-13 15:51:11 UTC (rev 162) @@ -944,39 +944,30 @@ // Volume Envelope if ((pChn->dwFlags & CHN_VOLENV) && (penv->nVolEnv)) { - int envpos = pChn->nVolEnvPosition; - UINT pt = penv->nVolEnv - 1; - for (UINT i=0; i<(UINT)(penv->nVolEnv-1); i++) - { - if (envpos <= penv->VolPoints[i]) - { - pt = i; - break; + int envvol = getVolEnvValueFromPosition(pChn->nVolEnvPosition, penv); + + // if we are in the release portion of the envelope, + // rescale envelope factor so that it is proportional to the release point + // and release envelope beginning. + if (penv->nVolEnvReleaseNode != ENV_RELEASE_NODE_UNSET + && pChn->nVolEnvPosition>=penv->VolPoints[penv->nVolEnvReleaseNode] + && pChn->nVolEnvValueAtReleaseJump != NOT_YET_RELEASED) { + int envValueAtReleaseJump = pChn->nVolEnvValueAtReleaseJump; + int envValueAtReleaseNode = penv->VolEnv[penv->nVolEnvReleaseNode] << 2; + + //If we have just hit the release node, force the current env value + //to be that of the release node. This works around the case where + // we have another node at the same position as the release node. + if (pChn->nVolEnvPosition==penv->VolPoints[penv->nVolEnvReleaseNode]) { + envvol=envValueAtReleaseNode; } + + int relativeVolumeChange = (envvol-envValueAtReleaseNode)*2; + envvol = envValueAtReleaseJump + relativeVolumeChange; } - int x2 = penv->VolPoints[pt]; - int x1, envvol; - if (envpos >= x2) - { - envvol = penv->VolEnv[pt] << 2; - x1 = x2; - } else - if (pt) - { - envvol = penv->VolEnv[pt-1] << 2; - x1 = penv->VolPoints[pt-1]; - } else - { - envvol = 0; - x1 = 0; - } - if (envpos > x2) envpos = x2; - if ((x2 > x1) && (envpos > x1)) - { - envvol += ((envpos - x1) * (((int)penv->VolEnv[pt]<<2) - envvol)) / (x2 - x1); - } if (envvol < 0) envvol = 0; - if (envvol > 256) envvol = 256; + if (envvol > 512) + envvol = 512; vol = (vol * envvol) >> 8; } // Panning Envelope @@ -1698,6 +1689,41 @@ } +int CSoundFile::getVolEnvValueFromPosition(int position, INSTRUMENTHEADER* penv) +{ + UINT pt = penv->nVolEnv - 1; + for (UINT i=0; i<(UINT)(penv->nVolEnv-1); i++) + { + if (position <= penv->VolPoints[i]) + { + pt = i; + break; + } + } + int x2 = penv->VolPoints[pt]; + int x1, envvol; + if (position >= x2) + { + envvol = penv->VolEnv[pt] << 2; + x1 = x2; + } else + if (pt) + { + envvol = penv->VolEnv[pt-1] << 2; + x1 = penv->VolPoints[pt-1]; + } else + { + envvol = 0; + x1 = 0; + } + if (position > x2) position = x2; + if ((x2 > x1) && (position > x1)) + { + envvol += ((position - x1) * (((int)penv->VolEnv[pt]<<2) - envvol)) / (x2 - x1); + } + return envvol; +} + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 15:49:39
|
Revision: 161 Author: rewbs Date: 2006-08-13 08:49:22 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=161&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/fxp.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -623,19 +623,25 @@ SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont); SetFocus(); HMENU hMenu = ::CreatePopupMenu(); + + UINT nCurrentPattern = GetCurrentPattern(); + bool patternExists = (nCurrentPattern<MAX_PATTERNS + && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] != NULL); + DWORD greyed = patternExists?FALSE:MF_GRAYED; + if (hMenu) { AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns"); AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel"); AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern"); - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_COPY, "&Duplicate Pattern"); - AppendMenu(hMenu, MF_STRING, ID_PATTERNCOPY, "&Copy Pattern"); - AppendMenu(hMenu, MF_STRING, ID_PATTERNPASTE, "P&aste Pattern"); + AppendMenu(hMenu, MF_STRING|greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern"); + AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNCOPY, "&Copy Pattern"); + AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNPASTE, "P&aste Pattern"); if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); - AppendMenu(hMenu, MF_STRING, ID_PATTERN_PROPERTIES, "&Properties..."); + AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_PROPERTIES, "&Properties..."); } ClientToScreen(&pt); ::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -212,6 +212,7 @@ HPEN CMainFrame::penHalfDarkGray = NULL; HPEN CMainFrame::penSample = NULL; HPEN CMainFrame::penEnvelope = NULL; +HPEN CMainFrame::penEnvelopeHighlight = NULL; HPEN CMainFrame::penSeparator = NULL; HBRUSH CMainFrame::brushGray = NULL; HBRUSH CMainFrame::brushBlack = NULL; @@ -220,6 +221,7 @@ //CBrush *CMainFrame::pbrushWhite = NULL;//rewbs.envRowGrid HBRUSH CMainFrame::brushHighLight = NULL; +HBRUSH CMainFrame::brushHighLightRed = NULL; HBRUSH CMainFrame::brushWindow = NULL; HCURSOR CMainFrame::curDragging = NULL; HCURSOR CMainFrame::curArrow = NULL; @@ -767,6 +769,7 @@ DeleteGDIObject(penDarkGray); DeleteGDIObject(penSample); DeleteGDIObject(penEnvelope); + DeleteGDIObject(penEnvelopeHighlight); DeleteGDIObject(m_hFixedFont); DeleteGDIObject(penScratch); DeleteGDIObject(penGray00); @@ -1672,6 +1675,9 @@ penSample = ::CreatePen(PS_SOLID, 0, rgbCustomColors[MODCOLOR_SAMPLE]); if (penEnvelope) DeleteObject(penEnvelope); penEnvelope = ::CreatePen(PS_SOLID, 0, rgbCustomColors[MODCOLOR_ENVELOPES]); + if (penEnvelopeHighlight) DeleteObject(penEnvelopeHighlight); + penEnvelopeHighlight = ::CreatePen(PS_SOLID, 0, RGB(0xFF, 0xFF, 0x00)); + for (UINT i=0; i<NUM_VUMETER_PENS*2; i++) { int r0,g0,b0, r1,g1,b1; @@ -1718,8 +1724,11 @@ COLORREF crBkgnd = GetSysColor(COLOR_WINDOW); if (brushHighLight) DeleteObject(brushHighLight); brushHighLight = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); + if (brushHighLightRed) DeleteObject(brushHighLight); + brushHighLightRed = CreateSolidBrush(RGB(0xFF,0x00,0x00)); + if (brushWindow) DeleteObject(brushWindow); - brushWindow = CreateSolidBrush(crBkgnd); + brushWindow = CreateSolidBrush(crBkgnd); if (penSeparator) DeleteObject(penSeparator); penSeparator = CreatePen(PS_SOLID, 0, RGB(GetRValue(crBkgnd)/2, GetGValue(crBkgnd)/2, GetBValue(crBkgnd)/2)); } Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2006-08-13 15:49:22 UTC (rev 161) @@ -379,9 +379,9 @@ // GDI static HICON m_hIcon; static HFONT m_hGUIFont, m_hFixedFont, m_hLargeFixedFont; - static HBRUSH brushGray, brushBlack, brushWhite, brushHighLight, brushWindow; + static HBRUSH brushGray, brushBlack, brushWhite, brushHighLight, brushHighLightRed, brushWindow; // static CBrush *pbrushBlack, *pbrushWhite; - static HPEN penBlack, penDarkGray, penLightGray, penWhite, penHalfDarkGray, penSample, penEnvelope, penSeparator, penScratch, penGray00, penGray33, penGray40, penGray55, penGray80, penGray99, penGraycc, penGrayff; + static HPEN penBlack, penDarkGray, penLightGray, penWhite, penHalfDarkGray, penSample, penEnvelope, penEnvelopeHighlight, penSeparator, penScratch, penGray00, penGray33, penGray40, penGray55, penGray80, penGray99, penGraycc, penGrayff; static HCURSOR curDragging, curNoDrop, curArrow, curNoDrop2, curVSplit; static COLORREF rgbCustomColors[MAX_MODCOLORS]; static LPMODPLUGDIB bmpPatterns, bmpNotes, bmpVUMeters, bmpVisNode; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -786,9 +786,7 @@ pChn->nNewNote = note; if (nins) { //Set instrument - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + m_SndFile.resetEnvelopes(pChn); m_SndFile.InstrumentChange(pChn, nins); } else if ((nsmp) && (nsmp < MAX_SAMPLES)) { //Or set sample Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -1318,8 +1318,7 @@ penv->nGlobalVol = 64; penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + m_SndFile.SetDefaultInstrumentValues(penv); for (UINT n=0; n<128; n++) { penv->Keyboard[n] = nsample; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -2005,7 +2005,6 @@ Dispatch(effMainsChanged, 0, 1, NULL, 0.0f); // calls plugin's resume Dispatch(effStartProcess, 0, 0, NULL, 0.0f); m_bPlugResumed = true; -// ClearVSTEvents(); //DEBUG } catch (...) { CVstPluginManager::ReportPlugException("Exception in Resume() (Plugin=%s)\n", m_pFactory->szLibraryName); } @@ -2623,8 +2622,10 @@ dwMidiCode = 0x80|nCh|(vol<<16); //note off, on chan nCh; vol is note off velocity. for (UINT i=0; i<128; i++) //all notes { - pCh->uNoteOnMap[i][trackChannel]=0; - MidiSend(dwMidiCode|(i<<8)); + //if (!(m_pEffect->uniqueID==1413633619L) || pCh->uNoteOnMap[i][trackChannel]>0) { //only send necessary NOs for TBVS. + pCh->uNoteOnMap[i][trackChannel]=0; + MidiSend(dwMidiCode|(i<<8)); + //} } } Modified: trunk/OpenMPT/mptrack/fxp.cpp =================================================================== --- trunk/OpenMPT/mptrack/fxp.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/fxp.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -106,7 +106,7 @@ ChunkMagic == 'CcnK' && (fxMagic == 'FxCk' || fxMagic == 'FPCh'))) { - ::AfxMessageBox("Bad Magic."); + ::AfxMessageBox("Bad Magic number: this does not look like a preset file."); inStream.Close(); return false; } @@ -124,7 +124,7 @@ } } } - else if (fxMagic == 'FPCh') // load chunk list + else if (fxMagic == 'FPCh') // load chunk { if (!ReadLE(inStream, chunkSize)) { @@ -254,7 +254,7 @@ bool Cfxp::WriteLE(CFile &out, const long &l) { int size=sizeof(long); - long l2 = l; // maybe I should have made that arg a const.. + long l2 = l; if (NeedSwap()) SwapBytes(l2); out.Write(&l2, size); @@ -264,7 +264,7 @@ bool Cfxp::WriteLE(CFile &out, const float &f) { int size=sizeof(float); - float f2 = f; // maybe I should have made that arg a const.. + float f2 = f; if (NeedSwap()) SwapBytes(f2); out.Write(&f2, size); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/mptrack.rc 2006-08-13 15:49:22 UTC (rev 161) @@ -216,6 +216,8 @@ MENUITEM "C&arry envelope", ID_ENVELOPE_CARRY MENUITEM "&Insert Point", ID_ENVELOPE_INSERTPOINT MENUITEM "&Remove Point", ID_ENVELOPE_REMOVEPOINT + MENUITEM "&Toggle Release Node", ID_ENVELOPE_TOGGLERELEASENODE + MENUITEM SEPARATOR MENUITEM "&Copy envelope", ID_EDIT_COPY MENUITEM "&Paste envelope", ID_EDIT_PASTE @@ -1894,7 +1896,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,43 + FILEVERSION 1,17,2,44 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1912,9 +1914,9 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 43" + VALUE "FileVersion", "1, 17, 2, 44" VALUE "InternalName", "Modplug Tracker" - VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2005 GPL." + VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2007 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" VALUE "OriginalFilename", "mptrack.exe" VALUE "ProductName", "OpenMPT / ModPlug Tracker" @@ -2187,6 +2189,7 @@ "Display channel manager window\nChannel manager" ID_INDICATOR_CPU "-" ID_FILE_EXPORTCOMPAT "Export file to standard IT/XM." + ID_ENVELOPE_SETRELEASENODE "Set release node" END STRINGTABLE Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/resource.h 2006-08-13 15:49:22 UTC (rev 161) @@ -41,6 +41,7 @@ #define IDR_ENVELOPES 203 #define ID_INDICATOR_CPU 203 #define ID_FILE_EXPORTCOMPAT 204 +#define ID_ENVELOPE_SETRELEASENODE 205 #define IDB_MAINBAR 300 #define IDB_IMAGELIST 301 #define IDB_PATTERNS 302 @@ -943,6 +944,7 @@ #define ID_Menu 59200 #define ID_FILE_SAVECOMPAT 59202 #define ID_CLEANUP_PLUGS 59205 +#define ID_ENVELOPE_TOGGLERELEASENODE 59206 // Next default values for new objects // @@ -950,7 +952,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 510 -#define _APS_NEXT_COMMAND_VALUE 59206 +#define _APS_NEXT_COMMAND_VALUE 59207 #define _APS_NEXT_CONTROL_VALUE 2256 #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: <re...@us...> - 2006-08-13 09:07:42
|
Revision: 160 Author: rewbs Date: 2006-08-13 02:05:57 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=160&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version Modified: trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2006-08-13 09:05:14 UTC (rev 159) +++ trunk/OpenMPT/mptrack/bin/version 2006-08-13 09:05:57 UTC (rev 160) @@ -1 +1 @@ -1.17.02.43 \ No newline at end of file +1.17.02.44 \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 09:05:26
|
Revision: 159 Author: rewbs Date: 2006-08-13 02:05:14 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=159&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -1701,6 +1701,9 @@ penv->nDNA = DNA_NOTEFADE; penv->nResampling = SRCMODE_DEFAULT; penv->nFilterMode = FLTMODE_UNCHANGED; + penv->nPanEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + penv->nPitchEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + penv->nVolEnvReleaseNode=ENV_RELEASE_NODE_UNSET; pSndFile->Headers[nInstr] = penv; nSample = 1; UINT nLoadedSmp = 0; Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2006-08-13 09:05:14 UTC (rev 159) @@ -167,8 +167,7 @@ else penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT i=0; i<120; i++) { penv->Keyboard[i] = nsmp; Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -366,8 +366,7 @@ penv->nGlobalVol = 64; penv->nPan = 128; penv->nPPC = 60; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); Headers[nIns] = penv; if (insnamelen) { Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -331,8 +331,7 @@ memcpy(penv->name, lpStream+dwPos+2, 32); penv->nGlobalVol = 64; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (j=0; j<lpStream[dwPos+1]; j++) { const BYTE *ps = lpStream+dwPos+34+14*j; Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -696,11 +696,13 @@ // Song Comments UINT annotxt = BigEndian(pmex->annotxt); UINT annolen = BigEndian(pmex->annolen); - if ((annotxt) && (annolen) && (annotxt+annolen <= dwMemLength)) - { + annolen = min(annolen, MED_MAX_COMMENT_LENGTH); //Thanks to Luigi Auriemma for pointing out an overflow risk + if ((annotxt) && (annolen) && (annotxt+annolen <= dwMemLength) ) { m_lpszSongComments = new char[annolen+1]; - memcpy(m_lpszSongComments, lpStream+annotxt, annolen); - m_lpszSongComments[annolen] = 0; + if (m_lpszSongComments) { + memcpy(m_lpszSongComments, lpStream+annotxt, annolen); + m_lpszSongComments[annolen] = 0; + } } // Song Name UINT songname = BigEndian(pmex->songname); Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -424,8 +424,7 @@ penv->nNNA = NNA_NOTEOFF; penv->nDCT = (nChannel == MIDI_DRUMCHANNEL) ? DCT_SAMPLE : DCT_NOTE; penv->nDNA = DNA_NOTEFADE; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT j=0; j<120; j++) { int mapnote = j+1; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -385,8 +385,7 @@ penv->nFadeOut = xmsh.volfade; penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); if (xmsh.vtype & 1) penv->dwFlags |= ENV_VOLUME; if (xmsh.vtype & 2) penv->dwFlags |= ENV_VOLSUSTAIN; if (xmsh.vtype & 4) penv->dwFlags |= ENV_VOLLOOP; Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -82,8 +82,7 @@ penv->nGlobalVol = 64; penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT iinit=0; iinit<128; iinit++) { penv->Keyboard[iinit] = nSample; @@ -1167,8 +1166,7 @@ if (penv->nPanLoopStart >= penv->nPanLoopEnd) penv->dwFlags &= ~ENV_PANLOOP; penv->nGlobalVol = 64; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT ienv=0; ienv<12; ienv++) { penv->VolPoints[ienv] = (WORD)pih->venv[ienv*2]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 09:04:46
|
Revision: 158 Author: rewbs Date: 2006-08-13 02:04:37 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=158&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Load_it.cpp Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-06-20 00:44:57 UTC (rev 157) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-08-13 09:04:37 UTC (rev 158) @@ -211,8 +211,7 @@ penv->nVolSwing = pis->rv; penv->nPanSwing = pis->rp; penv->nPan = (pis->dfp & 0x7F) << 2; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); if (penv->nPan > 256) penv->nPan = 128; if (pis->dfp < 0x80) penv->dwFlags |= ENV_SETPANNING; } @@ -249,8 +248,10 @@ streamPos += sizeof(DWORD); // name string - memcpy(&m_szNames[0],lpStream+streamPos,len); - streamPos += len; + if (streamPos+len<=dwMemLength && len<MAX_SAMPLES*32) { + memcpy(&m_szNames[0],lpStream+streamPos,len); + streamPos += len; + } // Song comments @@ -260,11 +261,15 @@ // allocate comment string if(m_lpszSongComments) delete m_lpszSongComments; - m_lpszSongComments = new char[id]; + if (id<dwMemLength) { + m_lpszSongComments = new char[id]; + } // m_lpszSongComments - if(id) memcpy(&m_lpszSongComments[0],lpStream+streamPos,id); - streamPos += id; + if (m_lpszSongComments && id && streamPos+id<=dwMemLength) { + memcpy(&m_lpszSongComments[0],lpStream+streamPos,id); + streamPos += id; + } // Song global config @@ -326,8 +331,10 @@ streamPos += sizeof(DWORD); // ChnSettings[i].szName - memcpy(&ChnSettings[i].szName[0],lpStream+streamPos,len); - streamPos += len; + if (streamPos+len<=dwMemLength && len<MAX_CHANNELNAME) { + memcpy(&ChnSettings[i].szName[0],lpStream+streamPos,len); + streamPos += len; + } } // Song mix plugins @@ -346,8 +353,10 @@ streamPos += sizeof(DWORD); // midi cfg - memcpy(&m_MidiCfg,lpStream+streamPos,id); - streamPos += id; + if (id<=sizeof(m_MidiCfg) && id+streamPos<=dwMemLength) { + memcpy(&m_MidiCfg,lpStream+streamPos,id); + streamPos += id; + } // Song Instruments @@ -363,8 +372,10 @@ // instruments' paths for(i=0; i<m_nInstruments; i++){ - memcpy(&m_szInstrumentPath[i][0],lpStream+streamPos,len); - streamPos += len; + if (len+streamPos<=dwMemLength && len<_MAX_PATH) { + memcpy(&m_szInstrumentPath[i][0],lpStream+streamPos,len); + streamPos += len; + } } // Song Orders @@ -375,8 +386,11 @@ streamPos += sizeof(DWORD); // order data - memcpy(&Order[0],lpStream+streamPos,size); - streamPos += size; + if (size+streamPos<=dwMemLength && size<MAX_ORDERS) { + memcpy(&Order[0],lpStream+streamPos,size); + streamPos += size; + } + // Song Patterns @@ -427,8 +441,11 @@ } // Pattern data - memcpy(Patterns[npat],lpStream+streamPos,m_nChannels * PatternSize[npat] * n); - streamPos += m_nChannels * PatternSize[npat] * n; + long datasize = m_nChannels * PatternSize[npat] * n; + if (streamPos+datasize<=dwMemLength) { + memcpy(Patterns[npat],lpStream+streamPos,datasize); + streamPos += datasize; + } } } @@ -3002,7 +3019,8 @@ void CSoundFile::SaveExtendedInstrumentProperties(INSTRUMENTHEADER *instruments[], UINT nInstruments, FILE* f) //------------------------------------------------------------------------------------------------------------ -// Used only when saving IT and XM. ITI, ITP saves using Ericus' macros etc... +// Used only when saving IT and XM. +// ITI, ITP saves using Ericus' macros etc... // The reason is that ITs and XMs save [code][size][ins1.Value][ins2.Value]... // whereas ITP saves [code][size][ins1.Value][code][size][ins2.Value]... // too late to turn back.... @@ -3029,6 +3047,9 @@ WriteInstrumentPropertyForAllInstruments('CS..', sizeof(m_defaultInstrument.nCutSwing), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('RS..', sizeof(m_defaultInstrument.nResSwing), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('FM..', sizeof(m_defaultInstrument.nFilterMode), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('PERN', sizeof(m_defaultInstrument.nPitchEnvReleaseNode ), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('AERN', sizeof(m_defaultInstrument.nPanEnvReleaseNode), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('VERN', sizeof(m_defaultInstrument.nVolEnvReleaseNode), f, instruments, nInstruments); return; } @@ -3134,4 +3155,5 @@ return; -} \ No newline at end of file +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-06-20 00:47:14
|
Revision: 157 Author: rewbs Date: 2006-06-19 17:44:57 -0700 (Mon, 19 Jun 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=157&view=rev Log Message: ----------- . v1.17.02.43 + <rewbs> You can now load up new plugins from anywhere, not just the General tab. Select "Plugin Manager..." from the view menu. This can also be assigned to a global hotkey. Limitation: currently plugins added to a song in this manner with always be put in the first empty slot. In a future version you'll be able to choose the slot directly from that window. + <rewbs> "Cleanup Plugins" to remove any plugs that are not associated to a channel and not used by an instrument and not used as an output for any used plugs. . <rewbs> Fixed channel limits. Should be able to correctly save IT pattern data with up to 127 chans. There's only space for 64 channel headers though (channel names etc..). XMs restricted to 64 chans. . <rewbs> Added channel limit check when adding chans from the pattern editor. . <rewbs> Fixed instant crash with SampleTank 2.1. Modified Paths: -------------- trunk/OpenMPT/mptrack/Childfrm.cpp trunk/OpenMPT/mptrack/Childfrm.h trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h 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/View_gen.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/History.txt trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Childfrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Childfrm.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -220,7 +220,18 @@ return TRUE; } +void CChildFrame::ForceRefresh() +//------------------------------ +{ + CModControlView *pModView; + if ((pModView = (CModControlView *)m_wndSplitter.GetPane(0, 0)) != NULL) + { + pModView->ForceRefresh(); + } + return; +} + void CChildFrame::SavePosition(BOOL bForce) //----------------------------------------- { Modified: trunk/OpenMPT/mptrack/Childfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Childfrm.h 2006-06-20 00:44:57 UTC (rev 157) @@ -102,6 +102,7 @@ // Operations public: BOOL ChangeViewClass(CRuntimeClass* pNewViewClass, CCreateContext* pContext=NULL); + void ForceRefresh(); void SavePosition(BOOL bExit=FALSE); CHAR* GetCurrentViewClassName(); //rewbs.varWindowSize LRESULT SendViewMessage(UINT uMsg, LPARAM lParam=0) const; Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -2050,7 +2050,7 @@ commands[kcNoteOffOld].Message = "Note off (don't remember instrument)"; commands[kcViewAddPlugin].UID = 1669; - commands[kcViewAddPlugin].Message = "View 'Add Plugin' Window"; + commands[kcViewAddPlugin].Message = "View Plugin Manager"; commands[kcViewAddPlugin].isHidden = false; commands[kcViewAddPlugin].isDummy = false; Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -134,6 +134,7 @@ if (m_pModDoc) m_pModDoc->SetFollowWnd(m_hWnd, MPTNOTIFY_MASTERVU); if (pMainFrm) pMainFrm->SetFollowSong(m_pModDoc, m_hWnd, TRUE, MPTNOTIFY_MASTERVU); CMainFrame::EnableLowLatencyMode(FALSE); + PostViewMessage(VIEWMSG_SETACTIVE, NULL); SetFocus(); } Modified: trunk/OpenMPT/mptrack/Globals.cpp =================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Globals.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -272,6 +272,18 @@ } +void CModControlView::ForceRefresh() +//--------------------------------- +{ + SetActivePage(GetActivePage()); +} + +int CModControlView::GetActivePage() +//----------------------------------- +{ + return m_nActiveDlg; +} + BOOL CModControlView::SetActivePage(int nIndex, LPARAM lParam) //------------------------------------------------------------ { Modified: trunk/OpenMPT/mptrack/Globals.h =================================================================== --- trunk/OpenMPT/mptrack/Globals.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Globals.h 2006-06-20 00:44:57 UTC (rev 157) @@ -143,11 +143,13 @@ void InstrumentChanged(int nInstr=-1) { m_nInstrumentChanged = nInstr; } int GetInstrumentChange() const { return m_nInstrumentChanged; } void SetMDIParentFrame(HWND hwnd) { m_hWndMDI = hwnd; } + void ForceRefresh(); protected: void RecalcLayout(); void UpdateView(DWORD dwHintMask=0, CObject *pHint=NULL); BOOL SetActivePage(int nIndex=-1, LPARAM lParam=-1); + int GetActivePage(); //{{AFX_VIRTUAL(CModControlView) public: Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -67,7 +67,7 @@ // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" - ON_COMMAND(ID_PLUGIN_SETUP, OnPluginSetup) + ON_COMMAND(ID_PLUGIN_SETUP, OnPluginManager) // -! NEW_FEATURE#0002 // -> CODE#0015 @@ -2304,10 +2304,31 @@ // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" -void CMainFrame::OnPluginSetup() +void CMainFrame::OnPluginManager() { - CSelectPluginDlg dlg(NULL, GetActiveDoc(), this); + int nPlugslot=-1; + CModDoc* pModDoc = GetActiveDoc(); + + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + //Find empty plugin slot + for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { + PSNDMIXPLUGIN pCandidatePlugin = &pSndFile->m_MixPlugins[nPlug]; + if (pCandidatePlugin->pMixPlugin == NULL) { + nPlugslot=nPlug; + break; + } + } + } + CSelectPluginDlg dlg(GetActiveDoc(), nPlugslot, this); dlg.DoModal(); + if (pModDoc) { + //Refresh views + pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS|HINT_MODTYPE); + //Refresh Controls + CChildFrame *pActiveChild = (CChildFrame *)MDIGetActive(); + pActiveChild->ForceRefresh(); + } } // -! NEW_FEATURE#0002 @@ -2696,7 +2717,7 @@ case kcFileOpen: theApp.OnFileOpen(); break; case kcMidiRecord: OnMidiRecord(); break; case kcHelp: CMDIFrameWnd::OnHelp(); break; - case kcViewAddPlugin: OnPluginSetup(); break; + case kcViewAddPlugin: OnPluginManager(); break; case kcViewChannelManager: OnChannelManager(); break; case kcNextDocument: MDINext(); break; case kcPrevDocument: MDIPrev(); break; Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2006-06-20 00:44:57 UTC (rev 157) @@ -588,7 +588,7 @@ // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" - afx_msg void OnPluginSetup(); + afx_msg void OnPluginManager(); // -! NEW_FEATURE#0002 // -> CODE#0015 Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -46,6 +46,7 @@ ON_COMMAND(ID_INSERT_INSTRUMENT, OnInsertInstrument) ON_COMMAND(ID_CLEANUP_SAMPLES, OnCleanupSamples) ON_COMMAND(ID_CLEANUP_INSTRUMENTS, OnCleanupInstruments) + ON_COMMAND(ID_CLEANUP_PLUGS, OnCleanupPlugs) ON_COMMAND(ID_CLEANUP_PATTERNS, OnCleanupPatterns) ON_COMMAND(ID_CLEANUP_SONG, OnCleanupSong) ON_COMMAND(ID_CLEANUP_REARRANGE, OnRearrangePatterns) @@ -1770,7 +1771,17 @@ ShowLog("Instrument Cleanup", CMainFrame::GetMainFrame()); } +void CModDoc::OnCleanupPlugs() +//---------------------------------- +{ + ClearLog(); + RemoveUnusedPlugs(); + UpdateAllViews(NULL, HINT_MODTYPE); + ShowLog("Plugin Cleanup", CMainFrame::GetMainFrame()); +} + + void CModDoc::OnCleanupPatterns() //------------------------------- { @@ -1788,6 +1799,7 @@ RemoveUnusedPatterns(); RemoveUnusedInstruments(); RemoveUnusedSamples(); + RemoveUnusedPlugs(); UpdateAllViews(NULL, HINT_MODTYPE|HINT_MODSEQUENCE); ShowLog("Song Cleanup", CMainFrame::GetMainFrame()); } Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Moddoc.h 2006-06-20 00:44:57 UTC (rev 157) @@ -147,6 +147,7 @@ BOOL ConvertInstrumentsToSamples();; BOOL RemoveUnusedSamples(); BOOL RemoveUnusedInstruments(); + BOOL RemoveUnusedPlugs(); BOOL RemoveUnusedPatterns(BOOL bRemove=TRUE); LONG InsertPattern(LONG nOrd=-1, UINT nRows=64); LONG InsertSample(BOOL bLimit=FALSE); @@ -274,6 +275,7 @@ afx_msg void OnInsertInstrument(); afx_msg void OnCleanupSamples(); afx_msg void OnCleanupInstruments(); + afx_msg void OnCleanupPlugs(); afx_msg void OnCleanupPatterns(); afx_msg void OnCleanupSong(); afx_msg void OnRearrangePatterns(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -324,7 +324,24 @@ BOOL CModDoc::ChangeNumChannels(UINT nNewChannels) //------------------------------------------------ { - if (nNewChannels == m_SndFile.m_nChannels) return TRUE; + int maxChans; + if (m_SndFile.m_nType&MOD_TYPE_IT) { + maxChans=max_chans_IT; + } else if (m_SndFile.m_nType&MOD_TYPE_XM) { + maxChans=max_chans_XM; + } else if (m_SndFile.m_nType&MOD_TYPE_S3M) { + maxChans=max_chans_S3M; + } else { + maxChans=max_chans_MOD; + } + if (nNewChannels > maxChans) { + CString error; + error.Format("Error: Max number of channels for this type is %d", maxChans); + ::AfxMessageBox(error, MB_OK|MB_ICONEXCLAMATION); + return FALSE; + } + + if (nNewChannels == m_SndFile.m_nChannels) return FALSE; if (nNewChannels < m_SndFile.m_nChannels) { UINT nChnToRemove = 0; @@ -363,7 +380,7 @@ if ((--nFound) == 0) break; } } - if (rem.DoModal() != IDOK) return TRUE; + if (rem.DoModal() != IDOK) return FALSE; // Removing selected channels RemoveChannels(rem.m_bChnMask); } else @@ -379,7 +396,7 @@ { END_CRITICAL(); AddToLog("ERROR: Not enough memory to create new channels!\nPattern Data is corrupted!\n"); - return TRUE; + return FALSE; } for (UINT j=0; j<m_SndFile.PatternSize[i]; j++) { @@ -395,7 +412,7 @@ SetModified(); ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE); - return FALSE; + return TRUE; } @@ -841,7 +858,83 @@ return FALSE; } +BOOL CModDoc::RemoveUnusedPlugs() +//------------------------------- +{ + BYTE usedmap[MAX_MIXPLUGINS]; + memset(usedmap, false, MAX_MIXPLUGINS); + + for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { + + //Is the plugin assigned to a channel? + for (int nChn=0; nChn<m_SndFile.m_nChannels; nChn++) { + if (m_SndFile.ChnSettings[nChn].nMixPlugin == nPlug+1) { + usedmap[nPlug]=true; + break; + } + } + + //Is the plugin used by an instrument? + for (int nIns=1; nIns<=m_SndFile.m_nInstruments; nIns++) { + if (m_SndFile.Headers[nIns] && (m_SndFile.Headers[nIns]->nMixPlug == nPlug+1)) { + usedmap[nPlug]=true; + break; + } + } + + //Is the plugin assigned to master? + if (m_SndFile.m_MixPlugins[nPlug].Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) { + usedmap[nPlug]=true; + } + + //all outputs of used plugins count as used + if (usedmap[nPlug]==true) { + if (m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) { + int output = m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x7f; + usedmap[output]=true; + } + } + + } + + //Remove unused plugins + int nRemoved=0; + for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { + SNDMIXPLUGIN* pPlug = &m_SndFile.m_MixPlugins[nPlug]; + if (usedmap[nPlug] || !pPlug) { + Log("Keeping mixplug addess (%d): %X\n", nPlug, &(pPlug->pMixPlugin)); + continue; + } + + if (pPlug->pPluginData) { + delete pPlug->pPluginData; + pPlug->pPluginData = NULL; + } + if (pPlug->pMixPlugin) { + pPlug->pMixPlugin->Release(); + pPlug->pMixPlugin=NULL; + } + if (pPlug->pMixState) { + delete pPlug->pMixState; + } + + memset(&(pPlug->Info), 0, sizeof(SNDMIXPLUGININFO)); + Log("Zeroing range (%d) %X - %X\n", nPlug, &(pPlug->Info), &(pPlug->Info)+sizeof(SNDMIXPLUGININFO)); + pPlug->nPluginDataSize=0; + pPlug->fDryRatio=0; + pPlug->defaultProgram=0; + nRemoved++; + + } + + if (nRemoved) { + SetModified(); + } + + return nRemoved; +} + BOOL CModDoc::RemoveUnusedInstruments() //------------------------------------- { Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -1212,8 +1212,7 @@ if ((pModDoc) && (m_nCurrentPlugin < MAX_MIXPLUGINS)) { CSoundFile *pSndFile = pModDoc->GetSoundFile(); - PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[m_nCurrentPlugin]; - CSelectPluginDlg dlg(pPlugin, pModDoc, this); //rewbs.plugDocAware + CSelectPluginDlg dlg(pModDoc, m_nCurrentPlugin, this); if (dlg.DoModal() == IDOK) { if (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -2401,16 +2401,17 @@ BeginWaitCursor(); //First adding channel as the last channel... - pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1); - pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); - //...and then moving it to right position. - pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); + if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { + pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); + //...and then moving it to right position. + pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); - pModDoc->SetModified(); - pModDoc->ClearUndo(); - pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); //refresh channel headers - pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); //updates(?) the channel number to general tab display - SetCurrentPattern(m_nPattern); + pModDoc->SetModified(); + pModDoc->ClearUndo(); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); //refresh channel headers + pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); //updates(?) the channel number to general tab display + SetCurrentPattern(m_nPattern); + } EndWaitCursor(); } @@ -2424,15 +2425,16 @@ if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; BeginWaitCursor(); - pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1); - pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); - pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); + if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { + pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); + pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); - pModDoc->SetModified(); - pModDoc->ClearUndo(); - pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); - pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); - SetCurrentPattern(m_nPattern); + pModDoc->SetModified(); + pModDoc->ClearUndo(); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); + pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); + SetCurrentPattern(m_nPattern); + } EndWaitCursor(); } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -999,11 +999,19 @@ } -CSelectPluginDlg::CSelectPluginDlg(PSNDMIXPLUGIN pPlugin, CModDoc *pModDoc, CWnd *parent):CDialog(IDD_SELECTMIXPLUGIN, parent) +CSelectPluginDlg::CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent):CDialog(IDD_SELECTMIXPLUGIN, parent) //---------------------------------------------------------------------------------------------------------- { - m_pModDoc = pModDoc; //rewbs.plugDocAware - m_pPlugin = pPlugin; + m_pPlugin = NULL; + m_pModDoc = pModDoc; + m_nPlugSlot = nPlugSlot; + + if (m_pModDoc) { + CSoundFile* pSndFile = pModDoc->GetSoundFile(); + if (pSndFile && (0<=m_nPlugSlot && m_nPlugSlot<MAX_MIXPLUGINS)) { + m_pPlugin = &pSndFile->m_MixPlugins[m_nPlugSlot]; + } + } } @@ -1016,6 +1024,15 @@ CDialog::OnInitDialog(); m_treePlugins.ModifyStyle(dwRemove, dwAdd); m_treePlugins.SetImageList(CMainFrame::GetMainFrame()->GetImageList(), TVSIL_NORMAL); + + if (m_pPlugin) { + CString targetSlot; + targetSlot.Format("Put in FX%02d", m_nPlugSlot+1); + SetDlgItemText(IDOK, targetSlot); + ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), TRUE); + } else { + ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), FALSE); + } MoveWindow(CMainFrame::GetMainFrame()->gnPlugWindowX, CMainFrame::GetMainFrame()->gnPlugWindowY, @@ -1065,7 +1082,7 @@ { // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" - if(m_pPlugin == NULL) { CDialog::OnOK(); return; } + if(m_pPlugin==NULL) { CDialog::OnOK(); return; } // -! NEW_FEATURE#0002 BOOL bChanged = FALSE; @@ -1371,11 +1388,11 @@ if (m_treePlugins) { m_treePlugins.MoveWindow(11,11, cx-105, cy-40, FALSE); - ::MoveWindow(GetDlgItem(IDC_TEXT1)->m_hWnd, 11,cy-25, cx-22, 25, FALSE); - ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 11, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_TEXT1)->m_hWnd, 11,cy-25, cx-22, 25, FALSE); + ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 11, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); Invalidate(); } } @@ -1508,8 +1525,8 @@ } Dispatch(effMainsChanged, 0, 1, NULL, 0.0f); - m_nInputs = (m_pEffect->numInputs < 16) ? m_pEffect->numInputs : 16; - m_nOutputs = (m_pEffect->numOutputs < 16) ? m_pEffect->numOutputs : 16; + m_nInputs = m_pEffect->numInputs; + m_nOutputs = m_pEffect->numOutputs; m_pInputs = (float **)new char[m_nInputs*sizeof(float *)]; m_pOutputs = (float **)new char[m_nOutputs*sizeof(float *)]; m_pTempBuffer = (float **)new char[m_nOutputs*sizeof(float *)]; //rewbs.dryRatio @@ -2052,6 +2069,50 @@ m_pMixStruct->fDryRatio = 1.0-(static_cast<float>(param)/127.0f); } +/* +void CVstPlugin::Process(float **pOutputs, unsigned long nSamples) +//---------------------------------------------------------------- +{ + float wetRatio, dryRatio; + wetRatio *= m_fGain; + dryRatio *= m_fGain; + + ProcessVSTEvents(); + if ((m_pEffect) && (m_pProcessFP) && (m_pInputs) && (m_pOutputs) && (m_pMixStruct)) { + + //Merge stereo input before sending to the plug if the plug can only handle one input. + if (m_pEffect->numInputs == 1) { + for (UINT i=0; i<nSamples; i++) { + m_pInputs[0][i] = 0.5f*m_pInputs[0][i] + 0.5f*m_pInputs[1][i]; + } + } + + //Clear the buffers that will be receiving the plugin's output. + for (UINT iOut=0; iOut<m_nOutputs; iOut++) { + memset(m_pTempBuffer[iOut], 0, nSamples*sizeof(float)); + m_pOutputs[iOut] = m_pTempBuffer[iOut]; + } + + //Do the VST processing magic + m_dwTimeAtStartOfProcess = timeGetTime(); + try { + ASSERT(nSamples<=MIXBUFFERSIZE); + m_pProcessFP(m_pEffect, m_pInputs, m_pOutputs, nSamples); + } catch (char * str) { + m_pMixStruct->Info.dwInputRouting |= MIXPLUG_INPUTF_BYPASS; + CString processMethod = (m_pEffect->flags & effFlagsCanReplacing) ? "processReplacing" : "process"; + CVstPluginManager::ReportPlugException("The plugin %s threw an exception in %s: %s. It has automatically been set to \"Bypass\".", m_pMixStruct->Info.szName, processMethod, str); + ClearVSTEvents(); + SetEvent(processCalled); + } + + for(UINT i=0; i<nSamples; i++) { + pOutL[stream][i] += m_pTempBuffer[stream][i]*wetRatio + m_pInputs[stream%2][i]*dryRatio; + } + + } +} +*/ void CVstPlugin::Process(float *pOutL, float *pOutR, unsigned long nSamples) //-------------------------------------------------------------------------- { @@ -2080,7 +2141,7 @@ //RecalculateGain(); - //Merge stereo before sending to the plug if it is mono + //Merge stereo input before sending to the plug if the plug can only handle one input. if (m_pEffect->numInputs == 1) { for (UINT i=0; i<nSamples; i++) { Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Vstplug.h 2006-06-20 00:44:57 UTC (rev 157) @@ -228,12 +228,13 @@ //==================================== { protected: + int m_nPlugSlot; PSNDMIXPLUGIN m_pPlugin; CModDoc *m_pModDoc; CTreeCtrl m_treePlugins; public: - CSelectPluginDlg(PSNDMIXPLUGIN, CModDoc *pModDoc, CWnd *parent); //rewbs.plugDocAware + CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent); //rewbs.plugDocAware VOID DoClose(); VOID UpdatePluginsList(DWORD forceSelect=0); bool VerifyPlug(PVSTPLUGINLIB plug); Modified: trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/bin/version 2006-06-20 00:44:57 UTC (rev 157) @@ -1 +1 @@ -1.17.02.42 \ No newline at end of file +1.17.02.43 \ No newline at end of file Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -381,6 +381,25 @@ return FALSE; } + int sel = m_ChannelsBox.GetItemData(m_ChannelsBox.GetCurSel()); + int type = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()); + int maxChans; + if (type&MOD_TYPE_IT) { + maxChans=max_chans_IT; + } else if (type&MOD_TYPE_XM) { + maxChans=max_chans_XM; + } else if (type&MOD_TYPE_S3M) { + maxChans=max_chans_S3M; + } else { + maxChans=max_chans_MOD; + } + if (sel > maxChans) { + CString error; + error.Format("Error: Max number of channels for this type is %d", maxChans); + ::AfxMessageBox(error, MB_OK|MB_ICONEXCLAMATION); + return FALSE; + } + return TRUE; } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/mptrack.rc 2006-06-20 00:44:57 UTC (rev 157) @@ -145,6 +145,7 @@ MENUITEM "Cleanup S&ong", ID_CLEANUP_SONG MENUITEM "Remove &All Instruments", ID_INSTRUMENTS_REMOVEALL MENUITEM "Rearrange Samples", ID_REARRANGE_SAMPLES + MENUITEM "Cleanup &Plugins", ID_CLEANUP_PLUGS END MENUITEM SEPARATOR MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND @@ -1588,11 +1589,11 @@ CAPTION "Mix Plugins" FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - DEFPUSHBUTTON "OK",IDOK,161,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,161,24,50,14 + DEFPUSHBUTTON "Add to Song",IDOK,161,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,161,132,50,14 LTEXT "",IDC_TEXT1,7,151,204,8 - PUSHBUTTON "Add Plugin...",IDC_BUTTON1,161,115,50,14 - PUSHBUTTON "Remove",IDC_BUTTON2,161,132,50,14 + PUSHBUTTON "New plugin...",IDC_BUTTON1,161,46,50,14,BS_MULTILINE + PUSHBUTTON "Remove",IDC_BUTTON2,161,63,50,14 CONTROL "Tree1",IDC_TREE1,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_TABSTOP,7,7,148,140, WS_EX_CLIENTEDGE @@ -1893,7 +1894,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,42 + FILEVERSION 1,17,2,43 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1911,7 +1912,7 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 42" + VALUE "FileVersion", "1, 17, 2, 43" VALUE "InternalName", "Modplug Tracker" VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2005 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2006-06-20 00:44:57 UTC (rev 157) @@ -807,6 +807,70 @@ </Filter> </Filter> <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"> + <File + RelativePath="res\bitmap1.bmp"> + </File> + <File + RelativePath=".\res\colors.bmp"> + </File> + <File + RelativePath=".\res\dragging.cur"> + </File> + <File + RelativePath=".\Res\envbar.bmp"> + </File> + <File + RelativePath=".\res\img_list.bmp"> + </File> + <File + RelativePath=".\res\mainbar.bmp"> + </File> + <File + RelativePath=".\res\moddoc.ico"> + </File> + <File + RelativePath=".\res\modplthingmorecontrast.bmp"> + </File> + <File + RelativePath=".\res\MPTRACK.bmp"> + </File> + <File + RelativePath=".\res\mptrack.ico"> + </File> + <File + RelativePath=".\res\mptrack.rc2"> + </File> + <File + RelativePath=".\Res\nodrag.cur"> + </File> + <File + RelativePath=".\res\nodrop.cur"> + </File> + <File + RelativePath=".\res\patterns.bmp"> + </File> + <File + RelativePath=".\res\rt_manif.bin"> + </File> + <File + RelativePath=".\Res\smptoolb.bmp"> + </File> + <File + RelativePath=".\Res\splash.bmp"> + </File> + <File + RelativePath=".\res\splashno.bmp"> + </File> + <File + RelativePath=".\res\view_pat.bmp"> + </File> + <File + RelativePath=".\res\vumeters.bmp"> + </File> + </Filter> + <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl"> <File @@ -966,70 +1030,6 @@ RelativePath="..\soundlib\WindowedFIR.h"> </File> </Filter> - <Filter - Name="Resource Files" - Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"> - <File - RelativePath="res\bitmap1.bmp"> - </File> - <File - RelativePath=".\res\colors.bmp"> - </File> - <File - RelativePath=".\res\dragging.cur"> - </File> - <File - RelativePath=".\Res\envbar.bmp"> - </File> - <File - RelativePath=".\res\img_list.bmp"> - </File> - <File - RelativePath=".\res\mainbar.bmp"> - </File> - <File - RelativePath=".\res\moddoc.ico"> - </File> - <File - RelativePath=".\res\modplthingmorecontrast.bmp"> - </File> - <File - RelativePath=".\res\MPTRACK.bmp"> - </File> - <File - RelativePath=".\res\mptrack.ico"> - </File> - <File - RelativePath=".\res\mptrack.rc2"> - </File> - <File - RelativePath=".\Res\nodrag.cur"> - </File> - <File - RelativePath=".\res\nodrop.cur"> - </File> - <File - RelativePath=".\res\patterns.bmp"> - </File> - <File - RelativePath=".\res\rt_manif.bin"> - </File> - <File - RelativePath=".\Res\smptoolb.bmp"> - </File> - <File - RelativePath=".\Res\splash.bmp"> - </File> - <File - RelativePath=".\res\splashno.bmp"> - </File> - <File - RelativePath=".\res\view_pat.bmp"> - </File> - <File - RelativePath=".\res\vumeters.bmp"> - </File> - </Filter> <File RelativePath=".\mptrack.reg"> </File> Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/resource.h 2006-06-20 00:44:57 UTC (rev 157) @@ -942,6 +942,7 @@ #define ID_PATTERN_REMOVECHANNELDIALOG 59151 #define ID_Menu 59200 #define ID_FILE_SAVECOMPAT 59202 +#define ID_CLEANUP_PLUGS 59205 // Next default values for new objects // @@ -949,8 +950,8 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 510 -#define _APS_NEXT_COMMAND_VALUE 59203 -#define _APS_NEXT_CONTROL_VALUE 2255 +#define _APS_NEXT_COMMAND_VALUE 59206 +#define _APS_NEXT_CONTROL_VALUE 2256 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/packageTemplate/History.txt =================================================================== --- trunk/OpenMPT/packageTemplate/History.txt 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/packageTemplate/History.txt 2006-06-20 00:44:57 UTC (rev 157) @@ -8,6 +8,14 @@ ?: other (tx XYZ): thanks to XYZ for telling me about the bug +. v1.17.02.43 + + <rewbs> You can now load up new plugins from anywhere, not just the General tab. Select "Plugin Manager..." from the view menu. This can also be assigned to a global hotkey. + Limitation: currently plugins added to a song in this manner with always be put in the first empty slot. In a future version you'll be able to choose the slot directly from that window. + + <rewbs> "Cleanup Plugins" to remove any plugs that are not associated to a channel and not used by an instrument and not used as an output for any used plugs. + . <rewbs> Fixed channel limits. Should be able to correctly save IT pattern data with up to 127 chans. There's only space for 64 channel headers though (channel names etc..). XMs restricted to 64 chans. + . <rewbs> Added channel limit check when adding chans from the pattern editor. + . <rewbs> Fixed instant crash with SampleTank 2.1. + . v1.17.02.42 + <rewbs> "Compatibility export" in file menu: save as 'plain' IT, without all of OpenMPT's crap. IT only for now (not XM). . <rewbs> Set instrument in pattern editor should work when no note is specified (tx Torvus - http://lpchip.com/modplug/viewtopic.php?t=470) @@ -22,6 +30,7 @@ . <rewbs> Fixed the following settings that were not saving correctly: mod document window status, row spacing, channel VU meters, channel effect visibility, Most recent files list, Toolbar settings. . <rewbs> Process priority no longer defaults to high. + . v 1.17.02.40 + <Relabsoluness> Added indicator of currently playing pattern to orderlist. + <Relabsoluness> 'Loop pattern' and 'follow song' keys should now work when orderlist has focus. Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb =================================================================== --- trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2006-06-20 00:44:57 UTC (rev 157) @@ -280,3 +280,5 @@ //----( Instrument Context [top] (17) )------------ //----( Comments Context [top] (18) )------------ + +//----( Unknown Context (19) )------------ Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -1847,6 +1847,19 @@ } } + /* + if (pPlugin->multiRouting) { + int nOutput=0; + for (int nOutput=0; nOutput<pPlugin->nOutputs/2; nOutput++) { + destinationPlug = pPlugin->multiRoutingDestinations[nOutput]; + pOutState = m_MixPlugins[destinationPlug].pMixState; + pOutputs[2*nOutput] = pOutState->pOutBufferL; + pOutputs[2*(nOutput+1)] = pOutState->pOutBufferR; + } + + } +*/ + if (pPlugin->Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) { if (!bMasterMix) Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -665,11 +665,7 @@ m_nSongPreAmp=100; } // Reading Channels Pan Positions -// -> CODE#0006 -// -> DESC="misc quantity changes" -// for (int ipan=0; ipan<64; ipan++) if (pifh->chnpan[ipan] != 0xFF) - for (int ipan=0; ipan<MAX_BASECHANNELS; ipan++) if (pifh->chnpan[ipan] != 0xFF) -// -! BEHAVIOUR_CHANGE#0006 + for (int ipan=0; ipan</*MAX_BASECHANNELS*/64; ipan++) if (pifh->chnpan[ipan] != 0xFF) //Header only has room for settings for 64 chans... { ChnSettings[ipan].nVolume = pifh->chnvol[ipan]; ChnSettings[ipan].nPan = 128; @@ -814,7 +810,8 @@ UINT ch = b & IT_bitmask_patternChanField_c; // 0x7f We have some data grab a byte keeping only 127 bits if (ch) - ch = (ch - 1) & IT_bitmask_patternChanMask_c; // 0x3f mask of the byte again, keeping only 64 bits + ch = (ch - 1);// & IT_bitmask_patternChanMask_c; // 0x3f mask of the byte again, keeping only 64 bits + if (b & IT_bitmask_patternChanEnabled_c) // 0x80 check if the upper bit is enabled. { if (i >= len) @@ -1056,9 +1053,9 @@ } UINT ch = b & IT_bitmask_patternChanField_c; // 0x7f - + if (ch) - ch = (ch - 1) & IT_bitmask_patternChanMask_c; // 0x3f + ch = (ch - 1); //& IT_bitmask_patternChanMask_c; // 0x3f if (b & IT_bitmask_patternChanEnabled_c) // 0x80 { @@ -1493,17 +1490,22 @@ // Channel Pan and Volume memset(header.chnpan, 0xFF, 64); memset(header.chnvol, 64, 64); - for (UINT ich=0; ich<m_nChannels; ich++) + for (UINT ich=0; ich</*m_nChannels*/64; ich++) //Header only has room for settings for 64 chans... { header.chnpan[ich] = ChnSettings[ich].nPan >> 2; if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; header.chnvol[ich] = ChnSettings[ich].nVolume; if (ChnSettings[ich].dwFlags & CHN_MUTE) header.chnpan[ich] |= 0x80; + } + + for (UINT ich=0; ich<m_nChannels; ich++) + { if (ChnSettings[ich].szName[0]) { dwChnNamLen = (ich+1) * MAX_CHANNELNAME; } } + if (dwChnNamLen) dwExtra += dwChnNamLen + 8; #ifdef SAVEITTIMESTAMP dwExtra += 8; // Time Stamp @@ -2067,7 +2069,7 @@ // Channel Pan and Volume memset(header.chnpan, 0xFF, 64); memset(header.chnvol, 64, 64); - for (UINT ich=0; ich<nChannels; ich++) + for (UINT ich=0; ich</*m_nChannels*/64; ich++) //Header only has room for settings for 64 chans... { header.chnpan[ich] = ChnSettings[ich].nPan >> 2; if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -482,7 +482,7 @@ } } //end for all rows } else { - memset(s, 0, m_nChannels*4); //if patten does not exist + memset(s, 0, m_nChannels*4); //if pattern does not exist for (UINT i=0; i<64; i++) { //invent blank pattern fwrite(s, m_nChannels, 4, f); } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Sndfile.h 2006-06-20 00:44:57 UTC (rev 157) @@ -34,21 +34,21 @@ // -> DESC="misc quantity changes" #define MAX_INSTRUMENTS 256 //200 // -! BEHAVIOUR_CHANGE#0006 -#ifdef FASTSOUNDLIB -#define MAX_CHANNELS 80 -#else +//#ifdef FASTSOUNDLIB +//#define MAX_CHANNELS 80 +//#else // -> CODE#0006 // -> DESC="misc quantity changes" #define MAX_CHANNELS 256 //200 // -! BEHAVIOUR_CHANGE#0006 -#endif +//#endif // -> CODE#0006 // -> DESC="misc quantity changes" -#ifdef FASTSOUNDLIB -#define MAX_BASECHANNELS 64 -#else -#define MAX_BASECHANNELS 128 // Let 128 channels between MAX_BASECHANNELS & MAX_CHANNELS -#endif +//#ifdef FASTSOUNDLIB +//#define MAX_BASECHANNELS 64 +//#else +#define MAX_BASECHANNELS 127 +//#endif // -! BEHAVIOUR_CHANGE#0006 #define MAX_ENVPOINTS 32 #define MIN_PERIOD 0x0020 @@ -770,7 +770,15 @@ MIDIOUT_PROGRAM, }; +enum { + max_chans_IT=127, + max_chans_XM=64, + max_chans_MOD=32, + max_chans_S3M=32, +}; + + typedef struct MODMIDICFG { CHAR szMidiGlb[9*32]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-04-11 23:46:56
|
Revision: 156 Author: rewbs Date: 2006-04-11 16:44:36 -0700 (Tue, 11 Apr 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=156&view=rev Log Message: ----------- . v1.17.02.42 + <rewbs> "Compatibility export" in file menu: save as 'plain' IT, without all of OpenMPT's crap. IT only for now (not XM). . <rewbs> Set instrument in pattern editor should work when no note is specified (tx Torvus - http://lpchip.com/modplug/viewtopic.php?t=470) . <rewbs> Restart position saved in IT (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=473) . <rewbs> Loop song now works even if restart pos falls on +++ (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=463) . <rewbs> Last used tempo is applied even when playback is triggered from instrument panel. (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=480) / <rewbs> User now gets a warning when loading MDA Degrade (tx fisk0 - http://lpchip.com/modplug/viewtopic.php?t=467) Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/History.txt trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Removed Paths: ------------- trunk/OpenMPT/mptrack/bin/testSvnCommitList trunk/OpenMPT/mptrack/bin/testSvnCommitList2 Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -2253,13 +2253,11 @@ commands[kcChangeLoopStatus].isDummy = false; commands[kcChangeLoopStatus].Message = "Toggle loop pattern"; + commands[kcFileExportCompat].UID = 1777; + commands[kcFileExportCompat].Message = "File/Export to standard IT/XM"; + commands[kcFileExportCompat].isHidden = false; + commands[kcFileExportCompat].isDummy = false; -/* commands[kcToggleLoopSong].UID = 1777; - commands[kcToggleLoopSong].isHidden = false; - commands[kcToggleLoopSong].isDummy = false; - commands[kcToggleLoopSong].Message = "Toggle loop song"; -*/ - #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 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/CommandSet.h 2006-04-11 23:44:36 UTC (rev 156) @@ -57,6 +57,7 @@ kcFileSaveAsWave, kcFileSaveAsMP3, kcFileSaveMidi, + kcFileExportCompat, kcPrevDocument, kcNextDocument, kcFileImportMidiLib, Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -330,6 +330,7 @@ case ID_FILE_SAVEASWAVE: s="Save as Wave...\t"; c=kcFileSaveAsWave; break; case ID_FILE_SAVEASMP3: s="Save as MP3...\t"; c=kcFileSaveAsMP3; break; case ID_FILE_SAVEMIDI: s="Export as Midi...\t"; c=kcFileSaveMidi; break; + case ID_FILE_SAVECOMPAT: s="Compatibility Export...\t"; c=kcFileExportCompat; break; case ID_IMPORT_MIDILIB: s="Import Midi Library...\t"; c=kcFileImportMidiLib; break; case ID_ADD_SOUNDBANK: s="Add Sound Bank...\t"; c=kcFileAddSoundBank; break; @@ -390,6 +391,7 @@ pMenu->ModifyMenu(ID_FILE_SAVEASWAVE, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVEASWAVE, GetMenuText(ID_FILE_SAVEASWAVE)); pMenu->ModifyMenu(ID_FILE_SAVEASMP3, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVEASMP3, GetMenuText(ID_FILE_SAVEASMP3)); pMenu->ModifyMenu(ID_FILE_SAVEMIDI, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVEMIDI, GetMenuText(ID_FILE_SAVEMIDI)); + pMenu->ModifyMenu(ID_FILE_SAVECOMPAT, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVECOMPAT, GetMenuText(ID_FILE_SAVECOMPAT)); pMenu->ModifyMenu(ID_IMPORT_MIDILIB, MF_BYCOMMAND | MF_STRING, ID_IMPORT_MIDILIB, GetMenuText(ID_IMPORT_MIDILIB)); pMenu->ModifyMenu(ID_ADD_SOUNDBANK, MF_BYCOMMAND | MF_STRING, ID_ADD_SOUNDBANK, GetMenuText(ID_ADD_SOUNDBANK)); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -2707,6 +2707,7 @@ case kcFileSaveAs: case kcFileSaveAsWave: case kcFileSaveMidi: + case kcFileExportCompat: case kcFileClose: case kcFileSave: case kcViewGeneral: Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -30,6 +30,7 @@ ON_COMMAND(ID_FILE_SAVEASWAVE, OnFileWaveConvert) ON_COMMAND(ID_FILE_SAVEASMP3, OnFileMP3Convert) ON_COMMAND(ID_FILE_SAVEMIDI, OnFileMidiConvert) + ON_COMMAND(ID_FILE_SAVECOMPAT, OnFileCompatibilitySave) ON_COMMAND(ID_PLAYER_PLAY, OnPlayerPlay) ON_COMMAND(ID_PLAYER_PAUSE, OnPlayerPause) ON_COMMAND(ID_PLAYER_STOP, OnPlayerStop) @@ -386,11 +387,7 @@ case MOD_TYPE_MOD: bOk = m_SndFile.SaveMod(lpszPathName, dwPacking); break; case MOD_TYPE_S3M: bOk = m_SndFile.SaveS3M(lpszPathName, dwPacking); break; case MOD_TYPE_XM: bOk = m_SndFile.SaveXM(lpszPathName, dwPacking); break; -// -> CODE#0023 -// -> DESC="IT project files (.itp)" -// case MOD_TYPE_IT: bOk = m_SndFile.SaveIT(lpszPathName, dwPacking); break; case MOD_TYPE_IT: bOk = (m_SndFile.m_dwSongFlags & SONG_ITPROJECT || !lstrcmpi(fext, ".itp")) ? m_SndFile.SaveITProject(lpszPathName) : m_SndFile.SaveIT(lpszPathName, dwPacking); break; -// -! NEW_FEATURE#0023 } EndWaitCursor(); if (bOk) @@ -398,12 +395,8 @@ if (nType == m_SndFile.m_nType) SetPathName(lpszPathName); } else { -// -> CODE#0023 -// -> DESC="IT project files (.itp)" -// ErrorBox(IDS_ERR_SAVESONG, CMainFrame::GetMainFrame()); if(nType == MOD_TYPE_IT && m_SndFile.m_dwSongFlags & SONG_ITPROJECT) ::MessageBox(NULL,"ITP projects need to have a path set for each instrument...",NULL,MB_ICONERROR | MB_OK); else ErrorBox(IDS_ERR_SAVESONG, CMainFrame::GetMainFrame()); -// -! NEW_FEATURE#0023 } return bOk; } @@ -1499,7 +1492,7 @@ void CModDoc::OnFileMidiConvert() -//------------------------------- +//------------------------------------- { CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; @@ -1527,7 +1520,60 @@ } } +//HACK: This is a quick fix. Needs to be better integrated into player and GUI. +void CModDoc::OnFileCompatibilitySave() +//------------------------------- +{ + CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; + CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + CString ext, pattern; + + UINT type = m_SndFile.GetType(); + if ((!pMainFrm) || (!m_SndFile.GetType())) return; + switch (type) { + /*case MOD_TYPE_XM: + ext = "xm"; + pattern = "Fast Tracker Files (*.xm)|*.xm||"; + break;*/ + case MOD_TYPE_IT: + ext = "it"; + pattern = "Impulse Tracker Files (*.it)|*.it||"; + break; + default: + ::MessageBox(NULL,"Compatibility export is currently only available the IT format.", "Can't do compatibility export.",MB_ICONINFORMATION | MB_OK); + return; + } + + ::MessageBox(NULL,"Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning.",MB_ICONINFORMATION | MB_OK); + _splitpath(GetPathName(), drive, path, fname, NULL); + strcpy(s, drive); + strcat(s, path); + strcat(s, fname); + if (!strstr(fname, "compat")) { + strcat(s, ".compat."); + } else { + strcat(s, "."); + } + strcat(s, ext); + CFileDialog dlg(FALSE, ext, s, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, + pattern, pMainFrm); + if (dlg.DoModal() != IDOK){ + return; + } + switch (type) { + case MOD_TYPE_XM: + m_SndFile.SaveCompatXM(dlg.GetPathName()); + break; + case MOD_TYPE_IT: + m_SndFile.SaveCompatIT(dlg.GetPathName()); + break; + } +} + + void CModDoc::OnPlayerPlay() //-------------------------- { @@ -2871,6 +2917,7 @@ case kcFileSaveAsWave: OnFileWaveConvert(); break; case kcFileSaveAsMP3: OnFileMP3Convert(); break; case kcFileSaveMidi: OnFileMidiConvert(); break; + case kcFileExportCompat: OnFileCompatibilitySave(); break; case kcEstimateSongLength: OnEstimateSongLength(); break; case kcApproxRealBPM: OnApproximateBPM(); break; case kcFileSave: DoSave(m_strPathName, 0); break; Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/Moddoc.h 2006-04-11 23:44:36 UTC (rev 156) @@ -258,6 +258,7 @@ afx_msg void OnFileWaveConvert(); afx_msg void OnFileMP3Convert(); afx_msg void OnFileMidiConvert(); + afx_msg void OnFileCompatibilitySave(); afx_msg void OnPlayerPlay(); afx_msg void OnPlayerStop(); afx_msg void OnPlayerPause(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -2315,7 +2315,7 @@ { CModDoc *pModDoc; CSoundFile *pSndFile; - UINT nIns = GetCurrentInstrument(); + BYTE nIns = static_cast<BYTE>(GetCurrentInstrument()); MODCOMMAND *p; BOOL bModified; @@ -2334,14 +2334,15 @@ UINT startChan = GetSelectionStartChan(); UINT endChan = GetSelectionEndChan(); - for (UINT r=startRow; r<endRow+1; r++) - { - for (UINT c=startChan; c<endChan+1; c++) - { + for (UINT r=startRow; r<endRow+1; r++) { + for (UINT c=startChan; c<endChan+1; c++) { + p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + c; - if (p->note && p->instr != (BYTE)nIns) - { - p->instr = (BYTE)nIns; + + // If a note or an instr is present on the row, do the change, if required. + // Do not set instr if note and instr are both blank. + if ( (p->note||p->instr) && (p->instr!=nIns) ) { + p->instr = nIns; bModified = TRUE; } } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -1040,7 +1040,8 @@ #define NUM_PROBLEMPLUGS 3 static _PROBLEMATIC_PLUG gProblemPlugs[NUM_PROBLEMPLUGS] = { - {'VstP', 'Ni4S', 1, "Native Instruments B4", "*v1.1.1 hangs on playback. Do not proceed unless you have v1.1.5.*"}, + {'VstP', 'Ni4S', 1, "Native Instruments B4", "* v1.1.1 hangs on playback. Do not proceed unless you have v1.1.5. *"}, + {'VstP', 'mdaC', 1, "MDA Degrade", "* This plugin can cause OpenMPT to behave erratically.\r\nYou should try SoundHack's Decimate, ConcreteFX's Lowbit or Subtek's LoFi Plus instead. *"}, }; bool CSelectPluginDlg::VerifyPlug(PVSTPLUGINLIB plug) @@ -1048,10 +1049,10 @@ CString s; for (int p=0; p<NUM_PROBLEMPLUGS; p++) { - if ( (gProblemPlugs[p].id2 == plug->dwPluginId2) && gProblemPlugs[p].id2 + if ( (gProblemPlugs[p].id2 == plug->dwPluginId2) /*&& (gProblemPlugs[p].id1 == plug->dwPluginId1)*/) { - s.Format("WARNING: This plugin has been identified as %s,\r\n which is known to have the following problem with MPT:\r\n\r\n%s\r\n\r\n(see here for more information: http://www.modplug.com/forum/viewtopic.php?p=36930#36930)\r\n\r\nDo you want to continue to load?", gProblemPlugs[p].name, gProblemPlugs[p].problem); + s.Format("WARNING: This plugin has been identified as %s,\r\nwhich is known to have the following problem with OpenMPT:\r\n\r\n%s\r\n\r\nWould you like to continue to load this plugin?", gProblemPlugs[p].name, gProblemPlugs[p].problem); return (AfxMessageBox(s, MB_YESNO) == IDYES); } } @@ -2564,6 +2565,7 @@ pCh->uNoteOnMap[i][trackChannel]=0; MidiSend(dwMidiCode|(i<<8)); } + } // All "active" notes off on this midi and tracker channel Modified: trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe =================================================================== (Binary files differ) Deleted: trunk/OpenMPT/mptrack/bin/testSvnCommitList =================================================================== Deleted: trunk/OpenMPT/mptrack/bin/testSvnCommitList2 =================================================================== Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/bin/version 2006-04-11 23:44:36 UTC (rev 156) @@ -1 +1 @@ -1.17.02.41 \ No newline at end of file +1.17.02.42 \ No newline at end of file Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/mptrack.rc 2006-04-11 23:44:36 UTC (rev 156) @@ -106,6 +106,7 @@ MENUITEM "Save as &Wave...", ID_FILE_SAVEASWAVE MENUITEM "Save as M&P3...", ID_FILE_SAVEASMP3 MENUITEM "Export as M&idi...", ID_FILE_SAVEMIDI + MENUITEM "Export &unraped...", ID_FILE_SAVECOMPAT MENUITEM SEPARATOR MENUITEM "Import &midi Library...", ID_IMPORT_MIDILIB MENUITEM "Add Sound &Bank...", ID_ADD_SOUNDBANK @@ -1892,7 +1893,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,41 + FILEVERSION 1,17,2,42 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1910,7 +1911,7 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 41" + VALUE "FileVersion", "1, 17, 2, 42" VALUE "InternalName", "Modplug Tracker" VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2005 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" @@ -2184,6 +2185,7 @@ ID_PATTERN_CHANNELMANAGER "Display channel manager window\nChannel manager" ID_INDICATOR_CPU "-" + ID_FILE_EXPORTCOMPAT "Export file to standard IT/XM." END STRINGTABLE @@ -2456,7 +2458,7 @@ STRINGTABLE BEGIN ID_SAMPLE_TRIM "Delete everything except the current selection\nTrim Sample" - ID_FILE_SAVEMIDI "Convert the current song to a standard midi file" + ID_FILE_SAVEMIDI "Export the current song to a standard midi file" ID_NETLINK_FORUMS "Go to the Modplug Central Music Forums" ID_INSTRUMENT_SAMPLEMAP "Edit the sample map" ID_NETLINK_PLUGINS "Go to KVR Audio to download plugins" Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/resource.h 2006-04-11 23:44:36 UTC (rev 156) @@ -40,6 +40,7 @@ #define ID_PATTERN_CHANNELMANAGER 202 #define IDR_ENVELOPES 203 #define ID_INDICATOR_CPU 203 +#define ID_FILE_EXPORTCOMPAT 204 #define IDB_MAINBAR 300 #define IDB_IMAGELIST 301 #define IDB_PATTERNS 302 @@ -546,7 +547,6 @@ #define IDC_PATTERN_PLAYFROMSTART 2026 #define IDC_PATTERN_STOP 2027 #define IDC_PATTERN_RECORD 2028 -#define IDC_PATTERN_FOLLOWSONG 3029 #define IDC_PATTERN_NEW 2030 #define IDC_PATTERN_OCTAVELINK 2031 #define IDC_SPIN_SPACING 2032 @@ -738,6 +738,7 @@ #define IDC_TEXT_RPB 2301 #define IDC_SPIN_RPB 2302 #define IDC_EDIT_RPB 2303 +#define IDC_PATTERN_FOLLOWSONG 3029 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -939,6 +940,8 @@ #define ID_PATTERN_ADDCHANNEL_AFTER 59149 #define ID_PATTERN_REMOVECHANNEL 59150 #define ID_PATTERN_REMOVECHANNELDIALOG 59151 +#define ID_Menu 59200 +#define ID_FILE_SAVECOMPAT 59202 // Next default values for new objects // @@ -946,7 +949,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 510 -#define _APS_NEXT_COMMAND_VALUE 59200 +#define _APS_NEXT_COMMAND_VALUE 59203 #define _APS_NEXT_CONTROL_VALUE 2255 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/packageTemplate/History.txt =================================================================== --- trunk/OpenMPT/packageTemplate/History.txt 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/packageTemplate/History.txt 2006-04-11 23:44:36 UTC (rev 156) @@ -8,7 +8,15 @@ ?: other (tx XYZ): thanks to XYZ for telling me about the bug +. v1.17.02.42 + + <rewbs> "Compatibility export" in file menu: save as 'plain' IT, without all of OpenMPT's crap. IT only for now (not XM). + . <rewbs> Set instrument in pattern editor should work when no note is specified (tx Torvus - http://lpchip.com/modplug/viewtopic.php?t=470) + . <rewbs> Restart position saved in IT (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=473) + . <rewbs> Loop song now works even if restart pos falls on +++ (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=463) + . <rewbs> Last used tempo is applied even when playback is triggered from instrument panel. (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=480) + / <rewbs> User now gets a warning when loading MDA Degrade (tx fisk0 - http://lpchip.com/modplug/viewtopic.php?t=467) + . v 1.17.02.41 + <rewbs> Pattern record state is now saved to ini . <rewbs> Fixed the following settings that were not saving correctly: mod document window status, row spacing, channel VU meters, channel effect visibility, Most recent files list, Toolbar settings. Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -601,6 +601,7 @@ case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; + case 'RP..': fadr = reinterpret_cast<BYTE*>(&m_nRestartPos); break; } if (fadr != NULL) { // if field code recognized @@ -1007,6 +1008,7 @@ case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; + case 'RP..': fadr = reinterpret_cast<BYTE*>(&m_nRestartPos); break; } if (fadr != NULL) { // if field code recognized @@ -1996,6 +1998,579 @@ #pragma warning(default:4100) #endif // MODPLUG_NO_FILESAVE +//HACK: This is a quick fix. Needs to be better integrated into player and GUI. +//And need to split into subroutines and eliminate code duplication with SaveIT. +BOOL CSoundFile::SaveCompatIT(LPCSTR lpszFileName) +//------------------------------------------------ +{ + const int IT_MAX_CHANNELS=64; + DWORD dwPatNamLen, dwChnNamLen; + ITFILEHEADER header; + ITINSTRUMENT iti; + ITSAMPLESTRUCT itss; + BYTE smpcount[(MAX_SAMPLES+7)/8]; + DWORD inspos[MAX_INSTRUMENTS]; + DWORD patpos[MAX_PATTERNS]; + DWORD smppos[MAX_SAMPLES]; + DWORD dwPos = 0, dwHdrPos = 0, dwExtra = 2; + WORD patinfo[4]; +// -> CODE#0006 +// -> DESC="misc quantity changes" + BYTE chnmask[IT_MAX_CHANNELS]; + MODCOMMAND lastvalue[IT_MAX_CHANNELS]; + UINT nChannels = min(m_nChannels, IT_MAX_CHANNELS); +// -! BEHAVIOUR_CHANGE#0006 + BYTE buf[512]; + FILE *f; + + + if ((!lpszFileName) || ((f = fopen(lpszFileName, "wb")) == NULL)) return FALSE; + memset(inspos, 0, sizeof(inspos)); + memset(patpos, 0, sizeof(patpos)); + memset(smppos, 0, sizeof(smppos)); + // Writing Header + memset(&header, 0, sizeof(header)); + dwPatNamLen = 0; + dwChnNamLen = 0; + header.id = 0x4D504D49; + lstrcpyn(header.songname, m_szNames[0], 27); + header.reserved1 = 0x1004; + header.ordnum = 0; + header.ordnum=MAX_ORDERS; + while (header.ordnum>0 && Order[header.ordnum-1]==0xFF) { + header.ordnum--; + } + header.patnum = MAX_PATTERNS; + while ((header.patnum > 0) && (!Patterns[header.patnum-1])) { + header.patnum--; + } + + header.insnum = m_nInstruments; + header.smpnum = m_nSamples; + header.cwtv = 0x888; // We don't use these version info fields any more. + header.cmwt = 0x888; // Might come up as "Impulse Tracker 8" file in XMPlay. :) + header.flags = 0x0001; + header.special = 0x0006; + if (m_nInstruments) header.flags |= 0x04; + 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; + header.globalvol = m_nDefaultGlobalVolume >> 1; + header.mv = m_nSongPreAmp; + if (header.mv < 0x20) header.mv = 0x20; + if (header.mv > 0x7F) header.mv = 0x7F; + header.speed = m_nDefaultSpeed; + header.tempo = min(m_nDefaultTempo,255); //Limit this one to 255, we save the real one as an extension below. + header.sep = 128; + dwHdrPos = sizeof(header) + header.ordnum; + // Channel Pan and Volume + memset(header.chnpan, 0xFF, 64); + memset(header.chnvol, 64, 64); + for (UINT ich=0; ich<nChannels; ich++) + { + header.chnpan[ich] = ChnSettings[ich].nPan >> 2; + if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; + header.chnvol[ich] = ChnSettings[ich].nVolume; + if (ChnSettings[ich].dwFlags & CHN_MUTE) header.chnpan[ich] |= 0x80; +/* if (ChnSettings[ich].szName[0]) + { + dwChnNamLen = (ich+1) * MAX_CHANNELNAME; + } +*/ + } +// if (dwChnNamLen) dwExtra += dwChnNamLen + 8; +/*#ifdef SAVEITTIMESTAMP + dwExtra += 8; // Time Stamp +#endif +*/ + if (m_dwSongFlags & SONG_EMBEDMIDICFG) + { + header.flags |= 0x80; + header.special |= 0x08; + dwExtra += sizeof(MODMIDICFG); + } + // Pattern Names +/* if ((m_nPatternNames) && (m_lpszPatternNames)) + { + dwPatNamLen = m_nPatternNames * MAX_PATTERNNAME; + while ((dwPatNamLen >= MAX_PATTERNNAME) && (!m_lpszPatternNames[dwPatNamLen-MAX_PATTERNNAME])) dwPatNamLen -= MAX_PATTERNNAME; + if (dwPatNamLen < MAX_PATTERNNAME) dwPatNamLen = 0; + if (dwPatNamLen) dwExtra += dwPatNamLen + 8; + } +*/ // Mix Plugins + //dwExtra += SaveMixPlugins(NULL, TRUE); + // Comments + if (m_lpszSongComments) + { + header.special |= 1; + header.msglength = strlen(m_lpszSongComments)+1; + header.msgoffset = dwHdrPos + dwExtra + header.insnum*4 + header.patnum*4 + header.smpnum*4; + } + // Write file header + fwrite(&header, 1, sizeof(header), f); + fwrite(Order, 1, header.ordnum, f); + if (header.insnum) fwrite(inspos, 4, header.insnum, f); + if (header.smpnum) fwrite(smppos, 4, header.smpnum, f); + if (header.patnum) fwrite(patpos, 4, header.patnum, f); + // Writing editor history information + { +/*#ifdef SAVEITTIMESTAMP + SYSTEMTIME systime; + FILETIME filetime; + WORD timestamp[4]; + WORD nInfoEx = 1; + memset(timestamp, 0, sizeof(timestamp)); + fwrite(&nInfoEx, 1, 2, f); + GetSystemTime(&systime); + SystemTimeToFileTime(&systime, &filetime); + FileTimeToDosDateTime(&filetime, ×tamp[0], ×tamp[1]); + fwrite(timestamp, 1, 8, f); +#else +*/ WORD nInfoEx = 0; + fwrite(&nInfoEx, 1, 2, f); +//#endif + } + // Writing midi cfg + if (header.flags & 0x80) + { + fwrite(&m_MidiCfg, 1, sizeof(MODMIDICFG), f); + } + // Writing pattern names +/* if (dwPatNamLen) + { + DWORD d = 0x4d414e50; + fwrite(&d, 1, 4, f); + fwrite(&dwPatNamLen, 1, 4, f); + fwrite(m_lpszPatternNames, 1, dwPatNamLen, f); + } +*/ // Writing channel Names +/* if (dwChnNamLen) + { + DWORD d = 0x4d414e43; + fwrite(&d, 1, 4, f); + fwrite(&dwChnNamLen, 1, 4, f); + UINT nChnNames = dwChnNamLen / MAX_CHANNELNAME; + for (UINT inam=0; inam<nChnNames; inam++) + { + fwrite(ChnSettings[inam].szName, 1, MAX_CHANNELNAME, f); + } + } +*/ // Writing mix plugins info +/* SaveMixPlugins(f, FALSE); +*/ // Writing song message + dwPos = dwHdrPos + dwExtra + (header.insnum + header.smpnum + header.patnum) * 4; + if (header.special & 1) + { + dwPos += strlen(m_lpszSongComments) + 1; + fwrite(m_lpszSongComments, 1, strlen(m_lpszSongComments)+1, f); + } + // Writing instruments + for (UINT nins=1; nins<=header.insnum; nins++) + { + BOOL bKbdEx = FALSE; + BYTE keyboardex[120]; + + memset(&iti, 0, sizeof(iti)); + iti.id = 0x49504D49; // "IMPI" + //iti.trkvers = 0x211; + iti.trkvers = 0x220; //rewbs.itVersion + if (Headers[nins]) + { + INSTRUMENTHEADER *penv = Headers[nins]; + memset(smpcount, 0, sizeof(smpcount)); + memcpy(iti.filename, penv->filename, 12); + memcpy(iti.name, penv->name, 26); + iti.mbank = penv->wMidiBank; + iti.mpr = penv->nMidiProgram; + iti.mch = penv->nMidiChannel; + iti.nna = penv->nNNA; + if (penv->nDCT<DCT_PLUGIN) iti.dct = penv->nDCT; else iti.dct =0; + iti.dca = penv->nDNA; + iti.fadeout = penv->nFadeOut >> 5; + iti.pps = penv->nPPS; + iti.ppc = penv->nPPC; + iti.gbv = (BYTE)(penv->nGlobalVol << 1); + iti.dfp = (BYTE)penv->nPan >> 2; + if (!(penv->dwFlags & ENV_SETPANNING)) iti.dfp |= 0x80; + iti.rv = penv->nVolSwing; + iti.rp = penv->nPanSwing; + iti.ifc = penv->nIFC; + iti.ifr = penv->nIFR; + iti.nos = 0; + for (UINT i=0; i<120; i++) if (penv->Keyboard[i] < MAX_SAMPLES) + { + UINT smp = penv->Keyboard[i]; + if ((smp) && (!(smpcount[smp>>3] & (1<<(smp&7))))) + { + smpcount[smp>>3] |= 1 << (smp&7); + iti.nos++; + } + iti.keyboard[i*2] = penv->NoteMap[i] - 1; + iti.keyboard[i*2+1] = smp; + if (smp > 0xff) bKbdEx = TRUE; + keyboardex[i] = (smp>>8); + } else keyboardex[i] = 0; + // Writing Volume envelope + if (penv->dwFlags & ENV_VOLUME) iti.volenv.flags |= 0x01; + if (penv->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02; + if (penv->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04; + if (penv->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08; + iti.volenv.num = (BYTE)penv->nVolEnv; + iti.volenv.lpb = (BYTE)penv->nVolLoopStart; + iti.volenv.lpe = (BYTE)penv->nVolLoopEnd; + iti.volenv.slb = penv->nVolSustainBegin; + iti.volenv.sle = penv->nVolSustainEnd; + // Writing Panning envelope + if (penv->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01; + if (penv->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02; + if (penv->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04; + if (penv->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08; + iti.panenv.num = (BYTE)penv->nPanEnv; + iti.panenv.lpb = (BYTE)penv->nPanLoopStart; + iti.panenv.lpe = (BYTE)penv->nPanLoopEnd; + iti.panenv.slb = penv->nPanSustainBegin; + iti.panenv.sle = penv->nPanSustainEnd; + // Writing Pitch Envelope + if (penv->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01; + if (penv->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02; + if (penv->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04; + if (penv->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08; + if (penv->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; + iti.pitchenv.num = (BYTE)penv->nPitchEnv; + iti.pitchenv.lpb = (BYTE)penv->nPitchLoopStart; + iti.pitchenv.lpe = (BYTE)penv->nPitchLoopEnd; + iti.pitchenv.slb = (BYTE)penv->nPitchSustainBegin; + iti.pitchenv.sle = (BYTE)penv->nPitchSustainEnd; + // Writing Envelopes data + for (UINT ev=0; ev<25; ev++) + { + iti.volenv.data[ev*3] = penv->VolEnv[ev]; + iti.volenv.data[ev*3+1] = penv->VolPoints[ev] & 0xFF; + iti.volenv.data[ev*3+2] = penv->VolPoints[ev] >> 8; + iti.panenv.data[ev*3] = penv->PanEnv[ev] - 32; + iti.panenv.data[ev*3+1] = penv->PanPoints[ev] & 0xFF; + iti.panenv.data[ev*3+2] = penv->PanPoints[ev] >> 8; + iti.pitchenv.data[ev*3] = penv->PitchEnv[ev] - 32; + iti.pitchenv.data[ev*3+1] = penv->PitchPoints[ev] & 0xFF; + iti.pitchenv.data[ev*3+2] = penv->PitchPoints[ev] >> 8; + } + } else + // Save Empty Instrument + { + for (UINT i=0; i<120; i++) iti.keyboard[i*2] = i; + iti.ppc = 5*12; + iti.gbv = 128; + iti.dfp = 0x20; + iti.ifc = 0xFF; + } + if (!iti.nos) iti.trkvers = 0; + // Writing instrument + if (bKbdEx) *((int *)iti.dummy) = 'MPTX'; + inspos[nins-1] = dwPos; + dwPos += sizeof(ITINSTRUMENT); + fwrite(&iti, 1, sizeof(ITINSTRUMENT), f); + if (bKbdEx) + { + dwPos += 120; + fwrite(keyboardex, 1, 120, f); + } + + //------------ rewbs.modularInstData +/* if (Headers[nins]) + { + long modularInstSize = 0; + UINT ModInstID = 'INSM'; + fwrite(&ModInstID, 1, sizeof(ModInstID), f); // mark this as an instrument with modular extensions + long sizePos = ftell(f); // we will want to write the modular data's total size here + fwrite(&modularInstSize, 1, sizeof(modularInstSize), f); // write a DUMMY size, just to move file pointer by a long + + //Write chunks + UINT ID; + { //VST Slot chunk: + ID='PLUG'; + fwrite(&ID, 1, sizeof(int), f); + INSTRUMENTHEADER *penv = Headers[nins]; + fwrite(&(penv->nMixPlug), 1, sizeof(BYTE), f); + modularInstSize += sizeof(int)+sizeof(BYTE); + } +*/ //How to save your own modular instrument chunk: + /* { + ID='MYID'; + fwrite(&ID, 1, sizeof(int), f); + instModularDataSize+=sizeof(int); + + //You can save your chunk size somwhere here if you need variable chunk size. + fwrite(myData, 1, myDataSize, f); + instModularDataSize+=myDataSize; + } + */ +/* //write modular data's total size + long curPos = ftell(f); // remember current pos + fseek(f, sizePos, SEEK_SET); // go back to sizePos + fwrite(&modularInstSize, 1, sizeof(modularInstSize), f); // write data + fseek(f, curPos, SEEK_SET); // go back to where we were. + + //move forward + dwPos+=sizeof(ModInstID)+sizeof(modularInstSize)+modularInstSize; + } +*/ //------------ end rewbs.modularInstData + } + // Writing sample headers + memset(&itss, 0, sizeof(itss)); + for (UINT hsmp=0; hsmp<header.smpnum; hsmp++) + { + smppos[hsmp] = dwPos; + dwPos += sizeof(ITSAMPLESTRUCT); + fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f); + } + // Writing Patterns + for (UINT npat=0; npat<header.patnum; npat++) + { + DWORD dwPatPos = dwPos; + UINT len; + if (!Patterns[npat]) continue; + patpos[npat] = dwPos; + patinfo[0] = 0; + patinfo[1] = PatternSize[npat]; + patinfo[2] = 0; + patinfo[3] = 0; + // Check for empty pattern + if (PatternSize[npat] == 64) + { + MODCOMMAND *pzc = Patterns[npat]; + UINT nz = PatternSize[npat] * nChannels; + for (UINT iz=0; iz<nz; iz++) + { + if ((pzc[iz].note) || (pzc[iz].instr) + || (pzc[iz].volcmd) || (pzc[iz].command)) break; + } + if (iz == nz) + { + patpos[npat] = 0; + continue; + } + } + fwrite(patinfo, 8, 1, f); + dwPos += 8; + memset(chnmask, 0xFF, sizeof(chnmask)); + memset(lastvalue, 0, sizeof(lastvalue)); + MODCOMMAND *m = Patterns[npat]; + for (UINT row=0; row<PatternSize[npat]; row++) + { + len = 0; + for (UINT ch=0; ch<nChannels; ch++, m++) + { + BYTE b = 0; + UINT command = m->command; + UINT param = m->param; + UINT vol = 0xFF; + UINT note = m->note; + if (note) b |= 1; + if ((note) && (note < 0xFE)) note--; + if (m->instr) b |= 2; + if (m->volcmd) + { + UINT volcmd = m->volcmd; + switch(volcmd) + { + case VOLCMD_VOLUME: vol = m->vol; if (vol > 64) vol = 64; break; + case VOLCMD_PANNING: vol = m->vol + 128; if (vol > 192) vol = 192; break; + case VOLCMD_VOLSLIDEUP: vol = 85 + ConvertVolParam(m->vol); break; + case VOLCMD_VOLSLIDEDOWN: vol = 95 + ConvertVolParam(m->vol); break; + case VOLCMD_FINEVOLUP: vol = 65 + ConvertVolParam(m->vol); break; + case VOLCMD_FINEVOLDOWN: vol = 75 + ConvertVolParam(m->vol); break; + case VOLCMD_VIBRATO: vol = 203; break; + case VOLCMD_VIBRATOSPEED: vol = 203 + ConvertVolParam(m->vol); break; + case VOLCMD_TONEPORTAMENTO: vol = 193 + ConvertVolParam(m->vol); break; + case VOLCMD_PORTADOWN: vol = 105 + ConvertVolParam(m->vol); break; + case VOLCMD_PORTAUP: vol = 115 + ConvertVolParam(m->vol); break; + case VOLCMD_VELOCITY: vol = 213 + ConvertVolParam(m->vol); break; //rewbs.velocity + case VOLCMD_OFFSET: vol = 223 + ConvertVolParam(m->vol); break; //rewbs.volOff + default: vol = 0xFF; + } + } + if (vol != 0xFF) b |= 4; + if (command) + { + S3MSaveConvert(&command, ¶m, TRUE); + if (command) b |= 8; + } + // Packing information + if (b) + { + // Same note ? + if (b & 1) + { + if ((note == lastvalue[ch].note) && (lastvalue[ch].volcmd & 1)) + { + b &= ~1; + b |= 0x10; + } else + { + lastvalue[ch].note = note; + lastvalue[ch].volcmd |= 1; + } + } + // Same instrument ? + if (b & 2) + { + if ((m->instr == lastvalue[ch].instr) && (lastvalue[ch].volcmd & 2)) + { + b &= ~2; + b |= 0x20; + } else + { + lastvalue[ch].instr = m->instr; + lastvalue[ch].volcmd |= 2; + } + } + // Same volume column byte ? + if (b & 4) + { + if ((vol == lastvalue[ch].vol) && (lastvalue[ch].volcmd & 4)) + { + b &= ~4; + b |= 0x40; + } else + { + lastvalue[ch].vol = vol; + lastvalue[ch].volcmd |= 4; + } + } + // Same command / param ? + if (b & 8) + { + if ((command == lastvalue[ch].command) && (param == lastvalue[ch].param) && (lastvalue[ch].volcmd & 8)) + { + b &= ~8; + b |= 0x80; + } else + { + lastvalue[ch].command = command; + lastvalue[ch].param = param; + lastvalue[ch].volcmd |= 8; + } + } + if (b != chnmask[ch]) + { + chnmask[ch] = b; + buf[len++] = (ch+1) | 0x80; + buf[len++] = b; + } else + { + buf[len++] = ch+1; + } + if (b & 1) buf[len++] = note; + if (b & 2) buf[len++] = m->instr; + if (b & 4) buf[len++] = vol; + if (b & 8) + { + buf[len++] = command; + buf[len++] = param; + } + } + } + buf[len++] = 0; + dwPos += len; + patinfo[0] += len; + fwrite(buf, 1, len, f); + } + fseek(f, dwPatPos, SEEK_SET); + fwrite(patinfo, 8, 1, f); + fseek(f, dwPos, SEEK_SET); + } + // Writing Sample Data + for (UINT nsmp=1; nsmp<=header.smpnum; nsmp++) + { + MODINSTRUMENT *psmp = &Ins[nsmp]; + memset(&itss, 0, sizeof(itss)); + memcpy(itss.filename, psmp->name, 12); + memcpy(itss.name, m_szNames[nsmp], 26); + itss.id = 0x53504D49; + itss.gvl = (BYTE)psmp->nGlobalVol; + if (m_nInstruments) + { + for (UINT iu=1; iu<=m_nInstruments; iu++) if (Headers[iu]) + { + INSTRUMENTHEADER *penv = Headers[iu]; + for (UINT ju=0; ju<128; ju++) if (penv->Keyboard[ju] == nsmp) + { + itss.flags = 0x01; + break; + } + } + } else + { + itss.flags = 0x01; + } + if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10; + if (psmp->uFlags & CHN_SUSTAINLOOP) itss.flags |= 0x20; + if (psmp->uFlags & CHN_PINGPONGLOOP) itss.flags |= 0x40; + if (psmp->uFlags & CHN_PINGPONGSUSTAIN) itss.flags |= 0x80; + itss.C5Speed = psmp->nC4Speed; + if (!itss.C5Speed) itss.C5Speed = 8363; + itss.length = psmp->nLength; + itss.loopbegin = psmp->nLoopStart; + itss.loopend = psmp->nLoopEnd; + itss.susloopbegin = psmp->nSustainStart; + itss.susloopend = psmp->nSustainEnd; + itss.vol = psmp->nVolume >> 2; + itss.dfp = psmp->nPan >> 2; + itss.vit = autovibxm2it[psmp->nVibType & 7]; + itss.vis = psmp->nVibRate; + itss.vid = psmp->nVibDepth; + itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255; + if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80; + if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01; + UINT flags = RS_PCM8S; +#ifndef NO_PACKING + if (nPacking) + { + if ((!(psmp->uFlags & (CHN_16BIT|CHN_STEREO))) + && (CanPackSample(psmp->pSample, psmp->nLength, nPacking))) + { + flags = RS_ADPCM4; + itss.cvt = 0xFF; + } + } else +#endif // NO_PACKING + { + if (psmp->uFlags & CHN_STEREO) + { + flags = RS_STPCM8S; + itss.flags |= 0x04; + } + if (psmp->uFlags & CHN_16BIT) + { + itss.flags |= 0x02; + flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S; + } + } + itss.samplepointer = dwPos; + fseek(f, smppos[nsmp-1], SEEK_SET); + fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f); + fseek(f, dwPos, SEEK_SET); + if ((psmp->pSample) && (psmp->nLength)) + { + dwPos += WriteSample(f, psmp, flags); + } + } + + //Save hacked-on extra info +// SaveExtendedInstrumentProperties(Headers, header.insnum, f); +// SaveExtendedSongProperties(f); + + // Updating offsets + fseek(f, dwHdrPos, SEEK_SET); + if (header.insnum) fwrite(inspos, 4, header.insnum, f); + if (header.smpnum) fwrite(smppos, 4, header.smpnum, f); + if (header.patnum) fwrite(patpos, 4, header.patnum, f); + fclose(f); + return TRUE; + +} + ////////////////////////////////////////////////////////////////////////////// // IT 2.14 compression @@ -2549,5 +3124,12 @@ fwrite(&size, 1, sizeof(__int16), f); fwrite(&m_nDefaultGlobalVolume, 1, size, f); + code = 'RP..'; //write m_nRestartPos + fwrite(&code, 1, sizeof(__int32), f); + size = sizeof(m_nRestartPos); + fwrite(&size, 1, sizeof(__int16), f); + fwrite(&m_nRestartPos, 1, size, f); + + return; } \ No newline at end of file Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -988,4 +988,12 @@ return TRUE; } +//HACK: This is a quick fix. Needs to be better integrated into player and GUI. +BOOL CSoundFile::SaveCompatXM(LPCSTR lpszFileName) +//------------------------------------------------ +{ + + return TRUE; +} + #endif // MODPLUG_NO_FILESAVE Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -172,6 +172,7 @@ PSB. nPanSustainBegin; PSE. nPanSustainEnd; R... nResampling; +RP.. [EXT] nRestartPos; RPB. [EXT] nRowsPerBeat; RPM. [EXT] nRowsPerMeasure; RS.. nResSwing; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Sndfile.h 2006-04-11 23:44:36 UTC (rev 156) @@ -934,6 +934,8 @@ BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0); BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0); BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0); + BOOL SaveCompatIT(LPCSTR lpszFileName); + BOOL SaveCompatXM(LPCSTR lpszFileName); // -> CODE#0023 // -> DESC="IT project files (.itp)" BOOL SaveITProject(LPCSTR lpszFileName); Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -611,7 +611,8 @@ m_nTickCount = 0; m_nRow = m_nNextRow; // Reset Pattern Loop Effect - if (m_nCurrentPattern != m_nNextPattern) m_nCurrentPattern = m_nNextPattern; + if (m_nCurrentPattern != m_nNextPattern) + m_nCurrentPattern = m_nNextPattern; // Check if pattern is valid if (!(m_dwSongFlags & SONG_PATTERNLOOP)) { @@ -629,16 +630,14 @@ //rewbs.instroVSTi: stop all VSTi at end of song, if looping. StopAllVsti(); - m_nMusicSpeed = m_nDefaultSpeed; m_nMusicTempo = m_nDefaultTempo; m_nGlobalVolume = m_nDefaultGlobalVolume; - for (UINT i=0; i<MAX_CHANNELS; i++) - { + for (UINT i=0; i<MAX_CHANNELS; i++) { Chn[i].dwFlags |= CHN_NOTEFADE | CHN_KEYOFF; Chn[i].nFadeOutVol = 0; - if (i < m_nChannels) - { + + if (i < m_nChannels) { Chn[i].nGlobalVol = ChnSettings[i].nVolume; Chn[i].nVolume = ChnSettings[i].nVolume; Chn[i].nPan = ChnSettings[i].nPan; @@ -648,8 +647,8 @@ Chn[i].nOldOffset = 0; Chn[i].nOldHiOffset = 0; Chn[i].nPortamentoDest = 0; - if (!Chn[i].nLength) - { + + if (!Chn[i].nLength) { Chn[i].dwFlags = ChnSettings[i].dwFlags; Chn[i].nLoopStart = 0; Chn[i].nLoopEnd = 0; @@ -662,31 +661,42 @@ } + + //Handle Repeat position if (m_nRepeatCount > 0) m_nRepeatCount--; m_nCurrentPattern = m_nRestartPos; - m_nRow = 0; - if ((Order[m_nCurrentPattern] >= MAX_PATTERNS) || (!Patterns[Order[m_nCurrentPattern]])) return FALSE; - } else - { + m_nRow = 0; + //If restart pos points to +++, move along + while (Order[m_nCurrentPattern] == 0xFE) { + m_nCurrentPattern++; + } + //Check for end of song or bad pattern + if ( (Order[m_nCurrentPattern] >= MAX_PATTERNS) + || (!Patterns[Order[m_nCurrentPattern]]) ) { + return FALSE; + } + + } else { m_nCurrentPattern++; } - m_nPattern = (m_nCurrentPattern < MAX_ORDERS) ? Order[m_nCurrentPattern] : 0xFF; - if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) m_nPattern = 0xFE; + + if (m_nCurrentPattern < MAX_ORDERS) { + m_nPattern = Order[m_nCurrentPattern]; + } else { + m_nPattern = 0xFF; + } + + if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) { + m_nPattern = 0xFE; + } } m_nNextPattern = m_nCurrentPattern; #ifdef MODPLUG_TRACKER -// if (m_nInstruments) ProcessMidiOut(); //rewbs.VSTnoteDelay if ((m_nMaxOrderPosition) && (m_nCurrentPattern >= m_nMaxOrderPosition)) return FALSE; #endif // MODPLUG_TRACKER } -//#ifdef MODPLUG_TRACKER -// if (m_dwSongFlags & SONG_STEP) -// { -// m_dwSongFlags &= ~SONG_STEP; -// m_dwSongFlags |= SONG_PAUSED; -// } -//#endif // MODPLUG_TRACKER + // Weird stuff? if ((m_nPattern >= MAX_PATTERNS) || (!Patterns[m_nPattern])) return FALSE; // Should never happen @@ -766,10 +776,7 @@ //////////////////////////////////////////////////////////////////////////////////// m_nTotalCount++; if (!m_nMusicTempo) return FALSE; -// -> CODE#0022 -// -> DESC="alternative BPM/Speed interpretation method" - switch(m_nTempoMode) { case tempo_mode_alternative: @@ -796,47 +803,22 @@ default: m_nBufferCount = (gdwMixingFreq * 5 * m_nTempoFactor) / (m_nMusicTempo << 8); } - /* - if (CMainFrame::m_dwPatternSetup & PATTERN_ALTERNTIVEBPMSPEED) { - m_nBufferCount = gdwMixingFreq / m_nMusicTempo; - } - else { - m_nBufferCount = (gdwMixingFreq * 5 * m_nTempoFactor) / (m_nMusicTempo << 8); - } - */ -// -! NEW_FEATURE#0022 m_nSamplesPerTick = m_nBufferCount; //rewbs.flu -#ifdef MODPLUG_TRACKER - if (m_dwSongFlags & SONG_PAUSED) - { - m_nBufferCount = gdwMixingFreq / 64; // 1/64 seconds - } -#endif + +// robinf: this block causes envelopes to behave incorrectly when +// playback is triggered from instrument panel. +// I can't see why it would be useful. Dissabling for now. +// +// if (m_dwSongFlags & SONG_PAUSED) { +// m_nBufferCount = gdwMixingFreq / 64; // 1/64 seconds +// } + + // Master Volume + Pre-Amplification / Attenuation setup DWORD nMasterVol; { -////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ericus 10/02/2005 -/* - int nchn32 = (m_nChannels < 32) ? m_nChannels : 31; - if ((m_nType & MOD_TYPE_IT) && (m_nInstruments) && (nchn32 < 6)) nchn32 = 6; - int realmastervol = m_nMasterVolume; - if (realmastervol > 0x80) - { - realmastervol = 0x80 + ((realmastervol - 0x80) * (nchn32+4)) / 16; - } - UINT attenuation = (gdwSoundSetup & SNDMIX_AGC) ? PreAmpAGCTable[nchn32>>1] : PreAmpTable[nchn32>>1]; - DWORD mastervol = (realmastervol * (m_nSongPreAmp + 0x10)) >> 6; - if (mastervol > 0x200) mastervol = 0x200; - if ((m_dwSongFlags & SONG_GLOBALFADE) && (m_nGlobalFadeMaxSamples)) - { - mastervol = _muldiv(mastervol, m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples); - } - nMasterVol = (mastervol << 7) / attenuation; - if (nMasterVol > 0x180) nMasterVol = 0x180; -*/ int nchn32 = 0; MODCHANNEL *pChn = Chn; for (UINT nChn=0; nChn<m_nChannels; nChn++,pChn++) { @@ -862,8 +844,6 @@ if(attenuation < 1) attenuation = 1; nMasterVol = (mastervol << 7) / attenuation; - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////////// // Update channels data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-03-23 01:46:31
|
Revision: 155 Author: rewbs Date: 2006-03-22 17:46:21 -0800 (Wed, 22 Mar 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=155&view=rev Log Message: ----------- Testing svn commit mailing list, again. Added Paths: ----------- trunk/OpenMPT/mptrack/bin/testSvnCommitList3 Copied: trunk/OpenMPT/mptrack/bin/testSvnCommitList3 (from rev 154, trunk/OpenMPT/mptrack/bin/testSvnCommitList2) =================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |