|
From: <sag...@us...> - 2011-09-28 20:53:27
|
Revision: 1063
http://modplug.svn.sourceforge.net/modplug/?rev=1063&view=rev
Author: saga-games
Date: 2011-09-28 20:53:21 +0000 (Wed, 28 Sep 2011)
Log Message:
-----------
[Ref] MODCHANNEL: nRowNote, nRowInstr, nRowVolCmd, nRowVolume, nRowCommand, nRowParam => rowCommand, m_plugInitialParamValue => m_plugParamTargetValue
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-09-28 20:37:39 UTC (rev 1062)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-09-28 20:53:21 UTC (rev 1063)
@@ -902,7 +902,7 @@
if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
|| ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
- || ((m_dwSongFlags & SONG_ITCOMPATGXX) && (pChn->nRowInstr)))
+ || ((m_dwSongFlags & SONG_ITCOMPATGXX) && (pChn->rowCommand.instr)))
{
if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
{
@@ -916,9 +916,9 @@
pChn->dwFlags &= ~CHN_NOTEFADE;
pChn->nFadeOutVol = 65536;
}
- if ((!bPorta) || (!(m_dwSongFlags & SONG_ITCOMPATGXX)) || (pChn->nRowInstr))
+ if ((!bPorta) || (!(m_dwSongFlags & SONG_ITCOMPATGXX)) || (pChn->rowCommand.instr))
{
- if ((!(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) || (pChn->nRowInstr))
+ if ((!(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) || (pChn->rowCommand.instr))
{
pChn->dwFlags &= ~CHN_NOTEFADE;
pChn->nFadeOutVol = 65536;
@@ -1301,11 +1301,11 @@
// -! NEW_FEATURE#0010
for (CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++, pChn++)
{
- UINT instr = pChn->nRowInstr;
- UINT volcmd = pChn->nRowVolCmd;
- UINT vol = pChn->nRowVolume;
- UINT cmd = pChn->nRowCommand;
- UINT param = pChn->nRowParam;
+ UINT instr = pChn->rowCommand.instr;
+ UINT volcmd = pChn->rowCommand.volcmd;
+ UINT vol = pChn->rowCommand.vol;
+ UINT cmd = pChn->rowCommand.command;
+ UINT param = pChn->rowCommand.param;
bool bPorta = ((cmd != CMD_TONEPORTAMENTO) && (cmd != CMD_TONEPORTAVOL) && (volcmd != VOLCMD_TONEPORTAMENTO)) ? false : true;
UINT nStartTick = 0;
@@ -1313,11 +1313,11 @@
pChn->dwFlags &= ~CHN_FASTVOLRAMP;
// Process parameter control note.
- if(pChn->nRowNote == NOTE_PC)
+ if(pChn->rowCommand.note == NOTE_PC)
{
- const PLUGINDEX plug = pChn->nRowInstr;
- const PlugParamIndex plugparam = MODCOMMAND::GetValueVolCol(pChn->nRowVolCmd, pChn->nRowVolume);
- const PlugParamValue value = MODCOMMAND::GetValueEffectCol(pChn->nRowCommand, pChn->nRowParam) / PlugParamValue(MODCOMMAND::maxColumnValue);
+ const PLUGINDEX plug = pChn->rowCommand.instr;
+ const PlugParamIndex plugparam = MODCOMMAND::GetValueVolCol(pChn->rowCommand.volcmd, pChn->rowCommand.vol);
+ const PlugParamValue value = MODCOMMAND::GetValueEffectCol(pChn->rowCommand.command, pChn->rowCommand.param) / PlugParamValue(MODCOMMAND::maxColumnValue);
if(plug > 0 && plug <= MAX_MIXPLUGINS && m_MixPlugins[plug-1].pMixPlugin)
m_MixPlugins[plug-1].pMixPlugin->SetParameter(plugparam, value);
@@ -1329,30 +1329,27 @@
// the need for parameter control. The condition cmd == 0
// is to make sure that m_nPlugParamValueStep != 0 because
// of NOTE_PCS, not because of macro.
- if(pChn->nRowNote == NOTE_PCS || (cmd == 0 && pChn->m_plugParamValueStep != 0))
+ if(pChn->rowCommand.note == NOTE_PCS || (cmd == CMD_NONE && pChn->m_plugParamValueStep != 0))
{
const bool isFirstTick = (m_dwSongFlags & SONG_FIRSTTICK) != 0;
if(isFirstTick)
- pChn->m_RowPlug = pChn->nRowInstr;
+ pChn->m_RowPlug = pChn->rowCommand.instr;
const PLUGINDEX nPlug = pChn->m_RowPlug;
const bool hasValidPlug = (nPlug > 0 && nPlug <= MAX_MIXPLUGINS && m_MixPlugins[nPlug-1].pMixPlugin);
if(hasValidPlug)
{
if(isFirstTick)
- pChn->m_RowPlugParam = MODCOMMAND::GetValueVolCol(pChn->nRowVolCmd, pChn->nRowVolume);
+ pChn->m_RowPlugParam = MODCOMMAND::GetValueVolCol(pChn->rowCommand.volcmd, pChn->rowCommand.vol);
const PlugParamIndex plugparam = pChn->m_RowPlugParam;
if(isFirstTick)
{
- PlugParamValue targetvalue = MODCOMMAND::GetValueEffectCol(pChn->nRowCommand, pChn->nRowParam) / PlugParamValue(MODCOMMAND::maxColumnValue);
- // Hack: Use m_nPlugInitialParamValue to store the target value, not initial.
- pChn->m_plugInitialParamValue = targetvalue;
- pChn->m_plugParamValueStep = (targetvalue - m_MixPlugins[nPlug-1].pMixPlugin->GetParameter(plugparam)) / float(m_nMusicSpeed);
+ PlugParamValue targetvalue = MODCOMMAND::GetValueEffectCol(pChn->rowCommand.command, pChn->rowCommand.param) / PlugParamValue(MODCOMMAND::maxColumnValue);
+ pChn->m_plugParamTargetValue = targetvalue;
+ pChn->m_plugParamValueStep = (targetvalue - m_MixPlugins[nPlug-1].pMixPlugin->GetParameter(plugparam)) / float(GetNumTicksOnCurrentRow());
}
if(m_nTickCount + 1 == GetNumTicksOnCurrentRow())
{ // On last tick, set parameter exactly to target value.
- // Note: m_nPlugInitialParamValue is used to store the target value,
- // not the initial value as the name suggests.
- m_MixPlugins[nPlug-1].pMixPlugin->SetParameter(plugparam, pChn->m_plugInitialParamValue);
+ m_MixPlugins[nPlug-1].pMixPlugin->SetParameter(plugparam, pChn->m_plugParamTargetValue);
}
else
m_MixPlugins[nPlug-1].pMixPlugin->ModifyParameter(plugparam, pChn->m_plugParamValueStep);
@@ -1361,7 +1358,7 @@
// Apart from changing parameters, parameter control notes are intended to be 'invisible'.
// To achieve this, clearing the note data so that rest of the process sees the row as empty row.
- if(MODCOMMAND::IsPcNote(pChn->nRowNote))
+ if(MODCOMMAND::IsPcNote(pChn->rowCommand.note))
{
pChn->ClearRowCmd();
instr = 0;
@@ -1438,7 +1435,7 @@
// Handles note/instrument/volume changes
if (m_nTickCount == nStartTick) // can be delayed by a note delay effect
{
- UINT note = pChn->nRowNote;
+ UINT note = pChn->rowCommand.note;
if (instr) pChn->nNewIns = instr;
bool retrigEnv = (!note) && (instr);
@@ -2965,7 +2962,7 @@
case 0xA0: if(m_dwSongFlags & SONG_FIRSTTICK)
{
pChn->nOldHiOffset = param;
- if (!IsCompatibleMode(TRK_IMPULSETRACKER) && (pChn->nRowNote != NOTE_NONE) && NOTE_IS_VALID(pChn->nRowNote))
+ if (!IsCompatibleMode(TRK_IMPULSETRACKER) && (pChn->rowCommand.note != NOTE_NONE) && NOTE_IS_VALID(pChn->rowCommand.note))
{
DWORD pos = param << 16;
if (pos < pChn->nLength) pChn->nPos = pos;
@@ -3451,7 +3448,7 @@
}
// -! NEW_FEATURE#0010
- if ((pChn->nRowNote >= NOTE_MIN) && (pChn->nRowNote <= NOTE_MAX))
+ if ((pChn->rowCommand.note >= NOTE_MIN) && (pChn->rowCommand.note <= NOTE_MAX))
{
// XM compatibility: Portamento + Offset = Ignore offset
if(bPorta && IsCompatibleMode(TRK_FASTTRACKER2))
@@ -3510,7 +3507,7 @@
//IT compatibility 15. Retrigger
if(IsCompatibleMode(TRK_IMPULSETRACKER))
{
- if ((m_dwSongFlags & SONG_FIRSTTICK) && pChn->nRowNote)
+ if ((m_dwSongFlags & SONG_FIRSTTICK) && pChn->rowCommand.note)
{
pChn->nRetrigCount = param & 0xf;
}
@@ -3525,13 +3522,13 @@
if(m_dwSongFlags & SONG_FIRSTTICK)
{
// here are some really stupid things FT2 does
- if(pChn->nRowVolCmd == VOLCMD_VOLUME) return;
- if(pChn->nRowInstr > 0 && pChn->nRowNote == NOTE_NONE) nRetrigCount = 1;
- if(pChn->nRowNote != NOTE_NONE && pChn->nRowNote <= GetModSpecifications().noteMax) nRetrigCount++;
+ if(pChn->rowCommand.volcmd == VOLCMD_VOLUME) return;
+ if(pChn->rowCommand.instr > 0 && pChn->rowCommand.note == NOTE_NONE) nRetrigCount = 1;
+ if(pChn->rowCommand.note != NOTE_NONE && pChn->rowCommand.note <= GetModSpecifications().noteMax) nRetrigCount++;
}
if (nRetrigCount >= nRetrigSpeed)
{
- if (!(m_dwSongFlags & SONG_FIRSTTICK) || (pChn->nRowNote == NOTE_NONE))
+ if (!(m_dwSongFlags & SONG_FIRSTTICK) || (pChn->rowCommand.note == NOTE_NONE))
{
bDoRetrig = true;
nRetrigCount = 0;
@@ -3549,7 +3546,7 @@
{
int realspeed = nRetrigSpeed;
// FT2 bug: if a retrig (Rxy) occours together with a volume command, the first retrig interval is increased by one tick
- if ((param & 0x100) && (pChn->nRowVolCmd == VOLCMD_VOLUME) && (pChn->nRowParam & 0xF0)) realspeed++;
+ if ((param & 0x100) && (pChn->rowCommand.volcmd == VOLCMD_VOLUME) && (pChn->rowCommand.param & 0xF0)) realspeed++;
if (!(m_dwSongFlags & SONG_FIRSTTICK) || (param & 0x100))
{
if (!realspeed) realspeed = 1;
@@ -3558,7 +3555,7 @@
} else if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) nRetrigCount = 0;
if (nRetrigCount >= realspeed)
{
- if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = true;
+ if ((m_nTickCount) || ((param & 0x100) && (!pChn->rowCommand.note))) bDoRetrig = true;
}
}
}
@@ -3571,7 +3568,7 @@
int vol = pChn->nVolume;
// XM compatibility: Retrig + volume will not change volume of retrigged notes
- if(!IsCompatibleMode(TRK_FASTTRACKER2) || !(pChn->nRowVolCmd == VOLCMD_VOLUME))
+ if(!IsCompatibleMode(TRK_FASTTRACKER2) || !(pChn->rowCommand.volcmd == VOLCMD_VOLUME))
{
if (retrigTable1[dv])
vol = (vol * retrigTable1[dv]) >> 4;
@@ -3590,9 +3587,9 @@
bool bResetEnv = false;
if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))
{
- if ((pChn->nRowInstr) && (param < 0x100))
+ if ((pChn->rowCommand.instr) && (param < 0x100))
{
- InstrumentChange(pChn, pChn->nRowInstr, false, false);
+ InstrumentChange(pChn, pChn->rowCommand.instr, false, false);
bResetEnv = true;
}
if (param < 0x100) bResetEnv = true;
@@ -3603,7 +3600,7 @@
{
ProcessMidiOut(nChn, pChn); //Send retrig to Midi
}
- if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!pChn->nRowNote) && (nOldPeriod)) pChn->nPeriod = nOldPeriod;
+ if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!pChn->rowCommand.note) && (nOldPeriod)) pChn->nPeriod = nOldPeriod;
if (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) nRetrigCount = 0;
// IT compatibility: see previous IT compatibility comment =)
if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPos = pChn->nPosLo = 0;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2011-09-28 20:37:39 UTC (rev 1062)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2011-09-28 20:53:21 UTC (rev 1063)
@@ -301,19 +301,18 @@
BYTE nCutOff, nResonance;
BYTE nTremorCount, nTremorParam;
BYTE nPatternLoopCount;
- BYTE nRowNote, nRowInstr;
- BYTE nRowVolCmd, nRowVolume;
- BYTE nRowCommand, nRowParam;
BYTE nLeftVU, nRightVU;
BYTE nActiveMacro, nFilterMode;
BYTE nEFxSpeed, nEFxDelay; // memory for Invert Loop (EFx, .MOD only)
+ MODCOMMAND rowCommand;
+
//NOTE_PCs memory.
uint16 m_RowPlugParam;
- float m_plugParamValueStep, m_plugInitialParamValue;
+ float m_plugParamValueStep, m_plugParamTargetValue;
PLUGINDEX m_RowPlug;
- void ClearRowCmd() {nRowNote = NOTE_NONE; nRowInstr = 0; nRowVolCmd = VOLCMD_NONE; nRowVolume = 0; nRowCommand = CMD_NONE; nRowParam = 0;}
+ void ClearRowCmd() { rowCommand = MODCOMMAND::Empty(); }
typedef UINT VOLUME;
VOLUME GetVSTVolume() {return (pModInstrument) ? pModInstrument->nGlobalVol * 4 : nVolume;}
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2011-09-28 20:37:39 UTC (rev 1062)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2011-09-28 20:53:21 UTC (rev 1063)
@@ -851,7 +851,7 @@
m_nNextRow = 0;
// FT2 idiosyncrasy: When E60 is used on a pattern row x, the following pattern also starts from row x
- // instead of the beginning of the pattern, unless there was a Dxx or Cxx effect.
+ // instead of the beginning of the pattern, unless there was a Bxx or Dxx effect.
if(IsCompatibleMode(TRK_FASTTRACKER2))
{
m_nNextRow = m_nNextPatStartRow;
@@ -863,12 +863,7 @@
MODCOMMAND *m = Patterns[m_nPattern].GetRow(m_nRow);
for (CHANNELINDEX nChn=0; nChn<m_nChannels; pChn++, nChn++, m++)
{
- pChn->nRowNote = m->note;
- pChn->nRowInstr = m->instr;
- pChn->nRowVolCmd = m->volcmd;
- pChn->nRowVolume = m->vol;
- pChn->nRowCommand = m->command;
- pChn->nRowParam = m->param;
+ pChn->rowCommand = *m;
pChn->nLeftVol = pChn->nNewLeftVol;
pChn->nRightVol = pChn->nNewRightVol;
@@ -918,26 +913,22 @@
void CSoundFile::ProcessVolumeSwing(MODCHANNEL *pChn, int &vol)
//-------------------------------------------------------------
{
- if(pChn->nVolSwing)
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
{
- if(IsCompatibleMode(TRK_IMPULSETRACKER))
- {
- vol += pChn->nVolSwing;
- Limit(vol, 0, 64);
- } else if(GetModFlag(MSF_OLDVOLSWING))
- {
- vol += pChn->nVolSwing;
- Limit(vol, 0, 256);
- }
- else
- {
- pChn->nVolume += pChn->nVolSwing;
- pChn->nVolume = CLAMP(pChn->nVolume, 0, 256);
- vol = pChn->nVolume;
- pChn->nVolSwing = 0;
- Limit(vol, 0, 256);
- }
+ vol += pChn->nVolSwing;
+ Limit(vol, 0, 64);
+ } else if(GetModFlag(MSF_OLDVOLSWING))
+ {
+ vol += pChn->nVolSwing;
+ Limit(vol, 0, 256);
}
+ else
+ {
+ pChn->nVolume += pChn->nVolSwing;
+ Limit(pChn->nVolume, 0, 256);
+ vol = pChn->nVolume;
+ pChn->nVolSwing = 0;
+ }
}
@@ -947,6 +938,7 @@
if(IsCompatibleMode(TRK_IMPULSETRACKER) || GetModFlag(MSF_OLDVOLSWING))
{
pChn->nRealPan = pChn->nPan + pChn->nPanSwing;
+ Limit(pChn->nRealPan, 0, 256);
} else
{
pChn->nPan += pChn->nPanSwing;
@@ -954,7 +946,6 @@
pChn->nPanSwing = 0;
pChn->nRealPan = pChn->nPan;
}
- Limit(pChn->nRealPan, 0, 256);
}
@@ -2041,7 +2032,7 @@
// vol is 14-bits
if (vol)
{
- int insVol = pChn->nInsVol; // This is the "SV" value in ITTECH.TXT
+ int insVol = pChn->nInsVol; // This is the "SV * IV" value in ITTECH.TXT
if(IsCompatibleMode(TRK_IMPULSETRACKER))
{
ProcessVolumeSwing(pChn, insVol);
@@ -2390,14 +2381,14 @@
//ProcessMIDIMacro(nChn, false, m_MidiCfg.szMidiGlb[MIDIOUT_PAN]);
//ProcessMIDIMacro(nChn, false, m_MidiCfg.szMidiGlb[MIDIOUT_VOLUME]);
- if(pChn->nRowCommand == CMD_MIDI || pChn->nRowCommand == CMD_SMOOTHMIDI)
+ if(pChn->rowCommand.command == CMD_MIDI || pChn->rowCommand.command == CMD_SMOOTHMIDI)
{
// Only smooth MIDI macros are processed on every tick
//if((pChn->nRowCommand == CMD_MIDI) && !(m_dwSongFlags & SONG_FIRSTTICK)) return;
- if(pChn->nRowParam < 0x80)
- ProcessMIDIMacro(nChn, (pChn->nRowCommand == CMD_SMOOTHMIDI), m_MidiCfg.szMidiSFXExt[pChn->nActiveMacro], pChn->nRowParam);
+ if(pChn->rowCommand.param < 0x80)
+ ProcessMIDIMacro(nChn, (pChn->rowCommand.command == CMD_SMOOTHMIDI), m_MidiCfg.szMidiSFXExt[pChn->nActiveMacro], pChn->rowCommand.param);
else
- ProcessMIDIMacro(nChn, (pChn->nRowCommand == CMD_SMOOTHMIDI), m_MidiCfg.szMidiZXXExt[(pChn->nRowParam & 0x7F)], 0);
+ ProcessMIDIMacro(nChn, (pChn->rowCommand.command == CMD_SMOOTHMIDI), m_MidiCfg.szMidiZXXExt[(pChn->rowCommand.param & 0x7F)], 0);
}
}
}
@@ -2414,10 +2405,10 @@
if ((!m_nInstruments) || (m_nPattern >= Patterns.Size())
|| (m_nRow >= Patterns[m_nPattern].GetNumRows()) || (!Patterns[m_nPattern])) return;
- const MODCOMMAND::NOTE note = pChn->nRowNote;
- const MODCOMMAND::INSTR instr = pChn->nRowInstr;
- const MODCOMMAND::VOL vol = pChn->nRowVolume;
- const MODCOMMAND::VOLCMD volcmd = pChn->nRowVolCmd;
+ const MODCOMMAND::NOTE note = pChn->rowCommand.note;
+ const MODCOMMAND::INSTR instr = pChn->rowCommand.instr;
+ const MODCOMMAND::VOL vol = pChn->rowCommand.vol;
+ const MODCOMMAND::VOLCMD volcmd = pChn->rowCommand.volcmd;
// Debug
{
// Previously this function took modcommand directly from pattern. ASSERT is there
@@ -2451,15 +2442,15 @@
if (pIns && (pIns->dwFlags & INS_MUTE)) return;
}
- // Do couldn't find a valid plugin
+ // Couldn't find a valid plugin
if (pPlugin == nullptr) return;
if(GetModFlag(MSF_MIDICC_BUGEMULATION))
{
- if(note)
+ if(note != NOTE_NONE)
{
MODCOMMAND::NOTE realNote = note;
- if((note >= NOTE_MIN) && (note <= NOTE_MAX))
+ if(NOTE_IS_VALID(note))
realNote = pIns->NoteMap[note - 1];
pPlugin->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, realNote, pChn->nVolume, nChn);
} else if (volcmd == VOLCMD_VOLUME)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|