From: <rel...@us...> - 2009-07-01 20:02:40
|
Revision: 279 http://modplug.svn.sourceforge.net/modplug/?rev=279&view=rev Author: relabsoluness Date: 2009-07-01 20:02:20 +0000 (Wed, 01 Jul 2009) Log Message: ----------- (patches from Jojo, merged somewhat modified) [Fix] GDM import: GDM files now show in the load dialogs, MOD transpose/finetune related fix, Endian fixes. [Imp] Sample tab: Better loop point handling when deleting sample selections. [Fix] Sample tab: Transpose is now disabled when using MOD format. [Mod] General: Changes to default general options configuration. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -599,6 +599,9 @@ m_CheckPanning.EnableWindow(b && !(m_pSndFile->GetType() & MOD_TYPE_XM)); m_EditPanning.EnableWindow(b); m_SpinPanning.EnableWindow(b); + + b = (m_pSndFile->m_nType & MOD_TYPE_MOD) ? FALSE : TRUE; + m_CbnBaseNote.EnableWindow(b); } // Updating Values if (dwHintMask & (HINT_MODTYPE|HINT_SAMPLEINFO)) Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -200,7 +200,8 @@ DWORD CMainFrame::m_dwPatternSetup = PATTERN_PLAYNEWNOTE | PATTERN_EFFECTHILIGHT | PATTERN_SMALLFONT | PATTERN_CENTERROW | PATTERN_AUTOSPACEBAR | 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; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -1253,11 +1253,12 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" // "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|" +// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2;*.gdm|" #ifndef NO_MO3_SUPPORT - "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.mo3|" + "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.mo3|" "Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz;*.mo3)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha;*.mo3|" #else - "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2|" + "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm|" "Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha|" #endif // -! NEW_FEATURE#0023 @@ -1270,7 +1271,7 @@ "Impulse Tracker Projects (*.itp)|*.itp;*.itpz|" // -! NEW_FEATURE#0023 "OpenMPT Modules (*.mptm)|*.mptm;*.mptmz|" - "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2|" + "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm|" "Wave Files (*.wav)|*.wav|" "Midi Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|" "All Files (*.*)|*.*||", Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -1704,6 +1704,31 @@ p[i] = (i+cutlen < iend) ? p[i+cutlen] : (char)0; } len = pins->nLength; + + // adjust loop points (could need some optimization) + if(m_dwBeginSel < pins->nLoopStart && m_dwEndSel < pins->nLoopStart) + { + // cut part is before loop start + pins->nLoopStart -= m_dwEndSel - m_dwBeginSel; + pins->nLoopEnd -= m_dwEndSel - m_dwBeginSel; + } + else if(m_dwBeginSel < pins->nLoopStart && m_dwEndSel < pins->nLoopEnd) + { + // cut part is partly before loop start + pins->nLoopStart = m_dwBeginSel; + pins->nLoopEnd -= m_dwEndSel - m_dwBeginSel; + } + else if(m_dwBeginSel > pins->nLoopStart && m_dwEndSel < pins->nLoopEnd) + { + // cut part is in the loop + pins->nLoopEnd -= m_dwEndSel - m_dwBeginSel; + } + else if(m_dwBeginSel > pins->nLoopStart && m_dwBeginSel < pins->nLoopEnd && m_dwEndSel > pins->nLoopEnd) + { + // cut part is partly before loop end + pins->nLoopEnd = m_dwBeginSel; + } + if (pins->nLoopEnd > len) pins->nLoopEnd = len; if (pins->nLoopStart + 4 >= pins->nLoopEnd) { Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-06-29 20:56:43 UTC (rev 278) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-07-01 20:02:20 UTC (rev 279) @@ -29,8 +29,8 @@ UINT16 TrackID; // Composing Tracker ID code (00 = 2GDM) BYTE TrackMajorVer; // Tracker's major version BYTE TrackMinorVer; // Tracker's minor version - BYTE PanMap[32]; // 0-Left to 15-Right, 255-N/U - BYTE MastVol; // Range: 0...64 + BYTE PanMap[32]; // 0-Left to 15-Right, 255-N/U + BYTE MastVol; // Range: 0...64 BYTE Tempo; // Initial music tempo (6) BYTE BPM; // Initial music BPM (125) UINT16 FormOrigin; // Original format ID: @@ -38,32 +38,32 @@ // (versions of 2GDM prior to v1.15 won't set this correctly) UINT32 OrdOffset; - BYTE NOO; // Number of orders in module - 1 + BYTE NOO; // Number of orders in module - 1 UINT32 PatOffset; - BYTE NOP; // Number of patterns in module - 1 + BYTE NOP; // Number of patterns in module - 1 UINT32 SamHeadOffset; UINT32 SamOffset; - BYTE NOS; // Number of samples in module - 1 - UINT32 MTOffset; // Offset of song message + BYTE NOS; // Number of samples in module - 1 + UINT32 MTOffset; // Offset of song message UINT32 MTLength; - UINT32 SSOffset; // Offset of scrolly script (huh?) + UINT32 SSOffset; // Offset of scrolly script (huh?) UINT16 SSLength; - UINT32 TGOffset; // Offset of text graphic (huh?) + UINT32 TGOffset; // Offset of text graphic (huh?) UINT16 TGLength; } GDMHEADER, *PGDMHEADER; typedef struct _GDMSAMPLEHEADER { - CHAR SamName[32]; - CHAR FileName[12]; + CHAR SamName[32]; // sample's name + CHAR FileName[12]; // sample's filename BYTE EmsHandle; // useless - UINT32 Length; - UINT32 LoopBegin; - UINT32 LoopEnd; - BYTE Flags; - UINT16 C4Hertz; - BYTE Volume; - BYTE Pan; + UINT32 Length; // length in bytes + UINT32 LoopBegin; // loop start in samples + UINT32 LoopEnd; // loop end in samples + BYTE Flags; // misc. flags + UINT16 C4Hertz; // frequency + BYTE Volume; // default volume + BYTE Pan; // default pan } GDMSAMPLEHEADER, *PGDMSAMPLEHEADER; BOOL CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength) @@ -90,7 +90,7 @@ return FALSE; } - // todo: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe + // interesting question: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe, so the answer would be no. // read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist m_nChannels = 32; @@ -121,7 +121,7 @@ // 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED - switch(pHeader->FormOrigin) + switch(LittleEndianW(pHeader->FormOrigin)) { case 1: m_nType = MOD_TYPE_MOD; @@ -152,29 +152,36 @@ return FALSE; break; } + UINT32 iSampleOffset = LittleEndian(pHeader->SamOffset), + iPatternsOffset = LittleEndian(pHeader->PatOffset); + const UINT32 iOrdOffset = LittleEndian(pHeader->OrdOffset), iSamHeadOffset = LittleEndian(pHeader->SamHeadOffset), + iMTOffset = LittleEndian(pHeader->MTOffset), iMTLength = LittleEndian(pHeader->MTLength), + iSSOffset = LittleEndian(pHeader->SSOffset), iSSLength = LittleEndianW(pHeader->SSLength), + iTGOffset = LittleEndian(pHeader->TGOffset), iTGLength = LittleEndianW(pHeader->TGLength); + + // check if offsets are valid. we won't read the scrolly text or text graphics, but invalid pointers would probably indicate a broken file... - if( dwMemLength < pHeader->OrdOffset || dwMemLength - pHeader->OrdOffset < pHeader->NOO - || dwMemLength < pHeader->PatOffset - || dwMemLength < pHeader->SamHeadOffset || dwMemLength - pHeader->SamHeadOffset < (pHeader->NOS + 1) * sizeof(GDMSAMPLEHEADER) - || dwMemLength < pHeader->SamOffset - || dwMemLength < pHeader->MTOffset || dwMemLength - pHeader->MTOffset < pHeader->MTLength - || dwMemLength < pHeader->SSOffset || dwMemLength - pHeader->SSOffset < pHeader->SSLength - || dwMemLength < pHeader->TGOffset || dwMemLength - pHeader->TGOffset < pHeader->TGLength) + if( dwMemLength < iOrdOffset || dwMemLength - iOrdOffset < pHeader->NOO + || dwMemLength < iPatternsOffset + || dwMemLength < iSamHeadOffset || dwMemLength - iSamHeadOffset < (pHeader->NOS + 1) * sizeof(GDMSAMPLEHEADER) + || dwMemLength < iSampleOffset + || dwMemLength < iMTOffset || dwMemLength - iMTOffset < iMTLength + || dwMemLength < iSSOffset || dwMemLength - iSSOffset < iSSLength + || dwMemLength < iTGOffset || dwMemLength - iTGOffset < iTGLength) return FALSE; // read orders - Order.ReadAsByte(lpStream + pHeader->OrdOffset, pHeader->NOO + 1, dwMemLength - pHeader->OrdOffset); + Order.ReadAsByte(lpStream + iOrdOffset, pHeader->NOO + 1, dwMemLength - iOrdOffset); // read samples m_nSamples = pHeader->NOS + 1; - DWORD iSampleOffset = pHeader->SamOffset; int iLZWsamples = 0; for(UINT iSmp = 1; iSmp <= m_nSamples; iSmp++) { - const PGDMSAMPLEHEADER pSample = (PGDMSAMPLEHEADER)(lpStream + pHeader->SamHeadOffset + (iSmp - 1) * sizeof(GDMSAMPLEHEADER)); + const PGDMSAMPLEHEADER pSample = (PGDMSAMPLEHEADER)(lpStream + iSamHeadOffset + (iSmp - 1) * sizeof(GDMSAMPLEHEADER)); // sample header @@ -182,13 +189,31 @@ SetNullTerminator(m_szNames[iSmp]); memcpy(Ins[iSmp].name, pSample->FileName, 12); - Ins[iSmp].nC4Speed = pSample->C4Hertz; + Ins[iSmp].nC4Speed = LittleEndianW(pSample->C4Hertz); Ins[iSmp].nGlobalVol = 256; // not supported in this format - Ins[iSmp].nLength = min(pSample->Length, MAX_SAMPLE_LENGTH); // in bytes - Ins[iSmp].nLoopStart = min(pSample->LoopBegin, Ins[iSmp].nLength); // in samples - Ins[iSmp].nLoopEnd = min(pSample->LoopEnd - 1, Ins[iSmp].nLength); // dito + Ins[iSmp].nLength = min(LittleEndian(pSample->Length), MAX_SAMPLE_LENGTH); // in bytes + Ins[iSmp].nLoopStart = min(LittleEndian(pSample->LoopBegin), Ins[iSmp].nLength); // in samples + Ins[iSmp].nLoopEnd = min(LittleEndian(pSample->LoopEnd) - 1, Ins[iSmp].nLength); // dito FrequencyToTranspose(&Ins[iSmp]); // set transpose + finetune for mod files + // fix transpose + finetune for some rare cases where transpose is not C-5 (e.g. sample 4 in wander2.mod) + if(m_nType == MOD_TYPE_MOD) + { + while(Ins[iSmp].RelativeTone != 0) + { + if(Ins[iSmp].RelativeTone > 0) + { + Ins[iSmp].RelativeTone -= 1; + Ins[iSmp].nFineTune += 128; + } + else + { + Ins[iSmp].RelativeTone += 1; + Ins[iSmp].nFineTune -= 128; + } + } + } + if(pSample->Flags & 0x01) Ins[iSmp].uFlags |= CHN_LOOP; // loop sample if(pSample->Flags & 0x04) @@ -243,23 +268,21 @@ // read sample data ReadSample(&Ins[iSmp], iSampleFormat, reinterpret_cast<LPCSTR>(lpStream + iSampleOffset), dwMemLength - iSampleOffset); - iSampleOffset += min(pSample->Length, dwMemLength - iSampleOffset); + iSampleOffset += min(LittleEndian(pSample->Length), dwMemLength - iSampleOffset); } // read patterns Patterns.ResizeArray(max(MAX_PATTERNS, pHeader->NOP + 1)); - // position in file - DWORD iPatternsOffset = pHeader->PatOffset; - BOOL bS3MCommandSet = (GetBestSaveFormat() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)); + // we'll start at position iPatternsOffset and decode all patterns for (PATTERNINDEX iPat = 0; iPat < pHeader->NOP + 1; iPat++) { if(iPatternsOffset + 2 > dwMemLength) break; - UINT16 iPatternLength = *(UINT16 *)(lpStream + iPatternsOffset); // pattern length including the two "length" bytes + UINT16 iPatternLength = LittleEndianW(*(UINT16 *)(lpStream + iPatternsOffset)); // pattern length including the two "length" bytes if(iPatternLength > dwMemLength || iPatternsOffset > dwMemLength - iPatternLength) break; if(Patterns.Insert(iPat, 64)) @@ -510,13 +533,13 @@ } // read song comments - if(pHeader->MTLength) + if(iMTLength) { - m_lpszSongComments = new char[pHeader->MTLength + 1]; + m_lpszSongComments = new char[iMTLength + 1]; if (m_lpszSongComments) { - memset(m_lpszSongComments, 0, pHeader->MTLength + 1); - memcpy(m_lpszSongComments, lpStream + pHeader->MTOffset, pHeader->MTLength); + memset(m_lpszSongComments, 0, iMTLength + 1); + memcpy(m_lpszSongComments, lpStream + iMTOffset, iMTLength); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |