[nexuiz-commits] r6520 - trunk/data/qcsrc/client
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Apr 17 06:22:21 EDT 2009
Author: div0
Date: 2009-04-17 06:22:19 -0400 (Fri, 17 Apr 2009)
New Revision: 6520
Modified:
trunk/data/qcsrc/client/bgmscript.qc
Log:
fix note-off during decay or attack stage when above sustain level
Modified: trunk/data/qcsrc/client/bgmscript.qc
===================================================================
--- trunk/data/qcsrc/client/bgmscript.qc 2009-04-17 09:40:24 UTC (rev 6519)
+++ trunk/data/qcsrc/client/bgmscript.qc 2009-04-17 10:22:19 UTC (rev 6520)
@@ -17,23 +17,45 @@
// decay: from 1 to s, in time d
// sustain: s
+ if(t < 0)
+ return 0;
+
if(a)
if(t <= a)
- return max(0, t / a);
+ return t / a;
if(d)
if(t <= a + d)
- return max(0, ((t - a) / d)) * (s - 1) + 1;
+ return ((t - a) / d) * (s - 1) + 1;
return s;
}
-float GetReleaseAmplitude(float s, float r, float t)
+float GetReleaseAmplitude(float d, float s, float r, float t)
{
- if(r)
- return s * (1 - min(1, t / r));
+ float decayval, releaseval;
+
+ if(!r)
+ return 0;
- return 0;
+ if(t > r)
+ return 0;
+
+ releaseval = s * (1 - t / r);
+
+ if(t < -d)
+ return 1;
+
+ if(t < 0 && t >= -d)
+ {
+ // pre-time decay
+ // value is s at time 0
+ // 1 at time -d
+ decayval = ((t + d) / d) * (s - 1) + 1;
+ return max(decayval, releaseval);
+ }
+
+ return releaseval;
}
float GetAttackTime(float a, float amp)
@@ -41,12 +63,29 @@
return amp * a;
}
-float GetReleaseTime(float s, float r, float amp)
+float GetReleaseTime(float d, float s, float r, float amp)
{
- if(s)
- return (1 - amp / s) * r;
+ float decaytime, releasetime;
- return 0;
+ if(!s)
+ return 0;
+
+ // if amp > s, we may be in the attack or in the prolonged decay curve
+ releasetime = (1 - amp / s) * r;
+
+ if(amp > s)
+ {
+ if(s == 1) // gracefully handle division by zero here
+ return 0;
+
+ // pre-time decay
+ // value is s at time 0
+ // 1 at time -d
+ decaytime = (amp - 1) / (s - 1) * d - d;
+ return max(decaytime, releasetime);
+ }
+
+ return releasetime;
}
void BGMScript_Init()
@@ -137,7 +176,7 @@
if(e.bgmscriptstate)
amp = GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscripttime - e.bgmscriptstatetime) * e.bgmscriptvelocity;
else
- amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
+ amp = GetReleaseAmplitude(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
// time code reached!
e.bgmscriptvelocity = stof(argv(2));
@@ -149,10 +188,7 @@
if(e.bgmscriptstate)
e.bgmscriptstatetime = e.bgmscripttime - GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvelocity);
else
- {
- e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptsustain, e.bgmscriptrelease, amp);
- amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
- }
+ e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, amp);
}
}
@@ -166,7 +202,7 @@
{
// release
e.bgmscriptdelta = t - e.bgmscriptstatetime;
- return GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta);
+ return GetReleaseAmplitude(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta);
}
}
More information about the nexuiz-commits
mailing list