From: <rel...@us...> - 2009-06-15 20:34:09
|
Revision: 270 http://modplug.svn.sourceforge.net/modplug/?rev=270&view=rev Author: relabsoluness Date: 2009-06-15 20:04:15 +0000 (Mon, 15 Jun 2009) Log Message: ----------- (Patch from Jojo, merged slightly modified) + XM: Compatibility play-mode with a couple of related fixes. + XM: Detects compatibility mode automatically when loading XM-file. Modified Paths: -------------- trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -280,7 +280,9 @@ p->SetWindowText("1. Enable more IT compatible playback.\n" "2. Use old random variation behavior for instruments.\n" "3. Enable plugin volume command bug emulation."); - else if(XM) p->SetWindowText("1. Unused\n2. Unused\n3. Plugin volume command bug emulation"); + else if(XM) p->SetWindowText("1. Enable more XM compatible playback.\n" + "2. Unused\n" + "3. Plugin volume command bug"); } p = GetDlgItem(IDC_FLAGEDITTITLE); if(p) p->ShowWindow(XMorITorMPT); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -1490,7 +1490,7 @@ { SetModFlag(MSF_MIDICC_BUGEMULATION, false); SetModFlag(MSF_OLDVOLSWING, false); - SetModFlag(MSF_IT_COMPATIBLE_PLAY, true); + SetModFlag(MSF_COMPATIBLE_PLAY, true); } } return TRUE; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -95,6 +95,8 @@ BYTE samples_used[(MAX_SAMPLES+7)/8]; UINT unused_samples; + bool bMadeWithModPlug = false; + m_nChannels = 0; if ((!lpStream) || (dwMemLength < 0x200)) return FALSE; if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return FALSE; @@ -554,6 +556,7 @@ } dwMemPos += len; } + bMadeWithModPlug = true; } // Read midi config: "MIDI" if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4944494D)) @@ -566,6 +569,7 @@ m_dwSongFlags |= SONG_EMBEDMIDICFG; dwMemPos += len; //rewbs.fix36946 } + bMadeWithModPlug = true; } // Read pattern names: "PNAM" if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4d414e50)) @@ -582,6 +586,7 @@ } dwMemPos += len; } + bMadeWithModPlug = true; } // Read channel names: "CNAM" if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4d414e43)) @@ -598,13 +603,18 @@ } dwMemPos += len; } + bMadeWithModPlug = true; } // Read mix plugins information if (dwMemPos + 8 < dwMemLength) { dwMemPos += LoadMixPlugins(lpStream+dwMemPos, dwMemLength-dwMemPos); + bMadeWithModPlug = true; } + if(bMadeWithModPlug == false) + SetModFlag(MSF_COMPATIBLE_PLAY, true); + // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -417,7 +417,7 @@ MODINSTRUMENT *psmp = &Ins[instr]; UINT note = pChn->nNewNote; - if(note == 0 && TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) return; + if(note == 0 && TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY)) return; if ((penv) && (note) && (note <= 128)) { @@ -498,7 +498,7 @@ if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITCOMPATMODE) || (!pChn->nLength) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) //IT compatibility tentative fix: Reset envelopes when instrument changes. - || (TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY) && bInstrumentChanged)) + || (TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY) && bInstrumentChanged)) { pChn->dwFlags |= CHN_FASTVOLRAMP; if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) @@ -535,7 +535,7 @@ //IT compatibility tentative fix: Don't anymore change bidi loop direction when //no sample nor instrument is changed. - if(TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY) && psmp == pChn->pInstrument && !bInstrumentChanged) + if(TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY) && psmp == pChn->pInstrument && !bInstrumentChanged) pChn->dwFlags = (pChn->dwFlags & (0xFFFFFF00 | CHN_PINGPONGFLAG)) | (psmp->uFlags & 0xFF); else pChn->dwFlags = (pChn->dwFlags & 0xFFFFFF00) | (psmp->uFlags & 0xFF); @@ -622,7 +622,7 @@ } //IT compatibility tentative fix: Clear channel note memory. - if(TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY)) { pChn->nNote = 0; pChn->nNewNote = 0; @@ -1085,7 +1085,7 @@ nStartTick = param & 0x0F; //IT compatibility 08. Handling of out-of-range delay command. - if(nStartTick >= m_nMusicSpeed && GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(nStartTick >= m_nMusicSpeed && GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(instr) { @@ -1137,7 +1137,7 @@ if ((!note) && (instr)) //Case: instrument with no note data. { //IT compatibility: Instrument with no note. - if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(m_nInstruments) { @@ -1316,14 +1316,14 @@ break; case VOLCMD_PORTAUP: - if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) PortamentoUp(pChn, vol << 2, true); else PortamentoUp(pChn, vol << 2, false); break; case VOLCMD_PORTADOWN: - if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) PortamentoDown(pChn, vol << 2, true); else PortamentoDown(pChn, vol << 2, false); @@ -1533,7 +1533,25 @@ // Key Off case CMD_KEYOFF: - if (!m_nTickCount) KeyOff(nChn); + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) + { + // This is how it's supposed to sound... + if (m_nTickCount == param) + { + // XM: Key-Off + Sample == Note Cut + if ((!pChn->pHeader) || (!(pChn->pHeader->dwFlags & ENV_VOLUME))) + { + pChn->dwFlags |= CHN_FASTVOLRAMP; + pChn->nVolume = 0; + } + KeyOff(nChn); + } + } + else + { + // This is how it's NOT supposed to sound... + if (!m_nTickCount) KeyOff(nChn); + } break; // Extra-fine porta up/down @@ -1576,16 +1594,21 @@ if (!m_nTickCount) { pChn->nVolEnvPosition = param; - pChn->nPanEnvPosition = param; - pChn->nPitchEnvPosition = param; - if (pChn->pHeader) + + if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) { - INSTRUMENTHEADER *penv = pChn->pHeader; - if ((pChn->dwFlags & CHN_PANENV) && (penv->nPanEnv) && (param > penv->PanPoints[penv->nPanEnv-1])) + pChn->nPanEnvPosition = param; + pChn->nPitchEnvPosition = param; + if (pChn->pHeader) { - pChn->dwFlags &= ~CHN_PANENV; + INSTRUMENTHEADER *penv = pChn->pHeader; + if ((pChn->dwFlags & CHN_PANENV) && (penv->nPanEnv) && (param > penv->PanPoints[penv->nPanEnv-1])) + { + pChn->dwFlags &= ~CHN_PANENV; + } } } + } break; @@ -1944,7 +1967,7 @@ pChn->dwFlags |= CHN_PORTAMENTO; //IT compatibility 03 - if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(param == 0) param = pChn->nOldPortaUpDown; pChn->nOldPortaUpDown = param; @@ -3061,7 +3084,7 @@ pChn->nPatternLoopCount--; if(!pChn->nPatternLoopCount) { - if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) pChn->nPatternLoop = m_nRow+1; return -1; @@ -3070,7 +3093,7 @@ { MODCHANNEL *p = Chn; - if(!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY))) + if(!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY))) { for (UINT i=0; i<m_nChannels; i++, p++) if (p != pChn) { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -2917,22 +2917,15 @@ uint16 CSoundFile::GetModFlagMask(const MODTYPE oldtype, const MODTYPE newtype) const //----------------------------------------------------------------------------------- { - if(oldtype == MOD_TYPE_IT) - { - if(newtype == MOD_TYPE_MPT) return 65535; - if(newtype == MOD_TYPE_XM) return (1 << MSF_MIDICC_BUGEMULATION); - return 0; - } + const MODTYPE combined = oldtype | newtype; - if(oldtype == MOD_TYPE_MPT) - { - if(newtype == MOD_TYPE_IT) return 65535; - if(newtype == MOD_TYPE_XM) return (1 << MSF_MIDICC_BUGEMULATION); - return 0; - } + // XM <-> IT/MPT conversion. + if(combined == (MOD_TYPE_IT|MOD_TYPE_XM) || combined == (MOD_TYPE_MPT|MOD_TYPE_XM)) + return (1 << MSF_COMPATIBLE_PLAY) + (1 << MSF_MIDICC_BUGEMULATION); - if(oldtype == MOD_TYPE_XM && (newtype == MOD_TYPE_IT || newtype == MOD_TYPE_MPT)) - return (1 << MSF_MIDICC_BUGEMULATION); + // IT <-> MPT conversion. + if(combined == (MOD_TYPE_IT|MOD_TYPE_MPT)) + return uint16_max; return 0; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-06-15 20:04:15 UTC (rev 270) @@ -828,7 +828,7 @@ //Note: These are bit indeces. MSF <-> Mod(Specific)Flag. //If changing these, ChangeModTypeTo() might need modification. -const BYTE MSF_IT_COMPATIBLE_PLAY = 0; //IT/MPT +const BYTE MSF_COMPATIBLE_PLAY = 0; //IT/MPT/XM const BYTE MSF_OLDVOLSWING = 1; //IT/MPT const BYTE MSF_MIDICC_BUGEMULATION = 2; //IT/MPT/XM Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -1164,7 +1164,7 @@ else { //IT playback compatibility 01 & 02 - if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(pChn->nArpeggio >> 4 != 0 || (pChn->nArpeggio & 0x0F) != 0) { @@ -1276,7 +1276,7 @@ switch (pChn->nVibratoType & 0x03) { case 1: - if(GetModFlag(MSF_IT_COMPATIBLE_PLAY) == true) + if(GetModFlag(MSF_COMPATIBLE_PLAY) == true) vdelta = -ModRampDownTable[(vibpos+16) % 64]; else vdelta = ModRampDownTable[vibpos]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-06-17 17:51:19
|
Revision: 271 http://modplug.svn.sourceforge.net/modplug/?rev=271&view=rev Author: relabsoluness Date: 2009-06-17 17:50:41 +0000 (Wed, 17 Jun 2009) Log Message: ----------- (Patches from Jojo, merged somewhat modified with related refactoring) . General tab: Document will now be set modified when moving or inserting plugins. + Pattern tab: Added description to high offset command in note properties dialog. + Pattern tab: Paste will now optionally continue on next pattern (echo paste). + Sample tab: Can now play sample from given position with Ctrl + left mouse button. + Misc: Compo cleanup / Misc: Updated project file. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_seq.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/OrderToPatternTable.cpp trunk/OpenMPT/mptrack/OrderToPatternTable.h trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_smp.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/patternContainer.cpp trunk/OpenMPT/mptrack/patternContainer.h trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -2304,6 +2304,11 @@ commands[kcChannelReset].isDummy = false; commands[kcChannelReset].Message = "Reset channel"; + commands[kcSwitchEchoPaste].UID = 1787; + commands[kcSwitchEchoPaste].Message = "Switch echo paste"; + commands[kcSwitchEchoPaste].isHidden = false; + commands[kcSwitchEchoPaste].isDummy = false; + #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 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/CommandSet.h 2009-06-17 17:50:41 UTC (rev 271) @@ -84,6 +84,7 @@ kcEditPaste, kcEditMixPaste, kcEditMixPasteITStyle, + kcSwitchEchoPaste, kcEditSelectAll, kcEditFind, kcEditFindNext, Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -247,6 +247,7 @@ END_CRITICAL(); } m_pParent->SetCurrentPattern(n); + m_pModDoc->SetElapsedTime(static_cast<ORDERINDEX>(m_nScrollPos), 0); } } UpdateInfoText(); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -166,7 +166,7 @@ int CMainFrame::gnPlugWindowHeight = 332; DWORD CMainFrame::gnPlugWindowLast = 0; -uint32 CMainFrame::gnMsgBoxVisiblityFlags = ~0; +uint32 CMainFrame::gnMsgBoxVisiblityFlags = uint32_max; CRITICAL_SECTION CMainFrame::m_csAudio; HANDLE CMainFrame::m_hPlayThread = NULL; @@ -393,7 +393,7 @@ gnPlugWindowWidth = GetPrivateProfileInt("Display", "PlugSelectWindowWidth", 370, iniFile); gnPlugWindowHeight = GetPrivateProfileInt("Display", "PlugSelectWindowHeight", 332, iniFile); gnPlugWindowLast = GetPrivateProfileDWord("Display", "PlugSelectWindowLast", 0, iniFile); - gnMsgBoxVisiblityFlags = GetPrivateProfileDWord("Display", "MsgBoxVisibilityFlags", ~0, iniFile); + gnMsgBoxVisiblityFlags = GetPrivateProfileDWord("Display", "MsgBoxVisibilityFlags", uint32_max, iniFile); CHAR s[16]; for (int ncol=0; ncol<MAX_MODCOLORS; ncol++) { Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-06-17 17:50:41 UTC (rev 271) @@ -207,6 +207,8 @@ #define PATTERN_SYNCMUTE 0x1000000 #define PATTERN_AUTODELAY 0x2000000 #define PATTERN_NOTEFADE 0x4000000 +#define PATTERN_ECHOPASTE 0x8000000 +#define PATTERN_POSITIONAWARETIMER 0x10000000 // Keyboard Setup @@ -552,6 +554,7 @@ inline BOOL IsRendering() const { return (m_dwStatus & MODSTATUS_RENDERING); } //rewbs.VSTTimeInfo DWORD GetElapsedTime() const { return m_dwElapsedTime; } void ResetElapsedTime() { m_dwElapsedTime = 0; } + void SetElapsedTime(DWORD dwElapsedTime) { m_dwElapsedTime = dwElapsedTime; } inline CModDoc *GetModPlaying() const { return (IsPlaying()||IsRendering()) ? m_pModPlaying : NULL; } inline CSoundFile *GetSoundFilePlaying() const { return (IsPlaying()||IsRendering()) ? m_pSndFile : NULL; } //rewbs.VSTTimeInfo BOOL InitRenderer(CSoundFile*); //rewbs.VSTTimeInfo Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -57,6 +57,7 @@ ON_COMMAND(ID_CLEANUP_PATTERNS, OnCleanupPatterns) ON_COMMAND(ID_CLEANUP_SONG, OnCleanupSong) ON_COMMAND(ID_CLEANUP_REARRANGE, OnRearrangePatterns) + ON_COMMAND(ID_CLEANUP_COMPO, OnCompoCleanup) ON_COMMAND(ID_INSTRUMENTS_REMOVEALL,OnRemoveAllInstruments) // -> CODE#0020 // -> DESC="rearrange sample list" @@ -764,7 +765,7 @@ return IDCANCEL; } -UINT CModDoc::PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol, LONG loopstart, LONG loopend, int nCurrentChn) //rewbs.vstiLive: added current chan param +UINT CModDoc::PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol, LONG loopstart, LONG loopend, int nCurrentChn, const uint32 nStartPos) //rewbs.vstiLive: added current chan param //----------------------------------------------------------------------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); @@ -860,6 +861,16 @@ pChn->dwFlags &= ~CHN_EXTRALOUD; } + // Handle custom start position + if(nStartPos != uint32_max && pChn->pInstrument) + { + pChn->nPos = nStartPos; + // If start position is after loop end, set loop end to sample end so that the sample starts + // playing. + if(pChn->nLoopEnd < nStartPos) + pChn->nLength = pChn->nLoopEnd = pChn->pInstrument->nLength; + } + /* if (bpause) { if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) { @@ -1882,7 +1893,15 @@ ShowLog("Pattern Rearrange", CMainFrame::GetMainFrame()); } +void CModDoc::OnCompoCleanup() +//------------------------------ +{ + CompoCleanup(); + UpdateAllViews(NULL, HINT_MODTYPE); +} + + void CModDoc::OnUpdateInstrumentOnly(CCmdUI *p) //--------------------------------------------- { @@ -1951,25 +1970,7 @@ void CModDoc::OnRemoveAllInstruments() //------------------------------------ { - if (!m_SndFile.m_nInstruments) return; - if (CMainFrame::GetMainFrame()->MessageBox("This will remove all the instruments in the song,\n" - "Do you want to continue?", "Warning", MB_YESNO | MB_ICONQUESTION) != IDYES) return; - if (CMainFrame::GetMainFrame()->MessageBox("Do you want to convert all instruments to samples ?\n", - NULL, MB_YESNO | MB_ICONQUESTION) == IDYES) - { - ConvertInstrumentsToSamples(); - } - char removeSamples = -1; - if (::MessageBox(NULL, "Remove samples associated with an instrument if they are unused?", "Removing instrument", MB_YESNO | MB_ICONQUESTION) == IDYES) { - removeSamples = 1; - } - - for (UINT i=1; i<=m_SndFile.m_nInstruments; i++) { - m_SndFile.DestroyInstrument(i,removeSamples); - } - m_SndFile.m_nInstruments = 0; - SetModified(); - UpdateAllViews(NULL, HINT_MODTYPE); + RemoveAllInstruments(); } @@ -2651,6 +2652,11 @@ } break; case 0x60: if (gFXInfo[ndx].dwEffect == CMD_MODCMDEX) break; + + case 0xA0: + wsprintf(s, "+ %u samples", 0x10000 * (param & 0x0F)); + break; + case 0xB0: if (gFXInfo[ndx].dwEffect == CMD_S3MCMDEX) { @@ -2949,8 +2955,11 @@ //end rewbs.vstCompliance END_CRITICAL(); - pMainFrm->ResetElapsedTime(); - if (pModPlaying != this) { + // set playback timer in the status bar + SetElapsedTime(static_cast<ORDERINDEX>(nOrd), nRow, true); + + if (pModPlaying != this) + { pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 } } @@ -2997,7 +3006,9 @@ //end rewbs.VSTCompliance END_CRITICAL(); - pMainFrm->ResetElapsedTime(); + // set playback timer in the status bar + SetElapsedTime(static_cast<ORDERINDEX>(nOrd), nRow, true); + if (pModPlaying != this) { pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 } @@ -3049,7 +3060,8 @@ //rewbs.VSTCompliance END_CRITICAL(); - pMainFrm->ResetElapsedTime(); + // set playback timer in the status bar + SetElapsedTime(static_cast<ORDERINDEX>(nOrd), nRow, true); if (pModPlaying != this) { pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 @@ -3262,3 +3274,22 @@ } } + +// Sets playback timer to playback time at given position. If 'bReset' is true, +// timer is reset if playback position timer is not enabled. +void CModDoc::SetElapsedTime(ORDERINDEX nOrd, ROWINDEX nRow, bool bReset) +//----------------------------------------------------------------------- +{ + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + if(pMainFrm == NULL) + return; + + if(CMainFrame::m_dwPatternSetup & PATTERN_POSITIONAWARETIMER) + { + double dPatternPlaytime = max(0, m_SndFile.GetPlaybackTimeAt(nOrd, nRow)); + pMainFrm->SetElapsedTime((DWORD) (dPatternPlaytime * 1000)); + } + else if(bReset) + pMainFrm->ResetElapsedTime(); +} + Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-06-17 17:50:41 UTC (rev 271) @@ -186,8 +186,11 @@ BOOL ConvertInstrumentsToSamples();; BOOL RemoveUnusedSamples(); BOOL RemoveUnusedInstruments(); + void RemoveAllInstruments(bool bConfirm = true); BOOL RemoveUnusedPlugs(); + UINT RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]); BOOL RemoveUnusedPatterns(BOOL bRemove=TRUE); + BOOL CompoCleanup(); LONG InsertPattern(LONG nOrd=-1, UINT nRows=64); LONG InsertSample(BOOL bLimit=FALSE); LONG InsertInstrument(LONG lSample=0, LONG lDuplicate=0); @@ -196,7 +199,7 @@ BOOL RemovePattern(UINT n); BOOL RemoveSample(UINT n); BOOL RemoveInstrument(UINT n); - UINT PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol=-1, LONG loopstart=0, LONG loopend=0, int nCurrentChn=-1); //rewbs.vstiLive: added current chan param + UINT PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol=-1, LONG loopstart=0, LONG loopend=0, int nCurrentChn=-1, const uint32 nStartPos = uint32_max); //rewbs.vstiLive: added current chan param BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params // -> CODE#0020 @@ -255,6 +258,7 @@ void TogglePluginEditor(UINT m_nCurrentPlugin); //rewbs.patPlugNames void RecordParamChange(int slot, long param); void LearnMacro(int macro, long param); + void SetElapsedTime(ORDERINDEX nOrd, ROWINDEX nRow, bool bReset = false); BOOL RemoveChannels(BOOL bChnMask[MAX_CHANNELS]); @@ -325,6 +329,7 @@ afx_msg void OnCleanupPatterns(); afx_msg void OnCleanupSong(); afx_msg void OnRearrangePatterns(); + afx_msg void OnCompoCleanup(); afx_msg void OnRemoveAllInstruments(); afx_msg void OnEstimateSongLength(); afx_msg void OnApproximateBPM(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -809,13 +809,54 @@ return FALSE; } + +UINT CModDoc::RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]) +//--------------------------------------------------------------- +{ + //Remove all plugins whose keepMask[plugindex] is false. + UINT nRemoved=0; + for (PLUGINDEX nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) + { + SNDMIXPLUGIN* pPlug = &m_SndFile.m_MixPlugins[nPlug]; + if (keepMask[nPlug] || !pPlug) + { + Log("Keeping mixplug addess (%d): %X\n", nPlug, &(pPlug->pMixPlugin)); + continue; + } + + if (pPlug->pPluginData) + { + delete pPlug->pPluginData; + pPlug->pPluginData = NULL; + } + if (pPlug->pMixPlugin) + { + pPlug->pMixPlugin->Release(); + pPlug->pMixPlugin=NULL; + } + if (pPlug->pMixState) + { + delete pPlug->pMixState; + } + + memset(&(pPlug->Info), 0, sizeof(SNDMIXPLUGININFO)); + Log("Zeroing range (%d) %X - %X\n", nPlug, &(pPlug->Info), &(pPlug->Info)+sizeof(SNDMIXPLUGININFO)); + pPlug->nPluginDataSize=0; + pPlug->fDryRatio=0; + pPlug->defaultProgram=0; + nRemoved++; + } + + return nRemoved; +} + + BOOL CModDoc::RemoveUnusedPlugs() //------------------------------- { - BYTE usedmap[MAX_MIXPLUGINS]; - memset(usedmap, false, MAX_MIXPLUGINS); + bool usedmap[MAX_MIXPLUGINS]; + memset(usedmap, false, sizeof(usedmap)); - for (PLUGINDEX nPlug=0; nPlug < MAX_MIXPLUGINS; nPlug++) { //Is the plugin assigned to a channel? @@ -849,43 +890,49 @@ } - //Remove unused plugins - int nRemoved=0; - for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { - SNDMIXPLUGIN* pPlug = &m_SndFile.m_MixPlugins[nPlug]; - if (usedmap[nPlug] || !pPlug) { - Log("Keeping mixplug addess (%d): %X\n", nPlug, &(pPlug->pMixPlugin)); - continue; - } + UINT nRemoved = RemovePlugs(usedmap); - if (pPlug->pPluginData) { - delete pPlug->pPluginData; - pPlug->pPluginData = NULL; + if (nRemoved) { + SetModified(); + } + + return nRemoved; +} + + +void CModDoc::RemoveAllInstruments(bool bConfirm) +//----------------------------------------------- +{ + if (!m_SndFile.m_nInstruments) + return; + + char removeSamples = -1; + if(bConfirm) + { + if (CMainFrame::GetMainFrame()->MessageBox("This will remove all the instruments in the song,\n" + "Do you want to continue?", "Warning", MB_YESNO | MB_ICONQUESTION) != IDYES) return; + if (CMainFrame::GetMainFrame()->MessageBox("Do you want to convert all instruments to samples ?\n", + NULL, MB_YESNO | MB_ICONQUESTION) == IDYES) + { + ConvertInstrumentsToSamples(); } - if (pPlug->pMixPlugin) { - pPlug->pMixPlugin->Release(); - pPlug->pMixPlugin=NULL; + + if (::MessageBox(NULL, "Remove samples associated with an instrument if they are unused?", "Removing instrument", MB_YESNO | MB_ICONQUESTION) == IDYES) { + removeSamples = 1; } - if (pPlug->pMixState) { - delete pPlug->pMixState; - } - - memset(&(pPlug->Info), 0, sizeof(SNDMIXPLUGININFO)); - Log("Zeroing range (%d) %X - %X\n", nPlug, &(pPlug->Info), &(pPlug->Info)+sizeof(SNDMIXPLUGININFO)); - pPlug->nPluginDataSize=0; - pPlug->fDryRatio=0; - pPlug->defaultProgram=0; - nRemoved++; - } - if (nRemoved) { - SetModified(); + for (UINT i=1; i<=m_SndFile.m_nInstruments; i++) + { + m_SndFile.DestroyInstrument(i,removeSamples); } - return nRemoved; + m_SndFile.m_nInstruments = 0; + SetModified(); + UpdateAllViews(NULL, HINT_MODTYPE); } + BOOL CModDoc::RemoveUnusedInstruments() //------------------------------------- { @@ -931,7 +978,7 @@ } EndWaitCursor(); if ((bReorg) && (m_SndFile.m_nInstruments > 1) - && (::MessageBox(NULL, "Do you want to reorganize the remaining instruments ?", NULL, MB_YESNO | MB_ICONQUESTION) == IDYES)) + && (::MessageBox(NULL, "Do you want to reorganize the remaining instruments?", "Instrument Cleanup", MB_YESNO | MB_ICONQUESTION) == IDYES)) { BeginWaitCursor(); BEGIN_CRITICAL(); @@ -993,6 +1040,96 @@ } +BOOL CModDoc::CompoCleanup() +//-------------------------- +{ + //jojo.compocleanup + if(::MessageBox(NULL, TEXT("WARNING: Compo cleanup will convert module to IT format, remove all patterns and reset song, sample and instrument attributes to default values. Continue?"), TEXT("Compo Cleanup"), MB_YESNO | MB_ICONWARNING) == IDNO) + return FALSE; + + // Stop play. + CMainFrame::GetMainFrame()->StopMod(this); + + BeginWaitCursor(); + BEGIN_CRITICAL(); + + // convert to IT... + ChangeModType(MOD_TYPE_IT); + + // clear order list + m_SndFile.Order.Init(); + m_SndFile.Order[0] = 0; + + // remove all patterns + m_SndFile.Patterns.Init(); + m_SndFile.Patterns.Insert(0, 64); + m_SndFile.SetCurrentOrder(0); + + // Global vars + m_SndFile.m_nDefaultTempo = 125; + m_SndFile.m_nDefaultSpeed = 6; + m_SndFile.m_nDefaultGlobalVolume = 256; + m_SndFile.m_nSamplePreAmp = 48; + m_SndFile.m_nVSTiVolume = 48; + m_SndFile.m_nRestartPos = 0; + + // Set 4 default channels. + m_SndFile.ReArrangeChannels(vector<CHANNELINDEX>(4, MAX_BASECHANNELS)); + + //remove plugs + bool keepMask[MAX_MIXPLUGINS]; memset(keepMask, 0, sizeof(keepMask)); + RemovePlugs(keepMask); + + // instruments + if(m_SndFile.m_nInstruments && ::MessageBox(NULL, "Remove instruments?", "Compo Cleanup", MB_YESNO | MB_ICONQUESTION) == IDYES) + { + // remove instruments + RemoveAllInstruments(false); + } + else + { + // reset instruments + for(UINT i = 1; i <= m_SndFile.m_nInstruments; i++) + { + m_SndFile.Headers[i]->nFadeOut = 256; + m_SndFile.Headers[i]->nGlobalVol = 64; + m_SndFile.Headers[i]->nPan = 128; + m_SndFile.Headers[i]->dwFlags &= ~ENV_SETPANNING; + m_SndFile.Headers[i]->nMixPlug = 0; + + m_SndFile.Headers[i]->nVolSwing = 0; + m_SndFile.Headers[i]->nPanSwing = 0; + m_SndFile.Headers[i]->nCutSwing = 0; + m_SndFile.Headers[i]->nResSwing = 0; + + //might be a good idea to leave those enabled... + /* + m_SndFile.Headers[i]->dwFlags &= ~ENV_VOLUME; + m_SndFile.Headers[i]->dwFlags &= ~ENV_PANNING; + m_SndFile.Headers[i]->dwFlags &= ~ENV_PITCH; + m_SndFile.Headers[i]->dwFlags &= ~ENV_FILTER; + */ + } + } + + // reset samples + ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetCompo); + + // Set modflags. + m_SndFile.SetModFlag(MSF_MIDICC_BUGEMULATION, false); + m_SndFile.SetModFlag(MSF_OLDVOLSWING, false); + m_SndFile.SetModFlag(MSF_COMPATIBLE_PLAY, true); + + END_CRITICAL(); + EndWaitCursor(); + + UpdateAllViews(NULL, HINT_MODGENERAL, this); + + SetModified(); + return TRUE; +} + + BOOL CModDoc::AdjustEndOfSample(UINT nSample) //------------------------------------------- { @@ -1538,6 +1675,7 @@ MODCOMMAND *m = m_SndFile.Patterns[nPattern]; UINT nrow = dwBeginSel >> 16; UINT ncol = (dwBeginSel & 0xFFFF) >> 3; + ORDERINDEX oCurrentOrder = m_SndFile.GetCurrentOrder(); //jojo.echopaste UINT col; BOOL bS3M = FALSE, bOk = FALSE; UINT len = 0; @@ -1683,6 +1821,22 @@ // Next row m += m_SndFile.m_nChannels; nrow++; + + //jojo.echopaste + if(CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE) + { + while(nrow >= m_SndFile.PatternSize[nPattern]) + { + nrow = 0; + ORDERINDEX oNextOrder = m_SndFile.Order.GetNextOrderIgnoringSkips(oCurrentOrder); + if((oNextOrder <= 0) || (oNextOrder >= m_SndFile.Order.size())) goto PasteDone; + nPattern = m_SndFile.Order[oNextOrder]; + if(m_SndFile.Patterns.IsValidIndex(nPattern) == false) goto PasteDone; + m = m_SndFile.Patterns[nPattern]; + oCurrentOrder = oNextOrder; + } + } + } PasteDone: GlobalUnlock(hCpy); Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -602,6 +602,8 @@ OPTGEN_SYNCMUTE, OPTGEN_AUTODELAY, OPTGEN_PATNOTEFADE, + OPTGEN_ECHOPASTE, + OPTGEN_POSITIONAWARETIMER, OPTGEN_MAXOPTIONS }; @@ -637,7 +639,9 @@ {"Old style pattern context menu", "Check this option to hide unavailable items in the pattern editor context menu. Uncheck to grey-out unavailable items instead."}, {"Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"}, {"Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."}, - {"Note fade on key up", "Enable to fade/stop notes on key up in pattern tab." } + {"Note fade on key up", "Enable to fade/stop notes on key up in pattern tab." }, + {"Echo paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."}, + {"Position aware timer", "If enabled, timer will show the playback position time if possible instead of running timer."}, }; @@ -700,6 +704,8 @@ case OPTGEN_AUTODELAY: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY); break; case OPTGEN_PATNOTEFADE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_NOTEFADE); break; + case OPTGEN_ECHOPASTE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE); break; + case OPTGEN_POSITIONAWARETIMER: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_POSITIONAWARETIMER); break; } m_CheckList.SetCheck(i, (bCheck) ? TRUE : FALSE); } @@ -758,6 +764,8 @@ case OPTGEN_SYNCMUTE: mask = PATTERN_SYNCMUTE; break; case OPTGEN_AUTODELAY: mask = PATTERN_AUTODELAY; break; case OPTGEN_PATNOTEFADE: mask = PATTERN_NOTEFADE; break; + case OPTGEN_ECHOPASTE: mask = PATTERN_ECHOPASTE; break; + case OPTGEN_POSITIONAWARETIMER: mask = PATTERN_POSITIONAWARETIMER; break; } if (bCheck) CMainFrame::m_dwPatternSetup |= mask; else CMainFrame::m_dwPatternSetup &= ~mask; Modified: trunk/OpenMPT/mptrack/OrderToPatternTable.cpp =================================================================== --- trunk/OpenMPT/mptrack/OrderToPatternTable.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/OrderToPatternTable.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -159,6 +159,18 @@ } +void COrderToPatternTable::Init() +//------------------------------- +{ + resize(MAX_ORDERS, GetInvalidPatIndex()); + for(ORDERINDEX i = 0; i < GetCount(); i++) + { + (*this)[i] = GetInvalidPatIndex(); + } +} + + + PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;} PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;} Modified: trunk/OpenMPT/mptrack/OrderToPatternTable.h =================================================================== --- trunk/OpenMPT/mptrack/OrderToPatternTable.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/OrderToPatternTable.h 2009-06-17 17:50:41 UTC (rev 271) @@ -28,6 +28,9 @@ public: COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {} + // Initialize default sized sequence. + void Init(); + bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength); size_t WriteAsByte(FILE* f, const UINT count); Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -1359,12 +1359,14 @@ // Update instruments for (INSTRUMENTINDEX nIns=1; nIns<=pSndFile->m_nInstruments; nIns++) { if (pSndFile->Headers[nIns] && (pSndFile->Headers[nIns]->nMixPlug == src+1)) { - pSndFile->Headers[nIns]->nMixPlug = dest+1; + pSndFile->Headers[nIns]->nMixPlug = static_cast<BYTE>(dest+1); } } END_CRITICAL(); + pModDoc->SetModified(); + return true; } @@ -1411,6 +1413,8 @@ m_CbnPlugin.SetCurSel(m_nCurrentPlugin); OnPluginChanged(); + + pModDoc->SetModified(); } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -3509,6 +3509,7 @@ case kcChangeLoopStatus: SendCtrlMessage(CTRLMSG_PAT_LOOP, -1); return wParam; case kcNewPattern: SendCtrlMessage(CTRLMSG_PAT_NEWPATTERN); return wParam; case kcSwitchToOrderList: OnSwitchToOrderList(); + case kcSwitchEchoPaste: CMainFrame::m_dwPatternSetup ^= PATTERN_ECHOPASTE; return wParam; } //Ranges: Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -1363,6 +1363,12 @@ InvalidateSample(); pModDoc->SetModified(); } + else + { + // ctrl + click = play from cursor pos + if(CMainFrame::GetInputHandler()->CtrlPressed()) + PlayNote(NOTE_MIDDLEC, ScreenToSample(point.x)); + } } } @@ -2031,8 +2037,8 @@ { } -void CViewSample::PlayNote(UINT note) -//----------------------------------------------------- +void CViewSample::PlayNote(UINT note, const uint32 nStartPos) +//------------------------------------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -2049,11 +2055,17 @@ pModDoc->NoteOff(note, TRUE); else pModDoc->NoteOff(0, TRUE); + DWORD loopstart = m_dwBeginSel, loopend = m_dwEndSel; if (loopend - loopstart < (UINT)(4 << m_nZoom)) loopend = loopstart = 0; // selection is too small -> no loop - pModDoc->PlayNote(note, 0, m_nSample, FALSE, -1, loopstart, loopend); + if(nStartPos != uint32_max) + pModDoc->PlayNote(note, 0, m_nSample, FALSE, -1, loopstart, loopend, -1, nStartPos); + else + pModDoc->PlayNote(note, 0, m_nSample, FALSE, -1, loopstart, loopend); + + m_dwStatus |= SMPSTATUS_KEYDOWN; s[0] = 0; if ((note) && (note <= NOTE_MAX)) wsprintf(s, "%s%d", szNoteNames[(note-1)%12], (note-1)/12); Modified: trunk/OpenMPT/mptrack/View_smp.h =================================================================== --- trunk/OpenMPT/mptrack/View_smp.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/View_smp.h 2009-06-17 17:50:41 UTC (rev 271) @@ -32,7 +32,7 @@ BOOL SetZoom(UINT nZoom); LONG SampleToScreen(LONG n) const; DWORD ScreenToSample(LONG x) const; - void PlayNote(UINT note); //rewbs.customKeys + void PlayNote(UINT note, const uint32 nStartPos = uint32_max); //rewbs.customKeys void InvalidateSample(); void SetCurSel(DWORD nBegin, DWORD nEnd); void ScrollToPosition(int x); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-06-17 17:50:41 UTC (rev 271) @@ -146,6 +146,7 @@ MENUITEM "Cleanup S&ong", ID_CLEANUP_SONG MENUITEM "Remove &All Instruments", ID_INSTRUMENTS_REMOVEALL MENUITEM "Cleanup &Plugins", ID_CLEANUP_PLUGS + MENUITEM "Co&mpo Cleanup", ID_CLEANUP_COMPO END MENUITEM SEPARATOR MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND @@ -2050,6 +2051,7 @@ BOTTOMMARGIN, 104 END + ID_CLEANUP_COMPO "Reset attributes to defaults (useful for creating sample packs)\Compo Cleanup" IDD_CONTROL_INSTRUMENTS, DIALOG BEGIN RIGHTMARGIN, 522 Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-06-17 17:50:41 UTC (rev 271) @@ -358,6 +358,9 @@ RelativePath=".\modedit.cpp"> </File> <File + RelativePath="..\soundlib\modsmp_ctrl.cpp"> + </File> + <File RelativePath=".\Moptions.cpp"> </File> <File @@ -771,6 +774,9 @@ RelativePath=".\moddoc.h"> </File> <File + RelativePath="..\soundlib\modsmp_ctrl.h"> + </File> + <File RelativePath=".\Moptions.h"> </File> <File Modified: trunk/OpenMPT/mptrack/patternContainer.cpp =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/patternContainer.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -85,3 +85,16 @@ else if(Size() < MAX_PATTERNS) ResizeArray(MAX_PATTERNS); } + +void CPatternContainer::Init() +//---------------------------- +{ + for(PATTERNINDEX i = 0; i < Size(); i++) + { + Remove(i); + } + + ResizeArray(MAX_PATTERNS); +} + + Modified: trunk/OpenMPT/mptrack/patternContainer.h =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/patternContainer.h 2009-06-17 17:50:41 UTC (rev 271) @@ -30,6 +30,9 @@ public: CPatternContainer(CSoundFile& sndFile) : m_rSndFile(sndFile) {m_Patterns.assign(MAX_PATTERNS, MODPATTERN(*this));} + // Clears existing patterns and resizes array to default size. + void Init(); + //Note: No memory handling here. void ClearPatterns() {m_Patterns.assign(m_Patterns.size(), MODPATTERN(*this));} Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/mptrack/resource.h 2009-06-17 17:50:41 UTC (rev 271) @@ -1056,7 +1056,7 @@ #define ID_NETLINK_MODARCHIVE 59214 #define ID_PATTERN_DUPLICATECHANNEL 59216 #define ID_EDIT_GOTO_MENU 59220 - +#define ID_CLEANUP_COMPO 59221 #define ID_SAMPLE_DRAW 59224 #define ID_SAMPLE_ADDSILENCE 59225 // Next default values for new objects Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-06-17 17:50:41 UTC (rev 271) @@ -846,7 +846,7 @@ public: //Misc void ChangeModTypeTo(const MODTYPE& newType); - //Return value in seconds. + //Returns value in seconds. If given position won't be played at all, returns -1. double GetPlaybackTimeAt(ORDERINDEX, ROWINDEX); uint16 GetModFlags() const {return m_ModFlags;} Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-06-17 17:50:41 UTC (rev 271) @@ -149,4 +149,25 @@ } +void ResetSamples(CSoundFile& rSndFile, ResetFlag resetflag) +//---------------------------------------------------------- +{ + const UINT nSamples = rSndFile.GetNumSamples(); + for(UINT i = 1; i <= nSamples; i++) + { + if(resetflag == SmpResetCompo) + { + rSndFile.Ins[i].nPan = 128; + rSndFile.Ins[i].nGlobalVol = 64; + rSndFile.Ins[i].nVolume = 256; + rSndFile.Ins[i].nVibDepth = 0; + rSndFile.Ins[i].nVibRate = 0; + rSndFile.Ins[i].nVibSweep = 0; + rSndFile.Ins[i].nVibType = 0; + rSndFile.Ins[i].uFlags &= ~CHN_PANNING; + } + } +} + + } // namespace ctrlSmp Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-06-15 20:04:15 UTC (rev 270) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-06-17 17:50:41 UTC (rev 271) @@ -12,6 +12,11 @@ typedef uintptr_t SmpLength; +enum ResetFlag +{ + SmpResetCompo = 1 +}; + // Insert silence to given location. // Note: Is currently implemented only for inserting silence to the beginning and to the end of the sample. // Return: Length of the new sample. @@ -27,6 +32,9 @@ // allocation may be more than what this function returns. inline SmpLength GetSampleCapacity(MODINSTRUMENT& smp) {return smp.GetSampleSizeInBytes();} +// Resets samples. +void ResetSamples(CSoundFile& rSndFile, ResetFlag resetflag); + } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-06-23 19:38:50
|
Revision: 273 http://modplug.svn.sourceforge.net/modplug/?rev=273&view=rev Author: relabsoluness Date: 2009-06-23 19:38:41 +0000 (Tue, 23 Jun 2009) Log Message: ----------- (Patches from Jojo, merged somewhat modified) + General: Can now import GDM files. / Pattern tab: Improved echo paste undo. . Misc: Document will now be set modified when changing rows per beat from main bar. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Added Paths: ----------- trunk/OpenMPT/soundlib/Load_gdm.cpp Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2009-06-17 18:44:27 UTC (rev 272) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2009-06-23 19:38:41 UTC (rev 273) @@ -487,6 +487,7 @@ if ((nCurrentSpeed < 0) || (nCurrentTempo < 0)) return; if ((pMainFrm = CMainFrame::GetMainFrame()) != NULL) { + CModDoc *pModDoc = pMainFrm->GetModPlaying(); CSoundFile *pSndFile = pMainFrm->GetSoundFilePlaying(); if (pSndFile) { @@ -524,12 +525,14 @@ if (nCurrentRowsPerBeat > 1) { pSndFile->m_nRowsPerBeat = nCurrentRowsPerBeat - 1; + pModDoc->SetModified(true); } } else { if (nCurrentRowsPerBeat < 64) { pSndFile->m_nRowsPerBeat = nCurrentRowsPerBeat + 1; + pModDoc->SetModified(true); } } m_SpinRowsPerBeat.SetPos(0); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-06-17 18:44:27 UTC (rev 272) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-06-23 19:38:41 UTC (rev 273) @@ -1833,6 +1833,7 @@ nPattern = m_SndFile.Order[oNextOrder]; if(m_SndFile.Patterns.IsValidIndex(nPattern) == false) goto PasteDone; m = m_SndFile.Patterns[nPattern]; + PrepareUndo(nPattern, 0,0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]); oCurrentOrder = oNextOrder; } } Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-06-17 18:44:27 UTC (rev 272) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-06-23 19:38:41 UTC (rev 273) @@ -277,6 +277,9 @@ RelativePath="..\soundlib\Load_far.cpp"> </File> <File + RelativePath="..\soundlib\Load_gdm.cpp"> + </File> + <File RelativePath="..\soundlib\Load_it.cpp"> </File> <File Added: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp (rev 0) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-06-23 19:38:41 UTC (rev 273) @@ -0,0 +1,532 @@ +/* + * This source code is public domain. + * + * Purpose: Load GDM (BWSB Soundsystem) modules + * Authors: Johannes Schultz + * + * This code is partly based on zilym's original code / specs (which are utterly wrong :P). + * Thanks to the MenTaLguY for gdm.txt and ajs for gdm2s3m and some hints. + * + * Hint 1: Most (all?) of the unsupported features were not supported in 2GDM / BWSB either. + * Hint 2: Files will be played like their original formats would be played in MPT, so no + * BWSB quirks including crashes and freezes are supported. :-P +*/ + +#include "stdafx.h" +#include "sndfile.h" + +#pragma pack(1) + +typedef struct _GDMHEADER +{ + DWORD ID; // ID: 'GDM\xFE' + CHAR SongTitle[32]; // Music's title + CHAR SongMusician[32]; // Name of music's composer + CHAR DOSEOF[3]; // 13, 10, 26 + DWORD ID2; // ID: 'GMFS' + BYTE FormMajorVer; // Format major version + BYTE FormMinorVer; // Format minor version + UINT16 TrackID; // Composing Tracker ID code (00 = 2GDM) + BYTE TrackMajorVer; // Tracker's major version + BYTE TrackMinorVer; // Tracker's minor version + BYTE PanMap[32]; // 0-Left to 15-Right, 255-N/U + BYTE MastVol; // Range: 0...64 + BYTE Tempo; // Initial music tempo (6) + BYTE BPM; // Initial music BPM (125) + UINT16 FormOrigin; // Original format ID: + // 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED + // (versions of 2GDM prior to v1.15 won't set this correctly) + + UINT32 OrdOffset; + BYTE NOO; // Number of orders in module - 1 + UINT32 PatOffset; + BYTE NOP; // Number of patterns in module - 1 + UINT32 SamHeadOffset; + UINT32 SamOffset; + BYTE NOS; // Number of samples in module - 1 + UINT32 MTOffset; // Offset of song message + UINT32 MTLength; + UINT32 SSOffset; // Offset of scrolly script (huh?) + UINT16 SSLength; + UINT32 TGOffset; // Offset of text graphic (huh?) + UINT16 TGLength; +} GDMHEADER, *PGDMHEADER; + +typedef struct _GDMSAMPLEHEADER +{ + CHAR SamName[32]; + CHAR FileName[12]; + BYTE EmsHandle; // useless + UINT32 Length; + UINT32 LoopBegin; + UINT32 LoopEnd; + BYTE Flags; + UINT16 C4Hertz; + BYTE Volume; + BYTE Pan; +} GDMSAMPLEHEADER, *PGDMSAMPLEHEADER; + +BOOL CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength) +//----------------------------------------------------------- +{ + if ((!lpStream) || (dwMemLength < sizeof(GDMHEADER))) return FALSE; + + const PGDMHEADER pHeader = (PGDMHEADER)lpStream; + + // is it a valid GDM file? + if( (LittleEndian(pHeader->ID) != 0xFE4D4447) || //GDM\xFE + (pHeader->DOSEOF[0] != 13 || pHeader->DOSEOF[1] != 10 || pHeader->DOSEOF[2] != 26) || //CR+LF+EOF + (LittleEndian(pHeader->ID2) != 0x53464D47)) return FALSE; //GMFS + + // song name + memset(m_szNames, 0, sizeof(m_szNames)); + memcpy(m_szNames[0], pHeader->SongTitle, 32); + SetNullTerminator(m_szNames[0]); + + // there are no other format versions... + if(pHeader->FormMajorVer != 1 || pHeader->FormMinorVer != 0) + { + ::MessageBox(0, TEXT("GDM file seems to be valid, but this format version is currently not supported."), TEXT("OpenMPT GDM import"), MB_ICONERROR); + return FALSE; + } + + // todo: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe + + // read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist + m_nChannels = 32; + for(int i = 0; i < 32; i++) + { + if(pHeader->PanMap[i] < 16) + { + ChnSettings[i].nPan = min((pHeader->PanMap[i] << 4) + 8, 256); + } + else if(pHeader->PanMap[i] == 16) + { + ChnSettings[i].nPan = 128; + ChnSettings[i].dwFlags |= CHN_SURROUND; + } + else if(pHeader->PanMap[i] == 0xff) + { + m_nChannels = i; + break; + } + } + + m_nDefaultGlobalVolume = min(pHeader->MastVol << 2, 256); + m_nDefaultSpeed = pHeader->Tempo; + m_nDefaultTempo = pHeader->BPM; + m_nRestartPos = 0; // not supported in this format, so use the default value + m_nSamplePreAmp = 48; // dito + m_nVSTiVolume = 48; // dito + + // 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED + + switch(pHeader->FormOrigin) + { + case 1: + m_nType = MOD_TYPE_MOD; + break; + case 2: + m_nType = MOD_TYPE_MTM; + break; + case 3: + m_nType = MOD_TYPE_S3M; + break; + case 4: + m_nType = MOD_TYPE_669; + break; + case 5: + m_nType = MOD_TYPE_FAR; + break; + case 6: + m_nType = MOD_TYPE_ULT; + break; + case 7: + m_nType = MOD_TYPE_STM; + break; + case 8: + m_nType = MOD_TYPE_MED; + break; + default: + ::MessageBox(0, TEXT("GDM file seems to be valid, but the original format is currently not supported.\nThis should not happen."), TEXT("OpenMPT GDM import"), MB_ICONERROR); + return FALSE; + break; + } + + // check if offsets are valid. we won't read the scrolly text or text graphics, but invalid pointers would probably indicate a broken file... + if( dwMemLength < pHeader->OrdOffset || dwMemLength - pHeader->OrdOffset < pHeader->NOO + || dwMemLength < pHeader->PatOffset + || dwMemLength < pHeader->SamHeadOffset || dwMemLength - pHeader->SamHeadOffset < (pHeader->NOS + 1) * sizeof(GDMSAMPLEHEADER) + || dwMemLength < pHeader->SamOffset + || dwMemLength < pHeader->MTOffset || dwMemLength - pHeader->MTOffset < pHeader->MTLength + || dwMemLength < pHeader->SSOffset || dwMemLength - pHeader->SSOffset < pHeader->SSLength + || dwMemLength < pHeader->TGOffset || dwMemLength - pHeader->TGOffset < pHeader->TGLength) + return FALSE; + + // read orders + Order.ReadAsByte(lpStream + pHeader->OrdOffset, pHeader->NOO + 1, dwMemLength - pHeader->OrdOffset); + + // read samples + m_nSamples = pHeader->NOS + 1; + + DWORD iSampleOffset = pHeader->SamOffset; + int iLZWsamples = 0; + + for(UINT iSmp = 1; iSmp <= m_nSamples; iSmp++) + { + const PGDMSAMPLEHEADER pSample = (PGDMSAMPLEHEADER)(lpStream + pHeader->SamHeadOffset + (iSmp - 1) * sizeof(GDMSAMPLEHEADER)); + + // sample header + + memcpy(m_szNames[iSmp], pSample->SamName, 32); + SetNullTerminator(m_szNames[iSmp]); + memcpy(Ins[iSmp].name, pSample->FileName, 12); + + Ins[iSmp].nC4Speed = pSample->C4Hertz; + Ins[iSmp].nGlobalVol = 256; // not supported in this format + Ins[iSmp].nLength = min(pSample->Length, MAX_SAMPLE_LENGTH); // in bytes + Ins[iSmp].nLoopStart = min(pSample->LoopBegin, Ins[iSmp].nLength); // in samples + Ins[iSmp].nLoopEnd = min(pSample->LoopEnd - 1, Ins[iSmp].nLength); // dito + FrequencyToTranspose(&Ins[iSmp]); // set transpose + finetune for mod files + + if(pSample->Flags & 0x01) Ins[iSmp].uFlags |= CHN_LOOP; // loop sample + + if(pSample->Flags & 0x04) + { + Ins[iSmp].nVolume = min(pSample->Volume << 2, 256); // 0...64, 255 = no default volume + } + else + { + Ins[iSmp].nVolume = 256; // default volume + } + + if(pSample->Flags & 0x08) // default panning is used + { + Ins[iSmp].uFlags |= CHN_PANNING; + Ins[iSmp].nPan = (pSample->Pan > 15) ? 128 : min((pSample->Pan << 4) + 8, 256); // 0...15, 16 = surround (not supported), 255 = no default panning + } + else + { + Ins[iSmp].nPan = 128; + } + + /* note: apparently (and according to zilym), 2GDM doesn't handle 16 bit or stereo samples properly. + so those flags are pretty much meaningless and we will ignore them... in fact, samples won't load as expected if we don't! */ + + UINT iSampleFormat; + if(pSample->Flags & 0x02) // 16 bit + { + if(pSample->Flags & 0x20) // stereo + { + iSampleFormat = RS_PCM16U; // should be RS_STPCM16U but that breaks the sample reader + } + else + { + iSampleFormat = RS_PCM16U; + } + } + else // 8 bit + { + if(pSample->Flags & 0x20) // stereo + { + iSampleFormat = RS_PCM8U; // should be RS_STPCM8U - dito + } + else + { + iSampleFormat = RS_PCM8U; + } + } + + // according to zilym, LZW support has never been finished, so this is also practically useless. + if(pSample->Flags & 0x10) + iLZWsamples++; + + // read sample data + ReadSample(&Ins[iSmp], iSampleFormat, reinterpret_cast<LPCSTR>(lpStream + iSampleOffset), dwMemLength - iSampleOffset); + iSampleOffset += min(pSample->Length, dwMemLength - iSampleOffset); + + } + + // read patterns + Patterns.ResizeArray(max(MAX_PATTERNS, pHeader->NOP + 1)); + + // position in file + DWORD iPatternsOffset = pHeader->PatOffset; + + BOOL bS3MCommandSet = (GetBestSaveFormat() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)); + + for (PATTERNINDEX iPat = 0; iPat < pHeader->NOP + 1; iPat++) + { + + if(iPatternsOffset + 2 > dwMemLength) break; + UINT16 iPatternLength = *(UINT16 *)(lpStream + iPatternsOffset); // pattern length including the two "length" bytes + if(iPatternLength > dwMemLength || iPatternsOffset > dwMemLength - iPatternLength) break; + + if(Patterns.Insert(iPat, 64)) + { + CString s; + s.Format(TEXT("Allocating patterns failed starting from pattern %u"), iPat); + MessageBox(NULL, s, TEXT("OpenMPT GDM import"), MB_ICONERROR); + break; + } + + // position in THIS pattern + DWORD iPatternPos = iPatternsOffset + 2; + + MODCOMMAND *p = Patterns[iPat]; + + for(UINT iRow = 0; iRow < 64; iRow++) + { + do // zero byte = next row + { + if(iPatternPos + 1 > dwMemLength) break; + + BYTE bChannel = lpStream[iPatternPos++]; + + if(bChannel == 0) break; // next row, please! + + UINT channel = bChannel & 0x1f; + if(channel >= m_nChannels) break; // better safe than sorry! + + MODCOMMAND *m = &p[iRow * m_nChannels + channel]; + + if(bChannel & 0x20) + { + // note and sample follows + if(iPatternPos + 2 > dwMemLength) break; + BYTE bNote = lpStream[iPatternPos++]; + BYTE bSample = lpStream[iPatternPos++]; + + bNote = (bNote & 0x7F) - 1; // this format doesn't have note cuts + if(bNote < 0xF0) bNote = (bNote & 0x0F) + 12 * (bNote >> 4) + 13; + if(bNote == 0xFF) bNote = 0; + m->note = bNote; + m->instr = bSample; + + } + + if(bChannel & 0x40) + { + // effect(s) follow + + m->command = CMD_NONE; + m->volcmd = CMD_NONE; + + do + { + if(iPatternPos + 2 > dwMemLength) break; + BYTE bEffect = lpStream[iPatternPos++]; + BYTE bEffectData = lpStream[iPatternPos++]; + + BYTE command = bEffect & 0x1F, param = bEffectData; + BYTE volcommand = CMD_NONE, volparam = param; + + switch(command) + { + case 0x01: command = CMD_PORTAMENTOUP; if(param >= 0xE0) param = 0xDF; break; + case 0x02: command = CMD_PORTAMENTODOWN; if(param >= 0xE0) param = 0xDF; break; + case 0x03: command = CMD_TONEPORTAMENTO; break; + case 0x04: command = CMD_VIBRATO; break; + case 0x05: command = CMD_TONEPORTAVOL; if (param & 0xF0) param &= 0xF0; break; + case 0x06: command = CMD_VIBRATOVOL; if (param & 0xF0) param &= 0xF0; break; + case 0x07: command = CMD_TREMOLO; break; + case 0x08: command = CMD_TREMOR; break; + case 0x09: command = CMD_OFFSET; break; + case 0x0A: command = CMD_VOLUMESLIDE; break; + case 0x0B: command = CMD_POSITIONJUMP; break; + case 0x0C: + if(bS3MCommandSet) + { + command = CMD_NONE; + volcommand = VOLCMD_VOLUME; + volparam = min(param, 64); + } + else + { + command = CMD_VOLUME; + param = min(param, 64); + } + break; + case 0x0D: command = CMD_PATTERNBREAK; break; + case 0x0E: + if(bS3MCommandSet) + { + command = CMD_S3MCMDEX; + // need to do some remapping + switch(param >> 4) + { + case 0x0: + // set filter + command = CMD_MODCMDEX; + break; + case 0x1: + // fine porta up + command = CMD_PORTAMENTOUP; + param = 0xF0 | (param & 0x0F); + break; + case 0x2: + // fine porta down + command = CMD_PORTAMENTODOWN; + param = 0xF0 | (param & 0x0F); + break; + case 0x3: + // glissando control + param = 0x10 | (param & 0x0F); + break; + case 0x4: + // vibrato waveform + param = 0x30 | (param & 0x0F); + break; + case 0x5: + // set finetune + param = 0x20 | (param & 0x0F); + break; + case 0x6: + // pattern loop + param = 0xB0 | (param & 0x0F); + break; + case 0x7: + // tremolo waveform + param = 0x40 | (param & 0x0F); + break; + case 0x8: + // extra fine porta up + command = CMD_PORTAMENTOUP; + param = 0xE0 | (param & 0x0F); + break; + case 0x9: + // extra fine porta down + command = CMD_PORTAMENTODOWN; + param = 0xE0 | (param & 0x0F); + break; + case 0xA: + // fine volume up + command = CMD_VOLUMESLIDE; + param = ((param & 0x0F) << 4) | 0x0F; + break; + case 0xB: + // fine volume down + command = CMD_VOLUMESLIDE; + param = 0xF0 | (param & 0x0F); + break; + case 0xC: + // note cut + break; + case 0xD: + // note delay + break; + case 0xE: + // pattern delay + break; + case 0xF: + command = CMD_MODCMDEX; + // invert loop / funk repeat + break; + } + } + else + { + command = CMD_MODCMDEX; + } + break; + case 0x0F: command = CMD_SPEED; break; + case 0x10: command = CMD_ARPEGGIO; break; + case 0x11: command = CMD_NONE /* set internal flag */; break; + case 0x12: + if((!bS3MCommandSet) && ((param & 0xF0) == 0)) + { + // retrig in "mod style" + command = CMD_MODCMDEX; + param = 0x90 | (param & 0x0F); + } + else + { + // either "s3m style" is required or this format is like s3m anyway + command = CMD_RETRIG; + } + break; + case 0x13: command = CMD_GLOBALVOLUME; break; + case 0x14: command = CMD_FINEVIBRATO; break; + case 0x1E: + switch(param >> 4) + { + case 0x0: + switch(param & 0x0F) + { + case 0x0: command = CMD_S3MCMDEX; param = 0x90; break; + case 0x1: command = CMD_PANNING8; param = 0xA4; break; + case 0x2: command = CMD_NONE /* set normal loop - not implemented in 2GDM */; break; + case 0x3: command = CMD_NONE /* set bidi loop - dito */; break; + case 0x4: command = CMD_S3MCMDEX; param = 0x9E; break; + case 0x5: command = CMD_S3MCMDEX; param = 0x9F; break; + case 0x6: command = CMD_NONE /* monaural sample - dito */; break; + case 0x7: command = CMD_NONE /* stereo sample - dito */; break; + case 0x8: command = CMD_NONE /* stop sample on end - dito */; break; + case 0x9: command = CMD_NONE /* loop sample on end - dito */; break; + default: command = CMD_NONE; break; + } + break; + case 0x8: + command = (bS3MCommandSet) ? CMD_S3MCMDEX : CMD_MODCMDEX; + break; + case 0xD: + // adjust frequency (increment in hz) - not implemented in 2GDM + command = CMD_NONE; + break; + default: command = CMD_NONE; break; + } + break; + case 0x1F: command = CMD_TEMPO; break; + default: command = CMD_NONE; break; + } + + if(command != CMD_NONE) + { + // move pannings to volume column - should never happen + if(m->command == CMD_S3MCMDEX && ((m->param >> 4) == 0x8) && volcommand == CMD_NONE) + { + volcommand = VOLCMD_PANNING; + volparam = ((param & 0x0F) << 2) + 2; + } + + m->command = command; + m->param = param; + } + if(volcommand != CMD_NONE) + { + m->volcmd = volcommand; + m->vol = volparam; + } + + if(!(bEffect & 0x20)) break; // no other effect follows + } while(1); + + } + + } while(1); + } + + iPatternsOffset += iPatternLength; + } + + // read song comments + if(pHeader->MTLength) + { + m_lpszSongComments = new char[pHeader->MTLength + 1]; + if (m_lpszSongComments) + { + memset(m_lpszSongComments, 0, pHeader->MTLength + 1); + memcpy(m_lpszSongComments, lpStream + pHeader->MTOffset, pHeader->MTLength); + } + } + + if(iLZWsamples) + { + TCHAR s[128]; + wsprintf(s, TEXT("%d samples are LZW compressed. LZW compression is currently not supported.\nPlease send this file to the OpenMPT team."), iLZWsamples); + ::MessageBox(0, s, TEXT("OpenMPT GDM import"), MB_ICONWARNING); + } + + return TRUE; + +} Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-17 18:44:27 UTC (rev 272) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-23 19:38:41 UTC (rev 273) @@ -593,6 +593,7 @@ #endif #endif // MODPLUG_BASIC_SUPPORT && (!ReadMO3(lpStream, dwMemLength)) + && (!ReadGDM(lpStream, dwMemLength)) && (!ReadMod(lpStream, dwMemLength))) m_nType = MOD_TYPE_NONE; #ifdef ZIPPED_MOD_SUPPORT if ((!m_lpszSongComments) && (archive.GetComments(FALSE))) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-06-17 18:44:27 UTC (rev 272) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-06-23 19:38:41 UTC (rev 273) @@ -1068,6 +1068,7 @@ BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength); BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength); BOOL ReadMO3(LPCBYTE lpStream, const DWORD dwMemLength); + BOOL ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength); BOOL ReadMID(LPCBYTE lpStream, DWORD dwMemLength); // Save Functions #ifndef MODPLUG_NO_FILESAVE This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-06-24 19:40:35
|
Revision: 276 http://modplug.svn.sourceforge.net/modplug/?rev=276&view=rev Author: relabsoluness Date: 2009-06-24 19:39:33 +0000 (Wed, 24 Jun 2009) Log Message: ----------- [Ref] Moved pattern, playbackeventer and sequence files from mptrack to soundlib. (merged from devBranch_1_17_03) Modified Paths: -------------- trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/soundlib/Sndfile.h Added Paths: ----------- trunk/OpenMPT/soundlib/OrderToPatternTable.cpp trunk/OpenMPT/soundlib/OrderToPatternTable.h trunk/OpenMPT/soundlib/PlaybackEventer.cpp trunk/OpenMPT/soundlib/PlaybackEventer.h trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/pattern.h trunk/OpenMPT/soundlib/patternContainer.cpp trunk/OpenMPT/soundlib/patternContainer.h Removed Paths: ------------- trunk/OpenMPT/mptrack/OrderToPatternTable.cpp trunk/OpenMPT/mptrack/OrderToPatternTable.h trunk/OpenMPT/mptrack/PlaybackEventer.cpp trunk/OpenMPT/mptrack/PlaybackEventer.h trunk/OpenMPT/mptrack/pattern.cpp trunk/OpenMPT/mptrack/pattern.h trunk/OpenMPT/mptrack/patternContainer.cpp trunk/OpenMPT/mptrack/patternContainer.h Deleted: trunk/OpenMPT/mptrack/OrderToPatternTable.cpp =================================================================== --- trunk/OpenMPT/mptrack/OrderToPatternTable.cpp 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/OrderToPatternTable.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -1,228 +0,0 @@ -#include "stdafx.h" -#include "sndfile.h" -#include "ordertopatterntable.h" - -#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.")))) - -DWORD COrderToPatternTable::Unserialize(const BYTE* const src, const DWORD memLength) -//------------------------------------------------------------------------- -{ - if(memLength < 2 + 4) return 0; - uint16 version = 0; - uint32 s = 0; - DWORD memPos = 0; - memcpy(&version, src, sizeof(version)); - memPos += sizeof(version); - if(version != 0) return memPos; - memcpy(&s, src+memPos, sizeof(s)); - memPos += sizeof(s); - if(s > 65000) return true; - if(memLength < memPos+s*4) return memPos; - - const uint32 nOriginalSize = s; - if(s > MPTM_SPECS.ordersMax) - s = MPTM_SPECS.ordersMax; - - resize(s); - for(size_t i = 0; i<s; i++, memPos +=4 ) - { - uint32 temp; - memcpy(&temp, src+memPos, 4); - (*this)[i] = static_cast<PATTERNINDEX>(temp); - } - memPos += 4*(nOriginalSize - s); - return memPos; -} - - -size_t COrderToPatternTable::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize) -//----------------------------------------------------------------------------- -{ - if(numOfBytes > destSize) return true; - if(size() < numOfBytes) resize(numOfBytes, 0xFF); - UINT i = 0; - for(i = 0; i<numOfBytes; i++) - { - dest[i] = static_cast<BYTE>((*this)[i]); - } - return i; //Returns the number of bytes written. -} - - -size_t COrderToPatternTable::WriteAsByte(FILE* f, const UINT count) -//--------------------------------------------------------------- -{ - if(size() < count) resize(count, GetInvalidPatIndex()); - - size_t i = 0; - - for(i = 0; i<count; i++) - { - const PATTERNINDEX pat = (*this)[i]; - BYTE temp = static_cast<BYTE>((*this)[i]); - - if(pat > 0xFD) - { - if(pat == GetInvalidPatIndex()) temp = 0xFF; - else temp = 0xFE; - } - fwrite(&temp, 1, 1, f); - } - return i; //Returns the number of bytes written. -} - -bool COrderToPatternTable::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength) -//------------------------------------------------------------------------- -{ - if(howMany < 0 || howMany > memLength) return true; - if(m_rSndFile.GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true; - - if(size() < static_cast<size_t>(howMany)) - resize(howMany, GetInvalidPatIndex()); - - for(int i = 0; i<howMany; i++, pFrom++) - (*this)[i] = *pFrom; - return false; -} - - -bool COrderToPatternTable::NeedsExtraDatafield() const -//---------------------------------------------- -{ - if(m_rSndFile.GetType() == MOD_TYPE_MPT && m_rSndFile.Patterns.Size() > 0xFD) - return true; - else - return false; -} - - -void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype) -//---------------------------------------------------------------- -{ - const CModSpecifications specs = m_rSndFile.GetModSpecifications(); - - //Resize orderlist if needed. Because old orderlist had MAX_ORDERS(256) elements, not making it - //smaller than that even if the modtype doesn't support that many orders. - if(specs.ordersMax < GetCount()) - { - resize(max(MAX_ORDERS, specs.ordersMax)); - for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex(); - } - - //Replace items used to denote end of song/skip order. - replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex()); - replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex()); -} - - -ORDERINDEX COrderToPatternTable::GetLengthTailTrimmed() const -//----------------------------------------------------------- -{ - ORDERINDEX nEnd = GetCount(); - if(nEnd == 0) return 0; - nEnd--; - const PATTERNINDEX iInvalid = GetInvalidPatIndex(); - while(nEnd > 0 && (*this)[nEnd] == iInvalid) - nEnd--; - return ((*this)[nEnd] == iInvalid) ? 0 : nEnd+1; -} - - -ORDERINDEX COrderToPatternTable::GetLengthFirstEmpty() const -//---------------------------------------------------------- -{ - const ORDERINDEX nLength = GetCount(); - ORDERINDEX nMax = 0; - while ((nMax < nLength) && ((*this)[nMax] != (*this).GetInvalidPatIndex())) nMax++; - return nMax; -} - - -ORDERINDEX COrderToPatternTable::GetNextOrderIgnoringSkips(const ORDERINDEX start) const -//------------------------------------------------------------------------------------- -{ - const ORDERINDEX count = GetCount(); - if(count == 0) return 0; - ORDERINDEX next = min(count-1, start+1); - while(next+1 < count && (*this)[next] == GetIgnoreIndex()) next++; - return next; -} - -ORDERINDEX COrderToPatternTable::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const -//------------------------------------------------------------------------------------- -{ - const ORDERINDEX count = GetCount(); - if(start == 0 || count == 0) return 0; - ORDERINDEX prev = min(start-1, count-1); - while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--; - return prev; -} - - -void COrderToPatternTable::Init() -//------------------------------- -{ - resize(MAX_ORDERS, GetInvalidPatIndex()); - for(ORDERINDEX i = 0; i < GetCount(); i++) - { - (*this)[i] = GetInvalidPatIndex(); - } -} - - - -PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;} -PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;} - -PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return GetInvalidPatIndex(m_rSndFile.GetType());} -PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return GetIgnoreIndex(m_rSndFile.GetType());} - - - - -//-------------------------------------------------- -//-------------------------------------------------- -//-------------------------------------------------- - -using namespace srlztn; - -void COrderSerialization::ProWrite(OUTSTREAM& ostrm) const -//-------------------------------------------------------- -{ - uint16 size = static_cast<uint16>(m_rOrders.size()); - ostrm.write(reinterpret_cast<const char*>(&size), 2); - const COrderToPatternTable::const_iterator endIter = m_rOrders.end(); - for(COrderToPatternTable::const_iterator citer = m_rOrders.begin(); citer != endIter; citer++) - { - const uint16 temp = static_cast<uint16>(*citer); - ostrm.write(reinterpret_cast<const char*>(&temp), 2); - } -} - - -void COrderSerialization::ProRead(INSTREAM& istrm, const uint64 /*datasize*/) -//--------------------------------------------------------------------------- -{ - uint16 size; - istrm.read(reinterpret_cast<char*>(&size), 2); - if(size > MPTM_SPECS.ordersMax) - { - // Hack: Show message here if trying to load longer sequence than what is supported. - CString str; str.Format(str_SequenceTruncationNote, size, MPTM_SPECS.ordersMax); - ::MessageBox(0, str, "", MB_ICONWARNING); - size = MPTM_SPECS.ordersMax; - } - m_rOrders.resize(size); - if(size == 0) {m_rOrders.assign(MAX_ORDERS, m_rOrders.GetInvalidPatIndex()); return;} - - const COrderToPatternTable::const_iterator endIter = m_rOrders.end(); - for(COrderToPatternTable::iterator iter = m_rOrders.begin(); iter != endIter; iter++) - { - uint16 temp; - istrm.read(reinterpret_cast<char*>(&temp), 2); - *iter = temp; - } -} - - - Deleted: trunk/OpenMPT/mptrack/OrderToPatternTable.h =================================================================== --- trunk/OpenMPT/mptrack/OrderToPatternTable.h 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/OrderToPatternTable.h 2009-06-24 19:39:33 UTC (rev 276) @@ -1,77 +0,0 @@ -#ifndef ORDERTOPATTERNTABLE_H -#define ORDERTOPATTERNTABLE_H - -#include "serialization_utils.h" -#include <vector> -using std::vector; - -class CSoundFile; -class COrderToPatternTable; - -#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data - -class COrderSerialization : public srlztn::ABCSerializationStreamer -//========================================================= -{ -public: - COrderSerialization(COrderToPatternTable& ordertable) : m_rOrders(ordertable) {} - virtual void ProWrite(srlztn::OUTSTREAM& ostrm) const; - virtual void ProRead(srlztn::INSTREAM& istrm, const uint64 /*datasize*/); -private: - COrderToPatternTable& m_rOrders; -}; - -//============================================== -class COrderToPatternTable : public vector<PATTERNINDEX> -//============================================== -{ -public: - COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {} - - // Initialize default sized sequence. - void Init(); - - bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength); - - size_t WriteAsByte(FILE* f, const UINT count); - - size_t WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize); - - ORDERINDEX GetCount() const {return size();} - - //Deprecated function used for MPTm's created in 1.17.02.46 - 1.17.02.48. - DWORD Unserialize(const BYTE* const src, const DWORD memLength); - - //Returns true if the IT orderlist datafield is not sufficient to store orderlist information. - bool NeedsExtraDatafield() const; - - void OnModTypeChanged(const MODTYPE oldtype); - - // Returns length of sequence without counting trailing '---' items. - ORDERINDEX GetLengthTailTrimmed() const; - - // Returns length of sequence stopping counting on first '---' (or at the end of sequence). - ORDERINDEX GetLengthFirstEmpty() const; - - PATTERNINDEX GetInvalidPatIndex() const; //To correspond 0xFF - static PATTERNINDEX GetInvalidPatIndex(const MODTYPE type); - - PATTERNINDEX GetIgnoreIndex() const; //To correspond 0xFE - static PATTERNINDEX GetIgnoreIndex(const MODTYPE type); - - //Returns the previous/next order ignoring skip indeces(+++). - //If no previous/next order exists, return first/last order, and zero - //when orderlist is empty. - ORDERINDEX GetNextOrderIgnoringSkips(const ORDERINDEX start) const; - ORDERINDEX GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const; - - COrderSerialization* NewReadWriteObject() {return new COrderSerialization(*this);} - -private: - const CSoundFile& m_rSndFile; -}; - -#pragma warning(default:4244) - -#endif - Deleted: trunk/OpenMPT/mptrack/PlaybackEventer.cpp =================================================================== --- trunk/OpenMPT/mptrack/PlaybackEventer.cpp 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/PlaybackEventer.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -1,31 +0,0 @@ -#include "stdafx.h" -#include "PlaybackEventer.h" -#include "sndfile.h" - -CPlaybackEventer::~CPlaybackEventer() -//--------------------------------- -{ -} - -void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) -//------------------------------------------------------------------------- -{ - if(chnIndex >= m_rSndFile.m_nChannels) - return; - - for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) - { - m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? false : true; - } - m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = (m_rSndFile.ChnSettings[chnIndex].dwFlags & CHN_MUTE) ? true : false; -} - - -void CPlaybackEventer::PatternTransitionChnUnmuteAll() -//---------------------------------------------------- -{ - for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) - { - m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? true : false; - } -} \ No newline at end of file Deleted: trunk/OpenMPT/mptrack/PlaybackEventer.h =================================================================== --- trunk/OpenMPT/mptrack/PlaybackEventer.h 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/PlaybackEventer.h 2009-06-24 19:39:33 UTC (rev 276) @@ -1,25 +0,0 @@ -#ifndef PLAYBACKEVENTER_H -#define PLAYBACKEVENTER_H - -#include "pattern.h" - -class CSoundFile; - -//==================== -class CPlaybackEventer -//==================== -{ -public: - CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {} - ~CPlaybackEventer(); - - //SetPatternEvent(const PATTERNINDEX pattern, const ROWINDEX row, const CHANNELINDEX column); - - void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); - void PatternTransitionChnUnmuteAll(); - -private: - CSoundFile& m_rSndFile; -}; - -#endif Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-06-24 19:39:33 UTC (rev 276) @@ -391,13 +391,13 @@ RelativePath=".\OpenGLEditor.cpp"> </File> <File - RelativePath=".\OrderToPatternTable.cpp"> + RelativePath="..\soundlib\OrderToPatternTable.cpp"> </File> <File - RelativePath=".\pattern.cpp"> + RelativePath="..\soundlib\pattern.cpp"> </File> <File - RelativePath=".\patternContainer.cpp"> + RelativePath="..\soundlib\patternContainer.cpp"> </File> <File RelativePath=".\PatternGotoDialog.cpp"> @@ -406,7 +406,7 @@ RelativePath=".\PerformanceCounter.cpp"> </File> <File - RelativePath=".\PlaybackEventer.cpp"> + RelativePath="..\soundlib\PlaybackEventer.cpp"> </File> <File RelativePath=".\PSRatioCalc.cpp"> @@ -804,13 +804,13 @@ RelativePath=".\order.h"> </File> <File - RelativePath=".\OrderToPatternTable.h"> + RelativePath="..\soundlib\OrderToPatternTable.h"> </File> <File - RelativePath=".\pattern.h"> + RelativePath="..\soundlib\pattern.h"> </File> <File - RelativePath=".\patternContainer.h"> + RelativePath="..\soundlib\patternContainer.h"> </File> <File RelativePath=".\PatternGotoDialog.h"> @@ -819,7 +819,7 @@ RelativePath=".\PerformanceCounter.h"> </File> <File - RelativePath=".\PlaybackEventer.h"> + RelativePath="..\soundlib\PlaybackEventer.h"> </File> <File RelativePath=".\PSRatioCalc.h"> Deleted: trunk/OpenMPT/mptrack/pattern.cpp =================================================================== --- trunk/OpenMPT/mptrack/pattern.cpp 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/pattern.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -1,232 +0,0 @@ -#include "stdafx.h" -#include "pattern.h" -#include "patternContainer.h" -#include "mainfrm.h" -#include "moddoc.h" - - -CHANNELINDEX CPattern::GetNumChannels() const -//------------------------------------------- -{ - return m_rPatternContainer.GetSoundFile().GetNumChannels(); -} - -bool CPattern::Resize(const ROWINDEX newRowCount, const bool showDataLossWarning) -//------------------------------------------- -{ - if(m_ModCommands == NULL) - { - //For Mimicing old behavior of setting patternsize before even having the - //actual pattern allocated. - m_Rows = newRowCount; - return false; - } - - - CSoundFile& sndFile = m_rPatternContainer.GetSoundFile(); - const CModSpecifications& specs = sndFile.GetModSpecifications(); - if(sndFile.m_pModDoc == NULL) return true; - CModDoc& rModDoc = *sndFile.m_pModDoc; - if(newRowCount > specs.patternRowsMax || newRowCount < specs.patternRowsMin) - return true; - - if (newRowCount == m_Rows) return false; - rModDoc.BeginWaitCursor(); - BEGIN_CRITICAL(); - if (newRowCount > m_Rows) - { - MODCOMMAND *p = CSoundFile::AllocatePattern(newRowCount, sndFile.m_nChannels); - if (p) - { - memcpy(p, m_ModCommands, sndFile.m_nChannels*m_Rows*sizeof(MODCOMMAND)); - CSoundFile::FreePattern(m_ModCommands); - m_ModCommands = p; - m_Rows = newRowCount; - } - } else - { - BOOL bOk = TRUE; - MODCOMMAND *p = m_ModCommands; - UINT ndif = (m_Rows - newRowCount) * sndFile.m_nChannels; - UINT npos = newRowCount * sndFile.m_nChannels; - if(showDataLossWarning) - { - for (UINT i=0; i<ndif; i++) - { - if (*((DWORD *)(p+i+npos))) - { - bOk = FALSE; - break; - } - } - if (!bOk && showDataLossWarning) - { - END_CRITICAL(); - rModDoc.EndWaitCursor(); - if (CMainFrame::GetMainFrame()->MessageBox("Data at the end of the pattern will be lost.\nDo you want to continue", - "Shrink Pattern", MB_YESNO|MB_ICONQUESTION) == IDYES) bOk = TRUE; - rModDoc.BeginWaitCursor(); - BEGIN_CRITICAL(); - } - } - if (bOk) - { - MODCOMMAND *pnew = CSoundFile::AllocatePattern(newRowCount, sndFile.m_nChannels); - if (pnew) - { - memcpy(pnew, m_ModCommands, sndFile.m_nChannels*newRowCount*sizeof(MODCOMMAND)); - CSoundFile::FreePattern(m_ModCommands); - m_ModCommands = pnew; - m_Rows = newRowCount; - } - } - } - END_CRITICAL(); - rModDoc.EndWaitCursor(); - rModDoc.SetModified(); - return (newRowCount == m_Rows) ? false : true; -} - - -bool CPattern::ClearData() -//------------------------ -{ - BEGIN_CRITICAL(); - m_Rows = 0; - CSoundFile::FreePattern(m_ModCommands); - m_ModCommands = NULL; - END_CRITICAL(); - return false; -} - -bool CPattern::Expand() -//--------------------- -{ - MODCOMMAND *newPattern, *oldPattern; - UINT nRows, nChns; - - CSoundFile& sndFile = m_rPatternContainer.GetSoundFile(); - if(sndFile.m_pModDoc == NULL) return true; - - CModDoc& rModDoc = *sndFile.m_pModDoc; - - if ((!m_ModCommands) || (m_Rows > sndFile.GetModSpecifications().patternRowsMax / 2)) return true; - - rModDoc.BeginWaitCursor(); - nRows = m_Rows; - nChns = sndFile.m_nChannels; - newPattern = CSoundFile::AllocatePattern(nRows*2, nChns); - if (!newPattern) return true; - - const UINT nPattern = m_rPatternContainer.GetIndex(this); - rModDoc.PrepareUndo(nPattern, 0,0, nChns, nRows); - oldPattern = m_ModCommands; - for (UINT y=0; y<nRows; y++) - { - memcpy(newPattern+y*2*nChns, oldPattern+y*nChns, nChns*sizeof(MODCOMMAND)); - } - m_ModCommands = newPattern; - m_Rows = nRows * 2; - CSoundFile::FreePattern(oldPattern); oldPattern= NULL; - rModDoc.SetModified(); - rModDoc.UpdateAllViews(NULL, HINT_PATTERNDATA | (nPattern << HINT_SHIFT_PAT), NULL); - rModDoc.EndWaitCursor(); - return false; -} - -bool CPattern::Shrink() -//--------------------- -{ - UINT nRows, nChns; - - if (!m_ModCommands || m_Rows < 32) return true; - - CSoundFile& sndFile = m_rPatternContainer.GetSoundFile(); - if(sndFile.m_pModDoc == NULL) return true; - - CModDoc& rModDoc = *sndFile.m_pModDoc; - - rModDoc.BeginWaitCursor(); - nRows = m_Rows; - nChns = sndFile.m_nChannels; - const UINT nPattern = m_rPatternContainer.GetIndex(this); - rModDoc.PrepareUndo(nPattern, 0,0, nChns, nRows); - nRows /= 2; - for (UINT y=0; y<nRows; y++) - { - MODCOMMAND *psrc = sndFile.Patterns[nPattern] + (y * 2 * nChns); - MODCOMMAND *pdest = sndFile.Patterns[nPattern] + (y * nChns); - for (UINT x=0; x<nChns; x++) - { - pdest[x] = psrc[x]; - if ((!pdest[x].note) && (!pdest[x].instr)) - { - pdest[x].note = psrc[x+nChns].note; - pdest[x].instr = psrc[x+nChns].instr; - if (psrc[x+nChns].volcmd) - { - pdest[x].volcmd = psrc[x+nChns].volcmd; - pdest[x].vol = psrc[x+nChns].vol; - } - if (!pdest[x].command) - { - pdest[x].command = psrc[x+nChns].command; - pdest[x].param = psrc[x+nChns].param; - } - } - } - } - m_Rows = nRows; - rModDoc.SetModified(); - rModDoc.UpdateAllViews(NULL, HINT_PATTERNDATA | (nPattern << HINT_SHIFT_PAT), NULL); - rModDoc.EndWaitCursor(); - return false; -} - - - -bool CPattern::WriteITPdata(FILE* f) const -//---------------------------------------- -{ - for(ROWINDEX r = 0; r<GetNumRows(); r++) - { - for(CHANNELINDEX c = 0; c<GetNumChannels(); c++) - { - MODCOMMAND mc = GetModCommand(r,c); - fwrite(&mc, sizeof(MODCOMMAND), 1, f); - } - } - return false; -} - -bool CPattern::ReadITPdata(const BYTE* const lpStream, DWORD& streamPos, const DWORD datasize, const DWORD dwMemLength) -//----------------------------------------------------------------------------------------------- -{ - if(streamPos > dwMemLength || datasize >= dwMemLength - streamPos || datasize < sizeof(MODCOMMAND_ORIGINAL)) - return true; - - const DWORD startPos = streamPos; - ROWINDEX counter = 0; - while(streamPos - startPos + sizeof(MODCOMMAND_ORIGINAL) <= datasize) - { - MODCOMMAND_ORIGINAL temp; - memcpy(&temp, lpStream+streamPos, sizeof(MODCOMMAND_ORIGINAL)); - MODCOMMAND& mc = GetModCommand(counter); - mc.command = temp.command; - mc.instr = temp.instr; - mc.note = temp.note; - mc.param = temp.param; - mc.vol = temp.vol; - mc.volcmd = temp.volcmd; - streamPos += sizeof(MODCOMMAND_ORIGINAL); - counter++; - } - if(streamPos != startPos + datasize) - { - ASSERT(false); - return true; - } - else - return false; -} - Deleted: trunk/OpenMPT/mptrack/pattern.h =================================================================== --- trunk/OpenMPT/mptrack/pattern.h 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/pattern.h 2009-06-24 19:39:33 UTC (rev 276) @@ -1,91 +0,0 @@ -#ifndef PATTERN_H -#define PATTERN_H - -#include <vector> -#include "modcommand.h" - -using std::vector; - -class CPatternContainer; - -typedef MODCOMMAND* PatternRow; - - -//============ -class CPattern -//============ -{ - friend class CPatternContainer; - -public: -//BEGIN: OPERATORS - //To mimic MODCOMMAND* - operator MODCOMMAND*() {return m_ModCommands;} - operator const MODCOMMAND*() const {return m_ModCommands;} - CPattern& operator=(MODCOMMAND* const p) {m_ModCommands = p; return *this;} - CPattern& operator=(const CPattern& pat) - { - m_ModCommands = pat.m_ModCommands; - m_Rows = pat.m_Rows; - return *this; - } -//END: OPERATORS - -//BEGIN: INTERFACE METHODS -public: - MODCOMMAND* GetpModCommand(const ROWINDEX r, const CHANNELINDEX c) {return &m_ModCommands[r*GetNumChannels()+c];} - const MODCOMMAND* GetpModCommand(const ROWINDEX r, const CHANNELINDEX c) const {return &m_ModCommands[r*GetNumChannels()+c];} - - ROWINDEX GetNumRows() const {return m_Rows;} - - // Return true if modcommand can be accessed from given row, false otherwise. - bool IsValidRow(const ROWINDEX iRow) const {return (iRow < GetNumRows());} - - // Return PatternRow object which has operator[] defined so that MODCOMMAND - // at (iRow, iChn) can be accessed with GetRow(iRow)[iChn]. - PatternRow GetRow(const ROWINDEX iRow) {return GetpModCommand(iRow, 0);} - - CHANNELINDEX GetNumChannels() const; - - bool Resize(const ROWINDEX newRowCount, const bool showDataLossWarning = true); - - bool ClearData(); - - bool SetData(MODCOMMAND* p, const ROWINDEX rows) {m_ModCommands = p; m_Rows = rows; return false;} - - bool Expand(); - - bool Shrink(); - - bool WriteITPdata(FILE* f) const; - bool ReadITPdata(const BYTE* const lpStream, DWORD& streamPos, const DWORD datasize, const DWORD dwMemLength); - //Parameters: - //1. Pointer to the beginning of the stream - //2. Tells where to start(lpStream+streamPos) and number of bytes read is added to it. - //3. How many bytes to read - //4. Length of the stream. - //Returns true on error. - -//END: INTERFACE METHODS - - CPattern(CPatternContainer& patCont) : m_ModCommands(0), m_Rows(64), m_rPatternContainer(patCont) {} - -private: - MODCOMMAND& GetModCommand(ROWINDEX i) {return m_ModCommands[i];} - //Returns modcommand from (floor[i/channelCount], i%channelCount) - - MODCOMMAND& GetModCommand(ROWINDEX r, CHANNELINDEX c) {return m_ModCommands[r*GetNumChannels()+c];} - const MODCOMMAND& GetModCommand(ROWINDEX r, CHANNELINDEX c) const {return m_ModCommands[r*GetNumChannels()+c];} - - -//BEGIN: DATA -private: - MODCOMMAND* m_ModCommands; - ROWINDEX m_Rows; - CPatternContainer& m_rPatternContainer; -//END: DATA -}; - - - -#endif Deleted: trunk/OpenMPT/mptrack/patternContainer.cpp =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.cpp 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/patternContainer.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -1,100 +0,0 @@ -#include "stdafx.h" -#include "patternContainer.h" -#include "sndfile.h" -#include "mainfrm.h" - -int CPatternContainer::Insert(const ROWINDEX rows) -//--------------------------------------------- -{ - PATTERNINDEX i = 0; - for(i = 0; i<m_Patterns.size(); i++) - if(!m_Patterns[i]) break; - if(Insert(i, rows)) - return -1; - else return i; - -} - - -bool CPatternContainer::Insert(const PATTERNINDEX index, const ROWINDEX rows) -//--------------------------------------------------------------- -{ - const CModSpecifications& specs = m_rSndFile.GetModSpecifications(); - if(index >= specs.patternsMax || index > m_Patterns.size() || rows > specs.patternRowsMax) - return true; - if(index < m_Patterns.size() && m_Patterns[index]) - return true; - - if(index == m_Patterns.size()) - { - if(index < specs.patternsMax) - m_Patterns.push_back(MODPATTERN(*this)); - else - { - ErrorBox(IDS_ERR_TOOMANYPAT, CMainFrame::GetMainFrame()); - return true; - } - } - - m_Patterns[index] = CSoundFile::AllocatePattern(rows, m_rSndFile.m_nChannels); - m_Patterns[index].m_Rows = rows; - - if(!m_Patterns[index]) return true; - - return false; -} - -bool CPatternContainer::Remove(const PATTERNINDEX ipat) -//---------------------------------------------- -{ - if(ipat >= m_Patterns.size()) - return true; - - return m_Patterns[ipat].ClearData(); -} - -PATTERNINDEX CPatternContainer::GetIndex(const MODPATTERN* const pPat) const -//------------------------------------------------------------------ -{ - const PATTERNINDEX endI = static_cast<PATTERNINDEX>(m_Patterns.size()); - for(PATTERNINDEX i = 0; i<endI; i++) - if(&m_Patterns[i] == pPat) return i; - - return endI; -} - - -void CPatternContainer::ResizeArray(const PATTERNINDEX newSize) -//------------------------------------------------------------- -{ - if(Size() <= newSize) - m_Patterns.resize(newSize, MODPATTERN(*this)); - else - { - for(PATTERNINDEX i = Size(); i > newSize; i--) Remove(i-1); - m_Patterns.resize(newSize, MODPATTERN(*this)); - } -} - - -void CPatternContainer::OnModTypeChanged(const MODTYPE /*oldtype*/) -//---------------------------------------------------------- -{ - const CModSpecifications specs = m_rSndFile.GetModSpecifications(); - if(specs.patternsMax < Size()) ResizeArray(max(MAX_PATTERNS, specs.patternsMax)); - else if(Size() < MAX_PATTERNS) ResizeArray(MAX_PATTERNS); -} - - -void CPatternContainer::Init() -//---------------------------- -{ - for(PATTERNINDEX i = 0; i < Size(); i++) - { - Remove(i); - } - - ResizeArray(MAX_PATTERNS); -} - - Deleted: trunk/OpenMPT/mptrack/patternContainer.h =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.h 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/mptrack/patternContainer.h 2009-06-24 19:39:33 UTC (rev 276) @@ -1,77 +0,0 @@ -#ifdef __SNDFILE_H - -#ifndef PATTERNCONTAINER_H -#define PATTERNCONTAINER_H - -#include "pattern.h" -#include <limits> - -class CSoundFile; -typedef CPattern MODPATTERN; - -//===================== -class CPatternContainer -//===================== -{ -//BEGIN: TYPEDEFS -public: - typedef vector<MODPATTERN> PATTERNVECTOR; -//END: TYPEDEFS - - -//BEGIN: OPERATORS -public: - //To mimic old pattern == MODCOMMAND* behavior. - MODPATTERN& operator[](const int pat) {return m_Patterns[pat];} - const MODPATTERN& operator[](const int pat) const {return m_Patterns[pat];} -//END: OPERATORS - -//BEGIN: INTERFACE METHODS -public: - CPatternContainer(CSoundFile& sndFile) : m_rSndFile(sndFile) {m_Patterns.assign(MAX_PATTERNS, MODPATTERN(*this));} - - // Clears existing patterns and resizes array to default size. - void Init(); - - //Note: No memory handling here. - void ClearPatterns() {m_Patterns.assign(m_Patterns.size(), MODPATTERN(*this));} - - //Insert (default)pattern to given position. If pattern already exists at that position, - //ignoring request. - bool Insert(const PATTERNINDEX index, const ROWINDEX rows); - - //Insert pattern to position with the lowest index, and return that index, -1 - //on failure. - int Insert(const ROWINDEX rows); - - //Remove pattern from given position. Currently it actually makes the pattern - //'invisible' - the pattern data is cleared but the actual pattern object won't get removed. - bool Remove(const PATTERNINDEX index); - - PATTERNINDEX Size() const {return static_cast<PATTERNINDEX>(m_Patterns.size());} - - CSoundFile& GetSoundFile() {return m_rSndFile;} - - //Returns the index of given pattern, Size() if not found. - PATTERNINDEX GetIndex(const MODPATTERN* const pPat) const; - - // Return true if pattern can be accessed with operator[](iPat), false otherwise. - bool IsValidIndex(const PATTERNINDEX iPat) const {return (iPat < Size());} - - void ResizeArray(const PATTERNINDEX newSize); - - void OnModTypeChanged(const MODTYPE oldtype); - -//END: INTERFACE METHODS - - -//BEGIN: DATA MEMBERS -private: - PATTERNVECTOR m_Patterns; - CSoundFile& m_rSndFile; -//END: DATA MEMBERS - -}; - -#endif -#endif Copied: trunk/OpenMPT/soundlib/OrderToPatternTable.cpp (from rev 271, trunk/OpenMPT/mptrack/OrderToPatternTable.cpp) =================================================================== --- trunk/OpenMPT/soundlib/OrderToPatternTable.cpp (rev 0) +++ trunk/OpenMPT/soundlib/OrderToPatternTable.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,228 @@ +#include "stdafx.h" +#include "sndfile.h" +#include "ordertopatterntable.h" + +#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.")))) + +DWORD COrderToPatternTable::Unserialize(const BYTE* const src, const DWORD memLength) +//------------------------------------------------------------------------- +{ + if(memLength < 2 + 4) return 0; + uint16 version = 0; + uint32 s = 0; + DWORD memPos = 0; + memcpy(&version, src, sizeof(version)); + memPos += sizeof(version); + if(version != 0) return memPos; + memcpy(&s, src+memPos, sizeof(s)); + memPos += sizeof(s); + if(s > 65000) return true; + if(memLength < memPos+s*4) return memPos; + + const uint32 nOriginalSize = s; + if(s > MPTM_SPECS.ordersMax) + s = MPTM_SPECS.ordersMax; + + resize(s); + for(size_t i = 0; i<s; i++, memPos +=4 ) + { + uint32 temp; + memcpy(&temp, src+memPos, 4); + (*this)[i] = static_cast<PATTERNINDEX>(temp); + } + memPos += 4*(nOriginalSize - s); + return memPos; +} + + +size_t COrderToPatternTable::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize) +//----------------------------------------------------------------------------- +{ + if(numOfBytes > destSize) return true; + if(size() < numOfBytes) resize(numOfBytes, 0xFF); + UINT i = 0; + for(i = 0; i<numOfBytes; i++) + { + dest[i] = static_cast<BYTE>((*this)[i]); + } + return i; //Returns the number of bytes written. +} + + +size_t COrderToPatternTable::WriteAsByte(FILE* f, const UINT count) +//--------------------------------------------------------------- +{ + if(size() < count) resize(count, GetInvalidPatIndex()); + + size_t i = 0; + + for(i = 0; i<count; i++) + { + const PATTERNINDEX pat = (*this)[i]; + BYTE temp = static_cast<BYTE>((*this)[i]); + + if(pat > 0xFD) + { + if(pat == GetInvalidPatIndex()) temp = 0xFF; + else temp = 0xFE; + } + fwrite(&temp, 1, 1, f); + } + return i; //Returns the number of bytes written. +} + +bool COrderToPatternTable::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength) +//------------------------------------------------------------------------- +{ + if(howMany < 0 || howMany > memLength) return true; + if(m_rSndFile.GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true; + + if(size() < static_cast<size_t>(howMany)) + resize(howMany, GetInvalidPatIndex()); + + for(int i = 0; i<howMany; i++, pFrom++) + (*this)[i] = *pFrom; + return false; +} + + +bool COrderToPatternTable::NeedsExtraDatafield() const +//---------------------------------------------- +{ + if(m_rSndFile.GetType() == MOD_TYPE_MPT && m_rSndFile.Patterns.Size() > 0xFD) + return true; + else + return false; +} + + +void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype) +//---------------------------------------------------------------- +{ + const CModSpecifications specs = m_rSndFile.GetModSpecifications(); + + //Resize orderlist if needed. Because old orderlist had MAX_ORDERS(256) elements, not making it + //smaller than that even if the modtype doesn't support that many orders. + if(specs.ordersMax < GetCount()) + { + resize(max(MAX_ORDERS, specs.ordersMax)); + for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex(); + } + + //Replace items used to denote end of song/skip order. + replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex()); + replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex()); +} + + +ORDERINDEX COrderToPatternTable::GetLengthTailTrimmed() const +//----------------------------------------------------------- +{ + ORDERINDEX nEnd = GetCount(); + if(nEnd == 0) return 0; + nEnd--; + const PATTERNINDEX iInvalid = GetInvalidPatIndex(); + while(nEnd > 0 && (*this)[nEnd] == iInvalid) + nEnd--; + return ((*this)[nEnd] == iInvalid) ? 0 : nEnd+1; +} + + +ORDERINDEX COrderToPatternTable::GetLengthFirstEmpty() const +//---------------------------------------------------------- +{ + const ORDERINDEX nLength = GetCount(); + ORDERINDEX nMax = 0; + while ((nMax < nLength) && ((*this)[nMax] != (*this).GetInvalidPatIndex())) nMax++; + return nMax; +} + + +ORDERINDEX COrderToPatternTable::GetNextOrderIgnoringSkips(const ORDERINDEX start) const +//------------------------------------------------------------------------------------- +{ + const ORDERINDEX count = GetCount(); + if(count == 0) return 0; + ORDERINDEX next = min(count-1, start+1); + while(next+1 < count && (*this)[next] == GetIgnoreIndex()) next++; + return next; +} + +ORDERINDEX COrderToPatternTable::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const +//------------------------------------------------------------------------------------- +{ + const ORDERINDEX count = GetCount(); + if(start == 0 || count == 0) return 0; + ORDERINDEX prev = min(start-1, count-1); + while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--; + return prev; +} + + +void COrderToPatternTable::Init() +//------------------------------- +{ + resize(MAX_ORDERS, GetInvalidPatIndex()); + for(ORDERINDEX i = 0; i < GetCount(); i++) + { + (*this)[i] = GetInvalidPatIndex(); + } +} + + + +PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;} +PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;} + +PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return GetInvalidPatIndex(m_rSndFile.GetType());} +PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return GetIgnoreIndex(m_rSndFile.GetType());} + + + + +//-------------------------------------------------- +//-------------------------------------------------- +//-------------------------------------------------- + +using namespace srlztn; + +void COrderSerialization::ProWrite(OUTSTREAM& ostrm) const +//-------------------------------------------------------- +{ + uint16 size = static_cast<uint16>(m_rOrders.size()); + ostrm.write(reinterpret_cast<const char*>(&size), 2); + const COrderToPatternTable::const_iterator endIter = m_rOrders.end(); + for(COrderToPatternTable::const_iterator citer = m_rOrders.begin(); citer != endIter; citer++) + { + const uint16 temp = static_cast<uint16>(*citer); + ostrm.write(reinterpret_cast<const char*>(&temp), 2); + } +} + + +void COrderSerialization::ProRead(INSTREAM& istrm, const uint64 /*datasize*/) +//--------------------------------------------------------------------------- +{ + uint16 size; + istrm.read(reinterpret_cast<char*>(&size), 2); + if(size > MPTM_SPECS.ordersMax) + { + // Hack: Show message here if trying to load longer sequence than what is supported. + CString str; str.Format(str_SequenceTruncationNote, size, MPTM_SPECS.ordersMax); + ::MessageBox(0, str, "", MB_ICONWARNING); + size = MPTM_SPECS.ordersMax; + } + m_rOrders.resize(size); + if(size == 0) {m_rOrders.assign(MAX_ORDERS, m_rOrders.GetInvalidPatIndex()); return;} + + const COrderToPatternTable::const_iterator endIter = m_rOrders.end(); + for(COrderToPatternTable::iterator iter = m_rOrders.begin(); iter != endIter; iter++) + { + uint16 temp; + istrm.read(reinterpret_cast<char*>(&temp), 2); + *iter = temp; + } +} + + + Copied: trunk/OpenMPT/soundlib/OrderToPatternTable.h (from rev 271, trunk/OpenMPT/mptrack/OrderToPatternTable.h) =================================================================== --- trunk/OpenMPT/soundlib/OrderToPatternTable.h (rev 0) +++ trunk/OpenMPT/soundlib/OrderToPatternTable.h 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,77 @@ +#ifndef ORDERTOPATTERNTABLE_H +#define ORDERTOPATTERNTABLE_H + +#include "../mptrack/serialization_utils.h" +#include <vector> +using std::vector; + +class CSoundFile; +class COrderToPatternTable; + +#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data + +class COrderSerialization : public srlztn::ABCSerializationStreamer +//========================================================= +{ +public: + COrderSerialization(COrderToPatternTable& ordertable) : m_rOrders(ordertable) {} + virtual void ProWrite(srlztn::OUTSTREAM& ostrm) const; + virtual void ProRead(srlztn::INSTREAM& istrm, const uint64 /*datasize*/); +private: + COrderToPatternTable& m_rOrders; +}; + +//============================================== +class COrderToPatternTable : public vector<PATTERNINDEX> +//============================================== +{ +public: + COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {} + + // Initialize default sized sequence. + void Init(); + + bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength); + + size_t WriteAsByte(FILE* f, const UINT count); + + size_t WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize); + + ORDERINDEX GetCount() const {return size();} + + //Deprecated function used for MPTm's created in 1.17.02.46 - 1.17.02.48. + DWORD Unserialize(const BYTE* const src, const DWORD memLength); + + //Returns true if the IT orderlist datafield is not sufficient to store orderlist information. + bool NeedsExtraDatafield() const; + + void OnModTypeChanged(const MODTYPE oldtype); + + // Returns length of sequence without counting trailing '---' items. + ORDERINDEX GetLengthTailTrimmed() const; + + // Returns length of sequence stopping counting on first '---' (or at the end of sequence). + ORDERINDEX GetLengthFirstEmpty() const; + + PATTERNINDEX GetInvalidPatIndex() const; //To correspond 0xFF + static PATTERNINDEX GetInvalidPatIndex(const MODTYPE type); + + PATTERNINDEX GetIgnoreIndex() const; //To correspond 0xFE + static PATTERNINDEX GetIgnoreIndex(const MODTYPE type); + + //Returns the previous/next order ignoring skip indeces(+++). + //If no previous/next order exists, return first/last order, and zero + //when orderlist is empty. + ORDERINDEX GetNextOrderIgnoringSkips(const ORDERINDEX start) const; + ORDERINDEX GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const; + + COrderSerialization* NewReadWriteObject() {return new COrderSerialization(*this);} + +private: + const CSoundFile& m_rSndFile; +}; + +#pragma warning(default:4244) + +#endif + Copied: trunk/OpenMPT/soundlib/PlaybackEventer.cpp (from rev 217, trunk/OpenMPT/mptrack/PlaybackEventer.cpp) =================================================================== --- trunk/OpenMPT/soundlib/PlaybackEventer.cpp (rev 0) +++ trunk/OpenMPT/soundlib/PlaybackEventer.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "PlaybackEventer.h" +#include "sndfile.h" + +CPlaybackEventer::~CPlaybackEventer() +//--------------------------------- +{ +} + +void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) +//------------------------------------------------------------------------- +{ + if(chnIndex >= m_rSndFile.m_nChannels) + return; + + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? false : true; + } + m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = (m_rSndFile.ChnSettings[chnIndex].dwFlags & CHN_MUTE) ? true : false; +} + + +void CPlaybackEventer::PatternTransitionChnUnmuteAll() +//---------------------------------------------------- +{ + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? true : false; + } +} \ No newline at end of file Copied: trunk/OpenMPT/soundlib/PlaybackEventer.h (from rev 217, trunk/OpenMPT/mptrack/PlaybackEventer.h) =================================================================== --- trunk/OpenMPT/soundlib/PlaybackEventer.h (rev 0) +++ trunk/OpenMPT/soundlib/PlaybackEventer.h 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,25 @@ +#ifndef PLAYBACKEVENTER_H +#define PLAYBACKEVENTER_H + +#include "pattern.h" + +class CSoundFile; + +//==================== +class CPlaybackEventer +//==================== +{ +public: + CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {} + ~CPlaybackEventer(); + + //SetPatternEvent(const PATTERNINDEX pattern, const ROWINDEX row, const CHANNELINDEX column); + + void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); + void PatternTransitionChnUnmuteAll(); + +private: + CSoundFile& m_rSndFile; +}; + +#endif Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-06-24 15:54:18 UTC (rev 275) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-06-24 19:39:33 UTC (rev 276) @@ -805,11 +805,11 @@ typedef VOID (__cdecl * LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels -#include "../mptrack/pattern.h" -#include "../mptrack/patternContainer.h" -#include "../mptrack/ordertopatterntable.h" +#include "pattern.h" +#include "patternContainer.h" +#include "ordertopatterntable.h" -#include "../mptrack/playbackEventer.h" +#include "playbackEventer.h" Copied: trunk/OpenMPT/soundlib/pattern.cpp (from rev 217, trunk/OpenMPT/mptrack/pattern.cpp) =================================================================== --- trunk/OpenMPT/soundlib/pattern.cpp (rev 0) +++ trunk/OpenMPT/soundlib/pattern.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,232 @@ +#include "stdafx.h" +#include "pattern.h" +#include "patternContainer.h" +#include "../mptrack/mainfrm.h" +#include "../mptrack/moddoc.h" + + +CHANNELINDEX CPattern::GetNumChannels() const +//------------------------------------------- +{ + return m_rPatternContainer.GetSoundFile().GetNumChannels(); +} + +bool CPattern::Resize(const ROWINDEX newRowCount, const bool showDataLossWarning) +//------------------------------------------- +{ + if(m_ModCommands == NULL) + { + //For Mimicing old behavior of setting patternsize before even having the + //actual pattern allocated. + m_Rows = newRowCount; + return false; + } + + + CSoundFile& sndFile = m_rPatternContainer.GetSoundFile(); + const CModSpecifications& specs = sndFile.GetModSpecifications(); + if(sndFile.m_pModDoc == NULL) return true; + CModDoc& rModDoc = *sndFile.m_pModDoc; + if(newRowCount > specs.patternRowsMax || newRowCount < specs.patternRowsMin) + return true; + + if (newRowCount == m_Rows) return false; + rModDoc.BeginWaitCursor(); + BEGIN_CRITICAL(); + if (newRowCount > m_Rows) + { + MODCOMMAND *p = CSoundFile::AllocatePattern(newRowCount, sndFile.m_nChannels); + if (p) + { + memcpy(p, m_ModCommands, sndFile.m_nChannels*m_Rows*sizeof(MODCOMMAND)); + CSoundFile::FreePattern(m_ModCommands); + m_ModCommands = p; + m_Rows = newRowCount; + } + } else + { + BOOL bOk = TRUE; + MODCOMMAND *p = m_ModCommands; + UINT ndif = (m_Rows - newRowCount) * sndFile.m_nChannels; + UINT npos = newRowCount * sndFile.m_nChannels; + if(showDataLossWarning) + { + for (UINT i=0; i<ndif; i++) + { + if (*((DWORD *)(p+i+npos))) + { + bOk = FALSE; + break; + } + } + if (!bOk && showDataLossWarning) + { + END_CRITICAL(); + rModDoc.EndWaitCursor(); + if (CMainFrame::GetMainFrame()->MessageBox("Data at the end of the pattern will be lost.\nDo you want to continue", + "Shrink Pattern", MB_YESNO|MB_ICONQUESTION) == IDYES) bOk = TRUE; + rModDoc.BeginWaitCursor(); + BEGIN_CRITICAL(); + } + } + if (bOk) + { + MODCOMMAND *pnew = CSoundFile::AllocatePattern(newRowCount, sndFile.m_nChannels); + if (pnew) + { + memcpy(pnew, m_ModCommands, sndFile.m_nChannels*newRowCount*sizeof(MODCOMMAND)); + CSoundFile::FreePattern(m_ModCommands); + m_ModCommands = pnew; + m_Rows = newRowCount; + } + } + } + END_CRITICAL(); + rModDoc.EndWaitCursor(); + rModDoc.SetModified(); + return (newRowCount == m_Rows) ? false : true; +} + + +bool CPattern::ClearData() +//------------------------ +{ + BEGIN_CRITICAL(); + m_Rows = 0; + CSoundFile::FreePattern(m_ModCommands); + m_ModCommands = NULL; + END_CRITICAL(); + return false; +} + +bool CPattern::Expand() +//--------------------- +{ + MODCOMMAND *newPattern, *oldPattern; + UINT nRows, nChns; + + CSoundFile& sndFile = m_rPatternContainer.GetSoundFile(); + if(sndFile.m_pModDoc == NULL) return true; + + CModDoc& rModDoc = *sndFile.m_pModDoc; + + if ((!m_ModCommands) || (m_Rows > sndFile.GetModSpecifications().patternRowsMax / 2)) return true; + + rModDoc.BeginWaitCursor(); + nRows = m_Rows; + nChns = sndFile.m_nChannels; + newPattern = CSoundFile::AllocatePattern(nRows*2, nChns); + if (!newPattern) return true; + + const UINT nPattern = m_rPatternContainer.GetIndex(this); + rModDoc.PrepareUndo(nPattern, 0,0, nChns, nRows); + oldPattern = m_ModCommands; + for (UINT y=0; y<nRows; y++) + { + memcpy(newPattern+y*2*nChns, oldPattern+y*nChns, nChns*sizeof(MODCOMMAND)); + } + m_ModCommands = newPattern; + m_Rows = nRows * 2; + CSoundFile::FreePattern(oldPattern); oldPattern= NULL; + rModDoc.SetModified(); + rModDoc.UpdateAllViews(NULL, HINT_PATTERNDATA | (nPattern << HINT_SHIFT_PAT), NULL); + rModDoc.EndWaitCursor(); + return false; +} + +bool CPattern::Shrink() +//--------------------- +{ + UINT nRows, nChns; + + if (!m_ModCommands || m_Rows < 32) return true; + + CSoundFile& sndFile = m_rPatternContainer.GetSoundFile(); + if(sndFile.m_pModDoc == NULL) return true; + + CModDoc& rModDoc = *sndFile.m_pModDoc; + + rModDoc.BeginWaitCursor(); + nRows = m_Rows; + nChns = sndFile.m_nChannels; + const UINT nPattern = m_rPatternContainer.GetIndex(this); + rModDoc.PrepareUndo(nPattern, 0,0, nChns, nRows); + nRows /= 2; + for (UINT y=0; y<nRows; y++) + { + MODCOMMAND *psrc = sndFile.Patterns[nPattern] + (y * 2 * nChns); + MODCOMMAND *pdest = sndFile.Patterns[nPattern] + (y * nChns); + for (UINT x=0; x<nChns; x++) + { + pdest[x] = psrc[x]; + if ((!pdest[x].note) && (!pdest[x].instr)) + { + pdest[x].note = psrc[x+nChns].note; + pdest[x].instr = psrc[x+nChns].instr; + if (psrc[x+nChns].volcmd) + { + pdest[x].volcmd = psrc[x+nChns].volcmd; + pdest[x].vol = psrc[x+nChns].vol; + } + if (!pdest[x].command) + { + pdest[x].command = psrc[x+nChns].command; + pdest[x].param = psrc[x+nChns].param; + } + } + } + } + m_Rows = nRows; + rModDoc.SetModified(); + rModDoc.UpdateAllViews(NULL, HINT_PATTERNDATA | (nPattern << HINT_SHIFT_PAT), NULL); + rModDoc.EndWaitCursor(); + return false; +} + + + +bool CPattern::WriteITPdata(FILE* f) const +//---------------------------------------- +{ + for(ROWINDEX r = 0; r<GetNumRows(); r++) + { + for(CHANNELINDEX c = 0; c<GetNumChannels(); c++) + { + MODCOMMAND mc = GetModCommand(r,c); + fwrite(&mc, sizeof(MODCOMMAND), 1, f); + } + } + return false; +} + +bool CPattern::ReadITPdata(const BYTE* const lpStream, DWORD& streamPos, const DWORD datasize, const DWORD dwMemLength) +//----------------------------------------------------------------------------------------------- +{ + if(streamPos > dwMemLength || datasize >= dwMemLength - streamPos || datasize < sizeof(MODCOMMAND_ORIGINAL)) + return true; + + const DWORD startPos = streamPos; + ROWINDEX counter = 0; + while(streamPos - startPos + sizeof(MODCOMMAND_ORIGINAL) <= datasize) + { + MODCOMMAND_ORIGINAL temp; + memcpy(&temp, lpStream+streamPos, sizeof(MODCOMMAND_ORIGINAL)); + MODCOMMAND& mc = GetModCommand(counter); + mc.command = temp.command; + mc.instr = temp.instr; + mc.note = temp.note; + mc.param = temp.param; + mc.vol = temp.vol; + mc.volcmd = temp.volcmd; + streamPos += sizeof(MODCOMMAND_ORIGINAL); + counter++; + } + if(streamPos != startPos + datasize) + { + ASSERT(false); + return true; + } + else + return false; +} + Copied: trunk/OpenMPT/soundlib/pattern.h (from rev 244, trunk/OpenMPT/mptrack/pattern.h) =================================================================== --- trunk/OpenMPT/soundlib/pattern.h (rev 0) +++ trunk/OpenMPT/soundlib/pattern.h 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,91 @@ +#ifndef PATTERN_H +#define PATTERN_H + +#include <vector> +#include "modcommand.h" + +using std::vector; + +class CPatternContainer; + +typedef MODCOMMAND* PatternRow; + + +//============ +class CPattern +//============ +{ + friend class CPatternContainer; + +public: +//BEGIN: OPERATORS + //To mimic MODCOMMAND* + operator MODCOMMAND*() {return m_ModCommands;} + operator const MODCOMMAND*() const {return m_ModCommands;} + CPattern& operator=(MODCOMMAND* const p) {m_ModCommands = p; return *this;} + CPattern& operator=(const CPattern& pat) + { + m_ModCommands = pat.m_ModCommands; + m_Rows = pat.m_Rows; + return *this; + } +//END: OPERATORS + +//BEGIN: INTERFACE METHODS +public: + MODCOMMAND* GetpModCommand(const ROWINDEX r, const CHANNELINDEX c) {return &m_ModCommands[r*GetNumChannels()+c];} + const MODCOMMAND* GetpModCommand(const ROWINDEX r, const CHANNELINDEX c) const {return &m_ModCommands[r*GetNumChannels()+c];} + + ROWINDEX GetNumRows() const {return m_Rows;} + + // Return true if modcommand can be accessed from given row, false otherwise. + bool IsValidRow(const ROWINDEX iRow) const {return (iRow < GetNumRows());} + + // Return PatternRow object which has operator[] defined so that MODCOMMAND + // at (iRow, iChn) can be accessed with GetRow(iRow)[iChn]. + PatternRow GetRow(const ROWINDEX iRow) {return GetpModCommand(iRow, 0);} + + CHANNELINDEX GetNumChannels() const; + + bool Resize(const ROWINDEX newRowCount, const bool showDataLossWarning = true); + + bool ClearData(); + + bool SetData(MODCOMMAND* p, const ROWINDEX rows) {m_ModCommands = p; m_Rows = rows; return false;} + + bool Expand(); + + bool Shrink(); + + bool WriteITPdata(FILE* f) const; + bool ReadITPdata(const BYTE* const lpStream, DWORD& streamPos, const DWORD datasize, const DWORD dwMemLength); + //Parameters: + //1. Pointer to the beginning of the stream + //2. Tells where to start(lpStream+streamPos) and number of bytes read is added to it. + //3. How many bytes to read + //4. Length of the stream. + //Returns true on error. + +//END: INTERFACE METHODS + + CPattern(CPatternContainer& patCont) : m_ModCommands(0), m_Rows(64), m_rPatternContainer(patCont) {} + +private: + MODCOMMAND& GetModCommand(ROWINDEX i) {return m_ModCommands[i];} + //Returns modcommand from (floor[i/channelCount], i%channelCount) + + MODCOMMAND& GetModCommand(ROWINDEX r, CHANNELINDEX c) {return m_ModCommands[r*GetNumChannels()+c];} + const MODCOMMAND& GetModCommand(ROWINDEX r, CHANNELINDEX c) const {return m_ModCommands[r*GetNumChannels()+c];} + + +//BEGIN: DATA +private: + MODCOMMAND* m_ModCommands; + ROWINDEX m_Rows; + CPatternContainer& m_rPatternContainer; +//END: DATA +}; + + + +#endif Copied: trunk/OpenMPT/soundlib/patternContainer.cpp (from rev 271, trunk/OpenMPT/mptrack/patternContainer.cpp) =================================================================== --- trunk/OpenMPT/soundlib/patternContainer.cpp (rev 0) +++ trunk/OpenMPT/soundlib/patternContainer.cpp 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,100 @@ +#include "stdafx.h" +#include "patternContainer.h" +#include "sndfile.h" +#include "../mptrack/mainfrm.h" + +int CPatternContainer::Insert(const ROWINDEX rows) +//--------------------------------------------- +{ + PATTERNINDEX i = 0; + for(i = 0; i<m_Patterns.size(); i++) + if(!m_Patterns[i]) break; + if(Insert(i, rows)) + return -1; + else return i; + +} + + +bool CPatternContainer::Insert(const PATTERNINDEX index, const ROWINDEX rows) +//--------------------------------------------------------------- +{ + const CModSpecifications& specs = m_rSndFile.GetModSpecifications(); + if(index >= specs.patternsMax || index > m_Patterns.size() || rows > specs.patternRowsMax) + return true; + if(index < m_Patterns.size() && m_Patterns[index]) + return true; + + if(index == m_Patterns.size()) + { + if(index < specs.patternsMax) + m_Patterns.push_back(MODPATTERN(*this)); + else + { + ErrorBox(IDS_ERR_TOOMANYPAT, CMainFrame::GetMainFrame()); + return true; + } + } + + m_Patterns[index] = CSoundFile::AllocatePattern(rows, m_rSndFile.m_nChannels); + m_Patterns[index].m_Rows = rows; + + if(!m_Patterns[index]) return true; + + return false; +} + +bool CPatternContainer::Remove(const PATTERNINDEX ipat) +//---------------------------------------------- +{ + if(ipat >= m_Patterns.size()) + return true; + + return m_Patterns[ipat].ClearData(); +} + +PATTERNINDEX CPatternContainer::GetIndex(const MODPATTERN* const pPat) const +//------------------------------------------------------------------ +{ + const PATTERNINDEX endI = static_cast<PATTERNINDEX>(m_Patterns.size()); + for(PATTERNINDEX i = 0; i<endI; i++) + if(&m_Patterns[i] == pPat) return i; + + return endI; +} + + +void CPatternContainer::ResizeArray(const PATTERNINDEX newSize) +//------------------------------------------------------------- +{ + if(Size() <= newSize) + m_Patterns.resize(newSize, MODPATTERN(*this)); + else + { + for(PATTERNINDEX i = Size(); i > newSize; i--) Remove(i-1); + m_Patterns.resize(newSize, MODPATTERN(*this)); + } +} + + +void CPatternContainer::OnModTypeChanged(const MODTYPE /*oldtype*/) +//---------------------------------------------------------- +{ + const CModSpecifications specs = m_rSndFile.GetModSpecifications(); + if(specs.patternsMax < Size()) ResizeArray(max(MAX_PATTERNS, specs.patternsMax)); + else if(Size() < MAX_PATTERNS) ResizeArray(MAX_PATTERNS); +} + + +void CPatternContainer::Init() +//---------------------------- +{ + for(PATTERNINDEX i = 0; i < Size(); i++) + { + Remove(i); + } + + ResizeArray(MAX_PATTERNS); +} + + Copied: trunk/OpenMPT/soundlib/patternContainer.h (from rev 271, trunk/OpenMPT/mptrack/patternContainer.h) =================================================================== --- trunk/OpenMPT/soundlib/patternContainer.h (rev 0) +++ trunk/OpenMPT/soundlib/patternContainer.h 2009-06-24 19:39:33 UTC (rev 276) @@ -0,0 +1,77 @@ +#ifdef __SNDFILE_H + +#ifndef PATTERNCONTAINER_H +#define PATTERNCONTAINER_H + +#include "pattern.h" +#include <limits> + +class CSoundFile; +typedef CPattern MODPATTERN; + +//===================== +class CPatternContainer +//===================== +{ +//BEGIN: TYPEDEFS +public: + typedef vector<MODPATTERN> PATTERNVECTOR; +//END: TYPEDEFS + + +//BEGIN: OPERATORS +public: + //To mimic old pattern == MODCOMMAND* behavior. + MODPATTERN& operator[](const int pat) {return m_Patterns[pat];} + const MODPATTERN& operator[](const int pat) const {return m_Patterns[pat];} +//END: OPERATORS + +//BEGIN: INTERFACE METHODS +public: + CPatternContainer(CSoundFile& sndFile) : m_rSndFile(sndFile) {m_Patterns.assign(MAX_PATTERNS, MODPATTERN(*this));} + + // Clears existing patterns and resizes array to default size. + void Init(); + + //Note: No memory handling here. + void ClearPatterns() {m_Patterns.assign(m_Patterns.size(), MODPATTERN(*this));} + + //Insert (default)pattern to given position. If pattern already exists at that position, + //ignoring request. + bool Insert(const PATTERNINDEX index, const ROWINDEX rows); + + //Insert pattern to position with the lowest index, and return that index, -1 + //on failure. + int Insert(const ROWINDEX rows); + + //Remove pattern from given position. Currently it actually makes the pattern + //'invisible' - the pattern data is cleared but the actual pattern object won't get removed. + bool Remove(const PATTERNINDEX index); + + PATTERNINDEX Size() const {return static_cast<PATTERNINDEX>(m_Patterns.size());} + + CSoundFile& GetSoundFile() {return m_rSndFile;} + + //Returns the index of given pattern, Size() if not found. + PATTERNINDEX GetIndex(const MODPATTERN* const pPat) const; + + // Return true if pattern can be accessed with operator[](iPat), false otherwise. + bool IsValidIndex(const PATTERNINDEX iPat) const {return (iPat < Size());} + + void ResizeArray(const PATTERNINDEX newSize); + + void OnModTypeChanged(const MODTYPE oldtype); + +//END: INTERFACE METHODS + + +//BEGIN: DATA MEMBERS +private: + PATTERNVECTOR m_Patterns; + CSoundFile& m_rSndFile; +//END: DATA MEMBERS + +}; + +#endif +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-06-25 21:53:59
|
Revision: 277 http://modplug.svn.sourceforge.net/modplug/?rev=277&view=rev Author: relabsoluness Date: 2009-06-25 21:53:49 +0000 (Thu, 25 Jun 2009) Log Message: ----------- (merged from devBranch_1_17_03 with some additional modifications) [New] Pattern tab: New experimental parameter controls for controlling plug params(only in mptm). Is more or less fully functional except that the commands won't be saved to file. Includes modifications/additions to: keyshortcuts, various GUI components, pattern draw methods, clipboard handling, pattern editing functions, ProcessEffects(). [Mod] Pattern tab: Added some checks to prevent entering notes which are not supported by the module type. Refactoring -Find/Replace dialog: Added enums for special items. -Disabled keyconfig log messages. -Modification to IMixPlugin for easier parameter control. -Created new note name arrays and functions for populating comboboxes with note names. -Removed constructor from modcommand and instrumentheader. -ProcessMidiOut() now takes modcommand data from modchannel. -Various smaller changes (removed compiler warning etc.) Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/res/view_pat.bmp trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/mptrack/test/test.h trunk/OpenMPT/mptrack/typedefs.h trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/OrderToPatternTable.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/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.h Added Paths: ----------- trunk/OpenMPT/soundlib/mod_specifications.cpp Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -5,6 +5,15 @@ #include <stdio.h> #include <stdlib.h> +#define ENABLE_LOGGING 0 + +#if(ENABLE_LOGGING) + // +#else + #define Log +#endif + + bool CCommandSet::s_bShowErrorOnUnknownKeybinding = true; CCommandSet::CCommandSet(void) @@ -2309,6 +2318,16 @@ commands[kcSwitchEchoPaste].isHidden = false; commands[kcSwitchEchoPaste].isDummy = false; + commands[kcNotePC].UID = 1788; + commands[kcNotePC].isHidden = false; + commands[kcNotePC].isDummy = false; + commands[kcNotePC].Message = "Parameter control(MPTm only)"; + + commands[kcNotePCS].UID = 1789; + commands[kcNotePCS].isHidden = false; + commands[kcNotePCS].isDummy = false; + commands[kcNotePCS].Message = "Parameter control(smooth)(MPTm only)"; + #ifdef _DEBUG for (int i=0; i<kcNumCommands; i++) { if (commands[i].UID != 0) { // ignore unset UIDs @@ -2438,7 +2457,7 @@ { //World's biggest, most confusing method. :) //Needs refactoring. Maybe make lots of Rule subclasses, each with their own Enforce() method? - bool removing = !adding; //for attempt to salvage readability.. + //bool removing = !adding; //for attempt to salvage readability.. KeyCombination curKc; // for looping through key combinations KeyCombination newKc; // for adding new key combinations CString report=""; @@ -2544,7 +2563,7 @@ { KeyCombination newKcDeSel; bool ruleApplies=true; - CommandID cmdOff; + CommandID cmdOff = kcNull; switch (inCmd) { @@ -2942,7 +2961,7 @@ if (IsDummyCommand((CommandID)cmd)) continue; - for (UINT k=0; k<commands[cmd].kcList.GetSize(); k++) + for (INT_PTR k=0; k<commands[cmd].kcList.GetSize(); k++) { contexts.RemoveAll(); eventTypes.RemoveAll(); @@ -2969,7 +2988,7 @@ contexts.Add(curKc.ctx); } - long label = 0; + //long label = 0; for (int cx=0; cx<contexts.GetSize(); cx++) { for (int ke=0; ke<eventTypes.GetSize(); ke++) { km[contexts[cx]][curKc.mod][curKc.code][eventTypes[ke]] = (CommandID)cmd; @@ -2992,7 +3011,7 @@ BYTE ctxCode = (BYTE)ctx; BYTE modCode = (BYTE)mod; BYTE codeCode = (BYTE)code; - BYTE keCode = (BYTE)ke; + //BYTE keCode = (BYTE)ke; DWORD label = ctxCode | (modCode<<8) | (codeCode<<16) | (ke<<24); @@ -3187,7 +3206,7 @@ { for (int i=0; i<kcNumCommands; i++) { - if (commands[i].UID == uid) + if (commands[i].UID == static_cast<UINT>(uid)) return i; } @@ -3270,7 +3289,7 @@ CString CCommandSet::GetKeyTextFromCommand(CommandID c, UINT key) { - if (key < commands[c].kcList.GetSize()) + if ( static_cast<INT_PTR>(key) < commands[c].kcList.GetSize()) return GetKeyText(commands[c].kcList[0].mod, commands[c].kcList[0].code); else return ""; @@ -3396,6 +3415,7 @@ void CCommandSet::GetParentContexts(InputTargetContext child, CArray<InputTargetContext, InputTargetContext> parentList) { + UNREFERENCED_PARAMETER(child); //parentList.RemoveAll(); //for (InputTargetContext parent; parent<kCtxMaxInputContexts; parent++) { @@ -3407,6 +3427,7 @@ void CCommandSet::GetChildContexts(InputTargetContext parent, CArray<InputTargetContext, InputTargetContext> childList) { + UNREFERENCED_PARAMETER(parent); //childList.RemoveAll(); //for (InputTargetContext child; child<kCtxMaxInputContexts; child++) { Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/CommandSet.h 2009-06-25 21:53:49 UTC (rev 277) @@ -433,7 +433,9 @@ kcNoteOff, kcNoteCutOld, kcNoteOffOld, - kcEndNoteMisc=kcNoteOffOld, + kcNotePC, + kcNotePCS, + kcEndNoteMisc=kcNotePCS, //Set instruments Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -822,11 +822,7 @@ // Pitch/Pan Separation m_SpinPPS.SetRange(-32, +32); // Pitch/Pan Center - for (UINT n=0; n<=NOTE_MAX; n++) - { - wsprintf(s, "%s%d", szNoteNames[n % 12], n/12); - m_ComboPPC.SetItemData(m_ComboPPC.AddString(s), n); - } + AppendNotesToControl(m_ComboPPC, 0, NOTE_MAX-1); // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -200,11 +200,8 @@ //CHAR s[8]; CHAR s[10]; - for(int i = 0 ; i < NOTE_MAX ; i++){ - wsprintf(s, "%s%d", szNoteNames[i % 12], i/12); - int n = m_CbnSplitNote.AddString(s); - m_CbnSplitNote.SetItemData(n, i); - } + AppendNotesToControl(m_CbnSplitNote, 0, NOTE_MAX - 1); + m_nSplitInstrument = 0; m_nSplitNote = 60; m_CbnSplitNote.SetCurSel(m_nSplitNote); Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -329,7 +329,15 @@ { m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT); } else + if(note >= NOTE_PC) { + m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 15*COLUMN_HEIGHT); + } else + if(note >= NOTE_PCS) + { + m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 16*COLUMN_HEIGHT); + } else + { if(pTuning) { // Drawing custom note names string noteStr = pTuning->GetNoteName(note-NOTE_MIDDLEC); @@ -387,24 +395,40 @@ } -void CViewPattern::DrawVolumeCommand(int x, int y, UINT volcmd, UINT vol) -//----------------------------------------------------------------------- +void CViewPattern::DrawVolumeCommand(int x, int y, const MODCOMMAND mc) +//--------------------------------------------------------------------- { PCPATTERNFONT pfnt = GetCurrentPatternFont(); - if (volcmd) - { - volcmd &= 0x0F; - vol &= 0x7F; - m_Dib.TextBlt(x, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT, - pfnt->nVolX, pfnt->nVolY+volcmd*COLUMN_HEIGHT); + + if(mc.note == NOTE_PCS || mc.note == NOTE_PC) + { //If note is parameter control note, drawing volume command differently. + const int val = min(MODCOMMAND::maxColumnValue, mc.GetValueVolCol()); + + m_Dib.TextBlt(x, y, 1, COLUMN_HEIGHT, pfnt->nClrX, pfnt->nClrY); + m_Dib.TextBlt(x + 1, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT, + pfnt->nNumX, pfnt->nNumY+(val / 100)*COLUMN_HEIGHT); m_Dib.TextBlt(x+pfnt->nVolCmdWidth, y, pfnt->nVolHiWidth, COLUMN_HEIGHT, - pfnt->nNumX, pfnt->nNumY+(vol / 10)*COLUMN_HEIGHT); + pfnt->nNumX, pfnt->nNumY+((val / 10)%10)*COLUMN_HEIGHT); m_Dib.TextBlt(x+pfnt->nVolCmdWidth+pfnt->nVolHiWidth, y, pfnt->nEltWidths[2]-(pfnt->nVolCmdWidth+pfnt->nVolHiWidth), COLUMN_HEIGHT, - pfnt->nNumX, pfnt->nNumY+(vol % 10)*COLUMN_HEIGHT); - } else + pfnt->nNumX, pfnt->nNumY+(val % 10)*COLUMN_HEIGHT); + } + else { - int srcx = pfnt->nEltWidths[0] + pfnt->nEltWidths[1]; - m_Dib.TextBlt(x, y, pfnt->nEltWidths[2], COLUMN_HEIGHT, pfnt->nClrX+srcx, pfnt->nClrY); + if (mc.volcmd) + { + const int volcmd = (mc.volcmd & 0x0F); + const int vol = (mc.vol & 0x7F); + m_Dib.TextBlt(x, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT, + pfnt->nVolX, pfnt->nVolY+volcmd*COLUMN_HEIGHT); + m_Dib.TextBlt(x+pfnt->nVolCmdWidth, y, pfnt->nVolHiWidth, COLUMN_HEIGHT, + pfnt->nNumX, pfnt->nNumY+(vol / 10)*COLUMN_HEIGHT); + m_Dib.TextBlt(x+pfnt->nVolCmdWidth+pfnt->nVolHiWidth, y, pfnt->nEltWidths[2]-(pfnt->nVolCmdWidth+pfnt->nVolHiWidth), COLUMN_HEIGHT, + pfnt->nNumX, pfnt->nNumY+(vol % 10)*COLUMN_HEIGHT); + } else + { + int srcx = pfnt->nEltWidths[0] + pfnt->nEltWidths[1]; + m_Dib.TextBlt(x, y, pfnt->nEltWidths[2], COLUMN_HEIGHT, pfnt->nClrX+srcx, pfnt->nClrY); + } } } @@ -780,8 +804,19 @@ MODCOMMAND *mold = m - ncols; if (m->note == mold->note) dwSpeedUpMask |= 0x01; if ((m->instr == mold->instr) || (m_nDetailLevel < 1)) dwSpeedUpMask |= 0x02; - if (((m->volcmd == mold->volcmd) && ((!m->volcmd) || (m->vol == mold->vol))) || (m_nDetailLevel < 2)) dwSpeedUpMask |= 0x04; - if ((m->command == mold->command) || (m_nDetailLevel < 3)) dwSpeedUpMask |= (m->command) ? 0x08 : 0x18; + if ( m->note == NOTE_PCS || m->note == NOTE_PC || mold->note == NOTE_PCS || mold->note == NOTE_PC ) + { // Handle speedup mask for PC notes. + if(m->note == mold->note) + { + if(m->GetValueVolCol() == mold->GetValueVolCol() || (m_nDetailLevel < 2)) dwSpeedUpMask |= 0x04; + if(m->GetValueEffectCol() == mold->GetValueEffectCol() || (m_nDetailLevel < 3)) dwSpeedUpMask |= 0x18; + } + } + else + { + if (((m->volcmd == mold->volcmd) && ((!m->volcmd) || (m->vol == mold->vol))) || (m_nDetailLevel < 2)) dwSpeedUpMask |= 0x04; + if ((m->command == mold->command) || (m_nDetailLevel < 3)) dwSpeedUpMask |= (m->command) ? 0x08 : 0x18; + } if (dwSpeedUpMask == 0x1F) goto DoBlit; } bColSel[col] |= 0x40; @@ -857,7 +892,7 @@ tx_col = MODCOLOR_TEXTSELECTED; bk_col = MODCOLOR_BACKSELECTED; } else - if ((m->volcmd) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT)) + if (m->note != NOTE_PCS && m->note != NOTE_PC && (m->volcmd) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT)) { switch(m->volcmd) { @@ -886,15 +921,18 @@ } // Drawing Volume m_Dib.SetTextColor(tx_col, bk_col); - DrawVolumeCommand(xbmp+x, 0, m->volcmd, m->vol); + DrawVolumeCommand(xbmp+x, 0, *m); } x += pfnt->nEltWidths[2]; } // Command & param if (m_nDetailLevel > 2) { + const bool isPCnote = (m->note == NOTE_PC || m->note == NOTE_PCS); + uint16 val = m->GetValueEffectCol(); + if(val > MODCOMMAND::maxColumnValue) val = MODCOMMAND::maxColumnValue; fx_col = row_col; - if ((m->command) && (m->command < MAX_EFFECTS) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT)) + if (!isPCnote && (m->command) && (m->command < MAX_EFFECTS) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT)) { switch(gEffectColors[m->command]) { @@ -921,17 +959,26 @@ tx_col = MODCOLOR_TEXTSELECTED; bk_col = MODCOLOR_BACKSELECTED; } + // Drawing Command m_Dib.SetTextColor(tx_col, bk_col); - if (m->command) + if(isPCnote) { - UINT command = m->command & 0x3F; - int n = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands[command] : gszS3mCommands[command]; - if (n <= ' ') n = '?'; - DrawLetter(xbmp+x, 0, (char)n, pfnt->nEltWidths[3], pfnt->nCmdOfs); - } else + m_Dib.TextBlt(xbmp + x, 0, 2, COLUMN_HEIGHT, pfnt->nClrX+x, pfnt->nClrY); + m_Dib.TextBlt(xbmp + x + 2, 0, pfnt->nEltWidths[3], m_szCell.cy, pfnt->nNumX, pfnt->nNumY+(val / 100)*COLUMN_HEIGHT); + } + else { - m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[3], COLUMN_HEIGHT, pfnt->nClrX+x, pfnt->nClrY); + if (m->command) + { + UINT command = m->command & 0x3F; + int n = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands[command] : gszS3mCommands[command]; + if (n <= ' ') n = '?'; + DrawLetter(xbmp+x, 0, (char)n, pfnt->nEltWidths[3], pfnt->nCmdOfs); + } else + { + m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[3], COLUMN_HEIGHT, pfnt->nClrX+x, pfnt->nClrY); + } } } x += pfnt->nEltWidths[3]; @@ -945,15 +992,24 @@ tx_col = MODCOLOR_TEXTSELECTED; bk_col = MODCOLOR_BACKSELECTED; } + // Drawing param m_Dib.SetTextColor(tx_col, bk_col); - if (m->command) + if(isPCnote) { - m_Dib.TextBlt(xbmp+x, 0, pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX, pfnt->nNumY+(m->param >> 4)*COLUMN_HEIGHT); - m_Dib.TextBlt(xbmp+x+pfnt->nParamHiWidth, 0, pfnt->nEltWidths[4]-pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX+1, pfnt->nNumY+(m->param & 0x0F)*COLUMN_HEIGHT); - } else + m_Dib.TextBlt(xbmp + x, 0, pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX, pfnt->nNumY+((val / 10) % 10)*COLUMN_HEIGHT); + m_Dib.TextBlt(xbmp + x + pfnt->nParamHiWidth, 0, pfnt->nEltWidths[4]-pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX+1, pfnt->nNumY+(val % 10)*COLUMN_HEIGHT); + } + else { - m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[4], m_szCell.cy, pfnt->nClrX+x, pfnt->nClrY); + if (m->command) + { + m_Dib.TextBlt(xbmp+x, 0, pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX, pfnt->nNumY+(m->param >> 4)*COLUMN_HEIGHT); + m_Dib.TextBlt(xbmp+x+pfnt->nParamHiWidth, 0, pfnt->nEltWidths[4]-pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX+1, pfnt->nNumY+(m->param & 0x0F)*COLUMN_HEIGHT); + } else + { + m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[4], m_szCell.cy, pfnt->nClrX+x, pfnt->nClrY); + } } } } @@ -1396,59 +1452,65 @@ pMainFrm->SetUserText(s); if (::GetFocus() == m_hWnd) { - nChn = (m_dwCursor & 0xFFFF) >> 3; + nChn = GetChanFromCursor(m_dwCursor); s[0] = 0; if ((!(m_dwStatus & (PATSTATUS_KEYDRAGSEL/*|PATSTATUS_MOUSEDRAGSEL*/))) //rewbs.xinfo: update indicator even when dragging && (m_dwBeginSel == m_dwEndSel) && (pSndFile->Patterns[m_nPattern]) && (m_nRow < pSndFile->PatternSize[m_nPattern]) && (nChn < pSndFile->m_nChannels)) { MODCOMMAND *m = &pSndFile->Patterns[m_nPattern][m_nRow*pSndFile->m_nChannels+nChn]; - switch (m_dwCursor & 7) + + // Ignore update if using PC or PCs notes because instrument, volcol and effect values + // have different meaning. + if(m->note != NOTE_PC && m->note != NOTE_PCS) { - case 1: - if (m->instr) + switch (GetColTypeFromCursor(m_dwCursor)) { - CHAR sztmp[128] = ""; - if (pSndFile->m_nInstruments) + case 1: + if (m->instr) { - if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Headers[m->instr])) + CHAR sztmp[128] = ""; + if (pSndFile->m_nInstruments) { - INSTRUMENTHEADER *penv = pSndFile->Headers[m->instr]; - memcpy(sztmp, penv->name, 32); - sztmp[32] = 0; - if ((m->note) && (m->note <= NOTE_MAX)) + if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Headers[m->instr])) { - UINT nsmp = penv->Keyboard[m->note-1]; - if ((nsmp) && (nsmp <= pSndFile->m_nSamples)) + INSTRUMENTHEADER *penv = pSndFile->Headers[m->instr]; + memcpy(sztmp, penv->name, 32); + sztmp[32] = 0; + if ((m->note) && (m->note <= NOTE_MAX)) { - CHAR sztmp2[64] = ""; - memcpy(sztmp2, pSndFile->m_szNames[nsmp], 32); - sztmp2[32] = 0; - if (sztmp2[0]) + UINT nsmp = penv->Keyboard[m->note-1]; + if ((nsmp) && (nsmp <= pSndFile->m_nSamples)) { - wsprintf(sztmp+strlen(sztmp), " (%d: %s)", nsmp, sztmp2); + CHAR sztmp2[64] = ""; + memcpy(sztmp2, pSndFile->m_szNames[nsmp], 32); + sztmp2[32] = 0; + if (sztmp2[0]) + { + wsprintf(sztmp+strlen(sztmp), " (%d: %s)", nsmp, sztmp2); + } } } } - } - } else - { - if (m->instr <= pSndFile->m_nSamples) + } else { - memcpy(sztmp, pSndFile->m_szNames[m->instr], 32); - sztmp[32] = 0; + if (m->instr <= pSndFile->m_nSamples) + { + memcpy(sztmp, pSndFile->m_szNames[m->instr], 32); + sztmp[32] = 0; + } } + if (sztmp[0]) wsprintf(s, "%d: %s", m->instr, sztmp); } - if (sztmp[0]) wsprintf(s, "%d: %s", m->instr, sztmp); + break; + case 2: + if (!pModDoc->GetVolCmdInfo(pModDoc->GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0; + break; + case 3: + case 4: + if (!pModDoc->GetEffectName(s, m->command, m->param, FALSE, nChn)) s[0] = 0; + break; } - break; - case 2: - if (!pModDoc->GetVolCmdInfo(pModDoc->GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0; - break; - case 3: - case 4: - if (!pModDoc->GetEffectName(s, m->command, m->param, FALSE, nChn)) s[0] = 0; - break; } } pMainFrm->SetInfoText(s); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -1598,7 +1598,7 @@ pattern = "Fast Tracker Files (*.xm)|*.xm||"; break;*/ case MOD_TYPE_MOD: - ext = MOD_STD_SPECS.fileExtension; + ext = ModSpecs::mod.fileExtension; pattern = FileFilterMOD; if( AfxMessageBox(GetStrI18N(TEXT( "Compared to regular MOD save, compatibility export makes " @@ -1610,7 +1610,7 @@ return; break; case MOD_TYPE_IT: - ext = IT_STD_SPECS.fileExtension; + ext = ModSpecs::it.fileExtension; pattern = FileFilterIT; ::MessageBox(NULL,"Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning.",MB_ICONINFORMATION | MB_OK); break; Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -20,7 +20,19 @@ #define str_mptm_conversion_warning GetStrI18N(_TEXT("Conversion from mptm to any other moduletype may makes certain features unavailable and is not guaranteed to work properly. Do the conversion anyway?")) +const size_t Pow10Table[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; +// Return D'th digit(character) of given value. +// GetDigit<0>(123) == '3' +// GetDigit<1>(123) == '2' +// GetDigit<2>(123) == '1' +template<BYTE D> +inline TCHAR GetDigit(const size_t val) +{ + return (D > 9) ? '0' : 48 + ((val / Pow10Table[D]) % 10); +} + + ////////////////////////////////////////////////////////////////////// // Module type conversion @@ -1578,6 +1590,8 @@ case 0: p[1] = p[2] = p[3] = '.'; break; case NOTE_KEYOFF: p[1] = p[2] = p[3] = '='; break; case NOTE_NOTECUT: p[1] = p[2] = p[3] = '^'; break; + case NOTE_PC: p[1] = 'P'; p[2] = 'C'; p[3] = ' '; break; + case NOTE_PCS: p[1] = 'P'; p[2] = 'C'; p[3] = 'S'; break; default: p[1] = szNoteNames[(note-1) % 12][0]; p[2] = szNoteNames[(note-1) % 12][1]; @@ -1605,12 +1619,22 @@ ncursor++; if ((ncursor >= colmin) && (ncursor <= colmax)) { - if ((m->volcmd) && (m->volcmd <= MAX_VOLCMDS)) + if(m->note == NOTE_PC || m->note == NOTE_PCS) { - p[6] = gszVolCommands[m->volcmd]; - p[7] = '0' + (m->vol / 10); - p[8] = '0' + (m->vol % 10); - } else p[6] = p[7] = p[8] = '.'; + const uint16 val = m->GetValueVolCol(); + p[6] = GetDigit<2>(val); + p[7] = GetDigit<1>(val); + p[8] = GetDigit<0>(val); + } + else + { + if ((m->volcmd) && (m->volcmd <= MAX_VOLCMDS)) + { + p[6] = gszVolCommands[m->volcmd]; + p[7] = '0' + (m->vol / 10); + p[8] = '0' + (m->vol % 10); + } else p[6] = p[7] = p[8] = '.'; + } } else { p[6] = p[7] = p[8] = ' '; @@ -1620,18 +1644,28 @@ if (((ncursor >= colmin) && (ncursor <= colmax)) || ((ncursor+1 >= colmin) && (ncursor+1 <= colmax))) { - if (m->command) + if(m->note == NOTE_PC || m->note == NOTE_PCS) { - if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) - p[9] = gszS3mCommands[m->command]; - else - p[9] = gszModCommands[m->command]; - } else p[9] = '.'; - if (m->param) + const uint16 val = m->GetValueEffectCol(); + p[9] = GetDigit<2>(val); + p[10] = GetDigit<1>(val); + p[11] = GetDigit<0>(val); + } + else { - p[10] = szHexChar[m->param >> 4]; - p[11] = szHexChar[m->param & 0x0F]; - } else p[10] = p[11] = '.'; + if (m->command) + { + if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) + p[9] = gszS3mCommands[m->command]; + else + p[9] = gszModCommands[m->command]; + } else p[9] = '.'; + if (m->param) + { + p[10] = szHexChar[m->param >> 4]; + p[11] = szHexChar[m->param & 0x0F]; + } else p[10] = p[11] = '.'; + } } else { p[9] = p[10] = p[11] = ' '; @@ -1723,6 +1757,13 @@ m[col].note = 0; if (s[0] == '=') m[col].note = NOTE_KEYOFF; else if (s[0] == '^') m[col].note = NOTE_NOTECUT; else + if (s[0] == 'P') + { + if(s[2] == 'S') + m[col].note = NOTE_PCS; + else + m[col].note = NOTE_PC; + } else if (s[0] != '.') { for (UINT i=0; i<12; i++) @@ -1750,68 +1791,92 @@ { if (s[5] != '.') { - m[col].volcmd = 0; - for (UINT i=1; i<MAX_VOLCMDS; i++) + if(m[col].note == NOTE_PCS || m[col].note == NOTE_PC) { - if (s[5] == gszVolCommands[i]) + char val[4]; + memcpy(val, s+5, 3); + val[3] = 0; + m[col].SetValueVolCol(ConvertStrTo<uint16>(val)); + } + else + { + m[col].volcmd = 0; + for (UINT i=1; i<MAX_VOLCMDS; i++) { - m[col].volcmd = i; - break; + if (s[5] == gszVolCommands[i]) + { + m[col].volcmd = i; + break; + } } + m[col].vol = (s[6]-'0')*10 + (s[7]-'0'); } - m[col].vol = (s[6]-'0')*10 + (s[7]-'0'); } else m[col].volcmd = m[col].vol = 0; } - if (s[8] > ' ' && (!mix || ((!ITStyleMix && origModCmd.command==0) || - (ITStyleMix && origModCmd.command==0 && origModCmd.param==0)))) + + if(m[col].note == NOTE_PCS || m[col].note == NOTE_PC) { - m[col].command = 0; - if (s[8] != '.') + if(s[8] != '.') { - LPCSTR psc = (bS3M) ? gszS3mCommands : gszModCommands; - for (UINT i=1; i<MAX_EFFECTS; i++) - { - if ((s[8] == psc[i]) && (psc[i] != '?')) m[col].command = i; - } + char val[4]; + memcpy(val, s+8, 3); + val[3] = 0; + m[col].SetValueEffectCol(ConvertStrTo<uint16>(val)); } } - // Effect value - if (s[9] > ' ' && (!mix || ((!ITStyleMix && origModCmd.param==0) || - (ITStyleMix && origModCmd.command==0 && origModCmd.param==0)))) + else { - m[col].param = 0; - if (s[9] != '.') + if (s[8] > ' ' && (!mix || ((!ITStyleMix && origModCmd.command==0) || + (ITStyleMix && origModCmd.command==0 && origModCmd.param==0)))) { - for (UINT i=0; i<16; i++) + m[col].command = 0; + if (s[8] != '.') { - if (s[9] == szHexChar[i]) m[col].param |= (i<<4); - if (s[10] == szHexChar[i]) m[col].param |= i; + LPCSTR psc = (bS3M) ? gszS3mCommands : gszModCommands; + for (UINT i=1; i<MAX_EFFECTS; i++) + { + if ((s[8] == psc[i]) && (psc[i] != '?')) m[col].command = i; + } } } - } - // Checking command - if (m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) - { - switch (m[col].command) + // Effect value + if (s[9] > ' ' && (!mix || ((!ITStyleMix && origModCmd.param==0) || + (ITStyleMix && origModCmd.command==0 && origModCmd.param==0)))) { - case CMD_SPEED: - case CMD_TEMPO: - if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO; - else + m[col].param = 0; + if (s[9] != '.') { - if ((m[col].command == CMD_SPEED) && (m[col].param > spdmax)) m[col].param = CMD_TEMPO; else - if ((m[col].command == CMD_TEMPO) && (m[col].param <= spdmax)) m[col].param = CMD_SPEED; + for (UINT i=0; i<16; i++) + { + if (s[9] == szHexChar[i]) m[col].param |= (i<<4); + if (s[10] == szHexChar[i]) m[col].param |= i; + } } - break; } - } else - { - switch (m[col].command) + // Checking command + if (m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { - case CMD_SPEED: - case CMD_TEMPO: - if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO; - break; + switch (m[col].command) + { + case CMD_SPEED: + case CMD_TEMPO: + if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO; + else + { + if ((m[col].command == CMD_SPEED) && (m[col].param > spdmax)) m[col].param = CMD_TEMPO; else + if ((m[col].command == CMD_TEMPO) && (m[col].param <= spdmax)) m[col].param = CMD_SPEED; + } + break; + } + } else + { + switch (m[col].command) + { + case CMD_SPEED: + case CMD_TEMPO: + if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO; + break; + } } } } Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -192,19 +192,26 @@ ///////////////////////////////////////////////////////////////////////////// // Common Tables -LPCSTR szNoteNames[12] = +const LPCSTR szNoteNames[12] = { "C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-" }; -LPCSTR szHexChar = "0123456789ABCDEF"; -LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last : -LPCSTR gszS3mCommands = " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last : -LPCSTR gszVolCommands = " vpcdabuhlrgfe:o"; //rewbs.velocity: added last : ; rewbs.volOff added last o +const LPCTSTR szDefaultNoteNames[NOTE_MAX] = { + TEXT("C-0"), TEXT("C#0"), TEXT("D-0"), TEXT("D#0"), TEXT("E-0"), TEXT("F-0"), TEXT("F#0"), TEXT("G-0"), TEXT("G#0"), TEXT("A-0"), TEXT("A#0"), TEXT("B-0"), + TEXT("C-1"), TEXT("C#1"), TEXT("D-1"), TEXT("D#1"), TEXT("E-1"), TEXT("F-1"), TEXT("F#1"), TEXT("G-1"), TEXT("G#1"), TEXT("A-1"), TEXT("A#1"), TEXT("B-1"), + TEXT("C-2"), TEXT("C#2"), TEXT("D-2"), TEXT("D#2"), TEXT("E-2"), TEXT("F-2"), TEXT("F#2"), TEXT("G-2"), TEXT("G#2"), TEXT("A-2"), TEXT("A#2"), TEXT("B-2"), + TEXT("C-3"), TEXT("C#3"), TEXT("D-3"), TEXT("D#3"), TEXT("E-3"), TEXT("F-3"), TEXT("F#3"), TEXT("G-3"), TEXT("G#3"), TEXT("A-3"), TEXT("A#3"), TEXT("B-3"), + TEXT("C-4"), TEXT("C#4"), TEXT("D-4"), TEXT("D#4"), TEXT("E-4"), TEXT("F-4"), TEXT("F#4"), TEXT("G-4"), TEXT("G#4"), TEXT("A-4"), TEXT("A#4"), TEXT("B-4"), + TEXT("C-5"), TEXT("C#5"), TEXT("D-5"), TEXT("D#5"), TEXT("E-5"), TEXT("F-5"), TEXT("F#5"), TEXT("G-5"), TEXT("G#5"), TEXT("A-5"), TEXT("A#5"), TEXT("B-5"), + TEXT("C-6"), TEXT("C#6"), TEXT("D-6"), TEXT("D#6"), TEXT("E-6"), TEXT("F-6"), TEXT("F#6"), TEXT("G-6"), TEXT("G#6"), TEXT("A-6"), TEXT("A#6"), TEXT("B-6"), + TEXT("C-7"), TEXT("C#7"), TEXT("D-7"), TEXT("D#7"), TEXT("E-7"), TEXT("F-7"), TEXT("F#7"), TEXT("G-7"), TEXT("G#7"), TEXT("A-7"), TEXT("A#7"), TEXT("B-7"), + TEXT("C-8"), TEXT("C#8"), TEXT("D-8"), TEXT("D#8"), TEXT("E-8"), TEXT("F-8"), TEXT("F#8"), TEXT("G-8"), TEXT("G#8"), TEXT("A-8"), TEXT("A#8"), TEXT("B-8"), + TEXT("C-9"), TEXT("C#9"), TEXT("D-9"), TEXT("D#9"), TEXT("E-9"), TEXT("F-9"), TEXT("F#9"), TEXT("G-9"), TEXT("G#9"), TEXT("A-9"), TEXT("A#9"), TEXT("B-9"), +}; - -BYTE gEffectColors[MAX_EFFECTS] = +const BYTE gEffectColors[MAX_EFFECTS] = { 0, 0, MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_VOLUME, MODCOLOR_VOLUME, @@ -1119,15 +1126,12 @@ void CTrackApp::LoadChords(PMPTCHORD pChords) //------------------------------------------- -{ - CHAR snam[32]; - +{ if (!m_szConfigFileName[0]) return; for (UINT i=0; i<3*12; i++) { LONG chord; - wsprintf(snam, "%s%d", szNoteNames[i%12], i/12); - if ((chord = GetPrivateProfileInt("Chords", snam, -1, m_szConfigFileName)) >= 0) + if ((chord = GetPrivateProfileInt("Chords", szDefaultNoteNames[i], -1, m_szConfigFileName)) >= 0) { if ((chord & 0xFFFFFFC0) || (!pChords[i].notes[0])) { @@ -1144,14 +1148,13 @@ void CTrackApp::SaveChords(PMPTCHORD pChords) //------------------------------------------- { - CHAR s[64], snam[32]; + CHAR s[64]; if (!m_szConfigFileName[0]) return; for (UINT i=0; i<3*12; i++) { - wsprintf(snam, "%s%d", szNoteNames[i%12], i/12); wsprintf(s, "%d", (pChords[i].key) | (pChords[i].notes[0] << 6) | (pChords[i].notes[1] << 12) | (pChords[i].notes[2] << 18)); - if (!WritePrivateProfileString("Chords", snam, s, m_szConfigFileName)) break; + if (!WritePrivateProfileString("Chords", szDefaultNoteNames[i], s, m_szConfigFileName)) break; } } Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/Mptrack.h 2009-06-25 21:53:49 UTC (rev 277) @@ -379,27 +379,48 @@ void Log(LPCSTR format,...); UINT MsgBox(UINT nStringID, CWnd *p=NULL, LPCSTR lpszTitle=NULL, UINT n=MB_OK); void ErrorBox(UINT nStringID, CWnd*p=NULL); + +// Helper function declarations. void AddPluginNamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN* plugarray, const bool librarynames = false); void AddPluginParameternamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN& plugarray); void AddPluginParameternamesToCombobox(CComboBox& CBox, CVstPlugin& plug); +// Append note names in range [noteStart, noteEnd] to given combobox. Index starts from 0. +void AppendNotesToControl(CComboBox& combobox, const MODCOMMAND::NOTE noteStart, const MODCOMMAND::NOTE noteEnd); + +// Append note names to combobox. If pSndFile != nullprt, appends only notes that are +// available in the module type. If nInstr is given, instrument specific note names are used instead of +// default note names. +void AppendNotesToControlEx(CComboBox& combobox, const CSoundFile* const pSndFile = nullptr, const INSTRUMENTINDEX nInstr = MAX_INSTRUMENTS); + +// Returns note name(such as "C-5") of given note. Regular notes are in range [1,MAX_NOTE]. +LPCTSTR GetNoteStr(const MODCOMMAND::NOTE); + /////////////////////////////////////////////////// // Tables #define MAX_EFFECTS 35 //rewbs.smoothVST & rewbs.velocity: increased from 32. Wonder what this will break... //+1 for eric's multiplier #define MAX_VOLCMDS 16 //rewbs.voloff & rewbs.velocity: increased from 14 -extern BYTE gEffectColors[MAX_EFFECTS]; -extern LPCSTR szNoteNames[12]; -extern LPCSTR szHexChar; -extern LPCSTR gszModCommands; -extern LPCSTR gszS3mCommands; -extern LPCSTR gszVolCommands; +extern const BYTE gEffectColors[MAX_EFFECTS]; +extern const LPCSTR szNoteNames[12]; +extern const LPCTSTR szDefaultNoteNames[NOTE_MAX]; +const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("PCs"), TEXT("PC"), TEXT("^^"), TEXT("==")}; +const LPCTSTR szSpecialNoteShortDesc[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("Param control(smooth)"), TEXT("Param control"), TEXT("Note Cut"), TEXT("Note Off")}; +// Make sure that special note arrays include string for every note. +STATIC_ASSERT(NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1 == ARRAYELEMCOUNT(szSpecialNoteNames)); +STATIC_ASSERT(ARRAYELEMCOUNT(szSpecialNoteShortDesc) == ARRAYELEMCOUNT(szSpecialNoteNames)); + +const LPCSTR szHexChar = "0123456789ABCDEF"; +const LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last : +const LPCSTR gszS3mCommands = " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last : +const LPCSTR gszVolCommands = " vpcdabuhlrgfe:o"; //rewbs.velocity: added last : ; rewbs.volOff added last o + // Defined in load_mid.cpp -extern LPCSTR szMidiProgramNames[128]; -extern LPCSTR szMidiPercussionNames[61]; // notes 25..85 -extern LPCSTR szMidiGroupNames[17]; // 16 groups + Percussions +extern const LPCSTR szMidiProgramNames[128]; +extern const LPCSTR szMidiPercussionNames[61]; // notes 25..85 +extern const LPCSTR szMidiGroupNames[17]; // 16 groups + Percussions ///////////////////////////////////////////////////////////////////////////// Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -23,9 +23,9 @@ #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" -MODCOMMAND CViewPattern::m_cmdOld; -MODCOMMAND CViewPattern::m_cmdFind; -MODCOMMAND CViewPattern::m_cmdReplace; +MODCOMMAND CViewPattern::m_cmdOld = {0,0,0,0,0,0}; +MODCOMMAND CViewPattern::m_cmdFind = {0,0,0,0,0,0}; +MODCOMMAND CViewPattern::m_cmdReplace = {0,0,0,0,0,0}; DWORD CViewPattern::m_dwFindFlags = 0; DWORD CViewPattern::m_dwReplaceFlags = 0; UINT CViewPattern::m_nFindMinChn = 0; @@ -837,7 +837,7 @@ { UINT chn = i >> 3; MODCOMMAND *blank= &p[row * pSndFile->m_nChannels + chn]; - *blank = MODCOMMAND(); + *blank = MODCOMMAND::Empty(); } } m_dwBeginSel = startSel; @@ -874,6 +874,7 @@ PrepareUndo(m_dwBeginSel, m_dwEndSel); DWORD tmp = m_dwEndSel; + bool invalidateAllCols = false; for (UINT row=(m_dwBeginSel >> 16); row<=(m_dwEndSel >> 16); row++) { // for all selected rows for (UINT i=(m_dwBeginSel & 0xFFFF); i<=(m_dwEndSel & 0xFFFF); i++) if ((i & 7) < 5) { // for all selected cols @@ -884,8 +885,17 @@ switch(i & 7) { case 0: // Clear note if (rm.note) { - m->note = 0; - if (ITStyle) m->instr = 0; + if(m->note == NOTE_PCS || m->note == NOTE_PC) + { // Clear whole row if clearing PC note + m->Clear(); + invalidateAllCols = true; + } + else + { + m->note = 0; + if (ITStyle) m->instr = 0; + } + } break; case 1: // Clear instrument @@ -913,7 +923,17 @@ } //end selected columns } //end selected rows - if ((tmp & 7) == 3) tmp++; + // If selection ends on effect command column, extent invalidation area to + // effect param column as well. + if ((tmp & 7) == EFFECT_COLUMN) + tmp++; + + // If invalidation on all columns is wanted, extent invalidation area. + if(invalidateAllCols) + tmp += LAST_COLUMN - (tmp % 8); + + ASSERT(tmp % 8 <= LAST_COLUMN); + InvalidateArea(m_dwBeginSel, tmp); pModDoc->SetModified(); pModDoc->UpdateAllViews(this, HINT_PATTERNDATA | (m_nPattern << HINT_SHIFT_PAT), NULL); @@ -1791,7 +1811,7 @@ UINT ch = n % pSndFile->m_nChannels; if ((ch < m_nFindMinChn) || (ch > m_nFindMaxChn)) bFound = FALSE; } - if (((m_dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_cmdFind.note) && ((m_cmdFind.note != 0xFD) || (!m->note) || (m->note & 0x80)))) + if (((m_dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_cmdFind.note) && ((m_cmdFind.note != CFindReplaceTab::findAny) || (!m->note) || (m->note & 0x80)))) || ((m_dwFindFlags & PATSEARCH_INSTR) && (m->instr != m_cmdFind.instr)) || ((m_dwFindFlags & PATSEARCH_VOLCMD) && (m->volcmd != m_cmdFind.volcmd)) || ((m_dwFindFlags & PATSEARCH_VOLUME) && (m->vol != m_cmdFind.vol)) @@ -1799,10 +1819,21 @@ || ((m_dwFindFlags & PATSEARCH_PARAM) && (m->param != m_cmdFind.param))) { bFound = FALSE; - } else - if (((m_dwFindFlags & (PATSEARCH_COMMAND|PATSEARCH_PARAM)) == PATSEARCH_COMMAND) && (bEffectEx)) + } + else { - if ((m->param & 0xF0) != (m_cmdFind.param & 0xF0)) bFound = FALSE; + if (((m_dwFindFlags & (PATSEARCH_COMMAND|PATSEARCH_PARAM)) == PATSEARCH_COMMAND) && (bEffectEx)) + { + if ((m->param & 0xF0) != (m_cmdFind.param & 0xF0)) bFound = FALSE; + } + + // Ignore modcommands with PC/PCS notes when searching from volume or effect column. + if( (m->note == NOTE_PC || m->note == NOTE_PCS) + && + m_dwFindFlags & (PATSEARCH_VOLCMD|PATSEARCH_VOLUME|PATSEARCH_COMMAND|PATSEARCH_PARAM)) + { + bFound = FALSE; + } } // Found! if (bFound) @@ -1845,22 +1876,22 @@ if ((m_dwReplaceFlags & PATSEARCH_NOTE)) { // -1 octave - if (m_cmdReplace.note == 0xFA) + if (m_cmdReplace.note == CFindReplaceTab::replaceMinusOctave) { if (m->note > 12) m->note -= 12; } else // +1 octave - if (m_cmdReplace.note == 0xFB) + if (m_cmdReplace.note == CFindReplaceTab::replacePlusOctave) { - if (m->note <= 108) m->note += 12; + if (m->note <= NOTE_MAX - 12) m->note += 12; } else // Note-- - if (m_cmdReplace.note == 0xFC) + if (m_cmdReplace.note == CFindReplaceTab::replaceMinusOne) { if (m->note > 1) m->note--; } else // Note++ - if (m_cmdReplace.note == 0xFD) + if (m_cmdReplace.note == CFindReplaceTab::replacePlusOne) { if (m->note < NOTE_MAX) m->note++; } else m->note = m_cmdReplace.note; @@ -1868,12 +1899,12 @@ if ((m_dwReplaceFlags & PATSEARCH_INSTR)) { // Instr-- - if (m_cmdReplace.instr == 0xFC) + if (m_cmdReplace.instr == CFindReplaceTab::replaceMinusOne) { if (m->instr > 1) m->instr--; } else // Instr++ - if (m_cmdReplace.instr == 0xFD) + if (m_cmdReplace.instr == CFindReplaceTab::replacePlusOne) { if (m->instr < MAX_INSTRUMENTS-1) m->instr++; } else m->instr = m_cmdReplace.instr; @@ -1913,11 +1944,7 @@ { if (m_dwFindFlags & PATSEARCH_NOTE) { - UINT note = m_cmdFind.note; - if (note == 0) strcpy(szFind, "..."); else - if (note == 0xFE) strcpy(szFind, "^^ "); else - if (note == 0xFF) strcpy(szFind, "== "); else - wsprintf(szFind, "%s%d", szNoteNames[(note-1) % 12], (note-1)/12); + wsprintf(szFind, "%s", GetNoteStr(m_cmdFind.note)); } else strcpy(szFind, "???"); strcat(szFind, " "); if (m_dwFindFlags & PATSEARCH_INSTR) @@ -2041,7 +2068,6 @@ UINT nCursor = m_dwCursor & 0x07; CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern] + m_nRow*pSndFile->m_nChannels + nChn; - MODCOMMAND oldcmd = *p; switch(nCursor) { @@ -2173,7 +2199,6 @@ //for all channels where type is selected for (int chnIdx=0; chnIdx<nValidChans; chnIdx++) { - MODCOMMAND *pcmd = pSndFile->Patterns[m_nPattern]; UINT nchn = validChans[chnIdx]; UINT row0 = GetSelectionStartRow(); UINT row1 = GetSelectionEndRow(); @@ -2186,27 +2211,50 @@ PrepareUndo(m_dwBeginSel, m_dwEndSel); } - int vsrc, vdest, vcmd, verr, distance; + bool doPCinterpolation = false; + + int vsrc, vdest, vcmd = 0, verr = 0, distance; distance = row1 - row0; + const MODCOMMAND srcCmd = *pSndFile->Patterns[m_nPattern].GetpModCommand(row0, nchn); + const MODCOMMAND destCmd = *pSndFile->Patterns[m_nPattern].GetpModCommand(row1, nchn); + + MODCOMMAND::NOTE PCnote = 0; + uint16 PCinst = 0, PCparam = 0; + switch(type) { case NOTE_COLUMN: - vsrc = pcmd[row0 * pSndFile->m_nChannels + nchn].note; - vdest = pcmd[row1 * pSndFile->m_nChannels + nchn].note; - vcmd = pcmd[row0 * pSndFile->m_nChannels + nchn].instr; - verr = (distance * 59) / 120; + vsrc = srcCmd.note; + vdest = destCmd.note; + vcmd = srcCmd.instr; + verr = (distance * 59) / NOTE_MAX; break; case VOL_COLUMN: - vsrc = pcmd[row0 * pSndFile->m_nChannels + nchn].vol; - vdest = pcmd[row1 * pSndFile->m_nChannels + nchn].vol; - vcmd = pcmd[row0 * pSndFile->m_nChannels + nchn].volcmd; + vsrc = srcCmd.vol; + vdest = destCmd.vol; + vcmd = srcCmd.volcmd; verr = (distance * 63) / 128; break; case PARAM_COLUMN: case EFFECT_COLUMN: - vsrc = pcmd[row0 * pSndFile->m_nChannels + nchn].param; - vdest = pcmd[row1 * pSndFile->m_nChannels + nchn].param; - vcmd = pcmd[row0 * pSndFile->m_nChannels + nchn].command; + if(srcCmd.note == NOTE_PC || srcCmd.note == NOTE_PCS || destCmd.note == NOTE_PCS || destCmd.note == NOTE_PC) + { + doPCinterpolation = true; + PCnote = (srcCmd.note == NOTE_PC || srcCmd.note == NOTE_PCS) ? srcCmd.note : destCmd.note; + vsrc = srcCmd.GetValueEffectCol(); + vdest = destCmd.GetValueEffectCol(); + PCparam = srcCmd.GetValueVolCol(); + if(PCparam == 0) PCparam = destCmd.GetValueVolCol(); + PCinst = srcCmd.instr; + if(PCinst == 0) + PCinst = destCmd.instr; + } + else + { + vsrc = srcCmd.param; + vdest = destCmd.param; + vcmd = srcCmd.command; + } verr = (distance * 63) / 128; break; default: @@ -2215,8 +2263,9 @@ } if (vdest < vsrc) verr = -verr; - pcmd += row0 * pSndFile->m_nChannels + nchn; + MODCOMMAND* pcmd = pSndFile->Patterns[m_nPattern].GetpModCommand(row0, nchn); + for (UINT i=0; i<=distance; i++, pcmd += pSndFile->m_nChannels) { switch(type) { @@ -2235,11 +2284,24 @@ } break; case EFFECT_COLUMN: - if ((!pcmd->command) || (pcmd->command == vcmd)) { - int val = vsrc + ((vdest - vsrc) * (int)i + verr) / distance; - pcmd->param = (BYTE)val; - pcmd->command = vcmd; + if(doPCinterpolation) + { // With PC/PCs notes, copy PCs note and plug index to all rows where + // effect interpolation is done. + const uint16 val = static_cast<uint16>(vsrc + ((vdest - vsrc) * (int)i + verr) / distance); + pcmd->note = PCnote; + pcmd->instr = PCinst; + pcmd->SetValueVolCol(PCparam); + pcmd->SetValueEffectCol(val); } + else + { + if ((!pcmd->command) || (pcmd->command == vcmd)) + { + int val = vsrc + ((vdest - vsrc) * (int)i + verr) / distance; + pcmd->param = (BYTE)val; + pcmd->command = vcmd; + } + } break; default: ASSERT(false); @@ -3487,6 +3549,8 @@ case kcNoteCutOld: TempEnterNote(NOTE_NOTECUT, true); return wParam; case kcNoteOff: TempEnterNote(NOTE_KEYOFF, false); return wParam; case kcNoteOffOld: TempEnterNote(NOTE_KEYOFF, true); return wParam; + case kcNotePC: TempEnterNote(NOTE_PC); return wParam; + case kcNotePCS: TempEnterNote(NOTE_PCS); return wParam; case kcEditUndo: OnEditUndo(); return wParam; case kcEditFind: OnEditFind(); return wParam; @@ -3576,6 +3640,19 @@ return NULL; } +#define ENTER_PCNOTE_VALUE(v, method) \ + { \ + if((v >= 0) && (v <= 9)) \ + { \ + uint16 val = p->Get##method##(); \ + /* Move existing digits to left, drop out leftmost digit and */ \ + /* push new digit to the least meaning digit. */ \ + val = (val % 100) * 10 + v; \ + if(val > MODCOMMAND::maxColumnValue) val = MODCOMMAND::maxColumnValue; \ + p->Set##method##(val); \ + } \ + } + void CViewPattern::TempEnterVol(int v) //------------------------------------ { @@ -3586,55 +3663,57 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; - - MODCOMMAND oldcmd; // This is the command we are about to overwrite + PrepareUndo(m_dwBeginSel, m_dwEndSel); - // -- Work out where to put the new data - UINT nChn = (m_dwCursor & 0xFFFF) >> 3; - prowbase = p + m_nRow * pSndFile->m_nChannels; - p = prowbase + nChn; - oldcmd = *p; + MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor)); + MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite - UINT volcmd = p->volcmd; - UINT vol = p->vol; - if ((v >= 0) && (v <= 9)) + if(p->note == NOTE_PC || p->note == NOTE_PCS) { - vol = ((vol * 10) + v) % 100; - if (!volcmd) volcmd = VOLCMD_VOLUME; + ENTER_PCNOTE_VALUE(v, ValueVolCol); } else - switch(v+kcSetVolumeStart) + { + UINT volcmd = p->volcmd; + UINT vol = p->vol; + if ((v >= 0) && (v <= 9)) { - case kcSetVolumeVol: volcmd = VOLCMD_VOLUME; break; - case kcSetVolumePan: volcmd = VOLCMD_PANNING; break; - case kcSetVolumeVolSlideUp: volcmd = VOLCMD_VOLSLIDEUP; break; - case kcSetVolumeVolSlideDown: volcmd = VOLCMD_VOLSLIDEDOWN; break; - case kcSetVolumeFineVolUp: volcmd = VOLCMD_FINEVOLUP; break; - case kcSetVolumeFineVolDown: volcmd = VOLCMD_FINEVOLDOWN; break; - case kcSetVolumeVibratoSpd: volcmd = VOLCMD_VIBRATOSPEED; break; - case kcSetVolumeVibrato: volcmd = VOLCMD_VIBRATO; break; - case kcSetVolumeXMPanLeft: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDELEFT; break; - case kcSetVolumeXMPanRight: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDERIGHT; break; - case kcSetVolumePortamento: volcmd = VOLCMD_TONEPORTAMENTO; break; - case kcSetVolumeITPortaUp: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTAUP; break; - case kcSetVolumeITPortaDown: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTADOWN; break; - case kcSetVolumeITVelocity: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_VELOCITY; break; //rewbs.velocity - case kcSetVolumeITOffset: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_OFFSET; break; //rewbs.volOff + vol = ((vol * 10) + v) % 100; + if (!volcmd) volcmd = VOLCMD_VOLUME; } - if ((pSndFile->m_nType & MOD_TYPE_MOD) && (volcmd > VOLCMD_PANNING)) volcmd = vol = 0; + else + switch(v+kcSetVolumeStart) + { + case kcSetVolumeVol: volcmd = VOLCMD_VOLUME; break; + case kcSetVolumePan: volcmd = VOLCMD_PANNING; break; + case kcSetVolumeVolSlideUp: volcmd = VOLCMD_VOLSLIDEUP; break; + case kcSetVolumeVolSlideDown: volcmd = VOLCMD_VOLSLIDEDOWN; break; + case kcSetVolumeFineVolUp: volcmd = VOLCMD_FINEVOLUP; break; + case kcSetVolumeFineVolDown: volcmd = VOLCMD_FINEVOLDOWN; break; + case kcSetVolumeVibratoSpd: volcmd = VOLCMD_VIBRATOSPEED; break; + case kcSetVolumeVibrato: volcmd = VOLCMD_VIBRATO; break; + case kcSetVolumeXMPanLeft: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDELEFT; break; + case kcSetVolumeXMPanRight: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDERIGHT; break; + case kcSetVolumePortamento: volcmd = VOLCMD_TONEPORTAMENTO; break; + case kcSetVolumeITPortaUp: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTAUP; break; + case kcSetVolumeITPortaDown: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTADOWN; break; + case kcSetVolumeITVelocity: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_VELOCITY; break; //rewbs.velocity + case kcSetVolumeITOffset: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_OFFSET; break; //rewbs.volOff + } + if ((pSndFile->m_nType & MOD_TYPE_MOD) && (volcmd > VOLCMD_PANNING)) volcmd = vol = 0; - UINT max = 64; - if (volcmd > VOLCMD_PANNING) - { - max = (pSndFile->m_nType == MOD_TYPE_XM) ? 0x0F : 9; + UINT max = 64; + if (volcmd > VOLCMD_PANNING) + { + max = (pSndFile->m_nType == MOD_TYPE_XM) ? 0x0F : 9; + } + + if (vol > max) vol %= 10; + p->volcmd = volcmd; + p->vol = vol; } - if (vol > max) vol %= 10; - p->volcmd = volcmd; - p->vol = vol; - if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; @@ -3672,47 +3751,52 @@ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); - if ((pModDoc) && (pMainFrm) && (IsEditingEnabled_bmsg())) + if(!IsEditingEnabled_bmsg()) return; + + if ((pModDoc) && (pMainFrm)) { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor)); MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite - //if(p->command != 0 && !overwrite) return true; - PrepareUndo(m_dwBeginSel, m_dwEndSel); - //LPCSTR lpcmd = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands : gszS3mCommands; - if (c) + if(p->note == NOTE_PC || p->note == NOTE_PCS) { - if ((c == m_cmdOld.command) && (!p->param) && (!p->command)) p->param = m_cmdOld.param; - else m_cmdOld.param = 0; - m_cmdOld.command = c; + ENTER_PCNOTE_VALUE(c, ValueEffectCol); } - p->command = c; - - // Check for MOD/XM Speed/Tempo command - if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) - && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) + else { - UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20; - p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; - } - //if (IsEditingEnabled_bmsg()) - //{ - DWORD sel = (m_nRow << 16) | m_dwCursor; - SetCurSel(sel, sel); - sel &= ~7; - if(oldcmd != *p) + //LPCSTR lpcmd = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands : gszS3mCommands; + if (c) { - pModDoc->SetModified(); - InvalidateArea(sel, sel+5); - UpdateIndicator(); + if ((c == m_cmdOld.command) && (!p->param) && (!p->command)) p->param = m_cmdOld.param; + else m_cmdOld.param = 0; + m_cmdOld.command = c; } - //} - } // end if mainframe & moddoc exist & editing enabled + p->command = c; + + // Check for MOD/XM Speed/Tempo command + if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) + && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) + { + UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20; + p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; + } + } + + DWORD sel = (m_nRow << 16) | m_dwCursor; + SetCurSel(sel, sel); + sel &= ~7; + if(oldcmd != *p) + { + pModDoc->SetModified(); + InvalidateArea(sel, sel+5); + UpdateIndicator(); + } + } // end if mainframe & moddoc exist } @@ -3725,41 +3809,43 @@ if ((pModDoc) && (pMainFrm) && (IsEditingEnabled_bmsg())) { CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODCOMMAND oldcmd; // This is the command we are about to overwrite MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor)); - oldcmd = *p; + MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite PrepareUndo(m_dwBeginSel, m_dwEndSel); - //if(enterAsAbsoluteValue) p->param = v; - //else p->param = (p->param << 4) | v; - - p->param = (p->param << 4) | v; - if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; - -/* - if (v >= 0 && v <= 9) + if(p->note == NOTE_PC || p->note == NOTE_PCS) { - p->param = (p->param << 4) | v; - if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; + ENTER_PCNOTE_VALUE(v, ValueEffectCol); } - else if (v >= 10 && v <= 15) + else { - p->param = (p->param << 4) | (v + 0x0A); + + p->param = (p->param << 4) | v; if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; + + /* + if (v >= 0 && v <= 9) + { + p->param = (p->param << 4) | v; + if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; + } + else if (v >= 10 && v <= 15) + { + p->param = (p->param << 4) | (v + 0x0A); + if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; + } + */ + // Check for MOD/XM Speed/Tempo command + if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) + && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) + { + UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20; + p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; + } } -*/ - // Check for MOD/XM Speed/Tempo command - if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) - && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) - { - UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20; - p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; - } - //if (IsEditingEnabled()) - //{ DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); sel &= ~7; @@ -3769,7 +3855,6 @@ InvalidateArea(sel, sel+5); UpdateIndicator(); } - //} } } @@ -3971,6 +4056,7 @@ if ((pModDoc) && (pMainFrm)) { + ROWINDEX nRow = m_nRow; CSoundFile *pSndFile = pModDoc->GetSoundFile(); const ROWINDEX nRowPlayback = pSndFile->m_nRow; const UINT nTick = pSndFile->m_nTickCount; @@ -3978,15 +4064,32 @@ const bool bRecordEnabled = IsEditingEnabled(); const UINT nChn = GetChanFromCursor(m_dwCursor); + + if(note > pSndFile->GetModSpecifications().noteMax && note < NOTE_MIN_SPECIAL) + note = pSndFile->GetModSpecifications().noteMax; + else if( note < pSndFile->GetModSpecifications().noteMin) + note = pSndFile->GetModSpecifications().noteMin; + + // Check whether the module format supports the note. + if( pSndFile->GetModSpecifications().HasNote(note) == false ) + return; + BYTE recordGroup = pModDoc->IsChannelRecord(nChn); UINT nPlayIns = 0; - - if (note > NOTE_MAX && note < 254) note = NOTE_MAX; - const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); const bool usePlaybackPosition = (bIsLiveRecord && (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY)); + //Param control 'note' + if((note == NOTE_PC || note == NOTE_PCS) && bRecordEnabled) + { + pModDoc->PrepareUndo(m_nPattern, nChn, nRow, 1, 1); + pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, nChn)->note = note; + const DWORD sel = (nRow << 16) | m_dwCursor; + pModDoc->SetModified(); + InvalidateArea(sel, sel+5); + UpdateIndicator(); + return; + } - ROWINDEX nRow = m_nRow; // -- Chord autodetection: step back if we just entered a note if ((bRecordEnabled) && (recordGroup) && !bIsLiveRecord) { @@ -4315,16 +4418,12 @@ switch(field) { - case 0: p->note = 0; if (ITStyle) p->instr = 0; break; //Note + case 0: if(p->note == NOTE_PC || p->note == NOTE_PCS) p->Clear(); else {p->note = 0; if (ITStyle) p->instr = 0;} break; //Note case 1: p->instr = 0; break; //instr case 2: p->vol = 0; p->volcmd = 0; break; //Vol case 3: p->command = 0; break; //Effect case 4: p->param = 0; break; //Param - default: p->note = 0; //If not specified, delete them all! :) - p->instr = 0; - p->vol = 0; p->volcmd = 0; - p->command = 0; - p->param = 0; + default: p->Clear(); //If not specified, delete them all! :) } if(IsEditingEnabled_bmsg()) @@ -4852,28 +4951,32 @@ bool CViewPattern::IsInterpolationPossible(UINT startRow, UINT endRow, UINT chan, UINT colType, CSoundFile* pSndFile) { //--------------------------------------------------------------------------------------- - bool result = false; - MODCOMMAND *pcmd = pSndFile->Patterns[m_nPattern]; - UINT startRowCmd, endRowCmd; - if (startRow == endRow) { return false; } + bool result = false; + const MODCOMMAND startRowMC = *pSndFile->Patterns[m_nPattern].GetpModCommand(startRow, chan); + const MODCOMMAND endRowMC = *pSndFile->Patterns[m_nPattern].GetpModCommand(endRow, chan); + UINT startRowCmd, endRowCmd; + + if(colType == EFFECT_COLUMN && (startRowMC.note == NOTE_PC || startRowMC.note == NOTE_PCS || endRowMC.note == NOTE_PC || endRowMC.note == NOTE_PCS)) + return true; + switch (colType) { case NOTE_COLUMN: - startRowCmd = pcmd[startRow*pSndFile->m_nChannels+chan].note; - endRowCmd = pcmd[endRow*pSndFile->m_nChannels+chan].note; + startRowCmd = startRowMC.note; + endRowCmd = endRowMC.note; result = (startRowCmd>0 && endRowCmd>0); break; case EFFECT_COLUMN: - startRowCmd = pcmd[startRow*pSndFile->m_nChannels+chan].command; - endRowCmd = pcmd[endRow*pSndFile->m_nChannels+chan].command; + startRowCmd = startRowMC.command; + endRowCmd = endRowMC.command; result = (startRowCmd == endRowCmd) && (startRowCmd>0 && endRowCmd>0); break; case VOL_COLUMN: - startRowCmd = pcmd[startRow*pSndFile->m_nChannels+chan].volcmd; - endRowCmd = pcmd[endRow*pSndFile->m_nChannels+chan].volcmd; + startRowCmd = startRowMC.volcmd; + endRowCmd = endRowMC.volcmd; result = (startRowCmd == endRowCmd) && (startRowCmd>0 && endRowCmd>0); break; default: Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/View_pat.h 2009-06-25 21:53:49 UTC (rev 277) @@ -36,6 +36,7 @@ VOL_COLUMN, EFFECT_COLUMN, PARAM_COLUMN, + LAST_COLUMN = PARAM_COLUMN }; @@ -164,7 +165,7 @@ void DrawLetter(int x, int y, char letter, int sizex=10, int ofsx=0); void DrawNote(int x, int y, UINT note, CTuning* pTuning = NULL); void DrawInstrument(int x, int y, UINT instr); - void DrawVolumeCommand(int x, int y, UINT volcmd, UINT vol); + void DrawVolumeCommand(int x, int y, const MODCOMMAND mc); void DrawChannelVUMeter(HDC hdc, int x, int y, UINT nChn); void UpdateAllVUMeters(MPTNOTIFICATION *pnotify); void DrawDragSel(HDC hdc); Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2009-06-24 19:39:33 UTC (rev 276) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-06-25 21:53:49 UTC (rev 277) @@ -400,8 +400,7 @@ for (UINT iPerc=24; iPerc<=84; iPerc++) { DWORD dwI... [truncated message content] |
From: <rel...@us...> - 2009-06-29 20:57:37
|
Revision: 278 http://modplug.svn.sourceforge.net/modplug/?rev=278&view=rev Author: relabsoluness Date: 2009-06-29 20:56:43 +0000 (Mon, 29 Jun 2009) Log Message: ----------- [Ref] Minor changes (use of note constants, aligned MODCHANNEL, moved command definitions to modcommand.h, simplified CSoundFile::GetNoteName, updated CVstPlugin when building with NO_VST). Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/soundlib/Mmx_mix.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/modcommand.h Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -950,7 +950,7 @@ if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; - if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note+0xFF, 0, MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note+NOTE_KEYOFF, 0, MAX_BASECHANNELS); } } @@ -1017,7 +1017,7 @@ CVstPlugin *pPlug = (CVstPlugin*)m_SndFile.m_MixPlugins[nPlug-1].pMixPlugin; INSTRUMENTHEADER* penv = m_SndFile.Chn[nChn].pHeader; if (pPlug && penv) { - pPlug->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, 0xFF, 0, nChn); + pPlug->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, NOTE_KEYOFF, 0, nChn); } } } else { Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -707,7 +707,7 @@ m_pDocManager = new CModDocManager(); #ifdef _DEBUG - // ASSERT((sizeof(MODCHANNEL)&7) == 0); + ASSERT((sizeof(MODCHANNEL)&7) == 0); // Disabled by rewbs for smoothVST. Might cause minor perf issues due to increased cache misses? #endif Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -3879,7 +3879,7 @@ { ins = m_nSplitInstrument; if (m_bOctaveLink) note += 12*(m_nOctaveModifier-9); - if (note > NOTE_MAX && note<254) note = NOTE_MAX; + if (note > NOTE_MAX && note < NOTE_NOTECUT) note = NOTE_MAX; if (note<0) note=1; } if (!ins) ins = GetCurrentInstrument(); @@ -4536,7 +4536,7 @@ if(GetCurrentInstrument()) p->instr = GetCurrentInstrument(); if (m_bOctaveLink) note += 12*(m_nOctaveModifier-9); - if (note > NOTE_MAX && note<254) note = NOTE_MAX; + if (note > NOTE_MAX && note < NOTE_NOTECUT) note = NOTE_MAX; if (note<0) note=1; p->note = note; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -2647,12 +2647,12 @@ // Specific Note Off - if (note > 0xFF) //rewbs.vstiLive + if (note > NOTE_KEYOFF) //rewbs.vstiLive { dwMidiCode = 0x80|nCh; //note off, on chan nCh note--; - UINT i = note - 0xFF; + UINT i = note - NOTE_KEYOFF; if (pCh->uNoteOnMap[i][trackChannel]) { pCh->uNoteOnMap[i][trackChannel]--; @@ -2663,7 +2663,7 @@ // "Hard core" All Sounds Off on this midi and tracker channel // This one doesn't check the note mask - just one note off per note. // Also less likely to cause a VST event buffer overflow. - else if (note == 0xFE) // ^^ + else if (note == NOTE_NOTECUT) // ^^ { //MidiSend(0xB0|nCh|(0x79<<8)); // reset all controllers MidiSend(0xB0|nCh|(0x7b<<8)); // all notes off Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/mptrack/Vstplug.h 2009-06-29 20:56:43 UTC (rev 278) @@ -204,10 +204,10 @@ VOID GetPluginType(LPSTR) {} long GetNumPrograms() {return 0;} long GetProgramNameIndexed(long, long, char*) {return 0;} - VOID SetParameter(UINT, FLOAT) {} + VOID SetParameter(PlugParamIndex nIndex, PlugParamValue fValue) {} VOID GetParamLabel(UINT, LPSTR) {} VOID GetParamDisplay(UINT, LPSTR) {} - FLOAT GetParameter(UINT) {return 0;} + PlugParamValue GetParameter(PlugParamIndex nIndex) {return 0;} bool LoadProgram(CString) {return false;} bool SaveProgram(CString) {return false;} VOID SetCurrentProgram(UINT) {} Modified: trunk/OpenMPT/soundlib/Mmx_mix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Mmx_mix.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/soundlib/Mmx_mix.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -161,7 +161,7 @@ { CHAR s[64]; wsprintf(s, "MODCHANNEL not aligned: sizeof(MODCHANNEL) = %d", sizeof(MODCHANNEL)); - //::MessageBox(NULL, s, NULL, MB_OK|MB_ICONEXCLAMATION); //disabled by rewbs + ::MessageBox(NULL, s, NULL, MB_OK|MB_ICONEXCLAMATION); //disabled by rewbs } DWORD dwFastSinc = (DWORD)(LPVOID)gFastSinc; if (dwFastSinc & 7) Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -939,7 +939,7 @@ //switch off duplicated note played on this plugin IMixPlugin *pPlugin = m_MixPlugins[pHeader->nMixPlug-1].pMixPlugin; if (pPlugin && p->nNote) - pPlugin->MidiCommand(p->pHeader->nMidiChannel, p->pHeader->nMidiProgram, p->pHeader->wMidiBank, p->nNote+0xFF, 0, i); + pPlugin->MidiCommand(p->pHeader->nMidiChannel, p->pHeader->nMidiProgram, p->pHeader->wMidiBank, p->nNote+NOTE_KEYOFF, 0, i); break; } } @@ -1027,7 +1027,7 @@ case NNA_NOTEFADE: //switch off note played on this plugin, on this tracker channel and midi channel //pPlugin->MidiCommand(pChn->pHeader->nMidiChannel, pChn->pHeader->nMidiProgram, pChn->nNote+0xFF, 0, n); - pPlugin->MidiCommand(pChn->pHeader->nMidiChannel, pChn->pHeader->nMidiProgram, pChn->pHeader->wMidiBank, /*pChn->nNote+*/0xFF, 0, nChn); + pPlugin->MidiCommand(pChn->pHeader->nMidiChannel, pChn->pHeader->nMidiProgram, pChn->pHeader->wMidiBank, /*pChn->nNote+*/NOTE_KEYOFF, 0, nChn); break; } } @@ -3030,7 +3030,7 @@ if ((nPlug) && (nPlug <= MAX_MIXPLUGINS)) { IMixPlugin *pPlug = (IMixPlugin*)m_MixPlugins[nPlug-1].pMixPlugin; if (pPlug) { - pPlug->MidiCommand(pHeader->nMidiChannel, pHeader->nMidiProgram, pHeader->wMidiBank, /*pChn->nNote+*/0xFF, 0, nChn); + pPlug->MidiCommand(pHeader->nMidiChannel, pHeader->nMidiProgram, pHeader->wMidiBank, /*pChn->nNote+*/NOTE_KEYOFF, 0, nChn); } } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-29 20:56:43 UTC (rev 278) @@ -2876,14 +2876,14 @@ string CSoundFile::GetNoteName(const CTuning::NOTEINDEXTYPE& note, const int inst) const //---------------------------------------------------------------------------------- { - if(inst >= MAX_INSTRUMENTS || inst < -1) return "BUG"; + if(inst >= MAX_INSTRUMENTS || inst < -1 || note < 1 || note > NOTE_MAX) return "BUG"; if(inst == -1) - return string(szNoteNames[abs(note-1)%12]) + Stringify((note-1)/12); + return szDefaultNoteNames[note-1]; if(m_nType == MOD_TYPE_MPT && Headers[inst] && Headers[inst]->pTuning) return Headers[inst]->pTuning->GetNoteName(note-NOTE_MIDDLEC); else - return string(szNoteNames[abs(note-1)%12]) + Stringify((note-1)/12); + return szDefaultNoteNames[note-1]; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-06-29 20:56:43 UTC (rev 278) @@ -162,44 +162,6 @@ #define ENV_PITCHCARRY 0x2000 #define ENV_MUTE 0x4000 -#define CMD_NONE 0 -#define CMD_ARPEGGIO 1 -#define CMD_PORTAMENTOUP 2 -#define CMD_PORTAMENTODOWN 3 -#define CMD_TONEPORTAMENTO 4 -#define CMD_VIBRATO 5 -#define CMD_TONEPORTAVOL 6 -#define CMD_VIBRATOVOL 7 -#define CMD_TREMOLO 8 -#define CMD_PANNING8 9 -#define CMD_OFFSET 10 -#define CMD_VOLUMESLIDE 11 -#define CMD_POSITIONJUMP 12 -#define CMD_VOLUME 13 -#define CMD_PATTERNBREAK 14 -#define CMD_RETRIG 15 -#define CMD_SPEED 16 -#define CMD_TEMPO 17 -#define CMD_TREMOR 18 -#define CMD_MODCMDEX 19 -#define CMD_S3MCMDEX 20 -#define CMD_CHANNELVOLUME 21 -#define CMD_CHANNELVOLSLIDE 22 -#define CMD_GLOBALVOLUME 23 -#define CMD_GLOBALVOLSLIDE 24 -#define CMD_KEYOFF 25 -#define CMD_FINEVIBRATO 26 -#define CMD_PANBRELLO 27 -#define CMD_XFINEPORTAUPDOWN 28 -#define CMD_PANNINGSLIDE 29 -#define CMD_SETENVPOSITION 30 -#define CMD_MIDI 31 -#define CMD_SMOOTHMIDI 32 //rewbs.smoothVST -#define CMD_VELOCITY 33 //rewbs.velocity -// -> CODE#0010 -// -> DESC="add extended parameter mechanism to pattern effects" -#define CMD_XPARAM 34 -// -! NEW_FEATURE#0010 // Filter Modes #define FLTMODE_UNCHANGED 0xFF @@ -207,22 +169,6 @@ #define FLTMODE_HIGHPASS 1 #define FLTMODE_BANDPASS 2 -// Volume Column commands -#define VOLCMD_VOLUME 1 -#define VOLCMD_PANNING 2 -#define VOLCMD_VOLSLIDEUP 3 -#define VOLCMD_VOLSLIDEDOWN 4 -#define VOLCMD_FINEVOLUP 5 -#define VOLCMD_FINEVOLDOWN 6 -#define VOLCMD_VIBRATOSPEED 7 -#define VOLCMD_VIBRATO 8 -#define VOLCMD_PANSLIDELEFT 9 -#define VOLCMD_PANSLIDERIGHT 10 -#define VOLCMD_TONEPORTAMENTO 11 -#define VOLCMD_PORTAUP 12 -#define VOLCMD_PORTADOWN 13 -#define VOLCMD_VELOCITY 14 //rewbs.velocity -#define VOLCMD_OFFSET 15 //rewbs.volOff #define RSF_16BIT 0x04 #define RSF_STEREO 0x08 @@ -544,7 +490,7 @@ // Channel Struct -typedef struct _MODCHANNEL +typedef struct __declspec(align(32)) _MODCHANNEL { // First 32-bytes: Most used mixing information: don't change it LPSTR pCurrentSample; @@ -584,9 +530,9 @@ LONG nVolSwing, nPanSwing; LONG nCutSwing, nResSwing; LONG nRestorePanOnNewNote; //If > 0, nPan should be set to nRestorePanOnNewNote - 1 on new note. Used to recover from panswing. - LONG nRestoreResonanceOnNewNote; //Like above - LONG nRestoreCutoffOnNewNote; //Like above // 8-bit members + BYTE nRestoreResonanceOnNewNote; //Like above + BYTE nRestoreCutoffOnNewNote; //Like above BYTE nNote, nNNA; BYTE nNewNote, nNewIns, nCommand, nArpeggio; BYTE nOldVolumeSlide, nOldFineVolUpDown; @@ -607,11 +553,11 @@ BYTE nLeftVU, nRightVU; BYTE nActiveMacro, nFilterMode; + uint16 m_RowPlugParam; //NOTE_PCs memory. float m_nPlugParamValueStep; //rewbs.smoothVST float m_nPlugInitialParamValue; //rewbs.smoothVST - long m_RowPlugParam; //NOTE_PCs memory. PLUGINDEX m_RowPlug; //NOTE_PCs memory. - + void ClearRowCmd() {nRowNote = 0; nRowInstr = 0; nRowVolCmd = 0; nRowVolume = 0; nRowCommand = 0; nRowParam = 0;} typedef UINT VOLUME; Modified: trunk/OpenMPT/soundlib/modcommand.h =================================================================== --- trunk/OpenMPT/soundlib/modcommand.h 2009-06-25 21:53:49 UTC (rev 277) +++ trunk/OpenMPT/soundlib/modcommand.h 2009-06-29 20:56:43 UTC (rev 278) @@ -69,4 +69,60 @@ #define NOTE_MIN_SPECIAL NOTE_PCS +// Volume Column commands +#define VOLCMD_VOLUME 1 +#define VOLCMD_PANNING 2 +#define VOLCMD_VOLSLIDEUP 3 +#define VOLCMD_VOLSLIDEDOWN 4 +#define VOLCMD_FINEVOLUP 5 +#define VOLCMD_FINEVOLDOWN 6 +#define VOLCMD_VIBRATOSPEED 7 +#define VOLCMD_VIBRATO 8 +#define VOLCMD_PANSLIDELEFT 9 +#define VOLCMD_PANSLIDERIGHT 10 +#define VOLCMD_TONEPORTAMENTO 11 +#define VOLCMD_PORTAUP 12 +#define VOLCMD_PORTADOWN 13 +#define VOLCMD_VELOCITY 14 //rewbs.velocity +#define VOLCMD_OFFSET 15 //rewbs.volOff + + +// Effect column commands +#define CMD_NONE 0 +#define CMD_ARPEGGIO 1 +#define CMD_PORTAMENTOUP 2 +#define CMD_PORTAMENTODOWN 3 +#define CMD_TONEPORTAMENTO 4 +#define CMD_VIBRATO 5 +#define CMD_TONEPORTAVOL 6 +#define CMD_VIBRATOVOL 7 +#define CMD_TREMOLO 8 +#define CMD_PANNING8 9 +#define CMD_OFFSET 10 +#define CMD_VOLUMESLIDE 11 +#define CMD_POSITIONJUMP 12 +#define CMD_VOLUME 13 +#define CMD_PATTERNBREAK 14 +#define CMD_RETRIG 15 +#define CMD_SPEED 16 +#define CMD_TEMPO 17 +#define CMD_TREMOR 18 +#define CMD_MODCMDEX 19 +#define CMD_S3MCMDEX 20 +#define CMD_CHANNELVOLUME 21 +#define CMD_CHANNELVOLSLIDE 22 +#define CMD_GLOBALVOLUME 23 +#define CMD_GLOBALVOLSLIDE 24 +#define CMD_KEYOFF 25 +#define CMD_FINEVIBRATO 26 +#define CMD_PANBRELLO 27 +#define CMD_XFINEPORTAUPDOWN 28 +#define CMD_PANNINGSLIDE 29 +#define CMD_SETENVPOSITION 30 +#define CMD_MIDI 31 +#define CMD_SMOOTHMIDI 32 //rewbs.smoothVST +#define CMD_VELOCITY 33 //rewbs.velocity +#define CMD_XPARAM 34 // -> CODE#0010 -> DESC="add extended parameter mechanism to pattern effects" -! NEW_FEATURE#0010 + + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-07-01 20:02:40
|
Revision: 279 http://modplug.svn.sourceforge.net/modplug/?rev=279&view=rev Author: relabsoluness Date: 2009-07-01 20:02:20 +0000 (Wed, 01 Jul 2009) Log Message: ----------- (patches from Jojo, merged somewhat modified) [Fix] GDM import: GDM files now show in the load dialogs, MOD transpose/finetune related fix, Endian fixes. [Imp] Sample tab: Better loop point handling when deleting sample selections. [Fix] Sample tab: Transpose is now disabled when using MOD format. [Mod] General: Changes to default general options configuration. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -599,6 +599,9 @@ m_CheckPanning.EnableWindow(b && !(m_pSndFile->GetType() & MOD_TYPE_XM)); m_EditPanning.EnableWindow(b); m_SpinPanning.EnableWindow(b); + + b = (m_pSndFile->m_nType & MOD_TYPE_MOD) ? FALSE : TRUE; + m_CbnBaseNote.EnableWindow(b); } // Updating Values if (dwHintMask & (HINT_MODTYPE|HINT_SAMPLEINFO)) Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -200,7 +200,8 @@ DWORD CMainFrame::m_dwPatternSetup = PATTERN_PLAYNEWNOTE | PATTERN_EFFECTHILIGHT | PATTERN_SMALLFONT | PATTERN_CENTERROW | PATTERN_AUTOSPACEBAR | PATTERN_DRAGNDROPEDIT | PATTERN_FLATBUTTONS - | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT | PATTERN_HILITETIMESIGS; + | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT | PATTERN_HILITETIMESIGS + | PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE; DWORD CMainFrame::m_nRowSpacing = 16; DWORD CMainFrame::m_nRowSpacing2 = 4; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -1253,11 +1253,12 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" // "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|" +// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2;*.gdm|" #ifndef NO_MO3_SUPPORT - "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.mo3|" + "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.mo3|" "Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz;*.mo3)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha;*.mo3|" #else - "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2|" + "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm|" "Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha|" #endif // -! NEW_FEATURE#0023 @@ -1270,7 +1271,7 @@ "Impulse Tracker Projects (*.itp)|*.itp;*.itpz|" // -! NEW_FEATURE#0023 "OpenMPT Modules (*.mptm)|*.mptm;*.mptmz|" - "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2|" + "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm|" "Wave Files (*.wav)|*.wav|" "Midi Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|" "All Files (*.*)|*.*||", Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -1704,6 +1704,31 @@ p[i] = (i+cutlen < iend) ? p[i+cutlen] : (char)0; } len = pins->nLength; + + // adjust loop points (could need some optimization) + if(m_dwBeginSel < pins->nLoopStart && m_dwEndSel < pins->nLoopStart) + { + // cut part is before loop start + pins->nLoopStart -= m_dwEndSel - m_dwBeginSel; + pins->nLoopEnd -= m_dwEndSel - m_dwBeginSel; + } + else if(m_dwBeginSel < pins->nLoopStart && m_dwEndSel < pins->nLoopEnd) + { + // cut part is partly before loop start + pins->nLoopStart = m_dwBeginSel; + pins->nLoopEnd -= m_dwEndSel - m_dwBeginSel; + } + else if(m_dwBeginSel > pins->nLoopStart && m_dwEndSel < pins->nLoopEnd) + { + // cut part is in the loop + pins->nLoopEnd -= m_dwEndSel - m_dwBeginSel; + } + else if(m_dwBeginSel > pins->nLoopStart && m_dwBeginSel < pins->nLoopEnd && m_dwEndSel > pins->nLoopEnd) + { + // cut part is partly before loop end + pins->nLoopEnd = m_dwBeginSel; + } + if (pins->nLoopEnd > len) pins->nLoopEnd = len; if (pins->nLoopStart + 4 >= pins->nLoopEnd) { Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -29,8 +29,8 @@ UINT16 TrackID; // Composing Tracker ID code (00 = 2GDM) BYTE TrackMajorVer; // Tracker's major version BYTE TrackMinorVer; // Tracker's minor version - BYTE PanMap[32]; // 0-Left to 15-Right, 255-N/U - BYTE MastVol; // Range: 0...64 + BYTE PanMap[32]; // 0-Left to 15-Right, 255-N/U + BYTE MastVol; // Range: 0...64 BYTE Tempo; // Initial music tempo (6) BYTE BPM; // Initial music BPM (125) UINT16 FormOrigin; // Original format ID: @@ -38,32 +38,32 @@ // (versions of 2GDM prior to v1.15 won't set this correctly) UINT32 OrdOffset; - BYTE NOO; // Number of orders in module - 1 + BYTE NOO; // Number of orders in module - 1 UINT32 PatOffset; - BYTE NOP; // Number of patterns in module - 1 + BYTE NOP; // Number of patterns in module - 1 UINT32 SamHeadOffset; UINT32 SamOffset; - BYTE NOS; // Number of samples in module - 1 - UINT32 MTOffset; // Offset of song message + BYTE NOS; // Number of samples in module - 1 + UINT32 MTOffset; // Offset of song message UINT32 MTLength; - UINT32 SSOffset; // Offset of scrolly script (huh?) + UINT32 SSOffset; // Offset of scrolly script (huh?) UINT16 SSLength; - UINT32 TGOffset; // Offset of text graphic (huh?) + UINT32 TGOffset; // Offset of text graphic (huh?) UINT16 TGLength; } GDMHEADER, *PGDMHEADER; typedef struct _GDMSAMPLEHEADER { - CHAR SamName[32]; - CHAR FileName[12]; + CHAR SamName[32]; // sample's name + CHAR FileName[12]; // sample's filename BYTE EmsHandle; // useless - UINT32 Length; - UINT32 LoopBegin; - UINT32 LoopEnd; - BYTE Flags; - UINT16 C4Hertz; - BYTE Volume; - BYTE Pan; + UINT32 Length; // length in bytes + UINT32 LoopBegin; // loop start in samples + UINT32 LoopEnd; // loop end in samples + BYTE Flags; // misc. flags + UINT16 C4Hertz; // frequency + BYTE Volume; // default volume + BYTE Pan; // default pan } GDMSAMPLEHEADER, *PGDMSAMPLEHEADER; BOOL CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength) @@ -90,7 +90,7 @@ return FALSE; } - // todo: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe + // interesting question: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe, so the answer would be no. // read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist m_nChannels = 32; @@ -121,7 +121,7 @@ // 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED - switch(pHeader->FormOrigin) + switch(LittleEndianW(pHeader->FormOrigin)) { case 1: m_nType = MOD_TYPE_MOD; @@ -152,29 +152,36 @@ return FALSE; break; } + UINT32 iSampleOffset = LittleEndian(pHeader->SamOffset), + iPatternsOffset = LittleEndian(pHeader->PatOffset); + const UINT32 iOrdOffset = LittleEndian(pHeader->OrdOffset), iSamHeadOffset = LittleEndian(pHeader->SamHeadOffset), + iMTOffset = LittleEndian(pHeader->MTOffset), iMTLength = LittleEndian(pHeader->MTLength), + iSSOffset = LittleEndian(pHeader->SSOffset), iSSLength = LittleEndianW(pHeader->SSLength), + iTGOffset = LittleEndian(pHeader->TGOffset), iTGLength = LittleEndianW(pHeader->TGLength); + + // check if offsets are valid. we won't read the scrolly text or text graphics, but invalid pointers would probably indicate a broken file... - if( dwMemLength < pHeader->OrdOffset || dwMemLength - pHeader->OrdOffset < pHeader->NOO - || dwMemLength < pHeader->PatOffset - || dwMemLength < pHeader->SamHeadOffset || dwMemLength - pHeader->SamHeadOffset < (pHeader->NOS + 1) * sizeof(GDMSAMPLEHEADER) - || dwMemLength < pHeader->SamOffset - || dwMemLength < pHeader->MTOffset || dwMemLength - pHeader->MTOffset < pHeader->MTLength - || dwMemLength < pHeader->SSOffset || dwMemLength - pHeader->SSOffset < pHeader->SSLength - || dwMemLength < pHeader->TGOffset || dwMemLength - pHeader->TGOffset < pHeader->TGLength) + if( dwMemLength < iOrdOffset || dwMemLength - iOrdOffset < pHeader->NOO + || dwMemLength < iPatternsOffset + || dwMemLength < iSamHeadOffset || dwMemLength - iSamHeadOffset < (pHeader->NOS + 1) * sizeof(GDMSAMPLEHEADER) + || dwMemLength < iSampleOffset + || dwMemLength < iMTOffset || dwMemLength - iMTOffset < iMTLength + || dwMemLength < iSSOffset || dwMemLength - iSSOffset < iSSLength + || dwMemLength < iTGOffset || dwMemLength - iTGOffset < iTGLength) return FALSE; // read orders - Order.ReadAsByte(lpStream + pHeader->OrdOffset, pHeader->NOO + 1, dwMemLength - pHeader->OrdOffset); + Order.ReadAsByte(lpStream + iOrdOffset, pHeader->NOO + 1, dwMemLength - iOrdOffset); // read samples m_nSamples = pHeader->NOS + 1; - DWORD iSampleOffset = pHeader->SamOffset; int iLZWsamples = 0; for(UINT iSmp = 1; iSmp <= m_nSamples; iSmp++) { - const PGDMSAMPLEHEADER pSample = (PGDMSAMPLEHEADER)(lpStream + pHeader->SamHeadOffset + (iSmp - 1) * sizeof(GDMSAMPLEHEADER)); + const PGDMSAMPLEHEADER pSample = (PGDMSAMPLEHEADER)(lpStream + iSamHeadOffset + (iSmp - 1) * sizeof(GDMSAMPLEHEADER)); // sample header @@ -182,13 +189,31 @@ SetNullTerminator(m_szNames[iSmp]); memcpy(Ins[iSmp].name, pSample->FileName, 12); - Ins[iSmp].nC4Speed = pSample->C4Hertz; + Ins[iSmp].nC4Speed = LittleEndianW(pSample->C4Hertz); Ins[iSmp].nGlobalVol = 256; // not supported in this format - Ins[iSmp].nLength = min(pSample->Length, MAX_SAMPLE_LENGTH); // in bytes - Ins[iSmp].nLoopStart = min(pSample->LoopBegin, Ins[iSmp].nLength); // in samples - Ins[iSmp].nLoopEnd = min(pSample->LoopEnd - 1, Ins[iSmp].nLength); // dito + Ins[iSmp].nLength = min(LittleEndian(pSample->Length), MAX_SAMPLE_LENGTH); // in bytes + Ins[iSmp].nLoopStart = min(LittleEndian(pSample->LoopBegin), Ins[iSmp].nLength); // in samples + Ins[iSmp].nLoopEnd = min(LittleEndian(pSample->LoopEnd) - 1, Ins[iSmp].nLength); // dito FrequencyToTranspose(&Ins[iSmp]); // set transpose + finetune for mod files + // fix transpose + finetune for some rare cases where transpose is not C-5 (e.g. sample 4 in wander2.mod) + if(m_nType == MOD_TYPE_MOD) + { + while(Ins[iSmp].RelativeTone != 0) + { + if(Ins[iSmp].RelativeTone > 0) + { + Ins[iSmp].RelativeTone -= 1; + Ins[iSmp].nFineTune += 128; + } + else + { + Ins[iSmp].RelativeTone += 1; + Ins[iSmp].nFineTune -= 128; + } + } + } + if(pSample->Flags & 0x01) Ins[iSmp].uFlags |= CHN_LOOP; // loop sample if(pSample->Flags & 0x04) @@ -243,23 +268,21 @@ // read sample data ReadSample(&Ins[iSmp], iSampleFormat, reinterpret_cast<LPCSTR>(lpStream + iSampleOffset), dwMemLength - iSampleOffset); - iSampleOffset += min(pSample->Length, dwMemLength - iSampleOffset); + iSampleOffset += min(LittleEndian(pSample->Length), dwMemLength - iSampleOffset); } // read patterns Patterns.ResizeArray(max(MAX_PATTERNS, pHeader->NOP + 1)); - // position in file - DWORD iPatternsOffset = pHeader->PatOffset; - BOOL bS3MCommandSet = (GetBestSaveFormat() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)); + // we'll start at position iPatternsOffset and decode all patterns for (PATTERNINDEX iPat = 0; iPat < pHeader->NOP + 1; iPat++) { if(iPatternsOffset + 2 > dwMemLength) break; - UINT16 iPatternLength = *(UINT16 *)(lpStream + iPatternsOffset); // pattern length including the two "length" bytes + UINT16 iPatternLength = LittleEndianW(*(UINT16 *)(lpStream + iPatternsOffset)); // pattern length including the two "length" bytes if(iPatternLength > dwMemLength || iPatternsOffset > dwMemLength - iPatternLength) break; if(Patterns.Insert(iPat, 64)) @@ -510,13 +533,13 @@ } // read song comments - if(pHeader->MTLength) + if(iMTLength) { - m_lpszSongComments = new char[pHeader->MTLength + 1]; + m_lpszSongComments = new char[iMTLength + 1]; if (m_lpszSongComments) { - memset(m_lpszSongComments, 0, pHeader->MTLength + 1); - memcpy(m_lpszSongComments, lpStream + pHeader->MTOffset, pHeader->MTLength); + memset(m_lpszSongComments, 0, iMTLength + 1); + memcpy(m_lpszSongComments, lpStream + iMTOffset, iMTLength); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-07-05 21:02:00
|
Revision: 280 http://modplug.svn.sourceforge.net/modplug/?rev=280&view=rev Author: relabsoluness Date: 2009-07-05 21:01:58 +0000 (Sun, 05 Jul 2009) Log Message: ----------- (patch from Jojo, merged somewhat modified) [New] Sample tab: DC offset removal. (merge edits: refactoring: moved implementation to modsmp_ctrl and added some helper functions). Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/res/patterns.bmp trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-07-05 21:01:58 UTC (rev 280) @@ -2328,6 +2328,11 @@ commands[kcNotePCS].isDummy = false; commands[kcNotePCS].Message = "Parameter control(smooth)(MPTm only)"; + commands[kcSampleRemoveDCOffset].UID = 1790; + commands[kcSampleRemoveDCOffset].Message = "Remove DC Offset"; + commands[kcSampleRemoveDCOffset].isHidden = false; + commands[kcSampleRemoveDCOffset].isDummy = false; + #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 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/CommandSet.h 2009-07-05 21:01:58 UTC (rev 280) @@ -572,7 +572,8 @@ kcSampleZoomDown, kcSampleInvert, kcSampleSignUnsign, - kcEndSampleEditing=kcSampleSignUnsign, + kcSampleRemoveDCOffset, + kcEndSampleEditing=kcSampleRemoveDCOffset, //kcSampStartNotes to kcInsNoteMapEndNoteStops must be contiguous. kcSampStartNotes, Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-05 21:01:58 UTC (rev 280) @@ -14,6 +14,7 @@ #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" #include "smbPitchShift.cpp" #pragma warning(default:4244) //"conversion from 'type1' to 'type2', possible loss of data" +#include "modsmp_ctrl.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -67,6 +68,7 @@ ON_COMMAND(IDC_SAMPLE_SILENCE, OnSilence) ON_COMMAND(IDC_SAMPLE_INVERT, OnInvert) ON_COMMAND(IDC_SAMPLE_SIGN_UNSIGN, OnSignUnSign) + ON_COMMAND(IDC_SAMPLE_DCOFFSET, OnRemoveDCOffset) ON_COMMAND(IDC_CHECK1, OnSetPanningChanged) ON_COMMAND(ID_PREVINSTRUMENT, OnPrevInstrument) ON_COMMAND(ID_NEXTINSTRUMENT, OnNextInstrument) @@ -207,6 +209,7 @@ m_ToolBar2.AddButton(IDC_SAMPLE_PLAY, 14); m_ToolBar2.AddButton(IDC_SAMPLE_NORMALIZE, 8); m_ToolBar2.AddButton(IDC_SAMPLE_AMPLIFY, 9); + m_ToolBar2.AddButton(IDC_SAMPLE_DCOFFSET, 37); m_ToolBar2.AddButton(IDC_SAMPLE_UPSAMPLE, 10); m_ToolBar2.AddButton(IDC_SAMPLE_DOWNSAMPLE, 29); m_ToolBar2.AddButton(IDC_SAMPLE_REVERSE, 11); @@ -469,6 +472,10 @@ OnSignUnSign(); break; + case IDC_SAMPLE_DCOFFSET: + OnRemoveDCOffset(); + break; + case IDC_SAMPLE_NORMALIZE: OnNormalize(); break; @@ -1046,8 +1053,8 @@ //Shift -> Normalize all samples if(CMainFrame::GetInputHandler()->ShiftPressed()) { - int ans = MessageBox(GetStrI18N(TEXT("This will normalize all samples independently. Continue?")), GetStrI18N(TEXT("Normalize")), MB_YESNO | MB_ICONQUESTION); - if(ans == IDNO) return; + if(MessageBox(GetStrI18N(TEXT("This will normalize all samples independently. Continue?")), GetStrI18N(TEXT("Normalize")), MB_YESNO | MB_ICONQUESTION) == IDNO) + return; iMinSample = 1; iMaxSample = m_pSndFile->m_nSamples; } else { @@ -1203,6 +1210,89 @@ } +void CCtrlSamples::OnRemoveDCOffset() +//----------------------------------- +{ + if(!m_pModDoc || !m_pSndFile) + return; + + SAMPLEVIEWSTATE viewstate; + UINT iMinSample = m_nSample, iMaxSample = m_nSample; + + memset(&viewstate, 0, sizeof(viewstate)); + SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); + + //Shift -> Process all samples + if(CMainFrame::GetInputHandler()->ShiftPressed()) + { + if(MessageBox(GetStrI18N(TEXT("This will process all samples independently. Continue?")), GetStrI18N(TEXT("DC Offset Removal")), MB_YESNO | MB_ICONQUESTION) == IDNO) + return; + iMinSample = 1; + iMaxSample = m_pSndFile->m_nSamples; + } + + BeginWaitCursor(); + + // for report / SetModified + UINT iModified = 0; + float fReportOffset = 0; + + for(UINT iSmp = iMinSample; iSmp <= iMaxSample; iSmp++) + { + UINT iStart, iEnd; + + if( m_pSndFile->Ins[iSmp].pSample == nullptr ) + continue; + + if (iMinSample != iMaxSample) + { + iStart = 0; + iEnd = m_pSndFile->Ins[iSmp].nLength; + } + else + { + iStart = viewstate.dwBeginSel; + iEnd = viewstate.dwEndSel; + } + const float fOffset = ctrlSmp::RemoveDCOffset(m_pSndFile->Ins[iSmp], iStart, iEnd, m_pSndFile->GetType(), m_pSndFile); + + if(fOffset == 0.0f) // No offset removed. + continue; + + fReportOffset += fOffset; + iModified++; + m_pModDoc->UpdateAllViews(NULL, (iSmp << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); + } + + EndWaitCursor(); + SwitchToView(); + + // fill the statusbar with some nice information + + CString dcInfo; + if(iModified) + { + m_pModDoc->SetModified(); + if(iModified == 1) + { + dcInfo.Format(GetStrI18N(TEXT("Removed DC offset (%.1f%%)")), fReportOffset * 100); + } + else + { + dcInfo.Format(GetStrI18N(TEXT("Removed DC offset from %d samples (avg %0.1f%%)")), iModified, fReportOffset / iModified * 100); + } + } + else + { + dcInfo.SetString(GetStrI18N(TEXT("No DC offset found"))); + } + + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + pMainFrm->SetXInfoText(dcInfo); + +} + + void CCtrlSamples::OnAmplify() //---------------------------- { Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-07-05 21:01:58 UTC (rev 280) @@ -72,6 +72,7 @@ afx_msg void OnSamplePlay(); afx_msg void OnNormalize(); afx_msg void OnAmplify(); + afx_msg void OnRemoveDCOffset(); afx_msg void OnUpsample(); afx_msg void OnDownsample(); afx_msg void OnReverse(); Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-05 21:01:58 UTC (rev 280) @@ -2543,12 +2543,13 @@ case kcSampleSave: PostCtrlMessage(IDC_SAMPLE_SAVEAS); return wParam; case kcSampleNew: PostCtrlMessage(IDC_SAMPLE_NEW); return wParam; - case kcSampleReverse: PostCtrlMessage(IDC_SAMPLE_REVERSE); return wParam; - case kcSampleSilence: PostCtrlMessage(IDC_SAMPLE_SILENCE); return wParam; - case kcSampleNormalize: PostCtrlMessage(IDC_SAMPLE_NORMALIZE); return wParam; - case kcSampleAmplify: PostCtrlMessage(IDC_SAMPLE_AMPLIFY); return wParam; - case kcSampleInvert: PostCtrlMessage(IDC_SAMPLE_INVERT); return wParam; - case kcSampleSignUnsign: PostCtrlMessage(IDC_SAMPLE_SIGN_UNSIGN); return wParam; + case kcSampleReverse: PostCtrlMessage(IDC_SAMPLE_REVERSE); return wParam; + case kcSampleSilence: PostCtrlMessage(IDC_SAMPLE_SILENCE); return wParam; + case kcSampleNormalize: PostCtrlMessage(IDC_SAMPLE_NORMALIZE); return wParam; + case kcSampleAmplify: PostCtrlMessage(IDC_SAMPLE_AMPLIFY); return wParam; + case kcSampleInvert: PostCtrlMessage(IDC_SAMPLE_INVERT); return wParam; + case kcSampleSignUnsign: PostCtrlMessage(IDC_SAMPLE_SIGN_UNSIGN); return wParam; + case kcSampleRemoveDCOffset: PostCtrlMessage(IDC_SAMPLE_DCOFFSET); return wParam; case kcNoteOff: PlayNote(NOTE_KEYOFF); return wParam; case kcNoteCut: PlayNote(NOTE_NOTECUT); return wParam; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-05 21:01:58 UTC (rev 280) @@ -762,7 +762,7 @@ CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13, SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | - 0x4d,268,4,164,17 + 0x4d,268,4,195,17 GROUPBOX "",IDC_STATIC,3,22,94,78 LTEXT "Default Volume",IDC_STATIC,8,32,49,8 LTEXT "Global Volume",IDC_STATIC,8,45,46,8 @@ -2487,6 +2487,11 @@ STRINGTABLE BEGIN + IDC_SAMPLE_DCOFFSET "Remove DC Offset\nRemove DC Offset and normalize (hold shift to process all samples)" +END + +STRINGTABLE +BEGIN ID_ENVELOPE_SETLOOP "Enable or disable the envelope loop" ID_ENVELOPE_SUSTAIN "Enable or disable the envelope sustain" ID_ENVELOPE_INSERTPOINT "Insert a new point in the envelope at the current location" @@ -2499,6 +2504,11 @@ ID_PATTERN_PLAYROW "Play current row\nPlay Row" ID_IMPORT_MIDILIB "Defines the default MIDI library used when importing MIDI files" ID_CLEANUP_REARRANGE "Rearrange all patterns so that they are sorted in the order list\nRearrange Patterns" +END + +STRINGTABLE +BEGIN + ID_EDIT_GOTO_MENU "Go to row / channel / pattern / order" ID_CLEANUP_COMPO "Reset attributes to defaults (useful for creating sample packs)\nCompo Cleanup" END @@ -2585,11 +2595,6 @@ IDS_OPERATION_FAIL "Operation failed." END -STRINGTABLE -BEGIN - ID_EDIT_GOTO_MENU "Go to row / channel / pattern / order" -END - #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// Modified: trunk/OpenMPT/mptrack/res/patterns.bmp =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/mptrack/resource.h 2009-07-05 21:01:58 UTC (rev 280) @@ -829,6 +829,7 @@ #define IDC_MIDIPLAYPATTERNONMIDIIN 2340 #define IDC_DONTSHOWAGAIN 2341 #define IDC_MESSAGETEXT 2342 +#define IDC_SAMPLE_DCOFFSET 2343 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1066,7 +1067,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 518 #define _APS_NEXT_COMMAND_VALUE 59226 -#define _APS_NEXT_CONTROL_VALUE 2343 +#define _APS_NEXT_CONTROL_VALUE 2344 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-05 21:01:58 UTC (rev 280) @@ -170,4 +170,125 @@ } +namespace +{ + struct OffsetData + { + double dMax, dMin, dOffset; + }; + + // Returns maximum sample amplitude for given sample type (int8/int16). + template <class T> + double GetMaxAmplitude() {return 1.0 + (std::numeric_limits<T>::max)();} + + // Calculates DC offset and returns struct with DC offset, max and min values. + // DC offset value is average of [-1.0, 1.0[-normalized offset values. + template<class T> + OffsetData CalculateOffset(const T* pStart, const SmpLength nLength) + //------------------------------------------------------------------ + { + OffsetData offsetVals = {0,0,0}; + + if(nLength < 1) + return offsetVals; + + const double dMaxAmplitude = GetMaxAmplitude<T>(); + + double dMax = -1, dMin = 1, dSum = 0; + + const T* p = pStart; + for (SmpLength i = 0; i < nLength; i++, p++) + { + const double dVal = double(*p) / dMaxAmplitude; + dSum += dVal; + if(dVal > dMax) dMax = dVal; + if(dVal < dMin) dMin = dVal; + } + + offsetVals.dMax = dMax; + offsetVals.dMin = dMin; + offsetVals.dOffset = (-dSum / (double)(nLength)); + return offsetVals; + } + + template <class T> + void RemoveOffsetAndNormalize(T* pStart, const SmpLength nLength, const double dOffset, const double dAmplify) + //------------------------------------------------------------------------------------------------------------ + { + T* p = pStart; + for (UINT i = 0; i < nLength; i++, p++) + { + double dVal = (*p) * dAmplify + dOffset; + Limit(dVal, (std::numeric_limits<T>::min)(), (std::numeric_limits<T>::max)()); + *p = static_cast<T>(dVal); + } + } +}; + +// Remove DC offset +float RemoveDCOffset(MODINSTRUMENT& smp, + SmpLength iStart, + SmpLength iEnd, + const MODTYPE modtype, + CSoundFile* const pSndFile) +//---------------------------------------------- +{ + if(smp.pSample == nullptr || smp.nLength < 1) + return 0; + + MODINSTRUMENT* const pins = &smp; + + if (iEnd > pins->nLength) iEnd = pins->nLength; + if (iStart > iEnd) iStart = iEnd; + if (iStart == iEnd) + { + iStart = 0; + iEnd = pins->nLength; + } + + iStart *= pins->GetNumChannels(); + iEnd *= pins->GetNumChannels(); + + const double dMaxAmplitude = (pins->GetElementarySampleSize() == 2) ? GetMaxAmplitude<int16>() : GetMaxAmplitude<int8>(); + + // step 1: Calculate offset. + OffsetData oData = {0,0,0}; + if(pins->GetElementarySampleSize() == 2) + oData = CalculateOffset(reinterpret_cast<int16*>(pins->pSample) + iStart, iEnd - iStart); + else if(pins->GetElementarySampleSize() == 1) + oData = CalculateOffset(reinterpret_cast<int8*>(pins->pSample) + iStart, iEnd - iStart); + + double dMin = oData.dMin, dMax = oData.dMax, dOffset = oData.dOffset; + + const float fReportOffset = (float)dOffset; + + if((int)(dOffset * dMaxAmplitude) == 0) + return 0; + + // those will be changed... + dMax += dOffset; + dMin += dOffset; + + // ... and that might cause distortion, so we will normalize this. + const double dAmplify = 1 / max(dMax, -dMin); + + // step 2: centralize + normalize sample + dOffset *= dMaxAmplitude * dAmplify; + if(pins->GetElementarySampleSize() == 2) + RemoveOffsetAndNormalize( reinterpret_cast<int16*>(pins->pSample) + iStart, iEnd - iStart, dOffset, dAmplify); + else if(pins->GetElementarySampleSize() == 1) + RemoveOffsetAndNormalize( reinterpret_cast<int8*>(pins->pSample) + iStart, iEnd - iStart, dOffset, dAmplify); + + // step 3: adjust either global vol or default vol of this sample + if(modtype == MOD_TYPE_IT || modtype == MOD_TYPE_MPT) + pins->nGlobalVol = min((WORD)(pins->nGlobalVol / dAmplify), 64); + else if(modtype != MOD_TYPE_NONE) + pins->nVolume = min((WORD)(pins->nVolume / dAmplify), 256); + + AdjustEndOfSample(smp, pSndFile); + + return fReportOffset; +} + + } // namespace ctrlSmp Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-07-01 20:02:20 UTC (rev 279) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-07-05 21:01:58 UTC (rev 280) @@ -35,6 +35,16 @@ // Resets samples. void ResetSamples(CSoundFile& rSndFile, ResetFlag resetflag); -} +// Remove DC offset and normalize. +// Return: If DC offset was removed, returns original offset value, zero otherwise. +float RemoveDCOffset(MODINSTRUMENT& smp, + SmpLength iStart, // Start position (for partial DC offset removal). + SmpLength iEnd, // End position (for partial DC offset removal). + const MODTYPE modtype, // Used to determine whether to adjust global or default volume + // to keep volume level the same given the normalization. + // Volume adjustment is not done if this param is MOD_TYPE_NONE. + CSoundFile* const pSndFile); // Passed to AdjustEndOfSample. +} // Namespace ctrlSmp + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-06 21:49:02
|
Revision: 283 http://modplug.svn.sourceforge.net/modplug/?rev=283&view=rev Author: saga-games Date: 2009-07-06 21:48:54 +0000 (Mon, 06 Jul 2009) Log Message: ----------- [Mod] Sample editor: DC offset removal won't affect default volume, global volume won't be set when only parts of a sample are being processed [Imp] Note properties: Added description for S1x - Glissando Control Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-06 17:34:31 UTC (rev 282) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-06 21:48:54 UTC (rev 283) @@ -2638,6 +2638,12 @@ { switch(param & 0xF0) { + case 0x10: + if((param & 0x0F) == 0) + strcpy(s, "smooth"); + else + strcpy(s, "semitones"); + break; case 0x30: case 0x40: case 0x50: Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-06 17:34:31 UTC (rev 282) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-06 21:48:54 UTC (rev 283) @@ -279,11 +279,9 @@ else if(pins->GetElementarySampleSize() == 1) RemoveOffsetAndNormalize( reinterpret_cast<int8*>(pins->pSample) + iStart, iEnd - iStart, dOffset, dAmplify); - // step 3: adjust either global vol or default vol of this sample - if(modtype == MOD_TYPE_IT || modtype == MOD_TYPE_MPT) + // step 3: adjust global vol (if available) + if((modtype & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (iStart == 0) && (iEnd = pins->nLength)) pins->nGlobalVol = min((WORD)(pins->nGlobalVol / dAmplify), 64); - else if(modtype != MOD_TYPE_NONE) - pins->nVolume = min((WORD)(pins->nVolume / dAmplify), 256); AdjustEndOfSample(smp, pSndFile); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-08 14:45:17
|
Revision: 286 http://modplug.svn.sourceforge.net/modplug/?rev=286&view=rev Author: saga-games Date: 2009-07-08 14:45:05 +0000 (Wed, 08 Jul 2009) Log Message: ----------- [Fix] Short loops in S3M samples are now recognized [New] Sample editor: Batch export samples (shift + click on "save sample" icon - this was introduced in the last commit already and has been slightly modified in this commit) [Ref] Minor code updates (mostly comments) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-08 08:55:44 UTC (rev 285) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-08 14:45:05 UTC (rev 286) @@ -1015,7 +1015,9 @@ "Wave File (*.wav)|*.wav|" "RAW Audio (*.raw)|*.raw||", this); - dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_SAMPLES); + const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_SAMPLES); + if(pszWdir[0]) + dlg.m_ofn.lpstrInitialDir = pszWdir; if (dlg.DoModal() != IDOK) return; BeginWaitCursor(); @@ -1051,7 +1053,6 @@ 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); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-08 08:55:44 UTC (rev 285) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-08 14:45:05 UTC (rev 286) @@ -367,9 +367,12 @@ insfile[iSmp] = ((DWORD)LittleEndianW(*((LPWORD)(s+0x0E)))) << 4; insfile[iSmp] += ((DWORD)(BYTE)s[0x0D]) << 20; if (insfile[iSmp] > dwMemLength) insfile[iSmp] &= 0xFFFF; - if ((Ins[iSmp].nLoopStart >= Ins[iSmp].nLoopEnd) || (Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart < 8)) - Ins[iSmp].nLoopStart = Ins[iSmp].nLoopEnd = 0; + if ((Ins[iSmp].nLoopStart >= Ins[iSmp].nLoopEnd) || (Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart < 1)) + Ins[iSmp].nLoopStart = Ins[iSmp].nLoopEnd = 0; + UINT iLooplength = Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart; + if(iLooplength > 0 && iLooplength < 8) Ins[iSmp].nLoopEnd = Ins[iSmp].nLoopStart + 8; Ins[iSmp].nPan = 0x80; + // ASSERT(iLooplength == 0 || iLooplength > 10); } } // Reading patterns @@ -727,4 +730,3 @@ #pragma warning(default:4100) #endif // MODPLUG_NO_FILESAVE - Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-08 08:55:44 UTC (rev 285) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-08 14:45:05 UTC (rev 286) @@ -2432,7 +2432,7 @@ pChn->nPan = (param << 4) + 8; pChn->dwFlags |= CHN_FASTVOLRAMP; } break; - // S9x: Set Surround + // S9x: Sound Control case 0x90: ExtendedChannelEffect(pChn, param & 0x0F); break; // SAx: Set 64k Offset case 0xA0: if (!m_nTickCount) @@ -2450,7 +2450,7 @@ case 0xC0: NoteCut(nChn, param); break; // SDx: Note Delay // SEx: Pattern Delay for x rows - // SFx: S3M: Funk Repeat, IT: Set Active Midi Macro + // SFx: S3M: Not used, IT: Set Active Midi Macro case 0xF0: pChn->nActiveMacro = param; break; } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-08 08:55:44 UTC (rev 285) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-08 14:45:05 UTC (rev 286) @@ -29,7 +29,7 @@ #define UNRAR_SUPPORT #define UNLHA_SUPPORT #define ZIPPED_MOD_SUPPORT -LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx" +LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx|gdm" #ifndef NO_UNMO3_SUPPORT "|mo3" #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-07-08 18:38:42
|
Revision: 287 http://modplug.svn.sourceforge.net/modplug/?rev=287&view=rev Author: relabsoluness Date: 2009-07-08 18:38:38 +0000 (Wed, 08 Jul 2009) Log Message: ----------- Project settings: -Added VS2008 project files and a few build directives(see Stdafx.h). -Configuration change: Debug build will now use DLL libraries. Modified Paths: -------------- trunk/OpenMPT/mptrack/Stdafx.h trunk/OpenMPT/mptrack/mptrack.vcproj Added Paths: ----------- trunk/OpenMPT/mptrack/MPTRACK_08.sln trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/soundtouch/soundtouch_08.vcproj trunk/OpenMPT/unlha/unlha_08.vcproj trunk/OpenMPT/unrar/unrar_08.vcproj trunk/OpenMPT/unzip/unzip_08.vcproj trunk/OpenMPT/xsoundlib/xsoundlib_08.vcproj Added: trunk/OpenMPT/mptrack/MPTRACK_08.sln =================================================================== --- trunk/OpenMPT/mptrack/MPTRACK_08.sln (rev 0) +++ trunk/OpenMPT/mptrack/MPTRACK_08.sln 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,55 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mptrack", "mptrack_08.vcproj", "{21D95071-FB97-4E69-B3B1-050D0D4A5021}" + ProjectSection(ProjectDependencies) = postProject + {44316F22-904E-48AA-B841-5A3A6AC77319} = {44316F22-904E-48AA-B841-5A3A6AC77319} + {FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8} = {FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8} + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} = {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} + {FF541CE2-DAA1-4F84-9883-0A0F111BAA0B} = {FF541CE2-DAA1-4F84-9883-0A0F111BAA0B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unlha", "..\unlha\unlha_08.vcproj", "{FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unrar", "..\unrar\unrar_08.vcproj", "{FF541CE2-DAA1-4F84-9883-0A0F111BAA0B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unzip", "..\unzip\unzip_08.vcproj", "{44316F22-904E-48AA-B841-5A3A6AC77319}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\xsoundlib\xsoundlib_08.vcproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\soundtouch\soundtouch_08.vcproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {21D95071-FB97-4E69-B3B1-050D0D4A5021}.Debug|Win32.ActiveCfg = Debug|Win32 + {21D95071-FB97-4E69-B3B1-050D0D4A5021}.Debug|Win32.Build.0 = Debug|Win32 + {21D95071-FB97-4E69-B3B1-050D0D4A5021}.Release|Win32.ActiveCfg = Release|Win32 + {21D95071-FB97-4E69-B3B1-050D0D4A5021}.Release|Win32.Build.0 = Release|Win32 + {FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8}.Debug|Win32.Build.0 = Debug|Win32 + {FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8}.Release|Win32.ActiveCfg = Release|Win32 + {FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8}.Release|Win32.Build.0 = Release|Win32 + {FF541CE2-DAA1-4F84-9883-0A0F111BAA0B}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF541CE2-DAA1-4F84-9883-0A0F111BAA0B}.Debug|Win32.Build.0 = Debug|Win32 + {FF541CE2-DAA1-4F84-9883-0A0F111BAA0B}.Release|Win32.ActiveCfg = Release|Win32 + {FF541CE2-DAA1-4F84-9883-0A0F111BAA0B}.Release|Win32.Build.0 = Release|Win32 + {44316F22-904E-48AA-B841-5A3A6AC77319}.Debug|Win32.ActiveCfg = Debug|Win32 + {44316F22-904E-48AA-B841-5A3A6AC77319}.Debug|Win32.Build.0 = Debug|Win32 + {44316F22-904E-48AA-B841-5A3A6AC77319}.Release|Win32.ActiveCfg = Release|Win32 + {44316F22-904E-48AA-B841-5A3A6AC77319}.Release|Win32.Build.0 = Release|Win32 + {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Debug|Win32.ActiveCfg = Debug|Win32 + {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Debug|Win32.Build.0 = Debug|Win32 + {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Release|Win32.ActiveCfg = Release|Win32 + {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Release|Win32.Build.0 = Release|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Debug|Win32.Build.0 = Debug|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Release|Win32.ActiveCfg = Release|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Modified: trunk/OpenMPT/mptrack/Stdafx.h =================================================================== --- trunk/OpenMPT/mptrack/Stdafx.h 2009-07-08 14:45:05 UTC (rev 286) +++ trunk/OpenMPT/mptrack/Stdafx.h 2009-07-08 18:38:38 UTC (rev 287) @@ -29,6 +29,9 @@ #define MMNODRV #define MMNOMCI +//#define _CRT_SECURE_NO_WARNINGS // Define to disable the "This function or variable may be unsafe" warnings. +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1 #include <afxwin.h> // MFC core and standard components Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-07-08 14:45:05 UTC (rev 286) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -17,7 +17,7 @@ OutputDirectory=".\Debug" IntermediateDirectory=".\Debug" ConfigurationType="1" - UseOfMFC="1" + UseOfMFC="2" ATLMinimizesCRunTimeLibraryUsage="FALSE"> <Tool Name="VCCLCompilerTool" @@ -28,7 +28,7 @@ PreprocessorDefinitions="_DEBUG,WIN32,_WINDOWS,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW,ENABLE_MMX" StringPooling="TRUE" BasicRuntimeChecks="3" - RuntimeLibrary="1" + RuntimeLibrary="3" BufferSecurityCheck="TRUE" EnableFunctionLevelLinking="TRUE" ForceConformanceInForLoopScope="TRUE" Added: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj (rev 0) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,1237 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="mptrack" + ProjectGUID="{21D95071-FB97-4E69-B3B1-050D0D4A5021}" + RootNamespace="mptrack" + Keyword="MFCProj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="1" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="2" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="_DEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\Debug/mptrack.tlb" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/EHsc" + Optimization="0" + AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib,..\" + PreprocessorDefinitions="_DEBUG,WIN32,_WINDOWS,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW,ENABLE_MMX" + StringPooling="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + ForceConformanceInForLoopScope="true" + UsePrecompiledHeader="2" + PrecompiledHeaderThrough="stdafx.h" + PrecompiledHeaderFile=".\Debug/mptrack.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + BrowseInformation="1" + WarningLevel="4" + SuppressStartupBanner="false" + DebugInformationFormat="4" + CompileAs="0" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalOptions="/MACHINE:I386" + AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib delayimp.lib" + OutputFile=".\Debug/mptrack.exe" + Version="5.0" + LinkIncremental="2" + SuppressStartupBanner="true" + AdditionalLibraryDirectories="" + DelayLoadDLLs="OpenMPT_soundtouch.dll" + GenerateDebugInformation="true" + AssemblyDebug="1" + ProgramDatabaseFile=".\Debug/mptrack.pdb" + GenerateMapFile="true" + MapFileName=".\Debug/mptrack.map" + SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + AdditionalManifestFiles="$(ProjectDir)res/rt_manif.bin" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="1" + ATLMinimizesCRunTimeLibraryUsage="false" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\Bin/mptrack.tlb" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/EHsc /O2" + Optimization="2" + InlineFunctionExpansion="2" + AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib,..\" + PreprocessorDefinitions="NDEBUG,WIN32,_WINDOWS,ENABLE_MMX,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW" + StringPooling="true" + RuntimeLibrary="0" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="false" + ForceConformanceInForLoopScope="true" + UsePrecompiledHeader="2" + PrecompiledHeaderThrough="stdafx.h" + PrecompiledHeaderFile=".\Release/mptrack.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" + WarningLevel="3" + SuppressStartupBanner="false" + DebugInformationFormat="3" + CompileAs="0" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalOptions="/MACHINE:I386" + AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib delayimp.lib" + OutputFile=".\Bin/mptrack.exe" + Version="5.0" + LinkIncremental="1" + SuppressStartupBanner="true" + AdditionalLibraryDirectories="" + DelayLoadDLLs="OpenMPT_soundtouch.dll" + GenerateDebugInformation="true" + GenerateMapFile="false" + MapFileName=".\Release/mptrack.map" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + AdditionalManifestFiles="$(ProjectDir)res/rt_manif.bin" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + > + <File + RelativePath=".\AbstractVstEditor.cpp" + > + </File> + <File + RelativePath=".\ArrayUtils.cpp" + > + </File> + <File + RelativePath=".\AutoSaver.cpp" + > + </File> + <File + RelativePath=".\ChannelManagerDlg.cpp" + > + </File> + <File + RelativePath=".\ChildFrm.cpp" + > + </File> + <File + RelativePath=".\ColourEdit.cpp" + > + </File> + <File + RelativePath=".\CommandSet.cpp" + > + </File> + <File + RelativePath=".\CreditStatic.cpp" + > + </File> + <File + RelativePath=".\ctrl_com.cpp" + > + </File> + <File + RelativePath=".\ctrl_gen.cpp" + > + </File> + <File + RelativePath=".\ctrl_ins.cpp" + > + </File> + <File + RelativePath=".\ctrl_pat.cpp" + > + </File> + <File + RelativePath=".\ctrl_seq.cpp" + > + </File> + <File + RelativePath=".\ctrl_smp.cpp" + > + </File> + <File + RelativePath=".\DefaultVstEditor.cpp" + > + </File> + <File + RelativePath=".\dlg_misc.cpp" + > + </File> + <File + RelativePath="..\soundlib\dlsbank.cpp" + > + </File> + <File + RelativePath=".\draw_pat.cpp" + > + </File> + <File + RelativePath=".\EffectVis.cpp" + > + </File> + <File + RelativePath="..\soundlib\Fastmix.cpp" + > + </File> + <File + RelativePath=".\fxp.cpp" + > + </File> + <File + RelativePath=".\globals.cpp" + > + </File> + <File + RelativePath=".\HyperEdit.cpp" + > + </File> + <File + RelativePath=".\HyperEdit2.cpp" + > + </File> + <File + RelativePath=".\HyperEdit3.cpp" + > + </File> + <File + RelativePath="InputHandler.cpp" + > + </File> + <File + RelativePath=".\KeyConfigDlg.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_669.cpp" + > + </File> + <File + RelativePath="..\Soundlib\load_amf.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_ams.cpp" + > + </File> + <File + RelativePath="..\soundlib\load_dbm.cpp" + > + </File> + <File + RelativePath="..\soundlib\load_dmf.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_dsm.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_far.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_gdm.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_it.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_mdl.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_med.cpp" + > + </File> + <File + RelativePath="..\soundlib\load_mid.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_mo3.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_mod.cpp" + > + </File> + <File + RelativePath="..\Soundlib\load_mt2.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_mtm.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_okt.cpp" + > + </File> + <File + RelativePath="..\Soundlib\load_psm.cpp" + > + </File> + <File + RelativePath="..\soundlib\load_ptm.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_s3m.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_stm.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_ult.cpp" + > + </File> + <File + RelativePath="..\Soundlib\Load_umx.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_wav.cpp" + > + </File> + <File + RelativePath="..\soundlib\Load_xm.cpp" + > + </File> + <File + RelativePath=".\mainbar.cpp" + > + </File> + <File + RelativePath=".\MainFrm.cpp" + > + </File> + <File + RelativePath=".\MIDIMappingDialog.cpp" + > + </File> + <File + RelativePath=".\misc_util.cpp" + > + </File> + <File + RelativePath="..\soundlib\mmcmp.cpp" + > + </File> + <File + RelativePath="..\soundlib\Mmx_mix.cpp" + > + </File> + <File + RelativePath=".\mod2midi.cpp" + > + </File> + <File + RelativePath=".\mod2wave.cpp" + > + </File> + <File + RelativePath="..\soundlib\mod_specifications.cpp" + > + </File> + <File + RelativePath=".\moddoc.cpp" + > + </File> + <File + RelativePath=".\modedit.cpp" + > + </File> + <File + RelativePath="..\soundlib\modsmp_ctrl.cpp" + > + </File> + <File + RelativePath=".\Moptions.cpp" + > + </File> + <File + RelativePath=".\MoveFXSlotDialog.cpp" + > + </File> + <File + RelativePath=".\Mpdlgs.cpp" + > + </File> + <File + RelativePath=".\mpt_midi.cpp" + > + </File> + <File + RelativePath=".\mptrack.cpp" + > + </File> + <File + RelativePath=".\mptrack.rc" + > + </File> + <File + RelativePath=".\OpenGLControl.cpp" + > + </File> + <File + RelativePath=".\OpenGLDevice.cpp" + > + </File> + <File + RelativePath=".\OpenGLEditor.cpp" + > + </File> + <File + RelativePath="..\soundlib\OrderToPatternTable.cpp" + > + </File> + <File + RelativePath="..\soundlib\pattern.cpp" + > + </File> + <File + RelativePath="..\soundlib\patternContainer.cpp" + > + </File> + <File + RelativePath=".\PatternGotoDialog.cpp" + > + </File> + <File + RelativePath=".\PerformanceCounter.cpp" + > + </File> + <File + RelativePath="..\soundlib\PlaybackEventer.cpp" + > + </File> + <File + RelativePath=".\PSRatioCalc.cpp" + > + </File> + <File + RelativePath="..\soundlib\Sampleio.cpp" + > + </File> + <File + RelativePath=".\ScaleEnvPointsDlg.cpp" + > + </File> + <File + RelativePath=".\serialization_utils.cpp" + > + </File> + <File + RelativePath="..\soundlib\snd_dsp.cpp" + > + </File> + <File + RelativePath="..\soundlib\snd_eq.cpp" + > + </File> + <File + RelativePath="..\soundlib\snd_flt.cpp" + > + </File> + <File + RelativePath="..\soundlib\Snd_fx.cpp" + > + </File> + <File + RelativePath="..\Soundlib\Snd_rvb.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AssemblerOutput="4" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\Soundlib\snddev.cpp" + > + </File> + <File + RelativePath="..\soundlib\Sndfile.cpp" + > + </File> + <File + RelativePath="..\soundlib\Sndmix.cpp" + > + </File> + <File + RelativePath=".\SoundFilePlayConfig.cpp" + > + </File> + <File + RelativePath=".\StdAfx.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\soundlib\Tables.cpp" + > + </File> + <File + RelativePath=".\view_com.cpp" + > + </File> + <File + RelativePath=".\view_gen.cpp" + > + </File> + <File + RelativePath=".\view_ins.cpp" + > + </File> + <File + RelativePath=".\view_pat.cpp" + > + </File> + <File + RelativePath=".\view_smp.cpp" + > + </File> + <File + RelativePath=".\view_tre.cpp" + > + </File> + <File + RelativePath=".\VSTEditor.cpp" + > + </File> + <File + RelativePath=".\vstplug.cpp" + > + </File> + <File + RelativePath="..\soundlib\Waveform.cpp" + > + </File> + <File + RelativePath="..\soundlib\WindowedFIR.cpp" + > + </File> + <Filter + Name="PatternRandomizer" + > + <File + RelativePath=".\PatternRandomizer.cpp" + > + </File> + <File + RelativePath=".\PatternRandomizer.h" + > + </File> + <File + RelativePath=".\PatternRandomizerGUI.cpp" + > + </File> + <File + RelativePath=".\PatternRandomizerGUI.h" + > + </File> + <File + RelativePath=".\PatternRandomizerGUIEffect.cpp" + > + </File> + <File + RelativePath=".\PatternRandomizerGUIEffect.h" + > + </File> + <File + RelativePath=".\PatternRandomizerGUIInstrument.cpp" + > + </File> + <File + RelativePath=".\PatternRandomizerGUIInstrument.h" + > + </File> + <File + RelativePath=".\PatternRandomizerGUINote.cpp" + > + </File> + <File + RelativePath=".\PatternRandomizerGUINote.h" + > + </File> + <File + RelativePath=".\PatternRandomizerGUIVolCmd.cpp" + > + </File> + <File + RelativePath=".\PatternRandomizerGUIVolCmd.h" + > + </File> + </Filter> + <Filter + Name="MixGraph" + > + <File + RelativePath=".\ChannelNode.cpp" + > + </File> + <File + RelativePath=".\ChannelNode.h" + > + </File> + <File + RelativePath=".\ctrl_graph.cpp" + > + </File> + <File + RelativePath=".\ctrl_graph.h" + > + </File> + <File + RelativePath=".\EffectNode.cpp" + > + </File> + <File + RelativePath=".\EffectNode.h" + > + </File> + <File + RelativePath=".\FinalNode.cpp" + > + </File> + <File + RelativePath=".\FinalNode.h" + > + </File> + <File + RelativePath=".\Graph.cpp" + > + </File> + <File + RelativePath=".\Graph.h" + > + </File> + <File + RelativePath=".\InstrumentNode.cpp" + > + </File> + <File + RelativePath=".\InstrumentNode.h" + > + </File> + <File + RelativePath=".\Node.cpp" + > + </File> + <File + RelativePath=".\Node.h" + > + </File> + <File + RelativePath=".\Vertex.cpp" + > + </File> + <File + RelativePath=".\Vertex.h" + > + </File> + <File + RelativePath=".\view_graph.cpp" + > + </File> + <File + RelativePath=".\view_graph.h" + > + </File> + </Filter> + <Filter + Name="Tuning" + > + <File + RelativePath="..\soundlib\tuning.cpp" + > + </File> + <File + RelativePath="..\soundlib\tuningbase.cpp" + > + </File> + <File + RelativePath="..\soundlib\tuningCollection.cpp" + > + </File> + <File + RelativePath=".\TuningDialog.cpp" + > + </File> + <File + RelativePath=".\tuningRatioMapWnd.cpp" + > + </File> + </Filter> + </Filter> + <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" + > + <File + RelativePath="res\bitmap1.bmp" + > + </File> + <File + RelativePath=".\res\colors.bmp" + > + </File> + <File + RelativePath=".\res\dragging.cur" + > + </File> + <File + RelativePath=".\Res\envbar.bmp" + > + </File> + <File + RelativePath=".\res\img_list.bmp" + > + </File> + <File + RelativePath=".\res\mainbar.bmp" + > + </File> + <File + RelativePath=".\res\moddoc.ico" + > + </File> + <File + RelativePath=".\res\MPTRACK.bmp" + > + </File> + <File + RelativePath=".\res\mptrack.ico" + > + </File> + <File + RelativePath=".\res\mptrack.rc2" + > + </File> + <File + RelativePath=".\Res\nodrag.cur" + > + </File> + <File + RelativePath=".\res\nodrop.cur" + > + </File> + <File + RelativePath=".\res\patterns.bmp" + > + </File> + <File + RelativePath=".\res\rt_manif.bin" + > + </File> + <File + RelativePath=".\Res\smptoolb.bmp" + > + </File> + <File + RelativePath=".\res\splashno.bmp" + > + </File> + <File + RelativePath=".\res\view_pat.bmp" + > + </File> + <File + RelativePath=".\res\vumeters.bmp" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl" + > + <File + RelativePath=".\AbstractVstEditor.h" + > + </File> + <File + RelativePath=".\ArrayUtils.h" + > + </File> + <File + RelativePath=".\AutoSaver.h" + > + </File> + <File + RelativePath=".\ChannelManagerDlg.h" + > + </File> + <File + RelativePath=".\ChildFrm.h" + > + </File> + <File + RelativePath=".\ColourEdit.h" + > + </File> + <File + RelativePath=".\CommandSet.h" + > + </File> + <File + RelativePath=".\CreditStatic.h" + > + </File> + <File + RelativePath=".\ctrl_com.h" + > + </File> + <File + RelativePath=".\ctrl_gen.h" + > + </File> + <File + RelativePath=".\ctrl_ins.h" + > + </File> + <File + RelativePath=".\ctrl_pat.h" + > + </File> + <File + RelativePath=".\ctrl_smp.h" + > + </File> + <File + RelativePath=".\DefaultVstEditor.h" + > + </File> + <File + RelativePath=".\dlg_misc.h" + > + </File> + <File + RelativePath="..\Soundlib\Dlsbank.h" + > + </File> + <File + RelativePath=".\EffectVis.h" + > + </File> + <File + RelativePath=".\fxp.h" + > + </File> + <File + RelativePath=".\globals.h" + > + </File> + <File + RelativePath="InputHandler.h" + > + </File> + <File + RelativePath=".\KeyboardSettings.h" + > + </File> + <File + RelativePath=".\KeyConfigDlg.h" + > + </File> + <File + RelativePath=".\mainbar.h" + > + </File> + <File + RelativePath=".\MainFrm.h" + > + </File> + <File + RelativePath="..\soundlib\midi.h" + > + </File> + <File + RelativePath=".\MIDIMappingDialog.h" + > + </File> + <File + RelativePath=".\misc_util.h" + > + </File> + <File + RelativePath=".\mod2midi.h" + > + </File> + <File + RelativePath=".\mod2wave.h" + > + </File> + <File + RelativePath="..\soundlib\mod_specifications.h" + > + </File> + <File + RelativePath="..\soundlib\modcommand.h" + > + </File> + <File + RelativePath=".\moddoc.h" + > + </File> + <File + RelativePath="..\soundlib\modsmp_ctrl.h" + > + </File> + <File + RelativePath=".\Moptions.h" + > + </File> + <File + RelativePath=".\MoveFXSlotDialog.h" + > + </File> + <File + RelativePath=".\Mpdlgs.h" + > + </File> + <File + RelativePath=".\mptrack.h" + > + </File> + <File + RelativePath=".\OpenGLControl.h" + > + </File> + <File + RelativePath=".\OpenGLDevice.h" + > + </File> + <File + RelativePath=".\OpenGLEditor.h" + > + </File> + <File + RelativePath=".\order.h" + > + </File> + <File + RelativePath="..\soundlib\OrderToPatternTable.h" + > + </File> + <File + RelativePath="..\soundlib\pattern.h" + > + </File> + <File + RelativePath="..\soundlib\patternContainer.h" + > + </File> + <File + RelativePath=".\PatternGotoDialog.h" + > + </File> + <File + RelativePath=".\PerformanceCounter.h" + > + </File> + <File + RelativePath="..\soundlib\PlaybackEventer.h" + > + </File> + <File + RelativePath=".\PSRatioCalc.h" + > + </File> + <File + RelativePath=".\Resource.h" + > + </File> + <File + RelativePath=".\ScaleEnvPointsDlg.h" + > + </File> + <File + RelativePath=".\serialization_utils.h" + > + </File> + <File + RelativePath="..\Soundlib\snddev.h" + > + </File> + <File + RelativePath="..\Soundlib\snddevx.h" + > + </File> + <File + RelativePath="..\Soundlib\Sndfile.h" + > + </File> + <File + RelativePath=".\SoundFilePlayConfig.h" + > + </File> + <File + RelativePath=".\StdAfx.h" + > + </File> + <File + RelativePath=".\typedefs.h" + > + </File> + <File + RelativePath=".\version.h" + > + </File> + <File + RelativePath=".\view_com.h" + > + </File> + <File + RelativePath=".\view_gen.h" + > + </File> + <File + RelativePath=".\view_ins.h" + > + </File> + <File + RelativePath=".\view_pat.h" + > + </File> + <File + RelativePath=".\view_smp.h" + > + </File> + <File + RelativePath=".\view_tre.h" + > + </File> + <File + RelativePath=".\VSTEditor.h" + > + </File> + <File + RelativePath=".\vstplug.h" + > + </File> + <File + RelativePath="..\soundlib\wavConverter.h" + > + </File> + <File + RelativePath="..\soundlib\WindowedFIR.h" + > + </File> + <Filter + Name="tuning" + > + <File + RelativePath="..\soundlib\tuning.h" + > + </File> + <File + RelativePath="..\soundlib\tuningbase.h" + > + </File> + <File + RelativePath="..\soundlib\tuningcollection.h" + > + </File> + <File + RelativePath=".\TuningDialog.h" + > + </File> + <File + RelativePath=".\tuningRatioMapWnd.h" + > + </File> + </Filter> + </Filter> + <Filter + Name="test" + > + <File + RelativePath=".\test\test.cpp" + > + </File> + <File + RelativePath=".\test\test.h" + > + </File> + </Filter> + <File + RelativePath=".\mptrack.reg" + > + </File> + <File + RelativePath=".\VTune\mptrack.vpj" + > + </File> + </Files> + <Globals> + <Global + Name="RESOURCE_FILE" + Value="mptrack.rc" + /> + </Globals> +</VisualStudioProject> Added: trunk/OpenMPT/soundtouch/soundtouch_08.vcproj =================================================================== --- trunk/OpenMPT/soundtouch/soundtouch_08.vcproj (rev 0) +++ trunk/OpenMPT/soundtouch/soundtouch_08.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,297 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="SoundTouch" + ProjectGUID="{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" + RootNamespace="soundtouch" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="0" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOUNDTOUCH_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + ForceConformanceInForLoopScope="true" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + IgnoreImportLibrary="false" + OutputFile="$(SolutionDir)$(ConfigurationName)\OpenMPT_SoundTouch.dll" + LinkIncremental="2" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb" + SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + ImportLibrary="$(OutDir)/soundtouch.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="0" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/O2" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOUNDTOUCH_EXPORTS" + RuntimeLibrary="0" + ForceConformanceInForLoopScope="true" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalOptions="/PDBPATH:none" + OutputFile="..\mptrack\bin\OpenMPT_SoundTouch.dll" + LinkIncremental="1" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb" + StripPrivateSymbols="" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + ImportLibrary="$(OutDir)/soundtouch.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\3dnow_win.cpp" + > + </File> + <File + RelativePath=".\AAFilter.cpp" + > + </File> + <File + RelativePath=".\BPMDetect.cpp" + > + </File> + <File + RelativePath=".\cpu_detect_x86_win.cpp" + > + </File> + <File + RelativePath=".\FIFOSampleBuffer.cpp" + > + </File> + <File + RelativePath=".\FIRFilter.cpp" + > + </File> + <File + RelativePath=".\mmx_optimized.cpp" + > + </File> + <File + RelativePath=".\PeakFinder.cpp" + > + </File> + <File + RelativePath=".\RateTransposer.cpp" + > + </File> + <File + RelativePath=".\SoundTouch.cpp" + > + </File> + <File + RelativePath=".\sse_optimized.cpp" + > + </File> + <File + RelativePath=".\TDStretch.cpp" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\AAFilter.h" + > + </File> + <File + RelativePath=".\BPMDetect.h" + > + </File> + <File + RelativePath=".\cpu_detect.h" + > + </File> + <File + RelativePath=".\FIFOSampleBuffer.h" + > + </File> + <File + RelativePath=".\FIFOSamplePipe.h" + > + </File> + <File + RelativePath=".\FIRFilter.h" + > + </File> + <File + RelativePath=".\PeakFinder.h" + > + </File> + <File + RelativePath=".\RateTransposer.h" + > + </File> + <File + RelativePath=".\SoundTouch.h" + > + </File> + <File + RelativePath=".\STTypes.h" + > + </File> + <File + RelativePath=".\TDStretch.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: trunk/OpenMPT/unlha/unlha_08.vcproj =================================================================== --- trunk/OpenMPT/unlha/unlha_08.vcproj (rev 0) +++ trunk/OpenMPT/unlha/unlha_08.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="unlha" + ProjectGUID="{FAE39936-1DC7-40BB-AD3F-3B5B9E9AB0E8}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB" + StringPooling="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Debug/unlha.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + WarningLevel="4" + SuppressStartupBanner="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\Debug\unlha.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/O1" + Optimization="1" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB" + StringPooling="true" + RuntimeLibrary="0" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Release/unlha.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" + WarningLevel="3" + SuppressStartupBanner="false" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\bin\unlha.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + > + <File + RelativePath="unlha.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="" + BasicRuntimeChecks="3" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="1" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl" + > + <File + RelativePath="lharc.h" + > + </File> + <File + RelativePath="slidehuf.h" + > + </File> + <File + RelativePath="unlha32.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: trunk/OpenMPT/unrar/unrar_08.vcproj =================================================================== --- trunk/OpenMPT/unrar/unrar_08.vcproj (rev 0) +++ trunk/OpenMPT/unrar/unrar_08.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="unrar" + ProjectGUID="{FF541CE2-DAA1-4F84-9883-0A0F111BAA0B}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="1" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Debug/UNRAR.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + WarningLevel="4" + SuppressStartupBanner="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\Debug\UNRAR.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/O1" + Optimization="1" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="0" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Release/UNRAR.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" + WarningLevel="3" + SuppressStartupBanner="false" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\bin\UNRAR.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath="Unrar.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="1" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: trunk/OpenMPT/unzip/unzip_08.vcproj =================================================================== --- trunk/OpenMPT/unzip/unzip_08.vcproj (rev 0) +++ trunk/OpenMPT/unzip/unzip_08.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="unzip" + ProjectGUID="{44316F22-904E-48AA-B841-5A3A6AC77319}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="1" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Debug/unzip.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + WarningLevel="4" + SuppressStartupBanner="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\Debug\unzip.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/O1" + Optimization="1" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="0" + BufferSecurityCheck="true" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Release/unzip.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" + WarningLevel="3" + SuppressStartupBanner="false" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\bin\unzip.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" + > + <File + RelativePath="Unzip.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + Optimization="1" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;fi;fd" + > + <File + RelativePath="unzip32.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: trunk/OpenMPT/xsoundlib/xsoundlib_08.vcproj =================================================================== --- trunk/OpenMPT/xsoundlib/xsoundlib_08.vcproj (rev 0) +++ trunk/OpenMPT/xsoundlib/xsoundlib_08.vcproj 2009-07-08 18:38:38 UTC (rev 287) @@ -0,0 +1,264 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="xsoundlib" + ProjectGUID="{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + BufferSecurityCheck="true" + UsePrecompiledHeader="2" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/xsoundlib.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/O2" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB" + RuntimeLibrary="0" + BufferSecurityCheck="true" + UsePrecompiledHeader="2" + WarningLevel="3" + SuppressStartupBanner="false" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/xsoundlib.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\samplerate.cpp" + > + </File> + <File + RelativePath=".\smbPitchShift.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="2" + /> + </FileConfiguration> + </File> + <File + RelativePath=".\src_linear.cpp" + > + </File> + <File + RelativePath=".\src_sinc.cpp" + > + </File> + <File + RelativePath=".\src_zoh.cpp" + > + </File> + <File + RelativePath=".\stdafx.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\common.h" + > + </File> + <File + RelativePath=".\config.h" + > + </File> + <File + RelativePath=".\fastest_coeffs.h" + > + </File> + <File + RelativePath=".\float_cast.h" + > + </File> + <File + RelativePath=".\high_qual_coeffs.h" + > + </File> + <File + RelativePath=".\mid_qual_coeffs.h" + > + </File> + <File + RelativePath=".\samplerate.h" + > + </File> + <File + RelativePath=".\smbPitchShift.h" + > + </File> + <File + RelativePath=".\stdafx.h" + > + </File> + <File + RelativePath=".\unistd.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + <File + RelativePath=".\ReadMe.txt" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-08 22:24:01
|
Revision: 288 http://modplug.svn.sourceforge.net/modplug/?rev=288&view=rev Author: saga-games Date: 2009-07-08 22:23:42 +0000 (Wed, 08 Jul 2009) Log Message: ----------- [Fix] Patterns: Reset pattern name when deleting pattern [Fix] Sample drawing: Disable sample drawing button when the sample is actually empty [Fix] DC offset removal: Selection detection was buggy Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-08 18:38:38 UTC (rev 287) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-08 22:23:42 UTC (rev 288) @@ -1441,6 +1441,7 @@ BEGIN_CRITICAL(); LPVOID p = m_SndFile.Patterns[n]; m_SndFile.Patterns[n] = NULL; + m_SndFile.SetPatternName(n, ""); CSoundFile::FreePattern(p); END_CRITICAL(); SetModified(); Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-08 18:38:38 UTC (rev 287) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-08 22:23:42 UTC (rev 288) @@ -1087,7 +1087,7 @@ { case ID_SAMPLE_DRAW: if(m_bDrawingEnabled) dwStyle |= NCBTNS_CHECKED; - if(pSndFile->Ins[m_nSample].GetNumChannels() > 1) dwStyle |= NCBTNS_DISABLED; + if(pSndFile->Ins[m_nSample].GetNumChannels() > 1 || pSndFile->Ins[m_nSample].pSample == nullptr) dwStyle |= NCBTNS_DISABLED; break; } Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-08 18:38:38 UTC (rev 287) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-08 22:23:42 UTC (rev 288) @@ -280,7 +280,7 @@ RemoveOffsetAndNormalize( reinterpret_cast<int8*>(pins->pSample) + iStart, iEnd - iStart, dOffset, dAmplify); // step 3: adjust global vol (if available) - if((modtype & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (iStart == 0) && (iEnd = pins->nLength)) + if((modtype & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (iStart == 0) && (iEnd == pins->nLength)) pins->nGlobalVol = min((WORD)(pins->nGlobalVol / dAmplify), 64); AdjustEndOfSample(smp, pSndFile); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-11 16:27:33
|
Revision: 289 http://modplug.svn.sourceforge.net/modplug/?rev=289&view=rev Author: saga-games Date: 2009-07-11 16:27:29 +0000 (Sat, 11 Jul 2009) Log Message: ----------- [Fix] Treeview: Deleting patterns from a module will also reset their names [Imp] Pattern editor: Echopaste switch Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/res/patterns.bmp trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-07-11 16:27:29 UTC (rev 289) @@ -52,6 +52,7 @@ ON_COMMAND(ID_PATTERNDETAIL_LO, OnDetailLo) ON_COMMAND(ID_PATTERNDETAIL_MED, OnDetailMed) ON_COMMAND(ID_PATTERNDETAIL_HI, OnDetailHi) + ON_COMMAND(ID_ECHOPASTE, OnToggleEchoPaste) ON_CBN_SELCHANGE(IDC_COMBO_INSTRUMENT, OnInstrumentChanged) // -> CODE#0012 // -> DESC="midi keyboard split" @@ -157,6 +158,7 @@ m_ToolBar.AddButton(ID_PATTERNDETAIL_MED, 31, TBSTYLE_CHECK, TBSTATE_ENABLED); m_ToolBar.AddButton(ID_PATTERNDETAIL_HI, 32, TBSTYLE_CHECK, TBSTATE_ENABLED|TBSTATE_CHECKED); m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP); + m_ToolBar.AddButton(ID_ECHOPASTE, 38, TBSTYLE_CHECK, ((CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); // Special edit controls -> tab switch to view m_EditSpacing.SetParent(this); @@ -295,6 +297,7 @@ // -> CODE#0007 // -> DESC="uncheck follow song checkbox by default" CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? MF_UNCHECKED : MF_CHECKED); + m_ToolBar.SetState(ID_ECHOPASTE, ((CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); // -! BEHAVIOUR_CHANGE#0007 } if (dwHintMask & (HINT_MODTYPE|HINT_INSNAMES|HINT_SMPNAMES|HINT_PATNAMES)) @@ -1175,6 +1178,13 @@ SwitchToView(); } +void CCtrlPatterns::OnToggleEchoPaste() +//------------------------------------- +{ + CMainFrame::m_dwPatternSetup ^= PATTERN_ECHOPASTE; + UpdateView(HINT_MPTOPTIONS, NULL); + SwitchToView(); +} //rewbs.introVST void CCtrlPatterns::TogglePluginEditor() Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-07-11 16:27:29 UTC (rev 289) @@ -215,6 +215,8 @@ afx_msg void OnUpdateRecord(CCmdUI *pCmdUI); afx_msg void TogglePluginEditor(); //rewbs.instroVST afx_msg void ToggleSplitPluginEditor(); //rewbs.instroVST + afx_msg void OnToggleEchoPaste(); + //}}AFX_MSG DECLARE_MESSAGE_MAP() private: Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-07-11 16:27:29 UTC (rev 289) @@ -813,12 +813,11 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - const int nSeqLengthMinusOne = pSndFile->Order.size()-1; - for (int i=m_nScrollPos; i<nSeqLengthMinusOne; i++) pSndFile->Order[i] = pSndFile->Order[i+1]; - pSndFile->Order[pSndFile->Order.size()-1] = pSndFile->Order.GetInvalidPatIndex(); + + m_pModDoc->RemoveOrder(m_nScrollPos); InvalidateRect(NULL, FALSE); - m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); + UINT nNewOrd = pSndFile->Order[m_nScrollPos]; if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]) && (m_pParent)) { Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-11 16:27:29 UTC (rev 289) @@ -2579,6 +2579,7 @@ ID_PATTERNDETAIL_MED "Medium pattern detail level\nMedium pattern detail level" ID_PATTERNDETAIL_HI "High pattern detail level\nHigh pattern detail level" ID_PATTERN_AMPLIFY "Amplify selection\nAmplify" + ID_ECHOPASTE "Toggle echo paste\nToggle echo paste" END STRINGTABLE Modified: trunk/OpenMPT/mptrack/res/patterns.bmp =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/mptrack/resource.h 2009-07-11 16:27:29 UTC (rev 289) @@ -1078,13 +1078,14 @@ #define ID_CLEANUP_COMPO 59221 #define ID_SAMPLE_DRAW 59224 #define ID_SAMPLE_ADDSILENCE 59225 +#define ID_ECHOPASTE 59226 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 518 -#define _APS_NEXT_COMMAND_VALUE 59226 +#define _APS_NEXT_COMMAND_VALUE 59227 #define _APS_NEXT_CONTROL_VALUE 2360 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-07-11 16:27:29 UTC (rev 289) @@ -41,7 +41,7 @@ case 0x0D: command = CMD_PATTERNBREAK; param = ((param >> 4) * 10) + (param & 0x0F); break; case 0x0E: command = CMD_MODCMDEX; break; case 0x0F: command = (param <= (UINT)((m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? 0x1F : 0x20)) ? CMD_SPEED : CMD_TEMPO; - if ((param == 0xFF) && (m_nSamples == 15)) command = 0; break; //<rewbs> what the hell is this?! :) + if ((param == 0xFF) && (m_nSamples == 15)) command = 0; break; //<rewbs> what the hell is this?! :) //<jojo> it's the "stop tune" command! :-P // Extension for XM extended effects case 'G' - 55: command = CMD_GLOBALVOLUME; break; //16 case 'H' - 55: command = CMD_GLOBALVOLSLIDE; if (param & 0xF0) param &= 0xF0; break; @@ -285,7 +285,7 @@ } if (i >= nbpbuggy2) nbpbuggy2 = i+1; } - for (UINT iend=norders; iend<MAX_ORDERS; iend++) Order[iend] = 0xFF; + for (UINT iend=norders; iend<MAX_ORDERS; iend++) Order[iend] = Order.GetInvalidPatIndex(); norders--; m_nRestartPos = pMagic->nRestartPos; if (m_nRestartPos >= 0x78) m_nRestartPos = 0; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-08 22:23:42 UTC (rev 288) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-11 16:27:29 UTC (rev 289) @@ -2585,7 +2585,7 @@ if (!m_lpszPatternNames) m_nPatternNames = 0; if (nPat >= m_nPatternNames) { - if (!lpszName[0]) return TRUE; + //if (!lpszName[0]) return TRUE; UINT len = (nPat+1)*MAX_PATTERNNAME; CHAR *p = new CHAR[len]; if (!p) return FALSE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-11 16:47:58
|
Revision: 290 http://modplug.svn.sourceforge.net/modplug/?rev=290&view=rev Author: saga-games Date: 2009-07-11 16:47:56 +0000 (Sat, 11 Jul 2009) Log Message: ----------- [Fix] patterns.bmp was broken [Fix] IT / XM Compatibility: Out of range global volume, local global volume slides (Might need to re-align MODCHANNEL) [Fix] IT Compatibility: Retrigger effect behaved slightly wrong Modified Paths: -------------- trunk/OpenMPT/mptrack/res/patterns.bmp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/res/patterns.bmp =================================================================== (Binary files differ) Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-11 16:27:29 UTC (rev 289) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-11 16:47:56 UTC (rev 290) @@ -295,13 +295,32 @@ break; // Global Volume case CMD_GLOBALVOLUME: + if (m_nTickCount) break; + if (!(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; - if (param > 128) param = 128; - nGlbVol = param << 1; + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + { + // both FT2 and IT ignore out-of-range values + if (param <= 128) + nGlbVol = param << 1; + } + else + { + if (param > 128) param = 128; + nGlbVol = param << 1; + } break; // Global Volume Slide case CMD_GLOBALVOLSLIDE: - if (param) nOldGlbVolSlide = param; else param = nOldGlbVolSlide; + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + { + if (param) pChn->nOldGlobalVolSlide = param; else param = pChn->nOldGlobalVolSlide; + } + else + { + if (param) nOldGlbVolSlide = param; else param = nOldGlbVolSlide; + + } if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { param >>= 4; @@ -727,7 +746,10 @@ pChn->nLeftVU = pChn->nRightVU = 0xFF; pChn->dwFlags &= ~CHN_FILTER; pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nRetrigCount = 0; + if(!GetModFlag(MSF_COMPATIBLE_PLAY)) + { + pChn->nRetrigCount = 0; + } pChn->nTremorCount = 0; if (bResetEnv) { @@ -1513,6 +1535,8 @@ if (!(param & 0x0F)) param |= pChn->nRetrigParam & 0x0F; param |= 0x100; // increment retrig count on first row } + if(!GetModFlag(MSF_COMPATIBLE_PLAY)) + { if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); else param = pChn->nRetrigParam; //rewbs.volOffset //RetrigNote(nChn, param); @@ -1523,6 +1547,12 @@ else RetrigNote(nChn, param); //end rewbs.volOffset: + } + else + { + if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); + RetrigNote(nChn, pChn->nRetrigParam); + } break; // Tremor @@ -1537,13 +1567,25 @@ if (m_nTickCount) break; if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - if (param > 128) param = 128; - m_nGlobalVolume = param << 1; + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + { + // both FT2 and IT ignore out-of-range values + if (param <= 128) + m_nGlobalVolume = param << 1; + } + else + { + if (param > 128) param = 128; + m_nGlobalVolume = param << 1; + } break; // Global Volume Slide case CMD_GLOBALVOLSLIDE: - GlobalVolSlide(param); + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + GlobalVolSlide(param, &pChn->nOldGlobalVolSlide); + else + GlobalVolSlide(param, &m_nOldGlbVolSlide); break; // Set 8-bit Panning @@ -2909,26 +2951,43 @@ UINT nRetrigCount = pChn->nRetrigCount; BOOL bDoRetrig = FALSE; - if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { - if (!nRetrigSpeed) nRetrigSpeed = 1; - if ((nRetrigCount) && (!(nRetrigCount % nRetrigSpeed))) bDoRetrig = TRUE; - nRetrigCount++; - } else + // IT retrigger behaviour + if (!m_nTickCount && pChn->nRowNote) + { + pChn->nRetrigCount = param & 0xf; + } + else if (!--pChn->nRetrigCount) + { + pChn->nRetrigCount = param & 0xf; + bDoRetrig = TRUE; + } + } + else { - UINT realspeed = nRetrigSpeed; - if ((param & 0x100) && (pChn->nRowVolCmd == VOLCMD_VOLUME) && (pChn->nRowParam & 0xF0)) realspeed++; - if ((m_nTickCount) || (param & 0x100)) + if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - if (!realspeed) realspeed = 1; - if ((!(param & 0x100)) && (m_nMusicSpeed) && (!(m_nTickCount % realspeed))) bDoRetrig = TRUE; + if (!nRetrigSpeed) nRetrigSpeed = 1; + if ((nRetrigCount) && (!(nRetrigCount % nRetrigSpeed))) bDoRetrig = TRUE; nRetrigCount++; - } else if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) nRetrigCount = 0; - if (nRetrigCount >= realspeed) + } else { - if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = TRUE; + UINT realspeed = nRetrigSpeed; + if ((param & 0x100) && (pChn->nRowVolCmd == VOLCMD_VOLUME) && (pChn->nRowParam & 0xF0)) realspeed++; + if ((m_nTickCount) || (param & 0x100)) + { + if (!realspeed) realspeed = 1; + if ((!(param & 0x100)) && (m_nMusicSpeed) && (!(m_nTickCount % realspeed))) bDoRetrig = TRUE; + nRetrigCount++; + } else if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) nRetrigCount = 0; + if (nRetrigCount >= realspeed) + { + if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = TRUE; + } } } + if (bDoRetrig) { UINT dv = (param >> 4) & 0x0F; @@ -2967,7 +3026,8 @@ SampleOffset(nChn, offset, false); } } - pChn->nRetrigCount = (BYTE)nRetrigCount; + if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) + pChn->nRetrigCount = (BYTE)nRetrigCount; } @@ -3191,11 +3251,11 @@ } -void CSoundFile::GlobalVolSlide(UINT param) +void CSoundFile::GlobalVolSlide(UINT param, UINT * nOldGlobalVolSlide) //----------------------------------------- { LONG nGlbSlide = 0; - if (param) m_nOldGlbVolSlide = param; else param = m_nOldGlbVolSlide; + if (param) *nOldGlobalVolSlide = param; else param = *nOldGlobalVolSlide; if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { if (m_dwSongFlags & SONG_FIRSTTICK) nGlbSlide = (param >> 4) * 2; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-07-11 16:27:29 UTC (rev 289) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-07-11 16:47:56 UTC (rev 290) @@ -530,6 +530,7 @@ LONG nVolSwing, nPanSwing; LONG nCutSwing, nResSwing; LONG nRestorePanOnNewNote; //If > 0, nPan should be set to nRestorePanOnNewNote - 1 on new note. Used to recover from panswing. + UINT nOldGlobalVolSlide; // 8-bit members BYTE nRestoreResonanceOnNewNote; //Like above BYTE nRestoreCutoffOnNewNote; //Like above @@ -1160,7 +1161,7 @@ // Global Effects void SetTempo(UINT param, bool setAsNonModcommand = false); void SetSpeed(UINT param); - void GlobalVolSlide(UINT param); + void GlobalVolSlide(UINT param, UINT * nOldGlobalVolSlide); DWORD IsSongFinished(UINT nOrder, UINT nRow) const; BOOL IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const; // Read/Write sample functions This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-11 18:53:35
|
Revision: 291 http://modplug.svn.sourceforge.net/modplug/?rev=291&view=rev Author: saga-games Date: 2009-07-11 18:53:31 +0000 (Sat, 11 Jul 2009) Log Message: ----------- [Imp] Note properties: Explanation for Tremor effect [Fix] Tremor: Sounds like in IT when compatible playback mode is turned on. [Fix] IT loader: 31 BPM is an allowed default tempo. Tentative fix: Clamp to 32 (instead of 125) Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-11 16:47:56 UTC (rev 290) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-11 18:53:31 UTC (rev 291) @@ -2567,6 +2567,28 @@ strcpy(s, "continue"); break; + case CMD_TREMOR: + if(param) + { + BYTE ontime = param >> 4, offtime = param & 0x0F; + if(m_SndFile.m_dwSongFlags & SONG_ITOLDEFFECTS) + { + ontime++; + offtime++; + } + else + { + if(ontime == 0) ontime = 1; + if(offtime == 0) offtime = 1; + } + wsprintf(pszName, "ontime %d, offtime %d", ontime, offtime); + } + else + { + strcpy(s, "continue"); + } + break; + case CMD_MIDI: if (param < 0x80) { Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-11 16:47:56 UTC (rev 290) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-11 18:53:31 UTC (rev 291) @@ -983,6 +983,10 @@ } if (pifh->speed) m_nDefaultSpeed = pifh->speed; if (pifh->tempo) m_nDefaultTempo = pifh->tempo; + if(m_nDefaultTempo < 32) m_nDefaultTempo = 32; // tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32. + + if(m_nDefaultTempo < 32) m_nDefaultTempo = 32; // tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32. + m_nSamplePreAmp = pifh->mv & 0x7F; if (m_nSamplePreAmp<0x20) { m_nSamplePreAmp=100; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-11 16:47:56 UTC (rev 290) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-11 18:53:31 UTC (rev 291) @@ -749,8 +749,8 @@ if(!GetModFlag(MSF_COMPATIBLE_PLAY)) { pChn->nRetrigCount = 0; + pChn->nTremorCount = 0; } - pChn->nTremorCount = 0; if (bResetEnv) { pChn->nVolSwing = pChn->nPanSwing = 0; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-07-11 16:47:56 UTC (rev 290) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-07-11 18:53:31 UTC (rev 291) @@ -546,7 +546,7 @@ BYTE nOldOffset, nOldHiOffset; BYTE nCutOff, nResonance; BYTE nRetrigCount, nRetrigParam; - BYTE nTremorCount, nTremorParam; + BYTE nTremorCount, nTremorParam, nTremorOn, nTremorOff; BYTE nPatternLoop, nPatternLoopCount; BYTE nRowNote, nRowInstr; BYTE nRowVolCmd, nRowVolume; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-11 16:47:56 UTC (rev 290) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-11 18:53:31 UTC (rev 291) @@ -986,18 +986,53 @@ } // Tremor - if (pChn->nCommand == CMD_TREMOR) + if(pChn->nCommand == CMD_TREMOR) { - UINT n = (pChn->nTremorParam >> 4) + (pChn->nTremorParam & 0x0F); - UINT ontime = pChn->nTremorParam >> 4; - if ((!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITOLDEFFECTS)) { n += 2; ontime++; } - UINT tremcount = (UINT)pChn->nTremorCount; - if (tremcount >= n) tremcount = 0; - if ((m_nTickCount) || (m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { - if (tremcount >= ontime) vol = 0; - pChn->nTremorCount = (BYTE)(tremcount + 1); + // Original IT behaviour + if(pChn->nTremorOn) + pChn->nTremorOn--; + if(!pChn->nTremorOn) { + if(pChn->nTremorOff) + { + vol = 0; + pChn->nTremorOff--; + } + else + { + pChn->nTremorOn = pChn->nTremorParam >> 4; + pChn->nTremorOff = pChn->nTremorParam & 0x0F; + if(m_dwSongFlags & SONG_ITOLDEFFECTS) + { + pChn->nTremorOn++; + pChn->nTremorOff++; + } + else + { + if (!pChn->nTremorOn) pChn->nTremorOn = 1; + if (!pChn->nTremorOff) pChn->nTremorOff = 1; + } + } + } } + else + { + UINT n = (pChn->nTremorParam >> 4) + (pChn->nTremorParam & 0x0F); + UINT ontime = pChn->nTremorParam >> 4; + if ((!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITOLDEFFECTS)) + { + n += 2; + ontime++; + } + UINT tremcount = (UINT)pChn->nTremorCount; + if (tremcount >= n) tremcount = 0; + if ((m_nTickCount) || (m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) + { + if (tremcount >= ontime) vol = 0; + pChn->nTremorCount = (BYTE)(tremcount + 1); + } + } pChn->dwFlags |= CHN_FASTVOLRAMP; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-12 12:25:43
|
Revision: 293 http://modplug.svn.sourceforge.net/modplug/?rev=293&view=rev Author: saga-games Date: 2009-07-12 12:25:38 +0000 (Sun, 12 Jul 2009) Log Message: ----------- [Fix] Pattern editor: Set max. row spacing / skipping value to 64, visibly clamp values > 64 to 64 in the edit box, skip to next pattern if continuous scroll is enabled [Fix] Playback: Global volume will be set correctly when skipping around in the module (accidentally broke this in rev. 290) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-07-11 19:18:24 UTC (rev 292) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-07-12 12:25:38 UTC (rev 293) @@ -167,7 +167,7 @@ m_EditOrderListMargins.SetParent(this); m_EditOrderListMargins.SetLimitText(3); // Spin controls - m_SpinSpacing.SetRange(0, 16); + m_SpinSpacing.SetRange(0, MAX_SPACING); m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); m_SpinInstrument.SetRange(-1, 1); @@ -716,7 +716,11 @@ if ((m_EditSpacing.m_hWnd) && (m_EditSpacing.GetWindowTextLength() > 0)) { CMainFrame::gnPatternSpacing = GetDlgItemInt(IDC_EDIT_SPACING); - if (CMainFrame::gnPatternSpacing > 16) CMainFrame::gnPatternSpacing = 16; + if (CMainFrame::gnPatternSpacing > MAX_SPACING) + { + CMainFrame::gnPatternSpacing = MAX_SPACING; + SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing, FALSE); + } SendViewMessage(VIEWMSG_SETSPACING, CMainFrame::gnPatternSpacing); } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-11 19:18:24 UTC (rev 292) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-12 12:25:38 UTC (rev 293) @@ -18,7 +18,6 @@ #include "midi.h" #include <cmath> -#define MAX_SPACING 16 #define PLUGNAME_HEIGHT 16 //rewbs.patPlugName #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" @@ -4167,8 +4166,9 @@ if ( bIsLiveRecord == false ) { if ((m_nSpacing > 0) && (m_nSpacing <= MAX_SPACING)) { - if (nRow+m_nSpacing<pSndFile->PatternSize[nPat]) { - SetCurrentRow(nRow+m_nSpacing); + + if (nRow + m_nSpacing < pSndFile->PatternSize[nPat] || (CMainFrame::m_dwPatternSetup & PATTERN_CONTSCROLL)) { + SetCurrentRow(nRow + m_nSpacing, (CMainFrame::m_dwPatternSetup & PATTERN_CONTSCROLL) ? true: false); m_bLastNoteEntryBlocked=false; } else { m_bLastNoteEntryBlocked=true; // if the cursor is block by the end of the pattern here, Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2009-07-11 19:18:24 UTC (rev 292) +++ trunk/OpenMPT/mptrack/View_pat.h 2009-07-12 12:25:38 UTC (rev 293) @@ -30,6 +30,9 @@ #define PATSTATUS_PLUGNAMESINHEADERS 0x2000 //rewbs.patPlugName #define PATSTATUS_PATTERNLOOP 0x4000 +// Row Spacing +#define MAX_SPACING 64 + enum { NOTE_COLUMN=0, INST_COLUMN, Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-11 19:18:24 UTC (rev 292) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-12 12:25:38 UTC (rev 293) @@ -295,8 +295,6 @@ break; // Global Volume case CMD_GLOBALVOLUME: - if (m_nTickCount) break; - if (!(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; if(GetModFlag(MSF_COMPATIBLE_PLAY)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-12 14:17:42
|
Revision: 294 http://modplug.svn.sourceforge.net/modplug/?rev=294&view=rev Author: saga-games Date: 2009-07-12 14:17:41 +0000 (Sun, 12 Jul 2009) Log Message: ----------- [Fix] S3M saving: Clamp sample pre-amp to [32;127] instead of just taking the lower 7 bits. (Default pre-amp value as 128, which resulted in pre-amp 0 when saving) [Imp] IT loading: Set "created with" version to 1.16 for modules that have been saved with ModPlug 1.16 or older [Fix] IT compatibility: Improved retrigger compatibility even more (#15) [Fix] IT compatibility: SD0 / SC0 is now interpreted as SD1 / SC1 in compatibility mode (test #22) [Fix] S3M compatibility: Notes with SD0 are now ignored, SC0 is completely ignored [Fix] IT compatibility: Portamento up / down resets the destination of tone portamento (test #23) Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-12 12:25:38 UTC (rev 293) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-12 14:17:41 UTC (rev 294) @@ -2694,7 +2694,11 @@ break; case 0xC0: // note cut case 0xD0: // note delay - strcat(s, " frames"); + //IT compatibility 22. SD0 == SD1, SC0 == SC1 + if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && (m_SndFile.GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) && m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY))) + strcpy(s, "1 frame"); + else + strcat(s, " frames"); break; case 0xE0: // pattern delay (rows) strcat(s, " rows"); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-12 12:25:38 UTC (rev 293) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-12 14:17:41 UTC (rev 294) @@ -962,6 +962,8 @@ (pifh->cwtv == 0x217 && pifh->cmwt == 0x200)) interpretModplugmade = true; //TODO: Check whether above interpretation is reasonable especially for //values 0x217 and 0x200 which are the values used in 1.16. + if(pifh->cwtv == 0x217 && pifh->cmwt == 0x200) + m_dwCreatedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 0, 0); } } Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-12 12:25:38 UTC (rev 293) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-12 14:17:41 UTC (rev 294) @@ -531,7 +531,7 @@ header[0x30] = m_nDefaultGlobalVolume >> 2; header[0x31] = m_nDefaultSpeed; header[0x32] = m_nDefaultTempo; - header[0x33] = ((m_nSamplePreAmp < 0x20) ? 0x20 : m_nSamplePreAmp) | 0x80; // Stereo + header[0x33] = min(max(0x20, m_nSamplePreAmp), 0x7F); // Stereo header[0x35] = 0xFC; for (i=0; i<32; i++) { Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-12 12:25:38 UTC (rev 293) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-12 14:17:41 UTC (rev 294) @@ -298,7 +298,7 @@ if (!(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; if(GetModFlag(MSF_COMPATIBLE_PLAY)) { - // both FT2 and IT ignore out-of-range values + //IT compatibility 16. Both FT2 and IT ignore out-of-range values if (param <= 128) nGlbVol = param << 1; } @@ -312,6 +312,7 @@ case CMD_GLOBALVOLSLIDE: if(GetModFlag(MSF_COMPATIBLE_PLAY)) { + //IT compatibility 16. Global volume slide params are stored per channel (FT2/IT) if (param) pChn->nOldGlobalVolSlide = param; else param = pChn->nOldGlobalVolSlide; } else @@ -746,6 +747,7 @@ pChn->dwFlags |= CHN_FASTVOLRAMP; if(!GetModFlag(MSF_COMPATIBLE_PLAY)) { + //IT compatibility 15. Retrigger (Tremor doesn't store anything here, so we just don't reset this as well) pChn->nRetrigCount = 0; pChn->nTremorCount = 0; } @@ -1164,6 +1166,15 @@ if ((param & 0xF0) == 0xD0) { nStartTick = param & 0x0F; + if(nStartTick == 0) + { + //IT compatibility 22. SD0 == SD1 + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + nStartTick = 1; + //ST3 ignores notes with SD0 completely + else if(m_nType & MOD_TYPE_S3M|MOD_TYPE_MPT) + nStartTick = m_nMusicSpeed; + } //IT compatibility 08. Handling of out-of-range delay command. if(nStartTick >= m_nMusicSpeed && GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) @@ -1397,6 +1408,7 @@ break; case VOLCMD_PORTAUP: + //IT compatibility (one of the first - link effect memory) if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) PortamentoUp(pChn, vol << 2, true); else @@ -1404,6 +1416,7 @@ break; case VOLCMD_PORTADOWN: + //IT compatibility (one of the first - link effect memory) if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) PortamentoDown(pChn, vol << 2, true); else @@ -1535,21 +1548,22 @@ } if(!GetModFlag(MSF_COMPATIBLE_PLAY)) { - if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); else param = pChn->nRetrigParam; - //rewbs.volOffset - //RetrigNote(nChn, param); - if (volcmd == VOLCMD_OFFSET) - RetrigNote(nChn, param, vol<<3); - else if (volcmd == VOLCMD_VELOCITY) - RetrigNote(nChn, param, 48-(vol << 3)); - else - RetrigNote(nChn, param); - //end rewbs.volOffset: + if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); else param = pChn->nRetrigParam; + //rewbs.volOffset + //RetrigNote(nChn, param); + if (volcmd == VOLCMD_OFFSET) + RetrigNote(nChn, param, vol<<3); + else if (volcmd == VOLCMD_VELOCITY) + RetrigNote(nChn, param, 48-(vol << 3)); + else + RetrigNote(nChn, param); + //end rewbs.volOffset: } else { - if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); - RetrigNote(nChn, pChn->nRetrigParam); + //IT compatibility 15. Retrigger + if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); + RetrigNote(nChn, pChn->nRetrigParam); } break; @@ -1567,7 +1581,7 @@ if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; if(GetModFlag(MSF_COMPATIBLE_PLAY)) { - // both FT2 and IT ignore out-of-range values + //IT compatibility 16. Both FT2 and IT ignore out-of-range values if (param <= 128) m_nGlobalVolume = param << 1; } @@ -1580,6 +1594,7 @@ // Global Volume Slide case CMD_GLOBALVOLSLIDE: + //IT compatibility 16. Saving last global volume slide param per channel (FT2/IT) if(GetModFlag(MSF_COMPATIBLE_PLAY)) GlobalVolSlide(param, &pChn->nOldGlobalVolSlide); else @@ -1636,7 +1651,7 @@ case CMD_KEYOFF: if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) { - // This is how it's supposed to sound... + // This is how it's supposed to sound... (in FT2) if (m_nTickCount == param) { // XM: Key-Off + Sample == Note Cut @@ -1698,6 +1713,7 @@ if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) { + // FT2 only sets the position of the Volume envelope pChn->nPanEnvPosition = param; pChn->nPitchEnvPosition = param; if (pChn->pHeader) @@ -1905,6 +1921,10 @@ { DoFreqSlide(pChn, -(int)(param * 4)); } + + //IT compatibility 23. Portamento with no note + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + pChn->nPortamentoDest = 0; } @@ -1947,6 +1967,9 @@ DoFreqSlide(pChn, (int)(param << 2)); } + //IT compatibility 23. Portamento with no note + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + pChn->nPortamentoDest = 0; } void CSoundFile::MidiPortamento(MODCHANNEL *pChn, int param) @@ -2381,6 +2404,7 @@ //case 0x80: if (!m_nTickCount) { pChn->nPan = (param << 4) + 8; pChn->dwFlags |= CHN_FASTVOLRAMP; } break; case 0x80: if (!m_nTickCount) { + //IT compatibility (Panning always resets surround state) if( TypeIsIT_MPT_XM() == false || GetModFlag(MSF_COMPATIBLE_PLAY) ) { if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND; @@ -2951,7 +2975,7 @@ if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { - // IT retrigger behaviour + //IT compatibility 15. Retrigger if (!m_nTickCount && pChn->nRowNote) { pChn->nRetrigCount = param & 0xf; @@ -3075,6 +3099,16 @@ void CSoundFile::NoteCut(UINT nChn, UINT nTick) //--------------------------------------------- { + if(nTick == 0) + { + //IT compatibility 22. SC0 == SC1 + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + nTick = 1; + // ST3 doesn't cut notes with SC0 + else if(m_nType & MOD_TYPE_S3M) + return; + } + if (m_nTickCount == nTick) { MODCHANNEL *pChn = &Chn[nChn]; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-12 12:25:38 UTC (rev 293) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-12 14:17:41 UTC (rev 294) @@ -636,6 +636,12 @@ Chn[ich].dwFlags = ChnSettings[ich].dwFlags; Chn[ich].nVolume = 256; Chn[ich].nCutOff = 0x7F; + //IT compatibility 15. Retrigger + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + { + Chn[ich].nRetrigParam = 1; + Chn[ich].nRetrigCount = 0; + } } // Checking instruments MODINSTRUMENT *pins = Ins; @@ -1135,7 +1141,13 @@ Chn[j].nCommand = 0; Chn[j].nPatternLoopCount = 0; Chn[j].nPatternLoop = 0; - if(!GetModFlag(MSF_COMPATIBLE_PLAY)) Chn[j].nTremorCount = 0; + //IT compatibility 15. Retrigger + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + { + Chn[j].nRetrigCount = 0; + Chn[j].nRetrigParam = 1; + } + Chn[j].nTremorCount = Chn[j].nTremorOn = Chn[j].nTremorOff = 0; } if (!nPos) { @@ -1395,6 +1407,12 @@ Chn[i].nPatternLoop = 0; Chn[i].nFadeOutVol = 0; Chn[i].dwFlags |= CHN_KEYOFF|CHN_NOTEFADE; + //IT compatibility 15. Retrigger + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + { + Chn[i].nRetrigParam = 1; + Chn[i].nRetrigCount = 0; + } Chn[i].nTremorCount = Chn[i].nTremorOn = Chn[i].nTremorOff = 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-16 16:08:58
|
Revision: 296 http://modplug.svn.sourceforge.net/modplug/?rev=296&view=rev Author: saga-games Date: 2009-07-16 16:08:49 +0000 (Thu, 16 Jul 2009) Log Message: ----------- [Fix] Find/Replace: Made comboboxes more convenient to use [Fix] IT compatibility: Fixed the fix for test #23 Modified Paths: -------------- trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-12 22:21:08 UTC (rev 295) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-16 16:08:49 UTC (rev 296) @@ -1181,7 +1181,7 @@ CONTROL "Instrument",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,60,17,49,10 COMBOBOX IDC_COMBO2,60,28,106,103,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP + WS_TABSTOP | CBS_SORT CONTROL "Volume Effect",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,46,60,10 COMBOBOX IDC_COMBO3,13,58,94,77,CBS_DROPDOWNLIST | CBS_SORT | @@ -1189,7 +1189,7 @@ CONTROL "Volume Data",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,46,56,10 COMBOBOX IDC_COMBO4,117,58,48,77,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP + WS_TABSTOP | CBS_SORT CONTROL "Effect",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,78,35,10 COMBOBOX IDC_COMBO5,13,92,94,71,CBS_DROPDOWNLIST | CBS_SORT | @@ -1222,13 +1222,13 @@ CONTROL "Instrument",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,60,31,49,10 COMBOBOX IDC_COMBO2,60,42,106,92,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP + WS_TABSTOP | CBS_SORT CONTROL "Volume Effect",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,60,60,10 COMBOBOX IDC_COMBO3,13,71,94,64,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO4,117,71,48,64,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP + WS_TABSTOP | CBS_SORT CONTROL "Volume Data",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,60,56,10 CONTROL "Effect",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | @@ -1238,7 +1238,7 @@ COMBOBOX IDC_COMBO5,13,106,94,70,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO6,117,106,48,80,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP + WS_TABSTOP | CBS_SORT CONTROL "Replace By:",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,15,63,10 CONTROL "Replace All (No confirmation)",IDC_CHECK8,"Button", Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-12 22:21:08 UTC (rev 295) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-16 16:08:49 UTC (rev 296) @@ -1927,10 +1927,6 @@ { DoFreqSlide(pChn, -(int)(param * 4)); } - - //IT compatibility 23. Portamento with no note - if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) - pChn->nPortamentoDest = 0; } @@ -1972,10 +1968,6 @@ if (!(m_dwSongFlags & SONG_FIRSTTICK) || (m_nMusicSpeed == 1)) { //rewbs.PortaA01fix DoFreqSlide(pChn, (int)(param << 2)); } - - //IT compatibility 23. Portamento with no note - if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) - pChn->nPortamentoDest = 0; } void CSoundFile::MidiPortamento(MODCHANNEL *pChn, int param) @@ -2181,6 +2173,11 @@ if (pChn->nPeriod < pChn->nPortamentoDest) pChn->nPeriod = pChn->nPortamentoDest; } } + + //IT compatibility 23. Portamento with no note + if(pChn->nPeriod == pChn->nPortamentoDest && ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) && GetModFlag(MSF_COMPATIBLE_PLAY)) + pChn->nPortamentoDest = 0; + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-19 21:41:15
|
Revision: 297 http://modplug.svn.sourceforge.net/modplug/?rev=297&view=rev Author: saga-games Date: 2009-07-19 21:41:08 +0000 (Sun, 19 Jul 2009) Log Message: ----------- [Fix] VST: Default dirs for VST presets were not working properly [Fix] Pattern editor: Echo paste did not work properly if edit order was different from playback order [Fix] Pattern editor: Keyboard split note was off by one [Fix] Instrument editor: No relative values are shown for envelopes with no release node (status bar) [Fix] Find/Replace: (Hopefully) temporary fix for instrument sorting [Fix] Compatibility: Pattern loops are now handeled correctly in XM (using compatibility switch) and MOD files [Ref] Some small code changes (Usage of types PATTERNINDEX, ORDERINDEX, ROWINDEX) Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -115,8 +115,11 @@ CFileDialog dlg(TRUE, "fxp", NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN, "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd); - dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS); + const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS); + if(pszWdir[0]) + dlg.m_ofn.lpstrInitialDir = pszWdir; + if (!(dlg.DoModal() == IDOK)) return; CMainFrame::SetWorkingDirectory(dlg.GetFileName(), DIR_PLUGINPRESETS, true); @@ -135,8 +138,13 @@ CFileDialog dlg(FALSE, "fxp", NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN, "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd); + const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS); + if(pszWdir[0]) + dlg.m_ofn.lpstrInitialDir = pszWdir; if (!(dlg.DoModal() == IDOK)) return; + CMainFrame::SetWorkingDirectory(dlg.GetFileName(), DIR_PLUGINPRESETS, true); + //TODO: exception handling if (!(m_pVstPlugin->SaveProgram(dlg.GetFileName()))) ::AfxMessageBox("Error saving preset."); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -2877,7 +2877,7 @@ return NULL; } -HWND CModDoc::GetEditPosition(UINT &row, UINT &pat, UINT &ord) +HWND CModDoc::GetEditPosition(ROWINDEX &row, PATTERNINDEX &pat, ORDERINDEX &ord) //------------------------------------------------------------ { HWND followSonghWnd; @@ -3004,7 +3004,11 @@ } CSoundFile *pSndFile = GetSoundFile(); - UINT nPat,nOrd,nRow; + + ROWINDEX nRow; + PATTERNINDEX nPat; + ORDERINDEX nOrd; + HWND followSonghWnd; followSonghWnd = GetEditPosition(nRow, nPat, nOrd); @@ -3060,7 +3064,11 @@ } CSoundFile *pSndFile = GetSoundFile(); - UINT nRow,nPat,nOrd; + + ROWINDEX nRow; + PATTERNINDEX nPat; + ORDERINDEX nOrd; + HWND followSonghWnd; followSonghWnd = GetEditPosition(nRow,nPat,nOrd); @@ -3111,7 +3119,11 @@ } CSoundFile *pSndFile = GetSoundFile(); - UINT nPat,nOrd,nRow; + + ROWINDEX nRow; + PATTERNINDEX nPat; + ORDERINDEX nOrd; + HWND followSonghWnd; followSonghWnd = GetEditPosition(nRow,nPat,nOrd); Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-07-19 21:41:08 UTC (rev 297) @@ -240,10 +240,10 @@ UINT FindSampleParent(UINT nSmp) const; UINT FindInstrumentChild(UINT nIns) const; BOOL MoveOrder(UINT nSourceNdx, UINT nDestNdx, BOOL bUpdate=TRUE, BOOL bCopy=FALSE); - BOOL ExpandPattern(UINT nPattern); - BOOL ShrinkPattern(UINT nPattern); - BOOL CopyPattern(UINT nPattern, DWORD dwBeginSel, DWORD dwEndSel); - BOOL PastePattern(UINT nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix=FALSE); //rewbs.mixpaste + BOOL ExpandPattern(PATTERNINDEX nPattern); + BOOL ShrinkPattern(PATTERNINDEX nPattern); + BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel); + BOOL PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix=FALSE); //rewbs.mixpaste BOOL CopyEnvelope(UINT nIns, UINT nEnv); BOOL PasteEnvelope(UINT nIns, UINT nEnv); @@ -253,7 +253,7 @@ BOOL CanUndo(); LRESULT ActivateView(UINT nIdView, DWORD dwParam); void UpdateAllViews(CView *pSender, LPARAM lHint=0L, CObject *pHint=NULL); - HWND GetEditPosition(UINT &row, UINT &pat, UINT &ord); //rewbs.customKeys + HWND GetEditPosition(ROWINDEX &row, PATTERNINDEX &pat, ORDERINDEX &ord); //rewbs.customKeys LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys void TogglePluginEditor(UINT m_nCurrentPlugin); //rewbs.patPlugNames void RecordParamChange(int slot, long param); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -1564,7 +1564,7 @@ } -BOOL CModDoc::ExpandPattern(UINT nPattern) +BOOL CModDoc::ExpandPattern(PATTERNINDEX nPattern) //---------------------------------------- { // -> CODE#0008 @@ -1578,7 +1578,7 @@ } -BOOL CModDoc::ShrinkPattern(UINT nPattern) +BOOL CModDoc::ShrinkPattern(PATTERNINDEX nPattern) //---------------------------------------- { if ((nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return FALSE; @@ -1598,7 +1598,7 @@ static LPCSTR lpszClipboardPatternHdr = "ModPlug Tracker %3s\x0D\x0A"; -BOOL CModDoc::CopyPattern(UINT nPattern, DWORD dwBeginSel, DWORD dwEndSel) +BOOL CModDoc::CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel) //------------------------------------------------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); @@ -1748,7 +1748,7 @@ // -> CODE#0014 // -> DESC="vst wet/dry slider" //BOOL CModDoc::PastePattern(UINT nPattern, DWORD dwBeginSel) -BOOL CModDoc::PastePattern(UINT nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix) +BOOL CModDoc::PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix) // -! NEW_FEATURE#0014 //--------------------------------------------------------- { @@ -1762,18 +1762,22 @@ if ((hCpy) && ((p = (LPSTR)GlobalLock(hCpy)) != NULL)) { - PrepareUndo(nPattern, 0,0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]); + PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]); BYTE spdmax = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 0x20 : 0x1F; DWORD dwMemSize = GlobalSize(hCpy); MODCOMMAND *m = m_SndFile.Patterns[nPattern]; UINT nrow = dwBeginSel >> 16; UINT ncol = (dwBeginSel & 0xFFFF) >> 3; - ORDERINDEX oCurrentOrder = m_SndFile.GetCurrentOrder(); //jojo.echopaste UINT col; BOOL bS3M = FALSE, bOk = FALSE; UINT len = 0; MODCOMMAND origModCmd; + ORDERINDEX oCurrentOrder; //jojo.echopaste + ROWINDEX rTemp; + PATTERNINDEX pTemp; + GetEditPosition(rTemp, pTemp, oCurrentOrder); + if ((nrow >= m_SndFile.PatternSize[nPattern]) || (ncol >= m_SndFile.m_nChannels)) goto PasteDone; m += nrow * m_SndFile.m_nChannels; // Search for signature Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -1739,13 +1739,13 @@ if (nVal < 0) nVal = 0; if (nVal > 64) nVal = 64; if (nTick < 0) nTick = 0; - if (nTick<=EnvGetReleaseNodeTick()+1) { + if (nTick <= EnvGetReleaseNodeTick() + 1 || EnvGetReleaseNode() == ENV_RELEASE_NODE_UNSET) { int displayVal = (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal; wsprintf(s, "Tick %d, [%d]", nTick, displayVal); } else { - int displayVal = (nVal-EnvGetReleaseNodeValue())*2; - displayVal = (m_nEnv != ENV_VOLUME) ? displayVal-32 : displayVal; - wsprintf(s, "Tick %d, [Rel%c%d]", nTick, displayVal>0?'+':'-', abs(displayVal)); + int displayVal = (nVal - EnvGetReleaseNodeValue()) * 2; + displayVal = (m_nEnv != ENV_VOLUME) ? displayVal - 32 : displayVal; + wsprintf(s, "Tick %d, [Rel%c%d]", nTick, displayVal > 0 ? '+' : '-', abs(displayVal)); } UpdateIndicator(s); if ((m_dwStatus & INSSTATUS_DRAGGING) && (m_nDragItem)) Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -3870,10 +3870,10 @@ const UINT nTick = pSndFile->m_nTickCount; const PATTERNINDEX nPatPlayback = pSndFile->m_nPattern; - const bool isSplit = (note < m_nSplitNote); + const bool isSplit = (note <= m_nSplitNote); + UINT ins = 0; if (pModDoc) { - UINT ins = 0; if (isSplit) { ins = m_nSplitInstrument; @@ -3959,7 +3959,7 @@ //Enter note off p->note = NOTE_KEYOFF; - p->instr = (bChordMode) ? 0 : GetCurrentInstrument(); //p->instr = 0; + p->instr = (bChordMode) ? 0 : ins; //p->instr = 0; //Writing the instrument as well - probably someone finds this annoying :) p->volcmd = 0; p->vol = 0; @@ -4520,7 +4520,7 @@ bool CViewPattern::HandleSplit(MODCOMMAND* p, int note) //----------------------------------------------------- { - if (note>=m_nSplitNote) + if (note>m_nSplitNote) { p->note = note; UINT nins = GetCurrentInstrument(); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -656,10 +656,10 @@ { if (pSndFile->m_nInstruments) { - wsprintf(s, "%02d:%s", n, (pSndFile->Headers[n]) ? pSndFile->Headers[n]->name : ""); + wsprintf(s, "%03d:%s", n, (pSndFile->Headers[n]) ? pSndFile->Headers[n]->name : ""); } else { - wsprintf(s, "%02d:%s", n, pSndFile->m_szNames[n]); + wsprintf(s, "%03d:%s", n, pSndFile->m_szNames[n]); } combo->SetItemData(combo->AddString(s), n); } Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-19 21:41:08 UTC (rev 297) @@ -534,7 +534,7 @@ ModCompatibilityExportTip = 0, ItCompatibilityExportTip = 1, ConfirmSignUnsignWhenPlaying = 2, - enMsgBoxHidableMessage_count = 3 + enMsgBoxHidableMessage_count }; void MsgBoxHidable(enMsgBoxHidableMessage enMsg); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-16 16:08:49 UTC (rev 296) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-19 21:41:08 UTC (rev 297) @@ -3262,7 +3262,8 @@ pChn->nPatternLoopCount--; if(!pChn->nPatternLoopCount) { - if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) + //IT compatibility 10. Pattern loops (+ same fix for XM and MOD files) + if((GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) || (GetType() & (MOD_TYPE_MOD))) pChn->nPatternLoop = m_nRow+1; return -1; @@ -3270,8 +3271,9 @@ } else { MODCHANNEL *p = Chn; - - if(!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY))) + + //IT compatibility 10. Pattern loops (+ same fix for XM and MOD files) + if(!((GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) || (GetType() & (MOD_TYPE_MOD)))) { for (UINT i=0; i<m_nChannels; i++, p++) if (p != pChn) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-20 21:33:21
|
Revision: 298 http://modplug.svn.sourceforge.net/modplug/?rev=298&view=rev Author: saga-games Date: 2009-07-20 21:33:11 +0000 (Mon, 20 Jul 2009) Log Message: ----------- [Fix] Pattern editor: Weird combination of context menu shortcut and "always center active row" being disabled (http://lpchip.com/modplug/viewtopic.php?t=3203) [Fix] Sample editor: Global volume is now also being adjusted for stereo and 16-Bit samples [Ref] Using constants instead of numbers in two places Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-19 21:41:08 UTC (rev 297) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-20 21:33:11 UTC (rev 298) @@ -1220,12 +1220,12 @@ //------ Plugin Header Menu --------- : if ((m_dwStatus & PATSTATUS_PLUGNAMESINHEADERS) && - (pt.y > m_szHeader.cy-PLUGNAME_HEIGHT) && (pt.y <= m_szHeader.cy)) { + (pt.y > m_szHeader.cy-PLUGNAME_HEIGHT) && (pt.y < m_szHeader.cy)) { BuildPluginCtxMenu(hMenu, nChn, pSndFile); } //------ Channel Header Menu ---------- : - else if (pt.y <= m_szHeader.cy){ + else if (pt.y < m_szHeader.cy){ if (ih->ShiftPressed()) { //Don't bring up menu if shift is pressed, else we won't get button up msg. } else { @@ -1237,7 +1237,7 @@ } //------ Standard Menu ---------- : - else if ((pt.x >= m_szHeader.cx) && (pt.y > m_szHeader.cy)) { + else if ((pt.x >= m_szHeader.cx) && (pt.y >= m_szHeader.cy)) { /*if (BuildSoloMuteCtxMenu(hMenu, ih, nChn, pSndFile)) AppendMenu(hMenu, MF_SEPARATOR, 0, "");*/ if (BuildSelectionCtxMenu(hMenu, ih)) Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2009-07-19 21:41:08 UTC (rev 297) +++ trunk/OpenMPT/mptrack/view_com.cpp 2009-07-20 21:33:11 UTC (rev 298) @@ -276,7 +276,7 @@ { wsprintf(s, "%d Hz", pSndFile->GetFreqFromPeriod( - pSndFile->GetPeriodFromNote(61, pins->nFineTune, pins->nC4Speed), + pSndFile->GetPeriodFromNote(NOTE_MIDDLEC, pins->nFineTune, pins->nC4Speed), pins->nC4Speed)); } break; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-19 21:41:08 UTC (rev 297) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-20 21:33:11 UTC (rev 298) @@ -3450,7 +3450,7 @@ UINT CSoundFile::GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const //------------------------------------------------------------------------------- { - if ((!note) || (note > 0xF0)) return 0; + if ((!note) || (note >= NOTE_MIN_SPECIAL)) return 0; if (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_MDL|MOD_TYPE_ULT|MOD_TYPE_WAV |MOD_TYPE_FAR|MOD_TYPE_DMF|MOD_TYPE_PTM|MOD_TYPE_AMS|MOD_TYPE_DBM|MOD_TYPE_AMF|MOD_TYPE_PSM)) { Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-19 21:41:08 UTC (rev 297) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-20 21:33:11 UTC (rev 298) @@ -280,7 +280,7 @@ RemoveOffsetAndNormalize( reinterpret_cast<int8*>(pins->pSample) + iStart, iEnd - iStart, dOffset, dAmplify); // step 3: adjust global vol (if available) - if((modtype & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (iStart == 0) && (iEnd == pins->nLength)) + if((modtype & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (iStart == 0) && (iEnd == pins->nLength * pins->GetNumChannels())) pins->nGlobalVol = min((WORD)(pins->nGlobalVol / dAmplify), 64); AdjustEndOfSample(smp, pSndFile); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-21 21:33:46
|
Revision: 299 http://modplug.svn.sourceforge.net/modplug/?rev=299&view=rev Author: saga-games Date: 2009-07-21 21:33:40 +0000 (Tue, 21 Jul 2009) Log Message: ----------- [Fix] Keyboard manager: Octave offset for key descriptions is now C, not A [Fix] Sample editor: Removed tuning from up/downsampling for MOD files which detuned them when saving [Imp] Module loader: If plugins are missing, a single MessageBox is shown. [Ref] Using constant instead of number in load_mid.cpp Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-07-20 21:33:11 UTC (rev 298) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-07-21 21:33:40 UTC (rev 299) @@ -418,17 +418,17 @@ commands[kcVPNoteA_1].UID = 1073; commands[kcVPNoteA_1].isHidden = false; commands[kcVPNoteA_1].isDummy = false; - commands[kcVPNoteA_1].Message = "Base octave +1 A"; + commands[kcVPNoteA_1].Message = "Base octave A"; commands[kcVPNoteAS1].UID = 1074; commands[kcVPNoteAS1].isHidden = false; commands[kcVPNoteAS1].isDummy = false; - commands[kcVPNoteAS1].Message = "Base octave +1 A#"; + commands[kcVPNoteAS1].Message = "Base octave A#"; commands[kcVPNoteB_1].UID = 1075; commands[kcVPNoteB_1].isHidden = false; commands[kcVPNoteB_1].isDummy = false; - commands[kcVPNoteB_1].Message = "Base octave +1 B"; + commands[kcVPNoteB_1].Message = "Base octave B"; commands[kcVPNoteC_1].UID = 1076; commands[kcVPNoteC_1].isHidden = false; @@ -478,17 +478,17 @@ commands[kcVPNoteA_2].UID = 1085; commands[kcVPNoteA_2].isHidden = false; commands[kcVPNoteA_2].isDummy = false; - commands[kcVPNoteA_2].Message = "Base octave +2 A"; + commands[kcVPNoteA_2].Message = "Base octave +1 A"; commands[kcVPNoteAS2].UID = 1086; commands[kcVPNoteAS2].isHidden = false; commands[kcVPNoteAS2].isDummy = false; - commands[kcVPNoteAS2].Message = "Base octave +2 A#"; + commands[kcVPNoteAS2].Message = "Base octave +1 A#"; commands[kcVPNoteB_2].UID = 1087; commands[kcVPNoteB_2].isHidden = false; commands[kcVPNoteB_2].isDummy = false; - commands[kcVPNoteB_2].Message = "Base octave +2 B"; + commands[kcVPNoteB_2].Message = "Base octave +1 B"; commands[kcVPNoteC_2].UID = 1088; commands[kcVPNoteC_2].isHidden = false; @@ -538,7 +538,7 @@ commands[kcVPNoteA_3].UID = 1097; commands[kcVPNoteA_3].isHidden = false; commands[kcVPNoteA_3].isDummy = false; - commands[kcVPNoteA_3].Message = "Base octave +3 A"; + commands[kcVPNoteA_3].Message = "Base octave +2 A"; commands[kcVPNoteStopC_0].UID = 1098; commands[kcVPNoteStopC_0].isHidden = true; Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-20 21:33:11 UTC (rev 298) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-21 21:33:40 UTC (rev 299) @@ -1491,8 +1491,11 @@ pins->nLength = dwNewLen; if (viewstate.dwEndSel <= viewstate.dwBeginSel) { - if (pins->nC4Speed < 200000) pins->nC4Speed *= 2; - if (pins->RelativeTone < 84) pins->RelativeTone += 12; + if(!(m_pSndFile->m_nType & MOD_TYPE_MOD)) + { + if (pins->nC4Speed < 200000) pins->nC4Speed *= 2; + if (pins->RelativeTone < 84) pins->RelativeTone += 12; + } } CSoundFile::FreeSample(pOriginal); END_CRITICAL(); @@ -1614,8 +1617,11 @@ } if (viewstate.dwEndSel <= viewstate.dwBeginSel) { - if (pins->nC4Speed > 2000) pins->nC4Speed /= 2; - if (pins->RelativeTone > -84) pins->RelativeTone -= 12; + if(!(m_pSndFile->m_nType & MOD_TYPE_MOD)) + { + if (pins->nC4Speed > 2000) pins->nC4Speed /= 2; + if (pins->RelativeTone > -84) pins->RelativeTone -= 12; + } } pins->nLength = dwNewLen; pins->pSample = (LPSTR)pNewSample; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2009-07-20 21:33:11 UTC (rev 298) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2009-07-21 21:33:40 UTC (rev 299) @@ -571,13 +571,14 @@ return bOk; } else { - CString message; + // MOVED to CSoundFile::Create + /*CString message; message.Format("This track uses the plugin \"%s\", which could not be found.\n\rSearch for this plug on kvraudio?", pMixPlugin->Info.szLibraryName); if (AfxMessageBox(message, MB_YESNO|MB_ICONQUESTION) == IDYES ) { CString url; url.Format("http://www.kvraudio.com/search.php?q=%s&lq=db", pMixPlugin->Info.szLibraryName); CTrackApp::OpenURL(url); - } + }*/ #ifdef VST_LOG Log("Unknown plugin\n"); Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2009-07-20 21:33:11 UTC (rev 298) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2009-07-21 21:33:40 UTC (rev 299) @@ -431,7 +431,7 @@ int mapnote = j+1; if (nChannel == MIDI_DRUMCHANNEL) { - mapnote = 61; + mapnote = NOTE_MIDDLEC; /*mapnote = 61 + j - nNote; if (mapnote < 1) mapnote = 1; if (mapnote > 120) mapnote = 120;*/ Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-20 21:33:11 UTC (rev 298) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-21 21:33:40 UTC (rev 299) @@ -704,9 +704,14 @@ if ((m_nRestartPos >= Order.size()) || (Order[m_nRestartPos] >= Patterns.Size())) m_nRestartPos = 0; // Load plugins only when m_pModDoc != 0. (can be == 0 for example when examining module samples in treeview. + + CString sNotFound; + BOOL bSearchIDs[MAX_MIXPLUGINS] = {false}; + UINT iShowNotFound = 0; + if (gpMixPluginCreateProc && GetpModDoc()) { - for (UINT iPlug=0; iPlug<MAX_MIXPLUGINS; iPlug++) + for (UINT iPlug = 0; iPlug < MAX_MIXPLUGINS; iPlug++) { if ((m_MixPlugins[iPlug].Info.dwPluginId1) || (m_MixPlugins[iPlug].Info.dwPluginId2)) @@ -714,12 +719,50 @@ gpMixPluginCreateProc(&m_MixPlugins[iPlug], this); if (m_MixPlugins[iPlug].pMixPlugin) { + // plugin has been found m_MixPlugins[iPlug].pMixPlugin->RestoreAllParameters(m_MixPlugins[iPlug].defaultProgram); //rewbs.plugDefaultProgram: added param } + else + { + // plugin not found - add to list + BOOL bFound = false; + for(UINT iPlugFind = 0; iPlugFind < iPlug; iPlugFind++) + if(m_MixPlugins[iPlugFind].Info.dwPluginId2 == m_MixPlugins[iPlug].Info.dwPluginId2) + bFound = true; + + if(bFound == false) + { + sNotFound = sNotFound + m_MixPlugins[iPlug].Info.szLibraryName + "\n"; + bSearchIDs[iPlug] = true; // set this flag so we will find the needed plugins later when calling KVRAudio + } + iShowNotFound++; + } } } } + // Display a nice message so the user sees what plugins are missing + if(iShowNotFound) + { + if(iShowNotFound == 1) + { + sNotFound = "The following plugin has not been found:\n\n" + sNotFound + "\nDo you want to search for it on KVRAudio?"; + } + else + { + sNotFound = "The following plugins have not been found:\n\n" + sNotFound + "\nDo you want to search for them on KVRAudio?" + "\nWARNING: A browser window / tab is opened for every plugin. If you do not want that, you can visit http://www.kvraudio.com/search.php"; + } + if (::MessageBox(0, sNotFound, "OpenMPT - Plugins missing", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES) + for (UINT iPlug = 0; iPlug < MAX_MIXPLUGINS; iPlug++) + if (bSearchIDs[iPlug] == true) + { + CString sUrl; + sUrl.Format("http://www.kvraudio.com/search.php?q=%s&lq=db", m_MixPlugins[iPlug].Info.szLibraryName); + CTrackApp::OpenURL(sUrl); + } + } + // Set up mix levels m_pConfig->SetMixLevels(m_nMixLevels); RecalculateGainForAllPlugs(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-23 13:05:39
|
Revision: 300 http://modplug.svn.sourceforge.net/modplug/?rev=300&view=rev Author: saga-games Date: 2009-07-23 13:05:32 +0000 (Thu, 23 Jul 2009) Log Message: ----------- Commit 300! \o/ [Imp] Mod conversion: Somewhat decent conversion of Kxx (Key Off) from XM to S3M/IT [Imp] Pattern editor: Solo/Unmute context menu has a bit more dynamical transition menu points (experimental) [Imp] Pattern editor: Returned to old pattern looping behaviour when a Bxx effect occours (experimental) [Fix] FT2 compatibility: More compatible handling of Kxx effect [Fix] IT compatibility: Random waveforms (vibrato, tremolo, panbrello) (test #19) [Fix] IT compatibility: Fixed handling of very short pitch / filter envelopes (test #24) Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -206,6 +206,16 @@ case 0xA0: m->command = CMD_S3MCMDEX; break; } break; + case CMD_KEYOFF: + if(m->note == 0) + { + m->note = (newTypeIsS3M) ? NOTE_NOTECUT : NOTE_KEYOFF; + m->command = CMD_S3MCMDEX; + if(m->param == 0) + m->instr = 0; + m->param = 0xD0 | (m->param & 0x0F); + } + break; } } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -4583,19 +4583,25 @@ AppendMenu(hMenu, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_PATTERN_MUTE, "Mute Channel\t" + ih->GetKeyTextFromCommand(kcChannelMute)); - BOOL b, bAll; - b = FALSE; - bAll = FALSE; - for (UINT i=0; i<pSndFile->m_nChannels; i++) { - if (i != nChn) { - if (!(pSndFile->ChnSettings[i].dwFlags & CHN_MUTE)) b = TRUE; - } else { - if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) b = TRUE; + BOOL bSolo = false, bUnmuteAll = false; + BOOL bSoloPending = false, bUnmuteAllPending = false; // doesn't work perfectly yet + + for (CHANNELINDEX i = 0; i < pSndFile->m_nChannels; i++) { + if (i != nChn) + { + if (!(pSndFile->ChnSettings[i].dwFlags & CHN_MUTE)) bSolo = bSoloPending = true; + if (!((~pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) && pSndFile->m_bChannelMuteTogglePending[i])) bSoloPending = true; } - if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) bAll = TRUE; + else + { + if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) bSolo = bSoloPending = true; + if ((~pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) && pSndFile->m_bChannelMuteTogglePending[i]) bSoloPending = true; + } + if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) bUnmuteAll = bUnmuteAllPending = true; + if ((~pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) && pSndFile->m_bChannelMuteTogglePending[i]) bUnmuteAllPending = true; } - if (b) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); - if (bAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); + if (bSolo) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); + if (bUnmuteAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); AppendMenu(hMenu, pSndFile->m_bChannelMuteTogglePending[nChn] ? @@ -4605,8 +4611,8 @@ "On transition: Unmute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : "On transition: Mute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); - AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); - AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); + if (bUnmuteAllPending) AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); + if (bSoloPending) AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); AppendMenu(hMenu, MF_STRING, ID_PATTERN_CHNRESET, "Reset Channel\t" + ih->GetKeyTextFromCommand(kcChannelReset)); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -1109,7 +1109,7 @@ m_MixPlugins[plug-1].pMixPlugin->SetParameter(plugparam, value); } - // Process continuous parameter pontrol note. + // Process continuous parameter control note. // Row data is cleared after first tick so on following // ticks using channels m_nPlugParamValueStep to identify // the need for parameter control. The condition cmd == 0 @@ -1216,9 +1216,15 @@ { UINT note = pChn->nRowNote; if (instr) pChn->nNewIns = instr; - // XM: Key-Off + Sample == Note Cut if (m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM|MOD_TYPE_MT2)) { + // XM: FT2 ignores a note next to a K00 effect, and a fade-out seems to be done when no volume envelope is present (not exactly the Kxx behaviour) + if(cmd == CMD_KEYOFF && param == 0 && GetModFlag(MSF_COMPATIBLE_PLAY)) + { + note = instr = 0; + } + + // XM: Key-Off + Sample == Note Cut if ((note == NOTE_KEYOFF) && ((!pChn->pHeader) || (!(pChn->pHeader->dwFlags & ENV_VOLUME)))) { pChn->dwFlags |= CHN_FASTVOLRAMP; @@ -1357,7 +1363,17 @@ // Volume Column Effect (except volume & panning) - if ((volcmd > VOLCMD_PANNING) && (m_nTickCount >= nStartTick)) + /* A few notes, paraphrased from ITTECH.TXT by Storlek (creator of schismtracker): + Ex/Fx/Gx are shared with Exx/Fxx/Gxx; Ex/Fx are 4x the 'normal' slide value + Gx is linked with Ex/Fx if Compat Gxx is off, just like Gxx is with Exx/Fxx + Gx values: 1, 4, 8, 16, 32, 64, 96, 128, 255 + Ax/Bx/Cx/Dx values are used directly (i.e. D9 == D09), and are NOT shared with Dxx + (value is stored into nOldVolParam and used by A0/B0/C0/D0) + Hx uses the same value as Hxx and Uxx, and affects the *depth* + so... hxx = (hx | (oldhxx & 0xf0)) ??? + TODO is this done correctly? + */ + if ((volcmd > VOLCMD_PANNING) && (m_nTickCount >= nStartTick)) { if (volcmd == VOLCMD_TONEPORTAMENTO) { @@ -1663,8 +1679,15 @@ // XM: Key-Off + Sample == Note Cut if ((!pChn->pHeader) || (!(pChn->pHeader->dwFlags & ENV_VOLUME))) { - pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nVolume = 0; + if(param == 0) // FT2 is weird.... + { + pChn->dwFlags |= CHN_NOTEFADE; + } + else + { + pChn->dwFlags |= CHN_FASTVOLRAMP; + pChn->nVolume = 0; + } } KeyOff(nChn); } @@ -1738,12 +1761,14 @@ // Position Jump case CMD_POSITIONJUMP: nPosJump = param; + /* commented this out (http://lpchip.com/modplug/viewtopic.php?t=1808) - I hope it doesn't break anything else. if((m_dwSongFlags & SONG_PATTERNLOOP && m_nSeqOverride == 0)) { m_nSeqOverride = param+1; //Releasing pattern loop after position jump could cause //instant jumps - modifying behavior so that now position jumps //occurs also when pattern loop is enabled. } + */ // see http://lpchip.com/modplug/viewtopic.php?t=2769 - FastTracker resets Dxx if Bxx is called _after_ Dxx if(GetType() == MOD_TYPE_XM) nBreakRow = 0; break; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -973,7 +973,11 @@ vol += (ModSquareTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; break; case 3: - vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; + //IT compatibility 19. Use random values + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + vol += (((rand() & 0xFF) - 0x7F) * (int)pChn->nTremoloDepth) >> tremattn; + else + vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; break; default: vol += (ModSinusTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; @@ -1321,7 +1325,11 @@ vdelta = ModSquareTable[vibpos]; break; case 3: - vdelta = ModRandomTable[vibpos]; + //IT compatibility 19. Use random values + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + vdelta = (rand() & 0xFF) - 0x7F; + else + vdelta = ModRandomTable[vibpos]; break; default: vdelta = ModSinusTable[vibpos]; @@ -1377,7 +1385,11 @@ pdelta = ModSquareTable[panpos]; break; case 3: - pdelta = ModRandomTable[panpos]; + //IT compatibility 19. Use random values + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + pdelta = (rand() & 0xFF) - 0x7F; + else + pdelta = ModRandomTable[panpos]; break; default: pdelta = ModSinusTable[panpos]; @@ -1605,7 +1617,10 @@ // Pitch Loop ? if (penv->dwFlags & ENV_PITCHLOOP) { - if (pChn->nPitchEnvPosition >= penv->PitchPoints[penv->nPitchLoopEnd]) + UINT pitchloopend = penv->PitchPoints[penv->nPitchLoopEnd]; + //IT compatibility 24. Short envelope loops + if (m_nType != MOD_TYPE_XM && GetModFlag(MSF_COMPATIBLE_PLAY)) pitchloopend++; + if (pChn->nPitchEnvPosition == pitchloopend) pChn->nPitchEnvPosition = penv->PitchPoints[penv->nPitchLoopStart]; } // Pitch Sustain ? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-23 21:52:03
|
Revision: 301 http://modplug.svn.sourceforge.net/modplug/?rev=301&view=rev Author: saga-games Date: 2009-07-23 21:51:50 +0000 (Thu, 23 Jul 2009) Log Message: ----------- [Ref] Misc: Cleaned up a few dialogs (mptrack.rc has been changed drastically due to VS2008) [New] Setup: Option reset ramping and resampling to default values Modified Paths: -------------- trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2009-07-23 13:05:32 UTC (rev 300) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2009-07-23 21:51:50 UTC (rev 301) @@ -389,6 +389,7 @@ ON_COMMAND(IDC_CHECK5, OnSettingsChanged) ON_COMMAND(IDC_CHECK6, OnSettingsChanged) ON_COMMAND(IDC_CHECK7, OnSettingsChanged) + ON_COMMAND(IDC_BUTTON_DEFAULT_RESAMPLING, OnDefaultResampling) END_MESSAGE_MAP() @@ -561,6 +562,19 @@ OnSettingsChanged(); } +void COptionsPlayer::OnDefaultResampling() +{ + //CMainFrame::gbWFIRType = 7; //WFIR_KAISER4T + //CMainFrame::gdWFIRCutoff = 0.97; + //CMainFrame::m_nSrcMode = SRCMODE_POLYPHASE + //CMainFrame::glVolumeRampSamples = 42; + m_CbnResampling.SetCurSel(SRCMODE_POLYPHASE); + OnResamplerChanged(); + m_CEditWFIRCutoff.SetWindowText("97"); + m_CEditRamping.SetWindowText("42"); + +} + extern VOID SndMixInitializeTables(); //end rewbs.resamplerConf void COptionsPlayer::OnOK() Modified: trunk/OpenMPT/mptrack/Mpdlgs.h =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h 2009-07-23 13:05:32 UTC (rev 300) +++ trunk/OpenMPT/mptrack/Mpdlgs.h 2009-07-23 21:51:50 UTC (rev 301) @@ -65,6 +65,7 @@ //rewbs.resamplerConf afx_msg void OnWFIRTypeChanged(); afx_msg void OnResamplerChanged(); + afx_msg void OnDefaultResampling(); //end rewbs.resamplerConf DECLARE_MESSAGE_MAP() Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2009-07-23 13:05:32 UTC (rev 300) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2009-07-23 21:51:50 UTC (rev 301) @@ -571,18 +571,10 @@ return bOk; } else { - // MOVED to CSoundFile::Create - /*CString message; - message.Format("This track uses the plugin \"%s\", which could not be found.\n\rSearch for this plug on kvraudio?", pMixPlugin->Info.szLibraryName); - if (AfxMessageBox(message, MB_YESNO|MB_ICONQUESTION) == IDYES ) { - CString url; - url.Format("http://www.kvraudio.com/search.php?q=%s&lq=db", pMixPlugin->Info.szLibraryName); - CTrackApp::OpenURL(url); - }*/ - - #ifdef VST_LOG - Log("Unknown plugin\n"); - #endif + // "plug not found" notification code MOVED to CSoundFile::Create + #ifdef VST_LOG + Log("Unknown plugin\n"); + #endif } return FALSE; } @@ -1356,10 +1348,10 @@ PVSTPLUGINLIB pPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); if ((pManager) && (pManager->IsValidPlugin(pPlug))) { - SetDlgItemText(IDC_TEXT1, pPlug->szDllPath); + SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, pPlug->szDllPath); } else { - SetDlgItemText(IDC_TEXT1, ""); + SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, ""); } if (result) *result = 0; } @@ -1443,13 +1435,16 @@ CDialog::OnSize(nType, cx, cy); if (m_treePlugins) { - m_treePlugins.MoveWindow(11, 33, cx-105, cy-63, FALSE); - ::MoveWindow(GetDlgItem(IDC_NAMEFILTER)->m_hWnd, 50, 11, cx-145, 21, FALSE); - ::MoveWindow(GetDlgItem(IDC_TEXT1)->m_hWnd, 11,cy-25, cx-22, 25, FALSE); - ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 11, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); + m_treePlugins.MoveWindow(8, 36, cx - 104, cy - 63, FALSE); + + ::MoveWindow(GetDlgItem(IDC_STATIC_VSTNAMEFILTER)->m_hWnd, 8, 11, 40, 21, FALSE); + ::MoveWindow(GetDlgItem(IDC_NAMEFILTER)->m_hWnd, 40, 8, cx - 136, 21, FALSE); + + ::MoveWindow(GetDlgItem(IDC_TEXT_CURRENT_VSTPLUG)->m_hWnd, 8, cy - 20, cx - 22, 25, FALSE); + ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 8, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); Invalidate(); } } Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-23 13:05:32 UTC (rev 300) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-23 21:51:50 UTC (rev 301) @@ -196,8 +196,8 @@ default: m_PlugMixBox.SetCurSel(0); break; } - SetDlgItemText(IDC_EDIT5, "Created with:"); - SetDlgItemText(IDC_EDIT6, "Last saved with:"); + SetDlgItemText(IDC_STATIC_CREATEDWITH, "Created with:"); + SetDlgItemText(IDC_STATIC_SAVEDWITH, "Last saved with:"); SetDlgItemText(IDC_EDIT1, MptVersion::ToStr(m_pSndFile->m_dwCreatedWithVersion)); SetDlgItemText(IDC_EDIT2, MptVersion::ToStr(m_pSndFile->m_dwLastSavedWithVersion)); @@ -280,7 +280,7 @@ p->SetWindowText("1. Enable more IT compatible playback.\n" "2. Use old random variation behavior for instruments.\n" "3. Enable plugin volume command bug emulation."); - else if(XM) p->SetWindowText("1. Enable more XM compatible playback.\n" + else if(XM) p->SetWindowText("1. Enable more FT2 compatible playback.\n" "2. Unused\n" "3. Plugin volume command bug"); } @@ -530,11 +530,15 @@ BOOL CRemoveChannelsDlg::OnInitDialog() //------------------------------------- { - CHAR label[128]; + CHAR label[20 + MAX_CHANNELNAME]; CDialog::OnInitDialog(); - for (UINT n=0; n<m_nChannels; n++) + for (UINT n = 0; n < m_nChannels; n++) { - wsprintf(label,"Channel %d", n+1); + if(m_pSndFile->ChnSettings[n].szName[0] > 0x20) + wsprintf(label, "Channel %d: %s", (n + 1), m_pSndFile->ChnSettings[n].szName); + else + wsprintf(label, "Channel %d", n + 1); + m_RemChansList.SetItemData(m_RemChansList.AddString(label), n); if (m_bChnMask[n]) m_RemChansList.SetSel(n); } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-23 13:05:32 UTC (rev 300) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-23 21:51:50 UTC (rev 301) @@ -13,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources +// Englisch (USA) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 @@ -194,7 +194,6 @@ MENUITEM "Modplug Central &Forums", ID_NETLINK_FORUMS MENUITEM "OpenMPT Wiki", ID_NETLINK_OPENMPTWIKI MENUITEM "OpenMPT Wiki (German)", ID_NETLINK_OPENMPTWIKI_GERMAN - MENUITEM "MPT-FR", ID_NETLINK_MPTFR MENUITEM "&Kvr Audio (plugins)", ID_NETLINK_PLUGINS MENUITEM "The Mod Archive", ID_NETLINK_MODARCHIVE @@ -223,7 +222,6 @@ MENUITEM "&Insert Point", ID_ENVELOPE_INSERTPOINT MENUITEM "&Remove Point", ID_ENVELOPE_REMOVEPOINT MENUITEM "&Toggle Release Node", ID_ENVELOPE_TOGGLERELEASENODE - MENUITEM SEPARATOR MENUITEM "&Copy envelope", ID_EDIT_COPY MENUITEM "&Paste envelope", ID_EDIT_PASTE @@ -239,22 +237,16 @@ // IDD_ABOUTBOX DIALOGEX 0, 0, 267, 254 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | - WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About ModPlug Tracker" FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - CONTROL "",IDC_BITMAP1,"Static",SS_BLACKRECT | SS_NOTIFY | - SS_CENTERIMAGE,5,3,256,81,WS_EX_CLIENTEDGE + CONTROL "",IDC_BITMAP1,"Static",SS_BLACKRECT | SS_NOTIFY | SS_CENTERIMAGE,5,3,256,81,WS_EX_CLIENTEDGE CTEXT "",IDC_CREDITS,5,116,256,72,0,WS_EX_STATICEDGE DEFPUSHBUTTON "OK",IDOK,229,235,32,14,WS_GROUP - EDITTEXT IDC_EDIT1,5,194,221,55,ES_CENTER | ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT - WS_BORDER | WS_VSCROLL,WS_EX_STATICEDGE - EDITTEXT IDC_EDIT2,15,100,233,12,ES_CENTER | ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER - EDITTEXT IDC_EDIT3,26,87,212,12,ES_CENTER | ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_EDIT1,5,194,221,55,ES_CENTER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | WS_VSCROLL,WS_EX_STATICEDGE + EDITTEXT IDC_EDIT2,15,100,233,12,ES_CENTER | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_EDIT3,26,87,212,12,ES_CENTER | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER END IDD_OPTIONS_PLAYER DIALOGEX 0, 0, 272, 279 @@ -262,112 +254,82 @@ CAPTION "Player" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "Sound Quality",IDC_STATIC,5,165,256,97 - CONTROL "Automatic Gain Control",IDC_CHECK2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,20,97,10 - CONTROL "Noise reduction",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,32,82,10 - LTEXT "Resampling:",IDC_STATIC,11,179,41,8 - COMBOBOX IDC_COMBO1,54,177,120,56,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - CONTROL "Bass Expansion",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,53,81,10 + GROUPBOX "Control",IDC_STATIC,6,6,257,150 + CONTROL "Automatic Gain Control",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,97,10 + CONTROL "Enable Graphic Equalizer",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,135,20,107,10 + CONTROL "Noise reduction",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,82,10 + CONTROL "Bass Expansion",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,53,81,10 + CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,33,65,62,15 LTEXT "Low",IDC_STATIC,17,67,14,8 - CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,33,65,62,15 LTEXT "High",IDC_STATIC,95,67,16,8 - LTEXT "10Hz",IDC_STATIC,131,67,18,8 LTEXT "Range:",IDC_STATIC,169,53,24,8 - CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,149,64,62,15 + CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,149,64,62,15 + LTEXT "10Hz",IDC_STATIC,131,67,18,8 LTEXT "100Hz",IDC_STATIC,211,66,23,8 - CONTROL "Reverb",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,84,62,10 + CONTROL "Reverb",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,84,62,10 + CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,33,96,62,15 LTEXT "Low",IDC_STATIC,17,100,14,8 - CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,33,96,62,15 LTEXT "High",IDC_STATIC,95,100,16,8 CTEXT "Reverb Preset:",IDC_STATIC,149,90,62,8 - CONTROL "Pro-Logic Surround",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,116,99,10 + COMBOBOX IDC_COMBO2,135,97,100,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Pro-Logic Surround",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,116,99,10 + CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,33,129,62,15 LTEXT "Low",IDC_STATIC,17,132,14,8 - CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,33,129,62,15 LTEXT "High",IDC_STATIC,95,132,16,8 - LTEXT "5ms",IDC_STATIC,131,131,18,8 CTEXT "Front/Rear Delay:",IDC_STATIC,147,118,65,8 - CONTROL "Slider2",IDC_SLIDER6,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,149,128,62,15 + CONTROL "Slider2",IDC_SLIDER6,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,149,128,62,15 + LTEXT "5ms",IDC_STATIC,131,131,18,8 LTEXT "50ms",IDC_STATIC,211,131,23,8 - COMBOBOX IDC_COMBO2,135,97,100,100,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - GROUPBOX "Control",IDC_STATIC,5,5,257,150 - EDITTEXT IDC_WFIRCUTOFF,154,215,19,14,ES_AUTOHSCROLL | ES_NUMBER - COMBOBOX IDC_WFIRTYPE,54,196,119,64,CBS_DROPDOWN | WS_VSCROLL | - WS_TABSTOP - LTEXT "WFIR type:",IDC_STATIC,11,198,37,8 - LTEXT "WFIR cutoff factor:",IDC_STATIC,12,218,62,8 - LTEXT "%",IDC_STATIC,177,218,8,8 - LTEXT "Sample ramping (click avoidance):",IDC_STATIC,12,238, - 109,8 - EDITTEXT IDC_RAMPING,149,235,24,14,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Samples",IDC_STATIC,176,238,29,8 - LTEXT "(can be overridden by instrument setting)",IDC_STATIC, - 13,248,128,8 - CONTROL "Enable Graphic Equalizer",IDC_CHECK3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,135,20,107,10 + GROUPBOX "Sound Quality",IDC_STATIC,6,162,256,108 + LTEXT "Resampling:",IDC_STATIC,18,182,42,8 + COMBOBOX IDC_COMBO1,66,180,114,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "WFIR type:",IDC_STATIC,18,200,42,8 + COMBOBOX IDC_WFIRTYPE,66,198,114,64,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "WFIR cutoff factor:",IDC_STATIC,18,219,63,8 + EDITTEXT IDC_WFIRCUTOFF,156,216,24,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "%",IDC_STATIC,186,219,8,8 + LTEXT "Sample ramping (click avoidance):",IDC_STATIC,18,238,109,8 + LTEXT "(can be overridden by instrument setting)",IDC_STATIC,18,248,128,8 + EDITTEXT IDC_RAMPING,156,235,24,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Samples",IDC_STATIC,182,238,29,8 + PUSHBUTTON "Default Settings",IDC_BUTTON_DEFAULT_RESAMPLING,186,180,66,12 END IDD_WAVECONVERT DIALOGEX 0, 0, 211, 166 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | - WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Wave Convert" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,155,8,50,14 PUSHBUTTON "Cancel",IDCANCEL,155,28,50,14 GROUPBOX "",IDC_STATIC,4,4,146,157 - CONTROL "Limit file size to: (KBytes)",IDC_CHECK1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,13,111,10 + CONTROL "Limit file size to: (KBytes)",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,13,111,10 EDITTEXT IDC_EDIT1,21,24,50,12,ES_AUTOHSCROLL - CONTROL "Limit song length to: (seconds)",IDC_CHECK2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,40,111,10 + CONTROL "Limit song length to: (seconds)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,40,111,10 EDITTEXT IDC_EDIT2,21,51,50,12,ES_AUTOHSCROLL LTEXT "Play:",IDC_STATIC,10,67,37,8 - CONTROL "Entire song",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,15, - 78,104,10 - CONTROL "From position",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON, - 15,91,58,10 - CONTROL "Normalize Output",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | - NOT WS_VISIBLE | WS_TABSTOP,76,133,73,10 - COMBOBOX IDC_COMBO1,10,106,54,82,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - COMBOBOX IDC_COMBO2,70,106,73,75,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - CONTROL "High quality resampling",IDC_CHECK3,"Button", - BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,76,122,104, - 10 + CONTROL "Entire song",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,15,78,104,10 + CONTROL "From position",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,15,91,58,10 + CONTROL "Normalize Output",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,76,133,73,10 + COMBOBOX IDC_COMBO1,10,106,54,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO2,70,106,73,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "High quality resampling",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,76,122,104,10 EDITTEXT IDC_EDIT3,75,90,19,12,ES_AUTOHSCROLL | ES_NUMBER CTEXT "to",IDC_STATIC,99,91,8,8 EDITTEXT IDC_EDIT4,109,90,19,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Channel mode",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,82,66,60,12 - DEFPUSHBUTTON "Change Player Options",IDC_PLAYEROPTIONS,10,124,81,14, - BS_CENTER + CONTROL "Channel mode",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,82,66,60,12 + DEFPUSHBUTTON "Change Player Options",IDC_PLAYEROPTIONS,10,124,81,14,BS_CENTER CONTROL "Slow render (for Kontakt+DFD)",IDC_GIVEPLUGSIDLETIME, - "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_MULTILINE | - WS_TABSTOP,10,142,133,17 + "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_MULTILINE | WS_TABSTOP,10,142,133,17 END IDD_PROGRESS DIALOG 0, 0, 186, 55 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | - WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Saving Wave File" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Stop",IDCANCEL,68,34,50,14 - CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",WS_BORDER, - 4,19,178,12 + CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",WS_BORDER,4,19,178,12 CTEXT "Writing file...",IDC_TEXT1,4,4,178,9 END @@ -376,33 +338,24 @@ CAPTION "Keyboard" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - COMBOBOX IDC_KEYCATEGORY,5,16,130,204,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LISTBOX IDC_COMMAND_LIST,5,32,130,242,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_CHOICECOMBO,147,16,79,51,CBS_DROPDOWN | WS_VSCROLL | - WS_TABSTOP + COMBOBOX IDC_KEYCATEGORY,5,16,130,204,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_COMMAND_LIST,5,32,130,242,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_CHOICECOMBO,147,16,79,51,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_CUSTHOTKEY,163,31,98,13,ES_AUTOHSCROLL - CONTROL "On Key Down",IDC_CHECKKEYDOWN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,147,44,66,14 - CONTROL "On Key Hold",IDC_CHECKKEYHOLD,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,147,57,66,10 - CONTROL "On Key Up",IDC_CHECKKEYUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,147,68,66,8 + CONTROL "On Key Down",IDC_CHECKKEYDOWN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,44,66,14 + CONTROL "On Key Hold",IDC_CHECKKEYHOLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,57,66,10 + CONTROL "On Key Up",IDC_CHECKKEYUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,68,66,8 PUSHBUTTON "Restore",IDC_RESTORE,217,46,43,13 PUSHBUTTON "Delete",IDC_DELETE,217,64,43,13 - EDITTEXT IDC_KEYREPORT,141,94,125,70,ES_MULTILINE | - ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL + EDITTEXT IDC_KEYREPORT,141,94,125,70,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL PUSHBUTTON "Y",IDC_NOTESREPEAT,235,176,12,9 PUSHBUTTON "N",IDC_NONOTESREPEAT,251,176,12,9 - EDITTEXT IDC_CHORDDETECTWAITTIME,235,189,28,12,ES_AUTOHSCROLL | - ES_NUMBER,WS_EX_RIGHT + EDITTEXT IDC_CHORDDETECTWAITTIME,235,189,28,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT PUSHBUTTON "it",IDC_EFFECTLETTERSIT,103,184,12,9,NOT WS_VISIBLE PUSHBUTTON "xm",IDC_EFFECTLETTERSXM,119,184,12,9,NOT WS_VISIBLE PUSHBUTTON "Load Keys...",IDC_LOAD,145,221,54,13 PUSHBUTTON "Save Keys As...",IDC_SAVE,205,221,54,13 - CONTROL "Debug Save",IDC_DEBUGSAVE,"Button",BS_AUTOCHECKBOX | - NOT WS_VISIBLE | WS_TABSTOP,59,199,56,10 + CONTROL "Debug Save",IDC_DEBUGSAVE,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,59,199,56,10 EDITTEXT IDC_KEYMAPFILE,145,249,114,13,ES_AUTOHSCROLL LTEXT "Select category:",IDC_STATIC,7,5,74,11 PUSHBUTTON "Set",IDC_SET,225,45,43,13,NOT WS_VISIBLE @@ -411,12 +364,9 @@ GROUPBOX "Misc",IDC_STATIC,139,167,126,40 GROUPBOX "Multi Config Handling",IDC_STATIC,139,209,126,66 LTEXT "Repeat notes on hold?",IDC_STATIC,143,176,74,11 - LTEXT "Effect letters like:",IDC_STATIC,11,185,73,11,NOT - WS_VISIBLE + LTEXT "Effect letters like:",IDC_STATIC,11,185,73,11,NOT WS_VISIBLE LTEXT "Chord detect interval (ms):",IDC_STATIC,143,190,88,11 - CONTROL "Save to this file on OK/Apply?",IDC_AUTOSAVE,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,153,262,106, - 10 + CONTROL "Save to this file on OK/Apply?",IDC_AUTOSAVE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,153,262,106,10 LTEXT "Config to load on startup:",IDC_STATIC,145,239,80,8 LTEXT "Log:",IDC_STATIC,141,84,19,10 PUSHBUTTON "Clear Log",IDC_CLEARLOG,227,85,37,9 @@ -427,20 +377,13 @@ CAPTION "Colors" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,91,74,10 - EDITTEXT IDC_PRIMARYHILITE,101,90,21,12,ES_AUTOHSCROLL | - ES_NUMBER - CONTROL "Secondary highlight",IDC_CHECK4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,20,103,80,10 - EDITTEXT IDC_SECONDARYHILITE,101,102,21,12,ES_AUTOHSCROLL | - ES_NUMBER - CONTROL "Enable effect highlighting",IDC_CHECK2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10 - CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,45,102,10 + COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,91,74,10 + EDITTEXT IDC_PRIMARYHILITE,101,90,21,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,103,80,10 + EDITTEXT IDC_SECONDARYHILITE,101,102,21,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10 + CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10 PUSHBUTTON "MPT",IDC_BUTTON5,159,26,22,12 PUSHBUTTON "FT2",IDC_BUTTON6,185,26,22,12 PUSHBUTTON "IT",IDC_BUTTON7,210,25,22,12 @@ -456,8 +399,7 @@ LTEXT "rows",IDC_STATIC,125,92,16,8 LTEXT "Presets:",IDC_STATIC,159,15,28,8 LTEXT "rows",IDC_STATIC,125,104,16,8 - CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130, - 114,43 + CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43 CONTROL "Set highlights to songs' time signatures",IDC_CHECK5, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10 END @@ -469,73 +411,50 @@ BEGIN GROUPBOX "MIDI Recording",IDC_STATIC,5,5,260,200 LTEXT "MIDI Input Device:",IDC_STATIC,15,20,67,8 - COMBOBOX IDC_COMBO1,15,30,120,74,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI Output Device:",IDC_STATIC,140,20,65,8,NOT - WS_VISIBLE - COMBOBOX IDC_COMBO2,140,30,120,73,CBS_DROPDOWNLIST | NOT - WS_VISIBLE | WS_VSCROLL | WS_TABSTOP - CONTROL "Apply Octave Transpose on external MIDI keyboard", - IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,55, - 185,9 - CONTROL "Amplify MIDI velocity",IDC_CHECK3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,90,100,9 - CONTROL "Record note velocity",IDC_CHECK1,"Button", - BS_AUTOCHECKBOX | BS_TOP | WS_TABSTOP,15,75,100,9 - CONTROL "Record Note Off (Instruments Only)",IDC_CHECK2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,120,130,9 + COMBOBOX IDC_COMBO1,15,30,120,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "MIDI Output Device:",IDC_STATIC,140,20,65,8,NOT WS_VISIBLE + COMBOBOX IDC_COMBO2,140,30,120,73,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + CONTROL "Apply Octave Transpose on external MIDI keyboard",IDC_CHECK4, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,55,185,9 + CONTROL "Record note velocity",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_TOP | WS_TABSTOP,15,75,100,9 + CONTROL "Amplify MIDI velocity",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,90,100,9 + CONTROL "Combine MIDI volume to note velocity",IDC_MIDIVOL_TO_NOTEVOL, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,105,139,9 + CONTROL "Record Note Off (Instruments Only)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,120,130,9 + CONTROL "Record MIDI controller changes as MIDI macro changes (in pattern)",IDC_MIDI_MACRO_CONTROL, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,140,226,9 + CONTROL "Pass MIDI to active instrument plugin (experimental)",IDC_MIDI_TO_PLUGIN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,155,180,9 + CONTROL "Respond to play/continue/stop song messages (untested)",IDC_MIDIPLAYCONTROL, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,170,200,9 + CONTROL "Continue song as soon as MIDI notes are being received",IDC_MIDIPLAYPATTERNONMIDIIN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,185,195,10 GROUPBOX "MIDI file import",IDC_STATIC,5,210,260,45 LTEXT "Speed:",IDC_STATIC,15,230,24,8 EDITTEXT IDC_EDIT1,45,230,39,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,79,235, - 11,14 + CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,79,235,11,14 LTEXT "Pattern size:",IDC_STATIC,115,230,40,8 EDITTEXT IDC_EDIT2,165,230,39,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,196,232, - 11,14 - CONTROL "Pass MIDI to active instrument plugin (experimental)", - IDC_MIDI_TO_PLUGIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 15,155,180,9 - CONTROL "Combine MIDI volume to note velocity", - IDC_MIDIVOL_TO_NOTEVOL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,105,139,9 - CONTROL "Respond to play/continue/stop song messages (untested)", - IDC_MIDIPLAYCONTROL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,170,200,9 - CONTROL "Record MIDI controller changes as MIDI macro changes (in pattern)", - IDC_MIDI_MACRO_CONTROL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,140,226,9 - CONTROL "Continue song as soon as MIDI notes are being received", - IDC_MIDIPLAYPATTERNONMIDIIN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,15,185,195,10 + CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,196,232,11,14 END -IDD_LOADRAWSAMPLE DIALOG 0, 0, 168, 84 +IDD_LOADRAWSAMPLE DIALOGEX 0, 0, 178, 89 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Unknown file type" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,59,65,50,14 - PUSHBUTTON "Cancel",IDCANCEL,114,65,50,14 - GROUPBOX "",IDC_STATIC,4,26,48,34,WS_GROUP - LTEXT "Load it as a raw sample\nof the following format:", - IDC_STATIC,10,10,81,17 - CONTROL "8-bit",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,10,34,29, - 10 - CONTROL "16-bit",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,10,46,33, - 10 - GROUPBOX "",IDC_STATIC,55,26,54,34,WS_GROUP - CONTROL "Unsigned",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,59,34, - 46,10 - CONTROL "Signed",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,59,46,38, - 10 - GROUPBOX "",IDC_STATIC,113,26,51,34,WS_GROUP - CONTROL "Mono",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,119,34,34, - 10 - CONTROL "Stereo",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON,119,46, - 37,10 + DEFPUSHBUTTON "OK",IDOK,66,66,50,14 + PUSHBUTTON "Cancel",IDCANCEL,120,66,50,14 + GROUPBOX "",IDC_STATIC,6,24,48,34,WS_GROUP + LTEXT "Load it as a raw sample of the following format:",IDC_STATIC,6,6,156,12 + CONTROL "8-bit",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,12,32,29,10 + CONTROL "16-bit",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,12,44,33,10 + GROUPBOX "",IDC_STATIC,60,24,54,34,WS_GROUP + CONTROL "Unsigned",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,64,32,46,10 + CONTROL "Signed",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,64,44,38,10 + GROUPBOX "",IDC_STATIC,120,24,51,34,WS_GROUP + CONTROL "Mono",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,126,32,34,10 + CONTROL "Stereo",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON,126,44,37,10 END IDD_CONTROL_GLOBALS DIALOGEX 0, 0, 561, 94 @@ -543,84 +462,52 @@ FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN EDITTEXT IDC_EDIT_SONGTITLE,2,3,167,12,ES_AUTOHSCROLL - CTEXT "Type EXT, ## channels",IDC_EDIT_MODTYPE,173,3,149,12, - SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "Type EXT, ## channels",IDC_EDIT_MODTYPE,173,3,149,12,SS_CENTERIMAGE,WS_EX_STATICEDGE GROUPBOX "",IDC_STATIC,1,14,83,78 LTEXT "Initial tempo:",IDC_STATIC,4,20,44,8 - CONTROL "",IDC_SLIDER_SONGTEMPO,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_NOTICKS,11,28,15,50 + CONTROL "",IDC_SLIDER_SONGTEMPO,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS,11,28,15,50 EDITTEXT IDC_EDIT_TEMPO,5,78,29,12,ES_NUMBER - CONTROL "",IDC_SPIN_TEMPO,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,27,76, - 11,14 + CONTROL "",IDC_SPIN_TEMPO,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,27,76,11,14 LTEXT "Ticks/row:",IDC_STATIC,44,40,35,8 EDITTEXT IDC_EDIT_SPEED,44,51,30,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN_SPEED,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,67,50, - 11,14 + CONTROL "Spin1",IDC_SPIN_SPEED,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,67,50,11,14 LTEXT "Restart:",IDC_STATIC,44,70,26,8 EDITTEXT IDC_EDIT_RESTARTPOS,44,78,30,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN_RESTARTPOS,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_NOTHOUSANDS,65,77,11,14 + CONTROL "Spin1",IDC_SPIN_RESTARTPOS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,65,77,11,14 GROUPBOX "",IDC_STATIC,83,14,175,78 LTEXT "Initial global vol:",IDC_STATIC,90,20,52,8 - CONTROL "",IDC_SLIDER_GLOBALVOL,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,105,28,15,50 + CONTROL "",IDC_SLIDER_GLOBALVOL,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,105,28,15,50 EDITTEXT IDC_EDIT_GLOBALVOL,95,78,36,12,ES_NUMBER - CONTROL "",IDC_SPIN_GLOBALVOL,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,120,76, - 11,14 + CONTROL "",IDC_SPIN_GLOBALVOL,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,120,76,11,14 LTEXT "VSTi vol:",IDC_STATIC,159,20,33,8 - CONTROL "",IDC_SLIDER_VSTIVOL,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,164,28,15,50 + CONTROL "",IDC_SLIDER_VSTIVOL,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,164,28,15,50 EDITTEXT IDC_EDIT_VSTIVOL,156,78,36,12,ES_NUMBER - CONTROL "",IDC_SPIN_VSTIVOL,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,180,76, - 11,14 + CONTROL "",IDC_SPIN_VSTIVOL,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,180,76,11,14 LTEXT "Sample vol:",IDC_STATIC,212,20,38,8 - CONTROL "Slider1",IDC_SLIDER_SAMPLEPREAMP,"msctls_trackbar32", - TBS_VERT | TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,221,28, - 15,50 + CONTROL "Slider1",IDC_SLIDER_SAMPLEPREAMP,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,221,28,15,50 EDITTEXT IDC_EDIT_SAMPLEPA,212,78,36,12,ES_NUMBER - CONTROL "",IDC_SPIN_SAMPLEPA,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,238,75, - 11,14 - PUSHBUTTON "Song Properties...",IDC_BUTTON_MODTYPE,262,18,60,12,NOT - WS_TABSTOP - CONTROL "Loop Song",IDC_CHECK_LOOPSONG,"Button",BS_AUTOCHECKBOX | - BS_FLAT | WS_TABSTOP,263,48,50,10 - PUSHBUTTON "Player Settings...",IDC_BUTTON_PLAYERPROPS,262,59,60,12, - NOT WS_TABSTOP + CONTROL "",IDC_SPIN_SAMPLEPA,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,238,75,11,14 + PUSHBUTTON "Song Properties...",IDC_BUTTON_MODTYPE,262,18,60,12,NOT WS_TABSTOP + CONTROL "Loop Song",IDC_CHECK_LOOPSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,263,48,50,10 + PUSHBUTTON "Player Settings...",IDC_BUTTON_PLAYERPROPS,262,59,60,12,NOT WS_TABSTOP CTEXT "Not saved with song!",IDC_STATIC,262,73,60,17 - CONTROL "",IDC_VUMETER_LEFT,"Static",SS_BLACKRECT | SS_SUNKEN, - 325,1,15,91 - CONTROL "",IDC_VUMETER_RIGHT,"Static",SS_BLACKRECT | SS_SUNKEN, - 343,1,15,91 - GROUPBOX "Player Settings (not saved in song!)",IDC_STATIC,414,31, - 147,63,NOT WS_VISIBLE - CONTROL "Bass Expansion",IDC_CHECK_BASS,"Button",BS_AUTOCHECKBOX | - BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,43,65,10 - CONTROL "Reverb",IDC_CHECK_REVERB,"Button",BS_AUTOCHECKBOX | - BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,55,46,10 - CONTROL "Surround",IDC_CHECK_SURROUND,"Button",BS_AUTOCHECKBOX | - BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,67,48,10 - COMBOBOX IDC_COMBO_RESAMPLING,490,76,67,74,CBS_DROPDOWNLIST | NOT - WS_VISIBLE | WS_TABSTOP + CONTROL "",IDC_VUMETER_LEFT,"Static",SS_BLACKRECT | SS_SUNKEN,325,1,15,91 + CONTROL "",IDC_VUMETER_RIGHT,"Static",SS_BLACKRECT | SS_SUNKEN,343,1,15,91 + GROUPBOX "Player Settings (not saved in song!)",IDC_STATIC,414,31,147,63,NOT WS_VISIBLE + CONTROL "Bass Expansion",IDC_CHECK_BASS,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,43,65,10 + CONTROL "Reverb",IDC_CHECK_REVERB,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,55,46,10 + CONTROL "Surround",IDC_CHECK_SURROUND,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,67,48,10 + COMBOBOX IDC_COMBO_RESAMPLING,490,76,67,74,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_TABSTOP LTEXT "Resampling:",IDC_STATIC,491,67,43,8,NOT WS_VISIBLE - CONTROL "Graphic EQ",IDC_CHECK_EQ,"Button",BS_AUTOCHECKBOX | - BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,79,58,10 - CONTROL "AGC",IDC_CHECK_AGC,"Button",BS_AUTOCHECKBOX | BS_FLAT | - NOT WS_VISIBLE | WS_TABSTOP,491,43,31,10 + CONTROL "Graphic EQ",IDC_CHECK_EQ,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,79,58,10 + CONTROL "AGC",IDC_CHECK_AGC,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,491,43,31,10 END IDD_CONTROL_COMMENTS DIALOGEX 0, 0, 435, 119 STYLE DS_SETFONT | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - EDITTEXT IDC_EDIT_COMMENTS,4,11,426,104,ES_MULTILINE | - ES_WANTRETURN | NOT WS_BORDER | WS_VSCROLL | NOT - WS_TABSTOP,WS_EX_STATICEDGE + EDITTEXT IDC_EDIT_COMMENTS,4,11,426,104,ES_MULTILINE | ES_WANTRETURN | NOT WS_BORDER | WS_VSCROLL | NOT WS_TABSTOP,WS_EX_STATICEDGE LTEXT "Song Message:",IDC_STATIC,4,2,76,8 END @@ -628,150 +515,92 @@ STYLE DS_SETFONT | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,432,34,55,10 - COMBOBOX IDC_COMBO_INSTRUMENT,22,74,95,137,CBS_DROPDOWNLIST | - WS_VSCROLL - CTEXT "Row spacing",IDC_STATIC,172,32,54,12,SS_CENTERIMAGE, - WS_EX_STATICEDGE - EDITTEXT IDC_EDIT_SPACING,225,32,40,12,ES_AUTOHSCROLL | ES_NUMBER | - NOT WS_TABSTOP - CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_NOTHOUSANDS,256,33,9,11 - PUSHBUTTON "<<",IDC_BUTTON2,2,99,14,15,NOT WS_TABSTOP, - WS_EX_STATICEDGE - PUSHBUTTON ">>",IDC_BUTTON1,14,99,14,15,NOT WS_TABSTOP, - WS_EX_STATICEDGE - CTEXT "Pattern name",IDC_STATIC,9,32,52,12,SS_CENTERIMAGE, - WS_EX_STATICEDGE + CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,432,34,55,10 + COMBOBOX IDC_COMBO_INSTRUMENT,22,74,95,137,CBS_DROPDOWNLIST | WS_VSCROLL + CTEXT "Row spacing",IDC_STATIC,172,32,54,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + EDITTEXT IDC_EDIT_SPACING,225,32,40,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,256,33,9,11 + PUSHBUTTON "<<",IDC_BUTTON2,2,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE + PUSHBUTTON ">>",IDC_BUTTON1,14,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE + CTEXT "Pattern name",IDC_STATIC,9,32,52,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT_PATTERNNAME,60,32,107,12,ES_AUTOHSCROLL - CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | - 0x4d,2,4,372,18 - CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,9,74,9, - 12 - COMBOBOX IDC_COMBO_SPLITINSTRUMENT,209,74,95,125,CBS_DROPDOWNLIST | - WS_VSCROLL - COMBOBOX IDC_COMBO_SPLITNOTE,173,74,32,137,CBS_DROPDOWNLIST | - WS_VSCROLL + CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | 0x4d,2,4,372,18 + CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,9,74,9,12 + COMBOBOX IDC_COMBO_SPLITINSTRUMENT,209,74,95,125,CBS_DROPDOWNLIST | WS_VSCROLL + COMBOBOX IDC_COMBO_SPLITNOTE,173,74,32,137,CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "Note",IDC_STATIC,173,65,35,8 LTEXT "Instrument",IDC_STATIC,209,65,58,8 - CONTROL "Transpose",IDC_PATTERN_OCTAVELINK,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,438,76,49,10 - COMBOBOX IDC_COMBO_OCTAVEMODIFIER,382,74,52,137,CBS_DROPDOWNLIST | - WS_VSCROLL - COMBOBOX IDC_COMBO_SPLITVOLUME,342,74,36,146,CBS_DROPDOWNLIST | - WS_VSCROLL + CONTROL "Transpose",IDC_PATTERN_OCTAVELINK,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,438,76,49,10 + COMBOBOX IDC_COMBO_OCTAVEMODIFIER,382,74,52,137,CBS_DROPDOWNLIST | WS_VSCROLL + COMBOBOX IDC_COMBO_SPLITVOLUME,342,74,36,146,CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "Volume",IDC_STATIC,342,65,25,8 - PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,122,74,33,13,0, - WS_EX_STATICEDGE - PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI2,308,74,30,13,0, - WS_EX_STATICEDGE + PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,122,74,33,13,0,WS_EX_STATICEDGE + PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI2,308,74,30,13,0,WS_EX_STATICEDGE GROUPBOX "Main instrument",IDC_STATIC,2,53,160,40 GROUPBOX "Keyboard Split",IDC_STATIC,167,53,328,40 LTEXT "Octave shift",IDC_STATIC,382,65,52,8 GROUPBOX "",IDC_STATIC,2,22,493,27 - CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,355,34,57,10 - EDITTEXT IDC_EDIT_ORDERLIST_MARGINS,2,113,28,12,ES_AUTOHSCROLL | - ES_READONLY - CONTROL "",IDC_SPIN_ORDERLIST_MARGINS,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_NOTHOUSANDS,15,118,11,11 + CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,355,34,57,10 + EDITTEXT IDC_EDIT_ORDERLIST_MARGINS,2,113,28,12,ES_AUTOHSCROLL | ES_READONLY + CONTROL "",IDC_SPIN_ORDERLIST_MARGINS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,15,118,11,11 END IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 544, 106 STYLE DS_SETFONT | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | - 0x4d,4,4,55,17 + CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | 0x4d,4,4,55,17 EDITTEXT IDC_EDIT_SAMPLE,90,6,35,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin6",IDC_SPIN_SAMPLE,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_NOTHOUSANDS,118,4,11,14 + CONTROL "Spin6",IDC_SPIN_SAMPLE,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,118,4,11,14 COMBOBOX IDC_COMBO_ZOOM,131,6,41,89,CBS_DROPDOWNLIST | WS_VSCROLL EDITTEXT IDC_EDIT7,57,30,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,29, - 11,11 + CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,29,11,11 EDITTEXT IDC_EDIT8,57,43,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,42, - 11,11 - CONTROL "Set Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | - WS_TABSTOP,9,58,42,10 + CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,42,11,11 + CONTROL "Set Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,9,58,42,10 EDITTEXT IDC_EDIT9,57,56,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,56, - 11,11 + CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,56,11,11 EDITTEXT IDC_EDIT5,48,70,45,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_ALIGNRIGHT | - UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,69,11,11 - COMBOBOX IDC_COMBO_BASENOTE,48,83,45,89,CBS_DROPDOWNLIST | - WS_VSCROLL + CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,69,11,11 + COMBOBOX IDC_COMBO_BASENOTE,48,83,45,89,CBS_DROPDOWNLIST | WS_VSCROLL EDITTEXT IDC_SAMPLE_NAME,129,26,135,12,ES_AUTOHSCROLL EDITTEXT IDC_SAMPLE_FILENAME,292,26,72,13,ES_AUTOHSCROLL COMBOBOX IDC_COMBO1,130,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_EDIT1,130,70,45,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT | - UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,69,11,11 + CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,69,11,11 EDITTEXT IDC_EDIT2,130,83,45,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_ALIGNRIGHT | - UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,84,11,11 + CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,84,11,11 COMBOBOX IDC_COMBO2,212,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_EDIT3,212,70,45,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_ALIGNRIGHT | - UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,70,11,11 + CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,70,11,11 EDITTEXT IDC_EDIT4,212,83,45,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_ALIGNRIGHT | - UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,83,11,11 + CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,83,11,11 COMBOBOX IDC_COMBO3,275,59,47,70,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_EDIT15,327,59,32,12,ES_NUMBER - CONTROL "Depth",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,59, - 11,11 + CONTROL "Depth",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,59,11,11 EDITTEXT IDC_EDIT14,275,83,38,12,ES_NUMBER - CONTROL "Sweep",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,305,84, - 11,11 + CONTROL "Sweep",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,305,84,11,11 EDITTEXT IDC_EDIT16,321,83,38,12,ES_NUMBER - CONTROL "Rate",IDC_SPIN13,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,83, - 11,11 - CONTROL "Time stretching",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,446, - 36,68,11 - CONTROL "Preview mode",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,373, - 83,65,11 - PUSHBUTTON "Restore",IDC_BUTTON4,482,82,33,13,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE - COMBOBOX IDC_COMBO4,400,35,39,61,CBS_DROPDOWNLIST | NOT - WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP - COMBOBOX IDC_COMBO5,400,51,39,86,CBS_DROPDOWNLIST | NOT - WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP - COMBOBOX IDC_COMBO6,400,67,39,61,CBS_DROPDOWNLIST | NOT - WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP + CONTROL "Rate",IDC_SPIN13,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,83,11,11 + CONTROL "Time stretching",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,446,36,68,11 + CONTROL "Preview mode",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,373,83,65,11 + PUSHBUTTON "Restore",IDC_BUTTON4,482,82,33,13,NOT WS_VISIBLE,WS_EX_CLIENTEDGE + COMBOBOX IDC_COMBO4,400,35,39,61,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP + COMBOBOX IDC_COMBO5,400,51,39,86,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP + COMBOBOX IDC_COMBO6,400,67,39,61,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP EDITTEXT IDC_EDIT_STRETCHPARAMS,374,51,64,12,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT6,446,51,45,12,ES_RIGHT | ES_AUTOHSCROLL | NOT - WS_VISIBLE,WS_EX_RIGHT - PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE + EDITTEXT IDC_EDIT6,446,51,45,12,ES_RIGHT | ES_AUTOHSCROLL | NOT WS_VISIBLE,WS_EX_RIGHT + PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE,WS_EX_CLIENTEDGE RTEXT "Sample",IDC_STATIC,62,8,24,8 - CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13, - SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | - 0x4d,268,4,186,17 + CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | 0x4d,268,4,186,17 GROUPBOX "",IDC_STATIC,3,22,94,78 LTEXT "Default Volume",IDC_STATIC,8,32,49,8 LTEXT "Global Volume",IDC_STATIC,8,45,46,8 LTEXT "FineTune",IDC_TEXT7,8,73,37,8 LTEXT "Transpose",IDC_TEXT6,8,86,38,8 - CTEXT "Name",IDC_STATIC,102,26,28,12,SS_CENTERIMAGE | NOT - WS_GROUP,WS_EX_STATICEDGE - CTEXT "File",IDC_STATIC,269,26,23,13,SS_CENTERIMAGE | NOT - WS_GROUP | WS_TABSTOP,WS_EX_STATICEDGE + CTEXT "Name",IDC_STATIC,102,26,28,12,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_STATICEDGE + CTEXT "File",IDC_STATIC,269,26,23,13,SS_CENTERIMAGE | NOT WS_GROUP | WS_TABSTOP,WS_EX_STATICEDGE GROUPBOX "Loop",IDC_STATIC,102,43,79,57 LTEXT "Type",IDC_STATIC,107,57,17,8 LTEXT "Start",IDC_STATIC,107,73,16,8 @@ -785,16 +614,13 @@ LTEXT "Sweep",IDC_STATIC,275,74,23,8 LTEXT "Depth",IDC_STATIC,327,50,20,8 LTEXT "Rate",IDC_STATIC,321,74,16,8 - GROUPBOX "Pitch shifting / Time stretching", - IDC_GROUPBOX_PITCH_TIME,370,22,150,78,NOT WS_VISIBLE - PUSHBUTTON "Process",IDC_BUTTON1,448,80,67,16,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE + GROUPBOX "Pitch shifting / Time stretching",IDC_GROUPBOX_PITCH_TIME,370,22,150,78,NOT WS_VISIBLE + PUSHBUTTON "Process",IDC_BUTTON1,448,80,67,16,NOT WS_VISIBLE,WS_EX_CLIENTEDGE LTEXT "Pitch",IDC_TEXT_PITCH,373,36,23,10,NOT WS_VISIBLE LTEXT "Quality",IDC_TEXT_QUALITY,374,54,23,10,NOT WS_VISIBLE LTEXT "FFT",IDC_TEXT_FFT,374,68,23,10,NOT WS_VISIBLE CTEXT "Static",IDC_TEXT_PREVIEW,448,69,67,10,NOT WS_VISIBLE - PUSHBUTTON "Keep",IDC_BUTTON3,448,82,32,13,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE + PUSHBUTTON "Keep",IDC_BUTTON3,448,82,32,13,NOT WS_VISIBLE,WS_EX_CLIENTEDGE LTEXT "%",IDC_TEXT_PERCENT,494,53,8,10,NOT WS_VISIBLE LTEXT "Parameters",IDC_TEXT_STRETCHPARAMS,385,38,39,8 END @@ -803,219 +629,142 @@ STYLE DS_SETFONT | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - EDITTEXT IDC_EDIT_INSTRUMENT,87,7,29,12,ES_AUTOHSCROLL | - ES_NUMBER - CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_NOTHOUSANDS | WS_TABSTOP,111,8,11,11 + EDITTEXT IDC_EDIT_INSTRUMENT,87,7,29,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS | WS_TABSTOP,111,8,11,11 EDITTEXT IDC_SAMPLE_NAME,131,6,151,12,ES_AUTOHSCROLL EDITTEXT IDC_SAMPLE_FILENAME,324,6,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT8,87,36,34,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,40, - 8,10 + CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,40,8,10 EDITTEXT IDC_EDIT7,87,53,34,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,57, - 8,10 - CONTROL "Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | - WS_TABSTOP,55,71,29,10 + CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,57,8,10 + CONTROL "Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,55,71,29,10 EDITTEXT IDC_EDIT9,87,70,34,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74, - 8,11 + CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11 EDITTEXT IDC_EDIT15,33,99,27,13,ES_NUMBER - CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103, - 7,11 - COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS,47,135,36,10 + CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103,7,11 + COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS,47,135,36,10 EDITTEXT IDC_EDIT2,85,133,36,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | - UDS_NOTHOUSANDS,116,133,8,12 + CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,116,133,8,12 COMBOBOX IDC_COMBO9,50,151,71,81,CBS_DROPDOWNLIST | WS_TABSTOP - CONTROL "Reso",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_FLAT | - WS_TABSTOP,136,37,33,10 - CONTROL "Slider2",IDC_SLIDER4,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,168,37,64,10 - CONTROL "Cutoff",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_FLAT | - WS_TABSTOP,136,52,35,10 - CONTROL "Slider2",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,168,53,64,10 - COMBOBOX IDC_FILTERMODE,163,70,69,42,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,172,101,60,10 - CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,172,118,60,10 - CONTROL "",IDC_SLIDER6,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,172,135,60,10 - CONTROL "",IDC_SLIDER7,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,172,152,60,10 + CONTROL "Reso",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,136,37,33,10 + CONTROL "Slider2",IDC_SLIDER4,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,168,37,64,10 + CONTROL "Cutoff",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,136,52,35,10 + CONTROL "Slider2",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,168,53,64,10 + COMBOBOX IDC_FILTERMODE,163,70,69,42,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,172,101,60,10 + CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,172,118,60,10 + CONTROL "",IDC_SLIDER6,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,172,135,60,10 + CONTROL "",IDC_SLIDER7,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,172,152,60,10 COMBOBOX IDC_COMBO1,308,36,50,54,CBS_DROPDOWNLIST | WS_TABSTOP COMBOBOX IDC_COMBO2,308,53,50,69,CBS_DROPDOWNLIST | WS_TABSTOP COMBOBOX IDC_COMBO3,308,70,50,54,CBS_DROPDOWNLIST | WS_TABSTOP - COMBOBOX IDC_COMBO6,246,99,72,... [truncated message content] |
From: <sag...@us...> - 2009-07-25 13:27:42
|
Revision: 302 http://modplug.svn.sourceforge.net/modplug/?rev=302&view=rev Author: saga-games Date: 2009-07-25 13:27:30 +0000 (Sat, 25 Jul 2009) Log Message: ----------- [Imp] Mixing: It's now possible to go down to 1ms latency (works with ASIO) [Fix] Pattern editor: Reverted the "loop pattern" fix from one of the latest revisions until a solution is found that doesn't break anything [Fix] Pattern editor: Unbroke "remove channels" dialog when being called from the channel context menu [Imp] General tab: Further improvements to the "mod type" dialog (some options are removed when using MOD/S3M formats)... Still too big, though. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/SNDDEV.H trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2009-07-23 21:51:50 UTC (rev 301) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2009-07-25 13:27:30 UTC (rev 302) @@ -138,6 +138,8 @@ m_CbnBufferLength.SetWindowText(s); // -> CODE#0006 // -> DESC="misc quantity changes" + m_CbnBufferLength.AddString("1 ms"); + m_CbnBufferLength.AddString("5 ms"); m_CbnBufferLength.AddString("10 ms"); m_CbnBufferLength.AddString("20 ms"); // -! BEHAVIOUR_CHANGE#0006 Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-23 21:51:50 UTC (rev 301) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 13:27:30 UTC (rev 302) @@ -116,8 +116,8 @@ //{{AFX_DATA_MAP(CModTypeDlg) DDX_Control(pDX, IDC_COMBO1, m_TypeBox); DDX_Control(pDX, IDC_COMBO2, m_ChannelsBox); - DDX_Control(pDX, IDC_COMBO3, m_TempoModeBox); - DDX_Control(pDX, IDC_COMBO4, m_PlugMixBox); + 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); @@ -196,11 +196,11 @@ default: m_PlugMixBox.SetCurSel(0); break; } - SetDlgItemText(IDC_STATIC_CREATEDWITH, "Created with:"); - SetDlgItemText(IDC_STATIC_SAVEDWITH, "Last saved with:"); + SetDlgItemText(IDC_TEXT_CREATEDWITH, "Created with:"); + SetDlgItemText(IDC_TEXT_SAVEDWITH, "Last saved with:"); - SetDlgItemText(IDC_EDIT1, MptVersion::ToStr(m_pSndFile->m_dwCreatedWithVersion)); - SetDlgItemText(IDC_EDIT2, MptVersion::ToStr(m_pSndFile->m_dwLastSavedWithVersion)); + SetDlgItemText(IDC_EDIT_CREATEDWITH, MptVersion::ToStr(m_pSndFile->m_dwCreatedWithVersion)); + SetDlgItemText(IDC_EDIT_SAVEDWITH, MptVersion::ToStr(m_pSndFile->m_dwLastSavedWithVersion)); m_EditFlag.SetLimitText(16); @@ -270,6 +270,7 @@ const bool ITorMPT = ((m_TypeBox.GetItemData(m_TypeBox.GetCurSel()) & (MOD_TYPE_IT | MOD_TYPE_MPT)) != 0); const bool XM = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()) == MOD_TYPE_XM; + // Misc Flags box CWnd* p = GetDlgItem(IDC_EDIT_FLAGS); if(p) p->ShowWindow(XMorITorMPT); p = GetDlgItem(IDC_FLAG_EXPLANATIONS); @@ -284,8 +285,9 @@ "2. Unused\n" "3. Plugin volume command bug"); } - p = GetDlgItem(IDC_FLAGEDITTITLE); - if(p) p->ShowWindow(XMorITorMPT); + + GetDlgItem(IDC_FLAGEDITTITLE)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_FRAME_MPTEXT)->ShowWindow(XMorITorMPT); if(XMorITorMPT) { char str[17] = "0000000000000000"; @@ -299,11 +301,37 @@ SetDlgItemText(IDC_EDIT_FLAGS, str); } - m_TempoModeBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); - GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); - GetDlgItem(IDC_ROWSPERMEASURE)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); + // Mixmode Box + GetDlgItem(IDC_TEXT_MIXMODE)->ShowWindow(XMorITorMPT); + m_PlugMixBox.ShowWindow(XMorITorMPT); + + // Tempo mode box + m_TempoModeBox.ShowWindow(XMorITorMPT); + GetDlgItem(IDC_ROWSPERBEAT)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_ROWSPERMEASURE)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_TEXT_ROWSPERBEAT)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_TEXT_ROWSPERMEASURE)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_TEXT_TEMPOMODE)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_FRAME_TEMPOMODE)->ShowWindow(XMorITorMPT); - m_PlugMixBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); + // Version info + GetDlgItem(IDC_FRAME_MPTVERSION)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_TEXT_CREATEDWITH)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_TEXT_SAVEDWITH)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_EDIT_CREATEDWITH)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_EDIT_SAVEDWITH)->ShowWindow(XMorITorMPT); + + // Window height - some parts of the dialog won't be visible for all formats + RECT rWindow; + GetWindowRect(&rWindow); + + UINT iHeight; + int nItemID = (XMorITorMPT) ? IDC_FRAME_MPTVERSION : IDC_FRAME_MODFLAGS; + RECT rFrame; + GetDlgItem(nItemID)->GetWindowRect(&rFrame); + iHeight = rFrame.bottom - rWindow.top + 12; + MoveWindow(rWindow.left, rWindow.top, rWindow.right - rWindow.left, iHeight); + } @@ -530,7 +558,7 @@ BOOL CRemoveChannelsDlg::OnInitDialog() //------------------------------------- { - CHAR label[20 + MAX_CHANNELNAME]; + CHAR label[max(100, 20 + MAX_CHANNELNAME)]; CDialog::OnInitDialog(); for (UINT n = 0; n < m_nChannels; n++) { Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-23 21:51:50 UTC (rev 301) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 13:27:30 UTC (rev 302) @@ -378,10 +378,10 @@ FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,91,74,10 - EDITTEXT IDC_PRIMARYHILITE,101,90,21,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,103,80,10 - EDITTEXT IDC_SECONDARYHILITE,101,102,21,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,91,74,10 + EDITTEXT IDC_PRIMARYHILITE,114,90,21,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,109,80,10 + EDITTEXT IDC_SECONDARYHILITE,114,108,21,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10 CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10 PUSHBUTTON "MPT",IDC_BUTTON5,159,26,22,12 @@ -396,9 +396,9 @@ LTEXT "Highlight:",IDC_TEXT3,169,185,61,8 GROUPBOX "",IDC_STATIC,5,5,260,220 LTEXT "Select color for:",IDC_STATIC,15,15,63,8 - LTEXT "rows",IDC_STATIC,125,92,16,8 + LTEXT "rows",IDC_STATIC,138,92,16,8 LTEXT "Presets:",IDC_STATIC,159,15,28,8 - LTEXT "rows",IDC_STATIC,125,104,16,8 + LTEXT "rows",IDC_STATIC,138,110,16,8 CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43 CONTROL "Set highlights to songs' time signatures",IDC_CHECK5, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10 @@ -715,34 +715,34 @@ BEGIN DEFPUSHBUTTON "OK",IDOK,204,6,50,14 PUSHBUTTON "Cancel",IDCANCEL,204,24,50,14 - GROUPBOX "Type",IDC_STATIC,6,6,192,48 + GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48 COMBOBOX IDC_COMBO1,12,18,108,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,126,18,66,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,126,8 - GROUPBOX "Playback",IDC_STATIC,6,60,246,54 + GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,72,91,10 CONTROL "Fast Volume Slides",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,84,75,10 CONTROL "Extended filter range",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,96,81,10 CONTROL "IT Old Effects",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,72,76,10 CONTROL "IT Compatible Gxx",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,84,76,10 - GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_STATIC,6,120,246,84 - RTEXT "Mix Levels:",IDC_STATIC,18,134,81,8 - COMBOBOX IDC_COMBO4,108,132,84,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 + RTEXT "Mix Levels:",IDC_TEXT_MIXMODE,18,134,81,8 + COMBOBOX IDC_COMBO_MIXLEVELS,108,132,84,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "Miscellaneous flags(0/1):",IDC_FLAGEDITTITLE,18,150,81,12,SS_CENTERIMAGE EDITTEXT IDC_EDIT_FLAGS,108,150,84,12,ES_AUTOHSCROLL LTEXT "",IDC_FLAG_EXPLANATIONS,18,168,222,26 - GROUPBOX "OpenMPT Version Info",IDC_STATIC,6,263,246,48 - EDITTEXT IDC_EDIT1,78,276,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - EDITTEXT IDC_EDIT2,78,294,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - RTEXT "IDC_STATIC_CREATEDWITH",IDC_STATIC_CREATEDWITH,18,278,54,8 - RTEXT "IDC_STATIC_SAVEDWITH",IDC_STATIC_SAVEDWITH,18,295,54,8 - GROUPBOX "Tempo",IDC_STATIC,6,210,246,48 - LTEXT "Mode:",IDC_STATIC,12,224,21,8 - COMBOBOX IDC_COMBO3,36,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48 + EDITTEXT IDC_EDIT_CREATEDWITH,78,276,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE + EDITTEXT IDC_EDIT_SAVEDWITH,78,294,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE + RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,278,54,8 + RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,295,54,8 + GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,210,246,48 + LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,224,21,8 + COMBOBOX IDC_COMBO_TEMPOMODE,36,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_ROWSPERBEAT,156,222,24,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows/beat",IDC_STATIC,186,224,36,8 + LTEXT "Rows/beat",IDC_TEXT_ROWSPERBEAT,186,224,36,8 EDITTEXT IDC_ROWSPERMEASURE,156,240,24,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows/measure",IDC_STATIC,186,242,49,8 + LTEXT "Rows/measure",IDC_TEXT_ROWSPERMEASURE,186,242,49,8 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 @@ -763,8 +763,8 @@ DEFPUSHBUTTON "OK",IDOK,54,198,50,14 PUSHBUTTON "Cancel",IDCANCEL,114,198,50,14 LISTBOX IDC_REMCHANSLIST,6,36,156,156,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP - LTEXT "Channels:",IDC_QUESTION1,6,6,157,11 - LTEXT "Detected unused channels are already selected",IDC_STATIC,6,18,159,10 + LTEXT "Channels:",IDC_QUESTION1,6,6,157,18 + LTEXT "Detected unused channels are already selected",IDC_STATIC,6,24,159,10 END IDD_VIEW_GLOBALS DIALOGEX 0, 0, 471, 337 Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-23 21:51:50 UTC (rev 301) +++ trunk/OpenMPT/mptrack/resource.h 2009-07-25 13:27:30 UTC (rev 302) @@ -850,10 +850,25 @@ #define IDC_STATIC_VSTPRESETDIR 2359 #define IDC_BUTTON_DEFAULT_RESAMPLING 2360 #define IDC_STATIC_CREATEDWITH 2361 +#define IDC_TEXT_CREATEDWITH 2361 #define IDC_STATIC_SAVEDWITH 2362 #define IDC_STATIC_VSTNAMEFILTER 2362 +#define IDC_TEXT_SAVEDWITH 2362 #define IDC_TEXT_CURRENT_VSTPLUG 2363 #define IDC_STATIC_SCALE_ENV 2364 +#define IDC_FRAME_MPTEXT 2365 +#define IDC_COMBO_MIXLEVELS 2366 +#define IDC_COMBO_TEMPOMODE 2367 +#define IDC_TEXT_TEMPOMODE 2368 +#define IDC_FRAME_TEMPOMODE 2369 +#define IDC_TEXT_MIXMODE 2370 +#define IDC_TEXT_ROWSPERBEAT 2371 +#define IDC_TEXT_ROWSPERMEASURE 2372 +#define IDC_FRAME_MPTVERSION 2373 +#define IDC_EDIT_CREATEDWITH 2374 +#define IDC_EDIT_SAVEDWITH 2375 +#define IDC_FRAME_MODFLAGS 2376 +#define IDC_FRAME_MODTYPE 2377 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1093,7 +1108,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 518 #define _APS_NEXT_COMMAND_VALUE 59227 -#define _APS_NEXT_CONTROL_VALUE 2365 +#define _APS_NEXT_CONTROL_VALUE 2378 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/SNDDEV.H =================================================================== --- trunk/OpenMPT/soundlib/SNDDEV.H 2009-07-23 21:51:50 UTC (rev 301) +++ trunk/OpenMPT/soundlib/SNDDEV.H 2009-07-25 13:27:30 UTC (rev 302) @@ -31,7 +31,7 @@ #define SNDDEV_MINBUFFERS 2 #define SNDDEV_MAXBUFFERS 16 -#define SNDDEV_MINBUFFERLEN 10 // 10ms +#define SNDDEV_MINBUFFERLEN 1 // 1ms #define SNDDEV_MAXBUFFERLEN 1000 // 1sec #define SNDDEV_OPTIONS_SECONDARY 0x01 // Use secondary buffers (if available) Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-23 21:51:50 UTC (rev 301) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-25 13:27:30 UTC (rev 302) @@ -1761,14 +1761,12 @@ // Position Jump case CMD_POSITIONJUMP: nPosJump = param; - /* commented this out (http://lpchip.com/modplug/viewtopic.php?t=1808) - I hope it doesn't break anything else. if((m_dwSongFlags & SONG_PATTERNLOOP && m_nSeqOverride == 0)) { m_nSeqOverride = param+1; //Releasing pattern loop after position jump could cause //instant jumps - modifying behavior so that now position jumps //occurs also when pattern loop is enabled. } - */ // see http://lpchip.com/modplug/viewtopic.php?t=2769 - FastTracker resets Dxx if Bxx is called _after_ Dxx if(GetType() == MOD_TYPE_XM) nBreakRow = 0; break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-25 15:39:29
|
Revision: 303 http://modplug.svn.sourceforge.net/modplug/?rev=303&view=rev Author: saga-games Date: 2009-07-25 15:39:19 +0000 (Sat, 25 Jul 2009) Log Message: ----------- [Imp] General tab: "Modtype" dialog will revert mod flags to previous values if user presses the Cancel button [Imp] Sample tab: It is now possible to resize samples to a given sample size. You can do this using the already existing "add silence" dialog. [Fix] S3M loader: Samples with very short loops (2 bytes) will now load correctly. This fixes for example 94hitmix.s3m and spectral.s3m. After using this patch for a long time, it seems to not break anything else. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-25 15:39:19 UTC (rev 303) @@ -2415,14 +2415,14 @@ void CViewSample::OnAddSilence() //------------------------------ { - CAddSilenceDlg dlg(this); - if (dlg.DoModal() != IDOK) return; - CModDoc *pModDoc = GetDocument(); if (!pModDoc) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return; + CAddSilenceDlg dlg(this, 32, pSndFile->Ins[m_nSample].nLength); + if (dlg.DoModal() != IDOK) return; + const ctrlSmp::SmpLength nOldLength = pSndFile->Ins[m_nSample].nLength; if( MAX_SAMPLE_LENGTH - nOldLength < dlg.m_nSamples ) @@ -2432,7 +2432,16 @@ return; } - ctrlSmp::InsertSilence(pSndFile->Ins[m_nSample], dlg.m_nSamples, (dlg.m_bAddAtEnd) ? pSndFile->Ins[m_nSample].nLength : 0, pSndFile); + if(dlg.m_nEditOption == 3) + { + // resize + ctrlSmp::ResizeSample(pSndFile->Ins[m_nSample], dlg.m_nSamples, pSndFile); + } + else + { + // add silence + ctrlSmp::InsertSilence(pSndFile->Ins[m_nSample], dlg.m_nSamples, (dlg.m_nEditOption == 2) ? pSndFile->Ins[m_nSample].nLength : 0, pSndFile); + } if(nOldLength != pSndFile->Ins[m_nSample].nLength) { Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 15:39:19 UTC (rev 303) @@ -138,6 +138,7 @@ CDialog::OnInitDialog(); m_nType = m_pSndFile->m_nType; m_nChannels = m_pSndFile->m_nChannels; + m_dwSongFlags = m_pSndFile->m_dwSongFlags; SetDlgItemInt(IDC_ROWSPERBEAT, m_pSndFile->m_nRowsPerBeat); SetDlgItemInt(IDC_ROWSPERMEASURE, m_pSndFile->m_nRowsPerMeasure); @@ -489,7 +490,15 @@ CDialog::OnOK(); } +void CModTypeDlg::OnCancel() +//-------------------------- +{ + // Reset mod flags + m_pSndFile->m_dwSongFlags = m_dwSongFlags; + CDialog::OnCancel(); +} + ////////////////////////////////////////////////////////////////////////////// // CShowLogDlg @@ -1568,19 +1577,45 @@ // Add silence to a sample +BEGIN_MESSAGE_MAP(CAddSilenceDlg, CDialog) + ON_COMMAND(IDC_RADIO_ADDSILENCE_BEGIN, OnEditModeChanged) + ON_COMMAND(IDC_RADIO_ADDSILENCE_END, OnEditModeChanged) + ON_COMMAND(IDC_RADIO_RESIZETO, OnEditModeChanged) +END_MESSAGE_MAP() + + BOOL CAddSilenceDlg::OnInitDialog() //--------------------------------- { CDialog::OnInitDialog(); - CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1); + + CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_ADDSILENCE); if (spin) { spin->SetRange(0, int16_max); spin->SetPos(m_nSamples); } - CButton *radio2 = (CButton *)GetDlgItem(IDC_RADIO2); - radio2->SetCheck(m_bAddAtEnd); - SetDlgItemInt(IDC_EDIT1, m_nSamples); + + int iRadioButton; + switch(m_nEditOption) + { + case 1: + iRadioButton = IDC_RADIO_ADDSILENCE_BEGIN; + break; + case 2: + default: + iRadioButton = IDC_RADIO_ADDSILENCE_END; + break; + case 3: + iRadioButton = IDC_RADIO_RESIZETO; + break; + + } + CButton *radioEnd = (CButton *)GetDlgItem(iRadioButton); + radioEnd->SetCheck(true); + + SetDlgItemInt(IDC_EDIT_ADDSILENCE, (m_nEditOption == 3) ? m_nLength : m_nSamples); + return TRUE; } @@ -1588,12 +1623,39 @@ void CAddSilenceDlg::OnOK() //------------------------- { - m_nSamples = GetDlgItemInt(IDC_EDIT1); - m_bAddAtEnd = (IsDlgButtonChecked(IDC_RADIO2) != 0); + m_nSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE); + m_nEditOption = GetEditMode(); CDialog::OnOK(); } +void CAddSilenceDlg::OnEditModeChanged() +//------------------------------------------------ +{ + char cNewEditOption = GetEditMode(); + if(cNewEditOption != 3 && m_nEditOption == 3) + { + m_nLength = GetDlgItemInt(IDC_EDIT_ADDSILENCE); + SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_nSamples); + } + else if(cNewEditOption == 3 && m_nEditOption != 3) + { + m_nSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE); + SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_nLength); + } + m_nEditOption = cNewEditOption; +} + + +char CAddSilenceDlg::GetEditMode() +{ + if(IsDlgButtonChecked(IDC_RADIO_ADDSILENCE_BEGIN)) return 1; + else if(IsDlgButtonChecked(IDC_RADIO_ADDSILENCE_END)) return 2; + else if(IsDlgButtonChecked(IDC_RADIO_RESIZETO)) return 3; + return 0; +} + + //////////////////////////////////////////////////////////////////////////////// // Sound Bank Information Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-25 15:39:19 UTC (rev 303) @@ -15,6 +15,7 @@ CEdit m_EditFlag; CSoundFile *m_pSndFile; UINT m_nChannels, m_nType; + DWORD m_dwSongFlags; // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -36,6 +37,7 @@ virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); virtual void OnOK(); + virtual void OnCancel(); //}}AFX_VIRTUAL //{{AFX_MSG(CModTypeDlg) @@ -346,12 +348,18 @@ class CAddSilenceDlg: public CDialog //=========================== { +protected: + char GetEditMode(); + afx_msg void OnEditModeChanged(); + DECLARE_MESSAGE_MAP() + public: UINT m_nSamples; - bool m_bAddAtEnd; + UINT m_nLength; + char m_nEditOption; //0 = add at beginning, 1 = add at end, 2 = resize public: - CAddSilenceDlg(CWnd *parent, UINT nSamples=32):CDialog(IDD_ADDSILENCE, parent) { m_nSamples = nSamples; m_bAddAtEnd = true; } + CAddSilenceDlg(CWnd *parent, UINT nSamples = 32, UINT nOrigLength = 1024):CDialog(IDD_ADDSILENCE, parent) { m_nSamples = nSamples; m_nLength = nOrigLength; m_nEditOption = 2; } virtual BOOL OnInitDialog(); virtual void OnOK(); }; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 15:39:19 UTC (rev 303) @@ -1482,19 +1482,21 @@ LTEXT "around current",IDC_STATIC,156,84,49,8 END -IDD_ADDSILENCE DIALOGEX 0, 0, 175, 71 +IDD_ADDSILENCE DIALOGEX 0, 0, 184, 82 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Insert Silence" +CAPTION "Add Silence / Resize" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - GROUPBOX "",IDC_STATIC,6,6,108,60 - DEFPUSHBUTTON "OK",IDOK,120,12,50,14 - PUSHBUTTON "Cancel",IDCANCEL,120,30,50,14 - EDITTEXT IDC_EDIT1,12,18,40,14,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,44,18,11,14 - LTEXT "samples",IDC_STATIC,59,21,35,8 - CONTROL "At beginning of sample",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,36,97,10 - CONTROL "At end of sample",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,48,97,10 + GROUPBOX "",IDC_STATIC,6,6,114,72 + DEFPUSHBUTTON "OK",IDOK,126,12,50,14 + PUSHBUTTON "Cancel",IDCANCEL,126,30,50,14 + EDITTEXT IDC_EDIT_ADDSILENCE,12,18,60,14,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN_ADDSILENCE,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,60,18,11,14 + LTEXT "samples",IDC_STATIC,78,21,35,8 + CONTROL "Add a beginning of sample",IDC_RADIO_ADDSILENCE_BEGIN, + "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,36,102,12 + CONTROL "Add at end of sample",IDC_RADIO_ADDSILENCE_END,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,48,102,12 + CONTROL "Resize to",IDC_RADIO_RESIZETO,"Button",BS_AUTORADIOBUTTON,12,60,102,12 END IDD_PATTERNRANDOMIZER_EFFECT DIALOGEX 0, 0, 235, 172 @@ -1790,9 +1792,9 @@ IDD_ADDSILENCE, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 168 + RIGHTMARGIN, 177 TOPMARGIN, 7 - BOTTOMMARGIN, 64 + BOTTOMMARGIN, 75 END IDD_PATTERNRANDOMIZER_EFFECT, DIALOG Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/mptrack/resource.h 2009-07-25 15:39:19 UTC (rev 303) @@ -869,6 +869,12 @@ #define IDC_EDIT_SAVEDWITH 2375 #define IDC_FRAME_MODFLAGS 2376 #define IDC_FRAME_MODTYPE 2377 +#define IDC_EDIT_ADDSILENCE 2378 +#define IDC_EDIT_RESIZESAMPLE 2379 +#define IDC_RADIO_ADDSILENCE_BEGIN 2380 +#define IDC_RADIO_ADDSILENCE_END 2381 +#define IDC_SPIN_ADDSILENCE 2382 +#define IDC_RADIO_RESIZETO 2384 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1108,7 +1114,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 518 #define _APS_NEXT_COMMAND_VALUE 59227 -#define _APS_NEXT_CONTROL_VALUE 2378 +#define _APS_NEXT_CONTROL_VALUE 2385 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-25 15:39:19 UTC (rev 303) @@ -370,9 +370,8 @@ if ((Ins[iSmp].nLoopStart >= Ins[iSmp].nLoopEnd) || (Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart < 1)) Ins[iSmp].nLoopStart = Ins[iSmp].nLoopEnd = 0; UINT iLooplength = Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart; - if(iLooplength > 0 && iLooplength < 8) Ins[iSmp].nLoopEnd = Ins[iSmp].nLoopStart + 8; Ins[iSmp].nPan = 0x80; - // ASSERT(iLooplength == 0 || iLooplength > 10); + //ASSERT(iLooplength == 0 || iLooplength > 4); } } // Reading patterns Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-25 15:39:19 UTC (rev 303) @@ -650,7 +650,7 @@ if (pins->pSample) { if (pins->nLoopEnd > pins->nLength) pins->nLoopEnd = pins->nLength; - if (pins->nLoopStart + 3 >= pins->nLoopEnd) + if (pins->nLoopStart >= pins->nLoopEnd) { pins->nLoopStart = 0; pins->nLoopEnd = 0; @@ -2447,7 +2447,7 @@ { if ((!pIns->pSample) || (!pIns->nLength)) return; if (pIns->nLoopEnd > pIns->nLength) pIns->nLoopEnd = pIns->nLength; - if (pIns->nLoopStart+2 >= pIns->nLoopEnd) + if (pIns->nLoopStart >= pIns->nLoopEnd) { pIns->nLoopStart = pIns->nLoopEnd = 0; pIns->uFlags &= ~CHN_LOOP; Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-25 15:39:19 UTC (rev 303) @@ -23,7 +23,7 @@ } -SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile) +SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile) //---------------------------------------------------------------------------------------------------------------------------- { if(nSilenceLength == 0 || nSilenceLength >= MAX_SAMPLE_LENGTH || smp.nLength > MAX_SAMPLE_LENGTH - nSilenceLength) @@ -66,6 +66,49 @@ return smp.nLength; } +SmpLength ResizeSample(MODINSTRUMENT& smp, const SmpLength nNewLength, CSoundFile* pSndFile) +//---------------------------------------------------------------------------------------- +{ + // Invalid sample size + if(nNewLength > MAX_SAMPLE_LENGTH || nNewLength == smp.nLength) + return smp.nLength; + + // New sample will be bigger so we'll just use "InsertSilence" as it's already there. + if(nNewLength > smp.nLength) + return InsertSilence(smp, nNewLength - smp.nLength, smp.nLength, pSndFile); + + // Else: Shrink sample + + const SmpLength nNewSmpBytes = nNewLength * smp.GetElementarySampleSize() * smp.GetNumChannels(); + + LPSTR pNewSmp = 0; + pNewSmp = CSoundFile::AllocateSample(nNewSmpBytes); + if(pNewSmp == 0) + return smp.nLength; //Sample allocation failed. + + // Copy over old data and replace sample by the new one + memcpy(pNewSmp, smp.pSample, nNewSmpBytes); + ReplaceSample(smp, pNewSmp, nNewLength); + + // Adjust loops + if(smp.nLoopStart > nNewLength) + { + smp.nLoopStart = smp.nLoopEnd = 0; + smp.uFlags &= ~CHN_LOOP; + } + if(smp.nLoopEnd > nNewLength) smp.nLoopEnd = nNewLength; + if(smp.nSustainStart > nNewLength) + { + smp.nSustainStart = smp.nSustainEnd = 0; + smp.uFlags &= ~CHN_SUSTAINLOOP; + } + if(smp.nSustainEnd > nNewLength) smp.nSustainEnd = nNewLength; + + AdjustEndOfSample(smp, pSndFile); + + return smp.nLength; +} + namespace // Unnamed namespace for local implementation functions. { Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-07-25 13:27:30 UTC (rev 302) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-07-25 15:39:19 UTC (rev 303) @@ -20,8 +20,13 @@ // Insert silence to given location. // Note: Is currently implemented only for inserting silence to the beginning and to the end of the sample. // Return: Length of the new sample. -SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile = 0); +SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile = nullptr); +// Change sample size. +// Note: If resized sample is bigger, silence will be added to the sample's tail. +// Return: Length of the new sample. +SmpLength ResizeSample(MODINSTRUMENT& smp, const SmpLength nNewLength, CSoundFile* pSndFile = nullptr); + // Replaces sample in 'smp' with given sample and frees the old sample. void ReplaceSample(MODINSTRUMENT& smp, const LPSTR pNewSample, const SmpLength nNewLength); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |