summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Derrick Renaud <derrickr@mamedev.org>2009-10-06 00:45:35 +0000
committer Derrick Renaud <derrickr@mamedev.org>2009-10-06 00:45:35 +0000
commit1a8a712eed1380c8fb0713130709db8a744b575b (patch)
treee8aa802775ba8bda7bab961d200e4839e0c41dfa
parentd87c199d52f6caf87c94ef5842fdb2919f18cbbb (diff)
DISCRETE_CRFILTER, DISCRETE_RCFILTER
- revert vref change from rev 6979. - added capability for all values to be nodes. Starship 1 - fixed motor sounds.
-rw-r--r--src/emu/sound/disc_flt.c32
-rw-r--r--src/emu/sound/discrete.c2
-rw-r--r--src/emu/sound/discrete.h59
-rw-r--r--src/mame/audio/starshp1.c39
4 files changed, 77 insertions, 55 deletions
diff --git a/src/emu/sound/disc_flt.c b/src/emu/sound/disc_flt.c
index f6cc22918f0..b7bd7b57272 100644
--- a/src/emu/sound/disc_flt.c
+++ b/src/emu/sound/disc_flt.c
@@ -97,7 +97,7 @@ struct dst_rcdisc4_context
struct dst_rcfilter_context
{
double vCap;
- double vRef;
+ double rc;
double exponent;
};
@@ -147,18 +147,26 @@ static DISCRETE_STEP(dst_crfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ double rc = DST_CRFILTER__R * DST_CRFILTER__C;
+
+ if (rc != context->rc)
+ {
+ context->rc = rc;
+ context->exponent = RC_CHARGE_EXP(rc);
+ }
+
node->output[0] = DST_CRFILTER__IN - context->vCap;
//context->vCap += ((DST_CRFILTER__IN - context->vRef) - context->vCap) * context->exponent;
- context->vCap += (node->output[0] - context->vRef) * context->exponent;
+ context->vCap += (node->output[0] - DST_CRFILTER__VREF) * context->exponent;
}
static DISCRETE_RESET(dst_crfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
- context->exponent = RC_CHARGE_EXP(DST_CRFILTER__R * DST_CRFILTER__C);
- context->vCap = 0;
- context->vRef = DST_CRFILTER__VREF;
+ context->rc = DST_CRFILTER__R * DST_CRFILTER__C;
+ context->exponent = RC_CHARGE_EXP(context->rc);
+ context->vCap = 0;
node->output[0] = DST_CRFILTER__IN;
}
@@ -1021,20 +1029,28 @@ static DISCRETE_STEP(dst_rcfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ double rc = DST_RCFILTER__R * DST_RCFILTER__C;
+
+ if (rc != context->rc)
+ {
+ context->rc = rc;
+ context->exponent = RC_CHARGE_EXP(rc);
+ }
+
/************************************************************************/
/* Next Value = PREV + (INPUT_VALUE - PREV)*(1-(EXP(-TIMEDELTA/RC))) */
/************************************************************************/
context->vCap += ((DST_RCFILTER__VIN - node->output[0]) * context->exponent);
- node->output[0] = context->vCap + context->vRef;
+ node->output[0] = context->vCap + DST_RCFILTER__VREF;
}
static DISCRETE_RESET(dst_rcfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
- context->exponent = RC_CHARGE_EXP(DST_RCFILTER__R * DST_RCFILTER__C);
- context->vRef = DST_RCFILTER__VREF;
+ context->rc = DST_RCFILTER__R * DST_RCFILTER__C;
+ context->exponent = RC_CHARGE_EXP(context->rc);
context->vCap = 0;
node->output[0] = 0;
}
diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c
index ef090be819b..650e1d903b9 100644
--- a/src/emu/sound/discrete.c
+++ b/src/emu/sound/discrete.c
@@ -345,7 +345,7 @@ INLINE void step_nodes_in_list(const linked_list_entry *list)
*
*************************************/
-static node_description *discrete_find_node(const discrete_info *info,int node)
+static node_description *discrete_find_node(const discrete_info *info, int node)
{
if (node < NODE_START || node > NODE_END) return NULL;
return info->indexed_node[NODE_INDEX(node)];
diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h
index 6403a01e223..cd863c74f9c 100644
--- a/src/emu/sound/discrete.h
+++ b/src/emu/sound/discrete.h
@@ -285,8 +285,8 @@
* DISCRETE_FILTER1(NODE,ENAB,INP0,FREQ,TYPE)
* DISCRETE_FILTER2(NODE,ENAB,INP0,FREQ,DAMP,TYPE)
*
- * DISCRETE_CRFILTER(NODE,ENAB,IN0,RVAL,CVAL)
- * DISCRETE_CRFILTER_VREF(NODE,ENAB,IN0,RVAL,CVAL,VREF)
+ * DISCRETE_CRFILTER(NODE,IN0,RVAL,CVAL)
+ * DISCRETE_CRFILTER_VREF(NODE,IN0,RVAL,CVAL,VREF)
* DISCRETE_OP_AMP_FILTER(NODE,ENAB,INP0,INP1,TYPE,INFO)
* DISCRETE_RCDISC(NODE,ENAB,IN0,RVAL,CVAL)
* DISCRETE_RCDISC2(NODE,SWITCH,INP0,RVAL0,INP1,RVAL1,CVAL)
@@ -295,8 +295,8 @@
* DISCRETE_RCDISC5(NODE,ENAB,IN0,RVAL,CVAL)
* DISCRETE_RCINTEGRATE(NODE,INP0,RVAL0,RVAL1,RVAL2,CVAL,vP,TYPE)
* DISCRETE_RCDISC_MODULATED(NODE,INP0,INP1,RVAL0,RVAL1,RVAL2,RVAL3,CVAL,VP)
- * DISCRETE_RCFILTER(NODE,ENAB,IN0,RVAL,CVAL)
- * DISCRETE_RCFILTER_VREF(NODE,ENAB,IN0,RVAL,CVAL,VREF)
+ * DISCRETE_RCFILTER(NODE,IN0,RVAL,CVAL)
+ * DISCRETE_RCFILTER_VREF(NODE,IN0,RVAL,CVAL,VREF)
*
* DISCRETE_555_ASTABLE(NODE,RESET,R1,R2,C,OPTIONS)
* DISCRETE_555_ASTABLE_CV(NODE,RESET,R1,R2,C,CTRLV,OPTIONS)
@@ -2223,36 +2223,34 @@
*
* .------------.
* | |
- * ENAB -0------}| CR FILTER |
+ * | CR FILTER |
* | |
- * INPUT1 -1------}| --| |-+-- |
+ * INPUT1 -0------}| --| |-+-- |
* | C | |----} Netlist node
- * RVAL -2------}| Z |
+ * RVAL -1------}| Z |
* | Z R |
- * CVAL -3------}| | |
+ * CVAL -2------}| | |
* | vRef |
* '------------'
*
* Declaration syntax
*
* DISCRETE_CRFILTER(name of node,
- * enable
* input node (or value)
- * resistor value in OHMS
- * capacitor value in FARADS)
+ * resistor node or static value in OHMS
+ * capacitor node or static value in FARADS)
*
* DISCRETE_CRFILTER_VREF(name of node,
- * enable
* input node (or value)
* resistor value in OHMS
* capacitor value in FARADS,
- * vRef static value)
+ * vRef node or static value)
*
* Example config line
*
- * DISCRETE_CRFILTER(NODE_11,1,NODE_10,100,CAP_U(1))
+ * DISCRETE_CRFILTER(NODE_11,NODE_10,100,CAP_U(1))
*
- * Defines an always enabled CR filter with a 100R & 1uF network
+ * Defines a CR filter with a 100R & 1uF network
* the input is fed from NODE_10.
*
* This can be also thought of as a high pass filter with a 3dB cutoff
@@ -2478,33 +2476,38 @@
***********************************************************************
*
* DISCRETE_RCDISC - Simple single pole RC discharge network
+ * DISCRETE_RCFILTER_VREF - Same but refrenced to vRef not 0V
*
* .------------.
* | |
- * ENAB -0------>| RC |
+ * | RC |
* | |
- * INPUT1 -1------>| -ZZZZ-+-- |
+ * INPUT1 -0------>| -ZZZZ-+-- |
* | R | |----> Netlist node
- * RVAL -2------>| --- |
+ * RVAL -1------>| --- |
* | ---C |
- * CVAL -3------>| | |
- * | |
+ * CVAL -2------>| | |
+ * | vref |
* '------------'
*
* Declaration syntax
*
* DISCRETE_RCFILTER(name of node,
- * enable,
* input node (or value),
* resistor value in OHMS,
* capacitor value in FARADS)
*
+ * DISCRETE_RCFILTER_VREF(name of node,
+ * input node (or value)
+ * resistor value in OHMS
+ * capacitor value in FARADS,
+ * vRef node or static value)
+ *
* Example config line
*
- * DISCRETE_RCDISC(NODE_11,NODE_10,10,100,CAP_U(1))
+ * DISCRETE_RCDISC(NODE_11,10,100,CAP_U(1))
*
- * When enabled by NODE_10, C discharges from 10v as indicated by RC
- * of 100R & 1uF.
+ * C discharges from 10v as indicated by RC of 100R & 1uF.
*
***********************************************************************
*
@@ -4437,8 +4440,8 @@ enum
#define DISCRETE_FILTER2(NODE,ENAB,INP0,FREQ,DAMP,TYPE) { NODE, DST_FILTER2 , 5, { ENAB,INP0,NODE_NC,NODE_NC,NODE_NC }, { ENAB,INP0,FREQ,DAMP,TYPE }, NULL, "DISCRETE_FILTER2" },
/* Component specific */
#define DISCRETE_SALLEN_KEY_FILTER(NODE,ENAB,INP0,TYPE,INFO) { NODE, DST_SALLEN_KEY , 3, { ENAB,INP0,NODE_NC }, { ENAB,INP0,TYPE }, INFO, "DISCRETE_SALLEN_KEY_FILTER" },
-#define DISCRETE_CRFILTER(NODE,INP0,RVAL,CVAL) { NODE, DST_CRFILTER , 4, { INP0,NODE_NC,NODE_NC }, { INP0,RVAL,CVAL }, NULL, "DISCRETE_CRFILTER" },
-#define DISCRETE_CRFILTER_VREF(NODE,INP0,RVAL,CVAL,VREF) { NODE, DST_CRFILTER , 5, { INP0,NODE_NC,NODE_NC,NODE_NC }, { INP0,RVAL,CVAL,VREF }, NULL, "DISCRETE_CRFILTER_VREF" },
+#define DISCRETE_CRFILTER(NODE,INP0,RVAL,CVAL) { NODE, DST_CRFILTER , 4, { INP0,RVAL,CVAL }, { INP0,RVAL,CVAL }, NULL, "DISCRETE_CRFILTER" },
+#define DISCRETE_CRFILTER_VREF(NODE,INP0,RVAL,CVAL,VREF) { NODE, DST_CRFILTER , 5, { INP0,RVAL,CVAL,VREF }, { INP0,RVAL,CVAL,VREF }, NULL, "DISCRETE_CRFILTER_VREF" },
#define DISCRETE_OP_AMP_FILTER(NODE,ENAB,INP0,INP1,TYPE,INFO) { NODE, DST_OP_AMP_FILT , 4, { ENAB,INP0,INP1,NODE_NC }, { ENAB,INP0,INP1,TYPE }, INFO, "DISCRETE_OP_AMP_FILTER" },
#define DISCRETE_RCDISC(NODE,ENAB,INP0,RVAL,CVAL) { NODE, DST_RCDISC , 4, { ENAB,INP0,NODE_NC,NODE_NC }, { ENAB,INP0,RVAL,CVAL }, NULL, "DISCRETE_RCDISC" },
#define DISCRETE_RCDISC2(NODE,SWITCH,INP0,RVAL0,INP1,RVAL1,CVAL) { NODE, DST_RCDISC2 , 6, { SWITCH,INP0,NODE_NC,INP1,NODE_NC,NODE_NC }, { SWITCH,INP0,RVAL0,INP1,RVAL1,CVAL }, NULL, "DISCRETE_RCDISC2" },
@@ -4446,8 +4449,8 @@ enum
#define DISCRETE_RCDISC4(NODE,ENAB,INP0,RVAL0,RVAL1,RVAL2,CVAL,VP,TYPE) { NODE, DST_RCDISC4 , 8, { ENAB,INP0,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { ENAB,INP0,RVAL0,RVAL1,RVAL2,CVAL,VP,TYPE }, NULL, "DISCRETE_RCDISC4" },
#define DISCRETE_RCDISC5(NODE,ENAB,INP0,RVAL,CVAL) { NODE, DST_RCDISC5 , 4, { ENAB,INP0,NODE_NC,NODE_NC }, { ENAB,INP0,RVAL,CVAL }, NULL, "DISCRETE_RCDISC5" },
#define DISCRETE_RCDISC_MODULATED(NODE,INP0,INP1,RVAL0,RVAL1,RVAL2,RVAL3,CVAL,VP) { NODE, DST_RCDISC_MOD, 8, { INP0,INP1,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { INP0,INP1,RVAL0,RVAL1,RVAL2,RVAL3,CVAL,VP }, NULL, "DISCRETE_RCDISC_MODULATED" },
-#define DISCRETE_RCFILTER(NODE,INP0,RVAL,CVAL) { NODE, DST_RCFILTER , 3, { INP0,NODE_NC,NODE_NC }, { INP0,RVAL,CVAL }, NULL, "DISCRETE_RCFILTER" },
-#define DISCRETE_RCFILTER_VREF(NODE,INP0,RVAL,CVAL,VREF) { NODE, DST_RCFILTER , 4, { INP0,NODE_NC,NODE_NC,NODE_NC }, { INP0,RVAL,CVAL,VREF }, NULL, "DISCRETE_RCFILTER_VREF" },
+#define DISCRETE_RCFILTER(NODE,INP0,RVAL,CVAL) { NODE, DST_RCFILTER , 3, { INP0,RVAL,CVAL }, { INP0,RVAL,CVAL }, NULL, "DISCRETE_RCFILTER" },
+#define DISCRETE_RCFILTER_VREF(NODE,INP0,RVAL,CVAL,VREF) { NODE, DST_RCFILTER , 4, { INP0,RVAL,CVAL,VREF }, { INP0,RVAL,CVAL,VREF }, NULL, "DISCRETE_RCFILTER_VREF" },
#define DISCRETE_RCFILTER_SW(NODE,ENAB,INP0,SW,RVAL,CVAL1,CVAL2,CVAL3,CVAL4) { NODE, DST_RCFILTER_SW, 8, { ENAB,INP0,SW,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { ENAB,INP0,SW,RVAL,CVAL1,CVAL2,CVAL3,CVAL4 }, NULL, "DISCRETE_RCFILTER_SW" },
#define DISCRETE_RCINTEGRATE(NODE,INP0,RVAL0,RVAL1,RVAL2,CVAL,vP,TYPE) { NODE, DST_RCINTEGRATE , 7, { INP0,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { INP0,RVAL0,RVAL1,RVAL2,CVAL,vP,TYPE }, NULL, "DISCRETE_RCINTEGRATE" },
/* For testing - seem to be buggered. Use versions not ending in N. */
diff --git a/src/mame/audio/starshp1.c b/src/mame/audio/starshp1.c
index b3da5304d17..38b44a3093e 100644
--- a/src/mame/audio/starshp1.c
+++ b/src/mame/audio/starshp1.c
@@ -133,7 +133,7 @@ static const discrete_mixer_desc starshp1_final_mix =
DISC_MIXER_IS_RESISTOR,
{STARSHP1_R66, STARSHP1_R126, STARSHP1_R59 + STARSHP1_R60, STARSHP1_R74, STARSHP1_R75},
{0}, /* no resistor nodes */
- {0, STARSHP1_C78, STARSHP1_C36, 0, 0},
+ {0, STARSHP1_C78, 0, 0, 0},
0,
STARSHP1_R76,
0, /* no cF */
@@ -157,12 +157,8 @@ DISCRETE_SOUND_START( starshp1 )
DISCRETE_INPUT_LOGIC(STARSHP1_SL1)
DISCRETE_INPUT_LOGIC(STARSHP1_KICKER)
DISCRETE_INPUT_LOGIC(STARSHP1_PHASOR_ON)
+ DISCRETE_INPUT_NOT (STARSHP1_MOLVL)
DISCRETE_INPUT_NOT (STARSHP1_ATTRACT) /* Inverted by Q9 */
- /* when MOLVL is high, R58 is grounded, reducing the gain by 50% */
- /* we will cheat and calculate that now */
-#define STARSHP1_MOLVL_GAIN STARSHP1_MOLVL
-#define STARSHP1_MOLVL_GAIN_VAL RES_VOLTAGE_DIVIDER(STARSHP1_R59, STARSHP1_R58)
- DISCRETE_INPUTX_LOGIC(STARSHP1_MOLVL_GAIN, -STARSHP1_MOLVL_GAIN_VAL, STARSHP1_MOLVL_GAIN_VAL, 1)
/************************************************
* Noise
@@ -244,9 +240,22 @@ DISCRETE_SOUND_START( starshp1 )
STARSHP1_C34,
5, -10, NODE_41, /* VPOS,VNEG,VCHARGE */
DISC_566_OUT_TRIANGLE)
+ DISCRETE_SWITCH(NODE_43,
+ 1, /* ENAB */
+ STARSHP1_MOLVL, /* SWITCH */
+ STARSHP1_R59 + RES_2_PARALLEL(STARSHP1_R58, STARSHP1_R60 + STARSHP1_R76),
+ STARSHP1_R59 + STARSHP1_R60 + STARSHP1_R76)
+ DISCRETE_CRFILTER(NODE_44,
+ NODE_42, /* IN0 */
+ NODE_43, /* RVAL*/
+ STARSHP1_C36)
+ DISCRETE_SWITCH(NODE_45, /* gain affect of voltage divider */
+ 1, /* ENAB */
+ STARSHP1_MOLVL, /* SWITCH */
+ RES_VOLTAGE_DIVIDER(STARSHP1_R59, STARSHP1_R58), 1)
DISCRETE_MULTIPLY( STARSHP1_MOTOR_SND,
- NODE_42,
- STARSHP1_MOLVL_GAIN)
+ NODE_44,
+ NODE_45)
/************************************************
* SL1, SL2
@@ -264,16 +273,10 @@ DISCRETE_SOUND_START( starshp1 )
&starshp1_555_b10)
/* use switch instead of logic AND, so we can switch between
* 0V and the anti-aliased TTL level out that we set NODE_51 to. */
- DISCRETE_SWITCH( STARSHP1_SL1_SND, /* IC A10, pin 11 */
- 1, /* ENAB */
- STARSHP1_SL1,
- 0,
- NODE_51)
- DISCRETE_SWITCH( STARSHP1_SL2_SND, /* IC A10, pin 8 */
- 1, /* ENAB */
- STARSHP1_SL2,
- 0,
- NODE_51)
+ DISCRETE_ONOFF( STARSHP1_SL1_SND, /* IC A10, pin 11 */
+ STARSHP1_SL1, NODE_51)
+ DISCRETE_ONOFF( STARSHP1_SL2_SND, /* IC A10, pin 8 */
+ STARSHP1_SL2, NODE_51)
/************************************************
* Mixing and output