From: <sag...@us...> - 2015-03-01 21:40:23
|
Revision: 4801 http://sourceforge.net/p/modplug/code/4801 Author: saga-games Date: 2015-03-01 21:40:09 +0000 (Sun, 01 Mar 2015) Log Message: ----------- [New] Can now read PLM (Disorder Tracker 2) files Modified Paths: -------------- trunk/OpenMPT/installer/filetypes.iss trunk/OpenMPT/libopenmpt/foo_openmpt.cpp trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj.filters trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj.filters trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Tables.cpp Added Paths: ----------- trunk/OpenMPT/soundlib/Load_plm.cpp Modified: trunk/OpenMPT/installer/filetypes.iss =================================================================== --- trunk/OpenMPT/installer/filetypes.iss 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/installer/filetypes.iss 2015-03-01 21:40:09 UTC (rev 4801) @@ -38,6 +38,7 @@ Name: "associate_exotic\mt2"; Description: "MadTracker 2 (MT2)"; Name: "associate_exotic\mtm"; Description: "MultiTracker Modules (MTM)"; Name: "associate_exotic\okt"; Description: "Oktalyzer (OKT)"; +Name: "associate_exotic\plm"; Description: "Disorder Tracker 2 (PLM)"; Name: "associate_exotic\psm"; Description: "Epic Megagames MASI (PSM)"; Name: "associate_exotic\ptm"; Description: "PolyTracker (PTM)"; Name: "associate_exotic\stm"; Description: "Scream Tracker 2 (STM)"; @@ -80,6 +81,7 @@ Root: HKCR; Subkey: ".mt2"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\mt2 Root: HKCR; Subkey: ".mtm"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\mtm Root: HKCR; Subkey: ".okt"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\okt +Root: HKCR; Subkey: ".plm"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\plm Root: HKCR; Subkey: ".psm"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\psm Root: HKCR; Subkey: ".ptm"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\ptm Root: HKCR; Subkey: ".stm"; ValueType: string; ValueName: ""; ValueData: "OpenMPTFile"; Flags: uninsdeletevalue; Tasks: associate_exotic\stm Modified: trunk/OpenMPT/libopenmpt/foo_openmpt.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/foo_openmpt.cpp 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/foo_openmpt.cpp 2015-03-01 21:40:09 UTC (rev 4801) @@ -314,6 +314,7 @@ "*.digi" ";" "*.imf" ";" "*.j2b" ";" + "*.plm" ";" "*.gdm" ";" "*.umx" ";" "*.mo3" ";" Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2015-03-01 21:40:09 UTC (rev 4801) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> @@ -298,6 +298,7 @@ <ClCompile Include="..\soundlib\Load_mtm.cpp" /> <ClCompile Include="..\soundlib\Load_okt.cpp" /> <ClCompile Include="..\soundlib\Load_psm.cpp" /> + <ClCompile Include="..\soundlib\Load_plm.cpp" /> <ClCompile Include="..\soundlib\Load_ptm.cpp" /> <ClCompile Include="..\soundlib\Load_s3m.cpp" /> <ClCompile Include="..\soundlib\Load_stm.cpp" /> Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2015-03-01 21:40:09 UTC (rev 4801) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Filter Include="Source Files"> @@ -370,6 +370,9 @@ <ClCompile Include="..\soundlib\Load_psm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> + <ClCompile Include="..\soundlib\Load_plm.cpp"> + <Filter>Source Files\soundlib</Filter> + </ClCompile> <ClCompile Include="..\soundlib\Load_ptm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> Modified: trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj 2015-03-01 21:40:09 UTC (rev 4801) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> @@ -308,6 +308,7 @@ <ClCompile Include="..\soundlib\Load_mtm.cpp" /> <ClCompile Include="..\soundlib\Load_okt.cpp" /> <ClCompile Include="..\soundlib\Load_psm.cpp" /> + <ClCompile Include="..\soundlib\Load_plm.cpp" /> <ClCompile Include="..\soundlib\Load_ptm.cpp" /> <ClCompile Include="..\soundlib\Load_s3m.cpp" /> <ClCompile Include="..\soundlib\Load_stm.cpp" /> Modified: trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj.filters 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/libopenmptDLL.vcxproj.filters 2015-03-01 21:40:09 UTC (rev 4801) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Filter Include="Source Files"> @@ -376,6 +376,9 @@ <ClCompile Include="..\soundlib\Load_psm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> + <ClCompile Include="..\soundlib\Load_plm.cpp"> + <Filter>Source Files\soundlib</Filter> + </ClCompile> <ClCompile Include="..\soundlib\Load_ptm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> Modified: trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj 2015-03-01 21:40:09 UTC (rev 4801) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> @@ -302,6 +302,7 @@ <ClCompile Include="..\soundlib\Load_mtm.cpp" /> <ClCompile Include="..\soundlib\Load_okt.cpp" /> <ClCompile Include="..\soundlib\Load_psm.cpp" /> + <ClCompile Include="..\soundlib\Load_plm.cpp" /> <ClCompile Include="..\soundlib\Load_ptm.cpp" /> <ClCompile Include="..\soundlib\Load_s3m.cpp" /> <ClCompile Include="..\soundlib\Load_stm.cpp" /> Modified: trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj.filters 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/libopenmpt/libopenmpt_test.vcxproj.filters 2015-03-01 21:40:09 UTC (rev 4801) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Filter Include="Source Files"> @@ -370,6 +370,9 @@ <ClCompile Include="..\soundlib\Load_psm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> + <ClCompile Include="..\soundlib\Load_plm.cpp"> + <Filter>Source Files\soundlib</Filter> + </ClCompile> <ClCompile Include="..\soundlib\Load_ptm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2015-03-01 21:40:09 UTC (rev 4801) @@ -1249,7 +1249,7 @@ "FastTracker Modules (*.xm)|*.xm;*.xmz|" "Impulse Tracker Modules (*.it)|*.it;*.itz|" "OpenMPT Modules (*.mptm)|*.mptm;*.mptmz|" - "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.digi;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf;*.itp;*.j2b;*.ice;*.st26|" + "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.digi;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf;*.itp;*.j2b;*.ice;*.st26;*.plm|" "Wave Files (*.wav)|*.wav|" "MIDI Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|" "All Files (*.*)|*.*||") Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2015-03-01 21:40:09 UTC (rev 4801) @@ -1894,6 +1894,10 @@ > </File> <File + RelativePath="..\soundlib\load_plm.cpp" + > + </File> + <File RelativePath="..\soundlib\load_ptm.cpp" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2015-03-01 21:40:09 UTC (rev 4801) @@ -765,6 +765,7 @@ <ClCompile Include="..\soundlib\ITCompression.cpp" /> <ClCompile Include="..\soundlib\ITTools.cpp" /> <ClCompile Include="..\soundlib\Load_digi.cpp" /> + <ClCompile Include="..\soundlib\Load_plm.cpp" /> <ClCompile Include="..\soundlib\Message.cpp" /> <ClCompile Include="..\soundlib\MIDIEvents.cpp" /> <ClCompile Include="..\soundlib\MIDIMacros.cpp" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2015-03-01 21:40:09 UTC (rev 4801) @@ -547,6 +547,9 @@ <ClCompile Include="..\sounddev\SoundDeviceUtilities.cpp"> <Filter>Source Files\sounddev</Filter> </ClCompile> + <ClCompile Include="..\soundlib\Load_plm.cpp"> + <Filter>Source Files\soundlib\Module Loaders</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\soundlib\Loaders.h"> Added: trunk/OpenMPT/soundlib/Load_plm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_plm.cpp (rev 0) +++ trunk/OpenMPT/soundlib/Load_plm.cpp 2015-03-01 21:40:09 UTC (rev 4801) @@ -0,0 +1,340 @@ +/* + * Load_plm.cpp + * ------------ + * Purpose: PLM (Disorder Tracker 2) module loader + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "Loaders.h" + + +OPENMPT_NAMESPACE_BEGIN + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(push, 1) +#endif + +struct PACKED PLMFileHeader +{ + char magic[4]; // "PLM\x1A" + uint8 headerSize; // Number of bytes in header, including magic bytes + uint8 version; // version code of file format (0x10) + char songName[48]; + uint8 numChannels; + uint8 flags; // unused? + uint8 maxVol; // Maximum volume for vol slides, normally 0x40 + uint8 amplify; // SoundBlaster amplify, 0x40 = no amplify + uint8 tempo; + uint8 speed; + uint8 panPos[32]; // 0...15 + uint8 numSamples; + uint8 numPatterns; + uint16 numOrders; + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness() + { + SwapBytesLE(numOrders); + } +}; + +STATIC_ASSERT(sizeof(PLMFileHeader) == 96); + + +struct PACKED PLMSampleHeader +{ + enum SampleFlags + { + smp16Bit = 1, + }; + + char magic[4]; // "PLS\x1A" + uint8 headerSize; // Number of bytes in header, including magic bytes + uint8 version; + char name[32]; + char filename[12]; + uint8 panning; // 0...15, 255 = no pan + uint8 volume; // 0...64 + uint8 flags; // See SampleFlags + uint16 sampleRate; + char unused[4]; + uint32 loopStart; + uint32 loopEnd; + uint32 length; + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness() + { + SwapBytesLE(sampleRate); + SwapBytesLE(loopStart); + SwapBytesLE(loopEnd); + SwapBytesLE(length); + } +}; + +STATIC_ASSERT(sizeof(PLMSampleHeader) == 71); + + +struct PACKED PLMPatternHeader +{ + uint32 size; + uint8 numRows; + uint8 numChannels; + uint8 color; + char name[25]; + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness() + { + SwapBytesLE(size); + } +}; + +STATIC_ASSERT(sizeof(PLMPatternHeader) == 32); + + +struct PACKED PLMOrderItem +{ + uint16 x; // Starting position of pattern + uint8 y; // Number of first channel + uint8 pattern; + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness() + { + SwapBytesLE(x); + } +}; + +STATIC_ASSERT(sizeof(PLMOrderItem) == 4); + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif + + +bool CSoundFile::ReadPLM(FileReader &file, ModLoadingFlags loadFlags) +//------------------------------------------------------------------- +{ + file.Rewind(); + + PLMFileHeader fileHeader; + if(!file.ReadConvertEndianness(fileHeader) + || memcmp(fileHeader.magic, "PLM\x1A", 4) + || fileHeader.version != 0x10 + || fileHeader.numChannels == 0 || fileHeader.numChannels > 32 + || !file.Seek(fileHeader.headerSize) + || !file.CanRead(4 * (fileHeader.numOrders + fileHeader.numPatterns + fileHeader.numSamples))) + { + return false; + } else if(loadFlags == onlyVerifyHeader) + { + return true; + } + + InitializeGlobals(); + InitializeChannels(); + m_nType = MOD_TYPE_PLM; + madeWithTracker = "Disorder Tracker 2"; + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songName); + m_nChannels = fileHeader.numChannels + 1; // Additional channel for writing pattern breaks + m_nSamplePreAmp = fileHeader.amplify; + m_nDefaultTempo = fileHeader.tempo; + m_nDefaultSpeed = fileHeader.speed; + for(CHANNELINDEX chn = 0; chn < fileHeader.numChannels; chn++) + { + ChnSettings[chn].nPan = fileHeader.panPos[chn] * 0x11; + } + m_nSamples = fileHeader.numSamples; + + std::vector<PLMOrderItem> order(fileHeader.numOrders); + for(uint16 i = 0; i < fileHeader.numOrders; i++) + { + PLMOrderItem ord; + file.ReadConvertEndianness(ord); + order[i] = ord; + } + + std::vector<uint32> patternPos, samplePos; + file.ReadVectorLE(patternPos, fileHeader.numPatterns); + file.ReadVectorLE(samplePos, fileHeader.numSamples); + + for(SAMPLEINDEX smp = 0; smp < fileHeader.numSamples; smp++) + { + ModSample &sample = Samples[smp + 1]; + sample.Initialize(); + + if(samplePos[smp] == 0) continue; + file.Seek(samplePos[smp]); + PLMSampleHeader sampleHeader; + file.ReadConvertEndianness(sampleHeader); + + mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[smp + 1], sampleHeader.name); + mpt::String::Read<mpt::String::maybeNullTerminated>(sample.filename, sampleHeader.filename); + if(sampleHeader.panning <= 15) + { + sample.uFlags.set(CHN_PANNING); + sample.nPan = sampleHeader.panning * 0x11; + } + sample.nGlobalVol = std::min(sampleHeader.volume, uint8(64)); + sample.nC5Speed = sampleHeader.sampleRate; + sample.nLoopStart = sampleHeader.loopStart; + sample.nLoopEnd = sampleHeader.loopEnd; + sample.nLength = sampleHeader.length; + if(sample.nLoopEnd > sample.nLoopStart) sample.uFlags.set(CHN_LOOP); + sample.SanitizeLoops(); + file.Seek(samplePos[smp] + sampleHeader.headerSize); + SampleIO( + (sampleHeader.flags & PLMSampleHeader::smp16Bit) ? SampleIO::_16bit : SampleIO::_8bit, + SampleIO::mono, + SampleIO::bigEndian, + SampleIO::unsignedPCM) + .ReadSample(sample, file); + } + + Order.clear(); + // PLM is basically one huge continuous pattern, so we split it up into smaller patterns. + const ROWINDEX rowsPerPat = 64; + + static const ModCommand::COMMAND effTrans[] = + { + CMD_NONE, + CMD_PORTAMENTOUP, + CMD_PORTAMENTODOWN, + CMD_TONEPORTAMENTO, + CMD_VOLUMESLIDE, + CMD_TREMOLO, + CMD_VIBRATO, + CMD_S3MCMDEX, // Tremolo Waveform + CMD_S3MCMDEX, // Vibrato Waveform + CMD_TEMPO, + CMD_SPEED, + CMD_POSITIONJUMP, // Jump to order + CMD_POSITIONJUMP, // Break to end of this order + CMD_OFFSET, + CMD_S3MCMDEX, // GUS Panning + CMD_RETRIG, + CMD_S3MCMDEX, // Note Delay + CMD_S3MCMDEX, // Note Cut + CMD_S3MCMDEX, // Pattern Delay + CMD_FINEVIBRATO, + CMD_VIBRATOVOL, + CMD_TONEPORTAVOL + }; + + for(uint16 i = 0; i < fileHeader.numOrders; i++) + { + const PLMOrderItem &ord = order[i]; + if(ord.pattern >= fileHeader.numPatterns || ord.y > fileHeader.numChannels) continue; + + file.Seek(patternPos[ord.pattern]); + PLMPatternHeader patHeader; + file.ReadConvertEndianness(patHeader); + + ORDERINDEX curOrd = ord.x / rowsPerPat; + ROWINDEX curRow = ord.x % rowsPerPat; + const CHANNELINDEX numChannels = std::min<CHANNELINDEX>(patHeader.numChannels, fileHeader.numChannels - ord.y); + + for(ROWINDEX r = 0; r < patHeader.numRows; r++, curRow++) + { + if(curRow >= rowsPerPat) + { + curRow = 0; + curOrd++; + } + if(curOrd >= Order.size()) + { + PATTERNINDEX pat = Patterns.Insert(rowsPerPat); + Order.resize(curOrd + 1); + Order[curOrd] = pat; + } + PATTERNINDEX pat = Order[curOrd]; + if(!Patterns.IsValidPat(pat)) break; + + ModCommand *m = Patterns[pat].GetpModCommand(curRow, ord.y); + for(CHANNELINDEX c = 0; c < numChannels; c++, m++) + { + uint8 data[5]; + file.ReadArray(data); + if(data[0]) + m->note = (data[0] >> 4) * 12 + (data[0] & 0x0F) + 12 + NOTE_MIN; + else + m->note = NOTE_NONE; + m->instr = data[1]; + m->volcmd = VOLCMD_VOLUME; + if(data[2] != 0xFF) + m->vol = data[2]; + else + m->volcmd = VOLCMD_NONE; + + if(data[3] < CountOf(effTrans)) + { + m->command = effTrans[data[3]]; + m->param = data[4]; + // Fix some commands + switch(data[3]) + { + case 0x07: // Tremolo waveform + m->param = 0x40 | (m->param & 0x03); + break; + case 0x08: // Vibrato waveform + m->param = 0x30 | (m->param & 0x03); + break; + case 0x0B: // Jump to order + if(m->param < fileHeader.numOrders) + { + uint16 target = order[m->param].x; + m->param = static_cast<ModCommand::PARAM>(target / rowsPerPat); + ModCommand *mBreak = Patterns[pat].GetpModCommand(curRow, m_nChannels - 1); + mBreak->command = CMD_PATTERNBREAK; + mBreak->param = static_cast<ModCommand::PARAM>(target % rowsPerPat); + } + break; + case 0x0C: // Jump to end of order + { + uint16 target = ord.x + patHeader.numRows; + m->param = static_cast<ModCommand::PARAM>(target / rowsPerPat); + ModCommand *mBreak = Patterns[pat].GetpModCommand(curRow, m_nChannels - 1); + mBreak->command = CMD_PATTERNBREAK; + mBreak->param = static_cast<ModCommand::PARAM>(target % rowsPerPat); + } + break; + case 0x0E: // GUS Panning + m->param = 0x80 | (m->param & 0x0F); + break; + case 0x10: // Delay Note + m->param = 0xD0 | std::min<ModCommand::PARAM>(m->param, 0x0F); + break; + case 0x11: // Cut Note + m->param = 0xC0 | std::min<ModCommand::PARAM>(m->param, 0x0F); + break; + case 0x12: // Pattern Delay + m->param = 0x60 | std::min<ModCommand::PARAM>(m->param, 0x0F); + break; + case 0x04: // Volume Slide + case 0x14: // Vibrato + Volume Slide + case 0x15: // Tone Portamento + Volume Slide + // If both nibbles of a volume slide are set, act as fine volume slide up + if((m->param & 0xF0) && (m->param & 0x0F) && (m->param & 0xF0) != 0xF0) + { + m->param |= 0x0F; + } + break; + } + } + } + if(patHeader.numChannels > numChannels) + { + file.Skip(5 * (patHeader.numChannels - numChannels)); + } + } + } + + return true; +} + +OPENMPT_NAMESPACE_END Property changes on: trunk/OpenMPT/soundlib/Load_plm.cpp ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/x-c++src \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2015-03-01 21:40:09 UTC (rev 4801) @@ -98,6 +98,7 @@ MOD_TYPE_AMS2 = 0x4000000, MOD_TYPE_DIGI = 0x8000000, MOD_TYPE_UAX = 0x10000000, // sampleset as module + MOD_TYPE_PLM = 0x20000000, }; DECLARE_FLAGSET(MODTYPE) Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2015-03-01 21:40:09 UTC (rev 4801) @@ -5028,7 +5028,7 @@ { if (note == NOTE_NONE || (note >= NOTE_MIN_SPECIAL)) return 0; note -= NOTE_MIN; - if (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_MT2|MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_MDL|MOD_TYPE_ULT|MOD_TYPE_WAV|MOD_TYPE_669 + if (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_MT2|MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_MDL|MOD_TYPE_ULT|MOD_TYPE_WAV|MOD_TYPE_669|MOD_TYPE_PLM |MOD_TYPE_FAR|MOD_TYPE_DMF|MOD_TYPE_PTM|MOD_TYPE_AMS|MOD_TYPE_AMS2|MOD_TYPE_DBM|MOD_TYPE_AMF|MOD_TYPE_PSM|MOD_TYPE_J2B|MOD_TYPE_IMF)) { if(m_SongFlags[SONG_LINEARSLIDES]) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2015-03-01 21:40:09 UTC (rev 4801) @@ -764,6 +764,7 @@ && !ReadGDM(file, loadFlags) && !ReadIMF(file, loadFlags) && !ReadDIGI(file, loadFlags) + && !ReadPLM(file, loadFlags) && !ReadAM(file, loadFlags) && !ReadJ2B(file, loadFlags) && !ReadMO3(file, loadFlags) @@ -1813,8 +1814,8 @@ // Get length of a tick in sample, with tick-to-tick tempo correction in modern tempo mode. // This has to be called exactly once per tick because otherwise the error accumulation // goes wrong. -UINT CSoundFile::GetTickDuration(UINT tempo, UINT speed, ROWINDEX rowsPerBeat) -//---------------------------------------------------------------------------- +uint32_t CSoundFile::GetTickDuration(uint32_t tempo, uint32_t speed, ROWINDEX rowsPerBeat) +//---------------------------------------------------------------------------------------- { UINT retval = 0; switch(m_nTempoMode) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/soundlib/Sndfile.h 2015-03-01 21:40:09 UTC (rev 4801) @@ -646,7 +646,7 @@ void RecalculateSamplesPerTick(); double GetRowDuration(UINT tempo, UINT speed) const; - UINT GetTickDuration(UINT tempo, UINT speed, ROWINDEX rowsPerBeat); + uint32_t GetTickDuration(uint32_t tempo, uint32_t speed, ROWINDEX rowsPerBeat); // A repeat count value of -1 means infinite loop void SetRepeatCount(int n) { m_nRepeatCount = n; } @@ -695,6 +695,7 @@ bool ReadAM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule); bool ReadJ2B(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule); bool ReadDIGI(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule); + bool ReadPLM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule); bool ReadMID(const uint8 *lpStream, DWORD dwMemLength, ModLoadingFlags loadFlags = loadCompleteModule); static std::vector<const char *> GetSupportedExtensions(bool otherFormats); Modified: trunk/OpenMPT/soundlib/Tables.cpp =================================================================== --- trunk/OpenMPT/soundlib/Tables.cpp 2015-03-01 14:49:49 UTC (rev 4800) +++ trunk/OpenMPT/soundlib/Tables.cpp 2015-03-01 21:40:09 UTC (rev 4801) @@ -45,14 +45,14 @@ static const ModFormatInfo modFormatInfo[] = { { MOD_TYPE_MOD, "ProTracker", "mod" }, - { MOD_TYPE_S3M, "ScreamTracker III", "s3m" }, + { MOD_TYPE_S3M, "ScreamTracker 3", "s3m" }, { MOD_TYPE_XM, "FastTracker II", "xm" }, { MOD_TYPE_IT, "Impulse Tracker", "it" }, #ifdef MPT_EXTERNAL_SAMPLES { MOD_TYPE_IT, "Impulse Tracker Project", "itp" }, #endif { MOD_TYPE_MPT, "OpenMPT", "mptm" }, - { MOD_TYPE_STM, "ScreamTracker II", "stm" }, + { MOD_TYPE_STM, "ScreamTracker 2", "stm" }, { MOD_TYPE_MOD, "NoiseTracker", "nst" }, { MOD_TYPE_MOD, "Soundtracker", "m15" }, { MOD_TYPE_MOD, "Soundtracker", "stk" }, @@ -79,12 +79,13 @@ { MOD_TYPE_DIGI, "DigiBooster", "digi" }, { MOD_TYPE_IMF, "Imago Orpheus", "imf" }, { MOD_TYPE_J2B, "Galaxy Sound System", "j2b" }, + { MOD_TYPE_PLM, "Disorder Tracker 2", "plm" }, #ifndef NO_ARCHIVE_SUPPORT // Compressed modules { MOD_TYPE_MOD, "ProTracker", "mdz" }, { MOD_TYPE_MOD, "ProTracker", "mdr" }, - { MOD_TYPE_S3M, "ScreamTracker III", "s3z" }, + { MOD_TYPE_S3M, "ScreamTracker 3", "s3z" }, { MOD_TYPE_XM, "FastTracker II", "xmz" }, { MOD_TYPE_IT, "Impulse Tracker", "itz" }, { MOD_TYPE_MPT, "OpenMPT", "mptmz" }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |