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. |