From: <rel...@us...> - 2009-01-10 07:52:33
|
Revision: 243 http://modplug.svn.sourceforge.net/modplug/?rev=243&view=rev Author: relabsoluness Date: 2009-01-10 07:52:25 +0000 (Sat, 10 Jan 2009) Log Message: ----------- Pattern, minor fixes and tweaks: . Undo fixes (didn't properly handle playback positions/multichannel record, set redundant undo points) . Fixes to macro command recording (see rev. 240) (didn't set modified, didn't update GUI) . Param record in plugs GUI wrote commands even when pattern record was off. . Fixed chord detection when row spacing was enabled. / Some refactoring. MIDI/plug / When passing MIDI to plug, documents will now be set modified since MIDI data may change parameters. . Modifying plug params with MIDI mapping didn't set document modified. / Misc: Changes to internet links. . Misc: Fix to possible crash when closing modified document between timer ticks (very rare). (patch from Jojo) / Minor GUI tweaks especially in the setup dialogs. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mpt_midi.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/pattern.h trunk/OpenMPT/mptrack/patternContainer.h trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/midi.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-01-10 07:52:25 UTC (rev 243) @@ -99,6 +99,8 @@ ON_COMMAND_EX(ID_NETLINK_HANDBOOK, OnInternetLink) ON_COMMAND_EX(ID_NETLINK_FORUMS, OnInternetLink) ON_COMMAND_EX(ID_NETLINK_PLUGINS, OnInternetLink) + ON_COMMAND_EX(ID_NETLINK_OPENMPTWIKI_GERMAN, OnInternetLink) + ON_COMMAND_EX(ID_NETLINK_MODARCHIVE, OnInternetLink) ON_CBN_SELCHANGE(IDC_COMBO_BASEOCTAVE, OnOctaveChanged) ON_UPDATE_COMMAND_UI(ID_MIDI_RECORD, OnUpdateMidiRecord) ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime) @@ -2258,6 +2260,10 @@ //------------------------------------------------- { if (pModDoc == m_pModPlaying) PauseMod(); + + // Make sure that OnTimer() won't try to set the closed document modified anymore. + if (pModDoc == m_pJustModifiedDoc) m_pJustModifiedDoc = 0; + m_wndTree.OnDocumentClosed(pModDoc); } @@ -2665,12 +2671,14 @@ { // case ID_NETLINK_MODPLUG: pszURL = "http://www.modplug.com"; break; case ID_NETLINK_OPENMPTWIKI:pszURL = "http://openmpt.xwiki.com/"; break; - case ID_NETLINK_UT: pszURL = "http://www.united-trackers.org"; break; - case ID_NETLINK_OSMUSIC: pszURL = "http://www.osmusic.net/"; break; +// case ID_NETLINK_UT: pszURL = "http://www.united-trackers.org"; break; +// case ID_NETLINK_OSMUSIC: pszURL = "http://www.osmusic.net/"; break; // case ID_NETLINK_HANDBOOK: pszURL = "http://www.modplug.com/mods/handbook/handbook.htm"; break; case ID_NETLINK_MPTFR: pszURL = "http://mpt.new.fr/"; break; case ID_NETLINK_FORUMS: pszURL = "http://www.lpchip.com/modplug"; break; case ID_NETLINK_PLUGINS: pszURL = "http://www.kvraudio.com"; break; + case ID_NETLINK_MODARCHIVE: pszURL = "http://modarchive.org/"; break; + case ID_NETLINK_OPENMPTWIKI_GERMAN: pszURL = "http://sagamusix.de/openmpt/Hauptseite"; break; } if (pszURL) return CTrackApp::OpenURL(pszURL); return FALSE; Modified: trunk/OpenMPT/mptrack/Mpt_midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-01-10 07:52:25 UTC (rev 243) @@ -294,6 +294,7 @@ IMixPlugin* pPlug = m_rSndFile.m_MixPlugins[plugindex-1].pMixPlugin; if(!pPlug) continue; pPlug->SetZxxParameter(param, (midimsg >> 16) & 0x7F); + CMainFrame::GetMainFrame()->ThreadSafeSetModified(m_rSndFile.GetpModDoc()); } } } Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-01-10 07:52:25 UTC (rev 243) @@ -2614,7 +2614,14 @@ { const INSTRUMENTINDEX instr = m_nInstrument; IMixPlugin* plug = pSndFile->GetInstrumentPlugin(instr); - if(plug) plug->MidiSend(dwMidiData); + if(plug) + { + plug->MidiSend(dwMidiData); + // Sending midi may modify the plug. For now, if MIDI data + // is not active sensing, set modified. + if(dwMidiData != MIDISTATUS_ACTIVESENSING) + CMainFrame::GetMainFrame()->ThreadSafeSetModified(pModDoc); + } } break; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-01-10 07:52:25 UTC (rev 243) @@ -602,14 +602,14 @@ //-------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - int x,y,cx,cy; + UINT nChnBeg, nRowBeg, nChnEnd, nRowEnd; - x = (dwBegin & 0xFFFF) >> 3; - y = (dwBegin >> 16); - cx = ((dwEnd & 0xFFFF) >> 3) - x + 1; - cy = (dwEnd >> 16) - y + 1; - if ((x < 0) || (y < 0) || (cx < 1) || (cy < 1)) return FALSE; - if (pModDoc) return pModDoc->PrepareUndo(m_nPattern, x, y, cx, cy); + nChnBeg = GetChanFromCursor(dwBegin); + nRowBeg = GetRowFromCursor(dwBegin); + nChnEnd = GetChanFromCursor(dwEnd); + nRowEnd = GetRowFromCursor(dwEnd); + if( (nChnEnd < nChnBeg) || (nRowEnd < nRowBeg) ) return FALSE; + if (pModDoc) return pModDoc->PrepareUndo(m_nPattern, nChnBeg, nRowBeg, nChnEnd-nChnBeg+1, nRowEnd-nRowBeg+1); return FALSE; } @@ -2823,7 +2823,8 @@ //-------------------------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (!m_bRecord || !pModDoc) { + //if (!m_bRecord || !pModDoc) { + if (!IsEditingEnabled() || !pModDoc) { return 0; } CSoundFile *pSndFile = pModDoc->GetSoundFile(); @@ -2831,17 +2832,18 @@ return 0; } - MODCOMMAND *pRow; - PrepareUndo(m_dwBeginSel, m_dwEndSel); - //Work out where to put the new data - UINT nChn = (m_dwCursor & 0xFFFF) >> 3; - bool usePlaybackPosition = (m_dwStatus & PATSTATUS_FOLLOWSONG) && //work out whether we should use - (CMainFrame::GetMainFrame()->GetFollowSong(pModDoc) == m_hWnd) && //player engine position or - !(pSndFile->IsPaused()); //edit cursor position - UINT nRow = usePlaybackPosition?pSndFile->m_nRow:m_nRow; - pRow = pSndFile->Patterns[m_nPattern] + nRow*pSndFile->m_nChannels + nChn; + const UINT nChn = GetChanFromCursor(m_dwCursor); + const bool bUsePlaybackPosition = IsLiveRecord(*pModDoc, *pSndFile); + ROWINDEX nRow = m_nRow; + PATTERNINDEX nPattern = m_nPattern; + if(bUsePlaybackPosition == true) + SetEditPos(*pSndFile, nRow, nPattern, pSndFile->m_nRow, pSndFile->m_nPattern); + pModDoc->PrepareUndo(nPattern, nChn, nRow, 1, 1); + + MODCOMMAND *pRow = pSndFile->Patterns[nPattern].GetpModCommand(nRow, nChn); + // TODO: Is the right plugin active? Move to a chan with the right plug // Probably won't do this - finish fluctuator implementation instead. @@ -2956,15 +2958,24 @@ // Checking whether to record MIDI controller change as MIDI macro change. if((CMainFrame::m_dwMidiSetup & MIDISETUP_MIDIMACROCONTROL) && IsEditingEnabled()) { - CModDoc* const pModdoc = GetDocument(); - if(pModDoc != 0) - { - MODCOMMAND *p = pModdoc->GetSoundFile()->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor)); - if(p->command == 0 || p->command == CMD_SMOOTHMIDI) - { // Write command only if there's no existing command or already a smooth midi macro command. - p->command = CMD_SMOOTHMIDI; - p->param = nByte2; - } + // Note: No undo for these modifications. + const bool bLiveRecord = IsLiveRecord(*pModDoc, *pSndFile); + ROWINDEX nRow = m_nRow; + PATTERNINDEX nPat = m_nPattern; + if(bLiveRecord) + SetEditPos(*pSndFile, nRow, nPat, pSndFile->m_nRow, pSndFile->m_nPattern); + + const CHANNELINDEX nChn = GetChanFromCursor(m_dwCursor); + MODCOMMAND *p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + if(p->command == 0 || p->command == CMD_SMOOTHMIDI || p->command == CMD_MIDI) + { // Write command only if there's no existing command or already a midi macro command. + p->command = CMD_SMOOTHMIDI; + p->param = nByte2; + pMainFrm->ThreadSafeSetModified(pModDoc); + + // Update GUI only if not recording live. + if(bLiveRecord == false) + InvalidateRow(nRow); } } @@ -2995,7 +3006,15 @@ { const UINT instr = GetCurrentInstrument(); IMixPlugin* plug = pSndFile->GetInstrumentPlugin(instr); - if(plug) plug->MidiSend(dwMidiData); + if(plug) + { + plug->MidiSend(dwMidiData); + // Sending midi may modify the plug. For now, if MIDI data + // is not active sensing, set modified. + if(dwMidiData != MIDISTATUS_ACTIVESENSING) + pMainFrm->ThreadSafeSetModified(pModDoc); + } + } break; } @@ -3689,12 +3708,21 @@ //} } } -void CViewPattern::TempStopNote(int note, bool fromMidi) -//------------------------------------------------------ + + +void CViewPattern::TempStopNote(int note, bool fromMidi, const bool bChordMode) +//----------------------------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - bool isSplit = (note < m_nSplitNote); + CSoundFile *pSndFile = pModDoc->GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + + // Get playback edit positions from play engine here in case they are needed below. + const ROWINDEX nRowPlayback = pSndFile->m_nRow; + const UINT nTick = pSndFile->m_nTickCount; + const PATTERNINDEX nPatPlayback = pSndFile->m_nPattern; + + const bool isSplit = (note < m_nSplitNote); if (pModDoc) { UINT ins = 0; @@ -3707,27 +3735,30 @@ } if (!ins) ins = GetCurrentInstrument(); if (!ins) ins = m_nFoundInstrument; + if(bChordMode == true) + { + m_dwStatus &= ~PATSTATUS_CHORDPLAYING; + pModDoc->NoteOff(0, TRUE, ins, m_dwCursor & 0xFFFF); + } + else + pModDoc->NoteOff(note, FALSE, ins, GetChanFromCursor(m_dwCursor)); //pModDoc->NoteOff(note, TRUE, ins, (m_dwCursor & 0xFFFF) >> 3); - pModDoc->NoteOff(note, FALSE, ins, GetChanFromCursor(m_dwCursor)); - } //Enter note off in pattern? if ((note < 1) || (note > NOTE_MAX)) return; - if ((m_dwCursor & 7) > 1 && !fromMidi) + if ((m_dwCursor & 7) > 1 && (bChordMode || !fromMidi)) return; if (!pModDoc || !pMainFrm || !(IsEditingEnabled())) return; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - UINT nChn = GetChanFromCursor(m_dwCursor); - PrepareUndo(m_dwBeginSel, m_dwEndSel); + const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); + const CHANNELINDEX nChnCursor = GetChanFromCursor(m_dwCursor); + BYTE* activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; - CHANNELINDEX releaseChan = activeNoteMap[note]; - if (releaseChan > pSndFile->GetNumChannels()) - releaseChan = nChn; + const CHANNELINDEX nChn = (activeNoteMap[note] < pSndFile->GetNumChannels()) ? activeNoteMap[note] : nChnCursor; activeNoteMap[note] = 0xFF; //unlock channel @@ -3736,135 +3767,66 @@ } // -- write sdx if playing live - bool usePlaybackPosition = (m_dwStatus & PATSTATUS_FOLLOWSONG) && // work out whether we should use - (pMainFrm->GetFollowSong(pModDoc) == m_hWnd) && // player engine position or - !(pSndFile->IsPaused()) && // edit cursor position - (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY); + const bool usePlaybackPosition = (!bChordMode) && (bIsLiveRecord && (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY)); //Work out where to put the note off - UINT nRow = usePlaybackPosition ? pSndFile->m_nRow : m_nRow; + ROWINDEX nRow = m_nRow; + PATTERNINDEX nPat = m_nPattern; - MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, (releaseChan < pSndFile->GetNumChannels()) ? releaseChan : nChn); + if(usePlaybackPosition) + SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); + MODCOMMAND* p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + //don't overwrite: - if (p->note || p->instr || p->volcmd) { + if (p->note || p->instr || p->volcmd) + { //if there's a note in the current location and the song is playing and following, //the user probably just tapped the key - let's try the next row down. - if (p->note==note && (m_dwStatus&PATSTATUS_FOLLOWSONG) && !(pSndFile->IsPaused())) { - p=pSndFile->Patterns[m_nPattern]+(nRow+1)*pSndFile->m_nChannels+releaseChan; - if (p->note || p->instr || p->volcmd) { + nRow++; + if (p->note==note && bIsLiveRecord && pSndFile->Patterns[nPat].IsValidRow(nRow)) + { + p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + if (p->note || (!bChordMode && (p->instr || p->volcmd)) ) return; - } - } else { - return; } + else + return; } + // Create undo-point. + pModDoc->PrepareUndo(nPat, nChn, nRow, 1, 1); + // -- write sdx if playing live - if (usePlaybackPosition && pSndFile->m_nTickCount) { // avoid SD0 which will be mis-interpreted + if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted if (p->command == 0) { //make sure we don't overwrite any existing commands. - p->command = (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M))?CMD_S3MCMDEX:CMD_MODCMDEX; - p->param = 0xD0 + (pSndFile->m_nTickCount&0x0F); //&0x0F is to limit to max 0x0F + p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; + p->param = 0xD0 + min(0xF, nTick); } } //Enter note off - p->note = 0xFF; - p->instr = GetCurrentInstrument(); //p->instr = 0; + p->note = NOTE_KEYOFF; + p->instr = (bChordMode) ? 0 : GetCurrentInstrument(); //p->instr = 0; //Writing the instrument as well - probably someone finds this annoying :) p->volcmd = 0; p->vol = 0; pModDoc->SetModified(); - DWORD sel = (nRow << 16) | (releaseChan << 3); - InvalidateArea(sel, sel+5); - UpdateIndicator(); - return; - -} - -void CViewPattern::TempStopChord(int note) -//--------------------------------------------- -{ - CModDoc *pModDoc = GetDocument(); - CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - bool isSplit = (note<m_nSplitNote); - if (pModDoc) + // Update only if not recording live. + if(bIsLiveRecord == false) { - UINT ins = 0; - if (isSplit) - { - ins = m_nSplitInstrument; - if (m_bOctaveLink) note += 12*(m_nOctaveModifier-9); - if (note > NOTE_MAX && note<254) note = NOTE_MAX; - if (note<0) note=1; - } - if (!ins) ins = GetCurrentInstrument(); - if (!ins) ins = m_nFoundInstrument; - - m_dwStatus &= ~PATSTATUS_CHORDPLAYING; - pModDoc->NoteOff(0, TRUE, ins, m_dwCursor & 0xFFFF); + DWORD sel = (nRow << 16) | (nChn << 3); + InvalidateArea(sel, sel+5); + UpdateIndicator(); } - //Enter note off in pattern? - if ((note < 1) || (note > NOTE_MAX)) - return; - if ((m_dwCursor & 7) > 1) - return; - //if (!pModDoc || !pMainFrm || !(m_dwStatus & PATSTATUS_RECORD)) - if (!pModDoc || !pMainFrm || !(IsEditingEnabled())) - return; - - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - UINT nChn = GetChanFromCursor(m_dwCursor); - PrepareUndo(m_dwBeginSel, m_dwEndSel); - - BYTE* activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; - CHANNELINDEX releaseChan = activeNoteMap[note]; - if (releaseChan > pSndFile->GetNumChannels()) - releaseChan = nChn; - - activeNoteMap[note] = 0xFF; //unlock channel - - if (!(CMainFrame::m_dwPatternSetup&PATTERN_KBDNOTEOFF )) - return; - - MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); - - //don't overwrite: - if (p->note) - { - //if there's a note in the current location and the song is playing and following, - //the user probably just tapped the key - let's try the nex row down. - if (p->note==note && (m_dwStatus&PATSTATUS_FOLLOWSONG) && !(pSndFile->IsPaused())) - { - p=pSndFile->Patterns[m_nPattern]+(m_nRow+1)*pSndFile->m_nChannels+nChn; - if (p->note) - return; - } - else - { - return; - } - - } - - p->note = 0xFF; - p->instr = 0; - p->volcmd = 0; - p->vol = 0; - p->command = 0; - p->param = 0; - - pModDoc->SetModified(); - DWORD sel = (m_nRow << 16) | (releaseChan << 3); - InvalidateArea(sel, sel+5); - UpdateIndicator(); - return; + } + void CViewPattern::TempEnterOctave(int val) //--------------------------------------------- { @@ -3938,26 +3900,28 @@ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); - bool isSplit; if ((pModDoc) && (pMainFrm)) { - UINT nRow = m_nRow; CSoundFile *pSndFile = pModDoc->GetSoundFile(); + const ROWINDEX nRowPlayback = pSndFile->m_nRow; + const UINT nTick = pSndFile->m_nTickCount; + const PATTERNINDEX nPatPlayback = pSndFile->m_nPattern; - UINT nChn = GetChanFromCursor(m_dwCursor); + const bool bRecordEnabled = IsEditingEnabled(); + const UINT nChn = GetChanFromCursor(m_dwCursor); BYTE recordGroup = pModDoc->IsChannelRecord(nChn); UINT nPlayIns = 0; - PrepareUndo(m_dwBeginSel, m_dwEndSel); + if (note > NOTE_MAX && note < 254) note = NOTE_MAX; - bool usePlaybackPosition = (m_dwStatus & PATSTATUS_FOLLOWSONG) && // work out whether we should use - (pMainFrm->GetFollowSong(pModDoc) == m_hWnd) && // player engine position or - !(pSndFile->IsPaused()) && // edit cursor position - (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY); + const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); + const bool usePlaybackPosition = (bIsLiveRecord && (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY)); + ROWINDEX nRow = m_nRow; + // -- Chord autodetection: step back if we just entered a note - if ((IsEditingEnabled()) && (recordGroup) && !usePlaybackPosition) { + if ((bRecordEnabled) && (recordGroup) && !bIsLiveRecord) { if ((m_nSpacing > 0) && (m_nSpacing <= MAX_SPACING)) { if ((timeGetTime() - m_dwLastNoteEntryTime < CMainFrame::gnAutoChordWaitTime) && (nRow>=m_nSpacing) && (!m_bLastNoteEntryBlocked)) @@ -3966,17 +3930,24 @@ } m_dwLastNoteEntryTime = timeGetTime(); - nRow = usePlaybackPosition ? pSndFile->m_nRow : m_nRow; + PATTERNINDEX nPat = m_nPattern; + if(usePlaybackPosition) + SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); + // -- Work out where to put the new note - MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, nChn); + MODCOMMAND* p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); //take backup copy of the command we're about to overwrite - MODCOMMAND oldcmd = *p; + const MODCOMMAND oldcmd = *p; - // -- write note and instrument data - isSplit = HandleSplit(p, note); + // If record is enabled, create undo point. + if(bRecordEnabled) + pModDoc->PrepareUndo(nPat, nChn, nRow, 1, 1); + // -- write note and instrument data. + const bool isSplit = HandleSplit(p, note); + // -- write vol data if (vol>=0 && vol<=64 && !(isSplit && m_nSplitVolume)) { //write valid volume, as long as there's no split volume override. p->volcmd=VOLCMD_VOLUME; @@ -3989,37 +3960,43 @@ } // -- write sdx if playing live - if (usePlaybackPosition && pSndFile->m_nTickCount) { // avoid SD0 which will be mis-interpreted + if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted if (p->command == 0) { //make sure we don't overwrite any existing commands. - p->command = (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M))?CMD_S3MCMDEX:CMD_MODCMDEX; - p->param = 0xD0 + (pSndFile->m_nTickCount&0x0F); //&0x0F is to limit to max 0x0F + p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; + p->param = 0xD0 + min(0xF, nTick); } } // -- old style note cut/off: erase instrument number - if (oldStyle && ((p->note==254) || (p->note==255))) { + if (oldStyle && ((p->note==NOTE_NOTECUT) || (p->note==NOTE_KEYOFF))) { p->instr=0; } - + // -- if recording, handle post note entry behaviour (move cursor etc..) - if(IsEditingEnabled()) + if(bRecordEnabled) { DWORD sel = (nRow << 16) | m_dwCursor; - SetCurSel(sel, sel); - sel &= ~7; + if(bIsLiveRecord == false) + { // Update only when not recording live. + SetCurSel(sel, sel); + sel &= ~7; + } + if(*p != oldcmd) //has it really changed? { pModDoc->SetModified(); - InvalidateArea(sel, sel+5); - UpdateIndicator(); + if(bIsLiveRecord == false) + { // Update only when not recording live. + InvalidateArea(sel, sel+5); + UpdateIndicator(); + } } - //Move cursor down if follow song off or song is paused - if ((pMainFrm->GetFollowSong(pModDoc) != m_hWnd) || (pSndFile->IsPaused()) - || (!(m_dwStatus & PATSTATUS_FOLLOWSONG))) + //Move cursor down only if not recording live. + if ( bIsLiveRecord == false ) { if ((m_nSpacing > 0) && (m_nSpacing <= MAX_SPACING)) { - if (nRow+m_nSpacing<pSndFile->PatternSize[m_nPattern]) { + if (nRow+m_nSpacing<pSndFile->PatternSize[nPat]) { SetCurrentRow(nRow+m_nSpacing); m_bLastNoteEntryBlocked=false; } else { @@ -4041,9 +4018,9 @@ bool channelLocked; UINT n = nChn; - for (UINT i=0; i<pSndFile->m_nChannels; i++) + for (UINT i=1; i<pSndFile->m_nChannels; i++) { - if (++n > pSndFile->m_nChannels) n = 0; //loop around + if (++n >= pSndFile->m_nChannels) n = 0; //loop around channelLocked = false; for (int k=0; k<NOTE_MAX; k++) @@ -4065,7 +4042,7 @@ } // -- play note - if ((CMainFrame::m_dwPatternSetup & PATTERN_PLAYNEWNOTE) || (!IsEditingEnabled())) + if ((CMainFrame::m_dwPatternSetup & PATTERN_PLAYNEWNOTE) || (bRecordEnabled == false)) { if (p->instr) nPlayIns = p->instr; @@ -4100,7 +4077,7 @@ } //-- if not recording, restore old command. - if (!(IsEditingEnabled())) + if (bRecordEnabled == false) { *p = oldcmd; } @@ -4932,5 +4909,19 @@ - - +void CViewPattern::SetEditPos(const CSoundFile& rSndFile, + ROWINDEX& iRow, PATTERNINDEX& iPat, + const ROWINDEX iRowCandidate, const PATTERNINDEX iPatCandidate) const +//------------------------------------------------------------------------------------------- +{ + if(rSndFile.Patterns.IsValidIndex(iPatCandidate) && rSndFile.Patterns[iPatCandidate].IsValidRow(iRowCandidate)) + { // Case: Edit position candidates are valid -- use them. + iPat = iPatCandidate; + iRow = iRowCandidate; + } + else // Case: Edit position candidates are not valid -- set edit cursor position instead. + { + iPat = m_nPattern; + iRow = m_nRow; + } +} Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/View_pat.h 2009-01-10 07:52:25 UTC (rev 243) @@ -174,9 +174,9 @@ BOOL ExecuteCommand(CommandID command); void CursorJump(DWORD distance, bool direction, bool snap); void TempEnterNote(int n, bool oldStyle = false, int vol = -1); - void TempStopNote(int note, bool fromMidi=false); + void TempStopNote(int note, bool fromMidi=false, const bool bChordMode=false); void TempEnterChord(int n); - void TempStopChord(int note); + void TempStopChord(int note) {TempStopNote(note, false, true);} void TempEnterIns(int val); void TempEnterOctave(int val); void TempEnterVol(int v); @@ -324,7 +324,17 @@ bool IsInterpolationPossible(UINT startRow, UINT endRow, UINT chan, UINT colType, CSoundFile* pSndFile); void Interpolate(UINT type); - + // Return true if recording live (i.e. editing while following playback). + // rSndFile must be the CSoundFile object of given rModDoc. + bool IsLiveRecord(const CModDoc& rModDoc, const CSoundFile& rSndFile) const; + bool IsLiveRecord(const CMainFrame& rMainFrm, const CModDoc& rModDoc, const CSoundFile& rSndFile) const; + + // If given edit positions are valid, sets them to iRow and iPat. + // If not valid, set edit cursor position. + void SetEditPos(const CSoundFile& rSndFile, + ROWINDEX& iRow, PATTERNINDEX& iPat, + const ROWINDEX iRowCandidate, const PATTERNINDEX iPatCandidate) const; + bool IsEditingEnabled() const {return ((m_dwStatus&PATSTATUS_RECORD) != 0);} //Like IsEditingEnabled(), but shows some notification when editing is not enabled. @@ -344,6 +354,19 @@ }; +inline bool CViewPattern::IsLiveRecord(const CMainFrame& rMainFrm, const CModDoc& rModDoc, const CSoundFile& rSndFile) const +//---------------------------------------------------------------------------- +{ // (following song) && (following in correct document(?)) && (playback is on) + return ((m_dwStatus & PATSTATUS_FOLLOWSONG) && (rMainFrm.GetFollowSong(&rModDoc) == m_hWnd) && !(rSndFile.IsPaused())); +} + + +inline bool CViewPattern::IsLiveRecord(const CModDoc& rModDoc, const CSoundFile& rSndFile) const +//---------------------------------------------------------------------------- +{ + return IsLiveRecord(*CMainFrame::GetMainFrame(), rModDoc, rSndFile); +} + #endif Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-01-10 07:52:25 UTC (rev 243) @@ -189,11 +189,13 @@ MENUITEM SEPARATOR POPUP "&Internet" BEGIN + MENUITEM "Modplug Central &Forums", ID_NETLINK_FORUMS MENUITEM "OpenMPT Wiki", ID_NETLINK_OPENMPTWIKI - MENUITEM "Modplug Central &Forums", ID_NETLINK_FORUMS + MENUITEM "OpenMPT Wiki (German)", ID_NETLINK_OPENMPTWIKI_GERMAN + MENUITEM "MPT-FR", ID_NETLINK_MPTFR MENUITEM "&Kvr Audio (plugins)", ID_NETLINK_PLUGINS - MENUITEM "&OSMusic.net", ID_NETLINK_TRAXINSPACE + MENUITEM "The Mod Archive", ID_NETLINK_MODARCHIVE END MENUITEM SEPARATOR MENUITEM "&About MPTrack...", ID_APP_ABOUT @@ -253,65 +255,65 @@ ES_READONLY | NOT WS_BORDER END -IDD_OPTIONS_PLAYER DIALOGEX 0, 0, 266, 278 +IDD_OPTIONS_PLAYER DIALOGEX 0, 0, 272, 279 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Player" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "Sound Quality",IDC_STATIC,1,155,256,97 + GROUPBOX "Sound Quality",IDC_STATIC,5,165,256,97 CONTROL "Automatic Gain Control",IDC_CHECK2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,9,20,97,10 + BS_AUTOCHECKBOX | WS_TABSTOP,15,20,97,10 CONTROL "Noise reduction",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,9,32,82,10 - LTEXT "Resampling:",IDC_STATIC,7,169,41,8 - COMBOBOX IDC_COMBO1,50,167,120,56,CBS_DROPDOWNLIST | WS_VSCROLL | + 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,9,53,81,10 - LTEXT "Low",IDC_STATIC,12,67,14,8 + WS_TABSTOP,15,53,81,10 + LTEXT "Low",IDC_STATIC,17,67,14,8 CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,27,65,62,15 - LTEXT "High",IDC_STATIC,90,67,16,8 - LTEXT "10Hz",IDC_STATIC,126,67,18,8 - LTEXT "Range:",IDC_STATIC,163,53,24,8 + 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,143,64,62,15 - LTEXT "100Hz",IDC_STATIC,205,66,23,8 + TBS_NOTICKS | WS_TABSTOP,149,64,62,15 + LTEXT "100Hz",IDC_STATIC,211,66,23,8 CONTROL "Reverb",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,9,84,62,10 - LTEXT "Low",IDC_STATIC,12,100,14,8 + WS_TABSTOP,15,84,62,10 + LTEXT "Low",IDC_STATIC,17,100,14,8 CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,27,96,62,15 - LTEXT "High",IDC_STATIC,90,100,16,8 - CTEXT "Reverb Preset:",IDC_STATIC,143,90,62,8 + 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,9,116,99,10 - LTEXT "Low",IDC_STATIC,12,132,14,8 + WS_TABSTOP,15,116,99,10 + LTEXT "Low",IDC_STATIC,17,132,14,8 CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,27,129,62,15 - LTEXT "High",IDC_STATIC,90,132,16,8 - LTEXT "5ms",IDC_STATIC,126,131,18,8 - CTEXT "Front/Rear Delay:",IDC_STATIC,142,118,65,8 + 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,143,128,62,15 - LTEXT "50ms",IDC_STATIC,205,131,23,8 - COMBOBOX IDC_COMBO2,130,97,100,100,CBS_DROPDOWNLIST | WS_VSCROLL | + TBS_NOTICKS | WS_TABSTOP,149,128,62,15 + 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,0,5,257,150 - EDITTEXT IDC_WFIRCUTOFF,150,205,19,14,ES_AUTOHSCROLL | ES_NUMBER - COMBOBOX IDC_WFIRTYPE,50,186,119,64,CBS_DROPDOWN | WS_VSCROLL | + 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,7,188,37,8 - LTEXT "WFIR cutoff factor:",IDC_STATIC,8,208,62,8 - LTEXT "%",IDC_STATIC,173,208,8,8 - LTEXT "Sample ramping (click avoidance):",IDC_STATIC,8,228,109, - 8 - EDITTEXT IDC_RAMPING,145,225,24,14,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Samples",IDC_STATIC,172,228,29,8 - LTEXT "(can be overridden by instrument setting)",IDC_STATIC,9, - 238,128,8 + 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,130,20,107,10 + BS_AUTOCHECKBOX | WS_TABSTOP,135,20,107,10 END IDD_WAVECONVERT DIALOGEX 0, 0, 211, 166 @@ -367,141 +369,142 @@ CTEXT "Writing file...",IDC_TEXT1,4,4,178,9 END -IDD_OPTIONS_KEYBOARD DIALOGEX 0, 0, 266, 278 +IDD_OPTIONS_KEYBOARD DIALOGEX 0, 0, 272, 279 STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Keyboard" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - COMBOBOX IDC_KEYCATEGORY,0,16,130,204,CBS_DROPDOWNLIST | + COMBOBOX IDC_KEYCATEGORY,5,16,130,204,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LISTBOX IDC_COMMAND_LIST,0,32,130,242,LBS_NOINTEGRALHEIGHT | + LISTBOX IDC_COMMAND_LIST,5,32,130,242,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_CHOICECOMBO,141,16,79,51,CBS_DROPDOWN | WS_VSCROLL | + COMBOBOX IDC_CHOICECOMBO,147,16,79,51,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_CUSTHOTKEY,157,31,98,13,ES_AUTOHSCROLL + EDITTEXT IDC_CUSTHOTKEY,163,31,98,13,ES_AUTOHSCROLL CONTROL "On Key Down",IDC_CHECKKEYDOWN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,141,44,66,14 + WS_TABSTOP,147,44,66,14 CONTROL "On Key Hold",IDC_CHECKKEYHOLD,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,141,57,66,10 + WS_TABSTOP,147,57,66,10 CONTROL "On Key Up",IDC_CHECKKEYUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,141,68,66,8 - PUSHBUTTON "Restore",IDC_RESTORE,212,46,43,13 - PUSHBUTTON "Delete",IDC_DELETE,212,64,43,13 - EDITTEXT IDC_KEYREPORT,135,94,125,70,ES_MULTILINE | + 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 - PUSHBUTTON "Y",IDC_NOTESREPEAT,230,176,12,9 - PUSHBUTTON "N",IDC_NONOTESREPEAT,245,176,12,9 - EDITTEXT IDC_CHORDDETECTWAITTIME,229,189,28,12,ES_AUTOHSCROLL | + 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 - PUSHBUTTON "it",IDC_EFFECTLETTERSIT,98,184,12,9,NOT WS_VISIBLE - PUSHBUTTON "xm",IDC_EFFECTLETTERSXM,113,184,12,9,NOT WS_VISIBLE - PUSHBUTTON "Load Keys...",IDC_LOAD,139,221,54,13 - PUSHBUTTON "Save Keys As...",IDC_SAVE,199,221,54,13 + 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,53,199,56,10 - EDITTEXT IDC_KEYMAPFILE,139,249,114,13,ES_AUTOHSCROLL - LTEXT "Select category:",IDC_STATIC,1,5,74,11 - PUSHBUTTON "Set",IDC_SET,222,46,43,13,NOT WS_VISIBLE - GROUPBOX "Key setup for this command ",IDC_STATIC,134,5,127,75 - LTEXT "Key:",IDC_STATIC,141,33,16,8 - GROUPBOX "Misc",IDC_STATIC,134,167,126,40 - GROUPBOX "Multi Config Handling",IDC_STATIC,134,209,126,66 - LTEXT "Repeat notes on hold?",IDC_STATIC,138,176,74,11 - LTEXT "Effect letters like:",IDC_STATIC,6,185,73,11,NOT + 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 + GROUPBOX "Key setup for this command ",IDC_STATIC,139,5,127,75 + LTEXT "Key:",IDC_STATIC,147,33,16,8 + 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 "Chord detect interval (ms):",IDC_STATIC,138,190,88,11 + 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,147,262,106, + BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,153,262,106, 10 - LTEXT "Config to load on startup:",IDC_STATIC,139,239,80,8 - LTEXT "Log:",IDC_STATIC,136,84,19,10 - PUSHBUTTON "Clear Log",IDC_CLEARLOG,222,85,37,9 + 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 END -IDD_OPTIONS_COLORS DIALOGEX 0, 0, 265, 278 +IDD_OPTIONS_COLORS DIALOGEX 0, 0, 272, 231 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Colors" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - COMBOBOX IDC_COMBO1,9,26,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | + COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,19,75,74,10 - EDITTEXT IDC_PRIMARYHILITE,100,74,21,12,ES_AUTOHSCROLL | + 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,19,87,80,10 - EDITTEXT IDC_SECONDARYHILITE,100,86,21,12,ES_AUTOHSCROLL | + 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,10,53,114,10 + BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10 CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,10,43,102,10 - PUSHBUTTON "MPT",IDC_BUTTON5,154,26,22,12 - PUSHBUTTON "FT2",IDC_BUTTON6,179,26,22,12 - PUSHBUTTON "IT",IDC_BUTTON7,154,40,22,12 - PUSHBUTTON "Buzz",IDC_BUTTON8,179,40,22,12 - CONTROL "Color",IDC_BUTTON1,"Button",BS_OWNERDRAW,15,174,51,15 - CONTROL "Color",IDC_BUTTON2,"Button",BS_OWNERDRAW,88,174,51,15 - CONTROL "Color",IDC_BUTTON3,"Button",BS_OWNERDRAW,158,174,51,15 - LTEXT "Background:",IDC_TEXT1,15,163,60,8 - LTEXT "Foreground:",IDC_TEXT2,88,163,62,8 - LTEXT "Highlight:",IDC_TEXT3,159,164,61,8 - GROUPBOX "",IDC_STATIC,4,7,217,191 - LTEXT "Select color for:",IDC_STATIC,10,15,63,8 - LTEXT "rows",IDC_STATIC,124,76,16,8 - LTEXT "Presets:",IDC_STATIC,154,15,28,8 - LTEXT "rows",IDC_STATIC,124,88,16,8 - CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,54,113, + 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 + PUSHBUTTON "Buzz",IDC_BUTTON8,235,25,22,12 + CONTROL "Color",IDC_BUTTON1,"Button",BS_OWNERDRAW,25,194,51,15 + CONTROL "Color",IDC_BUTTON2,"Button",BS_OWNERDRAW,98,194,51,15 + CONTROL "Color",IDC_BUTTON3,"Button",BS_OWNERDRAW,168,194,51,15 + LTEXT "Background:",IDC_TEXT1,25,183,60,8 + LTEXT "Foreground:",IDC_TEXT2,98,183,62,8 + 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 "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 "Set highlights to songs' time signatures",IDC_CHECK5, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,63,136,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10 END -IDD_MIDISETUP DIALOGEX 0, 0, 240, 191 +IDD_MIDISETUP DIALOGEX 0, 0, 272, 281 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Midi" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "",IDC_STATIC,5,14,235,174 - LTEXT "Midi Input Device:",IDC_STATIC,13,14,67,8 - COMBOBOX IDC_COMBO1,13,24,144,74,CBS_DROPDOWNLIST | WS_VSCROLL | + GROUPBOX "Midi Recording",IDC_STATIC,5,5,260,185 + 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,13,42,65,8,NOT + LTEXT "Midi Output Device:",IDC_STATIC,140,20,65,8,NOT WS_VISIBLE - COMBOBOX IDC_COMBO2,13,54,144,73,CBS_DROPDOWNLIST | NOT + COMBOBOX IDC_COMBO2,140,30,120,73,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP - CONTROL "Transpose external midi keyboard",IDC_CHECK4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,82,126,9 + 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,11,93,113,9 + BS_AUTOCHECKBOX | WS_TABSTOP,15,90,113,9 CONTROL "Record note velocity",IDC_CHECK1,"Button", - BS_AUTOCHECKBOX | BS_TOP | WS_TABSTOP,11,104,132,9 + BS_AUTOCHECKBOX | BS_TOP | WS_TABSTOP,15,75,132,9 CONTROL "Record Note Off (Instruments Only)",IDC_CHECK2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,126,130,9 - GROUPBOX "File import",IDC_STATIC,176,14,53,74 - LTEXT "Speed:",IDC_STATIC,183,26,24,8 - EDITTEXT IDC_EDIT1,183,37,39,12,ES_AUTOHSCROLL | ES_NUMBER + BS_AUTOCHECKBOX | WS_TABSTOP,15,120,130,9 + GROUPBOX "Midi file import",IDC_STATIC,5,200,260,45 + LTEXT "Speed:",IDC_STATIC,15,220,24,8 + EDITTEXT IDC_EDIT1,45,220,39,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,217,42, + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,79,225, 11,14 - LTEXT "Pattern size:",IDC_STATIC,183,58,40,8 - EDITTEXT IDC_EDIT2,183,69,39,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Pattern size:",IDC_STATIC,115,220,40,8 + EDITTEXT IDC_EDIT2,165,220,39,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,214,71, + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,196,222, 11,14 CONTROL "Pass MIDI to active instrument plugin (experimental)", IDC_MIDI_TO_PLUGIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,148,222,9 + 15,155,222,9 CONTROL "Combine midi volume to note velocity", IDC_MIDIVOL_TO_NOTEVOL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,115,139,9 + WS_TABSTOP,15,105,139,9 CONTROL "Respond to play/continue/stop song messages (untested)", IDC_MIDIPLAYCONTROL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,172,202,9 + WS_TABSTOP,15,170,202,9 CONTROL "Record MIDI controller changes as MIDI macro changes (in pattern)", IDC_MIDI_MACRO_CONTROL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,160,226,9 + WS_TABSTOP,15,140,226,9 END IDD_LOADRAWSAMPLE DIALOG 0, 0, 168, 84 @@ -1403,72 +1406,72 @@ WS_TABSTOP,WS_EX_STATICEDGE END -IDD_OPTIONS_GENERAL DIALOGEX 0, 0, 265, 278 +IDD_OPTIONS_GENERAL DIALOGEX 0, 0, 272, 279 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "General" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "Directories",IDC_STATIC,4,3,248,67 - LTEXT "Songs:",IDC_STATIC,11,17,36,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT1,55,17,174,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_BUTTON1,234,18,12,11,NOT WS_TABSTOP - LTEXT "Samples:",IDC_STATIC,11,34,41,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT2,55,34,174,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_BUTTON2,234,34,12,11,NOT WS_TABSTOP - LTEXT "Instruments:",IDC_STATIC,11,50,40,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT3,55,50,174,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_BUTTON3,234,51,12,11,NOT WS_TABSTOP - GROUPBOX "Options",IDC_STATIC,4,75,247,200 - LTEXT "Description",IDC_TEXT1,144,86,101,175 + GROUPBOX "Directories",IDC_STATIC,5,5,261,67 + LTEXT "Songs:",IDC_STATIC,15,20,36,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT1,59,20,174,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BUTTON1,240,20,12,11,NOT WS_TABSTOP + LTEXT "Samples:",IDC_STATIC,15,37,41,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT2,59,37,174,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BUTTON2,240,36,12,11,NOT WS_TABSTOP + LTEXT "Instruments:",IDC_STATIC,15,53,40,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT3,59,53,174,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BUTTON3,240,54,12,11,NOT WS_TABSTOP + GROUPBOX "Options",IDC_STATIC,4,75,261,200 + LTEXT "Description",IDC_TEXT1,144,86,111,175 LISTBOX IDC_LIST1,9,86,129,181,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP END -IDD_OPTIONS_SOUNDCARD DIALOGEX 0, 0, 266, 274 +IDD_OPTIONS_SOUNDCARD DIALOGEX 0, 0, 272, 276 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Sound Card" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "",IDC_STATIC,4,3,232,167 - LTEXT "Sound Device:",IDC_STATIC,9,12,79,8 + GROUPBOX "",IDC_STATIC,5,5,232,170 + LTEXT "Sound Device:",IDC_STATIC,11,14,79,8 CONTROL "",IDC_COMBO1,"ComboBoxEx32",CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP,10,23,219,96 - LTEXT "Buffer length:",IDC_STATIC,11,44,43,8 - COMBOBOX IDC_COMBO2,71,41,54,83,CBS_DROPDOWN | WS_VSCROLL | + WS_VSCROLL | WS_TABSTOP,11,25,219,96 + LTEXT "Buffer length:",IDC_STATIC,13,46,43,8 + COMBOBOX IDC_COMBO2,73,43,54,83,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Mixing Quality:",IDC_STATIC,11,62,57,8 - COMBOBOX IDC_COMBO3,71,60,54,90,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "Mixing Quality:",IDC_STATIC,13,64,57,8 + COMBOBOX IDC_COMBO3,73,62,54,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Max. Polyphony:",IDC_STATIC,11,78,57,8 - COMBOBOX IDC_COMBO4,71,76,54,88,CBS_DROPDOWNLIST | WS_TABSTOP + LTEXT "Max. Polyphony:",IDC_STATIC,13,80,57,8 + COMBOBOX IDC_COMBO4,73,78,54,88,CBS_DROPDOWNLIST | WS_TABSTOP CONTROL "Enable MMX Acceleration",IDC_CHECK3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,95,112,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,97,112,10 CONTROL "Use secondary buffers",IDC_CHECK4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,43,99,10 - LTEXT "Stereo Separation:",IDC_STATIC,25,112,62,8 - LTEXT "100%",IDC_TEXT1,93,112,20,8 - RTEXT "Low",IDC_STATIC,35,127,15,8 + BS_AUTOCHECKBOX | WS_TABSTOP,133,45,99,10 + LTEXT "Stereo Separation:",IDC_STATIC,27,114,62,8 + LTEXT "100%",IDC_TEXT1,95,114,20,8 + RTEXT "Low",IDC_STATIC,37,129,15,8 CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | - WS_TABSTOP,57,124,83,18 - LTEXT "High",IDC_STATIC,147,127,16,8 - CTEXT "Pre-Amp",IDC_STATIC,196,76,35,8 + WS_TABSTOP,59,126,83,18 + LTEXT "High",IDC_STATIC,149,129,16,8 + CTEXT "Pre-Amp",IDC_STATIC,197,78,35,8 CONTROL "Slider2",IDC_SLIDER_PREAMP,"msctls_trackbar32", - TBS_AUTOTICKS | TBS_VERT | TBS_BOTH | WS_TABSTOP,200,87, + TBS_AUTOTICKS | TBS_VERT | TBS_BOTH | WS_TABSTOP,201,89, 27,62 - COMBOBOX IDC_COMBO5,131,60,64,80,CBS_DROPDOWNLIST | WS_VSCROLL | + COMBOBOX IDC_COMBO5,133,62,64,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Reverse Stereo",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,131,78,62,10 + WS_TABSTOP,133,80,62,10 CONTROL "Soft Panning",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,131,90,64,10 + WS_TABSTOP,133,92,64,10 LTEXT "Note: The Pre-Amp and Soft Panning settings are ignored by songs with mix levels set to 1.17RC3 or later in Song Properties.", - IDC_STATIC,16,150,204,18 + IDC_STATIC,17,152,204,18 END IDD_MIDIMACRO DIALOGEX 0, 0, 349, 345 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE +EXSTYLE WS_EX_TOOLWINDOW CAPTION "Zxx Macros Configuration" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN @@ -1781,35 +1784,35 @@ LTEXT "New:",IDC_STATIC,101,35,18,8 END -IDD_OPTIONS_AUTOSAVE DIALOGEX 0, 0, 265, 278 +IDD_OPTIONS_AUTOSAVE DIALOGEX 0, 0, 272, 279 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Auto Save" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN CONTROL "Enable Autosave",IDC_AUTOSAVE_ENABLE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,15,70,10 - EDITTEXT IDC_AUTOSAVE_INTERVAL,55,29,24,12,ES_AUTOHSCROLL | + BS_AUTOCHECKBOX | WS_TABSTOP,15,15,70,10 + EDITTEXT IDC_AUTOSAVE_INTERVAL,59,29,24,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_AUTOSAVE_HISTORY,55,46,24,12,ES_AUTOHSCROLL | + EDITTEXT IDC_AUTOSAVE_HISTORY,59,46,24,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_AUTOSAVE_PATH,56,91,164,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_AUTOSAVE_BROWSE,222,92,12,11,NOT WS_TABSTOP + EDITTEXT IDC_AUTOSAVE_PATH,60,96,164,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_AUTOSAVE_BROWSE,226,97,12,11,NOT WS_TABSTOP LTEXT "[filename].AutoSave.[timestamp].[extension]",IDC_STATIC, - 56,115,164,12,SS_CENTERIMAGE,WS_EX_CLIENTEDGE - GROUPBOX "Auto Save",IDC_STATIC,4,3,248,150 - LTEXT "Save every:",IDC_STATIC,11,29,40,12,SS_CENTERIMAGE - LTEXT "minutes",IDC_STATIC,83,29,36,12,SS_CENTERIMAGE - LTEXT "Filename:",IDC_STATIC,24,115,30,12,SS_CENTERIMAGE + 60,120,164,12,SS_CENTERIMAGE,WS_EX_CLIENTEDGE + GROUPBOX "Auto Save",IDC_STATIC,4,3,261,157 + LTEXT "Save every:",IDC_STATIC,15,29,40,12,SS_CENTERIMAGE + LTEXT "minutes",IDC_STATIC,87,29,36,12,SS_CENTERIMAGE + LTEXT "Filename:",IDC_STATIC,28,120,30,12,SS_CENTERIMAGE LTEXT "(example: mySong.AutoSave.20050327.2343.it)",IDC_STATIC, - 56,130,157,12,SS_CENTERIMAGE - LTEXT "Keep up to:",IDC_STATIC,11,46,36,12,SS_CENTERIMAGE - LTEXT "backups of each file name",IDC_STATIC,83,46,87,12, + 60,135,157,12,SS_CENTERIMAGE + LTEXT "Keep up to:",IDC_STATIC,15,46,36,12,SS_CENTERIMAGE + LTEXT "backups of each file name",IDC_STATIC,87,46,87,12, SS_CENTERIMAGE - GROUPBOX "Location:",IDC_STATIC,11,65,228,80 + GROUPBOX "Location:",IDC_STATIC,15,70,240,80 CONTROL "Use:",IDC_AUTOSAVE_USECUSTOMDIR,"Button", - BS_AUTORADIOBUTTON,24,92,31,10 + BS_AUTORADIOBUTTON,28,97,31,10 CONTROL "Use song's original directory.",IDC_AUTOSAVE_USEORIGDIR, - "Button",BS_AUTORADIOBUTTON,24,78,105,10 + "Button",BS_AUTORADIOBUTTON,28,83,105,10 END IDD_EDIT_GOTO DIALOGEX 0, 0, 129, 89 @@ -1968,9 +1971,11 @@ IDD_OPTIONS_PLAYER, DIALOG BEGIN + RIGHTMARGIN, 266 VERTGUIDE, 50 VERTGUIDE, 169 VERTGUIDE, 256 + BOTTOMMARGIN, 278 END IDD_WAVECONVERT, DIALOG @@ -1980,20 +1985,21 @@ IDD_OPTIONS_KEYBOARD, DIALOG BEGIN - RIGHTMARGIN, 260 + RIGHTMARGIN, 266 TOPMARGIN, 5 - BOTTOMMARGIN, 274 + BOTTOMMARGIN, 275 END IDD_OPTIONS_COLORS, DIALOG BEGIN - RIGHTMARGIN, 240 - BOTTOMMARGIN, 198 + RIGHTMARGIN, 247 + BOTTOMMARGIN, 151 END IDD_MIDISETUP, DIALOG BEGIN - BOTTOMMARGIN, 188 + RIGHTMARGIN, 240 + BOTTOMMARGIN, 278 END IDD_CONTROL_COMMENTS, DIALOG @@ -2074,14 +2080,14 @@ IDD_OPTIONS_GENERAL, DIALOG BEGIN - RIGHTMARGIN, 259 - BOTTOMMARGIN, 275 + RIGHTMARGIN, 266 + BOTTOMMARGIN, 276 END IDD_OPTIONS_SOUNDCARD, DIALOG BEGIN - RIGHTMARGIN, 240 - BOTTOMMARGIN, 177 + RIGHTMARGIN, 246 + BOTTOMMARGIN, 179 END IDD_MIDIMACRO, DIALOG @@ -2160,8 +2166,8 @@ IDD_OPTIONS_AUTOSAVE, DIALOG BEGIN - RIGHTMARGIN, 259 - BOTTOMMARGIN, 275 + RIGHTMARGIN, 266 + BOTTOMMARGIN, 276 END IDD_EDIT_GOTO, DIALOG Modified: trunk/OpenMPT/mptrack/pattern.h =================================================================== --- trunk/OpenMPT/mptrack/pattern.h 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/pattern.h 2009-01-10 07:52:25 UTC (rev 243) @@ -36,6 +36,9 @@ 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());} + CHANNELINDEX GetNumChannels() const; bool Resize(const ROWINDEX newRowCount, const bool showDataLossWarning = true); Modified: trunk/OpenMPT/mptrack/patternContainer.h =================================================================== --- trunk/OpenMPT/mptrack/patternContainer.h 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/patternContainer.h 2009-01-10 07:52:25 UTC (rev 243) @@ -51,6 +51,9 @@ //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); Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/mptrack/resource.h 2009-01-10 07:52:25 UTC (rev 243) @@ -931,7 +931,6 @@ #define ID_PATTERNPASTE 32875 #define ID_NETLINK_MODPLUG 32876 #define ID_NETLINK_UT 32877 -#define ID_NETLINK_TRAXINSPACE 32878 #define ID_NETLINK_OSMUSIC 32878 #define ID_NETLINK_HANDBOOK 32879 #define ID_SAMPLE_TRIM 32880 @@ -1047,6 +1046,8 @@ #define ID_ENVELOPE_SCALEPOINTS 59208 #define ID_NETLINK_OPENMPTWIKI 59210 #define ID_VIEW_MIDIMAPPING 59211 +#define ID_NETLINK_OPENMPTWIKI_GERMAN 59213 +#define ID_NETLINK_MODARCHIVE 59214 // Next default values for new objects // @@ -1054,7 +1055,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 516 -#define _APS_NEXT_COMMAND_VALUE 59212 +#define _APS_NEXT_COMMAND_VALUE 59215 #define _APS_NEXT_CONTROL_VALUE 2340 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/soundlib/midi.h =================================================================== --- trunk/OpenMPT/soundlib/midi.h 2009-01-04 10:29:46 UTC (rev 242) +++ trunk/OpenMPT/soundlib/midi.h 2009-01-10 07:52:25 UTC (rev 243) @@ -20,6 +20,7 @@ MIDIEVENT_NOTEON = 0x9, MIDIEVENT_CONTROLLERCHANGE = 0xB, MIDIEVENT_PITCHBEND = 0xE, + MIDISTATUS_ACTIVESENSING = 0xFE }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |