From: <Rel...@us...> - 2006-12-28 17:09:57
|
Revision: 170 http://svn.sourceforge.net/modplug/?rev=170&view=rev Author: Relabsoluness Date: 2006-12-28 09:09:51 -0800 (Thu, 28 Dec 2006) Log Message: ----------- <Relabs> Added mptrack_generic.exe to the test branch. . <Relabs> Fixed a few possibilities of creating buffer overruns related to tuning notename handling. . <Relabs> Fixed channelmanager not updating channel states correctly when reordering channels. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/bin/mptrack_Generic.exe branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -199,40 +199,28 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - // Rearrange patterns content - for(i = 0; i < m_pSndFile->Patterns.Size(); i++){ + //Creating new order-vector for ReArrangeChannels. + vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels); + for(i = 0; i<nChannels; i++) + { + newChnOrder.push_back(newpat[i]); + } + if(m_pSndFile->ReArrangeChannels(newChnOrder) != nChannels) + { + MessageBox("Rearranging channels failed"); + END_CRITICAL(); + EndWaitCursor(); - // Allocate a new empty pattern to replace current pattern at i'th position in pattern array - p = m_pSndFile->Patterns[i]; - if(p) newp = CSoundFile::AllocatePattern(m_pSndFile->PatternSize[i], nChannels); + ResetState(TRUE,TRUE,TRUE,TRUE,TRUE); + LeaveCriticalSection(&applying); - if(p && !newp){ - END_CRITICAL(); - EndWaitCursor(); - LeaveCriticalSection(&applying); - ::MessageBox(NULL, "Pattern Data is corrupted!!!", "ERROR: Not enough memory to rearrange channels!", MB_ICONERROR | MB_OK); - return; - } - - // Copy data from old pattern taking care of new channel reodering - if(p != NULL){ - for(j = 0 ; j < m_pSndFile->PatternSize[i] ; j++){ - for(k = 0 ; k < nChannels ; k++) - memcpy(&newp[j*nChannels + k],&p[j*m_pSndFile->m_nChannels + newpat[k]],sizeof(MODCOMMAND)); - } - // Set new pattern in pattern array & free previous pattern - m_pSndFile->Patterns[i] = newp; - CSoundFile::FreePattern(p); - } + return; } + - // Copy channel settings - for(i = 0 ; i < m_pSndFile->m_nChannels ; i++) settings[i] = m_pSndFile->ChnSettings[i]; - // Redistribute channel setting & update manager internal store memory for(i = 0 ; i < nChannels ; i++){ if(i != newpat[i]){ - m_pSndFile->ChnSettings[i] = settings[newpat[i]]; memory[0][i] = newMemory[0][newpat[i]]; memory[1][i] = newMemory[1][newpat[i]]; memory[2][i] = newMemory[2][newpat[i]]; @@ -240,23 +228,13 @@ memory[3][i] = i; } - // Also update record states (unfortunetely they are not part of channel settings) - for(i = 0 ; i < nChannels ; i++) newMemory[1][i] = pModDoc->IsChannelRecord(i); - - pModDoc->ReinitRecordState(); - for(i = 0 ; i < nChannels ; i++){ - if(newMemory[1][newpat[i]] == 1) pModDoc->Record1Channel(i,TRUE); - if(newMemory[1][newpat[i]] == 2) pModDoc->Record2Channel(i,TRUE); - } - - // Update new number of channels - m_pSndFile->m_nChannels = nChannels; if(pActiveMod == pModDoc){ i = m_pSndFile->GetCurrentPos(); m_pSndFile->m_dwSongFlags &= ~SONG_STEP; m_pSndFile->SetCurrentPos(0); m_pSndFile->SetCurrentPos(i); } + END_CRITICAL(); EndWaitCursor(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -164,8 +164,9 @@ // Note s[0] = 0; - - if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", pSndFile->GetNoteName(nPos+1, m_nInstrument).c_str()); + string temp = pSndFile->GetNoteName(nPos+1, m_nInstrument); + temp.resize(4); + if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", temp.c_str()); rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note @@ -178,7 +179,12 @@ UINT n = penv->NoteMap[nPos]; if (n == 0xFF) strcpy(s, "==="); else if (n == 0xFE) strcpy(s, "^^^"); else - if (n <= 120) wsprintf(s, "%s", pSndFile->GetNoteName(n, m_nInstrument).c_str()); + if (n <= 120) + { + string temp = pSndFile->GetNoteName(n, m_nInstrument); + temp.resize(4); + wsprintf(s, "%s", temp.c_str()); + } } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow); if ((nPos == (int)m_nNote) && (!m_bIns)) @@ -1351,8 +1357,8 @@ case IDC_CHECK_PITCHTEMPOLOCK: if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) { - const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); - ASSERT(str.size() < 256); + string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + if(str.size() >= 250) str.resize(250); wsprintf(pszText, str.c_str()); return TRUE; } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -1366,6 +1366,7 @@ } } } + return ENV_RELEASE_NODE_UNSET; } WORD CViewInstrument::EnvGetReleaseNodeValue() @@ -1388,6 +1389,7 @@ } } } + return 0; } WORD CViewInstrument::EnvGetReleaseNodeTick() @@ -1410,6 +1412,7 @@ } } } + return 0; } @@ -1456,7 +1459,6 @@ } else if ((pnotify->dwType & dwType) && ((pnotify->dwType & 0xFFFF) == m_nInstrument)) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); BOOL bUpdate = FALSE; for (UINT i=0; i<MAX_CHANNELS; i++) { @@ -2353,6 +2355,7 @@ if ((pModDoc) && (pMainFrm) && (note<128)) { CHAR s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); if (note >= 0xFE) { pModDoc->NoteOff(0, (note == 0xFE) ? TRUE : FALSE, m_nInstrument); @@ -2379,7 +2382,14 @@ m_baPlayingNote[note] = true; //rewbs.instViewNNA m_nPlayingChannel= pModDoc->PlayNote(note, m_nInstrument, 0, FALSE); //rewbs.instViewNNA s[0] = 0; - if ((note) && (note <= 120)) wsprintf(s, "%s", pModDoc->GetSoundFile()->GetNoteName(static_cast<CTuning::STEPTYPE>(note), m_nInstrument).c_str()); + if ((note) && (note <= 120)) + { + const string temp = pModDoc->GetSoundFile()->GetNoteName(static_cast<CTuning::STEPTYPE>(note), m_nInstrument); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + } pMainFrm->SetInfoText(s); } } @@ -2602,7 +2612,7 @@ return CModScrollView::PreTranslateMessage(pMsg); } -LRESULT CViewInstrument::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +LRESULT CViewInstrument::OnCustomKeyMsg(WPARAM wParam, LPARAM) { if (wParam == kcNull) return NULL; @@ -2610,7 +2620,7 @@ CModDoc *pModDoc = GetDocument(); if (!pModDoc) return NULL; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); + //CSoundFile *pSndFile = pModDoc->GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); switch(wParam) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -1135,6 +1135,7 @@ //-------------------------------- { char s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); CComboBox *combo; CSoundFile *pSndFile; @@ -1147,7 +1148,12 @@ combo->SetItemData(combo->AddString("No note"), 0); for (UINT i=1; i<=120; i++) { - wsprintf(s, "%s", pSndFile->GetNoteName(i, m_nInstr).c_str()); + const string temp = pSndFile->GetNoteName(i, m_nInstr); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + combo->SetItemData(combo->AddString(s), i); } if (pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) @@ -2577,13 +2583,18 @@ //------------------------------------------------------------------- { CHAR s[32] = "--"; + const size_t sizeofS = sizeof(s)/sizeof(s[0]); if ((lParam >= 0) && (lParam < 3*12) && (m_pSndFile)) { UINT nSample = m_CbnSample.GetItemData(m_CbnSample.GetCurSel()); UINT nBaseOctave = m_SbOctave.GetPos() & 7; - wsprintf(s, "%s", m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str()); + const string temp = m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str(); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; if ((wParam == KBDNOTIFY_LBUTTONDOWN) && (nSample > 0) && (nSample < MAX_SAMPLES) && (penv)) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -46,6 +46,7 @@ { BOOL bFocus = (::GetFocus() == m_hWnd) ? TRUE : FALSE; CHAR s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); CRect rect; CTuning::STEPTYPE nNotes = static_cast<CTuning::STEPTYPE>((rcClient.bottom + m_cyFont - 1) / m_cyFont); @@ -59,7 +60,12 @@ BOOL bHighLight; // Note s[0] = 0; - wsprintf(s, "%s", m_pTuning->GetNoteName(nPos - 61).c_str()); + const string temp = m_pTuning->GetNoteName(nPos - 61).c_str(); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note Modified: branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h 2006-12-28 17:09:51 UTC (rev 170) @@ -368,7 +368,7 @@ const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C>::SERIALIZATION_FAILURE = true; template<class A, class B, class C> -const string CTuningBase<A, B, C>::s_FileExtension = ".mptt"; +const string CTuningBase<A, B, C>::s_FileExtension = ".tun"; template<class A, class B, class C> const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_MAINRATIOS = 0x1; //1b This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Rel...@us...> - 2006-12-21 15:02:49
|
Revision: 169 http://svn.sourceforge.net/modplug/?rev=169&view=rev Author: Relabsoluness Date: 2006-12-21 07:02:44 -0800 (Thu, 21 Dec 2006) Log Message: ----------- + <Relabs> Multiple samples/instruments/mods can be loaded from the load dialogs. + <Relabs> Pending solo channel and pending unmute all channels. + <Relabs> 32 bit float sample import . <Relabs> 24/32 bit PCM sample import. (+ <Relabs> Option to try to play files in a IT-compatible manner; affects only a couple of things for the time being.) ? Miscellaneous changes in the code Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -181,7 +181,7 @@ EnterCriticalSection(&applying); - MODCOMMAND *p,*newp; + MODCOMMAND *p = NULL,*newp = NULL; MODCHANNELSETTINGS settings[MAX_BASECHANNELS]; UINT i,j,k,nChannels,newpat[MAX_BASECHANNELS],newMemory[4][MAX_BASECHANNELS]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-12-21 15:02:44 UTC (rev 169) @@ -12,6 +12,7 @@ public: static CChannelManagerDlg * sharedInstance(BOOL autoCreate = TRUE); + static void DestroySharedInstance() {delete sharedInstance_; sharedInstance_ = NULL;} void SetDocument(void * parent); BOOL IsOwner(void * ctrl); BOOL IsDisplayed(void); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -2258,6 +2258,16 @@ commands[kcFileExportCompat].isHidden = false; commands[kcFileExportCompat].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].UID = 1778; + commands[kcUnmuteAllChnOnPatTransition].isHidden = false; + commands[kcUnmuteAllChnOnPatTransition].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].Message = "Unmute all channels on pattern transition"; + + commands[kcSoloChnOnPatTransition].UID = 1779; + commands[kcSoloChnOnPatTransition].isHidden = false; + commands[kcSoloChnOnPatTransition].isDummy = false; + commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition"; + #ifdef _DEBUG for (int i=0; i<kcNumCommands; i++) { if (commands[i].UID != 0) { // ignore unset UIDs Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-12-21 15:02:44 UTC (rev 169) @@ -226,6 +226,8 @@ kcChannelSolo, kcChannelUnmuteAll, kcToggleChanMuteOnPatTransition, + kcUnmuteAllChnOnPatTransition, + kcSoloChnOnPatTransition, kcCopyAndLoseSelection, kcTransposeUp, kcTransposeDown, Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1334,7 +1334,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { - //NOTE: pszText seems to point to char array of length 256. + //NOTE: pszText seems to point to char array of length 256 (Noverber 2006). if ((pszText) && (uId)) { switch(uId) @@ -1472,7 +1472,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Instruments|*.xi;*.pat;*.iti;*.wav;*.aif;*.aiff|" "FastTracker II Instruments (*.xi)|*.xi|" "GF1 Patches (*.pat)|*.pat|" @@ -1483,8 +1483,36 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurInsDir; } + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size. + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; - if (!OpenInstrument(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple instruments, advancing to next instrument and creating + //new instrument if necessary. + if(counter > 0) + { + if(m_nInstrument >= MAX_INSTRUMENTS-1) + break; + else + m_nInstrument++; + + if(m_nInstrument > m_pSndFile->GetNumInstruments()) + OnInstrumentNew(); + } + + if(!OpenInstrument(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); if (m_pParent) m_pParent->InstrumentChanged(m_nInstrument); SwitchToView(); } @@ -2386,7 +2414,7 @@ return; size_t sel = m_ComboTuning.GetCurSel(); - if(sel == 0) //Setting IT behavior. + if(sel == 0) //Setting IT behavior { BEGIN_CRITICAL(); pInstH->SetTuning(NULL); @@ -2591,7 +2619,7 @@ while(m_ComboTuning.GetCount() > 0) m_ComboTuning.DeleteString(0); - m_ComboTuning.AddString("IT behavior"); //<-> Instrument pTuning pointer == NULL + m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) { m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -893,7 +893,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Samples|*.wav;*.pat;*.s3i;*.smp;*.snd;*.raw;*.xi;*.aif;*.aiff;*.its;*.8sv;*.8svx;*.svx;*.pcm|" "Wave Files (*.wav)|*.wav|" "XI Samples (*.xi)|*.xi|" @@ -909,9 +909,38 @@ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurSmpDir; } dlg.m_ofn.nFilterIndex = nLastIndex; + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; + nLastIndex = dlg.m_ofn.nFilterIndex; - if (!OpenSample(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple samples, advancing to next sample and creating + //new one if necessary. + if(counter > 0) + { + if(m_nSample >= MAX_SAMPLES-1) + break; + else + m_nSample++; + + if(m_nSample > m_pSndFile->GetNumSamples()) + OnSampleNew(); + } + + if(!OpenSample(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); SwitchToView(); } @@ -2790,6 +2819,7 @@ } LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +//---------------------------------------------------------------- { if (wParam == kcNull) return NULL; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -229,9 +229,9 @@ for (int c=kcClearRow; c<=kcInsertAllRows; c++) newCat->commands.Add(c); newCat->separators.Add(kcInsertAllRows); //-------------------------------------- - for (int c=kcChannelMute; c<=kcToggleChanMuteOnPatTransition; c++) + for (int c=kcChannelMute; c<=kcSoloChnOnPatTransition; c++) newCat->commands.Add(c); - newCat->separators.Add(kcToggleChanMuteOnPatTransition); //-------------------------------------- + newCat->separators.Add(kcSoloChnOnPatTransition); //-------------------------------------- for (int c=kcTransposeUp; c<=kcTransposeOctDown; c++) newCat->commands.Add(c); newCat->separators.Add(kcTransposeOctDown); //-------------------------------------- Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -647,6 +647,9 @@ delete m_pAutoSaver; //rewbs.autosaver delete m_pPerfCounter; + CChannelManagerDlg::DestroySharedInstance(); + + //Saving statictunings here. CSoundFile::SaveStaticTunings(); } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-12-21 15:02:44 UTC (rev 169) @@ -630,7 +630,8 @@ }; -const CHAR gszBuildDate[] = __TIMESTAMP__; +//const CHAR gszBuildDate[] = __TIMESTAMP__; +const string buildDateTime = string(__DATE__) + string(" ") + string(__TIME__); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -982,7 +982,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_ALLOWMULTISELECT, // -> CODE#0023 // -> DESC="IT project files (.itp)" // "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|" @@ -1008,15 +1008,25 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurModDir; } - if (dlg.DoModal() == IDOK) + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() == IDOK) { - CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH]; - _splitpath(dlg.GetPathName(), szDrive, szDir, NULL, NULL); - strcpy(CMainFrame::m_szCurModDir, szDrive); - strcat(CMainFrame::m_szCurModDir, szDir); - CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex; - OpenDocumentFile(dlg.GetPathName()); + POSITION pos = dlg.GetStartPosition(); + while(pos != NULL) + { + CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH]; + CString pathName = dlg.GetNextPathName(pos); + _splitpath(pathName, szDrive, szDir, NULL, NULL); + strcpy(CMainFrame::m_szCurModDir, szDrive); + strcat(CMainFrame::m_szCurModDir, szDir); + CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex; + OpenDocumentFile(pathName); + } } + filenameBuffer.clear(); } @@ -1370,7 +1380,7 @@ CDialog::OnInitDialog(); m_bmp.SubclassDlgItem(IDC_BITMAP1, this); m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_MPTRACK)); - wsprintf(s, "Build Date: %s", gszBuildDate); + wsprintf(s, "Build Date: %s", buildDateTime.c_str()); SetDlgItemText(IDC_EDIT2, s); SetDlgItemText(IDC_EDIT3, CMainFrame::GetFullVersionString()); Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "PlaybackEventer.h" +#include "sndfile.h" + +CPlaybackEventer::~CPlaybackEventer() +//--------------------------------- +{ +} + +void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) +//------------------------------------------------------------------------- +{ + if(chnIndex >= m_rSndFile.m_nChannels) + return; + + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? false : true; + } + m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = (m_rSndFile.ChnSettings[chnIndex].dwFlags & CHN_MUTE) ? true : false; +} + + +void CPlaybackEventer::PatternTransitionChnUnmuteAll() +//---------------------------------------------------- +{ + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? true : false; + } +} \ No newline at end of file Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,25 @@ +#ifndef PLAYBACKEVENTER_H +#define PLAYBACKEVENTER_H + +#include "pattern.h" + +class CSoundFile; + +//==================== +class CPlaybackEventer +//==================== +{ +public: + CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {} + ~CPlaybackEventer(); + + //SetPatternEvent(const PATTERNINDEX pattern, const ROWINDEX row, const CHANNELINDEX column); + + void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); + void PatternTransitionChnUnmuteAll(); + +private: + CSoundFile& m_rSndFile; +}; + +#endif Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1,11 +1,7 @@ -// TuningDialog.cpp : implementation file -// - #include "stdafx.h" #include "mptrack.h" #include "TuningDialog.h" #include <algorithm> -#include ".\tuningdialog.h" #include "misc_util.h" const string CTuningDialog::s_stringTypeGEN = "General"; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-12-21 15:02:44 UTC (rev 169) @@ -2,9 +2,9 @@ #define TUNINGDIALOG_H #include "tuningratiomapwnd.h" +#include "tuningcollection.h" #include <vector> #include <string> -#include "afxwin.h" using std::vector; using std::string; @@ -111,6 +111,7 @@ //to those edit boxes(they are modified by non-user //activies and in these cases the value should be applied //to the tuning data. + }; #endif Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -68,6 +68,8 @@ ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick) + ON_COMMAND(ID_PATTERN_TRANSITIONSOLO, OnPendingSoloChnFromClick) + ON_COMMAND(ID_PATTERN_TRANSITION_UNMUTEALL, OnPendingUnmuteAllChnFromClick) ON_COMMAND(ID_PATTERN_UNMUTEALL,OnUnmuteAll) ON_COMMAND(ID_PATTERN_DELETEROW,OnDeleteRows) ON_COMMAND(ID_PATTERN_DELETEALLROW,OnDeleteRowsEx) @@ -1092,7 +1094,6 @@ { CModDoc *pModDoc = GetDocument(); CSoundFile *pSndFile; - CHAR s[256]; //rewbs.patPlugNames HMENU hMenu; // Too far left to get a ctx menu: @@ -2813,6 +2814,7 @@ InvalidateRow(); } + return 0; } @@ -3144,6 +3146,8 @@ case kcChannelSolo: OnSoloChannel(true); return wParam; case kcChannelUnmuteAll: OnUnmuteAll(); return wParam; case kcToggleChanMuteOnPatTransition: TogglePendingMute((m_dwCursor&0xFFFF)>>3); return wParam; + case kcUnmuteAllChnOnPatTransition: OnPendingUnmuteAllChnFromClick(); return wParam; + case kcSoloChnOnPatTransition: PendingSoloChn(GetCurrentChannel()); return wParam; case kcTransposeUp: OnTransposeUp(); return wParam; case kcTransposeDown: OnTransposeDown(); return wParam; case kcTransposeOctUp: OnTransposeOctUp(); return wParam; @@ -3797,7 +3801,7 @@ UINT instr = p->instr; instr = ((instr * 10) + val) % 1000; - if (instr > MAX_INSTRUMENTS) instr = instr % 100; + if (instr >= MAX_INSTRUMENTS) instr = instr % 100; if ( ((pSndFile->m_nInstruments==0) && (pSndFile->m_nSamples<100)) || // if we're using samples & have less than 100 samples (pSndFile->m_nInstruments < 100)) { // or if we're using instruments and have less than 100 instruments instr = instr % 100; // --> ensure the entered instrument value is less than 100. @@ -4247,6 +4251,7 @@ void CViewPattern::OnSelectPlugin(UINT nID) +//----------------------------------------- { CModDoc *pModDoc = GetDocument(); if (!pModDoc) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return; @@ -4342,15 +4347,18 @@ } if (b) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); if (bAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); - + AppendMenu(hMenu, pSndFile->m_bChannelMuteTogglePending[nChn] ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_PATTERN_TRANSITIONMUTE, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? - "Unmute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : - "Mute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); + "On transition: Unmute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : + "On transition: Mute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); + AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); + AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); + return true; } @@ -4587,10 +4595,9 @@ HMENU instrumentChangeMenu = ::CreatePopupMenu(); AppendMenu(hMenu, MF_POPUP|greyed, (UINT)instrumentChangeMenu, "Change Instrument\t" + ih->GetKeyTextFromCommand(kcPatternSetInstrument)); - CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - CModDoc *pModDoc = GetDocument(); - CSoundFile* pSndFile; - if(pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return true; + if(pSndFile == NULL) + return false; + if (pSndFile->m_nInstruments) { for (UINT i=1; i<=pSndFile->m_nInstruments; i++) { @@ -4652,7 +4659,7 @@ if (GetColTypeFromCursor(m_dwBeginSel) <= colType) { chans.Add(startChan); //first selected chan includes this col type } - for (int chan=startChan+1; chan<endChan; chan++) { + for (UINT chan=startChan+1; chan<endChan; chan++) { chans.Add(chan); //All chans between first & last must include this col type } if ((startChan != endChan) && colType <= GetColTypeFromCursor(m_dwEndSel)) { @@ -4723,6 +4730,26 @@ TogglePendingMute((m_nMenuParam&0xFFFF)>>3); } +void CViewPattern::OnPendingSoloChnFromClick() +//----------------------------------------------- +{ + PendingSoloChn(GetChanFromCursor(m_nMenuParam)); +} + +void CViewPattern::OnPendingUnmuteAllChnFromClick() +//---------------------------------------------- +{ + GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTransitionChnUnmuteAll(); + InvalidateChannelsHeaders(); +} + +void CViewPattern::PendingSoloChn(const CHANNELINDEX nChn) +//--------------------------------------------- +{ + GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTranstionChnSolo(nChn); + InvalidateChannelsHeaders(); +} + void CViewPattern::TogglePendingMute(UINT nChn) //--------------------------------------------- { @@ -4745,15 +4772,11 @@ CPoint pt = GetPointFromPosition(m_dwCursor); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "Record is disabled(editing blocked)."); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------"); AppendMenu(hMenu, MF_STRING, IDC_PATTERN_RECORD, "Editing(record) is disabled; click here to enable it."); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------"); //To check: It seems to work the way it should, but still is it ok to use IDC_PATTERN_RECORD here since it is not //'aimed' to be used here. ClientToScreen(&pt); - //::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_NONOTIFY, pt.x, pt.y, 0, m_hWnd, NULL); ::TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, m_hWnd, NULL); ::DestroyMenu(hMenu); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-12-21 15:02:44 UTC (rev 169) @@ -239,6 +239,8 @@ afx_msg void OnMuteFromClick(); //rewbs.customKeys afx_msg void OnSoloFromClick(); //rewbs.customKeys afx_msg void OnTogglePendingMuteFromClick(); //rewbs.customKeys + afx_msg void OnPendingSoloChnFromClick(); + afx_msg void OnPendingUnmuteAllChnFromClick(); afx_msg void OnSoloChannel(BOOL current); //rewbs.customKeys afx_msg void OnMuteChannel(BOOL current); //rewbs.customKeys afx_msg void OnUnmuteAll(); @@ -336,6 +338,8 @@ private: void TogglePendingMute(UINT nChn); + void PendingSoloChn(const CHANNELINDEX nChn); + void PendingUnmuteAllChn(); public: afx_msg void OnRButtonUp(UINT nFlags, CPoint point); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1305,7 +1305,10 @@ if (result) *result = 0; } -#define MAX_FILEOPEN_BUFSIZE 32000 +#define MAX_FILEOPEN_BUFSIZE 2048 +//Note: Above value might be the maximum size the buffer can be; +//it might be worthwhile to check the CFileDialog documentation +//if wanting the increase that. VOID CSelectPluginDlg::OnAddPlugin() //---------------------------------- Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -169,6 +169,7 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" ON_COMMAND(IDC_CHECK6, OnCheck6) + ON_COMMAND(IDC_IT_STANDARD, OnITStandard) ON_CBN_SELCHANGE(IDC_COMBO1,UpdateDialog) // -! NEW_FEATURE#0023 //}}AFX_MSG_MAP @@ -193,6 +194,7 @@ // -> DESC="IT project files (.itp)" DDX_Control(pDX, IDC_CHECK6, m_CheckBox6); // -! NEW_FEATURE#0023 + DDX_Control(pDX, IDC_IT_STANDARD, m_CheckBoxITStandard); //}}AFX_DATA_MAP } @@ -284,6 +286,7 @@ m_CheckBox3.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITOLDEFFECTS) ? MF_CHECKED : 0); m_CheckBox4.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITCOMPATMODE) ? MF_CHECKED : 0); m_CheckBox5.SetCheck((m_pSndFile->m_dwSongFlags & SONG_EXFILTERRANGE) ? MF_CHECKED : 0); + m_CheckBoxITStandard.SetCheck( (m_pSndFile->GetModSpecificFlag(IT_STANDARD) && m_pSndFile->GetType() == MOD_TYPE_IT) ? MF_CHECKED : MF_UNCHECKED); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -300,6 +303,8 @@ // -> DESC="IT project files (.itp)" m_CheckBox6.EnableWindow(m_TypeBox.GetCurSel() == 4 ? TRUE : FALSE); // -! NEW_FEATURE#0023 + + m_CheckBoxITStandard.EnableWindow((m_pSndFile->GetType() == MOD_TYPE_IT) ? TRUE : FALSE); m_TempoModeBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); @@ -370,6 +375,12 @@ } // -! NEW_FEATURE#0023 +void CModTypeDlg::OnITStandard() +//------------------------------ +{ + m_pSndFile->SetModSpecificFlag(IT_STANDARD, m_CheckBoxITStandard.GetCheck()); +} + BOOL CModTypeDlg::VerifyData() //--------------------------------- { Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-12-21 15:02:44 UTC (rev 169) @@ -20,6 +20,8 @@ CButton m_CheckBox6; // -! NEW_FEATURE#0023 + CButton m_CheckBoxITStandard; + public: CModTypeDlg(CSoundFile *pSndFile, CWnd *parent):CDialog(IDD_MODDOC_MODTYPE, parent) { m_pSndFile = pSndFile; m_nType = m_nChannels = 0; } BOOL VerifyData(); @@ -42,6 +44,7 @@ // -> DESC="IT project files (.itp)" afx_msg void OnCheck6(); // -! NEW_FEATURE#0023 + afx_msg void OnITStandard(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-12-21 15:02:44 UTC (rev 169) @@ -903,51 +903,54 @@ GROUPBOX "Sample Map",IDC_STATIC,461,27,62,141 END -IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 243, 198 +IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 247, 215 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Song Properties" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,189,8,50,14 - PUSHBUTTON "Cancel",IDCANCEL,189,26,50,14 - GROUPBOX "Type",IDC_STATIC,4,4,174,41 + DEFPUSHBUTTON "OK",IDOK,193,8,50,14 + PUSHBUTTON "Cancel",IDCANCEL,193,26,50,14 + GROUPBOX "Type",IDC_STATIC,4,4,174,45 COMBOBOX IDC_COMBO1,8,16,101,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,114,16,60,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,106,93,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,113,93,10 CONTROL "Fast Volume Slides",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,118,75,10 + WS_TABSTOP,7,124,75,10 CONTROL "IT Old Effects",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,111,106,76,10 + WS_TABSTOP,111,113,76,10 CONTROL "IT Compatible Gxx",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,111,118,76,10 + WS_TABSTOP,111,124,76,10 CONTROL "Extended filter range",IDC_CHECK5,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,130,82,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,137,82,10 CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,33,128,10 - EDITTEXT IDC_ROWSPERBEAT,114,60,16,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_ROWSPERMEASURE,114,72,16,12,ES_AUTOHSCROLL | + EDITTEXT IDC_ROWSPERBEAT,114,65,16,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_ROWSPERMEASURE,114,76,16,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows/beat",IDC_STATIC,132,62,36,8 - LTEXT "Rows/measure",IDC_STATIC,132,74,49,8 - COMBOBOX IDC_COMBO3,7,72,99,77,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "Rows/beat",IDC_STATIC,132,65,36,8 + LTEXT "Rows/measure",IDC_STATIC,132,78,49,8 + COMBOBOX IDC_COMBO3,7,76,99,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Tempo",IDC_STATIC,4,51,235,38 - LTEXT "Mode:",IDC_STATIC,7,62,21,8 - COMBOBOX IDC_COMBO4,156,129,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | + GROUPBOX "Tempo",IDC_STATIC,4,55,235,38 + LTEXT "Mode:",IDC_STATIC,7,65,21,8 + COMBOBOX IDC_COMBO4,156,135,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Playback",IDC_STATIC,4,95,235,51 - LTEXT "Plugin levels:",IDC_STATIC,111,131,43,10 - GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,150,235,42 - EDITTEXT IDC_EDIT1,67,161,166,13,ES_AUTOHSCROLL | ES_READONLY, + GROUPBOX "Playback",IDC_STATIC,4,99,240,62 + LTEXT "Plugin levels:",IDC_STATIC,111,138,43,10 + GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,165,235,44 + EDITTEXT IDC_EDIT1,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE - EDITTEXT IDC_EDIT2,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY, + EDITTEXT IDC_EDIT2,67,190,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE - EDITTEXT IDC_EDIT5,7,161,58,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_EDIT6,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_EDIT5,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_EDIT6,7,190,58,13,ES_AUTOHSCROLL | ES_READONLY + CONTROL "Aim for Impulse Tracker playback (for IT)", + IDC_IT_STANDARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, + 149,143,10 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 Modified: branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-12-21 15:02:44 UTC (rev 169) @@ -1,17 +1,15 @@ -#ifndef __SNDFILE_H -#include "../soundlib/sndfile.h" -#endif - #ifndef PATTERN_H #define PATTERN_H #include <vector> +#include "modcommand.h" using std::vector; class CPatternContainer; -typedef UINT ROWINDEX; +typedef size_t ROWINDEX; +typedef size_t CHANNELINDEX; //============ class CPattern Modified: branches/OpenMPT_MPTm_Tuning/mptrack/resource.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-12-21 15:02:44 UTC (rev 169) @@ -438,7 +438,7 @@ #define IDC_CHECK67 1767 #define IDC_CHECK68 1768 #define IDC_CHECK69 1769 -#define IDC_CHECK70 1770 +#define IDC_IT_STANDARD 1770 #define IDC_CHECK71 1771 #define IDC_CHECK72 1772 #define IDC_CHECK73 1773 @@ -946,6 +946,8 @@ #define ID_EDIT_GOTO 36018 #define ID_VIEW_GRAPH 36019 #define ID_PATTERN_TRANSITIONMUTE 36020 +#define ID_PATTERN_TRANSITIONSOLO 36021 +#define ID_PATTERN_TRANSITION_UNMUTEALL 36022 #define ID_SELECTINST 36100 #define ID_NETLINK_MPTFR 37001 #define ID_PLUG_RECORDAUTOMATION 37003 Modified: branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-12-21 15:02:44 UTC (rev 169) @@ -39,7 +39,7 @@ } //Gets called on seekg - pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::binary) + pos_type seekpos(pos_type sp, ios_base::openmode) // which = ios_base::in | ios_base::binary) { DWORD offset = static_cast<DWORD>(sp); if(offset >= 0 && offset < GetStrmSize()) @@ -52,7 +52,7 @@ } //Gets called on tellg - pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::binary) + pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode) // which = ios_base::in | ios_base::binary) { DWORD beginOffset = 0; if(way == ios::cur) Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -4478,7 +4478,11 @@ cbs.pubsetbuf((char*)cpcMPTStart, dwMemLength-mptStartPos); istream fin(&cbs); - m_TuningsTuneSpecific.UnSerializeBinary(fin); + if(m_TuningsTuneSpecific.UnSerializeBinary(fin)) + { + ::MessageBox(NULL, "Error occured - loading failed while trying to load tune specific tunings.", 0, MB_OK); + return FALSE; + } //2. Reading tuning id <-> tuning name map. typedef map<WORD, string> MAP; Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -10,6 +10,7 @@ #include "stdafx.h" #include "sndfile.h" #include "it_defs.h" +#include "wavConverter.h" #pragma warning(disable:4244) @@ -421,26 +422,28 @@ || (pfmtpk->channels != 1)) return FALSE; } else pfmtpk = NULL; } - // WAVE_FORMAT_PCM, WAVE_FORMAT_EXTENSIBLE - if (((pfmt->format != 1) && (pfmt->format != 0xFFFE)) + // WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT, WAVE_FORMAT_EXTENSIBLE + if ((((pfmt->format != 1) && (pfmt->format != 0xFFFE)) + && (pfmt->format != 3 || pfmt->bitspersample != 32)) //Microsoft IEEE FLOAT || (pfmt->channels > 2) || (!pfmt->channels) || (pfmt->bitspersample & 7) || (!pfmt->bitspersample) || (pfmt->bitspersample > 32) ) return FALSE; + DestroySample(nSample); UINT nType = RS_PCM8U; if (pfmt->channels == 1) { if (pfmt->bitspersample == 24) nType = RS_PCM24S; - if (pfmt->bitspersample == 32) nType = RS_PCM32S; - else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U; + else if (pfmt->bitspersample == 32) nType = RS_PCM32S; + else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U; } else { if (pfmt->bitspersample == 24) nType = RS_STIPCM24S; else if (pfmt->bitspersample == 32) nType = RS_STIPCM32S; - else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U; + else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U; } UINT samplesize = pfmt->channels * (pfmt->bitspersample >> 3); MODINSTRUMENT *pins = &Ins[nSample]; @@ -477,7 +480,7 @@ AdjustSampleLoop(pins); } else { - ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos); + ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos, pfmt->format); } // smpl field if (psh) Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1045,7 +1045,7 @@ note = instr = 0; } } - if ((!note) && (instr)) + if ((!note) && (instr)) //Case: instrument with no note data. { if (m_nInstruments) { @@ -1059,9 +1059,11 @@ pChn->dwFlags &= ~CHN_NOTEFADE; pChn->nFadeOutVol = 65536; } - } else + } else //Case: Only samples are used; no instruments. { if (instr < MAX_SAMPLES) pChn->nVolume = Ins[instr].nVolume; + if (m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD)) + note = pChn->nNote; } if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) instr = 0; } @@ -1089,7 +1091,6 @@ InstrumentChange(pChn, instr, bPorta, TRUE); pChn->nNewIns = 0; // Special IT case: portamento+note causes sample change -> ignore portamento - //if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) && (psmp != pChn->pInstrument) && (note) && (note < 0x80)) { @@ -3281,7 +3282,7 @@ } // Channel mutes - for (int chan=0; chan<m_nChannels; chan++) { + for (UINT chan=0; chan<m_nChannels; chan++) { if (m_bChannelMuteTogglePending[chan]) { m_pModDoc->MuteChannel(chan, !m_pModDoc->IsChannelMuted(chan)); m_bChannelMuteTogglePending[chan]=false; Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -13,6 +13,7 @@ #include "../mptrack/moddoc.h" #include "sndfile.h" #include "aeffectx.h" +#include "wavConverter.h" #include <vector> #include <algorithm> @@ -26,6 +27,7 @@ #define UNLHA_SUPPORT #define ZIPPED_MOD_SUPPORT LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx"; +//Should there be mptm? #endif // NO_ARCHIVE_SUPPORT #else // NO_COPYRIGHT: EarSaver only loads mod/s3m/xm/it/wav #define MODPLUG_BASIC_SUPPORT @@ -375,7 +377,7 @@ CTuningCollection CSoundFile::s_TuningsSharedLocal("Local Tunings"); -CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this) +CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this), m_PlaybackEventer(*this) //---------------------- { m_nType = MOD_TYPE_NONE; @@ -400,6 +402,8 @@ m_bIsRendering = false; m_nMaxSample = 0; + m_ModFlags.reset(); + m_pModDoc = NULL; m_dwLastSavedWithVersion=0; m_dwCreatedWithVersion=0; @@ -698,7 +702,7 @@ BOOL CSoundFile::Destroy() //------------------------ { - int i; + size_t i; for (i=0; i<Patterns.Size(); i++) if (Patterns[i]) { FreePattern(Patterns[i]); @@ -1422,7 +1426,7 @@ UINT nRemainingChannels = newOrder.size(); - if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < 4) + if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < GetNumChannelMin()) { CString str = "Error: Bad newOrder vector in CSoundFile::ReArrangeChannels(...)"; CMainFrame::GetMainFrame()->MessageBox(str , "ReArrangeChannels", MB_OK | MB_ICONINFORMATION); @@ -1856,9 +1860,8 @@ // 5 = signed 16-bit PCM data // 6 = unsigned 16-bit PCM data - -UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength) -//------------------------------------------------------------------------------------------------ +UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength, const WORD format) +//----------------------------------------------------------------------------------------------------------------------- { UINT len = 0, mem = pIns->nLength+6; @@ -1888,7 +1891,7 @@ len = pIns->nLength; if (len > dwMemLength) len = pIns->nLength = dwMemLength; LPSTR pSample = pIns->pSample; - for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80); + for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80); } break; @@ -2207,7 +2210,7 @@ break; #ifdef MODPLUG_TRACKER - // PCM 24-bit signed -> load sample, and normalize it to 16-bit + // Mono PCM 24/32-bit signed & 32 bit float -> load sample, and normalize it to 16-bit case RS_PCM24S: case RS_PCM32S: len = pIns->nLength * 3; @@ -2215,56 +2218,66 @@ if (len > dwMemLength) break; if (len > 4*8) { - UINT slsize = (nFlags == RS_PCM32S) ? 4 : 3; - LPBYTE pSrc = (LPBYTE)lpMemFile; - LONG max = 255; - if (nFlags == RS_PCM32S) pSrc++; - for (UINT j=0; j<len; j+=slsize) + if(nFlags == RS_PCM24S) { - LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8; - l /= 256; - if (l > max) max = l; - if (-l > max) max = -l; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + CopyWavBuffer<3, 2, WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } - max = (max / 128) + 1; - signed short *pDest = (signed short *)pIns->pSample; - for (UINT k=0; k<len; k+=slsize) + else //RS_PCM32S { - LONG l = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - *pDest++ = (signed short)(l / max); + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if(format == 3) + CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + else + CopyWavBuffer<4, 2, WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } } break; - // Stereo PCM 24-bit signed -> load sample, and normalize it to 16-bit + // Stereo PCM 24/32-bit signed & 32 bit float -> convert sample to 16 bit case RS_STIPCM24S: case RS_STIPCM32S: - len = pIns->nLength * 6; - if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2; - if (len > dwMemLength) break; - if (len > 8*8) + if(format == 3 && nFlags == RS_STIPCM32S) //Microsoft IEEE float { - UINT slsize = (nFlags == RS_STIPCM32S) ? 4 : 3; - LPBYTE pSrc = (LPBYTE)lpMemFile; - LONG max = 255; - if (nFlags == RS_STIPCM32S) pSrc++; - for (UINT j=0; j<len; j+=slsize) + len = pIns->nLength * 6; + //pIns->nLength tells(?) the number of frames there + //are. One 'frame' of 1 byte(== 8 bit) mono data requires + //1 byte of space, while one frame of 3 byte(24 bit) + //stereo data requires 3*2 = 6 bytes. This is(?) + //why there is factor 6. + + len += pIns->nLength * 2; + //Compared to 24 stereo, 32 bit stereo needs 16 bits(== 2 bytes) + //more per frame. + + if(len > dwMemLength) break; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if (len > 8*8) { - LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8; - l /= 256; - if (l > max) max = l; - if (-l > max) max = -l; + CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } - max = (max / 128) + 1; - signed short *pDest = (signed short *)pIns->pSample; - for (UINT k=0; k<len; k+=slsize) + } + else + { + len = pIns->nLength * 6; + if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2; + if (len > dwMemLength) break; + if (len > 8*8) { - LONG lr = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - k += slsize; - LONG ll = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - pDest[0] = (signed short)ll; - pDest[1] = (signed short)lr; - pDest += 2; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if(nFlags == RS_STIPCM32S) + { + CopyWavBuffer<4,2,WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + } + if(nFlags == RS_STIPCM24S) + { + CopyWavBuffer<3,2,WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + } + } } break; @@ -2800,12 +2813,33 @@ ROWINDEX CSoundFile::GetRowMax() const {return MAX_PATTERN_ROWS;} ROWINDEX CSoundFile::GetRowMin() const {return 2;} +CHANNELINDEX CSoundFile::GetNumChannelMax() const +//----------------------------------- +{ + if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMax; + if(m_nType == MOD_TYPE_IT) return max_chans_IT; + if(m_nType == MOD_TYPE_XM) return max_chans_XM; + if(m_nType == MOD_TYPE_MOD) return max_chans_MOD; + if(m_nType == MOD_TYPE_S3M) return max_chans_S3M; + return 4; +} + +CHANNELINDEX CSoundFile::GetNumChannelMin() const +//----------------------------------- +{ + if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMin; + else return 4; +} + void CSoundFile::ChangeModTypeTo(const int& newType) //--------------------------------------------------- { const UINT oldInvalidIndex = Patterns.GetInvalidIndex(); const UINT oldIgnoreIndex = Patterns.GetIgnoreIndex(); m_nType = newType; + + m_ModFlags.reset(); + replace(Order.begin(), Order.end(), oldInvalidIndex, Patterns.GetInvalidIndex()); replace(Order.begin(), Order.end(), oldIgnoreIndex, Patterns.GetIgnoreIndex()); } Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-12-21 15:02:44 UTC (rev 169) @@ -261,9 +261,12 @@ // 24-bit signed #define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed -#define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed -#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 24-bit signed +// 32-bit +#define RS_PCM32S (RS_PCM16S|0xC0) // mono 32-bit signed +#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 32-bit signed + + // NNA types #define NNA_NOTECUT 0 #define NNA_CONTINUE 1 @@ -469,6 +472,7 @@ typedef struct _MODINSTRUMENT { UINT nLength,nLoopStart,nLoopEnd; + //nLength <-> Number of 'frames'? UINT nSustainStart, nSustainEnd; LPSTR pSample; UINT nC4Speed; @@ -483,6 +487,16 @@ BYTE nVibDepth; BYTE nVibRate; CHAR name[22]; + + //Returns size which pSample is at least. + //Very dirty implementation. + DWORD GetSampleSizeInBytes() const + { + DWORD len = nLength; + if(uFlags & CHN_16BIT) len *= 2; + if(uFlags & CHN_STEREO) len *= 2; + return len; + } } MODINSTRUMENT; @@ -678,17 +692,8 @@ CHAR szName[MAX_CHANNELNAME]; } MODCHANNELSETTINGS; +#include "modcommand.h" -typedef struct _MODCOMMAND -{ - BYTE note; - BYTE instr; - BYTE volcmd; - BYTE command; - BYTE vol; - BYTE param; -} MODCOMMAND, *LPMODCOMMAND; - //////////////////////////////////////////////////////////////////// // Mix Plugins #define MIXPLUG_MIXREADY 0x01 // Set when cleared @@ -836,6 +841,12 @@ #include "../mptrack/patternContainer.h" #include "../mptrack/ordertopatterntable.h" +typedef CPatternContainer::PATTERNINDEX PATTERNINDEX; + +#include "../mptrack/playbackEventer.h" + + + class CSoundFile; //====================== @@ -849,6 +860,9 @@ const CSoundFile& m_rSndFile; }; + +const BYTE IT_STANDARD = 0; + //============== class CSoundFile //============== @@ -862,8 +876,22 @@ ROWINDEX GetRowMax() const; ROWINDEX GetRowMin() const; + CHANNELINDEX GetNumChannelMax() const; + CHANNELINDEX GetNumChannelMin() const; + void ChangeModTypeTo(const int& newType); UINT GetModType() const {return m_nType;} + + bitset<8> m_ModFlags; + virtual bool GetModSpecificFlag(BYTE i) + { + return (i < m_ModFlags.size()) ? m_ModFlags[i] : false; + } + virtual void SetModSpecificFlag(BYTE i, bool val) + { + if(i < m_ModFlags.size()) + m_ModFlags[i] = val; + } //Tuning--> public: @@ -877,12 +905,20 @@ static CTuningCollection s_TuningsSharedLocal; //<--Tuning +public: + CPlaybackEventer& GetPlaybackEventer() {return m_PlaybackEventer;} + //const CPlaybackEventer& GetPlaybackEventer() const {return m_playbackEventer;} + private: void PortamentoMPT(MODCHANNEL*, int); void PortamentoFineMPT(MODCHANNEL*, int); +private: + CPlaybackEventer m_PlaybackEventer; + + public: // Static Members static UINT m_nXBassDepth, m_nXBassRange; static float m_nMaxSample; @@ -1172,7 +1208,7 @@ char GetDeltaValue(char prev, UINT n) const { return (char)(prev + CompressionTable[n & 0x0F]); } UINT PackSample(int &sample, int next); BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL); - UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength); + UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength, const WORD format = 1); BOOL DestroySample(UINT nSample); // -> CODE#0020 Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1099,11 +1099,27 @@ } else //Original { - switch(m_nTickCount % 3) + BYTE note = pChn->nNote; + bool apply = true; + + if(m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD)) { - case 1: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break; - case 2: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break; + if(pChn->nArpeggio >> 4 == 0 && (pChn->nArpeggio & 0x0F) == 0) + apply = false; + //Ignoring J00. + + if(apply) note = GetNoteFromPeriod(pChn->nPeriod); + //Using actual note instead of channel note. } + + if(apply) + { + switch(m_nTickCount % 3) + { + case 1: period = GetPeriodFromNote(note + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break; + case 2: period = GetPeriodFromNote(note + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break; + } + } } } Added: branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,14 @@ +#ifndef MODCOMMAND_H +#define MODCOMMAND_H + +typedef struct _MODCOMMAND +{ + BYTE note; + BYTE instr; + BYTE volcmd; + BYTE command; + BYTE vol; + BYTE param; +} MODCOMMAND, *LPMODCOMMAND; + +#endif Added: branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,137 @@ +#ifndef WAVCONVERTER_H +#define WAVCONVERTER_H + +#include <limits> + +typedef void (*DATACONV)(char* const, char*, const double); +//srcBuffer, destBuffer, maximum value in srcBuffer. + +typedef double MAXFINDER(const char* const, const size_t); +//Buffer, bufferSize. + +inline void WavSigned8To16(char* const inBuffer, char* outBuffer, const double max) +//---------------------------------------------------------------------- +{ + outBuffer[0] = 0; + outBuffer[1] = inBuffer[0]; +} + + +template<BYTE INBYTES> +inline double MaxFinderInt(const char* const buffer, const size_t bs) +//---------------------------------------------------------------------- +{ + if(INBYTES > 8) return 0; + if(bs < INBYTES) return 0; + + __int64 max = 0; + for(size_t i = 0; i <= bs-INBYTES; i += INBYTES) + { + __int64 temp = 0; + memcpy((char*)(&temp)+(8-INBYTES), buffer + i, INBYTES); + if(temp < 0) temp = -temp; + temp >>= 8*INBYTES; + if(temp > max) + max = temp; + } + return static_cast<double>(max); +} + + +inline double MaxFinderFloat32(const char* const buffer, const size_t bs) +//---------------------------------------------------------------------- +{ + float max = 0; + for(size_t i = 0; i<=bs-4; i+=4) + { + float temp = *reinterpret_cast<const float*>(buffer+i); + temp = fabs(temp); + if(temp > max) + max = temp; + } + return max; +} + + +inline void WavSigned24To16(char* const inBuffer, char* outBuffer, const double max) +//-------------------------------------------------------------------------------- +{ + __int32 val = 0; + memcpy((char*)(&val)+1, inBuffer, 3); + //Reading 24 bit data to three last bytes in 32 bit int. + + ASSERT((val << 24) == 0); + + bool negative = (val < 0) ? true : false; + if(negative) val = -val; + if(val < 0) val = (std::numeric_limits<__int32>::max)(); + //Handling special case that val is at minimum of int32 limit. + + val >>= 8; + + const __int64 NC = 32766; //Normalisation constant (2^16 / 2)-1. + const __int64 maxInt = static_cast<__int64>(max); + val = static_cast<__int32>(val*NC/maxInt); + + ASSERT((val >> 15) == 0); + + __int16 outVal = static_cast<__int16>(val); + + if(negative) outVal = -outVal; + + memcpy(outBuffer, &outVal, 2); +} + +inline void WavFloat32To16(char* const inBuffer, char* outBuffer, double max) +//---------------------------------------------------------------------- +{ + __int16* pOut = reinterpret_cast<__int16*>(outBuffer); + float* pIn = reinterpret_cast<float*>(inBuffer); + *pOut = static_cast<__int16>((*pIn / max) * 32766); +} + +inline void WavSigned32To16(char* const inBuffer, char* outBuffer, double max) +//---------------------------------------------------------------------- +{ + if(max >= 1) + { + double temp = *reinterpret_cast<const __int32*>(inBuffer); + __int16& pOut = *reinterpret_cast<__int16*>(outBuffer); + ASSERT(static_cast<__int16>(fabs(temp) / max * 32766) <= 32766); + pOut = static_cast<__int16>(temp / max * 32766); + } + else //No normalisation + { + outBuffer[0] = inBuffer[2]; + outBuffer[1] = inBuffer[3]; + } +} + + +template<size_t inBytes, size_t outBytes, DATACONV CopyAndConvert, MAXFINDER MaxFinder> +bool CopyWavBuffer(char* const readBuffer, const size_t rbSize, char* writeBuffer, const size_t wbSize) +//---------------------------------------------------------------------- +{ + if(inBytes > rbSize || outBytes > wbSize) return true; + if(inBytes > 8) return true; + size_t rbCounter = 0; + size_t wbCounter = 0; + + //Finding max value + const double max = MaxFinder(readBuffer, rbSize); + + if(max == 0) return true; + + //Copying buffer. + while(rbCounter <= rbSize-inBytes && wbCounter <= wbSize-outBytes) + { + CopyAndConvert(readBuffer+rbCounter, writeBuffer+wbCounter, max); + rbCounter += inBytes; + wbCounter += outBytes; + } + return false; +} + + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Rel...@us...> - 2007-02-03 21:24:47
|
Revision: 172 http://svn.sourceforge.net/modplug/?rev=172&view=rev Author: Relabsoluness Date: 2007-02-03 13:24:42 -0800 (Sat, 03 Feb 2007) Log Message: ----------- (Note: This doesn't include the patch from pelya; I wanted to get my modifications committed before merging it.) + <Relabs> Ability to 'scale' envelope points, i.e. to move envelope points by given factor; try right click in envelope views. . <Relabs> Fixed 24-bit wav loading again :) . <Relabs> Fixed an ITP-saving bug I had created when extending the pattern/order-limit(messes orderlist up). . <Relabs> Fixed an ITP-loading bug concerning loading empty comments; could be noticed as trash characters in the comments when there shouldn't have been any. . <Relabs> Bug fix related to handling of finesteps when creating tunings. . <Relabs> Fixed the way modified flag appears when modifying tunings. . <Relabs> Fixed bug that VSTi was making no sound when corresponding instrument had no associated sample - Can cause some tracks using VSTi's to play differently. / <Relabs> Modified the way pattern data is saved/loaded with ITP in order to be able to hack the MODCOMMAND-class. / <Relabs> The tuning dialog now has a treeview instead of the comboboxes. / <Relabs> Local tunings are no longer saved to file everytime the program closes. / <Relabs> Changed the 'order message' at the bottom bar of the screen "Position x of y" to "Position x of y (x_in_hex of y_in_hex)". / <Relabs> To orderlist context menu, changed "Insert Pattern" and "Remove Pattern" to "Insert Order" and "Remove Order" because I find the former somewhat misleading. - Sometimes loading multiple files from openfile dialog fails. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.cpp branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/mod_specifications.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h branches/OpenMPT_MPTm_Tuning/soundlib/midi.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -877,6 +877,7 @@ } PostViewMessage(VIEWMSG_SETCURRENTINSTRUMENT, m_nInstrument); UnlockControls(); + return TRUE; } @@ -2466,6 +2467,15 @@ v.push_back(&m_pSndFile->m_TuningsTuneSpecific); CTuningDialog td(this, v, pInstH->pTuning); td.DoModal(); + if(td.GetModifiedStatus(&m_pSndFile->s_TuningsSharedLocal)) + { + if(MsgBox(IDS_APPLY_TUNING_MODIFICATIONS, this, "", MB_OKCANCEL) == IDOK) + m_pSndFile->SaveStaticTunings(); + } + if(td.GetModifiedStatus(&m_pSndFile->m_TuningsTuneSpecific)) + { + m_pModDoc->SetModified(); + } //Recreating tuning combobox so that possible //new tuning(s) come visible. Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -409,8 +409,16 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); s[0] = 0; - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position %02Xh of %02Xh" : "Position %d of %d", - m_nScrollPos, pSndFile->GetNumPatterns()); + if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) + { + wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->GetNumPatterns()); + } + else + { + wsprintf(s, "Position %d of %d (%02Xh of %02Xh)", + m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns()); + } + if (m_nScrollPos < pSndFile->Order.size()) { UINT nPat = pSndFile->Order[m_nScrollPos]; @@ -661,8 +669,8 @@ if (hMenu) { - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns"); - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Order\tIns"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Order\tDel"); AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern"); AppendMenu(hMenu, MF_STRING|greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern"); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -273,11 +273,8 @@ srcy = pfnt->nAlphaNZ_Y + 13 * COLUMN_HEIGHT; break; case '#': - srcx = pfnt->nNoteX + pfnt->nNoteWidth/2; - srcy = pfnt->nNoteY + 2*COLUMN_HEIGHT; - //TODO: '#' doesn't show properly in effect column. - //srcx = pfnt->nAlphaAM_X; - //srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; + srcx = pfnt->nAlphaAM_X; + srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; break; //rewbs.smoothVST case '\\': Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -648,10 +648,6 @@ delete m_pPerfCounter; CChannelManagerDlg::DestroySharedInstance(); - - - //Saving statictunings here. - CSoundFile::SaveStaticTunings(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -872,7 +872,8 @@ if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; - if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + //if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); } } } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -83,7 +83,6 @@ //--------------------------------------------------------------- { if(size() < count) resize(count, 0xFF); - ASSERT(count == size()); size_t i = 0; Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,94 @@ +// ScaleEnvPointsDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "mptrack.h" +#include "ScaleEnvPointsDlg.h" + + +// CScaleEnvPointsDlg dialog + +IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog) +CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env) + : CDialog(CScaleEnvPointsDlg::IDD, pParent), + m_pInstrument(pInst), + m_Env(env) +//---------------------------------------------------------------------- +{ +} + +CScaleEnvPointsDlg::~CScaleEnvPointsDlg() +//--------------------------------------- +{ +} + +void CScaleEnvPointsDlg::DoDataExchange(CDataExchange* pDX) +//-------------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_FACTOR, m_EditFactor); +} + + +BEGIN_MESSAGE_MAP(CScaleEnvPointsDlg, CDialog) + +END_MESSAGE_MAP() + + +// CScaleEnvPointsDlg message handlers + +void CScaleEnvPointsDlg::OnOK() +//------------------------------ +{ + char buffer[10]; + GetDlgItemText(IDC_EDIT_FACTOR, buffer, 9); + float factor = static_cast<float>(atof(buffer)); + if(factor > 0) + { + WORD (*array)[MAX_ENVPOINTS] = NULL; + UINT* arraySize = NULL; + switch(m_Env) + { + case ENV_VOLUME: + array = &m_pInstrument->VolPoints; + arraySize = &m_pInstrument->nVolEnv; + break; + + case ENV_PANNING: + array = &m_pInstrument->PanPoints; + arraySize = &m_pInstrument->nPanEnv; + break; + + case ENV_PITCH: + array = &m_pInstrument->PitchPoints; + arraySize = &m_pInstrument->nPitchEnv; + break; + } + + if(array && arraySize) + { + for(UINT i = 0; i<*arraySize; i++) + { + (*array)[i] *= factor; + + //Checking that the order of points is preserved. + if(i > 0 && (*array)[i] <= (*array)[i-1]) + (*array)[i] = (*array)[i-1]+1; + } + } + } + + CDialog::OnOK(); +} + +BOOL CScaleEnvPointsDlg::OnInitDialog() +//------------------------------------- +{ + CDialog::OnInitDialog(); + + SetDlgItemText(IDC_EDIT_FACTOR, ""); + m_EditFactor.SetFocus(); + + + return FALSE; // return TRUE unless you set the focus to a control +} Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,33 @@ +#pragma once +#include "sndfile.h" +#include "afxwin.h" + +// CScaleEnvPointsDlg dialog + +//======================================= +class CScaleEnvPointsDlg : public CDialog +//======================================= +{ + DECLARE_DYNAMIC(CScaleEnvPointsDlg) + +public: + CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env); // standard constructor + virtual ~CScaleEnvPointsDlg(); + +// Dialog Data + enum { IDD = IDD_SCALE_ENV_POINTS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() + +private: + INSTRUMENTHEADER* m_pInstrument; + BYTE m_Env; //To tell which envelope to process. + CEdit m_EditFactor; +protected: + virtual void OnOK(); +public: + virtual BOOL OnInitDialog(); +}; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -3,17 +3,20 @@ #include "TuningDialog.h" #include <algorithm> #include "misc_util.h" +#include ".\tuningdialog.h" const string CTuningDialog::s_stringTypeGEN = "General"; const string CTuningDialog::s_stringTypeRP = "Ratio periodic"; const string CTuningDialog::s_stringTypeTET = "TET"; +const CTuningDialog::TUNINGTREEITEM CTuningDialog::s_notFoundItemTuning = TUNINGTREEITEM(); +const HTREEITEM CTuningDialog::s_notFoundItemTree = NULL; + /* TODOS: --Clear tuning(when copying existing tuning, it might have - e.g. unwanted note names which should able to be removed. --Drag'n'drop tuningfiles +-Clear tuning -Tooltips. +-Create own dialogs for Tuning collection part, and Tuning part. */ @@ -25,7 +28,11 @@ m_TuningCollections(rVec), m_TempTunings("Sandbox"), m_NoteEditApply(true), - m_RatioEditApply(true) + m_RatioEditApply(true), + m_pActiveTuningCollection(NULL), + m_TreeItemTuningItemMap(s_notFoundItemTree, s_notFoundItemTuning), + m_TreeCtrlTuning(this), + m_DoErrorExit(false) //---------------------------------------- { m_pActiveTuning = pTun; @@ -39,37 +46,129 @@ { for(size_t i = 0; i<m_TuningCollections.size(); i++) { - vector<CTuningCollection*>::iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), m_TuningCollections[i]); - if(iter != m_DeletableTuningCollections.end()) + if(IsDeletable(m_TuningCollections[i])) { delete m_TuningCollections[i]; - m_DeletableTuningCollections.erase(iter); + m_TuningCollections[i] = NULL; } } m_TuningCollections.clear(); m_DeletableTuningCollections.clear(); } +HTREEITEM CTuningDialog::AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter) +//--------------------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pTC->GetName().c_str(), parent, insertAfter); + HTREEITEM temp2 = NULL; + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pTC)); + for(size_t i = 0; i<pTC->GetNumTunings(); i++) + { + temp2 = AddTreeItem(&pTC->GetTuning(i), temp, temp2); + } + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +HTREEITEM CTuningDialog::AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter) +//----------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pT->GetName().c_str(), parent, insertAfter); + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pT)); + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +void CTuningDialog::DeleteTreeItem(CTuning* pT) +//--------------------------------------------- +{ + if(!pT) + return; + + HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pT)); + if(temp) + { + HTREEITEM nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT); + if(!nextitem) nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS); + m_pActiveTuning = m_TreeItemTuningItemMap.GetMapping_12(nextitem).GetT(); + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + + } +} + +void CTuningDialog::DeleteTreeItem(CTuningCollection* pTC) +//--------------------------------------------- +{ + if(!pTC) + return; + + m_pActiveTuning = NULL; + const HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)); + if(temp) + { + TUNINGTREEITEM prevTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS)); + TUNINGTREEITEM nextTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT)); + + CTuningCollection* pTCprev = prevTTI.GetTC(); + CTuningCollection* pTCnext = nextTTI.GetTC(); + if(pTCnext == NULL) + pTCnext = GetpTuningCollection(nextTTI.GetT()); + if(pTCprev == NULL) + pTCprev = GetpTuningCollection(prevTTI.GetT()); + + if(pTCnext != NULL && pTCnext != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCnext; + else + { + if(pTCprev != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCprev; + else + m_pActiveTuningCollection = NULL; + } + + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + } + else + { + ASSERT(false); + m_DoErrorExit = true; + m_pActiveTuningCollection = NULL; + } +} + BOOL CTuningDialog::OnInitDialog() //-------------------------------- { CDialog::OnInitDialog(); - + m_RatioMapWnd.Init(this, 0); - //Adding tuning collection names to the combobox. + //-->Creating treeview + m_TreeItemTuningItemMap.ClearMapping(); for(size_t i = 0; i<m_TuningCollections.size(); i++) { - m_CombobTuningCollection.AddString(m_TuningCollections[i]->GetName().c_str()); + AddTreeItem(m_TuningCollections[i], NULL, NULL); } + //<-- Creating treeview - //Adding tuning type names to corresponding combobox + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + //Adding tuning type names to corresponding combobox. m_CombobTuningType.AddString(s_stringTypeGEN.c_str()); m_CombobTuningType.AddString(s_stringTypeRP.c_str()); m_CombobTuningType.AddString(s_stringTypeTET.c_str()); m_ButtonSet.EnableWindow(FALSE); + //#ifdef DEBUG + m_EditTuningCollectionVersion.ShowWindow(SW_SHOW); + m_EditTuningCollectionEditMask.ShowWindow(SW_SHOW); + //#endif + m_EditFineTuneSteps.SetLimitText(3); UpdateView(); @@ -77,117 +176,155 @@ return TRUE; } -void CTuningDialog::UpdateView() + +void CTuningDialog::UpdateView(const int updateMask) //------------------------------ { - - if(m_pActiveTuning == NULL && (m_TuningCollections.size() == 0 || m_TuningCollections[0]->GetNumTunings() == 0)) + if(m_DoErrorExit) { - ASSERT(false); + DoErrorExit(); return; } - if(m_pActiveTuning == NULL) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - - - //Finding out where given tuning belongs to. - size_t curTCol = 0, curT = 0; //cur <-> Current, T <-> Tuning, Col <-> Collection. - bool found = false; - for(size_t i = 0; i<m_TuningCollections.size(); i++) + //-->Updating treeview + if(updateMask != UM_TUNINGDATA) { - CTuningCollection& rCurTCol = *m_TuningCollections.at(i); - for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + TUNINGTREEITEM tuningitem; + if(m_pActiveTuning) + tuningitem.Set(m_pActiveTuning); + else { - if(m_pActiveTuning == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) - { - curTCol = i; - curT = j; - found = true; - break; - } + if(m_pActiveTuningCollection) + tuningitem.Set(m_pActiveTuningCollection); } + HTREEITEM treeitem = m_TreeItemTuningItemMap.GetMapping_21(tuningitem); + if(treeitem) + { + m_TreeCtrlTuning.Select(treeitem, TVGN_CARET); + if(m_pActiveTuning) + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuning->GetName().c_str()); + else + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuningCollection->GetName().c_str()); + } } - ASSERT(found); + //<--Updating treeview + - m_CombobTuningCollection.SetCurSel(curTCol); - OnCbnSelchangeComboTcol(); - m_CombobTuningCollection.Invalidate(); + if(m_pActiveTuningCollection == NULL) + { + return; + } - m_CombobTuningName.SetCurSel(curT); - m_CombobTuningName.Invalidate(); + //Updating tuning collection part--> + if(updateMask == 0 || updateMask & UM_TUNINGCOLLECTION) + { + m_EditTuningCollectionName.SetWindowText(m_pActiveTuningCollection->GetName().c_str()); + m_EditTuningCollectionVersion.SetWindowText(m_pActiveTuningCollection->GetVersionString().c_str()); + m_EditTuningCollectionEditMask.SetWindowText(m_pActiveTuningCollection->GetEditMaskString().c_str()); + m_EditTuningCollectionItemNum.SetWindowText(Stringify(m_pActiveTuningCollection->GetNumTunings()).c_str()); + m_EditTuningCollectionPath.SetWindowText(m_pActiveTuningCollection->GetSaveFilePath().c_str()); + } + //<-- Updating tuning collection part + //Updating tuning part--> + if(m_pActiveTuning != NULL && (updateMask & UM_TUNINGDATA || updateMask == 0)) + { + UpdateTuningType(); - UpdateTuningType(); + m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); + m_EditName.Invalidate(); - m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); - m_EditName.Invalidate(); + //Finetunesteps-edit + m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); + m_EditFineTuneSteps.Invalidate(); - //Finetunesteps-edit - m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); - m_EditFineTuneSteps.Invalidate(); + //Making sure that ratiomap window is showing and + //updating its content. + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_RatioMapWnd.m_pTuning = m_pActiveTuning; + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - //.Making sure that ratiomap window is showing and - //updating its content. - m_RatioMapWnd.ShowWindow(SW_SHOW); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - m_RatioMapWnd.Invalidate(); - UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - - const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); - const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); - if(period > 0) - { - m_EditSteps.EnableWindow(); - m_EditSteps.SetWindowText(Stringify(period).c_str()); + const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); + const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); + if(period > 0) + { + m_EditSteps.EnableWindow(); + m_EditSteps.SetWindowText(Stringify(period).c_str()); - m_EditRatioPeriod.EnableWindow(); - m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); - } - else //case: m_pActiveTuning is of type general. - { - m_EditSteps.EnableWindow(false); - m_EditRatioPeriod.EnableWindow(false); - } + m_EditRatioPeriod.EnableWindow(); + m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); + } + else //case: m_pActiveTuning is of type general. + { + m_EditSteps.EnableWindow(false); + m_EditRatioPeriod.EnableWindow(false); + } - m_EditRatioPeriod.Invalidate(); - m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); + m_EditSteps.Invalidate(); - bool enableControls = true; - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || + bool enableControls = true; + + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - { - CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - m_ButtonReadOnly.EnableWindow(FALSE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) + m_ButtonReadOnly.EnableWindow(FALSE); + else + m_ButtonReadOnly.EnableWindow(TRUE); + + enableControls = false; + } else - m_ButtonReadOnly.EnableWindow(TRUE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); + m_ButtonReadOnly.EnableWindow(); + } - enableControls = false; + m_CombobTuningType.EnableWindow(enableControls); + m_EditTableSize.SetReadOnly(!enableControls); + m_EditBeginNote.SetReadOnly(!enableControls); + m_EditSteps.SetReadOnly(!enableControls); + m_EditRatioPeriod.SetReadOnly(!enableControls); + m_EditRatio.SetReadOnly(!enableControls); + m_EditNotename.SetReadOnly(!enableControls); + m_EditMiscActions.SetReadOnly(!enableControls); + m_EditFineTuneSteps.SetReadOnly(!enableControls); + m_EditName.SetReadOnly(!enableControls); + + m_ButtonSet.EnableWindow(enableControls); + + m_CombobTuningType.Invalidate(); + m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); } - else + else { - CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); - m_ButtonReadOnly.EnableWindow(); - } + if(m_pActiveTuning == NULL) //No active tuning, clearing tuning part. + { + m_EditName.SetWindowText(""); + m_EditTableSize.SetWindowText(""); + m_EditBeginNote.SetWindowText(""); + m_EditSteps.SetWindowText(""); + m_EditRatioPeriod.SetWindowText(""); + m_EditRatio.SetWindowText(""); + m_EditNotename.SetWindowText(""); + m_EditMiscActions.SetWindowText(""); + m_EditFineTuneSteps.SetWindowText(""); + m_EditName.SetWindowText(""); - m_CombobTuningType.EnableWindow(enableControls); - m_EditTableSize.SetReadOnly(!enableControls); - m_EditBeginNote.SetReadOnly(!enableControls); - m_EditSteps.SetReadOnly(!enableControls); - m_EditRatioPeriod.SetReadOnly(!enableControls); - m_EditRatio.SetReadOnly(!enableControls); - m_EditNotename.SetReadOnly(!enableControls); - m_EditMiscActions.SetReadOnly(!enableControls); - m_EditFineTuneSteps.SetReadOnly(!enableControls); - m_EditName.SetReadOnly(!enableControls); - - m_ButtonSet.EnableWindow(enableControls); - - m_CombobTuningType.Invalidate(); - m_EditSteps.Invalidate(); - m_EditRatioPeriod.Invalidate(); + m_CombobTuningType.SetCurSel(-1); + m_ButtonReadOnly.EnableWindow(FALSE); + + m_RatioMapWnd.ShowWindow(SW_HIDE); + m_RatioMapWnd.m_pTuning = NULL; + m_RatioMapWnd.Invalidate(); + } + } + //<--Updating tuning part } @@ -196,16 +333,11 @@ { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATICRATIOMAP, m_RatioMapWnd); - DDX_Control(pDX, IDC_COMBO_TCOL, m_CombobTuningCollection); - DDX_Control(pDX, IDC_COMBO_T, m_CombobTuningName); DDX_Control(pDX, IDC_COMBO_TTYPE, m_CombobTuningType); DDX_Control(pDX, IDC_EDIT_TABLESIZE, m_EditTableSize); DDX_Control(pDX, IDC_EDIT_BEGINNOTE, m_EditBeginNote); DDX_Control(pDX, IDC_EDIT_STEPS, m_EditSteps); DDX_Control(pDX, IDC_EDIT_RATIOPERIOD, m_EditRatioPeriod); - DDX_Control(pDX, IDC_CHECK_NEWTUNING, m_CheckNewTuning); - DDX_Control(pDX, IDC_ADD_TUNING, m_ButtonAddTuning); - DDX_Control(pDX, IDC_REMOVE_TUNING, m_ButtonRemoveTuning); DDX_Control(pDX, IDC_EDIT_RATIOVALUE, m_EditRatio); DDX_Control(pDX, IDC_EDIT_NOTENAME, m_EditNotename); DDX_Control(pDX, IDC_BUTTON_SETVALUES, m_ButtonSet); @@ -215,19 +347,20 @@ DDX_Control(pDX, IDC_EDIT_FINETUNESTEPS, m_EditFineTuneSteps); DDX_Control(pDX, IDC_CHECK_READONLY, m_ButtonReadOnly); DDX_Control(pDX, IDC_EDIT_NAME, m_EditName); + DDX_Control(pDX, IDC_TREE_TUNING, m_TreeCtrlTuning); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_NAME, m_EditTuningCollectionName); + DDX_Control(pDX, IDC_EDIT_TUNINGC_VERSION, m_EditTuningCollectionVersion); + DDX_Control(pDX, IDC_EDIT_TUNINGC_EDITMASK, m_EditTuningCollectionEditMask); + DDX_Control(pDX, IDC_EDIT_TUNINGNUM, m_EditTuningCollectionItemNum); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_PATH, m_EditTuningCollectionPath); } + BEGIN_MESSAGE_MAP(CTuningDialog, CDialog) - ON_CBN_SELCHANGE(IDC_COMBO_TCOL, OnCbnSelchangeComboTcol) - ON_CBN_SELCHANGE(IDC_COMBO_T, OnCbnSelchangeComboT) - ON_BN_CLICKED(IDC_CHECK_NEWTUNING, OnBnClickedCheckNewtuning) ON_CBN_SELCHANGE(IDC_COMBO_TTYPE, OnCbnSelchangeComboTtype) ON_EN_CHANGE(IDC_EDIT_STEPS, OnEnChangeEditSteps) ON_EN_CHANGE(IDC_EDIT_RATIOPERIOD, OnEnChangeEditRatioperiod) - ON_BN_CLICKED(IDC_ADD_TUNING, OnBnClickedAddTuning) - ON_BN_CLICKED(IDC_REMOVE_TUNING, OnBnClickedRemoveTuning) - ON_CBN_EDITCHANGE(IDC_COMBO_T, OnCbnEditchangeComboT) ON_EN_CHANGE(IDC_EDIT_NOTENAME, OnEnChangeEditNotename) ON_BN_CLICKED(IDC_BUTTON_SETVALUES, OnBnClickedButtonSetvalues) ON_EN_CHANGE(IDC_EDIT_RATIOVALUE, OnEnChangeEditRatiovalue) @@ -241,72 +374,39 @@ ON_EN_KILLFOCUS(IDC_EDIT_RATIOPERIOD, OnEnKillfocusEditRatioperiod) ON_EN_KILLFOCUS(IDC_EDIT_RATIOVALUE, OnEnKillfocusEditRatiovalue) ON_EN_KILLFOCUS(IDC_EDIT_NOTENAME, OnEnKillfocusEditNotename) + ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_TUNING, OnTvnSelchangedTreeTuning) + ON_NOTIFY(TVN_DELETEITEM, IDC_TREE_TUNING, OnTvnDeleteitemTreeTuning) + ON_NOTIFY(NM_RCLICK, IDC_TREE_TUNING, OnNMRclickTreeTuning) + ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_TUNING, OnTvnBegindragTreeTuning) + ON_COMMAND(ID_REMOVETUNING, OnRemoveTuning) + ON_COMMAND(ID_ADDTUNING, OnAddTuning) + ON_COMMAND(ID_MOVETUNING, OnMoveTuning) + ON_COMMAND(ID_COPYTUNING, OnCopyTuning) + ON_COMMAND(ID_REMOVETUNINGCOLLECTION, OnRemoveTuningCollection) + ON_BN_CLICKED(IDC_BUTTON_TUNINGCOLLECTION_SAVE, OnBnClickedButtonTuningcollectionSave) END_MESSAGE_MAP() -// CTuningDialog message handlers - -void CTuningDialog::OnCbnSelchangeComboTcol() -//------------------------------------------- +void CTuningDialog::DoErrorExit() +//------------------------------- { - const int curTCol = m_CombobTuningCollection.GetCurSel(); - if(curTCol < 0 || curTCol >= static_cast<int>(m_TuningCollections.size())) return; - - //Checking whether collection allows removing - if(m_TuningCollections[curTCol]->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(true); - else - m_ButtonRemoveTuning.EnableWindow(false); - - //Clearing existing items from name-combobox... - while(m_CombobTuningName.GetCount() > 0) - m_CombobTuningName.DeleteString(0); - - //...adding names of tunings in the current tuning collection... - CTuningCollection& rTCol = *m_TuningCollections.at(curTCol); - for(size_t i = 0; i<rTCol.GetNumTunings(); i++) - { - m_CombobTuningName.AddString(rTCol.GetTuning(static_cast<unsigned short>(i)).GetName().c_str()); - } - - //Checking whether tuning collection allows adding - //tunings... - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_ADD)) - m_ButtonAddTuning.EnableWindow(); - else - m_ButtonAddTuning.EnableWindow(false); - - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(); - else - m_ButtonRemoveTuning.EnableWindow(FALSE); + m_DoErrorExit = false; + m_pActiveTuning = NULL; + m_pActiveTuningCollection = NULL; + MsgBox(IDS_ERR_DIALOG, this, NULL, MB_ICONINFORMATION); + OnOK(); } -void CTuningDialog::OnCbnSelchangeComboT() -//---------------------------------------- -{ - const int TCol = m_CombobTuningCollection.GetCurSel(); - if(TCol < 0 || TCol >= static_cast<int>(m_TuningCollections.size())) return; - CTuningCollection& rTCol = *m_TuningCollections.at(TCol); +// CTuningDialog message handlers - //...checking that tuning index is valid... - const unsigned short T = static_cast<unsigned short>(m_CombobTuningName.GetCurSel()); - if(T < 0 || T >= rTCol.GetNumTunings()) - return; - - m_pActiveTuning = &rTCol.GetTuning(T); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - - UpdateView(); -} - void CTuningDialog::UpdateTuningType() //------------------------------------ { if(m_pActiveTuning) { - ASSERT(m_CombobTuningType.GetCount() > 0); + if(m_CombobTuningType.GetCount() < 3) m_DoErrorExit = true; + if(m_pActiveTuning->GetTuningType() == CTuning::TT_TET) m_CombobTuningType.SetCurSel(2); else @@ -317,12 +417,7 @@ } } -void CTuningDialog::OnBnClickedCheckNewtuning() -//--------------------------------------------- -{ -} - CTuning::CTUNINGTYPE CTuningDialog::GetTuningTypeFromStr(const string& str) const //-------------------------------------------------------------------------------- { @@ -350,6 +445,8 @@ { if(MessageBox("This will change the ratio values; continue?", 0, MB_YESNO) == IDYES) { + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + const size_t BS = 20; char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); @@ -369,7 +466,7 @@ if(newType == CTuning::TT_TET) m_pActiveTuning->CreateTET(steps, pr); - UpdateView(); + UpdateView(UM_TUNINGDATA); } else //Not wanting to discard current values. { @@ -399,88 +496,6 @@ } -void CTuningDialog::OnBnClickedAddTuning() -//----------------------------------------- -{ - if(m_pActiveTuning == NULL) //Should never be true. - return; - - if(m_pActiveTuning->GetName().length() == 0) - { - MessageBox("Please give name for the tuning", 0, MB_OK); - return; - } - - if(m_CombobTuningCollection.GetCurSel() < 0 || m_CombobTuningCollection.GetCurSel() >= static_cast<int>(m_TuningCollections.size())) - { - MessageBox("No tuning collection chosen", 0, MB_OK); - return; - } - - CTuningCollection& rTCol = *m_TuningCollections[m_CombobTuningCollection.GetCurSel()]; - - string detailStr = string("Add tuning to '") + rTCol.GetName() + string("'(it will be create as a copy of current tuning)?"); - if(MessageBox(detailStr.c_str(), 0, MB_YESNO) == IDYES) - { - CTuning* pNewTuning = new CTuningRTI(m_pActiveTuning); - if(rTCol.AddTuning(pNewTuning)) - { - MessageBox("Add tuning failed"); - delete pNewTuning; - return; - } - m_pActiveTuning = pNewTuning; - UpdateView(); - } -} - -void CTuningDialog::OnBnClickedRemoveTuning() -//------------------------------------------- -{ - UpdateView(); - //Now TCol and T should have the values pointing to m_pActiveTuning. - const size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - const size_t T = static_cast<size_t>(m_CombobTuningName.GetCurSel()); - if(TCol >= m_TuningCollections.size() || - T >= m_TuningCollections[TCol]->GetNumTunings()) - return; - - CTuningCollection& rTCol = *m_TuningCollections[TCol]; - const CTuning& rT = m_TuningCollections[TCol]->GetTuning(static_cast<WORD>(T)); - ASSERT(&rT == m_pActiveTuning); - string str = string("Remove tuning '") + rT.GetName() + string("' from collection ") + rTCol.GetName() + string("?"); - if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) - { - if(m_TuningCollections[TCol]->Remove(T)) - { - MessageBox("Tuning removal failed"); - return; - } - if(rTCol.GetNumTunings() > 0) - m_pActiveTuning = &rTCol.GetTuning(static_cast<WORD>(min(T, rTCol.GetNumTunings()-1))); - else - if(m_TuningCollections.size() > 0 && m_TuningCollections[0] && m_TuningCollections[0]->GetNumTunings() > 0) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - else - m_pActiveTuning = NULL; - - UpdateView(); - } -} - -void CTuningDialog::OnCbnEditchangeComboT() -//----------------------------------------- -{ - if(m_pActiveTuning != NULL) - { - const size_t BS = 40; - char buffer[BS]; - m_CombobTuningName.GetWindowText(buffer, BS); - m_pActiveTuning->SetName(buffer); - UpdateView(); - } -} - void CTuningDialog::OnEnChangeEditNotename() //------------------------------------------ { @@ -508,6 +523,7 @@ else m_pActiveTuning->ClearNoteName(currentNote); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_RatioMapWnd.Invalidate(); } @@ -534,6 +550,7 @@ if(str.length() > 0) { m_pActiveTuning->SetRatio(currentNote, static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; UpdateTuningType(); m_RatioMapWnd.Invalidate(); } @@ -552,6 +569,7 @@ char buffer[BS]; m_EditMiscActions.GetWindowText(buffer, BS); m_pActiveTuning->Multiply(static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditMiscActions.SetWindowText(""); m_RatioMapWnd.Invalidate(); } @@ -577,18 +595,18 @@ void CTuningDialog::OnBnClickedButtonExport() //------------------------------------------- { - CTuningCollection* pTC = NULL; //Used if exporting tuning collection. - const CTuning* pT = m_pActiveTuning; + const CTuningCollection* pTC = m_pActiveTuningCollection; - if(pT == NULL) + if(pT == NULL && pTC == NULL) + { + MsgBox(IDS_ERR_NO_TUNING_SELECTION, this, NULL, MB_ICONINFORMATION); return; - - size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - if(TCol < m_TuningCollections.size()) - pTC = m_TuningCollections[TCol]; + } - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); + string filter; + if(pT != NULL) + filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); if(pTC != NULL) filter += string("Tuning collection files (") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); @@ -626,8 +644,9 @@ //------------------------------------------- { //TODO: Ability to import ratios from text file. - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|") + - string("Tuning collection files (*") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); + string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(", *") + CTuningCollection::s_FileExtension + string(")|*") + + CTuning::s_FileExtension + string(";*") + CTuningCollection::s_FileExtension + string("|"); + CFileDialog dlg(TRUE, NULL, NULL, @@ -653,6 +672,8 @@ { m_TempTunings.AddTuning(pT); m_pActiveTuning = pT; + + AddTreeItem(m_pActiveTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(&m_TempTunings)), NULL); UpdateView(); } } @@ -664,8 +685,8 @@ //a separate collection - no possibility to //directly replace some collection. CTuningCollection* pNewTCol = new CTuningCollection; - ifstream fin(dlg.GetPathName(), ios::binary); - failure = pNewTCol->UnSerializeBinary(fin); + pNewTCol->SetSavefilePath(static_cast<LPCTSTR>(dlg.GetPathName())); + failure = pNewTCol->UnSerializeBinary(); if(failure) { delete pNewTCol; pNewTCol = 0; @@ -674,8 +695,7 @@ { m_TuningCollections.push_back(pNewTCol); m_DeletableTuningCollections.push_back(pNewTCol); - m_CombobTuningCollection.AddString(pNewTCol->GetName().c_str()); - m_CombobTuningCollection.SetCurSel(m_CombobTuningCollection.GetCount()-1); + AddTreeItem(pNewTCol, NULL, NULL); UpdateView(); } @@ -703,6 +723,7 @@ char buffer[BS]; m_EditFineTuneSteps.GetWindowText(buffer, BS); m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->SetFineStepCount(static_cast<CTuning::FINESTEPTYPE>(atoi(buffer)))).c_str()); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditFineTuneSteps.Invalidate(); } } @@ -719,15 +740,16 @@ if(m_pActiveTuning->SetEditMask(CTuning::EM_CONST)) CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } else { if(m_pActiveTuning->SetEditMask(CTuning::EM_ALLOWALL)) CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; } @@ -740,7 +762,9 @@ char buffer[BS]; m_EditName.GetWindowText(buffer, BS); m_pActiveTuning->SetName(buffer); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); + UpdateView(UM_TUNINGCOLLECTION); } } @@ -754,7 +778,8 @@ char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriod(static_cast<CTuning::STEPTYPE>(atoi(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } @@ -768,20 +793,489 @@ char buffer[BS]; m_EditRatioPeriod.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriodRatio(static_cast<CTuning::RATIOTYPE>(atof(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } void CTuningDialog::OnEnKillfocusEditRatiovalue() //----------------------------------------------- { - UpdateView(); + UpdateView(UM_TUNINGDATA); } void CTuningDialog::OnEnKillfocusEditNotename() //----------------------------------------------- { + UpdateView(UM_TUNINGDATA); +} + +bool CTuningDialog::GetModifiedStatus(const CTuningCollection* const pTc) const +//----------------------------------------------------------------------------- +{ + MODIFIED_MAP::const_iterator iter = m_ModifiedTCs.find(pTc); + if(iter != m_ModifiedTCs.end()) + return (*iter).second; + else + return false; + +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(HTREEITEM ti) const +//------------------------------------------------------------------------ +{ + //If treeitem is that of a tuningcollection, return address of + //that tuning collection. If treeitem is that of a tuning, return + //the owning tuningcollection + TUNINGTREEITEM tunItem = m_TreeItemTuningItemMap.GetMapping_12(ti); + CTuningCollection* pTC = tunItem.GetTC(); + if(pTC) + return pTC; + else + { + CTuning* pT = tunItem.GetT(); + return GetpTuningCollection(pT); + } +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(const CTuning* const pT) const +//----------------------------------------------------------------- +{ + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + CTuningCollection& rCurTCol = *m_TuningCollections.at(i); + for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + { + if(pT == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) + { + return &rCurTCol; + } + } + } + return NULL; +} + + +void CTuningDialog::OnTvnSelchangedTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + //This methods gets called when selected item in the treeview + //changes. + + //TODO: This gets called before killfocus messages of edits, this + // can be a problem. + + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + + TUNINGTREEITEM ti = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(ti) + { + int updateMask = UM_TUNINGDATA; + CTuningCollection* pPrevTuningCollection = m_pActiveTuningCollection; + CTuning* pT = ti.GetT(); + CTuningCollection* pTC = ti.GetTC(); + if(pTC) + { + m_pActiveTuningCollection = pTC; + ASSERT(pT == NULL); + m_pActiveTuning = NULL; + } + else + { + m_pActiveTuning = pT; + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + } + if(m_pActiveTuningCollection != pPrevTuningCollection) updateMask |= UM_TUNINGCOLLECTION; + UpdateView(updateMask); + } + else + { + m_DoErrorExit = true; + } + + *pResult = 0; +} + +void CTuningDialog::OnTvnDeleteitemTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + // TODO: Add your control notification handler code here + *pResult = 0; + if(pNMTreeView->itemOld.mask & TVIF_HANDLE && pNMTreeView->itemOld.hItem) + { + m_TreeItemTuningItemMap.RemoveValue_1(pNMTreeView->itemOld.hItem); + } + else + m_DoErrorExit = true; +} + +void CTuningDialog::OnNMRclickTreeTuning(NMHDR *, LRESULT *pResult) +//----------------------------------------------------------------------- +{ + *pResult = 0; + + HTREEITEM hItem; + POINT point, ptClient; + + GetCursorPos(&point); + ptClient = point; + m_TreeCtrlTuning.ScreenToClient(&ptClient); + hItem = m_TreeCtrlTuning.HitTest(ptClient, NULL); + if(hItem == NULL) + return; + + m_TreeCtrlTuning.Select(hItem, TVGN_CARET); + + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(hItem); + + if(!tunitem) + { + m_DoErrorExit = true; + return; + } + + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + CTuning* pT = tunitem.GetT(); + CTuningCollection* pTC = tunitem.GetTC(); + + if(pT) //Creating context menu for tuning-item + { + pTC = GetpTuningCollection(pT); + if(pTC != NULL) + { + UINT mask = MF_STRING; + if(!pTC->CanEdit(CTuningCollection::EM_REMOVE)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNING, "Remove"); + + m_CommandItemDest.Set(pT); + } + } + else //Creating context menu for tuning collection item. + { + if(pTC != NULL) + { + UINT mask = MF_STRING; + + if(!pTC->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_ADDTUNING, "Add tuning"); + + mask = MF_STRING; + if(!IsDeletable(pTC)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNINGCOLLECTION, "Delete tuning collection"); + + m_CommandItemDest.Set(pTC); + } + } + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); +} + +bool CTuningDialog::IsDeletable(const CTuningCollection* const pTC) const +//-------------------------------------------------------------------------------- +{ + vector<CTuningCollection*>::const_iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), pTC); + if(iter != m_DeletableTuningCollections.end()) + return true; + else + return false; +} + + +void CTuningDialog::OnTvnBegindragTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//--------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + *pResult = 0; + + m_CommandItemDest.Reset(); + m_CommandItemSrc.Reset(); + if(pNMTreeView == NULL || pNMTreeView->itemNew.hItem == NULL) return; + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(tunitem.GetT() == NULL) + { + MsgBox(IDS_UNSUPPORTED_TUNING_DnD, this); + return; + } + + m_TreeCtrlTuning.SetDragging(); + m_DragItem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + m_TreeCtrlTuning.Select(pNMTreeView->itemNew.hItem, TVGN_CARET); +} + +void CTuningDialog::OnEndDrag(HTREEITEM dragDestItem) +//-------------------------------------------------- +{ + m_TreeCtrlTuning.SetDragging(false); + if(m_DragItem == NULL) + return; + + m_CommandItemSrc = m_DragItem; + m_DragItem.Reset(); + + TUNINGTREEITEM destTunItem = m_TreeItemTuningItemMap.GetMapping_12(dragDestItem); + if(!destTunItem) + return; + + CTuningCollection* pTCdest = NULL; + CTuningCollection* pTCsrc = m_CommandItemSrc.GetTC(); + + if(pTCsrc == NULL) + pTCsrc = GetpTuningCollection(m_CommandItemSrc.GetT()); + + if(pTCsrc == NULL) + { + ASSERT(false); + return; + } + + if(destTunItem.GetT()) //Item dragged on tuning + pTCdest = GetpTuningCollection(destTunItem.GetT()); + else //Item dragged on tuningcollecition + pTCdest = destTunItem.GetTC(); + + //For now, ignoring drags within a tuning collection. + if(pTCdest == pTCsrc) + return; + + if(pTCdest) + { + UINT mask = MF_STRING; + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + POINT point; + GetCursorPos(&point); + + if(!pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + AppendMenu(popUpMenu, mask, ID_COPYTUNING, "Copy here"); + + if(!pTCsrc->CanEdit(CTuningCollection::EM_REMOVE) || + !pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask = MF_STRING | MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_MOVETUNING, "Move here"); + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); + + m_CommandItemDest.Set(pTCdest); + } +} + +bool CTuningDialog::AddTuning(CTuningCollection* pTC, CTuning* pT) +//---------------------------------------------------------------- +{ + //Default: pT == NULL + + if(!pTC) + { + MessageBox("No tuning collection chosen", 0, MB_OK); + return true; + } + + CTuning* pNewTuning = new CTuningRTI(pT); + if(pTC->AddTuning(pNewTuning)) + { + MessageBox("Add tuning failed"); + delete pNewTuning; + return true; + } + AddTreeItem(pNewTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)), NULL); + m_pActiveTuning = pNewTuning; + m_ModifiedTCs[pTC] = true; UpdateView(); + + return false; } +void CTuningDialog::OnAddTuning() +//------------------------------- +{ + if(!m_CommandItemDest.GetTC()) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + m_CommandItemDest = s_notFoundItemTuning; + m_ModifiedTCs[pTC]; + AddTuning(pTC); +} + +void CTuningDialog::OnRemoveTuning() +//---------------------------------- +{ + CTuning* pT = m_CommandItemDest.GetT(); + if(m_CommandItemDest.GetT()) + { + CTuningCollection* pTC = GetpTuningCollection(pT); + if(pTC) + { + string str = string("Remove tuning '") + pT->GetName() + string("' from ' ") + pTC->GetName() + string("'?"); + if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) + { + if(!pTC->Remove(pT)) + { + m_ModifiedTCs[pTC] = true; + DeleteTreeItem(pT); + UpdateView(); + } + else + { + MessageBox("Tuning removal failed"); + } + } + } + } + + m_CommandItemDest = s_notFoundItemTuning; +} + +void CTuningDialog::OnMoveTuning() +//-------------------------------- +{ + if(!m_CommandItemDest) + return; + + CTuning* pT = m_CommandItemSrc.GetT(); + CTuningCollection* pTCsrc = GetpTuningCollection(pT); + + if(pT == NULL) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTCdest = NULL; + if(m_CommandItemDest.GetT()) + pTCdest = GetpTuningCollection(m_CommandItemDest.GetT()); + else + pTCdest = m_CommandItemDest.GetTC(); + + + HTREEITEM treeItemSrcTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCsrc)); + HTREEITEM treeItemDestTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCdest)); + DeleteTreeItem(pT); + m_ModifiedTCs[pTCsrc] = true; + if(CTuningCollection::TransferTuning(pTCsrc, pTCdest, pT)) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_OK); + AddTreeItem(pT, treeItemSrcTC, NULL); + } + else + AddTreeItem(pT, treeItemDestTC, NULL); + + UpdateView(); +} + + +void CTuningDialog::OnCopyTuning() +//-------------------------------- +{ + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + + if(!pTC) + return; + + m_CommandItemDest = s_notFoundItemTuning; + + CTuning* pT = m_CommandItemSrc.GetT(); + if(pT == NULL) + { + return; + } + m_ModifiedTCs[pTC] = true; + AddTuning(pTC, pT); +} + +void CTuningDialog::OnRemoveTuningCollection() +//-------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(!IsDeletable(m_pActiveTuningCollection)) + { + ASSERT(false); + return; + } + + TUNINGVECTOR::iterator iter = find(m_TuningCollections.begin(), m_TuningCollections.end(), m_pActiveTuningCollection); + if(iter == m_TuningCollections.end()) + { + ASSERT(false); + return; + } + TUNINGVECTOR::iterator DTCiter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), *iter); + CTuningCollection* deletableTC = m_pActiveTuningCollection; + //Note: Order matters in the following lines. + m_DeletableTuningCollections.erase(DTCiter); + m_TuningCollections.erase(iter); + DeleteTreeItem(m_pActiveTuningCollection); + delete deletableTC; deletableTC = 0; + + UpdateView(); +} + + +void CTuningDialog::OnBnClickedButtonTuningcollectionSave() +//--------------------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(m_pActiveTuningCollection->SerializeBinary()) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_ICONINFORMATION); + } + else + { + m_ModifiedTCs[m_pActiveTuningCollection] = false; + } +} + + +//////////////////////////////////////////////////////// +//*************** +//CTuningTreeCtrl +//*************** +//////////////////////////////////////////////////////// + +BEGIN_MESSAGE_MAP(CTuningTreeCtrl, CTreeCtrl) + ON_WM_LBUTTONUP() +END_MESSAGE_MAP() + + +void CTuningTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) +//----------------------------------------------------------- +{ + if(IsDragging()) + { + HTREEITEM hItem; + hItem = HitTest(point, NULL); + m_rParentDialog.OnEndDrag(hItem); + + CTreeCtrl::OnLButtonUp(nFlags, point); + } +} + + Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-02-03 21:24:42 UTC (rev 172) @@ -5,11 +5,179 @@ #include "tuningcollection.h" #include <vector> #include <string> +#include "afxcmn.h" +#include "afxwin.h" using std::vector; using std::string; +//========================== +template<class T1, class T2> +class CBijectiveMap +//========================== +{ +public: + CBijectiveMap(const T1& a, const T2& b) + : m_NotFoundT1(a), + m_NotFoundT2(b) + {} + void AddPair(const T1& a, const T2& b) + { + m_T1.push_back(a); + m_T2.push_back(b); + } + + void ClearMapping() + { + m_T1.clear(); + m_T2.clear(); + } + + size_t Size() const + { + ASSERT(m_T1.size() == m_T2.size()); + return m_T1.size(); + } + + void RemoveValue_1(const T1& a) + { + vector<T1>::iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + m_T2.erase(m_T2.begin() + (iter-m_T1.begin())); + m_T1.erase(iter); + } + } + + void RemoveValue_2(const T2& b) + { + vector<T2>::iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + m_T1.erase(m_T1.begin() + (iter-m_T2.begin())); + m_T2.erase(iter); + } + } + + T2 GetMapping_12(const T1& a) const + { + vector<T1>::const_iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + return m_T2[iter-m_T1.begin()]; + } + else + return m_NotFoundT2; + } + + T1 GetMapping_21(const T2& b) const + { + vector<T2>::const_iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + return m_T1[iter-m_T2.begin()]; + } + else + return m_NotFoundT1; + } + +private: + vector<T1> m_T1; + vector<T2> m_T2; + //Elements are collected to two arrays so that elements with the + //same index are mapped to each other. + + T1 m_NotFoundT1; + T2 m_NotFoundT2; +}; + +class CTuningDialog; + +//====================================== +class CTuningTreeCtrl : public CTreeCtrl +//====================================== +{ +private: + CTuningDialog& m_rParentDialog; +public: + CTuningTreeCtrl(CTuningDialog* parent) : m_rParentDialog(*parent) {} + //Note: Parent address may be given in initialiser list so + //do not use it. + + void SetDragging(bool state = true) {m_Dragging = state;} + bool IsDragging() {return m_Dragging;} + +private: + bool m_Dragging; + + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + DECLARE_MESSAGE_MAP() +}; + +//=================== +class CTuningTreeItem +//=================== +{ +private: + CTuning* m_pTuning; + CTuningCollection* m_pTuningCollection; + +public: + CTuningTreeItem() : m_pTuning(NULL), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuning* pT) : + m_pTuning(pT), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuningCollection* pTC) : + m_pTuning(NULL), + m_pTuningCollection(pTC) + {} + + bool operator==(const CTuningTreeItem& ti) const + { + if(m_pTuning == ti.m_pTuning && + m_pTuningCollection == ti.m_pTuningCollection) + return true; + else + return false; + } + + void Reset() {m_pTuning = NULL; m_pTuningCollection = NULL;} + + + void Set(CTuning* pT) + { + m_pTuning = pT; + m_pTuningCollection = NULL; + } + + void Set(CTuningCollection* pTC) + { + m_pTuning = NULL; + m_pTuningCollection = pTC; + } + + operator void*() + { + //Mimicing pointer behavior: if(CTuningTreeItemInstance) equals + //if(CTuningTreeItemInstance.m_pTuning != NULL || + // CTuningTreeItemInstance.m_pTuningCollection != NULL) + if(m_pTuning) + return m_pTuning; + else + return m_pTuningCollection; + } + + CTuningCollection* GetTC() {return m_pTuningCollection;} + + CTuning* GetT() {return m_pTuning;} +}; + // CTuningDialog dialog //================================== @@ -18,6 +186,8 @@ { DECLARE_DYNAMIC(CTuningDialog) + friend class CTuningTreeCtrl; + public: typedef vector<CTuningCollection*> TUNINGVECTOR; @@ -30,33 +200,52 @@ void AddTuningCollection(CTuningCollection* pTC) {if(pTC) m_TuningCollections.push_back(pTC);} void UpdateRatioMapEdits(const CTuning::STEPTYPE&); + bool GetModifiedStatus(const CTuningCollection* const pTc) const; + // Dialog Data enum { IDD = IDD_TUNING }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - DECLARE_MESSAGE_MAP() - private: CTuning::CTUNINGTYPE GetTuningTypeFromStr(const string& str) const; - void UpdateView(); + void UpdateView(const int UpdateMask = 0); void UpdateTuningType(); - + HTREEITEM AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter); + HTREEITEM AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter); + + void DeleteTreeItem(CTuning* pT); + void DeleteTreeItem(CTuningCollection* pTC); + + void OnEndDrag(HTREEITEM dragDestItem); + + CTuningCollection* GetpTuningCollection(const CTuning* const) const; + //Returns pointer to the tuning collection where tuning given as argument + //belongs to. + + CTuningCollection* GetpTuningCollection(HTREEITEM ti) const; + //Returns the address of corresponding tuningcollection; if it points + //to tuning-entry, returning the owning tuningcollection + + bool IsDeletable(const CTuningCollection* const pTC) const; + //Checks whether tuning collection can be deleted. + private: CTuningRatioMapWnd m_RatioMapWnd; TUNINGVECTOR m_TuningCollections; vector<CTuningCollection*> m_DeletableTuningCollections; CTuning* m_pActiveTuning; + CTuningCollection* m_pActiveTuningCollection; + CTuningCollection m_TempTunings; - CComboBox m_CombobTuningCollection; - CComboBox m_CombobTuningName; CComboBox m_CombobTuningType; + //Tuning Edits--> CEdit m_EditTableSize; CEdit m_EditBeginNote; CEdit m_EditSteps; @@ -66,26 +255,87 @@ CEdit m_EditMiscActions; CEdit m_EditFineTuneSteps; CEdit m_EditName; + //<--Tuning Edits + + //-->Tuning collection edits + CEdit m_EditTuningCollectionName; + CEdit m_EditTuningCollectionVersion; + CEdit m_EditTuningCollectionEditMask; + CEdit m_EditTuningCollectionItemNum; + CEdit m_EditTuningCollectionPath; + //<--Tuningcollection edits - CButton m_CheckNewTuning; - CButton m_ButtonAddTuning; - CButton m_ButtonRemoveTuning; CButton m_ButtonSet; CButton m_ButtonExport; CButton m_ButtonImport; CButton m_ButtonReadOnly; + CTuningTreeCtrl m_TreeCtrlTuning; +private: + static const string s_stringTypeGEN; + static const string s_stringTypeRP; + static const string s_stringTypeTET; + + typedef CTuningTreeItem TUNINGTREEITEM; + typedef CBijectiveMap<HTREEITEM, TUNINGTREEITEM> TREETUNING_MAP; + TREETUNING_MAP m_TreeItemTuningItemMap; + + TUNINGTREEITEM m_DragItem; + TUNINGTREEITEM m_CommandItemSrc; + TUNINGTREEITEM m_CommandItemDest; + //Commanditem is used when receiving context menu-commands, + //m_CommandItemDest is used when the command really need only + //one argument. + + typedef map<const CTuningCollection* const, bool> MODIFIED_MAP; + MODIFIED_MAP m_ModifiedTCs; + //If tuning collection seems to have been modified, its address + //is added to this map. + + enum + { + TT_TUNINGCOLLECTION = 1, + TT_TUNING + }; + + bool m_NoteEditApply; + bool m_RatioEditApply; + //To indicate whether to apply changes made to + //to those edit boxes(they are modified by non-user + //activies and in these cases the value should be applied + //to the tuning data. + + enum + { + UM_TUNINGDATA = 1, //UM <-> Update Mask + UM_TUNINGCOLLECTION = 2, + }; + + static const TUNINGTREEITEM s_notFoundItemTuning; + static const HTREEITEM s_notFoundItemTree; + + bool AddTuning(CTuningCollection*, CTuning* pT = NULL); + + bool m_DoErrorExit; + //Flag to prevent multiple exit error-messages. + + void DoErrorExit(); + + +//Treectrl context menu functions. public: - afx_msg void OnCbnSelchangeComboTcol(); - afx_msg void OnCbnSelchangeComboT(); - afx_msg void OnBnClickedCheckNewtuning(); + afx_msg void OnRemoveTuning(); + afx_msg void OnAddTuning(); + afx_msg void OnMoveTuning(); + afx_msg void OnCopyTuning(); + afx_msg void OnRemoveTuningCollection(); + +//Event-functions +public: afx_msg void OnCbnSelchangeComboTtype... [truncated message content] |