summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Couriersud <couriersud@users.noreply.github.com>2008-04-25 08:42:13 +0000
committer Couriersud <couriersud@users.noreply.github.com>2008-04-25 08:42:13 +0000
commit0e77434bec15c0563eb6feaa0e20c30132981178 (patch)
tree931a39ad2cf5cc71dca80e2e16d54a0249e5b0ea /src/emu
parent85da621116a58bf03e757ea1d2610c54f339d1b3 (diff)
Added DISCRETE_KEY_SALLEN_FILTER to discrete sound system
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/sound/disc_flt.c56
-rw-r--r--src/emu/sound/discrete.c1
-rw-r--r--src/emu/sound/discrete.h51
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" },