|
From: <sag...@us...> - 2013-07-03 23:57:36
|
Revision: 2489
http://sourceforge.net/p/modplug/code/2489
Author: saga-games
Date: 2013-07-03 23:57:30 +0000 (Wed, 03 Jul 2013)
Log Message:
-----------
[Imp] AMS Loader: Support for reversed sample loop (no support in GUI for now)
[Fix] AMS Loader: Velvet Studio version was upside down.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Fastmix.cpp
trunk/OpenMPT/soundlib/Load_ams.cpp
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Fastmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-07-03 23:10:59 UTC (rev 2488)
+++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-07-03 23:57:30 UTC (rev 2489)
@@ -1340,7 +1340,15 @@
}
nInc = -nInc;
pChn->nInc = nInc;
- pChn->dwFlags.reset(CHN_PINGPONGFLAG); // go forward
+ if(pChn->dwFlags[CHN_PINGPONGLOOP])
+ {
+ pChn->dwFlags.reset(CHN_PINGPONGFLAG); // go forward
+ } else
+ {
+ pChn->dwFlags.set(CHN_PINGPONGFLAG);
+ pChn->nPos = pChn->nLength - 1;
+ pChn->nInc = -nInc;
+ }
if(!pChn->dwFlags[CHN_LOOP] || pChn->nPos >= pChn->nLength)
{
pChn->nPos = pChn->nLength;
Modified: trunk/OpenMPT/soundlib/Load_ams.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-07-03 23:10:59 UTC (rev 2488)
+++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-07-03 23:57:30 UTC (rev 2489)
@@ -647,6 +647,7 @@
smp16Bit = 0x04,
smpLoop = 0x08,
smpBidiLoop = 0x10,
+ smpReverse = 0x40,
};
uint32 length;
@@ -696,15 +697,19 @@
if(flags & smp16Bit)
{
- mptSmp.uFlags |= CHN_16BIT;
+ mptSmp.uFlags.set(CHN_16BIT);
}
if((flags & smpLoop) && mptSmp.nLoopStart < mptSmp.nLoopEnd)
{
- mptSmp.uFlags |= CHN_LOOP;
+ mptSmp.uFlags.set(CHN_LOOP);
if(flags & smpBidiLoop)
{
- mptSmp.uFlags |= CHN_PINGPONGLOOP;
+ mptSmp.uFlags.set(CHN_PINGPONGLOOP);
}
+ if(flags & smpReverse)
+ {
+ mptSmp.uFlags.set(CHN_REVRSE);
+ }
}
}
};
@@ -778,7 +783,7 @@
m_nChannels = 32;
SetModFlag(MSF_COMPATIBLE_PLAY, true);
SetupMODPanning(true);
- madeWithTracker = mpt::String::Format("Velvet Studio %d.%d", fileHeader.format >> 4, fileHeader.format & 0x0F);
+ madeWithTracker = mpt::String::Format("Velvet Studio %d.%02x", fileHeader.format & 0x0F, fileHeader.format >> 4);
// Instruments
std::vector<SAMPLEINDEX> firstSample; // First sample of instrument
Modified: trunk/OpenMPT/soundlib/Snd_defs.h
===================================================================
--- trunk/OpenMPT/soundlib/Snd_defs.h 2013-07-03 23:10:59 UTC (rev 2488)
+++ trunk/OpenMPT/soundlib/Snd_defs.h 2013-07-03 23:57:30 UTC (rev 2489)
@@ -124,7 +124,7 @@
// Channel flags:
enum ChannelFlags
{
- // Bits 0-7: Sample Flags
+ // Sample Flags
CHN_16BIT = 0x01, // 16-bit sample
CHN_LOOP = 0x02, // looped sample
CHN_PINGPONGLOOP = 0x04, // bidi-looped sample
@@ -132,8 +132,9 @@
CHN_PINGPONGSUSTAIN = 0x10, // sample with bidi sustain loop
CHN_PANNING = 0x20, // sample with forced panning
CHN_STEREO = 0x40, // stereo sample
+ CHN_REVRSE = 0x80, // start sample playback from sample / loop end (Velvet Studio feature) - this is intentionally the same flag as CHN_PINGPONGFLAG.
+ // Channel Flags
CHN_PINGPONGFLAG = 0x80, // when flag is on, sample is processed backwards
- // Bits 8-31: Channel Flags
CHN_MUTE = 0x100, // muted channel
CHN_KEYOFF = 0x200, // exit sustain
CHN_NOTEFADE = 0x400, // fade note (instrument mode)
@@ -158,7 +159,7 @@
DECLARE_FLAGSET(ChannelFlags)
-#define CHN_SAMPLEFLAGS (CHN_16BIT | CHN_LOOP | CHN_PINGPONGLOOP | CHN_SUSTAINLOOP | CHN_PINGPONGSUSTAIN | CHN_PANNING | CHN_STEREO | CHN_PINGPONGFLAG)
+#define CHN_SAMPLEFLAGS (CHN_16BIT | CHN_LOOP | CHN_PINGPONGLOOP | CHN_SUSTAINLOOP | CHN_PINGPONGSUSTAIN | CHN_PANNING | CHN_STEREO | CHN_PINGPONGFLAG | CHN_REVRSE)
#define CHN_CHANNELFLAGS (~CHN_SAMPLEFLAGS)
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-03 23:10:59 UTC (rev 2488)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-03 23:57:30 UTC (rev 2489)
@@ -1129,6 +1129,8 @@
pChn->nLength = pSmp->nLength;
pChn->nLoopEnd = pSmp->nLength;
pChn->nLoopStart = 0;
+ pChn->nPos = 0;
+ pChn->nPosLo = 0;
pChn->dwFlags = (pChn->dwFlags & CHN_CHANNELFLAGS) | (static_cast<ChannelFlags>(pSmp->uFlags) & CHN_SAMPLEFLAGS);
if(pChn->dwFlags[CHN_SUSTAINLOOP])
{
@@ -1143,8 +1145,13 @@
pChn->nLoopEnd = pSmp->nLoopEnd;
if (pChn->nLength > pChn->nLoopEnd) pChn->nLength = pChn->nLoopEnd;
}
- pChn->nPos = 0;
- pChn->nPosLo = 0;
+
+ if(pChn->dwFlags[CHN_REVRSE])
+ {
+ pChn->dwFlags.set(CHN_PINGPONGFLAG);
+ pChn->nPos = pChn->nLength - 1;
+ }
+
// Handle "retrigger" waveform type
if(pChn->nVibratoType < 4)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|