From: <sag...@us...> - 2015-07-10 20:21:31
|
Revision: 5400 http://sourceforge.net/p/modplug/code/5400 Author: saga-games Date: 2015-07-10 20:21:25 +0000 (Fri, 10 Jul 2015) Log Message: ----------- [Imp] Pattern tab: Apply NNA/DNA checks in note preview Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2015-07-10 19:44:42 UTC (rev 5399) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2015-07-10 20:21:25 UTC (rev 5400) @@ -152,10 +152,7 @@ #endif // Fix: save pattern scrollbar position when switching to other tab m_szOldPatternScrollbarsPos = CSize(-10,-10); -// -> CODE#0015 -// -> DESC="channels management dlg" ReinitRecordState(); -// -! NEW_FEATURE#0015 m_ShowSavedialog = false; CMainFrame::UpdateAudioParameters(m_SndFile, true); @@ -372,10 +369,7 @@ m_SndFile.ChangeModTypeTo(m_SndFile.GetBestSaveFormat()); } -// -> CODE#0015 -// -> DESC="channels management dlg" ReinitRecordState(); -// -! NEW_FEATURE#0015 if(TrackerSettings::Instance().rememberSongWindows) DeserializeViews(); @@ -544,10 +538,7 @@ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if (pMainFrm) pMainFrm->StopMod(this); m_SndFile.Destroy(); -// -> CODE#0015 -// -> DESC="channels management dlg" ReinitRecordState(); -// -! NEW_FEATURE#0015 } @@ -1179,7 +1170,6 @@ { CriticalSection cs; - //rewbs.vstiLive if(ins != INSTRUMENTINDEX_INVALID && ins <= m_SndFile.GetNumInstruments() && ModCommand::IsNote(ModCommand::NOTE(note))) { @@ -1204,7 +1194,6 @@ } } } - //end rewbs.vstiLive const FlagSet<ChannelFlags> mask = (fade ? CHN_NOTEFADE : (CHN_NOTEFADE | CHN_KEYOFF)); ModChannel *pChn = &m_SndFile.m_PlayState.Chn[stopChn != CHANNELINDEX_INVALID ? stopChn : m_SndFile.m_nChannels]; @@ -1227,6 +1216,49 @@ } +// Apply DNA/NNA settings for note preview +void CModDoc::CheckNNA(ModCommand::NOTE note, INSTRUMENTINDEX ins, const std::bitset<128> &playingNotes) +//------------------------------------------------------------------------------------------------------ +{ + if(ins > GetNumInstruments() || m_SndFile.Instruments[ins] == nullptr) + { + return; + } + const ModInstrument *pIns = m_SndFile.Instruments[ins]; + for(CHANNELINDEX chn = GetNumChannels(); chn < MAX_CHANNELS; chn++) + { + const ModChannel &channel = m_SndFile.m_PlayState.Chn[chn]; + if(channel.pModInstrument == pIns && channel.nMasterChn == 0 && ModCommand::IsNote(channel.nNote) + && (channel.nLength || pIns->HasValidMIDIChannel()) && !playingNotes[channel.nNote]) + { + CHANNELINDEX nnaChn = m_SndFile.CheckNNA(chn, ins, note, false); + // We need to update this mix channel immediately since new notes may be triggered between ticks, in which case + // ChnMix may not contain the moved channel yet and the past note will stop playing for the rest of this tick! + if(nnaChn != CHANNELINDEX_INVALID) + { + CHANNELINDEX origChnPos = CHANNELINDEX_INVALID; + for(CHANNELINDEX i = 0; i < m_SndFile.m_nMixChannels; i++) + { + if(m_SndFile.m_PlayState.ChnMix[i] == nnaChn) + { + // Nothing to do + origChnPos = CHANNELINDEX_INVALID; + break; + } else if(m_SndFile.m_PlayState.ChnMix[i] == chn) + { + origChnPos = i; + } + } + if(origChnPos != CHANNELINDEX_INVALID) + { + m_SndFile.m_PlayState.ChnMix[origChnPos] = nnaChn; + } + } + } + } +} + + // Check if a given note of an instrument or sample is playing. // If note == 0, just check if an instrument or sample is playing. bool CModDoc::IsNotePlaying(UINT note, SAMPLEINDEX nsmp, INSTRUMENTINDEX nins) @@ -1321,8 +1353,7 @@ return true; } -// -> CODE#0012 -// -> DESC="midi keyboard split" + bool CModDoc::IsChannelSolo(CHANNELINDEX nChn) const //-------------------------------------------------- { @@ -1338,11 +1369,8 @@ m_SndFile.ChnSettings[nChn].dwFlags.set(CHN_SOLO, bSolo); return true; } -// -! NEW_FEATURE#0012 -// -> CODE#0015 -// -> DESC="channels management dlg" bool CModDoc::IsChannelNoFx(CHANNELINDEX nChn) const //-------------------------------------------------- { @@ -1423,7 +1451,6 @@ m_bsMultiSplitRecordMask.set(); } } -// -! NEW_FEATURE#0015 bool CModDoc::MuteSample(SAMPLEINDEX nSample, bool bMute) Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2015-07-10 19:44:42 UTC (rev 5399) +++ trunk/OpenMPT/mptrack/Moddoc.h 2015-07-10 20:21:25 UTC (rev 5400) @@ -211,6 +211,7 @@ void ProcessMIDI(uint32 midiData, INSTRUMENTINDEX ins, IMixPlugin *plugin, InputTargetContext ctx); CHANNELINDEX PlayNote(UINT note, INSTRUMENTINDEX nins, SAMPLEINDEX nsmp, bool pause, LONG nVol=-1, SmpLength loopStart = 0, SmpLength loopEnd = 0, CHANNELINDEX nCurrentChn = CHANNELINDEX_INVALID, const SmpLength sampleOffset = 0); bool NoteOff(UINT note, bool fade = false, INSTRUMENTINDEX ins = INSTRUMENTINDEX_INVALID, CHANNELINDEX currentChn = CHANNELINDEX_INVALID, CHANNELINDEX stopChn = CHANNELINDEX_INVALID); //rewbs.vstiLive: add params + void CheckNNA(ModCommand::NOTE note, INSTRUMENTINDEX ins, const std::bitset<128> &playingNotes); bool IsNotePlaying(UINT note, SAMPLEINDEX nsmp = 0, INSTRUMENTINDEX nins = 0); bool MuteChannel(CHANNELINDEX nChn, bool bMute); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2015-07-10 19:44:42 UTC (rev 5399) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2015-07-10 20:21:25 UTC (rev 5400) @@ -1955,38 +1955,7 @@ pMainFrm->PlayMod(pModDoc); } CriticalSection cs; - // Apply NNA/DNA - for(CHANNELINDEX chn = sndFile.GetNumChannels(); chn < MAX_CHANNELS; chn++) - { - const ModChannel &channel = sndFile.m_PlayState.Chn[chn]; - if(channel.pModInstrument == pIns && channel.nMasterChn == 0 && ModCommand::IsNote(channel.nNote) - && (channel.nLength || pIns->HasValidMIDIChannel()) && !m_baPlayingNote[channel.nNote]) - { - CHANNELINDEX nnaChn = sndFile.CheckNNA(chn, m_nInstrument, note, false); - // We need to update this mix channel immediately since new notes may be triggered between ticks, in which case - // ChnMix may not contain the moved channel yet and the past note will stop playing for the rest of this tick! - if(nnaChn != CHANNELINDEX_INVALID) - { - CHANNELINDEX origChnPos = CHANNELINDEX_INVALID; - for(CHANNELINDEX i = 0; i < sndFile.m_nMixChannels; i++) - { - if(sndFile.m_PlayState.ChnMix[i] == nnaChn) - { - // Nothing to do - origChnPos = CHANNELINDEX_INVALID; - break; - } else if(sndFile.m_PlayState.ChnMix[i] == chn) - { - origChnPos = i; - } - } - if(origChnPos != CHANNELINDEX_INVALID) - { - sndFile.m_PlayState.ChnMix[origChnPos] = nnaChn; - } - } - } - } + pModDoc->CheckNNA(note, m_nInstrument, m_baPlayingNote); m_baPlayingNote[note] = true; pModDoc->PlayNote(note, m_nInstrument, 0, false); } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2015-07-10 19:44:42 UTC (rev 5399) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2015-07-10 20:21:25 UTC (rev 5400) @@ -3809,6 +3809,7 @@ if(pnotify->type[Notification::Stop]) { + m_baPlayingNote.reset(); MemsetZero(ChnVUMeters); // Also zero all non-visible VU meters if((m_Status & (psFollowSong | psDragActive)) == psFollowSong) { @@ -5018,11 +5019,13 @@ for(int i = 0; i < numNotes; i++) { pModDoc->NoteOff(notes[i], true, static_cast<INSTRUMENTINDEX>(ins), GetCurrentChannel(), playWholeRow ? chordPatternChannels[i] : CHANNELINDEX_INVALID); + m_baPlayingNote.reset(notes[i]); noteChannels[i] = chordPatternChannels[i]; } prevChordNote = NOTE_NONE; } else { + m_baPlayingNote.reset(note); pModDoc->NoteOff(note, ((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_NOTEFADE) || sndFile.GetNumInstruments() == 0), static_cast<INSTRUMENTINDEX>(ins), nChnCursor, playWholeRow ? nChn : CHANNELINDEX_INVALID); } } @@ -5452,6 +5455,8 @@ } } bool isPlaying = ((pMainFrm->GetModPlaying() == pModDoc) && (pMainFrm->IsPlaying())); + pModDoc->CheckNNA(newcmd.note, nPlayIns, m_baPlayingNote); + m_baPlayingNote.set(newcmd.note); pModDoc->PlayNote(newcmd.note, nPlayIns, 0, !isPlaying, 4 * vol, 0, 0, nChn); } } @@ -5727,6 +5732,8 @@ const bool isPlaying = pMainFrm->GetModPlaying() == pModDoc && pMainFrm->IsPlaying(); for(int i = 0; i < numNotes; i++) { + pModDoc->CheckNNA(note, nPlayIns, m_baPlayingNote); + m_baPlayingNote.set(note); pModDoc->PlayNote(chordNotes[i], nPlayIns, 0, !isPlaying && i == 0, -1, 0, 0, chn); } } Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2015-07-10 19:44:42 UTC (rev 5399) +++ trunk/OpenMPT/mptrack/View_pat.h 2015-07-10 20:21:25 UTC (rev 5400) @@ -204,6 +204,7 @@ WORD ChnVUMeters[MAX_BASECHANNELS]; WORD OldVUMeters[MAX_BASECHANNELS]; + std::bitset<128> m_baPlayingNote; ModCommand::NOTE octaveKeyMemory[10]; ModCommand::NOTE previousNote[MAX_BASECHANNELS]; BYTE activeNoteChannel[NOTE_MAX + NOTE_MIN]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |