[nexuiz-commits] r6521 - trunk/data/qcsrc/client

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Apr 17 07:05:33 EDT 2009


Author: div0
Date: 2009-04-17 07:05:31 -0400 (Fri, 17 Apr 2009)
New Revision: 6521

Modified:
   trunk/data/qcsrc/client/bgmscript.qc
Log:
fix behaviour on "cd stop" etc. commands


Modified: trunk/data/qcsrc/client/bgmscript.qc
===================================================================
--- trunk/data/qcsrc/client/bgmscript.qc	2009-04-17 10:22:19 UTC (rev 6520)
+++ trunk/data/qcsrc/client/bgmscript.qc	2009-04-17 11:05:31 UTC (rev 6521)
@@ -1,3 +1,5 @@
+#define CONSTANT_SPEED_DECAY
+
 float bgmscriptbuf;
 float bgmscriptbufsize;
 float bgmscriptbufloaded;
@@ -4,11 +6,10 @@
 
 .float bgmscriptline;
 .float bgmscriptline0;
-.float bgmscriptvelocity;
+.float bgmscriptvolume;
 .float bgmscripttime;
 .float bgmscriptstate;
 .float bgmscriptstatetime;
-.float bgmscriptdelta;
 
 float GetAttackDecaySustainAmplitude(float a, float d, float s, float t)
 {
@@ -130,16 +131,44 @@
 		e.bgmscriptline = e.bgmscriptline0 = i;
 		if(i >= bgmscriptbufsize)
 		{
-			print("func_pointparticles: bgmscript does not define ", e.bgmscript, "\n");
+			print("ERROR: bgmscript does not define ", e.bgmscript, "\n");
 			e.bgmscript = "";
 		}
 	}
 }
 
+float GetCurrentAmplitude(entity e, float trel)
+{
+	if(e.bgmscriptstate)
+		return GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, trel) * e.bgmscriptvolume;
+	else
+	{
+#ifdef CONSTANT_SPEED_DECAY
+		return GetReleaseAmplitude(e.bgmscriptdecay, e.bgmscriptsustain * e.bgmscriptvolume, e.bgmscriptrelease, trel);
+#else
+		return GetReleaseAmplitude(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, trel) * e.bgmscriptvolume;
+#endif
+	}
+}
+
+float GetTimeForAmplitude(entity e, float amp)
+{
+	if(e.bgmscriptstate)
+		return GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvolume);
+	else
+	{
+#ifdef CONSTANT_SPEED_DECAY
+		return GetReleaseTime(e.bgmscriptdecay, e.bgmscriptsustain * e.bgmscriptvolume, e.bgmscriptrelease, amp);
+#else
+		return GetReleaseTime(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, amp / e.bgmscriptvolume);
+#endif
+	}
+}
+
 float BGMScript(entity e)
 {
 	float t;
-	float amp;
+	float amp, vel;
 
 	if(e.bgmscript == "")
 		return 1;
@@ -150,11 +179,21 @@
 	e.just_toggled = FALSE;
 
 	t = gettime(GETTIME_CDTRACK);
+	if(t < 0)
+		return -1;
+
 	if(t < e.bgmscripttime)
 	{
+		//print("reset ", e.bgmscript, "\n");
+		amp = GetCurrentAmplitude(e, e.bgmscripttime - e.bgmscriptstatetime + drawframetime);
+
 		e.bgmscriptline = e.bgmscriptline0;
-		e.bgmscripttime = 0;
-		e.bgmscriptstatetime = t - drawframetime - e.bgmscriptdelta; // FIXME this causes a tiny hitch
+		e.bgmscripttime = t;
+
+		// treat this as a stop event for all notes, to prevent sticking keys
+		e.bgmscriptstate = FALSE;
+		e.bgmscriptvolume = 1;
+		e.bgmscriptstatetime = t - GetTimeForAmplitude(e, amp);
 	}
 
 	// find the CURRENT line
@@ -173,36 +212,23 @@
 			e.bgmscriptline += 1;
 			e.bgmscripttime = stof(argv(1));
 
-			if(e.bgmscriptstate)
-				amp = GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscripttime - e.bgmscriptstatetime) * e.bgmscriptvelocity;
-			else
-				amp = GetReleaseAmplitude(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
+			amp = GetCurrentAmplitude(e, e.bgmscripttime - e.bgmscriptstatetime);
 
 			// time code reached!
-			e.bgmscriptvelocity = stof(argv(2));
-			if(e.bgmscriptvelocity > 0)
+			vel = stof(argv(2));
+			if(vel > 0)
+			{
 				e.just_toggled = e.bgmscriptstate = TRUE;
+				e.bgmscriptvolume = vel;
+			}
 			else
 				e.just_toggled = e.bgmscriptstate = FALSE;
 
-			if(e.bgmscriptstate)
-				e.bgmscriptstatetime = e.bgmscripttime - GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvelocity);
-			else
-				e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, amp);
+			e.bgmscriptstatetime = e.bgmscripttime - GetTimeForAmplitude(e, amp);
 		}
 	}
 
-	if(e.bgmscriptstate)
-	{
-		// attack, decay or sustain
-		e.bgmscriptdelta = t - e.bgmscriptstatetime;
-		return GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptdelta) * e.bgmscriptvelocity;
-	}
-	else
-	{
-		// release
-		e.bgmscriptdelta = t - e.bgmscriptstatetime;
-		return GetReleaseAmplitude(e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta);
-	}
+	e.bgmscripttime = t;
+	return GetCurrentAmplitude(e, t - e.bgmscriptstatetime);
 }
 



More information about the nexuiz-commits mailing list