From: <sag...@us...> - 2013-04-26 20:35:32
|
Revision: 1975 http://sourceforge.net/p/modplug/code/1975 Author: saga-games Date: 2013-04-26 20:35:20 +0000 (Fri, 26 Apr 2013) Log Message: ----------- [New] Can now import DIGI (Digi Booster) modules. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/soundlib/Load_mod.cpp 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_digi.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-26 20:35:20 UTC (rev 1975) @@ -372,6 +372,7 @@ bModified = FALSE; break; case MOD_TYPE_AMF0: + case MOD_TYPE_DIGI: m_SndFile.ChangeModTypeTo(MOD_TYPE_MOD); break; case MOD_TYPE_MED: Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-26 20:35:20 UTC (rev 1975) @@ -1337,6 +1337,10 @@ > </File> <File + RelativePath="..\soundlib\load_digi.cpp" + > + </File> + <File RelativePath="..\soundlib\load_dmf.cpp" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-26 20:35:20 UTC (rev 1975) @@ -269,6 +269,7 @@ <ClCompile Include="..\soundlib\Fastmix.cpp" /> <ClCompile Include="..\soundlib\ITCompression.cpp" /> <ClCompile Include="..\soundlib\ITTools.cpp" /> + <ClCompile Include="..\soundlib\Load_digi.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 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-26 20:35:20 UTC (rev 1975) @@ -439,6 +439,9 @@ <ClCompile Include="..\common\version.cpp"> <Filter>Source Files\common</Filter> </ClCompile> + <ClCompile Include="..\soundlib\Load_digi.cpp"> + <Filter>Source Files\soundlib\Module Loaders</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\soundlib\Loaders.h"> Added: trunk/OpenMPT/soundlib/Load_digi.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_digi.cpp (rev 0) +++ trunk/OpenMPT/soundlib/Load_digi.cpp 2013-04-26 20:35:20 UTC (rev 1975) @@ -0,0 +1,187 @@ +/* + * Load_digi.cpp + * ------------- + * Purpose: Digi Booster module loader + * Notes : Basically these are like ProTracker MODs with a few extra features such as more channels, longer channels and a few more effects. + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "Loaders.h" + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(push, 1) +#endif + +// DIGI File Header +struct PACKED DIGIFileHeader +{ + char signature[20]; + char versionStr[4]; // Supposed to be "V1.6" or similar, but other values like "TAP!" have been found as well. + uint8 versionInt; // e.g. 0x16 = 1.6 + uint8 numChannels; + uint8 packEnable; + char unknown[19]; + uint8 lastPatIndex; + uint8 lastOrdIndex; + uint8 orders[128]; + uint32 smpLength[31]; + uint32 smpLoopStart[31]; + uint32 smpLoopLength[31]; + uint8 smpVolume[31]; + uint8 smpFinetune[31]; + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness() + { + for(SAMPLEINDEX i = 0; i < 31; i++) + { + SwapBytesBE(smpLength[i]); + SwapBytesBE(smpLoopStart[i]); + SwapBytesBE(smpLoopLength[i]); + } + } +}; + +STATIC_ASSERT(sizeof(DIGIFileHeader) == 610); + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif + + +bool CSoundFile::ReadDIGI(FileReader &file) +//----------------------------------------- +{ + file.Rewind(); + + DIGIFileHeader fileHeader; + if(!file.ReadConvertEndianness(fileHeader) + || memcmp(fileHeader.signature, "DIGI Booster module\0", 20) + || !fileHeader.numChannels + || fileHeader.numChannels > 8 + || fileHeader.lastOrdIndex > 127) + { + return false; + } + + Order.ReadFromArray(fileHeader.orders, fileHeader.lastOrdIndex + 1); + + // Globals + m_nType = MOD_TYPE_DIGI; + m_nChannels = fileHeader.numChannels; + m_nInstruments = 0; + m_nSamples = 31; + m_nSamplePreAmp = 256 / m_nChannels; + m_nDefaultSpeed = 6; + m_nDefaultTempo = 125; + m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; + + // Read sample headers + for(SAMPLEINDEX smp = 0; smp < 31; smp++) + { + ModSample &sample = Samples[smp + 1]; + sample.Initialize(MOD_TYPE_MOD); + sample.nLength = fileHeader.smpLength[smp]; + sample.nLoopStart = fileHeader.smpLoopStart[smp]; + sample.nLoopEnd = sample.nLoopStart + fileHeader.smpLoopLength[smp]; + if(fileHeader.smpLoopLength[smp]) + { + sample.uFlags.set(CHN_LOOP); + } + sample.SanitizeLoops(); + + sample.nVolume = std::min(fileHeader.smpVolume[smp], uint8(64)) * 4; + sample.nFineTune = MOD2XMFineTune(fileHeader.smpFinetune[smp]); + } + + // Read song + sample names + file.ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], 32); + for(SAMPLEINDEX smp = 1; smp <= 31; smp++) + { + file.ReadString<StringFixer::maybeNullTerminated>(m_szNames[smp], 30); + } + + for(PATTERNINDEX pat = 0; pat <= fileHeader.lastPatIndex; pat++) + { + if(Patterns.Insert(pat, 64)) + { + break; + } + + vector<uint8> eventMask(64, 0xFF); + FileReader patternChunk; + + if(fileHeader.packEnable) + { + patternChunk = file.GetChunk(file.ReadUint16BE()); + patternChunk.ReadVector(eventMask, 64); + } else + { + patternChunk = file.GetChunk(4 * 64 * GetNumChannels()); + } + + size_t i = 0; + for(ROWINDEX row = 0; row < 64; row++) + { + PatternRow patRow = Patterns[pat].GetRow(row); + uint8 bit = 0x80; + for(CHANNELINDEX chn = 0; chn < GetNumChannels(); chn++, bit >>= 1) + { + ModCommand &m = patRow[chn]; + if(eventMask[row] & bit) + { + ReadMODPatternEntry(patternChunk, m); + ConvertModCommand(m); + if(m.command == CMD_MODCMDEX) + { + switch(m.param & 0xF0) + { + case 0x30: + // E30 / E31: Play sample backwards (with some weird parameters that we won't support for now) + if(m.param <= 0x31) + { + m.command = CMD_S3MCMDEX; + m.param = 0x9F; + } + break; + case 0x40: + // E40: Stop playing sample + if(m.param == 0x40) + { + m.note = NOTE_NOTECUT; + m.command = CMD_NONE; + } + break; + case 0x80: + // E8x: High sample offset + m.command = CMD_S3MCMDEX; + m.param = 0xA0 | (m.param & 0x0F); + } + } else if(m.command == CMD_PANNING8) + { + // 8xx "Robot" effect (not supported) + m.command = CMD_NONE; + } + i += 4; + } + } + } + } + + // Reading Samples + const SampleIO sampleIO( + SampleIO::_8bit, + SampleIO::mono, + SampleIO::bigEndian, + SampleIO::signedPCM); + + for(SAMPLEINDEX smp = 1; smp <= 31; smp++) + { + sampleIO.ReadSample(Samples[smp], file); + } + + return true; +} Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-26 20:35:20 UTC (rev 1975) @@ -454,8 +454,8 @@ } -static void ReadPatternEntry(FileReader &file, ModCommand &m, const CSoundFile &sf) -//--------------------------------------------------------------------------------- +void CSoundFile::ReadMODPatternEntry(FileReader &file, ModCommand &m) +//------------------------------------------------------------------- { uint8 data[4]; file.ReadArray(data); @@ -464,7 +464,7 @@ uint16 period = (((static_cast<uint16>(data[0]) & 0x0F) << 8) | data[1]); if(period > 0 && period != 0xFFF) { - m.note = static_cast<ModCommand::NOTE>(sf.GetNoteFromPeriod(period * 4)); + m.note = static_cast<ModCommand::NOTE>(GetNoteFromPeriod(period * 4)); } // Read Instrument m.instr = (data[2] >> 4) | (data[0] & 0x10); @@ -650,7 +650,7 @@ for(CHANNELINDEX chn = 0; chn < readChannels; chn++) { ModCommand &m = rowBase[chn]; - ReadPatternEntry(file, m, *this); + ReadMODPatternEntry(file, m); if(m.command || m.param) { @@ -942,7 +942,7 @@ for(CHANNELINDEX chn = 0; chn < 4; chn++) { ModCommand &m = rowBase[chn]; - ReadPatternEntry(file, m, *this); + ReadMODPatternEntry(file, m); if(m.command || m.param) { Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2013-04-26 20:35:20 UTC (rev 1975) @@ -101,6 +101,7 @@ MOD_TYPE_MPT = 0x1000000, MOD_TYPE_IMF = 0x2000000, MOD_TYPE_AMS2 = 0x4000000, + MOD_TYPE_DIGI = 0x8000000, // Container formats (not used at the moment) MOD_TYPE_MO3 = 0x20000000, MOD_TYPE_GDM = 0x40000000, @@ -135,17 +136,17 @@ CHN_SURROUND = 0x800, // use surround channel CHN_NOIDO = 0x1000, // (IDO = Interpolation Do?) Indicates if the channel is near enough to an exact multiple of the base frequency that any interpolation won't be noticeable - or if interpolation was switched off completely. --Storlek CHN_HQSRC = 0x2000, // High quality sample rate conversion (i.e. apply interpolation) - CHN_FILTER = 0x4000, // filtered output - CHN_VOLUMERAMP = 0x8000, // ramp volume - CHN_VIBRATO = 0x10000, // apply vibrato - CHN_TREMOLO = 0x20000, // apply tremolo - CHN_PANBRELLO = 0x40000, // apply panbrello - CHN_PORTAMENTO = 0x80000, // apply portamento - CHN_GLISSANDO = 0x100000, // glissando mode - CHN_FASTVOLRAMP = 0x200000, // ramp volume very fast - CHN_EXTRALOUD = 0x400000, // force master volume to = 0x100 - CHN_REVERB = 0x800000, // apply reverb - CHN_NOREVERB = 0x1000000, // forbid reverb + CHN_FILTER = 0x4000, // Apply resonant filter on sample + CHN_VOLUMERAMP = 0x8000, // Apply volume ramping + CHN_VIBRATO = 0x10000, // Apply vibrato + CHN_TREMOLO = 0x20000, // Apply tremolo + CHN_PANBRELLO = 0x40000, // Apply panbrello + CHN_PORTAMENTO = 0x80000, // Apply portamento + CHN_GLISSANDO = 0x100000, // Glissando mode + CHN_FASTVOLRAMP = 0x200000, // Force usage of global ramping settings instead of ramping over the complete render buffer length + CHN_EXTRALOUD = 0x400000, // Force sample to play at 0dB + CHN_REVERB = 0x800000, // Apply reverb on this channel + CHN_NOREVERB = 0x1000000, // Disable reverb on this channel CHN_SOLO = 0x2000000, // solo channel -> CODE#0012 -> DESC="midi keyboard split" -! NEW_FEATURE#0012 CHN_NOFX = 0x4000000, // dry channel -> CODE#0015 -> DESC="channels management dlg" -! NEW_FEATURE#0015 CHN_SYNCMUTE = 0x8000000, // keep sample sync on mute Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-26 20:35:20 UTC (rev 1975) @@ -4577,7 +4577,7 @@ //--------------------------------------------------- { if (!period) return 0; - if (m_nType & (MOD_TYPE_MED|MOD_TYPE_MOD|MOD_TYPE_MTM|MOD_TYPE_669|MOD_TYPE_OKT|MOD_TYPE_AMF0)) + if (m_nType & (MOD_TYPE_MED|MOD_TYPE_MOD|MOD_TYPE_DIGI|MOD_TYPE_MTM|MOD_TYPE_669|MOD_TYPE_OKT|MOD_TYPE_AMF0)) { period >>= 2; for (UINT i=0; i<6*12; i++) @@ -4612,7 +4612,7 @@ { if ((!note) || (note >= NOTE_MIN_SPECIAL)) return 0; if (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_MDL|MOD_TYPE_ULT|MOD_TYPE_WAV - |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)) + |MOD_TYPE_FAR|MOD_TYPE_DMF|MOD_TYPE_PTM|MOD_TYPE_AMS|MOD_TYPE_AMS2|MOD_TYPE_DIGI|MOD_TYPE_DBM|MOD_TYPE_AMF|MOD_TYPE_PSM|MOD_TYPE_J2B|MOD_TYPE_IMF)) { note--; if(m_SongFlags[SONG_LINEARSLIDES]) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-26 20:35:20 UTC (rev 1975) @@ -578,6 +578,7 @@ #endif // MODPLUG_TRACKER && !ReadGDM(file) && !ReadIMF(file) + && !ReadDIGI(file) && !ReadAM(file) && !ReadJ2B(file) && !ReadMO3(file) @@ -1175,7 +1176,7 @@ //------------------------------------------- { if ((!m_nSamples) || (!m_nChannels) || GetType() == MOD_TYPE_NONE) return MOD_TYPE_NONE; - if (GetType() & (MOD_TYPE_MOD/*|MOD_TYPE_OKT*/)) + if (GetType() & (MOD_TYPE_MOD|MOD_TYPE_DIGI)) return MOD_TYPE_MOD; if (GetType() & (MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_ULT|MOD_TYPE_FAR|MOD_TYPE_PTM|MOD_TYPE_MTM)) return MOD_TYPE_S3M; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-26 20:35:20 UTC (rev 1975) @@ -504,6 +504,7 @@ bool ReadIMF(FileReader &file); bool ReadAM(FileReader &file); bool ReadJ2B(FileReader &file); + bool ReadDIGI(FileReader &file); bool ReadMID(const LPCBYTE lpStream, DWORD dwMemLength); static std::vector<const char *> GetSupportedExtensions(bool otherFormats); @@ -540,6 +541,7 @@ void S3MConvert(ModCommand &m, bool fromIT) const; void S3MSaveConvert(uint8 &command, uint8 ¶m, bool toIT, bool compatibilityExport = false) const; void ModSaveCommand(uint8 &command, uint8 ¶m, const bool toXM, const bool compatibilityExport = false) const; + void ReadMODPatternEntry(FileReader &file, ModCommand &m); void SetupMODPanning(bool bForceSetup = false); // Setup LRRL panning, max channel volume Modified: trunk/OpenMPT/soundlib/Tables.cpp =================================================================== --- trunk/OpenMPT/soundlib/Tables.cpp 2013-04-26 17:13:44 UTC (rev 1974) +++ trunk/OpenMPT/soundlib/Tables.cpp 2013-04-26 20:35:20 UTC (rev 1975) @@ -85,6 +85,7 @@ { MOD_TYPE_PSM, "Epic Megagames MASI", "psm" }, { MOD_TYPE_MT2, "MadTracker 2", "mt2" }, { MOD_TYPE_DBM, "DigiBooster Pro", "dbm" }, + { MOD_TYPE_DIGI, "DigiBooster", "digi" }, { MOD_TYPE_IMF, "Imago Orpheus", "imf" }, { MOD_TYPE_J2B, "Galaxy Sound System", "j2b" }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |