mirror of
https://github.com/holub/mame
synced 2025-06-30 16:00:01 +03:00
mw8080bw: multiple improvements to gunfight netlist audio
Model for transistors adjusted, replacing default NPN transistor model with a high-gain NPN transistor type that more closely resembles those used by the real Gun Fight sound circuits. This has a quite obvious effect on the shot sounds, and it seems the circuits were designed for this effect. Made all volume potentiometers user-adjustable; previously fixed at 50%. Replaced abstract model of noise generator with component-level one, including a model of the generator's zener diode. Zener noise is provided by an associated Gaussian white noise source running off a 48 kHz clock. Both the zener diode and Gaussian white noise source are component models recently added to the netlist library. Supply voltage to amplifying transistors tweaked downward from 16.5 volts to 16 volts, determined by properly analyzing power supply circuit and confirmed with a documented reference. Much more commentary describing the sound circuits' function and modeling issues.
This commit is contained in:
parent
e07a7f19b5
commit
f2145ce867
File diff suppressed because it is too large
Load Diff
@ -715,6 +715,24 @@ void seawolf_audio_device::device_start()
|
||||
*
|
||||
*************************************/
|
||||
|
||||
// Sound board volume potentiometers. By default, these are all set to their
|
||||
// midpoint values.
|
||||
|
||||
static INPUT_PORTS_START(gunfight_audio)
|
||||
PORT_START("POT_1_LEFT_MASTER_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Left Master Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_left_master_vol")
|
||||
PORT_START("POT_2_RIGHT_MASTER_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Right Master Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_right_master_vol")
|
||||
PORT_START("POT_3_LEFT_SHOT_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Left Shot Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_left_shot_vol")
|
||||
PORT_START("POT_4_RIGHT_SHOT_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Right Shot Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_right_shot_vol")
|
||||
PORT_START("POT_5_LEFT_HIT_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Left Hit Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_left_hit_vol")
|
||||
PORT_START("POT_6_RIGHT_HIT_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Right Hit Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_right_hit_vol")
|
||||
INPUT_PORTS_END
|
||||
|
||||
gunfight_audio_device::gunfight_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
|
||||
device_t(mconfig, GUNFIGHT_AUDIO, tag, owner, clock),
|
||||
m_left_shot(*this, "sound_nl:left_shot"),
|
||||
@ -733,10 +751,10 @@ void gunfight_audio_device::write(u8 data)
|
||||
// the 74175 latches and inverts the top 4 bits
|
||||
switch ((~data >> 4) & 0x0f)
|
||||
{
|
||||
case 0x01: // LEFT SHOOT sound (left speaker)
|
||||
case 0x01: // LEFT SHOT sound (left speaker)
|
||||
m_left_shot->write_line(1);
|
||||
break;
|
||||
case 0x02: // RIGHT SHOOT sound (right speaker)
|
||||
case 0x02: // RIGHT SHOT sound (right speaker)
|
||||
m_right_shot->write_line(1);
|
||||
break;
|
||||
case 0x03: // LEFT HIT sound (left speaker)
|
||||
@ -770,15 +788,30 @@ void gunfight_audio_device::device_add_mconfig(machine_config &config)
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:left_hit", "I_LEFT_HIT.IN", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:right_hit", "I_RIGHT_HIT.IN", 0);
|
||||
|
||||
// Multipliers set so that the highest output spikes of
|
||||
// +/- 3 volts at mid potentiometer settings give safe
|
||||
// non-clipping sample values of +/- 30,000. This would
|
||||
// lead to clipping if all the potentiometers were set to max,
|
||||
// but that's unlikely to happen, since the potentiometers are
|
||||
// currently fixed and even on the real machine were service
|
||||
// adjustments only.
|
||||
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUT_L").set_mult_offset(30000.0 / 3.0, 0.0);
|
||||
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout1", 1, "OUT_R").set_mult_offset(30000.0 / 3.0, 0.0);
|
||||
// With all the volume potentiometers at their default midpoint
|
||||
// settings, the highest output spikes are around +/- 3 volts, for an
|
||||
// extreme output swing of 6 volts. Gun Fight's audio power amplifiers
|
||||
// are configured with a voltage gain of 15 and have a single power
|
||||
// supply of about 22 volts, so they will definitely clip the highest
|
||||
// output peaks, but we don't model them. Instead, be cautious: scale
|
||||
// the outputs before the power amps so that the highest output spikes
|
||||
// of +/- 3 volts just reach the clipping limits for signed 16-bit
|
||||
// samples.
|
||||
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUT_L").set_mult_offset(32767.0 / 3.0, 0.0);
|
||||
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout1", 1, "OUT_R").set_mult_offset(32767.0 / 3.0, 0.0);
|
||||
|
||||
// Netlist volume-potentiometer interfaces
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_left_master_vol", "R103.DIAL");
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_right_master_vol", "R203.DIAL");
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_left_shot_vol", "R123.DIAL");
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_right_shot_vol", "R223.DIAL");
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_left_hit_vol", "R110.DIAL");
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_right_hit_vol", "R210.DIAL");
|
||||
}
|
||||
|
||||
ioport_constructor gunfight_audio_device::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME(gunfight_audio);
|
||||
}
|
||||
|
||||
void gunfight_audio_device::device_start()
|
||||
|
@ -56,6 +56,7 @@ public:
|
||||
|
||||
protected:
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
virtual void device_start() override;
|
||||
|
||||
private:
|
||||
|
@ -4,86 +4,252 @@
|
||||
#include "netlist/devices/net_lib.h"
|
||||
|
||||
|
||||
#ifndef __PLIB_PREPROCESSOR__
|
||||
|
||||
#define NOISE(_name) \
|
||||
NET_REGISTER_DEV(NOISE, _name)
|
||||
|
||||
#endif
|
||||
|
||||
#define USE_FRONTIERS 1
|
||||
#define FAST_SWITCHES 1
|
||||
|
||||
// I got this circuit's layout from Midway's schematic, "Gun Fight Sound
|
||||
// Generator Detail P.C. 597-907E".
|
||||
// This is a netlist description for the sound circuits of Midway's Gun Fight,
|
||||
// based on Midway's schematic "Gun Fight Sound Generator Detail P.C.
|
||||
// 597-907E".
|
||||
//
|
||||
// (This sound circuitry seems to have evolved from that for an older Midway
|
||||
// game, an electromechanical rifle game from 1974 called Twin Pirate Gun. The
|
||||
// schematics for Twin Pirate Gun's sound circuitry (P.C. 569-907-88),
|
||||
// although not completely identical to Gun Fight's, are similar both in
|
||||
// general structure and in many details.)
|
||||
//
|
||||
// Gun Fight's sound effects are simple "bang" sounds, both for the shooting
|
||||
// of bullets and for bullets hitting targets. The effects are directed to the
|
||||
// left or right speaker, depending on whether the left or right player is
|
||||
// shooting or being hit. (Hits to obstacles get the same sound as hits to the
|
||||
// right player and thus play from the right speaker.) Each sound effect gets
|
||||
// a different pitch, with shots being higher pitched than hits. Shot sounds
|
||||
// also decay faster than hit sounds and have slightly separated initial and
|
||||
// secondary attacks, resulting in a "ka-pow" effect.
|
||||
//
|
||||
// The sounds are generated in stages by different sections of the circuitry.
|
||||
// A noise generator, based on a zener diode, continuously produces white
|
||||
// noise that forms the basis for all the sounds, and this noise is fed to
|
||||
// four separate sound generators. Each generator filters the noise to produce
|
||||
// the distinct pitch of its sound. Each generator's sound is triggered by a
|
||||
// switch, activated digitally by the CPU. When this switch is turned on
|
||||
// momentarily, a storage capacitor is charged up, and that sends power to the
|
||||
// sound generator's transistor amplifier. This amplifies the filtered noise
|
||||
// with a sharp attack as the switch is turned on and gradual decay as the
|
||||
// capacitor drains. The generated sound is filtered further and then
|
||||
// attenuated by a potentiometer which controls that sound's relative volume.
|
||||
// Each side's two sound effect signals, after being generated and then
|
||||
// attenuated by their respective volume pots, are mixed together and then
|
||||
// further amplified by a second-stage transistor amplifier for that side.
|
||||
// This mixed and amplified signal is itself filtered and then attenuated by
|
||||
// the side's master volume potentiometer. Finally it gets sent to the power
|
||||
// amplifier IC for that side's speaker. (This emulation does not handle the
|
||||
// final power amplification.)
|
||||
//
|
||||
// The different sound effect generators have a common structure which is
|
||||
// repeated four times. The mixers and second-stage amplifiers likewise have a
|
||||
// common structure which is repeated twice, and their amplifiers are also
|
||||
// rather similar to the effect amplifiers.
|
||||
//
|
||||
// To make the netlist easier to follow and verify, I've grouped its
|
||||
// components and connections by function, with the groups ordered roughly
|
||||
// according to the flow of signals:
|
||||
//
|
||||
// * the activating switches,
|
||||
// * the shared noise generator,
|
||||
// * the sound-effect noise filters,
|
||||
// * the sound-effect initial amplifiers, output coupling capacitors and
|
||||
// filters, and effect-volume potentiometers,
|
||||
// * the mixing circuits,
|
||||
// * the second-stage amplifiers, output coupling capacitors and filters, and
|
||||
// master-volume potentiometers.
|
||||
//
|
||||
// Within each group, I've placed the sets of four similar components or
|
||||
// connections together and listed them in the order: left-shot, right-shot,
|
||||
// left-hit, right-hit. (For mixing and second-stage amplification components,
|
||||
// the order is simply left, right.) Individual components are labeled the
|
||||
// same as on the schematic.
|
||||
|
||||
|
||||
// There are some uncertainties in this emulation about sound levels. The
|
||||
// average level of the initially generated noise is uncertain, which poses a
|
||||
// problem because all of the sound effects are based on amplifying that
|
||||
// noise. The noise is generated by passing a small amount of current through
|
||||
// a zener diode on the verge of its breakdown voltage, which results in very
|
||||
// noisy current flow. Even though both the type of zener and the average
|
||||
// current are known, the average strength of the noise is still uncertain,
|
||||
// both because zener manufacturers do not specify performance under these
|
||||
// conditions (they recommended zeners for voltage control under more stable,
|
||||
// relatively noise-free operating conditions) and because the amount of noise
|
||||
// may vary greatly from one zener to the next, even within the same
|
||||
// production batch--let alone from one manufacturer to another. This is an
|
||||
// inherent problem with zener diodes when used for noise generation.
|
||||
//
|
||||
// I have chosen a round figure of 2 mV RMS for the zener's average (RMS)
|
||||
// noise level. Although this is only a guess, it seems to be in the ballpark
|
||||
// for similar zeners operated with similar amounts of average current. It
|
||||
// also keeps the noise component of the sound effects strong enough so as not
|
||||
// to be overwhelmed by the pulse of the sound effects' initial attacks; this
|
||||
// pulse is created by switching on their generating amplifiers and is
|
||||
// independent of noise level. Meanwhile, this noise level is still low enough
|
||||
// that, with all the volume potentiometers set to their midpoints, the noise
|
||||
// won't be clipped by any subsequent amplification stage in the netlist, up
|
||||
// to the power amp inputs. (Some such clipping may occur if a sound effect's
|
||||
// volume is turned up well beyond its midpoint. That may also be true on real
|
||||
// hardware.)
|
||||
//
|
||||
// The other big uncertainty is the audible effect of the power amp ICs. These
|
||||
// amplifiers add both power and voltage gain, which may be enough to distort
|
||||
// or clip the output. They may also have an audible filtering effect. In the
|
||||
// Gun Fight schematic, and apparently in real machines, they are configured
|
||||
// for a voltage gain of 15. Furthermore, any input voltages beyond a few
|
||||
// hundred mV (positive or negative) should produce at least some clipping
|
||||
// distortion, with the distortion getting worse for stronger signals. With
|
||||
// all potentiometers set to the midpoint, the power amp signal inputs should
|
||||
// see extreme pulses of +/- 3 V from the initial attack for sound effects,
|
||||
// and even past those initial attack pulses, the sound effect noise should
|
||||
// kick in at levels above +/- 1 V on the power amp inputs. If these levels
|
||||
// are correct and the power amp ICs work as described, the noise of the sound
|
||||
// effects should initially be heavily distorted, but since the original
|
||||
// signal is already random noise, it's not clear whether that distortion
|
||||
// would be apparent. Anyhow, the power amp ICs are completely unemulated
|
||||
// here, and any distortion effects they might produce would be quite
|
||||
// different from the hard clipping produced when limiting output levels
|
||||
// digitally.
|
||||
//
|
||||
// I have compromized by setting the volume multipliers for the netlist stream
|
||||
// outputs so that output levels of +/- 3 volts will produce the maximum
|
||||
// allowed stream output magnitudes of +/- 32767. Voltages beyond that will be
|
||||
// clipped. This at least produces some distortion if the volume
|
||||
// potentiometers are adjusted above their midpoints.
|
||||
//
|
||||
// Further improving accuracy would require testing signal levels on actual
|
||||
// hardware, with allowances made for variations in components, as well as a
|
||||
// better understanding of the electrical and sonic behavior of the power
|
||||
// amplifiers, speakers, and cabinet. It's questionable whether doing so is
|
||||
// worth the effort.
|
||||
|
||||
|
||||
// As I've said, this netlist does not include the final stage of sound
|
||||
// generation, the twin audio power amplifier ICs. Although it is the norm for
|
||||
// MAME analog sound emulation to omit this stage, some discussion of the
|
||||
// power amplifiers is worthwhile in this case. Each is an SGS-ATES
|
||||
// TAA-621-A11 single-channel amplifier, driving one 8-ohm speaker of about 4
|
||||
// or 5 inches.
|
||||
//
|
||||
// (On the Gun Fight schematic, the TAA-621-A11 is also labeled "LM354". The
|
||||
// TAA-621-A11 was introduced in 1970 by the Italian firm SGS. The very
|
||||
// similar LM354 was introduced in 1972 by European Electronic Products.
|
||||
// However, this company seems to have been a mere U.S. importer and
|
||||
// distributor of European components, making the LM354 just a rebadged
|
||||
// TAA-621-A11. The LM354 occasionally comes up in discussions of Gun Fight
|
||||
// audio but seems to have been otherwise short-lived. One problem with its
|
||||
// name is that it can easily be mistaken for a National Semiconductor LMxxx
|
||||
// linear IC, even though it's unrelated to that company. To further confuse
|
||||
// matters, National Semiconductor had already introduced an LM354 of their
|
||||
// own in 1970 which wasn't an audio amplifier at all, but a second-source
|
||||
// version of Texas Instruments' SN7525 sense amplifier for minicomputer
|
||||
// magnetic-core memory systems.)
|
||||
//
|
||||
// As is normal for TAA-621-A11 amps, those in Gun Fight are configured with
|
||||
// some negative feedback to control their voltage gain. The gain is
|
||||
// determined by the ratio of the chip's internal 15-kohm feedback resistor to
|
||||
// the external resistor connected to the feedback terminal, pin 10. In Gun
|
||||
// Fight this external resistor is 1 kohm, so the ratio, and thus the voltage
|
||||
// gain, is 15.
|
||||
//
|
||||
// The TAA-621-A11 is rated at 4 watts at 10% total harmonic distortion (THD)
|
||||
// when supplied with 24-volt power and driving a 16-ohm load. (Although not
|
||||
// explicitly stated, this appears to be an RMS rating rather than a peak
|
||||
// rating.) In Gun Fight's case, the speaker load is only 8 ohms, and the
|
||||
// power supply voltage is a bit lower, about 22 volts (it comes from
|
||||
// rectified 16.5-volt-RMS AC, buffered by a large smoothing capacitor). Both
|
||||
// of these factors lower the power rating somewhat. Also, a power rating at
|
||||
// 10% THD implies clipping is already heavy. The unclipped, clean power
|
||||
// rating in Gun Fight would be lower, probably no more than 2 watts RMS,
|
||||
// giving output around 4 volts RMS or about 5.5 volts in extreme amplitude.
|
||||
// With a power amp voltage gain of 15, this would mean that any input signals
|
||||
// with extreme amplitudes greater than about a third of a volt would be
|
||||
// subject to power amp clipping.
|
||||
//
|
||||
// The power amps also have a few other connections, including ripple bypass
|
||||
// capacitors to suppress ripple from the unregulated power supply, frequency
|
||||
// compensation capacitors to prevent inducing unstable amplifier oscillations
|
||||
// at high frequencies, and some filtering on the output to the speakers.
|
||||
|
||||
|
||||
// All of the amplifying transistors in this circuit are NPN transistors of a
|
||||
// particular type, marked as "A-138" on the Gun Fight schematics. This seems
|
||||
// to be the Amperex A-138, a low-power silicon NPN transistor made by Amperex
|
||||
// Electronics, which was a U.S. division of Philips. This transistor is long
|
||||
// obsolete and has fallen into obscurity. The only source I could find with
|
||||
// any data on it (given in greatly abbreviated form) is _Transistor
|
||||
// Discontinued Devices D.A.T.A.Book, Edition 16_ (1980), by Derivation and
|
||||
// Tabulation Associates; the A-138 is listed on p. 76, line 86. From that
|
||||
// source, and the way the transistor is used in Gun Fight, it appears to be
|
||||
// a fairly ordinary NPN transistor not very different from the 2N3904.
|
||||
// Electronic Corporation, which was a U.S. division of Philips. This
|
||||
// transistor, being a vendor-specific type long out of production, seems to
|
||||
// have fallen into obscurity. The only source I could find with any data on
|
||||
// it (given in greatly abbreviated form) is _Transistor Discontinued Devices
|
||||
// D.A.T.A.Book, Edition 16_ (1980), by Derivation and Tabulation Associates,
|
||||
// which lists the A-138 on p. 76, line 86.
|
||||
//
|
||||
// This source shows the A-138 to be an ordinary amplifier transistor of
|
||||
// fairly high gain, with a maximum small-signal forward current transfer
|
||||
// ratio (h_fe, AC current gain) of 650. The minimum h_fe is not given, but it
|
||||
// can be estimated using the fact that such transistors are often graded and
|
||||
// designated by gain. The A-137, another Amperex transistor listed on line 85
|
||||
// of the same D.A.T.A.Book page, has the same limits on power, collector
|
||||
// current, and junction voltages, and thus appears to be in the same series,
|
||||
// but it has a maximum h_fe of 415. If the A-137 was the next lower grade of
|
||||
// gain from the A-138, the latter should have a minimum h_fe around 400.
|
||||
// Values for h_FE, the DC forward current transfer ratio (DC current gain),
|
||||
// aren't given for the A-138, but the range would be about the same or a bit
|
||||
// lower, perhaps 350-600, with an average around 450-500.
|
||||
//
|
||||
// The high gain of Gun Fight's A-138 transistors causes a "ka-pow" effect in
|
||||
// its shot sounds; I explain how later. (Andy Wellburn, in a Discord chat on
|
||||
// 2020-06-05, confirmed this effect can be heard in some actual machines. He
|
||||
// measured an h_FE of 238 for one A-138 from a Gun Fight sound board, but he
|
||||
// warned that for old transistors like this, h_FE measurements can vary a
|
||||
// lot, and I'm not surprised that the transistors' gain might be reduced more
|
||||
// than 40 years later. But even a gain of 238 turns out to be high enough to
|
||||
// give the "ka-pow" shot effect.)
|
||||
//
|
||||
// Considering the A-138's high gain and other limits, a decent match for it
|
||||
// here seems to be the BC548C, which is modeled in the netlist library. The
|
||||
// BC548C is the high-gain version of the BC548, a widely used Pro Electron
|
||||
// standard type of general-purpose small-signal transistor in a through-hole
|
||||
// TO-92 package. All A-138 transistors in this netlist are modeled as
|
||||
// BC548Cs.
|
||||
|
||||
// Gun Fight's noise generator circuit is based on a reverse-biased 9.1-volt
|
||||
// Zener diode (D304, a 1N5239). The Zener's noise current is amplified by a
|
||||
// transistor, resulting in white noise output whose peak-to-peak voltage
|
||||
// should be around a volt, according to various sources (e.g., _Diode,
|
||||
// Transistor & FET Circuits Manual_, R. M. Marston (2013), p. 107). Since the
|
||||
// netlist library does not yet support Zener diodes or their noise behavior,
|
||||
// I use a very simple 1-volt peak-to-peak white noise generator instead.
|
||||
|
||||
static NETLIST_START(NOISE)
|
||||
VS(FV, 0)
|
||||
PARAM(FV.FUNC, "rand() - 0.5")
|
||||
|
||||
ALIAS(P, FV.P)
|
||||
ALIAS(N, FV.N)
|
||||
NETLIST_END()
|
||||
|
||||
// Most of the Gun Fight sound circuits have a common structure which is
|
||||
// repeated four times, one for each type of sound effect. (For the common
|
||||
// left-master and right-master amplifiers and outputs, the structure is
|
||||
// repeated only twice.) To make the netlist easier to follow and verify, I've
|
||||
// grouped its components and connections by function, ordering the groups
|
||||
// approximately according to the flow of signals from the activating switches
|
||||
// (and the common noise source) to the initial sound-effect filters and
|
||||
// amplifiers, to their coupling capacitors and potentiometers, and then to
|
||||
// the mixing circuits and the second-stage amplifiers, coupling capacitors
|
||||
// and master-volume potentiometers. Within each group, I've grouped the sets
|
||||
// of four similar components or connections together and listed them in the
|
||||
// order: left-shot, right-shot, left-hit, right-hit. (For master-related
|
||||
// components, the order is simply left and right.)
|
||||
|
||||
// The sound effects are simple "bang" sounds that are generated by
|
||||
// single-transistor amplifiers which are wired in a common-emitter
|
||||
// configuration. These amplifiers draw their current from storage capacitors
|
||||
// which are charged from the 16.5-volt power supply via dual-transistor
|
||||
// switches; the switches, in turn, are activated by digital signals from TTL
|
||||
// logic. The charging of the capacitors by the switches, and their
|
||||
// discharging by the amplifiers, provide the attack and decay of the "bang"
|
||||
// sounds.
|
||||
|
||||
static NETLIST_START(gunfight_schematics)
|
||||
|
||||
// **** Sound effect activation switches.
|
||||
|
||||
// These switches are triggered by digital logic signals activated by
|
||||
// the CPU. A high TTL logic level turns the switch on, allowing
|
||||
// 16-volt power to flow through the switch into the sound effect
|
||||
// generator's amplifier and storage capacitor, and a low logic level
|
||||
// turns the switch off, cutting off the power flow. In practice, each
|
||||
// sound effect is triggered by turning its switch on for about 50 ms
|
||||
// and then switching it off again.
|
||||
//
|
||||
// Each switch is built from two transistors: a "low-side" NPN
|
||||
// transistor which is switched on when a high TTL output level drives
|
||||
// the NPN's base high, and a "high-side" PNP transistor which is
|
||||
// switched on when the now conducting NPN pulls the PNP's base low.
|
||||
// It is the high-side PNP transistor that actually switches the
|
||||
// 16-volt power, hence the term "high-side".
|
||||
|
||||
#if FAST_SWITCHES
|
||||
|
||||
// Use fast, abstracted activation switches instead of a detailed
|
||||
// circuit model of the actual dual-transistor activation switches.
|
||||
// Although the latter would simulate the total circuit more
|
||||
// accurately, it does not make any audible difference in the
|
||||
// sound output produced.
|
||||
// Use abstracted activation switches instead of a detailed circuit
|
||||
// model of the dual-transistor switches. This gives faster emulation
|
||||
// while not making any audible difference in the sound produced.
|
||||
|
||||
SYS_DSW(SW_LEFT_SHOT, IN_LS, I_V16_5.Q, R130.1)
|
||||
SYS_DSW(SW_RIGHT_SHOT, IN_RS, I_V16_5.Q, R230.1)
|
||||
SYS_DSW(SW_LEFT_HIT, IN_LH, I_V16_5.Q, R117.1)
|
||||
SYS_DSW(SW_RIGHT_HIT, IN_RH, I_V16_5.Q, R217.1)
|
||||
SYS_DSW(SW_LEFT_SHOT, IN_LS, I_V16.Q, R130.1)
|
||||
SYS_DSW(SW_RIGHT_SHOT, IN_RS, I_V16.Q, R230.1)
|
||||
SYS_DSW(SW_LEFT_HIT, IN_LH, I_V16.Q, R117.1)
|
||||
SYS_DSW(SW_RIGHT_HIT, IN_RH, I_V16.Q, R217.1)
|
||||
|
||||
// The default on-resistance of 1 ohm is a bit high for my tastes,
|
||||
// considering the charging resistor which follows is only 15 ohms.
|
||||
// Lower the on-resistance to a more accurate value. The charging
|
||||
// resistor which follows is only 15 ohms, so the default
|
||||
// on-resistance of 1 ohm might noticeably affect the result.
|
||||
PARAM(SW_LEFT_SHOT.RON, 0.1)
|
||||
PARAM(SW_RIGHT_SHOT.RON, 0.1)
|
||||
PARAM(SW_LEFT_HIT.RON, 0.1)
|
||||
@ -91,11 +257,7 @@ static NETLIST_START(gunfight_schematics)
|
||||
|
||||
#else
|
||||
|
||||
// Each dual-transistor switch has two parts: a "low-side" NPN
|
||||
// transistor which is switched by a TTL logic input, and a
|
||||
// "high-side" PNP transistor which is switched by the low-side
|
||||
// NPN transistor. It is the PNP transistor which actually switches
|
||||
// the 16.5-volt power.
|
||||
// Detailed circuit model of the dual-transistor switches.
|
||||
|
||||
// "Low-side" NPN transistor switches, driven by TTL logic inputs.
|
||||
|
||||
@ -114,14 +276,16 @@ static NETLIST_START(gunfight_schematics)
|
||||
RES(R120, RES_K(5.1))
|
||||
RES(R220, RES_K(5.1))
|
||||
|
||||
QBJT_SW(Q108, "NPN")
|
||||
QBJT_SW(Q208, "NPN")
|
||||
QBJT_SW(Q105, "NPN")
|
||||
QBJT_SW(Q205, "NPN")
|
||||
QBJT_SW(Q108, "BC548C")
|
||||
QBJT_SW(Q208, "BC548C")
|
||||
QBJT_SW(Q105, "BC548C")
|
||||
QBJT_SW(Q205, "BC548C")
|
||||
|
||||
// These actually all go to TTL ground at pin 7 of 7404 IC H6,
|
||||
// rather than the usual circuit ground.
|
||||
NET_C(R133.2, R233.2, R120.2, R220.2, Q108.E, Q208.E, Q105.E, Q205.E, GND)
|
||||
// These all go to TTL ground at pin 7 of 7404 IC H6, rather than the
|
||||
// ground used for the other sound circuits.
|
||||
NET_C(GND,
|
||||
R133.2, R233.2, R120.2, R220.2,
|
||||
Q108.E, Q208.E, Q105.E, Q205.E)
|
||||
|
||||
NET_C(R134.2, R133.1, Q108.B)
|
||||
NET_C(R234.2, R233.1, Q208.B)
|
||||
@ -138,22 +302,26 @@ static NETLIST_START(gunfight_schematics)
|
||||
NET_C(Q105.C, R118.1)
|
||||
NET_C(Q205.C, R218.1)
|
||||
|
||||
// "High-side" PNP transistor switches, driven by "low-side"
|
||||
// NPN switch outputs. The output of these goes to the storage
|
||||
// capacitors and the current inputs of the sound-effect amplifiers.
|
||||
// "High-side" PNP transistor switches, driven by "low-side" NPN
|
||||
// switch outputs. The PNP switch outputs charge the storage
|
||||
// capacitors that supply power to the sound-effect amplifiers; in
|
||||
// addition, while they are on they power the amplifiers directly.
|
||||
|
||||
RES(R132, RES_K(5.1))
|
||||
RES(R232, RES_K(5.1))
|
||||
RES(R119, RES_K(5.1))
|
||||
RES(R219, RES_K(5.1))
|
||||
|
||||
// The actual transistors used here are 2N4125s:
|
||||
QBJT_SW(Q107, "PNP")
|
||||
QBJT_SW(Q207, "PNP")
|
||||
QBJT_SW(Q104, "PNP")
|
||||
QBJT_SW(Q204, "PNP")
|
||||
|
||||
// All connected to 16.5-volt power.
|
||||
NET_C(R132.1, R232.1, R119.1, R219.1, Q107.E, Q207.E, Q104.E, Q204.E, I_V16_5.Q)
|
||||
// All connected to 16-volt power.
|
||||
NET_C(I_V16.Q,
|
||||
R132.1, R232.1, R119.1, R219.1,
|
||||
Q107.E, Q207.E, Q104.E, Q204.E)
|
||||
|
||||
NET_C(R131.2, R132.2, Q107.B)
|
||||
NET_C(R231.2, R232.2, Q207.B)
|
||||
@ -165,12 +333,13 @@ static NETLIST_START(gunfight_schematics)
|
||||
NET_C(Q104.C, R117.1)
|
||||
NET_C(Q204.C, R217.1)
|
||||
|
||||
// Description of switches ends here.
|
||||
// End of switch description.
|
||||
|
||||
#endif
|
||||
|
||||
// The following are the current inputs to the storage capacitors and
|
||||
// sound-effect amplifiers.
|
||||
|
||||
// **** Current supply and storage capacitors for sound-effect
|
||||
// **** amplifiers.
|
||||
|
||||
RES(R130, RES_R(15))
|
||||
RES(R230, RES_R(15))
|
||||
@ -181,35 +350,126 @@ static NETLIST_START(gunfight_schematics)
|
||||
CAP(C222, CAP_U(10))
|
||||
CAP(C116, CAP_U(20))
|
||||
CAP(C216, CAP_U(20))
|
||||
NET_C(C122.2, C222.2, C116.2, C216.2, GND)
|
||||
NET_C(GND, C122.2, C222.2, C116.2, C216.2)
|
||||
|
||||
NET_C(R130.2, C122.1, R126.1, R124.1)
|
||||
NET_C(R230.2, C222.1, R226.1, R224.1)
|
||||
NET_C(R117.2, C116.1, R113.1, R111.1)
|
||||
NET_C(R217.2, C216.1, R213.1, R211.1)
|
||||
|
||||
// Use a simple noise generating macro device, based on a voltage
|
||||
// source, to simulate the AC noise generated by amplified Zener.
|
||||
// This is the basic noise source which is filtered and amplified by
|
||||
// the sound-effect circuits.
|
||||
|
||||
NOISE(N1)
|
||||
NET_C(N1.N, GND)
|
||||
// **** Shared white-noise generator circuit. This is the basic noise
|
||||
// **** source which is filtered and amplified by the sound-effect
|
||||
// **** circuits.
|
||||
|
||||
// Coupling capacitors from noise generator to sound effect
|
||||
// frequency filters.
|
||||
// Gun Fight's noise generator circuit is based on a reverse-biased
|
||||
// 9.1-volt zener diode (D304, a 1N5239) whose noise current is then
|
||||
// amplified by an A-138 NPN transistor, producing white noise at
|
||||
// audio frequencies.
|
||||
//
|
||||
// (Strictly speaking, this is not a *pure* white noise generator,
|
||||
// because the generator's bypass capacitor and biasing resistor, in
|
||||
// combination with negative feedback from the amplified signal, act
|
||||
// as a high-pass RC filter, filtering out the lowest noise
|
||||
// frequencies.)
|
||||
//
|
||||
// Figuring out how strong the noise signal should be for this circuit
|
||||
// is difficult. The noise generator's biasing resistors and
|
||||
// transistor gain limit the average current through its zener to
|
||||
// around 2 microamps, but the 1N5239 is normally expected to be used
|
||||
// with much larger currents, in the range of 250 microamps to 50
|
||||
// milliamps.
|
||||
//
|
||||
// Zeners are most often used for smoothly controlling and limiting
|
||||
// voltage with minimal fluctuation, like in a power regulator. But a
|
||||
// zener can only do this smoothly if it passes a large enough
|
||||
// current. This is especially true for "zeners" of voltages of 9.1
|
||||
// volts or more, which properly speaking are "avalanche diodes" that
|
||||
// don't user the actual Zener effect but rather a different effect,
|
||||
// avalanche breakdown, which is capable of generating far more noise.
|
||||
// Standard zener specifications include "knee" figures which in
|
||||
// effect give the minimum expected current, along with the maximum
|
||||
// "dynamic impedance" at that current: how much the voltage may vary
|
||||
// if the current changes, or vice versa. For the 1N5239, the knee is
|
||||
// at 250 microamps, and the maximum dynamic impedance at the knee is
|
||||
// 600 ohms, so a 1 microamp increase in current at that point would
|
||||
// raise the voltage drop by up to 0.6 millivolts. Noise values for
|
||||
// zeners are often not given at all, or if they are (as with
|
||||
// Motorola's zeners), they are given at the knee current. In short,
|
||||
// the manufacturer expects the current to be kept above the knee
|
||||
// value, and if your current is lower, you're on your own.
|
||||
//
|
||||
// At very low currents, still within the breakdown region but well
|
||||
// below the knee current, the zener's dynamic impedance is much
|
||||
// greater, and more importantly, so is its noise. The conduction of
|
||||
// current is no longer smooth and regular, but pulsing and episodic,
|
||||
// as small conducting "microplasmas" within the diode's junction are
|
||||
// repeatedly triggered and extinguished, like microscopic versions of
|
||||
// lightning bolts in a thunderstorm.
|
||||
//
|
||||
// The netlist library includes a Zener diode model, but this model
|
||||
// does not simulate the Zener's noise behavior. Instead I generate
|
||||
// the noise from a noise voltage source in series with the Zener.
|
||||
|
||||
// Simple model of a 1N5239 9.1-volt Zener diode. The 1N5239 is
|
||||
// specified to conduct 20 mA of current at its nominal breakdown
|
||||
// voltage of 9.1 V. The model produces an exponential I-V curve,
|
||||
// passing through this point, which has the same general shape as
|
||||
// that of a normal forward-biased diode. NBV is an exponent scale
|
||||
// factor; its value here of 1 gives the curve a steep rise and a
|
||||
// relatively sharp knee. Actual breakdown I-V curves have an even
|
||||
// steeper rise and sharper knee, too steep and sharp to be
|
||||
// represented by an exponential, but this model is good enough for
|
||||
// this emulation, since the diode operates very close to a single
|
||||
// point on the curve.
|
||||
ZDIODE(D304, "D(BV=9.1 IBV=0.020 NBV=1)")
|
||||
|
||||
// 24 kHz noise clock for the noise source, chosen to retain noise
|
||||
// frequencies as high as possible for 48 kHz sample rate.
|
||||
CLOCK(NCLK, 24000)
|
||||
NET_C(I_V5.Q, NCLK.VCC)
|
||||
NET_C(GND, NCLK.GND)
|
||||
|
||||
// Normally-distributed noise of 2 millivolts RMS voltage.
|
||||
// This level was chosen to have a strong amplified noise signal that
|
||||
// won't be clipped by any subsequent stages of amplification before
|
||||
// the power amps, if the volume potentiometers are not raised beyond
|
||||
// their approximate midpoints.
|
||||
SYS_NOISE_MT_N(NOISE, 0.002)
|
||||
|
||||
NET_C(NCLK.Q, NOISE.I)
|
||||
|
||||
RES(R302, RES_K(6.8))
|
||||
RES(R303, RES_K(6.8))
|
||||
CAP(C307, CAP_U(10))
|
||||
NET_C(C307.2, GND)
|
||||
QBJT_EB(Q302, "BC548C")
|
||||
NET_C(Q302.E, GND)
|
||||
|
||||
NET_C(I_V16.Q, R302.1)
|
||||
NET_C(Q302.B, NOISE.1)
|
||||
NET_C(D304.A, NOISE.2)
|
||||
NET_C(R303.2, C307.1, D304.K)
|
||||
|
||||
// Coupling capacitors from noise generator to sound effect frequency
|
||||
// filters. (These coupling capacitors, together with the resistances
|
||||
// beyond them, act as high-pass filters with very low cutoff
|
||||
// frequencies.)
|
||||
|
||||
CAP(C303, CAP_U(0.1))
|
||||
CAP(C306, CAP_U(0.1))
|
||||
CAP(C304, CAP_U(0.1))
|
||||
CAP(C305, CAP_U(0.1))
|
||||
|
||||
NET_C(C303.1, C306.1, C304.1, C305.1, N1.P)
|
||||
NET_C(R302.2, Q302.C, R303.1, C303.1, C306.1, C304.1, C305.1)
|
||||
|
||||
// Sound effect frequency filters. Each of these is a second-order
|
||||
// low-pass filter with cutoff frequency determined by its component
|
||||
// values. The different capacitor values produce each sound effect's
|
||||
// distinct pitch.
|
||||
|
||||
// **** Sound effect frequency filters.
|
||||
|
||||
// Each sound effect has a pair of passive low-pass RC filters with
|
||||
// cutoff frequencies determined by their component values. The
|
||||
// different capacitor values produce each sound effect's distinct
|
||||
// pitch.
|
||||
|
||||
RES(R129, RES_K(20))
|
||||
RES(R229, RES_K(20))
|
||||
@ -243,12 +503,65 @@ static NETLIST_START(gunfight_schematics)
|
||||
CAP(C214, CAP_U(0.047))
|
||||
NET_C(C120.2, C220.2, C114.2, C214.2, GND)
|
||||
|
||||
// Sound effect amplifier circuits. Each of these is a single NPN
|
||||
// transistor wired as a common-emitter amplifier. The "hit"
|
||||
// sound effect amplifiers also have a bypass capacitor at the
|
||||
// emitter. The attack and decay of the sound effects is handled
|
||||
// by controlling the current supply to each amplifier, which is
|
||||
// done by the switching circuits described above.
|
||||
|
||||
// **** Sound effect amplifier circuits.
|
||||
|
||||
// Each sound-effect amplifier is a single NPN transistor wired as a
|
||||
// common-emitter amplifier. The amplifiers for "hit" sounds also have
|
||||
// a bypass capacitor at the emitter, while those for "shot" sounds
|
||||
// have no bypass capacitor and a much lower emitter resistance. The
|
||||
// attack and decay of the sound effects is handled by controlling the
|
||||
// current supply to each amplifier, which is done by the switching
|
||||
// circuits and supply capacitors described above.
|
||||
|
||||
// More explanation is needed for the "shot" sounds. Apart from their
|
||||
// higher frequency and faster decay, the "ka-pow" effect in their
|
||||
// initial attack further distinguishes them from the "hit" sounds.
|
||||
// This effect comes from the high current gain (around 450-500) of
|
||||
// the amplifier's A-138 transistor together with the low emitter
|
||||
// resistance. When the current supply for the sound is switched on,
|
||||
// the collector voltage at first spikes upward as the supply
|
||||
// capacitor is charged. But the transistor's base voltage and base
|
||||
// current also rise, which "turns on" the transistor, and as its
|
||||
// collector current increases through its biasing resistor, the
|
||||
// collector voltage plummets. For the "shot" sound transistors,
|
||||
// because of their high current gain and low emitter resistance, the
|
||||
// collector current grows so much that the collector voltage is
|
||||
// pulled below the base voltage, pushing the transistor into
|
||||
// saturation. This persists for as long as the current supply switch
|
||||
// remains on; the collector voltage stays low with little variation.
|
||||
// In this state the amplifier's input noise signal is being clipped
|
||||
// rather than amplified.
|
||||
|
||||
// The result is that the sound effect's initial voltage spike is
|
||||
// followed by a relatively prolonged low with almost no noise. As
|
||||
// this signal passes through the output coupling capacitor, the
|
||||
// intervening filter and potentiometer, and then the second
|
||||
// amplification stage, it becomes a series of strong oscillations,
|
||||
// followed by a momentary silence which lasts as long as the sound's
|
||||
// switch is held on: around 50 milliseconds.
|
||||
|
||||
// Finally the sound switch is turned off, and the amplifier's supply
|
||||
// voltage and current begin to drop as the supply capacitor
|
||||
// discharges. The base current and collector current drop also, and
|
||||
// the collector voltage begins to rise, eventually rising above the
|
||||
// base voltage again. The transistor leaves saturation and returns to
|
||||
// forward active mode. Now the noise signal is not being clipped but
|
||||
// gets properly amplified on the collector output. So the momentary
|
||||
// silence is followed by a sudden burst of noise, which then dies
|
||||
// away as the supply capacitor is drained.
|
||||
|
||||
// The result is the shot's distinct "ka-pow" sound: an initial
|
||||
// punctuating crack, a very brief silence, and a sudden noise burst
|
||||
// that quickly fades.
|
||||
|
||||
// The "hit" sounds don't have this effect, despite using the same
|
||||
// high-gain transistors, because their transistor amplifiers have a
|
||||
// bypass capacitor and a much larger emitter resistance, 1 Kohm
|
||||
// versus 100 ohms. That higher resistance keeps the collector current
|
||||
// low enough that the collector voltage never drops below the base
|
||||
// voltage, so the transistor never saturates, while the bypass
|
||||
// capacitor allows the amplifier's AC gain to remain very high.
|
||||
|
||||
RES(R126, RES_K(330))
|
||||
RES(R226, RES_K(330))
|
||||
@ -276,10 +589,10 @@ static NETLIST_START(gunfight_schematics)
|
||||
CAP(C213, CAP_U(50))
|
||||
NET_C(C113.2, C213.2, GND)
|
||||
|
||||
QBJT_EB(Q106, "NPN")
|
||||
QBJT_EB(Q206, "NPN")
|
||||
QBJT_EB(Q103, "NPN")
|
||||
QBJT_EB(Q203, "NPN")
|
||||
QBJT_EB(Q106, "BC548C")
|
||||
QBJT_EB(Q206, "BC548C")
|
||||
QBJT_EB(Q103, "BC548C")
|
||||
QBJT_EB(Q203, "BC548C")
|
||||
|
||||
NET_C(R128.2, C120.1, R126.2, R127.1, Q106.B)
|
||||
NET_C(R228.2, C220.1, R226.2, R227.1, Q206.B)
|
||||
@ -291,10 +604,18 @@ static NETLIST_START(gunfight_schematics)
|
||||
NET_C(R112.1, C113.1, Q103.E)
|
||||
NET_C(R212.1, C213.1, Q203.E)
|
||||
|
||||
// Coupling capacitors and volume potentiometers for sound effect
|
||||
// amplifier outputs. There are four volume pots, for shot and hit
|
||||
// sounds on left and right. Presently these pots are fixed at the
|
||||
// midpoint of their range.
|
||||
|
||||
// **** Coupling capacitors, high-pass (pulse-differentiator) filters,
|
||||
// **** and volume potentiometers for sound effect amplifier outputs.
|
||||
|
||||
// These circuits act as high-pass filters on the sound effect
|
||||
// generator outputs, with very low cutoff frequencies. Because the
|
||||
// cutoff frequency is so low, one of the main effects of the filter
|
||||
// is to remove any flat areas from the initial turn-on pulse of the
|
||||
// sound effect generator amplifier. The filter effectively
|
||||
// differentiates the pulse, producing output voltage proportional to
|
||||
// the steepness of its slope. This replaces the single wide pulse of
|
||||
// the initial attack with a sequence of sharp spike pulses.
|
||||
|
||||
CAP(C119, CAP_U(0.047))
|
||||
CAP(C219, CAP_U(0.047))
|
||||
@ -312,7 +633,9 @@ static NETLIST_START(gunfight_schematics)
|
||||
CAP(C211, CAP_U(0.033))
|
||||
NET_C(C118.2, C218.2, C111.2, C211.2, GND)
|
||||
|
||||
// FIXME - sound effect volume potentiometers should be adjustable.
|
||||
// There are four sound-effect volume pots, for shot and hit sounds on
|
||||
// left and right.
|
||||
|
||||
POT(R123, RES_K(50))
|
||||
POT(R223, RES_K(50))
|
||||
POT(R110, RES_K(50))
|
||||
@ -320,23 +643,19 @@ static NETLIST_START(gunfight_schematics)
|
||||
NET_C(R123.3, R223.3, R110.3, R210.3, GND)
|
||||
|
||||
// Reverse the sense of pot adjustments so that larger values result
|
||||
// in greater volume, which we will want if, as I hope, these are
|
||||
// made user-adjustable.
|
||||
// in greater volume.
|
||||
PARAM(R123.REVERSE, 1)
|
||||
PARAM(R223.REVERSE, 1)
|
||||
PARAM(R110.REVERSE, 1)
|
||||
PARAM(R210.REVERSE, 1)
|
||||
PARAM(R123.DIAL, 0.5)
|
||||
PARAM(R223.DIAL, 0.5)
|
||||
PARAM(R110.DIAL, 0.5)
|
||||
PARAM(R210.DIAL, 0.5)
|
||||
|
||||
NET_C(C119.2, C118.1, R123.1)
|
||||
NET_C(C219.2, C218.1, R223.1)
|
||||
NET_C(C112.2, C111.1, R110.1)
|
||||
NET_C(C212.2, C211.1, R210.1)
|
||||
|
||||
// Mixing of shot and hit sounds for each side.
|
||||
|
||||
// **** Mixing of shot and hit sounds for each side.
|
||||
|
||||
RES(R122, RES_K(30))
|
||||
RES(R222, RES_K(30))
|
||||
@ -358,13 +677,16 @@ static NETLIST_START(gunfight_schematics)
|
||||
NET_C(R109.1, C110.2)
|
||||
NET_C(R209.1, C210.2)
|
||||
|
||||
// Second-stage amplifier circuits, which amplify each side's
|
||||
// mixed shot and hit sounds. These are similar to the sound-effect
|
||||
// amplifiers (particularly the "hit" ones), each being a single
|
||||
// NPN transistor wired in common-emitter configuration, with a
|
||||
// bypass capacitor at the emitter. They have no need for an
|
||||
// attack-decay envelope, however, and so get their current
|
||||
// directly from the 16.5-volt power supply.
|
||||
|
||||
// **** Second-stage amplifier circuits, which amplify each side's
|
||||
// **** mixed shot and hit sounds.
|
||||
|
||||
// These amplifiers are similar to those for the "hit" sound effects,
|
||||
// each being a single A-138 NPN transistor wired in common-emitter
|
||||
// configuration, with a 1-Kohm resistance and a bypass capacitor at
|
||||
// the emitter. They have no need for an attack-decay envelope,
|
||||
// however, and so get their current directly from the 16-volt power
|
||||
// supply.
|
||||
|
||||
RES(R107, RES_K(150))
|
||||
RES(R207, RES_K(150))
|
||||
@ -384,10 +706,10 @@ static NETLIST_START(gunfight_schematics)
|
||||
CAP(C209, CAP_U(50))
|
||||
NET_C(C109.2, C209.2, GND)
|
||||
|
||||
NET_C(R107.1, R207.1, R108.1, R208.1, I_V16_5.Q)
|
||||
NET_C(R107.1, R207.1, R108.1, R208.1, I_V16.Q)
|
||||
|
||||
QBJT_EB(Q102, "NPN")
|
||||
QBJT_EB(Q202, "NPN")
|
||||
QBJT_EB(Q102, "BC548C")
|
||||
QBJT_EB(Q202, "BC548C")
|
||||
|
||||
NET_C(C110.1, C117.1, R107.2, R105.1, Q102.B)
|
||||
NET_C(C210.1, C217.1, R207.2, R205.1, Q202.B)
|
||||
@ -395,10 +717,9 @@ static NETLIST_START(gunfight_schematics)
|
||||
NET_C(R106.1, C109.1, Q102.E)
|
||||
NET_C(R206.1, C209.1, Q202.E)
|
||||
|
||||
// Coupling capacitors and volume potentiometers for second-stage
|
||||
// amplifier outputs. There are two volume pots, for left and right
|
||||
// master volume. Presently these pots are fixed at the midpoint of
|
||||
// their range.
|
||||
|
||||
// **** Coupling capacitors, bandpass filters, and volume
|
||||
// **** potentiometers for second-stage amplifier outputs.
|
||||
|
||||
CAP(C108, CAP_U(0.047))
|
||||
CAP(C208, CAP_U(0.047))
|
||||
@ -416,31 +737,35 @@ static NETLIST_START(gunfight_schematics)
|
||||
CAP(C207, CAP_U(0.001))
|
||||
NET_C(C107.2, C207.2, GND)
|
||||
|
||||
// FIXME - master volume potentiometers should be adjustable.
|
||||
// There are two master volume pots, for left and right.
|
||||
|
||||
POT(R103, RES_K(47))
|
||||
POT(R203, RES_K(47))
|
||||
NET_C(R103.3, R203.3, GND)
|
||||
|
||||
// Reverse the sense of pot adjustments so that larger values result
|
||||
// in greater volume, which we will want if, as I hope, these are
|
||||
// made user-adjustable.
|
||||
// in greater volume.
|
||||
PARAM(R103.REVERSE, 1)
|
||||
PARAM(R203.REVERSE, 1)
|
||||
PARAM(R103.DIAL, 0.5)
|
||||
PARAM(R203.DIAL, 0.5)
|
||||
|
||||
NET_C(R104.2, C107.1, R103.1)
|
||||
NET_C(R204.2, C207.1, R203.1)
|
||||
|
||||
// The following are the left and right speaker outputs. In the real
|
||||
// circuit they don't drive the speakers directly, being far too weak,
|
||||
// but rather go to pin 7, the signal input, of the respective
|
||||
// TAA621A11 (or LM354) audio power amplifier ICs for the left and
|
||||
// right speakers.
|
||||
// The potentiometer outputs are used here as the left and right audio
|
||||
// outputs. In the real circuit they drive the signal inputs of the
|
||||
// audio power amplifier ICs for the left and right speakers.
|
||||
|
||||
ALIAS(OUT_L, R103.2)
|
||||
ALIAS(OUT_R, R203.2)
|
||||
|
||||
// The real outputs are somewhat constrained in that they drive the
|
||||
// bases of the input transistors within the power amplifiers. If they
|
||||
// go too low in voltage, there seems to be a peculiar effect on the
|
||||
// speaker output waveforms, although I'm not sure whether this is a
|
||||
// real effect or an artifact of the LTspice simulation I constructed.
|
||||
// Nor am I sure whether it matters in practice. In any case, it's not
|
||||
// modeled here.
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
|
||||
@ -448,17 +773,20 @@ NETLIST_START(gunfight)
|
||||
|
||||
SOLVER(Solver, 48000)
|
||||
PARAM(Solver.SORT_TYPE, "ASCENDING")
|
||||
// For this netlist, ASCENDING turns out to be the fastest of the
|
||||
// available sort types, roughly 40% faster than the default
|
||||
// PREFER_IDENTITY_TOP_LEFT.
|
||||
|
||||
LOCAL_LIB_ENTRY(NOISE)
|
||||
// For this netlist, ASCENDING turns out to be slightly faster than
|
||||
// the default sort type of PREFER_IDENTITY_TOP_LEFT, but the
|
||||
// difference when using static solvers is very small.
|
||||
|
||||
LOCAL_SOURCE(gunfight_schematics)
|
||||
|
||||
INCLUDE(gunfight_schematics)
|
||||
|
||||
ANALOG_INPUT(I_V16_5, 16.5) // 16.5-volt power for sound amplifiers
|
||||
// The amplifying transistors all get 16-volt power. The raw AC power
|
||||
// input from the main power supply to the game logic board is 16.5
|
||||
// volts, but this is rectified and regulated to about 16 volts via
|
||||
// TIP-31 power transistor Q301 and BZX61-C16 16-volt Zener diode
|
||||
// D304.
|
||||
ANALOG_INPUT(I_V16, 16) // 16-volt power for sound amplifiers
|
||||
ANALOG_INPUT(I_V5, 5) // 5-volt power for logic input devices
|
||||
|
||||
LOGIC_INPUT(I_LEFT_SHOT, 0, "74XX")
|
||||
@ -467,10 +795,12 @@ NETLIST_START(gunfight)
|
||||
LOGIC_INPUT(I_RIGHT_HIT, 0, "74XX")
|
||||
|
||||
// Power and ground connections for logic input devices:
|
||||
NET_C(I_V5.Q, I_LEFT_SHOT.VCC, I_RIGHT_SHOT.VCC,
|
||||
I_LEFT_HIT.VCC, I_RIGHT_HIT.VCC)
|
||||
NET_C(GND, I_LEFT_SHOT.GND, I_RIGHT_SHOT.GND,
|
||||
I_LEFT_HIT.GND, I_RIGHT_HIT.GND)
|
||||
NET_C(I_V5.Q,
|
||||
I_LEFT_SHOT.VCC, I_RIGHT_SHOT.VCC,
|
||||
I_LEFT_HIT.VCC, I_RIGHT_HIT.VCC)
|
||||
NET_C(GND,
|
||||
I_LEFT_SHOT.GND, I_RIGHT_SHOT.GND,
|
||||
I_LEFT_HIT.GND, I_RIGHT_HIT.GND)
|
||||
|
||||
ALIAS(IN_LS, I_LEFT_SHOT.Q)
|
||||
ALIAS(IN_RS, I_RIGHT_SHOT.Q)
|
||||
@ -480,9 +810,11 @@ NETLIST_START(gunfight)
|
||||
#if USE_FRONTIERS
|
||||
// These frontiers keep the mostly independant halves of the circuit
|
||||
// (left channel and right channel) from affecting each other and the
|
||||
// noise generator, which speeds up processing by about 10% while
|
||||
// making no audible change in the output. Perhaps better ones could
|
||||
// be found, but I don't know how to do so or if it's even possible.
|
||||
// noise generator, which speeds up processing substantially while
|
||||
// making no audible change in the output. These seem to be the only
|
||||
// frontiers which improve performance; I haven't been able to find
|
||||
// any additional beneficial ones from examining the circuit and
|
||||
// experimenting.
|
||||
OPTIMIZE_FRONTIER(C303.1, RES_M(1), 50)
|
||||
OPTIMIZE_FRONTIER(C306.1, RES_M(1), 50)
|
||||
OPTIMIZE_FRONTIER(C304.1, RES_M(1), 50)
|
||||
|
Loading…
Reference in New Issue
Block a user