|
From: <rel...@us...> - 2008-08-22 18:08:48
|
Revision: 221
http://modplug.svn.sourceforge.net/modplug/?rev=221&view=rev
Author: relabsoluness
Date: 2008-08-22 18:08:38 +0000 (Fri, 22 Aug 2008)
Log Message:
-----------
[New] Experimental parameter control 'notes' for controlling plug params(only in MPTm). Is more or less fully functional with the big exception that there's no saving or loading. Among other things, includes modifications/additions to: keyshortcuts, various GUI components, pattern draw methods, clipboard handling, pattern editing functions, ProcessEffects().
[Fix] Some checks added to pattern editing to prevent entering notes which are not supported by the module format.
Internal:
[Ref] Find/Replace dialog: Added enums for special items.
[Mod] Disabled keyconfig log messages which filled the debug output.
[Mod] Modification to IMixPlugin for easier parameter modification.
[Ref] Created new note name arrays and functions for populating comboboxes with note names.
[Mod] Removed constructor from modcommand and instrumentheader.
[Mod] ProcessMidiOut() now takes modcommand data from modchannel rowdata instead from pattern.
[Misc] Various smaller changes (new asserts here and there etc.)
Modified Paths:
--------------
branches/devBranch_1_17_03/mptrack/CommandSet.cpp
branches/devBranch_1_17_03/mptrack/CommandSet.h
branches/devBranch_1_17_03/mptrack/Ctrl_ins.cpp
branches/devBranch_1_17_03/mptrack/Ctrl_pat.cpp
branches/devBranch_1_17_03/mptrack/Ctrl_smp.cpp
branches/devBranch_1_17_03/mptrack/Draw_pat.cpp
branches/devBranch_1_17_03/mptrack/Modedit.cpp
branches/devBranch_1_17_03/mptrack/Mptrack.cpp
branches/devBranch_1_17_03/mptrack/Mptrack.h
branches/devBranch_1_17_03/mptrack/View_pat.cpp
branches/devBranch_1_17_03/mptrack/View_pat.h
branches/devBranch_1_17_03/mptrack/View_smp.cpp
branches/devBranch_1_17_03/mptrack/View_tre.cpp
branches/devBranch_1_17_03/mptrack/Vstplug.cpp
branches/devBranch_1_17_03/mptrack/Vstplug.h
branches/devBranch_1_17_03/mptrack/dlg_misc.cpp
branches/devBranch_1_17_03/mptrack/dlg_misc.h
branches/devBranch_1_17_03/mptrack/misc_util.h
branches/devBranch_1_17_03/mptrack/mod2midi.cpp
branches/devBranch_1_17_03/mptrack/res/view_pat.bmp
branches/devBranch_1_17_03/mptrack/test/test.cpp
branches/devBranch_1_17_03/mptrack/typedefs.h
branches/devBranch_1_17_03/mptrack/version.h
branches/devBranch_1_17_03/soundlib/LOAD_DMF.CPP
branches/devBranch_1_17_03/soundlib/Mmx_mix.cpp
branches/devBranch_1_17_03/soundlib/Snd_fx.cpp
branches/devBranch_1_17_03/soundlib/Sndfile.cpp
branches/devBranch_1_17_03/soundlib/Sndfile.h
branches/devBranch_1_17_03/soundlib/Sndmix.cpp
branches/devBranch_1_17_03/soundlib/mixplug.h
branches/devBranch_1_17_03/soundlib/modchannel.h
branches/devBranch_1_17_03/soundlib/modcommand.h
branches/devBranch_1_17_03/soundlib/modins.h
Modified: branches/devBranch_1_17_03/mptrack/CommandSet.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/CommandSet.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/CommandSet.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -5,6 +5,15 @@
#include <stdio.h>
#include <stdlib.h>
+#define ENABLE_LOGGING 0
+
+#if(ENABLE_LOGGING)
+ //
+#else
+ #define Log
+#endif
+
+
bool CCommandSet::s_bShowErrorOnUnknownKeybinding = true;
CCommandSet::CCommandSet(void)
@@ -2289,6 +2298,16 @@
commands[kcVSTGUINextPresetJump].isDummy = false;
commands[kcVSTGUINextPresetJump].Message = "Plugin preset forward jump";
+ commands[kcNotePC].UID = 1784;
+ commands[kcNotePC].isHidden = false;
+ commands[kcNotePC].isDummy = false;
+ commands[kcNotePC].Message = "Parameter control(MPTm only)";
+
+ commands[kcNotePCS].UID = 1785;
+ commands[kcNotePCS].isHidden = false;
+ commands[kcNotePCS].isDummy = false;
+ commands[kcNotePCS].Message = "Parameter control(smooth)(MPTm only)";
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
Modified: branches/devBranch_1_17_03/mptrack/CommandSet.h
===================================================================
--- branches/devBranch_1_17_03/mptrack/CommandSet.h 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/CommandSet.h 2008-08-22 18:08:38 UTC (rev 221)
@@ -431,7 +431,9 @@
kcNoteOff,
kcNoteCutOld,
kcNoteOffOld,
- kcEndNoteMisc=kcNoteOffOld,
+ kcNotePC,
+ kcNotePCS,
+ kcEndNoteMisc=kcNotePCS,
//Set instruments
Modified: branches/devBranch_1_17_03/mptrack/Ctrl_ins.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Ctrl_ins.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Ctrl_ins.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -822,11 +822,7 @@
// Pitch/Pan Separation
m_SpinPPS.SetRange(-32, +32);
// Pitch/Pan Center
- for (UINT n=0; n<=NOTE_MAX; n++)
- {
- wsprintf(s, "%s%d", szNoteNames[n % 12], n/12);
- m_ComboPPC.SetItemData(m_ComboPPC.AddString(s), n);
- }
+ AppendNotesToControl(m_ComboPPC, 0, NOTE_MAX-1);
// -> CODE#0027
// -> DESC="per-instrument volume ramping setup (refered as attack)"
Modified: branches/devBranch_1_17_03/mptrack/Ctrl_pat.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Ctrl_pat.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Ctrl_pat.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -189,11 +189,8 @@
//CHAR s[8];
CHAR s[10];
- for(int i = 0 ; i < NOTE_MAX ; i++){
- wsprintf(s, "%s%d", szNoteNames[i % 12], i/12);
- int n = m_CbnSplitNote.AddString(s);
- m_CbnSplitNote.SetItemData(n, i);
- }
+ AppendNotesToControl(m_CbnSplitNote, 0, NOTE_MAX - 1);
+
m_nSplitInstrument = 0;
m_nSplitNote = 60;
m_CbnSplitNote.SetCurSel(m_nSplitNote);
Modified: branches/devBranch_1_17_03/mptrack/Ctrl_smp.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Ctrl_smp.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Ctrl_smp.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -235,13 +235,9 @@
m_SpinVibSweep.SetRange(0, 64);
m_SpinVibDepth.SetRange(0, 64);
m_SpinVibRate.SetRange(0, 64);
- for (UINT i=BASENOTE_MIN; i<BASENOTE_MAX; i++)
- {
- CHAR s[32];
- wsprintf(s, "%s%d", szNoteNames[i%12], i/12);
- m_CbnBaseNote.AddString(s);
- }
+ AppendNotesToControl(m_CbnBaseNote, BASENOTE_MIN, BASENOTE_MAX-1);
+
// -> CODE#0029
// -> DESC="pitch shifting - time stretching"
CHAR str[16];
Modified: branches/devBranch_1_17_03/mptrack/Draw_pat.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Draw_pat.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Draw_pat.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -329,7 +329,15 @@
{
m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT);
} else
+ if(note >= NOTE_PC)
{
+ m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 15*COLUMN_HEIGHT);
+ } else
+ if(note >= NOTE_PCS)
+ {
+ m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 16*COLUMN_HEIGHT);
+ } else
+ {
if(pTuning)
{ // Drawing custom note names
string noteStr = pTuning->GetNoteName(note-NOTE_MIDDLEC);
@@ -387,24 +395,40 @@
}
-void CViewPattern::DrawVolumeCommand(int x, int y, UINT volcmd, UINT vol)
-//-----------------------------------------------------------------------
+void CViewPattern::DrawVolumeCommand(int x, int y, const MODCOMMAND mc)
+//---------------------------------------------------------------------
{
PCPATTERNFONT pfnt = GetCurrentPatternFont();
- if (volcmd)
- {
- volcmd &= 0x0F;
- vol &= 0x7F;
- m_Dib.TextBlt(x, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT,
- pfnt->nVolX, pfnt->nVolY+volcmd*COLUMN_HEIGHT);
+
+ if(mc.note == NOTE_PCS || mc.note == NOTE_PC)
+ { //If note is parameter control 'note', drawing volume command differently.
+ const int val = min(MODCOMMAND::maxColumnValue, mc.GetValueVolCol());
+
+ m_Dib.TextBlt(x, y, 1, COLUMN_HEIGHT, pfnt->nClrX, pfnt->nClrY);
+ m_Dib.TextBlt(x + 1, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT,
+ pfnt->nNumX, pfnt->nNumY+(val / 100)*COLUMN_HEIGHT);
m_Dib.TextBlt(x+pfnt->nVolCmdWidth, y, pfnt->nVolHiWidth, COLUMN_HEIGHT,
- pfnt->nNumX, pfnt->nNumY+(vol / 10)*COLUMN_HEIGHT);
+ pfnt->nNumX, pfnt->nNumY+((val / 10)%10)*COLUMN_HEIGHT);
m_Dib.TextBlt(x+pfnt->nVolCmdWidth+pfnt->nVolHiWidth, y, pfnt->nEltWidths[2]-(pfnt->nVolCmdWidth+pfnt->nVolHiWidth), COLUMN_HEIGHT,
- pfnt->nNumX, pfnt->nNumY+(vol % 10)*COLUMN_HEIGHT);
- } else
+ pfnt->nNumX, pfnt->nNumY+(val % 10)*COLUMN_HEIGHT);
+ }
+ else
{
- int srcx = pfnt->nEltWidths[0] + pfnt->nEltWidths[1];
- m_Dib.TextBlt(x, y, pfnt->nEltWidths[2], COLUMN_HEIGHT, pfnt->nClrX+srcx, pfnt->nClrY);
+ if (mc.volcmd)
+ {
+ const int volcmd = (mc.volcmd & 0x0F);
+ const int vol = (mc.vol & 0x7F);
+ m_Dib.TextBlt(x, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT,
+ pfnt->nVolX, pfnt->nVolY+volcmd*COLUMN_HEIGHT);
+ m_Dib.TextBlt(x+pfnt->nVolCmdWidth, y, pfnt->nVolHiWidth, COLUMN_HEIGHT,
+ pfnt->nNumX, pfnt->nNumY+(vol / 10)*COLUMN_HEIGHT);
+ m_Dib.TextBlt(x+pfnt->nVolCmdWidth+pfnt->nVolHiWidth, y, pfnt->nEltWidths[2]-(pfnt->nVolCmdWidth+pfnt->nVolHiWidth), COLUMN_HEIGHT,
+ pfnt->nNumX, pfnt->nNumY+(vol % 10)*COLUMN_HEIGHT);
+ } else
+ {
+ int srcx = pfnt->nEltWidths[0] + pfnt->nEltWidths[1];
+ m_Dib.TextBlt(x, y, pfnt->nEltWidths[2], COLUMN_HEIGHT, pfnt->nClrX+srcx, pfnt->nClrY);
+ }
}
}
@@ -780,8 +804,19 @@
MODCOMMAND *mold = m - ncols;
if (m->note == mold->note) dwSpeedUpMask |= 0x01;
if ((m->instr == mold->instr) || (m_nDetailLevel < 1)) dwSpeedUpMask |= 0x02;
- if (((m->volcmd == mold->volcmd) && ((!m->volcmd) || (m->vol == mold->vol))) || (m_nDetailLevel < 2)) dwSpeedUpMask |= 0x04;
- if ((m->command == mold->command) || (m_nDetailLevel < 3)) dwSpeedUpMask |= (m->command) ? 0x08 : 0x18;
+ if ( m->note == NOTE_PCS || m->note == NOTE_PC || mold->note == NOTE_PCS || mold->note == NOTE_PC )
+ { // Handle speedup mask for PC notes.
+ if(m->note == mold->note)
+ {
+ if(m->GetValueVolCol() == mold->GetValueVolCol() || (m_nDetailLevel < 2)) dwSpeedUpMask |= 0x04;
+ if(m->GetValueEffectCol() == mold->GetValueEffectCol() || (m_nDetailLevel < 3)) dwSpeedUpMask |= 0x18;
+ }
+ }
+ else
+ {
+ if (((m->volcmd == mold->volcmd) && ((!m->volcmd) || (m->vol == mold->vol))) || (m_nDetailLevel < 2)) dwSpeedUpMask |= 0x04;
+ if ((m->command == mold->command) || (m_nDetailLevel < 3)) dwSpeedUpMask |= (m->command) ? 0x08 : 0x18;
+ }
if (dwSpeedUpMask == 0x1F) goto DoBlit;
}
bColSel[col] |= 0x40;
@@ -857,7 +892,7 @@
tx_col = MODCOLOR_TEXTSELECTED;
bk_col = MODCOLOR_BACKSELECTED;
} else
- if ((m->volcmd) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT))
+ if (m->note != NOTE_PCS && m->note != NOTE_PC && (m->volcmd) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT))
{
switch(m->volcmd)
{
@@ -886,15 +921,18 @@
}
// Drawing Volume
m_Dib.SetTextColor(tx_col, bk_col);
- DrawVolumeCommand(xbmp+x, 0, m->volcmd, m->vol);
+ DrawVolumeCommand(xbmp+x, 0, *m);
}
x += pfnt->nEltWidths[2];
}
// Command & param
if (m_nDetailLevel > 2)
{
+ const bool isPCnote = (m->note == NOTE_PC || m->note == NOTE_PCS);
+ uint16 val = m->GetValueEffectCol();
+ if(val > MODCOMMAND::maxColumnValue) val = MODCOMMAND::maxColumnValue;
fx_col = row_col;
- if ((m->command) && (m->command < MAX_EFFECTS) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT))
+ if (!isPCnote && (m->command) && (m->command < MAX_EFFECTS) && (CMainFrame::m_dwPatternSetup & PATTERN_EFFECTHILIGHT))
{
switch(gEffectColors[m->command])
{
@@ -921,17 +959,26 @@
tx_col = MODCOLOR_TEXTSELECTED;
bk_col = MODCOLOR_BACKSELECTED;
}
+
// Drawing Command
m_Dib.SetTextColor(tx_col, bk_col);
- if (m->command)
+ if(isPCnote)
{
- UINT command = m->command & 0x3F;
- int n = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands[command] : gszS3mCommands[command];
- if (n <= ' ') n = '?';
- DrawLetter(xbmp+x, 0, (char)n, pfnt->nEltWidths[3], pfnt->nCmdOfs);
- } else
+ m_Dib.TextBlt(xbmp + x, 0, 2, COLUMN_HEIGHT, pfnt->nClrX+x, pfnt->nClrY);
+ m_Dib.TextBlt(xbmp + x + 2, 0, pfnt->nEltWidths[3], m_szCell.cy, pfnt->nNumX, pfnt->nNumY+(val / 100)*COLUMN_HEIGHT);
+ }
+ else
{
- m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[3], COLUMN_HEIGHT, pfnt->nClrX+x, pfnt->nClrY);
+ if (m->command)
+ {
+ UINT command = m->command & 0x3F;
+ int n = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands[command] : gszS3mCommands[command];
+ if (n <= ' ') n = '?';
+ DrawLetter(xbmp+x, 0, (char)n, pfnt->nEltWidths[3], pfnt->nCmdOfs);
+ } else
+ {
+ m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[3], COLUMN_HEIGHT, pfnt->nClrX+x, pfnt->nClrY);
+ }
}
}
x += pfnt->nEltWidths[3];
@@ -945,15 +992,24 @@
tx_col = MODCOLOR_TEXTSELECTED;
bk_col = MODCOLOR_BACKSELECTED;
}
+
// Drawing param
m_Dib.SetTextColor(tx_col, bk_col);
- if (m->command)
+ if(isPCnote)
{
- m_Dib.TextBlt(xbmp+x, 0, pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX, pfnt->nNumY+(m->param >> 4)*COLUMN_HEIGHT);
- m_Dib.TextBlt(xbmp+x+pfnt->nParamHiWidth, 0, pfnt->nEltWidths[4]-pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX+1, pfnt->nNumY+(m->param & 0x0F)*COLUMN_HEIGHT);
- } else
+ m_Dib.TextBlt(xbmp + x, 0, pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX, pfnt->nNumY+((val / 10) % 10)*COLUMN_HEIGHT);
+ m_Dib.TextBlt(xbmp + x + pfnt->nParamHiWidth, 0, pfnt->nEltWidths[4]-pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX+1, pfnt->nNumY+(val % 10)*COLUMN_HEIGHT);
+ }
+ else
{
- m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[4], m_szCell.cy, pfnt->nClrX+x, pfnt->nClrY);
+ if (m->command)
+ {
+ m_Dib.TextBlt(xbmp+x, 0, pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX, pfnt->nNumY+(m->param >> 4)*COLUMN_HEIGHT);
+ m_Dib.TextBlt(xbmp+x+pfnt->nParamHiWidth, 0, pfnt->nEltWidths[4]-pfnt->nParamHiWidth, m_szCell.cy, pfnt->nNumX+1, pfnt->nNumY+(m->param & 0x0F)*COLUMN_HEIGHT);
+ } else
+ {
+ m_Dib.TextBlt(xbmp+x, 0, pfnt->nEltWidths[4], m_szCell.cy, pfnt->nClrX+x, pfnt->nClrY);
+ }
}
}
}
@@ -1396,59 +1452,65 @@
pMainFrm->SetUserText(s);
if (::GetFocus() == m_hWnd)
{
- nChn = (m_dwCursor & 0xFFFF) >> 3;
+ nChn = GetChanFromCursor(m_dwCursor);
s[0] = 0;
if ((!(m_dwStatus & (PATSTATUS_KEYDRAGSEL/*|PATSTATUS_MOUSEDRAGSEL*/))) //rewbs.xinfo: update indicator even when dragging
&& (m_dwBeginSel == m_dwEndSel) && (pSndFile->Patterns[m_nPattern])
&& (m_nRow < pSndFile->PatternSize[m_nPattern]) && (nChn < pSndFile->m_nChannels))
{
MODCOMMAND *m = &pSndFile->Patterns[m_nPattern][m_nRow*pSndFile->m_nChannels+nChn];
- switch (m_dwCursor & 7)
+
+ //For now, ignore update if using PC or PCs notes because instrument, volcol and effect values
+ //are meaningless for these notes.
+ if(m->note != NOTE_PC && m->note != NOTE_PCS)
{
- case 1:
- if (m->instr)
+ switch (GetColTypeFromCursor(m_dwCursor))
{
- CHAR sztmp[128] = "";
- if (pSndFile->m_nInstruments)
+ case 1:
+ if (m->instr)
{
- if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Headers[m->instr]))
+ CHAR sztmp[128] = "";
+ if (pSndFile->m_nInstruments)
{
- INSTRUMENTHEADER *penv = pSndFile->Headers[m->instr];
- memcpy(sztmp, penv->name, 32);
- sztmp[32] = 0;
- if ((m->note) && (m->note <= NOTE_MAX))
+ if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Headers[m->instr]))
{
- UINT nsmp = penv->Keyboard[m->note-1];
- if ((nsmp) && (nsmp <= pSndFile->m_nSamples))
+ INSTRUMENTHEADER *penv = pSndFile->Headers[m->instr];
+ memcpy(sztmp, penv->name, 32);
+ sztmp[32] = 0;
+ if ((m->note) && (m->note <= NOTE_MAX))
{
- CHAR sztmp2[64] = "";
- memcpy(sztmp2, pSndFile->m_szNames[nsmp], 32);
- sztmp2[32] = 0;
- if (sztmp2[0])
+ UINT nsmp = penv->Keyboard[m->note-1];
+ if ((nsmp) && (nsmp <= pSndFile->m_nSamples))
{
- wsprintf(sztmp+strlen(sztmp), " (%d: %s)", nsmp, sztmp2);
+ CHAR sztmp2[64] = "";
+ memcpy(sztmp2, pSndFile->m_szNames[nsmp], 32);
+ sztmp2[32] = 0;
+ if (sztmp2[0])
+ {
+ wsprintf(sztmp+strlen(sztmp), " (%d: %s)", nsmp, sztmp2);
+ }
}
}
}
- }
- } else
- {
- if (m->instr <= pSndFile->m_nSamples)
+ } else
{
- memcpy(sztmp, pSndFile->m_szNames[m->instr], 32);
- sztmp[32] = 0;
+ if (m->instr <= pSndFile->m_nSamples)
+ {
+ memcpy(sztmp, pSndFile->m_szNames[m->instr], 32);
+ sztmp[32] = 0;
+ }
}
+ if (sztmp[0]) wsprintf(s, "%d: %s", m->instr, sztmp);
}
- if (sztmp[0]) wsprintf(s, "%d: %s", m->instr, sztmp);
+ break;
+ case 2:
+ if (!pModDoc->GetVolCmdInfo(pModDoc->GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0;
+ break;
+ case 3:
+ case 4:
+ if (!pModDoc->GetEffectName(s, m->command, m->param, FALSE, nChn)) s[0] = 0;
+ break;
}
- break;
- case 2:
- if (!pModDoc->GetVolCmdInfo(pModDoc->GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0;
- break;
- case 3:
- case 4:
- if (!pModDoc->GetEffectName(s, m->command, m->param, FALSE, nChn)) s[0] = 0;
- break;
}
}
pMainFrm->SetInfoText(s);
Modified: branches/devBranch_1_17_03/mptrack/Modedit.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Modedit.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Modedit.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -19,7 +19,19 @@
#define str_mptm_conversion_warning GetStrI18N(_TEXT("Conversion from mptm to any other moduletype may makes certain features unavailable and is not guaranteed to work properly. Do the conversion anyway?"))
+const size_t Pow10Table[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
+// Return D'th digit(character) of given value.
+// GetDigit<0>(123) == '3'
+// GetDigit<1>(123) == '2'
+// GetDigit<2>(123) == '1'
+template<BYTE D>
+inline TCHAR GetDigit(const size_t val)
+{
+ return (D > 9) ? '0' : 48 + ((val / Pow10Table[D]) % 10);
+}
+
+
//////////////////////////////////////////////////////////////////////
// Module type conversion
@@ -1492,6 +1504,8 @@
case 0: p[1] = p[2] = p[3] = '.'; break;
case NOTE_KEYOFF: p[1] = p[2] = p[3] = '='; break;
case NOTE_NOTECUT: p[1] = p[2] = p[3] = '^'; break;
+ case NOTE_PC: p[1] = 'P'; p[2] = 'C'; p[3] = ' '; break;
+ case NOTE_PCS: p[1] = 'P'; p[2] = 'C'; p[3] = 'S'; break;
default:
p[1] = szNoteNames[(note-1) % 12][0];
p[2] = szNoteNames[(note-1) % 12][1];
@@ -1519,12 +1533,22 @@
ncursor++;
if ((ncursor >= colmin) && (ncursor <= colmax))
{
- if ((m->volcmd) && (m->volcmd <= MAX_VOLCMDS))
+ if(m->note == NOTE_PC || m->note == NOTE_PCS)
{
- p[6] = gszVolCommands[m->volcmd];
- p[7] = '0' + (m->vol / 10);
- p[8] = '0' + (m->vol % 10);
- } else p[6] = p[7] = p[8] = '.';
+ const uint16 val = m->GetValueVolCol();
+ p[6] = GetDigit<2>(val);
+ p[7] = GetDigit<1>(val);
+ p[8] = GetDigit<0>(val);
+ }
+ else
+ {
+ if ((m->volcmd) && (m->volcmd <= MAX_VOLCMDS))
+ {
+ p[6] = gszVolCommands[m->volcmd];
+ p[7] = '0' + (m->vol / 10);
+ p[8] = '0' + (m->vol % 10);
+ } else p[6] = p[7] = p[8] = '.';
+ }
} else
{
p[6] = p[7] = p[8] = ' ';
@@ -1534,18 +1558,28 @@
if (((ncursor >= colmin) && (ncursor <= colmax))
|| ((ncursor+1 >= colmin) && (ncursor+1 <= colmax)))
{
- if (m->command)
+ if(m->note == NOTE_PC || m->note == NOTE_PCS)
{
- if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
- p[9] = gszS3mCommands[m->command];
- else
- p[9] = gszModCommands[m->command];
- } else p[9] = '.';
- if (m->param)
+ const uint16 val = m->GetValueEffectCol();
+ p[9] = GetDigit<2>(val);
+ p[10] = GetDigit<1>(val);
+ p[11] = GetDigit<0>(val);
+ }
+ else
{
- p[10] = szHexChar[m->param >> 4];
- p[11] = szHexChar[m->param & 0x0F];
- } else p[10] = p[11] = '.';
+ if (m->command)
+ {
+ if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
+ p[9] = gszS3mCommands[m->command];
+ else
+ p[9] = gszModCommands[m->command];
+ } else p[9] = '.';
+ if (m->param)
+ {
+ p[10] = szHexChar[m->param >> 4];
+ p[11] = szHexChar[m->param & 0x0F];
+ } else p[10] = p[11] = '.';
+ }
} else
{
p[9] = p[10] = p[11] = ' ';
@@ -1636,6 +1670,13 @@
m[col].note = 0;
if (s[0] == '=') m[col].note = NOTE_KEYOFF; else
if (s[0] == '^') m[col].note = NOTE_NOTECUT; else
+ if (s[0] == 'P')
+ {
+ if(s[2] == 'S')
+ m[col].note = NOTE_PCS;
+ else
+ m[col].note = NOTE_PC;
+ } else
if (s[0] != '.')
{
for (UINT i=0; i<12; i++)
@@ -1663,68 +1704,92 @@
{
if (s[5] != '.')
{
- m[col].volcmd = 0;
- for (UINT i=1; i<MAX_VOLCMDS; i++)
+ if(m[col].note == NOTE_PCS || m[col].note == NOTE_PC)
{
- if (s[5] == gszVolCommands[i])
+ char val[4];
+ memcpy(val, s+5, 3);
+ val[3] = 0;
+ m[col].SetValueVolCol(ConvertStrTo<uint16>(val));
+ }
+ else
+ {
+ m[col].volcmd = 0;
+ for (UINT i=1; i<MAX_VOLCMDS; i++)
{
- m[col].volcmd = i;
- break;
+ if (s[5] == gszVolCommands[i])
+ {
+ m[col].volcmd = i;
+ break;
+ }
}
+ m[col].vol = (s[6]-'0')*10 + (s[7]-'0');
}
- m[col].vol = (s[6]-'0')*10 + (s[7]-'0');
} else m[col].volcmd = m[col].vol = 0;
}
- if (s[8] > ' ' && (!mix || ((!ITStyleMix && origModCmd.command==0) ||
- (ITStyleMix && origModCmd.command==0 && origModCmd.param==0))))
+
+ if(m[col].note == NOTE_PCS || m[col].note == NOTE_PC)
{
- m[col].command = 0;
- if (s[8] != '.')
+ if(s[8] != '.')
{
- LPCSTR psc = (bS3M) ? gszS3mCommands : gszModCommands;
- for (UINT i=1; i<MAX_EFFECTS; i++)
- {
- if ((s[8] == psc[i]) && (psc[i] != '?')) m[col].command = i;
- }
+ char val[4];
+ memcpy(val, s+8, 3);
+ val[3] = 0;
+ m[col].SetValueEffectCol(ConvertStrTo<uint16>(val));
}
}
- // Effect value
- if (s[9] > ' ' && (!mix || ((!ITStyleMix && origModCmd.param==0) ||
- (ITStyleMix && origModCmd.command==0 && origModCmd.param==0))))
+ else
{
- m[col].param = 0;
- if (s[9] != '.')
+ if (s[8] > ' ' && (!mix || ((!ITStyleMix && origModCmd.command==0) ||
+ (ITStyleMix && origModCmd.command==0 && origModCmd.param==0))))
{
- for (UINT i=0; i<16; i++)
+ m[col].command = 0;
+ if (s[8] != '.')
{
- if (s[9] == szHexChar[i]) m[col].param |= (i<<4);
- if (s[10] == szHexChar[i]) m[col].param |= i;
+ LPCSTR psc = (bS3M) ? gszS3mCommands : gszModCommands;
+ for (UINT i=1; i<MAX_EFFECTS; i++)
+ {
+ if ((s[8] == psc[i]) && (psc[i] != '?')) m[col].command = i;
+ }
}
}
- }
- // Checking command
- if (m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
- {
- switch (m[col].command)
+ // Effect value
+ if (s[9] > ' ' && (!mix || ((!ITStyleMix && origModCmd.param==0) ||
+ (ITStyleMix && origModCmd.command==0 && origModCmd.param==0))))
{
- case CMD_SPEED:
- case CMD_TEMPO:
- if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
- else
+ m[col].param = 0;
+ if (s[9] != '.')
{
- if ((m[col].command == CMD_SPEED) && (m[col].param > spdmax)) m[col].param = CMD_TEMPO; else
- if ((m[col].command == CMD_TEMPO) && (m[col].param <= spdmax)) m[col].param = CMD_SPEED;
+ for (UINT i=0; i<16; i++)
+ {
+ if (s[9] == szHexChar[i]) m[col].param |= (i<<4);
+ if (s[10] == szHexChar[i]) m[col].param |= i;
+ }
}
- break;
}
- } else
- {
- switch (m[col].command)
+ // Checking command
+ if (m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
{
- case CMD_SPEED:
- case CMD_TEMPO:
- if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
- break;
+ switch (m[col].command)
+ {
+ case CMD_SPEED:
+ case CMD_TEMPO:
+ if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
+ else
+ {
+ if ((m[col].command == CMD_SPEED) && (m[col].param > spdmax)) m[col].param = CMD_TEMPO; else
+ if ((m[col].command == CMD_TEMPO) && (m[col].param <= spdmax)) m[col].param = CMD_SPEED;
+ }
+ break;
+ }
+ } else
+ {
+ switch (m[col].command)
+ {
+ case CMD_SPEED:
+ case CMD_TEMPO:
+ if (!bS3M) m[col].command = (m[col].param <= spdmax) ? CMD_SPEED : CMD_TEMPO;
+ break;
+ }
}
}
}
Modified: branches/devBranch_1_17_03/mptrack/Mptrack.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Mptrack.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Mptrack.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -172,6 +172,19 @@
"F#", "G-", "G#", "A-", "A#", "B-"
};
+LPCSTR szDefaultNoteNames[NOTE_MAX] = {
+ "C-0", "C#0", "D-0", "D#0", "E-0", "F-0", "F#0", "G-0", "G#0", "A-0", "A#0", "B-0",
+ "C-1", "C#1", "D-1", "D#1", "E-1", "F-1", "F#1", "G-1", "G#1", "A-1", "A#1", "B-1",
+ "C-2", "C#2", "D-2", "D#2", "E-2", "F-2", "F#2", "G-2", "G#2", "A-2", "A#2", "B-2",
+ "C-3", "C#3", "D-3", "D#3", "E-3", "F-3", "F#3", "G-3", "G#3", "A-3", "A#3", "B-3",
+ "C-4", "C#4", "D-4", "D#4", "E-4", "F-4", "F#4", "G-4", "G#4", "A-4", "A#4", "B-4",
+ "C-5", "C#5", "D-5", "D#5", "E-5", "F-5", "F#5", "G-5", "G#5", "A-5", "A#5", "B-5",
+ "C-6", "C#6", "D-6", "D#6", "E-6", "F-6", "F#6", "G-6", "G#6", "A-6", "A#6", "B-6",
+ "C-7", "C#7", "D-7", "D#7", "E-7", "F-7", "F#7", "G-7", "G#7", "A-7", "A#7", "B-7",
+ "C-8", "C#8", "D-8", "D#8", "E-8", "F-8", "F#8", "G-8", "G#8", "A-8", "A#8", "B-8",
+ "C-9", "C#9", "D-9", "D#9", "E-9", "F-9", "F#9", "G-9", "G#9", "A-9", "A#9", "B-9",
+};
+
LPCSTR szHexChar = "0123456789ABCDEF";
LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last :
LPCSTR gszS3mCommands = " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#"; //rewbs.smoothVST: added last \ (written as \\); rewbs.velocity: added last :
@@ -663,7 +676,7 @@
m_pDocManager = new CModDocManager();
#ifdef _DEBUG
- // ASSERT((sizeof(MODCHANNEL)&7) == 0);
+ ASSERT((sizeof(MODCHANNEL)&7) == 0);
// Disabled by rewbs for smoothVST. Might cause minor perf issues due to increased cache misses?
#endif
@@ -1082,15 +1095,12 @@
void CTrackApp::LoadChords(PMPTCHORD pChords)
//-------------------------------------------
-{
- CHAR snam[32];
-
+{
if (!m_szConfigFileName[0]) return;
for (UINT i=0; i<3*12; i++)
{
LONG chord;
- wsprintf(snam, "%s%d", szNoteNames[i%12], i/12);
- if ((chord = GetPrivateProfileInt("Chords", snam, -1, m_szConfigFileName)) >= 0)
+ if ((chord = GetPrivateProfileInt("Chords", szDefaultNoteNames[i], -1, m_szConfigFileName)) >= 0)
{
if ((chord & 0xFFFFFFC0) || (!pChords[i].notes[0]))
{
@@ -1107,14 +1117,13 @@
void CTrackApp::SaveChords(PMPTCHORD pChords)
//-------------------------------------------
{
- CHAR s[64], snam[32];
+ CHAR s[64];
if (!m_szConfigFileName[0]) return;
for (UINT i=0; i<3*12; i++)
{
- wsprintf(snam, "%s%d", szNoteNames[i%12], i/12);
wsprintf(s, "%d", (pChords[i].key) | (pChords[i].notes[0] << 6) | (pChords[i].notes[1] << 12) | (pChords[i].notes[2] << 18));
- if (!WritePrivateProfileString("Chords", snam, s, m_szConfigFileName)) break;
+ if (!WritePrivateProfileString("Chords", szDefaultNoteNames[i], s, m_szConfigFileName)) break;
}
}
Modified: branches/devBranch_1_17_03/mptrack/Mptrack.h
===================================================================
--- branches/devBranch_1_17_03/mptrack/Mptrack.h 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Mptrack.h 2008-08-22 18:08:38 UTC (rev 221)
@@ -379,10 +379,25 @@
void Log(LPCSTR format,...);
UINT MsgBox(UINT nStringID, CWnd *p=NULL, LPCSTR lpszTitle=NULL, UINT n=MB_OK);
void ErrorBox(UINT nStringID, CWnd*p=NULL);
+
+// Helper function declarations.
void AddPluginNamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN* plugarray, const bool librarynames = false);
void AddPluginParameternamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN& plugarray);
void AddPluginParameternamesToCombobox(CComboBox& CBox, CVstPlugin& plug);
+// Append note names from zero-based range [noteStart, noteEnd] to given combobox.
+void AppendNotesToControl(CComboBox& combobox, const MODCOMMAND::NOTE noteStart, const MODCOMMAND::NOTE noteEnd);
+
+// Append note names to combobox. If pSndFile != nullPrt, appends only notes that are
+// available in the module type.
+void AppendNotesToControl(CComboBox& combobox, const CSoundFile* const pSndFile = nullptr);
+
+// Append note names of instrument iInstr in rSndFile to combobox.
+void AppendNotesToControl(CComboBox& combobox, const CSoundFile& rSndFile, const INSTRUMENTINDEX iInstr);
+
+// Returns note name(such as "C-5") of given note using note indecing [1, NOTE_MAX].
+const char* GetNoteStr(const MODCOMMAND::NOTE);
+
///////////////////////////////////////////////////
// Tables
#define MAX_EFFECTS 35 //rewbs.smoothVST & rewbs.velocity: increased from 32. Wonder what this will break...
@@ -391,6 +406,14 @@
extern BYTE gEffectColors[MAX_EFFECTS];
extern LPCSTR szNoteNames[12];
+extern LPCSTR szDefaultNoteNames[NOTE_MAX];
+LPCSTR const szSpecialNoteNames[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {"PCs", "PC", "^^", "=="};
+LPCSTR const szSpecialNoteShortDesc[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {"Param control(smooth)", "Param control", "Note Cut", "Note Off"};
+
+// Make sure that szSpecialNoteNames-array includes note string for every special note.
+STATIC_ASSERT(NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1 == ARRAYELEMCOUNT(szSpecialNoteNames));
+STATIC_ASSERT(ARRAYELEMCOUNT(szSpecialNoteShortDesc) == ARRAYELEMCOUNT(szSpecialNoteNames));
+
extern LPCSTR szHexChar;
extern LPCSTR gszModCommands;
extern LPCSTR gszS3mCommands;
Modified: branches/devBranch_1_17_03/mptrack/View_pat.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/View_pat.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/View_pat.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -23,9 +23,9 @@
#pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data"
-MODCOMMAND CViewPattern::m_cmdOld;
-MODCOMMAND CViewPattern::m_cmdFind;
-MODCOMMAND CViewPattern::m_cmdReplace;
+MODCOMMAND CViewPattern::m_cmdOld = {0,0,0,0,0,0};
+MODCOMMAND CViewPattern::m_cmdFind = {0,0,0,0,0,0};
+MODCOMMAND CViewPattern::m_cmdReplace = {0,0,0,0,0,0};
DWORD CViewPattern::m_dwFindFlags = 0;
DWORD CViewPattern::m_dwReplaceFlags = 0;
UINT CViewPattern::m_nFindMinChn = 0;
@@ -835,7 +835,7 @@
{
UINT chn = i >> 3;
MODCOMMAND *blank= &p[row * pSndFile->m_nChannels + chn];
- *blank = MODCOMMAND();
+ *blank = MODCOMMAND::Empty();
}
}
m_dwBeginSel = startSel;
@@ -872,6 +872,7 @@
PrepareUndo(m_dwBeginSel, m_dwEndSel);
DWORD tmp = m_dwEndSel;
+ bool invalidateAllCols = false;
for (UINT row=(m_dwBeginSel >> 16); row<=(m_dwEndSel >> 16); row++) { // for all selected rows
for (UINT i=(m_dwBeginSel & 0xFFFF); i<=(m_dwEndSel & 0xFFFF); i++) if ((i & 7) < 5) { // for all selected cols
@@ -882,8 +883,17 @@
switch(i & 7) {
case 0: // Clear note
if (rm.note) {
- m->note = 0;
- if (ITStyle) m->instr = 0;
+ if(m->note == NOTE_PCS || m->note == NOTE_PC)
+ { // Clear whole row if clearing PC note
+ m->Clear();
+ invalidateAllCols = true;
+ }
+ else
+ {
+ m->note = 0;
+ if (ITStyle) m->instr = 0;
+ }
+
}
break;
case 1: // Clear instrument
@@ -911,7 +921,17 @@
} //end selected columns
} //end selected rows
- if ((tmp & 7) == 3) tmp++;
+ // If selection ends on effect command column, extent invalidation area to
+ // effect param column as well.
+ if ((tmp & 7) == EFFECT_COLUMN)
+ tmp++;
+
+ // If invalidation on all columns is wanted, extent invalidation area.
+ if(invalidateAllCols)
+ tmp += LAST_COLUMN - (tmp % 8);
+
+ ASSERT(tmp % 8 <= LAST_COLUMN);
+
InvalidateArea(m_dwBeginSel, tmp);
pModDoc->SetModified();
pModDoc->UpdateAllViews(this, HINT_PATTERNDATA | (m_nPattern << HINT_SHIFT_PAT), NULL);
@@ -1774,7 +1794,7 @@
UINT ch = n % pSndFile->m_nChannels;
if ((ch < m_nFindMinChn) || (ch > m_nFindMaxChn)) bFound = FALSE;
}
- if (((m_dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_cmdFind.note) && ((m_cmdFind.note != 0xFD) || (!m->note) || (m->note & 0x80))))
+ if (((m_dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_cmdFind.note) && ((m_cmdFind.note != CFindReplaceTab::findAny) || (!m->note) || (m->note & 0x80))))
|| ((m_dwFindFlags & PATSEARCH_INSTR) && (m->instr != m_cmdFind.instr))
|| ((m_dwFindFlags & PATSEARCH_VOLCMD) && (m->volcmd != m_cmdFind.volcmd))
|| ((m_dwFindFlags & PATSEARCH_VOLUME) && (m->vol != m_cmdFind.vol))
@@ -1782,10 +1802,21 @@
|| ((m_dwFindFlags & PATSEARCH_PARAM) && (m->param != m_cmdFind.param)))
{
bFound = FALSE;
- } else
- if (((m_dwFindFlags & (PATSEARCH_COMMAND|PATSEARCH_PARAM)) == PATSEARCH_COMMAND) && (bEffectEx))
+ }
+ else
{
- if ((m->param & 0xF0) != (m_cmdFind.param & 0xF0)) bFound = FALSE;
+ if (((m_dwFindFlags & (PATSEARCH_COMMAND|PATSEARCH_PARAM)) == PATSEARCH_COMMAND) && (bEffectEx))
+ {
+ if ((m->param & 0xF0) != (m_cmdFind.param & 0xF0)) bFound = FALSE;
+ }
+
+ // Ignore modcommands with PC/PCS notes when searching from volume or effect column.
+ if( (m->note == NOTE_PC || m->note == NOTE_PCS)
+ &&
+ m_dwFindFlags & (PATSEARCH_VOLCMD|PATSEARCH_VOLUME|PATSEARCH_COMMAND|PATSEARCH_PARAM))
+ {
+ bFound = FALSE;
+ }
}
// Found!
if (bFound)
@@ -1828,22 +1859,22 @@
if ((m_dwReplaceFlags & PATSEARCH_NOTE))
{
// -1 octave
- if (m_cmdReplace.note == 0xFA)
+ if (m_cmdReplace.note == CFindReplaceTab::replaceMinusOctave)
{
if (m->note > 12) m->note -= 12;
} else
// +1 octave
- if (m_cmdReplace.note == 0xFB)
+ if (m_cmdReplace.note == CFindReplaceTab::replacePlusOctave)
{
- if (m->note <= 108) m->note += 12;
+ if (m->note <= NOTE_MAX - 12) m->note += 12;
} else
// Note--
- if (m_cmdReplace.note == 0xFC)
+ if (m_cmdReplace.note == CFindReplaceTab::replaceMinusOne)
{
if (m->note > 1) m->note--;
} else
// Note++
- if (m_cmdReplace.note == 0xFD)
+ if (m_cmdReplace.note == CFindReplaceTab::replacePlusOne)
{
if (m->note < NOTE_MAX) m->note++;
} else m->note = m_cmdReplace.note;
@@ -1851,12 +1882,12 @@
if ((m_dwReplaceFlags & PATSEARCH_INSTR))
{
// Instr--
- if (m_cmdReplace.instr == 0xFC)
+ if (m_cmdReplace.instr == CFindReplaceTab::replaceMinusOne)
{
if (m->instr > 1) m->instr--;
} else
// Instr++
- if (m_cmdReplace.instr == 0xFD)
+ if (m_cmdReplace.instr == CFindReplaceTab::replacePlusOne)
{
if (m->instr < MAX_INSTRUMENTS-1) m->instr++;
} else m->instr = m_cmdReplace.instr;
@@ -1896,11 +1927,7 @@
{
if (m_dwFindFlags & PATSEARCH_NOTE)
{
- UINT note = m_cmdFind.note;
- if (note == 0) strcpy(szFind, "..."); else
- if (note == 0xFE) strcpy(szFind, "^^ "); else
- if (note == 0xFF) strcpy(szFind, "== "); else
- wsprintf(szFind, "%s%d", szNoteNames[(note-1) % 12], (note-1)/12);
+ wsprintf(szFind, "%s", GetNoteStr(m_cmdFind.note));
} else strcpy(szFind, "???");
strcat(szFind, " ");
if (m_dwFindFlags & PATSEARCH_INSTR)
@@ -2024,7 +2051,6 @@
UINT nCursor = m_dwCursor & 0x07;
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODCOMMAND *p = pSndFile->Patterns[m_nPattern] + m_nRow*pSndFile->m_nChannels + nChn;
- MODCOMMAND oldcmd = *p;
switch(nCursor)
{
@@ -2156,7 +2182,6 @@
//for all channels where type is selected
for (int chnIdx=0; chnIdx<nValidChans; chnIdx++) {
- MODCOMMAND *pcmd = pSndFile->Patterns[m_nPattern];
UINT nchn = validChans[chnIdx];
UINT row0 = GetSelectionStartRow();
UINT row1 = GetSelectionEndRow();
@@ -2169,28 +2194,51 @@
PrepareUndo(m_dwBeginSel, m_dwEndSel);
}
- int vsrc, vdest, vcmd, verr, distance;
+ bool doPCinterpolation = false;
+
+ int vsrc, vdest, vcmd = 0, verr = 0, distance;
distance = row1 - row0;
+ const MODCOMMAND srcCmd = *pSndFile->Patterns[m_nPattern].GetpModCommand(row0, nchn);
+ const MODCOMMAND destCmd = *pSndFile->Patterns[m_nPattern].GetpModCommand(row1, nchn);
+
+ MODCOMMAND::NOTE PCnote = 0;
+ uint16 PCinst = 0, PCparam = 0;
+
switch(type) {
case NOTE_COLUMN:
- vsrc = pcmd[row0 * pSndFile->m_nChannels + nchn].note;
- vdest = pcmd[row1 * pSndFile->m_nChannels + nchn].note;
- vcmd = pcmd[row0 * pSndFile->m_nChannels + nchn].instr;
- verr = (distance * 59) / 120;
+ vsrc = srcCmd.note;
+ vdest = destCmd.note;
+ vcmd = srcCmd.instr;
+ verr = (distance * 59) / NOTE_MAX;
break;
case VOL_COLUMN:
- vsrc = pcmd[row0 * pSndFile->m_nChannels + nchn].vol;
- vdest = pcmd[row1 * pSndFile->m_nChannels + nchn].vol;
- vcmd = pcmd[row0 * pSndFile->m_nChannels + nchn].volcmd;
+ vsrc = srcCmd.vol;
+ vdest = destCmd.vol;
+ vcmd = srcCmd.volcmd;
verr = (distance * 63) / 128;
break;
case PARAM_COLUMN:
case EFFECT_COLUMN:
- vsrc = pcmd[row0 * pSndFile->m_nChannels + nchn].param;
- vdest = pcmd[row1 * pSndFile->m_nChannels + nchn].param;
- vcmd = pcmd[row0 * pSndFile->m_nChannels + nchn].command;
- verr = (distance * 63) / 128;
+ if(srcCmd.note == NOTE_PC || srcCmd.note == NOTE_PCS || destCmd.note == NOTE_PCS || destCmd.note == NOTE_PC)
+ {
+ doPCinterpolation = true;
+ PCnote = (srcCmd.note == NOTE_PC || srcCmd.note == NOTE_PCS) ? srcCmd.note : destCmd.note;
+ vsrc = srcCmd.GetValueEffectCol();
+ vdest = destCmd.GetValueEffectCol();
+ PCparam = srcCmd.GetValueVolCol();
+ if(PCparam == 0) PCparam = destCmd.GetValueVolCol();
+ PCinst = srcCmd.instr;
+ if(PCinst == 0)
+ PCinst = destCmd.instr;
+ }
+ else
+ {
+ vsrc = srcCmd.param;
+ vdest = destCmd.param;
+ vcmd = srcCmd.command;
+ verr = (distance * 63) / 128;
+ }
break;
default:
ASSERT(false);
@@ -2198,8 +2246,9 @@
}
if (vdest < vsrc) verr = -verr;
- pcmd += row0 * pSndFile->m_nChannels + nchn;
+ MODCOMMAND* pcmd = pSndFile->Patterns[m_nPattern].GetpModCommand(row0, nchn);
+
for (UINT i=0; i<=distance; i++, pcmd += pSndFile->m_nChannels) {
switch(type) {
@@ -2218,11 +2267,23 @@
}
break;
case EFFECT_COLUMN:
- if ((!pcmd->command) || (pcmd->command == vcmd)) {
- int val = vsrc + ((vdest - vsrc) * (int)i + verr) / distance;
- pcmd->param = (BYTE)val;
- pcmd->command = vcmd;
+ if(doPCinterpolation)
+ { // With PC/PCs notes, copy PCs note and plug index to all rows where
+ // effect interpolation is done.
+ const uint16 val = static_cast<uint16>(vsrc + i * float(vdest - vsrc) / distance);
+ pcmd->note = PCnote;
+ pcmd->instr = PCinst;
+ pcmd->SetValueVolCol(PCparam);
+ pcmd->SetValueEffectCol(val);
}
+ else
+ {
+ if ((!pcmd->command) || (pcmd->command == vcmd)) {
+ int val = vsrc + ((vdest - vsrc) * (int)i + verr) / distance;
+ pcmd->param = (BYTE)val;
+ pcmd->command = vcmd;
+ }
+ }
break;
default:
ASSERT(false);
@@ -3390,6 +3451,8 @@
case kcNoteCutOld: TempEnterNote(NOTE_NOTECUT, true); return wParam;
case kcNoteOff: TempEnterNote(NOTE_KEYOFF, false); return wParam;
case kcNoteOffOld: TempEnterNote(NOTE_KEYOFF, true); return wParam;
+ case kcNotePC: TempEnterNote(NOTE_PC); return wParam;
+ case kcNotePCS: TempEnterNote(NOTE_PCS); return wParam;
case kcEditUndo: OnEditUndo(); return wParam;
case kcEditFind: OnEditFind(); return wParam;
@@ -3478,6 +3541,19 @@
return NULL;
}
+#define ENTER_PCNOTE_VALUE(v, method) \
+ { \
+ if((v >= 0) && (v <= 9)) \
+ { \
+ uint16 val = p->Get##method##(); \
+ /* Move existing digits to left, drop out leftmost digit and */ \
+ /* push new digit to the least meaning digit. */ \
+ val = (val % 100) * 10 + v; \
+ if(val > MODCOMMAND::maxColumnValue) val = MODCOMMAND::maxColumnValue; \
+ p->Set##method##(val); \
+ } \
+ }
+
void CViewPattern::TempEnterVol(int v)
//------------------------------------
{
@@ -3488,55 +3564,57 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase;
-
- MODCOMMAND oldcmd; // This is the command we are about to overwrite
+
PrepareUndo(m_dwBeginSel, m_dwEndSel);
- // -- Work out where to put the new data
- UINT nChn = (m_dwCursor & 0xFFFF) >> 3;
- prowbase = p + m_nRow * pSndFile->m_nChannels;
- p = prowbase + nChn;
- oldcmd = *p;
+ MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor));
+ MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite
- UINT volcmd = p->volcmd;
- UINT vol = p->vol;
- if ((v >= 0) && (v <= 9))
+ if(p->note == NOTE_PC || p->note == NOTE_PCS)
{
- vol = ((vol * 10) + v) % 100;
- if (!volcmd) volcmd = VOLCMD_VOLUME;
+ ENTER_PCNOTE_VALUE(v, ValueVolCol);
}
else
- switch(v+kcSetVolumeStart)
+ {
+ UINT volcmd = p->volcmd;
+ UINT vol = p->vol;
+ if ((v >= 0) && (v <= 9))
{
- case kcSetVolumeVol: volcmd = VOLCMD_VOLUME; break;
- case kcSetVolumePan: volcmd = VOLCMD_PANNING; break;
- case kcSetVolumeVolSlideUp: volcmd = VOLCMD_VOLSLIDEUP; break;
- case kcSetVolumeVolSlideDown: volcmd = VOLCMD_VOLSLIDEDOWN; break;
- case kcSetVolumeFineVolUp: volcmd = VOLCMD_FINEVOLUP; break;
- case kcSetVolumeFineVolDown: volcmd = VOLCMD_FINEVOLDOWN; break;
- case kcSetVolumeVibratoSpd: volcmd = VOLCMD_VIBRATOSPEED; break;
- case kcSetVolumeVibrato: volcmd = VOLCMD_VIBRATO; break;
- case kcSetVolumeXMPanLeft: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDELEFT; break;
- case kcSetVolumeXMPanRight: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDERIGHT; break;
- case kcSetVolumePortamento: volcmd = VOLCMD_TONEPORTAMENTO; break;
- case kcSetVolumeITPortaUp: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTAUP; break;
- case kcSetVolumeITPortaDown: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTADOWN; break;
- case kcSetVolumeITVelocity: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_VELOCITY; break; //rewbs.velocity
- case kcSetVolumeITOffset: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_OFFSET; break; //rewbs.volOff
+ vol = ((vol * 10) + v) % 100;
+ if (!volcmd) volcmd = VOLCMD_VOLUME;
}
- if ((pSndFile->m_nType & MOD_TYPE_MOD) && (volcmd > VOLCMD_PANNING)) volcmd = vol = 0;
+ else
+ switch(v+kcSetVolumeStart)
+ {
+ case kcSetVolumeVol: volcmd = VOLCMD_VOLUME; break;
+ case kcSetVolumePan: volcmd = VOLCMD_PANNING; break;
+ case kcSetVolumeVolSlideUp: volcmd = VOLCMD_VOLSLIDEUP; break;
+ case kcSetVolumeVolSlideDown: volcmd = VOLCMD_VOLSLIDEDOWN; break;
+ case kcSetVolumeFineVolUp: volcmd = VOLCMD_FINEVOLUP; break;
+ case kcSetVolumeFineVolDown: volcmd = VOLCMD_FINEVOLDOWN; break;
+ case kcSetVolumeVibratoSpd: volcmd = VOLCMD_VIBRATOSPEED; break;
+ case kcSetVolumeVibrato: volcmd = VOLCMD_VIBRATO; break;
+ case kcSetVolumeXMPanLeft: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDELEFT; break;
+ case kcSetVolumeXMPanRight: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDERIGHT; break;
+ case kcSetVolumePortamento: volcmd = VOLCMD_TONEPORTAMENTO; break;
+ case kcSetVolumeITPortaUp: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTAUP; break;
+ case kcSetVolumeITPortaDown: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_PORTADOWN; break;
+ case kcSetVolumeITVelocity: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_VELOCITY; break; //rewbs.velocity
+ case kcSetVolumeITOffset: if (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) volcmd = VOLCMD_OFFSET; break; //rewbs.volOff
+ }
+ if ((pSndFile->m_nType & MOD_TYPE_MOD) && (volcmd > VOLCMD_PANNING)) volcmd = vol = 0;
- UINT max = 64;
- if (volcmd > VOLCMD_PANNING)
- {
- max = (pSndFile->m_nType == MOD_TYPE_XM) ? 0x0F : 9;
+ UINT max = 64;
+ if (volcmd > VOLCMD_PANNING)
+ {
+ max = (pSndFile->m_nType == MOD_TYPE_XM) ? 0x0F : 9;
+ }
+
+ if (vol > max) vol %= 10;
+ p->volcmd = volcmd;
+ p->vol = vol;
}
- if (vol > max) vol %= 10;
- p->volcmd = volcmd;
- p->vol = vol;
-
if (IsEditingEnabled_bmsg())
{
DWORD sel = (m_nRow << 16) | m_dwCursor;
@@ -3574,6 +3652,8 @@
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
CModDoc *pModDoc = GetDocument();
+ if(!IsEditingEnabled_bmsg()) return;
+
if ((pModDoc) && (pMainFrm))
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
@@ -3581,39 +3661,42 @@
MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor));
MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite
- //if(p->command != 0 && !overwrite) return true;
-
PrepareUndo(m_dwBeginSel, m_dwEndSel);
- //LPCSTR lpcmd = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands : gszS3mCommands;
- if (c)
+ if(p->note == NOTE_PC || p->note == NOTE_PCS)
{
- if ((c == m_cmdOld.command) && (!p->param) && (!p->command)) p->param = m_cmdOld.param;
- else m_cmdOld.param = 0;
- m_cmdOld.command = c;
+ ENTER_PCNOTE_VALUE(c, ValueEffectCol);
}
- p->command = c;
-
- // Check for MOD/XM Speed/Tempo command
- if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
- && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO)))
+ else
{
- UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20;
- p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO;
- }
- if (IsEditingEnabled_bmsg())
- {
- DWORD sel = (m_nRow << 16) | m_dwCursor;
- SetCurSel(sel, sel);
- sel &= ~7;
- if(oldcmd != *p)
+ //LPCSTR lpcmd = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands : gszS3mCommands;
+ if (c)
{
- pModDoc->SetModified();
- InvalidateArea(sel, sel+5);
- UpdateIndicator();
+ if ((c == m_cmdOld.command) && (!p->param) && (!p->command)) p->param = m_cmdOld.param;
+ else m_cmdOld.param = 0;
+ m_cmdOld.command = c;
}
+ p->command = c;
+
+ // Check for MOD/XM Speed/Tempo command
+ if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
+ && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO)))
+ {
+ UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20;
+ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO;
+ }
}
+
+ DWORD sel = (m_nRow << 16) | m_dwCursor;
+ SetCurSel(sel, sel);
+ sel &= ~7;
+ if(oldcmd != *p)
+ {
+ pModDoc->SetModified();
+ InvalidateArea(sel, sel+5);
+ UpdateIndicator();
+ }
} // end if mainframe & moddoc exist
}
@@ -3627,38 +3710,42 @@
if ((pModDoc) && (pMainFrm))
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODCOMMAND oldcmd; // This is the command we are about to overwrite
MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, GetChanFromCursor(m_dwCursor));
- oldcmd = *p;
+ MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite
PrepareUndo(m_dwBeginSel, m_dwEndSel);
- //if(enterAsAbsoluteValue) p->param = v;
- //else p->param = (p->param << 4) | v;
-
- p->param = (p->param << 4) | v;
- if (p->command == m_cmdOld.command) m_cmdOld.param = p->param;
-
-/*
- if (v >= 0 && v <= 9)
+ if(p->note == NOTE_PC || p->note == NOTE_PCS)
{
- p->param = (p->param << 4) | v;
- if (p->command == m_cmdOld.command) m_cmdOld.param = p->param;
+ ENTER_PCNOTE_VALUE(v, ValueEffectCol);
}
- else if (v >= 10 && v <= 15)
+ else
{
- p->param = (p->param << 4) | (v + 0x0A);
+
+ p->param = (p->param << 4) | v;
if (p->command == m_cmdOld.command) m_cmdOld.param = p->param;
+
+ /*
+ if (v >= 0 && v <= 9)
+ {
+ p->param = (p->param << 4) | v;
+ if (p->command == m_cmdOld.command) m_cmdOld.param = p->param;
+ }
+ else if (v >= 10 && v <= 15)
+ {
+ p->param = (p->param << 4) | (v + 0x0A);
+ if (p->command == m_cmdOld.command) m_cmdOld.param = p->param;
+ }
+ */
+ // Check for MOD/XM Speed/Tempo command
+ if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
+ && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO)))
+ {
+ UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20;
+ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO;
+ }
}
-*/
- // Check for MOD/XM Speed/Tempo command
- if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM))
- && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO)))
- {
- UINT maxspd = (pSndFile->m_nType & MOD_TYPE_XM) ? 0x1F : 0x20;
- p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO;
- }
if (IsEditingEnabled())
{
@@ -3930,12 +4017,28 @@
UINT nRow = m_nRow;
CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ // Check whether the module format supports the note.
+ if( pSndFile->HasNote(note) == false )
+ return;
+
UINT nChn = GetChanFromCursor(m_dwCursor);
BYTE recordGroup = pModDoc->IsChannelRecord(nChn);
UINT nPlayIns = 0;
PrepareUndo(m_dwBeginSel, m_dwEndSel);
- if (note > NOTE_MAX && note < 254) note = NOTE_MAX;
+ //Param control 'note'
+ if((note == NOTE_PC || note == NOTE_PCS) && IsEditingEnabled())
+ {
+ pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, nChn)->note = note;
+ const DWORD sel = (nRow << 16) | m_dwCursor;
+ pModDoc->SetModified();
+ InvalidateArea(sel, sel+5);
+ UpdateIndicator();
+ return;
+ }
+
+ if (note > NOTE_MAX && note<254) note = NOTE_MAX;
+
bool usePlaybackPosition = (m_dwStatus & PATSTATUS_FOLLOWSONG) && // work out whether we should use
(pMainFrm->GetFollowSong(pModDoc) == m_hWnd) && // player engine position or
!(pSndFile->IsPaused()) && // edit cursor position
@@ -4106,7 +4209,7 @@
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase;
MODCOMMAND oldcmd; // This is the command we are about to overwrite
- UINT nChn = (m_dwCursor & 0xFFFF) >> 3;
+ UINT nChn = GetChanFromCursor(m_dwCursor);
UINT nPlayIns = 0;
PrepareUndo(m_dwBeginSel, m_dwEndSel);
bool isSplit;
@@ -4256,16 +4359,12 @@
switch(field)
{
- case 0: p->note = 0; if (ITStyle) p->instr = 0; break; //Note
+ case 0: if(p->note == NOTE_PC || p->note == NOTE_PCS) p->Clear(); else {p->note = 0; if (ITStyle) p->instr = 0;} break; //Note
case 1: p->instr = 0; break; //instr
case 2: p->vol = 0; p->volcmd = 0; break; //Vol
case 3: p->command = 0; break; //Effect
case 4: p->param = 0; break; //Param
- default: p->note = 0; //If not specified, delete them all! :)
- p->instr = 0;
- p->vol = 0; p->volcmd = 0;
- p->command = 0;
- p->param = 0;
+ default: p->Clear(); //If not specified, delete them all! :)
}
if(IsEditingEnabled_bmsg())
@@ -4790,28 +4889,32 @@
bool CViewPattern::IsInterpolationPossible(UINT startRow, UINT endRow,
UINT chan, UINT colType, CSoundFile* pSndFile) {
//---------------------------------------------------------------------------------------
- bool result = false;
- MODCOMMAND *pcmd = pSndFile->Patterns[m_nPattern];
- UINT startRowCmd, endRowCmd;
-
if (startRow == endRow) {
return false;
}
+ bool result = false;
+ const MODCOMMAND startRowMC = *pSndFile->Patterns[m_nPattern].GetpModCommand(startRow, chan);
+ const MODCOMMAND endRowMC = *pSndFile->Patterns[m_nPattern].GetpModCommand(endRow, chan);
+ UINT startRowCmd, endRowCmd;
+
+ if(colType == EFFECT_COLUMN && (startRowMC.note == NOTE_PC || startRowMC.note == NOTE_PCS || endRowMC.note == NOTE_PC || endRowMC.note == NOTE_PCS))
+ return true;
+
switch (colType) {
case NOTE_COLUMN:
- startRowCmd = pcmd[startRow*pSndFile->m_nChannels+chan].note;
- endRowCmd = pcmd[endRow*pSndFile->m_nChannels+chan].note;
+ startRowCmd = startRowMC.note;
+ endRowCmd = endRowMC.note;
result = (startRowCmd>0 && endRowCmd>0);
break;
case EFFECT_COLUMN:
- startRowCmd = pcmd[startRow*pSndFile->m_nChannels+chan].command;
- endRowCmd = pcmd[endRow*pSndFile->m_nChannels+chan].command;
+ startRowCmd = startRowMC.command;
+ endRowCmd = endRowMC.command;
result = (startRowCmd == endRowCmd) && (startRowCmd>0 && endRowCmd>0);
break;
case VOL_COLUMN:
- startRowCmd = pcmd[startRow*pSndFile->m_nChannels+chan].volcmd;
- endRowCmd = pcmd[endRow*pSndFile->m_nChannels+chan].volcmd;
+ startRowCmd = startRowMC.volcmd;
+ endRowCmd = endRowMC.volcmd;
result = (startRowCmd == endRowCmd) && (startRowCmd>0 && endRowCmd>0);
break;
default:
Modified: branches/devBranch_1_17_03/mptrack/View_pat.h
===================================================================
--- branches/devBranch_1_17_03/mptrack/View_pat.h 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/View_pat.h 2008-08-22 18:08:38 UTC (rev 221)
@@ -36,6 +36,7 @@
VOL_COLUMN,
EFFECT_COLUMN,
PARAM_COLUMN,
+ LAST_COLUMN = PARAM_COLUMN
};
@@ -164,7 +165,7 @@
void DrawLetter(int x, int y, char letter, int sizex=10, int ofsx=0);
void DrawNote(int x, int y, UINT note, CTuning* pTuning = NULL);
void DrawInstrument(int x, int y, UINT instr);
- void DrawVolumeCommand(int x, int y, UINT volcmd, UINT vol);
+ void DrawVolumeCommand(int x, int y, const MODCOMMAND mc);
void DrawChannelVUMeter(HDC hdc, int x, int y, UINT nChn);
void UpdateAllVUMeters(MPTNOTIFICATION *pnotify);
void DrawDragSel(HDC hdc);
Modified: branches/devBranch_1_17_03/mptrack/View_smp.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/View_smp.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/View_smp.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -1903,8 +1903,10 @@
pModDoc->PlayNote(note, 0, m_nSample, FALSE, -1, loopstart, loopend);
m_dwStatus |= SMPSTATUS_KEYDOWN;
s[0] = 0;
- if ((note) && (note <= NOTE_MAX)) wsprintf(s, "%s%d", szNoteNames[(note-1)%12], (note-1)/12);
- pMainFrm->SetInfoText(s);
+ if ((note) && (note <= NOTE_MAX))
+ pMainFrm->SetInfoText(szDefaultNoteNames[note-1]);
+ else
+ pMainFrm->SetInfoText(s);
}
}
Modified: branches/devBranch_1_17_03/mptrack/View_tre.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/View_tre.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/View_tre.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -400,8 +400,7 @@
for (UINT iPerc=24; iPerc<=84; iPerc++)
{
DWORD dwImage = IMAGE_NOSAMPLE;
- wsprintf(s, "%s%d: %s", szNoteNames[iPerc%12], iPerc/12,
- szMidiPercussionNames[iPerc-24]);
+ wsprintf(s, "%s: %s", szDefaultNoteNames[iPerc], szMidiPercussionNames[iPerc-24]);
if ((lpMidiLib) && (lpMidiLib->MidiMap[iPerc|0x80]) && (lpMidiLib->MidiMap[iPerc|0x80][0]))
{
_splitpath(lpMidiLib->MidiMap[iPerc|0x80], NULL, NULL, szName, szExt);
Modified: branches/devBranch_1_17_03/mptrack/Vstplug.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/Vstplug.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Vstplug.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -1928,11 +1928,11 @@
}
-FLOAT CVstPlugin::GetParameter(UINT nIndex)
-//-----------------------------------------
+PlugParamValue CVstPlugin::GetParameter(PlugParamIndex nIndex)
+//------------------------------------------------------------
{
FLOAT fResult = 0;
- if ((m_pEffect) && ((long)nIndex < m_pEffect->numParams) && (m_pEffect->getParameter))
+ if ((m_pEffect) && (nIndex < m_pEffect->numParams) && (m_pEffect->getParameter))
{
try {
fResult = m_pEffect->getParameter(m_pEffect, nIndex);
@@ -1951,11 +1951,11 @@
}
-VOID CVstPlugin::SetParameter(UINT nIndex, FLOAT fValue)
-//------------------------------------------------------
+VOID CVstPlugin::SetParameter(PlugParamIndex nIndex, PlugParamValue fValue)
+//-------------------------------------------------------------------------
{
try {
- if ((m_pEffect) && ((long)nIndex < m_pEffect->numParams) && (m_pEffect->setParameter))
+ if ((m_pEffect) && (nIndex < m_pEffect->numParams) && (m_pEffect->setParameter))
{
if ((fValue >= 0.0f) && (fValue <= 1.0f))
m_pEffect->setParameter(m_pEffect, nIndex, fValue);
Modified: branches/devBranch_1_17_03/mptrack/Vstplug.h
===================================================================
--- branches/devBranch_1_17_03/mptrack/Vstplug.h 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/Vstplug.h 2008-08-22 18:08:38 UTC (rev 221)
@@ -125,8 +125,8 @@
//BOOL SavePreset(LPCSTR lpszFileName);
//BOOL LoadPreset(LPCSTR lpszFileName);
// -! NEW_FEATURE#0002
- FLOAT GetParameter(UINT nIndex);
- VOID SetParameter(UINT nIndex, FLOAT fValue);
+ PlugParamValue GetParameter(PlugParamIndex nIndex);
+ VOID SetParameter(PlugParamIndex nIndex, PlugParamValue fValue);
VOID GetParamName(UINT nIndex, LPSTR pszName, UINT cbSize);
VOID GetParamLabel(UINT nIndex, LPSTR pszLabel);
VOID GetParamDisplay(UINT nIndex, LPSTR pszDisplay);
Modified: branches/devBranch_1_17_03/mptrack/dlg_misc.cpp
===================================================================
--- branches/devBranch_1_17_03/mptrack/dlg_misc.cpp 2008-08-17 11:30:18 UTC (rev 220)
+++ branches/devBranch_1_17_03/mptrack/dlg_misc.cpp 2008-08-22 18:08:38 UTC (rev 221)
@@ -11,7 +11,7 @@
#include "midi.h"
#include "version.h"
-#pragma warning(disable:4244)
+//#pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data"
@@ -22,7 +22,7 @@
{
if(xparam == NULL || multiplier == NULL) return;
- MODCOMMAND mca;
+ MODCOMMAND mca = MODCOMMAND::Empty();
UINT i,xp = 0, ml = 1;
int nCmdRow = (int)nRow;
@@ -620,24 +620,20 @@
// Note
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL)
{
+ combo->InitStorage(150, 4);
combo->SetItemData(combo->AddString("..."), 0);
if (m_bReplace)
{
- combo->SetItemData(combo->AddString("note-1"), 0xFC);
- combo->SetItem...
[truncated message content] |