From: <sag...@us...> - 2009-07-08 09:13:00
|
Revision: 285 http://modplug.svn.sourceforge.net/modplug/?rev=285&view=rev Author: saga-games Date: 2009-07-08 08:55:44 +0000 (Wed, 08 Jul 2009) Log Message: ----------- [Mod] Compo cleanup: Resets a few more variables to default values [Fix] Mod conversion: Proper conversion between IT 8-Bit panning effect and S3M 7-Bit panning effect with surround Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Modedit.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-06 22:12:39 UTC (rev 284) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-08 08:55:44 UTC (rev 285) @@ -970,44 +970,101 @@ void CCtrlSamples::OnSampleSave() //------------------------------- { - CHAR szFileName[_MAX_PATH] = "", ext[_MAX_EXT]; + if(!m_pSndFile) return; - if ((!m_pSndFile) || (!m_nSample) || (!m_pSndFile->Ins[m_nSample].pSample)) + CHAR szFileName[_MAX_PATH] = ""; + BOOL bBatchSave = CMainFrame::GetInputHandler()->ShiftPressed(); + + if(!bBatchSave) { - SwitchToView(); - return; + // save this sample + if ((!m_nSample) || (!m_pSndFile->Ins[m_nSample].pSample)) + { + SwitchToView(); + return; + } + 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; + } else + { + memcpy(szFileName, m_pSndFile->m_szNames[m_nSample], 32); + szFileName[32] = 0; + } + if (!szFileName[0]) strcpy(szFileName, "untitled"); } - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) + else { - memcpy(szFileName, m_pSndFile->Ins[m_nSample].name, 22); - szFileName[22] = 0; - } else - { - memcpy(szFileName, m_pSndFile->m_szNames[m_nSample], 32); - szFileName[32] = 0; + // save all samples + CString sPath = m_pSndFile->m_pModDoc->GetPathName(); + if(sPath.IsEmpty()) sPath = "untitled"; + + sPath += " - %sample_number% - "; + if(m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_MOD)) + sPath += "%sample_name%.wav"; + else + sPath += "%sample_filename%.wav"; + sPath += ".wav"; + _splitpath(sPath, NULL, NULL, szFileName, NULL); } - if (!szFileName[0]) strcpy(szFileName, "untitled"); + CFileDialog dlg(FALSE, "wav", szFileName, OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, "Wave File (*.wav)|*.wav|" "RAW Audio (*.raw)|*.raw||", this); - - const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_SAMPLES); - if(pszWdir[0]) - dlg.m_ofn.lpstrInitialDir = pszWdir; - + dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_SAMPLES); if (dlg.DoModal() != IDOK) return; BeginWaitCursor(); + TCHAR ext[_MAX_EXT]; _splitpath(dlg.GetPathName(), NULL, NULL, NULL, ext); + BOOL bOk = FALSE; - if (!lstrcmpi(ext, ".raw")) - bOk = m_pSndFile->SaveRAWSample(m_nSample, dlg.GetPathName()); - else - bOk = m_pSndFile->SaveWAVSample(m_nSample, dlg.GetPathName()); + UINT iMinSmp = m_nSample, iMaxSmp = m_nSample; + CString sFilename = dlg.GetPathName(), sNumberFormat; + if(bBatchSave) + { + iMinSmp = 1; + iMaxSmp = m_pSndFile->m_nSamples; + sNumberFormat.Format("%s%d%s", "%.", ((int)log10((float)iMaxSmp)) + 1, "d"); + } + + const CString sForbiddenChars = "\\/:\"?<>*"; + + for(UINT iSmp = iMinSmp; iSmp <= iMaxSmp; iSmp++) + { + if (m_pSndFile->Ins[iSmp].pSample) + { + if(bBatchSave) + { + CString sSampleNumber, sSampleName, sSampleFilename; + sSampleNumber.Format(sNumberFormat, iSmp); + + sSampleName = (m_pSndFile->m_szNames[iSmp]) ? m_pSndFile->m_szNames[iSmp] : "untitled"; + sSampleFilename = (m_pSndFile->Ins[iSmp].name[0]) ? m_pSndFile->Ins[iSmp].name : m_pSndFile->m_szNames[iSmp]; + for(UINT i = 0; i < sForbiddenChars.GetLength(); i++) + { + sSampleName.Remove(sForbiddenChars.GetAt(i)); + sSampleFilename.Remove(sForbiddenChars.GetAt(i)); + } + + //sFilename.Format("%s%s%s%s", drive, path, filename, ext); + sFilename = dlg.GetPathName(); + sFilename.Replace("%sample_number%", sSampleNumber); + sFilename.Replace("%sample_filename%", sSampleFilename); + sFilename.Replace("%sample_name%", sSampleName); + } + if (!lstrcmpi(ext, ".raw")) + bOk = m_pSndFile->SaveRAWSample(iSmp, sFilename); + else + bOk = m_pSndFile->SaveWAVSample(iSmp, sFilename); + } + } EndWaitCursor(); + if (!bOk) { ErrorBox(IDS_ERR_SAVESMP, this); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-06 22:12:39 UTC (rev 284) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-08 08:55:44 UTC (rev 285) @@ -57,7 +57,8 @@ const bool oldTypeIsMOD = (oldtype == MOD_TYPE_MOD), oldTypeIsXM = (oldtype == MOD_TYPE_XM), oldTypeIsS3M = (oldtype == MOD_TYPE_S3M), oldTypeIsIT = (oldtype == MOD_TYPE_IT), oldTypeIsMPT = (oldtype == MOD_TYPE_MPT), oldTypeIsMOD_XM = (oldTypeIsMOD || oldTypeIsXM), - oldTypeIsS3M_IT_MPT = (oldTypeIsS3M || oldTypeIsIT || oldTypeIsMPT); + oldTypeIsS3M_IT_MPT = (oldTypeIsS3M || oldTypeIsIT || oldTypeIsMPT), + oldTypeIsIT_MPT = (oldTypeIsIT || oldTypeIsMPT); const bool newTypeIsMOD = (nNewType == MOD_TYPE_MOD), newTypeIsXM = (nNewType == MOD_TYPE_XM), newTypeIsS3M = (nNewType == MOD_TYPE_S3M), newTypeIsIT = (nNewType == MOD_TYPE_IT), @@ -327,8 +328,62 @@ } } if (bBrokenNoteMap) AddToLog("WARNING: Note Mapping will be lost when saving as XM\n"); + } else + // Convert S3M to IT + if (oldTypeIsS3M && newTypeIsIT_MPT) + { + for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + { + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len--; m++) + { + switch(m->command) + { + case CMD_PANNING8: + if(m->param == 0xA4) + { + // surround remap + m->command = CMD_S3MCMDEX; + m->param = 0x91; + } + else + { + m->param = min(m->param << 1, 0xFF); + } + break; + default: + break; + } + } + } + } else + // Convert IT to S3M + if (oldTypeIsIT_MPT && newTypeIsS3M) + { + for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + { + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len--; m++) + { + switch(m->command) + { + case CMD_PANNING8: + m->param = (m->param + 1) >> 1; + case CMD_S3MCMDEX: + if(m->param == 0x91) + { + // surround remap (this is the "official" command) + m->command = CMD_PANNING8; + m->param = 0xA4; + } + default: + break; + } + } + } } - // Too many samples ? + + // Too many samples? if (newTypeIsMOD && (m_SndFile.m_nSamples > 31)) { AddToLog("WARNING: Samples above 31 will be lost when saving this file as MOD!\n"); @@ -1067,6 +1122,9 @@ // convert to IT... ChangeModType(MOD_TYPE_IT); + m_SndFile.m_nMixLevels = mixLevels_original; + m_SndFile.m_nTempoMode = tempo_mode_classic; + m_SndFile.m_dwSongFlags = SONG_LINEARSLIDES | SONG_EXFILTERRANGE; // clear order list m_SndFile.Order.Init(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |