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
(48) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <sag...@us...> - 2010-09-08 23:45:53
|
Revision: 704
http://modplug.svn.sourceforge.net/modplug/?rev=704&view=rev
Author: saga-games
Date: 2010-09-08 23:45:46 +0000 (Wed, 08 Sep 2010)
Log Message:
-----------
[Fix] MTM Loader: As MTM files were converted to MOD automatically, channel panning was lost. Now they're converted to S3M instead.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/soundlib/Load_mtm.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-09-07 17:45:33 UTC (rev 703)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-09-08 23:45:46 UTC (rev 704)
@@ -342,7 +342,6 @@
bModified = FALSE;
break;
case MOD_TYPE_AMF0:
- case MOD_TYPE_MTM:
case MOD_TYPE_669:
m_SndFile.ChangeModTypeTo(MOD_TYPE_MOD);
break;
@@ -362,6 +361,7 @@
case MOD_TYPE_STM:
case MOD_TYPE_DSM:
case MOD_TYPE_AMF:
+ case MOD_TYPE_MTM:
m_SndFile.ChangeModTypeTo(MOD_TYPE_S3M);
break;
case MOD_TYPE_IMF:
Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mtm.cpp 2010-09-07 17:45:33 UTC (rev 703)
+++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2010-09-08 23:45:46 UTC (rev 704)
@@ -94,6 +94,7 @@
Samples[i].nLoopEnd >>= 1;
}
Samples[i].nPan = 128;
+ Samples[i].nC5Speed = TransposeToFrequency(0, Samples[i].nFineTune);
}
dwMemPos += 37;
}
@@ -130,7 +131,11 @@
}
m->command = cmd;
m->param = param;
- if ((cmd) || (param)) ConvertModCommand(m);
+ if ((cmd) || (param))
+ {
+ ConvertModCommand(m);
+ ConvertCommand(m, MOD_TYPE_MOD, MOD_TYPE_S3M);
+ }
}
}
pSeq += 32;
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-09-07 17:45:33 UTC (rev 703)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-09-08 23:45:46 UTC (rev 704)
@@ -1366,9 +1366,9 @@
if (!m_nType) return MOD_TYPE_NONE;
if (m_nType & (MOD_TYPE_MOD/*|MOD_TYPE_OKT*/))
return MOD_TYPE_MOD;
- if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_ULT|MOD_TYPE_FAR|MOD_TYPE_PTM))
+ if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_ULT|MOD_TYPE_FAR|MOD_TYPE_PTM|MOD_TYPE_MTM))
return MOD_TYPE_S3M;
- if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MED|MOD_TYPE_MTM/*|MOD_TYPE_MT2*/))
+ if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MED/*|MOD_TYPE_MT2*/))
return MOD_TYPE_XM;
if(m_nType & MOD_TYPE_MPT)
return MOD_TYPE_MPT;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-07 17:45:39
|
Revision: 703
http://modplug.svn.sourceforge.net/modplug/?rev=703&view=rev
Author: saga-games
Date: 2010-09-07 17:45:33 +0000 (Tue, 07 Sep 2010)
Log Message:
-----------
[Imp] Mod Conversion: Sample sustain loops are now converted to normal loops if needed and possible.
[Imp] Mod Conversion: Bidi loops are disabled when converting to MOD/S3M now.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/ModConvert.cpp
trunk/OpenMPT/mptrack/ModConvert.h
Modified: trunk/OpenMPT/mptrack/ModConvert.cpp
===================================================================
--- trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-07 16:13:10 UTC (rev 702)
+++ trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-07 17:45:33 UTC (rev 703)
@@ -2,7 +2,35 @@
* ModConvert.cpp
* --------------
* Purpose: Code for converting between various module formats.
- * Notes : (currently none)
+ * Notes : Incomplete list of MPTm-only features and extensions in the old formats:
+ * Features only available for MPTm:
+ * - User definable tunings.
+ * - Extended pattern range
+ * - Extended sequence
+ * - Multiple sequences ("songs")
+ * - Pattern-specific time signatures
+ * - Pattern effects :xy, S7D, S7E
+ * - Long instrument envelopes
+ * - Envelope release node (this was previously also usable in the IT format, but is now deprecated in that format)
+ *
+ * Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats):
+ * - Plugins
+ * - Extended ranges for
+ * - Sample count
+ * - Instrument count
+ * - Pattern count
+ * - Sequence size
+ * - Row count
+ * - Channel count
+ * - Tempo limits
+ * - Extended sample/instrument properties.
+ * - MIDI mapping directives
+ * - Version info
+ * - Channel names
+ * - Pattern names
+ * - Alternative tempomodes
+ * - For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties()
+ *
* Authors: OpenMPT Devs
*
*/
@@ -30,7 +58,7 @@
{
// Even if m_nType doesn't change, we might need to change extension in itp<->it case.
// This is because ITP is a HACK and doesn't genuinely change m_nType,
- // but uses flages instead.
+ // but uses flags instead.
ChangeFileExtension(nNewType);
return true;
}
@@ -53,42 +81,11 @@
const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType);
- /*
- Incomplete list of MPTm-only features and extensions in the old formats:
-
- Features only available for MPTm:
- -User definable tunings.
- -Extended pattern range
- -Extended sequence
- -Multiple sequences ("songs")
- -Pattern-specific time signatures
- -Pattern effects :xy, S7D, S7E
- -Long instrument envelopes
- -Envelope release node (this was previously also usable in the IT format, but is deprecated in that format)
-
- Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats):
- -plugs
- -Extended ranges for
- -sample count
- -instrument count
- -pattern count
- -sequence size
- -Row count
- -channel count
- -tempo limits
- -Extended sample/instrument properties.
- -MIDI mapping directives
- -Versioninfo
- -channel names
- -pattern names
- -Alternative tempomodes
- -For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties()
- */
-
// Check if conversion to 64 rows is necessary
- for(PATTERNINDEX ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++)
+ for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++)
{
- if ((m_SndFile.Patterns[ipat]) && (m_SndFile.Patterns[ipat].GetNumRows() != 64)) nResizedPatterns++;
+ if ((m_SndFile.Patterns[nPat]) && (m_SndFile.Patterns[nPat].GetNumRows() != 64))
+ nResizedPatterns++;
}
if(((m_SndFile.m_nInstruments) || (nResizedPatterns)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M)))
@@ -206,14 +203,32 @@
// Do some sample conversion
for(SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++)
{
- // No Sustain loops for MOD/S3M
+ // No Bidi / Sustain loops / Autovibrato for MOD/S3M
if(newTypeIsMOD || newTypeIsS3M)
{
+ // Bidi loops
+ if((m_SndFile.Samples[nSmp].uFlags & CHN_PINGPONGLOOP) != 0)
+ {
+ m_SndFile.Samples[nSmp].uFlags &= ~CHN_PINGPONGLOOP;
+ CHANGEMODTYPE_WARNING(wSampleBidiLoops);
+ }
+
+ // Sustain loops
if(m_SndFile.Samples[nSmp].nSustainStart || m_SndFile.Samples[nSmp].nSustainEnd)
{
+ // We can at least try to convert sustain loops to normal loops
+ if(m_SndFile.Samples[nSmp].nLoopEnd == 0)
+ {
+ m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nLoopStart;
+ m_SndFile.Samples[nSmp].nSustainEnd = m_SndFile.Samples[nSmp].nLoopEnd;
+ m_SndFile.Samples[nSmp].uFlags |= CHN_LOOP;
+ }
m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0;
+ m_SndFile.Samples[nSmp].uFlags &= ~(CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN);
CHANGEMODTYPE_WARNING(wSampleSustainLoops);
}
+
+ // Autovibrato
if(m_SndFile.Samples[nSmp].nVibDepth || m_SndFile.Samples[nSmp].nVibRate || m_SndFile.Samples[nSmp].nVibSweep)
{
m_SndFile.Samples[nSmp].nVibDepth = m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibSweep = m_SndFile.Samples[nSmp].nVibType = 0;
@@ -381,14 +396,6 @@
END_CRITICAL();
ChangeFileExtension(nNewType);
- //rewbs.cutomKeys: update effect key commands
- CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler();
- if (newTypeIsMOD_XM)
- ih->SetXMEffects();
- else
- ih->SetITEffects();
- //end rewbs.cutomKeys
-
// Check mod specifications
m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax);
m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax);
@@ -404,6 +411,7 @@
CHANGEMODTYPE_CHECK(wInstrumentsToSamples, "All instruments have been converted to samples.\n");
wsprintf(s, "%d patterns have been resized to 64 rows\n", nResizedPatterns);
CHANGEMODTYPE_CHECK(wResizedPatterns, s);
+ CHANGEMODTYPE_CHECK(wSampleBidiLoops, "Sample bidi loops are not supported by the new format.\n");
CHANGEMODTYPE_CHECK(wSampleSustainLoops, "New format doesn't support sample sustain loops.\n");
CHANGEMODTYPE_CHECK(wSampleAutoVibrato, "New format doesn't support sample autovibrato.\n");
CHANGEMODTYPE_CHECK(wMODSampleFrequency, "Sample C-5 frequencies will be lost.\n");
@@ -425,6 +433,15 @@
GetSampleUndo()->ClearUndo();
UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL);
EndWaitCursor();
+
+ //rewbs.customKeys: update effect key commands
+ CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler();
+ if (newTypeIsMOD_XM)
+ ih->SetXMEffects();
+ else
+ ih->SetITEffects();
+ //end rewbs.customKeys
+
return true;
}
Modified: trunk/OpenMPT/mptrack/ModConvert.h
===================================================================
--- trunk/OpenMPT/mptrack/ModConvert.h 2010-09-07 16:13:10 UTC (rev 702)
+++ trunk/OpenMPT/mptrack/ModConvert.h 2010-09-07 17:45:33 UTC (rev 703)
@@ -13,6 +13,7 @@
{
wInstrumentsToSamples = 0,
wResizedPatterns,
+ wSampleBidiLoops,
wSampleSustainLoops,
wSampleAutoVibrato,
wMODSampleFrequency,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-07 16:13:16
|
Revision: 702
http://modplug.svn.sourceforge.net/modplug/?rev=702&view=rev
Author: saga-games
Date: 2010-09-07 16:13:10 +0000 (Tue, 07 Sep 2010)
Log Message:
-----------
[Imp] Mod Conversion: When converting patterns from a format with instruments to a format without instruments (or when removing all instruments using the cleanup dialog), the instrument note mapping is now also taken care of.
[Ref] Refactored the instrument->sample pattern conversion code using ForEachModCommand.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2010-09-07 14:37:26 UTC (rev 701)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2010-09-07 16:13:10 UTC (rev 702)
@@ -221,7 +221,7 @@
bool ChangeModType(MODTYPE wType);
bool ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg = true);
- BOOL ConvertInstrumentsToSamples();
+ bool ConvertInstrumentsToSamples();
UINT RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]);
PATTERNINDEX InsertPattern(ORDERINDEX nOrd = ORDERINDEX_INVALID, ROWINDEX nRows = 64);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-07 14:37:26 UTC (rev 701)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-07 16:13:10 UTC (rev 702)
@@ -182,29 +182,49 @@
}
-BOOL CModDoc::ConvertInstrumentsToSamples()
-//-----------------------------------------
+// Functor for converting instrument numbers to sample numbers in the patterns
+struct ConvertInstrumentsToSamplesInPatterns
+//==========================================
{
- if (!m_SndFile.m_nInstruments) return FALSE;
- for (UINT i=0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns[i])
+ ConvertInstrumentsToSamplesInPatterns(CSoundFile *pSndFile)
{
- MODCOMMAND *p = m_SndFile.Patterns[i];
- for (UINT j=m_SndFile.m_nChannels*m_SndFile.Patterns[i].GetNumRows(); j; j--, p++) if (p->instr)
+ this->pSndFile = pSndFile;
+ }
+
+ void operator()(MODCOMMAND& m)
+ {
+ if(m.instr)
{
- UINT instr = p->instr;
- UINT note = p->note;
- UINT newins = 0;
- if ((note) && (note < 128)) note--; else note = 5*12;
- if ((instr < MAX_INSTRUMENTS) && (m_SndFile.Instruments[instr]))
+ MODCOMMAND::INSTR instr = m.instr, newinstr = 0;
+ MODCOMMAND::NOTE note = m.note, newnote = note;
+ if((note) && (note <= NOTE_MAX))
+ note--;
+ else
+ note = NOTE_MIDDLEC - 1;
+
+ if((instr < MAX_INSTRUMENTS) && (pSndFile->Instruments[instr]))
{
- MODINSTRUMENT *pIns = m_SndFile.Instruments[instr];
- newins = pIns->Keyboard[note];
- if (newins >= MAX_SAMPLES) newins = 0;
+ const MODINSTRUMENT *pIns = pSndFile->Instruments[instr];
+ newinstr = pIns->Keyboard[note];
+ newnote = pIns->NoteMap[note];
+ if(newinstr >= MAX_SAMPLES) newinstr = 0;
}
- p->instr = newins;
+ m.instr = newinstr;
+ m.note = newnote;
}
}
- return TRUE;
+
+ CSoundFile *pSndFile;
+};
+
+
+bool CModDoc::ConvertInstrumentsToSamples()
+//-----------------------------------------
+{
+ if (!m_SndFile.GetNumInstruments())
+ return false;
+ m_SndFile.Patterns.ForEachModCommand(ConvertInstrumentsToSamplesInPatterns(&m_SndFile));
+ return true;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-07 14:37:33
|
Revision: 701
http://modplug.svn.sourceforge.net/modplug/?rev=701&view=rev
Author: saga-games
Date: 2010-09-07 14:37:26 +0000 (Tue, 07 Sep 2010)
Log Message:
-----------
[Ref] Moved the big pile of module conversion code to a separate file.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/mptrack.vcproj
trunk/OpenMPT/mptrack/mptrack_08.vcproj
Added Paths:
-----------
trunk/OpenMPT/mptrack/ModConvert.cpp
trunk/OpenMPT/mptrack/ModConvert.h
Added: trunk/OpenMPT/mptrack/ModConvert.cpp
===================================================================
--- trunk/OpenMPT/mptrack/ModConvert.cpp (rev 0)
+++ trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-07 14:37:26 UTC (rev 701)
@@ -0,0 +1,460 @@
+/*
+ * ModConvert.cpp
+ * --------------
+ * Purpose: Code for converting between various module formats.
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ *
+ */
+
+#include "Stdafx.h"
+#include "Moddoc.h"
+#include "Mainfrm.h"
+#include "modsmp_ctrl.h"
+#include "ModConvert.h"
+
+
+#define CHANGEMODTYPE_WARNING(x) nWarnings |= (1 << x);
+#define CHANGEMODTYPE_CHECK(x, s) if((nWarnings & (1 << x)) != 0) AddToLog(_T(s));
+
+
+bool CModDoc::ChangeModType(MODTYPE nNewType)
+//-------------------------------------------
+{
+ uint64 nWarnings = 0;
+ PATTERNINDEX nResizedPatterns = 0;
+
+ const MODTYPE nOldType = m_SndFile.GetType();
+
+ if (nNewType == nOldType && nNewType == MOD_TYPE_IT)
+ {
+ // Even if m_nType doesn't change, we might need to change extension in itp<->it case.
+ // This is because ITP is a HACK and doesn't genuinely change m_nType,
+ // but uses flages instead.
+ ChangeFileExtension(nNewType);
+ return true;
+ }
+
+ if(nNewType == nOldType)
+ return true;
+
+ const bool oldTypeIsMOD = (nOldType == MOD_TYPE_MOD), oldTypeIsXM = (nOldType == MOD_TYPE_XM),
+ oldTypeIsS3M = (nOldType == MOD_TYPE_S3M), oldTypeIsIT = (nOldType == MOD_TYPE_IT),
+ oldTypeIsMPT = (nOldType == MOD_TYPE_MPT), oldTypeIsMOD_XM = (oldTypeIsMOD || oldTypeIsXM),
+ oldTypeIsS3M_IT_MPT = (oldTypeIsS3M || oldTypeIsIT || oldTypeIsMPT),
+ oldTypeIsIT_MPT = (oldTypeIsIT || oldTypeIsMPT);
+
+ const bool newTypeIsMOD = (nNewType == MOD_TYPE_MOD), newTypeIsXM = (nNewType == MOD_TYPE_XM),
+ newTypeIsS3M = (nNewType == MOD_TYPE_S3M), newTypeIsIT = (nNewType == MOD_TYPE_IT),
+ newTypeIsMPT = (nNewType == MOD_TYPE_MPT), newTypeIsMOD_XM = (newTypeIsMOD || newTypeIsXM),
+ newTypeIsS3M_IT_MPT = (newTypeIsS3M || newTypeIsIT || newTypeIsMPT),
+ newTypeIsXM_IT_MPT = (newTypeIsXM || newTypeIsIT || newTypeIsMPT),
+ newTypeIsIT_MPT = (newTypeIsIT || newTypeIsMPT);
+
+ const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType);
+
+ /*
+ Incomplete list of MPTm-only features and extensions in the old formats:
+
+ Features only available for MPTm:
+ -User definable tunings.
+ -Extended pattern range
+ -Extended sequence
+ -Multiple sequences ("songs")
+ -Pattern-specific time signatures
+ -Pattern effects :xy, S7D, S7E
+ -Long instrument envelopes
+ -Envelope release node (this was previously also usable in the IT format, but is deprecated in that format)
+
+ Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats):
+ -plugs
+ -Extended ranges for
+ -sample count
+ -instrument count
+ -pattern count
+ -sequence size
+ -Row count
+ -channel count
+ -tempo limits
+ -Extended sample/instrument properties.
+ -MIDI mapping directives
+ -Versioninfo
+ -channel names
+ -pattern names
+ -Alternative tempomodes
+ -For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties()
+ */
+
+ // Check if conversion to 64 rows is necessary
+ for(PATTERNINDEX ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++)
+ {
+ if ((m_SndFile.Patterns[ipat]) && (m_SndFile.Patterns[ipat].GetNumRows() != 64)) nResizedPatterns++;
+ }
+
+ if(((m_SndFile.m_nInstruments) || (nResizedPatterns)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M)))
+ {
+ if(::MessageBox(NULL,
+ "This operation will convert all instruments to samples,\n"
+ "and resize all patterns to 64 rows.\n"
+ "Do you want to continue?", "Warning", MB_YESNO | MB_ICONQUESTION) != IDYES) return false;
+ BeginWaitCursor();
+ BEGIN_CRITICAL();
+
+ // Converting instruments to samples
+ if(m_SndFile.m_nInstruments)
+ {
+ ConvertInstrumentsToSamples();
+ CHANGEMODTYPE_WARNING(wInstrumentsToSamples);
+ }
+
+ // Resizing all patterns to 64 rows
+ for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if ((m_SndFile.Patterns[nPat]) && (m_SndFile.Patterns[nPat].GetNumRows() != 64))
+ {
+ // try to save short patterns by inserting a pattern break.
+ if(m_SndFile.Patterns[nPat].GetNumRows() < 64)
+ {
+ m_SndFile.TryWriteEffect(nPat, m_SndFile.Patterns[nPat].GetNumRows() - 1, CMD_PATTERNBREAK, 0, false, CHANNELINDEX_INVALID, false, true);
+ }
+ m_SndFile.Patterns[nPat].Resize(64, false);
+ CHANGEMODTYPE_WARNING(wResizedPatterns);
+ }
+
+ // Removing all instrument headers
+ for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++)
+ {
+ m_SndFile.Chn[nChn].pModInstrument = nullptr;
+ }
+
+ for(INSTRUMENTINDEX nIns = 0; nIns < m_SndFile.m_nInstruments; nIns++) if (m_SndFile.Instruments[nIns])
+ {
+ delete m_SndFile.Instruments[nIns];
+ m_SndFile.Instruments[nIns] = nullptr;
+ }
+ m_SndFile.m_nInstruments = 0;
+ END_CRITICAL();
+ EndWaitCursor();
+ } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M)))
+ BeginWaitCursor();
+
+
+ /////////////////////////////
+ // Converting pattern data
+
+ for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
+ {
+ MODCOMMAND *m = m_SndFile.Patterns[nPat];
+
+ // This is used for -> MOD/XM conversion
+ vector<vector<MODCOMMAND::PARAM> > cEffectMemory;
+ cEffectMemory.resize(m_SndFile.GetNumChannels());
+ for(size_t i = 0; i < m_SndFile.GetNumChannels(); i++)
+ {
+ cEffectMemory[i].resize(MAX_EFFECTS, 0);
+ }
+
+ CHANNELINDEX nChannel = m_SndFile.m_nChannels - 1;
+
+ for (UINT len = m_SndFile.Patterns[nPat].GetNumRows() * m_SndFile.m_nChannels; len; m++, len--)
+ {
+ nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1
+
+ m_SndFile.ConvertCommand(m, nOldType, nNewType);
+
+ // Deal with effect memory for MOD/XM arpeggio
+ if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM)
+ {
+ switch(m->command)
+ {
+ case CMD_ARPEGGIO:
+ case CMD_S3MCMDEX:
+ case CMD_MODCMDEX:
+ // No effect memory in XM / MOD
+ if(m->param == 0)
+ m->param = cEffectMemory[nChannel][m->command];
+ else
+ cEffectMemory[nChannel][m->command] = m->param;
+ break;
+ }
+ }
+
+ // Adjust effect memory for MOD files
+ if(newTypeIsMOD)
+ {
+ switch(m->command)
+ {
+ case CMD_PORTAMENTOUP:
+ case CMD_PORTAMENTODOWN:
+ case CMD_TONEPORTAVOL:
+ case CMD_VIBRATOVOL:
+ case CMD_VOLUMESLIDE:
+ // ProTracker doesn't have effect memory for these commands, so let's try to fix them
+ if(m->param == 0)
+ m->param = cEffectMemory[nChannel][m->command];
+ else
+ cEffectMemory[nChannel][m->command] = m->param;
+ break;
+
+ }
+ }
+ }
+ }
+
+ ////////////////////////////////////////////////
+ // Converting instrument / sample / etc. data
+
+
+ // Do some sample conversion
+ for(SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++)
+ {
+ // No Sustain loops for MOD/S3M
+ if(newTypeIsMOD || newTypeIsS3M)
+ {
+ if(m_SndFile.Samples[nSmp].nSustainStart || m_SndFile.Samples[nSmp].nSustainEnd)
+ {
+ m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0;
+ CHANGEMODTYPE_WARNING(wSampleSustainLoops);
+ }
+ if(m_SndFile.Samples[nSmp].nVibDepth || m_SndFile.Samples[nSmp].nVibRate || m_SndFile.Samples[nSmp].nVibSweep)
+ {
+ m_SndFile.Samples[nSmp].nVibDepth = m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibSweep = m_SndFile.Samples[nSmp].nVibType = 0;
+ CHANGEMODTYPE_WARNING(wSampleAutoVibrato);
+ }
+ }
+
+ // Transpose to Frequency (MOD/XM to S3M/IT/MPT)
+ if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT)
+ {
+ m_SndFile.Samples[nSmp].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[nSmp].RelativeTone, m_SndFile.Samples[nSmp].nFineTune);
+ m_SndFile.Samples[nSmp].RelativeTone = 0;
+ m_SndFile.Samples[nSmp].nFineTune = 0;
+ }
+
+ // Frequency to Transpose, panning (S3M/IT/MPT to MOD/XM)
+ if(oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM)
+ {
+ CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]);
+ if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128;
+ // No relative note for MOD files
+ // TODO: Pattern notes could be transposed based on the previous relative tone?
+ if(newTypeIsMOD && m_SndFile.Samples[nSmp].RelativeTone != 0)
+ {
+ m_SndFile.Samples[nSmp].RelativeTone = 0;
+ CHANGEMODTYPE_WARNING(wMODSampleFrequency);
+ }
+ }
+
+ if(oldTypeIsXM && newTypeIsIT_MPT)
+ {
+ // Autovibrato settings (XM to IT, where sweep 0 means "no vibrato")
+ if(m_SndFile.Samples[nSmp].nVibSweep == 0 && m_SndFile.Samples[nSmp].nVibRate != 0 && m_SndFile.Samples[nSmp].nVibDepth != 0)
+ m_SndFile.Samples[nSmp].nVibSweep = 255;
+ } else if(oldTypeIsIT_MPT && newTypeIsXM)
+ {
+ // Autovibrato settings (IT to XM, where sweep 0 means "no sweep")
+ if(m_SndFile.Samples[nSmp].nVibSweep == 0)
+ m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibDepth = 0;
+ }
+ }
+
+ // Convert IT/MPT to XM (instruments)
+ if(oldTypeIsIT_MPT && newTypeIsXM)
+ {
+ for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++)
+ {
+ MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns];
+ if (pIns)
+ {
+ for (UINT k = 0; k < NOTE_MAX; k++)
+ {
+ if ((pIns->NoteMap[k]) && (pIns->NoteMap[k] != (BYTE)(k+1)))
+ {
+ CHANGEMODTYPE_WARNING(wBrokenNoteMap);
+ break;
+ }
+ }
+ // Convert sustain loops to sustain "points"
+ if(pIns->VolEnv.nSustainStart != pIns->VolEnv.nSustainEnd)
+ {
+ CHANGEMODTYPE_WARNING(wInstrumentSustainLoops);
+ pIns->VolEnv.nSustainEnd = pIns->VolEnv.nSustainStart;
+ }
+ if(pIns->PanEnv.nSustainStart != pIns->PanEnv.nSustainEnd)
+ {
+ CHANGEMODTYPE_WARNING(wInstrumentSustainLoops);
+ pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart;
+ }
+ pIns->VolEnv.dwFlags &= ~ENV_CARRY;
+ pIns->PanEnv.dwFlags &= ~ENV_CARRY;
+ pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER);
+ pIns->dwFlags &= ~INS_SETPANNING;
+ pIns->nIFC &= 0x7F;
+ pIns->nIFR &= 0x7F;
+ }
+ }
+ }
+
+ // Instrument tunings
+ if(oldTypeIsMPT)
+ {
+ for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++)
+ {
+ if(m_SndFile.Instruments[nIns] != nullptr && m_SndFile.Instruments[nIns]->pTuning != nullptr)
+ {
+ m_SndFile.Instruments[nIns]->SetTuning(nullptr);
+ CHANGEMODTYPE_WARNING(wInstrumentTuning);
+ }
+ }
+ }
+
+ if(newTypeIsMOD)
+ {
+ // Not supported in MOD format
+ m_SndFile.m_nDefaultSpeed = 6;
+ m_SndFile.m_nDefaultTempo = 125;
+ m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
+ m_SndFile.m_nSamplePreAmp = 48;
+ m_SndFile.m_nVSTiVolume = 48;
+ CHANGEMODTYPE_WARNING(wMODGlobalVars);
+
+ // Too many samples?
+ if(m_SndFile.m_nSamples > 31)
+ {
+ CHANGEMODTYPE_WARNING(wMOD31Samples);
+ }
+ }
+
+ // Is the "restart position" value allowed in this format?
+ if(m_SndFile.m_nRestartPos > 0 && !CSoundFile::GetModSpecifications(nNewType).hasRestartPos)
+ {
+ m_SndFile.m_nRestartPos = 0;
+ CHANGEMODTYPE_WARNING(wRestartPos);
+ }
+
+ // Fix channel settings (pan/vol)
+ for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++)
+ {
+ if(newTypeIsMOD_XM || newTypeIsS3M)
+ {
+ if(m_SndFile.ChnSettings[nChn].nVolume != 64 || (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SURROUND))
+ {
+ m_SndFile.ChnSettings[nChn].nVolume = 64;
+ m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
+ CHANGEMODTYPE_WARNING(wChannelVolSurround);
+ }
+ }
+ if(newTypeIsXM)
+ {
+ if(m_SndFile.ChnSettings[nChn].nPan != 128)
+ {
+ m_SndFile.ChnSettings[nChn].nPan = 128;
+ CHANGEMODTYPE_WARNING(wChannelPanning);
+ }
+ }
+ }
+
+ // Check for patterns with custom time signatures (fixing will be applied in the pattern container)
+ if(!CSoundFile::GetModSpecifications(nNewType).hasPatternSignatures)
+ {
+ for(PATTERNINDEX nPat = 0; nPat < m_SndFile.GetNumPatterns(); nPat++)
+ {
+ if(m_SndFile.Patterns[nPat].GetOverrideSignature())
+ {
+ CHANGEMODTYPE_WARNING(wPatternSignatures);
+ break;
+ }
+ }
+ }
+
+ BEGIN_CRITICAL();
+ m_SndFile.ChangeModTypeTo(nNewType);
+ if(!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES))
+ {
+ CHANGEMODTYPE_WARNING(wLinearSlides);
+ m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES;
+ }
+ if(!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX);
+ if(!newTypeIsS3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES;
+ if(!newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_PT1XMODE;
+ if(newTypeIsS3M || newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE;
+ if(oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATGXX;
+
+ END_CRITICAL();
+ ChangeFileExtension(nNewType);
+
+ //rewbs.cutomKeys: update effect key commands
+ CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler();
+ if (newTypeIsMOD_XM)
+ ih->SetXMEffects();
+ else
+ ih->SetITEffects();
+ //end rewbs.cutomKeys
+
+ // Check mod specifications
+ m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax);
+ m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax);
+
+ for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) if(m_SndFile.Instruments[i] != nullptr)
+ {
+ UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv), nWarnings);
+ UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv), nWarnings);
+ UpdateEnvelopes(&(m_SndFile.Instruments[i]->PitchEnv), nWarnings);
+ }
+
+ CHAR s[64];
+ CHANGEMODTYPE_CHECK(wInstrumentsToSamples, "All instruments have been converted to samples.\n");
+ wsprintf(s, "%d patterns have been resized to 64 rows\n", nResizedPatterns);
+ CHANGEMODTYPE_CHECK(wResizedPatterns, s);
+ CHANGEMODTYPE_CHECK(wSampleSustainLoops, "New format doesn't support sample sustain loops.\n");
+ CHANGEMODTYPE_CHECK(wSampleAutoVibrato, "New format doesn't support sample autovibrato.\n");
+ CHANGEMODTYPE_CHECK(wMODSampleFrequency, "Sample C-5 frequencies will be lost.\n");
+ CHANGEMODTYPE_CHECK(wBrokenNoteMap, "Note Mapping will be lost when saving as XM.\n");
+ CHANGEMODTYPE_CHECK(wInstrumentSustainLoops, "Sustain loops were converted to sustain points.\n");
+ CHANGEMODTYPE_CHECK(wInstrumentTuning, "Instrument tunings will be lost.\n");
+ CHANGEMODTYPE_CHECK(wMODGlobalVars, "Default speed, tempo and global volume will be lost.\n");
+ CHANGEMODTYPE_CHECK(wMOD31Samples, "Samples above 31 will be lost when saving as MOD.\n");
+ CHANGEMODTYPE_CHECK(wRestartPos, "Restart position is not supported by the new format.\n");
+ CHANGEMODTYPE_CHECK(wChannelVolSurround, "Channel volume and surround are not supported by the new format.\n");
+ CHANGEMODTYPE_CHECK(wChannelPanning, "Channel panning is not supported by the new format.\n");
+ CHANGEMODTYPE_CHECK(wPatternSignatures, "Pattern-specific time signatures are not supported by the new format.\n");
+ CHANGEMODTYPE_CHECK(wLinearSlides, "Linear Frequency Slides not supported by the new format.\n");
+ CHANGEMODTYPE_CHECK(wTrimmedEnvelopes, "Instrument envelopes have been shortened.\n");
+ CHANGEMODTYPE_CHECK(wReleaseNode, "Instrument envelope release nodes are not supported by the new format.\n");
+
+ SetModified();
+ GetPatternUndo()->ClearUndo();
+ GetSampleUndo()->ClearUndo();
+ UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL);
+ EndWaitCursor();
+ return true;
+}
+
+// Trim envelopes and remove release nodes.
+void CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, uint64 &nWarnings)
+//--------------------------------------------------------------------------
+{
+ // shorten instrument envelope if necessary (for mod conversion)
+ const UINT iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax;
+
+ #define TRIMENV(nPat) if(nPat > iEnvMax) { nPat = iEnvMax; CHANGEMODTYPE_WARNING(wTrimmedEnvelopes); }
+
+ TRIMENV(mptEnv->nNodes);
+ TRIMENV(mptEnv->nLoopStart);
+ TRIMENV(mptEnv->nLoopEnd);
+ TRIMENV(mptEnv->nSustainStart);
+ TRIMENV(mptEnv->nSustainEnd);
+ if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET)
+ {
+ TRIMENV(mptEnv->nReleaseNode);
+ if(!m_SndFile.GetModSpecifications().hasReleaseNode)
+ {
+ mptEnv->nReleaseNode = ENV_RELEASE_NODE_UNSET;
+ CHANGEMODTYPE_WARNING(wReleaseNode);
+ }
+ }
+
+ #undef TRIMENV
+}
+
+
+#undef CHANGEMODTYPE_WARNING
+#undef CHANGEMODTYPE_CHECK
Added: trunk/OpenMPT/mptrack/ModConvert.h
===================================================================
--- trunk/OpenMPT/mptrack/ModConvert.h (rev 0)
+++ trunk/OpenMPT/mptrack/ModConvert.h 2010-09-07 14:37:26 UTC (rev 701)
@@ -0,0 +1,31 @@
+/*
+ * ModConvert.h
+ * ------------
+ * Purpose: Headers for module conversion code.
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ *
+ */
+
+
+// Warning types
+enum enmWarnings
+{
+ wInstrumentsToSamples = 0,
+ wResizedPatterns,
+ wSampleSustainLoops,
+ wSampleAutoVibrato,
+ wMODSampleFrequency,
+ wBrokenNoteMap,
+ wInstrumentSustainLoops,
+ wInstrumentTuning,
+ wMODGlobalVars,
+ wMOD31Samples,
+ wRestartPos,
+ wChannelVolSurround,
+ wChannelPanning,
+ wPatternSignatures,
+ wLinearSlides,
+ wTrimmedEnvelopes,
+ wReleaseNode,
+};
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2010-09-05 23:08:56 UTC (rev 700)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2010-09-07 14:37:26 UTC (rev 701)
@@ -336,7 +336,7 @@
//}}AFX_VIRTUAL
// for mod conversion
- uint8 UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv);
+ void UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, uint64 &nWarnings);
// Implementation
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-05 23:08:56 UTC (rev 700)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-07 14:37:26 UTC (rev 701)
@@ -32,438 +32,6 @@
}
-//////////////////////////////////////////////////////////////////////
-// Module type conversion
-
-bool CModDoc::ChangeModType(MODTYPE nNewType)
-//-------------------------------------------
-{
- CHAR s[256];
- UINT b64 = 0;
-
- const MODTYPE nOldType = m_SndFile.GetType();
-
- if (nNewType == nOldType && nNewType == MOD_TYPE_IT){
- // Even if m_nType doesn't change, we might need to change extension in itp<->it case.
- // This is because ITP is a HACK and doesn't genuinely change m_nType,
- // but uses flages instead.
- ChangeFileExtension(nNewType);
- return true;
- }
-
- if(nNewType == nOldType)
- return true;
-
- const bool oldTypeIsMOD = (nOldType == MOD_TYPE_MOD), oldTypeIsXM = (nOldType == MOD_TYPE_XM),
- oldTypeIsS3M = (nOldType == MOD_TYPE_S3M), oldTypeIsIT = (nOldType == MOD_TYPE_IT),
- oldTypeIsMPT = (nOldType == MOD_TYPE_MPT), oldTypeIsMOD_XM = (oldTypeIsMOD || oldTypeIsXM),
- oldTypeIsS3M_IT_MPT = (oldTypeIsS3M || oldTypeIsIT || oldTypeIsMPT),
- oldTypeIsIT_MPT = (oldTypeIsIT || oldTypeIsMPT);
-
- const bool newTypeIsMOD = (nNewType == MOD_TYPE_MOD), newTypeIsXM = (nNewType == MOD_TYPE_XM),
- newTypeIsS3M = (nNewType == MOD_TYPE_S3M), newTypeIsIT = (nNewType == MOD_TYPE_IT),
- newTypeIsMPT = (nNewType == MOD_TYPE_MPT), newTypeIsMOD_XM = (newTypeIsMOD || newTypeIsXM),
- newTypeIsS3M_IT_MPT = (newTypeIsS3M || newTypeIsIT || newTypeIsMPT),
- newTypeIsXM_IT_MPT = (newTypeIsXM || newTypeIsIT || newTypeIsMPT),
- newTypeIsIT_MPT = (newTypeIsIT || newTypeIsMPT);
-
- const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType);
-
- /*
- Incomplete list of MPTm-only features and extensions in the old formats:
-
- Features only available for MPTm:
- -User definable tunings.
- -Extended pattern range
- -Extended sequence
- -Multiple sequences ("songs")
- -Pattern-specific time signatures
- -Pattern effects :xy, S7D, S7E
- -Long instrument envelopes
- -Envelope release node (this was previously also usable in the IT format, but is deprecated in that format)
-
- Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats):
- -plugs
- -Extended ranges for
- -sample count
- -instrument count
- -pattern count
- -sequence size
- -Row count
- -channel count
- -tempo limits
- -Extended sample/instrument properties.
- -MIDI mapping directives
- -Versioninfo
- -channel names
- -pattern names
- -Alternative tempomodes
- -For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties()
- */
-
- // Check if conversion to 64 rows is necessary
- for (UINT ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++)
- {
- if ((m_SndFile.Patterns[ipat]) && (m_SndFile.Patterns[ipat].GetNumRows() != 64)) b64++;
- }
- if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M)))
- {
- if (::MessageBox(NULL,
- "This operation will convert all instruments to samples,\n"
- "and resize all patterns to 64 rows.\n"
- "Do you want to continue?", "Warning", MB_YESNO | MB_ICONQUESTION) != IDYES) return false;
- BeginWaitCursor();
- BEGIN_CRITICAL();
- // Converting instruments to samples
- if (m_SndFile.m_nInstruments)
- {
- ConvertInstrumentsToSamples();
- AddToLog("WARNING: All instruments have been converted to samples.\n");
- }
- // Resizing all patterns to 64 rows
- UINT nPatCvt = 0;
- UINT i = 0;
- for (i=0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.Patterns[i].GetNumRows() != 64))
- {
- if(m_SndFile.Patterns[i].GetNumRows() < 64)
- {
- // try to save short patterns by inserting a pattern break.
- m_SndFile.TryWriteEffect(i, m_SndFile.Patterns[i].GetNumRows() - 1, CMD_PATTERNBREAK, 0, false, CHANNELINDEX_INVALID, false, true);
- }
- m_SndFile.Patterns[i].Resize(64, false);
- if (b64 < 5)
- {
- wsprintf(s, "WARNING: Pattern %d resized to 64 rows\n", i);
- AddToLog(s);
- }
- nPatCvt++;
- }
- if (nPatCvt >= 5)
- {
- wsprintf(s, "WARNING: %d patterns have been resized to 64 rows\n", i);
- AddToLog(s);
- }
- // Removing all instrument headers
- for (UINT i1=0; i1<MAX_CHANNELS; i1++)
- {
- m_SndFile.Chn[i1].pModInstrument = nullptr;
- }
- for (UINT i2=0; i2<m_SndFile.m_nInstruments; i2++) if (m_SndFile.Instruments[i2])
- {
- delete m_SndFile.Instruments[i2];
- m_SndFile.Instruments[i2] = nullptr;
- }
- m_SndFile.m_nInstruments = 0;
- END_CRITICAL();
- EndWaitCursor();
- } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M)))
- BeginWaitCursor();
-
-
- /////////////////////////////
- // Converting pattern data
-
- for (PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
- {
- MODCOMMAND *m = m_SndFile.Patterns[nPat];
-
- // This is used for -> MOD/XM conversion
- vector<vector<MODCOMMAND::PARAM> > cEffectMemory;
- cEffectMemory.resize(m_SndFile.GetNumChannels());
- for(size_t i = 0; i < m_SndFile.GetNumChannels(); i++)
- {
- cEffectMemory[i].resize(MAX_EFFECTS, 0);
- }
-
- UINT nChannel = m_SndFile.m_nChannels - 1;
-
- for (UINT len = m_SndFile.Patterns[nPat].GetNumRows() * m_SndFile.m_nChannels; len; m++, len--)
- {
- nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1
-
- m_SndFile.ConvertCommand(m, nOldType, nNewType);
-
- // Deal with effect memory for MOD/XM arpeggio
- if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM)
- {
- switch(m->command)
- {
- case CMD_ARPEGGIO:
- case CMD_S3MCMDEX:
- case CMD_MODCMDEX:
- // No effect memory in XM / MOD
- if(m->param == 0)
- m->param = cEffectMemory[nChannel][m->command];
- else
- cEffectMemory[nChannel][m->command] = m->param;
- break;
- }
- }
-
- // Adjust effect memory for MOD files
- if(newTypeIsMOD)
- {
- switch(m->command)
- {
- case CMD_PORTAMENTOUP:
- case CMD_PORTAMENTODOWN:
- case CMD_TONEPORTAVOL:
- case CMD_VIBRATOVOL:
- case CMD_VOLUMESLIDE:
- // ProTracker doesn't have effect memory for these commands, so let's try to fix them
- if(m->param == 0)
- m->param = cEffectMemory[nChannel][m->command];
- else
- cEffectMemory[nChannel][m->command] = m->param;
- break;
-
- }
- }
- }
- }
-
- ////////////////////////////////////////////////
- // Converting instrument / sample / etc. data
-
-
- // Do some sample conversion
- for (SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++)
- {
- // No Sustain loops for MOD/S3M
- if(newTypeIsMOD || newTypeIsS3M)
- {
- m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0;
- }
-
- // Transpose to Frequency (MOD/XM to S3M/IT/MPT)
- if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT)
- {
- m_SndFile.Samples[nSmp].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[nSmp].RelativeTone, m_SndFile.Samples[nSmp].nFineTune);
- m_SndFile.Samples[nSmp].RelativeTone = 0;
- m_SndFile.Samples[nSmp].nFineTune = 0;
- }
-
- // Frequency to Transpose (S3M/IT/MPT to MOD/XM)
- if(oldTypeIsS3M_IT_MPT && newTypeIsXM)
- {
- CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]);
- if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128;
- }
-
- if(oldTypeIsXM && newTypeIsIT_MPT)
- {
- // Autovibrato settings (XM to IT, where sweep 0 means "no vibrato")
- if(m_SndFile.Samples[nSmp].nVibSweep == 0 && m_SndFile.Samples[nSmp].nVibRate != 0 && m_SndFile.Samples[nSmp].nVibDepth != 0)
- m_SndFile.Samples[nSmp].nVibSweep = 255;
- } else if(oldTypeIsIT_MPT && newTypeIsXM)
- {
- // Autovibrato settings (IT to XM, where sweep 0 means "no sweep")
- if(m_SndFile.Samples[nSmp].nVibSweep == 0)
- m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibDepth = 0;
- }
- }
-
- // No Autovibrato for MOD/S3M
- if(newTypeIsMOD || newTypeIsS3M)
- {
- ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetVibrato);
- }
-
- if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATGXX;
-
- // Convert IT/MPT to XM (instruments)
- if (oldTypeIsIT_MPT && newTypeIsXM)
- {
- bool bBrokenNoteMap = false, bBrokenSustainLoop = false;
- for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++)
- {
- MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns];
- if (pIns)
- {
- for (UINT k = 0; k < NOTE_MAX; k++)
- {
- if ((pIns->NoteMap[k]) && (pIns->NoteMap[k] != (BYTE)(k+1)))
- {
- bBrokenNoteMap = true;
- break;
- }
- }
- // Convert sustain loops to sustain "points"
- if(pIns->VolEnv.nSustainStart != pIns->VolEnv.nSustainEnd)
- {
- pIns->VolEnv.nSustainEnd = pIns->VolEnv.nSustainStart;
- bBrokenSustainLoop = true;
- }
- if(pIns->PanEnv.nSustainStart != pIns->PanEnv.nSustainEnd)
- {
- pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart;
- bBrokenSustainLoop = true;
- }
- pIns->VolEnv.dwFlags &= ~ENV_CARRY;
- pIns->PanEnv.dwFlags &= ~ENV_CARRY;
- pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER);
- pIns->dwFlags &= ~INS_SETPANNING;
- pIns->nIFC &= 0x7F;
- pIns->nIFR &= 0x7F;
- }
- }
- if (bBrokenNoteMap) AddToLog("WARNING: Note Mapping will be lost when saving as XM.\n");
- if (bBrokenSustainLoop) AddToLog("WARNING: Sustain loops were converted to sustain points.\n");
- }
-
- // Instrument tunings
- if(oldTypeIsMPT)
- {
- bool bFirstWarn = true;
- for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++)
- {
- if(m_SndFile.Instruments[nIns] != nullptr && m_SndFile.Instruments[nIns]->pTuning != nullptr)
- {
- m_SndFile.Instruments[nIns]->SetTuning(nullptr);
- if(bFirstWarn)
- {
- AddToLog("WARNING: Instrument tunings will be lost!\n");
- bFirstWarn = false;
- }
- }
- }
- }
-
- if(newTypeIsMOD)
- {
- // Not supported in MOD format
- m_SndFile.m_nDefaultSpeed = 6;
- m_SndFile.m_nDefaultTempo = 125;
- m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
- m_SndFile.m_nSamplePreAmp = 48;
- m_SndFile.m_nVSTiVolume = 48;
- AddToLog("WARNING: Default speed, tempo and global volume will be lost.\n");
-
- // Too many samples?
- if(m_SndFile.m_nSamples > 31)
- {
- AddToLog("WARNING: Samples above 31 will be lost when saving as MOD!\n");
- }
- }
-
- // Is the "restart position" value allowed in this format?
- if(m_SndFile.m_nRestartPos > 0 && !CSoundFile::GetModSpecifications(nNewType).hasRestartPos)
- {
- m_SndFile.m_nRestartPos = 0;
- AddToLog("WARNING: Restart position is not supported by the new format.\n");
- }
-
-
- // Fix channel settings (pan/vol)
- for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++)
- {
- if(newTypeIsMOD_XM || newTypeIsS3M)
- {
- m_SndFile.ChnSettings[nChn].nVolume = 64;
- m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
- }
- if(newTypeIsXM)
- {
- m_SndFile.ChnSettings[nChn].nPan = 128;
- }
- }
-
- // Check for patterns with custom time signatures (fixing will be applied in the pattern container)
- if(!CSoundFile::GetModSpecifications(nNewType).hasPatternSignatures)
- {
- for(PATTERNINDEX nPat = 0; nPat < m_SndFile.GetNumPatterns(); nPat++)
- {
- if(m_SndFile.Patterns[nPat].GetOverrideSignature())
- {
- AddToLog("WARNING: Pattern-specific time signatures are not supported by the new format.\n");
- break;
- }
- }
- }
-
- BEGIN_CRITICAL();
- m_SndFile.ChangeModTypeTo(nNewType);
- if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES))
- {
- AddToLog("WARNING: Linear Frequency Slides not supported by the new format.\n");
- m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES;
- }
- if (!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX);
- if (!newTypeIsS3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES;
- if (!newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_PT1XMODE;
- if (newTypeIsS3M || newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE;
- END_CRITICAL();
- ChangeFileExtension(nNewType);
-
- //rewbs.cutomKeys: update effect key commands
- CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler();
- if (newTypeIsMOD_XM)
- ih->SetXMEffects();
- else
- ih->SetITEffects();
- //end rewbs.cutomKeys
-
- // Check mod specifications
- m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax);
- m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax);
-
- uint8 trimmedEnvelopes = 0;
- for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) if(m_SndFile.Instruments[i] != nullptr)
- {
- trimmedEnvelopes |= UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv));
- trimmedEnvelopes |= UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv));
- trimmedEnvelopes |= UpdateEnvelopes(&(m_SndFile.Instruments[i]->PitchEnv));
- }
- if(trimmedEnvelopes & 1)
- AddToLog("WARNING: Instrument envelopes have been shortened.\n");
- if(trimmedEnvelopes & 2)
- AddToLog("WARNING: Instrument envelope release nodes are not supported by the new format.\n");
-
- SetModified();
- GetPatternUndo()->ClearUndo();
- GetSampleUndo()->ClearUndo();
- UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL);
- EndWaitCursor();
- return true;
-}
-
-// Trim envelopes and remove release nodes.
-// If bit 0 of the return value is set, the envelope has been shortened.
-// If bit 1 of the return value is set, the envelope's release node has been removed.
-uint8 CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv)
-//--------------------------------------------------------
-{
- // shorten instrument envelope if necessary (for mod conversion)
- const UINT iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax;
- uint8 result = 0;
-
- #define TRIMENV(i) if(i > iEnvMax) { i = iEnvMax; result |= 1; }
-
- TRIMENV(mptEnv->nNodes);
- TRIMENV(mptEnv->nLoopStart);
- TRIMENV(mptEnv->nLoopEnd);
- TRIMENV(mptEnv->nSustainStart);
- TRIMENV(mptEnv->nSustainEnd);
- if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET)
- {
- TRIMENV(mptEnv->nReleaseNode);
- if(!m_SndFile.GetModSpecifications().hasReleaseNode)
- {
- mptEnv->nReleaseNode = ENV_RELEASE_NODE_UNSET;
- result |= 2;
- }
- }
-
- #undef TRIMENV
-
- return result;
-}
-
-
-
-
-
-
// Change the number of channels
bool CModDoc::ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg)
//----------------------------------------------------------------------------------
Modified: trunk/OpenMPT/mptrack/mptrack.vcproj
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.vcproj 2010-09-05 23:08:56 UTC (rev 700)
+++ trunk/OpenMPT/mptrack/mptrack.vcproj 2010-09-07 14:37:26 UTC (rev 701)
@@ -376,6 +376,9 @@
RelativePath="..\soundlib\modcommand.cpp">
</File>
<File
+ RelativePath=".\ModConvert.cpp">
+ </File>
+ <File
RelativePath=".\Moddoc.cpp">
</File>
<File
@@ -825,6 +828,9 @@
RelativePath="..\soundlib\modcommand.h">
</File>
<File
+ RelativePath=".\ModConvert.h">
+ </File>
+ <File
RelativePath=".\moddoc.h">
</File>
<File
Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj
===================================================================
--- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2010-09-05 23:08:56 UTC (rev 700)
+++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2010-09-07 14:37:26 UTC (rev 701)
@@ -505,6 +505,10 @@
>
</File>
<File
+ RelativePath=".\ModConvert.cpp"
+ >
+ </File>
+ <File
RelativePath=".\Moddoc.cpp"
>
</File>
@@ -1095,6 +1099,10 @@
>
</File>
<File
+ RelativePath=".\ModConvert.h"
+ >
+ </File>
+ <File
RelativePath=".\moddoc.h"
>
</File>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-05 23:09:03
|
Revision: 700
http://modplug.svn.sourceforge.net/modplug/?rev=700&view=rev
Author: saga-games
Date: 2010-09-05 23:08:56 +0000 (Sun, 05 Sep 2010)
Log Message:
-----------
[Fix] Mod Cleanup: Rearrange patterns was broken when using more than one sequence in the MPTM format. (tx Skaven)
[Mod] OpenMPT: Version is now 1.19.00.03
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CleanupSong.cpp
trunk/OpenMPT/mptrack/version.h
trunk/OpenMPT/soundlib/Load_mod.cpp
Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-09-04 15:19:49 UTC (rev 699)
+++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-09-05 23:08:56 UTC (rev 700)
@@ -361,7 +361,7 @@
CHAR s[512];
bool bReordered = false;
size_t nPatRemoved = 0;
- PATTERNINDEX nPats, nMinToRemove = 0;
+ PATTERNINDEX nMinToRemove = 0;
BeginWaitCursor();
// First, find all used patterns in all sequences.
@@ -422,10 +422,10 @@
SEQUENCEINDEX oldSequence = pSndFile->Order.GetCurrentSequenceIndex(); // workaround, as GetSequence doesn't allow writing to sequences ATM
// Re-order pattern numbers based on sequence
+ PATTERNINDEX nPats = 0; // last used index
for(SEQUENCEINDEX nSeq = 0; nSeq < maxSeqIndex; nSeq++)
{
pSndFile->Order.SetSequence(nSeq);
- nPats = 0;
ORDERINDEX imap = 0;
for (imap = 0; imap < pSndFile->Order.GetSequence(nSeq).GetLength(); imap++)
{
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2010-09-04 15:19:49 UTC (rev 699)
+++ trunk/OpenMPT/mptrack/version.h 2010-09-05 23:08:56 UTC (rev 700)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 19
#define VER_MINOR 00
-#define VER_MINORMINOR 02
+#define VER_MINORMINOR 03
//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_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2010-09-04 15:19:49 UTC (rev 699)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2010-09-05 23:08:56 UTC (rev 700)
@@ -477,7 +477,7 @@
// In the pattern loader above, a second condition is used: Only tempo commands
// below 100 BPM are taken into account. Furthermore, only M.K. (ProTracker)
// modules are checked.
- // The same check is also applied to original NoiseTracker 15 sample mods.
+ // The same check is also applied to original Ultimate Soundtracker 15 sample mods.
if((bMdKd && bHasTempoCommands && GetSongTime() >= 10 * 60) || m_nSamples == 15)
{
Patterns.ForEachModCommand(FixVBlankMODs());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-04 15:19:56
|
Revision: 699
http://modplug.svn.sourceforge.net/modplug/?rev=699&view=rev
Author: saga-games
Date: 2010-09-04 15:19:49 +0000 (Sat, 04 Sep 2010)
Log Message:
-----------
[Imp] Further improvements to VBlank MOD detection and playback (high speed values were simply ignored)
[Fix] MOD Specs: Max speed was off by one (31 instead of 32).
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mod.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2010-09-02 23:45:48 UTC (rev 698)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2010-09-04 15:19:49 UTC (rev 699)
@@ -40,7 +40,7 @@
case 0x0C: command = CMD_VOLUME; break;
case 0x0D: command = CMD_PATTERNBREAK; param = ((param >> 4) * 10) + (param & 0x0F); break;
case 0x0E: command = CMD_MODCMDEX; break;
- case 0x0F: command = (param <= (UINT)((m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? 0x1F : 0x20)) ? CMD_SPEED : CMD_TEMPO;
+ case 0x0F: command = (param <= ((m_nType & (MOD_TYPE_MOD)) ? 0x20 : 0x1F)) ? CMD_SPEED : CMD_TEMPO;
if ((param == 0xFF) && (m_nSamples == 15) && (m_nType & MOD_TYPE_MOD)) command = 0; break; //<rewbs> what the hell is this?! :) //<jojo> it's the "stop tune" command! :-P
// Extension for XM extended effects
case 'G' - 55: command = CMD_GLOBALVOLUME; break; //16
@@ -262,7 +262,11 @@
if ((s[0]=='T') && (s[1]=='D') && (s[2]=='Z') && (s[3]>='4') && (s[3]<='9')) m_nChannels = s[3] - '0'; else
if (IsMagic(s,"16CN")) m_nChannels = 16; else
if (IsMagic(s,"32CN")) m_nChannels = 32; else m_nSamples = 15;
+ // Startrekker 8 channel mod (needs special treatment, see below)
bool bFLT8 = IsMagic(s, "FLT8") ? true : false;
+ // Only apply VBlank tests to M.K. (ProTracker) modules.
+ const bool bMdKd = IsMagic(s, "M.K.") ? true : false;
+
// Load Samples
nErr = 0;
dwTotalSampleLen = 0;
@@ -471,8 +475,10 @@
// (as this would indicate that f.e. a F30 command was really meant to set
// the ticks per row to 48, and not the tempo to 48 BPM).
// In the pattern loader above, a second condition is used: Only tempo commands
- // below 100 BPM are taken into account.
- if(bHasTempoCommands && GetSongTime() >= 10 * 60)
+ // below 100 BPM are taken into account. Furthermore, only M.K. (ProTracker)
+ // modules are checked.
+ // The same check is also applied to original NoiseTracker 15 sample mods.
+ if((bMdKd && bHasTempoCommands && GetSongTime() >= 10 * 60) || m_nSamples == 15)
{
Patterns.ForEachModCommand(FixVBlankMODs());
}
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-09-02 23:45:48 UTC (rev 698)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-09-04 15:19:49 UTC (rev 699)
@@ -243,11 +243,11 @@
nNextPatStartRow = 0; // FT2 E60 bug
if (nRow < Patterns[nPattern].GetNumRows() - 1)
{
- nextRow = Patterns[nPattern] + (nRow+1) * m_nChannels + nChn;
+ nextRow = Patterns[nPattern] + (nRow + 1) * m_nChannels + nChn;
}
if (nextRow && nextRow->command == CMD_XPARAM)
{
- nNextRow = (param<<8) + nextRow->param;
+ nNextRow = (param << 8) + nextRow->param;
} else
{
nNextRow = param;
@@ -266,9 +266,10 @@
// Set Speed
case CMD_SPEED:
if (!param) break;
- if ((param <= 0x20) || (m_nType != MOD_TYPE_MOD))
+ // Allow high speed values here for VBlank MODs. (Maybe it would be better to have a "VBlank MOD" flag somewhere? Is it worth the effort?)
+ if ((param <= GetModSpecifications().speedMax) || (m_nType & MOD_TYPE_MOD))
{
- if (param < 128) nMusicSpeed = param;
+ nMusicSpeed = param;
}
break;
// Set Tempo
@@ -3610,7 +3611,8 @@
#endif // FASTSOUNDLIB
#endif // MODPLUG_TRACKER
//if ((m_nType & MOD_TYPE_S3M) && (param > 0x80)) param -= 0x80;
- if ((param) && (param <= GetModSpecifications().speedMax)) m_nMusicSpeed = param;
+ // Allow high speed values here for VBlank MODs. (Maybe it would be better to have a "VBlank MOD" flag somewhere? Is it worth the effort?)
+ if ((param) && (param <= GetModSpecifications().speedMax || (m_nType & MOD_TYPE_MOD))) m_nMusicSpeed = param;
}
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2010-09-02 23:45:48 UTC (rev 698)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2010-09-04 15:19:49 UTC (rev 699)
@@ -129,7 +129,7 @@
mixLevels_original, // defaultMixLevels
0, // Max MIDI mapping directives
1, // Min Speed
- 31, // Max Speed
+ 32, // Max Speed
false, // No song comments
0, // No instrument envelopes
false, // No envelope release node
@@ -169,7 +169,7 @@
mixLevels_original, // defaultMixLevels
0, // Max MIDI mapping directives
1, // Min Speed
- 31, // Max Speed
+ 32, // Max Speed
false, // No song comments
0, // No instrument envelopes
false, // No envelope release node
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-02 23:45:54
|
Revision: 698
http://modplug.svn.sourceforge.net/modplug/?rev=698&view=rev
Author: saga-games
Date: 2010-09-02 23:45:48 +0000 (Thu, 02 Sep 2010)
Log Message:
-----------
[Fix] Call to uxtheme.dll should now also be secure.
[Fix] Path for unmo3.dll could be one char too long (since rev.691).
Modified Paths:
--------------
trunk/OpenMPT/mptrack/View_gen.cpp
trunk/OpenMPT/soundlib/Load_mo3.cpp
Modified: trunk/OpenMPT/mptrack/View_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_gen.cpp 2010-09-02 23:00:19 UTC (rev 697)
+++ trunk/OpenMPT/mptrack/View_gen.cpp 2010-09-02 23:45:48 UTC (rev 698)
@@ -1540,16 +1540,24 @@
if(!bUxInited)
{
- HMODULE uxlib = LoadLibrary(_T("uxtheme.dll"));
+ // retrieve path for uxtheme.dll...
+ TCHAR szPath[MAX_PATH];
+ SHGetSpecialFolderPath(0, szPath, CSIDL_SYSTEM, FALSE);
+ strncat(szPath, _TEXT("\\uxtheme.dll"), MAX_PATH - (_tcslen(szPath) + 1));
+
+ // ...and try to load it
+ HMODULE uxlib = LoadLibrary(szPath);
if(uxlib)
hETDT = (ETDT)GetProcAddress(uxlib, "EnableThemeDialogTexture");
bUxInited = true;
}
+
switch(nCtlColor)
{
case CTLCOLOR_DLG:
if(hETDT)
hETDT(*pWnd, ETDT_ENABLETAB);
}
+
return CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
}
Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mo3.cpp 2010-09-02 23:00:19 UTC (rev 697)
+++ trunk/OpenMPT/soundlib/Load_mo3.cpp 2010-09-02 23:45:48 UTC (rev 698)
@@ -49,7 +49,7 @@
#ifdef MODPLUG_TRACKER
CHAR szPath[MAX_PATH];
strcpy(szPath, theApp.GetAppDirPath());
- _tcsncat(szPath, _TEXT("unmo3.dll"), MAX_PATH - strlen(szPath));
+ _tcsncat(szPath, _TEXT("unmo3.dll"), MAX_PATH - (_tcslen(szPath) + 1));
HMODULE unmo3 = LoadLibrary(szPath);
#else
HMODULE unmo3 = LoadLibrary(_TEXT("unmo3.dll"));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-02 23:00:26
|
Revision: 697
http://modplug.svn.sourceforge.net/modplug/?rev=697&view=rev
Author: saga-games
Date: 2010-09-02 23:00:19 +0000 (Thu, 02 Sep 2010)
Log Message:
-----------
[Fix] VST: The time signature sent to VST plugins should now be correct. Since there's only the RPB and RPM values to derive it from, it's not really possible to differentiate between time signatures like 3/4 and 6/8, so quarters are always assumed.
[Mod] OpenMPT: Version is now 1.19.00.02
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Vstplug.cpp
trunk/OpenMPT/mptrack/version.h
Modified: trunk/OpenMPT/mptrack/Vstplug.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-09-02 22:54:25 UTC (rev 696)
+++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-09-02 23:00:19 UTC (rev 697)
@@ -778,8 +778,13 @@
}
if ((value & kVstTimeSigValid) && pSndFile) {
timeInfo.flags |= kVstTimeSigValid;
- timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerBeat;
- timeInfo.timeSigDenominator = pSndFile->m_nCurrentRowsPerMeasure;
+ //timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerBeat;
+ //timeInfo.timeSigDenominator = pSndFile->m_nCurrentRowsPerMeasure;
+
+ // Time signature. numerator = rows per beats / rows pear measure (should sound somewhat logical to you).
+ // the denominator is a bit more tricky, since it cannot be set explicitely. so we just assume quarters for now.
+ timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerMeasure / max(pSndFile->m_nCurrentRowsPerBeat, 1);
+ timeInfo.timeSigDenominator = 4; //gcd(pSndFile->m_nCurrentRowsPerMeasure, pSndFile->m_nCurrentRowsPerBeat);
}
}
return (long)&timeInfo;
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2010-09-02 22:54:25 UTC (rev 696)
+++ trunk/OpenMPT/mptrack/version.h 2010-09-02 23:00:19 UTC (rev 697)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 19
#define VER_MINOR 00
-#define VER_MINORMINOR 01
+#define VER_MINORMINOR 02
//Creates version number from version parts that appears in version string.
//For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-02 22:54:35
|
Revision: 696
http://modplug.svn.sourceforge.net/modplug/?rev=696&view=rev
Author: saga-games
Date: 2010-09-02 22:54:25 +0000 (Thu, 02 Sep 2010)
Log Message:
-----------
[Mod] Original mix mode now also has a version number (1.16), so that it's clear what the "original" thing is.
[Ref] Making use of MAX_GLOBAL_VOLUME as nobody did before. :)
[Ref] Small changes (mostly readability / strings) here and there.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CleanupSong.cpp
trunk/OpenMPT/mptrack/Ctrl_com.cpp
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/soundlib/LOAD_DSM.CPP
trunk/OpenMPT/soundlib/Load_far.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mid.cpp
trunk/OpenMPT/soundlib/Load_okt.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/Load_stm.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -930,7 +930,7 @@
// Global vars
pSndFile->m_nDefaultTempo = 125;
pSndFile->m_nDefaultSpeed = 6;
- pSndFile->m_nDefaultGlobalVolume = 256;
+ pSndFile->m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
pSndFile->m_nSamplePreAmp = 48;
pSndFile->m_nVSTiVolume = 48;
pSndFile->m_nRestartPos = 0;
Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -174,11 +174,11 @@
if (ln > LINE_LENGTH-1) ln = LINE_LENGTH-1;
s[ln] = 0;
while ((ln > 0) && (((BYTE)s[ln-1]) <= ' ')) s[--ln] = 0;
- if (i+1 < n) strcat(s, "\x0D");
+ if (i+1 < n) strcat(s, "\r");
strcat(p, s);
}
UINT len = strlen(p);
- while ((len > 0) && ((p[len-1] == ' ') || (p[len-1] == '\x0D')))
+ while ((len > 0) && ((p[len-1] == ' ') || (p[len-1] == '\r')))
{
len--;
p[len] = 0;
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -299,7 +299,7 @@
PATTERNINDEX n = pSndFile->Order[m_nScrollPos];
if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]) && !bShiftClick)
{
- BOOL bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc);
+ bool bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc);
if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP))
{
BEGIN_CRITICAL();
@@ -522,8 +522,8 @@
}
-static const char szClipboardOrdersHdr[] = "OpenMPT %3s\x0D\x0A";
-static const char szClipboardOrdCountFieldHdr[] = "OrdNum: %u\x0D\x0A";
+static const char szClipboardOrdersHdr[] = "OpenMPT %3s\r\n";
+static const char szClipboardOrdCountFieldHdr[] = "OrdNum: %u\r\n";
static const char szClipboardOrdersFieldHdr[] = "OrdLst: ";
@@ -554,7 +554,7 @@
if (dwMemSize > sizeof(szClipboardOrdersHdr) &&
memcmp(p, "OpenMPT ", 8) == 0 &&
- memcmp(p + 11, "\x0D\x0A", 2) == 0)
+ memcmp(p + 11, "\r\n", 2) == 0)
{
char buf[8];
p += sizeof(szClipboardOrdersHdr) - 1;
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -1776,6 +1776,7 @@
break;
}
AfxMessageBox(str, MB_ICONERROR);
+ return;
}
// Update sample view
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-09-02 22:54:25 UTC (rev 696)
@@ -183,7 +183,7 @@
#define PATTERN_KBDNOTEOFF 0x40000 // Record note-off events
#define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default
#define PATTERN_MIDIRECORD 0x100000 // MIDI Record on by default
-//#define PATTERN_ALTERNTIVEBPMSPEED 0x200000 // deprecated
+//#define PATTERN_ALTERNTIVEBPMSPEED 0x200000 // deprecated
//#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature, deprecated (now always enabled)
#define PATTERN_OLDCTXMENUSTYLE 0x800000 // mpt 1.16 pattern context menu style
#define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -666,12 +666,12 @@
if(m_SndFile.m_nMixLevels == mixLevels_original)
{
- m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 256;
+ m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_SndFile.m_nSamplePreAmp = m_SndFile.m_nVSTiVolume = 48;
}
else
{
- m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 128;
+ m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME / 2;
m_SndFile.m_nSamplePreAmp = m_SndFile.m_nVSTiVolume = 128;
}
@@ -938,7 +938,7 @@
UINT nPlugin = 0;
if (pChn->pModInstrument)
- nPlugin = pChn->pModInstrument->nMixPlug; // first try intrument VST
+ nPlugin = pChn->pModInstrument->nMixPlug; // first try instrument VST
if ((!nPlugin) || (nPlugin > MAX_MIXPLUGINS) && (nCurrentChn >=0))
nPlugin = m_SndFile.ChnSettings[nCurrentChn].nMixPlugin; // Then try Channel VST
@@ -1451,7 +1451,7 @@
// Saving as wave file
- // Keep position of the caracter just before ".wav" in path string
+ // Keep position of the character just before ".wav" in path string
size_t p = strlen(sFilename) - 4;
TCHAR sFilenameAdd[_MAX_PATH] = _T("");
@@ -3194,7 +3194,10 @@
for(int j = 0; j < 128; j++)
{
if(strncmp(&szPatterns[j * 32], &szMidiZXXExt[j * 32], 32))
+ {
bFound = false;
+ break;
+ }
}
if(bFound) return i;
}
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -334,7 +334,7 @@
// Not supported in MOD format
m_SndFile.m_nDefaultSpeed = 6;
m_SndFile.m_nDefaultTempo = 125;
- m_SndFile.m_nDefaultGlobalVolume = 256;
+ m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_SndFile.m_nSamplePreAmp = 48;
m_SndFile.m_nVSTiVolume = 48;
AddToLog("WARNING: Default speed, tempo and global volume will be lost.\n");
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -595,7 +595,7 @@
{PATTERN_FLATBUTTONS, "Flat Buttons", "Use flat buttons in toolbars"},
{PATTERN_SINGLEEXPAND, "Single click to expand tree", "Single-clicking in the left tree view will expand a branch"},
{PATTERN_MUTECHNMODE, "Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."},
- {PATTERN_NOEXTRALOUD, "No loud samples", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated."},
+ {PATTERN_NOEXTRALOUD, "No loud samples", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if activated, a sample volume of 256 is used)."},
{PATTERN_SHOWPREVIOUS, "Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."},
{PATTERN_CONTSCROLL, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"},
{PATTERN_KBDNOTEOFF, "Record note off", "Record note off when a key is released on the PC keyboard (Only works in instrument mode)."},
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -1734,8 +1734,8 @@
Phi = t;
spdx = 70000 + Sinus(Phi) * 10000 / 256;
spdy = 0;
- //spdx =(Cosinus(Phi)+Sinus(Phi<<2))*(Dist<<9)/sizex;
- //spdy =(Sinus(Phi)+Cosinus(Phi>>2))*(Dist<<9)/sizey;
+ spdx =(Cosinus(Phi)+Sinus(Phi<<2))*(Dist<<9)/sizex;
+ spdy =(Sinus(Phi)+Cosinus(Phi>>2))*(Dist<<9)/sizey;
srcx = 0x800000 - ((spdx * sizex) >> 1) + (spdy * sizey);
srcy = 0x800000 - ((spdy * sizex) >> 1) + (spdx * sizey);
for (UINT y=sizey; y; y--)
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -2460,6 +2460,7 @@
}
// Get a pointer to the currently selected envelope.
+// This function also implicitely validates the moddoc and soundfile pointers.
INSTRUMENTENVELOPE *CViewInstrument::GetEnvelopePtr() const
//---------------------------------------------------------
{
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -181,11 +181,11 @@
default: m_TempoModeBox.SetCurSel(0); break;
}
- m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC3"), mixLevels_117RC3);
- m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC2"), mixLevels_117RC2);
- m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC1"), mixLevels_117RC1);
- m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Original"), mixLevels_original);
- //m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Test"), mixLevels_Test);
+ m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC3"), mixLevels_117RC3);
+ m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC2"), mixLevels_117RC2);
+ m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC1"), mixLevels_117RC1);
+ m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Original (MPT 1.16)"), mixLevels_original);
+ //m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Test"), mixLevels_Test);
switch(m_pSndFile->m_nMixLevels)
{
//case mixLevels_Test: m_PlugMixBox.SetCurSel(4); break;
@@ -419,7 +419,7 @@
if(maxChans < m_pSndFile->GetNumChannels())
{
- if(MessageBox("New modtype supports less channels than currently used, and reducing channel number is required. Continue?", "", MB_OKCANCEL) != IDOK)
+ if(MessageBox("New module type supports less channels than currently used, and reducing channel number is required. Continue?", "", MB_OKCANCEL) != IDOK)
return false;
}
Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2010-09-02 22:54:25 UTC (rev 696)
@@ -108,7 +108,7 @@
m_nDefaultSpeed = psong->speed;
m_nDefaultTempo = psong->bpm;
m_nDefaultGlobalVolume = psong->globalvol << 2;
- if ((!m_nDefaultGlobalVolume) || (m_nDefaultGlobalVolume > 256)) m_nDefaultGlobalVolume = 256;
+ if ((!m_nDefaultGlobalVolume) || (m_nDefaultGlobalVolume > MAX_GLOBAL_VOLUME)) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nSamplePreAmp = psong->mastervol & 0x7F;
Order.ReadAsByte(psong->orders, psong->numord, sizeof(psong->orders));
Modified: trunk/OpenMPT/soundlib/Load_far.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_far.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_far.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -85,7 +85,7 @@
m_nSamplePreAmp = 0x20;
m_nDefaultSpeed = pmh1->speed;
m_nDefaultTempo = 80;
- m_nDefaultGlobalVolume = 256;
+ m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
memcpy(m_szNames[0], pmh1->songname, 31);
SpaceToNullStringFixed(m_szNames[0], 31);
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -506,7 +506,7 @@
if((pifh->cwtv & 0xF000) == 0x5000)
{
// OpenMPT Version number (Major.Minor)
- // This will only be interpreted as "made with modplug" (i.e. disable compatible playback etc) if the "reserved" field is set to "OMPT" - else, compatibility was used.
+ // This will only be interpreted as "made with ModPlug" (i.e. disable compatible playback etc) if the "reserved" field is set to "OMPT" - else, compatibility was used.
m_dwLastSavedWithVersion = (pifh->cwtv & 0x0FFF) << 16;
if(pifh->reserved == LittleEndian(IT_OMPT))
interpretModPlugMade = true;
@@ -572,7 +572,7 @@
// Global Volume
m_nDefaultGlobalVolume = pifh->globalvol << 1;
- if (m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
+ if (m_nDefaultGlobalVolume > MAX_GLOBAL_VOLUME) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
if (pifh->speed) m_nDefaultSpeed = pifh->speed;
m_nDefaultTempo = max(32, pifh->tempo); // tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32.
m_nSamplePreAmp = min(pifh->mv, 128);
Modified: trunk/OpenMPT/soundlib/Load_mid.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mid.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_mid.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -556,7 +556,7 @@
tempo = ConvertMidiTempo(nTempoUsec, &nTickMultiplier);
m_nDefaultTempo = tempo;
m_nDefaultSpeed = gnMidiImportSpeed;
- m_nDefaultGlobalVolume = 256;
+ m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
midimastervol = m_nDefaultGlobalVolume;
#ifdef MIDI_LOG
Modified: trunk/OpenMPT/soundlib/Load_okt.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_okt.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_okt.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -381,7 +381,7 @@
return false;
m_nDefaultTempo = 125;
- m_nDefaultGlobalVolume = 256;
+ m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nSamplePreAmp = m_nVSTiVolume = 48;
m_nType = MOD_TYPE_OKT;
m_nMinPeriod = 0x71 << 2;
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -889,7 +889,7 @@
m_nType = MOD_TYPE_S3M;
m_nChannels = min(max(shdr->numChannelsPlay, shdr->numChannelsReal), MAX_BASECHANNELS);
m_nMasterVolume = shdr->masterVolume;
- m_nDefaultGlobalVolume = 256;
+ m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nDefaultSpeed = shdr->songSpeed;
m_nDefaultTempo = shdr->songTempo;
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -276,8 +276,8 @@
m_nDefaultTempo = CLAMP(m_nDefaultTempo, 32, 255);
// Global Volume
m_nDefaultGlobalVolume = psfh.globalvol << 2;
- if(!m_nDefaultGlobalVolume && psfh.cwtv < 0x1320) m_nDefaultGlobalVolume = 256; // not very reliable, but it fixes a few tunes
- if(m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
+ if(!m_nDefaultGlobalVolume && psfh.cwtv < 0x1320) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; // not very reliable, but it fixes a few tunes
+ if(m_nDefaultGlobalVolume > MAX_GLOBAL_VOLUME) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nSamplePreAmp = CLAMP(psfh.mastervol & 0x7F, 0x10, 0x7F); // Bit 8 = Stereo (we always use stereo)
// Channels
m_nChannels = 4;
Modified: trunk/OpenMPT/soundlib/Load_stm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_stm.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Load_stm.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -82,7 +82,7 @@
if (m_nDefaultSpeed < 1) m_nDefaultSpeed = 1;
m_nDefaultTempo = 125;
m_nDefaultGlobalVolume = phdr->globalvol << 2;
- if (m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
+ if (m_nDefaultGlobalVolume > MAX_GLOBAL_VOLUME) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
Order.ReadAsByte(phdr->patorder, 128, 128);
// Setting up channels
for (UINT nSet=0; nSet<4; nSet++)
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -527,8 +527,8 @@
m_nInstruments = 0;
m_nFreqFactor = m_nTempoFactor = 128;
m_nMasterVolume = 128;
- m_nDefaultGlobalVolume = 256;
- m_nGlobalVolume = 256;
+ m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
+ m_nGlobalVolume = MAX_GLOBAL_VOLUME;
m_nOldGlbVolSlide = 0;
m_nDefaultSpeed = 6;
m_nDefaultTempo = 125;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2010-09-02 22:54:25 UTC (rev 696)
@@ -574,7 +574,8 @@
bool m_bIsRendering;
UINT m_nMixChannels, m_nMixStat, m_nBufferCount;
double m_dBufferDiff;
- UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay;
+ UINT m_nTickCount, m_nTotalCount;
+ UINT m_nPatternDelay, m_nFrameDelay; // m_nPatternDelay = pattern delay, m_nFrameDelay = fine pattern delay
ULONG m_lTotalSampleCount; // rewbs.VSTTimeInfo
UINT m_nSamplesPerTick; // rewbs.betterBPM
ROWINDEX m_nDefaultRowsPerBeat, m_nDefaultRowsPerMeasure; // default rows per beat and measure for this module // rewbs.betterBPM
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-09-02 13:02:16 UTC (rev 695)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-09-02 22:54:25 UTC (rev 696)
@@ -1799,7 +1799,8 @@
#define kChnMasterVol nMasterVol
#endif // MODPLUG_TRACKER
// Adjusting volumes
- if (gnChannels >= 2) {
+ if (gnChannels >= 2)
+ {
int pan = ((int)pChn->nRealPan) - 128;
pan *= (int)m_nStereoSeparation;
pan /= 128;
@@ -1810,27 +1811,34 @@
#endif
LONG realvol;
- if (m_pConfig->getUseGlobalPreAmp()) {
+ if (m_pConfig->getUseGlobalPreAmp())
+ {
realvol = (pChn->nRealVolume * kChnMasterVol) >> 7;
- } else {
+ } else
+ {
//Extra attenuation required here if we're bypassing pre-amp.
realvol = (pChn->nRealVolume * kChnMasterVol) >> 8;
}
- if (m_pConfig->getForceSoftPanning() || gdwSoundSetup & SNDMIX_SOFTPANNING) {
- if (pan < 128) {
+ if (m_pConfig->getForceSoftPanning() || (gdwSoundSetup & SNDMIX_SOFTPANNING))
+ {
+ if (pan < 128)
+ {
pChn->nNewLeftVol = (realvol * pan) >> 8;
pChn->nNewRightVol = (realvol * 128) >> 8;
- } else {
+ } else
+ {
pChn->nNewLeftVol = (realvol * 128) >> 8;
pChn->nNewRightVol = (realvol * (256 - pan)) >> 8;
}
- } else {
+ } else
+ {
pChn->nNewLeftVol = (realvol * pan) >> 8;
pChn->nNewRightVol = (realvol * (256 - pan)) >> 8;
}
- } else {
+ } else
+ {
pChn->nNewRightVol = (pChn->nRealVolume * kChnMasterVol) >> 8;
pChn->nNewLeftVol = pChn->nNewRightVol;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-02 13:02:22
|
Revision: 695
http://modplug.svn.sourceforge.net/modplug/?rev=695&view=rev
Author: saga-games
Date: 2010-09-02 13:02:16 +0000 (Thu, 02 Sep 2010)
Log Message:
-----------
[Ref] More descriptions in Snd_defs.h
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Snd_defs.h
Modified: trunk/OpenMPT/soundlib/Snd_defs.h
===================================================================
--- trunk/OpenMPT/soundlib/Snd_defs.h 2010-09-01 14:24:04 UTC (rev 694)
+++ trunk/OpenMPT/soundlib/Snd_defs.h 2010-09-02 13:02:16 UTC (rev 695)
@@ -317,21 +317,21 @@
#define SONG_PT1XMODE 0x200000 // ProTracker 1.x playback mode
// Global Options (Renderer)
-#define SNDMIX_REVERSESTEREO 0x0001
-#define SNDMIX_NOISEREDUCTION 0x0002
-#define SNDMIX_AGC 0x0004
-#define SNDMIX_NORESAMPLING 0x0008
+#define SNDMIX_REVERSESTEREO 0x0001 // swap L/R audio channels
+#define SNDMIX_NOISEREDUCTION 0x0002 // reduce hiss (do not use, it's just a simple low-pass filter)
+#define SNDMIX_AGC 0x0004 // automatic gain control
+#define SNDMIX_NORESAMPLING 0x0008 // force no resampling
// SNDMIX_NOLINEARSRCMODE is the default
//#define SNDMIX_HQRESAMPLER 0x0010 //rewbs.resamplerConf: renamed SNDMIX_HQRESAMPLER to SNDMIX_SPLINESRCMODE
-#define SNDMIX_SPLINESRCMODE 0x0010
-#define SNDMIX_MEGABASS 0x0020
-#define SNDMIX_SURROUND 0x0040
-#define SNDMIX_REVERB 0x0080
-#define SNDMIX_EQ 0x0100
-#define SNDMIX_SOFTPANNING 0x0200
-//#define SNDMIX_ULTRAHQSRCMODE 0x0400 //rewbs.resamplerConf: renamed SNDMIX_ULTRAHQSRCMODE to SNDMIX_POLYPHASESRCMODE
-#define SNDMIX_POLYPHASESRCMODE 0x0400
-#define SNDMIX_FIRFILTERSRCMODE 0x0800 //rewbs: added SNDMIX_FIRFILTERSRCMODE
+#define SNDMIX_SPLINESRCMODE 0x0010 // cubic resampling (?)
+#define SNDMIX_MEGABASS 0x0020 // bass expansion
+#define SNDMIX_SURROUND 0x0040 // surround mix
+#define SNDMIX_REVERB 0x0080 // apply reverb
+#define SNDMIX_EQ 0x0100 // apply EQ
+#define SNDMIX_SOFTPANNING 0x0200 // soft panning mode (this is forced with mixmode RC3 and later)
+//#define SNDMIX_ULTRAHQSRCMODE 0x0400 //rewbs.resamplerConf: renamed SNDMIX_ULTRAHQSRCMODE to SNDMIX_POLYPHASESRCMODE
+#define SNDMIX_POLYPHASESRCMODE 0x0400 // polyphase resampling
+#define SNDMIX_FIRFILTERSRCMODE 0x0800 //rewbs: added SNDMIX_FIRFILTERSRCMODE
//rewbs.resamplerConf: for stuff that applies to cubic spline, polyphase and FIR
#define SNDMIX_HQRESAMPLER (SNDMIX_SPLINESRCMODE|SNDMIX_POLYPHASESRCMODE|SNDMIX_FIRFILTERSRCMODE)
@@ -340,11 +340,13 @@
#define SNDMIX_ULTRAHQSRCMODE (SNDMIX_POLYPHASESRCMODE|SNDMIX_FIRFILTERSRCMODE)
// Misc Flags (can safely be turned on or off)
-#define SNDMIX_DIRECTTODISK 0x10000
-#define SNDMIX_ENABLEMMX 0x20000
-#define SNDMIX_NOBACKWARDJUMPS 0x40000
-#define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader (currently unused)
-#define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels
+#define SNDMIX_DIRECTTODISK 0x10000 // WAV writer mode
+#define SNDMIX_ENABLEMMX 0x20000 // use MMX-accelerated code
+#define SNDMIX_NOBACKWARDJUMPS 0x40000 // stop when jumping back in the order (currently unused as it seems)
+#define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader (currently unused)
+#define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels
+#define SNDMIX_SMARTRAMP 0x200000 // Don't apply ramping to sample beginning, but only when it ends
+#define SNDMIX_ITBIDIMODE 0x400000 // Process bidi loops like Impulse Tracker (see Fastmix.cpp for explanation)
#define MAX_GLOBAL_VOLUME 256
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-09-01 14:24:10
|
Revision: 694
http://modplug.svn.sourceforge.net/modplug/?rev=694&view=rev
Author: saga-games
Date: 2010-09-01 14:24:04 +0000 (Wed, 01 Sep 2010)
Log Message:
-----------
[Fix] Text length was calculated wrong in the message reader, leading to a possible buffer overflow when reading song messages with mixed line endings where CR or LF line endings where expected.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Message.cpp
Modified: trunk/OpenMPT/soundlib/Message.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Message.cpp 2010-08-31 22:09:17 UTC (rev 693)
+++ trunk/OpenMPT/soundlib/Message.cpp 2010-09-01 14:24:04 UTC (rev 694)
@@ -95,18 +95,8 @@
if(pTextConverter != nullptr)
pTextConverter(c);
- switch(c)
- {
- case '\r':
- if(lineEnding != leLF) final_length++;
- break;
- case '\n':
- if(lineEnding != leCR && lineEnding != leCRLF) final_length++;
- break;
- default:
+ if(c != '\n' || lineEnding != leCRLF)
final_length++;
- break;
- }
}
if(!AllocateMessage(final_length))
@@ -198,13 +188,13 @@
LPCSTR p = m_lpszSongComments;
if (!p) return 0;
UINT i = 2, ln=0;
- if ((len) && (s)) s[0] = '\x0D';
- if ((len > 1) && (s)) s[1] = '\x0A';
+ if ((len) && (s)) s[0] = '\r';
+ if ((len > 1) && (s)) s[1] = '\n';
while ((*p) && (i+2 < len))
{
BYTE c = (BYTE)*p++;
if ((c == 0x0D) || ((c == ' ') && (ln >= linesize)))
- { if (s) { s[i++] = '\x0D'; s[i++] = '\x0A'; } else i+= 2; ln=0; }
+ { if (s) { s[i++] = '\r'; s[i++] = '\n'; } else i+= 2; ln=0; }
else
if (c >= 0x20) { if (s) s[i++] = c; else i++; ln++; }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-31 22:09:24
|
Revision: 693
http://modplug.svn.sourceforge.net/modplug/?rev=693&view=rev
Author: saga-games
Date: 2010-08-31 22:09:17 +0000 (Tue, 31 Aug 2010)
Log Message:
-----------
[Fix] IT Compatibility: Slightly changed envelope handling to look more like in Schism Tracker. This fixes a combination of Envelope Carry + Portamento as it can be found in "electric bunny" by Alpha C.
[Mod] OpenMPT: Version is now 1.19.00.01
Modified Paths:
--------------
trunk/OpenMPT/mptrack/version.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2010-08-31 21:43:58 UTC (rev 692)
+++ trunk/OpenMPT/mptrack/version.h 2010-08-31 22:09:17 UTC (rev 693)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 19
#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/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-31 21:43:58 UTC (rev 692)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-31 22:09:17 UTC (rev 693)
@@ -568,7 +568,8 @@
if (!(pIns->VolEnv.dwFlags & ENV_CARRY)) resetEnvelopes(pChn, ENV_RESET_VOL);
if (!(pIns->PanEnv.dwFlags & ENV_CARRY)) resetEnvelopes(pChn, ENV_RESET_PAN);
if (!(pIns->PitchEnv.dwFlags & ENV_CARRY)) resetEnvelopes(pChn, ENV_RESET_PITCH);
- } else {
+ } else
+ {
resetEnvelopes(pChn);
}
// IT Compatibility: Always reset autovibrato settings when there's an instrument number
@@ -579,7 +580,7 @@
}
} else if ((pIns) && (!(pIns->VolEnv.dwFlags & ENV_ENABLED)))
{
- resetEnvelopes(pChn);
+ resetEnvelopes(pChn, IsCompatibleMode(TRK_IMPULSETRACKER) ? ENV_RESET_VOL : ENV_RESET_ALL);
}
}
// Invalid sample ?
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-31 21:44:05
|
Revision: 692
http://modplug.svn.sourceforge.net/modplug/?rev=692&view=rev
Author: saga-games
Date: 2010-08-31 21:43:58 +0000 (Tue, 31 Aug 2010)
Log Message:
-----------
[Imp] MOD Loader: Added a heuristic detection for VBlank MODs (most MODs use the CIA timer instead of VBlank timing).
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mod.cpp
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2010-08-31 21:42:33 UTC (rev 691)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2010-08-31 21:43:58 UTC (rev 692)
@@ -224,7 +224,18 @@
return ((*(DWORD *)s1) == (*(DWORD *)s2)) ? true : false;
}
+// Functor for fixing VBlank MODs
+struct FixVBlankMODs
+//==================
+{
+ void operator()(MODCOMMAND& m)
+ {
+ if(m.command == CMD_TEMPO)
+ m.command = CMD_SPEED;
+ }
+};
+
bool CSoundFile::ReadMod(const BYTE *lpStream, DWORD dwMemLength)
//---------------------------------------------------------------
{
@@ -380,6 +391,7 @@
const CHANNELINDEX nMaxChn = (bFLT8) ? 4 : m_nChannels; // 4 channels per pattern in FLT8 format.
if(bFLT8) nbp++; // as one logical pattern consists of two real patterns in FLT8 format, the highest pattern number has to be increased by one.
+ bool bHasTempoCommands = false; // for detecting VBlank MODs
// Reading patterns
for (PATTERNINDEX ipat = 0; ipat < nbp; ipat++)
@@ -421,6 +433,7 @@
m->param = A3;
if ((m->command) || (m->param)) ConvertModCommand(m);
+ if (m->command == CMD_TEMPO && m->param < 100) bHasTempoCommands = true;
}
}
}
@@ -449,6 +462,21 @@
bSamplesPresent = true;
}
}
+
+ // Fix VBlank MODs. Arbitrary threshold: 10 minutes.
+ // Basically, this just converts all tempo commands into speed commands
+ // for MODs which are supposed to have VBlank timing (instead of CIA timing).
+ // There is no perfect way to do this, since both MOD types look the same,
+ // but the most reliable way is to simply check for extremely long songs
+ // (as this would indicate that f.e. a F30 command was really meant to set
+ // the ticks per row to 48, and not the tempo to 48 BPM).
+ // In the pattern loader above, a second condition is used: Only tempo commands
+ // below 100 BPM are taken into account.
+ if(bHasTempoCommands && GetSongTime() >= 10 * 60)
+ {
+ Patterns.ForEachModCommand(FixVBlankMODs());
+ }
+
#ifdef MODPLUG_TRACKER
return true;
#else
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-31 21:42:39
|
Revision: 691
http://modplug.svn.sourceforge.net/modplug/?rev=691&view=rev
Author: saga-games
Date: 2010-08-31 21:42:33 +0000 (Tue, 31 Aug 2010)
Log Message:
-----------
[Fix] MO3 Loader: unmo3.dll is now loaded from mptrack.exe's directory, to avoid the currently spreading DLL exploits.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mo3.cpp
Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mo3.cpp 2010-08-31 21:39:27 UTC (rev 690)
+++ trunk/OpenMPT/soundlib/Load_mo3.cpp 2010-08-31 21:42:33 UTC (rev 691)
@@ -10,6 +10,7 @@
#include "Loaders.h"
#ifdef MODPLUG_TRACKER
#include "../mptrack/moddoc.h"
+#include "../mptrack/Mptrack.h"
#endif // MODPLUG_TRACKER
// decode a MO3 file (returns the same "exit codes" as UNMO3.EXE, eg. 0=success)
@@ -28,7 +29,7 @@
return false;
#ifdef NO_MO3_SUPPORT
- /* As of August 2009, the format revision is 5; Versions > 31 are unlikely to exist in the next few years,
+ /* As of August 2010, the format revision is 5; Versions > 31 are unlikely to exist in the next few years,
so we will just ignore those if there's no UNMO3 library to tell us if the file is valid or not
(avoid log entry with .MOD files that have a song name starting with "MO3" */
if(lpStream[3] > 31) return false;
@@ -45,7 +46,14 @@
void **mo3Stream = (void **)&lpStream;
// try to load unmo3.dll dynamically.
+#ifdef MODPLUG_TRACKER
+ CHAR szPath[MAX_PATH];
+ strcpy(szPath, theApp.GetAppDirPath());
+ _tcsncat(szPath, _TEXT("unmo3.dll"), MAX_PATH - strlen(szPath));
+ HMODULE unmo3 = LoadLibrary(szPath);
+#else
HMODULE unmo3 = LoadLibrary(_TEXT("unmo3.dll"));
+#endif // MODPLUG_TRACKER
if(unmo3 == NULL) // Didn't succeed.
{
#ifdef MODPLUG_TRACKER
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-31 21:39:34
|
Revision: 690
http://modplug.svn.sourceforge.net/modplug/?rev=690&view=rev
Author: saga-games
Date: 2010-08-31 21:39:27 +0000 (Tue, 31 Aug 2010)
Log Message:
-----------
[Ref] Renamed SONG_ITCOMPATMODE flag to SONG_ITCOMPATGXX for more clarity.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mt2.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_ult.cpp
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/load_j2b.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -269,7 +269,7 @@
ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetVibrato);
}
- if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE;
+ if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATGXX;
// Convert IT/MPT to XM (instruments)
if (oldTypeIsIT_MPT && newTypeIsXM)
@@ -388,7 +388,7 @@
AddToLog("WARNING: Linear Frequency Slides not supported by the new format.\n");
m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES;
}
- if (!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATMODE);
+ if (!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX);
if (!newTypeIsS3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES;
if (!newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_PT1XMODE;
if (newTypeIsS3M || newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE;
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -247,7 +247,7 @@
m_CheckBox1.SetCheck((m_pSndFile->m_dwSongFlags & SONG_LINEARSLIDES) ? MF_CHECKED : 0);
m_CheckBox2.SetCheck((m_pSndFile->m_dwSongFlags & SONG_FASTVOLSLIDES) ? MF_CHECKED : 0);
m_CheckBox3.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITOLDEFFECTS) ? MF_CHECKED : 0);
- m_CheckBox4.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITCOMPATMODE) ? MF_CHECKED : 0);
+ m_CheckBox4.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITCOMPATGXX) ? MF_CHECKED : 0);
m_CheckBox5.SetCheck((m_pSndFile->m_dwSongFlags & SONG_EXFILTERRANGE) ? MF_CHECKED : 0);
m_CheckBoxPT1x.SetCheck((m_pSndFile->m_dwSongFlags & SONG_PT1XMODE) ? MF_CHECKED : 0);
@@ -356,9 +356,9 @@
//--------------------------
{
if (m_CheckBox4.GetCheck())
- m_pSndFile->m_dwSongFlags |= SONG_ITCOMPATMODE;
+ m_pSndFile->m_dwSongFlags |= SONG_ITCOMPATGXX;
else
- m_pSndFile->m_dwSongFlags &= ~SONG_ITCOMPATMODE;
+ m_pSndFile->m_dwSongFlags &= ~SONG_ITCOMPATGXX;
}
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -563,7 +563,7 @@
if (pifh->flags & 0x08) m_dwSongFlags |= SONG_LINEARSLIDES;
if (pifh->flags & 0x10) m_dwSongFlags |= SONG_ITOLDEFFECTS;
- if (pifh->flags & 0x20) m_dwSongFlags |= SONG_ITCOMPATMODE;
+ if (pifh->flags & 0x20) m_dwSongFlags |= SONG_ITCOMPATGXX;
if ((pifh->flags & 0x80) || (pifh->special & 0x08)) m_dwSongFlags |= SONG_EMBEDMIDICFG;
if (pifh->flags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE;
@@ -1228,7 +1228,7 @@
if (m_nInstruments) header.flags |= 0x04;
if (m_dwSongFlags & SONG_LINEARSLIDES) header.flags |= 0x08;
if (m_dwSongFlags & SONG_ITOLDEFFECTS) header.flags |= 0x10;
- if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20;
+ if (m_dwSongFlags & SONG_ITCOMPATGXX) header.flags |= 0x20;
if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
@@ -1862,7 +1862,7 @@
if (m_nInstruments) header.flags |= 0x04;
if (m_dwSongFlags & SONG_LINEARSLIDES) header.flags |= 0x08;
if (m_dwSongFlags & SONG_ITOLDEFFECTS) header.flags |= 0x10;
- if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20;
+ if (m_dwSongFlags & SONG_ITCOMPATGXX) header.flags |= 0x20;
//if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mt2.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -201,7 +201,7 @@
m_nRestartPos = pfh->wRestart;
m_nDefaultSpeed = pfh->bTicksPerLine;
m_nDefaultTempo = 125;
- m_dwSongFlags = SONG_ITCOMPATMODE;
+ m_dwSongFlags = SONG_ITCOMPATGXX;
m_nDefaultRowsPerBeat = pfh->bLinesPerBeat;
m_nDefaultRowsPerMeasure = m_nDefaultRowsPerBeat * 4;
if ((pfh->wSamplesPerTick > 100) && (pfh->wSamplesPerTick < 5000))
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -149,7 +149,7 @@
// Yep, this seems to be a valid file.
m_nType = MOD_TYPE_PSM;
- m_dwSongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATMODE;
+ m_dwSongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX;
SetModFlag(MSF_COMPATIBLE_PLAY, true);
m_nChannels = 0;
Modified: trunk/OpenMPT/soundlib/Load_ult.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ult.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/Load_ult.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -326,7 +326,7 @@
dwMemPos += 32;
m_nType = MOD_TYPE_ULT;
- m_dwSongFlags = SONG_ITCOMPATMODE | SONG_ITOLDEFFECTS; // this will be converted to IT format by MPT.
+ m_dwSongFlags = SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS; // this will be converted to IT format by MPT.
SetModFlag(MSF_COMPATIBLE_PLAY, true);
ASSERT_CAN_READ(1);
Modified: trunk/OpenMPT/soundlib/Snd_defs.h
===================================================================
--- trunk/OpenMPT/soundlib/Snd_defs.h 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/Snd_defs.h 2010-08-31 21:39:27 UTC (rev 690)
@@ -293,7 +293,7 @@
#define SONG_EMBEDMIDICFG 0x0001 // Embed macros in file
#define SONG_FASTVOLSLIDES 0x0002 // Old Scream Tracker 3.0 volume slides
#define SONG_ITOLDEFFECTS 0x0004 // Old Impulse Tracker effect implementations
-#define SONG_ITCOMPATMODE 0x0008 // IT "Compatible Gxx"
+#define SONG_ITCOMPATGXX 0x0008 // IT "Compatible Gxx" (IT's flag to behave more like other trackers when it comes to portamento effects)
#define SONG_LINEARSLIDES 0x0010 // Linear slides vs. Amiga slides
#define SONG_PATTERNLOOP 0x0020 // Loop current pattern (pattern editor)
#define SONG_STEP 0x0040 // Song is in "step" mode (pattern editor)
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -557,7 +557,7 @@
// Reset envelopes
if (bResetEnv)
{
- if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITCOMPATMODE)
+ if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITCOMPATGXX)
|| (!pChn->nLength) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
//IT compatibility tentative fix: Reset envelopes when instrument changes.
|| (IsCompatibleMode(TRK_IMPULSETRACKER) && bInstrumentChanged))
@@ -808,7 +808,7 @@
if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
|| ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
- || ((m_dwSongFlags & SONG_ITCOMPATMODE) && (pChn->nRowInstr)))
+ || ((m_dwSongFlags & SONG_ITCOMPATGXX) && (pChn->nRowInstr)))
{
if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
{
@@ -818,7 +818,7 @@
pChn->dwFlags &= ~CHN_NOTEFADE;
pChn->nFadeOutVol = 65536;
}
- if ((!bPorta) || (!(m_dwSongFlags & SONG_ITCOMPATMODE)) || (pChn->nRowInstr))
+ if ((!bPorta) || (!(m_dwSongFlags & SONG_ITCOMPATGXX)) || (pChn->nRowInstr))
{
if ((!(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) || (pChn->nRowInstr))
{
@@ -2319,7 +2319,7 @@
pChn->dwFlags |= CHN_PORTAMENTO;
//IT compatibility 03
- if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && IsCompatibleMode(TRK_IMPULSETRACKER))
+ if(!(m_dwSongFlags & SONG_ITCOMPATGXX) && IsCompatibleMode(TRK_IMPULSETRACKER))
{
if(param == 0) param = pChn->nOldPortaUpDown;
pChn->nOldPortaUpDown = param;
Modified: trunk/OpenMPT/soundlib/load_j2b.cpp
===================================================================
--- trunk/OpenMPT/soundlib/load_j2b.cpp 2010-08-26 12:15:34 UTC (rev 689)
+++ trunk/OpenMPT/soundlib/load_j2b.cpp 2010-08-31 21:39:27 UTC (rev 690)
@@ -488,7 +488,7 @@
memcpy(m_szNames[0], mainchunk->songname, 32);
SpaceToNullStringFixed(m_szNames[0], 31);
- m_dwSongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATMODE;
+ m_dwSongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX;
if(!(mainchunk->flags & 0x01)) m_dwSongFlags |= SONG_LINEARSLIDES;
if(mainchunk->channels < 1) return false;
m_nChannels = min(mainchunk->channels, MAX_BASECHANNELS);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-26 12:15:42
|
Revision: 689
http://modplug.svn.sourceforge.net/modplug/?rev=689&view=rev
Author: saga-games
Date: 2010-08-26 12:15:34 +0000 (Thu, 26 Aug 2010)
Log Message:
-----------
[Mod] One way to capitalise "ModPlug" should be enough.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_gen.cpp
trunk/OpenMPT/mptrack/MPTHacks.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Mpdlgs.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/res/MPTRACK.RC2
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2010-08-26 12:15:34 UTC (rev 689)
@@ -112,7 +112,7 @@
m_ComboResampling.AddString("Cubic spline");
//rewbs.resamplerConf
m_ComboResampling.AddString("Polyphase");
- m_ComboResampling.AddString("XMMS-Modplug");
+ m_ComboResampling.AddString("XMMS-ModPlug");
//end rewbs.resamplerConf
m_bEditsLocked=false;
UpdateView(HINT_MODGENERAL|HINT_MODTYPE|HINT_MODSEQUENCE|HINT_MPTSETUP, NULL);
Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-08-26 12:15:34 UTC (rev 689)
@@ -58,7 +58,7 @@
m.volcmd = VOLCMD_NONE;
}
- if(type == MOD_TYPE_XM) // modplug XM extensions
+ if(type == MOD_TYPE_XM) // ModPlug XM extensions
{
if(m.command == CMD_XFINEPORTAUPDOWN && m.param >= 0x30)
{
@@ -66,7 +66,7 @@
if(autofix)
m.command = CMD_NONE;
}
- } else if(type == MOD_TYPE_IT) // modplug IT extensions
+ } else if(type == MOD_TYPE_IT) // ModPlug IT extensions
{
if((m.command == CMD_S3MCMDEX) && ((m.param >> 4) == 0x09) && (m.param != 0x91))
{
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-08-26 12:15:34 UTC (rev 689)
@@ -24,7 +24,7 @@
#define NUM_AUDIO_BUFFERS 3
#define MIN_AUDIO_BUFFERSIZE 1024
#define MAX_AUDIO_BUFFERSIZE 32768 // 32K buffers max
-#define MAINFRAME_TITLE "Open Modplug Tracker"
+#define MAINFRAME_TITLE "Open ModPlug Tracker"
#define INIBUFFERSIZE MAX_PATH
enum {
Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2010-08-26 12:15:34 UTC (rev 689)
@@ -426,7 +426,7 @@
m_CbnResampling.AddString("Cubic spline");
//rewbs.resamplerConf
m_CbnResampling.AddString("Polyphase");
- m_CbnResampling.AddString("XMMS-Modplug");
+ m_CbnResampling.AddString("XMMS-ModPlug");
//end rewbs.resamplerConf
m_CbnResampling.SetCurSel(CMainFrame::m_nSrcMode);
}
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-08-26 12:15:34 UTC (rev 689)
@@ -1830,7 +1830,7 @@
"http://sourceforge.net/projects/modplug/");
const char* const pArrCredit = {
- "OpenMPT / Modplug Tracker|"
+ "OpenMPT / ModPlug Tracker|"
"Copyright \xA9 2004-2010 Contributors|"
"Copyright \xA9 1997-2003 Olivier Lapicque (ol...@mo...)|"
"|"
@@ -1844,7 +1844,7 @@
"Olivier Lapicque (1997-2003)|"
"|"
"Thanks to:||"
- "Konstanty for the XMMS-Modplug resampling implementation |"
+ "Konstanty for the XMMS-ModPlug resampling implementation |"
"http://modplug-xmms.sourceforge.net/|"
"Stephan M. Bernsee for pitch shifting source code|"
"http://www.dspdimension.com|"
@@ -1863,7 +1863,7 @@
"http://kode54.foobar2000.org/|"
"Pel K. Txnder for the scrolling credits control :)|"
"http://tinyurl.com/4yze8|"
- "|The people at Modplug forums for crucial contribution|"
+ "|The people at ModPlug forums for crucial contribution|"
"in the form of ideas, testing and support; thanks|"
"particularly to:|"
"LPChip, Ganja, Diamond, Nofold, Goor00, Georg|"
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2010-08-26 12:15:34 UTC (rev 689)
@@ -1967,7 +1967,7 @@
MENUITEM SEPARATOR
POPUP "&Internet"
BEGIN
- MENUITEM "Modplug Central &Forums", ID_NETLINK_FORUMS
+ MENUITEM "ModPlug Central &Forums", ID_NETLINK_FORUMS
MENUITEM "OpenMPT Wiki", ID_NETLINK_OPENMPTWIKI
MENUITEM "OpenMPT Wiki (German)", ID_NETLINK_OPENMPTWIKI_GERMAN
MENUITEM "MPT-FR", ID_NETLINK_MPTFR
@@ -2305,7 +2305,7 @@
ID_PATTERN_EXPAND "Expand pattern\nExpand Pattern"
ID_PATTERN_SHRINK "Shrink Pattern\nShrink Pattern"
ID_HELP_SEARCH "Displays the help index\nHelp Index"
- ID_NETLINK_MODPLUG "Go to Modplug Central"
+ ID_NETLINK_MODPLUG "Go to ModPlug Central"
ID_NETLINK_UT "Go to United Trackers"
ID_NETLINK_OSMUSIC "Go to OSMusic.net"
ID_NETLINK_HANDBOOK "Go to the Tracker's Handbook"
@@ -2320,7 +2320,7 @@
BEGIN
ID_SAMPLE_TRIM "Delete everything except the current selection\nTrim Sample"
ID_FILE_SAVEMIDI "Export the current song to a standard MIDI file"
- ID_NETLINK_FORUMS "Go to the Modplug Central Music Forums"
+ ID_NETLINK_FORUMS "Go to the ModPlug Central Music Forums"
ID_INSTRUMENT_SAMPLEMAP "Edit the sample map"
ID_NETLINK_PLUGINS "Go to KVR Audio to download plugins"
ID_PATTERNDETAIL_LO "Low pattern detail level\nLow pattern detail level"
Modified: trunk/OpenMPT/mptrack/res/MPTRACK.RC2
===================================================================
--- trunk/OpenMPT/mptrack/res/MPTRACK.RC2 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/mptrack/res/MPTRACK.RC2 2010-08-26 12:15:34 UTC (rev 689)
@@ -42,7 +42,7 @@
VALUE "CompanyName", "Olivier Lapicque / OpenMPT team"
VALUE "FileDescription", "OpenMPT / ModPlug Tracker"
VALUE "FileVersion", VER_FILEVERSION_STR
- VALUE "InternalName", "Modplug Tracker"
+ VALUE "InternalName", "ModPlug Tracker"
VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2010 contributors."
VALUE "LegalTrademarks", "M.O.D.P.L.U.G"
VALUE "OriginalFilename", "mptrack.exe"
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-26 12:15:34 UTC (rev 689)
@@ -469,8 +469,8 @@
MODCOMMAND lastvalue[MAX_BASECHANNELS];
// -! BEHAVIOUR_CHANGE#0006
- bool interpretModplugmade = false;
- bool hasModplugExtensions = false;
+ bool interpretModPlugMade = false;
+ bool hasModPlugExtensions = false;
if ((!lpStream) || (dwMemLength < 0xC0)) return false;
if ((pifh->id != LittleEndian(IT_IMPM) && pifh->id != LittleEndian(IT_MPTM)) || (pifh->insnum > 0xFF)
@@ -509,27 +509,27 @@
// This will only be interpreted as "made with modplug" (i.e. disable compatible playback etc) if the "reserved" field is set to "OMPT" - else, compatibility was used.
m_dwLastSavedWithVersion = (pifh->cwtv & 0x0FFF) << 16;
if(pifh->reserved == LittleEndian(IT_OMPT))
- interpretModplugmade = true;
+ interpretModPlugMade = true;
} else if(pifh->cmwt == 0x888 || pifh->cwtv == 0x888)
{
// OpenMPT 1.17 and 1.18 (raped IT format)
- interpretModplugmade = true;
+ interpretModPlugMade = true;
} else if(pifh->cwtv == 0x0217 && pifh->cmwt == 0x0200 && pifh->reserved == 0)
{
- // Modplug Tracker 1.16 (semi-raped IT format)
+ // ModPlug Tracker 1.16 (semi-raped IT format)
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00);
- interpretModplugmade = true;
+ interpretModPlugMade = true;
} else if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0202 && pifh->reserved == 0)
{
- // Modplug Tracker b3.3 - 1.09, instruments 557 bytes apart
+ // ModPlug Tracker b3.3 - 1.09, instruments 557 bytes apart
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 09, 00, 00);
- interpretModplugmade = true;
+ interpretModPlugMade = true;
}
else if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0200 && pifh->reserved == 0)
{
- // Modplug Tracker 1.00a5, instruments 560 bytes apart
+ // ModPlug Tracker 1.00a5, instruments 560 bytes apart
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, 00);
- interpretModplugmade = true;
+ interpretModPlugMade = true;
}
}
else // case: type == MOD_TYPE_MPT
@@ -744,8 +744,8 @@
if(rows <= ModSpecs::itEx.patternRowsMax && rows > ModSpecs::it.patternRowsMax)
{
- interpretModplugmade = true;
- hasModplugExtensions = true;
+ interpretModPlugMade = true;
+ hasModPlugExtensions = true;
}
if ((rows < GetModSpecifications().patternRowsMin) || (rows > GetModSpecifications().patternRowsMax))
@@ -902,8 +902,8 @@
// Load instrument and song extensions.
if(mptStartPos >= dwMemPos)
{
- LPCBYTE ptr = LoadExtendedInstrumentProperties(lpStream + dwMemPos, lpStream + mptStartPos, &interpretModplugmade);
- LoadExtendedSongProperties(GetType(), ptr, lpStream, mptStartPos, &interpretModplugmade);
+ LPCBYTE ptr = LoadExtendedInstrumentProperties(lpStream + dwMemPos, lpStream + mptStartPos, &interpretModPlugMade);
+ LoadExtendedSongProperties(GetType(), ptr, lpStream, mptStartPos, &interpretModPlugMade);
}
// -! NEW_FEATURE#0027
@@ -1037,7 +1037,7 @@
if ((vol >= 203) && (vol <= 212)) {
m[ch].volcmd = VOLCMD_VIBRATODEPTH; m[ch].vol = vol - 203;
// Old versions of ModPlug saved this as vibrato speed instead, so let's fix that
- if(m_dwLastSavedWithVersion <= MAKE_VERSION_NUMERIC(1, 17, 02, 54) && interpretModplugmade)
+ if(m_dwLastSavedWithVersion <= MAKE_VERSION_NUMERIC(1, 17, 02, 54) && interpretModPlugMade)
m[ch].volcmd = VOLCMD_VIBRATOSPEED;
} else
// 213-222: Unused (was velocity)
@@ -1078,7 +1078,7 @@
if(GetType() == MOD_TYPE_IT)
{
// Set appropriate mod flags if the file was not made with MPT.
- if(!interpretModplugmade)
+ if(!interpretModPlugMade)
{
SetModFlag(MSF_MIDICC_BUGEMULATION, false);
SetModFlag(MSF_OLDVOLSWING, false);
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-21 11:19:26 UTC (rev 688)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-26 12:15:34 UTC (rev 689)
@@ -1872,7 +1872,7 @@
{
case 0x10: ExtraFinePortamentoUp(pChn, param & 0x0F); break;
case 0x20: ExtraFinePortamentoDown(pChn, param & 0x0F); break;
- // Modplug XM Extensions (ignore in compatible mode)
+ // ModPlug XM Extensions (ignore in compatible mode)
case 0x50:
case 0x60:
case 0x70:
@@ -2014,7 +2014,7 @@
if (nBreakRow < 0) nBreakRow = 0;
if(nBreakRow >= 0) m_dwSongFlags |= SONG_BREAKTOROW;
- // Modplug Tracker & ModPlugin allow backward jumps
+ // ModPlug Tracker & ModPlugin allow backward jumps
#ifndef FASTSOUNDLIB
if ((nPosJump < (int)m_nCurrentPattern)
|| ((nPosJump == (int)m_nCurrentPattern) && (nBreakRow <= (int)m_nRow)))
@@ -2851,7 +2851,7 @@
// S91: Surround On
case 0x01: pChn->dwFlags |= CHN_SURROUND; pChn->nPan = 128; break;
////////////////////////////////////////////////////////////
- // Modplug Extensions
+ // ModPlug Extensions
// S98: Reverb Off
case 0x08:
pChn->dwFlags &= ~CHN_REVERB;
@@ -3595,7 +3595,7 @@
void CSoundFile::SetSpeed(UINT param)
//-----------------------------------
{
- // Modplug Tracker and Mod-Plugin don't do this check
+ // ModPlug Tracker and Mod-Plugin don't do this check
#ifndef MODPLUG_TRACKER
#ifndef FASTSOUNDLIB
// Big Hack!!!
@@ -4115,7 +4115,7 @@
Specific implementations:
Length detection code:
- As the modplug engine already deals with pattern loops sufficiently, there's no problem with (infinite) pattern loops
+ As the ModPlug engine already deals with pattern loops sufficiently, there's no problem with (infinite) pattern loops
in this code.
Normal player code:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-21 11:19:32
|
Revision: 688
http://modplug.svn.sourceforge.net/modplug/?rev=688&view=rev
Author: saga-games
Date: 2010-08-21 11:19:26 +0000 (Sat, 21 Aug 2010)
Log Message:
-----------
[Reg] Disabled the Velvet Studio loader for now, since it either crashes on almost all AMS files or at least imports them completely wrong.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_ams.cpp
Modified: trunk/OpenMPT/soundlib/Load_ams.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ams.cpp 2010-08-15 19:46:09 UTC (rev 687)
+++ trunk/OpenMPT/soundlib/Load_ams.cpp 2010-08-21 11:19:26 UTC (rev 688)
@@ -352,6 +352,7 @@
bool CSoundFile::ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength)
//------------------------------------------------------------
{
+ return false;
const AMS2FILEHEADER *pfh = (AMS2FILEHEADER *)lpStream;
AMS2SONGHEADER *psh;
DWORD dwMemPos;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-15 19:46:17
|
Revision: 687
http://modplug.svn.sourceforge.net/modplug/?rev=687&view=rev
Author: saga-games
Date: 2010-08-15 19:46:09 +0000 (Sun, 15 Aug 2010)
Log Message:
-----------
[Fix] When there was no INI file, the size of the upper pattern view was defaulting to a wrong value.
[Ref] Added three structs for each envelope to MODCHANNEL, to improve readability.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-12 16:12:48 UTC (rev 686)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-15 19:46:09 UTC (rev 687)
@@ -392,7 +392,7 @@
glTreeWindowWidth = GetPrivateProfileLong("Display", "MDITreeWidth", 160, iniFile);
glTreeSplitRatio = GetPrivateProfileLong("Display", "MDITreeRatio", 128, iniFile);
glGeneralWindowHeight = GetPrivateProfileLong("Display", "MDIGeneralHeight", 178, iniFile);
- glPatternWindowHeight = GetPrivateProfileLong("Display", "MDIPatternHeight", 232, iniFile);
+ glPatternWindowHeight = GetPrivateProfileLong("Display", "MDIPatternHeight", 152, iniFile);
glSampleWindowHeight = GetPrivateProfileLong("Display", "MDISampleHeight", 188, iniFile);
glInstrumentWindowHeight = GetPrivateProfileLong("Display", "MDIInstrumentHeight", 300, iniFile);
glCommentsWindowHeight = GetPrivateProfileLong("Display", "MDICommentsHeight", 288, iniFile);
@@ -405,7 +405,8 @@
gnMsgBoxVisiblityFlags = GetPrivateProfileDWord("Display", "MsgBoxVisibilityFlags", uint32_max, iniFile);
CHAR s[16];
- for (int ncol = 0; ncol < MAX_MODCOLORS; ncol++) {
+ for (int ncol = 0; ncol < MAX_MODCOLORS; ncol++)
+ {
wsprintf(s, "Color%02d", ncol);
rgbCustomColors[ncol] = GetPrivateProfileDWord("Display", s, rgbCustomColors[ncol], iniFile);
}
@@ -1620,14 +1621,14 @@
{
if (m_dwNotifyType & MPTNOTIFY_PITCHENV)
{
- if (pChn->dwFlags & CHN_PITCHENV) p->dwPos[k] = MPTNOTIFY_POSVALID | (DWORD)(pChn->nPitchEnvPosition);
+ if (pChn->dwFlags & CHN_PITCHENV) p->dwPos[k] = MPTNOTIFY_POSVALID | (DWORD)(pChn->PitchEnv.nEnvPosition);
} else
if (m_dwNotifyType & MPTNOTIFY_PANENV)
{
- if (pChn->dwFlags & CHN_PANENV) p->dwPos[k] = MPTNOTIFY_POSVALID | (DWORD)(pChn->nPanEnvPosition);
+ if (pChn->dwFlags & CHN_PANENV) p->dwPos[k] = MPTNOTIFY_POSVALID | (DWORD)(pChn->PanEnv.nEnvPosition);
} else
{
- if (pChn->dwFlags & CHN_VOLENV) p->dwPos[k] = MPTNOTIFY_POSVALID | (DWORD)(pChn->nVolEnvPosition);
+ if (pChn->dwFlags & CHN_VOLENV) p->dwPos[k] = MPTNOTIFY_POSVALID | (DWORD)(pChn->VolEnv.nEnvPosition);
}
}
}
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-12 16:12:48 UTC (rev 686)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-08-15 19:46:09 UTC (rev 687)
@@ -850,9 +850,9 @@
{
// IT compatibility tentative fix: Reset NNA action on every new note, even without instrument number next to note (fixes spx-farspacedance.it, but is this actually 100% correct?)
if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nNNA = pIns->nNNA;
- if (!(pIns->VolEnv.dwFlags & ENV_CARRY)) pChn->nVolEnvPosition = 0;
- if (!(pIns->PanEnv.dwFlags & ENV_CARRY)) pChn->nPanEnvPosition = 0;
- if (!(pIns->PitchEnv.dwFlags & ENV_CARRY)) pChn->nPitchEnvPosition = 0;
+ if (!(pIns->VolEnv.dwFlags & ENV_CARRY)) pChn->VolEnv.nEnvPosition = 0;
+ if (!(pIns->PanEnv.dwFlags & ENV_CARRY)) pChn->PanEnv.nEnvPosition = 0;
+ if (!(pIns->PitchEnv.dwFlags & ENV_CARRY)) pChn->PitchEnv.nEnvPosition = 0;
if (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))
{
// Volume Swing
@@ -957,9 +957,9 @@
else
v <<= 16;
if (pj->dwFlags & CHN_LOOP) v >>= 1;
- if ((v < vol) || ((v == vol) && (pj->nVolEnvPosition > envpos)))
+ if ((v < vol) || ((v == vol) && (pj->VolEnv.nEnvPosition > envpos)))
{
- envpos = pj->nVolEnvPosition;
+ envpos = pj->VolEnv.nEnvPosition;
vol = v;
result = j;
}
@@ -1907,13 +1907,13 @@
case CMD_SETENVPOSITION:
if(m_dwSongFlags & SONG_FIRSTTICK)
{
- pChn->nVolEnvPosition = param;
+ pChn->VolEnv.nEnvPosition = param;
// XM compatibility: FT2 only sets the position of the Volume envelope
if(!IsCompatibleMode(TRK_FASTTRACKER2))
{
- pChn->nPanEnvPosition = param;
- pChn->nPitchEnvPosition = param;
+ pChn->PanEnv.nEnvPosition = param;
+ pChn->PitchEnv.nEnvPosition = param;
if (pChn->pModInstrument)
{
MODINSTRUMENT *pIns = pChn->pModInstrument;
@@ -2065,24 +2065,24 @@
switch (envToReset)
{
case ENV_RESET_ALL:
- pChn->nVolEnvPosition = 0;
- pChn->nPanEnvPosition = 0;
- pChn->nPitchEnvPosition = 0;
- pChn->nVolEnvValueAtReleaseJump = NOT_YET_RELEASED;
- pChn->nPitchEnvValueAtReleaseJump = NOT_YET_RELEASED;
- pChn->nPanEnvValueAtReleaseJump = NOT_YET_RELEASED;
+ pChn->VolEnv.nEnvPosition = 0;
+ pChn->PanEnv.nEnvPosition = 0;
+ pChn->PitchEnv.nEnvPosition = 0;
+ pChn->VolEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED;
+ pChn->PitchEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED;
+ pChn->PanEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED;
break;
case ENV_RESET_VOL:
- pChn->nVolEnvPosition = 0;
- pChn->nVolEnvValueAtReleaseJump = NOT_YET_RELEASED;
+ pChn->VolEnv.nEnvPosition = 0;
+ pChn->VolEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED;
break;
case ENV_RESET_PAN:
- pChn->nPanEnvPosition = 0;
- pChn->nPanEnvValueAtReleaseJump = NOT_YET_RELEASED;
+ pChn->PanEnv.nEnvPosition = 0;
+ pChn->PanEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED;
break;
case ENV_RESET_PITCH:
- pChn->nPitchEnvPosition = 0;
- pChn->nPitchEnvValueAtReleaseJump = NOT_YET_RELEASED;
+ pChn->PitchEnv.nEnvPosition = 0;
+ pChn->PitchEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED;
break;
}
}
@@ -3580,8 +3580,8 @@
if (pIns->VolEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET)
{
- pChn->nVolEnvValueAtReleaseJump = getVolEnvValueFromPosition(pChn->nVolEnvPosition, pIns);
- pChn->nVolEnvPosition= pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode];
+ pChn->VolEnv.nEnvValueAtReleaseJump = getVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns);
+ pChn->VolEnv.nEnvPosition= pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode];
}
}
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2010-08-12 16:12:48 UTC (rev 686)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2010-08-15 19:46:09 UTC (rev 687)
@@ -160,6 +160,15 @@
// --------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------
+
+// Envelope playback info for each MODCHANNEL
+struct MODCHANNEL_ENVINFO
+{
+ DWORD nEnvPosition;
+ LONG nEnvValueAtReleaseJump;
+};
+
+
#pragma warning(disable : 4324) //structure was padded due to __declspec(align())
// Channel Struct
@@ -191,10 +200,9 @@
LONG nRealVolume, nRealPan;
LONG nVolume, nPan, nFadeOutVol;
LONG nPeriod, nC5Speed, nPortamentoDest;
- MODINSTRUMENT *pModInstrument;
- MODSAMPLE *pModSample;
- DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition;
- LONG nVolEnvValueAtReleaseJump, nPanEnvValueAtReleaseJump, nPitchEnvValueAtReleaseJump;
+ MODINSTRUMENT *pModInstrument; // Currently assigned instrument slot
+ MODCHANNEL_ENVINFO VolEnv, PanEnv, PitchEnv; // Envelope playback info
+ MODSAMPLE *pModSample; // Currently assigned sample slot
DWORD nMasterChn, nVUMeter;
LONG nGlobalVol, nInsVol;
LONG nFineTune, nTranspose;
@@ -205,6 +213,8 @@
LONG nRestorePanOnNewNote; //If > 0, nPan should be set to nRestorePanOnNewNote - 1 on new note. Used to recover from panswing.
UINT nOldGlobalVolSlide;
DWORD nEFxOffset; // offset memory for Invert Loop (EFx, .MOD only)
+ int nRetrigCount, nRetrigParam;
+ ROWINDEX nPatternLoop;
// 8-bit members
BYTE nRestoreResonanceOnNewNote; //Like above
BYTE nRestoreCutoffOnNewNote; //Like above
@@ -220,9 +230,7 @@
BYTE nOldCmdEx, nOldVolParam, nOldTempo;
BYTE nOldOffset, nOldHiOffset;
BYTE nCutOff, nResonance;
- int nRetrigCount, nRetrigParam;
BYTE nTremorCount, nTremorParam;
- ROWINDEX nPatternLoop;
BYTE nPatternLoopCount;
BYTE nRowNote, nRowInstr;
BYTE nRowVolCmd, nRowVolume;
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-08-12 16:12:48 UTC (rev 686)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-08-15 19:46:09 UTC (rev 687)
@@ -1103,22 +1103,22 @@
// IT Compatibility: S77 does not disable the volume envelope, it just pauses the counter
if (((pChn->dwFlags & CHN_VOLENV) || ((pIns->VolEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pIns->VolEnv.nNodes))
{
- int envvol = getVolEnvValueFromPosition(pChn->nVolEnvPosition, pIns);
+ int envvol = getVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns);
// if we are in the release portion of the envelope,
// rescale envelope factor so that it is proportional to the release point
// and release envelope beginning.
if (pIns->VolEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET
- && pChn->nVolEnvPosition>=pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode]
- && pChn->nVolEnvValueAtReleaseJump != NOT_YET_RELEASED)
+ && pChn->VolEnv.nEnvPosition>=pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode]
+ && pChn->VolEnv.nEnvValueAtReleaseJump != NOT_YET_RELEASED)
{
- int envValueAtReleaseJump = pChn->nVolEnvValueAtReleaseJump;
+ int envValueAtReleaseJump = pChn->VolEnv.nEnvValueAtReleaseJump;
int envValueAtReleaseNode = pIns->VolEnv.Values[pIns->VolEnv.nReleaseNode] << 2;
//If we have just hit the release node, force the current env value
//to be that of the release node. This works around the case where
// we have another node at the same position as the release node.
- if (pChn->nVolEnvPosition == pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode])
+ if (pChn->VolEnv.nEnvPosition == pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode])
envvol = envValueAtReleaseNode;
int relativeVolumeChange = (envvol - envValueAtReleaseNode) * 2;
@@ -1130,7 +1130,7 @@
// IT Compatibility: S79 does not disable the panning envelope, it just pauses the counter
if (((pChn->dwFlags & CHN_PANENV) || ((pIns->PanEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pIns->PanEnv.nNodes))
{
- int envpos = pChn->nPanEnvPosition;
+ int envpos = pChn->PanEnv.nEnvPosition;
UINT pt = pIns->PanEnv.nNodes - 1;
for (UINT i=0; i<(UINT)(pIns->PanEnv.nNodes-1); i++)
{
@@ -1311,7 +1311,7 @@
// IT Compatibility: S7B does not disable the pitch envelope, it just pauses the counter
if ((pIns) && ((pChn->dwFlags & CHN_PITCHENV) || ((pIns->PitchEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pChn->pModInstrument->PitchEnv.nNodes))
{
- int envpos = pChn->nPitchEnvPosition;
+ int envpos = pChn->PitchEnv.nEnvPosition;
UINT pt = pIns->PitchEnv.nNodes - 1;
for (UINT i=0; i<(UINT)(pIns->PitchEnv.nNodes-1); i++)
{
@@ -1662,15 +1662,15 @@
if (pChn->dwFlags & CHN_VOLENV)
{
// Increase position
- pChn->nVolEnvPosition++;
+ pChn->VolEnv.nEnvPosition++;
// Volume Loop ?
if (pIns->VolEnv.dwFlags & ENV_LOOP)
{
UINT volloopend = pIns->VolEnv.Ticks[pIns->VolEnv.nLoopEnd];
if (m_nType != MOD_TYPE_XM) volloopend++;
- if (pChn->nVolEnvPosition == volloopend)
+ if (pChn->VolEnv.nEnvPosition == volloopend)
{
- pChn->nVolEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nLoopStart];
+ pChn->VolEnv.nEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nLoopStart];
if ((pIns->VolEnv.nLoopEnd == pIns->VolEnv.nLoopStart) && (!pIns->VolEnv.Values[pIns->VolEnv.nLoopStart])
&& ((!(m_nType & MOD_TYPE_XM)) || (pIns->VolEnv.nLoopEnd+1 == (int)pIns->VolEnv.nNodes)))
{
@@ -1682,14 +1682,14 @@
// Volume Sustain ?
if ((pIns->VolEnv.dwFlags & ENV_SUSTAIN) && (!(pChn->dwFlags & CHN_KEYOFF)))
{
- if (pChn->nVolEnvPosition == (UINT)pIns->VolEnv.Ticks[pIns->VolEnv.nSustainEnd] + 1)
- pChn->nVolEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nSustainStart];
+ if (pChn->VolEnv.nEnvPosition == (UINT)pIns->VolEnv.Ticks[pIns->VolEnv.nSustainEnd] + 1)
+ pChn->VolEnv.nEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nSustainStart];
} else
// End of Envelope ?
- if (pChn->nVolEnvPosition > pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1])
+ if (pChn->VolEnv.nEnvPosition > pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1])
{
if ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (pChn->dwFlags & CHN_KEYOFF)) pChn->dwFlags |= CHN_NOTEFADE;
- pChn->nVolEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1];
+ pChn->VolEnv.nEnvPosition = pIns->VolEnv.Ticks[pIns->VolEnv.nNodes - 1];
if ((!pIns->VolEnv.Values[pIns->VolEnv.nNodes-1]) && ((nChn >= m_nChannels) || (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))))
{
pChn->dwFlags |= CHN_NOTEFADE;
@@ -1701,49 +1701,49 @@
// Panning Envelope
if (pChn->dwFlags & CHN_PANENV)
{
- pChn->nPanEnvPosition++;
+ pChn->PanEnv.nEnvPosition++;
if (pIns->PanEnv.dwFlags & ENV_LOOP)
{
UINT panloopend = pIns->PanEnv.Ticks[pIns->PanEnv.nLoopEnd];
if (m_nType != MOD_TYPE_XM) panloopend++;
- if (pChn->nPanEnvPosition == panloopend)
- pChn->nPanEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nLoopStart];
+ if (pChn->PanEnv.nEnvPosition == panloopend)
+ pChn->PanEnv.nEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nLoopStart];
}
// Panning Sustain ?
- if ((pIns->PanEnv.dwFlags & ENV_SUSTAIN) && (pChn->nPanEnvPosition == (UINT)pIns->PanEnv.Ticks[pIns->PanEnv.nSustainEnd]+1)
+ if ((pIns->PanEnv.dwFlags & ENV_SUSTAIN) && (pChn->PanEnv.nEnvPosition == (UINT)pIns->PanEnv.Ticks[pIns->PanEnv.nSustainEnd]+1)
&& (!(pChn->dwFlags & CHN_KEYOFF)))
{
// Panning sustained
- pChn->nPanEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nSustainStart];
+ pChn->PanEnv.nEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nSustainStart];
} else
{
- if (pChn->nPanEnvPosition > pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1])
- pChn->nPanEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1];
+ if (pChn->PanEnv.nEnvPosition > pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1])
+ pChn->PanEnv.nEnvPosition = pIns->PanEnv.Ticks[pIns->PanEnv.nNodes - 1];
}
}
// Pitch Envelope
if (pChn->dwFlags & CHN_PITCHENV)
{
// Increase position
- pChn->nPitchEnvPosition++;
+ pChn->PitchEnv.nEnvPosition++;
// Pitch Loop ?
if (pIns->PitchEnv.dwFlags & ENV_LOOP)
{
UINT pitchloopend = pIns->PitchEnv.Ticks[pIns->PitchEnv.nLoopEnd];
//IT compatibility 24. Short envelope loops
if (IsCompatibleMode(TRK_IMPULSETRACKER)) pitchloopend++;
- if (pChn->nPitchEnvPosition >= pitchloopend)
- pChn->nPitchEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nLoopStart];
+ if (pChn->PitchEnv.nEnvPosition >= pitchloopend)
+ pChn->PitchEnv.nEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nLoopStart];
}
// Pitch Sustain ?
if ((pIns->PitchEnv.dwFlags & ENV_SUSTAIN) && (!(pChn->dwFlags & CHN_KEYOFF)))
{
- if (pChn->nPitchEnvPosition == (UINT)pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainEnd]+1)
- pChn->nPitchEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainStart];
+ if (pChn->PitchEnv.nEnvPosition == (UINT)pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainEnd]+1)
+ pChn->PitchEnv.nEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nSustainStart];
} else
{
- if (pChn->nPitchEnvPosition > pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1])
- pChn->nPitchEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1];
+ if (pChn->PitchEnv.nEnvPosition > pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1])
+ pChn->PitchEnv.nEnvPosition = pIns->PitchEnv.Ticks[pIns->PitchEnv.nNodes - 1];
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-12 16:12:55
|
Revision: 686
http://modplug.svn.sourceforge.net/modplug/?rev=686&view=rev
Author: saga-games
Date: 2010-08-12 16:12:48 +0000 (Thu, 12 Aug 2010)
Log Message:
-----------
[Imp] Mod Savers: Garbage characters following the trailing null char in sample/instrument/song names are now removed before saving, so they don't turn up in the saved modules anymore (happened sometimes).
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/misc_util.h
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-12 12:39:51 UTC (rev 685)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-12 16:12:48 UTC (rev 686)
@@ -93,7 +93,7 @@
CModDoc::CModDoc()
//----------------
{
- m_bHasValidPath=false;
+ m_bHasValidPath = false;
m_bPaused = TRUE;
m_lpszLog = NULL;
m_hWndFollow = NULL;
@@ -425,6 +425,7 @@
}
BeginWaitCursor();
ClearLog();
+ FixNullStrings();
switch(nType)
{
case MOD_TYPE_MOD: bOk = m_SndFile.SaveMod(lpszPathName, dwPacking); break;
@@ -1760,6 +1761,7 @@
if(files.abort) return;
ClearLog();
+ FixNullStrings();
switch (type)
{
case MOD_TYPE_MOD:
@@ -3707,4 +3709,43 @@
m_SndFile.ResetChannels();
m_SndFile.StopAllVsti();
END_CRITICAL();
+}
+
+
+// Before saving, make sure that every char after the terminating null char is also null.
+// Else, garbage might end up in various text strings that wasn't supposed to be there.
+void CModDoc::FixNullStrings()
+//----------------------------
+{
+ // Song title
+ FixNullString(m_SndFile.m_szNames[0]);
+
+ // Sample names + filenames
+ for(SAMPLEINDEX nSmp = 1; nSmp < m_SndFile.GetNumSamples(); nSmp++)
+ {
+ FixNullString(m_SndFile.m_szNames[nSmp]);
+ FixNullString(m_SndFile.Samples[nSmp].filename);
+ }
+
+ // Instrument names
+ for(INSTRUMENTINDEX nIns = 1; nIns < m_SndFile.GetNumInstruments(); nIns++)
+ {
+ if(m_SndFile.Instruments[nIns] != nullptr)
+ {
+ FixNullString(m_SndFile.Instruments[nIns]->name);
+ FixNullString(m_SndFile.Instruments[nIns]->filename);
+ }
+ }
+
+ // Channel names
+ for(CHANNELINDEX nChn = 0; nChn < m_SndFile.GetNumChannels(); nChn++)
+ {
+ FixNullString(m_SndFile.ChnSettings[nChn].szName);
+ }
+
+ // Pattern names
+ // Halp, this is currently not possible. Is it even needed?
+
+ // Sequence names.
+ // Not needed?
}
\ No newline at end of file
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2010-08-12 12:39:51 UTC (rev 685)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2010-08-12 16:12:48 UTC (rev 686)
@@ -291,6 +291,8 @@
bool HasMPTHacks(bool autofix = false);
+ void FixNullStrings();
+
bool m_bHasValidPath; //becomes true if document is loaded or saved.
// Fix: save pattern scrollbar position when switching to other tab
CSize GetOldPatternScrollbarsPos() const { return m_szOldPatternScrollbarsPos; };
Modified: trunk/OpenMPT/mptrack/misc_util.h
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.h 2010-08-12 12:39:51 UTC (rev 685)
+++ trunk/OpenMPT/mptrack/misc_util.h 2010-08-12 16:12:48 UTC (rev 686)
@@ -103,13 +103,16 @@
// If the source and destination arrays overlap, behaviour is undefined.
template <class T>
void ArrayCopy(T* pDst, const T* pSrc, const size_t n)
+//----------------------------------------------------
{
utilImpl::ArrayCopyImpl<std::tr1::has_trivial_assign<T>::value>::Do(pDst, pSrc, n);
}
+
// Sanitize a filename (remove special chars)
template <size_t size>
inline void SanitizeFilename(char (&buffer)[size])
+//------------------------------------------------
{
STATIC_ASSERT(size > 0);
for(size_t i = 0; i < size; i++)
@@ -132,9 +135,11 @@
}
}
+
// Convert a 0-terminated string to a space-padded string
template <size_t size>
void NullToSpaceString(char (&buffer)[size])
+//------------------------------------------
{
STATIC_ASSERT(size > 0);
size_t pos = size;
@@ -143,9 +148,12 @@
buffer[pos] = 32;
buffer[size - 1] = 0;
}
+
+
// Convert a space-padded string to a 0-terminated string
template <size_t size>
void SpaceToNullString(char (&buffer)[size])
+//------------------------------------------
{
STATIC_ASSERT(size > 0);
// First, remove any Nulls
@@ -161,6 +169,24 @@
buffer[size - 1] = 0;
}
+
+// Remove any chars after the first null char
+template <size_t size>
+void FixNullString(char (&buffer)[size])
+//--------------------------------------
+{
+ STATIC_ASSERT(size > 0);
+ bool overwrite = false;
+ for(size_t pos = 0; pos < size; pos++)
+ {
+ if(overwrite)
+ buffer[pos] = 0;
+ else if(buffer[pos] == 0)
+ overwrite = true;
+ }
+}
+
+
// Convert a space-padded string to a 0-terminated string.
// Additional parameter to specifify the max length of the final string,
// not including null char (useful for e.g. mod loaders)
@@ -178,4 +204,5 @@
buffer[pos] = 0;
}
}
+
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-12 12:39:58
|
Revision: 685
http://modplug.svn.sourceforge.net/modplug/?rev=685&view=rev
Author: saga-games
Date: 2010-08-12 12:39:51 +0000 (Thu, 12 Aug 2010)
Log Message:
-----------
[Mod] IT Saving: Sane values are used again for the cwtv and cmwt fields; in fact the same values as in compatibility export. To be able to distinguish between raped and compatiblity-exported IT files, "OMPT" is written in the "reserved" header field.
[Ref] Related refactoring (replaced hex numbers by macros)
Modified Paths:
--------------
trunk/OpenMPT/soundlib/IT_DEFS.H
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_itp.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
Modified: trunk/OpenMPT/soundlib/IT_DEFS.H
===================================================================
--- trunk/OpenMPT/soundlib/IT_DEFS.H 2010-08-11 20:37:26 UTC (rev 684)
+++ trunk/OpenMPT/soundlib/IT_DEFS.H 2010-08-12 12:39:51 UTC (rev 685)
@@ -13,19 +13,19 @@
WORD insnum;
WORD smpnum;
WORD patnum;
- WORD cwtv;
- WORD cmwt;
+ WORD cwtv; // "made with" tracker
+ WORD cmwt; // "compatible with" tracker
WORD flags;
WORD special;
BYTE globalvol;
- BYTE mv;
+ BYTE mv; // master volume
BYTE speed;
BYTE tempo;
- BYTE sep; // panning separation (0...128)
- BYTE pwd; // pitch wheel depth
+ BYTE sep; // panning separation (0...128)
+ BYTE pwd; // pitch wheel depth
WORD msglength;
DWORD msgoffset;
- DWORD reserved; // ChibiTracker writes "CHBI" here.
+ DWORD reserved; // ChibiTracker writes "CHBI" here. OpenMPT writes "OMPT" here in some cases, see Load_it.cpp
BYTE chnpan[64];
BYTE chnvol[64];
} ITFILEHEADER;
@@ -140,6 +140,14 @@
extern BYTE autovibit2xm[8];
extern BYTE autovibxm2it[8];
+// Impulse Tracker identifcators
+#define IT_IMPM 0x4D504D49 // "IMPM" IT header magic bytes
+#define IT_IMPS 0x53504D49 // "IMPS" IT sample header magic bytes
+#define IT_IMPI 0x49504D49 // "IMPI" IT instrument header magic bytes
+
+// Identificators by other trackers
+#define IT_MPTM 0x2E6D7074 // "tpm." old MPTM header magic bytes
+#define IT_OMPT 0x54504D4F // "OMPT" magic bytes for non-standard OpenMPT IT files
#define IT_CHBI 0x49424843 // "CHBI" magic bytes in the IT header to identify ChibiTracker
enum IT_ReaderBitMasks
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-11 20:37:26 UTC (rev 684)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-12 12:39:51 UTC (rev 685)
@@ -30,7 +30,7 @@
// the MPTM file will not be loaded.
/*
-MPTM version history for cwtv-field in IT header:
+MPTM version history for cwtv-field in "IT" header (only for MPTM files!):
0x890(1.18.02.00) -> 0x891(1.19.00.00): Pattern-specific time signatures
0x88F(1.18.01.00) -> 0x890(1.18.02.00): Removed volume command velocity :xy, added delay-cut command :xy.
0x88E(1.17.02.50) -> 0x88F(1.18.01.00): Numerous changes
@@ -473,7 +473,7 @@
bool hasModplugExtensions = false;
if ((!lpStream) || (dwMemLength < 0xC0)) return false;
- if ((pifh->id != 0x4D504D49 && pifh->id != 0x2e6D7074) || (pifh->insnum > 0xFF)
+ if ((pifh->id != LittleEndian(IT_IMPM) && pifh->id != LittleEndian(IT_MPTM)) || (pifh->insnum > 0xFF)
|| (pifh->smpnum >= MAX_SAMPLES) || (!pifh->ordnum)) return false;
if (dwMemPos + pifh->ordnum + pifh->insnum*4
+ pifh->smpnum*4 + pifh->patnum*4 > dwMemLength) return false;
@@ -484,7 +484,7 @@
if(mptStartPos >= dwMemLength || mptStartPos < 0x100)
mptStartPos = dwMemLength;
- if(pifh->id == 0x2e6D7074)
+ if(pifh->id == LittleEndian(IT_MPTM))
{
ChangeModTypeTo(MOD_TYPE_MPT);
}
@@ -503,22 +503,29 @@
if(GetType() == MOD_TYPE_IT)
{
// Which tracker was used to made this?
- if(pifh->cmwt == 0x888 || pifh->cwtv == 0x888)
+ if((pifh->cwtv & 0xF000) == 0x5000)
{
- // OpenMPT
+ // OpenMPT Version number (Major.Minor)
+ // This will only be interpreted as "made with modplug" (i.e. disable compatible playback etc) if the "reserved" field is set to "OMPT" - else, compatibility was used.
+ m_dwLastSavedWithVersion = (pifh->cwtv & 0x0FFF) << 16;
+ if(pifh->reserved == LittleEndian(IT_OMPT))
+ interpretModplugmade = true;
+ } else if(pifh->cmwt == 0x888 || pifh->cwtv == 0x888)
+ {
+ // OpenMPT 1.17 and 1.18 (raped IT format)
interpretModplugmade = true;
- } else if(pifh->cwtv == 0x217 && pifh->cmwt == 0x200 && pifh->reserved == 0)
+ } else if(pifh->cwtv == 0x0217 && pifh->cmwt == 0x0200 && pifh->reserved == 0)
{
- // Modplug Tracker 1.16
+ // Modplug Tracker 1.16 (semi-raped IT format)
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00);
interpretModplugmade = true;
- } else if(pifh->cwtv == 0x214 && pifh->cmwt == 0x202 && pifh->reserved == 0)
+ } else if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0202 && pifh->reserved == 0)
{
// Modplug Tracker b3.3 - 1.09, instruments 557 bytes apart
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 09, 00, 00);
interpretModplugmade = true;
}
- else if(pifh->cwtv == 0x214 && pifh->cmwt == 0x200 && pifh->reserved == 0)
+ else if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0200 && pifh->reserved == 0)
{
// Modplug Tracker 1.00a5, instruments 560 bytes apart
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, 00);
@@ -554,12 +561,6 @@
}
}
- if((pifh->cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor) - we won't interpret this as "made with modplug" as this is used by compatibility export
- {
- m_dwLastSavedWithVersion = (pifh->cwtv & 0x0FFF) << 16;
- //interpretModplugmade = true;
- }
-
if (pifh->flags & 0x08) m_dwSongFlags |= SONG_LINEARSLIDES;
if (pifh->flags & 0x10) m_dwSongFlags |= SONG_ITOLDEFFECTS;
if (pifh->flags & 0x20) m_dwSongFlags |= SONG_ITCOMPATMODE;
@@ -592,7 +593,7 @@
if ((pifh->special & 0x01) && (pifh->msglength) && (pifh->msglength <= dwMemLength) && (pifh->msgoffset < dwMemLength - pifh->msglength))
{
// Generally, IT files should use CR for line endings. However, ChibiTracker uses LF. One could do...
- // if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0214 && LittleEndian(pifh->reserved) == IT_CHBI) --> Chibi detected.
+ // if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0214 && pifh->reserved == LittleEndian(IT_CHBI)) --> Chibi detected.
// But we'll just use autodetection here:
ReadMessage(lpStream + pifh->msgoffset, pifh->msglength, leAutodetect);
}
@@ -827,7 +828,7 @@
for (UINT nsmp=0; nsmp<pifh->smpnum; nsmp++) if ((smppos[nsmp]) && (smppos[nsmp] <= dwMemLength - sizeof(ITSAMPLESTRUCT)))
{
ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)(lpStream+smppos[nsmp]);
- if (pis->id == 0x53504D49)
+ if (pis->id == LittleEndian(IT_IMPS))
{
MODSAMPLE *pSmp = &Samples[nsmp+1];
memcpy(pSmp->filename, pis->filename, 12);
@@ -1169,7 +1170,7 @@
memset(&header, 0, sizeof(header));
dwPatNamLen = 0;
dwChnNamLen = 0;
- header.id = 0x4D504D49;
+ header.id = LittleEndian(IT_IMPM);
lstrcpyn(header.songname, m_szNames[0], 26);
header.highlight_minor = (BYTE)(m_nDefaultRowsPerBeat & 0xFF);
@@ -1190,12 +1191,11 @@
if(header.ordnum < 2) header.ordnum = 2;
}
-
header.insnum = m_nInstruments;
header.smpnum = m_nSamples;
header.patnum = (GetType() == MOD_TYPE_MPT) ? Patterns.Size() : MAX_PATTERNS;
if(Patterns.Size() < header.patnum) Patterns.ResizeArray(header.patnum);
- while ((header.patnum > 0) && (!Patterns[header.patnum-1])) header.patnum--;
+ while ((header.patnum > 0) && (!Patterns[header.patnum - 1])) header.patnum--;
patpos.resize(header.patnum, 0);
@@ -1207,8 +1207,20 @@
}
else //IT
{
- header.cwtv = 0x888; //
- header.cmwt = 0x888; // Might come up as "Impulse Tracker 8" file in XMPlay. :)
+ MptVersion::VersionNum vVersion = MptVersion::num;
+ header.cwtv = LittleEndianW(0x5000 | (WORD)((vVersion >> 16) & 0x0FFF)); // format: txyy (t = tracker ID, x = version major, yy = version minor), e.g. 0x5117 (OpenMPT = 5, 117 = v1.17)
+ header.cmwt = LittleEndianW(0x0214); // Common compatible tracker :)
+ // hack from schism tracker:
+ for(INSTRUMENTINDEX nIns = 1; nIns <= GetNumInstruments(); nIns++)
+ {
+ if(Instruments[nIns] && Instruments[nIns]->PitchEnv.dwFlags & ENV_FILTER)
+ {
+ header.cmwt = LittleEndianW(0x0217);
+ break;
+ }
+ }
+ // This way, we indicate that the file will most likely contain OpenMPT hacks. Compatibility export puts 0 here.
+ header.reserved = LittleEndian(IT_OMPT);
}
header.flags = 0x0001;
@@ -1334,7 +1346,7 @@
BYTE keyboardex[NOTE_MAX];
memset(&iti, 0, sizeof(iti));
- iti.id = 0x49504D49; // "IMPI"
+ iti.id = LittleEndian(IT_IMPI); // "IMPI"
//iti.trkvers = 0x211;
iti.trkvers = 0x220; //rewbs.itVersion
if (Instruments[nins])
@@ -1645,7 +1657,7 @@
memset(&itss, 0, sizeof(itss));
memcpy(itss.filename, psmp->filename, 12);
memcpy(itss.name, m_szNames[nsmp], 26);
- itss.id = 0x53504D49;
+ itss.id = LittleEndian(IT_IMPS);
itss.gvl = (BYTE)psmp->nGlobalVol;
UINT flags = RS_PCM8S;
@@ -1813,7 +1825,7 @@
memset(&header, 0, sizeof(header));
dwPatNamLen = 0;
dwChnNamLen = 0;
- header.id = 0x4D504D49;
+ header.id = LittleEndian(IT_IMPM);
lstrcpyn(header.songname, m_szNames[0], 26);
header.highlight_minor = (BYTE)(m_nDefaultRowsPerBeat & 0xFF);
@@ -1966,7 +1978,7 @@
BYTE keyboardex[NOTE_MAX];
memset(&iti, 0, sizeof(iti));
- iti.id = 0x49504D49; // "IMPI"
+ iti.id = LittleEndian(IT_IMPI); // "IMPI"
iti.trkvers = 0x0214;
if (Instruments[nins])
{
@@ -2250,7 +2262,7 @@
memcpy(itss.filename, psmp->filename, 12);
memcpy(itss.name, m_szNames[nsmp], 26);
SetNullTerminator(itss.name);
- itss.id = 0x53504D49;
+ itss.id = LittleEndian(IT_IMPS);
itss.gvl = (BYTE)psmp->nGlobalVol;
UINT flags = RS_PCM8S;
@@ -3120,4 +3132,3 @@
#undef CASE_NOTXM
}
-
Modified: trunk/OpenMPT/soundlib/Load_itp.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_itp.cpp 2010-08-11 20:37:26 UTC (rev 684)
+++ trunk/OpenMPT/soundlib/Load_itp.cpp 2010-08-12 12:39:51 UTC (rev 685)
@@ -325,7 +325,7 @@
if(dwMemPos >= dwMemLength || len > dwMemLength - dwMemPos) return false;
// Copy sample struct data
- if(pis.id == 0x53504D49)
+ if(pis.id == LittleEndian(IT_IMPS))
{
MODSAMPLE *pSmp = &Samples[nsmp];
memcpy(pSmp->filename, pis.filename, 12);
@@ -648,7 +648,7 @@
memcpy(itss.filename, psmp->filename, 12);
memcpy(itss.name, m_szNames[nsmp], 26);
- itss.id = 0x53504D49;
+ itss.id = LittleEndian(IT_IMPS);
itss.gvl = (BYTE)psmp->nGlobalVol;
itss.flags = 0x00;
@@ -720,3 +720,4 @@
}
#endif
+
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2010-08-11 20:37:26 UTC (rev 684)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2010-08-12 12:39:51 UTC (rev 685)
@@ -54,7 +54,7 @@
|| (psig[76/4] == LittleEndian(0x53524353)) // S3I signature
|| ((psig[0] == LittleEndian(0x4D524F46)) && (psig[2] == LittleEndian(0x46464941))) // AIFF signature
|| ((psig[0] == LittleEndian(0x4D524F46)) && (psig[2] == LittleEndian(0x58565338))) // 8SVX signature
- || (psig[0] == LittleEndian(0x53504D49)) // ITS signature
+ || (psig[0] == LittleEndian(LittleEndian(IT_IMPS))) // ITS signature
)
{
// Loading Instrument
@@ -1615,9 +1615,9 @@
// -> CODE#0027
// -> DESC="per-instrument volume ramping setup (refered as attack)"
// if ((!lpMemFile) || (dwFileLength < sizeof(ITSAMPLESTRUCT))
-// || (pis->id != 0x53504D49) || (((DWORD)pis->samplepointer) >= dwFileLength + dwOffset)) return FALSE;
+// || (pis->id != LittleEndian(IT_IMPS)) || (((DWORD)pis->samplepointer) >= dwFileLength + dwOffset)) return FALSE;
if ((!lpMemFile) || (dwFileLength < sizeof(ITSAMPLESTRUCT))
- || (pis->id != 0x53504D49) || (((DWORD)pis->samplepointer) >= dwFileLength + dwOffset)) return 0;
+ || (pis->id != LittleEndian(IT_IMPS)) || (((DWORD)pis->samplepointer) >= dwFileLength + dwOffset)) return 0;
// -! NEW_FEATURE#0027
DestroySample(nSample);
dwMemPos = pis->samplepointer - dwOffset;
@@ -1692,7 +1692,7 @@
UINT nsmp, nsamples;
if ((!lpMemFile) || (dwFileLength < sizeof(ITINSTRUMENT))
- || (pinstr->id != 0x49504D49)) return false;
+ || (pinstr->id != LittleEndian(IT_IMPI))) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -1787,7 +1787,7 @@
memset(smpcount, 0, sizeof(smpcount));
memset(smptable, 0, sizeof(smptable));
memset(smpmap, 0, sizeof(smpmap));
- iti->id = 0x49504D49; // "IMPI"
+ iti->id = LittleEndian(IT_IMPI); // "IMPI"
memcpy(iti->filename, pIns->filename, 12);
memcpy(iti->name, pIns->name, 26);
SetNullTerminator(iti->name);
@@ -1882,7 +1882,7 @@
UINT nsmp = smptable[j];
memset(&itss, 0, sizeof(itss));
MODSAMPLE *psmp = &Samples[nsmp];
- itss.id = 0x53504D49;
+ itss.id = LittleEndian(IT_IMPS);
memcpy(itss.filename, psmp->filename, 12);
memcpy(itss.name, m_szNames[nsmp], 26);
itss.gvl = (BYTE)psmp->nGlobalVol;
@@ -2158,7 +2158,3 @@
return true;
}
-
-
-
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-11 20:37:32
|
Revision: 684
http://modplug.svn.sourceforge.net/modplug/?rev=684&view=rev
Author: saga-games
Date: 2010-08-11 20:37:26 +0000 (Wed, 11 Aug 2010)
Log Message:
-----------
[Imp] IT Loader: Modplug Tracker 1.00a5 is now also detected.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-10 20:42:46 UTC (rev 683)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-11 20:37:26 UTC (rev 684)
@@ -502,15 +502,28 @@
if(GetType() == MOD_TYPE_IT)
{
- if(pifh->cmwt == 0x888 || pifh->cwtv == 0x888 ||
- (pifh->cwtv == 0x217 && pifh->cmwt == 0x200) ||
- (pifh->cwtv == 0x214 && pifh->cmwt == 0x202)) interpretModplugmade = true;
- //TODO: Check whether above interpretation is reasonable especially for
- //values 0x217 and 0x200 which are the values used in 1.16.
- if(pifh->cwtv == 0x217 && pifh->cmwt == 0x200)
+ // Which tracker was used to made this?
+ if(pifh->cmwt == 0x888 || pifh->cwtv == 0x888)
+ {
+ // OpenMPT
+ interpretModplugmade = true;
+ } else if(pifh->cwtv == 0x217 && pifh->cmwt == 0x200 && pifh->reserved == 0)
+ {
+ // Modplug Tracker 1.16
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00);
- if(pifh->cwtv == 0x214 && pifh->cmwt == 0x202)
+ interpretModplugmade = true;
+ } else if(pifh->cwtv == 0x214 && pifh->cmwt == 0x202 && pifh->reserved == 0)
+ {
+ // Modplug Tracker b3.3 - 1.09, instruments 557 bytes apart
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 09, 00, 00);
+ interpretModplugmade = true;
+ }
+ else if(pifh->cwtv == 0x214 && pifh->cmwt == 0x200 && pifh->reserved == 0)
+ {
+ // Modplug Tracker 1.00a5, instruments 560 bytes apart
+ m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, 00);
+ interpretModplugmade = true;
+ }
}
else // case: type == MOD_TYPE_MPT
{
@@ -530,9 +543,10 @@
if(GetType() == MOD_TYPE_IT) mptStartPos = dwMemLength;
- if(pifh->cwtv >= 0x213 && !(interpretModplugmade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 01)))
+ // Read row highlights
+ if(pifh->cwtv >= 0x0213)
{
- // MPT 1.09, 1.07 and most likely other old MPT versions leave this blank
+ // MPT 1.09, 1.07 and most likely other old MPT versions as well as some other programs (converters) leave this blank
if(pifh->highlight_minor + pifh->highlight_major != 0)
{
m_nDefaultRowsPerBeat = pifh->highlight_minor;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-10 20:42:52
|
Revision: 683
http://modplug.svn.sourceforge.net/modplug/?rev=683&view=rev
Author: saga-games
Date: 2010-08-10 20:42:46 +0000 (Tue, 10 Aug 2010)
Log Message:
-----------
[Imp] Installer: "_sf" is automatically added to the installer exe name for sourceforge builds now.
Modified Paths:
--------------
trunk/OpenMPT/installer/install-unmo3-free.iss
trunk/OpenMPT/installer/install.iss
Modified: trunk/OpenMPT/installer/install-unmo3-free.iss
===================================================================
--- trunk/OpenMPT/installer/install-unmo3-free.iss 2010-08-09 20:38:37 UTC (rev 682)
+++ trunk/OpenMPT/installer/install-unmo3-free.iss 2010-08-10 20:42:46 UTC (rev 683)
@@ -10,7 +10,7 @@
; To download and install ISPP and ISTool, get the Inno Setup QuickStart Pack from http://www.jrsoftware.org/isdl.php#qsp
#define DOWNLOAD_MO3
-
+#define BaseNameAddition "_sf"
#include "install.iss"
[_ISToolDownload]
Modified: trunk/OpenMPT/installer/install.iss
===================================================================
--- trunk/OpenMPT/installer/install.iss 2010-08-09 20:38:37 UTC (rev 682)
+++ trunk/OpenMPT/installer/install.iss 2010-08-10 20:42:46 UTC (rev 683)
@@ -11,6 +11,10 @@
#define GetAppVersion StringChange(GetFileProductVersion("..\mptrack\bin\mptrack.exe"), ",", ".")
#define GetAppVersionShort Copy(GetAppVersion, 1, 4)
+#ifndef BaseNameAddition
+#define BaseNameAddition
+#endif
+
[Setup]
AppId={{67903736-E9BB-4664-B148-F62BCAB4FA42}
AppVerName=OpenMPT {#GetAppVersionShort}
@@ -24,7 +28,7 @@
DefaultGroupName=OpenMPT
AllowNoIcons=yes
OutputDir=.\
-OutputBaseFilename=OpenMPT-{#GetAppVersion}-Setup
+OutputBaseFilename=OpenMPT-{#GetAppVersion}-Setup{#BaseNameAddition}
Compression=lzma2
SolidCompression=yes
WizardImageFile=install-big.bmp
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-09 20:38:44
|
Revision: 682
http://modplug.svn.sourceforge.net/modplug/?rev=682&view=rev
Author: saga-games
Date: 2010-08-09 20:38:37 +0000 (Mon, 09 Aug 2010)
Log Message:
-----------
[Imp] Added keyboard shortcut for the panic button.
[Ref] Moved panic button code to CModDoc.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2010-08-09 14:30:17 UTC (rev 681)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2010-08-09 20:38:37 UTC (rev 682)
@@ -598,6 +598,7 @@
DefineKeyCommand(kcInsNoteMapEditSample, 1849, kcVisible, kcNoDummy, _T("Edit current sample"));
DefineKeyCommand(kcInsNoteMapEditSampleMap, 1850, kcVisible, kcNoDummy, _T("Edit sample map"));
DefineKeyCommand(kcInstrumentCtrlDuplicate, 1851, kcVisible, kcNoDummy, _T("Duplicate instrument"));
+ DefineKeyCommand(kcPanic, 1852, kcVisible, kcNoDummy, _T("Panic"));
// Add new key commands here.
#ifdef _DEBUG
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2010-08-09 14:30:17 UTC (rev 681)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2010-08-09 20:38:37 UTC (rev 682)
@@ -74,6 +74,7 @@
kcPlaySongFromCursor,
kcPlayPatternFromStart,
kcPlayPatternFromCursor,
+ kcPanic,
kcEstimateSongLength,
kcApproxRealBPM,
kcMidiRecord,
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-09 14:30:17 UTC (rev 681)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-09 20:38:37 UTC (rev 682)
@@ -2705,14 +2705,9 @@
void CMainFrame::OnPanic()
//------------------------
{
- // Panic button. At the moment, it just resets all VSTi and sample notes.
- if(m_pModPlaying && m_pModPlaying->GetSoundFile())
- {
- BEGIN_CRITICAL();
- m_pModPlaying->GetSoundFile()->ResetChannels();
- m_pModPlaying->GetSoundFile()->StopAllVsti();
- END_CRITICAL();
- }
+ // "Panic button." At the moment, it just resets all VSTi and sample notes.
+ if(m_pModPlaying)
+ m_pModPlaying->OnPanic();
}
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-09 14:30:17 UTC (rev 681)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-09 20:38:37 UTC (rev 682)
@@ -3447,6 +3447,7 @@
case kcPlaySongFromStart: OnPlayerPlayFromStart(); break;
case kcPlayPauseSong: OnPlayerPlay(); break;
case kcStopSong: OnPlayerStop(); break;
+ case kcPanic: OnPanic(); break;
// case kcPauseSong: OnPlayerPause(); break;
@@ -3690,9 +3691,20 @@
}
void CModDoc::SafeFileClose()
-//--------------------------
+//---------------------------
{
// Verify that the main window has the focus. This saves us a lot of trouble because active dialogs normally don't check if their pSndFile pointers are still valid.
if(GetActiveWindow() == CMainFrame::GetMainFrame()->m_hWnd)
OnFileClose();
+}
+
+
+// "Panic button". At the moment, it just resets all VSTi and sample notes.
+void CModDoc::OnPanic()
+//---------------------
+{
+ BEGIN_CRITICAL();
+ m_SndFile.ResetChannels();
+ m_SndFile.StopAllVsti();
+ END_CRITICAL();
}
\ No newline at end of file
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2010-08-09 14:30:17 UTC (rev 681)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2010-08-09 20:38:37 UTC (rev 682)
@@ -356,6 +356,7 @@
afx_msg void OnPlayerStop();
afx_msg void OnPlayerPause();
afx_msg void OnPlayerPlayFromStart();
+ afx_msg void OnPanic();
afx_msg void OnEditGlobals();
afx_msg void OnEditPatterns();
afx_msg void OnEditSamples();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-09 14:30:28
|
Revision: 681
http://modplug.svn.sourceforge.net/modplug/?rev=681&view=rev
Author: saga-games
Date: 2010-08-09 14:30:17 +0000 (Mon, 09 Aug 2010)
Log Message:
-----------
[Ref] Rewrote some code which generates a list of plugins that have not been found.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-08-09 14:09:36 UTC (rev 680)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-08-09 14:30:17 UTC (rev 681)
@@ -17,6 +17,7 @@
#include "wavConverter.h"
#include "tuningcollection.h"
#include <vector>
+#include <list>
#include <algorithm>
#define str_SampleAllocationError (GetStrI18N(_TEXT("Sample allocation error")))
@@ -766,9 +767,7 @@
// plugin loader
string sNotFound;
- bool bSearchIDs[MAX_MIXPLUGINS];
- memset(bSearchIDs, false, MAX_MIXPLUGINS * sizeof(bool));
- UINT iShowNotFound = 0;
+ std::list<PLUGINDEX> notFoundIDs;
// Load plugins only when m_pModDoc != 0. (can be == 0 for example when examining module samples in treeview.
if (gpMixPluginCreateProc && GetpModDoc())
@@ -788,19 +787,20 @@
{
// plugin not found - add to list
bool bFound = false;
- for(PLUGINDEX iPlugFind = 0; iPlugFind < iPlug; iPlugFind++)
- if(m_MixPlugins[iPlugFind].Info.dwPluginId2 == m_MixPlugins[iPlug].Info.dwPluginId2)
+ for(std::list<PLUGINDEX>::iterator i = notFoundIDs.begin(); i != notFoundIDs.end(); ++i)
+ {
+ if(m_MixPlugins[*i].Info.dwPluginId2 == m_MixPlugins[iPlug].Info.dwPluginId2)
{
bFound = true;
break;
}
+ }
if(bFound == false)
{
sNotFound = sNotFound + m_MixPlugins[iPlug].Info.szLibraryName + "\n";
- bSearchIDs[iPlug] = true; // set this flag so we will find the needed plugins later when calling KVRAudio
+ notFoundIDs.push_back(iPlug); // add this to the list of missing IDs so we will find the needed plugins later when calling KVRAudio
}
- iShowNotFound++;
}
}
}
@@ -808,9 +808,9 @@
// Display a nice message so the user sees what plugins are missing
// TODO: Use IDD_MODLOADING_WARNINGS dialog (NON-MODAL!) to display all warnings that are encountered when loading a module.
- if(iShowNotFound)
+ if(!notFoundIDs.empty())
{
- if(iShowNotFound == 1)
+ if(notFoundIDs.size() == 1)
{
sNotFound = "The following plugin has not been found:\n\n" + sNotFound + "\nDo you want to search for it on KVRAudio?";
}
@@ -820,13 +820,12 @@
"\nWARNING: A browser window / tab is opened for every plugin. If you do not want that, you can visit http://www.kvraudio.com/search.php";
}
if (::MessageBox(0, sNotFound.c_str(), "OpenMPT - Plugins missing", MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) == IDYES)
- for (PLUGINDEX iPlug = 0; iPlug < MAX_MIXPLUGINS; iPlug++)
- if (bSearchIDs[iPlug] == true)
- {
- CString sUrl;
- sUrl.Format("http://www.kvraudio.com/search.php?q=%s&lq=db", m_MixPlugins[iPlug].Info.szLibraryName);
- CTrackApp::OpenURL(sUrl);
- }
+ for(std::list<PLUGINDEX>::iterator i = notFoundIDs.begin(); i != notFoundIDs.end(); ++i)
+ {
+ CString sUrl;
+ sUrl.Format("http://www.kvraudio.com/search.php?q=%s&lq=db", m_MixPlugins[*i].Info.szLibraryName);
+ CTrackApp::OpenURL(sUrl);
+ }
}
// Set up mix levels
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2010-08-09 14:09:45
|
Revision: 680
http://modplug.svn.sourceforge.net/modplug/?rev=680&view=rev
Author: saga-games
Date: 2010-08-09 14:09:36 +0000 (Mon, 09 Aug 2010)
Log Message:
-----------
[New] In the MPTM format, each pattern can now have a custom time signature (rows per beat/measure) which can be set from the pattern properties dialog. The time signature is currently updated on every row, so it's not possible to temporarily modify it (f.e. using the mainbar controls), but that can still be done later (it might require quite some changes in some places).
[Reg] "Set highlights to songs' time signatures" is gone. Custom song highlighting is now always applied, and the values found in the colour options are now always applied to new modules.
[Mod] Updated MPTM format to contain pattern-specific time signatures.
[Ref] Some code refactoring related to the new feature mentioned above.
[Mod] OpenMPT: Version is now 1.19.00.00
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Childfrm.cpp
trunk/OpenMPT/mptrack/CleanupSong.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/EffectVis.cpp
trunk/OpenMPT/mptrack/MPTHacks.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainbar.cpp
trunk/OpenMPT/mptrack/Mainbar.h
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Moptions.h
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/Vstplug.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/dlg_misc.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/mptrack/version.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mt2.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
trunk/OpenMPT/soundlib/pattern.cpp
trunk/OpenMPT/soundlib/pattern.h
trunk/OpenMPT/soundlib/patternContainer.cpp
Modified: trunk/OpenMPT/mptrack/Childfrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Childfrm.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Childfrm.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -432,7 +432,6 @@
if (pMainFrm)
{
pMainFrm->UpdateEffectKeys();
- pMainFrm->UpdateHighlights();
}
}
//end rewbs.customKeysAutoEffects
Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -355,6 +355,8 @@
// Those vectors are needed for copying the old pattern properties to the new pattern number
vector<MODCOMMAND*> pPatterns(maxPatIndex, nullptr); // original pattern data
vector<ROWINDEX> nPatRows(maxPatIndex, 0); // original pattern sizes
+ vector<ROWINDEX> nPatRowsPerBeat(maxPatIndex, 0); // original pattern highlight
+ vector<ROWINDEX> nPatRowsPerMeasure(maxPatIndex, 0); // original pattern highlight
CHAR s[512];
bool bReordered = false;
@@ -480,6 +482,11 @@
}
nPatRows[k] = pSndFile->Patterns[i].GetNumRows();
pPatterns[k] = pSndFile->Patterns[i];
+ if(pSndFile->Patterns[i].GetOverrideSignature())
+ {
+ nPatRowsPerBeat[k] = pSndFile->Patterns[i].GetRowsPerBeat();
+ nPatRowsPerMeasure[k] = pSndFile->Patterns[i].GetRowsPerMeasure();
+ }
} else
if (pSndFile->Patterns[i])
{
@@ -490,6 +497,7 @@
for (PATTERNINDEX nPat = 0; nPat < maxPatIndex; nPat++)
{
pSndFile->Patterns[nPat].SetData(pPatterns[nPat], nPatRows[nPat]);
+ pSndFile->Patterns[nPat].SetSignature(nPatRowsPerBeat[nPat], nPatRowsPerMeasure[nPat]);
}
delete[] lpszpatnames;
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -779,17 +779,23 @@
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).nOrdLo;
- PATTERNINDEX pat = pSndFile->Order[nCurOrd];
+ PATTERNINDEX nCurPat = pSndFile->Order[nCurOrd];
ROWINDEX rows = 64;
- if(pSndFile->Patterns.IsValidPat(pat))
+ if(pSndFile->Patterns.IsValidPat(nCurPat))
{
nCurOrd++; // only if the current oder is already occupied, create a new pattern at the next position.
- rows = pSndFile->Patterns[pat].GetNumRows();
+ rows = pSndFile->Patterns[nCurPat].GetNumRows();
rows = CLAMP(rows, pSndFile->GetModSpecifications().patternRowsMin, pSndFile->GetModSpecifications().patternRowsMax);
}
PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nCurOrd, rows);
if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < pSndFile->Patterns.Size()))
{
+ // update time signature
+ if(pSndFile->Patterns.IsValidIndex(nCurPat) && pSndFile->Patterns[nCurPat].GetOverrideSignature())
+ {
+ pSndFile->Patterns[nNewPat].SetSignature(pSndFile->Patterns[nCurPat].GetRowsPerBeat(), pSndFile->Patterns[nCurPat].GetRowsPerMeasure());
+ }
+ // move to new pattern
m_OrderList.SetCurSel(nCurOrd);
m_OrderList.InvalidateRect(NULL, FALSE);
SetCurrentPattern(nNewPat);
@@ -823,7 +829,7 @@
{
PATTERNINDEX nCurPat = pSndFile->Order[selection.nOrdLo + i];
ROWINDEX rows = 64;
- if (nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID)
+ if (pSndFile->Patterns.IsValidIndex(nCurPat) && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID)
{
rows = pSndFile->Patterns[nCurPat].GetNumRows();
rows = CLAMP(rows, pSndFile->GetModSpecifications().patternRowsMin, pSndFile->GetModSpecifications().patternRowsMax);
@@ -831,6 +837,12 @@
PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nInsertWhere + i, rows);
if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nCurPat] != nullptr))
{
+ // update time signature
+ if(pSndFile->Patterns[nCurPat].GetOverrideSignature())
+ {
+ pSndFile->Patterns[nNewPat].SetSignature(pSndFile->Patterns[nCurPat].GetRowsPerBeat(), pSndFile->Patterns[nCurPat].GetRowsPerMeasure());
+ }
+ // copy pattern data
MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat];
MODCOMMAND *pDest = pSndFile->Patterns[nNewPat];
UINT n = pSndFile->Patterns[nCurPat].GetNumRows();
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -911,7 +911,7 @@
m_pModDoc->UpdateAllViews(NULL, (smp << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA | HINT_SMPNAMES);
if ((pSndFile->m_nInstruments) && (!m_pModDoc->FindSampleParent(smp)))
{
- if (MessageBox("This sample is not used by any instrument. Do you want to create a new instrument using this sample ?",
+ if (MessageBox("This sample is not used by any instrument. Do you want to create a new instrument using this sample?",
NULL, MB_YESNO|MB_ICONQUESTION) == IDYES)
{
UINT nins = m_pModDoc->InsertInstrument(smp);
@@ -1700,7 +1700,7 @@
//Open dialog
CPSRatioCalc dlg(pSmp->nLength, lSampleRate,
m_pSndFile->m_nMusicSpeed, m_pSndFile->m_nMusicTempo,
- m_pSndFile->m_nRowsPerBeat, m_pSndFile->m_nTempoMode,
+ m_pSndFile->m_nDefaultRowsPerBeat, m_pSndFile->m_nTempoMode,
m_dTimeStretchRatio, this);
if (dlg.DoModal() != IDOK) return;
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -746,18 +746,28 @@
bRowSel = ((row >= (m_dwBeginSel >> 16)) && (row <= (m_dwEndSel >> 16))) ? TRUE : FALSE;
row_col = MODCOLOR_TEXTNORMAL;
row_bkcol = MODCOLOR_BACKNORMAL;
+
+ // time signature highlighting
+ ROWINDEX nBeat = pSndFile->m_nDefaultRowsPerBeat, nMeasure = pSndFile->m_nDefaultRowsPerMeasure;
+ if(pSndFile->Patterns[nPattern].GetOverrideSignature())
+ {
+ nBeat = pSndFile->Patterns[nPattern].GetRowsPerBeat();
+ nMeasure = pSndFile->Patterns[nPattern].GetRowsPerMeasure();
+ }
+ // secondary highlight (beats)
if ((CMainFrame::m_dwPatternSetup & PATTERN_2NDHIGHLIGHT)
- && (CMainFrame::m_nRowSpacing2) && (CMainFrame::m_nRowSpacing2 < nrows))
+ && (nBeat) && (nBeat < nrows))
{
- if (!(row % CMainFrame::m_nRowSpacing2))
+ if (!(row % nBeat))
{
row_bkcol = MODCOLOR_2NDHIGHLIGHT;
}
}
+ // primary highlight (measures)
if ((CMainFrame::m_dwPatternSetup & PATTERN_STDHIGHLIGHT)
- && (CMainFrame::m_nRowSpacing) && (CMainFrame::m_nRowSpacing < nrows))
+ && (nMeasure) && (nMeasure < nrows))
{
- if (!(row % CMainFrame::m_nRowSpacing))
+ if (!(row % nMeasure))
{
row_bkcol = MODCOLOR_BACKHILIGHT;
}
Modified: trunk/OpenMPT/mptrack/EffectVis.cpp
===================================================================
--- trunk/OpenMPT/mptrack/EffectVis.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/EffectVis.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -266,11 +266,17 @@
{
// Lots of room for optimisation here.
// Draw vertical grid lines
+ ROWINDEX nBeat = m_pSndFile->m_nDefaultRowsPerBeat, nMeasure = m_pSndFile->m_nDefaultRowsPerMeasure;
+ if(m_pSndFile->Patterns[m_nPattern].GetOverrideSignature())
+ {
+ nBeat = m_pSndFile->Patterns[m_nPattern].GetRowsPerBeat();
+ nMeasure = m_pSndFile->Patterns[m_nPattern].GetRowsPerMeasure();
+ }
for (UINT row=m_startRow; row<=m_endRow; row++)
{
- if (row % m_pSndFile->m_nRowsPerMeasure == 0)
+ if (row % nMeasure == 0)
CMainFrame::penScratch = CMainFrame::penGrayff;
- else if (row % m_pSndFile->m_nRowsPerBeat == 0)
+ else if (row % nBeat == 0)
CMainFrame::penScratch = CMainFrame::penGray99;
else
CMainFrame::penScratch = CMainFrame::penGray55;
Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -128,7 +128,7 @@
{
AddToLog("Found too many patterns\n");
foundHacks = true;
- // REQUIRES AUTOFIX
+ // REQUIRES (INTELLIGENT) AUTOFIX
}
// Check for too big/small patterns
@@ -142,7 +142,7 @@
foundHacks = foundHere = true;
break;
}
- // REQUIRES AUTOFIX
+ // REQUIRES (INTELLIGENT) AUTOFIX
}
}
if(foundHere)
@@ -156,7 +156,7 @@
// Check for pattern names
foundHere = false;
- for(PATTERNINDEX i = 0; i < m_SndFile.Patterns.Size(); i++)
+ for(PATTERNINDEX i = 0; i < m_SndFile.GetNumPatterns(); i++)
{
if(m_SndFile.Patterns.IsValidPat(i))
{
@@ -181,7 +181,7 @@
{
AddToLog("Found incompatible channel count\n");
foundHacks = true;
- // REQUIRES AUTOFIX
+ // REQUIRES (INTELLIGENT) AUTOFIX
}
// Check for channel names
@@ -205,7 +205,7 @@
{
AddToLog("Found too many samples\n");
foundHacks = true;
- // REQUIRES AUTOFIX
+ // REQUIRES (INTELLIGENT) AUTOFIX
}
// Check for too many instruments
@@ -213,7 +213,7 @@
{
AddToLog("Found too many instruments\n");
foundHacks = true;
- // REQUIRES AUTOFIX
+ // REQUIRES (INTELLIGENT) AUTOFIX
}
// Check for instrument extensions
@@ -255,7 +255,7 @@
{
AddToLog("Found too many orders\n");
foundHacks = true;
- // REQUIRES AUTOFIX
+ // REQUIRES (INTELLIGENT) AUTOFIX
}
// Check for invalid default tempo
@@ -277,17 +277,38 @@
}
// Check for invalid rows per beat / measure values
- if(m_SndFile.m_nRowsPerBeat >= originalSpecs->patternRowsMax || m_SndFile.m_nRowsPerMeasure >= originalSpecs->patternRowsMax)
+ if(m_SndFile.m_nDefaultRowsPerBeat >= originalSpecs->patternRowsMax || m_SndFile.m_nDefaultRowsPerMeasure >= 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));
+ m_SndFile.m_nDefaultRowsPerBeat = CLAMP(m_SndFile.m_nDefaultRowsPerBeat, 1, (originalSpecs->patternRowsMax - 1));
+ m_SndFile.m_nDefaultRowsPerMeasure = CLAMP(m_SndFile.m_nDefaultRowsPerMeasure, m_SndFile.m_nDefaultRowsPerBeat, (originalSpecs->patternRowsMax - 1));
}
}
+ // Find pattern-specific time signatures
+ if(!originalSpecs->hasPatternSignatures)
+ {
+ foundHere = false;
+ for(PATTERNINDEX i = 0; i < m_SndFile.GetNumPatterns(); i++)
+ {
+ if(m_SndFile.Patterns[i].GetOverrideSignature())
+ {
+ if(!foundHere)
+ AddToLog("Found pattern-specific time signatures\n");
+
+ if(autofix)
+ m_SndFile.Patterns[i].RemoveSignature();
+
+ foundHacks = foundHere = true;
+ if(!autofix)
+ break;
+ }
+ }
+ }
+
// Check for new tempo modes
if(m_SndFile.m_nTempoMode != tempo_mode_classic)
{
@@ -316,7 +337,7 @@
}
// Player flags
- if(!m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY))
+ if((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT)) && !m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY))
{
AddToLog("Compatible play is deactivated\n");
foundHacks = true;
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -200,10 +200,10 @@
DWORD CMainFrame::m_dwPatternSetup = PATTERN_PLAYNEWNOTE | PATTERN_EFFECTHILIGHT
| PATTERN_SMALLFONT | PATTERN_CENTERROW
| PATTERN_DRAGNDROPEDIT | PATTERN_FLATBUTTONS
- | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT | PATTERN_HILITETIMESIGS
+ | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT /*| PATTERN_HILITETIMESIGS*/
| PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE;
-DWORD CMainFrame::m_nRowSpacing = 16;
-DWORD CMainFrame::m_nRowSpacing2 = 4;
+DWORD CMainFrame::m_nRowSpacing = 16; // primary highlight (measures)
+DWORD CMainFrame::m_nRowSpacing2 = 4; // secondary highlight (beats)
UINT CMainFrame::m_nSampleUndoMaxBuffer = 0; // Real sample buffer undo size will be set later.
// GDI
@@ -438,8 +438,8 @@
m_dwPatternSetup |= PATTERN_NOTEFADE;
if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,01))
m_dwPatternSetup |= PATTERN_RESETCHANNELS;
- if(vIniVersion < MAKE_VERSION_NUMERIC(1,18,01,00))
- m_dwPatternSetup &= ~0x800; // quick paste autorepeat is now a keymap option
+ if(vIniVersion < MAKE_VERSION_NUMERIC(1,19,00,00))
+ m_dwPatternSetup &= ~(0x800|0x200000|0x400000); // various deprecated old options
m_nRowSpacing = GetPrivateProfileDWord("Pattern Editor", "RowSpacing", 16, iniFile);
m_nRowSpacing2 = GetPrivateProfileDWord("Pattern Editor", "RowSpacing2", 4, iniFile);
@@ -902,8 +902,6 @@
//------------------------
{
CChildFrame *pMDIActive = (CChildFrame *)MDIGetActive();
- CRect rect;
- //HKEY key;
BeginWaitCursor();
if (m_dwStatus & MODSTATUS_PLAYING) PauseMod();
@@ -925,6 +923,7 @@
}
void CMainFrame::SaveIniSettings()
+//--------------------------------
{
CString iniFile = theApp.GetConfigFileName();
@@ -2975,30 +2974,7 @@
}
//end rewbs.customKeys
-bool CMainFrame::UpdateHighlights()
-//---------------------------------
-{
- if (!(CMainFrame::m_dwPatternSetup & PATTERN_HILITETIMESIGS))
- return false;
- CModDoc* pModDoc = GetActiveDoc();
- if (pModDoc)
- {
- CSoundFile* pSndFile = pModDoc->GetSoundFile();
- if (pSndFile)
- {
- if (CMainFrame::m_dwPatternSetup&PATTERN_HILITETIMESIGS) {
- CMainFrame::m_nRowSpacing = pSndFile->m_nRowsPerMeasure;
- CMainFrame::m_nRowSpacing2 = pSndFile->m_nRowsPerBeat;
- }
- return true;
- }
- }
-
- return false;
-}
-
-
//rewbs.fix3116
void CMainFrame::OnKillFocus(CWnd* pNewWnd)
//-----------------------------------------
Modified: trunk/OpenMPT/mptrack/Mainbar.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mainbar.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Mainbar.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -441,7 +441,7 @@
wsprintf(s, "%d", nCurrentTempo);
m_EditTempo.SetWindowText(s);
}
- int nRowsPerBeat = pSndFile->m_nRowsPerBeat;
+ int nRowsPerBeat = pSndFile->m_nCurrentRowsPerBeat;
if (nRowsPerBeat != nCurrentRowsPerBeat)
{
if (nCurrentRowsPerBeat < 0) m_SpinRowsPerBeat.EnableWindow(TRUE);
@@ -489,7 +489,6 @@
if ((nCurrentSpeed < 0) || (nCurrentTempo < 0)) return;
if ((pMainFrm = CMainFrame::GetMainFrame()) != NULL)
{
- CModDoc *pModDoc = pMainFrm->GetModPlaying();
CSoundFile *pSndFile = pMainFrm->GetSoundFilePlaying();
if (pSndFile)
{
@@ -520,15 +519,13 @@
{
if (nCurrentRowsPerBeat > 1)
{
- pSndFile->m_nRowsPerBeat = nCurrentRowsPerBeat - 1;
- pModDoc->SetModified(true);
+ SetRowsPerBeat(nCurrentRowsPerBeat - 1);
}
} else
{
- if (nCurrentRowsPerBeat < 64)
+ if (nCurrentRowsPerBeat < pSndFile->m_nCurrentRowsPerMeasure)
{
- pSndFile->m_nRowsPerBeat = nCurrentRowsPerBeat + 1;
- pModDoc->SetModified(true);
+ SetRowsPerBeat(nCurrentRowsPerBeat + 1);
}
}
m_SpinRowsPerBeat.SetPos(0);
@@ -536,8 +533,8 @@
//update pattern editor
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
- if (pMainFrm) {
- pMainFrm->UpdateHighlights();
+ if (pMainFrm)
+ {
pMainFrm->PostMessage(WM_MOD_INVALIDATEPATTERNS, HINT_MPTOPTIONS);
}
}
@@ -548,6 +545,37 @@
}
+void CMainToolBar::SetRowsPerBeat(ROWINDEX nNewRPB)
+//-------------------------------------------------
+{
+ CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
+ if(pMainFrm == nullptr)
+ return;
+ CModDoc *pModDoc = pMainFrm->GetModPlaying();
+ CSoundFile *pSndFile = pMainFrm->GetSoundFilePlaying();
+ if(pModDoc == nullptr || pSndFile == nullptr)
+ return;
+
+ pSndFile->m_nCurrentRowsPerBeat = nNewRPB;
+ PATTERNINDEX nPat = pSndFile->GetCurrentPattern();
+ if(pSndFile->Patterns[nPat].GetOverrideSignature())
+ {
+ if(nNewRPB <= pSndFile->Patterns[nPat].GetRowsPerMeasure())
+ {
+ pSndFile->Patterns[nPat].SetSignature(nNewRPB, pSndFile->Patterns[nPat].GetRowsPerMeasure());
+ pModDoc->SetModified();
+ }
+ } else
+ {
+ if(nNewRPB <= pSndFile->m_nDefaultRowsPerMeasure)
+ {
+ pSndFile->m_nDefaultRowsPerBeat = nNewRPB;
+ pModDoc->SetModified();
+ }
+ }
+}
+
+
///////////////////////////////////////////////////////////////////////////////////////////////////
// CModTreeBar
Modified: trunk/OpenMPT/mptrack/Mainbar.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainbar.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Mainbar.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -47,6 +47,9 @@
CMainToolBar() {}
virtual ~CMainToolBar() {}
+protected:
+ void SetRowsPerBeat(ROWINDEX nNewRPB);
+
public:
//{{AFX_VIRTUAL(CMainToolBar)
virtual BOOL SetHorizontal();
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -25,7 +25,6 @@
#define MIN_AUDIO_BUFFERSIZE 1024
#define MAX_AUDIO_BUFFERSIZE 32768 // 32K buffers max
#define MAINFRAME_TITLE "Open Modplug Tracker"
-#define INFORMAL_VERSION "1.17RC3_"
#define INIBUFFERSIZE MAX_PATH
enum {
@@ -185,7 +184,7 @@
#define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default
#define PATTERN_MIDIRECORD 0x100000 // MIDI Record on by default
//#define PATTERN_ALTERNTIVEBPMSPEED 0x200000 // deprecated
-#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature
+//#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature, deprecated (now always enabled)
#define PATTERN_OLDCTXMENUSTYLE 0x800000 // mpt 1.16 pattern context menu style
#define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute
#define PATTERN_AUTODELAY 0x2000000 // automatically insert delay commands in pattern when entering notes
@@ -430,7 +429,8 @@
// Pattern Setup
static UINT gnPatternSpacing;
static BOOL gbPatternVUMeters, gbPatternPluginNames, gbPatternRecord;
- static DWORD m_dwPatternSetup, m_dwMidiSetup, m_nRowSpacing, m_nRowSpacing2, m_nKeyboardCfg, gnHotKeyMask;
+ static DWORD m_dwPatternSetup, m_dwMidiSetup, m_nKeyboardCfg, gnHotKeyMask;
+ static DWORD m_nRowSpacing, m_nRowSpacing2; // primary (measures) and secondary (beats) highlight
static bool m_bHideUnavailableCtxMenuItems;
// Sample Editor Setup
static UINT m_nSampleUndoMaxBuffer;
@@ -697,7 +697,6 @@
public:
afx_msg void OnInitMenu(CMenu* pMenu);
bool UpdateEffectKeys(void);
- bool UpdateHighlights(void);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -2046,7 +2046,7 @@
{
case tempo_mode_alternative:
Message.Format("Using alternative tempo interpretation.\n\nAssuming:\n. %d ticks per second\n. %d ticks per row\n. %d rows per beat\nthe tempo is approximately: %.20g BPM",
- m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nRowsPerBeat, bpm);
+ m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nCurrentRowsPerBeat, bpm);
break;
case tempo_mode_modern:
@@ -2056,7 +2056,7 @@
case tempo_mode_classic:
default:
Message.Format("Using standard tempo interpretation.\n\nAssuming:\n. A mod tempo (tick duration factor) of %d\n. %d ticks per row\n. %d rows per beat\nthe tempo is approximately: %.20g BPM",
- m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nRowsPerBeat, bpm);
+ m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nCurrentRowsPerBeat, bpm);
break;
}
@@ -3614,8 +3614,12 @@
if(ChangeNumChannels(nNewChannels, showCancelInRemoveDlg)) bShowLog = true;
}
+ // Force update of pattern highlights
+ UpdateAllViews(NULL, HINT_PATTERNDATA);
+
+ SetModified();
+
if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame());
- SetModified();
}
}
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -368,6 +368,19 @@
}
}
+ // Check for patterns with custom time signatures (fixing will be applied in the pattern container)
+ if(!CSoundFile::GetModSpecifications(nNewType).hasPatternSignatures)
+ {
+ for(PATTERNINDEX nPat = 0; nPat < m_SndFile.GetNumPatterns(); nPat++)
+ {
+ if(m_SndFile.Patterns[nPat].GetOverrideSignature())
+ {
+ AddToLog("WARNING: Pattern-specific time signatures are not supported by the new format.\n");
+ break;
+ }
+ }
+ }
+
BEGIN_CRITICAL();
m_SndFile.ChangeModTypeTo(nNewType);
if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES))
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -58,7 +58,6 @@
ON_COMMAND(IDC_CHECK2, OnPreviewChanged)
ON_COMMAND(IDC_CHECK3, OnSettingsChanged)
ON_COMMAND(IDC_CHECK4, OnPreviewChanged)
- ON_COMMAND(IDC_CHECK5, OnHiliteTimeSigsChanged)
END_MESSAGE_MAP()
@@ -98,11 +97,6 @@
SetDlgItemInt(IDC_PRIMARYHILITE, CMainFrame::m_nRowSpacing);
SetDlgItemInt(IDC_SECONDARYHILITE, CMainFrame::m_nRowSpacing2);
- if (CMainFrame::m_dwPatternSetup & PATTERN_HILITETIMESIGS) CheckDlgButton(IDC_CHECK5, MF_CHECKED);
- GetDlgItem(IDC_PRIMARYHILITE)->EnableWindow(!IsDlgButtonChecked(IDC_CHECK5));
- GetDlgItem(IDC_SECONDARYHILITE)->EnableWindow(!IsDlgButtonChecked(IDC_CHECK5));
-
-
OnColorSelChanged();
return TRUE;
}
@@ -114,9 +108,9 @@
int temp_nRowSpacing = GetDlgItemInt(IDC_PRIMARYHILITE);
int temp_nRowSpacing2 = GetDlgItemInt(IDC_SECONDARYHILITE);
- if ((temp_nRowSpacing2 >= temp_nRowSpacing))
+ if ((temp_nRowSpacing2 > temp_nRowSpacing))
{
- ::AfxMessageBox("Error: Primary highlight must be greater than secondary highlight.", MB_OK|MB_ICONEXCLAMATION);
+ ::AfxMessageBox("Error: Primary highlight must be greater than or equal secondary highlight.", MB_OK|MB_ICONEXCLAMATION);
::SetFocus(::GetDlgItem(m_hWnd, IDC_PRIMARYHILITE));
return 0;
}
@@ -127,12 +121,11 @@
void COptionsColors::OnOK()
//-------------------------
{
- CMainFrame::m_dwPatternSetup &= ~(PATTERN_STDHIGHLIGHT|PATTERN_2NDHIGHLIGHT|PATTERN_EFFECTHILIGHT|PATTERN_SMALLFONT|PATTERN_HILITETIMESIGS);
+ CMainFrame::m_dwPatternSetup &= ~(PATTERN_STDHIGHLIGHT|PATTERN_2NDHIGHLIGHT|PATTERN_EFFECTHILIGHT|PATTERN_SMALLFONT);
if (IsDlgButtonChecked(IDC_CHECK1)) CMainFrame::m_dwPatternSetup |= PATTERN_STDHIGHLIGHT;
if (IsDlgButtonChecked(IDC_CHECK2)) CMainFrame::m_dwPatternSetup |= PATTERN_EFFECTHILIGHT;
if (IsDlgButtonChecked(IDC_CHECK3)) CMainFrame::m_dwPatternSetup |= PATTERN_SMALLFONT;
if (IsDlgButtonChecked(IDC_CHECK4)) CMainFrame::m_dwPatternSetup |= PATTERN_2NDHIGHLIGHT;
- if (IsDlgButtonChecked(IDC_CHECK5)) CMainFrame::m_dwPatternSetup |= PATTERN_HILITETIMESIGS;
CMainFrame::m_nRowSpacing = GetDlgItemInt(IDC_PRIMARYHILITE);
CMainFrame::m_nRowSpacing2 = GetDlgItemInt(IDC_SECONDARYHILITE);
@@ -335,19 +328,6 @@
SetModified(TRUE);
}
-void COptionsColors::OnHiliteTimeSigsChanged()
-//--------------------------------------
-{
- bool enabling = !IsDlgButtonChecked(IDC_CHECK5);
- if (enabling) {
- SetDlgItemInt(IDC_PRIMARYHILITE, CMainFrame::m_nRowSpacing);
- SetDlgItemInt(IDC_SECONDARYHILITE, CMainFrame::m_nRowSpacing2);
- }
- GetDlgItem(IDC_PRIMARYHILITE)->EnableWindow(enabling);
- GetDlgItem(IDC_SECONDARYHILITE)->EnableWindow(enabling);
- OnSettingsChanged();
-}
-
void COptionsColors::OnUpdateDialog()
//-----------------------------------
{
Modified: trunk/OpenMPT/mptrack/Moptions.h
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Moptions.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -73,7 +73,6 @@
afx_msg void OnDrawItem(int nIdCtl, LPDRAWITEMSTRUCT lpdis);
afx_msg void OnColorSelChanged();
afx_msg void OnSettingsChanged();
- afx_msg void OnHiliteTimeSigsChanged();
afx_msg void OnSelectColor1();
afx_msg void OnSelectColor2();
afx_msg void OnSelectColor3();
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -1824,10 +1824,10 @@
SetDlgItemText(IDC_EDIT3, CString("OpenMPT ") + MptVersion::str + " (development build)");
m_heContact.SetWindowText(
-"Contact / Discussion:\r\n\
-http://openmpt.com/forum/\r\n\
-\r\nUpdates:\r\n\
-http://sourceforge.net/projects/modplug/");
+ "Contact / Discussion:\r\n"
+ "http://openmpt.com/forum/\r\n"
+ "\r\nUpdates:\r\n"
+ "http://sourceforge.net/projects/modplug/");
const char* const pArrCredit = {
"OpenMPT / Modplug Tracker|"
@@ -1869,7 +1869,7 @@
"LPChip, Ganja, Diamond, Nofold, Goor00, Georg|"
"Skilletaudio, Squirrel Havoc, Snu, Anboi|"
"Sam Zen, BooT-SectoR-ViruZ, 33, Waxhead|"
- "KrazyKatz, Bvanoudtshoorn|"
+ "KrazyKatz, Bvanoudtshoorn, Skaven|"
"|||||||"
"VST PlugIn Technology by Steinberg Media Technologies GmbH|"
"ASIO Technology by Steinberg Media Technologies GmbH|"
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -780,20 +780,28 @@
m_pbmpOldGrid = m_dcGrid.SelectObject(&m_bmpGrid);
//do draw
- int width=m_rcClient.right-m_rcClient.left;
- int nPrevTick=-1;
+ CSoundFile *pSndFile;
+ int width = m_rcClient.right - m_rcClient.left;
+ int nPrevTick = -1;
int nTick, nRow;
- for (int x=3; x<width; x++)
+ int nRowsPerBeat = 1, nRowsPerMeasure = 1;
+ if(GetDocument() != nullptr && (pSndFile = GetDocument()->GetSoundFile()) != nullptr)
{
+ nRowsPerBeat = pSndFile->m_nDefaultRowsPerBeat;
+ nRowsPerMeasure = pSndFile->m_nDefaultRowsPerMeasure;
+ }
+
+ for (int x = 3; x < width; x++)
+ {
nTick = QuickScreenToTick(x, cachedScrollPos);
if (nTick != nPrevTick && !(nTick%speed))
{
- nPrevTick=nTick;
- nRow=nTick/speed;
+ nPrevTick = nTick;
+ nRow = nTick / speed;
- if (nRow % max(1, CMainFrame::m_nRowSpacing) == 0)
+ if (nRow % max(1, nRowsPerMeasure) == 0)
m_dcGrid.SelectObject(CMainFrame::penGray80);
- else if (nRow % max(1, CMainFrame::m_nRowSpacing2) == 0)
+ else if (nRow % max(1, nRowsPerBeat) == 0)
m_dcGrid.SelectObject(CMainFrame::penGray55);
else
m_dcGrid.SelectObject(CMainFrame::penGray33);
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -1142,7 +1142,7 @@
//--------------------------------------
{
CModDoc *pModDoc = GetDocument();
- if (pModDoc)
+ if (pModDoc && pModDoc->GetSoundFile() && pModDoc->GetSoundFile()->Patterns.IsValidPat(m_nPattern))
{
CPatternPropertiesDlg dlg(pModDoc, m_nPattern, this);
if (dlg.DoModal())
@@ -2583,7 +2583,8 @@
BeginWaitCursor();
//First adding channel as the last channel...
- if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) {
+ if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels + 1))
+ {
pSndFile->InitChannel(pSndFile->m_nChannels-1);
//...and then moving it to right position.
pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn);
@@ -2607,7 +2608,8 @@
if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return;
BeginWaitCursor();
- if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) {
+ if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels + 1))
+ {
pSndFile->InitChannel(pSndFile->m_nChannels-1);
pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn);
@@ -3476,6 +3478,7 @@
}
+
LRESULT CViewPattern::OnCustomKeyMsg(WPARAM wParam, LPARAM /*lParam*/)
//----------------------------------------------------------------
{
@@ -3523,22 +3526,22 @@
// Pattern navigation:
case kcPatternJumpUph1Select:
- case kcPatternJumpUph1: CursorJump(CMainFrame::m_nRowSpacing, true, false); return wParam;
+ case kcPatternJumpUph1: CursorJump(GetRowsPerMeasure(), true, false); return wParam;
case kcPatternJumpDownh1Select:
- case kcPatternJumpDownh1: CursorJump(CMainFrame::m_nRowSpacing, false, false); return wParam;
+ case kcPatternJumpDownh1: CursorJump(GetRowsPerMeasure(), false, false); return wParam;
case kcPatternJumpUph2Select:
- case kcPatternJumpUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, false); return wParam;
+ case kcPatternJumpUph2: CursorJump(GetRowsPerBeat(), true, false); return wParam;
case kcPatternJumpDownh2Select:
- case kcPatternJumpDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, false); return wParam;
+ case kcPatternJumpDownh2: CursorJump(GetRowsPerBeat(), false, false); return wParam;
case kcPatternSnapUph1Select:
- case kcPatternSnapUph1: CursorJump(CMainFrame::m_nRowSpacing, true, true); return wParam;
+ case kcPatternSnapUph1: CursorJump(GetRowsPerMeasure(), true, true); return wParam;
case kcPatternSnapDownh1Select:
- case kcPatternSnapDownh1: CursorJump(CMainFrame::m_nRowSpacing, false, true); return wParam;
+ case kcPatternSnapDownh1: CursorJump(GetRowsPerMeasure(), false, true); return wParam;
case kcPatternSnapUph2Select:
- case kcPatternSnapUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, true); return wParam;
+ case kcPatternSnapUph2: CursorJump(GetRowsPerBeat(), true, true); return wParam;
case kcPatternSnapDownh2Select:
- case kcPatternSnapDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, true); return wParam;
+ case kcPatternSnapDownh2: CursorJump(GetRowsPerBeat(), false, true); return wParam;
case kcNavigateDownSelect:
case kcNavigateDown: SetCurrentRow(m_nRow+1, TRUE); return wParam;
@@ -4085,7 +4088,7 @@
void CViewPattern::TempEnterOctave(int val)
-//---------------------------------------------
+//-----------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
CModDoc *pModDoc = GetDocument();
@@ -5436,3 +5439,29 @@
PLUGINDEX nPlg = (PLUGINDEX)(mSelStart->instr - 1);
pModDoc->TogglePluginEditor(nPlg);
}
+
+
+ROWINDEX CViewPattern::GetRowsPerBeat() const
+//-------------------------------------------
+{
+ CSoundFile *pSndFile;
+ if(GetDocument() == nullptr || (pSndFile = GetDocument()->GetSoundFile()) == nullptr)
+ return 0;
+ if(!pSndFile->Patterns[m_nPattern].GetOverrideSignature())
+ return pSndFile->m_nDefaultRowsPerBeat;
+ else
+ return pSndFile->Patterns[m_nPattern].GetRowsPerBeat();
+}
+
+
+ROWINDEX CViewPattern::GetRowsPerMeasure() const
+//----------------------------------------------
+{
+ CSoundFile *pSndFile;
+ if(GetDocument() == nullptr || (pSndFile = GetDocument()->GetSoundFile()) == nullptr)
+ return 0;
+ if(!pSndFile->Patterns[m_nPattern].GetOverrideSignature())
+ return pSndFile->m_nDefaultRowsPerMeasure;
+ else
+ return pSndFile->Patterns[m_nPattern].GetRowsPerMeasure();
+}
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/View_pat.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -130,6 +130,7 @@
void UpdateIndicator();
void UpdateXInfoText(); //rewbs.xinfo
void UpdateColors();
+
int GetXScrollPos() const { return m_nXScroll; }
int GetYScrollPos() const { return m_nYScroll; }
int GetColumnWidth() const { return m_szCell.cx; }
@@ -142,6 +143,9 @@
POINT GetPointFromPosition(DWORD dwPos);
DWORD GetPositionFromPoint(POINT pt);
DWORD GetDragItem(CPoint point, LPRECT lpRect);
+ ROWINDEX GetRowsPerBeat() const;
+ ROWINDEX GetRowsPerMeasure() const;
+
void InvalidatePattern(BOOL bHdr=FALSE);
void InvalidateRow(int n=-1);
void InvalidateArea(DWORD dwBegin, DWORD dwEnd);
Modified: trunk/OpenMPT/mptrack/Vstplug.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -778,8 +778,8 @@
}
if ((value & kVstTimeSigValid) && pSndFile) {
timeInfo.flags |= kVstTimeSigValid;
- timeInfo.timeSigNumerator = pSndFile->m_nRowsPerBeat;
- timeInfo.timeSigDenominator = pSndFile->m_nRowsPerMeasure;
+ timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerBeat;
+ timeInfo.timeSigDenominator = pSndFile->m_nCurrentRowsPerMeasure;
}
}
return (long)&timeInfo;
@@ -1460,8 +1460,6 @@
VOID CSelectPluginDlg::OnAddPlugin()
//----------------------------------
{
- CHAR *pszFileNames;
-
FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog(true, "dll", "",
"VST Plugins (*.dll)|*.dll||",
CMainFrame::GetWorkingDirectory(DIR_PLUGINS),
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -144,8 +144,8 @@
m_nType = m_pSndFile->m_nType;
m_nChannels = m_pSndFile->m_nChannels;
m_dwSongFlags = m_pSndFile->m_dwSongFlags;
- SetDlgItemInt(IDC_ROWSPERBEAT, m_pSndFile->m_nRowsPerBeat);
- SetDlgItemInt(IDC_ROWSPERMEASURE, m_pSndFile->m_nRowsPerMeasure);
+ SetDlgItemInt(IDC_ROWSPERBEAT, m_pSndFile->m_nDefaultRowsPerBeat);
+ SetDlgItemInt(IDC_ROWSPERMEASURE, m_pSndFile->m_nDefaultRowsPerMeasure);
m_TypeBox.SetItemData(m_TypeBox.AddString("ProTracker MOD"), MOD_TYPE_MOD);
m_TypeBox.SetItemData(m_TypeBox.AddString("ScreamTracker S3M"), MOD_TYPE_S3M);
@@ -397,9 +397,9 @@
int temp_nRPB = GetDlgItemInt(IDC_ROWSPERBEAT);
int temp_nRPM = GetDlgItemInt(IDC_ROWSPERMEASURE);
- if ((temp_nRPB >= temp_nRPM))
+ if ((temp_nRPB > temp_nRPM))
{
- ::AfxMessageBox("Error: Rows per measure must be greater than rows per beat.", MB_OK|MB_ICONEXCLAMATION);
+ ::AfxMessageBox("Error: Rows per measure must be greater than or equal rows per beat.", MB_OK|MB_ICONEXCLAMATION);
GetDlgItem(IDC_ROWSPERMEASURE)->SetFocus();
return false;
}
@@ -454,12 +454,14 @@
}
sel = m_TempoModeBox.GetCurSel();
- if (sel >= 0) {
+ if (sel >= 0)
+ {
m_pSndFile->m_nTempoMode = m_TempoModeBox.GetItemData(sel);
}
sel = m_PlugMixBox.GetCurSel();
- if (sel >= 0) {
+ if (sel >= 0)
+ {
m_pSndFile->m_nMixLevels = m_PlugMixBox.GetItemData(sel);
m_pSndFile->m_pConfig->SetMixLevels(m_pSndFile->m_nMixLevels);
m_pSndFile->RecalculateGainForAllPlugs();
@@ -473,9 +475,8 @@
if(IsDlgButtonChecked(IDC_CHK_OLDRANDOM)) m_pSndFile->SetModFlag(MSF_OLDVOLSWING, true);
}
- m_pSndFile->m_nRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT);
- m_pSndFile->m_nRowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE);
-
+ m_pSndFile->m_nDefaultRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT);
+ m_pSndFile->m_nDefaultRowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE);
if(CChannelManagerDlg::sharedInstance(FALSE) && CChannelManagerDlg::sharedInstance()->IsDisplayed())
CChannelManagerDlg::sharedInstance()->Update();
@@ -975,18 +976,21 @@
}
// Effect
int effectIndex = -1;
- if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) && (m_pModDoc)) {
+ if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) && (m_pModDoc))
+ {
int n = -1; // unused parameter adjustment
effectIndex = combo->GetItemData(combo->GetCurSel());
m_nCommand = m_pModDoc->GetEffectFromIndex(effectIndex, n);
}
// Param
m_nParam = 0;
- if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO6)) != NULL) {
+ if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO6)) != NULL)
+ {
m_nParam = combo->GetItemData(combo->GetCurSel());
// Apply parameter value mask if required (e.g. SDx has mask D0).
- if (effectIndex > -1) {
+ if (effectIndex > -1)
+ {
m_nParam |= m_pModDoc->GetEffectMaskFromIndex(effectIndex);
}
}
@@ -1007,6 +1011,7 @@
BEGIN_MESSAGE_MAP(CPatternPropertiesDlg, CDialog)
ON_COMMAND(IDC_BUTTON_HALF, OnHalfRowNumber)
ON_COMMAND(IDC_BUTTON_DOUBLE, OnDoubleRowNumber)
+ ON_COMMAND(IDC_CHECK1, OnOverrideSignature)
END_MESSAGE_MAP()
BOOL CPatternPropertiesDlg::OnInitDialog()
@@ -1015,30 +1020,47 @@
CComboBox *combo;
CDialog::OnInitDialog();
combo = (CComboBox *)GetDlgItem(IDC_COMBO1);
- CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : NULL;
+ const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr;
if ((pSndFile) && (m_nPattern < pSndFile->Patterns.Size()) && (combo))
{
CHAR s[256];
UINT nrows = pSndFile->Patterns[m_nPattern].GetNumRows();
-// -> CODE#0008
-// -> DESC="#define to set pattern size"
-// for (UINT irow=32; irow<=256; irow++)
-// for (UINT irow=32; irow<=MAX_PATTERN_ROWS; irow++)
const CModSpecifications& specs = pSndFile->GetModSpecifications();
- for (UINT irow=specs.patternRowsMin; irow<=specs.patternRowsMax; irow++)
-// -! BEHAVIOUR_CHANGE#0008
+ for (UINT irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++)
{
wsprintf(s, "%d", irow);
combo->AddString(s);
}
combo->SetCurSel(nrows - specs.patternRowsMin);
- wsprintf(s, "Pattern #%d:\x0d\x0a %d row%s (%dK)",
+ wsprintf(s, "Pattern #%d: %d row%s (%dK)",
m_nPattern,
pSndFile->Patterns[m_nPattern].GetNumRows(),
(pSndFile->Patterns[m_nPattern].GetNumRows() == 1) ? "" : "s",
- (pSndFile->Patterns[m_nPattern].GetNumRows() * pSndFile->m_nChannels * sizeof(MODCOMMAND))/1024);
+ (pSndFile->Patterns[m_nPattern].GetNumRows() * pSndFile->m_nChannels * sizeof(MODCOMMAND)) / 1024);
SetDlgItemText(IDC_TEXT1, s);
+
+ // Window title
+ CHAR szName[MAX_PATTERNNAME + 2];
+ pSndFile->GetPatternName(m_nPattern, szName, MAX_PATTERNNAME);
+ if(strlen(szName))
+ {
+ strcat(szName, ")");
+ }
+ wsprintf(s, "Pattern Properties for Pattern #%d%s%s", m_nPattern, strlen(szName) ? " (" : "", szName);
+ SetWindowText(s);
+
+ // pattern time signature
+ const bool bOverride = pSndFile->Patterns[m_nPattern].GetOverrideSignature();
+ UINT nRPB = pSndFile->Patterns[m_nPattern].GetRowsPerBeat(), nRPM = pSndFile->Patterns[m_nPattern].GetRowsPerMeasure();
+ if(nRPB == 0 || !bOverride) nRPB = pSndFile->m_nDefaultRowsPerBeat;
+ if(nRPM == 0 || !bOverride) nRPM = pSndFile->m_nDefaultRowsPerMeasure;
+
+ GetDlgItem(IDC_CHECK1)->EnableWindow(pSndFile->GetModSpecifications().hasPatternSignatures ? TRUE : FALSE);
+ CheckDlgButton(IDC_CHECK1, bOverride ? MF_CHECKED : MF_UNCHECKED);
+ SetDlgItemInt(IDC_EDIT_ROWSPERBEAT, nRPB, FALSE);
+ SetDlgItemInt(IDC_EDIT_ROWSPERMEASURE, nRPM, FALSE);
+ OnOverrideSignature();
}
return TRUE;
}
@@ -1047,50 +1069,76 @@
void CPatternPropertiesDlg::OnHalfRowNumber()
//-------------------------------------------
{
- CComboBox *combo;
- CString str;
- combo = (CComboBox *)GetDlgItem(IDC_COMBO1);
- if(combo->GetCount() < 1) return;
- if(combo->GetCurSel() == CB_ERR) combo->SetCurSel(0);
+ const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr;
+ if(pSndFile == nullptr)
+ return;
- combo->GetLBText(combo->GetCurSel(), str);
- int sel = atoi(str)/2;
- combo->GetLBText(0, str);
- const int row0 = atoi(str);
- if(sel < row0) sel = row0;
- combo->SetCurSel(sel - row0);
+ UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE);
+ nRows /= 2;
+ if(nRows < pSndFile->GetModSpecifications().patternRowsMin)
+ nRows = pSndFile->GetModSpecifications().patternRowsMin;
+ SetDlgItemInt(IDC_COMBO1, nRows, FALSE);
}
void CPatternPropertiesDlg::OnDoubleRowNumber()
//---------------------------------------------
{
- CComboBox *combo;
- CString str;
- combo = (CComboBox *)GetDlgItem(IDC_COMBO1);
- if(combo->GetCount() < 1) return;
- if(combo->GetCurSel() == CB_ERR) combo->SetCurSel(0);
+ const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr;
+ if(pSndFile == nullptr)
+ return;
- combo->GetLBText(combo->GetCurSel(), str);
- int sel = 2*atoi(str);
- combo->GetLBText(0, str);
- const int row0 = atoi(str);
- combo->GetLBText(combo->GetCount()-1, str);
- if(sel > atoi(str)) sel = atoi(str);
- combo->SetCurSel(sel - row0);
+ UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE);
+ nRows *= 2;
+ if(nRows > pSndFile->GetModSpecifications().patternRowsMax)
+ nRows = pSndFile->GetModSpecifications().patternRowsMax;
+ SetDlgItemInt(IDC_COMBO1, nRows, FALSE);
}
+void CPatternPropertiesDlg::OnOverrideSignature()
+//-----------------------------------------------
+{
+ GetDlgItem(IDC_EDIT_ROWSPERBEAT)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1));
+ GetDlgItem(IDC_EDIT_ROWSPERMEASURE)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1));
+}
+
+
void CPatternPropertiesDlg::OnOK()
//--------------------------------
{
- int n = GetDlgItemInt(IDC_COMBO1);
-// -> CODE#0008
-// -> DESC="#define to set pattern size"
-// if ((n >= 2) && (n <= 256) && (m_pModDoc)) m_pModDoc->ResizePattern(m_nPattern, n);
- //if ((n >= 2) && (n <= MAX_PATTERN_ROWS) && (m_pModDoc)) m_pModDoc->ResizePattern(m_nPattern, n);
- if(m_pModDoc) m_pModDoc->GetSoundFile()->Patterns[m_nPattern].Resize(n);
-// -! BEHAVIOUR_CHANGE#0008
+ CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr;
+ if(pSndFile)
+ {
+ // Update pattern signature if necessary
+ if(pSndFile->GetModSpecifications().hasPatternSignatures)
+ {
+ if(IsDlgButtonChecked(IDC_CHECK1)) // Enable signature
+ {
+ ROWINDEX nNewBeat = (ROWINDEX)GetDlgItemInt(IDC_EDIT_ROWSPERBEAT, NULL, FALSE), nNewMeasure = (ROWINDEX)GetDlgItemInt(IDC_EDIT_ROWSPERMEASURE, NULL, FALSE);
+ if(nNewBeat != pSndFile->Patterns[m_nPattern].GetRowsPerBeat() || nNewMeasure != pSndFile->Patterns[m_nPattern].GetRowsPerMeasure())
+ {
+ if(!pSndFile->Patterns[m_nPattern].SetSignature(nNewBeat, nNewMeasure))
+ {
+ MessageBox("Invalid time signature!", "Pattern Properties", MB_OK|MB_ICONEXCLAMATION);
+ GetDlgItem(IDC_EDIT_ROWSPERBEAT)->SetFocus();
+ return;
+ }
+ m_pModDoc->SetModified();
+ }
+ } else // Disable signature
+ {
+ if(pSndFile->Patterns[m_nPattern].GetOverrideSignature())
+ {
+ pSndFile->Patterns[m_nPattern].RemoveSignature();
+ m_pModDoc->SetModified();
+ }
+ }
+ }
+
+ UINT n = GetDlgItemInt(IDC_COMBO1, NULL, FALSE);
+ pSndFile->Patterns[m_nPattern].Resize(n);
+ }
CDialog::OnOK();
}
Modified: trunk/OpenMPT/mptrack/dlg_misc.h
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -213,6 +213,7 @@
virtual void OnOK();
afx_msg void OnHalfRowNumber();
afx_msg void OnDoubleRowNumber();
+ afx_msg void OnOverrideSignature();
DECLARE_MESSAGE_MAP()
};
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2010-08-09 14:09:36 UTC (rev 680)
@@ -369,33 +369,32 @@
CAPTION "Colours"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,91,74,10
- EDITTEXT IDC_PRIMARYHILITE,114,90,21,12,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,109,80,10
- EDITTEXT IDC_SECONDARYHILITE,114,108,21,12,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10
- CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10
- PUSHBUTTON "MPT",IDC_BUTTON5,126,246,30,15
- PUSHBUTTON "Blue",IDC_BUTTON6,198,246,30,15
- PUSHBUTTON "Green",IDC_BUTTON7,162,246,30,15
- PUSHBUTTON "Buzz",IDC_BUTTON8,234,246,30,15
- CONTROL "Colour",IDC_BUTTON1,"Button",BS_OWNERDRAW,25,194,51,15
- CONTROL "Colour",IDC_BUTTON2,"Button",BS_OWNERDRAW,98,194,51,15
- CONTROL "Colour",IDC_BUTTON3,"Button",BS_OWNERDRAW,168,194,51,15
- LTEXT "Background:",IDC_TEXT1,25,183,60,8
- LTEXT "Foreground:",IDC_TEXT2,98,183,62,8
- LTEXT "Highlight:",IDC_TEXT3,169,185,61,8
- GROUPBOX "",IDC_STATIC,5,5,260,211
- LTEXT "Select colour for:",IDC_STATIC,15,15,63,8
- LTEXT "rows",IDC_STATIC,138,92,16,8
- LTEXT "rows",IDC_STATIC,138,110,16,8
- CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43
- CONTROL "Set highlights to songs' time signatures",IDC_CHECK5,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10
- PUSHBUTTON "Load...",IDC_LOAD_COLORSCHEME,18,246,42,15
- PUSHBUTTON "Save...",IDC_SAVE_COLORSCHEME,66,246,42,15
- GROUPBOX "Colour Presets",IDC_STATIC,6,228,264,42
+ COMBOBOX IDC_COMBO1,84,114,114,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,18,114,10
+ CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,36,114,10
+ CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,84,10
+ EDITTEXT IDC_PRIMARYHILITE,102,54,24,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "Rows per measure (default)",IDC_STATIC,132,56,126,8
+ CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,72,80,10
+ EDITTEXT IDC_SECONDARYHILITE,102,72,24,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "Rows per beat (default)",IDC_STATIC,132,74,126,8
+ LTEXT "Note: Songs' time signatures will override the default highlight values",IDC_STATIC,18,90,240,24
+ CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,76,132,114,43
+ LTEXT "Background:",IDC_TEXT1,36,185,60,8
+ CONTROL "Colour",IDC_BUTTON1,"Button",BS_OWNERDRAW,36,196,51,15
+ LTEXT "Foreground:",IDC_TEXT2,109,185,62,8
+ CONTROL "Colour",IDC_BUTTON2,"Button",BS_OWNERDRAW,109,196,51,15
+ LTEXT "Highlight:",IDC_TEXT3,180,188,61,8
+ CONTROL "Colour",IDC_BUTTON3,"Button",BS_OWNERDRAW,179,196,51,15
+ PUSHBUTTON "Load...",IDC_LOAD_COLORSCHEME,18,252,42,15
+ PUSHBUTTON "Save...",IDC_SAVE_COLORSCHEME,66,252,42,15
+ PUSHBUTTON "MPT",IDC_BUTTON5,126,252,30,15
+ PUSHBUTTON "Green",IDC_BUTTON7,162,252,30,15
+ PUSHBUTTON "Blue",IDC_BUTTON6,198,252,30,15
+ PUSHBUTTON "Buzz",IDC_BUTTON8,234,252,30,15
+ GROUPBOX "",IDC_STATIC,5,5,260,217
+ LTEXT "Select colour for:",IDC_STATIC,18,116,63,8
+ GROUPBOX "Colour Presets",IDC_STATIC,6,234,264,42
END
IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281
@@ -694,7 +693,7 @@
GROUPBOX "Tuning (experimental)",IDC_STATIC,364,28,92,28
END
-IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 311
+IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 305
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Song Properties"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
@@ -717,21 +716,21 @@
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,222,12
CONTROL "Old &random variation behaviour for instruments",IDC_CHK_OLDRANDOM,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,222,12
- COMBOBOX IDC_COMBO_TEMPOMODE,36,217,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- EDITTEXT IDC_ROWSPERBEAT,156,217,24,12,ES_AUTOHSCROLL | ES_NUMBER
- EDITTEXT IDC_ROWSPERMEASURE,156,234,24,12,ES_AUTOHSCROLL | ES_NUMBER
- EDITTEXT IDC_EDIT_CREATEDWITH,78,271,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT_SAVEDWITH,78,289,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
+ COMBOBOX IDC_COMBO_TEMPOMODE,12,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_ROWSPERBEAT,132,210,24,12,ES_AUTOHSCROLL | ES_NUMBER
+ EDITTEXT IDC_ROWSPERMEASURE,132,228,24,12,ES_AUTOHSCROLL | ES_NUMBER
+ EDITTEXT IDC_EDIT_CREATEDWITH,78,265,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
+ EDITTEXT IDC_EDIT_SAVEDWITH,78,283,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48
GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54
- GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,78
- GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,204,246,48
- LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,218,21,8
- LTEXT "Rows/beat",IDC_TEXT_ROWSPERBEAT,186,218,36,8
- LTEXT "Rows/measure",IDC_TEXT_ROWSPERMEASURE,186,236,49,8
- GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,257,246,48
- RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,273,54,8
- RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,289,54,8
+ GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,72
+ GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,198,246,48
+ LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,210,21,8
+ LTEXT "Rows per beat",IDC_TEXT_ROWSPERBEAT,162,212,84,8
+ LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,162,230,84,8
+ GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,251,246,48
+ RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,267,54,8
+ RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,283,54,8
END
IDD_SHOWLOG DIALOG 0, 0, 300, 106
@@ -903,19 +902,26 @@
CONTROL "Replace All (No confirmation)",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,125,144,10
END
-IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 169, 65
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 190, 127
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
-CAPTION "Pattern properties"
+CAPTION "Pattern Properties"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- LTEXT "Rows:",IDC_STATIC,10,10,21,8
- COMBOBOX IDC_COMBO1,12,19,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
- LTEXT "Pattern Info",IDC_TEXT1,10,36,95,25
- DEFPUSHBUTTON "OK",IDOK,115,4,50,14
- PUSHBUTTON "Cancel",IDCANCEL,115,22,50,14
- PUSHBUTTON "/2",IDC_BUTTON_HALF,117,47,21,14
- PUSHBUTTON "x2",IDC_BUTTON_DOUBLE,144,47,21,14
+ COMBOBOX IDC_COMBO1,6,18,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "&/2",IDC_BUTTON_HALF,60,18,18,12
+ PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,84,18,18,12
+ CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,48,174,12
+ EDITTEXT IDC_EDIT_ROWSPERBEAT,18,66,30,12,ES_AUTOHSCROLL | ES_NUMBER
+ EDITTEXT IDC_EDIT_ROWSPERMEASURE,18,84,30,12,ES_AUTOHSCROLL | ES_NUMBER
+ DEFPUSHBUTTON "OK",IDOK,132,6,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,132,24,50,14
+ LTEXT "Rows:",IDC_STATIC,6,6,108,8
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,42,174,1
+ LTEXT "Rows per beat",IDC_STATIC,54,68,126,8
+ LTEXT "Rows per measure",IDC_STATIC,54,86,126,8
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,102,174,1
+ LTEXT "Pattern Info",IDC_TEXT1,6,108,174,14
END
IDD_PATTERN_EDITCOMMAND DIALOGEX 0, 0, 214, 65
@@ -1596,7 +1602,7 @@
IDD_MODDOC_MODTYPE, DIALOG
BEGIN
RIGHTMARGIN, 248
- BOTTOMMARGIN, 304
+ BOTTOMMARGIN, 298
END
IDD_SHOWLOG, DIALOG
@@ -1621,9 +1627,9 @@
IDD_PATTERN_PROPERTIES, DIALOG
BEGIN
LEFTMARGIN, 4
- RIGHTMARGIN, 165
+ RIGHTMARGIN, 186
TOPMARGIN, 4
- BOTTOMMARGIN, 61
+ BOTTOMMARGIN, 123
END
IDD_PAGEEDITEFFECT, DIALOG
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/resource.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -951,6 +951,8 @@
#define IDC_LIST_SAMPLEGEN_PRESETS 2425
#define IDC_CHECK_UNDO 2426
#define IDC_CHK_REMEMBERSETTINGS 2427
+#define IDC_EDIT_ROWSPERBEAT 2428
+#define IDC_EDIT_ROWSPERMEASURE 2429
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1217,7 +1219,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 526
#define _APS_NEXT_COMMAND_VALUE 60452
-#define _APS_NEXT_CONTROL_VALUE 2428
+#define _APS_NEXT_CONTROL_VALUE 2430
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/mptrack/version.h 2010-08-09 14:09:36 UTC (rev 680)
@@ -13,8 +13,8 @@
//Version definitions. The only thing that needs to be changed when changing version number.
#define VER_MAJORMAJOR 1
-#define VER_MAJOR 18
-#define VER_MINOR 03
+#define VER_MAJOR 19
+#define VER_MINOR 00
#define VER_MINORMINOR 00
//Creates version number from version parts that appears in version string.
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-06 18:33:04 UTC (rev 679)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-08-09 14:09:36 UTC (rev 680)
@@ -25,13 +25,14 @@
#define str_LoadingIncompatibleVersion TEXT("The file informed that it is incompatible with this version of OpenMPT. Loading was terminated.\n")
#define str_LoadingMoreRecentVersion TEXT("The loaded file was made with a more recent OpenMPT version and this version may not be able to load all the features or play the file correctly.\n")
-const uint16 verMptFileVer = 0x890;
+const uint16 verMptFileVer = 0x891;
const uint16 verMptFileVerLoadLimit = 0x1000; // If cwtv-field is greater or equal to this value,
// the MPTM file will not be loaded.
/*
MPTM version history for cwtv-field in IT header:
-0x88F(1.18.01.00) -> 0x890(1.18.02.00): Removed volume command velocity :xy, added delay-cut command :xy.
+0x890(1.18.02.00) -> 0x891(1.19.00.00): Pattern-specific time signatures
+0x88F(1.18.01.00) -> 0x890(1.18.02.00): Removed volume command velocity :xy, added delay-cut command :xy.
0x88E(1.17.02.50) -> 0x88F(1.18.01.00): Numerous changes
0x88D(1.17.02.49) -> 0x88E(1.17.02.50): Changed ID to that of IT and undone the orderlist change done in
0x88A->0x88B. Now extended orderlist is saved as extension.
@@ -531,13 +532,11 @@
if(pifh->cwtv >= 0x213 && !(interpretModplugmade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 01)))
{
- m_nRowsPerBeat = pifh->highlight_minor;
- m_nRowsPerMeasure = pifh->highlight_major;
- if(m_nRowsPerBeat + m_nRowsPerMeasure == 0)
+ // MPT 1.09, 1.07 and most likely other old MPT versions leave this blank
+ if(pifh->highlight_minor + pifh->highlight_major != 0)
{
- // MPT 1.09, 1.07 and most likely other old MPT versions leave this blank
- m_nRowsPerBeat = 4;
- m_nRowsPerMeasure = 16;
+ m_nDefaultRowsPerBeat = pifh->highlight_minor;
+ m_nDefaultRowsPerMeasure = pifh->highlight_major;
}
}
@@ -1159,8 +1158,8 @@
header.id = 0x4D504D49;
lstrcpyn(header.songname, m_szNames[0], 26);
- header.highlight_minor = (BYTE)(m_nRowsPerBeat & 0xFF);
- header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF);
+ header.highlight_minor = (BYTE)(m_nDefaultRowsPerBeat & 0xFF);
+ header.highlight_major = (BYTE)(m_nDefaultRowsPerMeasure & 0xFF);
if(GetType() == MOD_TYPE_MPT)
{
@@ -1457,6 +1456,9 @@
patinfo[2] = 0;
patinfo[3] = 0;
+ if(Patterns[npat].GetOverrideSignature())
+ bNeedsMptPatSave = true;
+
// Check for empty pattern
if (Patterns[npat].GetNumRows() == 64)
{
@@ -1800,8 +1802,8 @@
header.id = 0x4D504D49;
lstrcpyn(header.songname, m_szNames[0], 26);
- header.highlight_minor = (BYTE)(m_nRowsPerBeat & 0xFF);
- header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF);
+ header.highlight_minor = (BYTE)(m_nDefaultRowsPerBeat & 0xFF);
+ header.highlight_major = (BYTE)(m_nDefaultRowsPerMeasure & 0xFF);
// An additional "---" pattern is ap...
[truncated message content] |