|
From: <sag...@us...> - 2013-05-05 00:26:05
|
Revision: 2007
http://sourceforge.net/p/modplug/code/2007
Author: saga-games
Date: 2013-05-05 00:25:59 +0000 (Sun, 05 May 2013)
Log Message:
-----------
[Imp] Brought back S3M / XM tracker identification,
[Fix] Fixed tracker name in PSM new format.
[Imp] DMF: Volume 1 should be silent.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/LOAD_DMF.CPP
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-05-03 14:49:28 UTC (rev 2006)
+++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-05-05 00:25:59 UTC (rev 2007)
@@ -621,7 +621,7 @@
if((channelInfo & patVolume) != 0)
{
m->volcmd = VOLCMD_VOLUME;
- m->vol = (file.ReadUint8() + 3) / 4;
+ m->vol = (file.ReadUint8() + 2) / 4; // Should be + 3 instead of + 2, but volume 1 is silent in X-Tracker.
}
////////////////////////////////////////////////////////////////
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2013-05-03 14:49:28 UTC (rev 2006)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2013-05-05 00:25:59 UTC (rev 2007)
@@ -653,9 +653,9 @@
madeWithTracker = "Epic MegaGames MASI (";
if(newFormat)
- madeWithTracker = "New Version / Sinaria)";
+ madeWithTracker += "New Version / Sinaria)";
else
- madeWithTracker = "New Version)";
+ madeWithTracker += "New Version)";
if(!(loadFlags & loadPatternData))
{
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-05-03 14:49:28 UTC (rev 2006)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-05-05 00:25:59 UTC (rev 2007)
@@ -176,10 +176,12 @@
trkImpulseTracker = 0x3000,
trkSchismTracker = 0x4000,
trkOpenMPT = 0x5000,
- trkBeRoTracker = 0x6000, // Note: BeRoTracker also used version 0x4100 since 2004.
+ trkBeRoTracker = 0x6000,
+ trkCreamTracker = 0x7000,
trkST3_20 = 0x1320,
trkIT2_14 = 0x3214,
+ trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012
};
// Flags
@@ -390,7 +392,7 @@
// Pattern decoding flags
enum S3MPattern
{
- s3mEndOfRow = 0x00,
+ s3mEndOfRow = 0x00,
s3mChannelMask = 0x1F,
s3mNotePresent = 0x20,
s3mVolumePresent = 0x40,
@@ -448,16 +450,51 @@
// ST3 ignored Zxx commands, so if we find that a file was made with ST3, we should erase all MIDI macros.
bool keepMidiMacros = false;
- if((fileHeader.cwtv & S3MFileHeader::trackerMask) == S3MFileHeader::trkOpenMPT)
+ mpt::String trackerName;
+ switch(fileHeader.cwtv & S3MFileHeader::trackerMask)
{
- // OpenMPT Version number (Major.Minor)
+ case S3MFileHeader::trkScreamTracker:
+ if(fileHeader.cwtv == S3MFileHeader::trkST3_20 && fileHeader.special == 0 && (fileHeader.ordNum & 0x0F) == 0 && fileHeader.ultraClicks == 0 && (fileHeader.flags & ~0x50) == 0)
+ {
+ // MPT 1.16 and older versions of OpenMPT - Simply keep default (filter) MIDI macros
+ m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00);
+ trackerName = "ModPlug Tracker / OpenMPT";
+ keepMidiMacros = true;
+ } else if(fileHeader.special == 0 && fileHeader.ultraClicks == 0 && fileHeader.flags == 0 && fileHeader.usePanningTable == 0)
+ {
+ trackerName = "Velvet Studio";
+ } else
+ {
+ trackerName = "Scream Tracker %d.%02x";
+ }
+ break;
+ case S3MFileHeader::trkImagoOrpheus:
+ trackerName = "Imago Orpheus %d.%02x";
+ break;
+ case S3MFileHeader::trkImpulseTracker:
+ if(fileHeader.cwtv <= S3MFileHeader::trkIT2_14)
+ trackerName = "Impulse Tracker %d.%02x";
+ else
+ trackerName.Format("Impulse Tracker 2.14p%d", fileHeader.cwtv - S3MFileHeader::trkIT2_14);
+ break;
+ case S3MFileHeader::trkSchismTracker:
+ if(fileHeader.cwtv == S3MFileHeader::trkBeRoTrackerOld)
+ trackerName = "BeRoTracker";
+ else
+ trackerName = "Schism Tracker"; // TODO Version Number
+ break;
+ case S3MFileHeader::trkOpenMPT:
+ trackerName = "OpenMPT %d.%02x";
m_dwLastSavedWithVersion = (fileHeader.cwtv & S3MFileHeader::versionMask) << 16;
- } else if(fileHeader.cwtv == S3MFileHeader::trkST3_20 && fileHeader.special == 0 && (fileHeader.ordNum & 0x0F) == 0 && fileHeader.ultraClicks == 0 && (fileHeader.flags & ~0x50) == 0)
- {
- // MPT 1.16 and older versions of OpenMPT - Simply keep default (filter) MIDI macros
- m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00);
- keepMidiMacros = true;
+ break;
+ case S3MFileHeader::trkBeRoTracker:
+ trackerName = "BeRoTracker";
+ break;
+ case S3MFileHeader::trkCreamTracker:
+ trackerName = "CreamTracker";
+ break;
}
+ madeWithTracker.Format(trackerName, (fileHeader.cwtv & 0xF00) >> 8, (fileHeader.cwtv & 0xFF));
if((fileHeader.cwtv & S3MFileHeader::trackerMask) > S3MFileHeader::trkScreamTracker)
{
@@ -616,7 +653,7 @@
// We won't convert if there are not enough Zxx commands, too "high" Zxx commands
// or there are only "left" or "right" pannings (we assume that stereo should be somewhat balanced),
// and modules not made with an old version of ST3 were probably made in a tracker that supports panning anyway.
- bool pixPlayPanning = (fileHeader.cwtv < S3MFileHeader::trkST3_20);
+ bool pixPlayPanning = (fileHeader.cwtv < S3MFileHeader::trkST3_20);
int zxxCountRight = 0, zxxCountLeft = 0;
// Reading patterns
@@ -707,7 +744,7 @@
S3MConvert(m, false);
}
- if(m.command == CMD_S3MCMDEX && (m.param & 0xF0) == 0xA0 && fileHeader.cwtv < S3MFileHeader::trkST3_20)
+ if(m.command == CMD_S3MCMDEX && (m.param & 0xF0) == 0xA0 && fileHeader.cwtv < S3MFileHeader::trkST3_20)
{
// Convert old SAx panning to S8x (should only be found in PANIC.S3M by Purple Motion)
m.param = 0x80 | ((m.param & 0x0F) ^ 8);
@@ -723,7 +760,7 @@
if(m.param < 0x08)
{
zxxCountLeft++;
- } else if(m.param > 0x08)
+ } else if(m.param > 0x08)
{
zxxCountRight++;
}
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-05-03 14:49:28 UTC (rev 2006)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-05-05 00:25:59 UTC (rev 2007)
@@ -238,12 +238,17 @@
FLAGSET(TrackerVersions)
{
- verUnknown = 0x00, // Probably not made with MPT
- verOldModPlug = 0x01, // Made with MPT Alpha / Beta
- verNewModPlug = 0x02, // Made with MPT (not Alpha / Beta)
- verModPlug1_09 = 0x04, // Made with MPT 1.09 or possibly other version
- verOpenMPT = 0x08, // Made with OpenMPT
- verConfirmed = 0x10, // We are very sure that we found the correct tracker version.
+ verUnknown = 0x00, // Probably not made with MPT
+ verOldModPlug = 0x01, // Made with MPT Alpha / Beta
+ verNewModPlug = 0x02, // Made with MPT (not Alpha / Beta)
+ verModPlug1_09 = 0x04, // Made with MPT 1.09 or possibly other version
+ verOpenMPT = 0x08, // Made with OpenMPT
+ verConfirmed = 0x10, // We are very sure that we found the correct tracker version.
+
+ verFT2Generic = 0x20, // "FastTracker v2.00", but FastTracker has NOT been ruled out
+ verOther = 0x40, // Something we don't know, testing for DigiTrakker.
+ verFT2Clone = 0x80, // NOT FT2: itype changed between instruments, or \0 found in song title
+ verDigiTracker = 0x100, // Probably DigiTrakker
};
@@ -271,12 +276,35 @@
FlagSet<TrackerVersions> madeWith(verUnknown);
- if(!memcmp(fileHeader.trackerName, "FastTracker v 2.00 ", 20))
+ if(!memcmp(fileHeader.trackerName, "FastTracker ", 12))
{
- madeWith = verOldModPlug;
- } else if(fileHeader.size == 276 && fileHeader.version == 0x0104 && !memcmp(fileHeader.trackerName, "FastTracker v2.00 ", 20))
+ if(fileHeader.size && !memcmp(fileHeader.trackerName + 12, "v2.00 ", 8))
+ {
+ if(fileHeader.version < 0x0104)
+ madeWith = verFT2Generic | verConfirmed;
+ else
+ madeWith = verFT2Generic | verNewModPlug;
+
+ // FT2 pads the song title with spaces, some other trackers don't
+ if(madeWith[verFT2Generic] && memchr(fileHeader.songName, '\0', 20) != nullptr)
+ madeWith = verFT2Generic | verNewModPlug;
+ } else if(!memcmp(fileHeader.trackerName + 12, "v 2.00 ", 8))
+ {
+ // Old MPT:
+ // - 1.00a5 (ihdr=245)
+ // - beta 3.3 (ihdr=263)
+ madeWith = verOldModPlug;
+ } else
+ {
+ // ???
+ madeWith.set(verConfirmed);
+ madeWithTracker = "FastTracker Clone";
+ }
+ } else
{
- madeWith = verNewModPlug;
+ // Something else!
+ madeWith.set(verConfirmed);
+ madeWithTracker.AppendChars(fileHeader.trackerName);
}
StringFixer::ReadString<StringFixer::spacePadded>(m_szNames[0], fileHeader.songName);
@@ -308,6 +336,7 @@
// In case of XM versions < 1.04, we need to memorize the sample flags for all samples, as they are not stored immediately after the sample headers.
std::vector<SampleIO> sampleFlags;
uint8 sampleReserved = 0;
+ int instrType = -1;
// Reading instruments
for(INSTRUMENTINDEX instr = 1; instr <= m_nInstruments; instr++)
@@ -328,21 +357,23 @@
// Time for some version detection stuff.
if(madeWith == verOldModPlug)
{
- madeWith |= verConfirmed;
+ madeWith.set(verConfirmed);
if(instrHeader.size == 245)
{
// ModPlug Tracker Alpha
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, A5);
+ madeWithTracker = "ModPlug Tracker 1.0a5";
} else if(instrHeader.size == 263)
{
// ModPlug Tracker Beta (Beta 1 still behaves like Alpha, but Beta 3.3 does it this way)
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, B3);
+ madeWithTracker = "ModPlug Tracker 1.0b3";
} else
{
// WTF?
madeWith = (verUnknown | verConfirmed);
}
- } else if(madeWith == verNewModPlug && instrHeader.numSamples == 0)
+ } else if(madeWith[verNewModPlug] && instrHeader.numSamples == 0)
{
// Empty instruments make tracker identification pretty easy!
madeWith = ((instrHeader.size == 263 && instrHeader.sampleHeaderSize == 0) ? verNewModPlug : verUnknown) | verConfirmed;
@@ -355,6 +386,17 @@
instrHeader.ConvertToMPT(*Instruments[instr]);
+ if(instrType == -1)
+ {
+ instrType = instrHeader.type;
+ } else if(instrType != instrHeader.type && madeWith[verFT2Generic])
+ {
+ // FT2 writes some random junk for the instrument type field,
+ // but it's always the SAME junk for every instrument saved.
+ madeWith.reset(verFT2Generic);
+ madeWith.set(verFT2Clone);
+ }
+
if(instrHeader.numSamples > 0)
{
// Yep, there are some samples associated with this instrument.
@@ -501,9 +543,11 @@
if(madeWith[verModPlug1_09])
{
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 09, 00, 00);
+ madeWithTracker = "ModPlug Tracker 1.09";
} else if(madeWith[verNewModPlug])
{
m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00);
+ madeWithTracker = "ModPlug Tracker 1.16";
}
}
@@ -523,6 +567,20 @@
SetModFlag(MSF_COMPATIBLE_PLAY, false);
}
+ if(madeWithTracker.empty())
+ {
+ if(madeWith[verDigiTracker] && sampleReserved == 0 && (instrType ? instrType : -1) == -1)
+ {
+ madeWithTracker = "DigiTrakker";
+ } else if(madeWith[verFT2Generic])
+ {
+ madeWithTracker = "FastTracker 2 or compatible";
+ } else
+ {
+ madeWithTracker = "Unknown";
+ }
+ }
+
// Leave if no extra instrument settings are available (end of file reached)
if(file.NoBytesLeft()) return true;
@@ -544,6 +602,11 @@
}
}
+ if(m_dwLastSavedWithVersion >= MAKE_VERSION_NUMERIC(1, 17, 00, 00))
+ {
+ madeWithTracker = "OpenMPT " + MptVersion::ToStr(m_dwLastSavedWithVersion);
+ }
+
// We no longer allow any --- or +++ items in the order list now.
if(m_dwLastSavedWithVersion && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 22, 02, 02))
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|