|
From: <re...@us...> - 2007-03-14 00:19:40
|
Revision: 175
http://svn.sourceforge.net/modplug/?rev=175&view=rev
Author: rewbs
Date: 2007-03-13 17:19:33 -0700 (Tue, 13 Mar 2007)
Log Message:
-----------
. v1.17.02.46 (in progress, no binary yet)
First pass merge from tuning branch.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/AutoSaver.cpp
trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp
trunk/OpenMPT/mptrack/ChannelManagerDlg.h
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Ctrl_gen.cpp
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_ins.h
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/Globals.cpp
trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/mptrack/PatternGotoDialog.cpp
trunk/OpenMPT/mptrack/View_gen.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/View_smp.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
trunk/OpenMPT/mptrack/Vstplug.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/dlg_misc.h
trunk/OpenMPT/mptrack/mod2midi.cpp
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/mptrack.vcproj
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Dlsbank.cpp
trunk/OpenMPT/soundlib/LOAD_AMF.CPP
trunk/OpenMPT/soundlib/LOAD_DBM.CPP
trunk/OpenMPT/soundlib/LOAD_DMF.CPP
trunk/OpenMPT/soundlib/LOAD_DSM.CPP
trunk/OpenMPT/soundlib/Load_669.cpp
trunk/OpenMPT/soundlib/Load_ams.cpp
trunk/OpenMPT/soundlib/Load_far.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mdl.cpp
trunk/OpenMPT/soundlib/Load_med.cpp
trunk/OpenMPT/soundlib/Load_mid.cpp
trunk/OpenMPT/soundlib/Load_mod.cpp
trunk/OpenMPT/soundlib/Load_mt2.cpp
trunk/OpenMPT/soundlib/Load_mtm.cpp
trunk/OpenMPT/soundlib/Load_okt.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_ptm.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/Load_stm.cpp
trunk/OpenMPT/soundlib/Load_ult.cpp
trunk/OpenMPT/soundlib/Load_wav.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
trunk/OpenMPT/soundlib/Tables.cpp
Added Paths:
-----------
trunk/OpenMPT/mptrack/OrderToPatternTable.cpp
trunk/OpenMPT/mptrack/OrderToPatternTable.h
trunk/OpenMPT/mptrack/PlaybackEventer.cpp
trunk/OpenMPT/mptrack/PlaybackEventer.h
trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h
trunk/OpenMPT/mptrack/TuningDialog.cpp
trunk/OpenMPT/mptrack/TuningDialog.h
trunk/OpenMPT/mptrack/misc_util.cpp
trunk/OpenMPT/mptrack/misc_util.h
trunk/OpenMPT/mptrack/pattern.cpp
trunk/OpenMPT/mptrack/pattern.h
trunk/OpenMPT/mptrack/patternContainer.cpp
trunk/OpenMPT/mptrack/patternContainer.h
trunk/OpenMPT/mptrack/serialization_utils.cpp
trunk/OpenMPT/mptrack/serialization_utils.h
trunk/OpenMPT/mptrack/tuningRatioMapWnd.cpp
trunk/OpenMPT/mptrack/tuningRatioMapWnd.h
trunk/OpenMPT/soundlib/MPT_module.cpp
trunk/OpenMPT/soundlib/MPT_module.h
trunk/OpenMPT/soundlib/midi.h
trunk/OpenMPT/soundlib/mod_specifications.h
trunk/OpenMPT/soundlib/modcommand.h
trunk/OpenMPT/soundlib/tuning.cpp
trunk/OpenMPT/soundlib/tuning.h
trunk/OpenMPT/soundlib/tuningCollection.cpp
trunk/OpenMPT/soundlib/tuning_template.h
trunk/OpenMPT/soundlib/tuningcollection.h
trunk/OpenMPT/soundlib/wavConverter.h
Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp
===================================================================
--- trunk/OpenMPT/mptrack/AutoSaver.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -206,6 +206,9 @@
name.Append(".it");
}
break;
+ case MOD_TYPE_MPT:
+ name.Append(".mptm");
+ break;
case MOD_TYPE_XM:
name.Append(".xm");
break;
@@ -241,6 +244,9 @@
pSndFile->SaveITProject(fileName) :
pSndFile->SaveIT(fileName, 0);
break;
+ case MOD_TYPE_MPT:
+ success = pSndFile->SaveMPT(fileName, 0);
+ break;
//default:
//Do nothing
}
Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -181,7 +181,7 @@
EnterCriticalSection(&applying);
- MODCOMMAND *p,*newp;
+ MODCOMMAND *p = NULL,*newp = NULL;
MODCHANNELSETTINGS settings[MAX_BASECHANNELS];
UINT i,j,k,nChannels,newpat[MAX_BASECHANNELS],newMemory[4][MAX_BASECHANNELS];
@@ -199,40 +199,28 @@
BeginWaitCursor();
BEGIN_CRITICAL();
- // Rearrange patterns content
- for(i = 0 ; i < MAX_PATTERNS ; i++){
+ //Creating new order-vector for ReArrangeChannels.
+ vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels);
+ for(i = 0; i<nChannels; i++)
+ {
+ newChnOrder.push_back(newpat[i]);
+ }
+ if(m_pSndFile->ReArrangeChannels(newChnOrder) != nChannels)
+ {
+ MessageBox("Rearranging channels failed");
+ END_CRITICAL();
+ EndWaitCursor();
- // Allocate a new empty pattern to replace current pattern at i'th position in pattern array
- p = m_pSndFile->Patterns[i];
- if(p) newp = CSoundFile::AllocatePattern(m_pSndFile->PatternSize[i], nChannels);
+ ResetState(TRUE,TRUE,TRUE,TRUE,TRUE);
+ LeaveCriticalSection(&applying);
- if(p && !newp){
- END_CRITICAL();
- EndWaitCursor();
- LeaveCriticalSection(&applying);
- ::MessageBox(NULL, "Pattern Data is corrupted!!!", "ERROR: Not enough memory to rearrange channels!", MB_ICONERROR | MB_OK);
- return;
- }
-
- // Copy data from old pattern taking care of new channel reodering
- if(p != NULL){
- for(j = 0 ; j < m_pSndFile->PatternSize[i] ; j++){
- for(k = 0 ; k < nChannels ; k++)
- memcpy(&newp[j*nChannels + k],&p[j*m_pSndFile->m_nChannels + newpat[k]],sizeof(MODCOMMAND));
- }
- // Set new pattern in pattern array & free previous pattern
- m_pSndFile->Patterns[i] = newp;
- CSoundFile::FreePattern(p);
- }
+ return;
}
+
- // Copy channel settings
- for(i = 0 ; i < m_pSndFile->m_nChannels ; i++) settings[i] = m_pSndFile->ChnSettings[i];
-
// Redistribute channel setting & update manager internal store memory
for(i = 0 ; i < nChannels ; i++){
if(i != newpat[i]){
- m_pSndFile->ChnSettings[i] = settings[newpat[i]];
memory[0][i] = newMemory[0][newpat[i]];
memory[1][i] = newMemory[1][newpat[i]];
memory[2][i] = newMemory[2][newpat[i]];
@@ -240,23 +228,13 @@
memory[3][i] = i;
}
- // Also update record states (unfortunetely they are not part of channel settings)
- for(i = 0 ; i < nChannels ; i++) newMemory[1][i] = pModDoc->IsChannelRecord(i);
-
- pModDoc->ReinitRecordState();
- for(i = 0 ; i < nChannels ; i++){
- if(newMemory[1][newpat[i]] == 1) pModDoc->Record1Channel(i,TRUE);
- if(newMemory[1][newpat[i]] == 2) pModDoc->Record2Channel(i,TRUE);
- }
-
- // Update new number of channels
- m_pSndFile->m_nChannels = nChannels;
if(pActiveMod == pModDoc){
i = m_pSndFile->GetCurrentPos();
m_pSndFile->m_dwSongFlags &= ~SONG_STEP;
m_pSndFile->SetCurrentPos(0);
m_pSndFile->SetCurrentPos(i);
}
+
END_CRITICAL();
EndWaitCursor();
Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.h
===================================================================
--- trunk/OpenMPT/mptrack/ChannelManagerDlg.h 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/ChannelManagerDlg.h 2007-03-14 00:19:33 UTC (rev 175)
@@ -12,6 +12,7 @@
public:
static CChannelManagerDlg * sharedInstance(BOOL autoCreate = TRUE);
+ static void DestroySharedInstance() {delete sharedInstance_; sharedInstance_ = NULL;}
void SetDocument(void * parent);
BOOL IsOwner(void * ctrl);
BOOL IsDisplayed(void);
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -2258,6 +2258,16 @@
commands[kcFileExportCompat].isHidden = false;
commands[kcFileExportCompat].isDummy = false;
+ commands[kcUnmuteAllChnOnPatTransition].UID = 1778;
+ commands[kcUnmuteAllChnOnPatTransition].isHidden = false;
+ commands[kcUnmuteAllChnOnPatTransition].isDummy = false;
+ commands[kcUnmuteAllChnOnPatTransition].Message = "Unmute all channels on pattern transition";
+
+ commands[kcSoloChnOnPatTransition].UID = 1779;
+ commands[kcSoloChnOnPatTransition].isHidden = false;
+ commands[kcSoloChnOnPatTransition].isDummy = false;
+ commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition";
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2007-03-14 00:19:33 UTC (rev 175)
@@ -226,6 +226,8 @@
kcChannelSolo,
kcChannelUnmuteAll,
kcToggleChanMuteOnPatTransition,
+ kcUnmuteAllChnOnPatTransition,
+ kcSoloChnOnPatTransition,
kcCopyAndLoseSelection,
kcTransposeUp,
kcTransposeDown,
Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -159,7 +159,7 @@
{
// Detecting max valid restart position
UINT i = 0;
- for (i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break;
+ for (i=0; i<m_pSndFile->Order.size(); i++) if (m_pSndFile->Order[i] == m_pSndFile->Patterns.GetInvalidIndex()) break;
m_SpinRestartPos.SetRange(0, i);
}
if (dwHint & HINT_MODGENERAL)
@@ -217,6 +217,8 @@
// -> DESC="IT project files (.itp)"
// case MOD_TYPE_IT: pszModType = "IT (Impulse Tracker)"; break;
case MOD_TYPE_IT: pszModType = m_pSndFile->m_dwSongFlags & SONG_ITPROJECT ? "ITP (IT Project)" : "IT (Impulse Tracker)"; break;
+ case MOD_TYPE_MPT: pszModType = "MPTM (OpenMPT)"; break;
+
// -! NEW_FEATURE#0023
}
wsprintf(s, "%s, %d channels", pszModType, m_pSndFile->m_nChannels);
@@ -446,9 +448,9 @@
if (s[0])
{
UINT n = atoi(s);
- if (n < MAX_ORDERS)
+ if(n < m_pSndFile->Order.size())
{
- for (UINT i=0; i<=n; i++) if (m_pSndFile->Order[i] == 0xFF) return;
+ for (UINT i=0; i<=n; i++) if (m_pSndFile->Order[i] == m_pSndFile->Patterns.GetInvalidIndex()) return;
if (n != m_pSndFile->m_nRestartPos)
{
m_EditRestartPos.SetModify(FALSE);
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -7,6 +7,7 @@
#include "ctrl_ins.h"
#include "view_ins.h"
#include "dlg_misc.h"
+#include "tuningDialog.h"
#include "misc_util.h"
#include <vector>
#include <string>
@@ -15,6 +16,8 @@
#pragma warning(disable:4244)
+const pair<string, WORD> CCtrlInstruments::s_TuningNotFound("Tuning was not found. Setting to default tuning", 7);
+
/////////////////////////////////////////////////////////////////////////
// CNoteMapWnd
@@ -160,7 +163,10 @@
// Note
s[0] = 0;
- if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s%d", szNoteNames[nPos % 12], nPos/12);
+
+ string temp = pSndFile->GetNoteName(nPos+1, m_nInstrument);
+ temp.resize(4);
+ if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", temp.c_str());
rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont);
DrawButtonRect(hdc, &rect, s, FALSE, FALSE);
// Mapped Note
@@ -173,7 +179,12 @@
UINT n = penv->NoteMap[nPos];
if (n == 0xFF) strcpy(s, "==="); else
if (n == 0xFE) strcpy(s, "^^^"); else
- if (n <= 120) wsprintf(s, "%s%d", szNoteNames[(n-1)%12], (n-1)/12);
+ if (n <= 120)
+ {
+ string temp = pSndFile->GetNoteName(n, m_nInstrument);
+ temp.resize(4);
+ wsprintf(s, "%s", temp.c_str());
+ }
}
FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow);
if ((nPos == (int)m_nNote) && (!m_bIns))
@@ -439,7 +450,7 @@
INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument];
if ((penv) && (m_nNote < 120))
{
- if (!m_bIns && (pSndFile->m_nType & MOD_TYPE_IT))
+ if (!m_bIns && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
{
UINT n = penv->NoteMap[m_nNote];
BOOL bOk = FALSE;
@@ -496,7 +507,7 @@
return true;
}
- else if ((!m_bIns) && (pSndFile->m_nType & MOD_TYPE_IT)) { //in note column
+ else if ((!m_bIns) && (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { //in note column
UINT n = penv->NoteMap[m_nNote];
@@ -649,6 +660,7 @@
ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged)
ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap)
//}}AFX_MSG_MAP
+ ON_CBN_SELCHANGE(IDC_COMBOTUNING, OnCbnSelchangeCombotuning)
ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock)
ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock)
ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock)
@@ -696,6 +708,7 @@
DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack);
DDX_Control(pDX, IDC_SPIN1, m_SpinAttack);
// -! NEW_FEATURE#0027
+ DDX_Control(pDX, IDC_COMBOTUNING, m_ComboTuning);
DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock);
DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock);
//}}AFX_DATA_MAP
@@ -815,12 +828,12 @@
m_SpinInstrument.SetFocus();
+ BuildTuningComboBox();
+
CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED);
- //OnBnClickedCheckPitchtempolock();
+ OnBnClickedCheckPitchtempolock();
m_EditPitchTempoLock.SetLimitText(4);
-
-
return FALSE;
}
@@ -864,6 +877,7 @@
}
PostViewMessage(VIEWMSG_SETCURRENTINSTRUMENT, m_nInstrument);
UnlockControls();
+
return TRUE;
}
@@ -1010,9 +1024,10 @@
if (!m_bInitialized) dwHintMask |= HINT_MODTYPE;
if (dwHintMask & HINT_MODTYPE)
{
- BOOL bITonly = ((m_pSndFile->m_nType == MOD_TYPE_IT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
+ BOOL bITonly = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
//rewbs.instroVSTi
- BOOL bITandXM = (((m_pSndFile->m_nType == MOD_TYPE_IT) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
+ BOOL bITandXM = (((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
+ bool bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT10), bITandXM);
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT11), bITandXM);
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT7), bITandXM);
@@ -1052,8 +1067,9 @@
m_SliderResonance.EnableWindow(bITonly);
m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments);
m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE);
- m_EditPitchTempoLock.EnableWindow(bITonly);
- m_CheckPitchTempoLock.EnableWindow(bITonly);
+ m_ComboTuning.EnableWindow(bMPTOnly);
+ m_EditPitchTempoLock.EnableWindow(bMPTOnly);
+ m_CheckPitchTempoLock.EnableWindow(bMPTOnly);
}
if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE))
{
@@ -1124,7 +1140,7 @@
m_ComboPPC.SetCurSel(penv->nPPC);
SetDlgItemInt(IDC_EDIT15, penv->nPPS);
// Filter
- if (m_pSndFile->m_nType & MOD_TYPE_IT)
+ if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))
{
m_CheckCutOff.SetCheck((penv->nIFC & 0x80) ? TRUE : FALSE);
m_CheckResonance.SetCheck((penv->nIFR & 0x80) ? TRUE : FALSE);
@@ -1145,6 +1161,8 @@
if(n == 0) SetDlgItemText(IDC_EDIT2,"default");
else SetDlgItemInt(IDC_EDIT2,n);
// -! NEW_FEATURE#0027
+
+ UpdateTuningComboBox();
if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock.
CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED);
else
@@ -1323,7 +1341,7 @@
BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText)
//------------------------------------------------------------
{
- //NOTE: pszText seems to point to char array of length 256.
+ //NOTE: pszText seems to point to char array of length 256 (Noverber 2006).
if ((pszText) && (uId))
{
switch(uId)
@@ -1340,8 +1358,8 @@
case IDC_CHECK_PITCHTEMPOLOCK:
if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument]))
{
- const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax());
- ASSERT(str.size() < 256);
+ string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax());
+ if(str.size() >= 250) str.resize(250);
wsprintf(pszText, str.c_str());
return TRUE;
}
@@ -1411,7 +1429,7 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- if ((pSndFile->m_nType & MOD_TYPE_IT)
+ if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))
&& (pSndFile->m_nInstruments > 0)
&& (CMainFrame::GetInputHandler()->ShiftPressed())) //rewbs.customKeys
{
@@ -1438,7 +1456,7 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- if ((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_nInstruments > 0))
+ if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0))
{
BOOL bFirst = (pSndFile->m_nInstruments) ? FALSE : TRUE;
LONG smp = m_pModDoc->InsertInstrument(0, m_nInstrument);
@@ -1461,7 +1479,7 @@
CFileDialog dlg(TRUE,
NULL,
NULL,
- OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT,
"All Instruments|*.xi;*.pat;*.iti;*.wav;*.aif;*.aiff|"
"FastTracker II Instruments (*.xi)|*.xi|"
"GF1 Patches (*.pat)|*.pat|"
@@ -1472,8 +1490,36 @@
{
dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurInsDir;
}
+ const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size.
+ vector<char> filenameBuffer(bufferSize, 0);
+ dlg.GetOFN().lpstrFile = &filenameBuffer[0];
+ dlg.GetOFN().nMaxFile = bufferSize;
+
if (dlg.DoModal() != IDOK) return;
- if (!OpenInstrument(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ POSITION pos = dlg.GetStartPosition();
+ size_t counter = 0;
+ while(pos != NULL)
+ {
+ //If loading multiple instruments, advancing to next instrument and creating
+ //new instrument if necessary.
+ if(counter > 0)
+ {
+ if(m_nInstrument >= MAX_INSTRUMENTS-1)
+ break;
+ else
+ m_nInstrument++;
+
+ if(m_nInstrument > m_pSndFile->GetNumInstruments())
+ OnInstrumentNew();
+ }
+
+ if(!OpenInstrument(dlg.GetNextPathName(pos)))
+ ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ counter++;
+ }
+ filenameBuffer.clear();
if (m_pParent) m_pParent->InstrumentChanged(m_nInstrument);
SwitchToView();
}
@@ -1503,10 +1549,10 @@
// "FastTracker II Instruments (*.xi)|*.xi|"
// "Impulse Tracker Instruments (*.iti)|*.iti||",
// this);
- CFileDialog dlg(FALSE, (m_pSndFile->m_nType & MOD_TYPE_IT) ? "iti" : "xi",
+ CFileDialog dlg(FALSE, (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? "iti" : "xi",
szFileName,
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
- ( m_pSndFile->m_nType & MOD_TYPE_IT ? "Impulse Tracker Instruments (*.iti)|*.iti|"
+ ( m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT) ? "Impulse Tracker Instruments (*.iti)|*.iti|"
"FastTracker II Instruments (*.xi)|*.xi||"
: "FastTracker II Instruments (*.xi)|*.xi|"
"Impulse Tracker Instruments (*.iti)|*.iti||" ),
@@ -1649,7 +1695,7 @@
if (nVol != (int)penv->nGlobalVol)
{
penv->nGlobalVol = nVol;
- if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified();
// -> CODE#0023
// -> DESC="IT project files (.itp)"
m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE;
@@ -1691,7 +1737,7 @@
if (nPan != (int)penv->nPan)
{
penv->nPan = nPan;
- if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified();
// -> CODE#0023
// -> DESC="IT project files (.itp)"
m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE;
@@ -2362,7 +2408,134 @@
return 0;
}
+
//end rewbs.customKeys
+
+void CCtrlInstruments::OnCbnSelchangeCombotuning()
+//------------------------------------------------
+{
+ if (IsLocked() || m_pModDoc == NULL || m_pSndFile == NULL) return;
+
+ INSTRUMENTHEADER* pInstH = m_pSndFile->Headers[m_nInstrument];
+ if(pInstH == 0)
+ return;
+
+ size_t sel = m_ComboTuning.GetCurSel();
+ if(sel == 0) //Setting IT behavior
+ {
+ BEGIN_CRITICAL();
+ pInstH->SetTuning(NULL);
+ END_CRITICAL();
+ m_pModDoc->SetModified();
+ UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT);
+ return;
+ }
+
+ sel -= 1;
+ CTuningCollection* tc = 0;
+
+ if(sel < CSoundFile::s_TuningsSharedStandard.GetNumTunings())
+ tc = &CSoundFile::s_TuningsSharedStandard;
+ else
+ {
+ sel -= CSoundFile::s_TuningsSharedStandard.GetNumTunings();
+ if(sel < CSoundFile::s_TuningsSharedLocal.GetNumTunings())
+ tc = &CSoundFile::s_TuningsSharedLocal;
+ else
+ {
+ sel -= CSoundFile::s_TuningsSharedLocal.GetNumTunings();
+ if(sel < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings())
+ tc = &m_pSndFile->m_TuningsTuneSpecific;
+ }
+ }
+
+ if(tc)
+ {
+ BEGIN_CRITICAL();
+ pInstH->SetTuning(&tc->GetTuning(sel));
+ END_CRITICAL();
+ m_pModDoc->SetModified();
+ UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT);
+ return;
+ }
+
+ //Case: Chosen tuning editor to be displayed.
+ //Creating vector for the CTuningDialog.
+ vector<CTuningCollection*> v;
+ v.push_back(&m_pSndFile->s_TuningsSharedStandard);
+ v.push_back(&m_pSndFile->s_TuningsSharedLocal);
+ v.push_back(&m_pSndFile->m_TuningsTuneSpecific);
+ CTuningDialog td(this, v, pInstH->pTuning);
+ td.DoModal();
+ if(td.GetModifiedStatus(&m_pSndFile->s_TuningsSharedLocal))
+ {
+ if(MsgBox(IDS_APPLY_TUNING_MODIFICATIONS, this, "", MB_OKCANCEL) == IDOK)
+ m_pSndFile->SaveStaticTunings();
+ }
+ if(td.GetModifiedStatus(&m_pSndFile->m_TuningsTuneSpecific))
+ {
+ m_pModDoc->SetModified();
+ }
+
+ //Recreating tuning combobox so that possible
+ //new tuning(s) come visible.
+ BuildTuningComboBox();
+
+ UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT);
+}
+
+
+void CCtrlInstruments::UpdateTuningComboBox()
+//-------------------------------------------
+{
+ if (m_pModDoc == 0 || m_pSndFile == 0
+ || m_nInstrument > m_pSndFile->GetNumInstruments()
+ || m_pSndFile->Headers[m_nInstrument] == NULL) return;
+
+ INSTRUMENTHEADER* const penv = m_pSndFile->Headers[m_nInstrument];
+ if(penv->pTuning == NULL)
+ {
+ m_ComboTuning.SetCurSel(0);
+ return;
+ }
+
+ for(size_t i = 0; i < CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++)
+ {
+ if(penv->pTuning == &CSoundFile::s_TuningsSharedStandard.GetTuning(i))
+ {
+ m_ComboTuning.SetCurSel(i+1);
+ return;
+ }
+ }
+
+ for(size_t i = 0; i < CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++)
+ {
+ if(penv->pTuning == &CSoundFile::s_TuningsSharedLocal.GetTuning(i))
+ {
+ m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings()+1);
+ return;
+ }
+ }
+
+ for(size_t i = 0; i < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++)
+ {
+ if(penv->pTuning == &m_pSndFile->m_TuningsTuneSpecific.GetTuning(i))
+ {
+ m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()+1);
+ return;
+ }
+ }
+
+ string str = s_TuningNotFound.first;
+ str.insert(s_TuningNotFound.second, m_pSndFile->Headers[m_nInstrument]->pTuning->GetName());
+ MessageBox(str.c_str());
+ BEGIN_CRITICAL();
+ penv->SetTuning(penv->s_DefaultTuning);
+ END_CRITICAL();
+ m_pModDoc->SetModified();
+ UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT);
+}
+
void CCtrlInstruments::OnEnChangeEditPitchtempolock()
//----------------------------------------------------
{
@@ -2397,7 +2570,7 @@
if(!penv)
return;
- //Checking to what value to put for the wPitchToTempoLock.
+ //Checking what value to put for the wPitchToTempoLock.
m_EditPitchTempoLock.EnableWindow();
WORD ptl = penv->wPitchToTempoLock;
if(ptl == 0)
@@ -2412,7 +2585,7 @@
ptl = m_pSndFile->m_nDefaultTempo;
}
m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str());
- //SetModified() comes with this.
+ //SetModified() comes with SetWindowText(.).
}
else
{
@@ -2428,9 +2601,12 @@
}
}
+
void CCtrlInstruments::OnEnKillfocusEditPitchtempolock()
//------------------------------------------------------
{
+ //Checking that tempo value is in correct range.
+
if(!m_pSndFile || IsLocked()) return;
char buffer[6];
@@ -2438,7 +2614,6 @@
int ptlTempo = atoi(buffer);
bool changed = false;
-
if(ptlTempo < m_pSndFile->GetTempoMin())
{
ptlTempo = m_pSndFile->GetTempoMin();
@@ -2450,6 +2625,29 @@
changed = true;
}
-
if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str());
}
+
+
+void CCtrlInstruments::BuildTuningComboBox()
+//------------------------------------------
+{
+ while(m_ComboTuning.GetCount() > 0)
+ m_ComboTuning.DeleteString(0);
+
+ m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL
+ for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++)
+ {
+ m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str());
+ }
+ for(size_t i = 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++)
+ {
+ m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).GetName().c_str());
+ }
+ for(size_t i = 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++)
+ {
+ m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).GetName().c_str());
+ }
+ m_ComboTuning.AddString("Control tunings...");
+ m_ComboTuning.SetCurSel(0);
+}
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.h 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2007-03-14 00:19:33 UTC (rev 175)
@@ -78,10 +78,18 @@
CSpinButtonCtrl m_SpinAttack;
// -! NEW_FEATURE#0027
+ //Tuning
+ CComboBox m_ComboTuning;
+ void UpdateTuningComboBox();
+ void BuildTuningComboBox();
+ static const pair<string, WORD> s_TuningNotFound;
+ //first <-> string, second <-> place where to put tuning name.
+
//Pitch/Tempo lock
CEdit m_EditPitchTempoLock;
CButton m_CheckPitchTempoLock;
+
public:
CCtrlInstruments();
virtual ~CCtrlInstruments();
@@ -94,6 +102,8 @@
VOID UpdateFilterText();
LONG* GetSplitPosRef() {return &CMainFrame::glInstrumentWindowHeight;} //rewbs.varWindowSize
+
+
public:
//{{AFX_VIRTUAL(CCtrlInstruments)
virtual BOOL OnInitDialog();
@@ -148,6 +158,7 @@
afx_msg void OnEditSampleMap();
afx_msg void TogglePluginEditor(); //rewbs.instroVSTi
afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys
+ afx_msg void OnCbnSelchangeCombotuning();
afx_msg void OnEnChangeEditPitchtempolock();
afx_msg void OnBnClickedCheckPitchtempolock();
afx_msg void OnEnKillfocusEditPitchtempolock();
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -166,10 +166,13 @@
// Spin controls
m_SpinSpacing.SetRange(0, 16);
m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing);
+
m_SpinInstrument.SetRange(-1, 1);
m_SpinInstrument.SetPos(0);
+
m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax());
m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins());
+
SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing);
SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins());
CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked
@@ -178,6 +181,8 @@
UpdateView(HINT_MODTYPE|HINT_PATNAMES, NULL);
RecalcLayout();
+
+
// -> CODE#0012
// -> DESC="midi keyboard split"
//rewbs.merge: fix buffer overrun:
@@ -222,6 +227,7 @@
m_bInitialized = TRUE;
UnlockControls();
+
return FALSE;
}
@@ -338,7 +344,7 @@
}
m_pSndFile->GetPatternName(nPat, s, sizeof(s));
m_EditPatName.SetWindowText(s);
- BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE;
+ BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE;
m_ToolBar.EnableButton(ID_PATTERN_MIDIMACRO, bXMIT);
m_ToolBar.EnableButton(ID_PATTERN_PROPERTIES, bXMIT);
m_ToolBar.EnableButton(ID_PATTERN_EXPAND, bXMIT);
@@ -550,6 +556,7 @@
//-----------------------------------------------
{
CModDoc *pModDoc = GetDocument();
+ CSoundFile* pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL;
if ((pModDoc) && (m_pParent))
{
@@ -560,28 +567,26 @@
}
m_pParent->InstrumentChanged(-1);
}
- if ((lParam >= 0) && (lParam < MAX_PATTERNS))
+ if ((lParam >= 0) && (lParam < m_pSndFile->Patterns.Size()))
{
- if (pModDoc)
+ if (pSndFile)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- for (UINT i=0; i<MAX_ORDERS; i++)
+ for (UINT i=0; i<pSndFile->Order.size(); i++)
{
if (pSndFile->Order[i] == (UINT)lParam)
{
m_OrderList.SetCurSel(i, TRUE);
break;
}
- if (pSndFile->Order[i] == 0xFF) break;
+ if (pSndFile->Order[i] == pSndFile->Patterns.GetInvalidIndex()) break;
}
}
SetCurrentPattern(lParam);
}
- else if ((lParam >= 0x8000) && (lParam < MAX_ORDERS + 0x8000))
+ else if ((lParam >= 0x8000) && (lParam < pSndFile->Order.size() + 0x8000))
{
- if (pModDoc)
+ if (pSndFile)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
lParam &= 0x7FFF;
m_OrderList.SetCurSel(lParam);
SetCurrentPattern(pSndFile->Order[lParam]);
@@ -693,6 +698,8 @@
SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i);
}
+
+
void CCtrlPatterns::OnSpacingChanged()
//------------------------------------
{
@@ -822,13 +829,13 @@
UINT nCurOrd = m_OrderList.GetCurSel();
UINT pat = pSndFile->Order[nCurOrd];
UINT rows = 64;
- if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)))
+ if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
{
rows = pSndFile->PatternSize[pat];
if (rows < 32) rows = 32;
}
LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows);
- if ((nNewPat >= 0) && (nNewPat < MAX_PATTERNS))
+ if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
{
m_OrderList.SetCurSel(nCurOrd+1);
m_OrderList.InvalidateRect(NULL, FALSE);
@@ -850,15 +857,15 @@
UINT nCurOrd = m_OrderList.GetCurSel();
UINT nCurPat = pSndFile->Order[nCurOrd];
UINT rows = 64;
- if (nCurPat < MAX_PATTERNS)
+ if (nCurPat < pSndFile->Patterns.Size())
{
- if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)))
+ if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
{
rows = pSndFile->PatternSize[nCurPat];
if (rows < 16) rows = 16;
}
LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows);
- if ((nNewPat >= 0) && (nNewPat < MAX_PATTERNS))
+ if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
{
MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat];
MODCOMMAND *pDest = pSndFile->Patterns[nNewPat];
@@ -1074,7 +1081,7 @@
if (strcmp(s, sold))
{
m_pSndFile->SetPatternName(nPat, s);
- if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, (nPat << 24) | HINT_PATNAMES, this);
}
}
@@ -1204,4 +1211,5 @@
return false;
}
+
//end rewbs.instroVST
\ No newline at end of file
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2007-03-14 00:19:33 UTC (rev 175)
@@ -37,10 +37,14 @@
BOOL UpdateScrollInfo();
void UpdateInfoText();
int GetFontWidth();
- BYTE SetOrderlistMargins(int); //Returns the number that was set.
+
+ //Returns the number that was set.
+ BYTE SetOrderlistMargins(int);
BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;}
- BYTE GetShownOrdersMax(); //Should return the maximum number of shown orders.
+ //Should return the maximum number of shown orders.
+ BYTE GetShownOrdersMax();
+
public:
//{{AFX_VIRTUAL(COrderList)
virtual BOOL PreTranslateMessage(MSG *pMsg);
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -105,7 +105,7 @@
UINT nPage;
int nMax=0;
- while ((nMax < MAX_ORDERS) && (pSndFile->Order[nMax] != 0xFF)) nMax++;
+ while ((nMax < pSndFile->Order.size()) && (pSndFile->Order[nMax] != pSndFile->Patterns.GetInvalidIndex())) nMax++;
GetScrollInfo(SB_HORZ, &info, SIF_PAGE|SIF_RANGE);
info.fMask = SIF_PAGE|SIF_RANGE;
info.nMin = 0;
@@ -166,9 +166,10 @@
//---------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
CRect rcClient;
- if ((sel < 0) || (sel >= MAX_ORDERS) || (!m_pParent) || (!pMainFrm)) return FALSE;
+ if ((sel < 0) || (sel >= pSndFile->Order.size()) || (!m_pParent) || (!pMainFrm)) return FALSE;
if (sel == m_nScrollPos) return TRUE;
GetClientRect(&rcClient);
InvalidateSelection();
@@ -195,9 +196,8 @@
InvalidateSelection();
if ((m_pParent) && (m_pModDoc) && (bEdit))
{
- CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
UINT n = pSndFile->Order[m_nScrollPos];
- if ((n < MAX_PATTERNS) && (pSndFile->Patterns[n]))
+ if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]))
{
BOOL bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc);
if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP))
@@ -216,7 +216,11 @@
pSndFile->m_nCurrentPattern = m_nScrollPos;
pSndFile->SetCurrentOrder(m_nScrollPos);
pSndFile->m_dwSongFlags |= dwPaused;
- if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE);
+ //if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE);
+ //Relabs.note: Commented above line for it seems to cause
+ //significant slowdown when changing patterns without
+ //pattern-loop enabled. What is it's purpose anyway?
+
if (bIsPlaying) pMainFrm->ResetNotificationBuffer();
END_CRITICAL();
}
@@ -231,9 +235,9 @@
UINT COrderList::GetCurrentPattern() const
//----------------------------------------
{
- if ((m_pModDoc) && (m_nScrollPos < MAX_PATTERNS))
+ CSoundFile* pSndFile = m_pModDoc ? m_pModDoc->GetSoundFile() : NULL;
+ if ((pSndFile) && (m_nScrollPos < pSndFile->Patterns.Size()))
{
- CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
return pSndFile->Order[m_nScrollPos];
}
return 0;
@@ -255,7 +259,7 @@
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
int i = 0;
- for (i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break;
+ for (i=0; i<pSndFile->Order.size()-1; i++) if (pSndFile->Order[i+1] == pSndFile->Patterns.GetInvalidIndex()) break;
SetCurSel(i);
}
break;
@@ -288,10 +292,11 @@
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
int ord = pSndFile->Order[m_nScrollPos];
int maxpat = 0;
- for (int i=0; i<MAX_PATTERNS; i++) if (pSndFile->Patterns[i]) maxpat = i;
+ for (int i=0; i<pSndFile->Patterns.Size(); i++) if (pSndFile->Patterns[i]) maxpat = i;
if ((nChar >= '0') && (nChar <= '9'))
{
- if (ord >= MAX_PATTERNS) ord = 0;
+ if (ord >= pSndFile->Patterns.Size()) ord = 0;
+
ord = ord * 10 + (nChar - '0');
if ((ord >= 100) && (ord > maxpat)) ord %= 100;
if ((ord >= 10) && (ord > maxpat)) ord %= 10;
@@ -299,18 +304,23 @@
if (nChar == '+')
{
ord++;
- if (ord > 0xFF) ord = 0; else
- if ((ord > maxpat) && (ord < 0xFE)) ord = 0xFE;
+ if(ord > pSndFile->Patterns.GetInvalidIndex())
+ ord = 0;
+ else
+ {
+ if(ord > maxpat && ord < pSndFile->Patterns.GetIgnoreIndex())
+ ord = pSndFile->Patterns.GetIgnoreIndex();
+ }
} else
if (nChar == '-')
{
ord--;
- if (ord < 0) ord = 0xFF; else
- if ((ord > maxpat) && (ord < 0xFE)) ord = maxpat;
+ if (ord < 0) ord = pSndFile->Patterns.GetInvalidIndex(); else
+ if ((ord > maxpat) && (ord < pSndFile->Patterns.GetIgnoreIndex())) ord = maxpat;
}
if (ord != pSndFile->Order[m_nScrollPos])
{
- pSndFile->Order[m_nScrollPos] = (BYTE)ord;
+ pSndFile->Order[m_nScrollPos] = static_cast<UINT>(ord);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
InvalidateSelection();
@@ -399,12 +409,20 @@
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
s[0] = 0;
- wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position %02Xh of %02Xh" : "Position %d of %d",
- m_nScrollPos, pSndFile->GetNumPatterns());
- if (m_nScrollPos < MAX_ORDERS)
+ if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY)
{
+ wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->GetNumPatterns());
+ }
+ else
+ {
+ wsprintf(s, "Position %d of %d (%02Xh of %02Xh)",
+ m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns());
+ }
+
+ if (m_nScrollPos < pSndFile->Order.size())
+ {
UINT nPat = pSndFile->Order[m_nScrollPos];
- if ((nPat < MAX_PATTERNS) && (nPat < pSndFile->m_nPatternNames))
+ if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNames))
{
CHAR szpat[40] = "";
if (pSndFile->GetPatternName(nPat, szpat))
@@ -450,7 +468,7 @@
while (rect.left < rcClient.right)
{
BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE;
- int nOrder = ((nIndex >= 0) && (nIndex < MAX_ORDERS)) ? pSndFile->Order[nIndex] : -1;
+ int nOrder = ((nIndex >= 0) && (nIndex < pSndFile->Order.size())) ? pSndFile->Order[nIndex] : -1;
if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right;
rect.right--;
FillRect(dc.m_hDC, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow);
@@ -482,9 +500,16 @@
s[0] = 0;
if ((nOrder >= 0) && (rect.left + m_cxFont - 4 <= rcClient.right))
{
- if (nOrder == 0xFF) strcpy(s, "---"); else
- if (nOrder < MAX_PATTERNS) wsprintf(s, "%d", nOrder);
- else strcpy(s, "+++");
+ if (nOrder == pSndFile->Patterns.GetInvalidIndex()) strcpy(s, "---"); //Print the 'dots'
+ else
+ {
+ if (nOrder < pSndFile->Patterns.Size()) wsprintf(s, "%d", nOrder);
+ else
+ {
+ if(nOrder == pSndFile->Patterns.GetIgnoreIndex()) strcpy(s, "+++");
+ else strcpy(s, "BUG");
+ }
+ }
}
dc.SetTextColor((bHighLight) ? colorTextSel : colorText);
dc.DrawText(s, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
@@ -531,7 +556,7 @@
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
int nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if ((nOrder >= 0) && (nOrder < MAX_ORDERS))
+ if ((nOrder >= 0) && (nOrder < pSndFile->Order.size()))
{
if (pSndFile->m_nSeqOverride == nOrder+1) {
pSndFile->m_nSeqOverride=0;
@@ -599,7 +624,7 @@
if (rect.PtInRect(pt))
{
n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if ((n < 0) || (n >= MAX_ORDERS)) n = -1;
+ if ((n < 0) || (n >= m_pModDoc->GetSoundFile()->Order.size())) n = -1;
}
if (n != (int)m_nDropPos)
{
@@ -638,7 +663,7 @@
HMENU hMenu = ::CreatePopupMenu();
UINT nCurrentPattern = GetCurrentPattern();
- bool patternExists = (nCurrentPattern<MAX_PATTERNS
+ bool patternExists = (nCurrentPattern < m_pModDoc->GetSoundFile()->Patterns.Size()
&& m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] != NULL);
DWORD greyed = patternExists?FALSE:MF_GRAYED;
@@ -651,7 +676,7 @@
AppendMenu(hMenu, MF_STRING|greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern");
AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNCOPY, "&Copy Pattern");
AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNPASTE, "P&aste Pattern");
- if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)))
+ if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_PROPERTIES, "&Properties...");
@@ -729,7 +754,14 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- for (int i=MAX_ORDERS-1; i>m_nScrollPos; i--) pSndFile->Order[i] = pSndFile->Order[i-1];
+ //Checking whether there is some pattern at the end of orderlist.
+
+ if(pSndFile->Order[pSndFile->Order.size()-1] < pSndFile->Patterns.Size())
+ {
+ if(pSndFile->Order.size() < pSndFile->Order.GetOrderNumberLimitMax())
+ pSndFile->Order.push_back(pSndFile->Patterns.GetInvalidIndex());
+ }
+ for (int i=pSndFile->Order.size()-1; i>m_nScrollPos; i--) pSndFile->Order[i] = pSndFile->Order[i-1];
InvalidateRect(NULL, FALSE);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
@@ -743,13 +775,13 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- for (int i=m_nScrollPos; i<MAX_ORDERS-1; i++) pSndFile->Order[i] = pSndFile->Order[i+1];
- pSndFile->Order[MAX_ORDERS-1] = 0xFF;
+ for (int i=m_nScrollPos; i<pSndFile->Order.size()-1; i++) pSndFile->Order[i] = pSndFile->Order[i+1];
+ pSndFile->Order[pSndFile->Order.size()-1] = pSndFile->Patterns.GetInvalidIndex();
InvalidateRect(NULL, FALSE);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
UINT nNewOrd = pSndFile->Order[m_nScrollPos];
- if ((nNewOrd < MAX_PATTERNS) && (pSndFile->Patterns[nNewOrd]) && (m_pParent))
+ if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]) && (m_pParent))
{
m_pParent->SetCurrentPattern(nNewOrd);
}
@@ -837,11 +869,12 @@
CPoint pt;
if ((!pDropInfo) || (!m_pModDoc) || (m_pModDoc != pDropInfo->pModDoc) || (!m_cxFont)) return FALSE;
+ pSndFile = m_pModDoc->GetSoundFile();
bCanDrop = FALSE;
switch(pDropInfo->dwDropType)
{
case DRAGONDROP_ORDER:
- if (pDropInfo->dwDropItem >= MAX_ORDERS) break;
+ if (pDropInfo->dwDropItem >= pSndFile->Order.size()) break;
case DRAGONDROP_PATTERN:
bCanDrop = TRUE;
break;
@@ -851,12 +884,11 @@
ScreenToClient(&pt);
if (pt.x < 0) pt.x = 0;
posdest = m_nXScroll + (pt.x / m_cxFont);
- if (posdest >= MAX_ORDERS) return FALSE;
- pSndFile = m_pModDoc->GetSoundFile();
+ if (posdest >= pSndFile->Order.size()) return FALSE;
switch(pDropInfo->dwDropType)
{
case DRAGONDROP_PATTERN:
- pSndFile->Order[posdest] = (BYTE)pDropInfo->dwDropItem;
+ pSndFile->Order[posdest] = static_cast<UINT>(pDropInfo->dwDropItem);
break;
case DRAGONDROP_ORDER:
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -527,7 +527,7 @@
m_ComboSustainType.AddString("Off");
m_ComboSustainType.AddString("On");
// Bidirectional Loops
- if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))
+ if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))
{
m_ComboLoopType.AddString("Bidi");
m_ComboSustainType.AddString("Bidi");
@@ -545,19 +545,19 @@
m_SpinSustainEnd.SetRange(-1, 1);
m_SpinSustainEnd.SetPos(0);
// Sustain Loops only available in IT
- b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE;
+ b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE;
m_ComboSustainType.EnableWindow(b);
m_SpinSustainStart.EnableWindow(b);
m_SpinSustainEnd.EnableWindow(b);
m_EditSustainStart.EnableWindow(b);
m_EditSustainEnd.EnableWindow(b);
// Finetune / C-4 Speed / BaseNote
- b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) ? TRUE : FALSE;
+ b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE;
SetDlgItemText(IDC_TEXT7, (b) ? "Freq. (Hz)" : "Finetune");
m_SpinFineTune.SetRange(-1, 1);
m_EditFileName.EnableWindow(b);
// AutoVibrato
- b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE;
+ b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE;
m_ComboAutoVib.EnableWindow(b);
m_SpinVibSweep.EnableWindow(b);
m_SpinVibDepth.EnableWindow(b);
@@ -566,11 +566,11 @@
m_EditVibDepth.EnableWindow(b);
m_EditVibRate.EnableWindow(b);
// Global Volume
- b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE;
+ b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE;
m_EditGlobalVol.EnableWindow(b);
m_SpinGlobalVol.EnableWindow(b);
// Panning
- b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE;
+ b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE;
m_CheckPanning.EnableWindow(b);
m_EditPanning.EnableWindow(b);
m_SpinPanning.EnableWindow(b);
@@ -609,7 +609,7 @@
//end rewbs.fix36944
// FineTune / C-4 Speed / BaseNote
int transp = 0;
- if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT))
+ if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
wsprintf(s, "%lu", pins->nC4Speed);
m_EditFineTune.SetWindowText(s);
@@ -893,7 +893,7 @@
CFileDialog dlg(TRUE,
NULL,
NULL,
- OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT,
"All Samples|*.wav;*.pat;*.s3i;*.smp;*.snd;*.raw;*.xi;*.aif;*.aiff;*.its;*.8sv;*.8svx;*.svx;*.pcm|"
"Wave Files (*.wav)|*.wav|"
"XI Samples (*.xi)|*.xi|"
@@ -909,9 +909,38 @@
dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurSmpDir;
}
dlg.m_ofn.nFilterIndex = nLastIndex;
+ const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006).
+ vector<char> filenameBuffer(bufferSize, 0);
+ dlg.GetOFN().lpstrFile = &filenameBuffer[0];
+ dlg.GetOFN().nMaxFile = bufferSize;
+
if (dlg.DoModal() != IDOK) return;
+
nLastIndex = dlg.m_ofn.nFilterIndex;
- if (!OpenSample(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ POSITION pos = dlg.GetStartPosition();
+ size_t counter = 0;
+ while(pos != NULL)
+ {
+ //If loading multiple samples, advancing to next sample and creating
+ //new one if necessary.
+ if(counter > 0)
+ {
+ if(m_nSample >= MAX_SAMPLES-1)
+ break;
+ else
+ m_nSample++;
+
+ if(m_nSample > m_pSndFile->GetNumSamples())
+ OnSampleNew();
+ }
+
+ if(!OpenSample(dlg.GetNextPathName(pos)))
+ ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ counter++;
+ }
+ filenameBuffer.clear();
SwitchToView();
}
@@ -926,7 +955,7 @@
SwitchToView();
return;
}
- if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT))
+ if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
memcpy(szFileName, m_pSndFile->Ins[m_nSample].name, 22);
szFileName[22] = 0;
@@ -2166,7 +2195,7 @@
memcpy(m_pSndFile->Ins[m_nSample].name, s, 22);
// 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
m_pModDoc->UpdateAllViews(NULL, (m_nSample << 20) | HINT_SAMPLEINFO, this);
- if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified();
}
}
@@ -2207,7 +2236,7 @@
{
if (IsLocked()) return;
BOOL b = FALSE;
- if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))
+ if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))
{
b = IsDlgButtonChecked(IDC_CHECK1);
}
@@ -2216,14 +2245,14 @@
if (!(m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING))
{
m_pSndFile->Ins[m_nSample].uFlags |= CHN_PANNING;
- if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified();
}
} else
{
if (m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING)
{
m_pSndFile->Ins[m_nSample].uFlags &= ~CHN_PANNING;
- if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType == (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified();
}
}
}
@@ -2246,7 +2275,7 @@
if (nPan != m_pSndFile->Ins[m_nSample].nPan)
{
m_pSndFile->Ins[m_nSample].nPan = nPan;
- if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified();
+ if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified();
}
}
@@ -2256,7 +2285,7 @@
{
if (IsLocked()) return;
int n = GetDlgItemInt(IDC_EDIT5);
- if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M))
+ if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT))
{
if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC4Speed))
{
@@ -2290,7 +2319,7 @@
{
if (IsLocked()) return;
int n = 60 - (m_CbnBaseNote.GetCurSel() + BASENOTE_MIN);
- if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M))
+ if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT))
{
LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Ins[m_nSample].nC4Speed) & 0x7f;
n = CSoundFile::TransposeToFrequency(n, ft);
@@ -2724,7 +2753,7 @@
// FineTune / C-5 Speed
if ((pos = (short int)m_SpinFineTune.GetPos()) != 0)
{
- if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT))
+ if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
LONG d = pins->nC4Speed;
if (d < 1) d = 8363;
@@ -2790,6 +2819,7 @@
}
LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam)
+//----------------------------------------------------------------
{
if (wParam == kcNull)
return NULL;
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -7,7 +7,11 @@
#include "view_pat.h"
#include "EffectVis.h" //rewbs.fxvis
#include "ChannelManagerDlg.h"
+#include "../soundlib/tuning_template.h"
+#include <string>
+using std::string;
+
// Headers
#define ROWHDR_WIDTH 32 // Row header
#define COLHDR_HEIGHT 16 // Column header
@@ -284,16 +288,24 @@
srcy = pfnt->nAlphaNZ_Y + 15 * COLUMN_HEIGHT;
break;
//end rewbs.velocity
-
+ case ' ':
+ srcx = pfnt->nClrX;
+ srcy = pfnt->nClrY;
+ break;
+ case '-':
+ srcx = pfnt->nNoteX + pfnt->nNoteWidth/2;
+ srcy = pfnt->nNoteY + COLUMN_HEIGHT;
+ break;
}
m_Dib.TextBlt(x, y, sizex, COLUMN_HEIGHT, srcx+ofsx, srcy);
}
-void CViewPattern::DrawNote(int x, int y, UINT note)
-//--------------------------------------------------
+void CViewPattern::DrawNote(int x, int y, UINT note, CTuning* pTuning)
+//---------------------------------------------------------------------------
{
PCPATTERNFONT pfnt = GetCurrentPatternFont();
+
UINT xsrc = pfnt->nNoteX, ysrc = pfnt->nNoteY, dx = pfnt->nEltWidths[0];
if (!note)
{
@@ -308,11 +320,22 @@
m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT);
} else
{
- UINT o = (note-1) / 12;
- UINT n = (note-1) % 12;
- m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COLUMN_HEIGHT);
- m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT,
- pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT);
+ if(pTuning)
+ {
+ string noteStr = pTuning->GetNoteName(static_cast<CTuning::STEPTYPE>(note-NOTE_MIDDLEC));
+ noteStr.resize(3, ' ');
+ DrawLetter(x, y, noteStr[0]);
+ DrawLetter(x + pfnt->nNoteWidth/2, y, noteStr[1]);
+ DrawLetter(x + pfnt->nNoteWidth, y, noteStr[2]);
+ }
+ else //Original
+ {
+ UINT o = (note-1) / 12; //Octave
+ UINT n = (note-1) % 12; //Note
+ m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COLUMN_HEIGHT);
+ m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT,
+ pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT);
+ }
}
}
@@ -407,7 +430,7 @@
const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]? "[Channel %d]" : "Channel %d";
// const char *pszfmt = pModDoc->IsChannelRecord(ncolhdr) ? "Channel %d " : "Channel %d";
// -! NEW_FEATURE#0012
- if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20))
+ if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20))
pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"%d: [%s]":"%d: %s";
else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Ch%d]":"Ch%d";
else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Chn %d]":"Chn %d";
@@ -491,13 +514,13 @@
{
UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
- if ((nCurOrder > 0) && (nCurOrder < MAX_ORDERS) && (pSndFile->Order[nCurOrder] == m_nPattern))
+ if ((nCurOrder > 0) && (nCurOrder < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder] == m_nPattern))
{
nPrevPat = pSndFile->Order[nCurOrder-1];
bPrevPatFound = TRUE;
}
}
- if ((bPrevPatFound) && (nPrevPat < MAX_PATTERNS) && (pSndFile->Patterns[nPrevPat]))
+ if ((bPrevPatFound) && (nPrevPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nPrevPat]))
{
UINT nPrevRows = pSndFile->PatternSize[nPrevPat];
UINT n = (nSkip < nPrevRows) ? nSkip : nPrevRows;
@@ -535,12 +558,12 @@
BOOL bNextPatFound = FALSE;
UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
- if ((nCurOrder+1 < MAX_ORDERS) && (pSndFile->Order[nCurOrder] == m_nPattern))
+ if ((nCurOrder+1 < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder] == m_nPattern))
{
nNextPat = pSndFile->Order[nCurOrder+1];
bNextPatFound = TRUE;
}
- if ((bNextPatFound) && (nNextPat < MAX_PATTERNS) && (pSndFile->Patterns[nNextPat]))
+ if ((bNextPatFound) && (nNextPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNextPat]))
{
UINT nNextRows = pSndFile->PatternSize[nNextPat];
UINT n = ((UINT)nVisRows < nNextRows) ? nVisRows : nNextRows;
@@ -757,7 +780,10 @@
}
// Drawing note
m_Dib.SetTextColor(tx_col, bk_col);
- DrawNote(xbmp+x, 0, m->note);
+ if(pSndFile->m_nType == MOD_TYPE_MPT && m->instr < MAX_INSTRUMENTS && pSndFile->Headers[m->instr])
+ DrawNote(xbmp+x, 0, m->note, pSndFile->Headers[m->instr]->pTuning);
+ else //Original
+ DrawNote(xbmp+x, 0, m->note);
}
x += pfnt->nEltWidths[0];
// Instrument
Modified: trunk/OpenMPT/mptrack/Globals.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Globals.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Globals.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -395,7 +395,7 @@
UINT nType = pSndFile->GetType();
UINT mask = 1 | 2 | 4 | 16;
- if (nType & (MOD_TYPE_XM|MOD_TYPE_IT))
+ if (nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))
{
mask |= 8;
//mask |= 32; //rewbs.graph
Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -229,9 +229,9 @@
for (int c=kcClearRow; c<=kcInsertAllRows; c++)
newCat->commands.Add(c);
newCat->separators.Add(kcInsertAllRows); //--------------------------------------
- for (int c=kcChannelMute; c<=kcToggleChanMuteOnPatTransition; c++)
+ for (int c=kcChannelMute; c<=kcSoloChnOnPatTransition; c++)
newCat->commands.Add(c);
- newCat->separators.Add(kcToggleChanMuteOnPatTransition); //--------------------------------------
+ newCat->separators.Add(kcSoloChnOnPatTransition); //--------------------------------------
for (int c=kcTransposeUp; c<=kcTransposeOctDown; c++)
newCat->commands.Add(c);
newCat->separators.Add(kcTransposeOctDown); //--------------------------------------
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2007-03-14 00:19:33 UTC (rev 175)
@@ -352,6 +352,8 @@
m_InputHandler = new CInputHandler(this); //rewbs.customKeys
m_pPerfCounter= new CPerformanceCounter();
+ //Loading static tunings here - probably not the best place to do that but anyway.
+ CSoundFile::LoadStaticTunings();
}
void CMainFrame::LoadIniSettings()
@@ -644,6 +646,8 @@
delete m_InputHandler; //rewbs.customKeys
delete m_pAutoSaver; //rewbs.autosaver
delete m_pPerfCounter;
+
+ CChannelManagerDlg::DestroySharedInstance();
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
@@ -1988,11 +1992,9 @@
m_WaveFile.m_nSamples = 1;
m_WaveFile.Order[0] = 0;
m_WaveFile.Order[1] = 1;
- m_WaveFile.Order[2] = 0xFF;
- m_WaveFile.PatternSize[0] = 64;
- m_WaveFile.PatternSize[1] = 64;
- m_WaveFile.Patterns[0] = CSoundFile::AllocatePattern(64, 4);
- m_WaveFile.Patterns[1] = CSoundFile::AllocatePattern(64, 4);
+ m_WaveFile.Order[2] = m_WaveFile.Patterns.GetInvalidIndex();
+ m_WaveFile.Patterns.Insert(0,64);
+ m_WaveFile.Patterns.Insert(1,64);
if (m_WaveFile.Patterns[0])
{
if (!nNote) nNote = 5*12+1;
@@ -2063,11 +2065,9 @@
}
m_WaveFile.Order[0] = 0;
m_WaveFile.Order[1] = 1;
- m_WaveFile.Order[2] = 0xFF;
- m_WaveFile.PatternSize[0] = 64;
- m_WaveFile.PatternSize[1] = 64;
- m_WaveFile.Patterns[0] = CSoundFile::AllocatePattern(64, 4);
- m_WaveFile.Patterns[1] = CSoundFile::AllocatePattern(64, 4);
+ m_WaveFile.Order[2] = m_WaveFile.Patterns.GetInvalidIndex();
+ m_WaveFile.Patterns.Insert(0, 64);
+ m_WaveFile.Patterns.Insert(1, 64);
if (m_WaveFile.Patterns[0])
{
if (!nNote) nNote = 5*12+1;
@@ -2543,7 +2543,7 @@
if (m_pSndFile != &m_WaveFile)
{
UINT nPat = m_pSndFile->m_nPattern;
- if (nPat < MAX_PATTERNS)
+ if(nPat < m_pSndFile->Patterns.Size())
{
if (nPat < 10) strcat(s, " ");
if (nPat < 100) strcat(s, " ");
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2007-03-13 22:14:22 UTC (rev 174)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2007...
[truncated message content] |