From: <sag...@us...> - 2011-12-03 15:55:03
|
Revision: 1142 http://modplug.svn.sourceforge.net/modplug/?rev=1142&view=rev Author: saga-games Date: 2011-12-03 15:54:55 +0000 (Sat, 03 Dec 2011) Log Message: ----------- [Mod] Song flags are not updated "live" anymore in song properties (http://bugs.openmpt.org/view.php?id=212). [Mod] Sample undo history is not lost anymore when converting between two mod formats. [Fix] Fixed some off-by-one sample / instrument limits [Fix] PSM16 Loader: More sample frequency fixes... Should be about right now (cross-comparing with Silverball and Epic Pinball seems to verify this) [Mod] OpenMPT: Version is now 1.20.00.56 Modified Paths: -------------- trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/UpdateCheck.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-12-03 15:54:55 UTC (rev 1142) @@ -106,7 +106,6 @@ const bool newTypeIsMOD = (nNewType == MOD_TYPE_MOD), newTypeIsXM = (nNewType == MOD_TYPE_XM), newTypeIsS3M = (nNewType == MOD_TYPE_S3M), newTypeIsIT = (nNewType == MOD_TYPE_IT), newTypeIsMPT = (nNewType == MOD_TYPE_MPT), newTypeIsMOD_XM = (newTypeIsMOD || newTypeIsXM), - newTypeIsXM_IT_MPT = (newTypeIsXM || newTypeIsIT || newTypeIsMPT), newTypeIsIT_MPT = (newTypeIsIT || newTypeIsMPT); const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType); @@ -257,6 +256,7 @@ for(SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.GetNumSamples(); nSmp++) { MODSAMPLE &sample = m_SndFile.GetSample(nSmp); + GetSampleUndo().PrepareUndo(nSmp, sundo_none); // Too many samples? Only 31 samples allowed in MOD format... if(newTypeIsMOD && nSmp > 31 && sample.nLength > 0) @@ -412,16 +412,14 @@ CriticalSection cs; m_SndFile.ChangeModTypeTo(nNewType); - if(!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) + + // Song flags + if(!(CSoundFile::GetModSpecifications(nNewType).songFlags & SONG_LINEARSLIDES) && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) { CHANGEMODTYPE_WARNING(wLinearSlides); - m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES; } - if(!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX); - if(!newTypeIsS3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES; - if(!newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_PT1XMODE; - if(newTypeIsS3M || newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE; if(oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATGXX; + m_SndFile.m_dwSongFlags &= SONG_PLAY_FLAGS | CSoundFile::GetModSpecifications(nNewType).songFlags; // Adjust mix levels if(newTypeIsMOD || newTypeIsS3M) @@ -435,11 +433,11 @@ } // Automatically enable compatible mode when converting from MOD and S3M, since it's automatically enabled in those formats. - if((nOldType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) && (nNewType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if((nOldType & (MOD_TYPE_MOD | MOD_TYPE_S3M)) && (nNewType & (MOD_TYPE_XM | MOD_TYPE_IT))) { m_SndFile.SetModFlag(MSF_COMPATIBLE_PLAY, true); } - if((nNewType & (MOD_TYPE_XM|MOD_TYPE_IT)) && !m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY)) + if((nNewType & (MOD_TYPE_XM | MOD_TYPE_IT)) && !m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY)) { CHANGEMODTYPE_WARNING(wCompatibilityMode); } @@ -448,10 +446,10 @@ ChangeFileExtension(nNewType); // Check mod specifications - m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); - m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); + Limit(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); + Limit(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); - for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) if(m_SndFile.Instruments[i] != nullptr) + for(INSTRUMENTINDEX i = 1; i <= m_SndFile.GetNumInstruments(); i++) if(m_SndFile.Instruments[i] != nullptr) { UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv), &m_SndFile, warnings); UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv), &m_SndFile, warnings); @@ -498,7 +496,6 @@ SetModified(); GetPatternUndo().ClearUndo(); - GetSampleUndo().ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); EndWaitCursor(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2011-12-03 15:54:55 UTC (rev 1142) @@ -360,7 +360,7 @@ return false; } - const INSTRUMENTINDEX nInstrumentMax = m_SndFile.GetModSpecifications().instrumentsMax - 1; + const INSTRUMENTINDEX nInstrumentMax = m_SndFile.GetModSpecifications().instrumentsMax; const SAMPLEINDEX nInstruments = min(m_SndFile.GetNumSamples(), nInstrumentMax); for(SAMPLEINDEX smp = 1; smp <= nInstruments; smp++) @@ -460,7 +460,7 @@ m_SndFile.Order.Append(); } - for (UINT j=0; j<m_SndFile.Order.size(); j++) + for (ORDERINDEX j = 0; j < m_SndFile.Order.size(); j++) { if (m_SndFile.Order[j] == i) break; if (m_SndFile.Order[j] == m_SndFile.Order.GetInvalidPatIndex() && nOrd == ORDERINDEX_INVALID) @@ -468,11 +468,11 @@ m_SndFile.Order[j] = i; break; } - if ((nOrd >= 0) && (j == (UINT)nOrd)) + if (j == nOrd) { - for (UINT k=m_SndFile.Order.size()-1; k>j; k--) + for (ORDERINDEX k = m_SndFile.Order.size() - 1; k > j; k--) { - m_SndFile.Order[k] = m_SndFile.Order[k-1]; + m_SndFile.Order[k] = m_SndFile.Order[k - 1]; } m_SndFile.Order[j] = i; break; @@ -511,14 +511,14 @@ // Insert a new instrument assigned to sample nSample or duplicate instrument nDuplicate. -// If nSample is invalid, an approriate sample slot is selected. 0 means "no sample". +// If nSample is invalid, an appropriate sample slot is selected. 0 means "no sample". INSTRUMENTINDEX CModDoc::InsertInstrument(SAMPLEINDEX nSample, INSTRUMENTINDEX nDuplicate) //---------------------------------------------------------------------------------------- { if (m_SndFile.GetModSpecifications().instrumentsMax == 0) return INSTRUMENTINDEX_INVALID; MODINSTRUMENT *pDup = nullptr; - const INSTRUMENTINDEX nInstrumentMax = m_SndFile.GetModSpecifications().instrumentsMax - 1; + const INSTRUMENTINDEX nInstrumentMax = m_SndFile.GetModSpecifications().instrumentsMax; if ((nDuplicate > 0) && (nDuplicate <= m_SndFile.m_nInstruments)) { pDup = m_SndFile.Instruments[nDuplicate]; @@ -566,7 +566,7 @@ newsmp = nSample; } else if (!pDup) { - for(SAMPLEINDEX k = 1; k <= m_SndFile.m_nSamples; k++) + for(SAMPLEINDEX k = 1; k <= m_SndFile.GetNumSamples(); k++) { if (!m_SndFile.IsSampleUsed(k)) { @@ -623,11 +623,11 @@ sample.nC5Speed = 8363; sample.RelativeTone = 0; sample.nFineTune = 0; - sample.nVibType = 0; + sample.nVibType = VIB_SINE; sample.nVibSweep = 0; sample.nVibDepth = 0; sample.nVibRate = 0; - sample.uFlags &= ~(CHN_PANNING|CHN_SUSTAINLOOP); + sample.uFlags &= ~(CHN_PANNING|CHN_SUSTAINLOOP|CHN_LOOP); if(m_SndFile.GetType() == MOD_TYPE_XM) { sample.uFlags |= CHN_PANNING; @@ -813,7 +813,7 @@ { LPCSTR pszFormatName; EmptyClipboard(); - switch(m_SndFile.m_nType) + switch(m_SndFile.GetType()) { case MOD_TYPE_S3M: pszFormatName = "S3M"; break; case MOD_TYPE_XM: pszFormatName = "XM"; break; @@ -994,7 +994,7 @@ } const CModSpecifications &sourceSpecs = CSoundFile::GetModSpecifications(origFormat); - const bool bS3MCommands = (origFormat & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M)) != 0 ? true : false; + const bool bS3MCommands = (origFormat & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M)) != 0; pos = startPos; while ((nrow < m_SndFile.Patterns[nPattern].GetNumRows())) Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp =================================================================== --- trunk/OpenMPT/mptrack/UpdateCheck.cpp 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/UpdateCheck.cpp 2011-12-03 15:54:55 UTC (rev 1142) @@ -81,11 +81,12 @@ // Never ran update checks before, so we notify the user of automatic update checks. if(CUpdateCheck::showUpdateHint) { + CUpdateCheck::showUpdateHint = false; CString msg; msg.Format("OpenMPT would like to check for updates now, proceed?\n\nNote: In the future, OpenMPT will check for updates every %d days. If you do not want this, you can disable update checks in the setup.", CUpdateCheck::updateCheckPeriod); if(Reporting::Confirm(msg, "OpenMPT Internet Update") == cnfNo) { - CUpdateCheck::showUpdateHint = false; + CUpdateCheck::lastUpdateCheck = now; caller->Terminate(); return 0; } @@ -165,7 +166,7 @@ { if(!caller->isAutoUpdate) { - Reporting::Information("You already have the latest version of OpenMPT.", "OpenMPT Internet Update"); + Reporting::Information("You already have the latest version of OpenMPT installed.", "OpenMPT Internet Update"); } } else { @@ -293,7 +294,7 @@ case 31: radioID = IDC_RADIO4; break; } CheckRadioButton(IDC_RADIO1, IDC_RADIO4, radioID); - CheckDlgButton(IDC_CHECK1, CUpdateCheck::GetSendGUID() ? MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(IDC_CHECK1, CUpdateCheck::GetSendGUID() ? BST_CHECKED : BST_UNCHECKED); SetDlgItemText(IDC_EDIT1, CUpdateCheck::GetUpdateURL()); const time_t t = CUpdateCheck::GetLastUpdateCheck(); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-12-03 15:54:55 UTC (rev 1142) @@ -20,17 +20,7 @@ BEGIN_MESSAGE_MAP(CModTypeDlg, CDialog) //{{AFX_MSG_MAP(CModTypeDlg) - ON_COMMAND(IDC_CHECK1, OnCheck1) - ON_COMMAND(IDC_CHECK2, OnCheck2) - ON_COMMAND(IDC_CHECK3, OnCheck3) - ON_COMMAND(IDC_CHECK4, OnCheck4) - ON_COMMAND(IDC_CHECK5, OnCheck5) -// -> CODE#0023 -// -> DESC="IT project files (.itp)" - ON_COMMAND(IDC_CHECK6, OnCheck6) - ON_COMMAND(IDC_CHECK_PT1X, OnCheckPT1x) ON_CBN_SELCHANGE(IDC_COMBO1,UpdateDialog) -// -! NEW_FEATURE#0023 ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, &CModTypeDlg::OnToolTipNotify) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, &CModTypeDlg::OnToolTipNotify) @@ -49,16 +39,6 @@ DDX_Control(pDX, IDC_COMBO2, m_ChannelsBox); DDX_Control(pDX, IDC_COMBO_TEMPOMODE, m_TempoModeBox); DDX_Control(pDX, IDC_COMBO_MIXLEVELS, m_PlugMixBox); - DDX_Control(pDX, IDC_CHECK1, m_CheckBox1); - DDX_Control(pDX, IDC_CHECK2, m_CheckBox2); - DDX_Control(pDX, IDC_CHECK3, m_CheckBox3); - DDX_Control(pDX, IDC_CHECK4, m_CheckBox4); - DDX_Control(pDX, IDC_CHECK5, m_CheckBox5); -// -> CODE#0023 -// -> DESC="IT project files (.itp)" - DDX_Control(pDX, IDC_CHECK6, m_CheckBox6); -// -! NEW_FEATURE#0023 - DDX_Control(pDX, IDC_CHECK_PT1X, m_CheckBoxPT1x); //}}AFX_DATA_MAP } @@ -69,7 +49,6 @@ CDialog::OnInitDialog(); m_nType = m_pSndFile->GetType(); m_nChannels = m_pSndFile->GetNumChannels(); - m_dwSongFlags = m_pSndFile->m_dwSongFlags; // Mod types @@ -80,8 +59,8 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" m_TypeBox.SetItemData(m_TypeBox.AddString("Impulse Tracker Project ITP"), MOD_TYPE_IT); + // -! NEW_FEATURE#0023 m_TypeBox.SetItemData(m_TypeBox.AddString("OpenMPT MPTM"), MOD_TYPE_MPT); -// -! NEW_FEATURE#0023 switch(m_nType) { case MOD_TYPE_S3M: m_TypeBox.SetCurSel(1); break; @@ -216,12 +195,13 @@ m_CheckBox6.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITPEMBEDIH) ? MF_CHECKED : 0); // -! NEW_FEATURE#0023 - m_CheckBox1.EnableWindow((type & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); - m_CheckBox2.EnableWindow((type == MOD_TYPE_S3M) ? TRUE : FALSE); - m_CheckBox3.EnableWindow((type & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); - m_CheckBox4.EnableWindow((type & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); - m_CheckBox5.EnableWindow((type & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); - m_CheckBoxPT1x.EnableWindow((type & (MOD_TYPE_MOD)) ? TRUE : FALSE); + const DWORD allowedFlags = m_pSndFile->GetModSpecifications(type).songFlags; + m_CheckBox1.EnableWindow((allowedFlags & SONG_LINEARSLIDES) != 0); + m_CheckBox2.EnableWindow((allowedFlags & SONG_FASTVOLSLIDES) != 0); + m_CheckBox3.EnableWindow((allowedFlags & SONG_ITOLDEFFECTS) != 0); + m_CheckBox4.EnableWindow((allowedFlags & SONG_ITCOMPATGXX) != 0); + m_CheckBox5.EnableWindow((allowedFlags & SONG_EXFILTERRANGE) != 0); + m_CheckBoxPT1x.EnableWindow((allowedFlags & SONG_PT1XMODE) != 0); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -282,76 +262,7 @@ } -void CModTypeDlg::OnCheck1() -//-------------------------- -{ - if (m_CheckBox1.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_LINEARSLIDES; - else - m_pSndFile->m_dwSongFlags &= ~SONG_LINEARSLIDES; -} - - -void CModTypeDlg::OnCheck2() -//-------------------------- -{ - if (m_CheckBox2.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_FASTVOLSLIDES; - else - m_pSndFile->m_dwSongFlags &= ~SONG_FASTVOLSLIDES; -} - - -void CModTypeDlg::OnCheck3() -//-------------------------- -{ - if (m_CheckBox3.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_ITOLDEFFECTS; - else - m_pSndFile->m_dwSongFlags &= ~SONG_ITOLDEFFECTS; -} - - -void CModTypeDlg::OnCheck4() -//-------------------------- -{ - if (m_CheckBox4.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_ITCOMPATGXX; - else - m_pSndFile->m_dwSongFlags &= ~SONG_ITCOMPATGXX; -} - - -void CModTypeDlg::OnCheck5() -//-------------------------- -{ - if (m_CheckBox5.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_EXFILTERRANGE; - else - m_pSndFile->m_dwSongFlags &= ~SONG_EXFILTERRANGE; -} - - -void CModTypeDlg::OnCheck6() -//-------------------------- -{ - if (m_CheckBox6.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_ITPEMBEDIH; - else - m_pSndFile->m_dwSongFlags &= ~SONG_ITPEMBEDIH; -} - -void CModTypeDlg::OnCheckPT1x() -//----------------------------- -{ - if (m_CheckBoxPT1x.GetCheck()) - m_pSndFile->m_dwSongFlags |= SONG_PT1XMODE; - else - m_pSndFile->m_dwSongFlags &= ~SONG_PT1XMODE; -} - - -bool CModTypeDlg::VerifyData() +bool CModTypeDlg::VerifyData() //---------------------------- { @@ -406,6 +317,37 @@ if(sel == 4) m_pSndFile->m_dwSongFlags |= SONG_ITPROJECT; // -! NEW_FEATURE#0023 } + + if (m_CheckBox1.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_LINEARSLIDES; + else + m_pSndFile->m_dwSongFlags &= ~SONG_LINEARSLIDES; + if (m_CheckBox2.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_FASTVOLSLIDES; + else + m_pSndFile->m_dwSongFlags &= ~SONG_FASTVOLSLIDES; + if (m_CheckBox3.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_ITOLDEFFECTS; + else + m_pSndFile->m_dwSongFlags &= ~SONG_ITOLDEFFECTS; + if (m_CheckBox4.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_ITCOMPATGXX; + else + m_pSndFile->m_dwSongFlags &= ~SONG_ITCOMPATGXX; + if (m_CheckBox5.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_EXFILTERRANGE; + else + m_pSndFile->m_dwSongFlags &= ~SONG_EXFILTERRANGE; + if (m_CheckBox6.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_ITPEMBEDIH; + else + m_pSndFile->m_dwSongFlags &= ~SONG_ITPEMBEDIH; + if (m_CheckBoxPT1x.GetCheck()) + m_pSndFile->m_dwSongFlags |= SONG_PT1XMODE; + else + m_pSndFile->m_dwSongFlags &= ~SONG_PT1XMODE; + + sel = m_ChannelsBox.GetCurSel(); if (sel >= 0) { @@ -445,15 +387,7 @@ CDialog::OnOK(); } -void CModTypeDlg::OnCancel() -//-------------------------- -{ - // Reset mod flags - m_pSndFile->m_dwSongFlags = m_dwSongFlags; - CDialog::OnCancel(); -} - BOOL CModTypeDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) //------------------------------------------------------------------------- { @@ -487,7 +421,7 @@ strTipText = "Gxx and Exx/Fxx won't share effect memory. Gxx resets instrument envelopes."; break; case IDC_CHECK5: - strTipText = "The resonant filter's frequency range is increased from about 4KHz to 10KHz."; + strTipText = "The resonant filter's frequency range is increased from about 5KHz to 10KHz."; break; case IDC_CHECK6: strTipText = "The instrument settings of the external ITI files will be ignored."; @@ -607,9 +541,11 @@ if (!m_bKeepMask[n]) m_RemChansList.SetSel(n); } - if (m_nRemove > 0) { + if (m_nRemove > 0) + { wsprintf(label, "Select %d channel%s to remove:", m_nRemove, (m_nRemove != 1) ? "s" : ""); - } else { + } else + { wsprintf(label, "Select channels to remove (the minimum number of remaining channels is %d)", m_pSndFile->GetModSpecifications().channelsMin); } @@ -968,13 +904,13 @@ nInsertPos = m_CbnSample.AddString("0: No sample"); m_CbnSample.SetItemData(nInsertPos, 0); - for (UINT i=1; i<=m_pSndFile->m_nSamples; i++) + for (SAMPLEINDEX i = 1; i <= m_pSndFile->GetNumSamples(); i++) { bool isUsed = showAll; if (!isUsed) { - for (UINT j=0; j<NOTE_MAX; j++) + for (size_t j = 0; j < CountOf(KeyboardMap); j++) { if (KeyboardMap[j] == i) { @@ -1057,7 +993,7 @@ KeyboardMap[iNote] = pIns->Keyboard[iNote]; } else { - KeyboardMap[iNote] = (WORD)nSample; + KeyboardMap[iNote] = (SAMPLEINDEX)nSample; } /* rewbs.note: I don't think we need this with cust keys. // -> CODE#0009 Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2011-12-03 15:54:55 UTC (rev 1142) @@ -15,7 +15,6 @@ CSoundFile *m_pSndFile; CHANNELINDEX m_nChannels; MODTYPE m_nType; - DWORD m_dwSongFlags; // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -36,24 +35,11 @@ virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); virtual void OnOK(); - virtual void OnCancel(); //}}AFX_VIRTUAL BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); - //{{AFX_MSG(CModTypeDlg) - afx_msg void OnCheck1(); - afx_msg void OnCheck2(); - afx_msg void OnCheck3(); - afx_msg void OnCheck4(); - afx_msg void OnCheck5(); -// -> CODE#0023 -// -> DESC="IT project files (.itp)" - afx_msg void OnCheck6(); -// -! NEW_FEATURE#0023 - afx_msg void OnCheckPT1x(); - //}}AFX_MSG DECLARE_MESSAGE_MAP() }; @@ -184,7 +170,7 @@ CSliderCtrl m_SbOctave; CSoundFile *m_pSndFile; UINT m_nInstrument; - WORD KeyboardMap[NOTE_MAX]; + SAMPLEINDEX KeyboardMap[NOTE_MAX]; public: CSampleMapDlg(CSoundFile *pSndFile, UINT nInstr, CWnd *parent=NULL):CDialog(IDD_EDITSAMPLEMAP, parent) Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/version.h 2011-12-03 15:54:55 UTC (rev 1142) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 55 +#define VER_MINORMINOR 56 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/mptrack/view_com.cpp 2011-12-03 15:54:55 UTC (rev 1142) @@ -251,10 +251,10 @@ switch(iCol) { case SMPLIST_SAMPLENAME: - lstrcpyn(s, pSndFile->m_szNames[iSmp+1], MAX_SAMPLENAME); + lstrcpyn(s, pSndFile->m_szNames[iSmp + 1], MAX_SAMPLENAME); break; case SMPLIST_SAMPLENO: - wsprintf(s, "%02d", iSmp+1); + wsprintf(s, "%02d", iSmp + 1); break; case SMPLIST_SIZE: if (sample.nLength) @@ -268,16 +268,16 @@ case SMPLIST_TYPE: if (sample.nLength) { - wsprintf(s, "%d Bit", sample.GetElementarySampleSize() << 3); + wsprintf(s, "%d Bit", sample.GetElementarySampleSize() * 8); } break; case SMPLIST_INSTR: if (pSndFile->GetNumInstruments()) { bool first = true; - for (INSTRUMENTINDEX i = 0; i < pSndFile->GetNumInstruments(); i++) if (pSndFile->Instruments[i + 1]) + for (INSTRUMENTINDEX i = 1; i <= pSndFile->GetNumInstruments(); i++) if (pSndFile->Instruments[i]) { - MODINSTRUMENT *pIns = pSndFile->Instruments[i + 1]; + const MODINSTRUMENT *pIns = pSndFile->Instruments[i]; for (size_t j = 0; j < CountOf(pIns->Keyboard); j++) { if (pIns->Keyboard[j] == (iSmp + 1)) @@ -285,7 +285,7 @@ if (!first) strcat(s, ","); first = false; - wsprintf(stmp, "%d", i + 1); + wsprintf(stmp, "%d", i); strcat(s, stmp); break; } Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2011-12-03 15:54:55 UTC (rev 1142) @@ -813,6 +813,12 @@ // PSM16 support starts here. // +// 32-Bit chunk identifiers +#define PSM16_PORD 0x44524f50 +#define PSM16_PPAN 0x4E415050 +#define PSM16_PSAH 0x48415350 +#define PSM16_PPAT 0x54415050 + #pragma pack(1) struct PSM16HEADER @@ -823,7 +829,7 @@ uint8 songType; // Song Type bitfield uint8 formatVersion; // $10 uint8 patternVersion; // 0 or 1 - uint8 songSpeed; // + uint8 songSpeed; // 1 ... 255 uint8 songTempo; // 32 ... 255 uint8 masterVolume; // 0 ... 255 uint16 songLength; // 0 ... 255 (number of patterns to play in the song) @@ -832,11 +838,11 @@ uint16 numSamples; // 1 ... 255 uint16 numChannelsPlay; // 0 ... 32 (max. number of channels to play) uint16 numChannelsReal; // 0 ... 32 (max. number of channels to process) - uint32 orderOffset; - uint32 panOffset; - uint32 patOffset; - uint32 smpOffset; - uint32 commentsOffset; + uint32 orderOffset; // Pointer to order list + uint32 panOffset; // Pointer to pan table + uint32 patOffset; // Pointer to pattern data + uint32 smpOffset; // Pointer to sample headers + uint32 commentsOffset; // Pointer to song comment uint32 patSize; // Size of all patterns uint8 filler[40]; }; @@ -852,31 +858,31 @@ uint32 length; // in bytes uint32 loopStart; // in samples? uint32 loopEnd; // in samples? - int8 finetune; // 0 ... 15 (high nibble is 7 in most cases, but why? is it maybe some transpose value?) + int8 finetune; // Low nibble = MOD finetune, high nibble = transpose (7 = center) uint8 volume; // default volume - uint16 c2freq; + uint16 c2freq; // Middle-C frequency, which has to be combined with the finetune and transpose. }; struct PSM16PATHEADER { uint16 size; // includes header bytes uint8 numRows; // 1 ... 64 - uint8 numChans; // 1 ... 31 + uint8 numChans; // 1 ... 32 }; #pragma pack() bool CSoundFile::ReadPSM16(const LPCBYTE lpStream, const DWORD dwMemLength) -//----------------------------------------------------------------------- +//------------------------------------------------------------------------- { DWORD dwMemPos = 0; ASSERT_CAN_READ(sizeof(PSM16HEADER)); - PSM16HEADER *shdr = (PSM16HEADER *)lpStream; + const PSM16HEADER *shdr = (PSM16HEADER *)lpStream; // Check header - if((LittleEndian(shdr->formatID) != PSM16HEAD_PSM_) // "PSM\xFE" + if((shdr->formatID != LittleEndian(PSM16HEAD_PSM_)) // "PSM\xFE" || (shdr->lineEnd != 0x1A) || (shdr->formatVersion != 0x10 && shdr->formatVersion != 0x01) // why is this sometimes 0x01? || (shdr->patternVersion != 0) // 255ch pattern version not supported (did anyone use this?) @@ -893,14 +899,14 @@ m_nDefaultSpeed = shdr->songSpeed; m_nDefaultTempo = shdr->songTempo; - memset(m_szNames, 0, sizeof(m_szNames)); + MemsetZero(m_szNames); memcpy(m_szNames[0], shdr->songName, 31); StringFixer::SpaceToNullStringFixed<31>(m_szNames[0]); // Read orders dwMemPos = LittleEndian(shdr->orderOffset); ASSERT_CAN_READ((DWORD)LittleEndianW(shdr->songOrders) + 2); - if(LittleEndian(shdr->orderOffset) > 4 && LittleEndian(*(uint32 *)(lpStream + dwMemPos - 4)) == 0x44524f50) // PORD + if(LittleEndian(shdr->orderOffset) > 4 && *(uint32 *)(lpStream + dwMemPos - 4) == LittleEndian(PSM16_PORD)) // PORD { Order.ReadAsByte(lpStream + dwMemPos, LittleEndianW(shdr->songOrders), dwMemLength - dwMemPos); } @@ -908,11 +914,11 @@ // Read pan positions dwMemPos = LittleEndian(shdr->panOffset); ASSERT_CAN_READ(32); - if(LittleEndian(shdr->panOffset) > 4 && LittleEndian(*(uint32 *)(lpStream + dwMemPos - 4)) == 0x4E415050) // PPAN + if(LittleEndian(shdr->panOffset) > 4 && LittleEndian(*(uint32 *)(lpStream + dwMemPos - 4)) == PSM16_PPAN) // PPAN { for(CHANNELINDEX i = 0; i < 32; i++) { - ChnSettings[i].nPan = lpStream[dwMemPos + i] << 4; + ChnSettings[i].nPan = ((15 - (lpStream[dwMemPos + i] & 0x0F)) * 256 + 8) / 15; // 15 seems to be left and 0 seems to be right... ChnSettings[i].nVolume = 64; ChnSettings[i].dwFlags = 0; // (i >= shdr->numChannelsPlay) ? CHN_MUTE : 0; // don't mute channels, as muted channels are completely ignored in S3M } @@ -921,14 +927,14 @@ // Read samples dwMemPos = LittleEndian(shdr->smpOffset); ASSERT_CAN_READ(0); - if(LittleEndian(shdr->smpOffset) > 4 && LittleEndian(*(uint32 *)(lpStream + dwMemPos - 4)) == 0x48415350) // PSAH + if(LittleEndian(shdr->smpOffset) > 4 && *(uint32 *)(lpStream + dwMemPos - 4) == LittleEndian(PSM16_PSAH)) // PSAH { SAMPLEINDEX iSmpCount = 0; m_nSamples = LittleEndianW(shdr->numSamples); while(iSmpCount < LittleEndianW(shdr->numSamples)) { ASSERT_CAN_READ(sizeof(PSM16SMPHEADER)); - PSM16SMPHEADER *smphdr = (PSM16SMPHEADER *)(lpStream + dwMemPos); + const PSM16SMPHEADER *smphdr = (PSM16SMPHEADER *)(lpStream + dwMemPos); dwMemPos += sizeof(PSM16SMPHEADER); SAMPLEINDEX iSmp = LittleEndianW(smphdr->sampleNumber); @@ -943,39 +949,34 @@ Samples[iSmp].nLoopStart = LittleEndian(smphdr->loopStart); Samples[iSmp].nLoopEnd = LittleEndian(smphdr->loopEnd); Samples[iSmp].nC5Speed = LittleEndianW(smphdr->c2freq); - if(smphdr->finetune & 0x0F) - { - int finetune = smphdr->finetune & 0x0F; - if(finetune >= 8) - { - finetune -= 16; - } - // Copied over from DUMB - Samples[iSmp].nC5Speed = double(Samples[iSmp].nC5Speed) * pow(1.000225659305069791926712241547647863626, finetune * 32); - } + + // It seems like that finetune and transpose are added to the already given c2freq... That's a double WTF! Why on earth would you want to use both systems at the same time? + FrequencyToTranspose(&Samples[iSmp]); + Samples[iSmp].nC5Speed = TransposeToFrequency(Samples[iSmp].RelativeTone + (smphdr->finetune >> 4) - 7, MOD2XMFineTune(smphdr->finetune & 0x0F)); + Samples[iSmp].nVolume = smphdr->volume << 2; Samples[iSmp].nGlobalVol = 256; - UINT iSampleFormat = RS_PCM8S; + UINT sampleFormat = RS_PCM8S; if(smphdr->flags & 0x04) // 16-Bit { Samples[iSmp].uFlags |= CHN_16BIT; Samples[iSmp].nLength >>= 1; - iSampleFormat = RS_PCM16S; + sampleFormat = RS_PCM16S; } if(smphdr->flags & 0x08) // Signed/Unsigned { if(Samples[iSmp].uFlags & CHN_16BIT) - iSampleFormat = RS_PCM16U; + sampleFormat = RS_PCM16U; else - iSampleFormat = RS_PCM8U; + sampleFormat = RS_PCM8U; } if(smphdr->flags & 0x10) // Delta/Raw { if(Samples[iSmp].uFlags & CHN_16BIT) - iSampleFormat = RS_PCM16D; + sampleFormat = RS_PCM16D; else - iSampleFormat = RS_PCM8D; + sampleFormat = RS_PCM8D; } if(smphdr->flags & 0x20) // Bidi Loop { @@ -986,9 +987,9 @@ Samples[iSmp].uFlags |= CHN_LOOP; } if((smphdr->flags & 0x7F) == 0) - iSampleFormat = RS_PCM8D; + sampleFormat = RS_PCM8D; - ReadSample(&Samples[iSmp], iSampleFormat, reinterpret_cast<LPCSTR>(lpStream + LittleEndianW(smphdr->offset)), dwMemLength - LittleEndianW(smphdr->offset)); + ReadSample(&Samples[iSmp], sampleFormat, reinterpret_cast<LPCSTR>(lpStream + LittleEndianW(smphdr->offset)), dwMemLength - LittleEndianW(smphdr->offset)); iSmpCount++; } @@ -997,7 +998,7 @@ // Read patterns dwMemPos = LittleEndian(shdr->patOffset); ASSERT_CAN_READ(LittleEndian(shdr->patSize)); - if(LittleEndian(shdr->patOffset) > 4 && LittleEndian(*(DWORD *)(lpStream + dwMemPos - 4)) == 0x54415050) // PPAT + if(LittleEndian(shdr->patOffset) > 4 && *(uint32 *)(lpStream + dwMemPos - 4) == LittleEndian(PSM16_PPAT)) // PPAT { DWORD dwPatEndPos = LittleEndian(shdr->patOffset) + LittleEndian(shdr->patSize); @@ -1013,34 +1014,33 @@ if(Patterns.Insert(nPat, phdr->numRows)) break; - MODCOMMAND *row_data; - ROWINDEX iRow = 0; + ROWINDEX curRow = 0; - while(dwMemPos < dwNextPattern && iRow < phdr->numRows) + while(dwMemPos < dwNextPattern && curRow < phdr->numRows) { ASSERT_CAN_READ(1); - BYTE bChnFlag = lpStream[dwMemPos++]; + uint8 bChnFlag = lpStream[dwMemPos++]; if(bChnFlag == 0) { - iRow++; + curRow++; continue; } - row_data = Patterns[nPat].GetpModCommand(iRow, min(bChnFlag & 0x1F, m_nChannels - 1)); + MODCOMMAND *rowData = Patterns[nPat].GetpModCommand(curRow, min(bChnFlag & 0x1F, m_nChannels - 1)); if(bChnFlag & 0x80) { // note + instr present ASSERT_CAN_READ(2); - row_data->note = lpStream[dwMemPos++] + 36; - row_data->instr = lpStream[dwMemPos++]; + rowData->note = lpStream[dwMemPos++] + 36; + rowData->instr = lpStream[dwMemPos++]; } if(bChnFlag & 0x40) { // volume present ASSERT_CAN_READ(1); - row_data->volcmd = VOLCMD_VOLUME; - row_data->vol = lpStream[dwMemPos++]; + rowData->volcmd = VOLCMD_VOLUME; + rowData->vol = lpStream[dwMemPos++]; } if(bChnFlag & 0x20) { @@ -1140,9 +1140,9 @@ command = CMD_S3MCMDEX; if(param == 0) // in S3M mode, SC0 is ignored, so we convert it to a note cut. { - if(row_data->note == NOTE_NONE) + if(rowData->note == NOTE_NONE) { - row_data->note = NOTE_NOTECUT; + rowData->note = NOTE_NOTECUT; command = CMD_NONE; } else { @@ -1198,8 +1198,8 @@ break; } - row_data->command = command; - row_data->param = param; + rowData->command = command; + rowData->param = param; } } // Pattern break for short patterns (so saving the modules as S3M won't break it) Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2011-11-22 19:46:44 UTC (rev 1141) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2011-12-03 15:54:55 UTC (rev 1142) @@ -43,8 +43,8 @@ uint16 sampleFilenameLengthMax; // Dito uint16 instrNameLengthMax; // Dito uint16 instrFilenameLengthMax; // Dito - SAMPLEINDEX samplesMax; - INSTRUMENTINDEX instrumentsMax; + SAMPLEINDEX samplesMax; // Max number of samples == Highest possible sample index + INSTRUMENTINDEX instrumentsMax; // Max number of instruments == Highest possible instrument index BYTE defaultMixLevels; BYTE MIDIMappingDirectivesMax; UINT speedMin; // Minimum ticks per frame @@ -58,6 +58,7 @@ bool hasRestartPos; bool supportsPlugins; bool hasPatternSignatures; // Can patterns have a custom time signature? + DWORD songFlags; // Supported song flags }; @@ -91,8 +92,8 @@ 12, // Max sample filename length 26, // Max instrument name length 12, // Max instrument filename length - 4000, // SamplesMax - 256, // instrumentMax + 3999, // SamplesMax + 255, // instrumentMax mixLevels_117RC3, // defaultMixLevels 200, // Max MIDI mapping directives 1, // Min Speed @@ -106,6 +107,7 @@ true, // Has restart position (order) true, // Supports plugins true, // Custom pattern time signatures + SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX | SONG_EMBEDMIDICFG, // Supported song flags }; @@ -149,6 +151,7 @@ true, // Has restart position (order) false, // Doesn't support plugins false, // No custom pattern time signatures + SONG_PT1XMODE, // Supported song flags }; @@ -190,6 +193,7 @@ true, // Has restart position (order) false, // Doesn't support plugins false, // No custom pattern time signatures + SONG_LINEARSLIDES, // Supported song flags }; // XM with MPT extensions @@ -216,8 +220,8 @@ 0, // Max sample filename length 22, // Max instrument name length 0, // Max instrument filename length - MAX_SAMPLES, // SamplesMax (actually 32 per instrument(256 * 32 = 8192), but limited to MAX_SAMPLES = 4000) - 256, // instrumentMax + MAX_SAMPLES - 1, // SamplesMax (actually 32 per instrument(256 * 32 = 8192), but limited to MAX_SAMPLES = 4000) + 255, // instrumentMax mixLevels_compatible, // defaultMixLevels 200, // Max MIDI mapping directives 1, // Min Speed @@ -231,6 +235,7 @@ true, // Has restart position (order) true, // Supports plugins false, // No custom pattern time signatures + SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_EMBEDMIDICFG, // Supported song flags }; const CModSpecifications s3m = @@ -271,6 +276,7 @@ false, // Doesn't have restart position (order) false, // Doesn't support plugins false, // No custom pattern time signatures + SONG_FASTVOLSLIDES | SONG_AMIGALIMITS, // Supported song flags }; // S3M with MPT extensions @@ -312,6 +318,7 @@ false, // Doesn't have restart position (order) false, // Doesn't support plugins false, // No custom pattern time signatures + SONG_FASTVOLSLIDES | SONG_AMIGALIMITS, // Supported song flags }; const CModSpecifications it = @@ -352,6 +359,7 @@ false, // Doesn't have restart position (order) false, // Doesn't support plugins false, // No custom pattern time signatures + SONG_LINEARSLIDES | SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX | SONG_EMBEDMIDICFG, // Supported song flags }; const CModSpecifications itEx = @@ -377,8 +385,8 @@ 12, // Max sample filename length 25, // Max instrument name length 12, // Max instrument filename length - 4000, // SamplesMax - 256, // instrumentMax + 3999, // SamplesMax + 255, // instrumentMax mixLevels_compatible, // defaultMixLevels 200, // Max MIDI mapping directives 1, // Min Speed @@ -392,6 +400,7 @@ false, // Doesn't have restart position (order) true, // Supports plugins false, // No custom pattern time signatures + SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX | SONG_EMBEDMIDICFG | SONG_ITPROJECT | SONG_ITPEMBEDIH, // Supported song flags }; static const CModSpecifications *Collection[] = { &mptm, &mod, &s3m, &s3mEx, &xm, &xmEx, &it, &itEx }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |