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