bbbradsmith / nsfplay

Nintendo NES sound file NSF music player
https://bbbradsmith.github.io/nsfplay/
277 stars 42 forks source link

Implement nonlinear FDS DAC from plgDavid #80

Open Gumball2415 opened 4 months ago

Gumball2415 commented 4 months ago

This PR aims to implement the nonlinear FDS DAC, based on DC capture measurements from plgDavid.

The new FDS output has a dB RMS delta of +0.01dB compared to before, though I think that might be precision errors from the previous function.

Changes in this PR:

Gumball2415 commented 4 months ago

I just noticed the footnote about FDS in #7. I will leave it to you to close this PR or not.

bbbradsmith commented 4 months ago

From what I've seen, the nature of the FDS' DAC is that it's a resistor ladder where some of the resistors are a little off from their spec value, creating deviations from linear that have power-of-two groupings.

So, I don't think I like simulating this with a magic table like that, which attempts to replicate one specific machine. The FDS recordings i've seen varied from machine to machine, some much closer to the ideal than others.

What I'd rather do is have a model that can be made to produce that table and others. In theory, we should be able to closely model that table with an input of 6 resistor deviation coefficients. Maybe an advanced user could specify all 6 custom, to try and match whatever their system they want to match, but for regular users I think we could provide 1 or 2 preset coefficients + a slider that scales them from 0 to 200% or something like that. (Default to 0%)

Also, can you provide a link to reference about plg's table? I notice a comment in your code about "NESDev server", but that doesn't constitute a reference that anyone can follow. If this is referring to a conversation on a discord server, I think it's quite problematic to use that as a reference. Can the data be discussed on a public and less ephemeral forum like the NESDev BBS instead? Links to threads there work much better as a reference.

Gumball2415 commented 4 months ago

i'll have to ask him to post his recordings on the forums, ultimately it's not really mine and he was kind enough to share the voltage capture on the NESDev Discord server.

i converted the voltage capture into averaged values for each level using some python scripting.

recently, he's recording another DC voltage capture of the FDS running a beta version of the MDFourier FDS, so i may get around to working on this implementation more once data shows up.

plgDavid commented 4 months ago

Hey Brad, here was the file: image

This is tapped directly in DC land on the 2C33 audio out (prior to filter). Will need to check on my four other devices how much that DAC's components vary. I will be making quite a few more recordings in the next days because of the advancements in MDFourier FDS from @Gumball2415

bbbradsmith commented 4 months ago

Thanks for the info!

Gumball2415 commented 4 months ago

So, I don't think I like simulating this with a magic table like that, which attempts to replicate one specific machine. ... What I'd rather do is have a model that can be made to produce that table and others.

wouldn't this also apply to 2A03's (and maybe MMC5's) nonlinear DACs as well? last year, org from BreakingNES shared a model of the 2A03 nonlinear DAC in the NESDev server: https://github.com/emu-russia/breaks/blob/master/BreakingNESWiki_DeepL/APU/dac.md https://github.com/emu-russia/breaks/blob/master/Scripts/APU_DAC_Generator.py

bbbradsmith commented 4 months ago

Possibly. The 2A03 isn't using a measured table, it's using the formula given by Blargg years ago. A few years ago I attempted to measure and re-evaluate that model (thread) but I couldn't really come up with something better.

BreakingNES' approach that you linked might be useful for improving that model, though these things always need to be compared with recorded output to see whether there are unchecked factors.

The 5B emulation has a table in its implementation, but it's a much simpler one, and IIRC it's formula generated except for the highest value which appeared to be clipped when compared to hardware. Though, I was recently looking at emulation of the same chip family in Hatari, and there were some really interesting theoretical notes I have to follow up on there, which might apply to the 5B as well. In Hatari, the implementation based on the theory does not, in my opinion, match the reality of the output, and the sound quality was very poor as a result, but I want to do better than just throw out the prior work. Need to write a test, etc.

Gumball2415 commented 4 months ago

Yuri213212 from the NESDev Discord server has published his study on the FDS DAC both on the server and the forums: https://forums.nesdev.org/viewtopic.php?t=25226

while in the process of developing MDFourier FDS, i have updated Mesen2's emulation according to loopy's research in 2019 and have recreated the aliasing found on hardware. i might implement it here too.