diff options
Diffstat (limited to 'src/mame/audio/subs.c')
-rw-r--r-- | src/mame/audio/subs.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/mame/audio/subs.c b/src/mame/audio/subs.c new file mode 100644 index 00000000000..ee3786aa427 --- /dev/null +++ b/src/mame/audio/subs.c @@ -0,0 +1,146 @@ +/************************************************************************* + + audio\subs.c + +*************************************************************************/ +#include "driver.h" +#include "subs.h" +#include "sound/discrete.h" + + +/*************************************************************************** +sub sound functions +***************************************************************************/ + +WRITE8_HANDLER( subs_sonar1_w ) +{ + discrete_sound_w(SUBS_SONAR1_EN, offset & 0x01); +} + +WRITE8_HANDLER( subs_sonar2_w ) +{ + discrete_sound_w(SUBS_SONAR2_EN, offset & 0x01); +} + +WRITE8_HANDLER( subs_crash_w ) +{ + discrete_sound_w(SUBS_CRASH_EN, offset & 0x01); +} + +WRITE8_HANDLER( subs_explode_w ) +{ + discrete_sound_w(SUBS_EXPLODE_EN, offset & 0x01); +} + +WRITE8_HANDLER( subs_noise_reset_w ) +{ + /* Pulse noise reset */ + discrete_sound_w(SUBS_NOISE_RESET, 0); +} + + +/************************************************************************/ +/* subs Sound System Analog emulation */ +/************************************************************************/ + +static const discrete_lfsr_desc subs_lfsr = +{ + DISC_CLK_IS_FREQ, + 16, /* Bit Length */ + 0, /* Reset Value */ + 13, /* Use Bit 13 as XOR input 0 */ + 14, /* Use Bit 14 as XOR input 1 */ + DISC_LFSR_XNOR, /* Feedback stage1 is XNOR */ + DISC_LFSR_OR, /* Feedback stage2 is just stage 1 output OR with external feed */ + DISC_LFSR_REPLACE, /* Feedback stage3 replaces the shifted register contents */ + 0x000001, /* Everything is shifted into the first bit only */ + 0, /* Output is already inverted by XNOR */ + 13 /* Output bit */ +}; + +/* Nodes - Sounds */ +#define SUBS_NOISE NODE_10 +#define SUBS_SONAR1_SND NODE_11 +#define SUBS_SONAR2_SND NODE_12 +#define SUBS_LAUNCH_SND NODE_13 +#define SUBS_CRASH_SND NODE_14 +#define SUBS_EXPLODE_SND NODE_15 + +DISCRETE_SOUND_START(subs) + /************************************************/ + /* subs Effects Relataive Gain Table */ + /* */ + /* NOTE: The schematic does not show the amp */ + /* stage so I will assume a 5K volume control. */ + /* */ + /* Effect V-ampIn Gain ratio Relative */ + /* Sonar 2.33 5/(5+2.7) 320.8 */ + /* Launch 3.8 5/(5+47) 77.5 */ + /* Crash 3.8 5/(5+22) 149.2 */ +/* Explosion 10.0 5/(5+5.6) 1000.0 */ + /************************************************/ + + /************************************************/ + /* Input register mapping for subs */ + /************************************************/ + /* NODE GAIN OFFSET INIT */ + DISCRETE_INPUTX_DATA(SUBS_SONAR1_EN, 400.0, 0, 0.0) + DISCRETE_INPUTX_DATA(SUBS_SONAR2_EN, 400.0, 0, 0.0) + DISCRETE_INPUTX_DATA(SUBS_LAUNCH_DATA, 77.5/15, 0, 0.0) + DISCRETE_INPUTX_DATA(SUBS_CRASH_DATA, 149.2/15, 0, 0.0) + DISCRETE_INPUT_NOT (SUBS_CRASH_EN) + DISCRETE_INPUT_NOT (SUBS_EXPLODE_EN) + DISCRETE_INPUT_PULSE(SUBS_NOISE_RESET, 1) + + /************************************************/ + /* Noise source */ + /* LFSR clk = 256H = 15750.0Hz */ + /************************************************/ + DISCRETE_LFSR_NOISE(SUBS_NOISE, SUBS_NOISE_RESET, SUBS_NOISE_RESET, 15750.0, 1.0, 0, 0, &subs_lfsr) + + /************************************************/ + /* Launch is just amplitude contolled noise */ + /************************************************/ + DISCRETE_MULTIPLY(SUBS_LAUNCH_SND, 1, SUBS_NOISE, SUBS_LAUNCH_DATA) + + /************************************************/ + /* Crash resamples the noise at 8V and then */ + /* controls the amplitude. */ + /* 8V = Hsync/2/8 = 15750/2/8 */ + /************************************************/ + DISCRETE_SQUAREWFIX(NODE_20, 1, 15750.0/2/8, 1.0, 50, 1.0/2, 0) /* Resample freq. */ + DISCRETE_SAMPLHOLD(NODE_21, 1, SUBS_NOISE, NODE_20, DISC_SAMPHOLD_REDGE) + DISCRETE_MULTIPLY(SUBS_CRASH_SND, SUBS_CRASH_EN, NODE_21, SUBS_CRASH_DATA) + + /************************************************/ + /* Explode filters the crash sound. */ + /* I'm not sure of the exact filter freq. */ + /************************************************/ + DISCRETE_TRANSFORM3(NODE_30, 1, NODE_21, SUBS_CRASH_DATA, 1000.0 / 149.2*7.6, "01*2*") + DISCRETE_FILTER2(SUBS_EXPLODE_SND, SUBS_EXPLODE_EN, NODE_30, 100.0, (1.0 / 7.6), DISC_FILTER_BANDPASS) + + /************************************************/ + /* Not sure how the sonar works yet. */ + /************************************************/ + DISCRETE_RCDISC2(NODE_40, SUBS_SONAR1_EN, SUBS_SONAR1_EN, 680000.0, SUBS_SONAR1_EN, 1000.0, 1e-6) /* Decay envelope */ + DISCRETE_ADDER2(NODE_41, 1, NODE_40, 800) + DISCRETE_LOGIC_AND(NODE_42, 1, SUBS_SONAR1_EN, SUBS_NOISE) + DISCRETE_TRIANGLEWAVE(SUBS_SONAR1_SND, NODE_42, NODE_41, 320.8, 0.0, 0) + + DISCRETE_RCDISC2(NODE_50, SUBS_SONAR2_EN, SUBS_SONAR2_EN, 18600.0, SUBS_SONAR2_EN, 20.0, 4.7e-6) /* Decay envelope */ + DISCRETE_ADDER2(NODE_51, 1, NODE_50, 800) + DISCRETE_LOGIC_AND(NODE_52, 1, SUBS_SONAR2_EN, SUBS_NOISE) + DISCRETE_TRIANGLEWAVE(SUBS_SONAR2_SND, NODE_52, NODE_51, 320.8, 0.0, 0) + + /************************************************/ + /* Combine all sound sources. */ + /* Add some final gain to get to a good sound */ + /* level. */ + /************************************************/ + + DISCRETE_ADDER4(NODE_90, 1, 0, SUBS_LAUNCH_SND, SUBS_CRASH_SND, SUBS_EXPLODE_SND) + DISCRETE_ADDER4(NODE_91, 1, 0, SUBS_LAUNCH_SND, SUBS_CRASH_SND, SUBS_EXPLODE_SND) + + DISCRETE_OUTPUT(NODE_90, 65534.0/(320.8+77.5+149.2+1000.0)) + DISCRETE_OUTPUT(NODE_91, 65534.0/(320.8+77.5+149.2+1000.0)) +DISCRETE_SOUND_END |