Viewing Issue Advanced Details
ID Category [?] Severity [?] Reproducibility Date Submitted Last Update
05438 Sound Minor Always Jan 30, 2014, 05:06 Oct 4, 2020, 15:51
Tester Ace View Status Public Platform MAME (Self-compiled)
Assigned To Resolution Open OS Windows Vista/7/8 (64-bit)
Status [?] Acknowledged Driver
Version 0.152 Fixed in Version Build
Fixed in Git Commit Github Pull Request #
Summary 05438: 1942 & clones, nemesis & clones, possibly others: Incorrect AY-3-8910 loads
Description Looking through MAME's source code and comparing schematics of both 1942 and Nemesis, there is an error in the loads on the chips which you can see below.

Both games and their clones, possibly even other games using the same driver, do not have the correct loads on their AY-3-8910 outputs. In nemesis.c, the AY-3-8910 interfaces are set to use the default loads of 1Kohm, which is completely wrong. If you look at the AY-3-8910's audio outputs in the Nemesis schematic, there is no load whatsoever on either AY-3-8910's outputs.

Similarly, 1942 has the same issue. It uses the generic AY-3-8910 interface in ay8910.c, which is wrong. This game has a 10Kohm load on the outputs.

Other games may have the same incorrect loads, but these are two that I can confirm use the wrong loads.

Images of each game's schematics are attached with the loads (or lack thereof for Nemesis) enclosed in a red square.

Schematics are from the following links:

http://arcarc.xmission.com/PDF_Arcade_Manuals_and_Schematics/1942_Schematics_%28Capcom%29.pdf
http://arcarc.xmission.com/PDF_Arcade_Manuals_and_Schematics/Nemesis%20Schematics.pdf
Steps To Reproduce
Additional Information The Nemesis loads being incorrect may be related to one of the many audio errors I reported in issue 03539.
Github Commit
Flags
Regression Version
Affected Sets / Systems 1942 & clones, nemesis & clones, possibly others
Attached Files
png file icon 1942 AY-3-8910 outputs.png (474,924 bytes) Jan 30, 2014, 05:06 Uploaded by Ace
Ace
png file icon Nemesis AY-3-8910 outputs.png (94,890 bytes) Jan 30, 2014, 05:06 Uploaded by Ace
Ace
Relationships
There are no relationship linked to this issue.
Notes
8
User avatar
No.10226
AWJ
Developer
Feb 1, 2014, 06:27
nemesis.c needs full discrete sound emulation by someone who knows how to do it in order to sound like a real PCB. Just changing some values here and there isn't going to cut it.
User avatar
No.10230
Ace
Tester
Feb 2, 2014, 20:20
Especially with those switched low-pass filters. I was trying to figure them out so I could implement them myself into my own MAME build, but I failed to do so.

However, putting a big load on the AY-3-8910s like 100Mohms corrects the problem of having all the volume levels messed up. I reported in issue 03539 some really weird volume levels and it seems the use of 1Kohm loads causes this issue. To recap, the issue in question is very loud sound effects, but incredibly quiet backing notes for the WARMING UP NOW screen. Not putting a load will fix that, but I really have no idea how to implement the switched low-pass filters.
User avatar
No.10231
AWJ
Developer
Feb 3, 2014, 15:54
I've just changed the right-hand AY on the schematic ("ay1" in MAME, the one that plays the Morning Music harmony and the Gradius sound effects) to use AY8910_SINGLE_OUTPUT, which seems to improve the balance. However, setting the chip to SINGLE_OUTPUT and also increasing the loads like Ace suggests caused some of the Gradius sfx to sound very strange, so I've left the loads alone.

I've also hooked up the lowpass filters. Unfortunately (if you were hoping for further Gradius improvements) Gradius never seems to turn them on! I added a printf to display when the filters were turned on or off, and ran the service mode sound test in all of the games on this hardware. I found that Twinbee turns on the AY2 filters during a couple of explosion sound effects (twinbee plays sfx with AY2 and music with AY1, the opposite of gradius). gwarrior and konamigt/rf2 turn on the AY2 filters for pretty much every sound they play. None of the games seems to ever use the AY1 filter.

Further improvement to nemesis.c sound will probably require a complete discrete implementation, which is beyond my skill.
User avatar
No.10237
Ace
Tester
Feb 4, 2014, 14:09
What you managed to get done is still a nice start, though I'm rather surprised Gradius never seems to use the low-pass filters at all. I know TwinBee does from watching a superplay video taken from a Konami LaserDisc, I believe, that was recorded off the original board where, as you observed, some explosions activate the filters.

Now, I find it a bit weird you got odd sound effects by doing what you did to "ay1" in Gradius, though you did one thing more than I did: AY8910_SINGLE_OUTPUT. I don't have this at all; my nemesis.c driver has this on the AY-3-8910 interfaces (this is from an older version of MAME, 0.138u1, as that's my primary self-compiled MAME build):

static const ay8910_interface ay8910_interface_1 =
{
AY8910_LEGACY_OUTPUT,
{100000000, 100000000, 100000000},
DEVCB_HANDLER(nemesis_portA_r),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};

static const ay8910_interface ay8910_interface_2 =
{
AY8910_LEGACY_OUTPUT,
{100000000, 100000000, 100000000},
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_HANDLER("k007232", k005289_control_A_w),
DEVCB_DEVICE_HANDLER("k007232", k005289_control_B_w)
};

The {100000000, 100000000, 100000000}, line is for 100Mohm loads, and from my experience comparing MAME with these loads to an original Gradius board, it works quite nicely. Perhaps using AY8910_SINGLE_OUTPUT would cause the audio to sound weird?
User avatar
No.10238
AWJ
Developer
Feb 4, 2014, 23:36
AY8910_SINGLE_OUTPUT allows the channels to interact with each other--the volume of each channel changes depending on the volumes of the other two. It's meant to model the case in which the three output pins are directly tied together (as they are on the MSX and the Atari ST) and so isn't quite accurate for this hardware, which has resistors between the pins. But it's as close as we can get without going full discrete.
User avatar
No.10245
Ace
Tester
Feb 6, 2014, 17:08
edited on: Feb 6, 2014, 17:51
Ah, now I get it. Yeah, both AY-3-8910s in Nemesis are wired with the three outputs tied together. Though what about 1942? I see the outputs each have 10Kohm loads but all 6 channels from the two AY-3-8910s are tied together after some 220Kohm current-limiting resistors.

I'll give AY8910_SINGLE_OUTPUT a go in the Nemesis driver on my end and see what I get.

By the way, can we expect the current switched low-pass filters you implemented in the next MAME build? Just wondering.

EDIT: You're right, using AY8910_SINGLE_OUTPUT causes a huge amount of distortion in the audio output if the loads are too big. One thing I will make note of is it seems the AY-3-8910 has a lot of DC offset as every time I get an audio sample off MAME with any game using the AY-3-8910, the waveform is never centered, it's usually shifted down. Perhaps that causes the problem?
User avatar
No.10904
Ace
Tester
Aug 7, 2014, 16:38
Just a confirmation for this line of code in Nemesis.c:

int C1 = /* offset & 0x1000 ? 4700 : */ 0; // is this right? 4.7uF seems too large

I have a Nemesis board with me now and I can confirm 4.7uF is correct for this filter. It seems weird, but this is actually a 4.7uF tantalum capacitor.
User avatar
No.18032
Steve Coomber
Tester
Oct 4, 2020, 15:51
edited on: Oct 4, 2020, 15:53
I believe this issue also affects Konami GT. I used to play Konami GT in the arcades and I know some of the sound levels in MAME have been incorrect for some time, such as:
1. Turbo sound in game is too loud
2. Insert coin noise is too quiet
3. Collecting "Gas" noise is too quiet
I'm hoping the excellent sound stream update in 0.225 and/or the recent netlist audio implementation will help us get a proper fix at some point!