I've been attacking the envelope problems a bit more, mostly targeting problems with Radiant Silvergun, and I've came up with some more fixes. One problem I discovered is that if a slot was already in the release state, keying it off stopped it cold - this shouldn't be happening.

Patch against AO SDK release 1.1.1:
Code
--- aosdk_base\eng_ssf\scsp.c	2007-12-01 09:11:48.000000000 -0800
+++ aosdk\eng_ssf\scsp.c	2007-12-01 22:09:28.000000000 -0800
@@ -306,7 +306,7 @@
 	int Rate=base+(R<<1);
 	if(Rate>63)	Rate=63;
 	if(Rate<0) Rate=0;
-	return SCSP->ARTABLE[63-Rate];
+	return SCSP->DRTABLE[Rate];
 }
 
 static void Compute_EG(struct _SCSP *SCSP,struct _SLOT *slot)
@@ -366,9 +366,10 @@
 			slot->EG.volume-=slot->EG.RR;
 			if(slot->EG.volume<=0)
 			{
+				slot->EG.volume=0;
 				SCSP_StopSlot(slot,0);
-				slot->EG.volume=0x17F<<EG_SHIFT;
-				slot->EG.state=ATTACK;
+				//slot->EG.volume=0x17F<<EG_SHIFT;
+				//slot->EG.state=ATTACK;
 			}
 			break;
 		default:
@@ -421,7 +422,7 @@
 
 static void SCSP_StopSlot(struct _SLOT *slot,int keyoff)
 {
-	if(keyoff && slot->EG.state!=RELEASE)
+	if(keyoff /*&& slot->EG.state!=RELEASE*/)
 	{
 		slot->EG.state=RELEASE;
 	}
@@ -429,7 +430,6 @@
 	{
 		slot->active=0;
 	}
-
 	slot->udata.data[0]&=~0x800;
 }
 
@@ -559,7 +559,6 @@
 	{
 		SCSP->Slots[i].slot=i;
 		SCSP->Slots[i].active=0;
-		SCSP->Slots[i].active=0;
 		SCSP->Slots[i].base=NULL;
 	}
 
@@ -591,11 +590,11 @@
 				{
 					struct _SLOT *s2=SCSP->Slots+sl;
 					{
-						if(KEYONB(s2) && !s2->active)
+						if(KEYONB(s2) && s2->EG.state==RELEASE/*&& !s2->active*/)
 						{
 							SCSP_StartSlot(SCSP, s2);
 						}
-						if(!KEYONB(s2) && s2->active)
+						if(!KEYONB(s2) /*&& s2->active*/)
 						{
 							SCSP_StopSlot(s2,1);
 						}
@@ -1188,7 +1187,10 @@
 	if(!STWINH(slot))
 		*RBUFDST=sample;
 
-	sample=(sample*EG_TABLE[EG_Update(slot)>>(SHIFT-10)])>>SHIFT;
+	if(slot->EG.state==ATTACK)
+		sample=(sample*EG_Update(slot))>>SHIFT;
+	else
+		sample=(sample*EG_TABLE[EG_Update(slot)>>(SHIFT-10)])>>SHIFT;
 
 	return sample;
 }

Changes:
-Prevented keyoffs from killing slots when already in the release state
-Envelope steps in the attack state are apparently exponential. To account for this, I change the envelope output to linear for attacks.
-Change the release rate calculation to use the decay table instead of the attack one.



Also, I noticed in the MAME scsp.c source that the 16-bit PCM sample fix I posted earlier in this thread didn't get put in. Radiant Silvergun will need it for correct sound playback.

Here's the fix again, slightly modified so that it compiles without warnings in MAME (strict C90 compliance):

Code
--- mame_base\src\emu\sound\scsp.c	2007-11-18 15:54:28.000000000 -0800
+++ mame\src\emu\sound\scsp.c	2007-12-01 15:28:06.000000000 -0800
@@ -461,13 +461,15 @@
 
 static void SCSP_StartSlot(struct _SCSP *SCSP, struct _SLOT *slot)
 {
+	UINT32 start_offset;
 	slot->active=1;
-	slot->base=SCSP->SCSPRAM+SA(slot);
+	start_offset = PCM8B(slot) ? SA(slot) : SA(slot) & 0x7FFFE;
+	slot->base=SCSP->SCSPRAM + start_offset;
 	slot->cur_addr=0;
 	slot->step=SCSP_Step(slot);
 	Compute_EG(SCSP,slot);

Patch is against the most recent, unmodified scsp.c in MAME source.