From: <sag...@us...> - 2010-08-09 14:09:45
|
Revision: 680 http://modplug.svn.sourceforge.net/modplug/?rev=680&view=rev Author: saga-games Date: 2010-08-09 14:09:36 +0000 (Mon, 09 Aug 2010) Log Message: ----------- [New] In the MPTM format, each pattern can now have a custom time signature (rows per beat/measure) which can be set from the pattern properties dialog. The time signature is currently updated on every row, so it's not possible to temporarily modify it (f.e. using the mainbar controls), but that can still be done later (it might require quite some changes in some places). [Reg] "Set highlights to songs' time signatures" is gone. Custom song highlighting is now always applied, and the values found in the colour options are now always applied to new modules. [Mod] Updated MPTM format to contain pattern-specific time signatures. [Ref] Some code refactoring related to the new feature mentioned above. [Mod] OpenMPT: Version is now 1.19.00.00 Modified Paths: -------------- trunk/OpenMPT/mptrack/Childfrm.cpp trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/EffectVis.cpp trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mainbar.h trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/mptrack/Moptions.h trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mt2.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/mod_specifications.h trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/pattern.h trunk/OpenMPT/soundlib/patternContainer.cpp Modified: trunk/OpenMPT/mptrack/Childfrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Childfrm.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -432,7 +432,6 @@ if (pMainFrm) { pMainFrm->UpdateEffectKeys(); - pMainFrm->UpdateHighlights(); } } //end rewbs.customKeysAutoEffects Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -355,6 +355,8 @@ // Those vectors are needed for copying the old pattern properties to the new pattern number vector<MODCOMMAND*> pPatterns(maxPatIndex, nullptr); // original pattern data vector<ROWINDEX> nPatRows(maxPatIndex, 0); // original pattern sizes + vector<ROWINDEX> nPatRowsPerBeat(maxPatIndex, 0); // original pattern highlight + vector<ROWINDEX> nPatRowsPerMeasure(maxPatIndex, 0); // original pattern highlight CHAR s[512]; bool bReordered = false; @@ -480,6 +482,11 @@ } nPatRows[k] = pSndFile->Patterns[i].GetNumRows(); pPatterns[k] = pSndFile->Patterns[i]; + if(pSndFile->Patterns[i].GetOverrideSignature()) + { + nPatRowsPerBeat[k] = pSndFile->Patterns[i].GetRowsPerBeat(); + nPatRowsPerMeasure[k] = pSndFile->Patterns[i].GetRowsPerMeasure(); + } } else if (pSndFile->Patterns[i]) { @@ -490,6 +497,7 @@ for (PATTERNINDEX nPat = 0; nPat < maxPatIndex; nPat++) { pSndFile->Patterns[nPat].SetData(pPatterns[nPat], nPatRows[nPat]); + pSndFile->Patterns[nPat].SetSignature(nPatRowsPerBeat[nPat], nPatRowsPerMeasure[nPat]); } delete[] lpszpatnames; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -779,17 +779,23 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).nOrdLo; - PATTERNINDEX pat = pSndFile->Order[nCurOrd]; + PATTERNINDEX nCurPat = pSndFile->Order[nCurOrd]; ROWINDEX rows = 64; - if(pSndFile->Patterns.IsValidPat(pat)) + if(pSndFile->Patterns.IsValidPat(nCurPat)) { nCurOrd++; // only if the current oder is already occupied, create a new pattern at the next position. - rows = pSndFile->Patterns[pat].GetNumRows(); + rows = pSndFile->Patterns[nCurPat].GetNumRows(); rows = CLAMP(rows, pSndFile->GetModSpecifications().patternRowsMin, pSndFile->GetModSpecifications().patternRowsMax); } PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nCurOrd, rows); if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < pSndFile->Patterns.Size())) { + // update time signature + if(pSndFile->Patterns.IsValidIndex(nCurPat) && pSndFile->Patterns[nCurPat].GetOverrideSignature()) + { + pSndFile->Patterns[nNewPat].SetSignature(pSndFile->Patterns[nCurPat].GetRowsPerBeat(), pSndFile->Patterns[nCurPat].GetRowsPerMeasure()); + } + // move to new pattern m_OrderList.SetCurSel(nCurOrd); m_OrderList.InvalidateRect(NULL, FALSE); SetCurrentPattern(nNewPat); @@ -823,7 +829,7 @@ { PATTERNINDEX nCurPat = pSndFile->Order[selection.nOrdLo + i]; ROWINDEX rows = 64; - if (nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID) + if (pSndFile->Patterns.IsValidIndex(nCurPat) && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID) { rows = pSndFile->Patterns[nCurPat].GetNumRows(); rows = CLAMP(rows, pSndFile->GetModSpecifications().patternRowsMin, pSndFile->GetModSpecifications().patternRowsMax); @@ -831,6 +837,12 @@ PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nInsertWhere + i, rows); if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nCurPat] != nullptr)) { + // update time signature + if(pSndFile->Patterns[nCurPat].GetOverrideSignature()) + { + pSndFile->Patterns[nNewPat].SetSignature(pSndFile->Patterns[nCurPat].GetRowsPerBeat(), pSndFile->Patterns[nCurPat].GetRowsPerMeasure()); + } + // copy pattern data MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat]; MODCOMMAND *pDest = pSndFile->Patterns[nNewPat]; UINT n = pSndFile->Patterns[nCurPat].GetNumRows(); Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -911,7 +911,7 @@ m_pModDoc->UpdateAllViews(NULL, (smp << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA | HINT_SMPNAMES); if ((pSndFile->m_nInstruments) && (!m_pModDoc->FindSampleParent(smp))) { - if (MessageBox("This sample is not used by any instrument. Do you want to create a new instrument using this sample ?", + if (MessageBox("This sample is not used by any instrument. Do you want to create a new instrument using this sample?", NULL, MB_YESNO|MB_ICONQUESTION) == IDYES) { UINT nins = m_pModDoc->InsertInstrument(smp); @@ -1700,7 +1700,7 @@ //Open dialog CPSRatioCalc dlg(pSmp->nLength, lSampleRate, m_pSndFile->m_nMusicSpeed, m_pSndFile->m_nMusicTempo, - m_pSndFile->m_nRowsPerBeat, m_pSndFile->m_nTempoMode, + m_pSndFile->m_nDefaultRowsPerBeat, m_pSndFile->m_nTempoMode, m_dTimeStretchRatio, this); if (dlg.DoModal() != IDOK) return; Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -746,18 +746,28 @@ bRowSel = ((row >= (m_dwBeginSel >> 16)) && (row <= (m_dwEndSel >> 16))) ? TRUE : FALSE; row_col = MODCOLOR_TEXTNORMAL; row_bkcol = MODCOLOR_BACKNORMAL; + + // time signature highlighting + ROWINDEX nBeat = pSndFile->m_nDefaultRowsPerBeat, nMeasure = pSndFile->m_nDefaultRowsPerMeasure; + if(pSndFile->Patterns[nPattern].GetOverrideSignature()) + { + nBeat = pSndFile->Patterns[nPattern].GetRowsPerBeat(); + nMeasure = pSndFile->Patterns[nPattern].GetRowsPerMeasure(); + } + // secondary highlight (beats) if ((CMainFrame::m_dwPatternSetup & PATTERN_2NDHIGHLIGHT) - && (CMainFrame::m_nRowSpacing2) && (CMainFrame::m_nRowSpacing2 < nrows)) + && (nBeat) && (nBeat < nrows)) { - if (!(row % CMainFrame::m_nRowSpacing2)) + if (!(row % nBeat)) { row_bkcol = MODCOLOR_2NDHIGHLIGHT; } } + // primary highlight (measures) if ((CMainFrame::m_dwPatternSetup & PATTERN_STDHIGHLIGHT) - && (CMainFrame::m_nRowSpacing) && (CMainFrame::m_nRowSpacing < nrows)) + && (nMeasure) && (nMeasure < nrows)) { - if (!(row % CMainFrame::m_nRowSpacing)) + if (!(row % nMeasure)) { row_bkcol = MODCOLOR_BACKHILIGHT; } Modified: trunk/OpenMPT/mptrack/EffectVis.cpp =================================================================== --- trunk/OpenMPT/mptrack/EffectVis.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/EffectVis.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -266,11 +266,17 @@ { // Lots of room for optimisation here. // Draw vertical grid lines + ROWINDEX nBeat = m_pSndFile->m_nDefaultRowsPerBeat, nMeasure = m_pSndFile->m_nDefaultRowsPerMeasure; + if(m_pSndFile->Patterns[m_nPattern].GetOverrideSignature()) + { + nBeat = m_pSndFile->Patterns[m_nPattern].GetRowsPerBeat(); + nMeasure = m_pSndFile->Patterns[m_nPattern].GetRowsPerMeasure(); + } for (UINT row=m_startRow; row<=m_endRow; row++) { - if (row % m_pSndFile->m_nRowsPerMeasure == 0) + if (row % nMeasure == 0) CMainFrame::penScratch = CMainFrame::penGrayff; - else if (row % m_pSndFile->m_nRowsPerBeat == 0) + else if (row % nBeat == 0) CMainFrame::penScratch = CMainFrame::penGray99; else CMainFrame::penScratch = CMainFrame::penGray55; Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp =================================================================== --- trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -128,7 +128,7 @@ { AddToLog("Found too many patterns\n"); foundHacks = true; - // REQUIRES AUTOFIX + // REQUIRES (INTELLIGENT) AUTOFIX } // Check for too big/small patterns @@ -142,7 +142,7 @@ foundHacks = foundHere = true; break; } - // REQUIRES AUTOFIX + // REQUIRES (INTELLIGENT) AUTOFIX } } if(foundHere) @@ -156,7 +156,7 @@ // Check for pattern names foundHere = false; - for(PATTERNINDEX i = 0; i < m_SndFile.Patterns.Size(); i++) + for(PATTERNINDEX i = 0; i < m_SndFile.GetNumPatterns(); i++) { if(m_SndFile.Patterns.IsValidPat(i)) { @@ -181,7 +181,7 @@ { AddToLog("Found incompatible channel count\n"); foundHacks = true; - // REQUIRES AUTOFIX + // REQUIRES (INTELLIGENT) AUTOFIX } // Check for channel names @@ -205,7 +205,7 @@ { AddToLog("Found too many samples\n"); foundHacks = true; - // REQUIRES AUTOFIX + // REQUIRES (INTELLIGENT) AUTOFIX } // Check for too many instruments @@ -213,7 +213,7 @@ { AddToLog("Found too many instruments\n"); foundHacks = true; - // REQUIRES AUTOFIX + // REQUIRES (INTELLIGENT) AUTOFIX } // Check for instrument extensions @@ -255,7 +255,7 @@ { AddToLog("Found too many orders\n"); foundHacks = true; - // REQUIRES AUTOFIX + // REQUIRES (INTELLIGENT) AUTOFIX } // Check for invalid default tempo @@ -277,17 +277,38 @@ } // Check for invalid rows per beat / measure values - if(m_SndFile.m_nRowsPerBeat >= originalSpecs->patternRowsMax || m_SndFile.m_nRowsPerMeasure >= originalSpecs->patternRowsMax) + if(m_SndFile.m_nDefaultRowsPerBeat >= originalSpecs->patternRowsMax || m_SndFile.m_nDefaultRowsPerMeasure >= originalSpecs->patternRowsMax) { AddToLog("Found incompatible rows per beat / measure\n"); foundHacks = true; if(autofix) { - m_SndFile.m_nRowsPerBeat = CLAMP(m_SndFile.m_nRowsPerBeat, 1, (originalSpecs->patternRowsMax - 1)); - m_SndFile.m_nRowsPerMeasure = CLAMP(m_SndFile.m_nRowsPerMeasure, m_SndFile.m_nRowsPerBeat, (originalSpecs->patternRowsMax - 1)); + m_SndFile.m_nDefaultRowsPerBeat = CLAMP(m_SndFile.m_nDefaultRowsPerBeat, 1, (originalSpecs->patternRowsMax - 1)); + m_SndFile.m_nDefaultRowsPerMeasure = CLAMP(m_SndFile.m_nDefaultRowsPerMeasure, m_SndFile.m_nDefaultRowsPerBeat, (originalSpecs->patternRowsMax - 1)); } } + // Find pattern-specific time signatures + if(!originalSpecs->hasPatternSignatures) + { + foundHere = false; + for(PATTERNINDEX i = 0; i < m_SndFile.GetNumPatterns(); i++) + { + if(m_SndFile.Patterns[i].GetOverrideSignature()) + { + if(!foundHere) + AddToLog("Found pattern-specific time signatures\n"); + + if(autofix) + m_SndFile.Patterns[i].RemoveSignature(); + + foundHacks = foundHere = true; + if(!autofix) + break; + } + } + } + // Check for new tempo modes if(m_SndFile.m_nTempoMode != tempo_mode_classic) { @@ -316,7 +337,7 @@ } // Player flags - if(!m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY)) + if((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT)) && !m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY)) { AddToLog("Compatible play is deactivated\n"); foundHacks = true; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -200,10 +200,10 @@ DWORD CMainFrame::m_dwPatternSetup = PATTERN_PLAYNEWNOTE | PATTERN_EFFECTHILIGHT | PATTERN_SMALLFONT | PATTERN_CENTERROW | PATTERN_DRAGNDROPEDIT | PATTERN_FLATBUTTONS - | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT | PATTERN_HILITETIMESIGS + | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT /*| PATTERN_HILITETIMESIGS*/ | PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE; -DWORD CMainFrame::m_nRowSpacing = 16; -DWORD CMainFrame::m_nRowSpacing2 = 4; +DWORD CMainFrame::m_nRowSpacing = 16; // primary highlight (measures) +DWORD CMainFrame::m_nRowSpacing2 = 4; // secondary highlight (beats) UINT CMainFrame::m_nSampleUndoMaxBuffer = 0; // Real sample buffer undo size will be set later. // GDI @@ -438,8 +438,8 @@ m_dwPatternSetup |= PATTERN_NOTEFADE; if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,01)) m_dwPatternSetup |= PATTERN_RESETCHANNELS; - if(vIniVersion < MAKE_VERSION_NUMERIC(1,18,01,00)) - m_dwPatternSetup &= ~0x800; // quick paste autorepeat is now a keymap option + if(vIniVersion < MAKE_VERSION_NUMERIC(1,19,00,00)) + m_dwPatternSetup &= ~(0x800|0x200000|0x400000); // various deprecated old options m_nRowSpacing = GetPrivateProfileDWord("Pattern Editor", "RowSpacing", 16, iniFile); m_nRowSpacing2 = GetPrivateProfileDWord("Pattern Editor", "RowSpacing2", 4, iniFile); @@ -902,8 +902,6 @@ //------------------------ { CChildFrame *pMDIActive = (CChildFrame *)MDIGetActive(); - CRect rect; - //HKEY key; BeginWaitCursor(); if (m_dwStatus & MODSTATUS_PLAYING) PauseMod(); @@ -925,6 +923,7 @@ } void CMainFrame::SaveIniSettings() +//-------------------------------- { CString iniFile = theApp.GetConfigFileName(); @@ -2975,30 +2974,7 @@ } //end rewbs.customKeys -bool CMainFrame::UpdateHighlights() -//--------------------------------- -{ - if (!(CMainFrame::m_dwPatternSetup & PATTERN_HILITETIMESIGS)) - return false; - CModDoc* pModDoc = GetActiveDoc(); - if (pModDoc) - { - CSoundFile* pSndFile = pModDoc->GetSoundFile(); - if (pSndFile) - { - if (CMainFrame::m_dwPatternSetup&PATTERN_HILITETIMESIGS) { - CMainFrame::m_nRowSpacing = pSndFile->m_nRowsPerMeasure; - CMainFrame::m_nRowSpacing2 = pSndFile->m_nRowsPerBeat; - } - return true; - } - } - - return false; -} - - //rewbs.fix3116 void CMainFrame::OnKillFocus(CWnd* pNewWnd) //----------------------------------------- Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -441,7 +441,7 @@ wsprintf(s, "%d", nCurrentTempo); m_EditTempo.SetWindowText(s); } - int nRowsPerBeat = pSndFile->m_nRowsPerBeat; + int nRowsPerBeat = pSndFile->m_nCurrentRowsPerBeat; if (nRowsPerBeat != nCurrentRowsPerBeat) { if (nCurrentRowsPerBeat < 0) m_SpinRowsPerBeat.EnableWindow(TRUE); @@ -489,7 +489,6 @@ if ((nCurrentSpeed < 0) || (nCurrentTempo < 0)) return; if ((pMainFrm = CMainFrame::GetMainFrame()) != NULL) { - CModDoc *pModDoc = pMainFrm->GetModPlaying(); CSoundFile *pSndFile = pMainFrm->GetSoundFilePlaying(); if (pSndFile) { @@ -520,15 +519,13 @@ { if (nCurrentRowsPerBeat > 1) { - pSndFile->m_nRowsPerBeat = nCurrentRowsPerBeat - 1; - pModDoc->SetModified(true); + SetRowsPerBeat(nCurrentRowsPerBeat - 1); } } else { - if (nCurrentRowsPerBeat < 64) + if (nCurrentRowsPerBeat < pSndFile->m_nCurrentRowsPerMeasure) { - pSndFile->m_nRowsPerBeat = nCurrentRowsPerBeat + 1; - pModDoc->SetModified(true); + SetRowsPerBeat(nCurrentRowsPerBeat + 1); } } m_SpinRowsPerBeat.SetPos(0); @@ -536,8 +533,8 @@ //update pattern editor CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if (pMainFrm) { - pMainFrm->UpdateHighlights(); + if (pMainFrm) + { pMainFrm->PostMessage(WM_MOD_INVALIDATEPATTERNS, HINT_MPTOPTIONS); } } @@ -548,6 +545,37 @@ } +void CMainToolBar::SetRowsPerBeat(ROWINDEX nNewRPB) +//------------------------------------------------- +{ + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + if(pMainFrm == nullptr) + return; + CModDoc *pModDoc = pMainFrm->GetModPlaying(); + CSoundFile *pSndFile = pMainFrm->GetSoundFilePlaying(); + if(pModDoc == nullptr || pSndFile == nullptr) + return; + + pSndFile->m_nCurrentRowsPerBeat = nNewRPB; + PATTERNINDEX nPat = pSndFile->GetCurrentPattern(); + if(pSndFile->Patterns[nPat].GetOverrideSignature()) + { + if(nNewRPB <= pSndFile->Patterns[nPat].GetRowsPerMeasure()) + { + pSndFile->Patterns[nPat].SetSignature(nNewRPB, pSndFile->Patterns[nPat].GetRowsPerMeasure()); + pModDoc->SetModified(); + } + } else + { + if(nNewRPB <= pSndFile->m_nDefaultRowsPerMeasure) + { + pSndFile->m_nDefaultRowsPerBeat = nNewRPB; + pModDoc->SetModified(); + } + } +} + + /////////////////////////////////////////////////////////////////////////////////////////////////// // CModTreeBar Modified: trunk/OpenMPT/mptrack/Mainbar.h =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Mainbar.h 2010-08-09 14:09:36 UTC (rev 680) @@ -47,6 +47,9 @@ CMainToolBar() {} virtual ~CMainToolBar() {} +protected: + void SetRowsPerBeat(ROWINDEX nNewRPB); + public: //{{AFX_VIRTUAL(CMainToolBar) virtual BOOL SetHorizontal(); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-08-09 14:09:36 UTC (rev 680) @@ -25,7 +25,6 @@ #define MIN_AUDIO_BUFFERSIZE 1024 #define MAX_AUDIO_BUFFERSIZE 32768 // 32K buffers max #define MAINFRAME_TITLE "Open Modplug Tracker" -#define INFORMAL_VERSION "1.17RC3_" #define INIBUFFERSIZE MAX_PATH enum { @@ -185,7 +184,7 @@ #define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default #define PATTERN_MIDIRECORD 0x100000 // MIDI Record on by default //#define PATTERN_ALTERNTIVEBPMSPEED 0x200000 // deprecated -#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature +//#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature, deprecated (now always enabled) #define PATTERN_OLDCTXMENUSTYLE 0x800000 // mpt 1.16 pattern context menu style #define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute #define PATTERN_AUTODELAY 0x2000000 // automatically insert delay commands in pattern when entering notes @@ -430,7 +429,8 @@ // Pattern Setup static UINT gnPatternSpacing; static BOOL gbPatternVUMeters, gbPatternPluginNames, gbPatternRecord; - static DWORD m_dwPatternSetup, m_dwMidiSetup, m_nRowSpacing, m_nRowSpacing2, m_nKeyboardCfg, gnHotKeyMask; + static DWORD m_dwPatternSetup, m_dwMidiSetup, m_nKeyboardCfg, gnHotKeyMask; + static DWORD m_nRowSpacing, m_nRowSpacing2; // primary (measures) and secondary (beats) highlight static bool m_bHideUnavailableCtxMenuItems; // Sample Editor Setup static UINT m_nSampleUndoMaxBuffer; @@ -697,7 +697,6 @@ public: afx_msg void OnInitMenu(CMenu* pMenu); bool UpdateEffectKeys(void); - bool UpdateHighlights(void); afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -2046,7 +2046,7 @@ { case tempo_mode_alternative: Message.Format("Using alternative tempo interpretation.\n\nAssuming:\n. %d ticks per second\n. %d ticks per row\n. %d rows per beat\nthe tempo is approximately: %.20g BPM", - m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nRowsPerBeat, bpm); + m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nCurrentRowsPerBeat, bpm); break; case tempo_mode_modern: @@ -2056,7 +2056,7 @@ case tempo_mode_classic: default: Message.Format("Using standard tempo interpretation.\n\nAssuming:\n. A mod tempo (tick duration factor) of %d\n. %d ticks per row\n. %d rows per beat\nthe tempo is approximately: %.20g BPM", - m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nRowsPerBeat, bpm); + m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nCurrentRowsPerBeat, bpm); break; } @@ -3614,8 +3614,12 @@ if(ChangeNumChannels(nNewChannels, showCancelInRemoveDlg)) bShowLog = true; } + // Force update of pattern highlights + UpdateAllViews(NULL, HINT_PATTERNDATA); + + SetModified(); + if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame()); - SetModified(); } } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -368,6 +368,19 @@ } } + // Check for patterns with custom time signatures (fixing will be applied in the pattern container) + if(!CSoundFile::GetModSpecifications(nNewType).hasPatternSignatures) + { + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.GetNumPatterns(); nPat++) + { + if(m_SndFile.Patterns[nPat].GetOverrideSignature()) + { + AddToLog("WARNING: Pattern-specific time signatures are not supported by the new format.\n"); + break; + } + } + } + BEGIN_CRITICAL(); m_SndFile.ChangeModTypeTo(nNewType); if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -58,7 +58,6 @@ ON_COMMAND(IDC_CHECK2, OnPreviewChanged) ON_COMMAND(IDC_CHECK3, OnSettingsChanged) ON_COMMAND(IDC_CHECK4, OnPreviewChanged) - ON_COMMAND(IDC_CHECK5, OnHiliteTimeSigsChanged) END_MESSAGE_MAP() @@ -98,11 +97,6 @@ SetDlgItemInt(IDC_PRIMARYHILITE, CMainFrame::m_nRowSpacing); SetDlgItemInt(IDC_SECONDARYHILITE, CMainFrame::m_nRowSpacing2); - if (CMainFrame::m_dwPatternSetup & PATTERN_HILITETIMESIGS) CheckDlgButton(IDC_CHECK5, MF_CHECKED); - GetDlgItem(IDC_PRIMARYHILITE)->EnableWindow(!IsDlgButtonChecked(IDC_CHECK5)); - GetDlgItem(IDC_SECONDARYHILITE)->EnableWindow(!IsDlgButtonChecked(IDC_CHECK5)); - - OnColorSelChanged(); return TRUE; } @@ -114,9 +108,9 @@ int temp_nRowSpacing = GetDlgItemInt(IDC_PRIMARYHILITE); int temp_nRowSpacing2 = GetDlgItemInt(IDC_SECONDARYHILITE); - if ((temp_nRowSpacing2 >= temp_nRowSpacing)) + if ((temp_nRowSpacing2 > temp_nRowSpacing)) { - ::AfxMessageBox("Error: Primary highlight must be greater than secondary highlight.", MB_OK|MB_ICONEXCLAMATION); + ::AfxMessageBox("Error: Primary highlight must be greater than or equal secondary highlight.", MB_OK|MB_ICONEXCLAMATION); ::SetFocus(::GetDlgItem(m_hWnd, IDC_PRIMARYHILITE)); return 0; } @@ -127,12 +121,11 @@ void COptionsColors::OnOK() //------------------------- { - CMainFrame::m_dwPatternSetup &= ~(PATTERN_STDHIGHLIGHT|PATTERN_2NDHIGHLIGHT|PATTERN_EFFECTHILIGHT|PATTERN_SMALLFONT|PATTERN_HILITETIMESIGS); + CMainFrame::m_dwPatternSetup &= ~(PATTERN_STDHIGHLIGHT|PATTERN_2NDHIGHLIGHT|PATTERN_EFFECTHILIGHT|PATTERN_SMALLFONT); if (IsDlgButtonChecked(IDC_CHECK1)) CMainFrame::m_dwPatternSetup |= PATTERN_STDHIGHLIGHT; if (IsDlgButtonChecked(IDC_CHECK2)) CMainFrame::m_dwPatternSetup |= PATTERN_EFFECTHILIGHT; if (IsDlgButtonChecked(IDC_CHECK3)) CMainFrame::m_dwPatternSetup |= PATTERN_SMALLFONT; if (IsDlgButtonChecked(IDC_CHECK4)) CMainFrame::m_dwPatternSetup |= PATTERN_2NDHIGHLIGHT; - if (IsDlgButtonChecked(IDC_CHECK5)) CMainFrame::m_dwPatternSetup |= PATTERN_HILITETIMESIGS; CMainFrame::m_nRowSpacing = GetDlgItemInt(IDC_PRIMARYHILITE); CMainFrame::m_nRowSpacing2 = GetDlgItemInt(IDC_SECONDARYHILITE); @@ -335,19 +328,6 @@ SetModified(TRUE); } -void COptionsColors::OnHiliteTimeSigsChanged() -//-------------------------------------- -{ - bool enabling = !IsDlgButtonChecked(IDC_CHECK5); - if (enabling) { - SetDlgItemInt(IDC_PRIMARYHILITE, CMainFrame::m_nRowSpacing); - SetDlgItemInt(IDC_SECONDARYHILITE, CMainFrame::m_nRowSpacing2); - } - GetDlgItem(IDC_PRIMARYHILITE)->EnableWindow(enabling); - GetDlgItem(IDC_SECONDARYHILITE)->EnableWindow(enabling); - OnSettingsChanged(); -} - void COptionsColors::OnUpdateDialog() //----------------------------------- { Modified: trunk/OpenMPT/mptrack/Moptions.h =================================================================== --- trunk/OpenMPT/mptrack/Moptions.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Moptions.h 2010-08-09 14:09:36 UTC (rev 680) @@ -73,7 +73,6 @@ afx_msg void OnDrawItem(int nIdCtl, LPDRAWITEMSTRUCT lpdis); afx_msg void OnColorSelChanged(); afx_msg void OnSettingsChanged(); - afx_msg void OnHiliteTimeSigsChanged(); afx_msg void OnSelectColor1(); afx_msg void OnSelectColor2(); afx_msg void OnSelectColor3(); Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -1824,10 +1824,10 @@ SetDlgItemText(IDC_EDIT3, CString("OpenMPT ") + MptVersion::str + " (development build)"); m_heContact.SetWindowText( -"Contact / Discussion:\r\n\ -http://openmpt.com/forum/\r\n\ -\r\nUpdates:\r\n\ -http://sourceforge.net/projects/modplug/"); + "Contact / Discussion:\r\n" + "http://openmpt.com/forum/\r\n" + "\r\nUpdates:\r\n" + "http://sourceforge.net/projects/modplug/"); const char* const pArrCredit = { "OpenMPT / Modplug Tracker|" @@ -1869,7 +1869,7 @@ "LPChip, Ganja, Diamond, Nofold, Goor00, Georg|" "Skilletaudio, Squirrel Havoc, Snu, Anboi|" "Sam Zen, BooT-SectoR-ViruZ, 33, Waxhead|" - "KrazyKatz, Bvanoudtshoorn|" + "KrazyKatz, Bvanoudtshoorn, Skaven|" "|||||||" "VST PlugIn Technology by Steinberg Media Technologies GmbH|" "ASIO Technology by Steinberg Media Technologies GmbH|" Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -780,20 +780,28 @@ m_pbmpOldGrid = m_dcGrid.SelectObject(&m_bmpGrid); //do draw - int width=m_rcClient.right-m_rcClient.left; - int nPrevTick=-1; + CSoundFile *pSndFile; + int width = m_rcClient.right - m_rcClient.left; + int nPrevTick = -1; int nTick, nRow; - for (int x=3; x<width; x++) + int nRowsPerBeat = 1, nRowsPerMeasure = 1; + if(GetDocument() != nullptr && (pSndFile = GetDocument()->GetSoundFile()) != nullptr) { + nRowsPerBeat = pSndFile->m_nDefaultRowsPerBeat; + nRowsPerMeasure = pSndFile->m_nDefaultRowsPerMeasure; + } + + for (int x = 3; x < width; x++) + { nTick = QuickScreenToTick(x, cachedScrollPos); if (nTick != nPrevTick && !(nTick%speed)) { - nPrevTick=nTick; - nRow=nTick/speed; + nPrevTick = nTick; + nRow = nTick / speed; - if (nRow % max(1, CMainFrame::m_nRowSpacing) == 0) + if (nRow % max(1, nRowsPerMeasure) == 0) m_dcGrid.SelectObject(CMainFrame::penGray80); - else if (nRow % max(1, CMainFrame::m_nRowSpacing2) == 0) + else if (nRow % max(1, nRowsPerBeat) == 0) m_dcGrid.SelectObject(CMainFrame::penGray55); else m_dcGrid.SelectObject(CMainFrame::penGray33); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -1142,7 +1142,7 @@ //-------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc) + if (pModDoc && pModDoc->GetSoundFile() && pModDoc->GetSoundFile()->Patterns.IsValidPat(m_nPattern)) { CPatternPropertiesDlg dlg(pModDoc, m_nPattern, this); if (dlg.DoModal()) @@ -2583,7 +2583,8 @@ BeginWaitCursor(); //First adding channel as the last channel... - if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { + if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels + 1)) + { pSndFile->InitChannel(pSndFile->m_nChannels-1); //...and then moving it to right position. pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); @@ -2607,7 +2608,8 @@ if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; BeginWaitCursor(); - if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { + if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels + 1)) + { pSndFile->InitChannel(pSndFile->m_nChannels-1); pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); @@ -3476,6 +3478,7 @@ } + LRESULT CViewPattern::OnCustomKeyMsg(WPARAM wParam, LPARAM /*lParam*/) //---------------------------------------------------------------- { @@ -3523,22 +3526,22 @@ // Pattern navigation: case kcPatternJumpUph1Select: - case kcPatternJumpUph1: CursorJump(CMainFrame::m_nRowSpacing, true, false); return wParam; + case kcPatternJumpUph1: CursorJump(GetRowsPerMeasure(), true, false); return wParam; case kcPatternJumpDownh1Select: - case kcPatternJumpDownh1: CursorJump(CMainFrame::m_nRowSpacing, false, false); return wParam; + case kcPatternJumpDownh1: CursorJump(GetRowsPerMeasure(), false, false); return wParam; case kcPatternJumpUph2Select: - case kcPatternJumpUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, false); return wParam; + case kcPatternJumpUph2: CursorJump(GetRowsPerBeat(), true, false); return wParam; case kcPatternJumpDownh2Select: - case kcPatternJumpDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, false); return wParam; + case kcPatternJumpDownh2: CursorJump(GetRowsPerBeat(), false, false); return wParam; case kcPatternSnapUph1Select: - case kcPatternSnapUph1: CursorJump(CMainFrame::m_nRowSpacing, true, true); return wParam; + case kcPatternSnapUph1: CursorJump(GetRowsPerMeasure(), true, true); return wParam; case kcPatternSnapDownh1Select: - case kcPatternSnapDownh1: CursorJump(CMainFrame::m_nRowSpacing, false, true); return wParam; + case kcPatternSnapDownh1: CursorJump(GetRowsPerMeasure(), false, true); return wParam; case kcPatternSnapUph2Select: - case kcPatternSnapUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, true); return wParam; + case kcPatternSnapUph2: CursorJump(GetRowsPerBeat(), true, true); return wParam; case kcPatternSnapDownh2Select: - case kcPatternSnapDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, true); return wParam; + case kcPatternSnapDownh2: CursorJump(GetRowsPerBeat(), false, true); return wParam; case kcNavigateDownSelect: case kcNavigateDown: SetCurrentRow(m_nRow+1, TRUE); return wParam; @@ -4085,7 +4088,7 @@ void CViewPattern::TempEnterOctave(int val) -//--------------------------------------------- +//----------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -5436,3 +5439,29 @@ PLUGINDEX nPlg = (PLUGINDEX)(mSelStart->instr - 1); pModDoc->TogglePluginEditor(nPlg); } + + +ROWINDEX CViewPattern::GetRowsPerBeat() const +//------------------------------------------- +{ + CSoundFile *pSndFile; + if(GetDocument() == nullptr || (pSndFile = GetDocument()->GetSoundFile()) == nullptr) + return 0; + if(!pSndFile->Patterns[m_nPattern].GetOverrideSignature()) + return pSndFile->m_nDefaultRowsPerBeat; + else + return pSndFile->Patterns[m_nPattern].GetRowsPerBeat(); +} + + +ROWINDEX CViewPattern::GetRowsPerMeasure() const +//---------------------------------------------- +{ + CSoundFile *pSndFile; + if(GetDocument() == nullptr || (pSndFile = GetDocument()->GetSoundFile()) == nullptr) + return 0; + if(!pSndFile->Patterns[m_nPattern].GetOverrideSignature()) + return pSndFile->m_nDefaultRowsPerMeasure; + else + return pSndFile->Patterns[m_nPattern].GetRowsPerMeasure(); +} Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/View_pat.h 2010-08-09 14:09:36 UTC (rev 680) @@ -130,6 +130,7 @@ void UpdateIndicator(); void UpdateXInfoText(); //rewbs.xinfo void UpdateColors(); + int GetXScrollPos() const { return m_nXScroll; } int GetYScrollPos() const { return m_nYScroll; } int GetColumnWidth() const { return m_szCell.cx; } @@ -142,6 +143,9 @@ POINT GetPointFromPosition(DWORD dwPos); DWORD GetPositionFromPoint(POINT pt); DWORD GetDragItem(CPoint point, LPRECT lpRect); + ROWINDEX GetRowsPerBeat() const; + ROWINDEX GetRowsPerMeasure() const; + void InvalidatePattern(BOOL bHdr=FALSE); void InvalidateRow(int n=-1); void InvalidateArea(DWORD dwBegin, DWORD dwEnd); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -778,8 +778,8 @@ } if ((value & kVstTimeSigValid) && pSndFile) { timeInfo.flags |= kVstTimeSigValid; - timeInfo.timeSigNumerator = pSndFile->m_nRowsPerBeat; - timeInfo.timeSigDenominator = pSndFile->m_nRowsPerMeasure; + timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerBeat; + timeInfo.timeSigDenominator = pSndFile->m_nCurrentRowsPerMeasure; } } return (long)&timeInfo; @@ -1460,8 +1460,6 @@ VOID CSelectPluginDlg::OnAddPlugin() //---------------------------------- { - CHAR *pszFileNames; - FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog(true, "dll", "", "VST Plugins (*.dll)|*.dll||", CMainFrame::GetWorkingDirectory(DIR_PLUGINS), Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -144,8 +144,8 @@ m_nType = m_pSndFile->m_nType; m_nChannels = m_pSndFile->m_nChannels; m_dwSongFlags = m_pSndFile->m_dwSongFlags; - SetDlgItemInt(IDC_ROWSPERBEAT, m_pSndFile->m_nRowsPerBeat); - SetDlgItemInt(IDC_ROWSPERMEASURE, m_pSndFile->m_nRowsPerMeasure); + SetDlgItemInt(IDC_ROWSPERBEAT, m_pSndFile->m_nDefaultRowsPerBeat); + SetDlgItemInt(IDC_ROWSPERMEASURE, m_pSndFile->m_nDefaultRowsPerMeasure); m_TypeBox.SetItemData(m_TypeBox.AddString("ProTracker MOD"), MOD_TYPE_MOD); m_TypeBox.SetItemData(m_TypeBox.AddString("ScreamTracker S3M"), MOD_TYPE_S3M); @@ -397,9 +397,9 @@ int temp_nRPB = GetDlgItemInt(IDC_ROWSPERBEAT); int temp_nRPM = GetDlgItemInt(IDC_ROWSPERMEASURE); - if ((temp_nRPB >= temp_nRPM)) + if ((temp_nRPB > temp_nRPM)) { - ::AfxMessageBox("Error: Rows per measure must be greater than rows per beat.", MB_OK|MB_ICONEXCLAMATION); + ::AfxMessageBox("Error: Rows per measure must be greater than or equal rows per beat.", MB_OK|MB_ICONEXCLAMATION); GetDlgItem(IDC_ROWSPERMEASURE)->SetFocus(); return false; } @@ -454,12 +454,14 @@ } sel = m_TempoModeBox.GetCurSel(); - if (sel >= 0) { + if (sel >= 0) + { m_pSndFile->m_nTempoMode = m_TempoModeBox.GetItemData(sel); } sel = m_PlugMixBox.GetCurSel(); - if (sel >= 0) { + if (sel >= 0) + { m_pSndFile->m_nMixLevels = m_PlugMixBox.GetItemData(sel); m_pSndFile->m_pConfig->SetMixLevels(m_pSndFile->m_nMixLevels); m_pSndFile->RecalculateGainForAllPlugs(); @@ -473,9 +475,8 @@ if(IsDlgButtonChecked(IDC_CHK_OLDRANDOM)) m_pSndFile->SetModFlag(MSF_OLDVOLSWING, true); } - m_pSndFile->m_nRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); - m_pSndFile->m_nRowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE); - + m_pSndFile->m_nDefaultRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); + m_pSndFile->m_nDefaultRowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE); if(CChannelManagerDlg::sharedInstance(FALSE) && CChannelManagerDlg::sharedInstance()->IsDisplayed()) CChannelManagerDlg::sharedInstance()->Update(); @@ -975,18 +976,21 @@ } // Effect int effectIndex = -1; - if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) && (m_pModDoc)) { + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) && (m_pModDoc)) + { int n = -1; // unused parameter adjustment effectIndex = combo->GetItemData(combo->GetCurSel()); m_nCommand = m_pModDoc->GetEffectFromIndex(effectIndex, n); } // Param m_nParam = 0; - if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO6)) != NULL) { + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO6)) != NULL) + { m_nParam = combo->GetItemData(combo->GetCurSel()); // Apply parameter value mask if required (e.g. SDx has mask D0). - if (effectIndex > -1) { + if (effectIndex > -1) + { m_nParam |= m_pModDoc->GetEffectMaskFromIndex(effectIndex); } } @@ -1007,6 +1011,7 @@ BEGIN_MESSAGE_MAP(CPatternPropertiesDlg, CDialog) ON_COMMAND(IDC_BUTTON_HALF, OnHalfRowNumber) ON_COMMAND(IDC_BUTTON_DOUBLE, OnDoubleRowNumber) + ON_COMMAND(IDC_CHECK1, OnOverrideSignature) END_MESSAGE_MAP() BOOL CPatternPropertiesDlg::OnInitDialog() @@ -1015,30 +1020,47 @@ CComboBox *combo; CDialog::OnInitDialog(); combo = (CComboBox *)GetDlgItem(IDC_COMBO1); - CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : NULL; + const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; if ((pSndFile) && (m_nPattern < pSndFile->Patterns.Size()) && (combo)) { CHAR s[256]; UINT nrows = pSndFile->Patterns[m_nPattern].GetNumRows(); -// -> CODE#0008 -// -> DESC="#define to set pattern size" -// for (UINT irow=32; irow<=256; irow++) -// for (UINT irow=32; irow<=MAX_PATTERN_ROWS; irow++) const CModSpecifications& specs = pSndFile->GetModSpecifications(); - for (UINT irow=specs.patternRowsMin; irow<=specs.patternRowsMax; irow++) -// -! BEHAVIOUR_CHANGE#0008 + for (UINT irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++) { wsprintf(s, "%d", irow); combo->AddString(s); } combo->SetCurSel(nrows - specs.patternRowsMin); - wsprintf(s, "Pattern #%d:\x0d\x0a %d row%s (%dK)", + wsprintf(s, "Pattern #%d: %d row%s (%dK)", m_nPattern, pSndFile->Patterns[m_nPattern].GetNumRows(), (pSndFile->Patterns[m_nPattern].GetNumRows() == 1) ? "" : "s", - (pSndFile->Patterns[m_nPattern].GetNumRows() * pSndFile->m_nChannels * sizeof(MODCOMMAND))/1024); + (pSndFile->Patterns[m_nPattern].GetNumRows() * pSndFile->m_nChannels * sizeof(MODCOMMAND)) / 1024); SetDlgItemText(IDC_TEXT1, s); + + // Window title + CHAR szName[MAX_PATTERNNAME + 2]; + pSndFile->GetPatternName(m_nPattern, szName, MAX_PATTERNNAME); + if(strlen(szName)) + { + strcat(szName, ")"); + } + wsprintf(s, "Pattern Properties for Pattern #%d%s%s", m_nPattern, strlen(szName) ? " (" : "", szName); + SetWindowText(s); + + // pattern time signature + const bool bOverride = pSndFile->Patterns[m_nPattern].GetOverrideSignature(); + UINT nRPB = pSndFile->Patterns[m_nPattern].GetRowsPerBeat(), nRPM = pSndFile->Patterns[m_nPattern].GetRowsPerMeasure(); + if(nRPB == 0 || !bOverride) nRPB = pSndFile->m_nDefaultRowsPerBeat; + if(nRPM == 0 || !bOverride) nRPM = pSndFile->m_nDefaultRowsPerMeasure; + + GetDlgItem(IDC_CHECK1)->EnableWindow(pSndFile->GetModSpecifications().hasPatternSignatures ? TRUE : FALSE); + CheckDlgButton(IDC_CHECK1, bOverride ? MF_CHECKED : MF_UNCHECKED); + SetDlgItemInt(IDC_EDIT_ROWSPERBEAT, nRPB, FALSE); + SetDlgItemInt(IDC_EDIT_ROWSPERMEASURE, nRPM, FALSE); + OnOverrideSignature(); } return TRUE; } @@ -1047,50 +1069,76 @@ void CPatternPropertiesDlg::OnHalfRowNumber() //------------------------------------------- { - CComboBox *combo; - CString str; - combo = (CComboBox *)GetDlgItem(IDC_COMBO1); - if(combo->GetCount() < 1) return; - if(combo->GetCurSel() == CB_ERR) combo->SetCurSel(0); + const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if(pSndFile == nullptr) + return; - combo->GetLBText(combo->GetCurSel(), str); - int sel = atoi(str)/2; - combo->GetLBText(0, str); - const int row0 = atoi(str); - if(sel < row0) sel = row0; - combo->SetCurSel(sel - row0); + UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + nRows /= 2; + if(nRows < pSndFile->GetModSpecifications().patternRowsMin) + nRows = pSndFile->GetModSpecifications().patternRowsMin; + SetDlgItemInt(IDC_COMBO1, nRows, FALSE); } void CPatternPropertiesDlg::OnDoubleRowNumber() //--------------------------------------------- { - CComboBox *combo; - CString str; - combo = (CComboBox *)GetDlgItem(IDC_COMBO1); - if(combo->GetCount() < 1) return; - if(combo->GetCurSel() == CB_ERR) combo->SetCurSel(0); + const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if(pSndFile == nullptr) + return; - combo->GetLBText(combo->GetCurSel(), str); - int sel = 2*atoi(str); - combo->GetLBText(0, str); - const int row0 = atoi(str); - combo->GetLBText(combo->GetCount()-1, str); - if(sel > atoi(str)) sel = atoi(str); - combo->SetCurSel(sel - row0); + UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + nRows *= 2; + if(nRows > pSndFile->GetModSpecifications().patternRowsMax) + nRows = pSndFile->GetModSpecifications().patternRowsMax; + SetDlgItemInt(IDC_COMBO1, nRows, FALSE); } +void CPatternPropertiesDlg::OnOverrideSignature() +//----------------------------------------------- +{ + GetDlgItem(IDC_EDIT_ROWSPERBEAT)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); + GetDlgItem(IDC_EDIT_ROWSPERMEASURE)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); +} + + void CPatternPropertiesDlg::OnOK() //-------------------------------- { - int n = GetDlgItemInt(IDC_COMBO1); -// -> CODE#0008 -// -> DESC="#define to set pattern size" -// if ((n >= 2) && (n <= 256) && (m_pModDoc)) m_pModDoc->ResizePattern(m_nPattern, n); - //if ((n >= 2) && (n <= MAX_PATTERN_ROWS) && (m_pModDoc)) m_pModDoc->ResizePattern(m_nPattern, n); - if(m_pModDoc) m_pModDoc->GetSoundFile()->Patterns[m_nPattern].Resize(n); -// -! BEHAVIOUR_CHANGE#0008 + CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if(pSndFile) + { + // Update pattern signature if necessary + if(pSndFile->GetModSpecifications().hasPatternSignatures) + { + if(IsDlgButtonChecked(IDC_CHECK1)) // Enable signature + { + ROWINDEX nNewBeat = (ROWINDEX)GetDlgItemInt(IDC_EDIT_ROWSPERBEAT, NULL, FALSE), nNewMeasure = (ROWINDEX)GetDlgItemInt(IDC_EDIT_ROWSPERMEASURE, NULL, FALSE); + if(nNewBeat != pSndFile->Patterns[m_nPattern].GetRowsPerBeat() || nNewMeasure != pSndFile->Patterns[m_nPattern].GetRowsPerMeasure()) + { + if(!pSndFile->Patterns[m_nPattern].SetSignature(nNewBeat, nNewMeasure)) + { + MessageBox("Invalid time signature!", "Pattern Properties", MB_OK|MB_ICONEXCLAMATION); + GetDlgItem(IDC_EDIT_ROWSPERBEAT)->SetFocus(); + return; + } + m_pModDoc->SetModified(); + } + } else // Disable signature + { + if(pSndFile->Patterns[m_nPattern].GetOverrideSignature()) + { + pSndFile->Patterns[m_nPattern].RemoveSignature(); + m_pModDoc->SetModified(); + } + } + } + + UINT n = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + pSndFile->Patterns[m_nPattern].Resize(n); + } CDialog::OnOK(); } Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-08-09 14:09:36 UTC (rev 680) @@ -213,6 +213,7 @@ virtual void OnOK(); afx_msg void OnHalfRowNumber(); afx_msg void OnDoubleRowNumber(); + afx_msg void OnOverrideSignature(); DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-08-09 14:09:36 UTC (rev 680) @@ -369,33 +369,32 @@ CAPTION "Colours" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,91,74,10 - EDITTEXT IDC_PRIMARYHILITE,114,90,21,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,109,80,10 - EDITTEXT IDC_SECONDARYHILITE,114,108,21,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10 - CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10 - PUSHBUTTON "MPT",IDC_BUTTON5,126,246,30,15 - PUSHBUTTON "Blue",IDC_BUTTON6,198,246,30,15 - PUSHBUTTON "Green",IDC_BUTTON7,162,246,30,15 - PUSHBUTTON "Buzz",IDC_BUTTON8,234,246,30,15 - CONTROL "Colour",IDC_BUTTON1,"Button",BS_OWNERDRAW,25,194,51,15 - CONTROL "Colour",IDC_BUTTON2,"Button",BS_OWNERDRAW,98,194,51,15 - CONTROL "Colour",IDC_BUTTON3,"Button",BS_OWNERDRAW,168,194,51,15 - LTEXT "Background:",IDC_TEXT1,25,183,60,8 - LTEXT "Foreground:",IDC_TEXT2,98,183,62,8 - LTEXT "Highlight:",IDC_TEXT3,169,185,61,8 - GROUPBOX "",IDC_STATIC,5,5,260,211 - LTEXT "Select colour for:",IDC_STATIC,15,15,63,8 - LTEXT "rows",IDC_STATIC,138,92,16,8 - LTEXT "rows",IDC_STATIC,138,110,16,8 - CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43 - CONTROL "Set highlights to songs' time signatures",IDC_CHECK5, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10 - PUSHBUTTON "Load...",IDC_LOAD_COLORSCHEME,18,246,42,15 - PUSHBUTTON "Save...",IDC_SAVE_COLORSCHEME,66,246,42,15 - GROUPBOX "Colour Presets",IDC_STATIC,6,228,264,42 + COMBOBOX IDC_COMBO1,84,114,114,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,18,114,10 + CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,36,114,10 + CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,84,10 + EDITTEXT IDC_PRIMARYHILITE,102,54,24,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per measure (default)",IDC_STATIC,132,56,126,8 + CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,72,80,10 + EDITTEXT IDC_SECONDARYHILITE,102,72,24,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per beat (default)",IDC_STATIC,132,74,126,8 + LTEXT "Note: Songs' time signatures will override the default highlight values",IDC_STATIC,18,90,240,24 + CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,76,132,114,43 + LTEXT "Background:",IDC_TEXT1,36,185,60,8 + CONTROL "Colour",IDC_BUTTON1,"Button",BS_OWNERDRAW,36,196,51,15 + LTEXT "Foreground:",IDC_TEXT2,109,185,62,8 + CONTROL "Colour",IDC_BUTTON2,"Button",BS_OWNERDRAW,109,196,51,15 + LTEXT "Highlight:",IDC_TEXT3,180,188,61,8 + CONTROL "Colour",IDC_BUTTON3,"Button",BS_OWNERDRAW,179,196,51,15 + PUSHBUTTON "Load...",IDC_LOAD_COLORSCHEME,18,252,42,15 + PUSHBUTTON "Save...",IDC_SAVE_COLORSCHEME,66,252,42,15 + PUSHBUTTON "MPT",IDC_BUTTON5,126,252,30,15 + PUSHBUTTON "Green",IDC_BUTTON7,162,252,30,15 + PUSHBUTTON "Blue",IDC_BUTTON6,198,252,30,15 + PUSHBUTTON "Buzz",IDC_BUTTON8,234,252,30,15 + GROUPBOX "",IDC_STATIC,5,5,260,217 + LTEXT "Select colour for:",IDC_STATIC,18,116,63,8 + GROUPBOX "Colour Presets",IDC_STATIC,6,234,264,42 END IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281 @@ -694,7 +693,7 @@ GROUPBOX "Tuning (experimental)",IDC_STATIC,364,28,92,28 END -IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 311 +IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 305 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Song Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x0 @@ -717,21 +716,21 @@ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,222,12 CONTROL "Old &random variation behaviour for instruments",IDC_CHK_OLDRANDOM, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,222,12 - COMBOBOX IDC_COMBO_TEMPOMODE,36,217,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_ROWSPERBEAT,156,217,24,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_ROWSPERMEASURE,156,234,24,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_EDIT_CREATEDWITH,78,271,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - EDITTEXT IDC_EDIT_SAVEDWITH,78,289,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE + COMBOBOX IDC_COMBO_TEMPOMODE,12,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_ROWSPERBEAT,132,210,24,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_ROWSPERMEASURE,132,228,24,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_EDIT_CREATEDWITH,78,265,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE + EDITTEXT IDC_EDIT_SAVEDWITH,78,283,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48 GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 - GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,78 - GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,204,246,48 - LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,218,21,8 - LTEXT "Rows/beat",IDC_TEXT_ROWSPERBEAT,186,218,36,8 - LTEXT "Rows/measure",IDC_TEXT_ROWSPERMEASURE,186,236,49,8 - GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,257,246,48 - RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,273,54,8 - RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,289,54,8 + GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,72 + GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,198,246,48 + LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,210,21,8 + LTEXT "Rows per beat",IDC_TEXT_ROWSPERBEAT,162,212,84,8 + LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,162,230,84,8 + GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,251,246,48 + RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,267,54,8 + RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,283,54,8 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 @@ -903,19 +902,26 @@ CONTROL "Replace All (No confirmation)",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,125,144,10 END -IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 169, 65 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 190, 127 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Pattern properties" +CAPTION "Pattern Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "Rows:",IDC_STATIC,10,10,21,8 - COMBOBOX IDC_COMBO1,12,19,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Pattern Info",IDC_TEXT1,10,36,95,25 - DEFPUSHBUTTON "OK",IDOK,115,4,50,14 - PUSHBUTTON "Cancel",IDCANCEL,115,22,50,14 - PUSHBUTTON "/2",IDC_BUTTON_HALF,117,47,21,14 - PUSHBUTTON "x2",IDC_BUTTON_DOUBLE,144,47,21,14 + COMBOBOX IDC_COMBO1,6,18,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&/2",IDC_BUTTON_HALF,60,18,18,12 + PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,84,18,18,12 + CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,48,174,12 + EDITTEXT IDC_EDIT_ROWSPERBEAT,18,66,30,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_EDIT_ROWSPERMEASURE,18,84,30,12,ES_AUTOHSCROLL | ES_NUMBER + DEFPUSHBUTTON "OK",IDOK,132,6,50,14 + PUSHBUTTON "Cancel",IDCANCEL,132,24,50,14 + LTEXT "Rows:",IDC_STATIC,6,6,108,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,42,174,1 + LTEXT "Rows per beat",IDC_STATIC,54,68,126,8 + LTEXT "Rows per measure",IDC_STATIC,54,86,126,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,102,174,1 + LTEXT "Pattern Info",IDC_TEXT1,6,108,174,14 END IDD_PATTERN_EDITCOMMAND DIALOGEX 0, 0, 214, 65 @@ -1596,7 +1602,7 @@ IDD_MODDOC_MODTYPE, DIALOG BEGIN RIGHTMARGIN, 248 - BOTTOMMARGIN, 304 + BOTTOMMARGIN, 298 END IDD_SHOWLOG, DIALOG @@ -1621,9 +1627,9 @@ IDD_PATTERN_PROPERTIES, DIALOG BEGIN LEFTMARGIN, 4 - RIGHTMARGIN, 165 + RIGHTMARGIN, 186 TOPMARGIN, 4 - BOTTOMMARGIN, 61 + BOTTOMMARGIN, 123 END IDD_PAGEEDITEFFECT, DIALOG Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/resource.h 2010-08-09 14:09:36 UTC (rev 680) @@ -951,6 +951,8 @@ #define IDC_LIST_SAMPLEGEN_PRESETS 2425 #define IDC_CHECK_UNDO 2426 #define IDC_CHK_REMEMBERSETTINGS 2427 +#define IDC_EDIT_ROWSPERBEAT 2428 +#define IDC_EDIT_ROWSPERMEASURE 2429 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1217,7 +1219,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 526 #define _APS_NEXT_COMMAND_VALUE 60452 -#define _APS_NEXT_CONTROL_VALUE 2428 +#define _APS_NEXT_CONTROL_VALUE 2430 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/mptrack/version.h 2010-08-09 14:09:36 UTC (rev 680) @@ -13,8 +13,8 @@ //Version definitions. The only thing that needs to be changed when changing version number. #define VER_MAJORMAJOR 1 -#define VER_MAJOR 18 -#define VER_MINOR 03 +#define VER_MAJOR 19 +#define VER_MINOR 00 #define VER_MINORMINOR 00 //Creates version number from version parts that appears in version string. Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-06 18:33:04 UTC (rev 679) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-09 14:09:36 UTC (rev 680) @@ -25,13 +25,14 @@ #define str_LoadingIncompatibleVersion TEXT("The file informed that it is incompatible with this version of OpenMPT. Loading was terminated.\n") #define str_LoadingMoreRecentVersion TEXT("The loaded file was made with a more recent OpenMPT version and this version may not be able to load all the features or play the file correctly.\n") -const uint16 verMptFileVer = 0x890; +const uint16 verMptFileVer = 0x891; const uint16 verMptFileVerLoadLimit = 0x1000; // If cwtv-field is greater or equal to this value, // the MPTM file will not be loaded. /* MPTM version history for cwtv-field in IT header: -0x88F(1.18.01.00) -> 0x890(1.18.02.00): Removed volume command velocity :xy, added delay-cut command :xy. +0x890(1.18.02.00) -> 0x891(1.19.00.00): Pattern-specific time signatures +0x88F(1.18.01.00) -> 0x890(1.18.02.00): Removed volume command velocity :xy, added delay-cut command :xy. 0x88E(1.17.02.50) -> 0x88F(1.18.01.00): Numerous changes 0x88D(1.17.02.49) -> 0x88E(1.17.02.50): Changed ID to that of IT and undone the orderlist change done in 0x88A->0x88B. Now extended orderlist is saved as extension. @@ -531,13 +532,11 @@ if(pifh->cwtv >= 0x213 && !(interpretModplugmade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 01))) { - m_nRowsPerBeat = pifh->highlight_minor; - m_nRowsPerMeasure = pifh->highlight_major; - if(m_nRowsPerBeat + m_nRowsPerMeasure == 0) + // MPT 1.09, 1.07 and most likely other old MPT versions leave this blank + if(pifh->highlight_minor + pifh->highlight_major != 0) { - // MPT 1.09, 1.07 and most likely other old MPT versions leave this blank - m_nRowsPerBeat = 4; - m_nRowsPerMeasure = 16; + m_nDefaultRowsPerBeat = pifh->highlight_minor; + m_nDefaultRowsPerMeasure = pifh->highlight_major; } } @@ -1159,8 +1158,8 @@ header.id = 0x4D504D49; lstrcpyn(header.songname, m_szNames[0], 26); - header.highlight_minor = (BYTE)(m_nRowsPerBeat & 0xFF); - header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF); + header.highlight_minor = (BYTE)(m_nDefaultRowsPerBeat & 0xFF); + header.highlight_major = (BYTE)(m_nDefaultRowsPerMeasure & 0xFF); if(GetType() == MOD_TYPE_MPT) { @@ -1457,6 +1456,9 @@ patinfo[2] = 0; patinfo[3] = 0; + if(Patterns[npat].GetOverrideSignature()) + bNeedsMptPatSave = true; + // Check for empty pattern if (Patterns[npat].GetNumRows() == 64) { @@ -1800,8 +1802,8 @@ header.id = 0x4D504D49; lstrcpyn(header.songname, m_szNames[0], 26); - header.highlight_minor = (BYTE)(m_nRowsPerBeat & 0xFF); - header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF); + header.highlight_minor = (BYTE)(m_nDefaultRowsPerBeat & 0xFF); + header.highlight_major = (BYTE)(m_nDefaultRowsPerMeasure & 0xFF); // An additional "---" pattern is ap... [truncated message content] |