diff options
author | 2008-04-25 08:42:13 +0000 | |
---|---|---|
committer | 2008-04-25 08:42:13 +0000 | |
commit | 0e77434bec15c0563eb6feaa0e20c30132981178 (patch) | |
tree | 931a39ad2cf5cc71dca80e2e16d54a0249e5b0ea /src/emu | |
parent | 85da621116a58bf03e757ea1d2610c54f339d1b3 (diff) |
Added DISCRETE_KEY_SALLEN_FILTER to discrete sound system
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/sound/disc_flt.c | 56 | ||||
-rw-r--r-- | src/emu/sound/discrete.c | 1 | ||||
-rw-r--r-- | src/emu/sound/discrete.h | 51 |
3 files changed, 106 insertions, 2 deletions
diff --git a/src/emu/sound/disc_flt.c b/src/emu/sound/disc_flt.c index 64f3f6fd800..47e32635a1a 100644 --- a/src/emu/sound/disc_flt.c +++ b/src/emu/sound/disc_flt.c @@ -294,6 +294,62 @@ static void dst_filter2_reset(node_description *node) node->output[0]=0; } +/************************************************************************ + * + * DST_SALLEN_KEY - Sallen-Key filter circuit + * + * input[0] - Enable input value + * input[1] - IN0 node + * input[3] - Filter Type + * + * also passed discrete_op_amp_filt_info structure + * + * 2008, couriersud + ************************************************************************/ +#define DST_SALLEN_KEY__ENABLE (*(node->input[0])) +#define DST_SALLEN_KEY__INP0 (*(node->input[1])) +#define DST_SALLEN_KEY__TYPE (*(node->input[2])) + +static void dst_sallen_key_step(node_description *node) +{ + struct dss_filter2_context *context = node->context; + double gain = 1.0; + + if (DST_SALLEN_KEY__ENABLE == 0.0) + { + gain = 0.0; + } + + node->output[0] = -context->a1*context->y1 - context->a2*context->y2 + + context->b0*gain*DST_SALLEN_KEY__INP0 + context->b1*context->x1 + context->b2*context->x2; + + context->x2 = context->x1; + context->x1 = gain * DST_SALLEN_KEY__INP0; + context->y2 = context->y1; + context->y1 = node->output[0]; +} + +static void dst_sallen_key_reset(node_description *node) +{ + struct dss_filter2_context *context = node->context; + const discrete_op_amp_filt_info *info = node->custom; + double freq, q; + + switch ((int) DST_SALLEN_KEY__TYPE) + { + case DISC_SALLEN_KEY_LOW_PASS: + freq = 1.0 / ( 2.0 * M_PI * sqrt(info->c1 * info->c2 * info->r1 * info->r2)); + q = sqrt(info->c1 * info->c2 * info->r1 * info->r2) / (info->c2 * (info->r1 + info->r2)); + break; + default: + fatalerror("Unknown sallen key filter type"); + } + + calculate_filter2_coefficients(freq, 1.0 / q, DISC_FILTER_LOWPASS, + &context->a1, &context->a2, + &context->b0, &context->b1, &context->b2); + node->output[0]=0; +} /************************************************************************ * diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c index bb5ec8a9149..55693e36a42 100644 --- a/src/emu/sound/discrete.c +++ b/src/emu/sound/discrete.c @@ -234,6 +234,7 @@ static const discrete_module module_list[] = { DST_FILTER1 ,"DST_FILTER1" , 1 ,sizeof(struct dss_filter1_context) ,dst_filter1_reset ,dst_filter1_step }, { DST_FILTER2 ,"DST_FILTER2" , 1 ,sizeof(struct dss_filter2_context) ,dst_filter2_reset ,dst_filter2_step }, /* Component specific modules */ + { DST_SALLEN_KEY ,"DST_SALLEN_KEY" , 1 ,sizeof(struct dss_filter2_context) ,dst_sallen_key_reset ,dst_sallen_key_step }, { DST_CRFILTER ,"DST_CRFILTER" , 1 ,sizeof(struct dst_rcfilter_context) ,dst_crfilter_reset ,dst_crfilter_step }, { DST_OP_AMP_FILT ,"DST_OP_AMP_FILT" , 1 ,sizeof(struct dst_op_amp_filt_context) ,dst_op_amp_filt_reset ,dst_op_amp_filt_step }, { DST_RCDISC ,"DST_RCDISC" , 1 ,sizeof(struct dst_rcdisc_context) ,dst_rcdisc_reset ,dst_rcdisc_step }, diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h index f0b74ae583e..1637b7e6212 100644 --- a/src/emu/sound/discrete.h +++ b/src/emu/sound/discrete.h @@ -2222,9 +2222,9 @@ * .--|+ / * r4 | | / * vRef >------------ZZZZ-------' |/ - * + * * EXAMPLES: see Polaris -* + * * -------------------------------------------------- * * DISC_OP_AMP_FILTER_IS_BAND_PASS_0 | DISC_OP_AMP_IS_NORTON @@ -2247,6 +2247,46 @@ * *********************************************************************** * + * DISCRETE_SALLEN_KEY_FILTER - Sallen key low pass filter + * + * Declaration syntax + * + * DISCRETE_SALLEN_KEY_FILTER(name of node, + * enable node or static value, + * input node or static value, + * type static value, + * address of discrete_op_amp_filt_info) + * + * discrete_op_amp_filt_info = {r1, r2, r3, r4, rF, c1, c2, c3, vRef, vP, vN} + * + * Note: Set all unused components to 0. + * + * Types: + * + * DISC_SALLEN_KEY_LOWPASS + * + * .---------. + * | | + * | |\ | + * | | \ | + * `--|- \ | + * R1 R2 | >--+----> Netlist Node + * IN >---ZZZZ--+--ZZZZ--+------|+ / | + * | | | / | + * --- --- |/ | + * --- C1 --- C2 | + * | | | + * | gnd | + * | | + * `----------------------' + * + * EXAMPLES: see moon patrol, dkong + * + * References: + * http://www.t-linespeakers.org/tech/filters/Sallen-Key.html + * http://en.wikipedia.org/wiki/Sallen_Key_filter + *********************************************************************** + * * DISCRETE_RCDISC - Simple single pole RC discharge network * * .------------. @@ -3239,6 +3279,11 @@ enum #define DISC_OP_AMP_FILTER_TYPE_MASK (0xf0 | DISC_OP_AMP_IS_NORTON) // Used only internally. +/* Sallen-Key filter Opions */ +#define DISC_SALLEN_KEY_LOW_PASS 0x01 +#define DISC_SALLEN_KEY_HIGH_PASS 0x02 + + /* Op Amp Oscillator Flags */ #define DISC_OP_AMP_OSCILLATOR_1 0x00 #define DISC_OP_AMP_OSCILLATOR_VCO_1 0x80 @@ -3830,6 +3875,7 @@ enum DST_FILTER1, /* 1st Order Filter, Low or High Pass */ DST_FILTER2, /* 2nd Order Filter, Low, High, or Band Pass */ /* Component specific */ + DST_SALLEN_KEY, /* Sallen key filters */ DST_CRFILTER, /* RC Bypass Filter (High Pass) */ DST_OP_AMP_FILT, /* Op Amp filters */ DST_RCDISC, /* Simple RC discharge */ @@ -3985,6 +4031,7 @@ enum #define DISCRETE_FILTER1(NODE,ENAB,INP0,FREQ,TYPE) { NODE, DST_FILTER1 , 4, { ENAB,INP0,NODE_NC,NODE_NC }, { ENAB,INP0,FREQ,TYPE }, NULL, "1st Order Filter" }, #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, "2nd Order Filter" }, /* 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, "Sallen-Key Filter" }, #define DISCRETE_CRFILTER(NODE,ENAB,INP0,RVAL,CVAL) { NODE, DST_CRFILTER , 4, { ENAB,INP0,NODE_NC,NODE_NC }, { ENAB,INP0,RVAL,CVAL }, NULL, "CR Filter" }, #define DISCRETE_CRFILTER_VREF(NODE,ENAB,INP0,RVAL,CVAL,VREF) { NODE, DST_CRFILTER , 5, { ENAB,INP0,NODE_NC,NODE_NC,NODE_NC }, { ENAB,INP0,RVAL,CVAL,VREF }, NULL, "CR Filter to 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, "Op Amp Filter" }, |