Previous Thread
Next Thread
Print Thread
Page 2 of 55 1 2 3 4 54 55
Re: AO SDK release 1.1.1 available [Re: R. Belmont] #36149 12/02/07 06:39 AM
Joined: Sep 2007
Posts: 56
K
kingshriek Offline
Member
Offline
Member
K
Joined: Sep 2007
Posts: 56
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.

Re: AO SDK release 1.1.1 available [Re: kingshriek] #36154 12/02/07 03:30 PM
Joined: Mar 2001
Posts: 16,335
R
R. Belmont Online Content OP
Very Senior Member
OP Online Content
Very Senior Member
R
Joined: Mar 2001
Posts: 16,335
Ok, that's definitely much better. The drums at the start of Sakura Taisen #20 don't cut off immediately now, and Radient Silvergun is indeed quite improved. The 16-bit fix also corrects a few errant sound effects in Shienryu (one of the most underrated shmups ever, IMO).

Re: AO SDK release 1.1.2 available [Re: R. Belmont] #36155 12/02/07 03:45 PM
Joined: Mar 2001
Posts: 16,335
R
R. Belmont Online Content OP
Very Senior Member
OP Online Content
Very Senior Member
R
Joined: Mar 2001
Posts: 16,335
At the page.

Just syncs up the SCSP with the latest patches again.

BTW, these patches greatly improved NiGHTS also, except nights-2a has a weird pitch problem on the flute. Any ideas on that?

Re: AO SDK release 1.1.2 available [Re: R. Belmont] #36157 12/02/07 05:56 PM
Joined: Mar 2001
Posts: 16,335
R
R. Belmont Online Content OP
Very Senior Member
OP Online Content
Very Senior Member
R
Joined: Mar 2001
Posts: 16,335
I've launched my rip page. First up: a full SSF set of Radiant Silvergun from the ST-V version, fully tagged and timed. Plus a rarity that fell into my hands: a Qsound demo for the Saturn that was given away free to developers and made by game music legend Brian Schmidt. RSG will play quite nicely in the next AO test version (hopefully later today), but the QSound demo only works properly in kingshriek's KBmedia plugin for now.

Last edited by R. Belmont; 12/02/07 11:12 PM. Reason: I was on a bad spelling rampage this morning. all better.
Re: AO SDK release 1.1.2 available [Re: R. Belmont] #36162 12/02/07 07:42 PM
Joined: Dec 1969
Posts: 893
Richard Bannister Offline
Senior Member
Offline
Senior Member
Joined: Dec 1969
Posts: 893
Can you fire me over a code drop when you have a minute and I'll try to do a Mac version of this test too.


Noli umquam docere porcum cantare; perdes tempus et irritabis porcum.
Re: AO SDK release 1.1.2 available [Re: Richard Bannister] #36184 12/03/07 07:44 AM
Joined: Oct 2006
Posts: 976
S
Stiletto Offline
Senior Member
Offline
Senior Member
S
Joined: Oct 2006
Posts: 976
"Plus a rarity that fell into my hands: a Qsound demo for the Saturn that was given away free to developers and made by game music legend Brian Schmidt."

Amazing how things like that happen to turn up...

- Stiletto

Re: AO SDK release 1.1.2 available [Re: Stiletto] #36289 12/09/07 12:30 PM
Joined: Sep 2007
Posts: 56
K
kingshriek Offline
Member
Offline
Member
K
Joined: Sep 2007
Posts: 56
With the SCSP EG in pretty good shape, I have turned to fix some of the remaining issues in the DSP. The main fix I put in was support for the input effect mixer which fixes many of the dry/wet balance issues. I put in floating point support as well for ring-buffer read/writes. This fixes popping issues when the DSP initially reads from the ring-buffer, which most driver versions initialize to 0x6000 (the DSP floating-point representation of zero).

I also noticed that the EG_Update() function can possibly return a negative value in the DECAY1 state, which would potentially cause a segfault when later used as an index for table lookup (and if it doesn't, the output from it would probably sound very bad). I fixed this by adding a clamp to zero in the DECAY1 state.

I also took a brief look at LFO code and noticed that the saw PLFO was mistakenly set to a triangle waveform, so I fixed that too.

Patch against AO SDK 1.1.2:

Code:
diff -Nru aosdk_base/eng_ssf/scsp.c aosdk/eng_ssf/scsp.c
--- aosdk_base/eng_ssf/scsp.c	2007-12-02 10:27:02.000000000 -0800
+++ aosdk/eng_ssf/scsp.c	2007-12-09 04:09:59.000000000 -0800
@@ -351,6 +351,8 @@
 			break;
 		case DECAY1:
 			slot->EG.volume-=slot->EG.D1R;
+			if(slot->EG.volume<=0)
+				slot->EG.volume=0;
 			if(slot->EG.volume>>(EG_SHIFT+5)<slot->EG.DL)
 				slot->EG.state=DECAY2;
 			break;
@@ -1222,12 +1224,13 @@
 				++SCSP->BUFPTR;
 				SCSP->BUFPTR&=63;
 #ifdef USEDSP
-				SCSPDSP_SetSample(&SCSP->DSP,sample>>SHIFT,ISEL(slot),IMXL(slot));
+				Enc=((TL(slot))<<0x0)|((IMXL(slot))<<0xd);
+				SCSPDSP_SetSample(&SCSP->DSP,(sample*SCSP->LPANTABLE[Enc])>>SHIFT,ISEL(slot),IMXL(slot));
 #endif
 				Enc=((TL(slot))<<0x0)|((DIPAN(slot))<<0x8)|((DISDL(slot))<<0xd);
 				{
-					smpl+=(sample*SCSP->LPANTABLE[Enc])>>(SHIFT-1);
-					smpr+=(sample*SCSP->RPANTABLE[Enc])>>(SHIFT-1);
+					smpl+=(sample*SCSP->LPANTABLE[Enc])>>SHIFT;
+					smpr+=(sample*SCSP->RPANTABLE[Enc])>>SHIFT;
 				}
 			}
 
@@ -1240,14 +1243,14 @@
 			struct _SLOT *slot=SCSP->Slots+i;
 			if(EFSDL(slot))
 			{
-				unsigned short Enc=(TL(slot))|((EFPAN(slot))<<0x8)|((EFSDL(slot))<<0xd);
-				smpl+=(SCSP->DSP.EFREG[i]*SCSP->LPANTABLE[Enc])>>(SHIFT-4);
-				smpr+=(SCSP->DSP.EFREG[i]*SCSP->RPANTABLE[Enc])>>(SHIFT-4);
+				unsigned short Enc=((EFPAN(slot))<<0x8)|((EFSDL(slot))<<0xd);
+				smpl+=(SCSP->DSP.EFREG[i]*SCSP->LPANTABLE[Enc])>>SHIFT;
+				smpr+=(SCSP->DSP.EFREG[i]*SCSP->RPANTABLE[Enc])>>SHIFT;
 			}
 		}
 
-		*bufl++ = ICLIP16(smpl>>3);
-		*bufr++ = ICLIP16(smpr>>3);
+		*bufl++ = ICLIP16(smpl>>2);
+		*bufr++ = ICLIP16(smpr>>2);
 
 		SCSP_TimersAddTicks(SCSP, 1);
 		CheckPendingIRQ(SCSP);
diff -Nru aosdk_base/eng_ssf/scspdsp.c aosdk/eng_ssf/scspdsp.c
--- aosdk_base/eng_ssf/scspdsp.c	2007-10-26 19:43:40.000000000 -0700
+++ aosdk/eng_ssf/scspdsp.c	2007-12-09 03:58:38.000000000 -0800
@@ -7,19 +7,49 @@
 
 static UINT16 PACK(INT32 val)
 {
-	//cut to 16 bits
-	INT32 f=((UINT32 ) val)>>8;
-	return f;
+	UINT32 temp;
+	int sign,exponent,k;
+
+	sign = (val >> 23) & 0x1;
+	temp = (val ^ (val << 1)) & 0xFFFFFF;
+	exponent = 0;
+	for (k=0; k<12; k++)
+	{
+		if (temp & 0x800000)
+			break;
+		temp <<= 1;
+		exponent += 1;
+	}
+	if (exponent < 12)
+		val = (val << exponent) & 0x3FFFFF;
+	else
+		val <<= 11;
+	val >>= 11;
+	val |= sign << 15;
+	val |= exponent << 11;
+
+	return (UINT16)val;
 }
 
 static INT32 UNPACK(UINT16 val)
 {
-	INT32 r=val<<8;
-	r<<=8;
-	r>>=8;
-	//if(r&0x00800000)
-	//  r|=0xFF000000;
-	return r;
+	int sign,exponent,mantissa;
+	INT32 uval;
+
+	sign = (val >> 15) & 0x1;
+	exponent = (val >> 11) & 0xF;
+	mantissa = val & 0x7FF;
+	uval = mantissa << 11;
+	if (exponent > 11)
+		exponent = 11;
+	else
+		uval |= (sign ^ 1) << 22;
+	uval |= sign << 23;
+	uval <<= 8;
+	uval >>= 8;
+	uval >>= exponent;
+
+	return uval;
 }
 
 void SCSPDSP_Init(struct _SCSPDSP *DSP)
@@ -126,7 +156,7 @@
 		if(IRA<=0x1f)
 			INPUTS=DSP->MEMS[IRA];
 		else if(IRA<=0x2F)
-			INPUTS=DSP->MIXS[IRA-0x20]<<8;	//MIXS is 16 bit
+			INPUTS=DSP->MIXS[IRA-0x20]<<4;	//MIXS is 20 bit
 		else if(IRA<=0x31)
 			INPUTS=0;
 
@@ -298,7 +328,7 @@
 void SCSPDSP_SetSample(struct _SCSPDSP *DSP,INT32 sample,int SEL,int MXL)
 {
 	//DSP->MIXS[SEL]+=sample<<(MXL+1)/*7*/;
-	DSP->MIXS[SEL]+=sample<<7;
+	DSP->MIXS[SEL]+=sample;
 //  if(MXL)
 //      int a=1;
 }
diff -Nru aosdk_base/eng_ssf/scsplfo.c aosdk/eng_ssf/scsplfo.c
--- aosdk_base/eng_ssf/scsplfo.c	2007-10-26 19:43:36.000000000 -0700
+++ aosdk/eng_ssf/scsplfo.c	2007-12-08 07:01:00.000000000 -0800
@@ -47,7 +47,7 @@
 		if(i<128)
 			p=i;
 		else
-			p=255-i;    
+			p=i-256;    
 		ALFO_SAW[i]=a;
 		PLFO_SAW[i]=p;
 	


Changes:
- Added effect in mixer
- Added DSP floating-point support
- Added bounds check to the DECAY1 EG output
- Fixed the saw PLFO waveform

Re: AO SDK release 1.1.2 available [Re: kingshriek] #36292 12/09/07 04:33 PM
Joined: Mar 2001
Posts: 16,335
R
R. Belmont Online Content OP
Very Senior Member
OP Online Content
Very Senior Member
R
Joined: Mar 2001
Posts: 16,335
Wow, that fixes a lot of problems! Thanks again! smile

Re: AO SDK release 1.1.3 available [Re: R. Belmont] #36293 12/09/07 04:45 PM
Joined: Mar 2001
Posts: 16,335
R
R. Belmont Online Content OP
Very Senior Member
OP Online Content
Very Senior Member
R
Joined: Mar 2001
Posts: 16,335
These new fixes are now in version 1.1.3 of the SDK, for those playing along at home.

Re: AO SDK release 1.1.3 available [Re: R. Belmont] #36297 12/09/07 05:05 PM
Joined: Mar 2004
Posts: 621
belegdol Offline
Senior Member
Offline
Senior Member
Joined: Mar 2004
Posts: 621
Is that expected that make OSTYPE=linux is required for Linux build?

Page 2 of 55 1 2 3 4 54 55

Moderated by  R. Belmont, Richard Bannister 

Who's Online Now
4 registered members (Kale, R. Belmont, Pernod, zino), 125 guests, and 3 spiders.
Key: Admin, Global Mod, Mod
ShoutChat Box
Comment Guidelines: Do post respectful and insightful comments. Don't flame, hate, spam.
Forum Statistics
Forums9
Topics8,692
Posts114,252
Members4,865
Most Online510
Aug 26th, 2019
Powered by UBB.threads™ PHP Forum Software 7.7.3