|
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.
|