From: <sag...@us...> - 2011-10-05 16:48:21
|
Revision: 1084 http://modplug.svn.sourceforge.net/modplug/?rev=1084&view=rev Author: saga-games Date: 2011-10-05 16:48:14 +0000 (Wed, 05 Oct 2011) Log Message: ----------- [Mod] Some compatibility mode settings are now also applied in "normal" mode. Pattern / Sample / Instrument settings in tunes made with older versions of MPT are now fixed while such files are loaded so that the old behaviour is still used for them. Settings that are now always handled as they were previously handled in compatible mode only are: Instrument PPS depth, SC0 / SD0 handling in IT / MPTM files, Autovibrato Sweep = 0 (IT / MPTM), Out-of-range Global Volume. For the latter, compatibility with older versions of MPT is actually improved, because compatible playback is always enabled for S3M files, but the fix is also applied for S3M files made with MPT 1.16. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-04 14:34:04 UTC (rev 1083) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-05 16:48:14 UTC (rev 1084) @@ -1386,24 +1386,24 @@ bool CModDoc::IsChannelMuted(CHANNELINDEX nChn) const //--------------------------------------------------- { - if (nChn >= m_SndFile.m_nChannels) return true; - return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_MUTE) ? true : false; + if (nChn >= m_SndFile.GetNumChannels()) return true; + return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_MUTE) != 0; } bool CModDoc::IsSampleMuted(SAMPLEINDEX nSample) const //---------------------------------------------------- { - if ((!nSample) || (nSample > m_SndFile.m_nSamples)) return false; - return (m_SndFile.GetSample(nSample).uFlags & CHN_MUTE) ? true : false; + if ((!nSample) || (nSample > m_SndFile.GetNumSamples())) return false; + return (m_SndFile.GetSample(nSample).uFlags & CHN_MUTE) != 0; } bool CModDoc::IsInstrumentMuted(INSTRUMENTINDEX nInstr) const //----------------------------------------------------------- { - if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false; - return (m_SndFile.Instruments[nInstr]->dwFlags & INS_MUTE) ? true : false; + if ((!nInstr) || (nInstr > m_SndFile.GetNumInstruments()) || (!m_SndFile.Instruments[nInstr])) return false; + return (m_SndFile.Instruments[nInstr]->dwFlags & INS_MUTE) != 0; } @@ -1425,20 +1425,19 @@ } -BOOL CModDoc::IsChildSample(UINT nIns, UINT nSmp) const -//----------------------------------------------------- +bool CModDoc::IsChildSample(INSTRUMENTINDEX nIns, SAMPLEINDEX nSmp) const +//----------------------------------------------------------------------- { - MODINSTRUMENT *pIns; - if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments)) return FALSE; - pIns = m_SndFile.Instruments[nIns]; - if (pIns) + if((nIns < 1) || (nIns > m_SndFile.GetNumInstruments())) return false; + MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns]; + if(pIns != nullptr) { - for (UINT i=0; i<NOTE_MAX; i++) + for(UINT i = 0; i < NOTE_MAX; i++) { - if (pIns->Keyboard[i] == nSmp) return TRUE; + if(pIns->Keyboard[i] == nSmp) return true; } } - return FALSE; + return false; } @@ -2970,7 +2969,7 @@ case 0xC0: // note cut case 0xD0: // note delay //IT compatibility 22. SD0 == SD1, SC0 == SC1 - if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && m_SndFile.IsCompatibleMode(TRK_IMPULSETRACKER))) + if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && (m_SndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)))) strcpy(s, "1 tick"); else strcat(s, " ticks"); Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2011-10-04 14:34:04 UTC (rev 1083) +++ trunk/OpenMPT/mptrack/Moddoc.h 2011-10-05 16:48:14 UTC (rev 1084) @@ -331,7 +331,7 @@ CHANNELINDEX GetNumChannels() const { return m_SndFile.m_nChannels; } UINT GetPatternSize(PATTERNINDEX nPat) const; BOOL AdjustEndOfSample(UINT nSample); - BOOL IsChildSample(UINT nIns, UINT nSmp) const; + bool IsChildSample(INSTRUMENTINDEX nIns, SAMPLEINDEX nSmp) const; UINT FindSampleParent(UINT nSmp) const; UINT FindInstrumentChild(UINT nIns) const; bool MoveOrder(ORDERINDEX nSourceNdx, ORDERINDEX nDestNdx, bool bUpdate = true, bool bCopy = false, SEQUENCEINDEX nSourceSeq = SEQUENCEINDEX_INVALID, SEQUENCEINDEX nDestSeq = SEQUENCEINDEX_INVALID); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2011-10-04 14:34:04 UTC (rev 1083) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2011-10-05 16:48:14 UTC (rev 1084) @@ -1009,10 +1009,6 @@ pSmp->nVibRate = pis->vis; pSmp->nVibDepth = pis->vid & 0x7F; pSmp->nVibSweep = pis->vir; //(pis->vir + 3) / 4; - if(pSmp->nVibSweep == 0 && (pSmp->nVibDepth || pSmp->nVibRate) && m_dwLastSavedWithVersion && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 02)) - { - pSmp->nVibSweep = 255; // Let's correct this little stupid mistake in history. - } if(pis->samplepointer) lastSampleOffset = pis->samplepointer; // MPTX hack @@ -1468,7 +1464,7 @@ memset(header.chnpan, 0xA0, 64); memset(header.chnvol, 64, 64); - for (size_t ich = 0; ich < min(m_nChannels, 64); ich++) // Header only has room for settings for 64 chans... + for (CHANNELINDEX ich = 0; ich < min(m_nChannels, 64); ich++) // Header only has room for settings for 64 chans... { header.chnpan[ich] = ChnSettings[ich].nPan >> 2; if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-04 14:34:04 UTC (rev 1083) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-05 16:48:14 UTC (rev 1084) @@ -353,15 +353,9 @@ // } if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; - if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_SCREAMTRACKER)) + // IT compatibility 16. FT2, ST3 and IT ignore out-of-range values + if (param <= 128) { - //IT compatibility 16. FT2, ST3 and IT ignore out-of-range values - if (param <= 128) - nGlbVol = param << 1; - } - else - { - if (param > 128) param = 128; nGlbVol = param << 1; } break; @@ -1393,7 +1387,7 @@ if(nStartTick == 0) { //IT compatibility 22. SD0 == SD1 - if(IsCompatibleMode(TRK_IMPULSETRACKER)) + if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) nStartTick = 1; //ST3 ignores notes with SD0 completely else if(GetType() == MOD_TYPE_S3M) @@ -3665,7 +3659,7 @@ if(nTick == 0) { //IT compatibility 22. SC0 == SC1 - if(IsCompatibleMode(TRK_IMPULSETRACKER)) + if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) nTick = 1; // ST3 doesn't cut notes with SC0 else if(GetType() == MOD_TYPE_S3M) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-04 14:34:04 UTC (rev 1083) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-05 16:48:14 UTC (rev 1084) @@ -2882,25 +2882,6 @@ } -void FixMIDIConfigString(char *line) -//---------------------------------- -{ - for(size_t i = 0; i < MACRO_LENGTH; i++) - { - if(line[i] >= 'a' && line[i] <= 'f') // both A-F and a-f were treated as hex constants - { - line[i] = line[i] - 'a' + 'A'; - } else if(line[i] == 'K' || line[i] == 'k') // channel was K or k - { - line[i] = 'c'; - } else if(line[i] == 'X' || line[i] == 'x' || line[i] == 'Y' || line[i] == 'y') // those were pointless - { - line[i] = 'z'; - } - } -} - - // For old files made with MPT that don't have m_dwSongFlags set yet, set the flags appropriately. void CSoundFile::UpgradeModFlags() //-------------------------------- @@ -2931,23 +2912,106 @@ } +struct UpgradePatternData +//======================= +{ + UpgradePatternData(CSoundFile *pSndFile) + { + this->pSndFile = pSndFile; + } + + void operator()(MODCOMMAND& m) + { + if(pSndFile->m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 02) || + (!pSndFile->IsCompatibleMode(TRK_ALLTRACKERS) && pSndFile->m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 20, 00, 00))) + { + if(m.command == CMD_GLOBALVOLUME) + { + // Out-of-range global volume commands should be ignored. + // OpenMPT 1.17.03.02 fixed this in compatible mode, OpenMPT 1.20 fixes it in normal mode as well. + // So for tracks made with older versions than OpenMPT 1.17.03.02 or tracks made with 1.17.03.02 <= version < 1.20, we limit invalid global volume commands. + LimitMax(m.param, (pSndFile->GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? BYTE(128): BYTE(64)); + } else if(m.command == CMD_S3MCMDEX && (pSndFile->GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) + { + // SC0 and SD0 should be interpreted as SC1 and SD1 in IT files. + // OpenMPT 1.17.03.02 fixed this in compatible mode, OpenMPT 1.20 fixes it in normal mode as well. + if(m.param == 0xC0) + { + m.command = CMD_NONE; + m.volcmd = VOLCMD_VOLUME; + m.vol = 0; + } else if(m.param == 0xD0) + { + m.command = CMD_NONE; + } + } + } + + } + + CSoundFile *pSndFile; +}; + + void CSoundFile::UpgradeSong() //---------------------------- { if(m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 20, 00, 00)) { - // Previously, volume swing values ranged from 0 to 64. They should reach from 0 to 100 instead. for(INSTRUMENTINDEX i = 1; i <= GetNumInstruments(); i++) if(Instruments[i] != nullptr) { + // Previously, volume swing values ranged from 0 to 64. They should reach from 0 to 100 instead. Instruments[i]->nVolSwing = min(Instruments[i]->nVolSwing * 100 / 64, 100); + + if(!IsCompatibleMode(TRK_IMPULSETRACKER) || m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 18, 00, 00)) + { + // Previously, Pitch/Pan Separation was only half depth. + // This was corrected in compatible mode in OpenMPT 1.18, and in OpenMPT 1.20 it is corrected in normal mode as well. + Instruments[i]->nPPS = (Instruments[i]->nPPS + (Instruments[i]->nPPS >= 0 ? 1 : -1)) / 2; + } } + if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 02) || !IsCompatibleMode(TRK_IMPULSETRACKER))) + { + // In the IT format, a sweep value of 0 shouldn't apply vibrato at all. Previously, a value of 0 was treated as "no sweep". + // In OpenMPT 1.17.03.02, this was corrected in compatible mode, in OpenMPT 1.20 it is corrected in normal mode as well, + // so we have to fix the setting while loading. + for(SAMPLEINDEX i = 1; i <= GetNumSamples(); i++) + { + if(Samples[i].nVibSweep == 0 && (Samples[i].nVibDepth | Samples[i].nVibRate)) + { + Samples[i].nVibSweep = 255; + } + } + } + // Fix old nasty broken (non-standard) MIDI configs in files. FixMIDIConfigStrings(m_MidiCfg); } + + Patterns.ForEachModCommand(UpgradePatternData(this)); } +void FixMIDIConfigString(char *line) +//---------------------------------- +{ + for(size_t i = 0; i < MACRO_LENGTH; i++) + { + if(line[i] >= 'a' && line[i] <= 'f') // both A-F and a-f were treated as hex constants + { + line[i] = line[i] - 'a' + 'A'; + } else if(line[i] == 'K' || line[i] == 'k') // channel was K or k + { + line[i] = 'c'; + } else if(line[i] == 'X' || line[i] == 'x' || line[i] == 'Y' || line[i] == 'y') // those were pointless + { + line[i] = 'z'; + } + } +} + + // Fix old-format (not conforming to IT's MIDI macro definitions) MIDI config strings. void CSoundFile::FixMIDIConfigStrings(MODMIDICFG &midiCfg) //-------------------------------------------------------- Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2011-10-04 14:34:04 UTC (rev 1083) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2011-10-05 16:48:14 UTC (rev 1084) @@ -1180,7 +1180,7 @@ int envpitchdest = (((int)pIns->PitchEnv.Values[pt]) - 32) * 8; envpitch += ((envpos - x1) * (envpitchdest - envpitch)) / (x2 - x1); } - envpitch = CLAMP(envpitch, -256, 256); + Limit(envpitch, -256, 256); //if (pIns->PitchEnv.dwFlags & ENV_FILTER) if (pChn->PitchEnv.flags & ENV_FILTER) @@ -1363,9 +1363,8 @@ { // PPS value is 1/512, i.e. PPS=1 will adjust by 8/512 = 1/64 for each 8 semitones // with PPS = 32 / PPC = C-5, E-6 will pan hard right (and D#6 will not) - // IT compatibility: IT has a wider pan range here - int pandelta = (int)pChn->nRealPan + (int)((int)(pChn->nNote - pIns->nPPC - 1) * (int)pIns->nPPS) / (int)(IsCompatibleMode(TRK_IMPULSETRACKER) ? 4 : 8); - pChn->nRealPan = CLAMP(pandelta, 0, 256); + int pandelta = (int)pChn->nRealPan + (int)((int)(pChn->nNote - pIns->nPPC - 1) * (int)pIns->nPPS) / 4; + pChn->nRealPan = Clamp(pandelta, 0, 256); } } @@ -1688,13 +1687,13 @@ } else { // MPT's autovibrato code - if (pSmp->nVibSweep == 0) + if (pSmp->nVibSweep == 0 && !(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) { pChn->nAutoVibDepth = pSmp->nVibDepth << 8; } else { // Calculate current autovibrato depth using vibsweep - if (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) + if (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) { // Note: changed bitshift from 3 to 1 as the variable is not divided by 4 in the IT loader anymore // - so we divide sweep by 4 here. @@ -1906,26 +1905,9 @@ m_nSamplesPerTick = m_nBufferCount; //rewbs.flu -// robinf: this block causes envelopes to behave incorrectly when -// playback is triggered from instrument panel. -// I can't see why it would be useful. Dissabling for now. -// -// if (m_dwSongFlags & SONG_PAUSED) { -// m_nBufferCount = gdwMixingFreq / 64; // 1/64 seconds -// } - - // Master Volume + Pre-Amplification / Attenuation setup DWORD nMasterVol; { - /*int nchn32 = 0; - MODCHANNEL *pChn = Chn; - for (CHANNELINDEX nChn=0; nChn<m_nChannels; nChn++,pChn++) - { - //if(!(pChn->dwFlags & CHN_MUTE)) //removed by rewbs: fix http://www.modplug.com/forum/viewtopic.php?t=3358 - nchn32++; - } - nchn32 = CLAMP(nchn32, 1, 31);*/ int nchn32 = CLAMP(m_nChannels, 1, 31); DWORD mastervol; @@ -1960,6 +1942,7 @@ nMasterVol = mastervol; } } + //////////////////////////////////////////////////////////////////////////////////// // Update channels data m_nMixChannels = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-05 17:20:05
|
Revision: 1085 http://modplug.svn.sourceforge.net/modplug/?rev=1085&view=rev Author: saga-games Date: 2011-10-05 17:19:58 +0000 (Wed, 05 Oct 2011) Log Message: ----------- [Fix] Sample Editor: Sometimes, the correct sample was not displayed after switching from another tab. [Imp] Mod Conversion: Instrument numbers next to Note-Offs are now removed when converting to XM. [Mod] XM portamento vs. offset priority is not a compatibility setting anymore. Tracks made with older versions of MPT are fixed during loading. [Fix] Sustain loop after normal loop behaviour in samples was still not quite correct. [Mod] OpenMPT: Version is now 1.20.00.37 Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/modcommand.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-10-05 16:48:14 UTC (rev 1084) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-10-05 17:19:58 UTC (rev 1085) @@ -369,9 +369,9 @@ if (lParam < 0) { int nIns = m_pParent->GetInstrumentChange(); - if (pSndFile->m_nInstruments) + if (pSndFile->GetNumInstruments()) { - if ((nIns > 0) && (!pModDoc->IsChildSample(m_nSample, nIns))) + if ((nIns > 0) && (!pModDoc->IsChildSample(nIns, m_nSample))) { UINT k = pModDoc->FindInstrumentChild(nIns); if (k > 0) lParam = k; @@ -384,7 +384,7 @@ } else if (lParam > 0) { - if (pSndFile->m_nInstruments) + if (pSndFile->GetNumInstruments()) { UINT k = m_pParent->GetInstrumentChange(); if (!pModDoc->IsChildSample(k, lParam)) Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-05 16:48:14 UTC (rev 1084) +++ trunk/OpenMPT/mptrack/version.h 2011-10-05 17:19:58 UTC (rev 1085) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 36 +#define VER_MINORMINOR 37 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-05 16:48:14 UTC (rev 1084) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-05 17:19:58 UTC (rev 1085) @@ -1437,9 +1437,9 @@ bool retrigEnv = (!note) && (instr); // Now it's time for some FT2 crap... - if (GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2)) + if (GetType() & (MOD_TYPE_XM | MOD_TYPE_MT2)) { - if(IsCompatibleMode(TRK_FASTTRACKER2) && instr) + if(IsCompatibleMode(TRK_FASTTRACKER2) && instr != 0) { // Apparently, any note number in a pattern causes instruments to retrigger - no matter if there's a Note Off next to it or whatever. // Test cases: keyoff+instr.xm, delay.xm @@ -1454,7 +1454,7 @@ } // XM: Key-Off + Sample == Note Cut (BUT: Only if no instr number or volume effect is present!) - if ((note == NOTE_KEYOFF) && ((!instr && !vol && cmd != CMD_VOLUME) || !IsCompatibleMode(TRK_FASTTRACKER2)) && ((!pChn->pModInstrument) || (!(pChn->pModInstrument->VolEnv.dwFlags & ENV_ENABLED)))) + if ((note == NOTE_KEYOFF) && ((!instr && volcmd == VOLCMD_NONE && cmd != CMD_VOLUME) || !IsCompatibleMode(TRK_FASTTRACKER2)) && ((!pChn->pModInstrument) || (!(pChn->pModInstrument->VolEnv.dwFlags & ENV_ENABLED)))) { pChn->dwFlags |= CHN_FASTVOLRAMP; pChn->nVolume = 0; @@ -3421,7 +3421,8 @@ if(m_nRow < Patterns[m_nPattern].GetNumRows()-1) m = Patterns[m_nPattern] + (m_nRow+1) * m_nChannels + nChn; - if(m && m->command == CMD_XPARAM){ + if(m && m->command == CMD_XPARAM) + { UINT tmp = m->param; m = NULL; if(m_nRow < Patterns[m_nPattern].GetNumRows()-2) m = Patterns[m_nPattern] + (m_nRow+2) * m_nChannels + nChn; @@ -3429,7 +3430,8 @@ if(m && m->command == CMD_XPARAM) param = (param<<16) + (tmp<<8) + m->param; else param = (param<<8) + tmp; } - else{ + else + { if (param) pChn->nOldOffset = param; else param = pChn->nOldOffset; param <<= 8; param |= (UINT)(pChn->nOldHiOffset) << 16; @@ -3439,7 +3441,7 @@ if ((pChn->rowCommand.note >= NOTE_MIN) && (pChn->rowCommand.note <= NOTE_MAX)) { // XM compatibility: Portamento + Offset = Ignore offset - if(bPorta && IsCompatibleMode(TRK_FASTTRACKER2)) + if(bPorta && GetType() == MOD_TYPE_XM) { return; } @@ -3725,7 +3727,7 @@ if (pChn->nLength > pChn->nLoopEnd) pChn->nLength = pChn->nLoopEnd; if(pChn->nPos > pChn->nLength) { - pChn->nPos = pChn->nLength; + pChn->nPos = pChn->nPos - pChn->nLength + pChn->nLoopStart; pChn->nPosLo = 0; } } else Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-05 16:48:14 UTC (rev 1084) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-05 17:19:58 UTC (rev 1085) @@ -2946,7 +2946,21 @@ } } } - + + if(pSndFile->GetType() == MOD_TYPE_XM) + { + if(pSndFile->m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 19, 00, 00) || + (!pSndFile->IsCompatibleMode(TRK_FASTTRACKER2) && pSndFile->m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 20, 00, 00))) + { + if(m.command == CMD_OFFSET && m.volcmd == VOLCMD_TONEPORTAMENTO) + { + // If there are both a portamento and an offset effect, the portamento should be preferred in XM files. + // OpenMPT 1.19 fixed this in compatible mode, OpenMPT 1.20 fixes it in normal mode as well. + m.command = CMD_NONE; + } + } + } + } CSoundFile *pSndFile; Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-05 16:48:14 UTC (rev 1084) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-05 17:19:58 UTC (rev 1085) @@ -597,6 +597,12 @@ m->command = m->param = 0; } + // Instrument numbers next to Key-Off reset instrument settings + if(m->note >= NOTE_MIN_SPECIAL) + { + m->instr = 0; + } + if(!m->command) switch(m->volcmd) { case VOLCMD_PORTADOWN: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-05 22:06:04
|
Revision: 1090 http://modplug.svn.sourceforge.net/modplug/?rev=1090&view=rev Author: saga-games Date: 2011-10-05 22:05:57 +0000 (Wed, 05 Oct 2011) Log Message: ----------- [Mod] Resonant filter mixing is now done with floating point precision. This (and a few small changes) Make IT-compatible Filters nearly perfect now, and it also fixes the old problem of bursting filter sounds when changing cutoff very fast. There's a sacrifice, though: MMX-accelerated sample mixing couldn't be updated to work with the new filter code, and somehow mixing the non-optimized filtered sample mixing with optimized unfiltered sample mixing broke even more things. So for now (or forever), MMX-accelerated sample mixing is gone. [Mod] OpenMPT: Version is now 1.20.00.38 Modified Paths: -------------- trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Mmx_mix.cpp trunk/OpenMPT/soundlib/Snd_flt.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-05 21:40:31 UTC (rev 1089) +++ trunk/OpenMPT/mptrack/version.h 2011-10-05 22:05:57 UTC (rev 1090) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 37 +#define VER_MINORMINOR 38 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2011-10-05 21:40:31 UTC (rev 1089) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2011-10-05 22:05:57 UTC (rev 1090) @@ -337,42 +337,48 @@ /////////////////////////////////////////////////// // Resonant Filters +// Filter values are clipped to double the input range (assuming input is 16-Bit, which it currently is) +#define ClipFilter(x) Clamp(x, 2.0f * (float)int16_min, 2.0f * (float)int16_max) + // Mono #define MIX_BEGIN_FILTER\ - int fy1 = pChannel->nFilter_Y1;\ - int fy2 = pChannel->nFilter_Y2;\ + float fy1 = pChannel->nFilter_Y1;\ + float fy2 = pChannel->nFilter_Y2; #define MIX_END_FILTER\ pChannel->nFilter_Y1 = fy1;\ pChannel->nFilter_Y2 = fy2; #define SNDMIX_PROCESSFILTER\ - int fy = (vol * pChn->nFilter_A0 + fy1 * pChn->nFilter_B0 + fy2 * pChn->nFilter_B1 + 4096) >> 13;\ + float fy = ((float)vol * pChn->nFilter_A0 + ClipFilter(fy1) * pChn->nFilter_B0 + ClipFilter(fy2) * pChn->nFilter_B1);\ fy2 = fy1;\ - fy1 = fy - (vol & pChn->nFilter_HP);\ - vol = fy;\ + fy1 = fy + (float)(vol * pChn->nFilter_HP);\ + Limit(fy, (float)int32_min, (float)int32_max);\ + vol = (int)fy; // Stereo #define MIX_BEGIN_STEREO_FILTER\ - int fy1 = pChannel->nFilter_Y1;\ - int fy2 = pChannel->nFilter_Y2;\ - int fy3 = pChannel->nFilter_Y3;\ - int fy4 = pChannel->nFilter_Y4;\ + float fy1 = pChannel->nFilter_Y1;\ + float fy2 = pChannel->nFilter_Y2;\ + float fy3 = pChannel->nFilter_Y3;\ + float fy4 = pChannel->nFilter_Y4; #define MIX_END_STEREO_FILTER\ pChannel->nFilter_Y1 = fy1;\ pChannel->nFilter_Y2 = fy2;\ pChannel->nFilter_Y3 = fy3;\ - pChannel->nFilter_Y4 = fy4;\ + pChannel->nFilter_Y4 = fy4; #define SNDMIX_PROCESSSTEREOFILTER\ - int fy = (vol_l * pChn->nFilter_A0 + fy1 * pChn->nFilter_B0 + fy2 * pChn->nFilter_B1 + 4096) >> 13;\ - fy2 = fy1; fy1 = fy - (vol_l & pChn->nFilter_HP);\ - vol_l = fy;\ - fy = (vol_r * pChn->nFilter_A0 + fy3 * pChn->nFilter_B0 + fy4 * pChn->nFilter_B1 + 4096) >> 13;\ - fy4 = fy3; fy3 = fy - (vol_r & pChn->nFilter_HP);\ - vol_r = fy;\ + float fy = ((float)vol_l * pChn->nFilter_A0 + ClipFilter(fy1) * pChn->nFilter_B0 + ClipFilter(fy2) * pChn->nFilter_B1);\ + fy2 = fy1; fy1 = fy + (float)(vol_l * pChn->nFilter_HP);\ + Limit(fy, (float)int32_min, (float)int32_max);\ + vol_l = (int)fy;\ + fy = ((float)vol_r * pChn->nFilter_A0 + ClipFilter(fy3) * pChn->nFilter_B0 + ClipFilter(fy4) * pChn->nFilter_B1);\ + fy4 = fy3; fy3 = fy + (float)(vol_r * pChn->nFilter_HP);\ + Limit(fy, (float)int32_min, (float)int32_max);\ + vol_r = (int)fy; ////////////////////////////////////////////////////////// @@ -482,24 +488,6 @@ #ifdef ENABLE_MMX extern VOID MMX_EndMix(); -extern VOID MMX_Mono8BitMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono16BitMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono8BitLinearMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono16BitLinearMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono8BitHQMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono16BitHQMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono8BitKaiserMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono16BitKaiserMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono8BitKaiserRampMix(MODCHANNEL *, int *, int *); -extern VOID MMX_Mono16BitKaiserRampMix(MODCHANNEL *, int *, int *); -extern VOID MMX_FilterMono8BitLinearRampMix(MODCHANNEL *, int *, int *); -extern VOID MMX_FilterMono16BitLinearRampMix(MODCHANNEL *, int *, int *); -#define MMX_FilterMono8BitMix MMX_FilterMono8BitLinearRampMix -#define MMX_FilterMono16BitMix MMX_FilterMono16BitLinearRampMix -#define MMX_FilterMono8BitRampMix MMX_FilterMono8BitLinearRampMix -#define MMX_FilterMono16BitRampMix MMX_FilterMono16BitLinearRampMix -#define MMX_FilterMono8BitLinearMix MMX_FilterMono8BitLinearRampMix -#define MMX_FilterMono16BitLinearMix MMX_FilterMono16BitLinearRampMix #endif @@ -1250,7 +1238,7 @@ #define FilterMono16BitHQRampMix Mono16BitHQRampMix #define FilterMono8BitKaiserRampMix Mono8BitKaiserRampMix #define FilterMono16BitKaiserRampMix Mono16BitKaiserRampMix -#define FilterMono8BitFIRFilterRampMix Mono8BitFIRFilterRampMix +#define FilterMono8BitFIRFilterRampMix Mono8BitFIRFilterRampMix #define FilterMono16BitFIRFilterRampMix Mono16BitFIRFilterRampMix // -! BEHAVIOUR_CHANGE#0025 @@ -1374,55 +1362,6 @@ }; -#ifdef ENABLE_MMX -//const LPMIXINTERFACE gpMMXFunctionTable[4*16] = -const LPMIXINTERFACE gpMMXFunctionTable[5*16] = //rewbs.resamplerConf: increased to 5 to cope with FIR -{ - // No SRC - MMX_Mono8BitMix, MMX_Mono16BitMix, Stereo8BitMix, Stereo16BitMix, - Mono8BitRampMix, Mono16BitRampMix, Stereo8BitRampMix, Stereo16BitRampMix, - // No SRC, Filter - MMX_FilterMono8BitMix, MMX_FilterMono16BitMix, FilterStereo8BitMix, FilterStereo16BitMix, - MMX_FilterMono8BitRampMix, MMX_FilterMono16BitRampMix, FilterStereo8BitRampMix,FilterStereo16BitRampMix, - // Linear SRC - MMX_Mono8BitLinearMix, MMX_Mono16BitLinearMix, Stereo8BitLinearMix, Stereo16BitLinearMix, - Mono8BitLinearRampMix, Mono16BitLinearRampMix, Stereo8BitLinearRampMix,Stereo16BitLinearRampMix, - // Linear SRC, Filter - MMX_FilterMono8BitLinearMix,MMX_FilterMono16BitLinearMix,FilterStereo8BitLinearMix, FilterStereo16BitLinearMix, - MMX_FilterMono8BitLinearRampMix,MMX_FilterMono16BitLinearRampMix,FilterStereo8BitLinearRampMix,FilterStereo16BitLinearRampMix, - // HQ SRC - MMX_Mono8BitHQMix, MMX_Mono16BitHQMix, Stereo8BitHQMix, Stereo16BitHQMix, - Mono8BitHQRampMix, Mono16BitHQRampMix, Stereo8BitHQRampMix, Stereo16BitHQRampMix, - // HQ SRC, Filter - MMX_FilterMono8BitLinearMix,MMX_FilterMono16BitLinearMix,FilterStereo8BitLinearMix, FilterStereo16BitLinearMix, - MMX_FilterMono8BitLinearRampMix,MMX_FilterMono16BitLinearRampMix,FilterStereo8BitLinearRampMix,FilterStereo16BitLinearRampMix, - - // Kaiser SRC -// -> CODE#0025 -// -> DESC="enable polyphase resampling on stereo samples" -// MMX_Mono8BitKaiserMix, MMX_Mono16BitKaiserMix, Stereo8BitHQMix, Stereo16BitHQMix, -// MMX_Mono8BitKaiserRampMix, MMX_Mono16BitKaiserRampMix, Stereo8BitHQRampMix, Stereo16BitHQRampMix, - MMX_Mono8BitKaiserMix, MMX_Mono16BitKaiserMix, Stereo8BitKaiserMix, Stereo16BitKaiserMix, - MMX_Mono8BitKaiserRampMix, MMX_Mono16BitKaiserRampMix, Stereo8BitKaiserRampMix,Stereo16BitKaiserRampMix, - - // Kaiser SRC, Filter - no ASM routines written for this yet. - FilterMono8BitKaiserMix, FilterMono16BitKaiserMix,FilterStereo8BitKaiserMix, FilterStereo16BitKaiserMix, - FilterMono8BitKaiserRampMix, FilterMono16BitKaiserRampMix,FilterStereo8BitKaiserRampMix,FilterStereo16BitKaiserRampMix, - - // FIRFilter SRC - no ASM routines written for this yet. - Mono8BitFIRFilterMix, Mono16BitFIRFilterMix, Stereo8BitFIRFilterMix, Stereo16BitFIRFilterMix, - Mono8BitFIRFilterRampMix, Mono16BitFIRFilterRampMix, Stereo8BitFIRFilterRampMix,Stereo16BitFIRFilterRampMix, - - // FIRFilter SRC, Filter - no ASM routines written for this yet. - FilterMono8BitFIRFilterMix, FilterMono16BitFIRFilterMix,FilterStereo8BitFIRFilterMix, FilterStereo16BitFIRFilterMix, - FilterMono8BitFIRFilterRampMix, FilterMono16BitFIRFilterRampMix,FilterStereo8BitFIRFilterRampMix,FilterStereo16BitFIRFilterRampMix, - - -// -! BEHAVIOUR_CHANGE#0025 -}; -#endif - - ///////////////////////////////////////////////////////////////////////// static LONG MPPFASTCALL GetSampleCount(MODCHANNEL *pChn, LONG nSamples, bool bITBidiMode) @@ -1582,12 +1521,6 @@ //rewbs.resamplerConf nFlags |= GetResamplingFlag(pChannel); //end rewbs.resamplerConf - #ifdef ENABLE_MMX - if ((gdwSysInfo & SYSMIX_ENABLEMMX) && (gdwSoundSetup & SNDMIX_ENABLEMMX)) - { - pMixFuncTable = gpMMXFunctionTable; - } else - #endif if ((nFlags < 0x20) && (pChannel->nLeftVol == pChannel->nRightVol) && ((!pChannel->nRampLength) || (pChannel->nLeftRamp == pChannel->nRightRamp))) { Modified: trunk/OpenMPT/soundlib/Mmx_mix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Mmx_mix.cpp 2011-10-05 21:40:31 UTC (rev 1089) +++ trunk/OpenMPT/soundlib/Mmx_mix.cpp 2011-10-05 22:05:57 UTC (rev 1090) @@ -20,8 +20,12 @@ // the different flavours of functionality: // ENABLE_MMX, ENABLE_AMDNOW, ENABLE_SSE flags must be set to // to compile the optimized sections of the code. In both cases the -// X86_xxxxxx functions will compile. +// X86_xxxxxx functions will compile. // +// NOTE: Resonant filter mixing has been changed to use floating point +// precision. The MMX code hasn't been updated for this, so the filtered +// MMX functions mustn't be used anymore! +// //////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "sndfile.h" Modified: trunk/OpenMPT/soundlib/Snd_flt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_flt.cpp 2011-10-05 21:40:31 UTC (rev 1089) +++ trunk/OpenMPT/soundlib/Snd_flt.cpp 2011-10-05 22:05:57 UTC (rev 1090) @@ -12,7 +12,6 @@ // AWE32: cutoff = reg[0-255] * 31.25 + 100 -> [100Hz-8060Hz] // EMU10K1 docs: cutoff = reg[0-127]*62+100 -#define FILTER_PRECISION 8192 #ifndef NO_FILTER @@ -105,23 +104,23 @@ } - float fg = 1 / (1 + d + e); + float fg = 1.0f / (1.0f + d + e); float fb0 = (d + e + e) / (1 + d + e); - float fb1 = -e / (1 + d + e); + float fb1 = -e / (1.0f + d + e); switch(pChn->nFilterMode) { case FLTMODE_HIGHPASS: - pChn->nFilter_A0 = (int)((1.0f - fg) * FILTER_PRECISION); - pChn->nFilter_B0 = (int)(fb0 * FILTER_PRECISION); - pChn->nFilter_B1 = (int)(fb1 * FILTER_PRECISION); + pChn->nFilter_A0 = 1.0f - fg; + pChn->nFilter_B0 = fb0; + pChn->nFilter_B1 = fb1; pChn->nFilter_HP = -1; break; default: - pChn->nFilter_A0 = (int)(fg * FILTER_PRECISION); - pChn->nFilter_B0 = (int)(fb0 * FILTER_PRECISION); - pChn->nFilter_B1 = (int)(fb1 * FILTER_PRECISION); + pChn->nFilter_A0 = fg; + pChn->nFilter_B0 = fb0; + pChn->nFilter_B1 = fb1; pChn->nFilter_HP = 0; break; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-10-05 21:40:31 UTC (rev 1089) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-10-05 22:05:57 UTC (rev 1090) @@ -255,8 +255,9 @@ DWORD nLoopEnd; LONG nRampRightVol; LONG nRampLeftVol; - LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; - LONG nFilter_A0, nFilter_B0, nFilter_B1, nFilter_HP; + float nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; + float nFilter_A0, nFilter_B0, nFilter_B1; + int nFilter_HP; LONG nROfs, nLOfs; LONG nRampLength; // Information not used in the mixer This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-06 12:22:03
|
Revision: 1092 http://modplug.svn.sourceforge.net/modplug/?rev=1092&view=rev Author: saga-games Date: 2011-10-06 12:21:52 +0000 (Thu, 06 Oct 2011) Log Message: ----------- [Mod] Further speed enhancements for the new filter code Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/soundlib/Fastmix.cpp Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2011-10-05 22:28:14 UTC (rev 1091) +++ trunk/OpenMPT/common/misc_util.h 2011-10-06 12:21:52 UTC (rev 1092) @@ -95,7 +95,6 @@ inline T Clamp(T val, const C lowerLimit, const C upperLimit) //----------------------------------------------------------- { - if(lowerLimit > upperLimit) return val; if(val < lowerLimit) return lowerLimit; else if(val > upperLimit) return upperLimit; else return val; Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2011-10-05 22:28:14 UTC (rev 1091) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2011-10-06 12:21:52 UTC (rev 1092) @@ -352,7 +352,7 @@ #define SNDMIX_PROCESSFILTER\ float fy = ((float)vol * pChn->nFilter_A0 + ClipFilter(fy1) * pChn->nFilter_B0 + ClipFilter(fy2) * pChn->nFilter_B1);\ fy2 = fy1;\ - fy1 = fy + (float)(vol * pChn->nFilter_HP);\ + fy1 = fy - (float)(vol & pChn->nFilter_HP);\ vol = (int)fy; @@ -371,10 +371,10 @@ #define SNDMIX_PROCESSSTEREOFILTER\ float fy = ((float)vol_l * pChn->nFilter_A0 + ClipFilter(fy1) * pChn->nFilter_B0 + ClipFilter(fy2) * pChn->nFilter_B1);\ - fy2 = fy1; fy1 = fy + (float)(vol_l * pChn->nFilter_HP);\ + fy2 = fy1; fy1 = fy - (float)(vol_l & pChn->nFilter_HP);\ vol_l = (int)fy;\ fy = ((float)vol_r * pChn->nFilter_A0 + ClipFilter(fy3) * pChn->nFilter_B0 + ClipFilter(fy4) * pChn->nFilter_B1);\ - fy4 = fy3; fy3 = fy + (float)(vol_r * pChn->nFilter_HP);\ + fy4 = fy3; fy3 = fy - (float)(vol_r & pChn->nFilter_HP);\ vol_r = (int)fy; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-07 19:10:15
|
Revision: 1096 http://modplug.svn.sourceforge.net/modplug/?rev=1096&view=rev Author: saga-games Date: 2011-10-07 19:10:08 +0000 (Fri, 07 Oct 2011) Log Message: ----------- [Fix] Everytime you thought you understood FT2, you discover something new that doesn't work. [Mod] OpenMPT: Version is now 1.20.00.40 Modified Paths: -------------- trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-07 18:01:17 UTC (rev 1095) +++ trunk/OpenMPT/mptrack/version.h 2011-10-07 19:10:08 UTC (rev 1096) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 39 +#define VER_MINORMINOR 40 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-07 18:01:17 UTC (rev 1095) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-07 19:10:08 UTC (rev 1096) @@ -1437,7 +1437,7 @@ // Apparently, any note number in a pattern causes instruments to recall their original volume settings - no matter if there's a Note Off next to it or whatever. // Test cases: keyoff+instr.xm, delay.xm - bool reloadInstrSettings = (IsCompatibleMode(TRK_FASTTRACKER2) && instr != 0); + bool reloadSampleSettings = (IsCompatibleMode(TRK_FASTTRACKER2) && instr != 0); bool keepInstr = (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)); // Now it's time for some FT2 crap... @@ -1462,29 +1462,31 @@ // XM Compatibility: Some special hacks for rogue note delays... (EDx with x > 0) // Apparently anything that is next to a note delay behaves totally unpredictable in FT2. Swedish tracker logic. :) + retrigEnv = true; + if(note == NOTE_NONE) { // If there's a note delay but no real note, retrig the last note. - // Test case: delay2.xm + // Test case: delay2.xm, delay3.xm note = pChn->nNote - pChn->nTranspose; - retrigEnv = true; } else if(note >= NOTE_MIN_SPECIAL) { // Gah! Even Note Off + Note Delay will cause envelopes to *retrigger*! How stupid is that? - retrigEnv = true; // ... Well, and that is actually all it does if there's an envelope. No fade out, no nothing. *sigh* // Test case: OffDelay.xm note = NOTE_NONE; keepInstr = false; + reloadSampleSettings = true; } else { - retrigEnv = true; + // Normal note keepInstr = true; + reloadSampleSettings = true; } } } - if(retrigEnv || reloadInstrSettings) + if((retrigEnv && !IsCompatibleMode(TRK_FASTTRACKER2)) || reloadSampleSettings) { const MODSAMPLE *oldSample = nullptr; // Reset default volume when retriggering envelopes @@ -1501,7 +1503,7 @@ if(oldSample != nullptr) { pChn->nVolume = oldSample->nVolume; - if(reloadInstrSettings) + if(reloadSampleSettings) { // Also reload panning pChn->nPan = oldSample->nPan; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-07 21:56:08
|
Revision: 1098 http://modplug.svn.sourceforge.net/modplug/?rev=1098&view=rev Author: saga-games Date: 2011-10-07 21:56:02 +0000 (Fri, 07 Oct 2011) Log Message: ----------- [Fix] Creating a new XM file didn't set the panning flag for the first (and only) sample. [Fix] Length Calculation: E60 bug was not handled correctly if the last E6x command was on the last row of the pattern [Fix] XM Compatibility: Tone portamento is ignored if it's combined with a note delay [Fix] XM Compatibility: K00 behaviour was wrong if there is no volume envelope enabled and no instrument or volume column effect is present. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-07 19:32:12 UTC (rev 1097) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-07 21:56:02 UTC (rev 1098) @@ -730,6 +730,10 @@ { strcpy(m_SndFile.m_szNames[1], "untitled"); m_SndFile.m_nSamples = (GetModType() == MOD_TYPE_MOD) ? 31 : 1; + if(GetModType() == MOD_TYPE_XM) + { + m_SndFile.GetSample(1).uFlags |= CHN_PANNING; + } ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetInit); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-07 19:32:12 UTC (rev 1097) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-07 21:56:02 UTC (rev 1098) @@ -185,13 +185,6 @@ // Update next position nNextRow = nRow + 1; - if (nNextRow >= Patterns[nPattern].GetNumRows()) - { - nNextPattern = nCurrentPattern + 1; - nNextRow = 0; - if(IsCompatibleMode(TRK_FASTTRACKER2)) nNextRow = nNextPatStartRow; // FT2 E60 bug - nNextPatStartRow = 0; - } if (!nRow) { for(UINT ipck = 0; ipck < m_nChannels; ipck++) @@ -241,7 +234,7 @@ nNextPatStartRow = 0; // FT2 E60 bug if (nRow < Patterns[nPattern].GetNumRows() - 1) { - nextRow = Patterns[nPattern] + (nRow + 1) * m_nChannels + nChn; + nextRow = Patterns[nPattern].GetpModCommand(nRow +1, nChn); } if (nextRow && nextRow->command == CMD_XPARAM) { @@ -422,7 +415,17 @@ break; } } + + if (nNextRow >= Patterns[nPattern].GetNumRows()) + { + nNextPattern = nCurrentPattern + 1; + nNextRow = 0; + if(IsCompatibleMode(TRK_FASTTRACKER2)) nNextRow = nNextPatStartRow; // FT2 E60 bug + nNextPatStartRow = 0; + } + nSpeedCount += nMusicSpeed; + switch(m_nTempoMode) { case tempo_mode_alternative: @@ -567,6 +570,8 @@ } // XM compatibility: new instrument + portamento = ignore new instrument number, but reload old instrument settings (the world of XM is upside down...) + // And this does *not* happen if volume column portamento is used together with note delay... (handled in ProcessEffects(), where all the other note delay stuff is.) + // Test case: porta-delay.xm if(bInstrumentChanged && bPorta && IsCompatibleMode(TRK_FASTTRACKER2)) { pIns = pChn->pModInstrument; @@ -769,11 +774,14 @@ { // Key Off (+ Invalid Note for XM - TODO is this correct?) if (note == NOTE_KEYOFF || !(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + { KeyOff(nChn); + } else // Invalid Note -> Note Fade - //if (note == NOTE_FADE) - if(m_nInstruments) + { + if(/*note == NOTE_FADE && */ GetNumInstruments()) pChn->dwFlags |= CHN_NOTEFADE; + } // Note Cut if (note == NOTE_NOTECUT) @@ -1464,6 +1472,10 @@ retrigEnv = true; + // Portamento + Note Delay = No Portamento + // Test case: porta-delay.xm + bPorta = false; + if(note == NOTE_NONE) { // If there's a note delay but no real note, retrig the last note. @@ -1993,7 +2005,7 @@ // XM: Key-Off + Sample == Note Cut if ((!pChn->pModInstrument) || (!(pChn->pModInstrument->VolEnv.dwFlags & ENV_ENABLED))) { - if(param == 0) // FT2 is weird.... + if(param == 0 && (pChn->rowCommand.instr || pChn->rowCommand.volcmd != VOLCMD_NONE)) // FT2 is weird.... { pChn->dwFlags |= CHN_NOTEFADE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-09 16:01:52
|
Revision: 1099 http://modplug.svn.sourceforge.net/modplug/?rev=1099&view=rev Author: saga-games Date: 2011-10-09 16:01:46 +0000 (Sun, 09 Oct 2011) Log Message: ----------- [Fix] General Tab: Switching between plugin presets didn't update the plugin parameter display. [Mod] \xx command has been removed from S3M format (existing tracks are updated automatically to use the Zxx command instead). Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-07 21:56:02 UTC (rev 1098) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-09 16:01:46 UTC (rev 1099) @@ -2252,7 +2252,7 @@ {CMD_PANNINGSLIDE, 0,0, 0, MOD_TYPE_NOMOD, "Panning Slide"}, {CMD_SETENVPOSITION,0,0, 0, MOD_TYPE_XM, "Envelope position"}, {CMD_MIDI, 0,0, 0x7F, MOD_TYPE_NOMOD, "MIDI Macro"}, - {CMD_SMOOTHMIDI, 0,0, 0x7F, MOD_TYPE_NOMOD, "Smooth MIDI Macro"}, //rewbs.smoothVST + {CMD_SMOOTHMIDI, 0,0, 0x7F, MOD_TYPE_XMITMPT, "Smooth MIDI Macro"}, //rewbs.smoothVST // Extended MOD/XM effects {CMD_MODCMDEX, 0xF0,0x10, 0, MOD_TYPE_MODXM, "Fine Porta Up"}, {CMD_MODCMDEX, 0xF0,0x20, 0, MOD_TYPE_MODXM, "Fine Porta Down"}, Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-07 21:56:02 UTC (rev 1098) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-09 16:01:46 UTC (rev 1099) @@ -1005,8 +1005,11 @@ CVstPlugin *pVstPlugin = (CVstPlugin *)pPlugin->pMixPlugin; UINT nParams = pVstPlugin->GetNumPrograms(); if ((cursel > 0) && (cursel <= (int)nParams)) m_nCurrentPreset = cursel; - if (m_nCurrentPreset > 0 && m_nCurrentPreset <= nParams){ - pVstPlugin->SetCurrentProgram(m_nCurrentPreset-1); + if (m_nCurrentPreset > 0 && m_nCurrentPreset <= nParams) + { + pVstPlugin->SetCurrentProgram(m_nCurrentPreset - 1); + // Update parameter display + OnParamChanged(); } if(pSndFile->GetModSpecifications().supportsPlugins) pModDoc->SetModified(); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-10-07 21:56:02 UTC (rev 1098) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-10-09 16:01:46 UTC (rev 1099) @@ -107,7 +107,7 @@ case 'X': command = CMD_PANNING8; break; case 'Y': command = CMD_PANBRELLO; break; case 'Z': command = CMD_MIDI; break; - case '\\': command = CMD_SMOOTHMIDI; break; //rewbs.smoothVST + case '\\': command = bIT ? CMD_SMOOTHMIDI : CMD_MIDI; break; //rewbs.smoothVST // Chars under 0x40 don't save properly, so map : to ] and # to [. case ']': command = CMD_DELAYCUT; break; case '[': command = CMD_XPARAM; break; @@ -164,7 +164,7 @@ case CMD_PANBRELLO: command = 'Y'; break; case CMD_MIDI: command = 'Z'; break; case CMD_SMOOTHMIDI: //rewbs.smoothVST - if(bCompatibilityExport) + if(bCompatibilityExport || !bIT) command = 'Z'; else command = '\\'; Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2011-10-07 21:56:02 UTC (rev 1098) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2011-10-09 16:01:46 UTC (rev 1099) @@ -346,7 +346,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\??", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z???", // Supported Effects " vp?????????????", // Supported Volume Column commands true, // Has "+++" pattern false, // Doesn't have restart position (order) Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-07 21:56:02 UTC (rev 1098) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-09 16:01:46 UTC (rev 1099) @@ -100,6 +100,12 @@ } } // End if(m->command == CMD_PANNING8) + // Re-map \xx to Zxx if the new format only knows the latter command. + if(m->command == CMD_SMOOTHMIDI && !GetModSpecifications(nNewType).HasCommand(CMD_SMOOTHMIDI) && GetModSpecifications(nNewType).HasCommand(CMD_MIDI)) + { + m->command = CMD_MIDI; + } + /////////////////////////////////////////////////////////////////////////////////////// // MPTM to anything: Convert param control, extended envelope control, note delay+cut if(oldTypeIsMPT) @@ -145,6 +151,7 @@ case CMD_MODCMDEX: MODExx2S3MSxx(m); break; + case CMD_VOLUME: // Effect column volume command overrides the volume column in XM. if (m->volcmd == VOLCMD_NONE || m->volcmd == VOLCMD_VOLUME) @@ -162,12 +169,15 @@ m->param = 0x80 | ((m->param * 15 + 32) / 64); // XM volcol panning is 4-Bit, so we can use 4-Bit panning here. } break; + case CMD_PORTAMENTOUP: if (m->param > 0xDF) m->param = 0xDF; break; + case CMD_PORTAMENTODOWN: if (m->param > 0xDF) m->param = 0xDF; break; + case CMD_XFINEPORTAUPDOWN: switch(m->param & 0xF0) { @@ -188,8 +198,9 @@ break; } break; + case CMD_KEYOFF: - if(m->note == 0) + if(m->note == NOTE_NONE) { m->note = (newTypeIsS3M) ? NOTE_NOTECUT : NOTE_KEYOFF; m->command = CMD_S3MCMDEX; @@ -198,6 +209,7 @@ m->param = 0xD0 | (m->param & 0x0F); } break; + case CMD_PANNINGSLIDE: // swap L/R, convert to fine slide if(m->param & 0xF0) @@ -207,6 +219,7 @@ { m->param = 0x0F | (min(0x0E, m->param & 0x0F) << 4); } + default: break; } @@ -234,6 +247,7 @@ case CMD_S3MCMDEX: S3MSxx2MODExx(m); break; + case CMD_VOLUMESLIDE: if ((m->param & 0xF0) && ((m->param & 0x0F) == 0x0F)) { @@ -246,6 +260,7 @@ m->param = (m->param & 0x0F) | 0xB0; } break; + case CMD_PORTAMENTOUP: if (m->param >= 0xF0) { @@ -265,6 +280,7 @@ } } else m->command = CMD_PORTAMENTOUP; break; + case CMD_PORTAMENTODOWN: if (m->param >= 0xF0) { @@ -284,14 +300,17 @@ } } else m->command = CMD_PORTAMENTODOWN; break; + case CMD_SPEED: { m->param = min(m->param, (nNewType == MOD_TYPE_XM) ? 0x1F : 0x20); } break; + case CMD_TEMPO: if(m->param < 0x20) m->command = CMD_NONE; // no tempo slides break; + case CMD_PANNINGSLIDE: // swap L/R, convert fine slides to normal slides if((m->param & 0x0F) == 0x0F && (m->param & 0xF0)) @@ -311,6 +330,7 @@ m->param = 0; } break; + case CMD_RETRIG: // Retrig: Q0y doesn't change volume in IT/S3M, but R0y in XM takes the last x parameter if(m->param != 0 && (m->param & 0xF0) == 0) @@ -318,6 +338,7 @@ m->param |= 0x80; } break; + default: break; } @@ -351,12 +372,11 @@ break; } break; - case CMD_SMOOTHMIDI: - m->command = CMD_MIDI; - break; + case CMD_GLOBALVOLUME: m->param = (min(0x80, m->param) + 1) / 2; break; + default: break; } @@ -416,6 +436,7 @@ case CMD_TONEPORTAVOL: // lacks memory -> 500 is the same as 300 if(m->param == 0x00) m->command = CMD_TONEPORTAMENTO; break; + case CMD_VIBRATOVOL: // lacks memory -> 600 is the same as 400 if(m->param == 0x00) m->command = CMD_VIBRATO; break; @@ -453,6 +474,7 @@ m->command = CMD_MODCMDEX; m->param = 0x90 | (m->param & 0x0F); break; + case CMD_MODCMDEX: // This would turn into "Invert Loop", so let's better remove it if((m->param & 0xF0) == 0xF0) m->command = CMD_NONE; break; @@ -464,53 +486,63 @@ m->command = CMD_VOLUME; m->param = m->vol; break; + case VOLCMD_PANNING: m->command = CMD_PANNING8; m->param = CLAMP(m->vol << 2, 0, 0xFF); break; + case VOLCMD_VOLSLIDEDOWN: m->command = CMD_VOLUMESLIDE; m->param = m->vol; break; + case VOLCMD_VOLSLIDEUP: m->command = CMD_VOLUMESLIDE; m->param = m->vol << 4; break; + case VOLCMD_FINEVOLDOWN: m->command = CMD_MODCMDEX; m->param = 0xB0 | m->vol; break; + case VOLCMD_FINEVOLUP: m->command = CMD_MODCMDEX; m->param = 0xA0 | m->vol; break; + case VOLCMD_PORTADOWN: m->command = CMD_PORTAMENTODOWN; m->param = m->vol << 2; break; + case VOLCMD_PORTAUP: m->command = CMD_PORTAMENTOUP; m->param = m->vol << 2; break; + case VOLCMD_TONEPORTAMENTO: m->command = CMD_TONEPORTAMENTO; m->param = m->vol << 2; break; + case VOLCMD_VIBRATODEPTH: m->command = CMD_VIBRATO; m->param = m->vol; break; + case VOLCMD_VIBRATOSPEED: m->command = CMD_VIBRATO; m->param = m->vol << 4; break; // OpenMPT-specific commands + case VOLCMD_OFFSET: m->command = CMD_OFFSET; m->param = m->vol << 3; break; - default: - break; + } m->volcmd = CMD_NONE; } // End if (newTypeIsMOD) @@ -526,64 +558,74 @@ m->param = m->vol; m->volcmd = CMD_NONE; break; + case VOLCMD_VOLSLIDEUP: m->command = CMD_VOLUMESLIDE; m->param = m->vol << 4; m->volcmd = CMD_NONE; break; + case VOLCMD_FINEVOLDOWN: m->command = CMD_VOLUMESLIDE; m->param = 0xF0 | m->vol; m->volcmd = CMD_NONE; break; + case VOLCMD_FINEVOLUP: m->command = CMD_VOLUMESLIDE; m->param = (m->vol << 4) | 0x0F; m->volcmd = CMD_NONE; break; + case VOLCMD_PORTADOWN: m->command = CMD_PORTAMENTODOWN; m->param = m->vol << 2; m->volcmd = CMD_NONE; break; + case VOLCMD_PORTAUP: m->command = CMD_PORTAMENTOUP; m->param = m->vol << 2; m->volcmd = CMD_NONE; break; + case VOLCMD_TONEPORTAMENTO: m->command = CMD_TONEPORTAMENTO; m->param = m->vol << 2; m->volcmd = CMD_NONE; break; + case VOLCMD_VIBRATODEPTH: m->command = CMD_VIBRATO; m->param = m->vol; m->volcmd = CMD_NONE; break; + case VOLCMD_VIBRATOSPEED: m->command = CMD_VIBRATO; m->param = m->vol << 4; m->volcmd = CMD_NONE; break; + case VOLCMD_PANSLIDELEFT: m->command = CMD_PANNINGSLIDE; m->param = m->vol << 4; m->volcmd = CMD_NONE; break; + case VOLCMD_PANSLIDERIGHT: m->command = CMD_PANNINGSLIDE; m->param = m->vol; m->volcmd = CMD_NONE; break; // OpenMPT-specific commands + case VOLCMD_OFFSET: m->command = CMD_OFFSET; m->param = m->vol << 3; m->volcmd = CMD_NONE; break; - default: - break; + } } // End if (newTypeIsS3M) @@ -618,19 +660,20 @@ m->param = m->vol << 2; m->volcmd = CMD_NONE; break; + case VOLCMD_PORTAUP: m->command = CMD_PORTAMENTOUP; m->param = m->vol << 2; m->volcmd = CMD_NONE; break; // OpenMPT-specific commands + case VOLCMD_OFFSET: m->command = CMD_OFFSET; m->param = m->vol << 3; m->volcmd = CMD_NONE; break; - default: - break; + } } // End if (newTypeIsXM) @@ -652,23 +695,25 @@ case VOLCMD_OFFSET: m->vol = min(m->vol, 9); break; + case VOLCMD_PANSLIDELEFT: m->command = CMD_PANNINGSLIDE; m->param = m->vol << 4; m->volcmd = CMD_NONE; break; + case VOLCMD_PANSLIDERIGHT: m->command = CMD_PANNINGSLIDE; m->param = m->vol; m->volcmd = CMD_NONE; break; + case VOLCMD_VIBRATOSPEED: m->command = CMD_VIBRATO; m->param = m->vol << 4; m->volcmd = CMD_NONE; break; - default: - break; + } } // End if (newTypeIsIT) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-10 14:15:52
|
Revision: 1100 http://modplug.svn.sourceforge.net/modplug/?rev=1100&view=rev Author: saga-games Date: 2011-10-10 14:15:41 +0000 (Mon, 10 Oct 2011) Log Message: ----------- [Fix] Pattern Editor: Default volume is not shown for MOD an XM files if there's a Cxx command in the same cell. [Mod] Pattern Editor: Improved explanation of E5x in MOD files [Mod] Channel Manager: Removed player stopping when reordering / removing channels - a mutex should be enough. [Mod] Song Cleanup: Reset Song Variables also cleans the MIDI Macros now. [Mod] Small changes here and there. [Mod] OpenMPT: Version is now 1.20.00.41 Modified Paths: -------------- trunk/OpenMPT/mptrack/Autotune.cpp trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Snd_flt.cpp trunk/OpenMPT/soundlib/mod_specifications.cpp trunk/OpenMPT/soundlib/modcommand.cpp Modified: trunk/OpenMPT/mptrack/Autotune.cpp =================================================================== --- trunk/OpenMPT/mptrack/Autotune.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/Autotune.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -180,7 +180,7 @@ const int8 *normalData = sampleData; const int8 *shiftedData = sampleData + autocorrShift; // Add up squared differences of all values - for(SmpLength i = processLength; i > 0; i--, normalData++, shiftedData++) + for(SmpLength i = processLength; i != 0; i--, normalData++, shiftedData++) { autocorrSum += (*normalData - *shiftedData) * (*normalData - *shiftedData); } @@ -196,9 +196,9 @@ for(int ki = kernelWidth; ki >= 0; ki--) { // Choose bins to interpolate with - int left = (int)i - ki; + int left = i - ki; if(left < 0) left += historyBins; - int right = (int)i + ki; + int right = i + ki; if(right >= historyBins) right -= historyBins; interpolatedHistogram[i] = interpolatedHistogram[i] / 2 + (autocorrHistogram[left] + autocorrHistogram[right]) / 2; Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -167,23 +167,16 @@ if(!m_pSndFile || !pModDoc) return; - - // Stop player (is this necessary?) - CModDoc *pActiveMod = NULL; - HWND followSong = pMainFrm->GetFollowSong(pModDoc); - if(pMainFrm->IsPlaying()){ - if((m_pSndFile) && (!m_pSndFile->IsPaused())) pActiveMod = pMainFrm->GetModPlaying(); - pMainFrm->PauseMod(); - } - EnterCriticalSection(&applying); CHANNELINDEX nChannels, newpat[MAX_BASECHANNELS], newMemory[4][MAX_BASECHANNELS]; // Count new number of channels , copy pattern pointers & manager internal store memory nChannels = 0; - for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++){ - if(!removed[pattern[nChn]]){ + for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) + { + if(!removed[pattern[nChn]]) + { newMemory[0][nChannels] = memory[0][nChannels]; newMemory[1][nChannels] = memory[1][nChannels]; newMemory[2][nChannels] = memory[2][nChannels]; @@ -214,8 +207,10 @@ // Update manager internal store memory - for(CHANNELINDEX nChn = 0; nChn < nChannels; nChn++){ - if(nChn != newpat[nChn]){ + for(CHANNELINDEX nChn = 0; nChn < nChannels; nChn++) + { + if(nChn != newpat[nChn]) + { memory[0][nChn] = newMemory[0][newpat[nChn]]; memory[1][nChn] = newMemory[1][newpat[nChn]]; memory[2][nChn] = newMemory[2][newpat[nChn]]; @@ -223,14 +218,6 @@ memory[3][nChn] = nChn; } - /* - if(pActiveMod == pModDoc){ - i = m_pSndFile->GetCurrentPos(); - m_pSndFile->m_dwSongFlags &= ~SONG_STEP; - m_pSndFile->SetCurrentPos(0); - m_pSndFile->SetCurrentPos(i); - } - */ cs.Leave(); EndWaitCursor(); @@ -242,7 +229,6 @@ pModDoc->SetModified(); pModDoc->UpdateAllViews(NULL,0xff,NULL); pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS ); //refresh channel headers - pMainFrm->PlayMod(pActiveMod, followSong, MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 // Redraw channel manager window InvalidateRect(NULL,TRUE); @@ -794,7 +780,7 @@ { CHANNELINDEX nThisChn = pattern[nChn]; - if(m_pSndFile->ChnSettings[nThisChn].szName[0] >= 0x20) + if(m_pSndFile->ChnSettings[nThisChn].szName[0] != '\0') wsprintf(s, "%d: %s", (nThisChn + 1), m_pSndFile->ChnSettings[nThisChn].szName); else wsprintf(s, "Channel %d", nThisChn + 1); Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -904,6 +904,7 @@ pSndFile->m_nMixLevels = mixLevels_compatible; pSndFile->m_nTempoMode = tempo_mode_classic; pSndFile->m_dwSongFlags = SONG_LINEARSLIDES; + CSoundFile::ResetMidiCfg(pSndFile->m_MidiCfg); // Global vars pSndFile->m_nDefaultTempo = 125; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -283,9 +283,10 @@ const INSTRUMENTINDEX nSplitIns = m_pModDoc->GetSplitKeyboardSettings()->splitInstrument; const MODCOMMAND::NOTE noteSplit = 1 + m_pModDoc->GetSplitKeyboardSettings()->splitNote; const CString sSplitInsName = m_pModDoc->GetPatternViewInstrumentName(nSplitIns, true, false); - if (m_pSndFile->m_nInstruments) + if (m_pSndFile->GetNumInstruments()) { - for (UINT i=1; i<=m_pSndFile->m_nInstruments; i++) + // Show instrument names + for (INSTRUMENTINDEX i = 1; i <= m_pSndFile->GetNumInstruments(); i++) { if (m_pSndFile->Instruments[i] == nullptr) continue; @@ -306,9 +307,9 @@ } } else { - UINT nmax = m_pSndFile->m_nSamples; - while ((nmax > 1) && (m_pSndFile->GetSample(nmax).pSample == nullptr) && (!m_pSndFile->m_szNames[nmax][0])) nmax--; - for (UINT i=1; i<=nmax; i++) if ((m_pSndFile->m_szNames[i][0]) || (m_pSndFile->GetSample(i).pSample)) + // Show sample names + SAMPLEINDEX nmax = m_pSndFile->GetNumSamples(); + for (SAMPLEINDEX i = 1; i <= nmax; i++) if (m_pSndFile->GetSample(i).pSample) { if (m_pModDoc->GetSplitKeyboardSettings()->IsSplitActive() && nSplitIns < ARRAYELEMCOUNT(m_pSndFile->m_szNames)) wsprintf(s, szSplitFormat, nSplitIns, GetNoteStr(noteSplit), i, m_pSndFile->m_szNames[nSplitIns], m_pSndFile->m_szNames[i]); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -2848,16 +2848,6 @@ break; case CMD_MIDI: - if (param < 0x80) - { - wsprintf(pszName, "SFx macro: z=%02X (%d)", param, param); - } else - { - wsprintf(pszName, "Fixed Macro Z%02X", param); - } - break; - - //rewbs.smoothVST case CMD_SMOOTHMIDI: if (param < 0x80) { @@ -2867,8 +2857,7 @@ wsprintf(pszName, "Fixed Macro Z%02X", param); } break; - //end rewbs.smoothVST - + case CMD_DELAYCUT: wsprintf(pszName, "Note delay: %d, cut after %d ticks", (param >> 4), (param & 0x0F)); break; @@ -3016,8 +3005,16 @@ break; case 0x50: // set finetune { - int8 nFinetune = (param & 0x0F) << 4; - if(m_SndFile.GetType() & MOD_TYPE_XM) nFinetune += 128; + int8 nFinetune = (param & 0x0F); + if(m_SndFile.GetType() & MOD_TYPE_XM) + { + // XM finetune + nFinetune = (nFinetune - 8) * 16; + } else + { + // MOD finetune + if(nFinetune > 7) nFinetune -= 16; + } wsprintf(s, "%d", nFinetune); } break; Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/View_pat.h 2011-10-10 14:15:41 UTC (rev 1100) @@ -214,7 +214,7 @@ void DrawDragSel(HDC hdc); void OnDrawDragSel(); // True if default volume should be drawn for a given cell. - bool DrawDefaultVolume(const MODCOMMAND *m) const { return (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_SHOWDEFAULTVOLUME) && m->volcmd == VOLCMD_NONE && m->instr != 0 && m->note != NOTE_NONE && NOTE_IS_VALID(m->note); } + static bool DrawDefaultVolume(const MODCOMMAND *m) { return (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_SHOWDEFAULTVOLUME) && m->volcmd == VOLCMD_NONE && m->command != CMD_VOLUME && m->instr != 0 && m->note != NOTE_NONE && NOTE_IS_VALID(m->note); } //rewbs.customKeys BOOL ExecuteCommand(CommandID command); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-10-10 14:15:41 UTC (rev 1100) @@ -1365,7 +1365,7 @@ IDD_SELECTMIXPLUGIN DIALOGEX 0, 0, 249, 220 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Mix Plugins" +CAPTION "Plugin Manager" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "Filter:",IDC_STATIC_VSTNAMEFILTER,6,9,18,8 @@ -1424,7 +1424,7 @@ IDD_EFFECTVISUALIZER DIALOGEX 0, 0, 422, 109 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE -CAPTION "Param Editor" +CAPTION "Parameter Editor" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN EDITTEXT IDC_VISSTATUS,4,92,162,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/test/test.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -103,6 +103,7 @@ VERIFY_EQUAL( MptVersion::IsTestBuild(MAKE_VERSION_NUMERIC(1,18,01,13)), true); VERIFY_EQUAL( MptVersion::IsTestBuild(MAKE_VERSION_NUMERIC(1,19,01,00)), false); VERIFY_EQUAL( MptVersion::IsTestBuild(MAKE_VERSION_NUMERIC(1,17,02,54)), false); + VERIFY_EQUAL( MptVersion::IsTestBuild(MAKE_VERSION_NUMERIC(1,18,00,00)), false); VERIFY_EQUAL( MptVersion::IsTestBuild(MAKE_VERSION_NUMERIC(1,18,02,00)), false); VERIFY_EQUAL( MptVersion::IsTestBuild(MAKE_VERSION_NUMERIC(1,18,02,01)), true); STATIC_ASSERT( MAKE_VERSION_NUMERIC(1,17,2,28) == 18285096 ); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/mptrack/version.h 2011-10-10 14:15:41 UTC (rev 1100) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 40 +#define VER_MINORMINOR 41 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of @@ -64,7 +64,7 @@ // Returns true if a given version number is from a test build, false if it's a release build. static bool IsTestBuild(const VersionNum num) { - return ((num > MAKE_VERSION_NUMERIC(1,17,02,54) && num < MAKE_VERSION_NUMERIC(1,18,02,00)) || (num > MAKE_VERSION_NUMERIC(1,18,02,00) && RemoveBuildNumber(num) != num)); + return ((num > MAKE_VERSION_NUMERIC(1,17,02,54) && num < MAKE_VERSION_NUMERIC(1,18,02,00) && num != MAKE_VERSION_NUMERIC(1,18,00,00)) || (num > MAKE_VERSION_NUMERIC(1,18,02,00) && RemoveBuildNumber(num) != num)); } }; //namespace MptVersion Modified: trunk/OpenMPT/soundlib/Snd_flt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_flt.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/soundlib/Snd_flt.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -95,7 +95,7 @@ float fc = (float)CutOffToFrequency(cutoff, flt_modifier); const float dmpfac = pow(10.0f, -((24.0f / 128.0f) * (float)resonance) / 20.0f); - fc *= (float)(2.0 * 3.14159265358 / (float)gdwMixingFreq); + fc *= (float)(2.0f * (float)M_PI / (float)gdwMixingFreq); d = (1.0f - 2.0f * dmpfac) * fc; LimitMax(d, 2.0f); Modified: trunk/OpenMPT/soundlib/mod_specifications.cpp =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/soundlib/mod_specifications.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -50,7 +50,7 @@ else if(note == NOTE_FADE) return hasNoteFade; else - return (memcmp(fileExtension, ModSpecs::mptm.fileExtension, 4) == 0); + return (internalType == MOD_TYPE_MPT); } else if(note == NOTE_NONE) return true; return false; Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-09 16:01:46 UTC (rev 1099) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-10 14:15:41 UTC (rev 1100) @@ -721,10 +721,10 @@ m->note = NOTE_NONE; // ensure the commands really exist in this format - if(CSoundFile::GetModSpecifications(nNewType).HasCommand(m->command) == false) + if(!CSoundFile::GetModSpecifications(nNewType).HasCommand(m->command)) m->command = CMD_NONE; - if(CSoundFile::GetModSpecifications(nNewType).HasVolCommand(m->volcmd) == false) - m->volcmd = CMD_NONE; + if(!CSoundFile::GetModSpecifications(nNewType).HasVolCommand(m->volcmd)) + m->volcmd = VOLCMD_NONE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-10 15:08:34
|
Revision: 1101 http://modplug.svn.sourceforge.net/modplug/?rev=1101&view=rev Author: saga-games Date: 2011-10-10 15:08:27 +0000 (Mon, 10 Oct 2011) Log Message: ----------- [Reg] Removed restart position from IT extensions. It can still be edited when loading an old IT file with restart position set, but for all other files, it's not available. [Ref] Removed modEx Mod Specifications, since they were identical to mod (MPT has no MOD hacks). [Fix] TryWriteEffect() was broken in some cases since a few revisions ago. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2011-10-10 14:15:41 UTC (rev 1100) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2011-10-10 15:08:27 UTC (rev 1101) @@ -231,7 +231,8 @@ m_SliderVSTiVol.EnableWindow(bIsNotMOD_S3M); m_EditVSTiVol.EnableWindow(bIsNotMOD_S3M); m_SpinVSTiVol.EnableWindow(bIsNotMOD_S3M); - m_EditRestartPos.EnableWindow(specs.hasRestartPos ? TRUE : FALSE); + m_EditRestartPos.EnableWindow((specs.hasRestartPos || m_pSndFile->m_nRestartPos != 0) ? TRUE : FALSE); + m_SpinRestartPos.EnableWindow(m_EditRestartPos.IsWindowEnabled()); //Note: Sample volume slider is not disabled for MOD //on purpose(can be used to control play volume) @@ -250,7 +251,7 @@ // -! NEW_FEATURE#0023 } - wsprintf(s, "%s, %d channel%s", pszModType, m_pSndFile->m_nChannels, (m_pSndFile->m_nChannels != 1) ? "s" : ""); + wsprintf(s, "%s, %d channel%s", pszModType, m_pSndFile->GetNumChannels(), (m_pSndFile->GetNumChannels() != 1) ? "s" : ""); m_EditModType.SetWindowText(s); } if (dwHint & HINT_MPTSETUP) Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-10 14:15:41 UTC (rev 1100) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-10 15:08:27 UTC (rev 1101) @@ -13,7 +13,7 @@ * - Long instrument envelopes * - Envelope release node (this was previously also usable in the IT format, but is now deprecated in that format) * - * Extended features in IT/XM/S3M/MOD (not all listed below are available in all of those formats): + * Extended features in IT/XM/S3M (not all listed below are available in all of those formats): * - Plugins * - Extended ranges for * - Sample count @@ -28,7 +28,7 @@ * - Version info * - Channel names * - Pattern names - * - Alternative tempomodes + * - Alternative tempo modes * - For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties() * * Authors: OpenMPT Devs @@ -420,9 +420,12 @@ // Is the "restart position" value allowed in this format? if(m_SndFile.m_nRestartPos > 0 && !CSoundFile::GetModSpecifications(nNewType).hasRestartPos) { - // Try to fix it - RestartPosToPattern(); - CHANGEMODTYPE_WARNING(wRestartPos); + // Try to fix it by placing a pattern jump command in the pattern. + if(!RestartPosToPattern()) + { + // Couldn't fix it! :( + CHANGEMODTYPE_WARNING(wRestartPos); + } } // Fix channel settings (pan/vol) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-10 14:15:41 UTC (rev 1100) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-10 15:08:27 UTC (rev 1101) @@ -2786,7 +2786,7 @@ case MOD_TYPE_MOD: default: - pModSpecs = &ModSpecs::modEx; + pModSpecs = &ModSpecs::mod; break; } } Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2011-10-10 14:15:41 UTC (rev 1100) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2011-10-10 15:08:27 UTC (rev 1101) @@ -151,46 +151,6 @@ false, // No custom pattern time signatures }; -// MOD with MPT extensions. -const CModSpecifications modEx = -{ - // TODO: Set correct values. - "mod", // File extension - MOD_TYPE_MOD, // Internal MODTYPE value - 37, // Minimum note index - 108, // Maximum note index - false, // No notecut. - false, // No noteoff. - false, // No notefade. - 128, // Pattern max. - 128, // Order max. - 4, // Channel min - 32, // Channel max - 32, // Min tempo - 255, // Max tempo - 64, // Min pattern rows - 64, // Max pattern rows - 20, // Max mod name length - 22, // Max sample name length - 0, // Max sample filename length - 0, // Max instrument name length - 0, // Max instrument filename length - 31, // SamplesMax - 0, // instrumentMax - mixLevels_compatible, // defaultMixLevels - 0, // Max MIDI mapping directives - 1, // Min Speed - 32, // Max Speed - false, // No song comments - 0, // No instrument envelopes - false, // No envelope release node - " 0123456789ABCD?FF?E???????????????", // Supported Effects - " ???????????????", // Supported Volume Column commands - false, // Doesn't have "+++" pattern - true, // Has restart position (order) - false, // Doesn't support plugins - false, // No custom pattern time signatures -}; const CModSpecifications xm = { @@ -256,7 +216,7 @@ 0, // Max sample filename length 22, // Max instrument name length 0, // Max instrument filename length - 4000, // SamplesMax (actually 16 per instrument(256*16=4096), but limited to MAX_SAMPLES=4000) + MAX_SAMPLES, // SamplesMax (actually 32 per instrument(256 * 32 = 8192), but limited to MAX_SAMPLES = 4000) 256, // instrumentMax mixLevels_compatible, // defaultMixLevels 200, // Max MIDI mapping directives @@ -429,12 +389,12 @@ " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\?#", // Supported Effects " vpcdab?h??gfe?o", // Supported Volume Column commands true, // Has "+++" pattern - true, // Has restart position (order) + false, // Doesn't have restart position (order) true, // Supports plugins false, // No custom pattern time signatures }; -static const CModSpecifications *Collection[] = { &mptm, &mod, &modEx, &s3m, &s3mEx, &xm, &xmEx, &it, &itEx }; +static const CModSpecifications *Collection[] = { &mptm, &mod, &s3m, &s3mEx, &xm, &xmEx, &it, &itEx }; } // namespace ModSpecs Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-10 14:15:41 UTC (rev 1100) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-10 15:08:27 UTC (rev 1101) @@ -805,22 +805,23 @@ //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { // First, reject invalid parameters. - if(!Patterns.IsValidIndex(nPat) || nRow >= Patterns[nPat].GetNumRows() || (nChn >= GetNumChannels() && nChn != CHANNELINDEX_INVALID)) + if(!Patterns.IsValidPat(nPat) || nRow >= Patterns[nPat].GetNumRows() || (nChn >= GetNumChannels() && nChn != CHANNELINDEX_INVALID)) { return false; } CHANNELINDEX nScanChnMin = nChn, nScanChnMax = nChn; - MODCOMMAND * const p = Patterns[nPat].GetpModCommand(nRow, nScanChnMin); - MODCOMMAND *m; // Scan all channels if(nChn == CHANNELINDEX_INVALID) { nScanChnMin = 0; - nScanChnMax = m_nChannels - 1; + nScanChnMax = GetNumChannels() - 1; } + MODCOMMAND * const p = Patterns[nPat].GetpModCommand(nRow, nScanChnMin); + MODCOMMAND *m; + // Scan channel(s) for same effect type - if an effect of the same type is already present, exit. if(!bAllowMultipleEffects) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-10 22:13:58
|
Revision: 1102 http://modplug.svn.sourceforge.net/modplug/?rev=1102&view=rev Author: saga-games Date: 2011-10-10 22:13:51 +0000 (Mon, 10 Oct 2011) Log Message: ----------- [Mod] Channel Manager: Changed update messages sent to other views to only contain sensible update messages. [Fix] Pattern loops in S3M files (tx Greasemonkey) - pattern loops have no per-channel memory in ST3. [Fix] In FT2 compatible mode, volume column tone portamento still had an effect memory. Modified Paths: -------------- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-10 15:08:27 UTC (rev 1101) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-10 22:13:51 UTC (rev 1102) @@ -188,7 +188,7 @@ CriticalSection cs; //Creating new order-vector for ReArrangeChannels. - vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels); + vector<CHANNELINDEX> newChnOrder(nChannels); for(CHANNELINDEX nChn = 0; nChn < nChannels; nChn++) { newChnOrder.push_back(newpat[nChn]); @@ -227,8 +227,7 @@ // Update document & player pModDoc->SetModified(); - pModDoc->UpdateAllViews(NULL,0xff,NULL); - pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS ); //refresh channel headers + pModDoc->UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODCHANNELS, NULL); //refresh channel headers // Redraw channel manager window InvalidateRect(NULL,TRUE); @@ -288,16 +287,19 @@ CModDoc *pModDoc = pMainFrm ? pMainFrm->GetActiveDoc() : NULL; CSoundFile * m_pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL; - if(pModDoc && m_pSndFile){ + if(pModDoc && m_pSndFile) + { int nbOk = 0, nbSelect = 0; - switch(currentTab){ + switch(currentTab) + { case 0: for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; if(select[nThisChn] && pModDoc->IsChannelSolo(nThisChn)) nbOk++; } @@ -317,7 +319,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; BYTE rec = pModDoc->IsChannelRecord(nThisChn); if(select[nThisChn] && rec == 1) nbOk++; @@ -326,7 +329,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn] && select[nThisChn]){ + if(!removed[nThisChn] && select[nThisChn]) + { if(select[nThisChn] && nbSelect != nbOk && pModDoc->IsChannelRecord(nThisChn) != 1) pModDoc->Record1Channel(nThisChn); else if(nbSelect == nbOk) pModDoc->Record1Channel(nThisChn, false); } @@ -354,7 +358,7 @@ ResetState(); LeaveCriticalSection(&applying); - pModDoc->UpdateAllViews(NULL,0xff,NULL); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); InvalidateRect(NULL,FALSE); } else LeaveCriticalSection(&applying); @@ -377,7 +381,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; if(select[nThisChn] && pModDoc->IsChannelMuted(nThisChn)) nbOk++; } @@ -385,7 +390,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(select[nThisChn] && !removed[nThisChn]){ + if(select[nThisChn] && !removed[nThisChn]) + { if(pModDoc->IsChannelSolo(nThisChn)) pModDoc->SoloChannel(nThisChn, false); if(nbSelect == nbOk) pModDoc->MuteChannel(nThisChn, !pModDoc->IsChannelMuted(nThisChn)); else pModDoc->MuteChannel(nThisChn, true); @@ -396,7 +402,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; BYTE rec = pModDoc->IsChannelRecord(nThisChn); if(select[nThisChn] && rec == 2) nbOk++; @@ -405,7 +412,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn] && select[nThisChn]){ + if(!removed[nThisChn] && select[nThisChn]) + { if(select[nThisChn] && nbSelect != nbOk && pModDoc->IsChannelRecord(nThisChn) != 2) pModDoc->Record2Channel(nThisChn); else if(nbSelect == nbOk) pModDoc->Record2Channel(nThisChn, false); } @@ -428,7 +436,7 @@ if(currentTab != 3) ResetState(); LeaveCriticalSection(&applying); - pModDoc->UpdateAllViews(NULL,0xff,NULL); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); InvalidateRect(NULL,FALSE); } else LeaveCriticalSection(&applying); @@ -512,7 +520,7 @@ if(currentTab != 3) ResetState(); LeaveCriticalSection(&applying); - pModDoc->UpdateAllViews(NULL,0xff,NULL); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); InvalidateRect(NULL,FALSE); } @@ -1028,7 +1036,7 @@ for(CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS ; nChn++) state[pattern[nChn]] = false; - if(pModDoc) pModDoc->UpdateAllViews(NULL,0xff,NULL); + if(pModDoc) pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); LeaveCriticalSection(&applying); } @@ -1060,7 +1068,7 @@ rightButton = false; CMainFrame * pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = pMainFrm->GetActiveDoc(); - if(pModDoc) pModDoc->UpdateAllViews(NULL,0xff,NULL); + if(pModDoc) pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); LeaveCriticalSection(&applying); } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-10 15:08:27 UTC (rev 1101) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-10 22:13:51 UTC (rev 1102) @@ -1425,8 +1425,18 @@ if ((((param & 0xF0) == 0x60) && (cmd == CMD_MODCMDEX)) || (((param & 0xF0) == 0xB0) && (cmd == CMD_S3MCMDEX))) { - int nloop = PatternLoop(pChn, param & 0x0F); - if (nloop >= 0) nPatLoopRow = nloop; + ROWINDEX nloop = PatternLoop(pChn, param & 0x0F); + if (nloop != ROWINDEX_INVALID) nPatLoopRow = nloop; + + if(GetType() == MOD_TYPE_S3M) + { + // ST3 doesn't have per-channel pattern loop memory, so spam all changes to other channels as well. + for (CHANNELINDEX i = 0; i < GetNumChannels(); i++) + { + Chn[i].nPatternLoop = pChn->nPatternLoop; + Chn[i].nPatternLoopCount = pChn->nPatternLoopCount; + } + } } else // Pattern Delay if ((param & 0xF0) == 0xE0) @@ -1661,7 +1671,7 @@ { if (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) TonePortamento(pChn, ImpulseTrackerPortaVolCmd[vol & 0x0F]); - else + else if(vol != 0 || !IsCompatibleMode(TRK_FASTTRACKER2)) TonePortamento(pChn, vol * 16); } else { @@ -1673,7 +1683,6 @@ case VOLCMD_VOLUME: case VOLCMD_PANNING: case VOLCMD_VIBRATODEPTH: - case VOLCMD_TONEPORTAMENTO: break; default: // no memory here. @@ -1743,7 +1752,7 @@ case VOLCMD_OFFSET: //rewbs.volOff if (m_nTickCount == nStartTick) - SampleOffset(nChn, vol << 3, bPorta); + SampleOffset(nChn, vol << 3); break; } } @@ -1840,8 +1849,12 @@ // Set Offset case CMD_OFFSET: if (m_nTickCount) break; - //rewbs.volOffset: moved sample offset code to own method - SampleOffset(nChn, param, bPorta); + // XM compatibility: Portamento + Offset = Ignore offset + if(bPorta && GetType() == MOD_TYPE_XM) + { + break; + } + SampleOffset(nChn, param); break; // Arpeggio @@ -3073,8 +3086,8 @@ } -inline void CSoundFile::InvertLoop(MODCHANNEL *pChn) -//-------------------------------------------------- +void CSoundFile::InvertLoop(MODCHANNEL *pChn) +//------------------------------------------- { // EFx implementation for MOD files (PT 1.1A and up: Invert Loop) // This effect trashes samples. Thanks to 8bitbubsy for making this work. :) @@ -3453,8 +3466,8 @@ //rewbs.volOffset: moved offset code to own method as it will be used in several places now -void CSoundFile::SampleOffset(CHANNELINDEX nChn, UINT param, bool bPorta) -//----------------------------------------------------------------------- +void CSoundFile::SampleOffset(CHANNELINDEX nChn, UINT param) +//---------------------------------------------------------- { MODCHANNEL *pChn = &Chn[nChn]; @@ -3489,11 +3502,6 @@ if ((pChn->rowCommand.note >= NOTE_MIN) && (pChn->rowCommand.note <= NOTE_MAX)) { - // XM compatibility: Portamento + Offset = Ignore offset - if(bPorta && GetType() == MOD_TYPE_XM) - { - return; - } pChn->nPos = param; if (pChn->nPos >= pChn->nLength) @@ -3648,7 +3656,7 @@ { if (pChn->pModSample) pChn->nLength = pChn->pModSample->nLength; - SampleOffset(nChn, offset, false); + SampleOffset(nChn, offset); } } @@ -3869,33 +3877,39 @@ } -int CSoundFile::PatternLoop(MODCHANNEL *pChn, UINT param) -//------------------------------------------------------- +ROWINDEX CSoundFile::PatternLoop(MODCHANNEL *pChn, UINT param) +//------------------------------------------------------------ { if (param) { + // Loop Repeat if (pChn->nPatternLoopCount) { + // There's a loop left pChn->nPatternLoopCount--; if(!pChn->nPatternLoopCount) { - //IT compatibility 10. Pattern loops (+ same fix for MOD files) - if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_PROTRACKER)) + // IT compatibility 10. Pattern loops (+ same fix for MOD / S3M files) + // When finishing a pattern loop, the next loop without a dedicated SB0 starts on the first row after the previous loop. + if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_PROTRACKER | TRK_SCREAMTRACKER)) + { pChn->nPatternLoop = m_nRow + 1; + } - return -1; + return ROWINDEX_INVALID; } } else { - MODCHANNEL *p = Chn; + // This was the last loop - //IT compatibility 10. Pattern loops (+ same fix for XM and MOD files) - if(!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_PROTRACKER)) + // IT compatibility 10. Pattern loops (+ same fix for XM and MOD files) + if(!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_PROTRACKER | TRK_SCREAMTRACKER)) { - for (UINT i=0; i<m_nChannels; i++, p++) if (p != pChn) + MODCHANNEL *p = Chn; + for (CHANNELINDEX i = 0; i < GetNumChannels(); i++, p++) if (p != pChn) { // Loop already done - if (p->nPatternLoopCount) return -1; + if (p->nPatternLoopCount) return ROWINDEX_INVALID; } } pChn->nPatternLoopCount = param; @@ -3904,9 +3918,10 @@ return pChn->nPatternLoop; } else { + // Loop Start pChn->nPatternLoop = m_nRow; } - return -1; + return ROWINDEX_INVALID; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-10-10 15:08:27 UTC (rev 1101) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-10-10 22:13:51 UTC (rev 1102) @@ -1006,13 +1006,14 @@ void Tremolo(MODCHANNEL *pChn, UINT param); void Panbrello(MODCHANNEL *pChn, UINT param); void RetrigNote(CHANNELINDEX nChn, int param, UINT offset=0); //rewbs.volOffset: added last param - void SampleOffset(CHANNELINDEX nChn, UINT param, bool bPorta); //rewbs.volOffset: moved offset code to own method + void SampleOffset(CHANNELINDEX nChn, UINT param); void NoteCut(CHANNELINDEX nChn, UINT nTick); - int PatternLoop(MODCHANNEL *, UINT param); + ROWINDEX PatternLoop(MODCHANNEL *, UINT param); void ExtendedMODCommands(CHANNELINDEX nChn, UINT param); void ExtendedS3MCommands(CHANNELINDEX nChn, UINT param); void ExtendedChannelEffect(MODCHANNEL *, UINT param); - inline void InvertLoop(MODCHANNEL* pChn); + void InvertLoop(MODCHANNEL* pChn); + void ProcessMacroOnChannel(CHANNELINDEX nChn); void ProcessMIDIMacro(CHANNELINDEX nChn, bool isSmooth, char *macro, uint8 param = 0, PLUGINDEX plugin = 0); float CalculateSmoothParamChange(float currentValue, float param) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-12 19:10:48
|
Revision: 1103 http://modplug.svn.sourceforge.net/modplug/?rev=1103&view=rev Author: saga-games Date: 2011-10-12 19:10:41 +0000 (Wed, 12 Oct 2011) Log Message: ----------- [Fix] S3M Loader: MIDI Macros are now cleared when loading S3M files saved with Impulse Tracker 2.13 or older (fixes BABYLON.S3M by Necros) [Fix] Note Properties: When showing the note properties of a #xx effect, negative values could have been shown. [Mod] Pitch/Tempo lock cannot be used in IT files anymore. Files that make use of this setting still work, but it cannot be used for new files. [Mod] Main window is now always used as a parent window for message boxes if parent window is specified, to avoid "lost" message boxes (keyboard handler would be disabled as long as lost message boxes are still active). [Mod] OpenMPT: Version is now 1.20.00.42 Modified Paths: -------------- trunk/OpenMPT/common/Reporting.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/ModConvert.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Load_s3m.cpp Modified: trunk/OpenMPT/common/Reporting.cpp =================================================================== --- trunk/OpenMPT/common/Reporting.cpp 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/common/Reporting.cpp 2011-10-12 19:10:41 UTC (rev 1103) @@ -23,6 +23,10 @@ pMainFrm->GetInputHandler()->Bypass(true); } + if(parent == nullptr) + { + parent = pMainFrm; + } UINT result = ::MessageBox((parent ? parent->m_hWnd : NULL), text, caption, flags); if(pMainFrm != nullptr && pMainFrm->GetInputHandler() != nullptr) Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-10-12 19:10:41 UTC (rev 1103) @@ -1164,6 +1164,9 @@ if (((dwHintMask >> HINT_SHIFT_INS) != m_nInstrument) && (dwHintMask & (HINT_INSTRUMENT|HINT_ENVELOPE)) && (!(dwHintMask & HINT_MODTYPE))) return; LockControls(); if (!m_bInitialized) dwHintMask |= HINT_MODTYPE; + + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if (dwHintMask & HINT_MODTYPE) { const CModSpecifications *specs = &m_pSndFile->GetModSpecifications(); @@ -1172,10 +1175,10 @@ m_EditName.SetLimitText(specs->instrNameLengthMax); m_EditFileName.SetLimitText(specs->instrFilenameLengthMax); - const BOOL bITandMPT = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + const BOOL bITandMPT = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->GetNumInstruments())) ? TRUE : FALSE; //rewbs.instroVSTi - const BOOL bITandXM = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; - const BOOL bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + const BOOL bITandXM = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) && (m_pSndFile->GetNumInstruments())) ? TRUE : FALSE; + const BOOL bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->GetNumInstruments())) ? TRUE : FALSE; ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT10), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT11), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT7), bITandXM); @@ -1223,13 +1226,12 @@ m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); m_ComboTuning.EnableWindow(bMPTOnly); - m_EditPitchTempoLock.EnableWindow(bITandMPT); - m_CheckPitchTempoLock.EnableWindow(bITandMPT); + m_EditPitchTempoLock.EnableWindow(bMPTOnly); + m_CheckPitchTempoLock.EnableWindow(bMPTOnly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { CHAR s[128]; - MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; if (pIns) { memcpy(s, pIns->name, 32); @@ -1260,28 +1262,36 @@ //if (pIns->nMidiChannel & 0x80) m_CbnMidiCh.SetCurSel((pIns->nMidiChannel&0x7f)+16); else // m_CbnMidiCh.SetCurSel(0); //now: - if (pIns->nMidiChannel < 17) { + if (pIns->nMidiChannel < 17) + { m_CbnMidiCh.SetCurSel(pIns->nMidiChannel); - } else { + } else + { m_CbnMidiCh.SetCurSel(0); } - if (pIns->nMixPlug <= MAX_MIXPLUGINS) { + if (pIns->nMixPlug <= MAX_MIXPLUGINS) + { m_CbnMixPlug.SetCurSel(pIns->nMixPlug); - } else { + } else + { m_CbnMixPlug.SetCurSel(0); } OnMixPlugChanged(); //end rewbs.instroVSTi - for(int nRes = 0; nRes<m_CbnResampling.GetCount(); nRes++) { + for(int nRes = 0; nRes<m_CbnResampling.GetCount(); nRes++) + { DWORD v = m_CbnResampling.GetItemData(nRes); - if (pIns->nResampling == v) { + if (pIns->nResampling == v) + { m_CbnResampling.SetCurSel(nRes); break; } } - for(int nFltMode = 0; nFltMode<m_CbnFilterMode.GetCount(); nFltMode++) { + for(int nFltMode = 0; nFltMode<m_CbnFilterMode.GetCount(); nFltMode++) + { DWORD v = m_CbnFilterMode.GetItemData(nFltMode); - if (pIns->nFilterMode == v) { + if (pIns->nFilterMode == v) + { m_CbnFilterMode.SetCurSel(nFltMode); break; } @@ -1317,11 +1327,12 @@ // -! NEW_FEATURE#0027 UpdateTuningComboBox(); - if(pIns->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. - CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); - else - CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); - + + // Only enable Pitch/Tempo Lock for MPTM files or legacy files that have this property enabled. + m_EditPitchTempoLock.EnableWindow((m_pSndFile->GetType() == MOD_TYPE_MPT || pIns->wPitchToTempoLock > 0) ? TRUE : FALSE); + m_CheckPitchTempoLock.EnableWindow(m_EditPitchTempoLock.IsWindowEnabled()); + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, (pIns->wPitchToTempoLock > 0 ? MF_CHECKED : MF_UNCHECKED)); + OnBnClickedCheckPitchtempolock(); if(m_pSndFile->GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-12 19:10:41 UTC (rev 1103) @@ -351,58 +351,64 @@ for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++) { + MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns]; + if(pIns == nullptr) + { + continue; + } + // Convert IT/MPT to XM (fix instruments) if(oldTypeIsIT_MPT && newTypeIsXM) { - MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns]; - if (pIns) + for (UINT k = 0; k < NOTE_MAX; k++) { - for (UINT k = 0; k < NOTE_MAX; k++) + if ((pIns->NoteMap[k]) && (pIns->NoteMap[k] != (BYTE)(k+1))) { - if ((pIns->NoteMap[k]) && (pIns->NoteMap[k] != (BYTE)(k+1))) - { - CHANGEMODTYPE_WARNING(wBrokenNoteMap); - break; - } + CHANGEMODTYPE_WARNING(wBrokenNoteMap); + break; } - // Convert sustain loops to sustain "points" - if(pIns->VolEnv.nSustainStart != pIns->VolEnv.nSustainEnd) - { - CHANGEMODTYPE_WARNING(wInstrumentSustainLoops); - pIns->VolEnv.nSustainEnd = pIns->VolEnv.nSustainStart; - } - if(pIns->PanEnv.nSustainStart != pIns->PanEnv.nSustainEnd) - { - CHANGEMODTYPE_WARNING(wInstrumentSustainLoops); - pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart; - } - pIns->VolEnv.dwFlags &= ~ENV_CARRY; - pIns->PanEnv.dwFlags &= ~ENV_CARRY; - pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER); - pIns->dwFlags &= ~INS_SETPANNING; - pIns->nIFC &= 0x7F; - pIns->nIFR &= 0x7F; - pIns->nFilterMode = FLTMODE_UNCHANGED; + } + // Convert sustain loops to sustain "points" + if(pIns->VolEnv.nSustainStart != pIns->VolEnv.nSustainEnd) + { + CHANGEMODTYPE_WARNING(wInstrumentSustainLoops); + pIns->VolEnv.nSustainEnd = pIns->VolEnv.nSustainStart; + } + if(pIns->PanEnv.nSustainStart != pIns->PanEnv.nSustainEnd) + { + CHANGEMODTYPE_WARNING(wInstrumentSustainLoops); + pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart; + } + pIns->VolEnv.dwFlags &= ~ENV_CARRY; + pIns->PanEnv.dwFlags &= ~ENV_CARRY; + pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER); + pIns->dwFlags &= ~INS_SETPANNING; + pIns->nIFC &= 0x7F; + pIns->nIFR &= 0x7F; + pIns->nFilterMode = FLTMODE_UNCHANGED; - pIns->nCutSwing = pIns->nPanSwing = pIns->nResSwing = pIns->nVolSwing = 0; + pIns->nCutSwing = pIns->nPanSwing = pIns->nResSwing = pIns->nVolSwing = 0; - pIns->wPitchToTempoLock = 0; + pIns->nPPC = NOTE_MIDDLEC - 1; + pIns->nPPS = 0; - pIns->nPPC = NOTE_MIDDLEC - 1; - pIns->nPPS = 0; - - pIns->nGlobalVol = 64; - pIns->nPan = 128; - } + pIns->nGlobalVol = 64; + pIns->nPan = 128; } - // Convert MPT to anything - remove instrument tunings + // Convert MPT to anything - remove instrument tunings, Pitch/Tempo Lock if(oldTypeIsMPT) { - if(m_SndFile.Instruments[nIns] != nullptr && m_SndFile.Instruments[nIns]->pTuning != nullptr) + if(pIns->pTuning != nullptr) { - m_SndFile.Instruments[nIns]->SetTuning(nullptr); + pIns->SetTuning(nullptr); CHANGEMODTYPE_WARNING(wInstrumentTuning); } + + if(pIns->wPitchToTempoLock != 0) + { + pIns->wPitchToTempoLock = 0; + CHANGEMODTYPE_WARNING(wPitchToTempoLock); + } } } @@ -523,26 +529,34 @@ ConvertSamplesToInstruments(); } + // Pattern warnings CHAR s[64]; - CHANGEMODTYPE_CHECK(wInstrumentsToSamples, "All instruments have been converted to samples.\n"); wsprintf(s, "%d patterns have been resized to 64 rows\n", nResizedPatterns); CHANGEMODTYPE_CHECK(wResizedPatterns, s); + CHANGEMODTYPE_CHECK(wRestartPos, "Restart position is not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wPatternSignatures, "Pattern-specific time signatures are not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wChannelVolSurround, "Channel volume and surround are not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wChannelPanning, "Channel panning is not supported by the new format.\n"); + + // Sample warnings CHANGEMODTYPE_CHECK(wSampleBidiLoops, "Sample bidi loops are not supported by the new format.\n"); CHANGEMODTYPE_CHECK(wSampleSustainLoops, "New format doesn't support sample sustain loops.\n"); CHANGEMODTYPE_CHECK(wSampleAutoVibrato, "New format doesn't support sample autovibrato.\n"); CHANGEMODTYPE_CHECK(wMODSampleFrequency, "Sample C-5 frequencies will be lost.\n"); - CHANGEMODTYPE_CHECK(wBrokenNoteMap, "Note Mapping will be lost when saving as XM.\n"); + CHANGEMODTYPE_CHECK(wMOD31Samples, "Samples above 31 will be lost when saving as MOD. Consider rearranging samples if there are unused slots available.\n"); + + // Instrument warnings + CHANGEMODTYPE_CHECK(wInstrumentsToSamples, "All instruments have been converted to samples.\n"); + CHANGEMODTYPE_CHECK(wTrimmedEnvelopes, "Instrument envelopes have been shortened.\n"); CHANGEMODTYPE_CHECK(wInstrumentSustainLoops, "Sustain loops were converted to sustain points.\n"); CHANGEMODTYPE_CHECK(wInstrumentTuning, "Instrument tunings will be lost.\n"); + CHANGEMODTYPE_CHECK(wPitchToTempoLock, "Pitch / Tempo Lock instrument property is not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wBrokenNoteMap, "Note Mapping will be lost when saving as XM.\n"); + CHANGEMODTYPE_CHECK(wReleaseNode, "Instrument envelope release nodes are not supported by the new format.\n"); + + // General warnings CHANGEMODTYPE_CHECK(wMODGlobalVars, "Default speed, tempo and global volume will be lost.\n"); - CHANGEMODTYPE_CHECK(wMOD31Samples, "Samples above 31 will be lost when saving as MOD. Consider rearranging samples if there are unused slots available.\n"); - CHANGEMODTYPE_CHECK(wRestartPos, "Restart position is not supported by the new format.\n"); - CHANGEMODTYPE_CHECK(wChannelVolSurround, "Channel volume and surround are not supported by the new format.\n"); - CHANGEMODTYPE_CHECK(wChannelPanning, "Channel panning is not supported by the new format.\n"); - CHANGEMODTYPE_CHECK(wPatternSignatures, "Pattern-specific time signatures are not supported by the new format.\n"); CHANGEMODTYPE_CHECK(wLinearSlides, "Linear Frequency Slides not supported by the new format.\n"); - CHANGEMODTYPE_CHECK(wTrimmedEnvelopes, "Instrument envelopes have been shortened.\n"); - CHANGEMODTYPE_CHECK(wReleaseNode, "Instrument envelope release nodes are not supported by the new format.\n"); CHANGEMODTYPE_CHECK(wEditHistory, "Edit history will not be saved in the new format.\n"); CHANGEMODTYPE_CHECK(wMixmode, "Consider setting the mix levels to \"Compatible\" in the song properties when working with legacy formats.\n"); CHANGEMODTYPE_CHECK(wCompatibilityMode, "Consider enabling the \"compatible playback\" option in the song properties to increase compatiblity with other players.\n"); Modified: trunk/OpenMPT/mptrack/ModConvert.h =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.h 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/mptrack/ModConvert.h 2011-10-12 19:10:41 UTC (rev 1103) @@ -35,6 +35,7 @@ wEditHistory, wMixmode, wCompatibilityMode, + wPitchToTempoLock, wNumWarnings }; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-12 19:10:41 UTC (rev 1103) @@ -3055,7 +3055,7 @@ } else { - wsprintf(s, "%d", param); + wsprintf(s, "%u", param); } } strcat(pszName, s); Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2011-10-12 19:10:41 UTC (rev 1103) @@ -547,7 +547,7 @@ {PATTERN_FLATBUTTONS, "Flat Buttons", "Use flat buttons in toolbars"}, {PATTERN_SINGLEEXPAND, "Single click to expand tree", "Single-clicking in the left tree view will expand a branch"}, {PATTERN_MUTECHNMODE, "Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."}, - {PATTERN_NOEXTRALOUD, "No loud samples", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if activated, a sample volume of 256 is used)."}, + {PATTERN_NOEXTRALOUD, "No loud sample preview", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if disabled, a sample volume of 256 is used)."}, {PATTERN_SHOWPREVIOUS, "Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."}, {PATTERN_CONTSCROLL, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"}, {PATTERN_KBDNOTEOFF, "Record note off", "Record note off when a key is released on the PC keyboard (Only works in instrument mode)."}, Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/mptrack/version.h 2011-10-12 19:10:41 UTC (rev 1103) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 41 +#define VER_MINORMINOR 42 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-10-10 22:13:51 UTC (rev 1102) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-10-12 19:10:41 UTC (rev 1103) @@ -253,13 +253,18 @@ { // MPT 1.16 and older versions of OpenMPT m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); - bKeepMidiMacros = true; // simply load Zxx commands + // Simply keep default (filter) MIDI macros + bKeepMidiMacros = true; } if((psfh.cwtv & 0xF000) >= 0x2000) { // 2xyy - Orpheus, 3xyy - IT, 4xyy - Schism, 5xyy - OpenMPT - bKeepMidiMacros = true; // simply load Zxx commands + if((psfh.cwtv & 0xF000) != 0x3000 || psfh.cwtv >= 0x3214) + { + // Keep MIDI macros if this is not an old IT version (BABYLON.S3M by Necros has Zxx commands and was saved with IT 2.05) + bKeepMidiMacros = true; + } } if(!bKeepMidiMacros) // Remove macros so they don't interfere with tunes made in trackers that don't support Zxx This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-15 13:37:04
|
Revision: 1104 http://modplug.svn.sourceforge.net/modplug/?rev=1104&view=rev Author: saga-games Date: 2011-10-15 13:36:57 +0000 (Sat, 15 Oct 2011) Log Message: ----------- [Fix] ITI Saving: Sample name / file name are now also sanitized. [Fix] Pattern Editor: Replacing "no note" with note + 1 or note + 12 will not create C-0 / B-0 notes in the pattern anymore. [Fix] Pattern Editor: When default volumes are enabled, default volume is now also shown for instrument notes that have no sample assigned (for VSTi) Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/Sampleio.cpp Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-10-12 19:10:41 UTC (rev 1103) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-10-15 13:36:57 UTC (rev 1104) @@ -477,10 +477,13 @@ sample = 0; } } + volcmd = VOLCMD_VOLUME; if(sample && sample <= pSndFile->GetNumSamples()) { - volcmd = VOLCMD_VOLUME; vol = pSndFile->GetSample(sample).nVolume / 4; + } else + { + vol = 64; } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-12 19:10:41 UTC (rev 1103) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-15 13:36:57 UTC (rev 1104) @@ -2044,29 +2044,29 @@ { // Just create one logic undo step when auto-replacing all occurences. const bool linkUndoBuffer = (nFound > 1) && (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) != 0; - pModDoc->GetPatternUndo()->PrepareUndo(nPat, n % pSndFile->m_nChannels, n / pSndFile->m_nChannels, 1, 1, linkUndoBuffer); + pModDoc->GetPatternUndo()->PrepareUndo(nPat, n % pSndFile->GetNumChannels(), n / pSndFile->GetNumChannels(), 1, 1, linkUndoBuffer); if ((m_findReplace.dwReplaceFlags & PATSEARCH_NOTE)) { // -1 octave if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNoteMinusOctave) { - if (m->note > 12) m->note -= 12; + if (m->note > (12 + NOTE_MIN - 1) && m->note <= NOTE_MAX) m->note -= 12; } else // +1 octave if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNotePlusOctave) { - if (m->note <= NOTE_MAX - 12) m->note += 12; + if (m->note <= NOTE_MAX - 12 && m->note >= NOTE_MIN) m->note += 12; } else // Note-- if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNoteMinusOne) { - if (m->note > 1) m->note--; + if (m->note > NOTE_MIN && m->note <= NOTE_MAX) m->note--; } else // Note++ if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNotePlusOne) { - if (m->note < NOTE_MAX) m->note++; + if (m->note < NOTE_MAX && m->note >= NOTE_MIN) m->note++; } else // Replace with another note { Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2011-10-12 19:10:41 UTC (rev 1103) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2011-10-15 13:36:57 UTC (rev 1104) @@ -1393,7 +1393,7 @@ // XI Sample Data for (UINT dsmp=0; dsmp<nsamples; dsmp++) { - MODSAMPLE *pSmp = &Samples[smptable[dsmp]]; + const MODSAMPLE *pSmp = &Samples[smptable[dsmp]]; UINT smpflags = (pSmp->uFlags & CHN_16BIT) ? RS_PCM16D : RS_PCM8D; if (pSmp->uFlags & CHN_STEREO) smpflags = (pSmp->uFlags & CHN_16BIT) ? RS_STPCM16D : RS_STPCM8D; WriteSample(f, pSmp, smpflags); @@ -1910,7 +1910,9 @@ MODSAMPLE *psmp = &Samples[nsmp]; itss.id = LittleEndian(IT_IMPS); memcpy(itss.filename, psmp->filename, 12); + StringFixer::FixNullString(itss.filename); memcpy(itss.name, m_szNames[nsmp], 26); + StringFixer::FixNullString(itss.name); itss.gvl = (BYTE)psmp->nGlobalVol; itss.flags = 0x01; if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-19 15:41:11
|
Revision: 1108 http://modplug.svn.sourceforge.net/modplug/?rev=1108&view=rev Author: saga-games Date: 2011-10-19 15:41:03 +0000 (Wed, 19 Oct 2011) Log Message: ----------- [Imp] Completely rewrote default VST editor. Multiple parameters can be edited at the same time, with the same automation functionality (record to param, automatic MIDI Mapping by pressing shift, etc...) as the custom editor, remembers window position, etc... [Fix] Custom VST editor doesn't have a grey bar of nothingness at the bottom anymore in some cases (was related to the default window size in the resouce) [Fix] General Tab: When switching between plugins, the parameter dropdown box is now updated properly. [Mod] OpenMPT: Version is now 1.20.00.45 Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/mptrack/DefaultVstEditor.cpp trunk/OpenMPT/mptrack/DefaultVstEditor.h trunk/OpenMPT/mptrack/VSTEditor.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/common/misc_util.h 2011-10-19 15:41:03 UTC (rev 1108) @@ -199,6 +199,15 @@ } +// Returns sign of a number (-1 for negative numbers, 1 for positive numbers, 0 for 0) +template <class T> +int sgn(T value) +//-------------- +{ + return (value > T(0)) - (value < T(0)); +} + + // Convert a variable-length MIDI integer <value> to a normal integer <result>. // Function returns how many bytes have been read. template <class TIn, class TOut> Modified: trunk/OpenMPT/mptrack/DefaultVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2011-10-19 15:41:03 UTC (rev 1108) @@ -1,54 +1,398 @@ #include "stdafx.h" //#include "vstplug.h" #include "moddoc.h" -#include "defaultvsteditor.h" -#include ".\defaultvsteditor.h" +#include "DefaultVstEditor.h" #ifndef NO_VST -CDefaultVstEditor::CDefaultVstEditor(CVstPlugin *pPlugin) : CAbstractVstEditor(pPlugin) -//------------------------------------------------------------------------------------- + +// Window proportions +enum { - m_nCurrentParam = 0; - m_nControlLock=0; + edSpacing = 5, // Spacing between elements + edLineHeight = 20, // Line of a single parameter line + edEditWidth = 45, // Width of the parameter edit box + edPerMilWidth = 30, // Width of the per mil label + edRightWidth = edEditWidth + edSpacing + edPerMilWidth, // Width of the right part of a parameter control set (edit box, param value) + edTotalHeight = 2 * edLineHeight + edSpacing, // Height of one set of controls +}; + + +// Create a set of parameter controls +ParamControlSet::ParamControlSet(CWnd *parent, const CRect &rect, int setID) +//-------------------------------------------------------------------------- +{ + // Offset of components on the right side + const int horizSplit = rect.left + rect.Width() - edRightWidth; + + // Parameter name + nameLabel.Create("", WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, CRect(rect.left, rect.top, horizSplit - edSpacing, rect.top + edLineHeight), parent); + nameLabel.SetFont(parent->GetFont()); + + // Parameter value as reported by the plugin + valueLabel.Create("", WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, CRect(horizSplit, rect.top, rect.right, rect.top + edLineHeight), parent); + valueLabel.SetFont(parent->GetFont()); + + // Parameter value slider + valueSlider.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP /* | TBS_NOTICKS | TBS_BOTH */ | TBS_AUTOTICKS, CRect(rect.left, rect.bottom - edLineHeight, horizSplit - edSpacing, rect.bottom), parent, ID_PLUGINEDITOR_SLIDERS_BASE + setID); + valueSlider.SetFont(parent->GetFont()); + valueSlider.SetRange(0, PARAM_RESOLUTION); + valueSlider.SetTicFreq(PARAM_RESOLUTION / 10); + + // Parameter value edit box + valueEdit.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL | ES_NUMBER, CRect(horizSplit, rect.bottom - edLineHeight, horizSplit + edEditWidth, rect.bottom), parent, ID_PLUGINEDITOR_EDIT_BASE + setID); + valueEdit.SetFont(parent->GetFont()); + + // "Per mil" label + perMilLabel.Create("\x89", WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, CRect(horizSplit + edEditWidth + edSpacing, rect.bottom - edLineHeight, rect.right, rect.bottom), parent); + perMilLabel.SetFont(parent->GetFont()); } -CDefaultVstEditor::~CDefaultVstEditor(void) -//----------------------------------------- + +ParamControlSet::~ParamControlSet() +//--------------------------------- { + nameLabel.DestroyWindow(); + valueLabel.DestroyWindow(); + valueSlider.DestroyWindow(); + valueEdit.DestroyWindow(); + perMilLabel.DestroyWindow(); } + +// Enable a set of parameter controls +void ParamControlSet::EnableControls(bool enable) +//----------------------------------------------- +{ + const BOOL b = enable ? TRUE : FALSE; + nameLabel.EnableWindow(b); + valueLabel.EnableWindow(b); + valueSlider.EnableWindow(b); + valueEdit.EnableWindow(b); + perMilLabel.EnableWindow(b); +} + + +// Reset the content of a set of parameter controls +void ParamControlSet::ResetContent() +//---------------------------------- +{ + nameLabel.SetWindowText(""); + valueLabel.SetWindowText(""); + valueSlider.SetPos(0); + valueEdit.SetWindowText(""); +} + + +void ParamControlSet::SetParamName(const CString &name) +//----------------------------------------------------- +{ + nameLabel.SetWindowText(name); +} + + +void ParamControlSet::SetParamValue(int value, const CString &text) +//----------------------------------------------------------------- +{ + valueSlider.SetPos(value); + if (&valueEdit != valueEdit.GetFocus()) + { + // Don't update textbox when it has focus, else this will prevent user from changing the content. + CString paramValue; + paramValue.Format("%0000d", value); + valueEdit.SetWindowText(paramValue); + } + valueLabel.SetWindowText(text); +} + + +int ParamControlSet::GetParamValueFromSlider() const +//-------------------------------------------------- +{ + return valueSlider.GetPos(); +} + + +int ParamControlSet::GetParamValueFromEdit() const +//------------------------------------------------ +{ + char s[16]; + valueEdit.GetWindowText(s, 16); + int val = atoi(s); + Limit(val, int(0), int(PARAM_RESOLUTION)); + return val; +} + + BEGIN_MESSAGE_MAP(CDefaultVstEditor, CAbstractVstEditor) //{{AFX_MSG_MAP(CDefaultVstEditor) - ON_EN_CHANGE(IDC_PARAMVALUETEXT,OnParamTextboxChanged) - ON_LBN_SELCHANGE(IDC_PARAMLIST, OnParamChanged) + ON_CONTROL_RANGE(EN_CHANGE, ID_PLUGINEDITOR_EDIT_BASE, ID_PLUGINEDITOR_EDIT_BASE + NUM_PLUGINEDITOR_PARAMETERS - 1, OnParamTextboxChanged) //}}AFX_MSG_MAP + ON_WM_HSCROLL() ON_WM_VSCROLL() + ON_WM_MOUSEWHEEL() END_MESSAGE_MAP() + void CDefaultVstEditor::DoDataExchange(CDataExchange* pDX) //-------------------------------------------------------- { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDefaultVstEditor) - DDX_Control(pDX, IDC_PARAMLIST, m_lbParameters); - DDX_Control(pDX, IDC_PARAMLABEL, m_statParamLabel); - DDX_Control(pDX, IDC_PARAMVALUESLIDE, m_slParam); - DDX_Control(pDX, IDC_PARAMVALUETEXT, m_editParam); + DDX_Control(pDX, IDC_SCROLLBAR1, paramScroller); //}}AFX_DATA_MAP } -void CDefaultVstEditor::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) + +CDefaultVstEditor::CDefaultVstEditor(CVstPlugin *pPlugin) : CAbstractVstEditor(pPlugin) +//------------------------------------------------------------------------------------- +{ + m_nControlLock = 0; + paramOffset = 0; + + controls.clear(); +} + +CDefaultVstEditor::~CDefaultVstEditor() +//------------------------------------- +{ + for(size_t i = 0; i < controls.size(); i++) + { + delete controls[i]; + } +} + + +void CDefaultVstEditor::CreateControls() +//-------------------------------------- +{ + // Already initialized. + if(!controls.empty()) + { + return; + } + + CRect window; + GetWindowRect(&window); + + CRect rect; + GetClientRect(&rect); + int origHeight = rect.bottom; + + // Get parameter scroll bar dimensions and move it to the right side of the window + CRect scrollRect; + paramScroller.GetClientRect(&scrollRect); + scrollRect.bottom = rect.bottom; + scrollRect.MoveToX(rect.right - scrollRect.right); + + // Ignore this space in our calculation from now on. + rect.right -= (scrollRect.right - scrollRect.left); + + controls.clear(); + + // Create a bit of border space + rect.DeflateRect(edSpacing, edSpacing); + rect.bottom = edTotalHeight; + + for(size_t i = 0; i < NUM_PLUGINEDITOR_PARAMETERS; i++) + { + try + { + controls.push_back(new ParamControlSet(this, rect, i)); + rect.OffsetRect(0, edTotalHeight + edSpacing); + } catch(MPTMemoryException) + { + } + } + + // Calculate new ideal window height. + const int heightChange = (rect.bottom - edTotalHeight + edSpacing) - origHeight; + + // Update parameter scroll bar height + scrollRect.bottom += heightChange; + paramScroller.MoveWindow(scrollRect, FALSE); + + // Resize window height + window.bottom += heightChange; + MoveWindow(&window); + + // Set scrollbar page size. + SCROLLINFO sbInfo; + paramScroller.GetScrollInfo(&sbInfo); + sbInfo.nPage = NUM_PLUGINEDITOR_PARAMETERS; + paramScroller.SetScrollInfo(&sbInfo); + + UpdateControls(true); +} + + +void CDefaultVstEditor::UpdateControls(bool updateParamNames) +//----------------------------------------------------------- +{ + if(m_pVstPlugin == nullptr) + { + return; + } + + const PlugParamIndex numParams = m_pVstPlugin->GetNumParameters(); + const PlugParamIndex scrollMax = numParams - min(numParams, NUM_PLUGINEDITOR_PARAMETERS); + LimitMax(paramOffset, scrollMax); + + int curScrollMin, curScrollMax; + paramScroller.GetScrollRange(&curScrollMin, &curScrollMax); + if(curScrollMax != scrollMax) + { + // Number of parameters changed - update scrollbar limits + paramScroller.SetScrollRange(0, scrollMax); + paramScroller.SetScrollPos(paramOffset); + paramScroller.EnableWindow(scrollMax > 0 ? TRUE : FALSE); + updateParamNames = true; + } + + for(PlugParamIndex i = 0; i < NUM_PLUGINEDITOR_PARAMETERS; i++) + { + const PlugParamIndex param = paramOffset + i; + + if(param >= numParams) + { + // This param doesn't exist. + controls[i]->EnableControls(false); + controls[i]->ResetContent(); + continue; + } + + controls[i]->EnableControls(); + + if(updateParamNames) + { + // Update param name + CString s; + CHAR sname[64]; + m_pVstPlugin->GetParamName(param, sname, sizeof(sname)); + s.Format("%02X: %s", paramOffset + i, sname); + controls[i]->SetParamName(s); + } + + UpdateParamDisplay(param); + } +} + + +void CDefaultVstEditor::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //-------------------------------------------------------------------------------- { CSliderCtrl* pScrolledSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar); - if ((pScrolledSlider == &m_slParam) && (nSBCode != SB_ENDSCROLL)) + // Check if any of the value sliders were affected. + for(size_t i = 0; i < controls.size(); i++) { - OnParamSliderChanged(); + if ((pScrolledSlider->GetDlgCtrlID() == controls[i]->GetSliderID()) && (nSBCode != SB_ENDSCROLL)) + { + OnParamSliderChanged(controls[i]->GetSliderID()); + break; + } } + + CAbstractVstEditor::OnHScroll(nSBCode, nPos, pScrollBar); +} + + +void CDefaultVstEditor::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +//-------------------------------------------------------------------------------- +{ + if (pScrollBar == ¶mScroller) + { + // Get the minimum and maximum scrollbar positions. + int minpos; + int maxpos; + pScrollBar->GetScrollRange(&minpos, &maxpos); + //maxpos = pScrollBar->GetScrollLimit(); + + SCROLLINFO sbInfo; + paramScroller.GetScrollInfo(&sbInfo); + + // Get the current position of scroll box. + int curpos = pScrollBar->GetScrollPos(); + + // Determine the new position of scroll box. + switch(nSBCode) + { + case SB_LEFT: // Scroll to far left. + curpos = minpos; + break; + + case SB_RIGHT: // Scroll to far right. + curpos = maxpos; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINELEFT: // Scroll left. + if(curpos > minpos) + curpos--; + break; + + case SB_LINERIGHT: // Scroll right. + if(curpos < maxpos) + curpos++; + break; + + case SB_PAGELEFT: // Scroll one page left. + if(curpos > minpos) + { + curpos = max(minpos, curpos - (int)sbInfo.nPage); + } + break; + + case SB_PAGERIGHT: // Scroll one page right. + if(curpos < maxpos) + { + curpos = min(maxpos, curpos + (int)sbInfo.nPage); + } + break; + + case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position + curpos = nPos; // of the scroll box at the end of the drag operation. + break; + + case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the + curpos = nPos; // position that the scroll box has been dragged to. + break; + } + + // Set the new position of the thumb (scroll box). + pScrollBar->SetScrollPos(curpos); + + paramOffset = curpos; + UpdateControls(true); + } + CAbstractVstEditor::OnVScroll(nSBCode, nPos, pScrollBar); } + +BOOL CDefaultVstEditor::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) +//------------------------------------------------------------------------ +{ + UNREFERENCED_PARAMETER(nFlags); + UNREFERENCED_PARAMETER(pt); + + // Mouse wheel - scroll parameter list + int minpos, maxpos; + paramScroller.GetScrollRange(&minpos, &maxpos); + if(minpos != maxpos) + { + paramOffset -= sgn(zDelta); + Limit(paramOffset, PlugParamIndex(minpos), PlugParamIndex(maxpos)); + paramScroller.SetScrollPos(paramOffset); + + UpdateControls(true); + } + + return CAbstractVstEditor::OnMouseWheel(nFlags, zDelta, pt); +} + + BOOL CDefaultVstEditor::OpenEditor(CWnd *parent) //---------------------------------------------- { @@ -56,97 +400,93 @@ SetTitle(); SetupMenu(); - m_slParam.SetRange(0, PARAM_RESOLUTION); - ShowWindow(SW_SHOW); - - // Fill param listbox - if (m_pVstPlugin) + CreateControls(); + + // Restore previous editor position + int editorX, editorY; + m_pVstPlugin->GetEditorPos(editorX, editorY); + + if((editorX >= 0) && (editorY >= 0)) { - char s[128]; - long nParams = m_pVstPlugin->GetNumParameters(); - m_lbParameters.SetRedraw(FALSE); //disable lisbox refreshes during fill to avoid flicker - m_lbParameters.ResetContent(); - for (long i=0; i<nParams; i++) + int cxScreen = GetSystemMetrics(SM_CXSCREEN); + int cyScreen = GetSystemMetrics(SM_CYSCREEN); + if((editorX + 8 < cxScreen) && (editorY + 8 < cyScreen)) { - CHAR sname[64]; - m_pVstPlugin->GetParamName(i, sname, sizeof(sname)); - wsprintf(s, "%02X: %s", i|0x80, sname); - m_lbParameters.SetItemData(m_lbParameters.AddString(s), i); + SetWindowPos(NULL, editorX, editorY, 0,0, + SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); } - m_lbParameters.SetRedraw(TRUE); //re-enable lisbox refreshes - if (m_nCurrentParam >= nParams) m_nCurrentParam = 0; - m_lbParameters.SetCurSel(m_nCurrentParam); - UpdateParamDisplays(); - } + } + ShowWindow(SW_SHOW); + return TRUE; } -VOID CDefaultVstEditor::OnClose() -//------------------------ +void CDefaultVstEditor::OnClose() +//------------------------------- { DoClose(); } -VOID CDefaultVstEditor::OnOK() -//--------------------- +void CDefaultVstEditor::OnOK() +//---------------------------- { OnClose(); } -VOID CDefaultVstEditor::OnCancel() -//------------------------- +void CDefaultVstEditor::OnCancel() +//-------------------------------- { OnClose(); } -VOID CDefaultVstEditor::DoClose() -//------------------------ +void CDefaultVstEditor::DoClose() +//------------------------------- { - DestroyWindow(); - if (m_pVstPlugin) { + if((m_pVstPlugin) && (m_hWnd)) + { + CRect rect; + GetWindowRect(&rect); + m_pVstPlugin->SetEditorPos(rect.left, rect.top); + } + + if(m_pVstPlugin) + { m_pVstPlugin->Dispatch(effEditClose, 0, 0, NULL, 0); } -} -void CDefaultVstEditor::OnParamChanged() -//-------------------------------------- -{ - m_nCurrentParam = m_lbParameters.GetItemData(m_lbParameters.GetCurSel()); - UpdateParamDisplays(); + DestroyWindow(); } + // Called when a change occurs to the parameter textbox // If the change is triggered by the user, we'll need to notify the plugin and update // the other GUI controls -void CDefaultVstEditor::OnParamTextboxChanged() -//--------------------------------------------- +void CDefaultVstEditor::OnParamTextboxChanged(UINT id) +//---------------------------------------------------- { - if (m_nControlLock) { // Lock will be set if the GUI change was triggered internally (in UpdateParamDisplays). - return; // We're only interested in handling changes triggered by the user. + if (m_nControlLock) + { + // Lock will be set if the GUI change was triggered internally (in UpdateParamDisplays). + // We're only interested in handling changes triggered by the user. + return; } - //Extract value and notify plug - char s[64]; - m_editParam.GetWindowText(s, 64); - int val = atoi(s); - if (val > PARAM_RESOLUTION) - val=PARAM_RESOLUTION; - m_pVstPlugin->SetParameter(m_nCurrentParam, val/static_cast<float>(PARAM_RESOLUTION)); - - UpdateParamDisplays(); // update other GUI controls - m_pVstPlugin->GetModDoc()->SetModified(); + const PlugParamIndex param = paramOffset + id - ID_PLUGINEDITOR_EDIT_BASE; + + // Extract value and update + SetParam(param, controls[param - paramOffset]->GetParamValueFromEdit()); } // Called when a change occurs to the parameter slider // If the change is triggered by the user, we'll need to notify the plugin and update // the other GUI controls -void CDefaultVstEditor::OnParamSliderChanged() -//---------------------------------------------- +void CDefaultVstEditor::OnParamSliderChanged(UINT id) +//--------------------------------------------------- { if (m_nControlLock) { @@ -155,53 +495,66 @@ return; } - // Extract value and notify plug - int val = PARAM_RESOLUTION-m_slParam.GetPos(); - m_pVstPlugin->SetParameter(m_nCurrentParam, val / static_cast<float>(PARAM_RESOLUTION)); + const PlugParamIndex param = paramOffset + id - ID_PLUGINEDITOR_SLIDERS_BASE; - if(m_pVstPlugin->m_bRecordAutomation) + // Extract value and update + SetParam(param, controls[param - paramOffset]->GetParamValueFromSlider()); + +} + + +// Update a given parameter to a given value and notify plugin +void CDefaultVstEditor::SetParam(PlugParamIndex param, int value) +//--------------------------------------------------------------- +{ + if(m_pVstPlugin == nullptr) { - m_pVstPlugin->GetModDoc()->RecordParamChange(m_pVstPlugin->GetSlot(), m_nCurrentParam); + return; } - UpdateParamDisplays(); // update other GUI controls - m_pVstPlugin->GetModDoc()->SetModified(); + m_pVstPlugin->SetParameter(param, static_cast<PlugParamValue>(value) / static_cast<PlugParamValue>(PARAM_RESOLUTION)); + // Update other GUI controls + UpdateParamDisplay(param); + + // Act as if an automation message has been sent by the plugin (record param changes, set document modified, etc...) + m_pVstPlugin->AutomateParameter(param); + } //Update all GUI controls with the new param value -void CDefaultVstEditor::UpdateParamDisplays() -//------------------------------------------- +void CDefaultVstEditor::UpdateParamDisplay(PlugParamIndex param) +//-------------------------------------------------------------- { - if (m_nControlLock) + if (m_nControlLock || param < paramOffset || param >= paramOffset + NUM_PLUGINEDITOR_PARAMETERS || m_pVstPlugin == nullptr) { - //Just to make sure we're not here as a consequence of an internal GUI change. + //Just to make sure we're not here as a consequence of an internal GUI change, and avoid modifying a parameter that doesn't exist on the GUI. return; } - //Get the param value fromt the plug and massage it into the formats we need - char s[256]; - int val = static_cast<int>(m_pVstPlugin->GetParameter(m_nCurrentParam)*static_cast<float>(PARAM_RESOLUTION)+0.5f); - wsprintf(s, "%0000d", val); + // Get the param value fromt the plug and massage it into the formats we need + const int val = static_cast<int>(m_pVstPlugin->GetParameter(param) * static_cast<float>(PARAM_RESOLUTION) + 0.5f); - CHAR sunits[64], sdisplay[64], label[128]; - m_pVstPlugin->GetParamLabel(m_nCurrentParam, sunits); - m_pVstPlugin->GetParamDisplay(m_nCurrentParam, sdisplay); - wsprintf(label, "%s %s", sdisplay, sunits); + CString paramDisplay, paramUnits; + m_pVstPlugin->GetParamDisplay(param, paramDisplay.GetBuffer(64)); + m_pVstPlugin->GetParamLabel(param, paramUnits.GetBuffer(64)); + paramDisplay.ReleaseBuffer(); + paramUnits.ReleaseBuffer(); + paramDisplay.Trim(); + paramUnits.Trim(); + paramDisplay += " " + paramUnits; // Update the GUI controls - m_nControlLock++; // Set lock to indicate that the changes to the GUI are internal - no need to notify the plug and re-update GUI. - m_statParamLabel.SetWindowText(label); - m_slParam.SetPos(PARAM_RESOLUTION-val); - if (&m_editParam != m_editParam.GetFocus()) - { - // Don't update textbox when it has focus, else this will prevent user from changing the content - m_editParam.SetWindowText(s); - } - m_nControlLock--; // Unset lock - done with internal GUI updates. + + // Set lock to indicate that the changes to the GUI are internal - no need to notify the plug and re-update GUI. + m_nControlLock++; + + controls[param - paramOffset]->SetParamValue(val, paramDisplay); + + // Unset lock - done with internal GUI updates. + m_nControlLock--; } #endif // NO_VST - Modified: trunk/OpenMPT/mptrack/DefaultVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/DefaultVstEditor.h 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/DefaultVstEditor.h 2011-10-19 15:41:03 UTC (rev 1108) @@ -4,48 +4,88 @@ #include "VstPlug.h" #include "abstractvsteditor.h" -enum { - PARAM_RESOLUTION=1000, +enum +{ + PARAM_RESOLUTION = 1000, + NUM_PLUGINEDITOR_PARAMETERS = 8, // Parameters on screen }; #ifndef NO_VST -class CDefaultVstEditor : - public CAbstractVstEditor +//==================== +class ParamControlSet +//==================== { +protected: + CSliderCtrl valueSlider; + CEdit valueEdit; + CStatic nameLabel; + CStatic valueLabel; + CStatic perMilLabel; + public: - CListBox m_lbParameters; - CSliderCtrl m_slParam; - CEdit m_editParam; - CStatic m_statParamLabel; + ParamControlSet(CWnd *parent, const CRect &rect, int setID); + ~ParamControlSet(); + + void EnableControls(bool enable = true); + void ResetContent(); + + void SetParamName(const CString &name); + void SetParamValue(int value, const CString &text); + + int GetParamValueFromSlider() const; + int GetParamValueFromEdit() const; + + int GetSliderID() const { return valueSlider.GetDlgCtrlID(); }; +}; + + +//================================================= +class CDefaultVstEditor : public CAbstractVstEditor +//================================================= +{ +protected: + + vector<ParamControlSet *> controls; + + CScrollBar paramScroller; + PlugParamIndex paramOffset; + int m_nControlLock; - long m_nCurrentParam; +public: CDefaultVstEditor(CVstPlugin *pPlugin); - virtual ~CDefaultVstEditor(void); - virtual VOID OnOK(); - virtual VOID OnCancel(); + virtual ~CDefaultVstEditor(); + + void UpdateParamDisplays() { UpdateControls(false); }; + + virtual void OnOK(); + virtual void OnCancel(); BOOL OpenEditor(CWnd *parent); - VOID DoClose(); - - void OnParamChanged(); - + void DoClose(); afx_msg void OnClose(); - afx_msg void OnLoadPreset(); - afx_msg void OnSavePreset(); - afx_msg void OnRandomizePreset(); - afx_msg void OnParamTextboxChanged(); - afx_msg void OnParamSliderChanged(); +protected: + virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() + afx_msg void OnParamTextboxChanged(UINT id); + afx_msg void OnParamSliderChanged(UINT id); + + afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); -private: + afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); - void UpdateParamDisplays(); +protected: + + void CreateControls(); + void UpdateControls(bool updateParamNames); + void SetParam(PlugParamIndex param, int value); + void UpdateParamDisplay(PlugParamIndex param); + }; #endif // NO_VST Modified: trunk/OpenMPT/mptrack/VSTEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/VSTEditor.cpp 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/VSTEditor.cpp 2011-10-19 15:41:03 UTC (rev 1108) @@ -29,8 +29,9 @@ { Create(IDD_PLUGINEDITOR, parent); SetupMenu(); - if (m_pVstPlugin) + if(m_pVstPlugin) { + // Set editor window size CRect rcWnd, rcClient; ERect *pRect; @@ -38,23 +39,28 @@ m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, (LPRECT)&pRect, 0); m_pVstPlugin->Dispatch(effEditOpen, 0, 0, (void *)m_hWnd, 0); m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, (LPRECT)&pRect, 0); - if ((pRect) && (pRect->right > pRect->left) && (pRect->bottom > pRect->top)) + if((pRect) && (pRect->right > pRect->left) && (pRect->bottom > pRect->top)) { GetWindowRect(&rcWnd); GetClientRect(&rcClient); SetWindowPos(NULL, 0,0, - (rcWnd.right-rcWnd.left) - (rcClient.right-rcClient.left) + (pRect->right-pRect->left), - (rcWnd.bottom-rcWnd.top) - (rcClient.bottom-rcClient.top) + (pRect->bottom-pRect->top), + (rcWnd.Width()) - (rcClient.Width()) + (pRect->right - pRect->left), + (rcWnd.Height()) - (rcClient.Height()) + (pRect->bottom - pRect->top), SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); } - if ((m_pVstPlugin->m_nEditorX >= 0) && (m_pVstPlugin->m_nEditorY >= 0)) + + // Restore previous editor position + int editorX, editorY; + m_pVstPlugin->GetEditorPos(editorX, editorY); + + if((editorX >= 0) && (editorY >= 0)) { int cxScreen = GetSystemMetrics(SM_CXSCREEN); int cyScreen = GetSystemMetrics(SM_CYSCREEN); - if ((m_pVstPlugin->m_nEditorX+8 < cxScreen) && (m_pVstPlugin->m_nEditorY+8 < cyScreen)) + if((editorX + 8 < cxScreen) && (editorY + 8 < cyScreen)) { - SetWindowPos(NULL, m_pVstPlugin->m_nEditorX, m_pVstPlugin->m_nEditorY, 0,0, + SetWindowPos(NULL, editorX, editorY, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); } } @@ -102,8 +108,7 @@ { CRect rect; GetWindowRect(&rect); - m_pVstPlugin->m_nEditorX = rect.left; - m_pVstPlugin->m_nEditorY = rect.top; + m_pVstPlugin->SetEditorPos(rect.left, rect.top); } if (m_pVstPlugin) { Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-19 15:41:03 UTC (rev 1108) @@ -480,6 +480,7 @@ m_CbnParam.SetCurSel(0); m_CbnParam.SetRedraw(TRUE); + m_CbnParam.Invalidate(); OnParamChanged(); // Input / Output type Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-10-19 15:41:03 UTC (rev 1108) @@ -689,52 +689,7 @@ if (effect && effect->resvd1) { CVstPlugin *pVstPlugin = ((CVstPlugin*)effect->resvd1); - - // Mark track modified - CModDoc* pModDoc = pVstPlugin->GetModDoc(); - if (pModDoc) - { - CAbstractVstEditor *pVstEditor = pVstPlugin->GetEditor(); - if (pVstEditor && pVstEditor->m_hWnd) // Check GUI is open - { - if(pModDoc->GetSoundFile() && pModDoc->GetSoundFile()->GetModSpecifications().supportsPlugins) - CMainFrame::GetMainFrame()->ThreadSafeSetModified(pModDoc); - } - // TODO: Could be used to update general tab in real time, but causes flickers in treeview - // Better idea: add an update hint just for plugin params? - //pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, NULL); - } - - // Record param change - if (pVstPlugin->m_bRecordAutomation) - { - // Note that audioMasterAutomate is not called when using our own plugin GUI. For those plugins, the same mechanism is called from CDefaultVstEditor::OnParamSliderChanged(). - pModDoc->RecordParamChange(pVstPlugin->GetSlot(), index); - } - - if (pModDoc && CMainFrame::GetInputHandler()->ShiftPressed() && pVstPlugin->GetEditor() && (pVstPlugin->GetEditor()->m_hWnd == ::GetForegroundWindow() || ::IsChild(pVstPlugin->GetEditor()->m_hWnd, ::GetForegroundWindow()))) - { - CMainFrame::GetInputHandler()->SetModifierMask(0); // Make sure that the dialog will open only once. - CAbstractVstEditor *pVstEditor = pVstPlugin->GetEditor(); - const HWND oldMIDIRecondWnd = CMainFrame::GetMainFrame()->GetMidiRecordWnd(); - CMIDIMappingDialog dlg(pVstEditor, *pModDoc->GetSoundFile()); - dlg.m_Setting.SetParamIndex(index); - dlg.m_Setting.SetPlugIndex(pVstPlugin->GetSlot()+1); - dlg.DoModal(); - CMainFrame::GetMainFrame()->SetMidiRecordWnd(oldMIDIRecondWnd); - } - - // Learn macro - CAbstractVstEditor *pVstEditor = pVstPlugin->GetEditor(); - if (pVstEditor) { - int macroToLearn = pVstEditor->GetLearnMacro(); - if (macroToLearn>-1) { - pModDoc->LearnMacro(macroToLearn, index); - pVstEditor->SetLearnMacro(-1); - } - //Commenting this out to see if it fixes http://www.modplug.com/forum/viewtopic.php?t=3710 - //pVstPlugin->Dispatch(effEditIdle, 0,0, NULL, 0); - } + pVstPlugin->AutomateParameter(index); } return 0; // Called when plugin asks for VST version supported by host @@ -1435,7 +1390,8 @@ m_nSampleRate=CSoundFile::gdwMixingFreq; Dispatch(effSetSampleRate, 0, 0, NULL, static_cast<float>(CSoundFile::gdwMixingFreq)); Dispatch(effSetBlockSize, 0, MIXBUFFERSIZE, NULL, 0.0f); - if (m_pEffect->numPrograms > 0) { + if (m_pEffect->numPrograms > 0) + { Dispatch(effSetProgram, 0, 0, NULL, 0); } Dispatch(effMainsChanged, 0, 1, NULL, 0.0f); @@ -2047,7 +2003,7 @@ // -> DESC="effect plugin mixing mode combo" // -> mixop == 0 : normal processing // -> mixop == 1 : MIX += DRY - WET * wetRatio -// -> mixop == 2 : MIX += WET - DRY * wetRatio +// -> mixop == 2 : MIX += WET - DRY * dryRatio // -> mixop == 3 : MIX -= WET - DRY * wetRatio // -> mixop == 4 : MIX -= middle - WET * wetRatio + middle - DRY // -> mixop == 5 : MIX_L += wetRatio * (WET_L - DRY_L) + dryRatio * (DRY_R - WET_R) @@ -2705,6 +2661,64 @@ //end rewbs.smoothVST +// Automate a parameter from the plugin GUI (both custom and default plugin GUI) +void CVstPlugin::AutomateParameter(PlugParamIndex param) +//------------------------------------------------------ +{ + CModDoc* pModDoc = GetModDoc(); + if(pModDoc == nullptr) + { + return; + } + + CAbstractVstEditor *pVstEditor = GetEditor(); + + if(pVstEditor && pVstEditor->m_hWnd) + { + // Mark track modified if GUI is open and format supports plugins + if(pModDoc->GetSoundFile() && pModDoc->GetSoundFile()->GetModSpecifications().supportsPlugins) + { + CMainFrame::GetMainFrame()->ThreadSafeSetModified(pModDoc); + } + } + + // TODO: Could be used to update general tab in real time, but causes flickers in treeview + // Better idea: add an update hint just for plugin params? + //pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, NULL); + + if (m_bRecordAutomation) + { + // Record param change + pModDoc->RecordParamChange(GetSlot(), param); + } + + if (CMainFrame::GetInputHandler()->ShiftPressed() && pVstEditor && (pVstEditor->m_hWnd == ::GetForegroundWindow() || ::IsChild(pVstEditor->m_hWnd, ::GetForegroundWindow()))) + { + // Shift pressed -> Open MIDI mapping dialog + CMainFrame::GetInputHandler()->SetModifierMask(0); // Make sure that the dialog will open only once. + + const HWND oldMIDIRecondWnd = CMainFrame::GetMainFrame()->GetMidiRecordWnd(); + CMIDIMappingDialog dlg(pVstEditor, *pModDoc->GetSoundFile()); + dlg.m_Setting.SetParamIndex(param); + dlg.m_Setting.SetPlugIndex(GetSlot() + 1); + dlg.DoModal(); + CMainFrame::GetMainFrame()->SetMidiRecordWnd(oldMIDIRecondWnd); + } + + if(pVstEditor) + { + // Learn macro + int macroToLearn = pVstEditor->GetLearnMacro(); + if (macroToLearn > -1) + { + pModDoc->LearnMacro(macroToLearn, param); + pVstEditor->SetLearnMacro(-1); + } + } + +} + + void CVstPlugin::SaveAllParameters() //---------------------------------- { Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/Vstplug.h 2011-10-19 15:41:03 UTC (rev 1108) @@ -58,7 +58,6 @@ //================================= { friend class CAbstractVstEditor; //rewbs.defaultPlugGUI - friend class COwnerVstEditor; //rewbs.defaultPlugGUI friend class CVstPluginManager; #ifndef NO_VST protected: @@ -83,7 +82,6 @@ float **m_pTempBuffer; //rewbs.dryRatio: changed from * to ** float **m_pInputs; float **m_pOutputs; - int m_nEditorX, m_nEditorY; int m_MixBuffer[MIXBUFFERSIZE*2+2]; // Stereo interleaved float m_FloatBuffer[MIXBUFFERSIZE*(2+32)+34]; // 2ch separated + up to 32 VSTi outputs... float dummyBuffer_[MIXBUFFERSIZE + 2]; // Other (unused) inputs @@ -102,6 +100,8 @@ float m_fGain; bool m_bIsInstrument; + int m_nEditorX, m_nEditorY; + public: CVstPlugin(HINSTANCE hLibrary, PVSTPLUGINLIB pFactory, PSNDMIXPLUGIN pMixPlugin, AEffect *pEffect); virtual ~CVstPlugin(); @@ -130,6 +130,9 @@ PLUGINDEX GetSlot(); void UpdateMixStructPtr(PSNDMIXPLUGIN); + void SetEditorPos(int x, int y) { m_nEditorX = x; m_nEditorY = y; } + void GetEditorPos(int &x, int &y) const { x = m_nEditorX; y = m_nEditorY; } + void SetCurrentProgram(UINT nIndex); //rewbs.VSTCompliance: Eric's non standard preset stuff: // -> CODE#0002 @@ -191,6 +194,7 @@ void Suspend(); DWORD GetTimeAtStartOfProcess() {return m_dwTimeAtStartOfProcess;} void SetDryRatio(UINT param); + void AutomateParameter(PlugParamIndex param); void SetZxxParameter(UINT nParam, UINT nValue); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-10-19 15:41:03 UTC (rev 1108) @@ -1401,7 +1401,7 @@ LTEXT "IDC_TEXT_CURRENT_VSTPLUG",IDC_TEXT_CURRENT_VSTPLUG,6,208,234,8 END -IDD_PLUGINEDITOR DIALOGEX 0, 0, 187, 95 +IDD_PLUGINEDITOR DIALOGEX 0, 0, 485, 153 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE CAPTION "Editor" @@ -1867,9 +1867,9 @@ IDD_PLUGINEDITOR, DIALOG BEGIN LEFTMARGIN, 4 - RIGHTMARGIN, 183 + RIGHTMARGIN, 481 TOPMARGIN, 4 - BOTTOMMARGIN, 91 + BOTTOMMARGIN, 149 END IDD_EFFECTVISUALIZER, DIALOG @@ -2690,18 +2690,13 @@ PUSHBUTTON "Restore",IDC_BUTTON8,480,2,42,11,0,WS_EX_STATICEDGE END -IDD_DEFAULTPLUGINEDITOR DIALOGEX 0, 0, 151, 241 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_DEFAULTPLUGINEDITOR DIALOGEX 0, 0, 336, 247 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_TOOLWINDOW CAPTION "Editor" FONT 8, "MS Shell Dlg", 400, 0, 0x0 BEGIN - LISTBOX IDC_PARAMLIST,7,17,100,194,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_PARAMVALUESLIDE,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,115,18,18,177 - EDITTEXT IDC_PARAMVALUETEXT,109,197,25,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Static",IDC_PARAMLABEL,112,8,32,8 - LTEXT "Parameters:",IDC_STATIC,7,7,38,8 - LTEXT "\x89",IDC_PARAMLABEL2,136,200,14,8 + SCROLLBAR IDC_SCROLLBAR1,317,7,12,233,SBS_VERT | WS_DISABLED | WS_TABSTOP END IDD_MOVEFXSLOT DIALOGEX 0, 0, 133, 78 @@ -2794,9 +2789,9 @@ IDD_DEFAULTPLUGINEDITOR, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 144 + RIGHTMARGIN, 329 TOPMARGIN, 7 - BOTTOMMARGIN, 234 + BOTTOMMARGIN, 240 END IDD_MOVEFXSLOT, DIALOG Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/resource.h 2011-10-19 15:41:03 UTC (rev 1108) @@ -693,11 +693,6 @@ #define IDC_EFFECTLETTERSIT 2110 #define IDC_INSVIEWPLG 2110 #define IDC_EFFECTLETTERSXM 2111 -#define IDC_PARAMLABEL 2111 -#define IDC_PARAMLIST 2112 -#define IDC_PARAMVALUETEXT 2113 -#define IDC_PARAMVALUESLIDE 2114 -#define IDC_PARAMLABEL2 2115 #define IDC_VISFILLBLANKS 2115 #define IDC_CHECK158 2116 #define IDC_TEXT70 2116 @@ -947,7 +942,7 @@ #define IDC_SAMPLE_XFADE 2434 #define IDC_LASTUPDATE 2435 #define IDC_RESTORE_KEYMAP 2436 -#define IDC_SAMPLE_AUTOTUNE 2437 +#define IDC_SAMPLE_AUTOTUNE 2437 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1084,9 +1079,9 @@ #define ID_PRESET_LIST 32919 #define ID_INFO 32920 #define ID_VIEWPLUGNAMES 32921 -#define ID_EQSLIDER_BASE 32922 +#define ID_EQSLIDER_BASE 32922 // From here: Command range [ID_EQSLIDER_BASE, ID_EQSLIDER_BASE + MAX_EQ_BANDS] -#define ID_EQMENU_BASE 32950 +#define ID_EQMENU_BASE 32950 // From here: Command range [ID_EQMENU_BASE, ID_EQMENU_BASE + EQ_MAX_FREQS] #define ID_EDIT_SPLITRECSELECT 33900 #define ID_REARRANGE_SAMPLES 33901 @@ -1210,15 +1205,19 @@ #define ID_ORDERLIST_INSERT_SEPARATOR 44461 #define ID_FXCOMMANDS_BASE 44462 // From here: Command range [ID_FXCOMMANDS_BASE, ID_FXCOMMANDS_BASE + 10] +#define ID_PLUGINEDITOR_SLIDERS_BASE 44500 +// From here: Command range [ID_PLUGINEDITOR_SLIDERS_BASE, ID_PLUGINEDITOR_SLIDERS_BASE + NUM_PLUGINEDITOR_PARAMETERS] +#define ID_PLUGINEDITOR_EDIT_BASE 44550 +// From here: Command range [ID_PLUGINEDITOR_EDIT_BASE, ID_PLUGINEDITOR_EDIT_BASE + NUM_PLUGINEDITOR_PARAMETERS] // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 532 -#define _APS_NEXT_COMMAND_VALUE 44474 -#define _APS_NEXT_CONTROL_VALUE 2438 +#define _APS_NEXT_RESOURCE_VALUE 535 +#define _APS_NEXT_COMMAND_VALUE 44600 +#define _APS_NEXT_CONTROL_VALUE 2448 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-16 21:59:35 UTC (rev 1107) +++ trunk/OpenMPT/mptrack/version.h 2011-10-19 15:41:03 UTC (rev 1108) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 44 +#define VER_MINORMINOR 45 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-20 21:47:01
|
Revision: 1111 http://modplug.svn.sourceforge.net/modplug/?rev=1111&view=rev Author: saga-games Date: 2011-10-20 21:46:54 +0000 (Thu, 20 Oct 2011) Log Message: ----------- [Fix] Custom plugin editors should now finally always have the correct size (quite a dirty hack). [Fix] Plugin preset menu is correct again for plugins with 128*n presets. [Ref] Added HasValidMIDIChannel() function to instrument struct. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/VSTEditor.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-10-20 21:20:23 UTC (rev 1110) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-10-20 21:46:54 UTC (rev 1111) @@ -411,7 +411,7 @@ m_pPresetMenu->CreatePopupMenu(); } - const int numSubMenus = (numProgs / PRESETS_PER_GROUP) + 1; + const int numSubMenus = ((numProgs - 1) / PRESETS_PER_GROUP) + 1; if(numSubMenus > 1) { // Create sub menus if necessary Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-20 21:20:23 UTC (rev 1110) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-20 21:46:54 UTC (rev 1111) @@ -1014,8 +1014,8 @@ //rewbs.vstiLive if (nins <= m_SndFile.m_nInstruments) { - MODINSTRUMENT *pIns = m_SndFile.Instruments[nins]; - if (pIns && pIns->nMidiChannel > 0 && pIns->nMidiChannel < 17) // instro sends to a midi chan + const MODINSTRUMENT *pIns = m_SndFile.Instruments[nins]; + if (pIns && pIns->HasValidMIDIChannel()) // instro sends to a midi chan { // UINT nPlugin = m_SndFile.GetBestPlugin(nChn, PRIORITISE_INSTRUMENT, EVEN_IF_MUTED); @@ -1055,7 +1055,7 @@ { MODINSTRUMENT *pIns = m_SndFile.Instruments[nins]; - if (pIns && pIns->nMidiChannel > 0 && pIns->nMidiChannel < 17) // instro sends to a midi chan + if (pIns && pIns->HasValidMIDIChannel()) // instro sends to a midi chan { UINT nPlugin = pIns->nMixPlug; // First try intrument VST Modified: trunk/OpenMPT/mptrack/VSTEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/VSTEditor.cpp 2011-10-20 21:20:23 UTC (rev 1110) +++ trunk/OpenMPT/mptrack/VSTEditor.cpp 2011-10-20 21:46:54 UTC (rev 1111) @@ -28,11 +28,23 @@ //-------------------------------------------- { Create(IDD_PLUGINEDITOR, parent); + SetupMenu(); + + CRect rcWnd, rcClient; + // First, get window size without menu + GetWindowRect(&rcWnd); + GetClientRect(&rcClient); + + MENUBARINFO mbi; + MemsetZero(mbi); + mbi.cbSize = sizeof(mbi); + GetMenuBarInfo(m_hWnd, OBJID_MENU, 0, &mbi); + rcWnd.bottom -= mbi.rcBar.bottom - mbi.rcBar.top; + if(m_pVstPlugin) { // Set editor window size - CRect rcWnd, rcClient; ERect *pRect; pRect = NULL; @@ -41,13 +53,27 @@ m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, (LPRECT)&pRect, 0); if((pRect) && (pRect->right > pRect->left) && (pRect->bottom > pRect->top)) { + // Plugin provided valid window size + CRect rcContent; + rcContent.right = pRect->right - pRect->left; + rcContent.bottom = pRect->bottom - pRect->top; + + // Preliminary setup, without taking menu bar size into account, just to find out the height of the menu bar. + // With small (narrow) plugin GUIs, the menu might be two lines high... + SetWindowPos(NULL, 0, 0, + rcWnd.Width() - rcClient.Width() + rcContent.Width(), + rcWnd.Height() - rcClient.Height() + rcContent.Height(), + SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + + GetMenuBarInfo(m_hWnd, OBJID_MENU, 0, &mbi); + GetWindowRect(&rcWnd); - GetClientRect(&rcClient); - SetWindowPos(NULL, 0,0, - (rcWnd.Width()) - (rcClient.Width()) + (pRect->right - pRect->left), - (rcWnd.Height()) - (rcClient.Height()) + (pRect->bottom - pRect->top), - SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); - + rcWnd.bottom += mbi.rcBar.bottom - mbi.rcBar.top; + + // Now we have the real size. + SetWindowPos(NULL, 0, 0, + rcWnd.Width(), rcWnd.Height(), + SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); } // Restore previous editor position @@ -61,11 +87,10 @@ if((editorX + 8 < cxScreen) && (editorY + 8 < cyScreen)) { SetWindowPos(NULL, editorX, editorY, 0, 0, - SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); } } SetTitle(); - m_pVstPlugin->Dispatch(effEditTop, 0,0, NULL, 0); m_pVstPlugin->Dispatch(effEditIdle, 0,0, NULL, 0); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-20 21:20:23 UTC (rev 1110) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-20 21:46:54 UTC (rev 1111) @@ -1205,7 +1205,7 @@ // Do we need to apply New/Duplicate Note Action to a VSTi? bool applyNNAtoPlug = false; IMixPlugin *pPlugin = NULL; - if (pChn->pModInstrument && pChn->pModInstrument->nMidiChannel > 0 && pChn->pModInstrument->nMidiChannel < 17 && pChn->nNote>0 && pChn->nNote<128) // instro sends to a midi chan + if (pChn->pModInstrument && pChn->pModInstrument->HasValidMIDIChannel() && pChn->nNote > 0 && pChn->nNote < 128) // instro sends to a midi chan { PLUGINDEX nPlugin = GetBestPlugin(nChn, PrioritiseInstrument, RespectMutes); /* @@ -2349,13 +2349,17 @@ //---------------------------------------------------------- { //Send midi pitch bend event if there's a plugin: - MODINSTRUMENT *pHeader = pChn->pModInstrument; - if (pHeader && pHeader->nMidiChannel>0 && pHeader->nMidiChannel<17) { // instro sends to a midi chan - UINT nPlug = pHeader->nMixPlug; - if ((nPlug) && (nPlug <= MAX_MIXPLUGINS)) { + const MODINSTRUMENT *pIns = pChn->pModInstrument; + if (pIns && pIns->HasValidMIDIChannel()) + { + // instro sends to a midi chan + UINT nPlug = pIns->nMixPlug; + if ((nPlug) && (nPlug <= MAX_MIXPLUGINS)) + { IMixPlugin *pPlug = (IMixPlugin*)m_MixPlugins[nPlug-1].pMixPlugin; - if (pPlug) { - pPlug->MidiPitchBend(pHeader->nMidiChannel, param, 0); + if (pPlug) + { + pPlug->MidiPitchBend(pIns->nMidiChannel, param, 0); } } } @@ -3742,7 +3746,7 @@ const MODINSTRUMENT *pIns = pChn->pModInstrument; // instro sends to a midi chan - if (pIns && pIns->nMidiChannel > 0 && pIns->nMidiChannel < 17) + if (pIns && pIns->HasValidMIDIChannel()) { UINT nPlug = pIns->nMixPlug; if ((nPlug) && (nPlug <= MAX_MIXPLUGINS)) @@ -4219,7 +4223,7 @@ UINT CSoundFile::GetBestMidiChan(const MODCHANNEL *pChn) const //------------------------------------------------------------ { - if (pChn && pChn->pModInstrument && pChn->pModInstrument->nMidiChannel) + if (pChn && pChn->pModInstrument && pChn->pModInstrument->HasValidMIDIChannel()) { return (pChn->pModInstrument->nMidiChannel - 1) & 0x0F; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-10-20 21:20:23 UTC (rev 1110) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-10-20 21:46:54 UTC (rev 1111) @@ -123,9 +123,9 @@ BYTE nIFC; // Default filter cutoff (0...127). Used if the high bit is set BYTE nIFR; // Default filter resonance (0...127). Used if the high bit is set - WORD wMidiBank; // MIDI bank - BYTE nMidiProgram; // MIDI program - BYTE nMidiChannel; // MIDI channel + WORD wMidiBank; // MIDI Bank (1...16384). 0 = Don't send. + BYTE nMidiProgram; // MIDI Program (1...128). 0 = Don't send. + BYTE nMidiChannel; // MIDI Channel (1...16). 0 = Don't send. BYTE nMidiDrumKey; // Drum set note mapping (currently only used by the .MID loader) signed char nPPS; //Pitch/Pan separation (i.e. how wide the panning spreads) @@ -208,6 +208,8 @@ MemsetZero(filename); } + bool HasValidMIDIChannel() const { return (nMidiChannel >= 1 && nMidiChannel <= 16); } + }; //MODINSTRUMENT; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2011-10-20 21:20:23 UTC (rev 1110) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2011-10-20 21:46:54 UTC (rev 1111) @@ -958,7 +958,7 @@ if (vol > 0 || IsCompatibleMode(TRK_IMPULSETRACKER)) { // IT compatibility: We don't need a different attenuation here because of the different tables we're going to use - const int tremattn = (m_nType & MOD_TYPE_XM || IsCompatibleMode(TRK_IMPULSETRACKER)) ? 5 : 6; + const int tremattn = ((GetType() & MOD_TYPE_XM) || IsCompatibleMode(TRK_IMPULSETRACKER)) ? 5 : 6; switch (pChn->nTremoloType & 0x03) { case 1: @@ -981,7 +981,7 @@ vol += ((IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSinusTable[trempos] : ModSinusTable[trempos]) * (int)pChn->nTremoloDepth) >> tremattn; } } - if ((m_nTickCount) || ((m_nType & (MOD_TYPE_STM|MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS)))) + if (!(m_dwSongFlags & SONG_FIRSTTICK) || ((GetType() & (MOD_TYPE_STM|MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS)))) { // IT compatibility: IT has its own, more precise tables if(IsCompatibleMode(TRK_IMPULSETRACKER)) @@ -1619,7 +1619,7 @@ // Sample Auto-Vibrato if ((pChn->pModSample) && (pChn->pModSample->nVibDepth)) { - MODSAMPLE *pSmp = pChn->pModSample; + const MODSAMPLE *pSmp = pChn->pModSample; const bool alternativeTuning = pChn->pModInstrument && pChn->pModInstrument->pTuning; // IT compatibility: Autovibrato is so much different in IT that I just put this in a separate code block, to get rid of a dozen IsCompatibilityMode() calls. @@ -1735,19 +1735,19 @@ if(alternativeTuning) { //Vib sweep is not taken into account here. - vibratoFactor += 0.05F * pSmp->nVibDepth * vdelta / 4096.0F; //4096 == 64^2 + vibratoFactor += 0.05F * pSmp->nVibDepth * vdelta / 4096.0f; //4096 == 64^2 //See vibrato for explanation. pChn->m_CalculateFreq = true; /* Finestep vibrato: - const float autoVibDepth = pSmp->nVibDepth * val / 4096.0F; //4096 == 64^2 + const float autoVibDepth = pSmp->nVibDepth * val / 4096.0f; //4096 == 64^2 vibratoFineSteps += static_cast<CTuning::FINESTEPTYPE>(pChn->pModInstrument->pTuning->GetFineStepCount() * autoVibDepth); pChn->m_CalculateFreq = true; */ } else //Original behavior { - if (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) + if (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) { int df1, df2; if (n < 0) @@ -2413,7 +2413,7 @@ if (pIns) { // Check instrument plugins - if ((pIns->nMidiChannel >= 1) && (pIns->nMidiChannel <= 16)) + if (pIns->HasValidMIDIChannel()) { nPlugin = GetBestPlugin(nChn, PrioritiseInstrument, RespectMutes); if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-20 22:16:02
|
Revision: 1112 http://modplug.svn.sourceforge.net/modplug/?rev=1112&view=rev Author: saga-games Date: 2011-10-20 22:15:55 +0000 (Thu, 20 Oct 2011) Log Message: ----------- [Fix] Envelopes are now paused correctly in IT compatible mode when using S77 / S79 / S7B. [Mod] OpenMPT: Version is now 1.20.00.46 Modified Paths: -------------- trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-20 21:46:54 UTC (rev 1111) +++ trunk/OpenMPT/mptrack/version.h 2011-10-20 22:15:55 UTC (rev 1112) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 45 +#define VER_MINORMINOR 46 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2011-10-20 21:46:54 UTC (rev 1111) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2011-10-20 22:15:55 UTC (rev 1112) @@ -1056,16 +1056,16 @@ const MODINSTRUMENT *pIns = pChn->pModInstrument; // IT Compatibility: S77 does not disable the volume envelope, it just pauses the counter - // Problem: This pauses on the wrong tick at the moment... if (((pChn->VolEnv.flags & ENV_ENABLED) || ((pIns->VolEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pIns->VolEnv.nNodes)) { - int envvol = GetVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns); + const int envpos = pChn->VolEnv.nEnvPosition - ((IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->VolEnv.nEnvPosition > 0) ? 1 : 0); + int envvol = GetVolEnvValueFromPosition(envpos, pIns); // if we are in the release portion of the envelope, // rescale envelope factor so that it is proportional to the release point // and release envelope beginning. if (pIns->VolEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET - && pChn->VolEnv.nEnvPosition >= pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode] + && envpos >= pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode] && pChn->VolEnv.nEnvValueAtReleaseJump != NOT_YET_RELEASED) { int envValueAtReleaseJump = pChn->VolEnv.nEnvValueAtReleaseJump; @@ -1074,7 +1074,7 @@ //If we have just hit the release node, force the current env value //to be that of the release node. This works around the case where // we have another node at the same position as the release node. - if (pChn->VolEnv.nEnvPosition == pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode]) + if (envpos == pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode]) envvol = envValueAtReleaseNode; int relativeVolumeChange = (envvol - envValueAtReleaseNode) * 2; @@ -1092,10 +1092,9 @@ const MODINSTRUMENT *pIns = pChn->pModInstrument; // IT Compatibility: S79 does not disable the panning envelope, it just pauses the counter - // Problem: This pauses on the wrong tick at the moment... if (((pChn->PanEnv.flags & ENV_ENABLED) || ((pIns->PanEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pIns->PanEnv.nNodes)) { - int envpos = pChn->PanEnv.nEnvPosition; + const int envpos = pChn->PanEnv.nEnvPosition - ((IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->VolEnv.nEnvPosition > 0) ? 1 : 0); UINT pt = pIns->PanEnv.nNodes - 1; for (UINT i=0; i<(UINT)(pIns->PanEnv.nNodes-1); i++) { @@ -1146,10 +1145,9 @@ const MODINSTRUMENT *pIns = pChn->pModInstrument; // IT Compatibility: S7B does not disable the pitch envelope, it just pauses the counter - // Problem: This pauses on the wrong tick at the moment... if ((pIns) && ((pChn->PitchEnv.flags & ENV_ENABLED) || ((pIns->PitchEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pChn->pModInstrument->PitchEnv.nNodes)) { - int envpos = pChn->PitchEnv.nEnvPosition; + int envpos = pChn->PitchEnv.nEnvPosition - ((IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->VolEnv.nEnvPosition > 0) ? 1 : 0); UINT pt = pIns->PitchEnv.nNodes - 1; for (UINT i=0; i<(UINT)(pIns->PitchEnv.nNodes-1); i++) { @@ -1230,17 +1228,17 @@ if (pChn->VolEnv.flags & ENV_ENABLED) { // Increase position - pChn->VolEnv.nEnvPosition++; + UINT position = pChn->VolEnv.nEnvPosition + (IsCompatibleMode(TRK_IMPULSETRACKER) ? 0 : 1); // Volume Loop ? if (pIns->VolEnv.dwFlags & ENV_LOOP) { UINT volloopend = pIns->VolEnv.Ticks[pIns->VolEnv.nLoopEnd]; - if (m_nType != MOD_TYPE_XM) volloopend++; - if (pChn->VolEnv.nEnvPosition == volloopend) + if (GetType() != MOD_TYPE_XM) volloopend++; + if (position == volloopend) { - pChn->VolEnv.nEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nLoopStart]; + position = pIns->VolEnv.Ticks[pIns->VolEnv.nLoopStart]; if ((pIns->VolEnv.nLoopEnd == pIns->VolEnv.nLoopStart) && (!pIns->VolEnv.Values[pIns->VolEnv.nLoopStart]) - && ((!(m_nType & MOD_TYPE_XM)) || (pIns->VolEnv.nLoopEnd+1 == (int)pIns->VolEnv.nNodes))) + && ((!(GetType() & MOD_TYPE_XM)) || (pIns->VolEnv.nLoopEnd+1 == (int)pIns->VolEnv.nNodes))) { pChn->dwFlags |= CHN_NOTEFADE; pChn->nFadeOutVol = 0; @@ -1250,15 +1248,16 @@ // Volume Sustain ? if ((pIns->VolEnv.dwFlags & ENV_SUSTAIN) && (!(pChn->dwFlags & CHN_KEYOFF))) { - if (pChn->VolEnv.nEnvPosition == (UINT)pIns->VolEnv.Ticks[pIns->VolEnv.nSustainEnd] + 1) - pChn->VolEnv.nEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nSustainStart]; + if (position == (UINT)pIns->VolEnv.Ticks[pIns->VolEnv.nSustainEnd] + 1) + position = pIns->VolEnv.Ticks[pIns->VolEnv.nSustainStart]; } else + { // End of Envelope ? - if (pChn->VolEnv.nEnvPosition > pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1]) + if (position > pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1]) { - if ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (pChn->dwFlags & CHN_KEYOFF)) pChn->dwFlags |= CHN_NOTEFADE; - pChn->VolEnv.nEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1]; - if ((!pIns->VolEnv.Values[pIns->VolEnv.nNodes-1]) && ((pChn->nMasterChn > 0) || (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)))) + if ((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (pChn->dwFlags & CHN_KEYOFF)) pChn->dwFlags |= CHN_NOTEFADE; + position = pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1]; + if ((!pIns->VolEnv.Values[pIns->VolEnv.nNodes - 1]) && ((pChn->nMasterChn > 0) || (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)))) { pChn->dwFlags |= CHN_NOTEFADE; pChn->nFadeOutVol = 0; @@ -1266,6 +1265,9 @@ pChn->nCalcVolume = 0; } } + } + + pChn->VolEnv.nEnvPosition = position + (IsCompatibleMode(TRK_IMPULSETRACKER) ? 1 : 0); } } @@ -1277,25 +1279,30 @@ if (pChn->PanEnv.flags & ENV_ENABLED) { - pChn->PanEnv.nEnvPosition++; + // Increase position + UINT position = pChn->PanEnv.nEnvPosition + (IsCompatibleMode(TRK_IMPULSETRACKER) ? 0 : 1); + if (pIns->PanEnv.dwFlags & ENV_LOOP) { UINT panloopend = pIns->PanEnv.Ticks[pIns->PanEnv.nLoopEnd]; - if (m_nType != MOD_TYPE_XM) panloopend++; - if (pChn->PanEnv.nEnvPosition == panloopend) - pChn->PanEnv.nEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nLoopStart]; + if (GetType() != MOD_TYPE_XM) panloopend++; + if (position == panloopend) + position = pIns->PanEnv.Ticks[pIns->PanEnv.nLoopStart]; } + // Panning Sustain ? - if ((pIns->PanEnv.dwFlags & ENV_SUSTAIN) && (pChn->PanEnv.nEnvPosition == (UINT)pIns->PanEnv.Ticks[pIns->PanEnv.nSustainEnd]+1) + if ((pIns->PanEnv.dwFlags & ENV_SUSTAIN) && (position == (UINT)pIns->PanEnv.Ticks[pIns->PanEnv.nSustainEnd] + 1) && (!(pChn->dwFlags & CHN_KEYOFF))) { // Panning sustained - pChn->PanEnv.nEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nSustainStart]; + position = pIns->PanEnv.Ticks[pIns->PanEnv.nSustainStart]; } else { - if (pChn->PanEnv.nEnvPosition > pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1]) - pChn->PanEnv.nEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1]; + if (position > pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1]) + position = pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1]; } + + pChn->PanEnv.nEnvPosition = position + (IsCompatibleMode(TRK_IMPULSETRACKER) ? 1 : 0); } } @@ -1308,26 +1315,29 @@ if (pChn->PitchEnv.flags & ENV_ENABLED) { // Increase position - pChn->PitchEnv.nEnvPosition++; + UINT position = pChn->PitchEnv.nEnvPosition + (IsCompatibleMode(TRK_IMPULSETRACKER) ? 0 : 1); + // Pitch Loop ? if (pIns->PitchEnv.dwFlags & ENV_LOOP) { UINT pitchloopend = pIns->PitchEnv.Ticks[pIns->PitchEnv.nLoopEnd]; //IT compatibility 24. Short envelope loops if (IsCompatibleMode(TRK_IMPULSETRACKER)) pitchloopend++; - if (pChn->PitchEnv.nEnvPosition >= pitchloopend) - pChn->PitchEnv.nEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nLoopStart]; + if (position >= pitchloopend) + position = pIns->PitchEnv.Ticks[pIns->PitchEnv.nLoopStart]; } // Pitch Sustain ? if ((pIns->PitchEnv.dwFlags & ENV_SUSTAIN) && (!(pChn->dwFlags & CHN_KEYOFF))) { - if (pChn->PitchEnv.nEnvPosition == (UINT)pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainEnd]+1) - pChn->PitchEnv.nEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainStart]; + if (position == (UINT)pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainEnd]+1) + position = pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainStart]; } else { - if (pChn->PitchEnv.nEnvPosition > pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1]) - pChn->PitchEnv.nEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1]; + if (position > pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1]) + position = pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1]; } + + pChn->PitchEnv.nEnvPosition = position + (IsCompatibleMode(TRK_IMPULSETRACKER) ? 1 : 0); } } @@ -2012,6 +2022,17 @@ // Process Envelopes if (pIns) { + if(IsCompatibleMode(TRK_IMPULSETRACKER)) + { + // In IT compatible mode, envelope position indices are shifted by one for proper envelope pausing, + // so we have to update the position before we actually process the envelopes. + // When using MPT behaviour, we get the envelope position for the next tick while we are still calculating the current tick, + // which then results in wrong position information when the envelope is paused on the next row. + // Test case: s77.it + IncrementVolumeEnvelopePosition(pChn); + IncrementPanningEnvelopePosition(pChn); + IncrementPitchFilterEnvelopePosition(pChn); + } ProcessVolumeEnvelope(pChn, vol); ProcessInstrumentFade(pChn, vol); ProcessPanningEnvelope(pChn); @@ -2149,8 +2170,10 @@ } // Increment envelope positions - if (pIns) + if (pIns != nullptr && !IsCompatibleMode(TRK_IMPULSETRACKER)) { + // In IT compatible mode, envelope positions are updated above. + // Test case: s77.it IncrementVolumeEnvelopePosition(pChn); IncrementPanningEnvelopePosition(pChn); IncrementPitchFilterEnvelopePosition(pChn); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-21 17:25:33
|
Revision: 1115 http://modplug.svn.sourceforge.net/modplug/?rev=1115&view=rev Author: saga-games Date: 2011-10-21 17:25:25 +0000 (Fri, 21 Oct 2011) Log Message: ----------- [Mod] Changes to VST bypass handling code. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_gen.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-10-21 17:25:25 UTC (rev 1115) @@ -201,7 +201,7 @@ { if (m_pVstPlugin) { - m_pVstPlugin->Bypass(); + m_pVstPlugin->ToggleBypass(); } } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-21 17:25:25 UTC (rev 1115) @@ -426,7 +426,7 @@ PSNDMIXPLUGIN pPlugin = &(pSndFile->m_MixPlugins[m_nCurrentPlugin]); SetDlgItemText(IDC_EDIT13, pPlugin->Info.szName); CheckDlgButton(IDC_CHECK9, (pPlugin->Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) ? TRUE : FALSE); - CheckDlgButton(IDC_CHECK10, (pPlugin->Info.dwInputRouting & MIXPLUG_INPUTF_BYPASS) ? TRUE : FALSE); + CheckDlgButton(IDC_CHECK10, (pPlugin->IsBypassed()) ? TRUE : FALSE); CheckDlgButton(IDC_CHECK11, (pPlugin->Info.dwInputRouting & MIXPLUG_INPUTF_WETMIX) ? TRUE : FALSE); CVstPlugin *pVstPlugin = (pPlugin->pMixPlugin) ? (CVstPlugin *)pPlugin->pMixPlugin : NULL; m_BtnEdit.EnableWindow(((pVstPlugin) && ((pVstPlugin->HasEditor()) || (pVstPlugin->GetNumCommands()))) ? TRUE : FALSE); @@ -465,7 +465,7 @@ if (pVstPlugin) { - UINT nParams = pVstPlugin->GetNumParameters(); + const PlugParamIndex nParams = pVstPlugin->GetNumParameters(); m_CbnParam.SetRedraw(FALSE); m_CbnParam.ResetContent(); if (m_nCurrentParam >= nParams) m_nCurrentParam = 0; @@ -727,7 +727,7 @@ if (pPlugin->pMixPlugin) { CVstPlugin *pVstPlugin = (CVstPlugin *)pPlugin->pMixPlugin; - UINT nParams = pVstPlugin->GetNumParameters(); + const PlugParamIndex nParams = pVstPlugin->GetNumParameters(); if (m_nCurrentParam < nParams) { FLOAT fValue = 0.01f * n; @@ -1069,7 +1069,6 @@ //--------------------------------- { CModDoc *pModDoc = GetDocument(); - CHAR s[256]; PSNDMIXPLUGIN pPlugin; CSoundFile *pSndFile; @@ -1079,7 +1078,8 @@ if (pPlugin->pMixPlugin) { CVstPlugin *pVstPlugin = (CVstPlugin *)pPlugin->pMixPlugin; - UINT nParams = pVstPlugin->GetNumParameters(); + const PlugParamIndex nParams = pVstPlugin->GetNumParameters(); + CHAR s[32]; GetDlgItemText(IDC_EDIT14, s, sizeof(s)); if ((m_nCurrentParam < nParams) && (s[0])) { @@ -1176,13 +1176,7 @@ if ((m_nCurrentPlugin >= MAX_MIXPLUGINS) || (!pModDoc)) return; pSndFile = pModDoc->GetSoundFile(); pPlugin = &pSndFile->m_MixPlugins[m_nCurrentPlugin]; - if (IsDlgButtonChecked(IDC_CHECK10)) - { - pPlugin->Info.dwInputRouting |= MIXPLUG_INPUTF_BYPASS; - } else - { - pPlugin->Info.dwInputRouting &= ~MIXPLUG_INPUTF_BYPASS; - } + pPlugin->Bypass(IsDlgButtonChecked(IDC_CHECK10) != FALSE); if(pSndFile->GetModSpecifications().supportsPlugins) pModDoc->SetModified(); Modified: trunk/OpenMPT/mptrack/View_gen.h =================================================================== --- trunk/OpenMPT/mptrack/View_gen.h 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/mptrack/View_gen.h 2011-10-21 17:25:25 UTC (rev 1115) @@ -30,7 +30,7 @@ CButton m_BtnSelect, m_BtnEdit; int m_nActiveTab, m_nLockCount; PLUGINDEX m_nCurrentPlugin; - UINT m_nCurrentParam; + PlugParamIndex m_nCurrentParam; // -> CODE#0002 // -> DESC="VST plugins presets" UINT m_nCurrentPreset; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2011-10-21 17:25:25 UTC (rev 1115) @@ -2499,9 +2499,9 @@ CSoundFile *pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL; if (pSndFile) { PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[modItemID]; - if (pPlugin) { - bool bypassed = ((pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS) != 0); - AppendMenu(hMenu, (bypassed?MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Bypass"); + if (pPlugin) + { + AppendMenu(hMenu, (pPlugin->IsBypassed() ? MF_CHECKED : 0) | MF_STRING, ID_MODTREE_MUTE, "&Bypass"); } } } @@ -2875,7 +2875,7 @@ CVstPlugin *pVstPlugin = (CVstPlugin *)pPlugin->pMixPlugin; if(pVstPlugin == nullptr) return; - pVstPlugin->Bypass(); + pVstPlugin->ToggleBypass(); pModDoc->SetModified(); //UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_MIXPLUGINS); } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-10-21 17:25:25 UTC (rev 1115) @@ -1896,7 +1896,7 @@ CString name; if(paramName.IsEmpty()) { - name.Format("Parameter %02d", param); + name.Format("%02d: Parameter %02d", param, param); } else { name.Format("%02d: %s", param, paramName); @@ -2094,7 +2094,7 @@ m_pProcessFP(m_pEffect, m_pInputs, m_pOutputs, nSamples); } catch (...) { - m_pMixStruct->Info.dwInputRouting |= MIXPLUG_INPUTF_BYPASS; + Bypass(); CString processMethod = (m_pEffect->flags & effFlagsCanReplacing) ? "processReplacing" : "process"; CVstPluginManager::ReportPlugException("The plugin %s threw an exception in %s. It has automatically been set to \"Bypass\".", m_pMixStruct->Info.szName, processMethod); ClearVSTEvents(); @@ -2962,6 +2962,7 @@ return 0; } + //rewbs.defaultPlugGui CAbstractVstEditor* CVstPlugin::GetEditor() //----------------------------------------- @@ -2969,6 +2970,7 @@ return m_pEditor; } + bool CVstPlugin::Bypass(bool bypass) //----------------------------------- { @@ -2977,6 +2979,8 @@ else m_pMixStruct->Info.dwInputRouting &= ~MIXPLUG_INPUTF_BYPASS; + Dispatch(effSetBypass, bypass ? 1 : 0, nullptr, nullptr, 0.0f); + #ifdef MODPLUG_TRACKER if (m_pModDoc) m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, NULL); @@ -2984,17 +2988,7 @@ return bypass; } -bool CVstPlugin::Bypass() -//----------------------- -{ - return Bypass(!IsBypassed()); -} -bool CVstPlugin::IsBypassed() -//--------------------------- -{ - return ((m_pMixStruct->Info.dwInputRouting & MIXPLUG_INPUTF_BYPASS) != 0); -} //end rewbs.defaultPlugGui //rewbs.defaultPlugGui: CVstEditor now COwnerVstEditor @@ -4082,7 +4076,7 @@ const char* SNDMIXPLUGIN::GetLibraryName() //------------------------------------ { - Info.szLibraryName[63] = 0; + StringFixer::SetNullTerminator(Info.szLibraryName); if(Info.szLibraryName[0]) return Info.szLibraryName; else return 0; } @@ -4099,3 +4093,24 @@ else return CString(); } + + +bool SNDMIXPLUGIN::Bypass(bool bypass) +//------------------------------------ +{ + if(pMixPlugin) + { + return pMixPlugin->Bypass(bypass); + } else + { + // No plugin loaded, just toggle the flags. + if(bypass) + { + Info.dwInputRouting |= MIXPLUG_INPUTF_BYPASS; + } else + { + Info.dwInputRouting &= ~MIXPLUG_INPUTF_BYPASS; + } + return bypass; + } +} Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/mptrack/Vstplug.h 2011-10-21 17:25:25 UTC (rev 1115) @@ -152,10 +152,10 @@ BOOL ExecuteCommand(UINT nIndex); CAbstractVstEditor* GetEditor(); //rewbs.defaultPlugGUI BOOL GetSpeakerArrangement(); //rewbs.VSTCompliance - bool Bypass(bool); //rewbs.defaultPlugGUI - bool Bypass(); //rewbs.defaultPlugGUI - bool IsBypassed(); //rewbs.defaultPlugGUI + bool Bypass(bool bypass = true); //rewbs.defaultPlugGUI + bool IsBypassed() const { return m_pMixStruct->IsBypassed(); }; //rewbs.defaultPlugGUI + bool isInstrument(); // ericus 18/02/2005 bool CanRecieveMidiEvents(); @@ -193,7 +193,6 @@ void SetDryRatio(UINT param); void AutomateParameter(PlugParamIndex param); - void SetZxxParameter(UINT nParam, UINT nValue); UINT GetZxxParameter(UINT nParam); //rewbs.smoothVST @@ -219,6 +218,7 @@ void SetParameter(PlugParamIndex, PlugParamValue) {} CString GetFormattedParamName(PlugParamIndex) { return ""; }; + CString GetFormattedParamValue(PlugParamIndex){ return ""; }; CString GetParamName(PlugParamIndex) { return ""; }; CString GetParamLabel(PlugParamIndex) { return ""; }; CString GetParamDisplay(PlugParamIndex) { return ""; }; @@ -230,8 +230,10 @@ BOOL ExecuteCommand(UINT) {return FALSE;} void SetSlot(UINT) {} void UpdateMixStructPtr(void*) {} - bool Bypass() {return false;} + bool Bypass(bool) { return false; } + bool IsBypassed() const { return false; } + #endif // NO_VST }; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-10-21 15:35:19 UTC (rev 1114) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-10-21 17:25:25 UTC (rev 1115) @@ -384,15 +384,19 @@ virtual PlugParamValue GetParameter(PlugParamIndex nIndex) = 0; virtual UINT GetZxxParameter(UINT nParam) = 0; //rewbs.smoothVST virtual void ModifyParameter(PlugParamIndex nIndex, PlugParamValue diff); + virtual void AutomateParameter(PlugParamIndex param) = 0; virtual VstIntPtr Dispatch(VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt) =0; //rewbs.VSTCompliance - virtual void NotifySongPlaying(bool)=0; //rewbs.VSTCompliance - virtual bool IsSongPlaying()=0; - virtual bool IsResumed()=0; - virtual void Resume()=0; - virtual void Suspend()=0; - virtual bool isInstrument()=0; - virtual bool CanRecieveMidiEvents()=0; - virtual void SetDryRatio(UINT param)=0; + virtual void NotifySongPlaying(bool) = 0; //rewbs.VSTCompliance + virtual bool IsSongPlaying() = 0; + virtual bool IsResumed() = 0; + virtual void Resume() = 0; + virtual void Suspend() = 0; + virtual bool Bypass(bool = true) = 0; + virtual bool IsBypassed() const = 0; + bool ToggleBypass() { return Bypass(!IsBypassed()); }; + virtual bool isInstrument() = 0; + virtual bool CanRecieveMidiEvents() = 0; + virtual void SetDryRatio(UINT param) = 0; }; @@ -445,6 +449,8 @@ const char* GetName() const {return Info.szName;} const char* GetLibraryName(); CString GetParamName(const UINT index) const; + bool Bypass(bool bypass); + bool IsBypassed() const { return (Info.dwInputRouting & MIXPLUG_INPUTF_BYPASS) != 0; }; IMixPlugin *pMixPlugin; PSNDMIXPLUGINSTATE pMixState; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-21 22:19:08
|
Revision: 1117 http://modplug.svn.sourceforge.net/modplug/?rev=1117&view=rev Author: saga-games Date: 2011-10-21 22:19:01 +0000 (Fri, 21 Oct 2011) Log Message: ----------- [Mod] Compatibility hints are now hideable [Mod] Removed MOD compatibility export, it is now always used (but only oneshot samples are modified, and they are not modified in memory anymore) [Fix] MP3 Export shortcut was broken (http://bugs.openmpt.org/view.php?id=201) Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-21 20:45:15 UTC (rev 1116) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-21 22:19:01 UTC (rev 1117) @@ -2371,6 +2371,7 @@ case kcFileSaveAs: case kcFileSaveAsWave: + case kcFileSaveAsMP3: case kcFileSaveMidi: case kcFileExportCompat: case kcFileClose: @@ -2651,20 +2652,18 @@ void AddPluginNamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN* plugarray, const bool librarynames) //---------------------------------------------------------------------------------------------- { -#ifndef NO_VST - for (UINT iPlug=0; iPlug<MAX_MIXPLUGINS; iPlug++) + for (PLUGINDEX iPlug = 0; iPlug < MAX_MIXPLUGINS; iPlug++) { PSNDMIXPLUGIN p = &plugarray[iPlug]; CString str; str.Preallocate(80); - str.Format(_T("FX%d: "), iPlug+1); + str.Format(_T("FX%d: "), iPlug + 1); const int size0 = str.GetLength(); str += (librarynames) ? p->GetLibraryName() : p->GetName(); if(str.GetLength() <= size0) str += _T("undefined"); CBox.SetItemData(CBox.AddString(str), iPlug + 1); } -#endif // NO_VST } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-21 20:45:15 UTC (rev 1116) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-21 22:19:01 UTC (rev 1117) @@ -567,7 +567,7 @@ switch(m_SndFile.GetType()) { case MOD_TYPE_MOD: - MsgBoxHidable(ModCompatibilityExportTip); + MsgBoxHidable(ModSaveHint); break; case MOD_TYPE_S3M: break; @@ -1830,26 +1830,16 @@ if ((!pMainFrm) || (!m_SndFile.GetType())) return; switch (type) { - case MOD_TYPE_MOD: - pattern = FileFilterMOD; - if(Reporting::Confirm(GetStrI18N(TEXT( - "Compared to regular MOD save, compatibility export adjusts the beginning of oneshot samples " - "in order to make the file compatible with ProTracker and other Amiga-based trackers. " - "Note that this feature does not remove effects \"invented\" by other PC-based trackers (f.e. panning commands)." - "\n\n Proceed?"))) != cnfYes - ) - return; - break; case MOD_TYPE_IT: pattern = FileFilterIT; - Reporting::Information("Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning."); + MsgBoxHidable(CompatExportDefaultWarning); break; case MOD_TYPE_XM: pattern = FileFilterXM; - Reporting::Information("Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning."); + MsgBoxHidable(CompatExportDefaultWarning); break; default: - Reporting::Information("Compatibility export is currently only available for MOD, XM and IT modules.", "Can't do compatibility export."); + // Not available for this format. return; } ext = m_SndFile.GetModSpecifications().fileExtension; @@ -1871,11 +1861,6 @@ FixNullStrings(); switch (type) { - case MOD_TYPE_MOD: - m_SndFile.SaveMod(files.first_file.c_str(), 0, true); - SetModified(); // Compatibility save may adjust samples so set modified... - m_ShowSavedialog = true; // ...and force save dialog to appear when saving. - break; case MOD_TYPE_XM: m_SndFile.SaveXM(files.first_file.c_str(), 0, true); break; @@ -2120,7 +2105,7 @@ //--------------------------------------------------- { if (p) - p->Enable((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MOD)) ? TRUE : FALSE); + p->Enable((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE); } @@ -3312,7 +3297,7 @@ case sfx_drywet: return _T("Set Plugin Dry/Wet Ratio"); case sfx_plug: - return _T("Control Plugin Param..."); + return _T("Control Plugin Parameter..."); case sfx_cc: return _T("MIDI CC..."); case sfx_custom: Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-10-21 20:45:15 UTC (rev 1116) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-10-21 22:19:01 UTC (rev 1117) @@ -764,14 +764,10 @@ m_CbnSFx.AddString(s); } m_CbnSFx.SetCurSel(0); - m_CbnSFxPreset.AddString("Unused"); - m_CbnSFxPreset.AddString("Set Filter Cutoff"); - m_CbnSFxPreset.AddString("Set Filter Resonance"); - m_CbnSFxPreset.AddString("Set Filter Mode"); - m_CbnSFxPreset.AddString("Plugin Dry/Wet Ratio"); - m_CbnSFxPreset.AddString("Control Plugin Param..."); - m_CbnSFxPreset.AddString("MIDI CC..."); - m_CbnSFxPreset.AddString("Custom"); + for(int i = 0; i < sfx_max; i++) + { + m_CbnSFxPreset.SetItemData(m_CbnSFxPreset.AddString(CModDoc::GetMacroName(static_cast<enmParameteredMacroType>(i))), i); + } OnSFxChanged(); for (UINT cc=MIDICC_start; cc<=MIDICC_end; cc++) @@ -902,7 +898,7 @@ UINT sfx, sfx_preset, zxx; sfx = m_CbnSFx.GetCurSel(); - sfx_preset = m_CbnSFxPreset.GetCurSel(); + sfx_preset = m_CbnSFxPreset.GetItemData(m_CbnSFxPreset.GetCurSel()); if (sfx < 16) { ToggleBoxes(sfx_preset, sfx); @@ -984,7 +980,7 @@ //---------------------------------------- { UINT sfx = m_CbnSFx.GetCurSel(); - UINT sfx_preset = m_CbnSFxPreset.GetCurSel(); + UINT sfx_preset = m_CbnSFxPreset.GetItemData(m_CbnSFxPreset.GetCurSel()); if (sfx < 16) { @@ -1767,10 +1763,11 @@ const MsgBoxHidableMessage HidableMessages[] = { - {TEXT("Tip: To create ProTracker compatible MOD-files, try compatibility export from File-menu."), 1, true}, - {TEXT("Tip: To create IT-files without MPT-specific extensions included, try compatibility export from File-menu."), 1 << 1, true}, + {TEXT("Note: First two bytes of oneshot samples is silenced for ProTracker compatibility."), 1, true}, + {TEXT("Hint: To create IT-files without MPT-specific extensions included, try compatibility export from File-menu."), 1 << 1, true}, {TEXT("Press OK to apply signed/unsigned conversion\n (note: this often significantly increases volume level)"), 1 << 2, false}, - {TEXT("Tip: To create XM-files without MPT-specific extensions included, try compatibility export from File-menu."), 1 << 1, true}, + {TEXT("Hint: To create XM-files without MPT-specific extensions included, try compatibility export from File-menu."), 1 << 3, true}, + {TEXT("Warning: the exported file will not contain any of MPT's file format hacks."), 1 << 4, true}, }; STATIC_ASSERT(ARRAYELEMCOUNT(HidableMessages) == enMsgBoxHidableMessage_count); Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2011-10-21 20:45:15 UTC (rev 1116) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2011-10-21 22:19:01 UTC (rev 1117) @@ -283,10 +283,11 @@ // Enums for message entries. See dlg_misc.cpp for the array of entries. enum enMsgBoxHidableMessage { - ModCompatibilityExportTip = 0, + ModSaveHint = 0, ItCompatibilityExportTip = 1, ConfirmSignUnsignWhenPlaying = 2, XMCompatibilityExportTip = 3, + CompatExportDefaultWarning = 4, enMsgBoxHidableMessage_count }; Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2011-10-21 20:45:15 UTC (rev 1116) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2011-10-21 22:19:01 UTC (rev 1117) @@ -553,8 +553,8 @@ #include "../mptrack/moddoc.h" #endif // MODPLUG_TRACKER -bool CSoundFile::SaveMod(LPCSTR lpszFileName, UINT nPacking, const bool bCompatibilityExport) -//------------------------------------------------------------------------------------------- +bool CSoundFile::SaveMod(LPCSTR lpszFileName, UINT nPacking) +//---------------------------------------------------------- { BYTE insmap[32]; UINT inslen[32]; @@ -703,12 +703,8 @@ // Writing instruments for (UINT ismpd = 1; ismpd <= 31; ismpd++) if (inslen[ismpd]) { - MODSAMPLE *pSmp = &Samples[insmap[ismpd]]; - if(bCompatibilityExport == true) // first two bytes have to be 0 due to PT's one-shot loop ("no loop") - { - size_t iOverwriteLen = 2 * pSmp->GetBytesPerSample(); - memset(pSmp->pSample, 0, min(iOverwriteLen, pSmp->GetSampleSizeInBytes())); - } + const MODSAMPLE *pSmp = &Samples[insmap[ismpd]]; + UINT flags = RS_PCM8S; #ifndef NO_PACKING if (!(pSmp->uFlags & (CHN_16BIT|CHN_STEREO))) @@ -720,7 +716,20 @@ } } #endif - WriteSample(f, pSmp, flags, inslen[ismpd]); + const long sampleStart = ftell(f); + + const UINT writtenBytes = WriteSample(f, pSmp, flags, inslen[ismpd]); + + if((pSmp->uFlags & CHN_LOOP) == 0) + { + // First two bytes of oneshot samples have to be 0 due to PT's one-shot loop + const long sampleEnd = ftell(f); + fseek(f, sampleStart, SEEK_SET); + int8 silence[] = { 0, 0 }; + fwrite(&silence, 1, min(writtenBytes, 2), f); + fseek(f, sampleEnd, SEEK_SET); + } + // write padding byte if the sample size is odd. if((pSmp->nLength & 1) && !nPacking) { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-10-21 20:45:15 UTC (rev 1116) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-10-21 22:19:01 UTC (rev 1117) @@ -862,7 +862,7 @@ UINT WriteSample(FILE *f, const MODSAMPLE *pSmp, UINT nFlags, UINT nMaxLen=0) const; bool SaveXM(LPCSTR lpszFileName, UINT nPacking=0, const bool bCompatibilityExport = false); bool SaveS3M(LPCSTR lpszFileName, UINT nPacking=0); - bool SaveMod(LPCSTR lpszFileName, UINT nPacking=0, const bool bCompatibilityExport = false); + bool SaveMod(LPCSTR lpszFileName, UINT nPacking=0); bool SaveIT(LPCSTR lpszFileName, UINT nPacking=0, const bool compatExport = false); bool SaveITProject(LPCSTR lpszFileName); // -> CODE#0023 -> DESC="IT project files (.itp)" -! NEW_FEATURE#0023 UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-23 00:16:21
|
Revision: 1119 http://modplug.svn.sourceforge.net/modplug/?rev=1119&view=rev Author: saga-games Date: 2011-10-23 00:16:13 +0000 (Sun, 23 Oct 2011) Log Message: ----------- [Ref] References > Pointers. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/EffectVis.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/pattern.cpp Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -500,7 +500,7 @@ EndWaitCursor(); if ((nPatRemoved) || (bReordered)) { - m_pModDoc->GetPatternUndo()->ClearUndo(); + m_pModDoc->GetPatternUndo().ClearUndo(); if (nPatRemoved) { wsprintf(s, "%d pattern%s removed.\n", nPatRemoved, (nPatRemoved == 1) ? "" : "s"); @@ -528,7 +528,7 @@ if (!pSndFile->IsSampleUsed(nSmp)) { samplesUsed[nSmp] = false; - m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete); + m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete); } } @@ -553,11 +553,11 @@ { if ((!samplesUsed[nSmp]) && (pSndFile->GetSample(nSmp).pSample)) { - m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete); + m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete); pSndFile->DestroySample(nSmp); if ((nSmp == pSndFile->m_nSamples) && (nSmp > 1)) pSndFile->m_nSamples--; nRemoved++; - m_pModDoc->GetSampleUndo()->ClearUndo(nSmp); + m_pModDoc->GetSampleUndo().ClearUndo(nSmp); } } wsprintf(s, "%d unused sample%s removed\n" , nRemoved, (nRemoved == 1) ? "" : "s"); @@ -622,7 +622,7 @@ UINT lmax = loopLength + 2; if ((lmax < sample.nLength) && (lmax >= 2)) { - m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete, lmax, sample.nLength); + m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete, lmax, sample.nLength); ctrlSmp::ResizeSample(sample, lmax, pSndFile); } } @@ -707,7 +707,7 @@ } // Too lazy to fix sample undo... - m_pModDoc->GetSampleUndo()->ClearUndo(); + m_pModDoc->GetSampleUndo().ClearUndo(); pSndFile->m_nSamples -= nRemap; @@ -987,7 +987,7 @@ for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->GetNumSamples(); nSmp++) { - m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete, 0, pSndFile->GetSample(nSmp).nLength); + m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete, 0, pSndFile->GetSample(nSmp).nLength); } ctrlSmp::ResetSamples(*pSndFile, ctrlSmp::SmpResetInit); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -343,7 +343,7 @@ } if (dwHintMask & (HINT_MODTYPE|HINT_UNDO)) { - m_ToolBar.EnableButton(ID_EDIT_UNDO, m_pModDoc->GetPatternUndo()->CanUndo()); + m_ToolBar.EnableButton(ID_EDIT_UNDO, m_pModDoc->GetPatternUndo().CanUndo()); } } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -752,7 +752,7 @@ { CriticalSection cs; - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); bOk = m_pSndFile->ReadSampleFromFile(m_nSample, lpFile, len); } @@ -813,12 +813,12 @@ if (!sample.nC5Speed) sample.nC5Speed = 22050; } else { - m_pModDoc->GetSampleUndo()->Undo(m_nSample); + m_pModDoc->GetSampleUndo().Undo(m_nSample); } } else { - m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); + m_pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); } } f.Unlock(); @@ -873,7 +873,7 @@ CriticalSection cs; - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); m_pSndFile->DestroySample(m_nSample); m_pSndFile->ReadSampleFromSong(m_nSample, pSndFile, nSample); MODSAMPLE &sample = m_pSndFile->GetSample(m_nSample); @@ -947,7 +947,7 @@ if(bDuplicate && nOldSmp >= 1 && nOldSmp <= pSndFile->GetNumSamples()) { - m_pModDoc->GetSampleUndo()->PrepareUndo(smp, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(smp, sundo_replace); MemCopy(m_pSndFile->GetSample(smp), m_pSndFile->GetSample(nOldSmp)); strcpy(m_pSndFile->m_szNames[smp], m_pSndFile->m_szNames[nOldSmp]); // Clone sample. @@ -1194,7 +1194,7 @@ } } - m_pModDoc->GetSampleUndo()->PrepareUndo(iSmp, sundo_update, iStart, iEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(iSmp, sundo_update, iStart, iEnd); if (sample.uFlags & CHN_STEREO) { iStart *= 2; iEnd *= 2; } @@ -1265,7 +1265,7 @@ SELECTIONPOINTS selection = GetSelectionPoints(); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_update, selection.nStart, selection.nEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_update, selection.nStart, selection.nEnd); if (sample.uFlags & CHN_STEREO) { selection.nStart *= 2; selection.nEnd *= 2; } UINT len = selection.nEnd - selection.nStart; @@ -1347,7 +1347,7 @@ iEnd = selection.nEnd; } - m_pModDoc->GetSampleUndo()->PrepareUndo(iSmp, sundo_update, iStart, iEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(iSmp, sundo_update, iStart, iEnd); const float fOffset = ctrlSmp::RemoveDCOffset(m_pSndFile->GetSample(iSmp), iStart, iEnd, m_pSndFile->GetType(), m_pSndFile); @@ -1455,7 +1455,7 @@ if (dwNewLen+4 <= MAX_SAMPLE_LENGTH) pNewSample = CSoundFile::AllocateSample((dwNewLen+4)*newsmplsize); if (pNewSample) { - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); const UINT nCh = sample.GetNumChannels(); for (UINT iCh=0; iCh<nCh; iCh++) @@ -1608,7 +1608,7 @@ if (pNewSample) { - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); const UINT nCh = sample.GetNumChannels(); for (UINT iCh=0; iCh<nCh; iCh++) @@ -2040,7 +2040,7 @@ ASSERT(nNewSampleLength >= nLengthCounter); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); // Swap sample buffer pointer to new buffer, update song + sample data & free old sample buffer ctrlSmp::ReplaceSample(sample, (LPSTR)pNewSample, min(nLengthCounter, nNewSampleLength), m_pSndFile); @@ -2121,7 +2121,7 @@ float * buffer = new float[MAX_BUFFER_LENGTH + fft]; float * outbuf = new float[MAX_BUFFER_LENGTH + fft]; - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); // Process each channel separately for(UINT i = 0 ; i < nChn ; i++){ @@ -2240,14 +2240,14 @@ SELECTIONPOINTS selection = GetSelectionPoints(); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_reverse, selection.nStart, selection.nEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_reverse, selection.nStart, selection.nEnd); if(ctrlSmp::ReverseSample(sample, selection.nStart, selection.nEnd, m_pSndFile) == true) { m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL); m_pModDoc->SetModified(); } else { - m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); + m_pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); } EndWaitCursor(); SwitchToView(); @@ -2261,14 +2261,14 @@ SELECTIONPOINTS selection = GetSelectionPoints(); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_invert, selection.nStart, selection.nEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_invert, selection.nStart, selection.nEnd); if(ctrlSmp::InvertSample(sample, selection.nStart, selection.nEnd, m_pSndFile) == true) { m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL); m_pModDoc->SetModified(); } else { - m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); + m_pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); } EndWaitCursor(); SwitchToView(); @@ -2287,14 +2287,14 @@ MODSAMPLE &sample = m_pSndFile->GetSample(m_nSample); SELECTIONPOINTS selection = GetSelectionPoints(); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_unsign, selection.nStart, selection.nEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_unsign, selection.nStart, selection.nEnd); if(ctrlSmp::UnsignSample(sample, selection.nStart, selection.nEnd, m_pSndFile) == true) { m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, NULL); m_pModDoc->SetModified(); } else { - m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); + m_pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); } EndWaitCursor(); SwitchToView(); @@ -2312,7 +2312,7 @@ if(selection.bSelected == true) { MODSAMPLE &sample = m_pSndFile->GetSample(m_nSample); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_update, selection.nStart, selection.nEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_update, selection.nStart, selection.nEnd); int len = selection.nEnd - selection.nStart; if (sample.uFlags & CHN_STEREO) @@ -3182,7 +3182,7 @@ if(nFadeLength < 4) return; - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_update, sample.nLoopEnd - nFadeLength, sample.nLoopEnd); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_update, sample.nLoopEnd - nFadeLength, sample.nLoopEnd); // If we want to fade nFadeLength bytes, we need as much sample material before the loop point. nFadeLength has been adjusted above. if(sample.nLoopStart < nFadeLength) { @@ -3195,7 +3195,7 @@ m_pModDoc->SetModified(); } else { - m_pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); + m_pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); } } @@ -3218,7 +3218,7 @@ if(dlg.DoModal() == IDOK) { BeginWaitCursor(); - m_pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_none); + m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); at.Apply(static_cast<double>(dlg.GetPitchReference()), dlg.GetTargetNote()); m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO, NULL); m_pModDoc->SetModified(); Modified: trunk/OpenMPT/mptrack/EffectVis.cpp =================================================================== --- trunk/OpenMPT/mptrack/EffectVis.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/EffectVis.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -650,7 +650,7 @@ rect.SetRect(x-NODEHALF, y-NODEHALF, x+NODEHALF+1, y+NODEHALF+1); if (rect.PtInRect(point)) { - m_pModDoc->GetPatternUndo()->PrepareUndo(static_cast<PATTERNINDEX>(m_nPattern), m_nChan, row, m_nChan+1, row+1); + m_pModDoc->GetPatternUndo().PrepareUndo(static_cast<PATTERNINDEX>(m_nPattern), m_nChan, row, m_nChan+1, row+1); m_nDragItem = row; } } @@ -748,7 +748,7 @@ SetFocus(); SetCapture(); - m_pModDoc->GetPatternUndo()->PrepareUndo(static_cast<PATTERNINDEX>(m_nPattern), m_nChan, m_startRow, m_nChan+1, m_endRow); + m_pModDoc->GetPatternUndo().PrepareUndo(static_cast<PATTERNINDEX>(m_nPattern), m_nChan, m_startRow, m_nChan+1, m_endRow); m_dwStatus |= FXVSTATUS_LDRAGGING; } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -2178,7 +2178,7 @@ if (bTemplateFile) { - pModDoc->GetFileHistory()->clear(); // Reset edit history for template files + pModDoc->GetFileHistory().clear(); // Reset edit history for template files pModDoc->GetSoundFile()->m_dwCreatedWithVersion = MptVersion::num; pModDoc->GetSoundFile()->m_dwLastSavedWithVersion = 0; } Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -479,7 +479,7 @@ } // Check whether the new format supports embedding the edit history in the file. - if(oldTypeIsIT_MPT && !newTypeIsIT_MPT && GetFileHistory()->size() > 0) + if(oldTypeIsIT_MPT && !newTypeIsIT_MPT && GetFileHistory().size() > 0) { CHANGEMODTYPE_WARNING(wEditHistory); } @@ -571,8 +571,8 @@ CHANGEMODTYPE_CHECK(wCompatibilityMode, "Consider enabling the \"compatible playback\" option in the song properties to increase compatiblity with other players.\n"); SetModified(); - GetPatternUndo()->ClearUndo(); - GetSampleUndo()->ClearUndo(); + GetPatternUndo().ClearUndo(); + GetSampleUndo().ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); EndWaitCursor(); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -124,12 +124,6 @@ m_PatternUndo.SetParent(this); m_SampleUndo.SetParent(this); - m_SplitKeyboardSettings.splitInstrument = 0; - m_SplitKeyboardSettings.splitNote = NOTE_MIDDLEC - 1; - m_SplitKeyboardSettings.splitVolume = 0; - m_SplitKeyboardSettings.octaveModifier = 0; - m_SplitKeyboardSettings.octaveLink = false; - // Set the creation date of this file (or the load time if we're loading an existing file) time(&m_creationTime); m_FileHistory.clear(); Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/Moddoc.h 2011-10-23 00:16:13 UTC (rev 1119) @@ -160,6 +160,16 @@ MODCOMMAND::VOL splitVolume; int octaveModifier; // determines by how many octaves the notes should be transposed up or down bool octaveLink; // apply octaveModifier + + SplitKeyboardSettings() + //--------------------- + { + splitInstrument = 0; + splitNote = NOTE_MIDDLEC - 1; + splitVolume = 0; + octaveModifier = 0; + octaveLink = false; + } }; enum LogEventType @@ -267,12 +277,12 @@ void SongProperties(); - CPatternUndo *GetPatternUndo() { return &m_PatternUndo; } - CSampleUndo *GetSampleUndo() { return &m_SampleUndo; } + CPatternUndo &GetPatternUndo() { return m_PatternUndo; } + CSampleUndo &GetSampleUndo() { return m_SampleUndo; } SplitKeyboardSettings &GetSplitKeyboardSettings() { return m_SplitKeyboardSettings; } - vector<FileHistory> *GetFileHistory() { return &m_FileHistory; } - const vector<FileHistory> *GetFileHistory() const { return &m_FileHistory; } + vector<FileHistory> &GetFileHistory() { return m_FileHistory; } + const vector<FileHistory> &GetFileHistory() const { return m_FileHistory; } time_t GetCreationTime() const { return m_creationTime; } // operations Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -181,7 +181,7 @@ { if(createUndoPoint) { - GetPatternUndo()->PrepareUndo(nPat, 0, 0, GetNumChannels(), m_SndFile.Patterns[nPat].GetNumRows(), !first, (nPat == highestPattern)); + GetPatternUndo().PrepareUndo(nPat, 0, 0, GetNumChannels(), m_SndFile.Patterns[nPat].GetNumRows(), !first, (nPat == highestPattern)); first = false; } @@ -1031,7 +1031,7 @@ // Before changing anything in this pattern, we have to create an undo point. if(bPrepareUndo) { - GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.Patterns[nPattern].GetNumRows(), !bFirstUndo); + GetPatternUndo().PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.Patterns[nPattern].GetNumRows(), !bFirstUndo); bPrepareUndo = false; bFirstUndo = false; } Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -727,7 +727,7 @@ { if(!m_bModified) // let's create just one undo step. { - m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); m_bModified = true; } m->note = note; @@ -756,7 +756,7 @@ { if(!m_bModified) // let's create just one undo step. { - m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); m_bModified = true; } m->volcmd = volcmd; @@ -796,7 +796,7 @@ { if(!m_bModified) // let's create just one undo step. { - m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); m_bModified = true; } m->command = command; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -626,7 +626,7 @@ const ROWINDEX nRowBeg = GetRowFromCursor(dwBegin), nRowEnd = GetRowFromCursor(dwEnd); if((nChnEnd < nChnBeg) || (nRowEnd < nRowBeg) || pModDoc == nullptr) return false; - return pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, nChnBeg, nRowBeg, nChnEnd-nChnBeg+1, nRowEnd-nRowBeg+1); + return pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, nChnBeg, nRowBeg, nChnEnd-nChnBeg+1, nRowEnd-nRowBeg+1); } @@ -768,7 +768,7 @@ const DWORD startSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwBeginSel : m_dwEndSel; const DWORD endSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwEndSel : m_dwBeginSel; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); const ROWINDEX finalDest = GetRowFromCursor(startSel) + (GetRowFromCursor(endSel) - GetRowFromCursor(startSel))*2; for (int row = finalDest; row > (int)GetRowFromCursor(startSel); row -= 2) @@ -818,7 +818,7 @@ const DWORD startSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwBeginSel : m_dwEndSel; const DWORD endSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwEndSel : m_dwBeginSel; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); const ROWINDEX finalDest = GetRowFromCursor(startSel) + (GetRowFromCursor(endSel) - GetRowFromCursor(startSel))/2; @@ -1686,7 +1686,7 @@ maxrow = pSndFile->Patterns[m_nPattern].GetNumRows(); if (colmax >= pSndFile->m_nChannels) colmax = pSndFile->m_nChannels-1; if (colmin > colmax) return; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0,0, pSndFile->m_nChannels, maxrow); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0,0, pSndFile->m_nChannels, maxrow); for (UINT r=row; r<maxrow; r++) { MODCOMMAND *m = pSndFile->Patterns[m_nPattern].GetpModCommand(r, colmin); @@ -1750,7 +1750,7 @@ maxrow = pSndFile->Patterns[m_nPattern].GetNumRows(); if (colmax >= pSndFile->GetNumChannels()) colmax = pSndFile->GetNumChannels() - 1; if (colmin > colmax) return; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0,0, pSndFile->GetNumChannels(), maxrow); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0,0, pSndFile->GetNumChannels(), maxrow); for (UINT r=maxrow; r>row; ) { @@ -2044,7 +2044,7 @@ { // Just create one logic undo step when auto-replacing all occurences. const bool linkUndoBuffer = (nFound > 1) && (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) != 0; - pModDoc->GetPatternUndo()->PrepareUndo(nPat, n % pSndFile->GetNumChannels(), n / pSndFile->GetNumChannels(), 1, 1, linkUndoBuffer); + pModDoc->GetPatternUndo().PrepareUndo(nPat, n % pSndFile->GetNumChannels(), n / pSndFile->GetNumChannels(), 1, 1, linkUndoBuffer); if ((m_findReplace.dwReplaceFlags & PATSEARCH_NOTE)) { @@ -2643,7 +2643,7 @@ dx = (int)GetChanFromCursor(m_dwDragPos) - (int)GetChanFromCursor(m_dwStartSel); dy = (int)GetRowFromCursor(m_dwDragPos) - (int)GetRowFromCursor(m_dwStartSel); if ((!dx) && (!dy)) return; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0,0, nChannels, nRows); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0,0, nChannels, nRows); pNewPattern = CPattern::AllocatePattern(nRows, nChannels); if (!pNewPattern) return; x1 = GetChanFromCursor(m_dwBeginSel); @@ -2899,7 +2899,7 @@ CModDoc *pModDoc = GetDocument(); if ((pCmdUI) && (pModDoc)) { - pCmdUI->Enable(pModDoc->GetPatternUndo()->CanUndo()); + pCmdUI->Enable(pModDoc->GetPatternUndo().CanUndo()); } } @@ -2910,7 +2910,7 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc && IsEditingEnabled_bmsg()) { - PATTERNINDEX nPat = pModDoc->GetPatternUndo()->Undo(); + PATTERNINDEX nPat = pModDoc->GetPatternUndo().Undo(); if (nPat < pModDoc->GetSoundFile()->Patterns.Size()) { pModDoc->SetModified(); @@ -3238,7 +3238,7 @@ // only overwrite existing PC Notes if(pRow->IsEmpty() || pRow->IsPcNote()) { - pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(nPattern, nChn, nRow, 1, 1); pRow->Set(NOTE_PCS, plugSlot + 1, paramIndex, static_cast<uint16>(pPlug->GetParameter(paramIndex) * MODCOMMAND::maxColumnValue)); InvalidateRow(nRow); @@ -3265,7 +3265,7 @@ pSndFile->Chn[nChn].nActiveMacro = foundMacro; if (pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) //we overwrite existing Zxx and \xx only. { - pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(nPattern, nChn, nRow, 1, 1); pRow->command = (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? CMD_S3MCMDEX : CMD_MODCMDEX;; pRow->param = 0xF0 + (foundMacro&0x0F); @@ -3278,7 +3278,7 @@ //Write the data, but we only overwrite if the command is a macro anyway. if (pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { - pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(nPattern, nChn, nRow, 1, 1); pRow->command = CMD_SMOOTHMIDI; pRow->param = pPlug->GetZxxParameter(paramIndex); @@ -3369,7 +3369,7 @@ const bool bLiveRecord = IsLiveRecord(*pModDoc, *pSndFile); ModCommandPos editpos = GetEditPos(*pSndFile, bLiveRecord); MODCOMMAND* p = GetModCommand(*pSndFile, editpos); - pModDoc->GetPatternUndo()->PrepareUndo(editpos.nPat, editpos.nChn, editpos.nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(editpos.nPat, editpos.nChn, editpos.nRow, 1, 1); p->Set(NOTE_PCS, mappedIndex, static_cast<uint16>(paramIndex), static_cast<uint16>((paramValue * MODCOMMAND::maxColumnValue)/127)); if(bLiveRecord == false) InvalidateRow(editpos.nRow); @@ -3421,7 +3421,7 @@ MODCOMMAND* p = GetModCommand(*pSndFile, editpos); if(p->command == CMD_NONE || p->command == CMD_SMOOTHMIDI || p->command == CMD_MIDI) { // Write command only if there's no existing command or already a midi macro command. - pModDoc->GetPatternUndo()->PrepareUndo(editpos.nPat, editpos.nChn, editpos.nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(editpos.nPat, editpos.nChn, editpos.nRow, 1, 1); p->command = CMD_SMOOTHMIDI; p->param = nByte2; pMainFrm->ThreadSafeSetModified(pModDoc); @@ -4277,7 +4277,7 @@ } // Create undo-point. - pModDoc->GetPatternUndo()->PrepareUndo(nPat, nChn, nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(nPat, nChn, nRow, 1, 1); // -- write sdx if playing live if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted @@ -4579,7 +4579,7 @@ const bool modified = (bRecordEnabled && *pTarget != newcmd); if (modified) { - pModDoc->GetPatternUndo()->PrepareUndo(nPat, nChn, nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(nPat, nChn, nRow, 1, 1); *pTarget = newcmd; } @@ -4703,7 +4703,7 @@ const CHANNELINDEX nChn = GetChanFromCursor(m_dwCursor); UINT nPlayIns = 0; // Simply backup the whole row. - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, nChn, m_nRow, pSndFile->GetNumChannels(), 1); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, nChn, m_nRow, pSndFile->GetNumChannels(), 1); const PatternRow prowbase = pSndFile->Patterns[m_nPattern].GetRow(m_nRow); MODCOMMAND* pTarget = &prowbase[nChn]; @@ -5358,7 +5358,7 @@ AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_PASTEFLOOD, "Paste Flood\t" + ih->GetKeyTextFromCommand(kcEditPasteFlood)); AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_PUSHFORWARDPASTE, "Push Forward Paste (Insert)\t" + ih->GetKeyTextFromCommand(kcEditPushForwardPaste)); - DWORD greyed = pModDoc->GetPatternUndo()->CanUndo() ? MF_ENABLED : MF_GRAYED; + DWORD greyed = pModDoc->GetPatternUndo().CanUndo() ? MF_ENABLED : MF_GRAYED; if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) { AppendMenu(hMenu, MF_STRING | greyed, ID_EDIT_UNDO, "Undo\t" + ih->GetKeyTextFromCommand(kcEditUndo)); @@ -5797,7 +5797,7 @@ if(dlg.DoModal() != IDOK || dlg.bChanged == false) return; // Backup old name. - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, 1, 1, false, true); + pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, 1, 1, false, true); strcpy(pSndFile->ChnSettings[nChn].szName, dlg.m_sName); pModDoc->SetModified(); Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -1418,7 +1418,7 @@ if (m_bDrawingEnabled) { m_lastDrawPoint = point; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); if(sample.GetElementarySampleSize() == 2) SetInitialDrawPoint<int16, uint16>(sample.pSample, point); else if(sample.GetElementarySampleSize() == 1) @@ -1546,7 +1546,7 @@ ::AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY, "Copy\t" + ih->GetKeyTextFromCommand(kcEditCopy)); } ::AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTE, "Paste\t" + ih->GetKeyTextFromCommand(kcEditPaste)); - ::AppendMenu(hMenu, MF_STRING | (pModDoc->GetSampleUndo()->CanUndo(m_nSample) ? 0 : MF_GRAYED), ID_EDIT_UNDO, "Undo\t" + ih->GetKeyTextFromCommand(kcEditUndo)); + ::AppendMenu(hMenu, MF_STRING | (pModDoc->GetSampleUndo().CanUndo(m_nSample) ? 0 : MF_GRAYED), ID_EDIT_UNDO, "Undo\t" + ih->GetKeyTextFromCommand(kcEditUndo)); ClientToScreen(&pt); ::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); ::DestroyMenu(hMenu); @@ -1773,7 +1773,7 @@ || (m_dwEndSel - m_dwBeginSel + 4 >= len)) { if (Reporting::Confirm("Remove this sample?", "Remove Sample", true) != cnfYes) return; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); CriticalSection cs; pSndFile->DestroySample(m_nSample); @@ -1782,7 +1782,7 @@ dwUpdateFlags |= HINT_SMPNAMES; } else { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_delete, m_dwBeginSel, m_dwEndSel); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_delete, m_dwBeginSel, m_dwEndSel); CriticalSection cs; @@ -1971,7 +1971,7 @@ if ((hCpy) && ((p = (LPBYTE)GlobalLock(hCpy)) != NULL)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); CSoundFile *pSndFile = pModDoc->GetSoundFile(); DWORD dwMemSize = GlobalSize(hCpy); @@ -2014,7 +2014,7 @@ { CModDoc *pModDoc = GetDocument(); if(pModDoc == nullptr) return; - if(pModDoc->GetSampleUndo()->Undo(m_nSample) == true) + if(pModDoc->GetSampleUndo().Undo(m_nSample) == true) pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); } @@ -2030,7 +2030,7 @@ MODSAMPLE &sample = pSndFile->GetSample(m_nSample); if ((sample.uFlags & CHN_16BIT) && (sample.pSample) && (sample.nLength)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); CriticalSection cs; @@ -2068,14 +2068,14 @@ MODSAMPLE &sample = pSndFile->GetSample(m_nSample); if ((sample.uFlags & CHN_STEREO) && (sample.pSample) && (sample.nLength)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); if(ctrlSmp::ConvertToMono(sample, pSndFile)) { pModDoc->SetModified(); pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); } else { - pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); + pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); } } } @@ -2108,7 +2108,7 @@ if ((sample.pSample) && (nStart+nEnd <= sample.nLength) && (nEnd >= MIN_TRIM_LENGTH)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); CriticalSection cs; @@ -2310,7 +2310,7 @@ { CriticalSection cs; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); bCanDrop = dlsbank.ExtractSample(pSndFile, m_nSample, nIns, nRgn); } bUpdate = TRUE; @@ -2338,7 +2338,7 @@ } CriticalSection cs; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); bCanDrop = pDLSBank->ExtractSample(pSndFile, m_nSample, nIns, nRgn); bUpdate = TRUE; @@ -2404,7 +2404,7 @@ MODSAMPLE &sample = pSndFile->GetSample(m_nSample); if ((m_dwMenuParam+4 <= sample.nLoopEnd) && (sample.nLoopStart != m_dwMenuParam)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_none); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nLoopStart = m_dwMenuParam; sample.uFlags |= CHN_LOOP; pModDoc->SetModified(); @@ -2425,7 +2425,7 @@ MODSAMPLE &sample = pSndFile->GetSample(m_nSample); if ((m_dwMenuParam >= sample.nLoopStart+4) && (sample.nLoopEnd != m_dwMenuParam)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_none); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nLoopEnd = m_dwMenuParam; sample.uFlags |= CHN_LOOP; pModDoc->SetModified(); @@ -2446,7 +2446,7 @@ MODSAMPLE &sample = pSndFile->GetSample(m_nSample); if ((m_dwMenuParam+4 <= sample.nSustainEnd) && (sample.nSustainStart != m_dwMenuParam)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_none); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nSustainStart = m_dwMenuParam; sample.uFlags |= CHN_SUSTAINLOOP; pModDoc->SetModified(); @@ -2467,7 +2467,7 @@ MODSAMPLE &sample = pSndFile->GetSample(m_nSample); if ((m_dwMenuParam >= sample.nSustainStart+4) && (sample.nSustainEnd != m_dwMenuParam)) { - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_none); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nSustainEnd = m_dwMenuParam; sample.uFlags |= CHN_SUSTAINLOOP; pModDoc->SetModified(); @@ -2533,9 +2533,9 @@ CriticalSection cs; if(dlg.m_nSamples < sample.nLength) // make it shorter! - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_delete, dlg.m_nSamples, sample.nLength); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_delete, dlg.m_nSamples, sample.nLength); else // make it longer! - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_insert, sample.nLength, dlg.m_nSamples); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_insert, sample.nLength, dlg.m_nSamples); ctrlSmp::ResizeSample(sample, dlg.m_nSamples, pSndFile); } } else @@ -2546,7 +2546,7 @@ CriticalSection cs; UINT nStart = (dlg.m_nEditOption == addsilence_at_end) ? sample.nLength : 0; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_insert, nStart, nStart + dlg.m_nSamples); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_insert, nStart, nStart + dlg.m_nSamples); ctrlSmp::InsertSilence(sample, dlg.m_nSamples, nStart, pSndFile); } } Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -1435,7 +1435,7 @@ case MODITEM_SAMPLE: wsprintf(s, _T("Remove sample %d?"), modItemID); if (pModDoc == nullptr || Reporting::Confirm(s, false, true) == cnfNo) break; - pModDoc->GetSampleUndo()->PrepareUndo((SAMPLEINDEX)modItemID, sundo_replace); + pModDoc->GetSampleUndo().PrepareUndo((SAMPLEINDEX)modItemID, sundo_replace); if (pModDoc->RemoveSample((SAMPLEINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -1674,11 +1674,11 @@ CString s; uint64 totalTime = 0; - const size_t num = m_pModDoc->GetFileHistory()->size(); + const size_t num = m_pModDoc->GetFileHistory().size(); for(size_t n = 0; n < num; n++) { - const FileHistory *hist = &(m_pModDoc->GetFileHistory()->at(n)); + const FileHistory *hist = &(m_pModDoc->GetFileHistory().at(n)); totalTime += hist->openTime; // Date @@ -1708,7 +1708,7 @@ SetWindowText(s); } // Enable or disable Clear button - GetDlgItem(IDC_BTN_CLEAR)->EnableWindow((m_pModDoc->GetFileHistory()->empty()) ? FALSE : TRUE); + GetDlgItem(IDC_BTN_CLEAR)->EnableWindow((m_pModDoc->GetFileHistory().empty()) ? FALSE : TRUE); return TRUE; @@ -1718,9 +1718,9 @@ void CEditHistoryDlg::OnClearHistory() //------------------------------------ { - if(m_pModDoc != nullptr && !m_pModDoc->GetFileHistory()->empty()) + if(m_pModDoc != nullptr && !m_pModDoc->GetFileHistory().empty()) { - m_pModDoc->GetFileHistory()->clear(); + m_pModDoc->GetFileHistory().clear(); m_pModDoc->SetModified(); OnInitDialog(); } Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/mptrack/test/test.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -464,8 +464,8 @@ VERIFY_EQUAL_NONCONT(pSndFile->m_nRestartPos, 1); // Edit history - VERIFY_EQUAL_NONCONT(pModDoc->GetFileHistory()->size() > 0, true); - const FileHistory &fh = pModDoc->GetFileHistory()->at(0); + VERIFY_EQUAL_NONCONT(pModDoc->GetFileHistory().size() > 0, true); + const FileHistory &fh = pModDoc->GetFileHistory().at(0); VERIFY_EQUAL_NONCONT(fh.loadDate.tm_year, 111); VERIFY_EQUAL_NONCONT(fh.loadDate.tm_mon, 5); VERIFY_EQUAL_NONCONT(fh.loadDate.tm_mday, 14); Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2011-10-23 00:16:13 UTC (rev 1119) @@ -840,8 +840,8 @@ mptHistory.loadDate.tm_mday = CLAMP(pHeader->creationDay, 0, 31); mptHistory.loadDate.tm_mon = CLAMP(pHeader->creationMonth, 1, 12) - 1; mptHistory.loadDate.tm_year = pHeader->creationYear; - GetpModDoc()->GetFileHistory()->clear(); - GetpModDoc()->GetFileHistory()->push_back(mptHistory); + GetpModDoc()->GetFileHistory().clear(); + GetpModDoc()->GetFileHistory().push_back(mptHistory); } #endif // MODPLUG_TRACKER Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -756,7 +756,7 @@ #ifdef MODPLUG_TRACKER if(GetpModDoc() != nullptr) { - GetpModDoc()->GetFileHistory()->clear(); + GetpModDoc()->GetFileHistory().clear(); for(size_t n = 0; n < nflt; n++) { ITHISTORYSTRUCT itHistory = *((ITHISTORYSTRUCT *)(lpStream + dwMemPos)); @@ -774,7 +774,7 @@ mptHistory.loadDate.tm_min = CLAMP((itHistory.fattime >> 5) & 0x3F, 0, 59); mptHistory.loadDate.tm_sec = CLAMP((itHistory.fattime & 0x1F) * 2, 0, 59); mptHistory.openTime = itHistory.runtime * (HISTORY_TIMER_PRECISION / 18.2f); - GetpModDoc()->GetFileHistory()->push_back(mptHistory); + GetpModDoc()->GetFileHistory().push_back(mptHistory); #ifdef DEBUG const uint32 seconds = (uint32)(((double)itHistory.runtime) / 18.2f); @@ -1305,7 +1305,7 @@ { #ifdef MODPLUG_TRACKER CModDoc *pModDoc = pSndFile->GetpModDoc(); - const size_t num = (pModDoc != nullptr) ? pModDoc->GetFileHistory()->size() + 1 : 0; // + 1 for this session + const size_t num = (pModDoc != nullptr) ? pModDoc->GetFileHistory().size() + 1 : 0; // + 1 for this session #else const size_t num = 0; #endif // MODPLUG_TRACKER @@ -1332,7 +1332,7 @@ if(n < num - 1) { // Previous timestamps - const FileHistory *mptHistory = &(pModDoc->GetFileHistory()->at(n)); + const FileHistory *mptHistory = &(pModDoc->GetFileHistory().at(n)); loadDate = mptHistory->loadDate; openTime = mptHistory->openTime * (18.2f / HISTORY_TIMER_PRECISION); } else Modified: trunk/OpenMPT/soundlib/pattern.cpp =================================================================== --- trunk/OpenMPT/soundlib/pattern.cpp 2011-10-22 23:25:38 UTC (rev 1118) +++ trunk/OpenMPT/soundlib/pattern.cpp 2011-10-23 00:16:13 UTC (rev 1119) @@ -153,7 +153,7 @@ if (!newPattern) return true; const PATTERNINDEX nPattern = m_rPatternContainer.GetIndex(this); - rModDoc.GetPatternUndo()->PrepareUndo(nPattern, 0, 0, nChns, nRows); + rModDoc.GetPatternUndo().PrepareUndo(nPattern, 0, 0, nChns, nRows); oldPattern = m_ModCommands; for (ROWINDEX y = 0; y < nRows; y++) { @@ -182,7 +182,7 @@ ROWINDEX nRows = m_Rows; const CHANNELINDEX nChns = sndFile.m_nChannels; const PATTERNINDEX nPattern = m_rPatternContainer.GetIndex(this); - rModDoc.GetPatternUndo()->PrepareUndo(nPattern, 0, 0, nChns, nRows); + rModDoc.GetPatternUndo().PrepareUndo(nPattern, 0, 0, nChns, nRows); nRows /= 2; for (ROWINDEX y = 0; y < nRows; y++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-23 20:34:29
|
Revision: 1120 http://modplug.svn.sourceforge.net/modplug/?rev=1120&view=rev Author: saga-games Date: 2011-10-23 20:34:22 +0000 (Sun, 23 Oct 2011) Log Message: ----------- [Fix] Instrument -> Sample conversion broke PC Notes and note cuts / fades / offs. [Fix] Pattern Editor: The second record group was slightly broken since a few revisions ago. [Imp] Envelope Editor: Better default values for loop points when enabling loops or sustain loops. [Mod] Main Menu: "View Comments" is now available in all mod formats, since the comments page also contains other information. [Ref] Various small oneliner changes Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/CleanupSong.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/DefaultVstEditor.cpp trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -998,21 +998,15 @@ } // Remove all instruments -bool CModCleanupDlg::RemoveAllInstruments(bool bConfirm) -//------------------------------------------------------ +bool CModCleanupDlg::RemoveAllInstruments() +//----------------------------------------- { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); if(pSndFile == nullptr) return false; if (pSndFile->GetNumInstruments() == 0) return false; - if(bConfirm) - { - if (Reporting::Confirm("Do you want to convert all instruments to samples?", "Removing all instruments") == cnfYes) - { - m_pModDoc->ConvertInstrumentsToSamples(); - } - } + m_pModDoc->ConvertInstrumentsToSamples(); for (INSTRUMENTINDEX i = 1; i <= pSndFile->GetNumInstruments(); i++) { Modified: trunk/OpenMPT/mptrack/CleanupSong.h =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.h 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/CleanupSong.h 2011-10-23 20:34:22 UTC (rev 1120) @@ -60,7 +60,7 @@ bool OptimizeSamples(); // Remove unused sample data // Instruments bool RemoveUnusedInstruments(); // Remove unused instruments - bool RemoveAllInstruments(bool bConfirm = true); + bool RemoveAllInstruments(); // Plugins bool RemoveUnusedPlugins(); // Remove ununsed plugins bool RemoveAllPlugins(); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -311,7 +311,7 @@ SAMPLEINDEX nmax = m_pSndFile->GetNumSamples(); for (SAMPLEINDEX i = 1; i <= nmax; i++) if (m_pSndFile->GetSample(i).pSample) { - if (m_pModDoc->GetSplitKeyboardSettings().IsSplitActive() && nSplitIns < ARRAYELEMCOUNT(m_pSndFile->m_szNames)) + if (m_pModDoc->GetSplitKeyboardSettings().IsSplitActive()) wsprintf(s, szSplitFormat, nSplitIns, GetNoteStr(noteSplit), i, m_pSndFile->m_szNames[nSplitIns], m_pSndFile->m_szNames[i]); else wsprintf(s, "%02u: %s", i, m_pSndFile->m_szNames[i]); Modified: trunk/OpenMPT/mptrack/DefaultVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -186,7 +186,7 @@ scrollRect.MoveToX(rect.right - scrollRect.right); // Ignore this space in our calculation from now on. - rect.right -= (scrollRect.right - scrollRect.left); + rect.right -= scrollRect.Width(); controls.clear(); Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -140,7 +140,7 @@ m_ChannelCBox.SetCurSel(activeSetting.GetChannel()); - if(m_Setting.GetEvent() == 0xB) + if(m_Setting.GetEvent() == MIDIEVENT_CONTROLLERCHANGE) m_EventCBox.SetCurSel(0); else m_EventCBox.SetCurSel(-1); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -1644,14 +1644,14 @@ BOOL CMainFrame::SetupSoundCard(DWORD q, DWORD rate, UINT nBits, UINT nChns, UINT bufsize, LONG wd) //------------------------------------------------------------------------------------------------- { - BOOL bPlaying = (m_dwStatus & MODSTATUS_PLAYING) ? TRUE : FALSE; + const bool isPlaying = (m_dwStatus & MODSTATUS_PLAYING) != 0; if ((GetSettings().m_dwRate != rate) || ((GetSettings().m_dwSoundSetup & SOUNDSETUP_RESTARTMASK) != (q & SOUNDSETUP_RESTARTMASK)) || (GetSettings().m_nWaveDevice != wd) || (GetSettings().m_nBufferLength != bufsize) || (nBits != GetSettings().m_nBitsPerSample) || (GetSettings().m_nChannels != nChns)) { CModDoc *pActiveMod = NULL; HWND hFollow = m_hFollowSong; - if (bPlaying) + if (isPlaying) { if ((m_pSndFile) && (!m_pSndFile->IsPaused())) pActiveMod = m_pModPlaying; PauseMod(); @@ -1672,7 +1672,7 @@ { // No need to restart playback GetSettings().m_dwSoundSetup = q; - CSoundFile::EnableMMX((GetSettings().m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) ? TRUE : FALSE); + CSoundFile::EnableMMX((GetSettings().m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) != 0); if (GetSettings().m_dwSoundSetup & SOUNDSETUP_STREVERSE) CSoundFile::gdwSoundSetup |= SNDMIX_REVERSESTEREO; else Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -85,7 +85,7 @@ ON_COMMAND(ID_PATTERN_RESTART, OnPatternRestart) //rewbs.patPlayAllViews ON_UPDATE_COMMAND_UI(ID_INSERT_INSTRUMENT, OnUpdateXMITMPTOnly) ON_UPDATE_COMMAND_UI(ID_VIEW_INSTRUMENTS, OnUpdateXMITMPTOnly) - ON_UPDATE_COMMAND_UI(ID_VIEW_COMMENTS, OnUpdateXMITMPTOnly) + //ON_UPDATE_COMMAND_UI(ID_VIEW_COMMENTS, OnUpdateXMITMPTOnly) ON_UPDATE_COMMAND_UI(ID_VIEW_MIDIMAPPING, OnUpdateHasMIDIMappings) ON_UPDATE_COMMAND_UI(ID_FILE_SAVEASMP3, OnUpdateMP3Encode) ON_UPDATE_COMMAND_UI(ID_VIEW_EDITHISTORY, OnUpdateITMPTOnly) @@ -1884,8 +1884,8 @@ pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } - BOOL bPlaying = (pMainFrm->GetModPlaying() == this) ? TRUE : FALSE; - if ((bPlaying) && (!(m_SndFile.m_dwSongFlags & (SONG_PAUSED|SONG_STEP/*|SONG_PATTERNLOOP*/)))) + bool isPlaying = (pMainFrm->GetModPlaying() == this); + if ((isPlaying) && (!(m_SndFile.m_dwSongFlags & (SONG_PAUSED|SONG_STEP/*|SONG_PATTERNLOOP*/)))) { OnPlayerPause(); return; @@ -1896,11 +1896,13 @@ for (UINT i=m_SndFile.m_nChannels; i<MAX_CHANNELS; i++) if (!m_SndFile.Chn[i].nMasterChn) { m_SndFile.Chn[i].dwFlags |= (CHN_NOTEFADE|CHN_KEYOFF); - if (!bPlaying) m_SndFile.Chn[i].nLength = 0; + if (!isPlaying) m_SndFile.Chn[i].nLength = 0; } - if (bPlaying) { + if (isPlaying) + { m_SndFile.StopAllVsti(); - } else { + } else + { m_SndFile.ResumePlugins(); } @@ -1921,13 +1923,13 @@ { if (pMainFrm->GetModPlaying() == this) { - BOOL bLoop = (m_SndFile.m_dwSongFlags & SONG_PATTERNLOOP) ? TRUE : FALSE; + bool isLooping = (m_SndFile.m_dwSongFlags & SONG_PATTERNLOOP) != 0; UINT nPat = m_SndFile.m_nPattern; UINT nRow = m_SndFile.m_nRow; UINT nNextRow = m_SndFile.m_nNextRow; pMainFrm->PauseMod(); - if ((bLoop) && (nPat < m_SndFile.Patterns.Size())) + if ((isLooping) && (nPat < m_SndFile.Patterns.Size())) { CriticalSection cs; @@ -2046,14 +2048,14 @@ void CModDoc::OnEditComments() //---------------------------- { - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_COMMENTS); + SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_COMMENTS); } //rewbs.graph void CModDoc::OnEditGraph() //------------------------- { - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_GRAPH); + if (m_SndFile.GetType() & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_GRAPH); } //end rewbs.graph @@ -2081,7 +2083,7 @@ //--------------------------------------- { if (p) - p->Enable((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); + p->Enable((m_SndFile.GetType() & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) ? TRUE : FALSE); } @@ -2089,7 +2091,7 @@ //--------------------------------------- { if (p) - p->Enable((m_SndFile.GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); + p->Enable((m_SndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? TRUE : FALSE); } @@ -2104,18 +2106,18 @@ //--------------------------------------------------- { if (p) - p->Enable((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE); + p->Enable((m_SndFile.GetType() & (MOD_TYPE_XM | MOD_TYPE_IT)) ? TRUE : FALSE); } void CModDoc::OnInsertPattern() //----------------------------- { - LONG pat = InsertPattern(); + const PATTERNINDEX pat = InsertPattern(); if (pat >= 0) { - UINT ord = 0; - for (UINT i=0; i<m_SndFile.Order.size(); i++) + ORDERINDEX ord = 0; + for (ORDERINDEX i = 0; i < m_SndFile.Order.size(); i++) { if (m_SndFile.Order[i] == pat) ord = i; if (m_SndFile.Order[i] == m_SndFile.Order.GetInvalidPatIndex()) break; @@ -2319,12 +2321,12 @@ // if format is compatible, everything is fine. if not, let's still search // for another command. this fixes searching for the EFx command, which // does different things in MOD format. - if((m_SndFile.m_nType & gFXInfo[i].dwFormats) != 0) + if((m_SndFile.GetType() & gFXInfo[i].dwFormats) != 0) break; } } if (fxndx == MAX_FXINFO) return false; - bSupported = ((m_SndFile.m_nType & gFXInfo[fxndx].dwFormats) != 0); + bSupported = ((m_SndFile.GetType() & gFXInfo[fxndx].dwFormats) != 0); if (gFXInfo[fxndx].pszName) { if ((bXX) && (bSupported)) @@ -2345,7 +2347,7 @@ { case CMD_MODCMDEX: case CMD_S3MCMDEX: - if ((param & 0xF0) == 0xF0 && !(m_SndFile.m_nType & MOD_TYPE_MOD)) //Set Macro + if ((param & 0xF0) == 0xF0 && !(m_SndFile.GetType() & MOD_TYPE_MOD)) //Set Macro { macroText = m_SndFile.m_MidiCfg.szMidiSFXExt[(param & 0x0F)]; chanSpec.Format(" to %d: ", param & 0x0F); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -312,11 +312,11 @@ void operator()(MODCOMMAND& m) { - if(m.instr) + if(m.instr && !m.IsPcNote()) { MODCOMMAND::INSTR instr = m.instr, newinstr = 0; MODCOMMAND::NOTE note = m.note, newnote = note; - if((note >= NOTE_MIN) && (note <= NOTE_MAX)) + if(note != NOTE_NONE && NOTE_IS_VALID(note)) note--; else note = NOTE_MIDDLEC - 1; @@ -329,7 +329,10 @@ if(newinstr >= MAX_SAMPLES) newinstr = 0; } m.instr = newinstr; - m.note = newnote; + if(m.note != NOTE_NONE && NOTE_IS_VALID(m.note)) + { + m.note = newnote; + } } } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -566,7 +566,7 @@ if (pModDoc) { - const bool b = (IsDlgButtonChecked(itemID)) ? true : false; + const bool b = (IsDlgButtonChecked(itemID) != FALSE); const CHANNELINDEX nChn = (CHANNELINDEX)(m_nActiveTab * 4) + chnMod4; pModDoc->MuteChannel(nChn, b); pModDoc->UpdateAllViews(this, HINT_MODCHANNELS | (m_nActiveTab << HINT_SHIFT_CHNTAB)); @@ -586,7 +586,7 @@ if (pModDoc) { - const bool b = (IsDlgButtonChecked(itemID)) ? true : false; + const bool b = (IsDlgButtonChecked(itemID) != FALSE); const CHANNELINDEX nChn = (CHANNELINDEX)(m_nActiveTab * 4) + chnMod4; pModDoc->SurroundChannel(nChn, b); pModDoc->UpdateAllViews(this, HINT_MODCHANNELS | (m_nActiveTab << HINT_SHIFT_CHNTAB)); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -1799,6 +1799,13 @@ CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (EnvSetLoop(!EnvGetLoop()))) { + INSTRUMENTENVELOPE *pEnv = GetEnvelopePtr(); + if(EnvGetLoop() && pEnv != nullptr && pEnv->nLoopEnd == 0) + { + // Enabled loop => set loop points if no loop has been specified yet. + pEnv->nLoopStart = 0; + pEnv->nLoopEnd = pEnv->nNodes - 1; + } SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); UpdateNcButtonState(); @@ -1812,6 +1819,12 @@ CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (EnvSetSustain(!EnvGetSustain()))) { + INSTRUMENTENVELOPE *pEnv = GetEnvelopePtr(); + if(EnvGetSustain() && pEnv != nullptr && pEnv->nSustainStart == pEnv->nSustainEnd && IsDragItemEnvPoint()) + { + // Enabled sustain loop => set sustain loop points if no sustain loop has been specified yet. + pEnv->nSustainStart = pEnv->nSustainEnd = m_nDragItem - 1; + } SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); UpdateNcButtonState(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-23 20:34:22 UTC (rev 1120) @@ -4462,7 +4462,8 @@ const bool usePlaybackPosition = (bIsLiveRecord && (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_AUTODELAY) && !(pSndFile->m_dwSongFlags & SONG_STEP)); const bool isSplit = IsNoteSplit(note); - if((recordGroup == 1 && isSplit) || (recordGroup == 2 && !isSplit)) + if(pModDoc->GetSplitKeyboardSettings().IsSplitActive() + && ((recordGroup == 1 && isSplit) || (recordGroup == 2 && !isSplit))) { // Record group 1 should be used for normal notes, record group 2 for split notes. // If there are any channels assigned to the "other" record group, we switch to another channel. Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2011-10-23 00:16:13 UTC (rev 1119) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2011-10-23 20:34:22 UTC (rev 1120) @@ -202,11 +202,12 @@ MODSAMPLE *psmp = &Samples[iSmp+1]; memcpy(m_szNames[iSmp + 1], lpStream+dwMemPos, 22); StringFixer::SpaceToNullStringFixed<22>(m_szNames[iSmp + 1]); + psmp->nGlobalVol = 64; psmp->nFineTune = MOD2XMFineTune(lpStream[dwMemPos+22]); psmp->nVolume = lpStream[dwMemPos+23]; - psmp->nGlobalVol = 64; if (psmp->nVolume > 0x40) psmp->nVolume = 0x40; psmp->nVolume <<= 2; + psmp->RelativeTone = (signed char)lpStream[dwMemPos + 24]; psmp->nLength = LittleEndian(*((LPDWORD)(lpStream+dwMemPos+25))); psmp->nLoopStart = LittleEndian(*((LPDWORD)(lpStream+dwMemPos+29))); psmp->nLoopEnd = psmp->nLoopStart + LittleEndian(*((LPDWORD)(lpStream+dwMemPos+33))); @@ -371,8 +372,7 @@ if (realtrackcnt < pTrackMap[iTrkMap]) realtrackcnt = pTrackMap[iTrkMap]; } // Store tracks positions - BYTE **pTrackData = new BYTE *[realtrackcnt]; - memset(pTrackData, 0, sizeof(pTrackData)); + vector<BYTE *>pTrackData(realtrackcnt, 0); for (UINT iTrack=0; iTrack<realtrackcnt; iTrack++) if (dwMemPos <= dwMemLength-3) { UINT nTrkSize = LittleEndianW(*(USHORT *)(lpStream+dwMemPos)); @@ -407,7 +407,7 @@ } } } - delete[] pTrackData; + // Read Sample Data for (UINT iSeek=1; iSeek<=maxsampleseekpos; iSeek++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-24 22:12:51
|
Revision: 1122 http://modplug.svn.sourceforge.net/modplug/?rev=1122&view=rev Author: saga-games Date: 2011-10-24 22:12:42 +0000 (Mon, 24 Oct 2011) Log Message: ----------- [Ref] Moved a lot of MIDI Macro related code to own files. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Added Paths: ----------- trunk/OpenMPT/mptrack/MIDIMacros.cpp trunk/OpenMPT/mptrack/MIDIMacros.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-10-24 20:07:46 UTC (rev 1121) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-10-24 22:12:42 UTC (rev 1122) @@ -10,6 +10,7 @@ #include "dlg_misc.h" #include "AbstractVstEditor.h" #include "../common/StringFixer.h" +#include "MIDIMacros.h" #ifndef NO_VST @@ -589,10 +590,12 @@ for (int nMacro = 0; nMacro < NUM_MACROS; nMacro++) { + MIDIMacroTools macroTools(*pModDoc->GetSoundFile()); + action = NULL; greyed = true; macroText = pModDoc->GetSoundFile()->m_MidiCfg.szMidiSFXExt[nMacro]; - const enmParameteredMacroType macroType = pModDoc->GetMacroType(macroText); + const enmParameteredMacroType macroType = macroTools.GetMacroType(macroText); if(macroType == sfx_unused) { @@ -601,7 +604,7 @@ greyed = false; } else { - macroName = pModDoc->GetMacroName(macroText, m_pVstPlugin->GetSlot()); + macroName = macroTools.GetMacroName(macroText, m_pVstPlugin->GetSlot()); if(macroType != sfx_plug || macroName.Left(3) != "N/A") { greyed = false; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-24 20:07:46 UTC (rev 1121) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-10-24 22:12:42 UTC (rev 1122) @@ -9,6 +9,7 @@ #include "view_pat.h" #include "ChannelManagerDlg.h" #include "../common/StringFixer.h" +#include "MIDIMacros.h" ////////////////////////////////////////////////////////////// @@ -1113,7 +1114,7 @@ { if ((m_pSndFile) && (m_pModDoc)) { - CMidiMacroSetup dlg(&m_pSndFile->m_MidiCfg, (m_pSndFile->m_dwSongFlags & SONG_EMBEDMIDICFG), this); + CMidiMacroSetup dlg(*m_pSndFile, this); if (dlg.DoModal() == IDOK) { m_pSndFile->m_MidiCfg = dlg.m_MidiCfg; @@ -1127,7 +1128,8 @@ m_pSndFile->m_dwSongFlags &= ~SONG_EMBEDMIDICFG; // If this macro is not the default IT macro, display a warning. - if(!m_pModDoc->IsMacroDefaultSetupUsed()) + MIDIMacroTools macroTools(*m_pSndFile); + if(!macroTools.IsMacroDefaultSetupUsed()) { if(Reporting::Confirm(_T("You have chosen not to embed MIDI macros. However, the current macro configuration differs from the default macro configuration that is assumed when loading a file that has no macros embedded. This can result in data loss and broken playback.\nWould you like to embed MIDI macros now?")) == cnfYes) { Added: trunk/OpenMPT/mptrack/MIDIMacros.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMacros.cpp (rev 0) +++ trunk/OpenMPT/mptrack/MIDIMacros.cpp 2011-10-24 22:12:42 UTC (rev 1122) @@ -0,0 +1,782 @@ +/* + * MIDIMacros.cpp + * -------------- + * Purpose: Helper functions / classes for MIDI Macro functionality, including the MIDI Macro editor. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + +#include "stdafx.h" +#include "../common/Reporting.h" +#include "../common/StringFixer.h" +#include "Mainfrm.h" +#include "mptrack.h" +#include "Vstplug.h" +#include "resource.h" +#include "MIDIMacros.h" + + + +enmParameteredMacroType MIDIMacroTools::GetMacroType(CString value) +//----------------------------------------------------------------- +{ + value.Remove(' '); + if (value.Compare("") == 0) return sfx_unused; + if (value.Compare("F0F000z") == 0) return sfx_cutoff; + if (value.Compare("F0F001z") == 0) return sfx_reso; + if (value.Compare("F0F002z") == 0) return sfx_mode; + if (value.Compare("F0F003z") == 0) return sfx_drywet; + if (value.Compare("Bc00z") >= 0 && value.Compare("BcFFz") <= 0 && value.GetLength() == 5) + return sfx_cc; + if (value.Compare("F0F080z") >= 0 && value.Compare("F0F1FFz") <= 0 && value.GetLength() == 7) + return sfx_plug; + return sfx_custom; // custom / unknown +} + + +// Returns macro description including plugin parameter / MIDI CC information +CString MIDIMacroTools::GetMacroName(CString value, PLUGINDEX plugin) const +//------------------------------------------------------------------------- +{ + const enmParameteredMacroType macroType = GetMacroType(value); + + switch(macroType) + { + case sfx_plug: + { + const int param = MacroToPlugParam(value); + CString paramName; + + if(plugin < MAX_MIXPLUGINS) + { + CVstPlugin *pPlug = (CVstPlugin*)m_SndFile.m_MixPlugins[plugin].pMixPlugin; + if(pPlug) + { + paramName = pPlug->GetParamName(param); + } + if (paramName.IsEmpty()) + { + return _T("N/A"); + } + + CString formattedName; + formattedName.Format(_T("Param %d (%s)"), param, paramName); + return CString(formattedName); + } else + { + return _T("N/A - No Plugin"); + } + } + + case sfx_cc: + { + CString formattedCC; + formattedCC.Format(_T("MIDI CC %d"), MacroToMidiCC(value)); + return formattedCC; + } + + default: + return GetMacroName(macroType); + } +} + + +// Returns generic macro description. +CString MIDIMacroTools::GetMacroName(enmParameteredMacroType macro) +//----------------------------------------------------------------- +{ + switch(macro) + { + case sfx_unused: + return _T("Unused"); + case sfx_cutoff: + return _T("Set Filter Cutoff"); + case sfx_reso: + return _T("Set Filter Resonance"); + case sfx_mode: + return _T("Set Filter Mode"); + case sfx_drywet: + return _T("Set Plugin Dry/Wet Ratio"); + case sfx_plug: + return _T("Control Plugin Parameter..."); + case sfx_cc: + return _T("MIDI CC..."); + case sfx_custom: + default: + return _T("Custom"); + } +} + + +int MIDIMacroTools::MacroToPlugParam(CString macro) +//------------------------------------------------- +{ + macro.Remove(' '); + int code=0; + char* param = (char *) (LPCTSTR) macro; + param += 4; + if ((param[0] >= '0') && (param[0] <= '9')) code = (param[0] - '0') << 4; else + if ((param[0] >= 'A') && (param[0] <= 'F')) code = (param[0] - 'A' + 0x0A) << 4; + if ((param[1] >= '0') && (param[1] <= '9')) code += (param[1] - '0'); else + if ((param[1] >= 'A') && (param[1] <= 'F')) code += (param[1] - 'A' + 0x0A); + + if (macro.GetLength() >= 4 && macro.GetAt(3) == '0') + return (code - 128); + else + return (code + 128); +} + + +int MIDIMacroTools::MacroToMidiCC(CString macro) +//---------------------------------------------- +{ + macro.Remove(' '); + int code=0; + char* param = (char *) (LPCTSTR) macro; + param += 2; + if ((param[0] >= '0') && (param[0] <= '9')) code = (param[0] - '0') << 4; else + if ((param[0] >= 'A') && (param[0] <= 'F')) code = (param[0] - 'A' + 0x0A) << 4; + if ((param[1] >= '0') && (param[1] <= '9')) code += (param[1] - '0'); else + if ((param[1] >= 'A') && (param[1] <= 'F')) code += (param[1] - 'A' + 0x0A); + + return code; +} + + +int MIDIMacroTools::FindMacroForParam(long param) const +//----------------------------------------------------- +{ + for (size_t macro = 0; macro < NUM_MACROS; macro++) + { + CString macroString = m_SndFile.m_MidiCfg.szMidiSFXExt[macro]; + if (GetMacroType(macroString) == sfx_plug && MacroToPlugParam(macroString) == param) + { + return macro; + } + } + + return -1; +} + + +// Retrieve Zxx (Z80-ZFF) type from current macro configuration +enmFixedMacroType MIDIMacroTools::GetZxxType(const char (&szMidiZXXExt)[128][MACRO_LENGTH]) +//----------------------------------------------------------------------------------------- +{ + // Compare with all possible preset patterns + for(size_t i = 1; i < zxx_max; i++) + { + // Prepare pattern to compare + char szPatterns[128][MACRO_LENGTH]; + CreateZxxFromType(szPatterns, static_cast<enmFixedMacroType>(i)); + + bool bFound = true; + for(size_t j = 0; j < 128; j++) + { + if(strncmp(szPatterns[j], szMidiZXXExt[j], MACRO_LENGTH)) + { + bFound = false; + break; + } + } + if(bFound) return static_cast<enmFixedMacroType>(i); + } + return zxx_custom; // Custom setup +} + + +// Create Zxx (Z80 - ZFF) from one out of five presets +void MIDIMacroTools::CreateZxxFromType(char (&szMidiZXXExt)[128][MACRO_LENGTH], enmFixedMacroType iZxxType) +//--------------------------------------------------------------------------------------------------------- +{ + for(size_t i = 0; i < 128; i++) + { + switch(iZxxType) + { + case zxx_reso4Bit: + // Type 1 - Z80 - Z8F controls resonance + if (i < 16) wsprintf(szMidiZXXExt[i], "F0F001%02X", i * 8); + else strcpy(szMidiZXXExt[i], ""); + break; + + case zxx_reso7Bit: + // Type 2 - Z80 - ZFF controls resonance + wsprintf(szMidiZXXExt[i], "F0F001%02X", i); + break; + + case zxx_cutoff: + // Type 3 - Z80 - ZFF controls cutoff + wsprintf(szMidiZXXExt[i], "F0F000%02X", i); + break; + + case zxx_mode: + // Type 4 - Z80 - ZFF controls filter mode + wsprintf(szMidiZXXExt[i], "F0F002%02X", i); + break; + + case zxx_resomode: + // Type 5 - Z80 - Z9F controls resonance + filter mode + if (i < 16) wsprintf(szMidiZXXExt[i], "F0F001%02X", i * 8); + else if (i < 32) wsprintf(szMidiZXXExt[i], "F0F002%02X", (i - 16) * 8); + else strcpy(szMidiZXXExt[i], ""); + break; + } + } +} + + +// Check if the MIDI Macro configuration used is the default one, +// i.e. the configuration that is assumed when loading a file that has no macros embedded. +bool MIDIMacroTools::IsMacroDefaultSetupUsed() const +//-------------------------------------------------- +{ + // TODO - Global macros + + // SF0: Z00-Z7F controls cutoff + if(GetMacroType(m_SndFile.m_MidiCfg.szMidiSFXExt[0]) != sfx_cutoff) + { + return false; + } + // Z80-Z8F controls resonance + if(GetZxxType(m_SndFile.m_MidiCfg.szMidiZXXExt) != zxx_reso4Bit) + { + return false; + } + // All other parametered macros are unused + for(size_t i = 1; i < NUM_MACROS; i++) + { + if(GetMacroType(m_SndFile.m_MidiCfg.szMidiSFXExt[i]) != sfx_unused) + { + return false; + } + } + return true; +} + + +//////////////////////////////////////////////////////////////////////// +// MIDI Macro Configuration Dialog + +BEGIN_MESSAGE_MAP(CMidiMacroSetup, CDialog) + ON_COMMAND(IDC_CHECK1, OnEmbedMidiCfg) + ON_COMMAND(IDC_BUTTON1, OnSetAsDefault) + ON_COMMAND(IDC_BUTTON2, OnResetCfg) + ON_COMMAND(IDC_BUTTON3, OnMacroHelp) + ON_CBN_SELCHANGE(IDC_COMBO1, OnSFxChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, OnSFxPresetChanged) + ON_CBN_SELCHANGE(IDC_COMBO3, OnZxxPresetChanged) + ON_CBN_SELCHANGE(IDC_COMBO4, UpdateDialog) + ON_CBN_SELCHANGE(IDC_MACROPLUG, OnPlugChanged) + ON_CBN_SELCHANGE(IDC_MACROPARAM,OnPlugParamChanged) + ON_CBN_SELCHANGE(IDC_MACROCC, OnCCChanged) + ON_EN_CHANGE(IDC_EDIT1, OnSFxEditChanged) + ON_EN_CHANGE(IDC_EDIT2, OnZxxEditChanged) + ON_COMMAND_RANGE(ID_PLUGSELECT, ID_PLUGSELECT + NUM_MACROS - 1, OnViewAllParams) //rewbs.patPlugName + ON_COMMAND_RANGE(ID_PLUGSELECT + NUM_MACROS, ID_PLUGSELECT + NUM_MACROS + NUM_MACROS - 1, OnSetSFx) //rewbs.patPlugName +END_MESSAGE_MAP() + + +void CMidiMacroSetup::DoDataExchange(CDataExchange* pDX) +//------------------------------------------------------ +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CModTypeDlg) + DDX_Control(pDX, IDC_COMBO1, m_CbnSFx); + DDX_Control(pDX, IDC_COMBO2, m_CbnSFxPreset); + DDX_Control(pDX, IDC_COMBO3, m_CbnZxxPreset); + DDX_Control(pDX, IDC_COMBO4, m_CbnZxx); + DDX_Control(pDX, IDC_EDIT1, m_EditSFx); + DDX_Control(pDX, IDC_EDIT2, m_EditZxx); + DDX_Control(pDX, IDC_MACROPLUG, m_CbnMacroPlug); + DDX_Control(pDX, IDC_MACROPARAM, m_CbnMacroParam); + DDX_Control(pDX, IDC_MACROCC, m_CbnMacroCC); + //}}AFX_DATA_MAP +} + + +BOOL CMidiMacroSetup::OnInitDialog() +//---------------------------------- +{ + CHAR s[128]; + CDialog::OnInitDialog(); + CheckDlgButton(IDC_CHECK1, m_bEmbed ? BST_CHECKED : BST_UNCHECKED); + m_EditSFx.SetLimitText(MACRO_LENGTH - 1); + m_EditZxx.SetLimitText(MACRO_LENGTH - 1); + + for (UINT isfx=0; isfx<16; isfx++) + { + wsprintf(s, "%d (SF%X)", isfx, isfx); + m_CbnSFx.AddString(s); + } + m_CbnSFx.SetCurSel(0); + for(int i = 0; i < sfx_max; i++) + { + m_CbnSFxPreset.SetItemData(m_CbnSFxPreset.AddString(macroTools.GetMacroName(static_cast<enmParameteredMacroType>(i))), i); + } + OnSFxChanged(); + + for (int cc = MIDICC_start; cc <= MIDICC_end; cc++) + { + wsprintf(s, "CC %02d %s", cc, MidiCCNames[cc]); + m_CbnMacroCC.SetItemData(m_CbnMacroCC.AddString(s), cc); + } + + for (int zxx = 0; zxx < 128; zxx++) + { + wsprintf(s, "Z%02X", zxx | 0x80); + m_CbnZxx.AddString(s); + } + m_CbnZxx.SetCurSel(0); + m_CbnZxxPreset.AddString("Custom"); + m_CbnZxxPreset.AddString("Z80-Z8F controls resonance"); + m_CbnZxxPreset.AddString("Z80-ZFF controls resonance"); + m_CbnZxxPreset.AddString("Z80-ZFF controls cutoff"); + m_CbnZxxPreset.AddString("Z80-ZFF controls filter mode"); + m_CbnZxxPreset.AddString("Z80-Z9F controls resonance+mode"); + m_CbnZxxPreset.SetCurSel(macroTools.GetZxxType(m_MidiCfg.szMidiZXXExt)); + UpdateDialog(); + + int offsetx=108, offsety=30, separatorx=4, separatory=2, + height=18, widthMacro=30, widthVal=90, widthType=135, widthBtn=70; + + for (UINT m = 0; m < NUM_MACROS; m++) + { + m_EditMacro[m].Create("", /*BS_FLAT |*/ WS_CHILD | WS_VISIBLE | WS_TABSTOP /*| WS_BORDER*/, + CRect(offsetx, offsety + m * (separatory + height), offsetx + widthMacro, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + NUM_MACROS + m); + m_EditMacro[m].SetFont(GetFont()); + + m_EditMacroType[m].Create(ES_READONLY | WS_CHILD| WS_VISIBLE | WS_TABSTOP | WS_BORDER, + CRect(offsetx + separatorx + widthMacro, offsety + m* (separatory + height), offsetx + widthMacro + widthType, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + NUM_MACROS + m); + m_EditMacroType[m].SetFont(GetFont()); + + m_EditMacroValue[m].Create(ES_CENTER | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, + CRect(offsetx + separatorx + widthType + widthMacro, offsety + m * (separatory + height), offsetx + widthMacro + widthType + widthVal, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + NUM_MACROS + m); + m_EditMacroValue[m].SetFont(GetFont()); + + m_BtnMacroShowAll[m].Create("Show All...", WS_CHILD | WS_TABSTOP | WS_VISIBLE, + CRect(offsetx + separatorx + widthType + widthMacro + widthVal, offsety + m *(separatory + height), offsetx + widthMacro + widthType + widthVal + widthBtn, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + m); + m_BtnMacroShowAll[m].SetFont(GetFont()); + } + UpdateMacroList(); + + for (UINT plug=0; plug<MAX_MIXPLUGINS; plug++) + { + PSNDMIXPLUGIN p = &(m_SndFile.m_MixPlugins[plug]); + StringFixer::SetNullTerminator(p->Info.szLibraryName); + if (p->Info.szLibraryName[0]) + { + wsprintf(s, "FX%d: %s", plug+1, p->Info.szName); + m_CbnMacroPlug.SetItemData(m_CbnMacroPlug.AddString(s), plug); + } + } + m_CbnMacroPlug.SetCurSel(0); + OnPlugChanged(); + return FALSE; +} + + +void CMidiMacroSetup::UpdateMacroList(int macro) //-1 for all macros +//---------------------------------------------- +{ + if (!m_EditMacro[0]) + return; //GUI not yet initialized + + CString s, macroText; + UINT start, end, macroType; + int selectedMacro=m_CbnSFx.GetCurSel(); + + if (macro >= 0 && macro < 16) + { + start=macro; + end=macro; + } else + { + start=0; + end=NUM_MACROS; + } + + for (int m=0; m<NUM_MACROS; m++) + { + //SFx + s.Format("SF%X", m); + m_EditMacro[m].SetWindowText(s); + + //Macro value: + CString macroText = m_MidiCfg.szMidiSFXExt[m]; + m_EditMacroValue[m].SetWindowText(macroText); + m_EditMacroValue[m].SetBackColor(m == selectedMacro ? RGB(200, 200, 225) : RGB(245, 245, 245)); + + //Macro Type: + macroType = macroTools.GetMacroType(macroText); + switch (macroType) + { + case sfx_unused: s = "Unused"; break; + case sfx_cutoff: s = "Set Filter Cutoff"; break; + case sfx_reso: s = "Set Filter Resonance"; break; + case sfx_mode: s = "Set Filter Mode"; break; + case sfx_drywet: s = "Set Plugin dry/wet ratio"; break; + case sfx_cc: + s.Format("MIDI CC %d", macroTools.MacroToMidiCC(macroText)); + break; + case sfx_plug: + s.Format("Control Plugin Param %d", macroTools.MacroToPlugParam(macroText)); + break; + case sfx_custom: + default: s = "Custom"; + } + m_EditMacroType[m].SetWindowText(s); + m_EditMacroType[m].SetBackColor(m == selectedMacro ? RGB(200,200,225) : RGB(245,245,245) ); + + //Param details button: + if (macroType == sfx_plug) + m_BtnMacroShowAll[m].ShowWindow(SW_SHOW); + else + m_BtnMacroShowAll[m].ShowWindow(SW_HIDE); + } +} + + +void CMidiMacroSetup::UpdateDialog() +//---------------------------------- +{ + CHAR s[MACRO_LENGTH]; + UINT sfx, sfx_preset, zxx; + + sfx = m_CbnSFx.GetCurSel(); + sfx_preset = m_CbnSFxPreset.GetItemData(m_CbnSFxPreset.GetCurSel()); + if (sfx < 16) + { + ToggleBoxes(sfx_preset, sfx); + memcpy(s, m_MidiCfg.szMidiSFXExt[sfx], MACRO_LENGTH); + StringFixer::SetNullTerminator(s); + m_EditSFx.SetWindowText(s); + } + + zxx = m_CbnZxx.GetCurSel(); + if (zxx < 0x80) + { + memcpy(s, m_MidiCfg.szMidiZXXExt[zxx], MACRO_LENGTH); + StringFixer::SetNullTerminator(s); + m_EditZxx.SetWindowText(s); + } + UpdateMacroList(); +} + + +void CMidiMacroSetup::OnSetAsDefault() +//------------------------------------ +{ + theApp.SetDefaultMidiMacro(&m_MidiCfg); +} + + +void CMidiMacroSetup::OnResetCfg() +//-------------------------------- +{ + theApp.GetDefaultMidiMacro(&m_MidiCfg); + m_CbnZxxPreset.SetCurSel(0); + OnSFxChanged(); +} + + +void CMidiMacroSetup::OnMacroHelp() +//--------------------------------- +{ + Reporting::Information(_T("Valid characters in macros:\n\n" + "0-9, A-F - Raw hex data (4-Bit value)\n" + "c - MIDI channel (4-Bit value)\n" + "n - Note value\n\n" + "v - Note velocity\n" + "u - Computed note volume (including envelopes)\n\n" + "x - Note panning\n" + "y - Computed panning (including envelopes)\n\n" + "a - High byte of bank select\n" + "b - Low byte of bank select\n" + "p - Program select\n\n" + "z - Zxx parameter (00-7F)\n\n" + "Macros can be up to 31 characters long and contain multiple MIDI messages. SysEx messages are automatically terminated if not specified by the user."), + _T("OpenMPT MIDI Macro quick reference")); +} + + +void CMidiMacroSetup::OnEmbedMidiCfg() +//------------------------------------ +{ + m_bEmbed = IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED; +} + + +void CMidiMacroSetup::OnSFxChanged() +//---------------------------------- +{ + UINT sfx = m_CbnSFx.GetCurSel(); + if (sfx < 16) + { + CString macroText; + memcpy(macroText.GetBuffer(MACRO_LENGTH), m_MidiCfg.szMidiSFXExt[sfx], MACRO_LENGTH); + int preset = macroTools.GetMacroType(macroText); + m_CbnSFxPreset.SetCurSel(preset); + } + UpdateDialog(); +} + + +void CMidiMacroSetup::OnSFxPresetChanged() +//---------------------------------------- +{ + UINT sfx = m_CbnSFx.GetCurSel(); + UINT sfx_preset = m_CbnSFxPreset.GetItemData(m_CbnSFxPreset.GetCurSel()); + + if (sfx < 16) + { + char *pmacro = m_MidiCfg.szMidiSFXExt[sfx]; + switch(sfx_preset) + { + case sfx_unused: strcpy(pmacro, ""); break; // unused + case sfx_cutoff: strcpy(pmacro, "F0F000z"); break; // cutoff + case sfx_reso: strcpy(pmacro, "F0F001z"); break; // reso + case sfx_mode: strcpy(pmacro, "F0F002z"); break; // mode + case sfx_drywet: strcpy(pmacro, "F0F003z"); break; + case sfx_cc: strcpy(pmacro, "Bc00z"); break; // MIDI cc - TODO: get value from other menus + case sfx_plug: strcpy(pmacro, "F0F080z"); break; // plug param - TODO: get value from other menus + case sfx_custom: /*strcpy(pmacro, "z");*/ break; // custom - leave as is. + } + UpdateDialog(); + } +} + + +void CMidiMacroSetup::OnZxxPresetChanged() +//---------------------------------------- +{ + enmFixedMacroType zxx_preset = static_cast<enmFixedMacroType>(m_CbnZxxPreset.GetCurSel()); + + if (zxx_preset != zxx_custom) + { + macroTools.CreateZxxFromType(m_MidiCfg.szMidiZXXExt, zxx_preset); + UpdateDialog(); + } +} + + +void CMidiMacroSetup::OnSFxEditChanged() +//-------------------------------------- +{ + CHAR s[MACRO_LENGTH]; + UINT sfx = m_CbnSFx.GetCurSel(); + if (sfx < 16) + { + if(ValidateMacroString(m_EditSFx, m_MidiCfg.szMidiSFXExt[sfx], true)) + { + MemsetZero(s); + m_EditSFx.GetWindowText(s, MACRO_LENGTH); + StringFixer::SetNullTerminator(s); + memcpy(m_MidiCfg.szMidiSFXExt[sfx], s, MACRO_LENGTH); + + int sfx_preset = macroTools.GetMacroType(m_MidiCfg.szMidiSFXExt[sfx]); + //int param = macroTools.MacroToPlugParam(m_MidiCfg.szMidiSFXExt[sfx]); + + m_CbnSFxPreset.SetCurSel(sfx_preset); + ToggleBoxes(sfx_preset, sfx); + UpdateMacroList(sfx); + } + } +} + + +void CMidiMacroSetup::OnZxxEditChanged() +//-------------------------------------- +{ + CHAR s[MACRO_LENGTH]; + UINT zxx = m_CbnZxx.GetCurSel(); + if (zxx < 128) + { + if(ValidateMacroString(m_EditZxx, m_MidiCfg.szMidiZXXExt[zxx], false)) + { + MemsetZero(s); + m_EditZxx.GetWindowText(s, MACRO_LENGTH); + StringFixer::SetNullTerminator(s); + memcpy(m_MidiCfg.szMidiZXXExt[zxx], s, MACRO_LENGTH); + } + } +} + +void CMidiMacroSetup::OnSetSFx(UINT id) +//------------------------------------- +{ + m_CbnSFx.SetCurSel(id-(ID_PLUGSELECT + NUM_MACROS)); + OnSFxChanged(); +} + +void CMidiMacroSetup::OnViewAllParams(UINT id) +//-------------------------------------------- +{ + CString message, plugName, line; + int sfx = id-ID_PLUGSELECT; + int param = macroTools.MacroToPlugParam(m_MidiCfg.szMidiSFXExt[sfx]); + CVstPlugin *pVstPlugin; + message.Format("These are the parameters that can be controlled by macro SF%X:\n\n",sfx); + + for (UINT plug=0; plug<MAX_MIXPLUGINS; plug++) + { + plugName = m_SndFile.m_MixPlugins[plug].Info.szName; + if (plugName != "") + { + pVstPlugin=(CVstPlugin*) m_SndFile.m_MixPlugins[plug].pMixPlugin; + if (pVstPlugin && param <= pVstPlugin->GetNumParameters()) + { + line.Format("FX%d: %s\t %s\n", plug + 1, plugName, pVstPlugin->GetFormattedParamName(param)); + message += line; + } + } + } + + Reporting::Notification(message, "Macro -> Params"); +} + +void CMidiMacroSetup::OnPlugChanged() +//----------------------------------- +{ + int plug = m_CbnMacroPlug.GetItemData(m_CbnMacroPlug.GetCurSel()); + + if (plug < 0 || plug > MAX_MIXPLUGINS) + return; + + PSNDMIXPLUGIN pPlugin = &m_SndFile.m_MixPlugins[plug]; + CVstPlugin *pVstPlugin = (pPlugin->pMixPlugin) ? (CVstPlugin *)pPlugin->pMixPlugin : NULL; + + if (pVstPlugin) + { + m_CbnMacroParam.SetRedraw(FALSE); + m_CbnMacroParam.Clear(); + m_CbnMacroParam.ResetContent(); + AddPluginParameternamesToCombobox(m_CbnMacroParam, *pVstPlugin); + m_CbnMacroParam.SetRedraw(TRUE); + + int param = macroTools.MacroToPlugParam(m_MidiCfg.szMidiSFXExt[m_CbnSFx.GetCurSel()]); + m_CbnMacroParam.SetCurSel(param); + } + //OnPlugParamChanged(); +} + +void CMidiMacroSetup::OnPlugParamChanged() +//---------------------------------------- +{ + CString macroText; + UINT param = m_CbnMacroParam.GetItemData(m_CbnMacroParam.GetCurSel()); + + if (param < 128) + { + macroText.Format("F0F0%02Xz",param + 128); + m_EditSFx.SetWindowText(macroText); + } else if (param < 384) + { + macroText.Format("F0F1%02Xz",param - 128); + m_EditSFx.SetWindowText(macroText); + } else + { + Reporting::Notification("MPT can only assign macros to parameters 0 to 383. Use Parameter Control Notes to automate higher parameters."); + } +} + +void CMidiMacroSetup::OnCCChanged() +//--------------------------------- +{ + CString macroText; + UINT cc = m_CbnMacroCC.GetItemData(m_CbnMacroCC.GetCurSel()); + macroText.Format("Bc%02Xz", cc & 0xFF); + m_EditSFx.SetWindowText(macroText); +} + +void CMidiMacroSetup::ToggleBoxes(UINT sfx_preset, UINT sfx) +//---------------------------------------------------------- +{ + + if (sfx_preset == sfx_plug) + { + m_CbnMacroCC.ShowWindow(FALSE); + m_CbnMacroPlug.ShowWindow(TRUE); + m_CbnMacroParam.ShowWindow(TRUE); + m_CbnMacroPlug.EnableWindow(TRUE); + m_CbnMacroParam.EnableWindow(TRUE); + SetDlgItemText(IDC_GENMACROLABEL, "Plug/Param"); + m_CbnMacroParam.SetCurSel(macroTools.MacroToPlugParam(m_MidiCfg.szMidiSFXExt[sfx])); + } else + { + m_CbnMacroPlug.EnableWindow(FALSE); + m_CbnMacroParam.EnableWindow(FALSE); + } + + if (sfx_preset == sfx_cc) + { + m_CbnMacroCC.EnableWindow(TRUE); + m_CbnMacroCC.ShowWindow(TRUE); + m_CbnMacroPlug.ShowWindow(FALSE); + m_CbnMacroParam.ShowWindow(FALSE); + SetDlgItemText(IDC_GENMACROLABEL, "MIDI CC"); + m_CbnMacroCC.SetCurSel(macroTools.MacroToMidiCC(m_MidiCfg.szMidiSFXExt[sfx])); + } else + { + m_CbnMacroCC.EnableWindow(FALSE); + } + + //m_EditSFx.EnableWindow((sfx_preset == sfx_unused) ? FALSE : TRUE); + +} + + +bool CMidiMacroSetup::ValidateMacroString(CEdit &wnd, char *lastMacro, bool isParametric) +//--------------------------------------------------------------------------------------- +{ + CString macroStr; + wnd.GetWindowText(macroStr); + + bool allowed = true, caseChange = false; + for(int i = 0; i < macroStr.GetLength(); i++) + { + char c = macroStr.GetAt(i); + if(c == 'k' || c == 'K') // Previously, 'K' was used for MIDI channel + { + caseChange = true; + macroStr.SetAt(i, 'c'); + } else if (c >= 'd' && c <= 'f') // abc have special meanings, but def can be fixed + { + caseChange = true; + macroStr.SetAt(i, c - 'a' + 'A'); + } else if(c == 'N' || c == 'V' || c == 'U' || c == 'X' || c == 'Y' || c == 'Z' || c == 'P') + { + caseChange = true; + macroStr.SetAt(i, c - 'A' + 'a'); + } else if(!( + (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'c') || + (c == 'v' || c == 'u' || c == 'x' || c == 'y' || c == 'p' || c == 'n' || c == ' ') || + (c == 'z' && isParametric))) + { + allowed = false; + break; + } + } + + if(!allowed) + { + // Replace text and keep cursor position if we just typed in an invalid character + int start, end; + wnd.GetSel(start, end); + wnd.SetWindowText(lastMacro); + wnd.SetSel(start - 1, end - 1, true); + MessageBeep(MB_OK); + return false; + } + else + { + if(caseChange) + { + // Replace text and keep cursor position if there was a case conversion + int start, end; + wnd.GetSel(start, end); + wnd.SetWindowText(macroStr); + wnd.SetSel(start, end, true); + } + return true; + } +} Added: trunk/OpenMPT/mptrack/MIDIMacros.h =================================================================== --- trunk/OpenMPT/mptrack/MIDIMacros.h (rev 0) +++ trunk/OpenMPT/mptrack/MIDIMacros.h 2011-10-24 22:12:42 UTC (rev 1122) @@ -0,0 +1,129 @@ +/* + * MIDIMacros.h + * ------------ + * Purpose: Header file for MIDI macro helper functions / classes + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + +#pragma once +#ifndef MIDIMACROS_H +#define MIDIMACROS_H + +// parametered macro presets: +enum enmParameteredMacroType +{ + sfx_unused = 0, + sfx_cutoff, // Type 1 - Z00 - Z7F controls resonant filter cutoff + sfx_reso, // Type 2 - Z00 - Z7F controls resonant filter resonance + sfx_mode, // Type 3 - Z00 - Z7F controls resonant filter mode (lowpass / highpass) + sfx_drywet, // Type 4 - Z00 - Z7F controls plugin Dry / Wet ratio + sfx_plug, // Type 5 - Z00 - Z7F controls a plugin parameter + sfx_cc, // Type 6 - Z00 - Z7F controls MIDI CC + sfx_custom, + + sfx_max +}; + + +// fixed macro presets: +enum enmFixedMacroType +{ + zxx_custom = 0, + zxx_reso4Bit, // Type 1 - Z80 - Z8F controls resonant filter resonance + zxx_reso7Bit, // Type 2 - Z80 - ZFF controls resonant filter resonance + zxx_cutoff, // Type 3 - Z80 - ZFF controls resonant filter cutoff + zxx_mode, // Type 4 - Z80 - ZFF controls resonant filter mode (lowpass / highpass) + zxx_resomode, // Type 5 - Z80 - Z9F controls resonance + filter mode + + zxx_max +}; + + +class MIDIMacroTools +{ +protected: + CSoundFile &m_SndFile; + +public: + // Get macro type from a macro string + static enmParameteredMacroType GetMacroType(CString value); + static enmFixedMacroType GetZxxType(const char (&szMidiZXXExt)[128][MACRO_LENGTH]); + + // Translate macro type or macro string to macro name + static CString GetMacroName(enmParameteredMacroType macro); + CString GetMacroName(CString value, PLUGINDEX plugin) const; + + // Extract information from a macro string. + static int MacroToPlugParam(CString value); + static int MacroToMidiCC(CString value); + + // Check if any macro can automate a given plugin parameter + int FindMacroForParam(long param) const; + + // Create a new Zxx macro + static void CreateZxxFromType(char (&szMidiZXXExt)[128][MACRO_LENGTH], enmFixedMacroType iZxxType); + + // Check if a given set of macros is the default IT macro set. + bool IsMacroDefaultSetupUsed() const; + + MIDIMacroTools(CSoundFile &sndFile) : m_SndFile(sndFile) { }; +}; + + +//////////////////////////////////////////////////////////////////////// +// MIDI Macro Configuration Dialog + +//class CColourEdit; +#include "ColourEdit.h" + + +//=================================== +class CMidiMacroSetup: public CDialog +//=================================== +{ +public: + CMidiMacroSetup(CSoundFile &sndFile, CWnd *parent = NULL) : CDialog(IDD_MIDIMACRO, parent), m_SndFile(sndFile), macroTools(sndFile), m_MidiCfg(sndFile.m_MidiCfg) + { + m_bEmbed = (m_SndFile.m_dwSongFlags & SONG_EMBEDMIDICFG) != 0; + } + + bool m_bEmbed; + MODMIDICFG m_MidiCfg; + + +protected: + CComboBox m_CbnSFx, m_CbnSFxPreset, m_CbnZxx, m_CbnZxxPreset, m_CbnMacroPlug, m_CbnMacroParam, m_CbnMacroCC; + CEdit m_EditSFx, m_EditZxx; + CColourEdit m_EditMacroValue[NUM_MACROS], m_EditMacroType[NUM_MACROS]; //rewbs.macroGUI + CButton m_EditMacro[NUM_MACROS], m_BtnMacroShowAll[NUM_MACROS]; + + CSoundFile &m_SndFile; + MIDIMacroTools macroTools; + + bool ValidateMacroString(CEdit &wnd, char *lastMacro, bool isParametric); + + void UpdateMacroList(int macro=-1); + void ToggleBoxes(UINT preset, UINT sfx); + virtual BOOL OnInitDialog(); + virtual void DoDataExchange(CDataExchange* pDX); + afx_msg void UpdateDialog(); + afx_msg void OnSetAsDefault(); + afx_msg void OnResetCfg(); + afx_msg void OnMacroHelp(); + afx_msg void OnEmbedMidiCfg(); + afx_msg void OnSFxChanged(); + afx_msg void OnSFxPresetChanged(); + afx_msg void OnZxxPresetChanged(); + afx_msg void OnSFxEditChanged(); + afx_msg void OnZxxEditChanged(); + afx_msg void OnPlugChanged(); + afx_msg void OnPlugParamChanged(); + afx_msg void OnCCChanged(); + + afx_msg void OnViewAllParams(UINT id); + afx_msg void OnSetSFx(UINT id); + DECLARE_MESSAGE_MAP() +}; + +#endif // MIDIMACROS_H Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-24 20:07:46 UTC (rev 1121) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-24 22:12:42 UTC (rev 1122) @@ -15,6 +15,7 @@ #include "version.h" #include "modsmp_ctrl.h" #include "CleanupSong.h" +#include "MIDIMacros.h" #include "../common/StringFixer.h" #include <shlwapi.h> @@ -177,7 +178,9 @@ if (m_SndFile.m_nType & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) { m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; - if(!IsMacroDefaultSetupUsed()) + + MIDIMacroTools macroTools(m_SndFile); + if(!macroTools.IsMacroDefaultSetupUsed()) { m_SndFile.m_dwSongFlags |= SONG_EMBEDMIDICFG; } @@ -2369,8 +2372,9 @@ if (macroText != "_no macro_") { + MIDIMacroTools macroTools(m_SndFile); const PLUGINDEX plugin = m_SndFile.GetBestPlugin(nChn, PrioritiseChannel, EvenIfMuted) - 1; - chanSpec.Append(GetMacroName(macroText, plugin)); + chanSpec.Append(macroTools.GetMacroName(macroText, plugin)); } if (chanSpec != "") { @@ -3217,254 +3221,6 @@ } -enmParameteredMacroType CModDoc::GetMacroType(CString value) -//---------------------------------------------------------- -{ - value.Remove(' '); - if (value.Compare("") == 0) return sfx_unused; - if (value.Compare("F0F000z") == 0) return sfx_cutoff; - if (value.Compare("F0F001z") == 0) return sfx_reso; - if (value.Compare("F0F002z") == 0) return sfx_mode; - if (value.Compare("F0F003z") == 0) return sfx_drywet; - if (value.Compare("Bc00z") >= 0 && value.Compare("BcFFz") <= 0 && value.GetLength() == 5) - return sfx_cc; - if (value.Compare("F0F080z") >= 0 && value.Compare("F0F1FFz") <= 0 && value.GetLength() == 7) - return sfx_plug; - return sfx_custom; //custom/unknown -} - - -// Returns macro description including plugin parameter / MIDI CC information -CString CModDoc::GetMacroName(CString value, PLUGINDEX plugin) -//------------------------------------------------------------ -{ - const enmParameteredMacroType macroType = GetMacroType(value); - - switch(macroType) - { - case sfx_plug: - { - const int param = MacroToPlugParam(value); - CString paramName; - - if(plugin < MAX_MIXPLUGINS) - { - CVstPlugin *pPlug = (CVstPlugin*)m_SndFile.m_MixPlugins[plugin].pMixPlugin; - if(pPlug) - { - paramName = pPlug->GetParamName(param); - } - if (paramName.IsEmpty()) - { - return _T("N/A"); - } - - CString formattedName; - formattedName.Format(_T("Param %d (%s)"), param, paramName); - return CString(formattedName); - } else - { - return _T("N/A - No Plugin"); - } - } - - case sfx_cc: - { - CString formattedCC; - formattedCC.Format(_T("MIDI CC %d"), MacroToMidiCC(value)); - return formattedCC; - } - - default: - return GetMacroName(macroType); - } -} - - -// Returns generic macro description. -CString CModDoc::GetMacroName(enmParameteredMacroType macro) -//---------------------------------------------------------- -{ - switch(macro) - { - case sfx_unused: - return _T("Unused"); - case sfx_cutoff: - return _T("Set Filter Cutoff"); - case sfx_reso: - return _T("Set Filter Resonance"); - case sfx_mode: - return _T("Set Filter Mode"); - case sfx_drywet: - return _T("Set Plugin Dry/Wet Ratio"); - case sfx_plug: - return _T("Control Plugin Parameter..."); - case sfx_cc: - return _T("MIDI CC..."); - case sfx_custom: - default: - return _T("Custom"); - } -} - - -int CModDoc::MacroToPlugParam(CString macro) -//------------------------------------------ -{ - macro.Remove(' '); - int code=0; - char* param = (char *) (LPCTSTR) macro; - param += 4; - if ((param[0] >= '0') && (param[0] <= '9')) code = (param[0] - '0') << 4; else - if ((param[0] >= 'A') && (param[0] <= 'F')) code = (param[0] - 'A' + 0x0A) << 4; - if ((param[1] >= '0') && (param[1] <= '9')) code += (param[1] - '0'); else - if ((param[1] >= 'A') && (param[1] <= 'F')) code += (param[1] - 'A' + 0x0A); - - if (macro.GetLength() >= 4 && macro.GetAt(3) == '0') - return (code - 128); - else - return (code + 128); -} - - -int CModDoc::MacroToMidiCC(CString macro) -//--------------------------------------- -{ - macro.Remove(' '); - int code=0; - char* param = (char *) (LPCTSTR) macro; - param += 2; - if ((param[0] >= '0') && (param[0] <= '9')) code = (param[0] - '0') << 4; else - if ((param[0] >= 'A') && (param[0] <= 'F')) code = (param[0] - 'A' + 0x0A) << 4; - if ((param[1] >= '0') && (param[1] <= '9')) code += (param[1] - '0'); else - if ((param[1] >= 'A') && (param[1] <= 'F')) code += (param[1] - 'A' + 0x0A); - - return code; -} - - -int CModDoc::FindMacroForParam(long param) const -//---------------------------------------------- -{ - const CSoundFile *pSndFile = GetSoundFile(); - if(pSndFile == nullptr) - { - return -1; - } - for (size_t macro = 0; macro < NUM_MACROS; macro++) - { - CString macroString = pSndFile->m_MidiCfg.szMidiSFXExt[macro]; - if (GetMacroType(macroString) == sfx_plug && MacroToPlugParam(macroString) == param) - { - return macro; - } - } - - return -1; -} - - -// Retrieve Zxx (Z80-ZFF) type from current macro configuration -enmFixedMacroType CModDoc::GetZxxType(const char (&szMidiZXXExt)[128][MACRO_LENGTH]) -//---------------------------------------------------------------------------------- -{ - // Compare with all possible preset patterns - for(size_t i = 1; i < zxx_max; i++) - { - // Prepare pattern to compare - char szPatterns[128][MACRO_LENGTH]; - CreateZxxFromType(szPatterns, static_cast<enmFixedMacroType>(i)); - - bool bFound = true; - for(size_t j = 0; j < 128; j++) - { - if(strncmp(szPatterns[j], szMidiZXXExt[j], MACRO_LENGTH)) - { - bFound = false; - break; - } - } - if(bFound) return static_cast<enmFixedMacroType>(i); - } - return zxx_custom; // Custom setup -} - - -// Create Zxx (Z80 - ZFF) from one out of five presets -void CModDoc::CreateZxxFromType(char (&szMidiZXXExt)[128][MACRO_LENGTH], enmFixedMacroType iZxxType) -//-------------------------------------------------------------------------------------------------- -{ - for(size_t i = 0; i < 128; i++) - { - switch(iZxxType) - { - case zxx_reso4Bit: - // Type 1 - Z80 - Z8F controls resonance - if (i < 16) wsprintf(szMidiZXXExt[i], "F0F001%02X", i * 8); - else strcpy(szMidiZXXExt[i], ""); - break; - - case zxx_reso7Bit: - // Type 2 - Z80 - ZFF controls resonance - wsprintf(szMidiZXXExt[i], "F0F001%02X", i); - break; - - case zxx_cutoff: - // Type 3 - Z80 - ZFF controls cutoff - wsprintf(szMidiZXXExt[i], "F0F000%02X", i); - break; - - case zxx_mode: - // Type 4 - Z80 - ZFF controls filter mode - wsprintf(szMidiZXXExt[i], "F0F002%02X", i); - break; - - case zxx_resomode: - // Type 5 - Z80 - Z9F controls resonance + filter mode - if (i < 16) wsprintf(szMidiZXXExt[i], "F0F001%02X", i * 8); - else if (i < 32) wsprintf(szMidiZXXExt[i], "F0F002%02X", (i - 16) * 8); - else strcpy(szMidiZXXExt[i], ""); - break; - } - } -} - - -// Check if the MIDI Macro configuration used is the default one, -// i.e. the configuration that is assumed when loading a file that has no macros embedded. -bool CModDoc::IsMacroDefaultSetupUsed() const -//------------------------------------------- -{ - const CSoundFile *pSndFile = GetSoundFile(); - if(pSndFile == nullptr) - { - return false; - } - // Global macros - // TODO - - // SF0: Z00-Z7F controls cutoff - if(GetMacroType(pSndFile->m_MidiCfg.szMidiSFXExt[0]) != sfx_cutoff) - { - return false; - } - // Z80-Z8F controls resonance - if(GetZxxType(pSndFile->m_MidiCfg.szMidiZXXExt) != zxx_reso4Bit) - { - return false; - } - // All other parametered macros are unused - for(size_t i = 1; i < NUM_MACROS; i++) - { - if(GetMacroType(pSndFile->m_MidiCfg.szMidiSFXExt[i]) != sfx_unused) - { - return false; - } - } - return true; -} - - //////////////////////////////////////////////////////////////////////////////////////// // Playback @@ -3817,14 +3573,14 @@ { return; } - + //if macro already exists for this param, alert user and return - for (int checkMacro=0; checkMacro < NUM_MACROS; checkMacro++) + for (int checkMacro = 0; checkMacro < NUM_MACROS; checkMacro++) { CString macroText = GetSoundFile()->m_MidiCfg.szMidiSFXExt[checkMacro]; - int macroType = GetMacroType(macroText); + int macroType = MIDIMacroTools::GetMacroType(macroText); - if (macroType==sfx_plug && MacroToPlugParam(macroText)==paramToUse) + if (macroType==sfx_plug && MIDIMacroTools::MacroToPlugParam(macroText) == paramToUse) { CString message; message.Format("Parameter %02d can already be controlled with macro %X.", paramToUse, checkMacro); Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2011-10-24 20:07:46 UTC (rev 1121) +++ trunk/OpenMPT/mptrack/Moddoc.h 2011-10-24 22:12:42 UTC (rev 1122) @@ -90,35 +90,6 @@ STATIC_ASSERT( ((-1 << HINT_SHIFT_SEQUENCE) & HINT_MASK_ITEM) == (-1 << HINT_SHIFT_SEQUENCE) ); -// parametered macro presets: -enum enmParameteredMacroType -{ - sfx_unused = 0, - sfx_cutoff, - sfx_reso, - sfx_mode, - sfx_drywet, - sfx_plug, - sfx_cc, - sfx_custom, - - sfx_max -}; - -// fixed macro presets: -enum enmFixedMacroType -{ - zxx_custom = 0, - zxx_reso4Bit, // Type 1 - Z80 - Z8F controls resonance - zxx_reso7Bit, // Type 2 - Z80 - ZFF controls resonance - zxx_cutoff, // Type 3 - Z80 - ZFF controls cutoff - zxx_mode, // Type 4 - Z80 - ZFF controls filter mode - zxx_resomode, // Type 5 - Z80 - Z9F controls resonance + filter mode - - zxx_max -}; - - // pattern paste modes enum enmPatternPasteModes { @@ -264,17 +235,6 @@ MODCOMMAND::VOLCMD GetVolCmdFromIndex(UINT ndx); BOOL GetVolCmdInfo(UINT ndx, LPSTR s, DWORD *prangeMin=NULL, DWORD *prangeMax=NULL); - // Various MIDI Macro helpers - static enmParameteredMacroType GetMacroType(CString value); //rewbs.xinfo - CString GetMacroName(CString value, PLUGINDEX plugin); - static CString GetMacroName(enmParameteredMacroType macro); - static int MacroToPlugParam(CString value); //rewbs.xinfo - static int MacroToMidiCC(CString value); - static enmFixedMacroType GetZxxType(const char (&szMidiZXXExt)[128][MACRO_LENGTH]); - static void CreateZxxFromType(char (&szMidiZXXExt)[128][MACRO_LENGTH], enmFixedMacroType iZxxType); - bool IsMacroDefaultSetupUsed() const; - int FindMacroForParam(long param) const; - void SongProperties(); CPatternUndo &GetPatternUndo() { return m_PatternUndo; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-24 20:07:46 UTC (rev 1121) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-24 22:12:42 UTC (rev 1122) @@ -17,6 +17,7 @@ #include "arrayutils.h" #include "view_pat.h" #include "View_gen.h" +#include "MIDIMacros.h" #include "../common/misc_util.h" #include "midi.h" #include <cmath> @@ -3215,6 +3216,8 @@ return 0; } + MIDIMacroTools macroTools(*pSndFile); + //Work out where to put the new data const UINT nChn = GetChanFromCursor(m_dwCursor); const bool bUsePlaybackPosition = IsLiveRecord(*pModDoc, *pSndFile); @@ -3251,15 +3254,15 @@ long activePlugParam = -1; BYTE activeMacro = pSndFile->Chn[nChn].nActiveMacro; CString activeMacroString = pSndFile->m_MidiCfg.szMidiSFXExt[activeMacro]; - if (pModDoc->GetMacroType(activeMacroString) == sfx_plug) + if (macroTools.GetMacroType(activeMacroString) == sfx_plug) { - activePlugParam = pModDoc->MacroToPlugParam(activeMacroString); + activePlugParam = macroTools.MacroToPlugParam(activeMacroString); } //If the wrong macro is active, see if we can find the right one. //If we can, activate it for this chan by writing appropriate SFx command it. if (activePlugParam != paramIndex) { - int foundMacro = pModDoc->FindMacroForParam(paramIndex); + int foundMacro = macroTools.FindMacroForParam(paramIndex); if (foundMacro >= 0) { pSndFile->Chn[nChn].nActiveMacro = foundMacro; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-10-24 20:07:46 UTC (rev 1121) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-10-24 22:12:42 UTC (rev 1122) @@ -514,12 +514,12 @@ //strncpy_s(pTTTA->szText, sizeof(pTTTA->szText), strTipText, // strTipText.GetLength() + 1); // 80 chars max?! - strncpy(pTTTA->szText, strTipText, min(strTipText.GetLength() + 1, ARRAYELEMCOUNT(pTTTA->szText) - 1)); + strncpy(pTTTA->szText, strTipText, min(strTipText.GetLength() + 1, CountOf(pTTTA->szText) - 1)); } else { ::MultiByteToWideChar(CP_ACP , 0, strTipText, strTipText.GetLength() + 1, - pTTTW->szText, ARRAYELEMCOUNT(pTTTW->szText)); + pTTTW->szText, CountOf(pTTTW->szText)); } return TRUE; @@ -694,554 +694,6 @@ } -//////////////////////////////////////////////////////////////////////// -// Midi Macros (Zxx) - -BEGIN_MESSAGE_MAP(CMidiMacroSetup, CDialog) - ON_COMMAND(IDC_CHECK1, OnEmbedMidiCfg) - ON_COMMAND(IDC_BUTTON1, OnSetAsDefault) - ON_COMMAND(IDC_BUTTON2, OnResetCfg) - ON_COMMAND(IDC_BUTTON3, OnMacroHelp) - ON_CBN_SELCHANGE(IDC_COMBO1, OnSFxChanged) - ON_CBN_SELCHANGE(IDC_COMBO2, OnSFxPresetChanged) - ON_CBN_SELCHANGE(IDC_COMBO3, OnZxxPresetChanged) - ON_CBN_SELCHANGE(IDC_COMBO4, UpdateDialog) - ON_CBN_SELCHANGE(IDC_MACROPLUG, OnPlugChanged) - ON_CBN_SELCHANGE(IDC_MACROPARAM,OnPlugParamChanged) - ON_CBN_SELCHANGE(IDC_MACROCC, OnCCChanged) - ON_EN_CHANGE(IDC_EDIT1, OnSFxEditChanged) - ON_EN_CHANGE(IDC_EDIT2, OnZxxEditChanged) - ON_COMMAND_RANGE(ID_PLUGSELECT, ID_PLUGSELECT + NUM_MACROS - 1, OnViewAllParams) //rewbs.patPlugName - ON_COMMAND_RANGE(ID_PLUGSELECT + NUM_MACROS, ID_PLUGSELECT + NUM_MACROS + NUM_MACROS - 1, OnSetSFx) //rewbs.patPlugName -END_MESSAGE_MAP() - - -CMidiMacroSetup::CMidiMacroSetup(MODMIDICFG *pcfg, BOOL bEmbed, CWnd *parent):CDialog(IDD_MIDIMACRO, parent) -//---------------------------------------------------------------------------------------------------------- -{ - m_bEmbed = bEmbed; - if (pcfg) m_MidiCfg = *pcfg; - m_pSndFile = NULL; - m_pModDoc = NULL; -} - - -void CMidiMacroSetup::DoDataExchange(CDataExchange* pDX) -//------------------------------------------------------ -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CModTypeDlg) - DDX_Control(pDX, IDC_COMBO1, m_CbnSFx); - DDX_Control(pDX, IDC_COMBO2, m_CbnSFxPreset); - DDX_Control(pDX, IDC_COMBO3, m_CbnZxxPreset); - DDX_Control(pDX, IDC_COMBO4, m_CbnZxx); - DDX_Control(pDX, IDC_EDIT1, m_EditSFx); - DDX_Control(pDX, IDC_EDIT2, m_EditZxx); - DDX_Control(pDX, IDC_MACROPLUG, m_CbnMacroPlug); - DDX_Control(pDX, IDC_MACROPARAM, m_CbnMacroParam); - DDX_Control(pDX, IDC_MACROCC, m_CbnMacroCC); - //}}AFX_DATA_MAP -} - - -BOOL CMidiMacroSetup::OnInitDialog() -//---------------------------------- -{ - m_pModDoc = CMainFrame::GetMainFrame()->GetActiveDoc(); - if (m_pModDoc) m_pSndFile = CMainFrame::GetMainFrame()->GetActiveDoc()->GetSoundFile(); - if (!m_pSndFile) - return FALSE; - - CHAR s[128]; - CDialog::OnInitDialog(); - CheckDlgButton(IDC_CHECK1, m_bEmbed); - m_EditSFx.SetLimitText(MACRO_LENGTH - 1); - m_EditZxx.SetLimitText(MACRO_LENGTH - 1); - - for (UINT isfx=0; isfx<16; isfx++) - { - wsprintf(s, "%d (SF%X)", isfx, isfx); - m_CbnSFx.AddString(s); - } - m_CbnSFx.SetCurSel(0); - for(int i = 0; i < sfx_max; i++) - { - m_CbnSFxPreset.SetItemData(m_CbnSFxPreset.AddString(CModDoc::GetMacroName(static_cast<enmParameteredMacroType>(i))), i); - } - OnSFxChanged(); - - for (UINT cc=MIDICC_start; cc<=MIDICC_end; cc++) - { - wsprintf(s, "CC %02d %s", cc, MidiCCNames[cc]); - m_CbnMacroCC.SetItemData(m_CbnMacroCC.AddString(s), cc); - } - - for (UINT zxx=0; zxx<128; zxx++) - { - wsprintf(s, "Z%02X", zxx|0x80); - m_CbnZxx.AddString(s); - } - m_CbnZxx.SetCurSel(0); - m_CbnZxxPreset.AddString("Custom"); - m_CbnZxxPreset.AddString("Z80-Z8F controls resonance"); - m_CbnZxxPreset.AddString("Z80-ZFF controls resonance"); - m_CbnZxxPreset.AddString("Z80-ZFF controls cutoff"); - m_CbnZxxPreset.AddString("Z80-ZFF controls filter mode"); - m_CbnZxxPreset.AddString("Z80-Z9F controls resonance+mode"); - m_CbnZxxPreset.SetCurSel(m_pModDoc->GetZxxType(m_MidiCfg.szMidiZXXExt)); - UpdateDialog(); - - int offsetx=108, offsety=30, separatorx=4, separatory=2, - height=18, widthMacro=30, widthVal=90, widthType=135, widthBtn=70; - - for (UINT m = 0; m < NUM_MACROS; m++) - { - m_EditMacro[m].Create("", /*BS_FLAT |*/ WS_CHILD | WS_VISIBLE | WS_TABSTOP /*| WS_BORDER*/, - CRect(offsetx, offsety + m * (separatory + height), offsetx + widthMacro, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + NUM_MACROS + m); - m_EditMacro[m].SetFont(GetFont()); - - m_EditMacroType[m].Create(ES_READONLY | WS_CHILD| WS_VISIBLE | WS_TABSTOP | WS_BORDER, - CRect(offsetx + separatorx + widthMacro, offsety + m* (separatory + height), offsetx + widthMacro + widthType, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + NUM_MACROS + m); - m_EditMacroType[m].SetFont(GetFont()); - - m_EditMacroValue[m].Create(ES_CENTER | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, - CRect(offsetx + separatorx + widthType + widthMacro, offsety + m * (separatory + height), offsetx + widthMacro + widthType + widthVal, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + NUM_MACROS + m); - m_EditMacroValue[m].SetFont(GetFont()); - - m_BtnMacroShowAll[m].Create("Show All...", WS_CHILD | WS_TABSTOP | WS_VISIBLE, - CRect(offsetx + separatorx + widthType + widthMacro + widthVal, offsety + m *(separatory + height), offsetx + widthMacro + widthType + widthVal + widthBtn, offsety + m * (separatory + height) + height), this, ID_PLUGSELECT + m); - m_BtnMacroShowAll[m].SetFont(GetFont()); - } - UpdateMacroList(); - - for (UINT plug=0; plug<MAX_MIXPLUGINS; plug++) - { - PSNDMIXPLUGIN p = &(m_pSndFile->m_MixPlugins[plug]); - StringFixer::SetNullTerminator(p->Info.szLibraryName); - if (p->Info.szLibraryName[0]) - { - wsprintf(s, "FX%d: %s", plug+1, p->Info.szName); - m_CbnMacroPlug.SetItemData(m_CbnMacroPlug.AddString(s), plug); - } - } - m_CbnMacroPlug.SetCurSel(0); - OnPlugChanged(); - return FALSE; -} - - -void CMidiMacroSetup::UpdateMacroList(int macro) //-1 for all macros -//---------------------------------------------- -{ - if (!m_EditMacro[0]) - return; //GUI not yet initialized - - CString s, macroText; - UINT start, end, macroType; - int selectedMacro=m_CbnSFx.GetCurSel(); - - if (macro>=0 && macro<16) - { - start=macro; - end=macro; - } else - { - start=0; - end=NUM_MACROS; - } - - for (int m=0; m<NUM_MACROS; m++) - { - //SFx - s.Format("SF%X", m); - m_EditMacro[m].SetWindowText(s); - - //Macro value: - CString macroText = m_MidiCfg.szMidiSFXExt[m]; - m_EditMacroValue[m].SetWindowText(macroText); - m_EditMacroValue[m].SetBackColor(m == selectedMacro ? RGB(200,200,225) : RGB(245,245,245) ); - - //Macro Type: - macroType = m_pModDoc->GetMacroType(macroText); - switch (macroType) - { - case sfx_unused: s = "Unused"; break; - case sfx_cutoff: s = "Set Filter Cutoff"; break; - case sfx_reso: s = "Set Filter Resonance"; break; - case sfx_mode: s = "Set Filter Mode"; break; - case sfx_drywet: s = "Set Plugin dry/wet ratio"; break; - case sfx_cc: - s.Format("MIDI CC %d", m_pModDoc->MacroToMidiCC(macroText)); - break; - case sfx_plug: - s.Format("Control Plugin Param %d", m_pModDoc->MacroToPlugParam(macroText)); - break; - case sfx_custom: - default: s = "Custom"; - } - m_EditMacroType[m].SetWindowText(s); - m_EditMacroType[m].SetBackColor(m == selectedMacro ? RGB(200,200,225) : RGB(245,245,245) ); - - //Param details button: - if (macroType == sfx_plug) - m_BtnMacroShowAll[m].ShowWindow(SW_SHOW); - else - m_BtnMacroShowAll[m].ShowWindow(SW_HIDE); - } -} - - -void CMidiMacroSetup::UpdateDialog() -//---------------------------------- -{ - CHAR s[MACRO_LENGTH]; - UINT sfx, sfx_preset, zxx; - - sfx = m_CbnSFx.GetCurSel(); - sfx_preset = m_CbnSFxPreset.GetItemData(m_CbnSFxPreset.GetCurSel()); - if (sfx < 16) - { - ToggleBoxes(sfx_preset, sfx); - memcpy(s, m_MidiCfg.szMidiSFXExt[sfx], MACRO_LENGTH); - StringFixer::SetNullTerminator(s); - m_EditSFx.SetWindowText(s); - } - - zxx = m_CbnZxx.GetCurSel(); - if (zxx < 0x80) - { - memcpy(s, m_MidiCfg.szMidiZXXExt[zxx], MACRO_LENGTH); - StringFixer::SetNullTerminator(s); - m_EditZxx.SetWindowText(s); - } - UpdateMacroList(); -} - - -void CMidiMacroSetup::OnSetAsDefault() -//------------------------------------ -{ - theApp.SetDefaultMidiMacro(&m_MidiCfg); -} - - -void CMidiMacroSetup::OnResetCfg() -//-------------------------------- -{ - theApp.GetDefaultMidiMacro(&m_MidiCfg); - m_CbnZxxPreset.SetCurSel(0); - OnSFxChanged(); -} - - -void CMidiMacroSetup::OnMacroHelp() -//--------------------------------- -{ - Reporting::Information(_T("Valid characters in macros:\n\n" - "0-9, A-F - Raw hex data (4-Bit value)\n" - "c - MIDI channel (4-Bit value)\n" - "n - Note value\n\n" - "v - Note velocity\n" - "u - Computed note volume (including envelopes)\n\n" - "x - Note panning\n" - "y - Computed panning (including envelopes)\n\n" - "a - High byte of bank select\n" - "b - Low byte of bank select\n" - "p - Program select\n\n" - "z - Zxx parameter (00-7F)\n\n" - "Macros can be up to 31 characters long and contain multiple MIDI messages. SysEx messages are automatically terminated if not specified by the user."), - _T("OpenMPT MIDI Macro quick reference")); -} - - -void CMidiMacroSetup::OnEmbedMidiCfg() -//------------------------------------ -{ - m_bEmbed = IsDlgButtonChecked(IDC_CHECK1); -} - - -void CMidiMacroSetup::OnSFxChanged() -//---------------------------------- -{ - UINT sfx = m_CbnSFx.GetCurSel(); - if (sfx < 16) - { - CString macroText; - memcpy(macroText.GetBuffer(MACRO_LENGTH), m_MidiCfg.szMidiSFXExt[sfx], MACRO_LENGTH); - int preset = m_pModDoc->GetMacroType(macroText); - m_CbnSFxPreset.SetCurSel(preset); - } - UpdateDialog(); -} - - -void CMidiMacroSetup::OnSFxPresetChanged() -//---------------------------------------- -{ - UINT sfx = m_CbnSFx.GetCurSel(); - UINT sfx_preset = m_CbnSFxPreset.GetItemData(m_CbnSFxPreset.GetCurSel()); - - if (sfx < 16) - { - char *pmacro = m_MidiCfg.szMidiSFXExt[sfx]; - switch(sfx_preset) - { - case sfx_unused: strcpy(pmacro, ""); break; // unused - case sfx_cutoff: strcpy(pmacro, "F0F000z"); break; // cutoff - case sfx_reso: strcpy(pmacro, "F0F001z"); break; // reso - case sfx_mode: strcpy(pmacro, "F0F002z"); break; // mode - case sfx_drywet: strcpy(pmacro, "F0F003z"); break; - case sfx_cc: strcpy(pmacro, "Bc00z"); break; // MIDI cc - TODO: get value from other menus - case sfx_plug: strcpy(pmacro, "F0F080z"); break; // plug param - TODO: get value from other menus - case sfx_custom: /*strcpy(pmacro, "z");*/ break; // custom - leave as is. - } - UpdateDialog(); - } -} - - -void CMidiMacroSetup::OnZxxPresetChanged() -//---------------------------------------- -{ - enmFixedMacroType zxx_preset = static_cast<enmFixedMacroType>(m_CbnZxxPreset.GetCurSel()); - - if (zxx_preset != zxx_custom && m_pModDoc != nullptr) - { - m_pModDoc->CreateZxxFromType(m_MidiCfg.szMidiZXXExt, zxx_preset); - UpdateDialog(); - } -} - - -void CMidiMacroSetup::OnSFxEditChanged() -//-------------------------------------- -{ - CHAR s[MACRO_LENGTH]; - UINT sfx = m_CbnSFx.GetCurSel(); - if (sfx < 16) - { - if(ValidateMacroString(m_EditSFx, m_MidiCfg.szMidiSFXExt[sfx], true)) - { - MemsetZero(s); - m_EditSFx.GetWindowText(s, MACRO_LENGTH); - StringFixer::SetNullTerminator(s); - memcpy(m_MidiCfg.szMidiSFXExt[sfx], s, MACRO_LENGTH); - - int sfx_preset = m_pModDoc->GetMacroType(m_MidiCfg.szMidiSFXExt[sfx]); - //int param = m_pModDoc->MacroToPlugParam(m_MidiCfg.szMidiSFXExt[sfx]); - - m_CbnSFxPreset.SetCurSel(sfx_preset); - ToggleBoxes(sfx_preset, sfx); - UpdateMacroList(sfx); - } - } -} - - -void CMidiMacroSetup::OnZxxEditChanged() -//-------------------------------------- -{ - CHAR s[MACRO_LENGTH]; - UINT zxx = m_CbnZxx.GetCurSel(); - if (zxx < 128) - { - if(ValidateMacroString(m_EditZxx, m_MidiCfg.szMidiZXXExt[zxx], false)) - { - MemsetZero(s); - m_EditZxx.GetWindowText(s, MACRO_LENGTH); - StringFixer::SetNullTerminator(s); - memcpy(m_MidiCfg.szMidiZXXExt[zxx], s, MACRO_LENGTH); - } - } -} - -void CMidiMacroSetup::OnSetSFx(UINT id) -//------------------------------------- -{ - m_CbnSFx.SetCurSel(id-(ID_PLUGSELECT + NUM_MACROS)); - OnSFxChanged(); -} - -void CMidiMacroSetup::OnViewAllParams(UINT id) -//-------------------------------------------- -{ - if (!m_pSndFile) - return; - - CString message, plugName, line; - int sfx = id-ID_PLUGSELECT; - int param = m_pModDoc->MacroToPlugParam(m_MidiCfg.szMidiSFXExt[sfx]); - CVstPlugin *pVstPlugin; - message.Format("These are the parameters that can be controlled by macro SF%X:\n\n",sfx); - - for (UINT plug=0; plug<MAX_MIXPLUGINS; plug++) - { - plugName = m_pSndFile->m_MixPlugins[plug].Info.szName; - if (plugName != "") - { - pVstPlugin=(CVstPlugin*) m_pSndFile->m_MixPlugins[plug].pMixPlugin; - if (pVstPlugin && param <= pVstPlugin->GetNumParameters()) - { - line.Format("FX%d: %s\t %s\n", plug + 1, plugName, pVstPlugin->GetFormattedParamName(param)); - message += line; - } - } - } - - Reporting::Notification(message, "Macro -> Params"); -} - -void CMidiMacroSetup::OnPlugChanged() -//----------------------------------- -{ - if (!m_pSndFile) - return; - - int plug = m_CbnMacroPlug.GetItemData(m_CbnMacroPlug.GetCurSel()); - - if (plug<0 || plug>MAX_MIXPLUGINS) - return; - - PSNDMIXPLUGIN pPlugin = &m_pSndFile->m_MixPlugins[plug]; - CVstPlugin *pVstPlugin = (pPlugin->pMixPlugin) ? (CVstPlugin *)pPlugin->pMixPlugin : NULL; - - if (pVstPlugin) - { - m_CbnMacroParam.SetRedraw(FALSE); - m_CbnMacroParam.Clear(); - m_CbnMacroParam.ResetContent(); - AddPluginParameternamesToCombobox(m_CbnMacroParam, *pVstPlugin); - m_CbnMacroParam.SetRedraw(TRUE); - - int param = m_pModDoc->MacroToPlugParam(m_MidiCfg.szMidiSFXExt[m_CbnSFx.GetCurSel()]); - m_CbnMacroParam.SetCurSel(param); - } - //OnPlugParamChanged(); -} - -void CMidiMacroSetup::OnPlugParamChanged() -//---------------------------------------- -{ - CString macroText; - UINT param = m_CbnMacroParam.GetItemData(m_CbnMacroParam.GetCurSel()); - - if (param < 128) - { - macroText.Format("F0F0%02Xz",param + 128); - m_EditSFx.SetWindowText(macroText); - } else if (param < 384) - { - macroText.Format("F0F1%02Xz",param - 128); - m_EditSFx.SetWindowText(macroText); - } else - { - Reporting::Notification("MPT can only assign macros to parameters 0 to 383. Use Parameter Control Notes to automate higher parameters."); - } -} - -void CMidiMacroSetup::OnCCChanged() -//--------------------------------- -{ - CString macroText; - UINT cc = m_CbnMacroCC.GetItemData(m_CbnMacroCC.GetCurSel()); - macroText.Format("Bc%02Xz", cc & 0xFF); - m_EditSFx.SetWindowText(macroText); -} - -void CMidiMacroSetup::ToggleBoxes(UINT sfx_preset, UINT sfx) -//---------------------------------------------------------- -{ - - if (sfx_preset == sfx_plug) - { - m_CbnMacroCC.ShowWindow(FALSE); - m_CbnMacroPlug.ShowWindow(TRUE); - m_CbnMacroParam.ShowWindow(TRUE); - m_CbnMacroPlug.EnableWindow(TRUE); - m_CbnMacroParam.EnableWindow(TRUE); - SetDlgItemText(IDC_GENMACROLABEL, "Plug/Param"); - m_CbnMacroParam.SetCurSel(m_pModDoc->MacroToPlugParam(m_MidiCfg.szMidiSFXExt[sfx])); - } else - { - m_CbnMacroPlug.EnableWindow(FALSE); - m_CbnMacroParam.EnableWindow(FALSE); - } - - if (sfx_preset == sfx_cc) - { - m_CbnMacroCC.EnableWindow(TRUE); - m_CbnMacroCC.ShowWindow(TRUE); - m_CbnMacroPlug.ShowWindow(FALSE); - m_CbnMacroParam.ShowWindow(FALSE); - SetDlgItemText(IDC_GENMACROLABEL, "MIDI CC"); - m_CbnMacroCC.SetCurSel(m_pModDoc->MacroToMidiCC(m_MidiCfg.szMidiSFXExt[sfx])); - } else - { - m_CbnMacroCC.EnableWindow(FALSE); - } - - //m_EditSFx.EnableWindow((sfx_preset == sfx_unused) ? FALSE : TRUE); - -} - - -bool CMidiMacroSetup::ValidateMacroString(CEdit &wnd, char *lastMacro, bool isParametric) -//--------------------------------------------------------------------------------------- -{ - CString macroStr; - wnd.GetWindowText(macroStr); - - bool allowed = true, caseChange = false; - for(int i = 0; i < macroStr.GetLength(); i++) - { - char c = macroStr.GetAt(i); - if(c == 'k' || c == 'K') // Previously, 'K' was used for MIDI channel - { - caseChange = true; - macroStr.SetAt(i, 'c'); - } else if (c >= 'd' && c <= 'f') // abc have special meanings, but def can be fixed - { - caseChange = true; - macroStr.SetAt(i, c - 'a' + 'A'); - } else if(c == 'N' || c == 'V' || c == 'U' || c == 'X' || c == 'Y' || c == 'Z' || c == 'P') - { - caseChange = true; - macroStr.SetAt(i, c - 'A' + 'a'); - } else if(!( - (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'c') || - (c == 'v' || c == 'u' || c == 'x' || c == 'y' || c == 'p' || c == 'n' || c == ' ') || - (c == 'z' && isParam... [truncated message content] |
From: <sag...@us...> - 2011-10-29 18:54:05
|
Revision: 1125 http://modplug.svn.sourceforge.net/modplug/?rev=1125&view=rev Author: saga-games Date: 2011-10-29 18:53:58 +0000 (Sat, 29 Oct 2011) Log Message: ----------- [Imp] Zxx value for cutoff is now also shown in the instrument editor (http://bugs.openmpt.org/view.php?id=36). [Imp] S3M Loading / Saving: Better channel panning scaling (for full 0...256 range). [Fix] Sample tuner: Dropdown note list was editable. [Mod] When compiling with NO_VST, previously existing plugin settings are not lost anymore when closing OpenMPT. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_s3m.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-10-29 18:32:57 UTC (rev 1124) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-10-29 18:53:58 UTC (rev 1125) @@ -1307,14 +1307,14 @@ // Filter if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { - m_CheckCutOff.SetCheck((pIns->nIFC & 0x80) ? TRUE : FALSE); - m_CheckResonance.SetCheck((pIns->nIFR & 0x80) ? TRUE : FALSE); + m_CheckCutOff.SetCheck((pIns->IsCutoffEnabled()) ? TRUE : FALSE); + m_CheckResonance.SetCheck((pIns->IsResonanceEnabled()) ? TRUE : FALSE); m_SliderVolSwing.SetPos(pIns->nVolSwing); m_SliderPanSwing.SetPos(pIns->nPanSwing); m_SliderResSwing.SetPos(pIns->nResSwing); m_SliderCutSwing.SetPos(pIns->nCutSwing); - m_SliderCutOff.SetPos(pIns->nIFC & 0x7F); - m_SliderResonance.SetPos(pIns->nIFR & 0x7F); + m_SliderCutOff.SetPos(pIns->GetCutoff()); + m_SliderResonance.SetPos(pIns->GetResonance()); UpdateFilterText(); } // -> CODE#0027 @@ -1378,7 +1378,7 @@ } -VOID CCtrlInstruments::UpdateFilterText() +void CCtrlInstruments::UpdateFilterText() //--------------------------------------- { if ((m_nInstrument) && (m_pModDoc)) @@ -1389,17 +1389,17 @@ { CHAR s[32]; // In IT Compatible mode, it is enough to just have resonance enabled to turn on the filter. - const bool resEnabled = ((pIns->nIFR & 0x80) && (pIns->nIFR & 0x7F) && pSndFile->IsCompatibleMode(TRK_IMPULSETRACKER)); + const bool resEnabled = (pIns->IsResonanceEnabled() && pIns->GetResonance() > 0 && pSndFile->IsCompatibleMode(TRK_IMPULSETRACKER)); - if (((pIns->nIFC & 0x80) && pIns->nIFC < 0xFF) || resEnabled) + if ((pIns->IsCutoffEnabled() && pIns->GetCutoff() < 0x7F) || resEnabled) { - const BYTE cutoff = (resEnabled && !(pIns->nIFC & 0x80)) ? 0x7F : (pIns->nIFC & 0x7F); - wsprintf(s, "%d Hz", pSndFile->CutOffToFrequency(cutoff)); + const BYTE cutoff = (resEnabled && !pIns->IsCutoffEnabled()) ? 0x7F : pIns->GetCutoff(); + wsprintf(s, "Z%02X (%d Hz)", cutoff, pSndFile->CutOffToFrequency(cutoff)); } else { wsprintf(s, "Off"); } - SetDlgItemText(IDC_TEXT1, s); + SetDlgItemText(IDC_FILTERTEXT, s); } } } @@ -1441,9 +1441,8 @@ m_pModDoc->UpdateAllViews(NULL, HINT_SAMPLEINFO | HINT_MODTYPE, NULL); // -> CODE#0023 // -> DESC="IT project files (.itp)" - int n = strlen(lpszFileName); - if(n >= _MAX_PATH) n = _MAX_PATH-1; - strncpy(m_pSndFile->m_szInstrumentPath[m_nInstrument-1],lpszFileName,n); + const size_t n = max(strlen(lpszFileName), size_t(_MAX_PATH - 1)); + strncpy(m_pSndFile->m_szInstrumentPath[m_nInstrument - 1], lpszFileName, n); m_pSndFile->m_szInstrumentPath[m_nInstrument-1][n] = '\0'; SetInstrumentModified(false); // -! NEW_FEATURE#0023 @@ -1497,19 +1496,19 @@ CriticalSection cs; - BOOL bFirst = FALSE; + bool bFirst = false; if (!m_pSndFile->m_nInstruments) { - bFirst = TRUE; + bFirst = true; m_pSndFile->m_nInstruments = 1; m_NoteMap.SetCurrentInstrument(m_pModDoc, 1); m_pModDoc->SetModified(); - bFirst = TRUE; + bFirst = true; } if (!m_nInstrument) { m_nInstrument = 1; - bFirst = TRUE; + bFirst = true; } m_pSndFile->ReadInstrumentFromSong(m_nInstrument, pSndFile, nInstr); @@ -1551,13 +1550,6 @@ { switch(uId) { - case IDC_EDIT1: - { - MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; - wsprintf(pszText, "Z%02X", pIns->nIFC & 0x7f); - return TRUE; - break; - } case IDC_EDIT_PITCHTEMPOLOCK: case IDC_CHECK_PITCHTEMPOLOCK: { @@ -2220,7 +2212,7 @@ void CCtrlInstruments::OnEnableCutOff() //------------------------------------- { - BOOL bCutOff = IsDlgButtonChecked(IDC_CHECK2); + const bool bCutOff = IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; if (m_pModDoc) { @@ -2228,23 +2220,17 @@ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; if (pIns) { - if (bCutOff) - { - pIns->nIFC |= 0x80; - } else - { - pIns->nIFC &= 0x7F; - } + pIns->SetCutoff(pIns->GetCutoff(), bCutOff); for (UINT i=0; i<MAX_CHANNELS; i++) { if (pSndFile->Chn[i].pModInstrument == pIns) { if (bCutOff) { - pSndFile->Chn[i].nCutOff = pIns->nIFC & 0x7f; + pSndFile->Chn[i].nCutOff = pIns->GetCutoff(); } else { - pSndFile->Chn[i].nCutOff = 0x7f; + pSndFile->Chn[i].nCutOff = 0x7F; } } } @@ -2259,7 +2245,7 @@ void CCtrlInstruments::OnEnableResonance() //---------------------------------------- { - BOOL bReso = IsDlgButtonChecked(IDC_CHECK3); + const bool bReso = IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED; if (m_pModDoc) { @@ -2267,20 +2253,14 @@ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; if (pIns) { - if (bReso) - { - pIns->nIFR |= 0x80; - } else - { - pIns->nIFR &= 0x7F; - } + pIns->SetResonance(pIns->GetResonance(), bReso); for (UINT i=0; i<MAX_CHANNELS; i++) { if (pSndFile->Chn[i].pModInstrument == pIns) { if (bReso) { - pSndFile->Chn[i].nResonance = pIns->nIFC & 0x7f; + pSndFile->Chn[i].nResonance = pIns->GetResonance(); } else { pSndFile->Chn[i].nResonance = 0; @@ -2423,10 +2403,9 @@ else if (pSlider == &m_SliderCutOff) { n = m_SliderCutOff.GetPos(); - if ((n >= 0) && (n < 0x80) && (n != (int)(pIns->nIFC & 0x7F))) + if ((n >= 0) && (n < 0x80) && (n != (int)(pIns->GetCutoff()))) { - pIns->nIFC &= 0x80; - pIns->nIFC |= (BYTE)n; + pIns->SetCutoff(n, pIns->IsCutoffEnabled()); SetInstrumentModified(true); UpdateFilterText(); filterChanger = true; @@ -2436,10 +2415,9 @@ { // Filter Resonance n = m_SliderResonance.GetPos(); - if ((n >= 0) && (n < 0x80) && (n != (int)(pIns->nIFR & 0x7F))) + if ((n >= 0) && (n < 0x80) && (n != (int)(pIns->GetResonance()))) { - pIns->nIFR &= 0x80; - pIns->nIFR |= (BYTE)n; + pIns->SetResonance(n, pIns->IsResonanceEnabled()); SetInstrumentModified(true); UpdateFilterText(); filterChanger = true; @@ -2453,8 +2431,8 @@ { if (pSndFile->Chn[i].pModInstrument == pIns) { - if (pIns->nIFC & 0x80) pSndFile->Chn[i].nCutOff = pIns->nIFC & 0x7F; - if (pIns->nIFR & 0x80) pSndFile->Chn[i].nResonance = pIns->nIFR & 0x7F; + if (pIns->IsCutoffEnabled()) pSndFile->Chn[i].nCutOff = pIns->GetCutoff(); + if (pIns->IsResonanceEnabled()) pSndFile->Chn[i].nResonance = pIns->GetResonance(); } } } Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-10-29 18:32:57 UTC (rev 1124) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-10-29 18:53:58 UTC (rev 1125) @@ -873,7 +873,7 @@ if (GetProfileInt("Settings", "DisableACM", 0)) cmdInfo.m_bNoAcm = true; if (!cmdInfo.m_bNoMp3) GetACMConvert().InitializeACM(cmdInfo.m_bNoAcm); - // Initialize DXPlugins + // Initialize Plugins if (!cmdInfo.m_bNoPlugins) InitializeDXPlugins(); // Initialize localized strings @@ -882,7 +882,7 @@ // Initialize CMainFrame pMainFrame->Initialize(); InitCommonControls(); - m_dwLastPluginIdleCall=0; //rewbs.VSTCompliance + m_dwLastPluginIdleCall = 0; //rewbs.VSTCompliance pMainFrame->m_InputHandler->UpdateMainMenu(); //rewbs.customKeys // Dispatch commands specified on the command line @@ -949,7 +949,7 @@ } } - // Uninitialize DX-Plugins + // Uninitialize Plugins UninitializeDXPlugins(); // Uninitialize ACM @@ -1018,7 +1018,7 @@ if(pSndFile != nullptr) { nNewType = pSndFile->GetBestSaveFormat(); - bIsProject = ((pSndFile->m_dwSongFlags & SONG_ITPROJECT) != 0) ? true: false; + bIsProject = ((pSndFile->m_dwSongFlags & SONG_ITPROJECT) != 0); } } @@ -2190,6 +2190,8 @@ UINT iPlug; if (!m_pPluginManager) return FALSE; + +#ifndef NO_VST pPlug = m_pPluginManager->GetFirstPlugin(); iPlug = 0; while (pPlug) @@ -2210,19 +2212,10 @@ } wsprintf(s, "%d", iPlug); WritePrivateProfileString("VST Plugins", "NumPlugins", s, m_szConfigFileName); +#endif // NO_VST - #ifndef NO_VST - //WritePrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, m_szConfigFileName); - //WritePrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, m_szConfigFileName); - //CMainFrame::WritePrivateProfileLong("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); - #endif - - - if (m_pPluginManager) - { - delete m_pPluginManager; - m_pPluginManager = NULL; - } + delete m_pPluginManager; + m_pPluginManager = nullptr; return TRUE; } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-10-29 18:32:57 UTC (rev 1124) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-10-29 18:53:58 UTC (rev 1125) @@ -227,7 +227,7 @@ DEFPUSHBUTTON "OK",IDOK,54,60,50,14 PUSHBUTTON "Cancel",IDCANCEL,108,60,50,14 LTEXT "Tune sample to closest",IDC_STATIC,6,8,96,8 - COMBOBOX IDC_COMBO1,102,6,36,12,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO1,102,6,36,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Pitch reference (A)",IDC_STATIC,6,26,96,8 EDITTEXT IDC_EDIT1,102,24,36,12,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Hz",IDC_STATIC,144,26,18,8 @@ -814,7 +814,7 @@ CTEXT "Reso",IDC_STATIC,136,151,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Resampling",IDC_STATIC,7,151,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Mode",IDC_STATIC,135,70,23,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - RTEXT "--",IDC_TEXT1,186,62,45,8 + RTEXT "--",IDC_FILTERTEXT,166,62,65,8 GROUPBOX "Pitch/Tempo Lock",IDC_STATIC,364,57,89,25 GROUPBOX "Sample Map",IDC_STATIC,461,27,62,141 CTEXT "Velocity handling",IDC_STATIC,367,102,83,10,SS_CENTERIMAGE,WS_EX_STATICEDGE @@ -949,7 +949,7 @@ CONTROL "Master",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,242,46,10 CONTROL "Bypass",IDC_CHECK10,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,256,40,10 CONTROL "Expand",IDC_CHECK12,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,271,37,10 - CONTROL "Dry mix",IDC_CHECK11,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,286,37,10 + CONTROL "Dry Mix",IDC_CHECK11,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,286,37,10 COMBOBOX IDC_COMBO9,285,241,62,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Gain: x 1.0",IDC_STATIC2,353,241,37,14,SS_CENTERIMAGE CONTROL "",IDC_SPIN10,"msctls_updown32",UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,392,242,9,11 @@ -972,16 +972,16 @@ LTEXT "Effect:",IDC_STATIC,113,146,29,8 LTEXT "Effect:",IDC_STATIC,216,146,29,8 LTEXT "Effect:",IDC_STATIC,319,146,29,8 - CTEXT "Display name",IDC_STATIC,263,191,48,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "Display Name",IDC_STATIC,263,191,48,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "I/O Type:",IDC_STATIC,263,208,47,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "",IDC_TEXT6,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,312,208,95,13,WS_EX_STATICEDGE - GROUPBOX "Factory preset",IDC_STATIC,11,226,177,34 + GROUPBOX "Factory Preset",IDC_STATIC,11,226,177,34 CTEXT "Parameter",IDC_STATIC,16,266,43,13,SS_CENTERIMAGE,WS_EX_STATICEDGE GROUPBOX "",IDC_STATIC,11,255,177,49 - GROUPBOX "Mix settings",IDC_STATIC,193,226,214,78 - CTEXT "Mix mode",IDC_STATIC,245,241,37,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + GROUPBOX "Mix Settings",IDC_STATIC,193,226,214,78 + CTEXT "Mix Mode",IDC_STATIC,245,241,37,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Output to",IDC_STATIC,245,261,37,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Wet Dry Ratio",IDC_STATIC8,245,282,65,14,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "Dry/Wet Ratio",IDC_STATIC8,245,282,65,14,SS_CENTERIMAGE,WS_EX_STATICEDGE END IDD_EDIT_FIND DIALOGEX 0, 0, 214, 162 Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2011-10-29 18:32:57 UTC (rev 1124) +++ trunk/OpenMPT/mptrack/resource.h 2011-10-29 18:53:58 UTC (rev 1125) @@ -228,6 +228,7 @@ #define IDC_TEXT8 1308 #define IDC_TEXT9 1309 #define IDC_TEXT10 1310 +#define IDC_FILTERTEXT 1310 #define IDC_TEXT11 1311 #define IDC_TEXT12 1312 #define IDC_TEXT13 1313 Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-10-29 18:32:57 UTC (rev 1124) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-10-29 18:53:58 UTC (rev 1125) @@ -352,7 +352,7 @@ const BYTE *chnpan = lpStream+dwMemPos; for (UINT i=0; i<32; i++) if (chnpan[i] & 0x20) { - ChnSettings[i].nPan = ((chnpan[i] & 0x0F) << 4) + 8; + ChnSettings[i].nPan = (UINT(chnpan[i] & 0x0F) * 256 + 8) / 15; } } @@ -637,8 +637,8 @@ BYTE chnpan[32]; for (i=0; i<32; i++) { - UINT nPan = ((ChnSettings[i].nPan+7) < 0xF0) ? ChnSettings[i].nPan+7 : 0xF0; - chnpan[i] = (i<m_nChannels) ? 0x20 | (nPan >> 4) : 0x08; + const UINT nPan = ((ChnSettings[i].nPan * 15 + 128) / 256); + chnpan[i] = (i < m_nChannels) ? (0x20 | nPan) : 0x08; } fwrite(chnpan, 0x20, 1, f); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-10-29 19:03:12
|
Revision: 1126 http://modplug.svn.sourceforge.net/modplug/?rev=1126&view=rev Author: saga-games Date: 2011-10-29 19:03:03 +0000 (Sat, 29 Oct 2011) Log Message: ----------- [Ref] Got rid of a lot of "? true : false" [Ref] Using new GetCutoff/SetCutoff/etc... instrument functions everywhere for better abstraction. [Ref] Got rid of ARRAYELEMCOUNT, since it doubles the functionality of CountOf. [Ref] Changed some #defines into typedefs [Mod] OpenMPT: Version is now 1.20.00.49 Modified Paths: -------------- trunk/OpenMPT/common/typedefs.h trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/MIDIMacros.cpp trunk/OpenMPT/mptrack/MIDIMacros.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp trunk/OpenMPT/mptrack/UpdateCheck.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/wavConverter.h Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/common/typedefs.h 2011-10-29 19:03:03 UTC (rev 1126) @@ -10,8 +10,6 @@ #define CountOf(x) (sizeof(x)/sizeof(x[0])) #endif -#define ARRAYELEMCOUNT(x) CountOf(x) - //Compile time assert. #define STATIC_ASSERT(expr) C_ASSERT(expr) #define static_assert(expr, msg) C_ASSERT(expr) Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -492,8 +492,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - pModDoc->MuteChannel(nThisChn, (memory[0][nChn] & 1) != 0 ? true : false); - pModDoc->SoloChannel(nThisChn, (memory[0][nChn] & 2) != 0 ? true : false); + pModDoc->MuteChannel(nThisChn, (memory[0][nChn] & 1) != 0); + pModDoc->SoloChannel(nThisChn, (memory[0][nChn] & 2) != 0); } break; case 1: @@ -506,7 +506,7 @@ break; case 2: for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) - pModDoc->NoFxChannel(pattern[nChn], memory[2][nChn] != 0 ? true : false); + pModDoc->NoFxChannel(pattern[nChn], memory[2][nChn] != 0); break; case 3: for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) @@ -957,7 +957,7 @@ tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE|TME_HOVER; tme.dwHoverTime = 1; - mouseTracking = _TrackMouseEvent(&tme) ? true : false; + mouseTracking = _TrackMouseEvent(&tme) != FALSE; } if(!leftButton && !rightButton){ Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -121,7 +121,7 @@ { for(int i = 0; i < CU_MAX_CLEANUP_OPTIONS; i++) { - m_bCheckBoxes[i] = IsDlgButtonChecked(m_nCleanupIDtoDlgID[i]) ? true : false; + m_bCheckBoxes[i] = IsDlgButtonChecked(m_nCleanupIDtoDlgID[i]) != BST_UNCHECKED; } bool bModified = false; @@ -325,12 +325,12 @@ { //strncpy_s(pTTTA->szText, sizeof(pTTTA->szText), strTipText, // strTipText.GetLength() + 1); - strncpy(pTTTA->szText, strTipText, min(strTipText.GetLength() + 1, ARRAYELEMCOUNT(pTTTA->szText) - 1)); + strncpy(pTTTA->szText, strTipText, min(strTipText.GetLength() + 1, CountOf(pTTTA->szText) - 1)); } else { ::MultiByteToWideChar(CP_ACP , 0, strTipText, strTipText.GetLength() + 1, - pTTTW->szText, ARRAYELEMCOUNT(pTTTW->szText)); + pTTTW->szText, CountOf(pTTTW->szText)); } return TRUE; Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -59,8 +59,8 @@ //----------------------------------------------------------------------------------------------------------------------- { commands[kc].UID = uid; - commands[kc].isHidden = (visibility == kcHidden) ? true : false; - commands[kc].isDummy = (dummy == kcDummy) ? true : false; + commands[kc].isHidden = (visibility == kcHidden); + commands[kc].isDummy = (dummy == kcDummy); commands[kc].Message = message; } Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -780,7 +780,7 @@ //Scrolling the shown orders(the showns rectangles)? while (rect.left < rcClient.right) { - bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false; + bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)); const PATTERNINDEX nPat = (nIndex < pSndFile->Order.GetLength()) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID; if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right; rect.right--; Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -1738,11 +1738,11 @@ //---------------------------------------- { // Enable time-stretching / disable unused pitch-shifting UI elements - bool bTimeStretch = IsDlgButtonChecked(IDC_CHECK3) ? true : false; + bool bTimeStretch = IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED; if(!bTimeStretch) ReadTimeStretchParameters(); - ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(bTimeStretch ? false : true); - ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(bTimeStretch ? true : false); - ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(bTimeStretch ? true : false); //rewbs.timeStretchMods + ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(bTimeStretch ? FALSE : TRUE); + ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(bTimeStretch ? TRUE : FALSE); + ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(bTimeStretch ? TRUE : FALSE); //rewbs.timeStretchMods GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW); GetDlgItem(IDC_COMBO5)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW); GetDlgItem(IDC_TEXT_FFT)->ShowWindow(bTimeStretch ? SW_HIDE : SW_SHOW); @@ -2793,7 +2793,7 @@ if (!dend) dend = dstart >> 7; if ((dstart ^ dend) < 0) return false; int delta = dend - dstart; - return ((delta > -SMPLOOP_ACCURACY) && (delta < SMPLOOP_ACCURACY)) ? true : false; + return ((delta > -SMPLOOP_ACCURACY) && (delta < SMPLOOP_ACCURACY)); } Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -182,10 +182,10 @@ void CInputHandler::SetupSpecialKeyInterception() { m_bInterceptWindowsKeys = m_bInterceptNumLock = m_bInterceptCapsLock = m_bInterceptScrollLock = false; - for( int context=0; context < ARRAYELEMCOUNT(keyMap); context++ ) - for( int mod=0; mod < ARRAYELEMCOUNT(keyMap[0]); mod++ ) - for( int key=0; key < ARRAYELEMCOUNT(keyMap[0][0]); key++ ) - for( int kevent=0; kevent < ARRAYELEMCOUNT(keyMap[0][0][0]); kevent++ ) { + for( int context=0; context < CountOf(keyMap); context++ ) + for( int mod=0; mod < CountOf(keyMap[0]); mod++ ) + for( int key=0; key < CountOf(keyMap[0][0]); key++ ) + for( int kevent=0; kevent < CountOf(keyMap[0][0][0]); kevent++ ) { if( keyMap[context][mod][key][kevent] == kcNull ) continue; if( mod == HOTKEYF_EXT ) m_bInterceptWindowsKeys = true; if( key == VK_NUMLOCK ) m_bInterceptNumLock = true; Modified: trunk/OpenMPT/mptrack/MIDIMacros.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMacros.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/MIDIMacros.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -49,7 +49,7 @@ if(plugin < MAX_MIXPLUGINS) { - CVstPlugin *pPlug = (CVstPlugin*)m_SndFile.m_MixPlugins[plugin].pMixPlugin; + CVstPlugin *pPlug = reinterpret_cast<CVstPlugin *>(m_SndFile.m_MixPlugins[plugin].pMixPlugin); if(pPlug) { paramName = pPlug->GetParamName(param); @@ -254,6 +254,8 @@ } +#ifdef MODPLUG_TRACKER + //////////////////////////////////////////////////////////////////////// // MIDI Macro Configuration Dialog @@ -375,63 +377,62 @@ } -void CMidiMacroSetup::UpdateMacroList(int macro) //-1 for all macros +// macro == -1 for updating all macros at once +void CMidiMacroSetup::UpdateMacroList(int macro) //---------------------------------------------- { if (!m_EditMacro[0]) - return; //GUI not yet initialized + { + // GUI not yet initialized + return; + } - CString s, macroText; - UINT start, end, macroType; - int selectedMacro=m_CbnSFx.GetCurSel(); + int start, end; if (macro >= 0 && macro < 16) { - start=macro; - end=macro; + start = end = macro; } else { - start=0; - end=NUM_MACROS; + start = 0; + end = NUM_MACROS - 1; } - for (int m=0; m<NUM_MACROS; m++) + CString s; + const int selectedMacro = m_CbnSFx.GetCurSel(); + + for (int m = start; m <= end; m++) { - //SFx + // SFx s.Format("SF%X", m); m_EditMacro[m].SetWindowText(s); - //Macro value: + // Macro value: CString macroText = m_MidiCfg.szMidiSFXExt[m]; m_EditMacroValue[m].SetWindowText(macroText); m_EditMacroValue[m].SetBackColor(m == selectedMacro ? RGB(200, 200, 225) : RGB(245, 245, 245)); - //Macro Type: - macroType = macroTools.GetMacroType(macroText); + // Macro Type: + const enmParameteredMacroType macroType = macroTools.GetMacroType(macroText); switch (macroType) { - case sfx_unused: s = "Unused"; break; - case sfx_cutoff: s = "Set Filter Cutoff"; break; - case sfx_reso: s = "Set Filter Resonance"; break; - case sfx_mode: s = "Set Filter Mode"; break; - case sfx_drywet: s = "Set Plugin dry/wet ratio"; break; case sfx_cc: s.Format("MIDI CC %d", macroTools.MacroToMidiCC(macroText)); break; + case sfx_plug: s.Format("Control Plugin Param %d", macroTools.MacroToPlugParam(macroText)); break; - case sfx_custom: - default: s = "Custom"; + + default: + s = macroTools.GetMacroName(macroType); + break; } m_EditMacroType[m].SetWindowText(s); m_EditMacroType[m].SetBackColor(m == selectedMacro ? RGB(200,200,225) : RGB(245,245,245) ); - //Param details button: - if (macroType == sfx_plug) - m_BtnMacroShowAll[m].ShowWindow(SW_SHOW); - else - m_BtnMacroShowAll[m].ShowWindow(SW_HIDE); + // Param details button: + m_BtnMacroShowAll[m].ShowWindow((macroType == sfx_plug) ? SW_SHOW : SW_HIDE); } } @@ -780,3 +781,5 @@ return true; } } + +#endif // MODPLUG_TRACKER Modified: trunk/OpenMPT/mptrack/MIDIMacros.h =================================================================== --- trunk/OpenMPT/mptrack/MIDIMacros.h 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/MIDIMacros.h 2011-10-29 19:03:03 UTC (rev 1126) @@ -71,6 +71,8 @@ }; +#ifdef MODPLUG_TRACKER + //////////////////////////////////////////////////////////////////////// // MIDI Macro Configuration Dialog @@ -126,4 +128,6 @@ DECLARE_MESSAGE_MAP() }; +#endif // MODPLUG_TRACKER + #endif // MIDIMACROS_H Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -1547,7 +1547,7 @@ m[63*4].param = 1; } } - bOk = PlaySoundFile(&m_WaveFile) ? true : false; + bOk = PlaySoundFile(&m_WaveFile) != FALSE; } } f.Close(); Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -229,7 +229,7 @@ if (!CToolBar::Create(parent, dwStyle)) return FALSE; if (!LoadBitmap(IDB_MAINBAR)) return FALSE; - if (!SetButtons(MainButtons, ARRAYELEMCOUNT(MainButtons))) return FALSE; + if (!SetButtons(MainButtons, CountOf(MainButtons))) return FALSE; nCurrentSpeed = 6; nCurrentTempo = 125; Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -252,13 +252,13 @@ { if (m_dwFileLimit) m_dwFileLimit = GetDlgItemInt(IDC_EDIT1, NULL, FALSE); if (m_dwSongLimit) m_dwSongLimit = GetDlgItemInt(IDC_EDIT2, NULL, FALSE); - m_bSelectPlay = IsDlgButtonChecked(IDC_RADIO2) ? true : false; + m_bSelectPlay = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; m_nMinOrder = (ORDERINDEX)GetDlgItemInt(IDC_EDIT3, NULL, FALSE); m_nMaxOrder = (ORDERINDEX)GetDlgItemInt(IDC_EDIT4, NULL, FALSE); if (m_nMaxOrder < m_nMinOrder) m_bSelectPlay = false; - //m_bHighQuality = IsDlgButtonChecked(IDC_CHECK3) ? true : false; //rewbs.resamplerConf - we don't want this anymore. - m_bNormalize = IsDlgButtonChecked(IDC_CHECK5) ? true : false; - m_bGivePlugsIdleTime = IsDlgButtonChecked(IDC_GIVEPLUGSIDLETIME) ? true : false; + //m_bHighQuality = IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED; //rewbs.resamplerConf - we don't want this anymore. + m_bNormalize = IsDlgButtonChecked(IDC_CHECK5) != BST_UNCHECKED; + m_bGivePlugsIdleTime = IsDlgButtonChecked(IDC_GIVEPLUGSIDLETIME) != BST_UNCHECKED; if (m_bGivePlugsIdleTime) { if (Reporting::Confirm("You only need slow render if you are experiencing dropped notes with a Kontakt based sampler with Direct-From-Disk enabled.\nIt will make rendering *very* slow.\n\nAre you sure you want to enable slow render?", @@ -271,9 +271,9 @@ // -> CODE#0024 // -> DESC="wav export update" - m_bChannelMode = IsDlgButtonChecked(IDC_CHECK4) ? true : false; + m_bChannelMode = IsDlgButtonChecked(IDC_CHECK4) != BST_UNCHECKED; // -! NEW_FEATURE#0024 - m_bInstrumentMode= IsDlgButtonChecked(IDC_CHECK6) ? true : false; + m_bInstrumentMode= IsDlgButtonChecked(IDC_CHECK6) != BST_UNCHECKED; // WaveFormatEx DWORD dwFormat = m_CbnSampleFormat.GetItemData(m_CbnSampleFormat.GetCurSel()); Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -129,7 +129,7 @@ CriticalSection cs; // Converting instruments to samples - if(m_SndFile.m_nInstruments) + if(m_SndFile.GetNumInstruments()) { ConvertInstrumentsToSamples(); CHANGEMODTYPE_WARNING(wInstrumentsToSamples); @@ -384,8 +384,8 @@ pIns->PanEnv.dwFlags &= ~ENV_CARRY; pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER); pIns->dwFlags &= ~INS_SETPANNING; - pIns->nIFC &= 0x7F; - pIns->nIFR &= 0x7F; + pIns->SetCutoff(pIns->GetCutoff(), false); + pIns->SetResonance(pIns->GetResonance(), false); pIns->nFilterMode = FLTMODE_UNCHANGED; pIns->nCutSwing = pIns->nPanSwing = pIns->nResSwing = pIns->nVolSwing = 0; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -1196,7 +1196,7 @@ //-------------------------------------------------- { if (nChn >= m_SndFile.m_nChannels) return true; - return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SOLO) ? true : false; + return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SOLO) != 0; } bool CModDoc::SoloChannel(CHANNELINDEX nChn, bool bSolo) @@ -1217,7 +1217,7 @@ //------------------------------------------ { if (nChn >= m_SndFile.m_nChannels) return true; - return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_NOFX) ? true : false; + return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_NOFX) != 0; } bool CModDoc::NoFxChannel(CHANNELINDEX nChn, bool bNoFx, bool updateMix) Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -80,7 +80,7 @@ if(IsDlgButtonChecked(IDC_RADIO4)) m_nFormat |= ER_SIGNED; if(IsDlgButtonChecked(IDC_RADIO5)) m_nFormat |= ER_MONO; if(IsDlgButtonChecked(IDC_RADIO6)) m_nFormat |= ER_STEREO; - m_bRememberFormat = IsDlgButtonChecked(IDC_CHK_REMEMBERSETTINGS) ? true : false; + m_bRememberFormat = IsDlgButtonChecked(IDC_CHK_REMEMBERSETTINGS) != BST_UNCHECKED; CDialog::OnOK(); } Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp =================================================================== --- trunk/OpenMPT/mptrack/UpdateCheck.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/UpdateCheck.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -323,7 +323,7 @@ CString updateURL; GetDlgItemText(IDC_EDIT1, updateURL); - CUpdateCheck::SetUpdateSettings(CUpdateCheck::GetLastUpdateCheck(), updateCheckPeriod, updateURL, IsDlgButtonChecked(IDC_CHECK1) ? true : false, CUpdateCheck::GetShowUpdateHint()); + CUpdateCheck::SetUpdateSettings(CUpdateCheck::GetLastUpdateCheck(), updateCheckPeriod, updateURL, IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED, CUpdateCheck::GetShowUpdateHint()); CPropertyPage::OnOK(); } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -804,7 +804,7 @@ if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && (nChn < pSndFile->m_nChannels) && (strncmp(s, pSndFile->ChnSettings[nChn].szName, MAX_CHANNELNAME))) { memcpy(pSndFile->ChnSettings[nChn].szName, s, MAX_CHANNELNAME); - pSndFile->ChnSettings[nChn].szName[ARRAYELEMCOUNT(pSndFile->ChnSettings[nChn].szName)-1] = 0; + pSndFile->ChnSettings[nChn].szName[CountOf(pSndFile->ChnSettings[nChn].szName)-1] = 0; pModDoc->SetModified(); pModDoc->UpdateAllViews(this, HINT_MODCHANNELS | (m_nActiveTab << HINT_SHIFT_CHNTAB)); } Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -373,7 +373,7 @@ //---------------------------------------- { MODINSTRUMENT *pIns = GetInstrumentPtr(); - if (pIns) return (pIns->VolEnv.dwFlags & ENV_ENABLED) ? true : false; + if (pIns) return (pIns->VolEnv.dwFlags & ENV_ENABLED) != 0; return false; } @@ -382,7 +382,7 @@ //---------------------------------------- { MODINSTRUMENT *pIns = GetInstrumentPtr(); - if (pIns) return (pIns->PanEnv.dwFlags & ENV_ENABLED) ? true : false; + if (pIns) return (pIns->PanEnv.dwFlags & ENV_ENABLED) != 0; return false; } @@ -391,7 +391,7 @@ //------------------------------------------ { MODINSTRUMENT *pIns = GetInstrumentPtr(); - if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == ENV_ENABLED) ? true : false; + if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == ENV_ENABLED); return false; } @@ -400,7 +400,7 @@ //------------------------------------------- { MODINSTRUMENT *pIns = GetInstrumentPtr(); - if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == (ENV_ENABLED|ENV_FILTER)) ? true : false; + if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == (ENV_ENABLED|ENV_FILTER)); return false; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -1418,10 +1418,10 @@ const CRect oldDropRect = m_rcDropItem; const DWORD oldDropItem = m_nDropItem; - m_bShiftDragging = (nFlags & MK_SHIFT) ? true : false; + m_bShiftDragging = (nFlags & MK_SHIFT) != 0; m_nDropItem = GetDragItem(point, &m_rcDropItem); - const bool b = (m_nDropItem == m_nDragItem) ? true : false; + const bool b = (m_nDropItem == m_nDragItem); const bool dragChannel = (m_nDragItem & DRAGITEM_MASK) == DRAGITEM_CHNHEADER; if (b != m_bInItemRect || (m_nDropItem != oldDropItem && dragChannel)) @@ -1814,7 +1814,7 @@ pageFind.m_dwFlags = m_findReplace.dwFindFlags; pageFind.m_nMinChannel = m_findReplace.nFindMinChn; pageFind.m_nMaxChannel = m_findReplace.nFindMaxChn; - pageFind.m_bPatSel = (m_dwBeginSel != m_dwEndSel) ? true : false; + pageFind.m_bPatSel = (m_dwBeginSel != m_dwEndSel); pageReplace.m_nNote = m_findReplace.cmdReplace.note; pageReplace.m_nInstr = m_findReplace.cmdReplace.instr; pageReplace.m_nVolCmd = m_findReplace.cmdReplace.volcmd; @@ -5754,16 +5754,16 @@ { const double t = pSndFile->GetPlaybackTimeAt(currentOrder, m_nRow, false); if(t < 0) - msg.Format("Unable to determine the time. Possible cause: No order %d, row %d found from play sequence", currentOrder, m_nRow); + msg.Format("Unable to determine the time. Possible cause: No order %d, row %d found from play sequence.", currentOrder, m_nRow); else { const uint32 minutes = static_cast<uint32>(t / 60.0); const float seconds = t - minutes*60; - msg.Format("Estimate for playback time at order %d(pattern %d), row %d: %d minute%s %.2f seconds", currentOrder, m_nPattern, m_nRow, minutes, (minutes == 1) ? "" : "s", seconds); + msg.Format("Estimate for playback time at order %d (pattern %d), row %d: %d minute%s %.2f seconds.", currentOrder, m_nPattern, m_nRow, minutes, (minutes == 1) ? "" : "s", seconds); } } else - msg.Format("Unable to determine the time: pattern at current order(=%d) does not correspond to pattern at pattern view(=pattern %d).", currentOrder, m_nPattern); + msg.Format("Unable to determine the time: pattern at current order (%d) does not correspond to pattern at pattern view (pattern %d).", currentOrder, m_nPattern); Reporting::Notification(msg); } Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -1634,7 +1634,7 @@ } // The path is too long - we can't continue. This can actually only happen with an invalid path - if(strlen(szPath) >= ARRAYELEMCOUNT(szPath) - 1) + if(strlen(szPath) >= CountOf(szPath) - 1) return; // Enumerating Directories and samples/instruments @@ -3315,7 +3315,7 @@ tvi.stateMask = TVIS_EXPANDED; tvi.hItem = hItem; GetItem(&tvi); - return (tvi.state & TVIS_EXPANDED) != 0 ? true : false; + return (tvi.state & TVIS_EXPANDED) != 0; } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -980,18 +980,18 @@ strcpy((char *) ptr, s_szHostVendorString); //strcpy((char*)ptr,"Steinberg"); //return 0; - return true; - - case audioMasterGetVendorVersion: - return s_nHostVendorVersion; - //return 7000; - + return 1; + case audioMasterGetProductString: strcpy((char *) ptr, s_szHostProductString); //strcpy((char*)ptr,"Cubase VST"); //return 0; - return true; - + return 1; + + case audioMasterGetVendorVersion: + return s_nHostVendorVersion; + //return 7000; + case audioMasterVendorSpecific: return 0; @@ -1164,7 +1164,7 @@ FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog( (pFileSel->command == kVstFileSave ? false : true), "", "", extensions, workingDir, - (pFileSel->command == kVstMultipleFilesLoad ? true : false) + (pFileSel->command == kVstMultipleFilesLoad) ); if(files.abort) @@ -1371,7 +1371,8 @@ m_nSampleRate = nInvalidSampleRate; //rewbs.VSTCompliance: gets set on Resume() MemsetZero(m_MidiCh); - for (int ch=0; ch<16; ch++) { + for (int ch=0; ch<16; ch++) + { m_nMidiPitchBendPos[ch]=MIDI_PitchBend_Centre; //centre pitch bend on all channels } @@ -2876,7 +2877,7 @@ float *p = (float *)m_pMixStruct->pPluginData; *(ULONG *)p = 0; p++; - for (UINT i=0; i<nParams; i++) + for (UINT i = 0; i < nParams; i++) { p[i] = GetParameter(i); } @@ -2895,22 +2896,26 @@ UINT nLen = nParams * sizeof(float); ULONG nType = *(ULONG *)m_pMixStruct->pPluginData; - if ((Dispatch(effIdentify, 0,0, NULL, 0) == 'NvEf') && (nType == 'NvEf')) + if ((Dispatch(effIdentify, 0, nullptr, nullptr, 0) == 'NvEf') && (nType == 'NvEf')) { PVOID p = NULL; Dispatch(effGetChunk, 0,0, &p, 0); //init plug for chunk reception - if ((nProgram>=0) && (nProgram < m_pEffect->numPrograms)) { // Bank: - Dispatch(effSetChunk, 0, m_pMixStruct->nPluginDataSize-4, ((BYTE *)m_pMixStruct->pPluginData)+4, 0); + if ((nProgram>=0) && (nProgram < m_pEffect->numPrograms)) + { + // Bank + Dispatch(effSetChunk, 0, m_pMixStruct->nPluginDataSize - 4, ((BYTE *)m_pMixStruct->pPluginData) + 4, 0); SetCurrentProgram(nProgram); - } else { // Program: - Dispatch(effSetChunk, 1, m_pMixStruct->nPluginDataSize-4, ((BYTE *)m_pMixStruct->pPluginData)+4, 0); + } else + { + // Program + Dispatch(effSetChunk, 1, m_pMixStruct->nPluginDataSize - 4, ((BYTE *)m_pMixStruct->pPluginData) + 4, 0); } } else { float *p = (float *)m_pMixStruct->pPluginData; - if (m_pMixStruct->nPluginDataSize >= nLen+4) p++; + if (m_pMixStruct->nPluginDataSize >= nLen + 4) p++; if (m_pMixStruct->nPluginDataSize >= nLen) { for (UINT i = 0; i < nParams; i++) @@ -2933,13 +2938,13 @@ if ((m_pEditor) && (!m_pEditor->m_hWnd)) { delete m_pEditor; - m_pEditor = NULL; + m_pEditor = nullptr; } if (m_pEditor) { if (m_pEditor->m_hWnd) m_pEditor->DoClose(); if ((volatile void *)m_pEditor) delete m_pEditor; - m_pEditor = NULL; + m_pEditor = nullptr; } else { //rewbs.defaultPlugGui @@ -2964,7 +2969,7 @@ { if ((m_pEffect) && (m_pEffect->magic == kBuzzMagic)) { - return Dispatch(effBuzzGetNumCommands, 0,0,NULL,0); + return Dispatch(effBuzzGetNumCommands, 0, nullptr, nullptr, 0.0f); } else if (m_pEffect) { @@ -2979,11 +2984,11 @@ { if ((m_pEffect) && (m_pEffect->magic == kBuzzMagic)) { - return Dispatch(effBuzzGetCommandName, nIndex,0,pszName,0); + return Dispatch(effBuzzGetCommandName, nIndex, nullptr, pszName, 0.0f); } else if (m_pEffect) { - return Dispatch(effGetParamName, nIndex,0,pszName,0); + return Dispatch(effGetParamName, nIndex, nullptr, pszName, 0.0f); } return 0; } @@ -2994,7 +2999,7 @@ { if ((m_pEffect) && (m_pEffect->magic == kBuzzMagic)) { - return Dispatch(effBuzzExecuteCommand, nIndex,0,NULL,0); + return Dispatch(effBuzzExecuteCommand, nIndex, nullptr, nullptr, 0.0f); } return 0; } @@ -3032,7 +3037,7 @@ //rewbs.VSTcompliance -BOOL CVstPlugin::GetSpeakerArrangement() +bool CVstPlugin::GetSpeakerArrangement() //-------------------------------------- { VstSpeakerArrangement **pSA = NULL; @@ -3136,7 +3141,7 @@ CVstPlugin* pCandidatePlug = NULL; list.RemoveAll(); - for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) + for (int nPlug = 0; nPlug < MAX_MIXPLUGINS; nPlug++) { pCandidatePlug = reinterpret_cast<CVstPlugin *>(m_pSndFile->m_MixPlugins[nPlug].pMixPlugin); if (pCandidatePlug) @@ -3161,12 +3166,12 @@ //-------------------------------------------------------------- { list.RemoveAll(); - if(m_pSndFile == 0) return; + if(m_pSndFile == nullptr) return; - UINT nThisMixPlug = m_nSlot+1; //m_nSlot is position in mixplug array. - for (int nIns=0; nIns<MAX_INSTRUMENTS; nIns++) + const PLUGINDEX nThisMixPlug = m_nSlot + 1; //m_nSlot is position in mixplug array. + for (int nIns = 0; nIns <= m_pSndFile->GetNumInstruments(); nIns++) { - if (m_pSndFile->Instruments[nIns] && (m_pSndFile->Instruments[nIns]->nMixPlug==nThisMixPlug)) + if (m_pSndFile->Instruments[nIns] != nullptr && (m_pSndFile->Instruments[nIns]->nMixPlug == nThisMixPlug)) { list.Add(nIns); } Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/Vstplug.h 2011-10-29 19:03:03 UTC (rev 1126) @@ -151,7 +151,7 @@ BOOL GetCommandName(UINT index, LPSTR pszName); BOOL ExecuteCommand(UINT nIndex); CAbstractVstEditor* GetEditor(); //rewbs.defaultPlugGUI - BOOL GetSpeakerArrangement(); //rewbs.VSTCompliance + bool GetSpeakerArrangement(); //rewbs.VSTCompliance bool Bypass(bool bypass = true); //rewbs.defaultPlugGUI bool IsBypassed() const { return m_pMixStruct->IsBypassed(); }; //rewbs.defaultPlugGUI @@ -223,7 +223,7 @@ CString GetParamLabel(PlugParamIndex) { return ""; }; CString GetParamDisplay(PlugParamIndex) { return ""; }; - PlugParamValue GetParameter(PlugParamIndex nIndex) {return 0;} + PlugParamValue GetParameter(PlugParamIndex) { return 0; } bool LoadProgram(CString) {return false;} bool SaveProgram(CString) {return false;} void SetCurrentProgram(UINT) {} Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/test/test.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -330,8 +330,10 @@ VERIFY_EQUAL_NONCONT(pIns->nVolRampUp, 1200); VERIFY_EQUAL_NONCONT(pIns->nResampling, SRCMODE_POLYPHASE); - VERIFY_EQUAL_NONCONT(pIns->nIFC, 0); - VERIFY_EQUAL_NONCONT(pIns->nIFR, 0); + VERIFY_EQUAL_NONCONT(pIns->IsCutoffEnabled(), false); + VERIFY_EQUAL_NONCONT(pIns->GetCutoff(), 0); + VERIFY_EQUAL_NONCONT(pIns->IsResonanceEnabled(), false); + VERIFY_EQUAL_NONCONT(pIns->GetResonance(), 0); VERIFY_EQUAL_NONCONT(pIns->nFilterMode, FLTMODE_UNCHANGED); VERIFY_EQUAL_NONCONT(pIns->nVolSwing, 0); @@ -531,8 +533,10 @@ VERIFY_EQUAL_NONCONT(pIns->nVolRampUp, 1200); VERIFY_EQUAL_NONCONT(pIns->nResampling, SRCMODE_POLYPHASE); - VERIFY_EQUAL_NONCONT(pIns->nIFC, 0x80 | 0x32); - VERIFY_EQUAL_NONCONT(pIns->nIFR, 0x80 | 0x64); + VERIFY_EQUAL_NONCONT(pIns->IsCutoffEnabled(), true); + VERIFY_EQUAL_NONCONT(pIns->GetCutoff(), 0x32); + VERIFY_EQUAL_NONCONT(pIns->IsResonanceEnabled(), true); + VERIFY_EQUAL_NONCONT(pIns->GetResonance(), 0x64); VERIFY_EQUAL_NONCONT(pIns->nFilterMode, FLTMODE_HIGHPASS); VERIFY_EQUAL_NONCONT(pIns->nVolSwing, 0x30); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/mptrack/version.h 2011-10-29 19:03:03 UTC (rev 1126) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 48 +#define VER_MINORMINOR 49 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2011-10-29 19:03:03 UTC (rev 1126) @@ -388,7 +388,7 @@ int n; for (n = 0; n < 4; n++) { - if(CSoundFile::ConvertVolEffect(&cmd1, ¶m1, (n >> 1) ? true : false)) + if(CSoundFile::ConvertVolEffect(&cmd1, ¶m1, (n >> 1) != 0)) { n = 5; break; Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2011-10-29 19:03:03 UTC (rev 1126) @@ -669,7 +669,7 @@ int n; for (n = 0; n < 4; n++) { - if(CSoundFile::ConvertVolEffect(&effect2, &effectParam2, (n >> 1) ? true : false)) + if(CSoundFile::ConvertVolEffect(&effect2, &effectParam2, (n >> 1) != 0)) { n = 5; break; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -221,9 +221,11 @@ #pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data +// IT Vibrato -> VibratoType BYTE autovibit2xm[8] = -{ 0, 3, 1, 4, 2, 0, 0, 0 }; +{ VIB_SINE, VIB_RAMP_DOWN, VIB_SQUARE, VIB_RANDOM, VIB_RAMP_UP, 0, 0, 0 }; +// VibratoType -> Vibrato BYTE autovibxm2it[8] = { 0, 2, 4, 1, 3, 0, 0, 0 }; @@ -454,8 +456,8 @@ pIns->nDNA = pis->dca; pIns->nPPS = pis->pps; pIns->nPPC = pis->ppc; - pIns->nIFC = pis->ifc; - pIns->nIFR = pis->ifr; + pIns->SetCutoff(pis->ifc & 0x7F, (pis->ifc & 0x80) != 0); + pIns->SetResonance(pis->ifr & 0x7F, (pis->ifr & 0x80) != 0); pIns->nVolSwing = min(pis->rv, 100); pIns->nPanSwing = min(pis->rp, 64); pIns->nPan = (pis->dfp & 0x7F) << 2; @@ -1614,8 +1616,8 @@ if (!(pIns->dwFlags & INS_SETPANNING)) iti.dfp |= 0x80; iti.rv = min(pIns->nVolSwing, 100); iti.rp = min(pIns->nPanSwing, 64); - iti.ifc = pIns->nIFC; - iti.ifr = pIns->nIFR; + iti.ifc = pIns->GetCutoff() | (pIns->IsCutoffEnabled() ? 0x80 : 0x00); + iti.ifr = pIns->GetResonance() | (pIns->IsResonanceEnabled() ? 0x80 : 0x00); iti.nos = 0; for (UINT i=0; i<NOTE_MAX; i++) if (pIns->Keyboard[i] < MAX_SAMPLES) { Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -630,7 +630,7 @@ // Reading play sequence if (version < '2') { - UINT nbo = pmsh->songlen >> 8; + UINT nbo = BigEndianW(pmsh->songlen); if (nbo >= MAX_ORDERS) nbo = MAX_ORDERS-1; if (!nbo) nbo = 1; Order.ReadAsByte(pmsh->playseq, nbo, nbo); Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -221,7 +221,7 @@ bool IsMagic(LPCSTR s1, LPCSTR s2) { - return ((*(DWORD *)s1) == (*(DWORD *)s2)) ? true : false; + return ((*(DWORD *)s1) == (*(DWORD *)s2)); } // Functor for fixing VBlank MODs and MODs with 7-bit panning @@ -286,9 +286,9 @@ if (IsMagic(s,"16CN")) m_nChannels = 16; else if (IsMagic(s,"32CN")) m_nChannels = 32; else m_nSamples = 15; // Startrekker 8 channel mod (needs special treatment, see below) - bool bFLT8 = IsMagic(s, "FLT8") ? true : false; + bool bFLT8 = IsMagic(s, "FLT8"); // Only apply VBlank tests to M.K. (ProTracker) modules. - const bool bMdKd = IsMagic(s, "M.K.") ? true : false; + const bool bMdKd = IsMagic(s, "M.K."); // Load Samples nErr = 0; @@ -532,7 +532,7 @@ // below 100 BPM are taken into account. Furthermore, only M.K. (ProTracker) // modules are checked. // The same check is also applied to original Ultimate Soundtracker 15 sample mods. - const bool bVBlank = ((bMdKd && bHasTempoCommands && GetSongTime() >= 10 * 60) || m_nSamples == 15) ? true : false; + const bool bVBlank = ((bMdKd && bHasTempoCommands && GetSongTime() >= 10 * 60) || m_nSamples == 15); const bool b7BitPanning = bLeftPanning && !bExtendedPanning; if(bVBlank || b7BitPanning) { Modified: trunk/OpenMPT/soundlib/Load_okt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_okt.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Load_okt.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -90,7 +90,7 @@ else sample.nSustainStart = sample.nSustainEnd = 0; } - sample7bit[nSmp - 1] = (oktsmp.type == 0 || oktsmp.type == 2) ? true : false; + sample7bit[nSmp - 1] = (oktsmp.type == 0 || oktsmp.type == 2); } } Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -50,9 +50,9 @@ struct PSMNEWHEADER { - uint32 formatID; // "PSM " (new format) - uint32 fileSize; // Filesize - 12 - uint32 fileInfoID; // "FILE" Start of file info + uint32 formatID; // "PSM " (new format) + uint32 fileSize; // Filesize - 12 + uint32 fileInfoID; // "FILE" Start of file info }; struct PSMSONGHEADER @@ -102,33 +102,36 @@ }; #pragma pack() + struct PSMSUBSONG // For internal use (pattern conversion) { - uint8 channelPanning[MAX_BASECHANNELS], channelVolume[MAX_BASECHANNELS]; - bool channelSurround[MAX_BASECHANNELS]; + vector<uint8> channelPanning, channelVolume; + vector<bool> channelSurround; uint8 defaultTempo, defaultSpeed; char songName[10]; ORDERINDEX startOrder, endOrder, restartPos; PSMSUBSONG() { - memset(channelPanning, 128, sizeof(channelPanning)); - memset(channelVolume, 64, sizeof(channelVolume)); - memset(channelSurround, false, sizeof(channelSurround)); - memset(songName, 0, sizeof(songName)); + channelPanning.assign(MAX_BASECHANNELS, 128); + channelVolume.assign(MAX_BASECHANNELS, 64); + channelSurround.assign(MAX_BASECHANNELS, false); + MemsetZero(songName); defaultTempo = 125; defaultSpeed = 6; startOrder = endOrder = restartPos = ORDERINDEX_INVALID; } }; + // Portamento effect conversion (depending on format version) -inline BYTE convert_psm_porta(BYTE param, bool bNewFormat) -//-------------------------------------------------------- +inline BYTE ConvertPSMPorta(BYTE param, bool bNewFormat) +//------------------------------------------------------ { return ((bNewFormat) ? (param) : ((param < 4) ? (param | 0xF0) : (param >> 2))); } + bool CSoundFile::ReadPSM(const LPCBYTE lpStream, const DWORD dwMemLength) //----------------------------------------------------------------------- { @@ -164,9 +167,6 @@ vector<uint32> patternOffsets; // pattern offsets (sorted as they occour in the file) vector<uint32> patternIDs; // pattern IDs (sorted as they occour in the file) vector<uint32> orderOffsets; // combine the upper two vectors to get the offsets for each order item - patternOffsets.clear(); - patternIDs.clear(); - orderOffsets.clear(); Order.clear(); // subsong setup vector<PSMSUBSONG> subsongs; @@ -215,7 +215,7 @@ if(chunkSize < sizeof(PSMSONGHEADER)) return false; PSMSONGHEADER *pSong = (PSMSONGHEADER *)(lpStream + dwMemPos); if(pSong->compression != 0x01) return false; // no compression for PSM files - m_nChannels = CLAMP(pSong->numChannels, m_nChannels, MAX_BASECHANNELS); // subsongs *might* have different channel count + m_nChannels = Clamp(CHANNELINDEX(pSong->numChannels), m_nChannels, MAX_BASECHANNELS); // subsongs *might* have different channel count PSMSUBSONG subsong; subsong.restartPos = (ORDERINDEX)Order.size(); // restart order "offset": current orderlist length @@ -616,19 +616,19 @@ // Portamento case 0x0B: // fine portamento up command = CMD_PORTAMENTOUP; - param = 0xF0 | convert_psm_porta(param, bNewFormat); + param = 0xF0 | ConvertPSMPorta(param, bNewFormat); break; case 0x0C: // portamento up command = CMD_PORTAMENTOUP; - param = convert_psm_porta(param, bNewFormat); + param = ConvertPSMPorta(param, bNewFormat); break; case 0x0D: // fine portamento down command = CMD_PORTAMENTODOWN; - param = 0xF0 | convert_psm_porta(param, bNewFormat); + param = 0xF0 | ConvertPSMPorta(param, bNewFormat); break; case 0x0E: // portamento down command = CMD_PORTAMENTODOWN; - param = convert_psm_porta(param, bNewFormat); + param = ConvertPSMPorta(param, bNewFormat); break; case 0x0F: // tone portamento command = CMD_TONEPORTAMENTO; Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -201,7 +201,7 @@ int n; for (n = 0; n < 4; n++) { - if(CSoundFile::ConvertVolEffect(&cmd1, ¶m1, (n >> 1) ? true : false)) + if(CSoundFile::ConvertVolEffect(&cmd1, ¶m1, (n >> 1) != 0)) { n = 5; break; Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -1831,8 +1831,8 @@ if (!(pIns->dwFlags & INS_SETPANNING)) iti->dfp |= 0x80; iti->rv = pIns->nVolSwing; iti->rp = pIns->nPanSwing; - iti->ifc = pIns->nIFC; - iti->ifr = pIns->nIFR; + iti->ifc = pIns->GetCutoff() | (pIns->IsCutoffEnabled() ? 0x80 : 0x00); + iti->ifr = pIns->GetResonance() | (pIns->IsResonanceEnabled() ? 0x80 : 0x00); //iti->trkvers = 0x202; iti->trkvers = 0x220; //rewbs.ITVersion (was 0x202) iti->nos = 0; Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2011-10-29 19:03:03 UTC (rev 1126) @@ -43,24 +43,25 @@ typedef uintptr_t SmpLength; -#define MAX_PATTERN_ROWS 1024 // -> CODE#0008 -> DESC="#define to set pattern size" -! BEHAVIOUR_CHANGE#0008 -#define MOD_AMIGAC2 0x1AB +#define MOD_AMIGAC2 0x1AB // Period of Amiga middle-c #define MAX_SAMPLE_LENGTH 0x10000000 // 0x04000000 (64MB -> now 256MB). // Note: Sample size in bytes can be more than 256 MB. // The meaning of this constant is handled differently in various places; sometimes it's samples, sometimes it's bytes... #define MAX_SAMPLE_RATE 192000 // Max playback / render rate in Hz -#define MAX_ORDERS 256 -#define MAX_PATTERNS 240 -#define MAX_SAMPLES 4000 -#define MAX_INSTRUMENTS 256 //200 -const SEQUENCEINDEX MAX_SEQUENCES = 50; +const ROWINDEX MAX_PATTERN_ROWS = 1024; // -> CODE#0008 -> DESC="#define to set pattern size" -! BEHAVIOUR_CHANGE#0008 +const ORDERINDEX MAX_ORDERS = 256; +const PATTERNINDEX MAX_PATTERNS = 240; +const SAMPLEINDEX MAX_SAMPLES = 4000; +const INSTRUMENTINDEX MAX_INSTRUMENTS = 256; //200 -#define MAX_CHANNELS 256 //200 // Note: This is the maximum number of sound channels, -#define MAX_BASECHANNELS 127 // Max pattern channels. +const SEQUENCEINDEX MAX_SEQUENCES = 50; +const CHANNELINDEX MAX_BASECHANNELS = 127; // Max pattern channels. +const CHANNELINDEX MAX_CHANNELS = 256; //200 // Maximum number of mixing channels. + #define MIN_PERIOD 0x0020 // Note: Period is an Amiga metric that is inverse to frequency. #define MAX_PERIOD 0xFFFF // Periods in MPT are 4 times as fine as Amiga periods because of extra fine frequency slides. @@ -131,7 +132,7 @@ #define CHN_NOTEFADE 0x400 // fade note (instrument mode) #define CHN_SURROUND 0x800 // use surround channel #define CHN_NOIDO 0x1000 // Indicates if the channel is near enough to an exact multiple of the base frequency that any interpolation won't be noticeable - or if interpolation was switched off completely. --Storlek -#define CHN_HQSRC 0x2000 // ??? +#define CHN_HQSRC 0x2000 // High quality sample rate conversion (i.e. apply interpolation) #define CHN_FILTER 0x4000 // filtered output #define CHN_VOLUMERAMP 0x8000 // ramp volume #define CHN_VIBRATO 0x10000 // apply vibrato Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-29 18:53:58 UTC (rev 1125) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-29 19:03:03 UTC (rev 1126) @@ -291,53 +291,53 @@ WRITE_MPTHEADER_sized_member( VolEnv.nNodes , UINT , VE.. ) WRITE_MPTHEADER_sized_member( PanEnv.nNodes , UINT , PE.. ) WRITE_MPTHEADER_sized_member( PitchEnv.nNodes , UINT , PiE. ) -WRITE_MPTHEADER_sized_member( VolEnv.nLoopStart , BYTE , VLS. ) -WRITE_MPTHEADER_sized_member( VolEnv.nLoopEnd , BYTE , VLE. ) -WRITE_MPTHEADER_sized_member( VolEnv.nSustainStart , BYTE , VSB. ) -WRITE_MPTHEADER_sized_member( VolEnv.nSustainEnd , BYTE , VSE. ) -WRITE_MPTHEADER_sized_member( PanEnv.nLoopStart , BYTE , PLS. ) -WRITE_MPTHEADER_sized_member( PanEnv.nLoopEnd , BYTE , PLE. ) -WRITE_MPTHEADER_sized_member( PanEnv.nSustainStart , BYTE , PSB. ) -WRITE_MPTHEADER_sized_member( PanEnv.nSustainEnd , BYTE , PSE. ) -WRITE_MPTHEADER_sized_member( PitchEnv.nLoopStart , BYTE , PiLS ) -WRITE_MPTHEADER_sized_member( PitchEnv.nLoopEnd , BYTE , PiLE ) -WRITE_MPTHEADER_sized_member( PitchEnv.nSustainStart , BYTE , PiSB ) -WRITE_MPTHEADER_sized_member( PitchEnv.nSustainEnd , BYTE , PiSE ) -WRITE_MPTHEADER_sized_member( nNNA , BYTE , NNA. ) -WRITE_MPTHEADER_sized_member( nDCT , BYTE , DCT. ) -WRITE_MPTHEADER_sized_member( nDNA , BYTE , DNA. ) -WRITE_MPTHEADER_sized_member( nPanSwing , BYTE , PS.. ) -WRITE_MPTHEADER_sized_member( nVolSwing , BYTE , VS.. ) -WRITE_MPTHEADER_sized_member( nIFC , BYTE , IFC. ) -WRITE_MPTHEADER_sized_member( nIFR , BYTE , IFR. ) -WRITE_MPTHEADER_sized_member( wMidiBank , WORD , MB.. ) -WRITE_MPTHEADER_sized_member( nMidiProgram , BYTE , MP.. ) -WRITE_MPTHEADER_sized_member( nMidiChannel , BYTE , MC.. ) -WRITE_MPTHEADER_sized_member( nMidiDrumKey , BYTE , MDK. ) -WRITE_MPTHEADER_sized_member( nPPS , signed char , PPS. ) -WRITE_MPTHEADER_sized_member( nPPC , unsigned char , PPC. ) -WRITE_MPTHEADER_array_member( VolEnv.Ticks , WORD , VP[. , ((input->VolEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) -WRITE_MPTHEADER_array_member( PanEnv.Ticks , WORD , PP[. , ((input->PanEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) -WRITE_MPTHEADER_array_member( PitchEnv.Ticks , WORD , PiP[ , ((input->PitchEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) -WRITE_MPTHEADER_array_member( VolEnv.Values , BYTE , VE[. , ((input->VolEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) -WRITE_MPTHEADER_array_member( PanEnv.Values , BYTE , PE[. , ((input->PanEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) -WRITE_MPTHEADER_array_member( PitchEnv.Values , BYTE , PiE[ , ((input->PitchEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) -WRITE_MPTHEADER_array_member( NoteMap , BYTE , NM[. , 128 ) -WRITE_MPTHEADER_array_member( Keyboard , WORD , K[.. , 128 ) +WRITE_MPTHEADER_sized_member( VolEnv.nLoopStart , uint8 , VLS. ) +WRITE_MPTHEADER_sized_member( VolEnv.nLoopEnd , uint8 , VLE. ) +WRITE_MPTHEADER_sized_member( VolEnv.nSustainStart , uint8 , VSB. ) +WRITE_MPTHEADER_sized_member( VolEnv.nSustainEnd , uint8 , VSE. ) +WRITE_MPTHEADER_sized_member( PanEnv.nLoopStart , uint8 , PLS. ) +WRITE_MPTHEADER_sized_member( PanEnv.nLoopEnd , uint8 , PLE. ) +WRITE_MPTHEADER_sized_member( PanEnv.nSustainStart , uint8 , PSB. ) +WRITE_MPTHEADER_sized_member( PanEnv.nSustainEnd , uint8 , PSE. ) +WRITE_MPTHEADER_sized_member( PitchEnv.nLoopStart , uint8 , PiLS ) +WRITE_MPTHEADER_sized_member( PitchEnv.nLoopEnd , uint8 , PiLE ) +WRITE_MPTHEADER_sized_member( PitchEnv.nSustainStart , uint8 , PiSB ) +WRITE_MPTHEADER_sized_member( PitchEnv.nSustainEnd , uint8 , PiSE ) +WRITE_MPTHEADER_sized_member( nNNA , uint8 , NNA. ) +WRITE_MPTHEADER_sized_member( nDCT , uint8 , DCT. ) +WRITE_MPTHEADER_sized_member( nDNA , uint8 , DNA. ) +WRITE_MPTHEADER_sized_member( nPanSwing , uint8 , PS.. ) +WRITE_MPTHEADER_sized_member( nVolSwing , uint8 , VS.. ) +WRITE_MPTHEADER_sized_member( nIFC , uint8 , IFC. ) +WRITE_MPTHEADER_sized_member( nIFR , uint8 , IFR. ) +WRITE_MPTHEADER_sized_member( wMidiBank , uint16 , MB.. ) +WRITE_MPTHEADER_sized_member( nMidiProgram , uint8 , MP.. ) +WRITE_MPTHEADER_sized_member( nMidiChannel , uint8 , MC.. ) +WRITE_MPTHEADER_sized_member( nMidiDrumKey , uint8 , MDK. ) +WRITE_MPTHEADER_sized_member( nPPS , int8 , PPS. ) +WRITE_MPTHEADER_sized_member( nPPC , uint8 , PPC. ) +WRITE_MPTHEADER_array_member( VolEnv.Ticks , uint16 , VP[. , ((input->VolEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PanEnv.Ticks , uint16 , PP[. , ((input->PanEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PitchEnv.Ticks , uint16 , PiP[ , ((input->PitchEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( VolEnv.Values , uint8 , VE[. , ((input->VolEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PanEnv.Values , uint8 , PE[. , ((input->PanEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PitchEnv.Values , uint8 , PiE[ , ((input->PitchEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( NoteMap , uint8 , NM[. , 128 ) +WRITE_MPTHEADER_array_member( Keyboard , uint16 , K[.. , 128 ) WRITE_MPTHEADER_array_member( name , CHAR , n[.. , 32 ) WRITE_MPTHEADER_array_member( filename , CHAR , fn[. , 12 ) -WRITE_MPTHEADER_sized_member( nMixPlug , BYTE , MiP. ) +WRITE_MPTHEADER_sized_member( nMixPlug , uint8 , MiP. ) WRITE_MPTHEADER_sized_member( nVolRampUp , uint16 , VR.. ) -WRITE_MPTHEADER_sized_member( nResampling , USHORT , R... ) -WRITE_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) -WRITE_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) -WRITE_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) -WRITE_MPTHEADER_sized_member( nPluginVelocityHandling , BYTE , PVEH ) -WRITE_MPTHEADER_sized_member( nPluginVolumeHandling , BYTE , PVOH ) -WRITE_MPTHEADER_sized_member( wPitchToTempoLock , WORD , PTTL ) -WRITE_MPTHEADER_sized_member( PitchEnv.nReleaseNode , BYTE , PERN ) -WRITE_MPTHEADER_sized_member( PanEnv.nReleaseNode , BYTE , AERN ) -WRITE_MPTHEADER_sized_member( VolEnv.nReleaseNode , BYTE , VERN ) +WRITE_MPTHEADER_sized_member( nResampling , uint16 , R... ) +WRITE_MPTHEADER_sized_member( nCutSwing , uint8 , CS.. ) +WRITE_MPTHEADER_sized_member( nResSwing , uint8 , RS.. ) +WRITE_MPTHEADER_sized_member( nFilterMode , uint8 , FM.. ) +WRITE_MPTHEADER_sized_member( nPluginVelocityHandling , uint8 , PVEH ) +WRITE_MPTHEADER_sized_member( nPluginVolumeHandling , uint8 , PVOH ) +WRITE_MPTHEADER_sized_member( wPitchToTempoLock , uint16 , PTTL ) +WRITE_MPTHEADER_sized_member( PitchEnv.nReleaseNode , uint8 , PERN ) +WRITE_MPTHEADER_sized_member( PanEnv.nReleaseNode , uint8 , AERN ) +WRITE_MPTHEADER_sized_member( VolEnv.nReleaseNode , uint8 , VERN ) WRITE_MPTHEADER_sized_member( PitchEnv.dwFlags , DWORD , PFLG ) WRITE_MPTHEADER_sized_member( PanEnv.dwFlags , DWORD , AFLG ) WRITE_MPTHEADER_sized_member( VolEnv.dwFlags , DWORD , VFLG ) @@ -373,53 +373,53 @@ GET_MPTHEADER_sized_member( VolEnv.nNodes , UINT , VE.. ) GET_MPTHEADER_sized_member( PanEnv.nNodes , UINT , PE.. ) GET_MPTHEADER_sized_member( PitchEnv.nNodes , UINT , PiE. ) -GET_MPTHEADER_sized_member( VolEnv.nLoopStart , BYTE , VLS. ) -GET_MPTHEADER_sized_member( VolEnv.nLoopEnd , BYTE , VLE. ) -GET_MPTHEADER_sized_member( VolEnv.nSustainStart , BYTE , VSB. ) -GET_MPTHEADER_sized_member( VolEnv.nSustainEnd , BYTE , VSE. ) -GET_MPTHEADER_sized_member( PanEnv.nLoopStart , BYTE , PLS. ) -GET_MPTHEADER_sized_member( PanEnv.nLoopEnd , BYTE , PLE. ) -GET_MPTHEADER_sized_member( PanEnv.nSustainStart , BYTE , PSB. ) -GET_MPTHEADER_sized_member( PanEnv.nSustainEnd , BYTE , PSE. ) -GET_MPTHEADER_sized_member( PitchEnv.nLoopStart , BYTE , PiLS ) -GET_MPTHEADER_sized_member( PitchEnv.nLoopEnd , BYTE , PiLE ) -GET_MPTHEADER_sized_member( PitchEnv.nSustainStart , BYTE , PiSB ) -GET_MPTHEADER_sized_member( PitchEnv.nSustainEnd , BYTE , PiSE ) -GET_MPTHEADER_sized_member( nNNA , BYTE , NNA. ) -GET_MPTHEADER_sized_member( nDCT , BYTE , DCT. ) -GET_MPTHEADER_sized_member( nDNA , BYTE , DNA. ) -GET_MPTHEADER_sized_member( nPanSwing , BYTE , PS.. ) -GET_MPTHEADER_sized_member( nVolSwing , BYTE , VS.. ) -GET_MPTHEADER_sized_member( nIFC , BYTE , IFC. ) -GET_MPTHEADER_sized_member( nIFR , BYTE , IFR. ) -GET_MPTHEADER_sized_member( wMidiBank , WORD , MB.. ) -GET_MPTHEADER_sized_member( nMidiProgram , BYTE , MP.. ) -GET_MPTHEADER_sized_member( nMidiChannel , BYTE , MC.. ) -GET_MPTHEADER_sized_member( nMidiDrumKey , BYTE , MDK. ) -GET_MPTHEADER_sized_member( nPPS , signed char , PPS. ) -GET_MPTHEADER_sized_member( nPPC , unsigned char , PPC. ) -GET_MPTHEADER_array_member( VolEnv.Ticks , WORD , VP[. , MAX_ENVPOINTS ) -GET_MPTHEADER_array_member( PanEnv.Ticks , WORD , PP[. , MAX_ENVPOINTS ) -GET_MPTHEADER_array_member( PitchEnv.Ticks , WORD , PiP[ , MAX_ENVPOINTS ) -GET_MPTHEADER_array_member( VolEnv.Values , BYTE , VE[. , MAX_ENVPOINTS ) -GET_MPTHEADER_array_member( PanEnv.Values , BYTE , PE[. , MAX_ENVPOINTS ) -GET_MPTHEADER_array_member( PitchEnv.Values , BYTE , PiE[ , MAX_ENVPOINTS ) -GET_MPTHEADER_array_member( NoteMap , BYTE , NM[. , 128 ) -GET_MPTHEADER_array_member( Keyboard , WORD , K[.. , 128 ) +GET_MPTHEADER_sized_member( VolEnv.nLoopStart , uint8 , VLS. ) +GET_MPTHEADER_sized_member( VolEnv.nLoopEnd , uint8 , VLE. ) +GET_MPTHEADER_sized_member( VolEnv.nSustainStart , uint8 , VSB. ) +GET_MPTHEADER_sized_member( VolEnv.nSustainEnd , uint8 , VSE. ) +GET_MPTHEADER_sized_member( PanEnv.nLoopStart , uint8 , PLS. ) +GET_MPTHEADER_sized_member( PanEnv.nLoopEnd , uint8 , PLE. ) +GET_MPTHEADER_sized_member( PanEnv.nSustainStart , uint8 , PSB. ) +GET_MPTHEADER_sized_member( PanEnv.nSustainEnd , uint8 , PSE. ) +GET_MPTHEADER_sized_member( PitchEnv.nLoopStart , uint8 , PiLS ) +GET_MPTHEADER_sized_member( PitchEnv.nLoopEnd , uint8 , PiLE ) +GET_MPTHEADER_sized_member( PitchEnv.nSustainStart , uint8 , PiSB ) +GET_MPTHEADER_sized_member( PitchEnv.nSustainEnd , uint8 , PiSE ) +GET_MPTHEADER_sized_member( nNNA , uint8 , NNA. ) +GET_MPTHEADER_sized_member( nDCT , uint8 , DCT. ) +GET_MPTHEADER_sized_member( nDNA , uint8 , DNA. ) +GET_MPTHEADER_sized_member( nPanSwing , uint8 , PS.. ) +GET_MPTHEADER_sized_member( nVolSwing , uint8 , VS.. ) +GET_MPTHEADER_sized_member( nIFC , uint8 , IFC. ) +GET_MPTHEADER_sized_member( nIFR , uint8 , IFR. ) +GET_MPTHEADER_sized_member( wMidiBank , uint16 , MB.. ) +GET_MPTHEADER_sized_member( nMidiProgram , uint8 , MP.. ) +GET_MPTHEADER_sized_member( nMidiChannel , uint8 , MC.. ) +GET_MPTHEADER_sized_member( nMidiDrumKey , uint8 , MDK. ) +GET_MPTHEADER_sized_member( nPPS , int8 , PPS. ) +GET_MPTHEADER_sized_member( nPPC , uint8 , PPC. ) +GET_MPTHEADER_array_member( VolEnv.Ticks , uint16 , VP[. , MAX_ENVPOINTS ) +GET_MPTHEADER_array_member( PanEnv.Ticks , uint16 , PP[. , MAX_ENVPOINTS ) +GET_MPTHEADER_array_member( PitchEnv.Ticks , uint16 , PiP[ , MAX_ENVPOINTS ) +GET_MPTHEADER_array_member( VolEnv.Values , uint8 , VE[. , MAX_ENVPOINTS ) +GET_MPTHEADER_array_member( PanEnv.Values , uint8 , PE[. , MAX_ENVPOINTS ) +GET_MPTHEADER_array_member( PitchEnv.Values , uint8 , PiE[ , MAX_ENVPOINTS ) +GET_MPTHEADER_array_member( NoteMap , uint8 , NM[. , 128 ) +GET_MPTHEADER_array_member( Keyboard , uint16 , K[.. , 128 ) GET_MPTHEADER_array_member( name , CHAR , n[.. , 32 ) GET_MPTHEADER_array_member( filename , CHAR , fn[. , 12 ) -GET_MPTHEADER_sized_member( nMixPlug , BYTE , MiP. ) +GET_MPTHEADER_sized_member( nMixPlug , uint8 , MiP. ) GET_MPTHEADER_sized_member( nVolRampUp , uint16 , VR.. ) GET_MPTHEADER_sized_member( nResampling , UINT , R... ) -GET_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) -GET_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) -GET_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) -GET_MPTHEADER_sized_member( wPitchToTempoLock , WORD , PTTL ) -GET_MPTHEADER_sized_member( nPluginVelocityHandling , BYTE , PVEH ) -GET_MPTHEADER_sized_member( nPluginVolumeHandling , BYTE , PVOH ) -GET_MPTHEADER_sized_member( PitchEnv.nReleaseNode , BYTE , PERN ) -GET_MPTHEADER_sized_member( PanEnv.nReleaseNode , BYTE , AERN ) -GET_MPTHEADER_sized_member( VolEnv.nReleaseNode , BYTE , VERN ) +GET_MPTHEADER_sized_member( nCutSwing , uint8 , CS.. ) +GET_MPTHEADER_sized_member( nResSwing , uint8 , RS.. ) +GET_MPTHEADER_sized_member( nFilterMode , uint8 , FM.. ) +GET_MPTHEADER_sized_member( wPitchToTempoLock , uint16 , PTTL ) +GET_MPTHEADER_sized_member( nPluginVelocityHandling , uint8 , PVEH ) +GET_MPTHEADER_sized_member( nPluginVolumeHandling , uint8 , PVOH ) +GET_MPTHEADER_sized_member( PitchEnv.nReleaseNode , uint8 , PERN ) +GET_MPTHEADER_sized_member( PanEnv.nReleaseNode , uint8 , AERN ) +GET_MPTHEADER_sized_member( VolEnv.nReleaseNode , uint8 , VERN ) GET_MPTHEADER_sized_member(... [truncated message content] |
From: <sag...@us...> - 2011-10-30 13:12:40
|
Revision: 1128 http://modplug.svn.sourceforge.net/modplug/?rev=1128&view=rev Author: saga-games Date: 2011-10-30 13:12:33 +0000 (Sun, 30 Oct 2011) Log Message: ----------- [Fix] Rev 1124 re-introduced an unwanted behaviour (global settings were not reloaded on subtune change). [Mod] OpenMPT: Version is now 1.20.00.50 Revision Links: -------------- http://modplug.svn.sourceforge.net/modplug/?rev=1124&view=rev Modified Paths: -------------- trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-30 12:40:06 UTC (rev 1127) +++ trunk/OpenMPT/mptrack/version.h 2011-10-30 13:12:33 UTC (rev 1128) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 49 +#define VER_MINORMINOR 50 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-30 12:40:06 UTC (rev 1127) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-30 13:12:33 UTC (rev 1128) @@ -74,6 +74,55 @@ */ +// Memory class for GetLength() code +class GetLengthMemory +{ +public: + double elapsedTime; + UINT musicSpeed, musicTempo; + LONG glbVol; + vector<MODCOMMAND::PARAM> oldGlbVolSlide; + vector<MODCOMMAND::NOTE> notes; + vector<MODCOMMAND::INSTR> instr; + vector<MODCOMMAND::PARAM> oldParam; + vector<BYTE> vols; + vector<UINT> chnVols; + vector<double> patLoop; + vector<ROWINDEX> patLoopStart; + +protected: + const CSoundFile &sndFile; + +public: + + GetLengthMemory(const CSoundFile &sf) : sndFile(sf) + { + Reset(); + }; + + void Reset() + { + elapsedTime = 0.0; + musicSpeed = sndFile.m_nDefaultSpeed; + musicTempo = sndFile.m_nDefaultTempo; + glbVol = sndFile.m_nDefaultGlobalVolume; + oldGlbVolSlide.assign(sndFile.GetNumChannels(), 0); + instr.assign(sndFile.GetNumChannels(), 0); + notes.assign(sndFile.GetNumChannels(), NOTE_NONE); + vols.assign(sndFile.GetNumChannels(), 0xFF); + oldParam.assign(sndFile.GetNumChannels(), 0); + patLoop.assign(sndFile.GetNumChannels(), 0); + patLoopStart.assign(sndFile.GetNumChannels(), 0); + + chnVols.resize(sndFile.GetNumChannels()); + for(CHANNELINDEX icv = 0; icv < sndFile.GetNumChannels(); icv++) + { + chnVols[icv] = sndFile.ChnSettings[icv].nVolume; + } + } +}; + + // Get mod length in various cases. Parameters: // [in] adjustMode: See enmGetLengthResetMode for possible adjust modes. // [in] endOrder: Order which should be reached (ORDERINDEX_INVALID means whole song) @@ -96,33 +145,16 @@ // Are we trying to reach a certain pattern position? const bool hasSearchTarget = (endOrder != ORDERINDEX_INVALID && endRow != ROWINDEX_INVALID); -// -> CODE#0022 -// -> DESC="alternative BPM/Speed interpretation method" -// UINT dwElapsedTime=0, nRow=0, nCurrentPattern=0, nNextPattern=0, nPattern=Order[0]; - ROWINDEX nRow = 0; + ROWINDEX nRow = 0, nNextRow = 0; ROWINDEX nNextPatStartRow = 0; // FT2 E60 bug ORDERINDEX nCurrentOrder = 0, nNextOrder = 0; PATTERNINDEX nPattern = Order[0]; - double dElapsedTime=0.0; -// -! NEW_FEATURE#0022 - UINT nMusicSpeed = m_nDefaultSpeed, nMusicTempo = m_nDefaultTempo, nNextRow = 0; - LONG nGlbVol = m_nDefaultGlobalVolume, nOldGlbVolSlide = 0; - vector<BYTE> instr(GetNumChannels(), 0); - vector<UINT> notes(GetNumChannels(), 0); - vector<BYTE> vols(GetNumChannels(), 0xFF); - vector<BYTE> oldparam(GetNumChannels(), 0); - vector<UINT> chnvols(GetNumChannels(), 64); - vector<double> patloop(GetNumChannels(), 0); - vector<ROWINDEX> patloopstart(GetNumChannels(), 0); + + GetLengthMemory memory(*this); VisitedRowsType visitedRows; // temporary visited rows vector (so that GetLength() won't interfere with the player code if the module is playing at the same time) InitializeVisitedRows(true, &visitedRows); - for(CHANNELINDEX icv = 0; icv < GetNumChannels(); icv++) - { - chnvols[icv] = ChnSettings[icv].nVolume; - } - for (;;) { UINT nSpeedCount = 0; @@ -161,7 +193,7 @@ } else { // We haven't found the target row yet, but we found some other unplayed row... continue searching from here. - dElapsedTime = 0.0; + memory.Reset(); continue; } } @@ -179,7 +211,7 @@ } else { // We haven't found the target row yet, but we found some other unplayed row... continue searching from here. - dElapsedTime = 0.0; + memory.Reset(); continue; } } @@ -206,7 +238,7 @@ } else { // We haven't found the target row yet, but we found some other unplayed row... continue searching from here. - dElapsedTime = 0.0; + memory.Reset(); continue; } } @@ -220,7 +252,7 @@ if (!nRow) { for(UINT ipck = 0; ipck < m_nChannels; ipck++) - patloop[ipck] = dElapsedTime; + memory.patLoop[ipck] = memory.elapsedTime; } MODCHANNEL *pChn = Chn; @@ -230,12 +262,12 @@ { if((GetType() == MOD_TYPE_S3M) && (ChnSettings[nChn].dwFlags & CHN_MUTE) != 0) // not even effects are processed on muted S3M channels continue; - UINT command = p->command; - UINT param = p->param; - UINT note = p->note; - if (p->instr) { instr[nChn] = p->instr; notes[nChn] = 0; vols[nChn] = 0xFF; } - if ((note) && (note <= NOTE_MAX)) notes[nChn] = note; - if (p->volcmd == VOLCMD_VOLUME) { vols[nChn] = p->vol; } + MODCOMMAND::COMMAND command = p->command; + MODCOMMAND::PARAM param = p->param; + MODCOMMAND::NOTE note = p->note; + if (p->instr) { memory.instr[nChn] = p->instr; memory.notes[nChn] = NOTE_NONE; memory.vols[nChn] = 0xFF; } + if ((note >= NOTE_MIN) && (note <= NOTE_MAX)) memory.notes[nChn] = note; + if (p->volcmd == VOLCMD_VOLUME) { memory.vols[nChn] = p->vol; } switch(command) { // Position Jump @@ -292,7 +324,7 @@ // Allow high speed values here for VBlank MODs. (Maybe it would be better to have a "VBlank MOD" flag somewhere? Is it worth the effort?) if ((param <= GetModSpecifications().speedMax) || (m_nType & MOD_TYPE_MOD)) { - nMusicSpeed = param; + memory.musicSpeed = param; } break; // Set Tempo @@ -301,21 +333,21 @@ { if (param) pChn->nOldTempo = (BYTE)param; else param = pChn->nOldTempo; } - if (param >= 0x20) nMusicTempo = param; else + if (param >= 0x20) memory.musicTempo = param; else // Tempo Slide if ((param & 0xF0) == 0x10) { - nMusicTempo += (param & 0x0F) * (nMusicSpeed - 1); //rewbs.tempoSlideFix + memory.musicTempo += (param & 0x0F) * (memory.musicSpeed - 1); //rewbs.tempoSlideFix } else { - nMusicTempo -= (param & 0x0F) * (nMusicSpeed - 1); //rewbs.tempoSlideFix + memory.musicTempo -= (param & 0x0F) * (memory.musicSpeed - 1); //rewbs.tempoSlideFix } // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" if(IsCompatibleMode(TRK_ALLTRACKERS)) // clamp tempo correctly in compatible mode - nMusicTempo = CLAMP(nMusicTempo, 32, 255); + memory.musicTempo = CLAMP(memory.musicTempo, 32, 255); else - nMusicTempo = CLAMP(nMusicTempo, GetModSpecifications().tempoMin, GetModSpecifications().tempoMax); + memory.musicTempo = CLAMP(memory.musicTempo, GetModSpecifications().tempoMin, GetModSpecifications().tempoMax); // -! NEW_FEATURE#0010 break; // Pattern Delay @@ -324,17 +356,17 @@ if ((param & 0xF0) == 0xA0) { pChn->nOldHiOffset = param & 0x0F; break; } else if ((param & 0xF0) == 0xB0) { param &= 0x0F; param |= 0x60; } case CMD_MODCMDEX: - if ((param & 0xF0) == 0xE0) nSpeedCount = (param & 0x0F) * nMusicSpeed; else + if ((param & 0xF0) == 0xE0) nSpeedCount = (param & 0x0F) * memory.musicSpeed; else if ((param & 0xF0) == 0x60) { if (param & 0x0F) { - dElapsedTime += (dElapsedTime - patloop[nChn]) * (double)(param & 0x0F); - nNextPatStartRow = patloopstart[nChn]; // FT2 E60 bug + memory.elapsedTime += (memory.elapsedTime - memory.patLoop[nChn]) * (double)(param & 0x0F); + nNextPatStartRow = memory.patLoopStart[nChn]; // FT2 E60 bug } else { - patloop[nChn] = dElapsedTime; - patloopstart[nChn] = nRow; + memory.patLoop[nChn] = memory.elapsedTime; + memory.patLoopStart[nChn] = nRow; } } break; @@ -367,12 +399,12 @@ break; // Set Volume case CMD_VOLUME: - vols[nChn] = param; + memory.vols[nChn] = param; break; // Global Volume case CMD_GLOBALVOLUME: // ST3 applies global volume on tick 1 and does other weird things, but we won't emulate this for now. -// if((GetType() & MOD_TYPE_S3M) && nMusicSpeed <= 1) +// if((GetType() & MOD_TYPE_S3M) && memory.musicSpeed <= 1) // { // break; // } @@ -381,7 +413,7 @@ // IT compatibility 16. FT2, ST3 and IT ignore out-of-range values if (param <= 128) { - nGlbVol = param << 1; + memory.glbVol = param << 1; } break; // Global Volume Slide @@ -389,61 +421,61 @@ if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2)) { //IT compatibility 16. Global volume slide params are stored per channel (FT2/IT) - if (param) pChn->nOldGlobalVolSlide = param; else param = pChn->nOldGlobalVolSlide; + if (param) memory.oldGlbVolSlide[nChn] = param; else param = memory.oldGlbVolSlide[nChn]; } else { - if (param) nOldGlbVolSlide = param; else param = nOldGlbVolSlide; + if (param) memory.oldGlbVolSlide[0] = param; else param = memory.oldGlbVolSlide[0]; } if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { param >>= 4; if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - nGlbVol += param << 1; + memory.glbVol += param << 1; } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { param = (param & 0x0F) << 1; if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - nGlbVol -= param; + memory.glbVol -= param; } else if (param & 0xF0) { param >>= 4; param <<= 1; if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - nGlbVol += param * nMusicSpeed; + memory.glbVol += param * memory.musicSpeed; } else { param = (param & 0x0F) << 1; if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - nGlbVol -= param * nMusicSpeed; + memory.glbVol -= param * memory.musicSpeed; } - nGlbVol = CLAMP(nGlbVol, 0, 256); + memory.glbVol = CLAMP(memory.glbVol, 0, 256); break; case CMD_CHANNELVOLUME: - if (param <= 64) chnvols[nChn] = param; + if (param <= 64) memory.chnVols[nChn] = param; break; case CMD_CHANNELVOLSLIDE: - if (param) oldparam[nChn] = param; else param = oldparam[nChn]; + if (param) memory.oldParam[nChn] = param; else param = memory.oldParam[nChn]; pChn->nOldChnVolSlide = param; if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { - param = (param >> 4) + chnvols[nChn]; + param = (param >> 4) + memory.chnVols[nChn]; } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { - if (chnvols[nChn] > (int)(param & 0x0F)) param = chnvols[nChn] - (param & 0x0F); + if (memory.chnVols[nChn] > (int)(param & 0x0F)) param = memory.chnVols[nChn] - (param & 0x0F); else param = 0; } else if (param & 0x0F) { - param = (param & 0x0F) * nMusicSpeed; - param = (chnvols[nChn] > param) ? chnvols[nChn] - param : 0; - } else param = ((param & 0xF0) >> 4) * nMusicSpeed + chnvols[nChn]; + param = (param & 0x0F) * memory.musicSpeed; + param = (memory.chnVols[nChn] > param) ? memory.chnVols[nChn] - param : 0; + } else param = ((param & 0xF0) >> 4) * memory.musicSpeed + memory.chnVols[nChn]; param = min(param, 64); - chnvols[nChn] = param; + memory.chnVols[nChn] = param; break; } } @@ -456,16 +488,16 @@ nNextPatStartRow = 0; } - nSpeedCount += nMusicSpeed; + nSpeedCount += memory.musicSpeed; switch(m_nTempoMode) { case tempo_mode_alternative: - dElapsedTime += 60000.0 / (1.65625 * (double)(nMusicSpeed * nMusicTempo)); break; + memory.elapsedTime += 60000.0 / (1.65625 * (double)(memory.musicSpeed * memory.musicTempo)); break; case tempo_mode_modern: - dElapsedTime += 60000.0 / (double)nMusicTempo / (double)m_nCurrentRowsPerBeat; break; + memory.elapsedTime += 60000.0 / (double)memory.musicTempo / (double)m_nCurrentRowsPerBeat; break; case tempo_mode_classic: default: - dElapsedTime += (2500.0 * (double)nSpeedCount) / (double)nMusicTempo; + memory.elapsedTime += (2500.0 * (double)nSpeedCount) / (double)memory.musicTempo; } } @@ -474,7 +506,7 @@ retval.lastOrder = nCurrentOrder; retval.lastRow = nRow; } - retval.duration = dElapsedTime / 1000.0; + retval.duration = memory.elapsedTime / 1000.0; // Store final variables if ((adjustMode & eAdjust)) @@ -482,26 +514,36 @@ if (retval.targetReached || endOrder == ORDERINDEX_INVALID || endRow == ROWINDEX_INVALID) { // Target found, or there is no target (i.e. play whole song)... - m_nGlobalVolume = nGlbVol; - m_nOldGlbVolSlide = nOldGlbVolSlide; - m_nMusicSpeed = nMusicSpeed; - m_nMusicTempo = nMusicTempo; - for (CHANNELINDEX n = 0; n < m_nChannels; n++) + m_nGlobalVolume = memory.glbVol; + if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2)) { - Chn[n].nGlobalVol = chnvols[n]; - if (notes[n]) + //IT compatibility 16. Global volume slide params are stored per channel (FT2/IT) + for(CHANNELINDEX n = 0; n < GetNumChannels(); n++) { - Chn[n].nNewNote = notes[n]; - if(NOTE_IS_VALID(notes[n])) + Chn[n].nOldGlobalVolSlide = memory.oldGlbVolSlide[n]; + } + } else + { + m_nOldGlbVolSlide = memory.oldGlbVolSlide[0]; + } + m_nMusicSpeed = memory.musicSpeed; + m_nMusicTempo = memory.musicTempo; + for (CHANNELINDEX n = 0; n < GetNumChannels(); n++) + { + Chn[n].nGlobalVol = memory.chnVols[n]; + if (memory.notes[n]) + { + Chn[n].nNewNote = memory.notes[n]; + if(NOTE_IS_VALID(memory.notes[n])) { - Chn[n].nLastNote = notes[n]; + Chn[n].nLastNote = memory.notes[n]; } } - if (instr[n]) Chn[n].nNewIns = instr[n]; - if (vols[n] != 0xFF) + if (memory.instr[n]) Chn[n].nNewIns = memory.instr[n]; + if (memory.vols[n] != 0xFF) { - if (vols[n] > 64) vols[n] = 64; - Chn[n].nVolume = vols[n] * 4; + if (memory.vols[n] > 64) memory.vols[n] = 64; + Chn[n].nVolume = memory.vols[n] * 4; } } } else if(adjustMode != eAdjustOnSuccess) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-11-03 21:15:16
|
Revision: 1131 http://modplug.svn.sourceforge.net/modplug/?rev=1131&view=rev Author: saga-games Date: 2011-11-03 21:15:10 +0000 (Thu, 03 Nov 2011) Log Message: ----------- [Imp] When loading replacing an existing instrument, the replacing / deleting of the previously assigned samples could not be undone. [Fix] Sample length calculation for sample optimizer in cleanup dialog was wrong for samples that only have a sustain loop. [Mod] OpenMPT: Version is now 1.20.00.51 Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-10-31 21:26:59 UTC (rev 1130) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-11-03 21:15:10 UTC (rev 1131) @@ -523,9 +523,9 @@ vector<bool> samplesUsed(pSndFile->GetNumSamples() + 1, true); BeginWaitCursor(); - for (SAMPLEINDEX nSmp = pSndFile->GetNumSamples(); nSmp >= 1; nSmp--) if (pSndFile->GetSample(nSmp).pSample) + for(SAMPLEINDEX nSmp = pSndFile->GetNumSamples(); nSmp >= 1; nSmp--) if (pSndFile->GetSample(nSmp).pSample) { - if (!pSndFile->IsSampleUsed(nSmp)) + if(!pSndFile->IsSampleUsed(nSmp)) { samplesUsed[nSmp] = false; m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete); @@ -533,38 +533,38 @@ } SAMPLEINDEX nRemoved; - { - CriticalSection cs; - nRemoved = pSndFile->RemoveSelectedSamples(samplesUsed); - } + nRemoved = pSndFile->RemoveSelectedSamples(samplesUsed); - SAMPLEINDEX nExt = pSndFile->DetectUnusedSamples(samplesUsed); + const SAMPLEINDEX unusedInsSamples = pSndFile->DetectUnusedSamples(samplesUsed); EndWaitCursor(); - if (nExt && !((pSndFile->GetType() == MOD_TYPE_IT) && (pSndFile->m_dwSongFlags & SONG_ITPROJECT))) - { //We don't remove an instrument's unused samples in an ITP. + if(unusedInsSamples && !((pSndFile->GetType() == MOD_TYPE_IT) && (pSndFile->m_dwSongFlags & SONG_ITPROJECT))) + { + // We don't remove an instrument's unused samples in an ITP. wsprintf(s, "OpenMPT detected %d sample%s referenced by an instrument,\n" - "but not used in the song. Do you want to remove them?", nExt, (nExt == 1) ? "" : "s"); - if (Reporting::Confirm(s, "Sample Cleanup") == cnfYes) + "but not used in the song. Do you want to remove them?", unusedInsSamples, (unusedInsSamples == 1) ? "" : "s"); + if(Reporting::Confirm(s, "Sample Cleanup") == cnfYes) { - CriticalSection cs; - for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->GetNumSamples(); nSmp++) + nRemoved += pSndFile->RemoveSelectedSamples(samplesUsed); + // Reduce the number of sample slots if possible. + for(SAMPLEINDEX nSmp = pSndFile->GetNumSamples(); nSmp >= 1; nSmp--) { - if ((!samplesUsed[nSmp]) && (pSndFile->GetSample(nSmp).pSample)) + if(samplesUsed[nSmp]) { - m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete); - pSndFile->DestroySample(nSmp); - if ((nSmp == pSndFile->m_nSamples) && (nSmp > 1)) pSndFile->m_nSamples--; - nRemoved++; - m_pModDoc->GetSampleUndo().ClearUndo(nSmp); + pSndFile->m_nSamples = nSmp; + break; } } - wsprintf(s, "%d unused sample%s removed\n" , nRemoved, (nRemoved == 1) ? "" : "s"); - m_pModDoc->AddToLog(s); - return true; } } + + if(nRemoved > 0) + { + wsprintf(s, "%d unused sample%s removed\n" , nRemoved, (nRemoved == 1) ? "" : "s"); + m_pModDoc->AddToLog(s); + } + return (nRemoved > 0); } @@ -611,11 +611,13 @@ if(sample.uFlags & CHN_LOOP) { loopLength = sample.nLoopEnd; + + // Sustain loop is played before normal loop, and it can actually be located after the normal loop. + if(sample.uFlags & CHN_SUSTAINLOOP) + { + loopLength = max(sample.nLoopEnd, sample.nSustainEnd); + } } - if(sample.uFlags & CHN_SUSTAINLOOP) - { - loopLength = max(sample.nLoopEnd, sample.nSustainEnd); - } if (sample.nLength > loopLength + 2) { Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-10-31 21:26:59 UTC (rev 1130) +++ trunk/OpenMPT/mptrack/version.h 2011-11-03 21:15:10 UTC (rev 1131) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 50 +#define VER_MINORMINOR 51 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2011-10-31 21:26:59 UTC (rev 1130) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2011-11-03 21:15:10 UTC (rev 1131) @@ -151,35 +151,36 @@ bool CSoundFile::RemoveInstrumentSamples(INSTRUMENTINDEX nInstr) //-------------------------------------------------------------- { - vector<bool> sampleused(GetNumSamples() + 1, false); + if(Instruments[nInstr] == nullptr) + { + return false; + } - if (Instruments[nInstr]) + vector<bool> keepSamples(GetNumSamples() + 1, true); + + const MODINSTRUMENT *p = Instruments[nInstr]; + + // Check which samples are used by the instrument we are going to nuke. + for(size_t r = 0; r < CountOf(p->Keyboard); r++) { - MODINSTRUMENT *p = Instruments[nInstr]; - for (UINT r=0; r<128; r++) + SAMPLEINDEX n = p->Keyboard[r]; + if (n <= GetNumSamples()) keepSamples[n] = false; + } + + // Check if any of those samples are referenced by other instruments as well, in which case we want to keep them of course. + for(INSTRUMENTINDEX nIns = 1; nIns <= GetNumInstruments(); nIns++) if (Instruments[nIns] != nullptr && nIns != nInstr) + { + p = Instruments[nIns]; + for(size_t r = 0; r < CountOf(p->Keyboard); r++) { - UINT n = p->Keyboard[r]; - if (n <= GetNumSamples()) sampleused[n] = true; + SAMPLEINDEX n = p->Keyboard[r]; + if (n <= GetNumSamples()) keepSamples[n] = true; } - for (INSTRUMENTINDEX nIns = 1; nIns < MAX_INSTRUMENTS; nIns++) if ((Instruments[nIns]) && (nIns != nInstr)) - { - p = Instruments[nIns]; - for (UINT r=0; r<128; r++) - { - UINT n = p->Keyboard[r]; - if (n <= GetNumSamples()) sampleused[n] = false; - } - } - for (SAMPLEINDEX nSmp = 1; nSmp <= GetNumSamples(); nSmp++) if (sampleused[nSmp]) - { - CriticalSection cs; + } - DestroySample(nSmp); - strcpy(m_szNames[nSmp], ""); - } - return true; - } - return false; + // Now nuke the selected samples. + RemoveSelectedSamples(keepSamples); + return true; } //////////////////////////////////////////////////////////////////////////////// Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2011-10-31 21:26:59 UTC (rev 1130) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2011-11-03 21:15:10 UTC (rev 1131) @@ -2591,13 +2591,24 @@ { return 0; } + SAMPLEINDEX nRemoved = 0; for(SAMPLEINDEX nSmp = (SAMPLEINDEX)min(GetNumSamples(), keepSamples.size() - 1); nSmp >= 1; nSmp--) { if(!keepSamples[nSmp]) { + CriticalSection cs; + +#ifdef MODPLUG_TRACKER + if(GetpModDoc()) + { + GetpModDoc()->GetSampleUndo().PrepareUndo(nSmp, sundo_replace); + } +#endif // MODPLUG_TRACKER + if(DestroySample(nSmp)) { + strcpy(m_szNames[nSmp], ""); nRemoved++; } if((nSmp == GetNumSamples()) && (nSmp > 1)) m_nSamples--; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-11-05 15:15:57
|
Revision: 1132 http://modplug.svn.sourceforge.net/modplug/?rev=1132&view=rev Author: saga-games Date: 2011-11-05 15:15:50 +0000 (Sat, 05 Nov 2011) Log Message: ----------- [Mod] Further cleanup of mod cleanup code (lol) [Fix] When converting from IT / MPTM to other formats, the sustain loop's bidi flag is transferred. [Fix] IT Compatibility: A cutoff frequency of 0 should not be reset to "no cutoff" just because the filter envelope is enabled. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-11-03 21:15:10 UTC (rev 1131) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2011-11-05 15:15:50 UTC (rev 1132) @@ -97,7 +97,7 @@ CDialog::OnInitDialog(); for(int i = 0; i < CU_MAX_CLEANUP_OPTIONS; i++) { - CheckDlgButton(m_nCleanupIDtoDlgID[i], (m_bCheckBoxes[i]) ? MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(m_nCleanupIDtoDlgID[i], (m_bCheckBoxes[i]) ? BST_CHECKED : BST_UNCHECKED); } CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); @@ -183,17 +183,17 @@ if(hFocus == GetDlgItem(m_nCleanupIDtoDlgID[i])->m_hWnd) { // if we just unchecked it, there's nothing to verify. - if(IsDlgButtonChecked(m_nCleanupIDtoDlgID[i]) == FALSE) + if(IsDlgButtonChecked(m_nCleanupIDtoDlgID[i]) == BST_UNCHECKED) return; // now we can disable all elements that are mutually exclusive. if(m_nMutuallyExclusive[i] != CU_NONE) - CheckDlgButton(m_nCleanupIDtoDlgID[m_nMutuallyExclusive[i]], MF_UNCHECKED); + CheckDlgButton(m_nCleanupIDtoDlgID[m_nMutuallyExclusive[i]], BST_UNCHECKED); // find other elements which are mutually exclusive with the selected element. for(int j = 0; j < CU_MAX_CLEANUP_OPTIONS; j++) { if(m_nMutuallyExclusive[j] == i) - CheckDlgButton(m_nCleanupIDtoDlgID[j], MF_UNCHECKED); + CheckDlgButton(m_nCleanupIDtoDlgID[j], BST_UNCHECKED); } return; } @@ -205,50 +205,50 @@ //---------------------------------------- { // patterns - CheckDlgButton(IDC_CHK_CLEANUP_PATTERNS, MF_CHECKED); - CheckDlgButton(IDC_CHK_REMOVE_PATTERNS, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REARRANGE_PATTERNS, MF_CHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_PATTERNS, BST_CHECKED); + CheckDlgButton(IDC_CHK_REMOVE_PATTERNS, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REARRANGE_PATTERNS, BST_CHECKED); // orders - CheckDlgButton(IDC_CHK_MERGE_SEQUENCES, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REMOVE_ORDERS, MF_UNCHECKED); + CheckDlgButton(IDC_CHK_MERGE_SEQUENCES, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REMOVE_ORDERS, BST_UNCHECKED); // samples - CheckDlgButton(IDC_CHK_CLEANUP_SAMPLES, MF_CHECKED); - CheckDlgButton(IDC_CHK_REMOVE_SAMPLES, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REARRANGE_SAMPLES, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_OPTIMIZE_SAMPLES, MF_CHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_SAMPLES, BST_CHECKED); + CheckDlgButton(IDC_CHK_REMOVE_SAMPLES, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REARRANGE_SAMPLES, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_OPTIMIZE_SAMPLES, BST_CHECKED); // instruments - CheckDlgButton(IDC_CHK_CLEANUP_INSTRUMENTS, MF_CHECKED); - CheckDlgButton(IDC_CHK_REMOVE_INSTRUMENTS, MF_UNCHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_INSTRUMENTS, BST_CHECKED); + CheckDlgButton(IDC_CHK_REMOVE_INSTRUMENTS, BST_UNCHECKED); // plugins - CheckDlgButton(IDC_CHK_CLEANUP_PLUGINS, MF_CHECKED); - CheckDlgButton(IDC_CHK_REMOVE_PLUGINS, MF_UNCHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_PLUGINS, BST_CHECKED); + CheckDlgButton(IDC_CHK_REMOVE_PLUGINS, BST_UNCHECKED); // misc - CheckDlgButton(IDC_CHK_SAMPLEPACK, MF_UNCHECKED); + CheckDlgButton(IDC_CHK_SAMPLEPACK, BST_UNCHECKED); } void CModCleanupDlg::OnPresetCompoCleanup() //----------------------------------------- { // patterns - CheckDlgButton(IDC_CHK_CLEANUP_PATTERNS, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REMOVE_PATTERNS, MF_CHECKED); - CheckDlgButton(IDC_CHK_REARRANGE_PATTERNS, MF_UNCHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_PATTERNS, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REMOVE_PATTERNS, BST_CHECKED); + CheckDlgButton(IDC_CHK_REARRANGE_PATTERNS, BST_UNCHECKED); // orders - CheckDlgButton(IDC_CHK_MERGE_SEQUENCES, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REMOVE_ORDERS, MF_CHECKED); + CheckDlgButton(IDC_CHK_MERGE_SEQUENCES, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REMOVE_ORDERS, BST_CHECKED); // samples - CheckDlgButton(IDC_CHK_CLEANUP_SAMPLES, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REMOVE_SAMPLES, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REARRANGE_SAMPLES, MF_CHECKED); - CheckDlgButton(IDC_CHK_OPTIMIZE_SAMPLES, MF_UNCHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_SAMPLES, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REMOVE_SAMPLES, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REARRANGE_SAMPLES, BST_CHECKED); + CheckDlgButton(IDC_CHK_OPTIMIZE_SAMPLES, BST_UNCHECKED); // instruments - CheckDlgButton(IDC_CHK_CLEANUP_INSTRUMENTS, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REMOVE_INSTRUMENTS, MF_CHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_INSTRUMENTS, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REMOVE_INSTRUMENTS, BST_CHECKED); // plugins - CheckDlgButton(IDC_CHK_CLEANUP_PLUGINS, MF_UNCHECKED); - CheckDlgButton(IDC_CHK_REMOVE_PLUGINS, MF_CHECKED); + CheckDlgButton(IDC_CHK_CLEANUP_PLUGINS, BST_UNCHECKED); + CheckDlgButton(IDC_CHK_REMOVE_PLUGINS, BST_CHECKED); // misc - CheckDlgButton(IDC_CHK_SAMPLEPACK, MF_CHECKED); + CheckDlgButton(IDC_CHK_SAMPLEPACK, BST_CHECKED); } BOOL CModCleanupDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) @@ -352,7 +352,7 @@ CString name; // original pattern name }; -const OrigPatSettings defaultSettings = {false, 0, nullptr, 0, 0, 0, ""}; +const OrigPatSettings defaultSettings = { false, 0, nullptr, 0, 0, 0, "" }; // Remove unused patterns / rearrange patterns // If argument bRemove is true, unused patterns are removed. Else, patterns are only rearranged. @@ -409,7 +409,6 @@ nPatRemoved++; } } - cs.Leave(); // Number of unused patterns size_t nWaste = 0; @@ -420,10 +419,12 @@ if ((bRemove) && (nWaste)) { + cs.Leave(); EndWaitCursor(); wsprintf(s, "%d pattern%s present in file, but not used in the song\nDo you want to reorder the sequence list and remove these patterns?", nWaste, (nWaste == 1) ? "" : "s"); if (Reporting::Confirm(s, "Pattern Cleanup") != cnfYes) return false; BeginWaitCursor(); + cs.Enter(); } for(PATTERNINDEX i = 0; i < maxPatIndex; i++) @@ -466,7 +467,6 @@ pSndFile->Order.SetSequence(oldSequence); // Reorder patterns & Delete unused patterns - cs.Enter(); { for (PATTERNINDEX i = 0; i < maxPatIndex; i++) { @@ -496,6 +496,7 @@ pSndFile->Patterns[nPat].SetName(patternSettings[nPat].name); } } + cs.Leave(); EndWaitCursor(); if ((nPatRemoved) || (bReordered)) @@ -523,6 +524,9 @@ vector<bool> samplesUsed(pSndFile->GetNumSamples() + 1, true); BeginWaitCursor(); + + // Check if any samples are not referenced in the patterns (sample mode) or by an instrument (instrument mode). + // This doesn't check yet if a sample is referenced by an instrument, but actually unused in the patterns. for(SAMPLEINDEX nSmp = pSndFile->GetNumSamples(); nSmp >= 1; nSmp--) if (pSndFile->GetSample(nSmp).pSample) { if(!pSndFile->IsSampleUsed(nSmp)) @@ -532,8 +536,7 @@ } } - SAMPLEINDEX nRemoved; - nRemoved = pSndFile->RemoveSelectedSamples(samplesUsed); + SAMPLEINDEX nRemoved = pSndFile->RemoveSelectedSamples(samplesUsed); const SAMPLEINDEX unusedInsSamples = pSndFile->DetectUnusedSamples(samplesUsed); @@ -547,15 +550,6 @@ if(Reporting::Confirm(s, "Sample Cleanup") == cnfYes) { nRemoved += pSndFile->RemoveSelectedSamples(samplesUsed); - // Reduce the number of sample slots if possible. - for(SAMPLEINDEX nSmp = pSndFile->GetNumSamples(); nSmp >= 1; nSmp--) - { - if(samplesUsed[nSmp]) - { - pSndFile->m_nSamples = nSmp; - break; - } - } } } @@ -797,7 +791,7 @@ } } while ((pSndFile->m_nInstruments > 1) && (!pSndFile->Instruments[pSndFile->m_nInstruments])) pSndFile->m_nInstruments--; - cs.Leave(); + if (nSwap > 0) { for (PATTERNINDEX iPat = 0; iPat < pSndFile->Patterns.Size(); iPat++) if (pSndFile->Patterns[iPat]) @@ -985,17 +979,12 @@ if(pSndFile == nullptr) return false; if (pSndFile->GetNumSamples() == 0) return false; - vector<bool> keepSamples(pSndFile->GetNumSamples() + 1, false); - for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->GetNumSamples(); nSmp++) - { - m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete, 0, pSndFile->GetSample(nSmp).nLength); - } - ctrlSmp::ResetSamples(*pSndFile, ctrlSmp::SmpResetInit); - - CriticalSection cs; + vector<bool> keepSamples(pSndFile->GetNumSamples() + 1, false); pSndFile->RemoveSelectedSamples(keepSamples); + ctrlSmp::ResetSamples(*pSndFile, ctrlSmp::SmpResetInit, 1, MAX_SAMPLES - 1); + return true; } Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-11-03 21:15:10 UTC (rev 1131) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-11-05 15:15:50 UTC (rev 1132) @@ -174,8 +174,7 @@ MODCOMMAND *m = m_SndFile.Patterns[nPat]; // This is used for -> MOD/XM conversion - vector<vector<MODCOMMAND::PARAM> > cEffectMemory; - cEffectMemory.resize(GetNumChannels()); + vector<vector<MODCOMMAND::PARAM> > cEffectMemory(GetNumChannels()); for(size_t i = 0; i < GetNumChannels(); i++) { cEffectMemory[i].resize(MAX_EFFECTS, 0); @@ -294,6 +293,13 @@ sample.nLoopStart = sample.nSustainStart; sample.nLoopEnd = sample.nSustainEnd; sample.uFlags |= CHN_LOOP; + if(sample.uFlags & CHN_PINGPONGSUSTAIN) + { + sample.uFlags |= CHN_PINGPONGLOOP; + } else + { + sample.uFlags &= ~CHN_PINGPONGLOOP; + } CHANGEMODTYPE_WARNING(wSampleSustainLoops); } sample.nSustainStart = sample.nSustainEnd = 0; Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2011-11-03 21:15:10 UTC (rev 1131) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2011-11-05 15:15:50 UTC (rev 1132) @@ -95,7 +95,7 @@ }; #pragma pack() -static BYTE imf_efftrans[] = +static BYTE imfEffects[] = { CMD_NONE, CMD_SPEED, // 0x01 1xx Set Tempo @@ -145,8 +145,8 @@ CMD_NONE, // 0x23 Zxx Reverb - XXX }; -static void import_imf_effect(MODCOMMAND *note) -//--------------------------------------------- +static void ImportIMFEffect(MODCOMMAND *note) +//------------------------------------------- { uint8 n; // fix some of them @@ -232,7 +232,7 @@ note->param = n | (note->param & 0xf); break; } - note->command = (note->command < 0x24) ? imf_efftrans[note->command] : CMD_NONE; + note->command = (note->command < CountOf(imfEffects)) ? imfEffects[note->command] : CMD_NONE; if (note->command == CMD_VOLUME && note->volcmd == VOLCMD_NONE) { note->volcmd = VOLCMD_VOLUME; @@ -242,8 +242,8 @@ } } -static void load_imf_envelope(INSTRUMENTENVELOPE *env, const IMFINSTRUMENT *imfins, const int e) -//---------------------------------------------------------------------------------------------- +static void LoadIMFEnvelope(INSTRUMENTENVELOPE *env, const IMFINSTRUMENT *imfins, const int e) +//-------------------------------------------------------------------------------------------- { UINT min = 0; // minimum tick value for next node const int shift = (e == IMF_ENV_VOL) ? 0 : 2; @@ -272,10 +272,9 @@ IMFHEADER hdr; MODSAMPLE *pSample = Samples + 1; WORD firstsample = 1; // first pSample for the current instrument - uint32 ignore_channels = 0; // bit set for each channel that's completely disabled + vector<bool> ignoreChannels(32, false); // bit set for each channel that's completely disabled ASSERT_CAN_READ(sizeof(IMFHEADER)); - memset(&hdr, 0, sizeof(IMFHEADER)); memcpy(&hdr, lpStream, sizeof(IMFHEADER)); dwMemPos = sizeof(IMFHEADER); @@ -284,7 +283,7 @@ hdr.insnum = LittleEndianW(hdr.insnum); hdr.flags = LittleEndianW(hdr.flags); - if (memcmp(hdr.im10, "IM10", 4) != 0) + if(memcmp(hdr.im10, "IM10", 4) != 0) return false; m_nType = MOD_TYPE_IMF; @@ -326,7 +325,7 @@ break; case 2: // disabled ChnSettings[nChn].dwFlags |= CHN_MUTE; - ignore_channels |= (1 << nChn); + ignoreChannels[nChn] = true; break; default: // uhhhh.... freak out //fprintf(stderr, "imf: channel %d has unknown status %d\n", n, hdr.channels[n].status); @@ -376,7 +375,8 @@ ASSERT_CAN_READ(1); mask = *((BYTE *)(lpStream + dwMemPos)); dwMemPos += 1; - if (mask == 0) { + if (mask == 0) + { row++; row_data += m_nChannels; continue; @@ -384,7 +384,7 @@ channel = mask & 0x1f; - if(ignore_channels & (1 << channel)) + if(ignoreChannels[channel]) { /* should do this better, i.e. not go through the whole process of deciding what to do with the effects since they're just being thrown out */ @@ -474,7 +474,7 @@ dwMemPos += 2; } if(note->command) - import_imf_effect(note); + ImportIMFEffect(note); } } @@ -484,7 +484,6 @@ IMFINSTRUMENT imfins; MODINSTRUMENT *pIns; ASSERT_CAN_READ(sizeof(IMFINSTRUMENT)); - memset(&imfins, 0, sizeof(IMFINSTRUMENT)); memcpy(&imfins, lpStream + dwMemPos, sizeof(IMFINSTRUMENT)); dwMemPos += sizeof(IMFINSTRUMENT); m_nInstruments++; @@ -520,9 +519,9 @@ pIns->nFadeOut = imfins.fadeout; - load_imf_envelope(&pIns->VolEnv, &imfins, IMF_ENV_VOL); - load_imf_envelope(&pIns->PanEnv, &imfins, IMF_ENV_PAN); - load_imf_envelope(&pIns->PitchEnv, &imfins, IMF_ENV_FILTER); + LoadIMFEnvelope(&pIns->VolEnv, &imfins, IMF_ENV_VOL); + LoadIMFEnvelope(&pIns->PanEnv, &imfins, IMF_ENV_PAN); + LoadIMFEnvelope(&pIns->PitchEnv, &imfins, IMF_ENV_FILTER); if((pIns->PitchEnv.dwFlags & ENV_ENABLED) != 0) pIns->PitchEnv.dwFlags |= ENV_FILTER; @@ -536,7 +535,6 @@ IMFSAMPLE imfsmp; uint32 blen; ASSERT_CAN_READ(sizeof(IMFSAMPLE)); - memset(&imfsmp, 0, sizeof(IMFSAMPLE)); memcpy(&imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE)); dwMemPos += sizeof(IMFSAMPLE); m_nSamples++; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-11-03 21:15:10 UTC (rev 1131) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-11-05 15:15:50 UTC (rev 1132) @@ -761,10 +761,14 @@ pChn->VolEnv.flags = pIns->VolEnv.dwFlags; pChn->PanEnv.flags = pIns->PanEnv.dwFlags; pChn->PitchEnv.flags = pIns->PitchEnv.dwFlags; - if ((pIns->PitchEnv.dwFlags & ENV_ENABLED) && (pIns->PitchEnv.dwFlags & ENV_FILTER)) + + // A cutoff frequency of 0 should not be reset just because the filter envelope is enabled. + // Test case: FilterEnvReset.it + if ((pIns->PitchEnv.dwFlags & (ENV_ENABLED | ENV_FILTER)) == (ENV_ENABLED | ENV_FILTER) && !IsCompatibleMode(TRK_IMPULSETRACKER)) { if (!pChn->nCutOff) pChn->nCutOff = 0x7F; } + if (pIns->IsCutoffEnabled()) pChn->nCutOff = pIns->GetCutoff(); if (pIns->IsResonanceEnabled()) pChn->nResonance = pIns->GetResonance(); } Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2011-11-03 21:15:10 UTC (rev 1131) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2011-11-05 15:15:50 UTC (rev 1132) @@ -217,12 +217,27 @@ } -void ResetSamples(CSoundFile &rSndFile, ResetFlag resetflag) -//---------------------------------------------------------- +void ResetSamples(CSoundFile &rSndFile, ResetFlag resetflag, SAMPLEINDEX minSample, SAMPLEINDEX maxSample) +//-------------------------------------------------------------------------------------------------------- { - const UINT nSamples = rSndFile.GetNumSamples(); - for(UINT i = 1; i <= nSamples; i++) + if(minSample == SAMPLEINDEX_INVALID) { + minSample = 1; + } + if(maxSample == SAMPLEINDEX_INVALID) + { + maxSample = rSndFile.GetNumSamples(); + } + Limit(minSample, SAMPLEINDEX(1), SAMPLEINDEX(MAX_SAMPLES - 1)); + Limit(maxSample, SAMPLEINDEX(1), SAMPLEINDEX(MAX_SAMPLES - 1)); + + if(minSample > maxSample) + { + std::swap(minSample, maxSample); + } + + for(SAMPLEINDEX i = minSample; i <= maxSample; i++) + { MODSAMPLE &sample = rSndFile.GetSample(i); switch(resetflag) { @@ -492,6 +507,51 @@ template <class T> +bool EnableSmartSampleRampingImpl(const T* pSample, const SmpLength smpCount) +//--------------------------------------------------------------------------- +{ + const T upperThreshold = (std::numeric_limits<T>::max)() / 2; // >= 50% + const T lowerThreshold = (std::numeric_limits<T>::max)() / 40; // <= 2.5% + + // Count backwards for a weighted mean (first samples have the most significant weight). + T average = pSample[smpCount - 1]; + for(SmpLength i = smpCount; i > 0; i--) + { + T data = pSample[i - 1]; + if(data < 0) data = -data; + average = (data + average) / 2; + } + if(average >= upperThreshold || average <= lowerThreshold) return true; + return false; +} + +// This function detects whether to enable smart sample ramping or not, based on the initial DC offset. +// If the DC offset is very high (>= 50%), we can assume that it is somehow intentional (imagine f.e. a typical square waveform sample). +// On the other side, if the initial DC offset is very low (<= 2.5%), we do not need to apply ramping, so we can retain the punch of properly aligned samples. +// Eventually, ramping will (hopefully) only be performed on "bad" samples. +// The function returns true if ramping should be forced off, false if it can stay enabled. +// TODO: It would be a lot nicer if this would pre-normalize samples. +bool EnableSmartSampleRamping(const MODSAMPLE &smp, SmpLength sampleOffset, const CSoundFile *pSndFile) +//----------------------------------------------------------------------------------------------------- +{ + // First two sample points are supposed to be 0 for unlooped MOD samples, so don't take them into account. + if((smp.uFlags & CHN_LOOP) && (pSndFile->GetType() & MOD_TYPE_MOD) && sampleOffset == 0) sampleOffset = 2; + + // Just look at the first four samples, starting from the given offset. + sampleOffset = min(sampleOffset, smp.nLength); + const SmpLength smpCount = min(4, smp.nLength - sampleOffset) * smp.GetNumChannels(); + + if(smp.pSample == nullptr || smpCount == 0) return false; + if(smp.GetElementarySampleSize() == 2) + return EnableSmartSampleRampingImpl(reinterpret_cast<int16*>(smp.pSample) + sampleOffset, smpCount); + else if(smp.GetElementarySampleSize() == 1) + return EnableSmartSampleRampingImpl(reinterpret_cast<int8*>(smp.pSample) + sampleOffset, smpCount); + else + return false; +} + + +template <class T> void XFadeSampleImpl(T* pStart, const SmpLength nOffset, SmpLength nFadeLength) //----------------------------------------------------------------------------- { Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2011-11-03 21:15:10 UTC (rev 1131) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2011-11-05 15:15:50 UTC (rev 1132) @@ -39,7 +39,7 @@ inline SmpLength GetSampleCapacity(MODSAMPLE &smp) {return smp.GetSampleSizeInBytes();} // Resets samples. -void ResetSamples(CSoundFile &rSndFile, ResetFlag resetflag); +void ResetSamples(CSoundFile &rSndFile, ResetFlag resetflag, SAMPLEINDEX minSample = SAMPLEINDEX_INVALID, SAMPLEINDEX maxSample = SAMPLEINDEX_INVALID); // Remove DC offset and normalize. // Return: If DC offset was removed, returns original offset value, zero otherwise. @@ -51,6 +51,9 @@ // Volume adjustment is not done if this param is MOD_TYPE_NONE. CSoundFile* const pSndFile); // Passed to AdjustEndOfSample. +// Amplify / fade sample data +bool AmplifySample(MODSAMPLE &smp, SmpLength iStart, SmpLength iEnd, CSoundFile *pSndFile, double amplifyStart, double amplifyEnd); + // Reverse sample data bool ReverseSample(MODSAMPLE &smp, SmpLength iStart, SmpLength iEnd, CSoundFile *pSndFile); @@ -60,6 +63,9 @@ // Invert sample data (flip by 180 degrees) bool InvertSample(MODSAMPLE &smp, SmpLength iStart, SmpLength iEnd, CSoundFile *pSndFile); +// Detect whether to enable smart sample ramping. +bool EnableSmartSampleRamping(const MODSAMPLE &smp, SmpLength sampleOffset, const CSoundFile *pSndFile); + // Crossfade sample data to create smooth loops bool XFadeSample(MODSAMPLE &smp, SmpLength iFadeLength, CSoundFile *pSndFile); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |