From 1a8a712eed1380c8fb0713130709db8a744b575b Mon Sep 17 00:00:00 2001 From: Derrick Renaud Date: Tue, 6 Oct 2009 00:45:35 +0000 Subject: DISCRETE_CRFILTER, DISCRETE_RCFILTER - revert vref change from rev 6979. - added capability for all values to be nodes. Starship 1 - fixed motor sounds. --- src/emu/sound/disc_flt.c | 32 ++++++++++++++++++------- src/emu/sound/discrete.c | 2 +- src/emu/sound/discrete.h | 59 +++++++++++++++++++++++++---------------------- src/mame/audio/starshp1.c | 39 ++++++++++++++++--------------- 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 -- cgit v1.2.3