You can subscribe to this list here.
| 2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
| 2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
| 2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
| 2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
| 2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
| 2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
| 2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
| 2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
| 2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
| 2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
| 2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
| 2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
| 2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
| 2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
| 2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
| 2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
| 2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
| 2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
| 2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(213) |
Aug
(203) |
Sep
(148) |
Oct
(109) |
Nov
(191) |
Dec
(209) |
| 2026 |
Jan
(127) |
Feb
(123) |
Mar
(160) |
Apr
(141) |
May
(49) |
Jun
(55) |
Jul
(91) |
Aug
(191) |
Sep
|
Oct
(68) |
Nov
|
Dec
|
|
From: <sag...@us...> - 2010-02-24 17:06:07
|
Revision: 510
http://modplug.svn.sourceforge.net/modplug/?rev=510&view=rev
Author: saga-games
Date: 2010-02-24 17:05:58 +0000 (Wed, 24 Feb 2010)
Log Message:
-----------
[Fix] XM Loader: Early versions of Skale Tracker (R.I.P.) apparently did stupid things to XM instrument headers, so mpt failed to load such modules. Tested the fix with a few hundred XMs and apparently only one XM (IFULOVE.XM) that I have has a header size that is different from the struct size - and that's the one that caused problems.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2010-02-23 15:53:10 UTC (rev 509)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2010-02-24 17:05:58 UTC (rev 510)
@@ -302,10 +302,11 @@
memset(samples_used, 0, sizeof(samples_used));
unused_samples = 0;
+
// Reading instruments
for (INSTRUMENTINDEX iIns = 1; iIns <= m_nInstruments; iIns++)
{
- XMINSTRUMENTHEADER *pih;
+ XMINSTRUMENTHEADER pih;
BYTE flags[32];
DWORD samplesize[32];
UINT samplemap[32];
@@ -315,17 +316,18 @@
DWORD ihsize = LittleEndian(*((DWORD *)(lpStream + dwMemPos)));
if (dwMemPos + ihsize >= dwMemLength) return true;
- pih = (XMINSTRUMENTHEADER *)(lpStream + dwMemPos);
- if (dwMemPos + LittleEndian(pih->size) > dwMemLength) return true;
+ memset(&pih, 0, sizeof(pih));
+ memcpy(&pih, lpStream + dwMemPos, min(sizeof(pih), ihsize));
+
if ((Instruments[iIns] = new MODINSTRUMENT) == nullptr) continue;
memcpy(Instruments[iIns], &m_defaultInstrument, sizeof(MODINSTRUMENT));
Instruments[iIns]->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
- memcpy(Instruments[iIns]->name, pih->name, 22);
+ memcpy(Instruments[iIns]->name, pih.name, 22);
SpaceToNullStringFixed(Instruments[iIns]->name, 22);
- if ((nsamples = pih->samples) > 0)
+ if ((nsamples = pih.samples) > 0)
{
/* we have samples, so let's read the rest of this instrument
the header that is being read here is not the sample header, though,
@@ -353,19 +355,23 @@
if(xmsh.midichannel != 0 || xmsh.midienabled != 0 || xmsh.midiprogram != 0 || xmsh.mutecomputer != 0 || xmsh.pitchwheelrange != 0)
bIsFT2 = true; // definitely not MPT. (or any other tracker)
- dwMemPos += LittleEndian(pih->size);
+ dwMemPos += LittleEndian(pih.size);
} else
{
- if (LittleEndian(pih->size)) dwMemPos += LittleEndian(pih->size);
- else dwMemPos += sizeof(XMINSTRUMENTHEADER);
+ if (LittleEndian(pih.size))
+ dwMemPos += LittleEndian(pih.size);
+ else
+ dwMemPos += sizeof(XMINSTRUMENTHEADER);
continue;
}
+
memset(samplemap, 0, sizeof(samplemap));
if (nsamples > 32) return true;
UINT newsamples = m_nSamples;
- for (UINT nmap=0; nmap<nsamples; nmap++)
+
+ for (UINT nmap = 0; nmap < nsamples; nmap++)
{
- UINT n = m_nSamples+nmap+1;
+ UINT n = m_nSamples + nmap + 1;
if (n >= MAX_SAMPLES)
{
n = m_nSamples;
@@ -432,7 +438,7 @@
m_nSamples = newsamples;
// Reading Volume Envelope
MODINSTRUMENT *pIns = Instruments[iIns];
- pIns->nMidiProgram = pih->type;
+ pIns->nMidiProgram = pih.type;
pIns->nFadeOut = xmsh.volfade;
pIns->nPan = 128;
pIns->nPPC = 5*12;
@@ -497,11 +503,11 @@
{
if ((dwMemPos + sizeof(xmss) > dwMemLength)
|| (dwMemPos + xmsh.shsize > dwMemLength)) return true;
- memcpy(&xmss, lpStream+dwMemPos, sizeof(xmss));
+ memcpy(&xmss, lpStream + dwMemPos, sizeof(xmss));
xmss.samplen = LittleEndian(xmss.samplen);
xmss.loopstart = LittleEndian(xmss.loopstart);
xmss.looplen = LittleEndian(xmss.looplen);
- dwMemPos += xmsh.shsize;
+ dwMemPos += sizeof(XMSAMPLESTRUCT); // was: dwMemPos += xmsh.shsize; (this fixes IFULOVE.XM)
flags[ins] = (xmss.type & 0x10) ? RS_PCM16D : RS_PCM8D;
if (xmss.type & 0x20) flags[ins] = (xmss.type & 0x10) ? RS_STPCM16D : RS_STPCM8D;
samplesize[ins] = xmss.samplen;
@@ -665,6 +671,7 @@
// Check various things to find out whether this has been made with MPT.
// Null chars in names -> most likely made with MPT, which disguises as FT2
if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug && !bIsFT2) bMadeWithModPlug = true;
+ if (memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20)) bMadeWithModPlug = false; // this could happen f.e. with (early?) versions of Sk@le
if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v 2.00 ", 20))
{
// Early MPT 1.0 alpha/beta versions
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-23 15:53:19
|
Revision: 509
http://modplug.svn.sourceforge.net/modplug/?rev=509&view=rev
Author: saga-games
Date: 2010-02-23 15:53:10 +0000 (Tue, 23 Feb 2010)
Log Message:
-----------
[New] Instrument Editor: Envelope zooming. Might still look very weird (especially the first tick and around loop points). Includes two new keyboard shortcuts.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/mptrack/res/envbar.bmp
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2010-02-22 20:53:09 UTC (rev 508)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2010-02-23 15:53:10 UTC (rev 509)
@@ -2565,7 +2565,17 @@
commands[kcPatternEditPCNotePlugin].isDummy = false;
commands[kcPatternEditPCNotePlugin].Message = "Edit plugin assigned to PC note";
- #ifdef _DEBUG
+ commands[kcInstrumentEnvelopeZoomIn].UID = 1837;
+ commands[kcInstrumentEnvelopeZoomIn].isHidden = false;
+ commands[kcInstrumentEnvelopeZoomIn].isDummy = false;
+ commands[kcInstrumentEnvelopeZoomIn].Message = "Zoom In";
+
+ commands[kcInstrumentEnvelopeZoomOut].UID = 1838;
+ commands[kcInstrumentEnvelopeZoomOut].isHidden = false;
+ commands[kcInstrumentEnvelopeZoomOut].isDummy = false;
+ commands[kcInstrumentEnvelopeZoomOut].Message = "Zoom Out";
+
+#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
for (int j=i+1; j<kcNumCommands; j++) {
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2010-02-22 20:53:09 UTC (rev 508)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2010-02-23 15:53:10 UTC (rev 509)
@@ -550,6 +550,8 @@
kcInstrumentLoad=kcStartInstrumentMisc,
kcInstrumentSave,
kcInstrumentNew,
+ kcInstrumentEnvelopeZoomIn,
+ kcInstrumentEnvelopeZoomOut,
kcInstrumentEnvelopePointPrev,
kcInstrumentEnvelopePointNext,
kcInstrumentEnvelopePointMoveLeft,
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2010-02-22 20:53:09 UTC (rev 508)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-02-23 15:53:10 UTC (rev 509)
@@ -319,6 +319,10 @@
IIMAGE_NOFILTERSWITCH,
IIMAGE_SAMPLEMAP,
IIMAGE_GRID,
+ IIMAGE_ZOOMIN,
+ IIMAGE_NOZOOMIN,
+ IIMAGE_ZOOMOUT,
+ IIMAGE_NOZOOMOUT,
};
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2010-02-22 20:53:09 UTC (rev 508)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2010-02-23 15:53:10 UTC (rev 509)
@@ -12,7 +12,9 @@
#include ".\view_ins.h"
#include "midi.h"
-#define ENV_ZOOM 4
+#define ENV_ZOOM 4.0f
+#define ENV_MIN_ZOOM 2.0f
+#define ENV_MAX_ZOOM 100.0f
#define ENV_DRAGLOOPSTART (MAX_ENVPOINTS + 1)
#define ENV_DRAGLOOPEND (MAX_ENVPOINTS + 2)
#define ENV_DRAGSUSTAINSTART (MAX_ENVPOINTS + 3)
@@ -45,6 +47,8 @@
ID_SEPARATOR,
ID_ENVELOPE_VIEWGRID, //rewbs.envRowGrid
ID_SEPARATOR,
+ ID_ENVELOPE_ZOOM_IN,
+ ID_ENVELOPE_ZOOM_OUT,
};
@@ -81,6 +85,8 @@
ON_COMMAND(ID_ENVELOPE_PITCH, OnEnvPitchChanged)
ON_COMMAND(ID_ENVELOPE_FILTER, OnEnvFilterChanged)
ON_COMMAND(ID_ENVELOPE_VIEWGRID, OnEnvToggleGrid) //rewbs.envRowGrid
+ ON_COMMAND(ID_ENVELOPE_ZOOM_IN, OnEnvZoomIn)
+ ON_COMMAND(ID_ENVELOPE_ZOOM_OUT, OnEnvZoomOut)
ON_COMMAND(ID_ENVSEL_VOLUME, OnSelectVolumeEnv)
ON_COMMAND(ID_ENVSEL_PANNING, OnSelectPanningEnv)
ON_COMMAND(ID_ENVSEL_PITCH, OnSelectPitchEnv)
@@ -118,7 +124,7 @@
m_GridScrollPos = -1;
//end rewbs.envRowGrid
m_nDragItem = 1;
-
+ m_fZoom = ENV_ZOOM;
}
@@ -142,9 +148,9 @@
SIZE sizeTotal, sizePage, sizeLine;
UINT ntickmax = EnvGetTick(EnvGetLastPoint());
- sizeTotal.cx = (ntickmax + 2) * ENV_ZOOM;
+ sizeTotal.cx = (INT)((ntickmax + 2) * m_fZoom);
sizeTotal.cy = 1;
- sizeLine.cx = ENV_ZOOM;
+ sizeLine.cx = (INT)m_fZoom;
sizeLine.cy = 2;
sizePage.cx = sizeLine.cx * 4;
sizePage.cy = sizeLine.cy;
@@ -625,7 +631,7 @@
int CViewInstrument::TickToScreen(int nTick) const
//------------------------------------------------
{
- return ((nTick+1) * ENV_ZOOM) - GetScrollPos(SB_HORZ);
+ return ((int)((nTick + 1) * m_fZoom)) - GetScrollPos(SB_HORZ);
}
int CViewInstrument::PointToScreen(int nPoint) const
@@ -638,14 +644,14 @@
int CViewInstrument::ScreenToTick(int x) const
//--------------------------------------------
{
- return (GetScrollPos(SB_HORZ) + x + 1 - ENV_ZOOM) / ENV_ZOOM;
+ return (int)(((float)GetScrollPos(SB_HORZ) + (float)x + 1 - m_fZoom) / m_fZoom);
}
int CViewInstrument::QuickScreenToTick(int x, int cachedScrollPos) const
//----------------------------------------------------------------------
{
- return (cachedScrollPos + x + 1 - ENV_ZOOM) / ENV_ZOOM;
+ return (int)(((float)cachedScrollPos + (float)x + 1 - m_fZoom) / m_fZoom);
}
int CViewInstrument::ScreenToValue(int y) const
@@ -745,6 +751,8 @@
case ID_ENVELOPE_FILTER: if (!(pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) dwStyle |= NCBTNS_DISABLED; else
if (EnvGetFilterEnv()) dwStyle |= NCBTNS_CHECKED; break;
case ID_ENVELOPE_VIEWGRID: if (m_bGrid) dwStyle |= NCBTNS_CHECKED; break;
+ case ID_ENVELOPE_ZOOM_IN: if (m_fZoom >= ENV_MAX_ZOOM) dwStyle |= NCBTNS_DISABLED; break;
+ case ID_ENVELOPE_ZOOM_OUT: if (m_fZoom <= ENV_MIN_ZOOM) dwStyle |= NCBTNS_DISABLED; break;
}
if (m_nBtnMouseOver == i)
{
@@ -884,10 +892,10 @@
// Drawing Loop Start/End
if (EnvGetLoop())
{
- int x1 = PointToScreen(EnvGetLoopStart()) - (ENV_ZOOM/2);
+ int x1 = PointToScreen(EnvGetLoopStart()) - (int)(m_fZoom / 2);
m_dcMemMain.MoveTo(x1, 0);
m_dcMemMain.LineTo(x1, m_rcClient.bottom);
- int x2 = PointToScreen(EnvGetLoopEnd()) + (ENV_ZOOM/2);
+ int x2 = PointToScreen(EnvGetLoopEnd()) + (int)(m_fZoom / 2);
m_dcMemMain.MoveTo(x2, 0);
m_dcMemMain.LineTo(x2, m_rcClient.bottom);
}
@@ -897,12 +905,12 @@
m_dcMemMain.SelectObject(CMainFrame::penHalfDarkGray);
int nspace = m_rcClient.bottom/4;
int n1 = EnvGetSustainStart();
- int x1 = PointToScreen(n1) - (ENV_ZOOM/2);
+ int x1 = PointToScreen(n1) - (int)(m_fZoom / 2);
int y1 = ValueToScreen(EnvGetValue(n1));
m_dcMemMain.MoveTo(x1, y1 - nspace);
m_dcMemMain.LineTo(x1, y1+nspace);
int n2 = EnvGetSustainEnd();
- int x2 = PointToScreen(n2) + (ENV_ZOOM/2);
+ int x2 = PointToScreen(n2) + (int)(m_fZoom / 2);
int y2 = ValueToScreen(EnvGetValue(n2));
m_dcMemMain.MoveTo(x2, y2-nspace);
m_dcMemMain.LineTo(x2, y2+nspace);
@@ -916,7 +924,7 @@
UINT releaseNode = EnvGetReleaseNode();
for (UINT i=0; i<=maxpoint; i++)
{
- int x = (EnvGetTick(i) + 1) * ENV_ZOOM - nScrollPos;
+ int x = (int)((EnvGetTick(i) + 1) * m_fZoom) - nScrollPos;
int y = ValueToScreen(EnvGetValue(i));
rect.left = x - 3;
rect.top = y - 3;
@@ -1222,6 +1230,8 @@
case ID_ENVELOPE_FILTER: nImage = (dwStyle & NCBTNS_DISABLED) ? IIMAGE_NOFILTERSWITCH : IIMAGE_FILTERSWITCH; break;
case ID_INSTRUMENT_SAMPLEMAP: nImage = IIMAGE_SAMPLEMAP; break;
case ID_ENVELOPE_VIEWGRID: nImage = IIMAGE_GRID; break;
+ case ID_ENVELOPE_ZOOM_IN: nImage = (dwStyle & NCBTNS_DISABLED) ? IIMAGE_NOZOOMIN : IIMAGE_ZOOMIN; break;
+ case ID_ENVELOPE_ZOOM_OUT: nImage = (dwStyle & NCBTNS_DISABLED) ? IIMAGE_NOZOOMOUT : IIMAGE_ZOOMOUT; break;
}
pDC->Draw3dRect(rect.left-1, rect.top-1, ENV_LEFTBAR_CXBTN+2, ENV_LEFTBAR_CYBTN+2, c3, c4);
pDC->Draw3dRect(rect.left, rect.top, ENV_LEFTBAR_CXBTN, ENV_LEFTBAR_CYBTN, c1, c2);
@@ -1467,12 +1477,12 @@
if (pt.x <= 0)
{
UpdateScrollSize();
- OnScrollBy(CSize(pt.x-ENV_ZOOM, 0), TRUE);
+ OnScrollBy(CSize(pt.x - (int)m_fZoom, 0), TRUE);
}
if (pt.x >= m_rcClient.right-1)
{
UpdateScrollSize();
- OnScrollBy(CSize(ENV_ZOOM+pt.x-m_rcClient.right, 0), TRUE);
+ OnScrollBy(CSize((int)m_fZoom + pt.x - m_rcClient.right, 0), TRUE);
}
pModDoc->SetModified();
pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
@@ -1487,7 +1497,7 @@
rect.top = ValueToScreen(EnvGetValue(EnvGetSustainStart())) - nspace;
rect.bottom = rect.top + nspace * 2;
rect.right = PointToScreen(EnvGetSustainStart()) + 1;
- rect.left = rect.right - ENV_ZOOM*2;
+ rect.left = rect.right - (int)(m_fZoom * 2);
if (rect.PtInRect(pt))
{
bSplitCursor = TRUE; // ENV_DRAGSUSTAINSTART;
@@ -1496,7 +1506,7 @@
rect.top = ValueToScreen(EnvGetValue(EnvGetSustainEnd())) - nspace;
rect.bottom = rect.top + nspace * 2;
rect.left = PointToScreen(EnvGetSustainEnd()) - 1;
- rect.right = rect.left + ENV_ZOOM*2;
+ rect.right = rect.left + (int)(m_fZoom *2);
if (rect.PtInRect(pt)) bSplitCursor = TRUE; // ENV_DRAGSUSTAINEND;
}
}
@@ -1505,14 +1515,14 @@
rect.top = m_rcClient.top;
rect.bottom = m_rcClient.bottom;
rect.right = PointToScreen(EnvGetLoopStart()) + 1;
- rect.left = rect.right - ENV_ZOOM*2;
+ rect.left = rect.right - (int)(m_fZoom * 2);
if (rect.PtInRect(pt))
{
bSplitCursor = TRUE; // ENV_DRAGLOOPSTART;
} else
{
rect.left = PointToScreen(EnvGetLoopEnd()) - 1;
- rect.right = rect.left + ENV_ZOOM*2;
+ rect.right = rect.left + (int)(m_fZoom * 2);
if (rect.PtInRect(pt)) bSplitCursor = TRUE; // ENV_DRAGLOOPEND;
}
}
@@ -1564,7 +1574,7 @@
rect.top = ValueToScreen(EnvGetValue(EnvGetSustainStart())) - nspace;
rect.bottom = rect.top + nspace * 2;
rect.right = PointToScreen(EnvGetSustainStart()) + 1;
- rect.left = rect.right - ENV_ZOOM*2;
+ rect.left = rect.right - (int)(m_fZoom * 2);
if (rect.PtInRect(pt))
{
m_nDragItem = ENV_DRAGSUSTAINSTART;
@@ -1573,7 +1583,7 @@
rect.top = ValueToScreen(EnvGetValue(EnvGetSustainEnd())) - nspace;
rect.bottom = rect.top + nspace * 2;
rect.left = PointToScreen(EnvGetSustainEnd()) - 1;
- rect.right = rect.left + ENV_ZOOM*2;
+ rect.right = rect.left + (int)(m_fZoom * 2);
if (rect.PtInRect(pt)) m_nDragItem = ENV_DRAGSUSTAINEND;
}
}
@@ -1582,14 +1592,14 @@
rect.top = m_rcClient.top;
rect.bottom = m_rcClient.bottom;
rect.right = PointToScreen(EnvGetLoopStart()) + 1;
- rect.left = rect.right - ENV_ZOOM * 2;
+ rect.left = rect.right - (int)(m_fZoom * 2);
if (rect.PtInRect(pt))
{
m_nDragItem = ENV_DRAGLOOPSTART;
} else
{
rect.left = PointToScreen(EnvGetLoopEnd()) - 1;
- rect.right = rect.left + ENV_ZOOM*2;
+ rect.right = rect.left + (int)(m_fZoom * 2);
if (rect.PtInRect(pt)) m_nDragItem = ENV_DRAGLOOPEND;
}
}
@@ -1813,7 +1823,7 @@
//rewbs.envRowGrid
void CViewInstrument::OnEnvToggleGrid()
-//----------------------------------------
+//-------------------------------------
{
m_bGrid = !m_bGrid;
if (m_bGrid)
@@ -1862,7 +1872,7 @@
void CViewInstrument::PlayNote(UINT note)
-//-----------------------------------------------------------------
+//---------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
CModDoc *pModDoc = GetDocument();
@@ -2187,6 +2197,8 @@
case kcInstrumentNew: SendCtrlMessage(IDC_INSTRUMENT_NEW); return wParam;
// envelope editor
+ case kcInstrumentEnvelopeZoomIn: OnEnvZoomIn(); return wParam;
+ case kcInstrumentEnvelopeZoomOut: OnEnvZoomOut(); return wParam;
case kcInstrumentEnvelopePointPrev: EnvKbdSelectPrevPoint(); return wParam;
case kcInstrumentEnvelopePointNext: EnvKbdSelectNextPoint(); return wParam;
case kcInstrumentEnvelopePointMoveLeft: EnvKbdMovePointLeft(); return wParam;
@@ -2242,6 +2254,17 @@
}
+void CViewInstrument::EnvSetZoom(float fNewZoom)
+//----------------------------------------------
+{
+ m_fZoom = fNewZoom;
+ Limit(m_fZoom, ENV_MIN_ZOOM, ENV_MAX_ZOOM);
+ InvalidateRect(NULL, FALSE);
+ UpdateScrollSize();
+ UpdateNcButtonState();
+}
+
+
////////////////////////////////////////
// Envelope Editor - Keyboard actions
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2010-02-22 20:53:09 UTC (rev 508)
+++ trunk/OpenMPT/mptrack/View_ins.h 2010-02-23 15:53:10 UTC (rev 509)
@@ -6,7 +6,7 @@
#define INSSTATUS_SPLITCURSOR 0x04
// Non-Client toolbar buttons
-#define ENV_LEFTBAR_BUTTONS 17
+#define ENV_LEFTBAR_BUTTONS 19
//==========================================
class CViewInstrument: public CModScrollView
@@ -34,6 +34,8 @@
CDC m_dcMemMain;
CBitmap m_bmpMemMain;
CBitmap* oldBitmap;
+
+ float m_fZoom;
//rewbs.envRowGrid
public:
@@ -133,6 +135,10 @@
void PlayNote(UINT note); //rewbs.customKeys
void DrawGrid(CDC *memDC, UINT speed); //rewbs.envRowGrid
+ void OnEnvZoomIn() { EnvSetZoom(m_fZoom + 1); };
+ void OnEnvZoomOut() { EnvSetZoom(m_fZoom - 1); };
+ void EnvSetZoom(float fNewZoom);
+
public:
//{{AFX_VIRTUAL(CViewInstrument)
virtual void OnDraw(CDC *);
Modified: trunk/OpenMPT/mptrack/res/envbar.bmp
===================================================================
(Binary files differ)
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2010-02-22 20:53:09 UTC (rev 508)
+++ trunk/OpenMPT/mptrack/resource.h 2010-02-23 15:53:10 UTC (rev 509)
@@ -1203,6 +1203,8 @@
#define ID_NOTEMAP_TRANS_UP 60446
#define ID_NOTEMAP_TRANS_DOWN 60447
#define ID_PATTERN_EDIT_PCNOTE_PLUGIN 60448
+#define ID_ENVELOPE_ZOOM_IN 60449
+#define ID_ENVELOPE_ZOOM_OUT 60450
// Next default values for new objects
//
@@ -1210,7 +1212,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 526
-#define _APS_NEXT_COMMAND_VALUE 60449
+#define _APS_NEXT_COMMAND_VALUE 60451
#define _APS_NEXT_CONTROL_VALUE 2427
#define _APS_NEXT_SYMED_VALUE 901
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-22 20:53:16
|
Revision: 508
http://modplug.svn.sourceforge.net/modplug/?rev=508&view=rev
Author: saga-games
Date: 2010-02-22 20:53:09 +0000 (Mon, 22 Feb 2010)
Log Message:
-----------
[Fix] Pattern Editor: Now, plugin slot 100 can also be automated using PC Notes.
[Fix] Instrument Editor: It was impossible to assign plugin slot 100 to an instrument.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-02-22 00:21:17 UTC (rev 507)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-02-22 20:53:09 UTC (rev 508)
@@ -1174,7 +1174,7 @@
} else {
m_CbnMidiCh.SetCurSel(0);
}
- if (pIns->nMixPlug < MAX_MIXPLUGINS) {
+ if (pIns->nMixPlug <= MAX_MIXPLUGINS) {
m_CbnMixPlug.SetCurSel(pIns->nMixPlug);
} else {
m_CbnMixPlug.SetCurSel(0);
@@ -2027,7 +2027,7 @@
//---------------------------------------
{
MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument];
- BYTE nPlug = static_cast<BYTE>(m_CbnMixPlug.GetItemData(m_CbnMixPlug.GetCurSel()) & 0xff);
+ PLUGINDEX nPlug = static_cast<PLUGINDEX>(m_CbnMixPlug.GetItemData(m_CbnMixPlug.GetCurSel()) & 0xff); // TODO is the 0xFF necessary?
if (pIns)
{
@@ -2042,7 +2042,7 @@
m_CbnPluginVolumeHandling.EnableWindow();
}
- if (nPlug>=0 && nPlug<MAX_MIXPLUGINS+1)
+ if (nPlug>=0 && nPlug <= MAX_MIXPLUGINS)
{
if ((!IsLocked()) && pIns->nMixPlug != nPlug) {
m_pModDoc->SetModified();
@@ -2852,5 +2852,5 @@
m_CbnMixPlug.SetItemData(m_CbnMixPlug.AddString(s), nPlug);
}
MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument];
- if ((pIns) && (pIns->nMixPlug < MAX_MIXPLUGINS)) m_CbnMixPlug.SetCurSel(pIns->nMixPlug);
+ if ((pIns) && (pIns->nMixPlug <= MAX_MIXPLUGINS)) m_CbnMixPlug.SetCurSel(pIns->nMixPlug);
}
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2010-02-22 00:21:17 UTC (rev 507)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-02-22 20:53:09 UTC (rev 508)
@@ -4078,13 +4078,26 @@
MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn);
MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite
- UINT instr = p->instr;
+ UINT instr = p->instr, nTotalMax, nTempMax;
+ if(p->IsPcNote()) // this is a plugin index
+ {
+ nTotalMax = MAX_MIXPLUGINS + 1;
+ nTempMax = MAX_MIXPLUGINS + 1;
+ } else if(pSndFile->GetNumInstruments() > 0) // this is an instrument index
+ {
+ nTotalMax = MAX_INSTRUMENTS;
+ nTempMax = pSndFile->GetNumInstruments();
+ } else
+ {
+ nTotalMax = MAX_SAMPLES;
+ nTempMax = pSndFile->GetNumSamples();
+ }
+
instr = ((instr * 10) + val) % 1000;
- if (instr >= MAX_INSTRUMENTS) instr = instr % 100;
- if ( ((pSndFile->m_nInstruments==0) && (pSndFile->m_nSamples<100)) || // if we're using samples & have less than 100 samples
- (pSndFile->m_nInstruments < 100)) { // or if we're using instruments and have less than 100 instruments
- instr = instr % 100; // --> ensure the entered instrument value is less than 100.
- }
+ if (instr >= nTotalMax) instr = instr % 100;
+ if (nTempMax < 100) // if we're using samples & have less than 100 samples
+ instr = instr % 100; // or if we're using instruments and have less than 100 instruments
+ // --> ensure the entered instrument value is less than 100.
p->instr = instr;
if (IsEditingEnabled_bmsg())
@@ -4973,7 +4986,7 @@
//Add options to remove instrument from selection.
AppendMenu(instrumentChangeMenu, MF_SEPARATOR, 0, 0);
AppendMenu(instrumentChangeMenu, MF_STRING, ID_CHANGE_INSTRUMENT, "Remove instrument");
- AppendMenu(instrumentChangeMenu, MF_STRING, ID_CHANGE_INSTRUMENT+GetCurrentInstrument(), "Set to current instrument");
+ AppendMenu(instrumentChangeMenu, MF_STRING, ID_CHANGE_INSTRUMENT + GetCurrentInstrument(), "Set to current instrument");
}
return true;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-22 01:08:58
|
Revision: 507
http://modplug.svn.sourceforge.net/modplug/?rev=507&view=rev
Author: saga-games
Date: 2010-02-22 00:21:17 +0000 (Mon, 22 Feb 2010)
Log Message:
-----------
[Fix] XM Loader: Last change might have changed plugin volume handling for old XM files, so let's better put those lines back.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2010-02-21 14:18:55 UTC (rev 506)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2010-02-22 00:21:17 UTC (rev 507)
@@ -319,6 +319,8 @@
if (dwMemPos + LittleEndian(pih->size) > dwMemLength) return true;
if ((Instruments[iIns] = new MODINSTRUMENT) == nullptr) continue;
memcpy(Instruments[iIns], &m_defaultInstrument, sizeof(MODINSTRUMENT));
+ Instruments[iIns]->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
+ Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
memcpy(Instruments[iIns]->name, pih->name, 22);
SpaceToNullStringFixed(Instruments[iIns]->name, 22);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-21 14:19:05
|
Revision: 506
http://modplug.svn.sourceforge.net/modplug/?rev=506&view=rev
Author: saga-games
Date: 2010-02-21 14:18:55 +0000 (Sun, 21 Feb 2010)
Log Message:
-----------
[Ref] Some refactoring in the IMF loader.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_imf.cpp
Modified: trunk/OpenMPT/soundlib/Load_imf.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_imf.cpp 2010-02-21 12:35:33 UTC (rev 505)
+++ trunk/OpenMPT/soundlib/Load_imf.cpp 2010-02-21 14:18:55 UTC (rev 506)
@@ -13,27 +13,27 @@
struct IMFCHANNEL {
char name[12]; // Channel name (ASCIIZ-String, max 11 chars)
- BYTE chorus; // Default chorus
- BYTE reverb; // Default reverb
- BYTE panning; // Pan positions 00-FF
- BYTE status; // Channel status: 0 = enabled, 1 = mute, 2 = disabled (ignore effects!)
+ uint8 chorus; // Default chorus
+ uint8 reverb; // Default reverb
+ uint8 panning; // Pan positions 00-FF
+ uint8 status; // Channel status: 0 = enabled, 1 = mute, 2 = disabled (ignore effects!)
};
struct IMFHEADER {
char title[32]; // Songname (ASCIIZ-String, max. 31 chars)
- UINT16 ordnum; // Number of orders saved
- UINT16 patnum; // Number of patterns saved
- UINT16 insnum; // Number of instruments saved
- UINT16 flags; // Module flags (&1 => linear)
- BYTE unused1[8];
- BYTE tempo; // Default tempo (Axx, 1..255)
- BYTE bpm; // Default beats per minute (BPM) (Txx, 32..255)
- BYTE master; // Default mastervolume (Vxx, 0..64)
- BYTE amp; // Amplification factor (mixing volume, 4..127)
- BYTE unused2[8];
+ uint16 ordnum; // Number of orders saved
+ uint16 patnum; // Number of patterns saved
+ uint16 insnum; // Number of instruments saved
+ uint16 flags; // Module flags (&1 => linear)
+ uint8 unused1[8];
+ uint8 tempo; // Default tempo (Axx, 1..255)
+ uint8 bpm; // Default beats per minute (BPM) (Txx, 32..255)
+ uint8 master; // Default mastervolume (Vxx, 0..64)
+ uint8 amp; // Amplification factor (mixing volume, 4..127)
+ uint8 unused2[8];
char im10[4]; // 'IM10'
IMFCHANNEL channels[32]; // Channel settings
- BYTE orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum)
+ uint8 orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum)
};
enum {
@@ -43,44 +43,44 @@
};
struct IMFENVELOPE {
- BYTE points; // Number of envelope points
- BYTE sustain; // Envelope sustain point
- BYTE loop_start; // Envelope loop start point
- BYTE loop_end; // Envelope loop end point
- BYTE flags; // Envelope flags
- BYTE unused[3];
+ uint8 points; // Number of envelope points
+ uint8 sustain; // Envelope sustain point
+ uint8 loop_start; // Envelope loop start point
+ uint8 loop_end; // Envelope loop end point
+ uint8 flags; // Envelope flags
+ uint8 unused[3];
};
struct IMFENVNODES {
- UINT16 tick;
- UINT16 value;
+ uint16 tick;
+ uint16 value;
};
struct IMFINSTRUMENT {
char name[32]; // Inst. name (ASCIIZ-String, max. 31 chars)
- BYTE map[120]; // Multisample settings
- BYTE unused[8];
+ uint8 map[120]; // Multisample settings
+ uint8 unused[8];
IMFENVNODES nodes[3][16];
IMFENVELOPE env[3];
- UINT16 fadeout; // Fadeout rate (0...0FFFH)
- UINT16 smpnum; // Number of samples in instrument
+ uint16 fadeout; // Fadeout rate (0...0FFFH)
+ uint16 smpnum; // Number of samples in instrument
char ii10[4]; // 'II10'
};
struct IMFSAMPLE {
char filename[13]; // Sample filename (12345678.ABC) */
- BYTE unused1[3];
- UINT32 length; // Length
- UINT32 loop_start; // Loop start
- UINT32 loop_end; // Loop end
- UINT32 C5Speed; // Samplerate
- BYTE volume; // Default volume (0...64)
- BYTE panning; // Default pan (0...255)
- BYTE unused2[14];
- BYTE flags; // Sample flags
- BYTE unused3[5];
- UINT16 ems; // Reserved for internal usage
- UINT32 dram; // Reserved for internal usage
+ uint8 unused1[3];
+ uint32 length; // Length
+ uint32 loop_start; // Loop start
+ uint32 loop_end; // Loop end
+ uint32 C5Speed; // Samplerate
+ uint8 volume; // Default volume (0...64)
+ uint8 panning; // Default pan (0...255)
+ uint8 unused2[14];
+ uint8 flags; // Sample flags
+ uint8 unused3[5];
+ uint16 ems; // Reserved for internal usage
+ uint32 dram; // Reserved for internal usage
char is10[4]; // 'IS10'
};
#pragma pack()
@@ -139,7 +139,8 @@
{
BYTE n;
// fix some of them
- switch (note->command) {
+ switch (note->command)
+ {
case 0xe: // fine volslide
// hackaround to get almost-right behavior for fine slides (i think!)
if (note->param == 0)
@@ -170,7 +171,8 @@
break;
case 0x21:
n = 0;
- switch (note->param >> 4) {
+ switch (note->param >> 4)
+ {
case 0:
/* undefined, but since S0x does nothing in IT anyway, we won't care.
this is here to allow S00 to pick up the previous value (assuming IMF
@@ -217,7 +219,8 @@
break;
}
note->command = (note->command < 0x24) ? imf_efftrans[note->command] : CMD_NONE;
- if (note->command == CMD_VOLUME && note->volcmd == VOLCMD_NONE) {
+ if (note->command == CMD_VOLUME && note->volcmd == VOLCMD_NONE)
+ {
note->volcmd = VOLCMD_VOLUME;
note->vol = note->param;
note->command = CMD_NONE;
@@ -238,8 +241,9 @@
env->nSustainStart = env->nSustainEnd = imfins->env[e].sustain;
env->nReleaseNode = ENV_RELEASE_NODE_UNSET;
- for (UINT n = 0; n < env->nNodes; n++) {
- UINT16 nTick, nValue;
+ for(UINT n = 0; n < env->nNodes; n++)
+ {
+ uint16 nTick, nValue;
nTick = LittleEndianW(imfins->nodes[e][n].tick);
nValue = LittleEndianW(imfins->nodes[e][n].value) >> shift;
env->Ticks[n] = (WORD)max(min, nTick);
@@ -292,7 +296,8 @@
m_nInstruments = 0;
m_nChannels = 0;
- for (CHANNELINDEX nChn = 0; nChn < 32; nChn++) {
+ for(CHANNELINDEX nChn = 0; nChn < 32; nChn++)
+ {
ChnSettings[nChn].nPan = hdr.channels[nChn].panning * 64 / 255;
ChnSettings[nChn].nPan *= 4;
@@ -300,7 +305,8 @@
SpaceToNullStringFixed(ChnSettings[nChn].szName, 12);
// TODO: reverb/chorus?
- switch (hdr.channels[nChn].status) {
+ switch(hdr.channels[nChn].status)
+ {
case 0: // enabled; don't worry about it
m_nChannels = nChn + 1;
break;
@@ -320,11 +326,11 @@
if(!m_nChannels) return false;
Order.resize(hdr.ordnum);
- for (ORDERINDEX nOrd = 0; nOrd < hdr.ordnum; nOrd++)
+ for(ORDERINDEX nOrd = 0; nOrd < hdr.ordnum; nOrd++)
Order[nOrd] = ((hdr.orderlist[nOrd] == 0xff) ? Order.GetIgnoreIndex() : (PATTERNINDEX)hdr.orderlist[nOrd]);
// read patterns
- for (PATTERNINDEX nPat = 0; nPat < hdr.patnum; nPat++)
+ for(PATTERNINDEX nPat = 0; nPat < hdr.patnum; nPat++)
{
UINT16 length, nrows;
BYTE mask, channel;
@@ -347,7 +353,8 @@
row_data = Patterns[nPat];
row = 0;
- while (row < nrows) {
+ while(row < nrows)
+ {
ASSERT_CAN_READ(1);
mask = *((BYTE *)(lpStream + dwMemPos));
dwMemPos += 1;
@@ -359,67 +366,80 @@
channel = mask & 0x1f;
- if (ignore_channels & (1 << channel)) {
+ if(ignore_channels & (1 << 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 */
//printf("disabled channel %d contains data\n", channel + 1);
note = &junk_note;
- } else {
+ } else
+ {
note = row_data + channel;
}
- if (mask & 0x20) {
+ if(mask & 0x20)
+ {
// read note/instrument
ASSERT_CAN_READ(2);
note->note = *((BYTE *)(lpStream + dwMemPos));
note->instr = *((BYTE *)(lpStream + dwMemPos + 1));
dwMemPos += 2;
- if (note->note == 160) {
+ if (note->note == 160)
+ {
note->note = NOTE_KEYOFF; /* ??? */
- } else if (note->note == 255) {
+ } else if (note->note == 255)
+ {
note->note = NOTE_NONE; /* ??? */
- } else {
+ } else
+ {
note->note = (note->note >> 4) * 12 + (note->note & 0xf) + 12 + 1;
- if (note->note > NOTE_MAX) {
+ if(note->note > NOTE_MAX)
+ {
/*printf("%d.%d.%d: funny note 0x%02x\n",
nPat, row, channel, fp->data[fp->pos - 1]);*/
note->note = NOTE_NONE;
}
}
}
- if ((mask & 0xc0) == 0xc0) {
- BYTE e1c, e1d, e2c, e2d;
+ if((mask & 0xc0) == 0xc0)
+ {
+ uint8 e1c, e1d, e2c, e2d;
// read both effects and figure out what to do with them
ASSERT_CAN_READ(4);
- e1c = *((BYTE *)(lpStream + dwMemPos));
- e1d = *((BYTE *)(lpStream + dwMemPos + 1));
- e2c = *((BYTE *)(lpStream + dwMemPos + 2));
- e2d = *((BYTE *)(lpStream + dwMemPos + 3));
+ e1c = *((uint8 *)(lpStream + dwMemPos));
+ e1d = *((uint8 *)(lpStream + dwMemPos + 1));
+ e2c = *((uint8 *)(lpStream + dwMemPos + 2));
+ e2d = *((uint8 *)(lpStream + dwMemPos + 3));
dwMemPos += 4;
- if (e1c == 0xc) {
+ if (e1c == 0xc)
+ {
note->vol = min(e1d, 0x40);
note->volcmd = VOLCMD_VOLUME;
note->command = e2c;
note->param = e2d;
- } else if (e2c == 0xc) {
+ } else if (e2c == 0xc)
+ {
note->vol = min(e2d, 0x40);
note->volcmd = VOLCMD_VOLUME;
note->command = e1c;
note->param = e1d;
- } else if (e1c == 0xa) {
+ } else if (e1c == 0xa)
+ {
note->vol = e1d * 64 / 255;
note->volcmd = VOLCMD_PANNING;
note->command = e2c;
note->param = e2d;
- } else if (e2c == 0xa) {
+ } else if (e2c == 0xa)
+ {
note->vol = e2d * 64 / 255;
note->volcmd = VOLCMD_PANNING;
note->command = e1c;
note->param = e1d;
- } else {
+ } else
+ {
/* check if one of the effects is a 'global' effect
-- if so, put it in some unused channel instead.
otherwise pick the most important effect. */
@@ -427,20 +447,22 @@
note->command = e2c;
note->param = e2d;
}
- } else if (mask & 0xc0) {
+ } else if(mask & 0xc0)
+ {
// there's one effect, just stick it in the effect column
ASSERT_CAN_READ(2);
note->command = *((BYTE *)(lpStream + dwMemPos));
note->param = *((BYTE *)(lpStream + dwMemPos + 1));
dwMemPos += 2;
}
- if (note->command)
+ if(note->command)
import_imf_effect(note);
}
}
// read instruments
- for (INSTRUMENTINDEX nIns = 0; nIns < hdr.insnum; nIns++) {
+ for (INSTRUMENTINDEX nIns = 0; nIns < hdr.insnum; nIns++)
+ {
IMFINSTRUMENT imfins;
MODINSTRUMENT *pIns;
ASSERT_CAN_READ(sizeof(IMFINSTRUMENT));
@@ -452,14 +474,16 @@
imfins.smpnum = LittleEndianW(imfins.smpnum);
imfins.fadeout = LittleEndianW(imfins.fadeout);
- if (memcmp(imfins.ii10, "II10", 4) != 0) {
+ if(memcmp(imfins.ii10, "II10", 4) != 0)
+ {
//printf("ii10 says %02x %02x %02x %02x!\n",
// imfins.ii10[0], imfins.ii10[1], imfins.ii10[2], imfins.ii10[3]);
return false;
}
pIns = new MODINSTRUMENT;
- if (!pIns) continue;
+ if(!pIns)
+ continue;
Instruments[nIns + 1] = pIns;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->nPPC = 5 * 12;
@@ -468,8 +492,10 @@
memcpy(pIns->name, imfins.name, 31);
SpaceToNullStringFixed(pIns->name, 31);
- if (imfins.smpnum) {
- for (BYTE cNote = 0; cNote < 120; cNote++) {
+ if(imfins.smpnum)
+ {
+ for(BYTE cNote = 0; cNote < 120; cNote++)
+ {
pIns->NoteMap[cNote] = cNote + 1;
pIns->Keyboard[cNote] = firstsample + imfins.map[cNote];
}
@@ -481,14 +507,16 @@
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);
- if((pIns->PitchEnv.dwFlags & ENV_ENABLED) != 0) pIns->PitchEnv.dwFlags |= ENV_FILTER;
+ if((pIns->PitchEnv.dwFlags & ENV_ENABLED) != 0)
+ pIns->PitchEnv.dwFlags |= ENV_FILTER;
// hack to get === to stop notes (from modplug's xm loader)
- if (!(pIns->VolEnv.dwFlags & ENV_ENABLED) && !pIns->nFadeOut)
+ if(!(pIns->VolEnv.dwFlags & ENV_ENABLED) && !pIns->nFadeOut)
pIns->nFadeOut = 8192;
// read this instrument's samples
- for (SAMPLEINDEX nSmp = 0; nSmp < imfins.smpnum; nSmp++) {
+ for(SAMPLEINDEX nSmp = 0; nSmp < imfins.smpnum; nSmp++)
+ {
IMFSAMPLE imfsmp;
UINT32 blen;
ASSERT_CAN_READ(sizeof(IMFSAMPLE));
@@ -497,7 +525,8 @@
dwMemPos += sizeof(IMFSAMPLE);
m_nSamples++;
- if (memcmp(imfsmp.is10, "IS10", 4) != 0) {
+ if(memcmp(imfsmp.is10, "IS10", 4) != 0)
+ {
//printf("is10 says %02x %02x %02x %02x!\n",
// imfsmp.is10[0], imfsmp.is10[1], imfsmp.is10[2], imfsmp.is10[3]);
return false;
@@ -518,7 +547,8 @@
pSample->uFlags |= CHN_LOOP;
if (imfsmp.flags & 2)
pSample->uFlags |= CHN_PINGPONGLOOP;
- if (imfsmp.flags & 4) {
+ if (imfsmp.flags & 4)
+ {
pSample->uFlags |= CHN_16BIT;
pSample->nLength >>= 1;
pSample->nLoopStart >>= 1;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-21 12:35:42
|
Revision: 505
http://modplug.svn.sourceforge.net/modplug/?rev=505&view=rev
Author: saga-games
Date: 2010-02-21 12:35:33 +0000 (Sun, 21 Feb 2010)
Log Message:
-----------
[Fix] Treeview: Right-Click on module -> Close didn't ask for confirmation when the document was modified.
[Ref] XM Loader: Rewrote some lines of the instrument loader so they wouldn't confuse the "MPT hack detector".
Modified Paths:
--------------
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2010-02-20 23:13:54 UTC (rev 504)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2010-02-21 12:35:33 UTC (rev 505)
@@ -845,14 +845,14 @@
// Add Patterns
if ((pInfo->hPatterns) && (hintFlagPart != HINT_INSNAMES) && (hintFlagPart != HINT_SMPNAMES))
{
- const DWORD nPat = (lHint >> HINT_SHIFT_PAT);
+ const PATTERNINDEX nPat = (PATTERNINDEX)(lHint >> HINT_SHIFT_PAT);
pInfo->tiPatterns.resize(pSndFile->Patterns.Size(), NULL);
- UINT imin = 0, imax = pSndFile->Patterns.Size()-1;
+ PATTERNINDEX imin = 0, imax = pSndFile->Patterns.Size()-1;
if ((hintFlagPart == HINT_PATNAMES) && (nPat < pSndFile->Patterns.Size())) imin = imax = nPat;
BOOL bDelPat = FALSE;
ASSERT(pInfo->tiPatterns.size() == pSndFile->Patterns.Size());
- for (UINT iPat=imin; iPat <= imax; iPat++)
+ for(PATTERNINDEX iPat = imin; iPat <= imax; iPat++)
{
if ((bDelPat) && (pInfo->tiPatterns[iPat]))
{
@@ -3222,5 +3222,9 @@
HTREEITEM hItem = GetSelectedItem();
CModDoc *pModDoc = GetDocumentFromItem(hItem);
if(pModDoc == nullptr) return;
- pModDoc->OnCloseDocument();
+ // Spam our message to the first available view
+ POSITION pos = pModDoc->GetFirstViewPosition();
+ if(pos == NULL) return;
+ CView* pView = pModDoc->GetNextView(pos);
+ if (pView) pView->PostMessage(WM_COMMAND, ID_FILE_CLOSE);
}
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2010-02-20 23:13:54 UTC (rev 504)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2010-02-21 12:35:33 UTC (rev 505)
@@ -317,11 +317,8 @@
pih = (XMINSTRUMENTHEADER *)(lpStream + dwMemPos);
if (dwMemPos + LittleEndian(pih->size) > dwMemLength) return true;
- if ((Instruments[iIns] = new MODINSTRUMENT) == NULL) continue;
- memset(Instruments[iIns], 0, sizeof(MODINSTRUMENT));
- Instruments[iIns]->pTuning = m_defaultInstrument.pTuning;
- Instruments[iIns]->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
- Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
+ if ((Instruments[iIns] = new MODINSTRUMENT) == nullptr) continue;
+ memcpy(Instruments[iIns], &m_defaultInstrument, sizeof(MODINSTRUMENT));
memcpy(Instruments[iIns]->name, pih->name, 22);
SpaceToNullStringFixed(Instruments[iIns]->name, 22);
@@ -392,7 +389,7 @@
n--;
}
#ifndef FASTSOUNDLIB
- // Damn! more than 200 samples: look for duplicates
+ // Damn! Too many samples: look for duplicates
if (!n)
{
if (!unused_samples)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-20 23:14:07
|
Revision: 504
http://modplug.svn.sourceforge.net/modplug/?rev=504&view=rev
Author: saga-games
Date: 2010-02-20 23:13:54 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
[New] Pattern Editor: Key shortcut + context menu entry for toggling the plugin editor of the PC note that's under the cursor.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2010-02-20 21:02:02 UTC (rev 503)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2010-02-20 23:13:54 UTC (rev 504)
@@ -2560,6 +2560,11 @@
commands[kcInstrumentEnvelopePointMoveDown8].isDummy = false;
commands[kcInstrumentEnvelopePointMoveDown8].Message = "Move envelope point down (big step)";
+ commands[kcPatternEditPCNotePlugin].UID = 1836;
+ commands[kcPatternEditPCNotePlugin].isHidden = false;
+ commands[kcPatternEditPCNotePlugin].isDummy = false;
+ commands[kcPatternEditPCNotePlugin].Message = "Edit plugin assigned to PC note";
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2010-02-20 21:02:02 UTC (rev 503)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2010-02-20 23:13:54 UTC (rev 504)
@@ -221,6 +221,7 @@
kcSwitchToOrderList,
kcNewPattern,
kcDuplicatePattern,
+ kcPatternEditPCNotePlugin,
kcTogglePluginEditor,
kcShowNoteProperties,
kcShowPatternProperties,
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2010-02-20 21:02:02 UTC (rev 503)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-02-20 23:13:54 UTC (rev 504)
@@ -114,6 +114,7 @@
ON_COMMAND(ID_CLEAR_SELECTION, OnClearSelectionFromMenu)
ON_COMMAND(ID_SHOWTIMEATROW, OnShowTimeAtRow)
ON_COMMAND(ID_CHANNEL_RENAME, OnRenameChannel)
+ ON_COMMAND(ID_PATTERN_EDIT_PCNOTE_PLUGIN, OnTogglePCNotePluginEditor)
ON_COMMAND_RANGE(ID_CHANGE_INSTRUMENT, ID_CHANGE_INSTRUMENT+MAX_INSTRUMENTS, OnSelectInstrument)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateUndo)
ON_COMMAND_RANGE(ID_PLUGSELECT, ID_PLUGSELECT+MAX_MIXPLUGINS, OnSelectPlugin) //rewbs.patPlugName
@@ -1225,7 +1226,8 @@
AppendMenu(hMenu, MF_SEPARATOR, 0, "");
if (BuildVisFXCtxMenu(hMenu, ih) | //Use bitwise ORs to avoid shortcuts
BuildAmplifyCtxMenu(hMenu, ih) |
- BuildSetInstCtxMenu(hMenu, ih, pSndFile) )
+ BuildSetInstCtxMenu(hMenu, ih, pSndFile) |
+ BuildPCNoteCtxMenu(hMenu, ih, pSndFile) )
AppendMenu(hMenu, MF_SEPARATOR, 0, "");
if (BuildGrowShrinkCtxMenu(hMenu, ih))
AppendMenu(hMenu, MF_SEPARATOR, 0, "");
@@ -3620,6 +3622,7 @@
case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam;
case kcSwitchToOrderList: OnSwitchToOrderList();
case kcSwitchOverflowPaste: CMainFrame::m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam;
+ case kcPatternEditPCNotePlugin: OnTogglePCNotePluginEditor(); return wParam;
}
//Ranges:
@@ -4988,6 +4991,23 @@
}
+bool CViewPattern::BuildPCNoteCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile)
+//-----------------------------------------------------------------------------------------
+{
+ MODCOMMAND *mSelStart = nullptr;
+ if((pSndFile == nullptr) || (!pSndFile->Patterns.IsValidPat(m_nPattern)))
+ return false;
+ mSelStart = pSndFile->Patterns[m_nPattern].GetpModCommand(GetSelectionStartRow(), GetSelectionStartChan());
+ if((mSelStart == nullptr) || (!mSelStart->IsPcNote()))
+ return false;
+ if(mSelStart->instr < 1 || mSelStart->instr > MAX_MIXPLUGINS)
+ return false;
+
+ AppendMenu(hMenu, MF_STRING, ID_PATTERN_EDIT_PCNOTE_PLUGIN, "Toggle plugin editor\t" + ih->GetKeyTextFromCommand(kcPatternEditPCNotePlugin));
+ return true;
+}
+
+
UINT CViewPattern::GetSelectionStartRow() {
//-----------------------------------------
return min(GetRowFromCursor(m_dwBeginSel), GetRowFromCursor(m_dwEndSel));
@@ -5232,3 +5252,24 @@
SetFocus();
}
}
+
+
+void CViewPattern::OnTogglePCNotePluginEditor()
+//---------------------------------------------
+{
+ CModDoc *pModDoc = GetDocument();
+ if(pModDoc == nullptr) return;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if((pSndFile == nullptr) || (!pSndFile->Patterns.IsValidPat(m_nPattern)))
+ return;
+
+ MODCOMMAND *mSelStart = nullptr;
+ mSelStart = pSndFile->Patterns[m_nPattern].GetpModCommand(GetSelectionStartRow(), GetSelectionStartChan());
+ if((mSelStart == nullptr) || (!mSelStart->IsPcNote()))
+ return;
+ if(mSelStart->instr < 1 || mSelStart->instr > MAX_MIXPLUGINS)
+ return;
+
+ PLUGINDEX nPlg = (PLUGINDEX)(mSelStart->instr - 1);
+ pModDoc->TogglePluginEditor(nPlg);
+}
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2010-02-20 21:02:02 UTC (rev 503)
+++ trunk/OpenMPT/mptrack/View_pat.h 2010-02-20 23:13:54 UTC (rev 504)
@@ -303,6 +303,7 @@
afx_msg void OnRunScript();
afx_msg void OnShowTimeAtRow();
afx_msg void OnRenameChannel();
+ afx_msg void OnTogglePCNotePluginEditor();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
@@ -331,6 +332,7 @@
bool BuildSetInstCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile);
bool BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler* ih);
bool BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile);
+ bool BuildPCNoteCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile);
UINT GetSelectionStartRow();
UINT GetSelectionEndRow();
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2010-02-20 21:02:02 UTC (rev 503)
+++ trunk/OpenMPT/mptrack/resource.h 2010-02-20 23:13:54 UTC (rev 504)
@@ -1202,6 +1202,7 @@
#define ID_SAMPLE_GENERATE 60445
#define ID_NOTEMAP_TRANS_UP 60446
#define ID_NOTEMAP_TRANS_DOWN 60447
+#define ID_PATTERN_EDIT_PCNOTE_PLUGIN 60448
// Next default values for new objects
//
@@ -1209,7 +1210,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 526
-#define _APS_NEXT_COMMAND_VALUE 60448
+#define _APS_NEXT_COMMAND_VALUE 60449
#define _APS_NEXT_CONTROL_VALUE 2427
#define _APS_NEXT_SYMED_VALUE 901
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-20 21:02:11
|
Revision: 503
http://modplug.svn.sourceforge.net/modplug/?rev=503&view=rev
Author: saga-games
Date: 2010-02-20 21:02:02 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
[New] Instrument Editor: Transpose Up/Down for sample map.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_ins.h
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/modcommand.h
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-02-20 20:34:40 UTC (rev 502)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-02-20 21:02:02 UTC (rev 503)
@@ -25,6 +25,8 @@
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
+ ON_COMMAND(ID_NOTEMAP_TRANS_UP, OnMapTransposeUp)
+ ON_COMMAND(ID_NOTEMAP_TRANS_DOWN, OnMapTransposeDown)
ON_COMMAND(ID_NOTEMAP_COPY_NOTE, OnMapCopyNote)
ON_COMMAND(ID_NOTEMAP_COPY_SMP, OnMapCopySample)
ON_COMMAND(ID_NOTEMAP_RESET, OnMapReset)
@@ -288,7 +290,7 @@
if (hMenu)
{
- AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_SAMPLEMAP, "Edit Sample Map");
+ AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_SAMPLEMAP, "Edit Sample &Map");
if (hSubMenu)
{
BYTE smpused[(MAX_SAMPLES+7)/8];
@@ -309,18 +311,24 @@
AppendMenu(hSubMenu, MF_STRING, ID_NOTEMAP_EDITSAMPLE+j, s);
}
}
- AppendMenu(hMenu, MF_POPUP, (UINT)hSubMenu, "Edit Sample");
+ AppendMenu(hMenu, MF_POPUP, (UINT)hSubMenu, "&Edit Sample");
AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
}
- wsprintf(s, "Map all notes to sample %d", pIns->Keyboard[m_nNote]);
+ wsprintf(s, "Map all notes to &sample %d", pIns->Keyboard[m_nNote]);
AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_SMP, s);
- if(pIns->NoteMap[m_nNote] < NOTE_MIN_SPECIAL)
- wsprintf(s, "Map all notes to %s", pSndFile->GetNoteName(pIns->NoteMap[m_nNote], m_nInstrument).c_str());
- else
- wsprintf(s, "Map all notes to %s", szSpecialNoteNames[pIns->NoteMap[m_nNote] - NOTE_MIN_SPECIAL]);
- AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_NOTE, s);
- AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_RESET, "Reset note mapping");
- AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_DUPLICATE, "Duplicate Instrument\tShift+New");
+
+ if(pSndFile->GetType() != MOD_TYPE_XM)
+ {
+ if(pIns->NoteMap[m_nNote] < NOTE_MIN_SPECIAL)
+ wsprintf(s, "Map all ¬es to %s", pSndFile->GetNoteName(pIns->NoteMap[m_nNote], m_nInstrument).c_str());
+ else
+ wsprintf(s, "Map all ¬es to %s", szSpecialNoteNames[pIns->NoteMap[m_nNote] - NOTE_MIN_SPECIAL]);
+ AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_NOTE, s);
+ AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_TRANS_UP, "Transpose map &up");
+ AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_TRANS_DOWN, "Transpose map &down");
+ }
+ AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_RESET, "&Reset note mapping");
+ AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_DUPLICATE, "Duplicate &Instrument\tShift+New");
SetMenuDefaultItem(hMenu, ID_INSTRUMENT_SAMPLEMAP, FALSE);
ClientToScreen(&pt);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
@@ -335,56 +343,52 @@
void CNoteMapWnd::OnMapCopyNote()
//-------------------------------
{
- if (m_pModDoc)
+ if(m_pModDoc == nullptr) return;
+ CSoundFile *pSndFile;
+ MODINSTRUMENT *pIns;
+
+ pSndFile = m_pModDoc->GetSoundFile();
+ pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns)
{
- CSoundFile *pSndFile;
- MODINSTRUMENT *pIns;
-
- pSndFile = m_pModDoc->GetSoundFile();
- pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
+ bool bModified = false;
+ UINT n = pIns->NoteMap[m_nNote];
+ for (NOTEINDEXTYPE i = 0; i < NOTE_MAX; i++) if (pIns->NoteMap[i] != n)
{
- BOOL bModified = FALSE;
- UINT n = pIns->NoteMap[m_nNote];
- for (UINT i=0; i<NOTE_MAX; i++) if (pIns->NoteMap[i] != n)
- {
- pIns->NoteMap[i] = n;
- bModified = TRUE;
- }
- if (bModified)
- {
- m_pModDoc->SetModified();
- InvalidateRect(NULL, FALSE);
- }
+ pIns->NoteMap[i] = n;
+ bModified = true;
}
+ if (bModified)
+ {
+ m_pModDoc->SetModified();
+ InvalidateRect(NULL, FALSE);
+ }
}
}
void CNoteMapWnd::OnMapCopySample()
-//-------------------------------------
+//---------------------------------
{
- if (m_pModDoc)
+ if(m_pModDoc == nullptr) return;
+ CSoundFile *pSndFile;
+ MODINSTRUMENT *pIns;
+
+ pSndFile = m_pModDoc->GetSoundFile();
+ pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns)
{
- CSoundFile *pSndFile;
- MODINSTRUMENT *pIns;
-
- pSndFile = m_pModDoc->GetSoundFile();
- pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
+ bool bModified = false;
+ UINT n = pIns->Keyboard[m_nNote];
+ for (NOTEINDEXTYPE i = 0; i < NOTE_MAX; i++) if (pIns->Keyboard[i] != n)
{
- BOOL bModified = FALSE;
- UINT n = pIns->Keyboard[m_nNote];
- for (UINT i=0; i<NOTE_MAX; i++) if (pIns->Keyboard[i] != n)
- {
- pIns->Keyboard[i] = n;
- bModified = TRUE;
- }
- if (bModified)
- {
- m_pModDoc->SetModified();
- InvalidateRect(NULL, FALSE);
- }
+ pIns->Keyboard[i] = n;
+ bModified = true;
}
+ if (bModified)
+ {
+ m_pModDoc->SetModified();
+ InvalidateRect(NULL, FALSE);
+ }
}
}
@@ -392,27 +396,70 @@
void CNoteMapWnd::OnMapReset()
//----------------------------
{
- if (m_pModDoc)
+ if(m_pModDoc == nullptr) return;
+ CSoundFile *pSndFile;
+ MODINSTRUMENT *pIns;
+
+ pSndFile = m_pModDoc->GetSoundFile();
+ pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns)
{
- CSoundFile *pSndFile;
- MODINSTRUMENT *pIns;
-
- pSndFile = m_pModDoc->GetSoundFile();
- pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
+ bool bModified = false;
+ for (NOTEINDEXTYPE i = 0; i < NOTE_MAX; i++) if (pIns->NoteMap[i] != i + 1)
{
- BOOL bModified = FALSE;
- for (UINT i=0; i<NOTE_MAX; i++) if (pIns->NoteMap[i] != i+1)
+ pIns->NoteMap[i] = i + 1;
+ bModified = true;
+ }
+ if (bModified)
+ {
+ m_pModDoc->SetModified();
+ InvalidateRect(NULL, FALSE);
+ }
+ }
+}
+
+
+void CNoteMapWnd::OnMapTransposeUp()
+//----------------------------------
+{
+ MapTranspose(1);
+}
+
+
+void CNoteMapWnd::OnMapTransposeDown()
+//------------------------------------
+{
+ MapTranspose(-1);
+}
+
+
+void CNoteMapWnd::MapTranspose(int nAmount)
+//-----------------------------------------
+{
+ if(m_pModDoc == nullptr || nAmount == 0) return;
+ CSoundFile *pSndFile;
+ MODINSTRUMENT *pIns;
+
+ pSndFile = m_pModDoc->GetSoundFile();
+ pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns)
+ {
+ bool bModified = false;
+ for(NOTEINDEXTYPE i = 0; i < NOTE_MAX; i++)
+ {
+ int n = pIns->NoteMap[i];
+ if ((n > NOTE_MIN && nAmount < 0) || (n < NOTE_MAX && nAmount > 0))
{
- pIns->NoteMap[i] = i+1;
- bModified = TRUE;
+ n = CLAMP(n + nAmount, NOTE_MIN, NOTE_MAX);
+ pIns->NoteMap[i] = (BYTE)n;
+ bModified = true;
}
- if (bModified)
- {
- m_pModDoc->SetModified();
- InvalidateRect(NULL, FALSE);
- }
}
+ if (bModified)
+ {
+ m_pModDoc->SetModified();
+ InvalidateRect(NULL, FALSE);
+ }
}
}
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.h 2010-02-20 20:34:40 UTC (rev 502)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2010-02-20 21:02:02 UTC (rev 503)
@@ -19,6 +19,9 @@
int m_cxFont, m_cyFont;
COLORREF colorText, colorTextSel;
+private:
+ void MapTranspose(int nAmount);
+
public:
CNoteMapWnd() { m_nPlayingNote=-1; m_nNote = 5*12; m_pModDoc = NULL; m_nInstrument = 0; m_bIns = FALSE; m_cxFont = m_cyFont = 0; m_hFont = NULL; m_nOldNote = m_nOldIns = 0; m_pParent = NULL; }
BOOL SetCurrentInstrument(CModDoc *pModDoc, UINT nIns);
@@ -47,6 +50,8 @@
afx_msg void OnPaint();
afx_msg void OnMapCopySample();
afx_msg void OnMapCopyNote();
+ afx_msg void OnMapTransposeUp();
+ afx_msg void OnMapTransposeDown();
afx_msg void OnMapReset();
afx_msg void OnEditSample(UINT nID);
afx_msg void OnEditSampleMap();
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2010-02-20 20:34:40 UTC (rev 502)
+++ trunk/OpenMPT/mptrack/resource.h 2010-02-20 21:02:02 UTC (rev 503)
@@ -1200,6 +1200,8 @@
#define ID_SAMPLE_GENERATOR_MENU 60244
#define ID_SAMPLE_GENERATOR_PRESET_MENU 60344
#define ID_SAMPLE_GENERATE 60445
+#define ID_NOTEMAP_TRANS_UP 60446
+#define ID_NOTEMAP_TRANS_DOWN 60447
// Next default values for new objects
//
@@ -1207,7 +1209,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 526
-#define _APS_NEXT_COMMAND_VALUE 60446
+#define _APS_NEXT_COMMAND_VALUE 60448
#define _APS_NEXT_CONTROL_VALUE 2427
#define _APS_NEXT_SYMED_VALUE 901
#endif
Modified: trunk/OpenMPT/soundlib/modcommand.h
===================================================================
--- trunk/OpenMPT/soundlib/modcommand.h 2010-02-20 20:34:40 UTC (rev 502)
+++ trunk/OpenMPT/soundlib/modcommand.h 2010-02-20 21:02:02 UTC (rev 503)
@@ -10,6 +10,7 @@
#define NOTE_FADE 0xFD //253, IT's action for illegal notes - DO NOT SAVE AS 253 as this is IT's internal representation of "no note"!
#define NOTE_PC 0xFC //252, Param Control 'note'. Changes param value on first tick.
#define NOTE_PCS 0xFB //251, Param Control(Smooth) 'note'. Changes param value during the whole row.
+#define NOTE_MIN 1
#define NOTE_MAX 120 //Defines maximum notevalue(with index starting from 1) as well as maximum number of notes.
#define NOTE_MAX_SPECIAL NOTE_KEYOFF
#define NOTE_MIN_SPECIAL NOTE_PCS
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-20 20:34:46
|
Revision: 502
http://modplug.svn.sourceforge.net/modplug/?rev=502&view=rev
Author: saga-games
Date: 2010-02-20 20:34:40 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
[Imp] Pattern Editor: The status bar shows plugin and parameter names for PC notes now as well.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Draw_pat.cpp
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-02-20 19:20:37 UTC (rev 501)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-02-20 20:34:40 UTC (rev 502)
@@ -1463,22 +1463,29 @@
{
MODCOMMAND *m = &pSndFile->Patterns[m_nPattern][m_nRow*pSndFile->m_nChannels+nChn];
- // Ignore update if using PC or PCs notes because instrument, volcol and effect values
- // have different meaning.
- if((m->note != NOTE_PC && m->note != NOTE_PCS) || GetColTypeFromCursor(m_dwCursor) == 0)
+ switch (GetColTypeFromCursor(m_dwCursor))
{
- switch (GetColTypeFromCursor(m_dwCursor))
+ case 0:
+ // display note
+ if(m->note >= NOTE_MIN_SPECIAL)
+ strcpy(s, szSpecialNoteShortDesc[m->note - NOTE_MIN_SPECIAL]);
+ break;
+ case 1:
+ // display instrument
+ if (m->instr)
{
- case 0:
- // display note
- if(m->note >= NOTE_MIN_SPECIAL)
- strcpy(s, szSpecialNoteShortDesc[m->note - NOTE_MIN_SPECIAL]);
- break;
- case 1:
- // display instrument
- if (m->instr)
+ CHAR sztmp[128] = "";
+ if(m->note == NOTE_PC || m->note == NOTE_PCS)
{
- CHAR sztmp[128] = "";
+ // display plugin name.
+ if(m->instr <= MAX_MIXPLUGINS)
+ {
+ strncpy(sztmp, pSndFile->m_MixPlugins[m->instr - 1].GetName(), sizeof(sztmp));
+ SetNullTerminator(sztmp);
+ }
+ } else
+ {
+ // "normal" instrument
if (pSndFile->m_nInstruments)
{
if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Instruments[m->instr]))
@@ -1509,19 +1516,37 @@
sztmp[32] = 0;
}
}
- if (sztmp[0]) wsprintf(s, "%d: %s", m->instr, sztmp);
+
}
- break;
- case 2:
+ if (sztmp[0]) wsprintf(s, "%d: %s", m->instr, sztmp);
+ }
+ break;
+ case 2:
// display volume command
+ if(m->note == NOTE_PC || m->note == NOTE_PCS)
+ {
+ // display plugin param name.
+ if(m->instr > 0 && m->instr <= MAX_MIXPLUGINS)
+ {
+ CHAR sztmp[128] = "";
+ strncpy(sztmp, pSndFile->m_MixPlugins[m->instr - 1].GetParamName(m->GetValueVolCol()), sizeof(sztmp));
+ SetNullTerminator(sztmp);
+ if (sztmp[0]) wsprintf(s, "%d: %s", m->GetValueVolCol(), sztmp);
+ }
+ } else
+ {
+ // "normal" volume command
if (!pModDoc->GetVolCmdInfo(pModDoc->GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0;
- break;
- case 3:
- case 4:
+ }
+ break;
+ case 3:
+ case 4:
// display effect command
+ if(m->note != NOTE_PC && m->note != NOTE_PCS)
+ {
if (!pModDoc->GetEffectName(s, m->command, m->param, false, nChn)) s[0] = 0;
- break;
}
+ break;
}
}
pMainFrm->SetInfoText(s);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-20 19:20:46
|
Revision: 501
http://modplug.svn.sourceforge.net/modplug/?rev=501&view=rev
Author: saga-games
Date: 2010-02-20 19:20:37 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
[Fix] Treeview: Insert/Duplicate sequence actions didn't set the document modified. Grey out those two actions if no additional sequences can be added.
[Imp] Orderlist: Sequence menu also allows to insert empty sequences now.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-20 16:32:10 UTC (rev 500)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-20 19:20:37 UTC (rev 501)
@@ -60,7 +60,7 @@
ON_COMMAND(ID_ORDERLIST_COPY, OnDuplicatePattern)
ON_COMMAND(ID_PATTERNCOPY, OnPatternCopy)
ON_COMMAND(ID_PATTERNPASTE, OnPatternPaste)
- ON_COMMAND_RANGE(ID_SEQUENCE_ITEM, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, OnSelectSequence)
+ ON_COMMAND_RANGE(ID_SEQUENCE_ITEM, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 2, OnSelectSequence)
ON_MESSAGE(WM_MOD_DRAGONDROPPING, OnDragonDropping)
ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg)
@@ -1070,9 +1070,12 @@
AppendMenu(menuSequence, flags, ID_SEQUENCE_ITEM + i, str);
}
if (pSndFile->Order.GetNumSequences() < MAX_SEQUENCES)
- AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES, TEXT("Create new sequence"));
+ {
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES, TEXT("Duplicate current sequence"));
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, TEXT("Create empty sequence"));
+ }
if (pSndFile->Order.GetNumSequences() > 1)
- AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, TEXT("Delete current sequence"));
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 2, TEXT("Delete current sequence"));
}
}
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
@@ -1366,7 +1369,7 @@
BEGIN_CRITICAL();
CMainFrame::GetMainFrame()->ResetNotificationBuffer();
CSoundFile& rSf = *m_pModDoc->GetSoundFile();
- if (nSeq == MAX_SEQUENCES + 1)
+ if (nSeq == MAX_SEQUENCES + 2)
{
CString strParam; strParam.Format(TEXT("%u: %s"), rSf.Order.GetCurrentSequenceIndex(), rSf.Order.m_sName);
CString str;
@@ -1379,8 +1382,8 @@
return;
}
}
- else if (nSeq == MAX_SEQUENCES)
- rSf.Order.AddSequence();
+ else if (nSeq == MAX_SEQUENCES || nSeq == MAX_SEQUENCES + 1)
+ rSf.Order.AddSequence((nSeq == MAX_SEQUENCES));
else if (nSeq < rSf.Order.GetNumSequences())
rSf.Order.SetSequence(nSeq);
ORDERINDEX nPosCandidate = rSf.Order.GetLengthTailTrimmed() - 1;
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2010-02-20 16:32:10 UTC (rev 500)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2010-02-20 19:20:37 UTC (rev 501)
@@ -2333,8 +2333,8 @@
{
AppendMenu(hMenu, MF_STRING, ID_MODTREE_SWITCHTO, "&Switch to Seqeuence");
}
- AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Sequence");
- AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "D&uplicate Sequence");
+ AppendMenu(hMenu, MF_STRING | (pSndFile->Order.GetNumSequences() < MAX_SEQUENCES ? 0 : MF_GRAYED), ID_MODTREE_INSERT, "&Insert Sequence");
+ AppendMenu(hMenu, MF_STRING | (pSndFile->Order.GetNumSequences() < MAX_SEQUENCES ? 0 : MF_GRAYED), ID_MODTREE_DUPLICATE , "D&uplicate Sequence");
AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Sequence");
}
break;
@@ -2867,6 +2867,7 @@
{
pSndFile->Order.SetSequence((SEQUENCEINDEX)modItemID);
pSndFile->Order.AddSequence(true);
+ pModDoc->SetModified();
UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE);
pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE);
}
@@ -2889,6 +2890,7 @@
if (pModDoc && pSndFile && ((modItemType == MODITEM_SEQUENCE) || (modItemType == MODITEM_HDR_ORDERS)))
{
pSndFile->Order.AddSequence(false);
+ pModDoc->SetModified();
UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE);
pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-20 16:32:19
|
Revision: 500
http://modplug.svn.sourceforge.net/modplug/?rev=500&view=rev
Author: saga-games
Date: 2010-02-20 16:32:10 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
[Fix] Comments Tab: When editing sample / instrument names, they are limited properly now.
[Fix] Orderlist Editor: Fixed possible logical error when moving orders (don't think that anything happened due to the && vs. ||, though)
[Imp] Playback: When PT1x flag is activated, Amiga note range limits are automatically taken into account.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/view_com.cpp
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-17 20:38:04 UTC (rev 499)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-20 16:32:10 UTC (rev 500)
@@ -897,7 +897,7 @@
// drop before or after the selection
bool bMoveBack = !(m_nDragOrder < (UINT)m_nDropPos);
// don't do anything if drop position is inside the selection
- if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi || m_nDragOrder == m_nDropPos) return;
+ if((m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi) || m_nDragOrder == m_nDropPos) return;
// drag one order or multiple orders?
bool bMultiSelection = (selection.nOrdLo != selection.nOrdHi);
@@ -922,7 +922,7 @@
SetCurSel((bMoveBack && (!bSelection)) ? m_nDropPos - 1 : m_nDropPos);
} else
{
- SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!bSelection)) ? m_nDropPos - 1 : m_nDropPos);
+ SetCurSel(((m_nDragOrder < m_nDropPos) && (!bSelection)) ? m_nDropPos - 1 : m_nDropPos);
}
m_pModDoc->SetModified();
}
Modified: trunk/OpenMPT/mptrack/view_com.cpp
===================================================================
--- trunk/OpenMPT/mptrack/view_com.cpp 2010-02-17 20:38:04 UTC (rev 499)
+++ trunk/OpenMPT/mptrack/view_com.cpp 2010-02-20 16:32:10 UTC (rev 500)
@@ -486,25 +486,30 @@
UINT iItem = plvItem->iItem;
CSoundFile *pSndFile = pModDoc->GetSoundFile();
lstrcpyn(s, plvItem->pszText, sizeof(s));
- for (UINT i=strlen(s); i<sizeof(s); i++) s[i] = 0;
+
+ size_t maxStrLen = (m_nListId == IDC_LIST_SAMPLES) ? pSndFile->GetModSpecifications().sampleNameLengthMax : pSndFile->GetModSpecifications().instrNameLengthMax;
+
+ for (size_t i = min(maxStrLen, strlen(s)); i < sizeof(s); i++)
+ s[i] = 0;
+
if (m_nListId == IDC_LIST_SAMPLES)
{
if (iItem < pSndFile->m_nSamples)
{
- s[31] = 0;
- memcpy(pSndFile->m_szNames[iItem+1], s, 32);
+ memcpy(pSndFile->m_szNames[iItem + 1], s, sizeof(pSndFile->m_szNames[iItem + 1]));
+ SetNullTerminator(pSndFile->m_szNames[iItem + 1]);
// 05/01/05 : ericus replaced "<< 24" by "<< 20" : 4000 samples -> 12bits [see Moddoc.h]
- pModDoc->UpdateAllViews(this, ((iItem+1) << HINT_SHIFT_SMP) | (HINT_SMPNAMES|HINT_SAMPLEINFO), this);
+ pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_SMP) | (HINT_SMPNAMES|HINT_SAMPLEINFO), this);
}
} else
if (m_nListId == IDC_LIST_INSTRUMENTS)
{
- if ((iItem < pSndFile->m_nInstruments) && (pSndFile->Instruments[iItem+1]))
+ if ((iItem < pSndFile->m_nInstruments) && (pSndFile->Instruments[iItem + 1]))
{
MODINSTRUMENT *pIns = pSndFile->Instruments[iItem+1];
- s[31] = 0;
- memcpy(pIns->name, s, 32);
- pModDoc->UpdateAllViews(this, ((iItem+1) << HINT_SHIFT_INS) | (HINT_INSNAMES|HINT_INSTRUMENT), this);
+ memcpy(pIns->name, s, sizeof(pIns->name));
+ SetNullTerminator(pIns->name);
+ pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_INS) | (HINT_INSNAMES|HINT_INSTRUMENT), this);
}
} else
{
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-02-17 20:38:04 UTC (rev 499)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-02-20 16:32:10 UTC (rev 500)
@@ -1259,7 +1259,7 @@
}
// Preserve Amiga freq limits
- if (m_dwSongFlags & SONG_AMIGALIMITS)
+ if (m_dwSongFlags & (SONG_AMIGALIMITS|SONG_PT1XMODE))
period = CLAMP(period, 113 * 4, 856 * 4);
// Pitch/Filter Envelope
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-17 20:38:13
|
Revision: 499
http://modplug.svn.sourceforge.net/modplug/?rev=499&view=rev
Author: saga-games
Date: 2010-02-17 20:38:04 +0000 (Wed, 17 Feb 2010)
Log Message:
-----------
[New] Sample Editor: Shift+New = Clone sample slot
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-02-17 14:49:47 UTC (rev 498)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-02-17 20:38:04 UTC (rev 499)
@@ -883,11 +883,27 @@
void CCtrlSamples::OnSampleNew()
//------------------------------
{
- LONG smp = m_pModDoc->InsertSample(TRUE);
+ bool bDuplicate = CMainFrame::GetInputHandler()->ShiftPressed();
+
+ SAMPLEINDEX smp = m_pModDoc->InsertSample(true);
if (smp != SAMPLEINDEX_INVALID)
{
+ SAMPLEINDEX nOldSmp = m_nSample;
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
SetCurrentSample(smp);
+
+ if(bDuplicate && nOldSmp >= 1 && nOldSmp < MAX_SAMPLES)
+ {
+ m_pModDoc->GetSampleUndo()->PrepareUndo(smp, sundo_replace);
+ memcpy(&m_pSndFile->Samples[smp], &m_pSndFile->Samples[nOldSmp], sizeof(MODSAMPLE));
+ strcpy(m_pSndFile->m_szNames[smp], m_pSndFile->m_szNames[nOldSmp]);
+ // clone sample.
+ if((m_pSndFile->Samples[smp].pSample = CSoundFile::AllocateSample(m_pSndFile->Samples[nOldSmp].GetSampleSizeInBytes())) != nullptr)
+ {
+ memcpy(m_pSndFile->Samples[smp].pSample, m_pSndFile->Samples[nOldSmp].pSample, m_pSndFile->Samples[nOldSmp].GetSampleSizeInBytes());
+ }
+ }
+
// 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
m_pModDoc->UpdateAllViews(NULL, (smp << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA | HINT_SMPNAMES);
if ((pSndFile->m_nInstruments) && (!m_pModDoc->FindSampleParent(smp)))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-17 14:49:57
|
Revision: 498
http://modplug.svn.sourceforge.net/modplug/?rev=498&view=rev
Author: saga-games
Date: 2010-02-17 14:49:47 +0000 (Wed, 17 Feb 2010)
Log Message:
-----------
[Imp] Sample Editor: When enabling (sustain) loop and no loop points are set yet, automatically set loop to full sample length.
[Ref] Added some useful stuff from SchismTracker to the code that will be necessary for further backports.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/modcommand.h
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-02-17 09:10:14 UTC (rev 497)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-02-17 14:49:47 UTC (rev 498)
@@ -2540,6 +2540,7 @@
if ((IsLocked()) || (!m_pSndFile)) return;
int n = m_ComboLoopType.GetCurSel();
MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
+ bool wasDisabled = (pSmp->uFlags & CHN_LOOP) == 0;
switch(n)
{
case 0: // Off
@@ -2553,6 +2554,12 @@
pSmp->uFlags |= CHN_LOOP|CHN_PINGPONGLOOP;
break;
}
+ // set loop points if theren't any
+ if(wasDisabled && ((pSmp->uFlags & CHN_LOOP) != 0) && (pSmp->nLoopStart == pSmp->nLoopEnd) && (pSmp->nLoopStart == 0))
+ {
+ pSmp->nLoopEnd = pSmp->nLength;
+ m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL);
+ }
m_pModDoc->AdjustEndOfSample(m_nSample);
m_pModDoc->SetModified();
}
@@ -2608,6 +2615,7 @@
if ((IsLocked()) || (!m_pSndFile)) return;
int n = m_ComboSustainType.GetCurSel();
MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample];
+ bool wasDisabled = (pSmp->uFlags & CHN_SUSTAINLOOP) == 0;
switch(n)
{
case 0: // Off
@@ -2621,6 +2629,12 @@
pSmp->uFlags |= CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN;
break;
}
+ // set sustain loop points if theren't any
+ if(wasDisabled && ((pSmp->uFlags & CHN_SUSTAINLOOP) != 0) && (pSmp->nSustainStart == pSmp->nSustainEnd) && (pSmp->nSustainStart == 0))
+ {
+ pSmp->nSustainEnd = pSmp->nLength;
+ m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL);
+ }
m_pModDoc->SetModified();
}
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-02-17 09:10:14 UTC (rev 497)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-02-17 14:49:47 UTC (rev 498)
@@ -3776,4 +3776,53 @@
if(CSoundFile::GetModSpecifications(nNewType).HasVolCommand(m->volcmd) == false)
m->volcmd = CMD_NONE;
+}
+
+
+// "importance" of every FX command. Table is used for importing from formats with multiple effect colums
+// and is approximately the same as in SchismTracker.
+uint16 CSoundFile::GetEffectWeight(MODCOMMAND::COMMAND cmd)
+//---------------------------------------------------------
+{
+ switch(cmd)
+ {
+ case CMD_PATTERNBREAK: return 288;
+ case CMD_POSITIONJUMP: return 280;
+ case CMD_SPEED: return 272;
+ case CMD_TEMPO: return 264;
+ case CMD_GLOBALVOLUME: return 256;
+ case CMD_GLOBALVOLSLIDE: return 248;
+ case CMD_CHANNELVOLUME: return 240;
+ case CMD_CHANNELVOLSLIDE: return 232;
+ case CMD_TONEPORTAVOL: return 224;
+ case CMD_TONEPORTAMENTO: return 216;
+ case CMD_ARPEGGIO: return 208;
+ case CMD_RETRIG: return 200;
+ case CMD_TREMOR: return 192;
+ case CMD_OFFSET: return 184;
+ case CMD_VOLUME: return 176;
+ case CMD_VIBRATOVOL: return 168;
+ case CMD_VOLUMESLIDE: return 160;
+ case CMD_PORTAMENTODOWN: return 152;
+ case CMD_PORTAMENTOUP: return 133;
+ case CMD_NOTESLIDEDOWN: return 136;
+ case CMD_NOTESLIDEUP: return 128;
+ case CMD_PANNING8: return 120;
+ case CMD_PANNINGSLIDE: return 112;
+ case CMD_SMOOTHMIDI: return 104;
+ case CMD_MIDI: return 96;
+ case CMD_MODCMDEX: return 88;
+ case CMD_S3MCMDEX: return 80;
+ case CMD_PANBRELLO: return 72;
+ case CMD_XFINEPORTAUPDOWN: return 64;
+ case CMD_VIBRATO: return 56;
+ case CMD_FINEVIBRATO: return 48;
+ case CMD_TREMOLO: return 40;
+ case CMD_KEYOFF: return 32;
+ case CMD_SETENVPOSITION: return 24;
+ case CMD_VELOCITY: return 16;
+ case CMD_XPARAM: return 8;
+ case CMD_NONE:
+ default: return 0;
+ }
}
\ No newline at end of file
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2010-02-17 09:10:14 UTC (rev 497)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2010-02-17 14:49:47 UTC (rev 498)
@@ -964,6 +964,11 @@
void HandlePatternTransitionEvents();
void BuildDefaultInstrument();
long GetSampleOffset();
+
+public:
+ // "importance" of every FX command. Table is used for importing from formats with multiple effect colums
+ // and is approximately the same as in SchismTracker.
+ static uint16 CSoundFile::GetEffectWeight(MODCOMMAND::COMMAND cmd);
};
#pragma warning(default : 4324) //structure was padded due to __declspec(align())
Modified: trunk/OpenMPT/soundlib/modcommand.h
===================================================================
--- trunk/OpenMPT/soundlib/modcommand.h 2010-02-17 09:10:14 UTC (rev 497)
+++ trunk/OpenMPT/soundlib/modcommand.h 2010-02-17 14:49:47 UTC (rev 498)
@@ -59,6 +59,17 @@
// Returns true if and only if note is NOTE_PC or NOTE_PCS.
bool IsPcNote() const {return note == NOTE_PC || note == NOTE_PCS;}
+ // Swap volume and effect column (doesn't do any conversion as it's mainly for importing formats with multiple effect columns, so beware!)
+ void SwapEffects()
+ {
+ VOLCMD vcold = volcmd;
+ VOL vold = vol;
+ volcmd = command;
+ vol = param;
+ command = vcold;
+ param = vold;
+ }
+
public:
BYTE note;
BYTE instr;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-17 09:10:23
|
Revision: 497
http://modplug.svn.sourceforge.net/modplug/?rev=497&view=rev
Author: saga-games
Date: 2010-02-17 09:10:14 +0000 (Wed, 17 Feb 2010)
Log Message:
-----------
[Fix] IT Compatibility: Default Vibrato/Tremolo/Panbrello values to sine if out of range (e.g. S35)
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-02-15 21:55:55 UTC (rev 496)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-02-17 09:10:14 UTC (rev 497)
@@ -2570,7 +2570,7 @@
// EDx: Note Delay
// EEx: Pattern Delay
case 0xF0:
- if((m_nType & MOD_TYPE_MOD) != 0) // MOD: Invert Loop
+ if(GetType() == MOD_TYPE_MOD) // MOD: Invert Loop
{
pChn->nEFxSpeed = param;
if(m_dwSongFlags & SONG_FIRSTTICK) InvertLoop(pChn);
@@ -2607,7 +2607,10 @@
pChn->nVibratoType = param & 0x03;
} else
{
- if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nVibratoType = param & 0x07;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ pChn->nVibratoType = (param < 0x04) ? param : 0;
+ else
+ pChn->nVibratoType = param & 0x07;
}
break;
// S4x: Set Tremolo Waveform
@@ -2616,11 +2619,18 @@
pChn->nTremoloType = param & 0x03;
} else
{
- if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nTremoloType = param & 0x07;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ pChn->nTremoloType = (param < 0x04) ? param : 0;
+ else
+ pChn->nTremoloType = param & 0x07;
}
break;
// S5x: Set Panbrello Waveform
- case 0x50: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPanbrelloType = param & 0x07; break;
+ case 0x50: if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ pChn->nPanbrelloType = (param < 0x04) ? param : 0;
+ else
+ pChn->nPanbrelloType = param & 0x07;
+ break;
// S6x: Pattern Delay for x frames
case 0x60: m_nFrameDelay = param; break;
// S7x: Envelope Control / Instrument Control
@@ -3290,7 +3300,11 @@
bool bResetEnv = false;
if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))
{
- if ((pChn->nRowInstr) && (param < 0x100)) { InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE); bResetEnv = true; }
+ if ((pChn->nRowInstr) && (param < 0x100))
+ {
+ InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE);
+ bResetEnv = true;
+ }
if (param < 0x100) bResetEnv = true;
}
NoteChange(nChn, nNote, IsCompatibleMode(TRK_IMPULSETRACKER) ? true : false, bResetEnv);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-15 21:56:04
|
Revision: 496
http://modplug.svn.sourceforge.net/modplug/?rev=496&view=rev
Author: saga-games
Date: 2010-02-15 21:55:55 +0000 (Mon, 15 Feb 2010)
Log Message:
-----------
[Fix] S3M compatibility: Slightly better handling of vibrato/tremolo waveform types (although the ST3 help screen says that continuous vibrato/tremolo is possible, it does actually not work.)
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-02-15 21:05:01 UTC (rev 495)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-02-15 21:55:55 UTC (rev 496)
@@ -734,8 +734,17 @@
pChn->nPos = 0;
pChn->nPosLo = 0;
// Handle "retrigger" waveform type
- if (pChn->nVibratoType < 4) pChn->nVibratoPos = ((!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER)) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS))) ? 0x10 : 0;
- if(!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER) && pChn->nTremoloType < 4) pChn->nTremoloPos = 0;
+ if (pChn->nVibratoType < 4)
+ {
+ if(!IsCompatibleMode(TRK_IMPULSETRACKER) && (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS)))
+ pChn->nVibratoPos = 0x10;
+ else
+ pChn->nVibratoPos = 0;
+ }
+ if(!IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->nTremoloType < 4)
+ {
+ pChn->nTremoloPos = 0;
+ }
}
if (pChn->nPos >= pChn->nLength) pChn->nPos = pChn->nLoopStart;
}
@@ -2592,11 +2601,25 @@
pChn->nFineTune = MOD2XMFineTune(param);
if (pChn->nPeriod) pChn->nPeriod = GetPeriodFromNote(pChn->nNote, pChn->nFineTune, pChn->nC5Speed);
break;
- // S3x: Set Vibrato WaveForm
- case 0x30: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nVibratoType = param & 0x07; break;
- // S4x: Set Tremolo WaveForm
- case 0x40: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nTremoloType = param & 0x07; break;
- // S5x: Set Panbrello WaveForm
+ // S3x: Set Vibrato Waveform
+ case 0x30: if(GetType() == MOD_TYPE_S3M)
+ {
+ pChn->nVibratoType = param & 0x03;
+ } else
+ {
+ if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nVibratoType = param & 0x07;
+ }
+ break;
+ // S4x: Set Tremolo Waveform
+ case 0x40: if(GetType() == MOD_TYPE_S3M)
+ {
+ pChn->nTremoloType = param & 0x03;
+ } else
+ {
+ if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nTremoloType = param & 0x07;
+ }
+ break;
+ // S5x: Set Panbrello Waveform
case 0x50: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPanbrelloType = param & 0x07; break;
// S6x: Pattern Delay for x frames
case 0x60: m_nFrameDelay = param; break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2010-02-15 21:05:10
|
Revision: 495
http://modplug.svn.sourceforge.net/modplug/?rev=495&view=rev
Author: relabsoluness
Date: 2010-02-15 21:05:01 +0000 (Mon, 15 Feb 2010)
Log Message:
-----------
[Fix] Pattern Editor: status bar change done in r485 is now applied also when using hex-display.
[Fix] VST: Returned host CanDo-values were wrong (since pre RC1 era).
[Mod] ITP: Removed 'terminate loading on newer version'-functionality introduced in r493.
[Mod] Version: Changed version to 1.18.00.01
[Mod] Misc: Some minor changes.
[Svn] TortoiseSVN setting logminsize is now defined to prevent commits with empty log message.
Instrument extension handling:
[Mod] 'dF..' extension uses the old(pre 1.18.00.00) format again.
[Mod] Limit envpoints to 32 on saving if possible.
[Fix] Loading PFLG, AFLG and VFLG entries was broken (since they were introduced?).
[Fix] 'dF..' conversion was faulty (introduced in r483).
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Vstplug.cpp
trunk/OpenMPT/mptrack/version.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Property Changed:
----------------
trunk/OpenMPT/
Property changes on: trunk/OpenMPT
___________________________________________________________________
Added: tsvn:logminsize
+ 10
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-15 21:05:01 UTC (rev 495)
@@ -698,7 +698,7 @@
s[0] = 0;
if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY)
{
- wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->Order.GetLengthFirstEmpty());
+ wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->Order.GetLengthTailTrimmed());
}
else
{
@@ -709,7 +709,7 @@
if (m_nScrollPos < pSndFile->Order.GetLength())
{
- UINT nPat = pSndFile->Order[m_nScrollPos];
+ PATTERNINDEX nPat = pSndFile->Order[m_nScrollPos];
if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNames))
{
CHAR szpat[40] = "";
Modified: trunk/OpenMPT/mptrack/Vstplug.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-02-15 21:05:01 UTC (rev 495)
@@ -645,6 +645,13 @@
Log("VST plugin to host: Eff: 0x%.8X, Opcode = %d, Index = %d, Value = %d, PTR = %.8X, OPT = %.3f\n",(int)effect, opcode,index,value,(int)ptr,opt);
#endif
+ enum HostCanDo
+ {
+ HostDoNotKnow = 0,
+ HostCanDo = 1,
+ HostCanNotDo = -1
+ };
+
switch(opcode)
{
// Called when plugin param is changed via gui
@@ -929,14 +936,14 @@
//"asyncProcessing",
//"offline",
//"supportShell"
- if (!(strcmp((char*)ptr,"sendVstEvents")==0 ||
+ if ((strcmp((char*)ptr,"sendVstEvents")==0 ||
strcmp((char*)ptr,"sendVstMidiEvent")==0 ||
strcmp((char*)ptr,"sendVstTimeInfo")==0 ||
strcmp((char*)ptr,"supplyIdle")==0 ||
strcmp((char*)ptr,"sizeWindow")==0))
- return 1;
+ return HostCanDo;
else
- return -1;
+ return HostCanNotDo;
//
case audioMasterGetLanguage:
return kVstLangEnglish;
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/mptrack/version.h 2010-02-15 21:05:01 UTC (rev 495)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 18
#define VER_MINOR 00
-#define VER_MINORMINOR 00
+#define VER_MINORMINOR 01
//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_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-15 21:05:01 UTC (rev 495)
@@ -457,9 +457,6 @@
version = id;
streamPos += sizeof(DWORD);
- if(version > ITP_VERSION)
- return false;
-
m_nType = MOD_TYPE_IT;
// Song name
@@ -850,11 +847,6 @@
default:
ptr += sizeof(__int32); // jump field code
ReadExtendedInstrumentProperty(Instruments[i], fcode, ptr, lpStream + dwMemLength);
- // fix old instrument flags which got broken in OpenMPT 1.17.03.03 due to refactoring (rev 415).
- if(version == 0x00000101 && fcode == 'dF..')
- {
- ConvertOldExtendedFlagFormat(Instruments[i]);
- }
break;
}
}
@@ -3526,7 +3518,7 @@
fwrite(&size, 1, sizeof(__int16), f);
fwrite(&m_dwCreatedWithVersion, 1, size, f);
- code = 'LSWV'; //write m_dwCreatedWithVersion
+ code = 'LSWV'; //write m_dwLastSavedWithVersion
fwrite(&code, 1, sizeof(__int32), f);
size = sizeof(m_dwLastSavedWithVersion);
fwrite(&size, 1, sizeof(__int16), f);
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2010-02-15 21:05:01 UTC (rev 495)
@@ -2021,6 +2021,9 @@
if(fadr && code != 'K[..') // copy field data in instrument's header
memcpy(fadr,ptr,size); // (except for keyboard mapping)
ptr += size; // jump field
+
+ if (code == 'dF..' && fadr != nullptr) // 'dF..' field requires additional processing.
+ ConvertReadExtendedFlags(pIns);
}
@@ -2056,8 +2059,6 @@
// Seek for supported extended settings header
if( code == 'MPTX' )
{
- bool newFormat = false; // new flag format (separate flags for envelopes)
- bool hasFlags = false; // do we really need to convert the flags?
pData += sizeof(code); // jump extension header code
while( (uintptr_t)(pData - pDataStart) <= nMemLength - 4)
@@ -2065,39 +2066,31 @@
memcpy(&code, pData, sizeof(code)); // read field code
pData += sizeof(code); // jump field code
ReadExtendedInstrumentProperty(pIns, code, pData, pEnd);
- if(code == 'VFLG')
- newFormat = true;
- if(code == 'dF..')
- hasFlags = true;
}
- if(!newFormat && hasFlags)
- {
- ConvertOldExtendedFlagFormat(pIns);
- }
}
}
-void ConvertOldExtendedFlagFormat(MODINSTRUMENT *pIns)
-//----------------------------------------------------
+void ConvertReadExtendedFlags(MODINSTRUMENT *pIns)
+//------------------------------------------------
{
- DWORD dwOldFlags = pIns->dwFlags;
+ const DWORD dwOldFlags = pIns->dwFlags;
pIns->dwFlags = pIns->VolEnv.dwFlags = pIns->PanEnv.dwFlags = pIns->PitchEnv.dwFlags = 0;
- if(dwOldFlags & 0x0001) pIns->VolEnv.dwFlags |= ENV_ENABLED;
- if(dwOldFlags & 0x0002) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
- if(dwOldFlags & 0x0004) pIns->VolEnv.dwFlags |= ENV_LOOP;
- if(dwOldFlags & 0x0008) pIns->PanEnv.dwFlags |= ENV_ENABLED;
- if(dwOldFlags & 0x0010) pIns->PanEnv.dwFlags |= ENV_SUSTAIN;
- if(dwOldFlags & 0x0020) pIns->PanEnv.dwFlags |= ENV_LOOP;
- if(dwOldFlags & 0x0040) pIns->PitchEnv.dwFlags |= ENV_ENABLED;
- if(dwOldFlags & 0x0080) pIns->PitchEnv.dwFlags |= ENV_SUSTAIN;
- if(dwOldFlags & 0x0100) pIns->VolEnv.dwFlags |= ENV_LOOP;
- if(dwOldFlags & 0x0200) pIns->dwFlags |= INS_SETPANNING;
- if(dwOldFlags & 0x0400) pIns->PitchEnv.dwFlags |= ENV_FILTER;
- if(dwOldFlags & 0x0800) pIns->VolEnv.dwFlags |= ENV_CARRY;
- if(dwOldFlags & 0x1000) pIns->PanEnv.dwFlags |= ENV_CARRY;
- if(dwOldFlags & 0x2000) pIns->PitchEnv.dwFlags |= ENV_CARRY;
- if(dwOldFlags & 0x4000) pIns->dwFlags |= INS_MUTE;
+ if(dwOldFlags & dFdd_VOLUME) pIns->VolEnv.dwFlags |= ENV_ENABLED;
+ if(dwOldFlags & dFdd_VOLSUSTAIN) pIns->VolEnv.dwFlags |= ENV_SUSTAIN;
+ if(dwOldFlags & dFdd_VOLLOOP) pIns->VolEnv.dwFlags |= ENV_LOOP;
+ if(dwOldFlags & dFdd_PANNING) pIns->PanEnv.dwFlags |= ENV_ENABLED;
+ if(dwOldFlags & dFdd_PANSUSTAIN) pIns->PanEnv.dwFlags |= ENV_SUSTAIN;
+ if(dwOldFlags & dFdd_PANLOOP) pIns->PanEnv.dwFlags |= ENV_LOOP;
+ if(dwOldFlags & dFdd_PITCH) pIns->PitchEnv.dwFlags |= ENV_ENABLED;
+ if(dwOldFlags & dFdd_PITCHSUSTAIN) pIns->PitchEnv.dwFlags |= ENV_SUSTAIN;
+ if(dwOldFlags & dFdd_PITCHLOOP) pIns->PitchEnv.dwFlags |= ENV_LOOP;
+ if(dwOldFlags & dFdd_SETPANNING) pIns->dwFlags |= INS_SETPANNING;
+ if(dwOldFlags & dFdd_FILTER) pIns->PitchEnv.dwFlags |= ENV_FILTER;
+ if(dwOldFlags & dFdd_VOLCARRY) pIns->VolEnv.dwFlags |= ENV_CARRY;
+ if(dwOldFlags & dFdd_PANCARRY) pIns->PanEnv.dwFlags |= ENV_CARRY;
+ if(dwOldFlags & dFdd_PITCHCARRY) pIns->PitchEnv.dwFlags |= ENV_CARRY;
+ if(dwOldFlags & dFdd_MUTE) pIns->dwFlags |= INS_MUTE;
}
Modified: trunk/OpenMPT/soundlib/Snd_defs.h
===================================================================
--- trunk/OpenMPT/soundlib/Snd_defs.h 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/soundlib/Snd_defs.h 2010-02-15 21:05:01 UTC (rev 495)
@@ -167,10 +167,30 @@
#define ENV_CARRY 0x08 // env carry
#define ENV_FILTER 0x10 // filter env enabled (this has to be combined with ENV_ENABLED in the pitch envelope's flags)
+
+// Flags of 'dF..' datafield in extended instrument properties.
+#define dFdd_VOLUME 0x0001
+#define dFdd_VOLSUSTAIN 0x0002
+#define dFdd_VOLLOOP 0x0004
+#define dFdd_PANNING 0x0008
+#define dFdd_PANSUSTAIN 0x0010
+#define dFdd_PANLOOP 0x0020
+#define dFdd_PITCH 0x0040
+#define dFdd_PITCHSUSTAIN 0x0080
+#define dFdd_PITCHLOOP 0x0100
+#define dFdd_SETPANNING 0x0200
+#define dFdd_FILTER 0x0400
+#define dFdd_VOLCARRY 0x0800
+#define dFdd_PANCARRY 0x1000
+#define dFdd_PITCHCARRY 0x2000
+#define dFdd_MUTE 0x4000
+
+
// instrument-specific flags
#define INS_SETPANNING 0x01 // panning enabled
-#define INS_MUTE 0x02 // instrumentd is muted
+#define INS_MUTE 0x02 // instrument is muted
+
// envelope types in instrument editor
enum enmEnvelopeTypes
{
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-02-15 21:05:01 UTC (rev 495)
@@ -153,7 +153,7 @@
IFC. nIFC;
IFR. nIFR;
K[. Keyboard[128];
-LSWV [EXT] nPlugMixMode
+LSWV [EXT] Last Saved With Version
MB.. wMidiBank;
MC.. nMidiChannel;
MDK. nMidiDrumKey;
@@ -219,6 +219,7 @@
// Convenient macro to help WRITE_HEADER declaration for single type members ONLY (non-array)
// --------------------------------------------------------------------------------------------
#define WRITE_MPTHEADER_sized_member(name,type,code) \
+static_assert(sizeof(input->name) >= sizeof(type), "");\
fcode = #@code;\
fwrite(& fcode , 1 , sizeof( __int32 ) , file);\
fsize = sizeof( type );\
@@ -229,19 +230,55 @@
// Convenient macro to help WRITE_HEADER declaration for array members ONLY
// --------------------------------------------------------------------------------------------
#define WRITE_MPTHEADER_array_member(name,type,code,arraysize) \
+ASSERT(sizeof(input->name) >= sizeof(type) * arraysize);\
fcode = #@code;\
fwrite(& fcode , 1 , sizeof( __int32 ) , file);\
fsize = sizeof( type ) * arraysize;\
fwrite(& fsize , 1 , sizeof( __int16 ) , file);\
fwrite(&input-> name , 1 , fsize , file);
+namespace {
+// Create 'dF..' entry.
+DWORD CreateExtensionFlags(const MODINSTRUMENT& ins)
+//--------------------------------------------------
+{
+ DWORD dwFlags = 0;
+ if (ins.VolEnv.dwFlags & ENV_ENABLED) dwFlags |= dFdd_VOLUME;
+ if (ins.VolEnv.dwFlags & ENV_SUSTAIN) dwFlags |= dFdd_VOLSUSTAIN;
+ if (ins.VolEnv.dwFlags & ENV_LOOP) dwFlags |= dFdd_VOLLOOP;
+ if (ins.PanEnv.dwFlags & ENV_ENABLED) dwFlags |= dFdd_PANNING;
+ if (ins.PanEnv.dwFlags & ENV_SUSTAIN) dwFlags |= dFdd_PANSUSTAIN;
+ if (ins.PanEnv.dwFlags & ENV_LOOP) dwFlags |= dFdd_PANLOOP;
+ if (ins.PitchEnv.dwFlags & ENV_ENABLED) dwFlags |= dFdd_PITCH;
+ if (ins.PitchEnv.dwFlags & ENV_SUSTAIN) dwFlags |= dFdd_PITCHSUSTAIN;
+ if (ins.PitchEnv.dwFlags & ENV_LOOP) dwFlags |= dFdd_PITCHLOOP;
+ if (ins.dwFlags & INS_SETPANNING) dwFlags |= dFdd_SETPANNING;
+ if (ins.PitchEnv.dwFlags & ENV_FILTER) dwFlags |= dFdd_FILTER;
+ if (ins.VolEnv.dwFlags & ENV_CARRY) dwFlags |= dFdd_VOLCARRY;
+ if (ins.PanEnv.dwFlags & ENV_CARRY) dwFlags |= dFdd_PANCARRY;
+ if (ins.PitchEnv.dwFlags & ENV_CARRY) dwFlags |= dFdd_PITCHCARRY;
+ if (ins.dwFlags & INS_MUTE) dwFlags |= dFdd_MUTE;
+ return dwFlags;
+}
+} // unnamed namespace.
+
// Write (in 'file') 'input' MODINSTRUMENT with 'code' & 'size' extra field infos for each member
void WriteInstrumentHeaderStruct(MODINSTRUMENT * input, FILE * file)
{
__int32 fcode;
__int16 fsize;
WRITE_MPTHEADER_sized_member( nFadeOut , UINT , FO.. )
-WRITE_MPTHEADER_sized_member( dwFlags , DWORD , dF.. )
+
+{ // dwFlags needs to be constructed so write it manually.
+ //WRITE_MPTHEADER_sized_member( dwFlags , DWORD , dF.. )
+ const DWORD dwFlags = CreateExtensionFlags(*input);
+ fcode = 'dF..';
+ fwrite(&fcode, 1, sizeof(int32), file);
+ fsize = sizeof(dwFlags);
+ fwrite(&fsize, 1, sizeof(int16), file);
+ fwrite(&dwFlags, 1, fsize, file);
+}
+
WRITE_MPTHEADER_sized_member( nGlobalVol , UINT , GV.. )
WRITE_MPTHEADER_sized_member( nPan , UINT , P... )
WRITE_MPTHEADER_sized_member( VolEnv.nNodes , UINT , VE.. )
@@ -272,12 +309,12 @@
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[. , MAX_ENVPOINTS )
-WRITE_MPTHEADER_array_member( PanEnv.Ticks , WORD , PP[. , MAX_ENVPOINTS )
-WRITE_MPTHEADER_array_member( PitchEnv.Ticks , WORD , PiP[ , MAX_ENVPOINTS )
-WRITE_MPTHEADER_array_member( VolEnv.Values , BYTE , VE[. , MAX_ENVPOINTS )
-WRITE_MPTHEADER_array_member( PanEnv.Values , BYTE , PE[. , MAX_ENVPOINTS )
-WRITE_MPTHEADER_array_member( PitchEnv.Values , BYTE , PiE[ , MAX_ENVPOINTS )
+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_array_member( name , CHAR , n[.. , 32 )
@@ -376,9 +413,9 @@
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( PitchEnv.dwFlags , BYTE , PFLG )
-GET_MPTHEADER_sized_member( PanEnv.dwFlags , BYTE , AFLG )
-GET_MPTHEADER_sized_member( VolEnv.dwFlags , BYTE , VFLG )
+GET_MPTHEADER_sized_member( PitchEnv.dwFlags , DWORD , PFLG )
+GET_MPTHEADER_sized_member( PanEnv.dwFlags , DWORD , AFLG )
+GET_MPTHEADER_sized_member( VolEnv.dwFlags , DWORD , VFLG )
}
return pointer;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2010-02-14 15:02:53 UTC (rev 494)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2010-02-15 21:05:01 UTC (rev 495)
@@ -1193,8 +1193,8 @@
// Read extended instrument properties from 'pDataStart' to instrument 'pIns'.
void ReadExtendedInstrumentProperties(MODINSTRUMENT* pIns, const LPCBYTE pDataStart, const size_t nMemLength);
-// Convert old instrument flag format, where all flags used to be stored in one single flag. Now, some flags are stored in envelope-specific flag fields.
-void ConvertOldExtendedFlagFormat(MODINSTRUMENT* pIns);
+// Convert instrument flags which were read from 'dF..' extension to proper internal representation.
+void ConvertReadExtendedFlags(MODINSTRUMENT* pIns);
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-14 15:03:04
|
Revision: 494
http://modplug.svn.sourceforge.net/modplug/?rev=494&view=rev
Author: saga-games
Date: 2010-02-14 15:02:53 +0000 (Sun, 14 Feb 2010)
Log Message:
-----------
[Fix] ITP / J2B loader: Sample slot limits were not checked properly.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/IT_DEFS.H
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/load_j2b.cpp
Modified: trunk/OpenMPT/soundlib/IT_DEFS.H
===================================================================
--- trunk/OpenMPT/soundlib/IT_DEFS.H 2010-02-14 00:22:40 UTC (rev 493)
+++ trunk/OpenMPT/soundlib/IT_DEFS.H 2010-02-14 15:02:53 UTC (rev 494)
@@ -140,7 +140,8 @@
extern BYTE autovibit2xm[8];
extern BYTE autovibxm2it[8];
-#define ITP_VERSION 0x00000102 // v1.02
+#define ITP_VERSION 0x00000102 // v1.02
+#define ITP_FILE_ID 0x2e697470 // .itp ASCII
enum IT_ReaderBitMasks {
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-14 00:22:40 UTC (rev 493)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-14 15:02:53 UTC (rev 494)
@@ -450,8 +450,7 @@
// Check file ID
memcpy(&id,lpStream+streamPos,sizeof(DWORD));
- if(id != 0x2e697470) return false; // .itp
- m_nType = MOD_TYPE_IT;
+ if(id != ITP_FILE_ID) return false;
streamPos += sizeof(DWORD);
memcpy(&id,lpStream+streamPos,sizeof(DWORD));
@@ -461,6 +460,8 @@
if(version > ITP_VERSION)
return false;
+ m_nType = MOD_TYPE_IT;
+
// Song name
// name string length
@@ -736,6 +737,9 @@
nsmp = id;
streamPos += sizeof(DWORD);
+ if(nsmp < 1 || nsmp >= MAX_SAMPLES)
+ return false;
+
// Sample struct
memcpy(&pis,lpStream+streamPos,sizeof(ITSAMPLESTRUCT));
streamPos += sizeof(ITSAMPLESTRUCT);
@@ -1554,7 +1558,7 @@
// File ID
- DWORD id = 0x2e697470; // .itp ASCII
+ DWORD id = ITP_FILE_ID;
fwrite(&id, 1, sizeof(id), f);
id = ITP_VERSION;
Modified: trunk/OpenMPT/soundlib/load_j2b.cpp
===================================================================
--- trunk/OpenMPT/soundlib/load_j2b.cpp 2010-02-14 00:22:40 UTC (rev 493)
+++ trunk/OpenMPT/soundlib/load_j2b.cpp 2010-02-14 15:02:53 UTC (rev 494)
@@ -339,7 +339,7 @@
dwMemPos += sizeof(AMFFCHUNK_INSTRUMENT);
SAMPLEINDEX nSmp = inschunk->sample + 1;
- if(nSmp > MAX_SAMPLES)
+ if(nSmp >= MAX_SAMPLES)
break;
m_nSamples = max(m_nSamples, nSmp);
@@ -398,7 +398,7 @@
dwMemPos += dwHeadlen;
SAMPLEINDEX nSmp = instheadchunk->sample + 1;
- if(nSmp > MAX_SAMPLES)
+ if(nSmp >= MAX_SAMPLES)
break;
m_nSamples = max(m_nSamples, nSmp);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-14 01:10:46
|
Revision: 493
http://modplug.svn.sourceforge.net/modplug/?rev=493&view=rev
Author: saga-games
Date: 2010-02-14 00:22:40 +0000 (Sun, 14 Feb 2010)
Log Message:
-----------
[Mod] Added dialog resources for Sample Generator
[Ref] Mostly cosmetic changes to ITP and GDM loader as well as tagging code
Modified Paths:
--------------
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/mptrack/tagging.cpp
trunk/OpenMPT/mptrack/tagging.h
trunk/OpenMPT/soundlib/IT_DEFS.H
trunk/OpenMPT/soundlib/Load_gdm.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2010-02-14 00:22:40 UTC (rev 493)
@@ -13,7 +13,7 @@
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
-// German (Germany) resources
+// Deutsch (Deutschland) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
#ifdef _WIN32
@@ -99,7 +99,50 @@
LTEXT "Enabling instrument, volume or octave change will enable the keyboard split feature. These options are applied to the lower section of the keyboard.",IDC_STATIC,6,78,174,24
END
+IDD_SAMPLE_GENERATOR DIALOGEX 0, 0, 304, 191
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Sample Generator"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ GROUPBOX "Mathematical Formula",IDC_STATIC,6,6,294,30
+ EDITTEXT IDC_EDIT_FORMULA,12,18,270,12,ES_AUTOHSCROLL
+ PUSHBUTTON "6",IDC_BUTTON_SHOW_EXPRESSIONS,282,18,12,12
+ GROUPBOX "Sample Parameters",IDC_STATIC,6,42,294,48
+ LTEXT "Sample Length:",IDC_STATIC,12,56,60,8
+ EDITTEXT IDC_EDIT_SAMPLE_LENGTH,108,54,42,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "Sample Frequency:",IDC_STATIC,12,74,66,8
+ EDITTEXT IDC_EDIT_SAMPLE_FREQ,108,72,42,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "Sample Length in Seconds:",IDC_STATIC,156,56,90,8
+ EDITTEXT IDC_EDIT_SAMPLE_LENGTH_SEC,252,54,42,12,ES_AUTOHSCROLL
+ LTEXT "Size: 9999 KB",IDC_STATIC_SMPSIZE_KB,156,72,138,12
+ GROUPBOX "Clipping Options",IDC_STATIC,6,96,294,66
+ CONTROL "Normalize - All values are accepted and normalized.",IDC_RADIO_SMPCLIP3,
+ "Button",BS_AUTORADIOBUTTON,12,114,270,12
+ CONTROL "Clip - Values in [-1,1] are accepted, other values are clipped.",IDC_RADIO_SMPCLIP1,
+ "Button",BS_AUTORADIOBUTTON,12,126,270,12
+ CONTROL "Overflow - Values in [-1,1] are accepted, other values are wrapped around.",IDC_RADIO_SMPCLIP2,
+ "Button",BS_AUTORADIOBUTTON,12,138,270,12
+ DEFPUSHBUTTON "OK",IDOK,192,168,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,246,168,50,14
+ PUSHBUTTON "Presets...",IDC_BUTTON_SAMPLEGEN_PRESETS,6,168,50,14
+END
+IDD_SAMPLE_GENERATOR_PRESETS DIALOGEX 0, 0, 316, 101
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Sample Generator Presets"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,258,78,50,14
+ LISTBOX IDC_LIST_SAMPLEGEN_PRESETS,6,6,108,90,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_EDIT_PRESET_NAME,120,18,186,12,ES_AUTOHSCROLL
+ LTEXT "Name:",IDC_STATIC,120,6,186,8
+ EDITTEXT IDC_EDIT_PRESET_EXPR,120,54,186,12,ES_AUTOHSCROLL
+ LTEXT "Expression:",IDC_STATIC,120,42,186,8
+ PUSHBUTTON "Remove",IDC_BUTTON_REMOVE,120,78,50,14
+ PUSHBUTTON "Add",IDC_BUTTON_ADD,174,78,50,14
+END
+
+
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
@@ -139,15 +182,31 @@
TOPMARGIN, 7
BOTTOMMARGIN, 130
END
+
+ IDD_SAMPLE_GENERATOR, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 297
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 184
+ END
+
+ IDD_SAMPLE_GENERATOR_PRESETS, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 309
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 94
+ END
END
#endif // APSTUDIO_INVOKED
-#endif // German (Germany) resources
+#endif // Deutsch (Deutschland) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
+// Englisch (USA) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
@@ -467,7 +526,7 @@
END
IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 544, 106
-STYLE DS_SETFONT | WS_CHILD
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | 0x4d,4,4,55,17
@@ -2311,12 +2370,12 @@
IDS_SOUNDTOUCH_LOADFAILURE "Unable to load OpenMPT_soundtouch_i16.dll."
END
-#endif // English (U.S.) resources
+#endif // Englisch (USA) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// English (U.K.) resources
+// Englisch (GB) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
#ifdef _WIN32
@@ -2685,7 +2744,7 @@
//
IDR_BUILTIN_TUNINGS TUNING "res\\built-inTunings.tc"
-#endif // English (U.K.) resources
+#endif // Englisch (GB) resources
/////////////////////////////////////////////////////////////////////////////
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/mptrack/resource.h 2010-02-14 00:22:40 UTC (rev 493)
@@ -132,6 +132,8 @@
#define IDD_CLEANUP_SONG 521
#define IDD_CHANNEL_NAME 522
#define IDD_KEYBOARD_SPLIT 523
+#define IDD_SAMPLE_GENERATOR 524
+#define IDD_SAMPLE_GENERATOR_PRESETS 525
#define IDC_BUTTON1 1001
#define IDC_BUTTON2 1002
#define IDC_BUTTON3 1003
@@ -930,6 +932,22 @@
#define IDC_STATIC_CHANNEL_NAME 2410
#define IDC_EDIT_CHANNEL_NAME 2411
#define IDC_STATIC_PATTERNNAME 2412
+#define IDC_EDIT_SAMPLE_LENGTH 2413
+#define IDC_EDIT_SAMPLE_FREQ 2414
+#define IDC_EDIT_FORMULA 2415
+#define IDC_EDIT_SAMPLE_LENGTH2 2416
+#define IDC_EDIT_SAMPLE_LENGTH_SEC 2416
+#define IDC_RADIO_SMPCLIP1 2417
+#define IDC_RADIO_SMPCLIP2 2418
+#define IDC_RADIO_SMPCLIP3 2419
+#define IDC_STATIC_SMPSIZE_KB 2420
+#define IDC_BUTTON_SHOW_EXPRESSIONS 2421
+#define IDC_SAMPLEGEN_PRESETS 2422
+#define IDC_BUTTON_SAMPLEGEN_PRESETS 2422
+#define IDC_EDIT_PRESET_NAME 2423
+#define IDC_EDIT_PRESET_EXPR 2424
+#define IDC_LIST_SAMPLEGEN_PRESETS 2425
+#define IDC_CHECK_UNDO 2426
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1178,7 +1196,10 @@
#define ID_EDIT_SPLITKEYBOARDSETTINGS 59240
#define ID_EDIT_PASTESPECIAL 59241
#define ID_CHANGE_PCNOTE_PARAM 59242
-#define ID_MODTREE_CLOSE 60243
+#define ID_MODTREE_CLOSE 60243
+#define ID_SAMPLE_GENERATOR_MENU 60244
+#define ID_SAMPLE_GENERATOR_PRESET_MENU 60344
+#define ID_SAMPLE_GENERATE 60445
// Next default values for new objects
//
@@ -1186,8 +1207,8 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 526
-#define _APS_NEXT_COMMAND_VALUE 60244
-#define _APS_NEXT_CONTROL_VALUE 2426
+#define _APS_NEXT_COMMAND_VALUE 60446
+#define _APS_NEXT_CONTROL_VALUE 2427
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/mptrack/tagging.cpp
===================================================================
--- trunk/OpenMPT/mptrack/tagging.cpp 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/mptrack/tagging.cpp 2010-02-14 00:22:40 UTC (rev 493)
@@ -13,6 +13,7 @@
// CFileTagging - helper class for writing tags
CFileTagging::CFileTagging()
+//--------------------------
{
encoder = "OpenMPT " MPT_VERSION_STR;
}
@@ -23,10 +24,11 @@
// Convert Integer to Synchsafe Integer (see ID3v2.4 specs)
// Basically, it's a BigEndian integer, but the MSB of all bytes is 0.
// Thus, a 32-bit integer turns into a 28-bit integer.
-UINT32 CFileTagging::intToSynchsafe(UINT32 iIn)
+uint32 CFileTagging::intToSynchsafe(uint32 iIn)
+//---------------------------------------------
{
iIn = LittleEndian(iIn);
- UINT32 iOut = 0, iSteps = 0;
+ uint32 iOut = 0, iSteps = 0;
do {
iOut |= (iIn & 0x7F) << iSteps;
iSteps += 8;
@@ -36,6 +38,7 @@
// Write Tags
void CFileTagging::WriteID3v2Tags(FILE *f)
+//----------------------------------------
{
if(!f) return;
@@ -81,6 +84,7 @@
// Write a ID3v2 frame
void CFileTagging::WriteID3v2Frame(char cFrameID[4], string sFramecontent, FILE *f)
+//---------------------------------------------------------------------------------
{
if(!strcmp(cFrameID, "") || sFramecontent.empty() || !f) return;
@@ -108,6 +112,7 @@
// Write RIFF tags
void CFileTagging::WriteWaveTags(WAVEDATAHEADER *wdh, WAVEFILEHEADER *wfh, FILE *f)
+//---------------------------------------------------------------------------------
{
if(!f || !wdh || !wfh) return;
Modified: trunk/OpenMPT/mptrack/tagging.h
===================================================================
--- trunk/OpenMPT/mptrack/tagging.h 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/mptrack/tagging.h 2010-02-14 00:22:40 UTC (rev 493)
@@ -58,18 +58,18 @@
typedef struct _TAGID3v2HEADER
{
- BYTE signature[3];
- BYTE version[2];
- BYTE flags;
- UINT32 size;
+ uint8 signature[3];
+ uint8 version[2];
+ uint8 flags;
+ uint32 size;
// Total: 10 bytes
} TAGID3v2HEADER;
typedef struct _TAGID3v2FRAME
{
- UINT32 frameid;
- UINT32 size;
- UINT16 flags;
+ uint32 frameid;
+ uint32 size;
+ uint16 flags;
// Total: 10 bytes
} TAGID3v2FRAME;
@@ -106,11 +106,11 @@
private:
// Convert Integer to Synchsafe Integer (see ID3v2.4 specs)
- UINT32 intToSynchsafe(UINT32 in);
+ uint32 intToSynchsafe(UINT32 in);
// Write a frame
void WriteID3v2Frame(char cFrameID[4], string sFramecontent, FILE *f);
// Size of our tag
- UINT32 totalID3v2Size;
+ uint32 totalID3v2Size;
};
#pragma pack()
Modified: trunk/OpenMPT/soundlib/IT_DEFS.H
===================================================================
--- trunk/OpenMPT/soundlib/IT_DEFS.H 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/soundlib/IT_DEFS.H 2010-02-14 00:22:40 UTC (rev 493)
@@ -140,19 +140,19 @@
extern BYTE autovibit2xm[8];
extern BYTE autovibxm2it[8];
-#endif
+#define ITP_VERSION 0x00000102 // v1.02
-//plastiq.manyChannels
enum IT_ReaderBitMasks {
- // pattern row parsing, the channel data is read to obtain
- // number of channels active in the pattern. These bit masks are
- // to blank out sections of the byte of data being read.
+ // pattern row parsing, the channel data is read to obtain
+ // number of channels active in the pattern. These bit masks are
+ // to blank out sections of the byte of data being read.
- IT_bitmask_patternChanField_c = 0x7f,
- IT_bitmask_patternChanMask_c = 0x3f,
- IT_bitmask_patternChanEnabled_c = 0x80,
- IT_bitmask_patternChanUsed_c = 0x0f
+ IT_bitmask_patternChanField_c = 0x7f,
+ IT_bitmask_patternChanMask_c = 0x3f,
+ IT_bitmask_patternChanEnabled_c = 0x80,
+ IT_bitmask_patternChanUsed_c = 0x0f
};
-//end plastiq.manyChannels
\ No newline at end of file
+
+#endif
\ No newline at end of file
Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_gdm.cpp 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2010-02-14 00:22:40 UTC (rev 493)
@@ -19,57 +19,63 @@
typedef struct _GDMHEADER
{
- DWORD ID; // ID: 'GDM\xFE'
- CHAR SongTitle[32]; // Music's title
- CHAR SongMusician[32]; // Name of music's composer
- CHAR DOSEOF[3]; // 13, 10, 26
- DWORD ID2; // ID: 'GMFS'
- BYTE FormMajorVer; // Format major version
- BYTE FormMinorVer; // Format minor version
- UINT16 TrackID; // Composing Tracker ID code (00 = 2GDM)
- BYTE TrackMajorVer; // Tracker's major version
- BYTE TrackMinorVer; // Tracker's minor version
- BYTE PanMap[32]; // 0-Left to 15-Right, 255-N/U
- BYTE MastVol; // Range: 0...64
- BYTE Tempo; // Initial music tempo (6)
- BYTE BPM; // Initial music BPM (125)
- UINT16 FormOrigin; // Original format ID:
+ uint32 ID; // ID: 'GDM\xFE'
+ char SongTitle[32]; // Music's title
+ char SongMusician[32]; // Name of music's composer
+ char DOSEOF[3]; // 13, 10, 26
+ uint32 ID2; // ID: 'GMFS'
+ uint8 FormMajorVer; // Format major version
+ uint8 FormMinorVer; // Format minor version
+ uint16 TrackID; // Composing Tracker ID code (00 = 2GDM)
+ uint8 TrackMajorVer; // Tracker's major version
+ uint8 TrackMinorVer; // Tracker's minor version
+ uint8 PanMap[32]; // 0-Left to 15-Right, 255-N/U
+ uint8 MastVol; // Range: 0...64
+ uint8 Tempo; // Initial music tempo (6)
+ uint8 BPM; // Initial music BPM (125)
+ uint16 FormOrigin; // Original format ID:
// 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED
// (versions of 2GDM prior to v1.15 won't set this correctly)
- UINT32 OrdOffset;
- BYTE NOO; // Number of orders in module - 1
- UINT32 PatOffset;
- BYTE NOP; // Number of patterns in module - 1
- UINT32 SamHeadOffset;
- UINT32 SamOffset;
- BYTE NOS; // Number of samples in module - 1
- UINT32 MTOffset; // Offset of song message
- UINT32 MTLength;
- UINT32 SSOffset; // Offset of scrolly script (huh?)
- UINT16 SSLength;
- UINT32 TGOffset; // Offset of text graphic (huh?)
- UINT16 TGLength;
+ uint32 OrdOffset;
+ uint8 NOO; // Number of orders in module - 1
+ uint32 PatOffset;
+ uint8 NOP; // Number of patterns in module - 1
+ uint32 SamHeadOffset;
+ uint32 SamOffset;
+ uint8 NOS; // Number of samples in module - 1
+ uint32 MTOffset; // Offset of song message
+ uint32 MTLength;
+ uint32 SSOffset; // Offset of scrolly script (huh?)
+ uint16 SSLength;
+ uint32 TGOffset; // Offset of text graphic (huh?)
+ uint16 TGLength;
} GDMHEADER, *PGDMHEADER;
typedef struct _GDMSAMPLEHEADER
{
- CHAR SamName[32]; // sample's name
- CHAR FileName[12]; // sample's filename
- BYTE EmsHandle; // useless
- UINT32 Length; // length in bytes
- UINT32 LoopBegin; // loop start in samples
- UINT32 LoopEnd; // loop end in samples
- BYTE Flags; // misc. flags
- UINT16 C4Hertz; // frequency
- BYTE Volume; // default volume
- BYTE Pan; // default pan
+ char SamName[32]; // sample's name
+ char FileName[12]; // sample's filename
+ uint8 EmsHandle; // useless
+ uint32 Length; // length in bytes
+ uint32 LoopBegin; // loop start in samples
+ uint32 LoopEnd; // loop end in samples
+ uint8 Flags; // misc. flags
+ uint16 C4Hertz; // frequency
+ uint8 Volume; // default volume
+ uint8 Pan; // default pan
} GDMSAMPLEHEADER, *PGDMSAMPLEHEADER;
#pragma pack()
+#define GDMHeader_Origin_Count 8
+static MODTYPE GDMHeader_Origin[GDMHeader_Origin_Count] =
+{
+ MOD_TYPE_NONE, MOD_TYPE_MOD, MOD_TYPE_S3M, MOD_TYPE_669, MOD_TYPE_FAR, MOD_TYPE_ULT, MOD_TYPE_STM, MOD_TYPE_MED
+};
+
bool CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength)
-//-----------------------------------------------------------
+//-----------------------------------------------------------------------
{
if ((!lpStream) || (dwMemLength < sizeof(GDMHEADER))) return false;
@@ -82,11 +88,13 @@
// there are no other format versions...
if(pHeader->FormMajorVer != 1 || pHeader->FormMinorVer != 0)
- {
- ::MessageBox(0, TEXT("GDM file seems to be valid, but this format version is currently not supported."), TEXT("OpenMPT GDM import"), MB_ICONERROR);
return false;
- }
+ // 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED
+ m_nType = GDMHeader_Origin[pHeader->FormOrigin % GDMHeader_Origin_Count];
+ if(m_nType == MOD_TYPE_NONE)
+ return false;
+
// interesting question: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe, so the answer would be no.
// song name
@@ -121,43 +129,10 @@
m_nSamplePreAmp = 48; // dito
m_nVSTiVolume = 48; // dito
- // 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED
-
- switch(LittleEndianW(pHeader->FormOrigin))
- {
- case 1:
- m_nType = MOD_TYPE_MOD;
- break;
- case 2:
- m_nType = MOD_TYPE_MTM;
- break;
- case 3:
- m_nType = MOD_TYPE_S3M;
- break;
- case 4:
- m_nType = MOD_TYPE_669;
- break;
- case 5:
- m_nType = MOD_TYPE_FAR;
- break;
- case 6:
- m_nType = MOD_TYPE_ULT;
- break;
- case 7:
- m_nType = MOD_TYPE_STM;
- break;
- case 8:
- m_nType = MOD_TYPE_MED;
- break;
- default:
- ::MessageBox(0, TEXT("GDM file seems to be valid, but the original format is currently not supported.\nThis should not happen."), TEXT("OpenMPT GDM import"), MB_ICONERROR);
- return false;
- break;
- }
- UINT32 iSampleOffset = LittleEndian(pHeader->SamOffset),
+ uint32 iSampleOffset = LittleEndian(pHeader->SamOffset),
iPatternsOffset = LittleEndian(pHeader->PatOffset);
- const UINT32 iOrdOffset = LittleEndian(pHeader->OrdOffset), iSamHeadOffset = LittleEndian(pHeader->SamHeadOffset),
+ const uint32 iOrdOffset = LittleEndian(pHeader->OrdOffset), iSamHeadOffset = LittleEndian(pHeader->SamHeadOffset),
iMTOffset = LittleEndian(pHeader->MTOffset), iMTLength = LittleEndian(pHeader->MTLength),
iSSOffset = LittleEndian(pHeader->SSOffset), iSSLength = LittleEndianW(pHeader->SSLength),
iTGOffset = LittleEndian(pHeader->TGOffset), iTGLength = LittleEndianW(pHeader->TGLength);
@@ -243,24 +218,16 @@
if(pSample->Flags & 0x02) // 16 bit
{
if(pSample->Flags & 0x20) // stereo
- {
iSampleFormat = RS_PCM16U; // should be RS_STPCM16U but that breaks the sample reader
- }
else
- {
iSampleFormat = RS_PCM16U;
- }
}
else // 8 bit
{
if(pSample->Flags & 0x20) // stereo
- {
iSampleFormat = RS_PCM8U; // should be RS_STPCM8U - dito
- }
else
- {
iSampleFormat = RS_PCM8U;
- }
}
// according to zilym, LZW support has never been finished, so this is also practically useless. Just ignore the flag.
@@ -283,7 +250,7 @@
{
if(iPatternsOffset + 2 > dwMemLength) break;
- UINT16 iPatternLength = LittleEndianW(*(UINT16 *)(lpStream + iPatternsOffset)); // pattern length including the two "length" bytes
+ uint16 iPatternLength = LittleEndianW(*(uint16 *)(lpStream + iPatternsOffset)); // pattern length including the two "length" bytes
if(iPatternLength > dwMemLength || iPatternsOffset > dwMemLength - iPatternLength) break;
if(Patterns.Insert(iPat, 64))
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-13 19:58:05 UTC (rev 492)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-14 00:22:40 UTC (rev 493)
@@ -458,6 +458,9 @@
version = id;
streamPos += sizeof(DWORD);
+ if(version > ITP_VERSION)
+ return false;
+
// Song name
// name string length
@@ -1554,7 +1557,7 @@
DWORD id = 0x2e697470; // .itp ASCII
fwrite(&id, 1, sizeof(id), f);
- id = 0x00000102; // v1.02
+ id = ITP_VERSION;
fwrite(&id, 1, sizeof(id), f);
// Song name
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-13 19:58:12
|
Revision: 492
http://modplug.svn.sourceforge.net/modplug/?rev=492&view=rev
Author: saga-games
Date: 2010-02-13 19:58:05 +0000 (Sat, 13 Feb 2010)
Log Message:
-----------
(fix from SchismTracker)
[Fix] IT Loader: Ignore stereo sample flag when loading old IT files (older than IT 2.14) since IT id not reset this flag when importing stereo samples back then.
[New] Code for detecting MPT hacks in files (is not complete yet)
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
Added Paths:
-----------
trunk/OpenMPT/mptrack/MPTHacks.cpp
Added: trunk/OpenMPT/mptrack/MPTHacks.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MPTHacks.cpp (rev 0)
+++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-02-13 19:58:05 UTC (rev 492)
@@ -0,0 +1,340 @@
+/*
+ * MPTHacks.cpp
+ * ------------
+ * Purpose: Find out if MOD/XM/S3M/IT modules have MPT-specific hacks and fix them.
+ * Notes : This is not finished yet.
+ * Authors: OpenMPT Devs
+ */
+
+#include "stdafx.h"
+#include "Moddoc.h"
+
+/* TODO:
+stereo/16bit samples (only XM? maybe S3M? many new IT trackers support stereo samples)
+out-of range sample pre-amp
+song flags and properties (just look at the song properties window)
++++/--- orders in XM/MOD sequence
+comments in XM files
+AUTOFIX actions!
+
+maybe two options in program: convert to mptm / remove hacks from file!
+*/
+
+// Functor for fixing hacked patterns
+struct FixHackedPatterns
+//======================
+{
+ FixHackedPatterns(const CModSpecifications *originalSpecs, MODTYPE type, bool autofix, bool *foundHacks)
+ {
+ this->originalSpecs = originalSpecs;
+ this->type = type;
+ this->autofix = autofix;
+ this->foundHacks = foundHacks;
+ *foundHacks = false;
+ }
+
+ void operator()(MODCOMMAND& m)
+ {
+ // definitely not perfect yet. :)
+ // Probably missing: Some extended effect parameters
+ if(!originalSpecs->HasNote(m.note))
+ {
+ *foundHacks = true;
+ if(autofix)
+ m.note = NOTE_NONE;
+ }
+
+ if(!originalSpecs->HasCommand(m.command))
+ {
+ *foundHacks = true;
+ if(autofix)
+ m.command = CMD_NONE;
+ }
+
+ if(!originalSpecs->HasVolCommand(m.volcmd))
+ {
+ *foundHacks = true;
+ if(autofix)
+ m.volcmd = VOLCMD_NONE;
+ }
+
+ if(type == MOD_TYPE_XM) // modplug XM extensions
+ {
+ if(m.command == CMD_XFINEPORTAUPDOWN && m.param >= 0x30)
+ {
+ *foundHacks = true;
+ if(autofix)
+ m.command = CMD_NONE;
+ }
+ } else if(type == MOD_TYPE_IT) // modplug IT extensions
+ {
+ if(m.command == CMD_S3MCMDEX && (m.param & 0x90) != 0 && m.param != 0x91)
+ {
+ *foundHacks = true;
+ if(autofix)
+ m.command = CMD_NONE;
+ }
+
+ }
+ }
+
+ const CModSpecifications *originalSpecs;
+ MODTYPE type;
+ bool autofix;
+ bool *foundHacks;
+};
+
+// Go through the module to find out if it contains any hacks introduced by (Open)MPT
+bool CModDoc::HasMPTHacks(bool autofix)
+//-------------------------------------
+{
+ const CModSpecifications *originalSpecs = &m_SndFile.GetModSpecifications();
+ // retrieve original (not hacked) specs.
+ switch(m_SndFile.GetType())
+ {
+ case MOD_TYPE_MOD:
+ originalSpecs = &ModSpecs::mod;
+ break;
+ case MOD_TYPE_XM:
+ originalSpecs = &ModSpecs::xm;
+ break;
+ case MOD_TYPE_S3M:
+ originalSpecs = &ModSpecs::s3m;
+ break;
+ case MOD_TYPE_IT:
+ originalSpecs = &ModSpecs::it;
+ break;
+ }
+
+ bool foundHacks = false, foundHere = false;
+ ClearLog();
+
+ // Check for plugins
+ foundHere = false;
+ for(PLUGINDEX i = 0; i < MAX_MIXPLUGINS; i++)
+ {
+ if(m_SndFile.m_MixPlugins[i].pMixPlugin != nullptr || m_SndFile.m_MixPlugins[i].Info.dwPluginId1 || m_SndFile.m_MixPlugins[i].Info.dwPluginId2)
+ {
+ foundHere = foundHacks = true;
+ break;
+ }
+ // REQUIRES AUTOFIX
+ }
+ if(foundHere)
+ AddToLog("Found VST plugins\n");
+
+ // Pattern count
+ if(m_SndFile.GetNumPatterns() > originalSpecs->patternsMax)
+ {
+ AddToLog("Found too many patterns\n");
+ foundHacks = true;
+ // REQUIRES AUTOFIX
+ }
+
+ // Check for too big/small patterns
+ foundHere = false;
+ for(PATTERNINDEX i = 0; i < m_SndFile.Patterns.Size(); i++)
+ {
+ if(m_SndFile.Patterns.IsValidPat(i))
+ {
+ if(m_SndFile.Patterns[i].GetNumRows() > originalSpecs->patternRowsMax || m_SndFile.Patterns[i].GetNumRows() < originalSpecs->patternRowsMin)
+ {
+ foundHacks = foundHere = true;
+ break;
+ }
+ // REQUIRES AUTOFIX
+ }
+ }
+ if(foundHere)
+ AddToLog("Found incompatible pattern lengths\n");
+
+ // Check for invalid pattern commands
+ foundHere = false;
+ m_SndFile.Patterns.ForEachModCommand(FixHackedPatterns(originalSpecs, m_SndFile.GetType(), autofix, &foundHere));
+ if(foundHere)
+ AddToLog("Found invalid pattern commands\n");
+
+ // Check for pattern names
+ foundHere = false;
+ for(PATTERNINDEX i = 0; i < m_SndFile.Patterns.Size(); i++)
+ {
+ if(m_SndFile.Patterns.IsValidPat(i))
+ {
+ TCHAR tempname[MAX_PATTERNNAME];
+ MemsetZero(tempname);
+ m_SndFile.GetPatternName(i, tempname, sizeof(tempname));
+ if(strcmp(tempname, "") != 0)
+ {
+ foundHere = foundHacks = true;
+ if(autofix)
+ m_SndFile.SetPatternName(i, "");
+ else
+ break;
+ }
+ }
+ }
+ if(foundHere)
+ AddToLog("Found pattern names\n");
+
+ // Check for too many channels
+ if(m_SndFile.GetNumChannels() > originalSpecs->channelsMax || m_SndFile.GetNumChannels() < originalSpecs->channelsMin)
+ {
+ AddToLog("Found incompatible channel count\n");
+ foundHacks = true;
+ // REQUIRES AUTOFIX
+ }
+
+ // Check for channel names
+ foundHere = false;
+ for(CHANNELINDEX i = 0; i < m_SndFile.GetNumChannels(); i++)
+ {
+ if(strcmp(m_SndFile.ChnSettings[i].szName, "") != 0)
+ {
+ foundHere = foundHacks = true;
+ if(autofix)
+ MemsetZero(m_SndFile.ChnSettings[i].szName);
+ else
+ break;
+ }
+ }
+ if(foundHere)
+ AddToLog("Found channel names\n");
+
+ // Check for too many samples
+ if(m_SndFile.GetNumSamples() > originalSpecs->samplesMax)
+ {
+ AddToLog("Found too many samples\n");
+ foundHacks = true;
+ // REQUIRES AUTOFIX
+ }
+
+ // Check for too many instruments
+ if(m_SndFile.GetNumInstruments() > originalSpecs->instrumentsMax)
+ {
+ AddToLog("Found too many instruments\n");
+ foundHacks = true;
+ // REQUIRES AUTOFIX
+ }
+
+ // Check for instrument extensions
+ foundHere = false;
+ for(INSTRUMENTINDEX i = 1; i <= m_SndFile.GetNumInstruments(); i++)
+ {
+ MODINSTRUMENT *instr = m_SndFile.Instruments[i];
+ if(instr == nullptr) continue;
+
+ if(instr->nFilterMode != FLTMODE_UNCHANGED || instr->nVolRamp != 0 || instr->nResampling != SRCMODE_DEFAULT ||
+ instr->nCutSwing != 0 || instr->nResSwing != 0 || instr->nMixPlug != 0 || instr->wPitchToTempoLock != 0 ||
+ instr->nDCT == DCT_PLUGIN ||
+ instr->VolEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET ||
+ instr->PanEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET ||
+ instr->PitchEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET
+ )
+ {
+ foundHere = foundHacks = true;
+ if(autofix)
+ {
+ instr->nFilterMode = FLTMODE_UNCHANGED;
+ instr->nVolRamp = 0;
+ instr->nResampling = SRCMODE_DEFAULT;
+ instr->nCutSwing = 0;
+ instr->nResSwing = 0;
+ instr->nMixPlug = 0;
+ instr->wPitchToTempoLock = 0;
+ if(instr->nDCT == DCT_PLUGIN) instr->nDCT = DCT_NONE;
+ instr->VolEnv.nReleaseNode = instr->PanEnv.nReleaseNode = instr->PitchEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
+ }
+ }
+
+ }
+ if(foundHere)
+ AddToLog("Found MPT instrument extensions\n");
+
+ // Check for too many orders
+ if(m_SndFile.Order.GetLengthTailTrimmed() > originalSpecs->ordersMax)
+ {
+ AddToLog("Found too many orders\n");
+ foundHacks = true;
+ // REQUIRES AUTOFIX
+ }
+
+ // Check for invalid default tempo
+ if(m_SndFile.m_nDefaultTempo > originalSpecs->tempoMax || m_SndFile.m_nDefaultTempo < originalSpecs->tempoMin)
+ {
+ AddToLog("Found incompatible default tempo\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, originalSpecs->tempoMin, originalSpecs->tempoMax);
+ }
+
+ // Check for invalid default speed
+ if(m_SndFile.m_nDefaultSpeed > originalSpecs->speedMax || m_SndFile.m_nDefaultSpeed < originalSpecs->speedMin)
+ {
+ AddToLog("Found incompatible default speed\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, originalSpecs->speedMin, originalSpecs->speedMax);
+ }
+
+ // Check for invalid rows per beat / measure values
+ if(m_SndFile.m_nRowsPerBeat >= originalSpecs->patternRowsMax || m_SndFile.m_nRowsPerMeasure >= originalSpecs->patternRowsMax)
+ {
+ AddToLog("Found incompatible rows per beat / measure\n");
+ foundHacks = true;
+ if(autofix)
+ {
+ m_SndFile.m_nRowsPerBeat = CLAMP(m_SndFile.m_nRowsPerBeat, 1, (originalSpecs->patternRowsMax - 1));
+ m_SndFile.m_nRowsPerMeasure = CLAMP(m_SndFile.m_nRowsPerMeasure, m_SndFile.m_nRowsPerBeat, (originalSpecs->patternRowsMax - 1));
+ }
+ }
+
+ // Check for new tempo modes
+ if(m_SndFile.m_nTempoMode != tempo_mode_classic)
+ {
+ AddToLog("Found incompatible tempo mode\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.m_nTempoMode = tempo_mode_classic;
+ }
+
+ // Check for extended filter range flag
+ if(m_SndFile.m_dwSongFlags & SONG_EXFILTERRANGE)
+ {
+ AddToLog("Found extended filter range\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE;
+ }
+
+ // Embedded MIDI configuration in XM files
+ if((m_SndFile.m_dwSongFlags & SONG_EMBEDMIDICFG) != 0 && m_SndFile.GetType() == MOD_TYPE_XM)
+ {
+ AddToLog("Found embedded MIDI macros\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.m_dwSongFlags &= ~SONG_EMBEDMIDICFG;
+ }
+
+ // Player flags
+ if(!m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY))
+ {
+ AddToLog("Compatible play is deactivated\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.SetModFlag(MSF_COMPATIBLE_PLAY, true);
+ }
+
+ // Check for restart position where it should not be
+ if(m_SndFile.m_nRestartPos > 0 && !originalSpecs->hasRestartPos)
+ {
+ AddToLog("Found restart position\n");
+ foundHacks = true;
+ if(autofix)
+ m_SndFile.m_nRestartPos = 0;
+ }
+
+ if(autofix && foundHacks)
+ SetModified();
+
+ return foundHacks;
+}
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-13 13:15:18 UTC (rev 491)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-13 19:58:05 UTC (rev 492)
@@ -1261,18 +1261,18 @@
pSmp->nLength = pis->length;
if (pSmp->nLength > MAX_SAMPLE_LENGTH) pSmp->nLength = MAX_SAMPLE_LENGTH;
UINT flags = (pis->cvt & 1) ? RS_PCM8S : RS_PCM8U;
- if (pis->flags & 2)
+ if (pis->flags & 2) // 16-bit
{
flags += 5;
- if (pis->flags & 4) flags |= RSF_STEREO;
+ if (pis->flags & 4 && pifh->cwtv >= 0x214) flags |= RSF_STEREO; // some old version of IT didn't clear the stereo flag when importing samples. Luckily, all other trackers are identifying as IT 2.14+, so let's check for old IT versions.
pSmp->uFlags |= CHN_16BIT;
- // IT 2.14 16-bit packed sample ?
+ // IT 2.14 16-bit packed sample?
if (pis->flags & 8) flags = ((pifh->cmwt >= 0x215) && (pis->cvt & 4)) ? RS_IT21516 : RS_IT21416;
- } else
+ } else // 8-bit
{
- if (pis->flags & 4) flags |= RSF_STEREO;
+ if (pis->flags & 4 && pifh->cwtv >= 0x214) flags |= RSF_STEREO; // some old version of IT didn't clear the stereo flag when importing samples. Luckily, all other trackers are identifying as IT 2.14+, so let's check for old IT versions.
if (pis->cvt == 0xFF) flags = RS_ADPCM4; else
- // IT 2.14 8-bit packed sample ?
+ // IT 2.14 8-bit packed sample?
if (pis->flags & 8) flags = ((pifh->cmwt >= 0x215) && (pis->cvt & 4)) ? RS_IT2158 : RS_IT2148;
}
// -> CODE#0027
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-13 13:15:27
|
Revision: 491
http://modplug.svn.sourceforge.net/modplug/?rev=491&view=rev
Author: saga-games
Date: 2010-02-13 13:15:18 +0000 (Sat, 13 Feb 2010)
Log Message:
-----------
[Fix] Pattern Editor: Don't enable or disable "follow song" checkbox to its default setting all the time when updating other parts of the dialog
[Fix] Mod Specs: Updated maximum IT pattern length (unhacked specs)
[New] Added Sample Generator sourcecode. It's not finished yet so it's not included in the project.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Added Paths:
-----------
trunk/OpenMPT/mptrack/SampleGenerator.cpp
trunk/OpenMPT/mptrack/SampleGenerator.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-02-10 18:21:42 UTC (rev 490)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-02-13 13:15:18 UTC (rev 491)
@@ -264,7 +264,7 @@
m_ToolBar.UpdateStyle();
// -> CODE#0007
// -> DESC="uncheck follow song checkbox by default"
- CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? MF_UNCHECKED : MF_CHECKED);
+ //CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? MF_UNCHECKED : MF_CHECKED);
m_ToolBar.SetState(ID_OVERFLOWPASTE, ((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
// -! BEHAVIOUR_CHANGE#0007
}
Added: trunk/OpenMPT/mptrack/SampleGenerator.cpp
===================================================================
--- trunk/OpenMPT/mptrack/SampleGenerator.cpp (rev 0)
+++ trunk/OpenMPT/mptrack/SampleGenerator.cpp 2010-02-13 13:15:18 UTC (rev 491)
@@ -0,0 +1,761 @@
+/*
+ * SampleGenerator.cpp
+ * -------------------
+ * Purpose: Generate samples from math formulas using muParser
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ */
+
+
+#include "stdafx.h"
+#include "SampleGenerator.h"
+#include "modsmp_ctrl.h"
+
+int CSampleGenerator::sample_frequency = 44100;
+int CSampleGenerator::sample_length = CSampleGenerator::sample_frequency;
+mu::string_type CSampleGenerator::expression = _T("sin(xp * _pi)");
+smpgen_clip_methods CSampleGenerator::sample_clipping = smpgen_normalize;
+
+mu::value_type *CSampleGenerator::sample_buffer = nullptr;
+size_t CSampleGenerator::samples_written = 0;
+
+
+CSampleGenerator::CSampleGenerator()
+//----------------------------------
+{
+
+ // Setup function callbacks
+ muParser.DefineFun(_T("clip"), &ClipCallback, false);
+ muParser.DefineFun(_T("pwm"), &PWMCallback, false);
+ muParser.DefineFun(_T("rnd"), &RndCallback, false);
+ muParser.DefineFun(_T("smp"), &SampleDataCallback, false);
+ muParser.DefineFun(_T("tri"), &TriangleCallback, false);
+
+ // Setup binary operator callbacks
+ muParser.DefineOprt(_T("mod"), &ModuloCallback, 0);
+
+ //muParser.DefineConst("pi", (mu::value_type)PARSER_CONST_PI);
+
+}
+
+
+// Open the smpgen dialog
+bool CSampleGenerator::ShowDialog()
+//---------------------------------
+{
+ bool isDone = false, result = false;
+ while(!isDone)
+ {
+ CSmpGenDialog dlg(sample_frequency, sample_length, sample_clipping, expression);
+ dlg.DoModal();
+
+ // pressed "OK" button?
+ if(dlg.CanApply())
+ {
+ sample_frequency = dlg.GetFrequency();
+ sample_length = dlg.GetLength();
+ sample_clipping = dlg.GetClipping();
+ expression = dlg.GetExpression();
+ isDone = CanRenderSample();
+ if(isDone) isDone = TestExpression(); // show dialog again if the formular can't be parsed.
+ result = true;
+ } else
+ {
+ isDone = true; // just quit.
+ result = false;
+ }
+ }
+ return result;
+}
+
+
+// Check if the currently select expression can be parsed by muParser.
+bool CSampleGenerator::TestExpression()
+//-------------------------------------
+{
+ // reset helper variables
+ samples_written = 0;
+ sample_buffer = nullptr;
+
+ muParser.SetExpr(expression);
+ mu::value_type x = 0;
+ muParser.DefineVar(_T("x"), &x);
+ muParser.DefineVar(_T("xp"), &x);
+ muParser.DefineVar(_T("len"), &x);
+ muParser.DefineVar(_T("lens"), &x);
+ muParser.DefineVar(_T("freq"), &x);
+
+ try
+ {
+ muParser.Eval();
+ }
+ catch (mu::Parser::exception_type &e)
+ {
+ ShowError(&e);
+ return false;
+ }
+ return true;
+}
+
+
+// Check if sample parameters are valid.
+bool CSampleGenerator::CanRenderSample()
+//--------------------------------------
+{
+ if(sample_frequency < SMPGEN_MINFREQ || sample_frequency > SMPGEN_MAXFREQ || sample_length < SMPGEN_MINLENGTH || sample_length > SMPGEN_MAXLENGTH) return false;
+ return true;
+}
+
+
+// Actual render loop.
+bool CSampleGenerator::RenderSample(CSoundFile *pSndFile, SAMPLEINDEX nSample)
+//----------------------------------------------------------------------------
+{
+ if(!CanRenderSample() || !TestExpression() || (pSndFile == nullptr) || (nSample < 1) || (nSample > pSndFile->m_nSamples)) return false;
+
+ // allocate a new buffer
+ sample_buffer = (mu::value_type *)malloc(sample_length * sizeof(mu::value_type));
+ if(sample_buffer == nullptr) return false;
+ memset(sample_buffer, 0, sample_length * sizeof(mu::value_type));
+
+ mu::value_type x = 0, xp = 0;
+ mu::value_type v_len = sample_length, v_freq = sample_frequency, v_lens = v_len / v_freq;
+ muParser.DefineVar(_T("x"), &x);
+ muParser.DefineVar(_T("xp"), &xp);
+ muParser.DefineVar(_T("len"), &v_len);
+ muParser.DefineVar(_T("lens"), &v_lens);
+ muParser.DefineVar(_T("freq"), &v_freq);
+
+ bool success = true;
+ mu::value_type minmax = 0;
+
+ for(size_t i = 0; i < (size_t)sample_length; i++)
+ {
+ samples_written = i;
+ x = (mu::value_type)i;
+ xp = x * 100 / sample_length;
+
+ try
+ {
+ sample_buffer[i] = muParser.Eval();
+ }
+ catch (mu::Parser::exception_type &e)
+ {
+ // let's just ignore div by zero errors (note: this error code is currently unused (muParser 1.30))
+ if(e.GetCode() != mu::ecDIV_BY_ZERO)
+ {
+ ShowError(&e);
+ success = false;
+ break;
+ }
+ sample_buffer[i] = 0;
+ }
+ // new maximum value?
+ if(abs(sample_buffer[i]) > minmax) minmax = abs(sample_buffer[i]);
+
+ }
+
+ if(success)
+ {
+ MODSAMPLE *pModSample = &pSndFile->Samples[nSample];
+
+ BEGIN_CRITICAL();
+
+ // first, save some memory... (leads to crashes)
+ //CSoundFile::FreeSample(pModSample->pSample);
+ //pModSample->pSample = nullptr;
+
+ if(minmax == 0) minmax = 1; // avoid division by 0
+
+ // convert sample to 16-bit (or whateve rhas been specified)
+ int16 *pSample = (sampling_type *)CSoundFile::AllocateSample((sample_length + 4) * SMPGEN_MIXBYTES);
+ for(size_t i = 0; i < (size_t)sample_length; i++)
+ {
+ switch(sample_clipping)
+ {
+ case smpgen_clip: sample_buffer[i] = CLAMP(sample_buffer[i], -1, 1); break; // option 1: clip
+ case smpgen_normalize: sample_buffer[i] /= minmax; break; // option 3: normalize
+ }
+
+ pSample[i] = (sampling_type)(sample_buffer[i] * sample_maxvalue);
+ }
+
+ // set new sample proprerties
+ pModSample->nC5Speed = sample_frequency;
+ CSoundFile::FrequencyToTranspose(pModSample);
+ pModSample->uFlags |= CHN_16BIT; // has to be adjusted if SMPGEN_MIXBYTES changes!
+ pModSample->uFlags &= ~(CHN_STEREO|CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN);
+ pModSample->nLoopStart = 0;
+ pModSample->nLoopEnd = sample_length;
+ pModSample->nSustainStart = pModSample->nSustainEnd = 0;
+ if(sample_length / sample_frequency < 5) // arbitrary limit for automatic sample loop (5 seconds)
+ pModSample->uFlags |= CHN_LOOP;
+ else
+ pModSample->uFlags &= ~(CHN_LOOP|CHN_PINGPONGLOOP);
+
+ ctrlSmp::ReplaceSample(*pModSample, (LPSTR)pSample, sample_length, pSndFile);
+
+ END_CRITICAL();
+ }
+
+ free(sample_buffer);
+ sample_buffer = nullptr;
+
+ return success;
+}
+
+
+// Callback function to access sample data
+mu::value_type CSampleGenerator::SampleDataCallback(mu::value_type v)
+//-------------------------------------------------------------------
+{
+ if(sample_buffer == nullptr) return 0;
+ v = CLAMP(v, 0, samples_written);
+ size_t pos = static_cast<size_t>(v);
+ return sample_buffer[pos];
+}
+
+
+void CSampleGenerator::ShowError(mu::Parser::exception_type *e)
+//-------------------------------------------------------------
+{
+ std::string errmsg;
+ errmsg = "The expression\n " + e->GetExpr() + "\ncontains an error ";
+ if(!e->GetToken().empty())
+ errmsg += "in the token\n " + e->GetToken() + "\n";
+ errmsg += "at position " + Stringify(e->GetPos()) + ".\nThe error message was: " + e->GetMsg();
+ ::MessageBox(0, errmsg.c_str(), _T("muParser Sample Generator"), 0);
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+// Sample Generator Dialog implementation
+
+#define MAX_SAMPLEGEN_EXPRESSIONS 61
+
+BEGIN_MESSAGE_MAP(CSmpGenDialog, CDialog)
+ ON_EN_CHANGE(IDC_EDIT_SAMPLE_LENGTH, OnSampleLengthChanged)
+ ON_EN_CHANGE(IDC_EDIT_SAMPLE_LENGTH_SEC, OnSampleSecondsChanged)
+ ON_EN_CHANGE(IDC_EDIT_SAMPLE_FREQ, OnSampleFreqChanged)
+ ON_EN_CHANGE(IDC_EDIT_FORMULA, OnExpressionChanged)
+ ON_COMMAND(IDC_BUTTON_SHOW_EXPRESSIONS, OnShowExpressions)
+ ON_COMMAND(IDC_BUTTON_SAMPLEGEN_PRESETS, OnShowPresets)
+ ON_COMMAND_RANGE(ID_SAMPLE_GENERATOR_MENU, ID_SAMPLE_GENERATOR_MENU + MAX_SAMPLEGEN_EXPRESSIONS - 1, OnInsertExpression)
+ ON_COMMAND_RANGE(ID_SAMPLE_GENERATOR_PRESET_MENU, ID_SAMPLE_GENERATOR_PRESET_MENU + MAX_SAMPLEGEN_PRESETS + 1, OnSelectPreset)
+END_MESSAGE_MAP()
+
+
+// List of all possible expression for expression menu
+const samplegen_expression menu_descriptions[MAX_SAMPLEGEN_EXPRESSIONS] =
+{
+ //-------------------------------------
+ {"Variables", ""},
+ //-------------------------------------
+ {"Current position (sampling point)", "x"},
+ {"Current position (percentage)", "xp"},
+ {"Sample length", "len"},
+ {"Sample length (seconds)", "lens"},
+ {"Sampling frequency", "freq"},
+ //-------------------------------------
+ {"Constants", ""},
+ //-------------------------------------
+ {"Pi", "_pi"},
+ {"e", "_e"},
+ //-------------------------------------
+ {"Trigonometric functions", ""},
+ //-------------------------------------
+ {"Sine", "sin(x)"},
+ {"Cosine", "cos(x)"},
+ {"Tangens", "tan(x)"},
+ {"Arcus Sine", "asin(x)"},
+ {"Arcus Cosine", "acos(x)"},
+ {"Arcus Tangens", "atan(x)"},
+ {"Hyperbolic Sine", "sinh(x)"},
+ {"Hyperbolic Cosine", "cosh(x)"},
+ {"Hyperbolic Tangens", "tanh(x)"},
+ {"Hyperbolic Arcus Sine", "asinh(x)"},
+ {"Hyperbolic Arcus Cosine", "acosh(x)"},
+ {"Hyperbolic Arcus Tangens", "atanh(x)"},
+ //-------------------------------------
+ {"Log, Exp, Root", ""},
+ //-------------------------------------
+ {"Logarithm (base 2)", "log2(x)"},
+ {"Logarithm (base 10)", "log(x)"},
+ {"Natural Logarithm (base e)", "ln(x)"},
+ {"e^x", "exp(x)"},
+ {"Square Root", "sqrt(x)"},
+ //-------------------------------------
+ {"Sign and rounding", ""},
+ //-------------------------------------
+ {"Sign", "sign(x)"},
+ {"Absolute value", "abs(x)"},
+ {"Round to nearest integer", "rint(x)"},
+ //-------------------------------------
+ {"Sets", ""},
+ //-------------------------------------
+ {"Minimum", "min(x, y, ...)"},
+ {"Maximum", "max(x, y, ...)"},
+ {"Sum", "sum(x, y, ...)"},
+ {"Mean value", "avg(x, y, ...)"},
+ //-------------------------------------
+ {"Misc functions", ""},
+ //-------------------------------------
+ {"Pulse generator", "pwm(position, duty%, width)"},
+ {"Triangle", "tri(position, width)"},
+ {"Random value between 0 and x", "rnd(x)"},
+ {"Access previous sampling point", "smp(position)"},
+ {"Clip between values", "clip(value, minclip, maxclip)"},
+ {"If...Then...Else", "if(condition, statement1, statement2)"},
+ //-------------------------------------
+ {"Operators", ""},
+ //-------------------------------------
+ {"Assignment", "x = y"},
+ {"Logical And", "x abd y"},
+ {"Logical Or", "x or y"},
+ {"Logical Xor", "x xor y"},
+ {"Less or equal", "x <= y"},
+ {"Greater or equal", "x >= y"},
+ {"Not equal", "x != y"},
+ {"Equal", "x == y"},
+ {"Greater than", "x > y"},
+ {"Less than", "x < y"},
+ {"Addition", "x + y"},
+ {"Subtraction", "x - y"},
+ {"Multiplication", "x * y"},
+ {"Division", "x / y"},
+ {"x^y", "x ^ y"},
+ {"Modulo", "x mod y"},
+};
+
+
+BOOL CSmpGenDialog::OnInitDialog()
+//--------------------------------
+{
+ CDialog::OnInitDialog();
+ RecalcParameters(false, true);
+ SetDlgItemText(IDC_EDIT_FORMULA, expression.c_str());
+
+ int check = IDC_RADIO_SMPCLIP1;
+ switch(sample_clipping)
+ {
+ case smpgen_clip: check = IDC_RADIO_SMPCLIP1; break;
+ case smpgen_overflow: check = IDC_RADIO_SMPCLIP2; break;
+ case smpgen_normalize: check = IDC_RADIO_SMPCLIP3; break;
+ }
+ CheckRadioButton(IDC_RADIO_SMPCLIP1, IDC_RADIO_SMPCLIP3, check);
+
+ if(presets.GetNumPresets() == 0)
+ {
+ CreateDefaultPresets();
+ }
+
+ // Create font for "dropdown" button (Marlett system font)
+ hButtonFont = CreateFont(14, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("Marlett"));
+ ::SendMessage(GetDlgItem(IDC_BUTTON_SHOW_EXPRESSIONS)->m_hWnd, WM_SETFONT, (WPARAM)hButtonFont, MAKELPARAM(TRUE, 0));
+
+ return TRUE;
+}
+
+
+void CSmpGenDialog::OnOK()
+//------------------------
+{
+ CDialog::OnOK();
+ apply = true;
+
+ int check = GetCheckedRadioButton(IDC_RADIO_SMPCLIP1, IDC_RADIO_SMPCLIP3);
+ switch(check)
+ {
+ case IDC_RADIO_SMPCLIP1: sample_clipping = smpgen_clip; break;
+ case IDC_RADIO_SMPCLIP2: sample_clipping = smpgen_overflow; break;
+ case IDC_RADIO_SMPCLIP3: sample_clipping = smpgen_normalize; break;
+ }
+
+ DeleteObject(hButtonFont);
+}
+
+
+void CSmpGenDialog::OnCancel()
+//----------------------------
+{
+ CDialog::OnCancel();
+ apply = false;
+}
+
+
+// User changed formula
+void CSmpGenDialog::OnExpressionChanged()
+//---------------------------------------
+{
+ CString result;
+ GetDlgItemText(IDC_EDIT_FORMULA, result);
+ expression = result;
+}
+
+
+// User changed sample length field
+void CSmpGenDialog::OnSampleLengthChanged()
+//-----------------------------------------
+{
+ int temp_length = GetDlgItemInt(IDC_EDIT_SAMPLE_LENGTH);
+ if(temp_length >= SMPGEN_MINLENGTH && temp_length <= SMPGEN_MAXLENGTH)
+ {
+ sample_length = temp_length;
+ RecalcParameters(false);
+ }
+}
+
+
+// User changed sample length (seconds) field
+void CSmpGenDialog::OnSampleSecondsChanged()
+//------------------------------------------
+{
+ CString str;
+ GetDlgItemText(IDC_EDIT_SAMPLE_LENGTH_SEC, str);
+ double temp_seconds = atof(str);
+ if(temp_seconds > 0)
+ {
+ sample_seconds = temp_seconds;
+ RecalcParameters(true);
+ }
+}
+
+
+// User changed sample frequency field
+void CSmpGenDialog::OnSampleFreqChanged()
+//---------------------------------------
+{
+ int temp_freq = GetDlgItemInt(IDC_EDIT_SAMPLE_FREQ);
+ if(temp_freq >= SMPGEN_MINFREQ && temp_freq <= SMPGEN_MAXFREQ)
+ {
+ sample_frequency = temp_freq;
+ RecalcParameters(false);
+ }
+}
+
+
+// Show all expressions that can be input
+void CSmpGenDialog::OnShowExpressions()
+//-------------------------------------
+{
+ HMENU hMenu = ::CreatePopupMenu(), hSubMenu = NULL;
+ if(!hMenu) return;
+
+ for(int i = 0; i < MAX_SAMPLEGEN_EXPRESSIONS; i++)
+ {
+ if(menu_descriptions[i].expression == "")
+ {
+ // add sub menu
+ if(hSubMenu != NULL) ::DestroyMenu(hSubMenu);
+ hSubMenu = ::CreatePopupMenu();
+
+ AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, menu_descriptions[i].description.c_str());
+ } else
+ {
+ // add sub menu entry (formula)
+ AppendMenu(hSubMenu, MF_STRING, ID_SAMPLE_GENERATOR_MENU + i, menu_descriptions[i].description.c_str());
+ }
+ }
+
+ // place popup menu below button
+ RECT button;
+ GetDlgItem(IDC_BUTTON_SHOW_EXPRESSIONS)->GetWindowRect(&button);
+ ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, button.left, button.bottom, 0, m_hWnd, NULL);
+ ::DestroyMenu(hMenu);
+ ::DestroyMenu(hSubMenu);
+}
+
+
+// Show all expression presets
+void CSmpGenDialog::OnShowPresets()
+//---------------------------------
+{
+ HMENU hMenu = ::CreatePopupMenu();
+ if(!hMenu) return;
+
+ bool prestsExist = false;
+ for(size_t i = 0; i < presets.GetNumPresets(); i++)
+ {
+ if(presets.GetPreset(i)->expression != "")
+ {
+ AppendMenu(hMenu, MF_STRING, ID_SAMPLE_GENERATOR_PRESET_MENU + i, presets.GetPreset(i)->description.c_str());
+ prestsExist = true;
+ }
+ }
+
+ if(prestsExist) AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
+
+ AppendMenu(hMenu, MF_STRING, ID_SAMPLE_GENERATOR_PRESET_MENU + MAX_SAMPLEGEN_PRESETS, _TEXT("Manage..."));
+
+ CString result;
+ GetDlgItemText(IDC_EDIT_FORMULA, result);
+ if((!result.IsEmpty()) && (presets.GetNumPresets() < MAX_SAMPLEGEN_PRESETS))
+ {
+ AppendMenu(hMenu, MF_STRING, ID_SAMPLE_GENERATOR_PRESET_MENU + MAX_SAMPLEGEN_PRESETS + 1, _TEXT("Add current..."));
+ }
+
+ // place popup menu below button
+ RECT button;
+ GetDlgItem(IDC_BUTTON_SAMPLEGEN_PRESETS)->GetWindowRect(&button);
+ ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, button.left, button.bottom, 0, m_hWnd, NULL);
+ ::DestroyMenu(hMenu);
+}
+
+
+
+// Insert expression from context menu
+void CSmpGenDialog::OnInsertExpression(UINT nId)
+//----------------------------------------------
+{
+ if((nId < ID_SAMPLE_GENERATOR_MENU) || (nId >= ID_SAMPLE_GENERATOR_MENU + MAX_SAMPLEGEN_EXPRESSIONS)) return;
+
+ expression += " " + menu_descriptions[nId - ID_SAMPLE_GENERATOR_MENU].expression;
+
+ SetDlgItemText(IDC_EDIT_FORMULA, expression.c_str());
+}
+
+
+// Select a preset (or manage them, or add one)
+void CSmpGenDialog::OnSelectPreset(UINT nId)
+//------------------------------------------
+{
+ if((nId < ID_SAMPLE_GENERATOR_PRESET_MENU) || (nId >= ID_SAMPLE_GENERATOR_PRESET_MENU + MAX_SAMPLEGEN_PRESETS + 2)) return;
+
+ if(nId - ID_SAMPLE_GENERATOR_PRESET_MENU >= MAX_SAMPLEGEN_PRESETS)
+ {
+ // add...
+ if((nId - ID_SAMPLE_GENERATOR_PRESET_MENU == MAX_SAMPLEGEN_PRESETS + 1))
+ {
+ samplegen_expression newPreset;
+ newPreset.description = newPreset.expression = expression;
+ presets.AddPreset(newPreset);
+ // call preset manager now.
+ }
+
+ // manage...
+ CSmpGenPresetDlg dlg(&presets);
+ dlg.DoModal();
+ } else
+ {
+ expression = presets.GetPreset(nId - ID_SAMPLE_GENERATOR_PRESET_MENU)->expression;
+ SetDlgItemText(IDC_EDIT_FORMULA, expression.c_str());
+ }
+
+}
+
+
+// Update input fields, depending on what has been chagned
+void CSmpGenDialog::RecalcParameters(bool secondsChanged, bool forceRefresh)
+//--------------------------------------------------------------------------
+{
+ static bool isLocked = false;
+ if(isLocked) return;
+ isLocked = true; // avoid deadlock
+
+ if(secondsChanged)
+ {
+ // seconds changed => recalc length
+ sample_length = (int)(sample_seconds * sample_frequency);
+ if(sample_length < SMPGEN_MINLENGTH || sample_length > SMPGEN_MAXLENGTH) sample_length = SMPGEN_MAXLENGTH;
+ } else
+ {
+ // length/freq changed => recalc seconds
+ sample_seconds = ((double)sample_length) / ((double)sample_frequency);
+ }
+
+ if(secondsChanged || forceRefresh) SetDlgItemInt(IDC_EDIT_SAMPLE_LENGTH, sample_length);
+ if(secondsChanged || forceRefresh) SetDlgItemInt(IDC_EDIT_SAMPLE_FREQ, sample_frequency);
+ CString str;
+ str.Format("%.4f", sample_seconds);
+ if(!secondsChanged || forceRefresh) SetDlgItemText(IDC_EDIT_SAMPLE_LENGTH_SEC, str);
+
+ int smpsize = sample_length * SMPGEN_MIXBYTES;
+ if(smpsize < 1024)
+ {
+ str.Format("Sample Size: %d Bytes", smpsize);
+ } else if((smpsize >> 10) < 1024)
+ {
+ str.Format("Sample Size: %d KB", smpsize >> 10);
+ } else
+ {
+ str.Format("Sample Size: %d MB", smpsize >> 20);
+ }
+ SetDlgItemText(IDC_STATIC_SMPSIZE_KB, str);
+
+ isLocked = false;
+}
+
+
+// Create a set of default formla presets
+void CSmpGenDialog::CreateDefaultPresets()
+//----------------------------------------
+{
+ samplegen_expression preset;
+
+ preset.description = "A440";
+ preset.expression = "sin(xp * _pi / 50 * 440 * len / freq)";
+ presets.AddPreset(preset);
+
+ preset.description = "Noisy Saw";
+ preset.expression = "(x mod 800) / 800 - 0.5 + rnd (0.1)";
+ presets.AddPreset(preset);
+
+ preset.description = "PWM Filter";
+ preset.expression = "pwm(x, 50 + sin(xp * _pi / 100) * 40, 100) + tri(x, 50)";
+ presets.AddPreset(preset);
+
+ preset.description = "Fat PWM Pad";
+ preset.expression = "pwm(x, xp, 500) + pwm(x, abs(50 - xp), 1000)";
+ presets.AddPreset(preset);
+
+ preset.description = "Dual Square";
+ preset.expression = "if((x mod 100) < 50, (x mod 200), -x mod 200)";
+ presets.AddPreset(preset);
+
+ preset.description = "Noise Hit";
+ preset.expression = "exp(-xp) * (rnd(x) - x / 2)";
+ presets.AddPreset(preset);
+
+ preset.description = "Laser";
+ preset.expression = "sin(xp * _pi * 100 /(xp ^ 2)) * 100 / sqrt(xp)";
+
+ presets.AddPreset(preset);
+ preset.description = "Twinkle, Twinkle...";
+ preset.expression = "sin(xp * _pi * 100 / xp) * 100 / sqrt(xp)";
+
+ preset.description = "FM Tom";
+ preset.expression = "sin(xp * _pi * 2 + (xp / 5 - 50) ^ 2) * exp(-xp / 10)";
+ presets.AddPreset(preset);
+
+ preset.description = "FM Warp";
+ preset.expression = "sin(_pi * xp / 2 * (1 + (1 + sin(_pi * xp / 4 * 50)) / 4)) * exp(-(xp / 8) * .6)";
+ presets.AddPreset(preset);
+}
+
+
+
+//////////////////////////////////////////////////////////////////////////
+// Sample Generator Preset Dialog implementation
+
+
+BEGIN_MESSAGE_MAP(CSmpGenPresetDlg, CDialog)
+ ON_COMMAND(IDC_BUTTON_ADD, OnAddPreset)
+ ON_COMMAND(IDC_BUTTON_REMOVE, OnRemovePreset)
+ ON_EN_CHANGE(IDC_EDIT_PRESET_NAME, OnTextChanged)
+ ON_EN_CHANGE(IDC_EDIT_PRESET_EXPR, OnExpressionChanged)
+ ON_LBN_SELCHANGE(IDC_LIST_SAMPLEGEN_PRESETS, OnListSelChange)
+END_MESSAGE_MAP()
+
+
+BOOL CSmpGenPresetDlg::OnInitDialog()
+//-----------------------------------
+{
+ CDialog::OnInitDialog();
+
+ RefreshList();
+
+ return TRUE;
+}
+
+
+void CSmpGenPresetDlg::OnOK()
+//---------------------------
+{
+ // remove empty presets
+ for(size_t i = 0; i < presets->GetNumPresets(); i++)
+ {
+ if(presets->GetPreset(i)->expression.empty())
+ {
+ presets->RemovePreset(i);
+ }
+ }
+ CDialog::OnOK();
+}
+
+
+void CSmpGenPresetDlg::OnListSelChange()
+//--------------------------------------
+{
+ currentItem = ((CListBox *)GetDlgItem(IDC_LIST_SAMPLEGEN_PRESETS))->GetCurSel() + 1;
+ if(currentItem == 0 || currentItem > presets->GetNumPresets()) return;
+ samplegen_expression *preset = presets->GetPreset(currentItem - 1);
+ if(preset == nullptr) return;
+ SetDlgItemText(IDC_EDIT_PRESET_NAME, preset->description.c_str());
+ SetDlgItemText(IDC_EDIT_PRESET_EXPR, preset->expression.c_str());
+}
+
+
+void CSmpGenPresetDlg::OnTextChanged()
+//------------------------------------
+{
+ if(currentItem == 0 || currentItem > presets->GetNumPresets()) return;
+ CString result;
+ GetDlgItemText(IDC_EDIT_PRESET_NAME, result);
+
+ samplegen_expression *preset = presets->GetPreset(currentItem - 1);
+ if(preset == nullptr) return;
+ preset->description = result;
+
+ CListBox *clist = (CListBox *)GetDlgItem(IDC_LIST_SAMPLEGEN_PRESETS);
+ clist->DeleteString(currentItem - 1);
+ clist->InsertString(currentItem - 1, (preset->description).c_str());
+ clist->SetCurSel(currentItem - 1);
+}
+
+
+void CSmpGenPresetDlg::OnExpressionChanged()
+//------------------------------------------
+{
+ if(currentItem == 0 || currentItem > presets->GetNumPresets()) return;
+ CString result;
+ GetDlgItemText(IDC_EDIT_PRESET_EXPR, result);
+
+ samplegen_expression *preset = presets->GetPreset(currentItem - 1);
+ if(preset != nullptr) preset->expression = result;
+
+}
+
+
+void CSmpGenPresetDlg::OnAddPreset()
+//----------------------------------
+{
+ samplegen_expression newPreset;
+ newPreset.description = "New Preset";
+ newPreset.expression = "";
+ if(presets->AddPreset(newPreset))
+ {
+ currentItem = presets->GetNumPresets();
+ RefreshList();
+ }
+}
+
+
+void CSmpGenPresetDlg::OnRemovePreset()
+//-------------------------------------
+{
+ if(currentItem == 0 || currentItem > presets->GetNumPresets()) return;
+ if(presets->RemovePreset(currentItem - 1))
+ RefreshList();
+}
+
+
+void CSmpGenPresetDlg::RefreshList()
+//----------------------------------
+{
+ CListBox *clist = (CListBox *)GetDlgItem(IDC_LIST_SAMPLEGEN_PRESETS);
+ clist->SetRedraw(FALSE); //disable lisbox refreshes during fill to avoid flicker
+ clist->ResetContent();
+ for(size_t i = 0; i < presets->GetNumPresets(); i++)
+ {
+ samplegen_expression *preset = presets->GetPreset(i);
+ if(preset != nullptr)
+ clist->AddString((preset->description).c_str());
+ }
+ clist->SetRedraw(TRUE); //re-enable lisbox refreshes
+ if(currentItem == 0 || currentItem > presets->GetNumPresets())
+ {
+ currentItem = presets->GetNumPresets();
+ }
+ if(currentItem != 0) clist->SetCurSel(currentItem - 1);
+ OnListSelChange();
+}
Added: trunk/OpenMPT/mptrack/SampleGenerator.h
===================================================================
--- trunk/OpenMPT/mptrack/SampleGenerator.h (rev 0)
+++ trunk/OpenMPT/mptrack/SampleGenerator.h 2010-02-13 13:15:18 UTC (rev 491)
@@ -0,0 +1,207 @@
+/*
+ * SampleGenerator.h
+ * -----------------
+ * Purpose: Header file for sample generator
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ */
+
+#pragma once
+#include "mptrack.h"
+#include "Mainfrm.h"
+#include "Sndfile.h"
+#include "../muParser/include/muParser.h"
+
+// sample length
+#define SMPGEN_MINLENGTH 1
+#define SMPGEN_MAXLENGTH MAX_SAMPLE_LENGTH
+// sample frequency
+#define SMPGEN_MINFREQ 1
+#define SMPGEN_MAXFREQ 96000
+// 16-bit sample quality - when changing this, also change CSampleGenerator::sampling_type and 16-bit flags in SampleGenerator.cpp!
+#define SMPGEN_MIXBYTES 2
+
+enum smpgen_clip_methods
+{
+ smpgen_clip,
+ smpgen_overflow,
+ smpgen_normalize,
+};
+
+//====================
+class CSampleGenerator
+//====================
+{
+protected:
+
+ // sample parameters
+ static int sample_frequency;
+ static int sample_length;
+ static mu::string_type expression;
+ static smpgen_clip_methods sample_clipping;
+
+ // rendering helper variables (they're here for the callback functions)
+ static mu::value_type *sample_buffer;
+ static size_t samples_written;
+
+ typedef int16 sampling_type; // has to match SMPGEN_MIXBYTES!
+ static const sampling_type sample_maxvalue = (1 << ((SMPGEN_MIXBYTES << 3) - 1)) - 1;
+
+ // muParser object for parsing the expression
+ mu::Parser muParser;
+
+ // Rendering callback functions
+ // functions
+ static mu::value_type ClipCallback(mu::value_type val, mu::value_type min, mu::value_type max) { return CLAMP(val, min, max); };
+ static mu::value_type PWMCallback(mu::value_type pos, mu::value_type duty, mu::value_type width) { if((int)width == 0) return 0; else return (((int)pos % (int)width) < ((duty / 100) * width)) ? 1 : -1; };
+ static mu::value_type RndCallback(mu::value_type v) { return v*std::rand()/(mu::value_type)(RAND_MAX+1.0); }
+ static mu::value_type SampleDataCallback(mu::value_type v);
+ static mu::value_type TriangleCallback(mu::value_type pos, mu::value_type width) { if((int)width == 0) return 0; else return abs(((int)pos % (int)(width)) - width / 2) / (width / 4) - 1; };
+
+ // binary operators
+ static mu::value_type ModuloCallback(mu::value_type x, mu::value_type y) { if((int)y == 0) return 0; else return ((int)x) % ((int)y); };
+
+ void ShowError(mu::Parser::exception_type *e);
+
+public:
+
+ bool ShowDialog();
+ bool TestExpression();
+ bool CanRenderSample();
+ bool RenderSample(CSoundFile *pSndFile, SAMPLEINDEX nSample);
+
+ CSampleGenerator();
+
+};
+
+
+//////////////////////////////////////////////////////////////////////////
+// Sample Generator Formula Preset implementation
+
+
+struct samplegen_expression
+{
+ std::string description; // e.g. "Pulse"
+ mu::string_type expression; // e.g. "pwm(x,y,z)" - empty if this is a sub menu
+};
+#define MAX_SAMPLEGEN_PRESETS 100
+
+
+//==================
+class CSmpGenPresets
+//==================
+{
+protected:
+ vector<samplegen_expression> presets;
+
+public:
+ bool AddPreset(samplegen_expression new_preset) { if(GetNumPresets() >= MAX_SAMPLEGEN_PRESETS) return false; presets.push_back(new_preset); return true;};
+ bool RemovePreset(size_t which) { if(which < GetNumPresets()) { presets.erase(presets.begin() + which); return true; } else return false; };
+ samplegen_expression *GetPreset(size_t which) { if(which < GetNumPresets()) return &presets[which]; else return nullptr; };
+ size_t GetNumPresets() { return presets.size(); };
+ void Clear() { presets.clear(); };
+
+ CSmpGenPresets() { Clear(); }
+ ~CSmpGenPresets() { Clear(); }
+};
+
+
+//////////////////////////////////////////////////////////////////////////
+// Sample Generator Dialog implementation
+
+
+//=================================
+class CSmpGenDialog: public CDialog
+//=================================
+{
+protected:
+
+ // sample parameters
+ int sample_frequency;
+ int sample_length;
+ double sample_seconds;
+ mu::string_type expression;
+ smpgen_clip_methods sample_clipping;
+ // pressed "OK"?
+ bool apply;
+ // preset slots
+ CSmpGenPresets presets;
+
+ HFONT hButtonFont; // "Marlett" font for "dropdown" button
+
+ void RecalcParameters(bool secondsChanged, bool forceRefresh = false);
+
+ // function presets
+ void CreateDefaultPresets();
+
+public:
+
+ int GetFrequency() { return sample_frequency; };
+ int GetLength() { return sample_length; };
+ smpgen_clip_methods GetClipping() { return sample_clipping; }
+ mu::string_type GetExpression() { return expression; };
+ bool CanApply() { return apply; };
+
+ CSmpGenDialog(int freq, int len, smpgen_clip_methods clipping, mu::string_type expr):CDialog(IDD_SAMPLE_GENERATOR, CMainFrame::GetMainFrame())
+ {
+ sample_frequency = freq;
+ sample_length = len;
+ sample_clipping = clipping;
+ expression = expr;
+ apply = false;
+ }
+
+protected:
+ virtual BOOL OnInitDialog();
+ virtual void OnOK();
+ virtual void OnCancel();
+
+ afx_msg void OnSampleLengthChanged();
+ afx_msg void OnSampleSecondsChanged();
+ afx_msg void OnSampleFreqChanged();
+ afx_msg void OnExpressionChanged();
+ afx_msg void OnShowExpressions();
+ afx_msg void OnShowPresets();
+ afx_msg void OnInsertExpression(UINT nId);
+ afx_msg void OnSelectPreset(UINT nId);
+
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+};
+
+
+//////////////////////////////////////////////////////////////////////////
+// Sample Generator Preset Dialog implementation
+
+
+//====================================
+class CSmpGenPresetDlg: public CDialog
+//====================================
+{
+protected:
+ CSmpGenPresets *presets;
+ size_t currentItem; // first item is actually 1!
+
+ void RefreshList();
+
+public:
+ CSmpGenPresetDlg(CSmpGenPresets *pPresets):CDialog(IDD_SAMPLE_GENERATOR_PRESETS, CMainFrame::GetMainFrame())
+ {
+ presets = pPresets;
+ currentItem = 0;
+ }
+
+protected:
+ virtual BOOL OnInitDialog();
+ virtual void OnOK();
+
+ afx_msg void OnListSelChange();
+
+ afx_msg void OnTextChanged();
+ afx_msg void OnExpressionChanged();
+
+ afx_msg void OnAddPreset();
+ afx_msg void OnRemovePreset();
+
+ DECLARE_MESSAGE_MAP()
+};
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2010-02-10 18:21:42 UTC (rev 490)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2010-02-13 13:15:18 UTC (rev 491)
@@ -331,7 +331,7 @@
32, //Min tempo
255, //Max tempo
1, //Min pattern rows
- 256, //Max pattern rows
+ 200, //Max pattern rows
25, //Max mod name length
25, //Max sample name length
12, //Max sample filename length
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-10 18:21:48
|
Revision: 490
http://modplug.svn.sourceforge.net/modplug/?rev=490&view=rev
Author: saga-games
Date: 2010-02-10 18:21:42 +0000 (Wed, 10 Feb 2010)
Log Message:
-----------
[Fix] IT Saver: Set unused channels' panning positions to 0xA0 like IT does (appears to fix a problem in IT's GUI)
[Fix] IT Saver: Fixed IT sample flags which could potentionally cause IT to screw up on loading/saving MPT-made modules with samples that are not used by an instrument.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-09 20:21:38 UTC (rev 489)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-10 18:21:42 UTC (rev 490)
@@ -1880,7 +1880,7 @@
header.sep = 128; // pan separation
dwHdrPos = sizeof(header) + header.ordnum;
// Channel Pan and Volume
- memset(header.chnpan, 0xFF, 64);
+ memset(header.chnpan, 0xA0, 64);
memset(header.chnvol, 64, 64);
for (UINT ich=0; ich</*m_nChannels*/64; ich++) //Header only has room for settings for 64 chans...
{
@@ -2286,25 +2286,45 @@
memcpy(itss.name, m_szNames[nsmp], 26);
itss.id = 0x53504D49;
itss.gvl = (BYTE)psmp->nGlobalVol;
- if (m_nInstruments)
+
+ UINT flags = RS_PCM8S;
+ if(psmp->nLength && psmp->pSample)
{
- for (UINT iu=1; iu<=m_nInstruments; iu++) if (Instruments[iu])
+ itss.flags = 0x01;
+ if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10;
+ if (psmp->uFlags & CHN_SUSTAINLOOP) itss.flags |= 0x20;
+ if (psmp->uFlags & CHN_PINGPONGLOOP) itss.flags |= 0x40;
+ if (psmp->uFlags & CHN_PINGPONGSUSTAIN) itss.flags |= 0x80;
+#ifndef NO_PACKING
+ if (nPacking)
{
- MODINSTRUMENT *pIns = Instruments[iu];
- for (UINT ju=0; ju<128; ju++) if (pIns->Keyboard[ju] == nsmp)
+ if ((!(psmp->uFlags & (CHN_16BIT|CHN_STEREO)))
+ && (CanPackSample(psmp->pSample, psmp->nLength, nPacking)))
{
- itss.flags = 0x01;
- break;
+ flags = RS_ADPCM4;
+ itss.cvt = 0xFF;
}
+ } else
+#endif // NO_PACKING
+ {
+ if (psmp->uFlags & CHN_STEREO)
+ {
+ flags = RS_STPCM8S;
+ itss.flags |= 0x04;
+ }
+ if (psmp->uFlags & CHN_16BIT)
+ {
+ itss.flags |= 0x02;
+ flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S;
+ }
}
- } else
+ itss.cvt = 0x01;
+ }
+ else
{
- itss.flags = 0x01;
+ itss.flags = 0x00;
}
- if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10;
- if (psmp->uFlags & CHN_SUSTAINLOOP) itss.flags |= 0x20;
- if (psmp->uFlags & CHN_PINGPONGLOOP) itss.flags |= 0x40;
- if (psmp->uFlags & CHN_PINGPONGSUSTAIN) itss.flags |= 0x80;
+
itss.C5Speed = psmp->nC5Speed;
if (!itss.C5Speed) itss.C5Speed = 8363;
itss.length = psmp->nLength;
@@ -2319,34 +2339,8 @@
itss.vid = min(psmp->nVibDepth, 32);
itss.vir = min(psmp->nVibSweep, 255); //(psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
- if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
- UINT flags = RS_PCM8S;
-#ifndef NO_PACKING
- if (nPacking)
- {
- if ((!(psmp->uFlags & (CHN_16BIT|CHN_STEREO)))
- && (CanPackSample(psmp->pSample, psmp->nLength, nPacking)))
- {
- flags = RS_ADPCM4;
- itss.cvt = 0xFF;
- }
- } else
-#endif // NO_PACKING
- {
- if (psmp->uFlags & CHN_STEREO)
- {
- flags = RS_STPCM8S;
- itss.flags |= 0x04;
- }
- if (psmp->uFlags & CHN_16BIT)
- {
- itss.flags |= 0x02;
- flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S;
- }
- }
+
itss.samplepointer = dwPos;
- if (!(psmp->pSample) || !(psmp->nLength))
- itss.flags = 0;
fseek(f, smppos[nsmp-1], SEEK_SET);
fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f);
fseek(f, dwPos, SEEK_SET);
@@ -2489,7 +2483,7 @@
header.sep = 128; // pan separation
dwHdrPos = sizeof(header) + header.ordnum;
// Channel Pan and Volume
- memset(header.chnpan, 0xFF, 64);
+ memset(header.chnpan, 0xA0, 64);
memset(header.chnvol, 64, 64);
for (UINT ich=0; ich</*m_nChannels*/64; ich++) //Header only has room for settings for 64 chans...
{
@@ -2882,25 +2876,34 @@
SetNullTerminator(itss.name);
itss.id = 0x53504D49;
itss.gvl = (BYTE)psmp->nGlobalVol;
- if (m_nInstruments)
+
+ UINT flags = RS_PCM8S;
+ if(psmp->nLength && psmp->pSample)
{
- for (UINT iu=1; iu<=m_nInstruments; iu++) if (Instruments[iu])
+ itss.flags = 0x01;
+ if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10;
+ if (psmp->uFlags & CHN_SUSTAINLOOP) itss.flags |= 0x20;
+ if (psmp->uFlags & CHN_PINGPONGLOOP) itss.flags |= 0x40;
+ if (psmp->uFlags & CHN_PINGPONGSUSTAIN) itss.flags |= 0x80;
+
+ if (psmp->uFlags & CHN_STEREO)
{
- MODINSTRUMENT *pIns = Instruments[iu];
- for (UINT ju=0; ju<128; ju++) if (pIns->Keyboard[ju] == nsmp)
- {
- itss.flags = 0x01;
- break;
- }
+ flags = RS_STPCM8S;
+ itss.flags |= 0x04;
}
- } else
+ if (psmp->uFlags & CHN_16BIT)
+ {
+ itss.flags |= 0x02;
+ flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S;
+ }
+
+ itss.cvt = 0x01;
+ }
+ else
{
- itss.flags = 0x01;
+ itss.flags = 0x00;
}
- if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10;
- if (psmp->uFlags & CHN_SUSTAINLOOP) itss.flags |= 0x20;
- if (psmp->uFlags & CHN_PINGPONGLOOP) itss.flags |= 0x40;
- if (psmp->uFlags & CHN_PINGPONGSUSTAIN) itss.flags |= 0x80;
+
itss.C5Speed = psmp->nC5Speed;
if (!itss.C5Speed) itss.C5Speed = 8363;
itss.length = psmp->nLength;
@@ -2915,21 +2918,8 @@
itss.vid = min(psmp->nVibDepth, 32);
itss.vir = min(psmp->nVibSweep, 255);
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
- if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
- UINT flags = RS_PCM8S;
- if (psmp->uFlags & CHN_STEREO)
- {
- flags = RS_STPCM8S;
- itss.flags |= 0x04;
- }
- if (psmp->uFlags & CHN_16BIT)
- {
- itss.flags |= 0x02;
- flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S;
- }
+
itss.samplepointer = dwPos;
- if (!(psmp->pSample) || !(psmp->nLength))
- itss.flags = 0;
fseek(f, smppos[nsmp-1], SEEK_SET);
fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f);
fseek(f, dwPos, SEEK_SET);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-09 20:21:49
|
Revision: 489
http://modplug.svn.sourceforge.net/modplug/?rev=489&view=rev
Author: saga-games
Date: 2010-02-09 20:21:38 +0000 (Tue, 09 Feb 2010)
Log Message:
-----------
[Fix] Pattern Editor: In Note Properties, the waveform display for S[345]x (and equivalent MOD/XM effeects) was not always fully visible ("continue" addition was cut off)
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-02-08 21:41:59 UTC (rev 488)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-02-09 20:21:38 UTC (rev 489)
@@ -2678,10 +2678,10 @@
case 0x01: strcpy(s, "ramp down"); break;
case 0x02: strcpy(s, "square wave"); break;
case 0x03: strcpy(s, "random"); break;
- case 0x04: strcpy(s, "sine wave (continue)"); break;
- case 0x05: strcpy(s, "ramp down (continue)"); break;
- case 0x06: strcpy(s, "square wave (continue)"); break;
- case 0x07: strcpy(s, "random (continue)"); break;
+ case 0x04: strcpy(s, "sine wave (cont.)"); break;
+ case 0x05: strcpy(s, "ramp down (cont.)"); break;
+ case 0x06: strcpy(s, "square wave (cont.)"); break;
+ case 0x07: strcpy(s, "random (cont.)"); break;
default: strcpy(s, "ignore"); break;
}
break;
@@ -2737,10 +2737,10 @@
case 0x02: case 0x0A: strcpy(s, "square wave"); break;
case 0x03: case 0x0B: strcpy(s, "square wave"); break;
- case 0x04: case 0x0C: strcpy(s, "sine wave (continue)"); break;
- case 0x05: case 0x0D: strcpy(s, "ramp down (continue)"); break;
- case 0x06: case 0x0E: strcpy(s, "square wave (continue)"); break;
- case 0x07: case 0x0F: strcpy(s, "square wave (continue)"); break;
+ case 0x04: case 0x0C: strcpy(s, "sine wave (cont.)"); break;
+ case 0x05: case 0x0D: strcpy(s, "ramp down (cont.)"); break;
+ case 0x06: case 0x0E: strcpy(s, "square wave (cont.)"); break;
+ case 0x07: case 0x0F: strcpy(s, "square wave (cont.)"); break;
}
break;
case 0x60: // pattern loop
@@ -3516,4 +3516,3 @@
}
return displayName;
}
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-08 21:42:08
|
Revision: 488
http://modplug.svn.sourceforge.net/modplug/?rev=488&view=rev
Author: saga-games
Date: 2010-02-08 21:41:59 +0000 (Mon, 08 Feb 2010)
Log Message:
-----------
[Fix] Pattern Editor: When working with multiple sequences, switching to the pattern editor for the first time automatically marked the document as modified.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-02-07 18:32:14 UTC (rev 487)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-02-08 21:41:59 UTC (rev 488)
@@ -1255,7 +1255,11 @@
{
SEQUENCEINDEX newSeq = (SEQUENCEINDEX)GetDlgItemInt(IDC_EDIT_SEQNUM);
- if (newSeq >= MAX_SEQUENCES)
+ // avoid reloading the order list and thus setting the document modified
+ if(newSeq == m_pSndFile->Order.GetCurrentSequenceIndex())
+ return;
+
+ if (newSeq >= MAX_SEQUENCES)
{
newSeq = MAX_SEQUENCES - 1;
SetDlgItemInt(IDC_EDIT_SEQNUM, MAX_SEQUENCES - 1, FALSE);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-07 18:32:23
|
Revision: 487
http://modplug.svn.sourceforge.net/modplug/?rev=487&view=rev
Author: saga-games
Date: 2010-02-07 18:32:14 +0000 (Sun, 07 Feb 2010)
Log Message:
-----------
[Imp] General Tab: Disabled tempo slider for MOD files (it was just confusing)
[Imp] General Tab: Disabled global volume slider for MOD files, instead enabled the sample pre-amp slider (so it is also possible to make output louder)
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_gen.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2010-02-07 15:33:33 UTC (rev 486)
+++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2010-02-07 18:32:14 UTC (rev 487)
@@ -207,19 +207,21 @@
const BOOL bIsNotMOD_S3M = ((bIsNotMOD) && (m_pSndFile->GetType() != MOD_TYPE_S3M));
m_EditTempo.EnableWindow(bIsNotMOD);
m_SpinTempo.EnableWindow(bIsNotMOD);
+ m_SliderTempo.EnableWindow(bIsNotMOD);
m_EditSpeed.EnableWindow(bIsNotMOD);
m_SpinSpeed.EnableWindow(bIsNotMOD);
+ m_SliderGlobalVol.EnableWindow(bIsNotMOD);
m_EditGlobalVol.EnableWindow(bIsNotMOD);
m_SpinGlobalVol.EnableWindow(bIsNotMOD);
m_EditSamplePA.EnableWindow(bIsNotMOD);
m_SpinSamplePA.EnableWindow(bIsNotMOD);
- m_SliderSamplePreAmp.EnableWindow(bIsNotMOD);
+ //m_SliderSamplePreAmp.EnableWindow(bIsNotMOD);
m_SliderVSTiVol.EnableWindow(bIsNotMOD_S3M);
m_EditVSTiVol.EnableWindow(bIsNotMOD_S3M);
m_SpinVSTiVol.EnableWindow(bIsNotMOD_S3M);
m_EditRestartPos.EnableWindow(specs.hasRestartPos ? TRUE : FALSE);
- //Note: Global volume slider is not disabled for MOD
+ //Note: Sample volume slider is not disabled for MOD
//on purpose(can be used to control play volume)
// MOD Type
@@ -274,8 +276,7 @@
if ((tempo >= m_pSndFile->GetModSpecifications().tempoMin) && (tempo <= m_pSndFile->GetModSpecifications().tempoMax) && (tempo != m_pSndFile->m_nDefaultTempo)) {
m_pSndFile->m_nDefaultTempo = tempo;
m_pSndFile->m_nMusicTempo = tempo;
- if(m_pSndFile->GetType() != MOD_TYPE_MOD)
- m_pModDoc->SetModified();
+ m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this);
}
@@ -286,8 +287,7 @@
if ((gv >= 0) && (gv <= MAX_SLIDER_GLOBAL_VOL) && (gv != m_pSndFile->m_nDefaultGlobalVolume)) {
m_pSndFile->m_nGlobalVolume = gv;
m_pSndFile->m_nDefaultGlobalVolume = gv;
- if(m_pSndFile->GetType() != MOD_TYPE_MOD)
- m_pModDoc->SetModified();
+ m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this);
}
@@ -297,7 +297,8 @@
int spa = MAX_SLIDER_SAMPLE_VOL - m_SliderSamplePreAmp.GetPos();
if ((spa >= 0) && (spa <= MAX_SLIDER_SAMPLE_VOL) && (spa != m_pSndFile->m_nSamplePreAmp)) {
m_pSndFile->m_nSamplePreAmp = spa;
- m_pModDoc->SetModified();
+ if(m_pSndFile->GetType() != MOD_TYPE_MOD)
+ m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-02-07 15:33:51
|
Revision: 486
http://modplug.svn.sourceforge.net/modplug/?rev=486&view=rev
Author: saga-games
Date: 2010-02-07 15:33:33 +0000 (Sun, 07 Feb 2010)
Log Message:
-----------
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-02-07 13:23:29 UTC (rev 485)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-02-07 15:33:33 UTC (rev 486)
@@ -775,6 +775,7 @@
CModControlDlg::OnInitDialog();
m_bInitialized = FALSE;
if ((!m_pModDoc) || (!m_pSndFile)) return TRUE;
+
m_NoteMap.Init(this);
m_ToolBar.Init();
m_ToolBar.AddButton(IDC_INSTRUMENT_NEW, TIMAGE_INSTR_NEW);
@@ -783,8 +784,6 @@
m_ToolBar.AddButton(IDC_INSTRUMENT_PLAY, TIMAGE_PREVIEW);
m_SpinInstrument.SetRange(0, 0);
m_SpinInstrument.EnableWindow(FALSE);
- m_EditName.SetLimitText(32);
- m_EditFileName.SetLimitText(20);
// NNA
m_ComboNNA.AddString("Note Cut");
m_ComboNNA.AddString("Continue");
@@ -1030,6 +1029,12 @@
if (!m_bInitialized) dwHintMask |= HINT_MODTYPE;
if (dwHintMask & HINT_MODTYPE)
{
+ const CModSpecifications *specs = &m_pSndFile->GetModSpecifications();
+
+ // Limit text fields
+ m_EditName.SetLimitText(specs->instrNameLengthMax);
+ m_EditFileName.SetLimitText(specs->instrFilenameLengthMax);
+
BOOL bITandMPT = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
//rewbs.instroVSTi
BOOL bITandXM = (((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE;
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-02-07 13:23:29 UTC (rev 485)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-02-07 15:33:33 UTC (rev 486)
@@ -183,6 +183,7 @@
CModControlDlg::OnInitDialog();
if (!m_pSndFile) return TRUE;
m_bInitialized = FALSE;
+
// Zoom Selection
m_ComboZoom.AddString("Auto");
m_ComboZoom.AddString("1:1");
@@ -212,8 +213,6 @@
m_ToolBar2.AddButton(IDC_SAMPLE_INVERT, TIMAGE_SAMPLE_INVERT);
m_ToolBar2.AddButton(IDC_SAMPLE_SIGN_UNSIGN, TIMAGE_SAMPLE_UNSIGN);
// Setup Controls
- m_EditName.SetLimitText(32);
- m_EditFileName.SetLimitText(22);
m_SpinVolume.SetRange(0, 64);
m_SpinGlobalVol.SetRange(0, 64);
//rewbs.fix36944
@@ -241,7 +240,7 @@
m_SpinVibRate.SetRange(0, 64);
}
- for (UINT i=BASENOTE_MIN; i<BASENOTE_MAX; i++)
+ for (UINT i = BASENOTE_MIN; i < BASENOTE_MAX; i++)
{
CHAR s[32];
wsprintf(s, "%s%d", szNoteNames[i%12], i/12);
@@ -543,6 +542,12 @@
// Updating Ranges
if (dwHintMask & HINT_MODTYPE)
{
+ const CModSpecifications *specs = &m_pSndFile->GetModSpecifications();
+
+ // Limit text fields
+ m_EditName.SetLimitText(specs->sampleNameLengthMax);
+ m_EditFileName.SetLimitText(specs->sampleFilenameLengthMax);
+
BOOL b;
// Loop Type
m_ComboLoopType.ResetContent();
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2010-02-07 13:23:29 UTC (rev 485)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2010-02-07 15:33:33 UTC (rev 486)
@@ -30,7 +30,11 @@
TEMPO tempoMax;
ROWINDEX patternRowsMin;
ROWINDEX patternRowsMax;
- uint16 modNameLengthMax; //Meaning 'usable letters', possible null character is not included.
+ uint16 modNameLengthMax; //Meaning 'usable letters', possible null character is not included.
+ uint16 sampleNameLengthMax; //Dito
+ uint16 sampleFilenameLengthMax; //Dito
+ uint16 instrNameLengthMax; //Dito
+ uint16 instrFilenameLengthMax; //Dito
SAMPLEINDEX samplesMax;
INSTRUMENTINDEX instrumentsMax;
BYTE defaultMixLevels;
@@ -71,6 +75,10 @@
1, //Min pattern rows
1024, //Max pattern rows
25, //Max mod name length
+ 26, //Max sample name length
+ 12, //Max sample filename length
+ 26, //Max instrument name length
+ 12, //Max instrument filename length
4000, //SamplesMax
256, //instrumentMax
mixLevels_117RC3, //defaultMixLevels
@@ -100,12 +108,16 @@
64, //Pattern max.
128, //Order max.
4, //Channel min
- 4, //Channel max
+ 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_original, //defaultMixLevels
@@ -139,6 +151,10 @@
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_original, //defaultMixLevels
@@ -171,6 +187,10 @@
1, //Min pattern rows
256, //Max pattern rows
20, //Max mod name length
+ 22, //Max sample name length
+ 0, //Max sample filename length
+ 22, //Max instrument name length
+ 0, //Max instrument filename length
31, //SamplesMax (actually 16 per instrument)
128, //instrumentMax
mixLevels_original, //defaultMixLevels
@@ -204,6 +224,10 @@
1, //Min pattern rows
1024, //Max pattern rows
20, //Max mod name length
+ 22, //Max sample name length
+ 0, //Max sample filename length
+ 22, //Max instrument name length
+ 0, //Max instrument filename length
4000, //SamplesMax
256, //instrumentMax
mixLevels_117RC3, //defaultMixLevels
@@ -236,6 +260,10 @@
64, //Min pattern rows
64, //Max pattern rows
27, //Max mod name length
+ 27, //Max sample name length
+ 12, //Max sample filename length
+ 0, //Max instrument name length
+ 0, //Max instrument filename length
99, //SamplesMax
0, //instrumentMax
mixLevels_original, //defaultMixLevels
@@ -269,6 +297,10 @@
64, //Min pattern rows
64, //Max pattern rows
27, //Max mod name length
+ 27, //Max sample name length
+ 12, //Max sample filename length
+ 0, //Max instrument name length
+ 0, //Max instrument filename length
99, //SamplesMax
0, //instrumentMax
mixLevels_original, //defaultMixLevels
@@ -301,6 +333,10 @@
1, //Min pattern rows
256, //Max pattern rows
25, //Max mod name length
+ 25, //Max sample name length
+ 12, //Max sample filename length
+ 25, //Max instrument name length
+ 12, //Max instrument filename length
99, //SamplesMax
99, //instrumentMax
mixLevels_original, //defaultMixLevels
@@ -333,6 +369,10 @@
1, //Min pattern rows
1024, //Max pattern rows
25, //Max mod name length
+ 25, //Max sample name length
+ 12, //Max sample filename length
+ 25, //Max instrument name length
+ 12, //Max instrument filename length
4000, //SamplesMax
256, //instrumentMax
mixLevels_117RC3, //defaultMixLevels
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|