// license:BSD-3-Clause // copyright-holders:Derrick Renaud /************************************************************************* audio\videopin.c *************************************************************************/ #include "emu.h" #include "includes/videopin.h" #include "sound/discrete.h" /************************************************************************/ /* videopin Sound System Analog emulation */ /* Jan 2004, Derrick Renaud */ /************************************************************************/ /* Nodes - Sounds */ #define VIDEOPIN_VOL_SND NODE_10 #define VIDEOPIN_BELL_SND NODE_11 #define VIDEOPIN_BONG_SND NODE_12 DISCRETE_SOUND_START(videopin_discrete) /************************************************/ /* videopin Effects Relataive Gain Table */ /* */ /* Effect V-ampIn Gain ratio Relative */ /* Vol0 3.8 10/(10+50) 1000.0 */ /* Bell 4.4 (47+10)/(47+10+50) 740.2 */ /* Bong 3.8 10/(10+50) 1000.0 */ /************************************************/ /************************************************/ /* Input register mapping for videopin */ /************************************************/ /* NODE GAIN OFFSET INIT */ DISCRETE_INPUT_DATA (VIDEOPIN_OCTAVE_DATA) DISCRETE_INPUT_DATA (VIDEOPIN_NOTE_DATA) DISCRETE_INPUT_NOT (VIDEOPIN_BELL_EN) DISCRETE_INPUT_LOGIC(VIDEOPIN_BONG_EN) DISCRETE_INPUT_NOT (VIDEOPIN_ATTRACT_EN) DISCRETE_INPUTX_DATA(VIDEOPIN_VOL_DATA, 1000.0/7.0, 0.0, 0.0) /************************************************/ /************************************************/ /* Vol0,1,2 are 3 different amplitudes of the */ /* same note. It has a selectable octave and */ /* selectable frequency. */ /* The base frequency is */ /* 12.096MHz / octave / 3 / note freq / 2 */ /* The final /2 is just to give a 50% duty, */ /* so we can just start by 12.096MHz/6/octave */ /* The octave is selected by 3 bits selecting */ /* 000 32H = 12096MHz / 2 / 2 / 32 */ /* 001 16H = 12096MHz / 2 / 2 / 16 */ /* 010 8H = 12096MHz / 2 / 2 / 8 */ /* 011 4H = 12096MHz / 2 / 2 / 4 */ /* 100 2H = 12096MHz / 2 / 2 / 2 */ /* 101 1H = 12096MHz / 2 / 2 / 1 */ /* 110 6MHz = 12096MHz / 2 */ /* 111 0V = Disable */ /* We will convert the 3 octave bits to a */ /* divide value in the driver before sending */ /* to the sound interface. */ /* */ /* note data: 0xff = off, */ /* 0xfe = /2, */ /* 0x00 = /256 */ /* We will send the note data bit inverted to */ /* sound interface so it is easier to work with */ /************************************************/ // We will disable the divide if VIDEOPIN_OCTAVE_DATA = 0 DISCRETE_DIVIDE(NODE_20, VIDEOPIN_OCTAVE_DATA, 12096000.0 /3.0 / 2.0, VIDEOPIN_OCTAVE_DATA) DISCRETE_ADDER2(NODE_21, 1, VIDEOPIN_NOTE_DATA, 1) // We will disable the divide if VIDEOPIN_NOTE_DATA = 0 DISCRETE_DIVIDE(NODE_22, VIDEOPIN_NOTE_DATA, NODE_20, NODE_21) // freq DISCRETE_SQUAREWAVE(VIDEOPIN_VOL_SND, VIDEOPIN_OCTAVE_DATA, NODE_22, VIDEOPIN_VOL_DATA, 50.0, 0, 0.0) /************************************************/ /* Bong is just a triggered 32V signal */ /************************************************/ DISCRETE_SQUAREWFIX(VIDEOPIN_BONG_SND, VIDEOPIN_BONG_EN, 15750.0/64.0, 1000.0, 50.0, 0, 0.0) /************************************************/ /* Bell is Hsync/16 with an R/C decay amplitude */ /* the 1uF cap is rapidally charged when BELL */ /* is enabled, then dischaged through the 1M */ /* resistor when disabled. */ /* We use 180 phase because of inverter Q17, */ /* but it rally has no effect on sound. */ /************************************************/ DISCRETE_RCDISC2(NODE_30, VIDEOPIN_BELL_EN, 740.2, 1, 0, 1e6, 1e-6) DISCRETE_SQUAREWFIX(VIDEOPIN_BELL_SND, VIDEOPIN_BELL_EN, 15750.0/16.0, NODE_30, 50.0, 0, 180.0) /************************************************/ /* Final mix and output. */ /************************************************/ DISCRETE_ADDER3(NODE_90, VIDEOPIN_ATTRACT_EN, VIDEOPIN_VOL_SND, VIDEOPIN_BELL_SND, VIDEOPIN_BONG_SND) DISCRETE_OUTPUT(NODE_90, 65534.0/(1000.0 + 740.2 + 1000.0)) DISCRETE_SOUND_END