From: <re...@us...> - 2006-08-13 15:51:24
|
Revision: 162 Author: rewbs Date: 2006-08-13 08:51:11 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=162&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2006-08-13 15:49:22 UTC (rev 161) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2006-08-13 15:51:11 UTC (rev 162) @@ -944,39 +944,30 @@ // Volume Envelope if ((pChn->dwFlags & CHN_VOLENV) && (penv->nVolEnv)) { - int envpos = pChn->nVolEnvPosition; - UINT pt = penv->nVolEnv - 1; - for (UINT i=0; i<(UINT)(penv->nVolEnv-1); i++) - { - if (envpos <= penv->VolPoints[i]) - { - pt = i; - break; + int envvol = getVolEnvValueFromPosition(pChn->nVolEnvPosition, penv); + + // if we are in the release portion of the envelope, + // rescale envelope factor so that it is proportional to the release point + // and release envelope beginning. + if (penv->nVolEnvReleaseNode != ENV_RELEASE_NODE_UNSET + && pChn->nVolEnvPosition>=penv->VolPoints[penv->nVolEnvReleaseNode] + && pChn->nVolEnvValueAtReleaseJump != NOT_YET_RELEASED) { + int envValueAtReleaseJump = pChn->nVolEnvValueAtReleaseJump; + int envValueAtReleaseNode = penv->VolEnv[penv->nVolEnvReleaseNode] << 2; + + //If we have just hit the release node, force the current env value + //to be that of the release node. This works around the case where + // we have another node at the same position as the release node. + if (pChn->nVolEnvPosition==penv->VolPoints[penv->nVolEnvReleaseNode]) { + envvol=envValueAtReleaseNode; } + + int relativeVolumeChange = (envvol-envValueAtReleaseNode)*2; + envvol = envValueAtReleaseJump + relativeVolumeChange; } - int x2 = penv->VolPoints[pt]; - int x1, envvol; - if (envpos >= x2) - { - envvol = penv->VolEnv[pt] << 2; - x1 = x2; - } else - if (pt) - { - envvol = penv->VolEnv[pt-1] << 2; - x1 = penv->VolPoints[pt-1]; - } else - { - envvol = 0; - x1 = 0; - } - if (envpos > x2) envpos = x2; - if ((x2 > x1) && (envpos > x1)) - { - envvol += ((envpos - x1) * (((int)penv->VolEnv[pt]<<2) - envvol)) / (x2 - x1); - } if (envvol < 0) envvol = 0; - if (envvol > 256) envvol = 256; + if (envvol > 512) + envvol = 512; vol = (vol * envvol) >> 8; } // Panning Envelope @@ -1698,6 +1689,41 @@ } +int CSoundFile::getVolEnvValueFromPosition(int position, INSTRUMENTHEADER* penv) +{ + UINT pt = penv->nVolEnv - 1; + for (UINT i=0; i<(UINT)(penv->nVolEnv-1); i++) + { + if (position <= penv->VolPoints[i]) + { + pt = i; + break; + } + } + int x2 = penv->VolPoints[pt]; + int x1, envvol; + if (position >= x2) + { + envvol = penv->VolEnv[pt] << 2; + x1 = x2; + } else + if (pt) + { + envvol = penv->VolEnv[pt-1] << 2; + x1 = penv->VolPoints[pt-1]; + } else + { + envvol = 0; + x1 = 0; + } + if (position > x2) position = x2; + if ((x2 > x1) && (position > x1)) + { + envvol += ((position - x1) * (((int)penv->VolEnv[pt]<<2) - envvol)) / (x2 - x1); + } + return envvol; +} + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |