https://cdn.discordapp.com/attachments/352252932953079813/469390090184032266/ultrasonic_tests.zip (This was uploaded in the NESdev Discord.)
Looks like the way in which emulators and players emulate the MMC5 ultrasonic pulses differs.
In the URL above there is an NSF, an 0CC source module, and a hardware render from an MMC5 cart by ImATrackMan.
First, the NSF starts pulse generation on all four pulse channels at 0x0D in the low timer and makes decremental writes down to 0x00 on each of them. (High timer bits 0-2 are not set... However interestingly enough the 0CC-Famitracker engine does underflow them to $FF and plays an A1 on 2a0x and an A2 on MMC5.) The next frame only has 2a0x and then repeats with only MMC5; then it loops back to the beginning.
The expected behavior of the 2a0x pulses is to stop tone generation when the low timer hits 0x07. Tone generation is supposed to stop with MMC5 when it hits 0x00. The hardware render verifies this if you count the ticks starting at 0x0D.
Current documented behaviors on certain emulators/players:
Mesen (latest): Stops tone generation of MMC5 at 0x07. (INACCURATE!)
Nintendulator (latest): Plays tones on both channels and freezes sound generation. (BUGGED!)
NSFPlay/NSFplug (latest): Stops tone generation of MMC5 at 0x00. (ACCURATE! _PASS_)
VirtuaNSF (latest v1601): Stops tone generation of MMC5 at 0x07. (INACCURATE!)
However it seems that the frequencies of the tones generated do not equate to the frequencies generated by hardware.
The tones generated by the MMC5 from the hardware render do seem to be ultrasonic... ImATrackMan says that he's able to hear the frequencies of the hardware render clip up to 0x05. I can hear them up to 0x07.
Generally speaking, there doesn't seem to be a single emulator that emulates either 2a0x nor MMC5 ultrasonic frequencies the way that hardware does. A comparison with the hardware render output will verify this.
Looks like the way in which emulators and players emulate the MMC5 ultrasonic pulses differs.
In the URL above there is an NSF, an 0CC source module, and a hardware render from an MMC5 cart by ImATrackMan.
First, the NSF starts pulse generation on all four pulse channels at 0x0D in the low timer and makes decremental writes down to 0x00 on each of them. (High timer bits 0-2 are not set... However interestingly enough the 0CC-Famitracker engine does underflow them to $FF and plays an A1 on 2a0x and an A2 on MMC5.) The next frame only has 2a0x and then repeats with only MMC5; then it loops back to the beginning.
The expected behavior of the 2a0x pulses is to stop tone generation when the low timer hits 0x07. Tone generation is supposed to stop with MMC5 when it hits 0x00. The hardware render verifies this if you count the ticks starting at 0x0D.
Current documented behaviors on certain emulators/players:
Mesen (latest): Stops tone generation of MMC5 at 0x07. (INACCURATE!)
Nintendulator (latest): Plays tones on both channels and freezes sound generation. (BUGGED!)
NSFPlay/NSFplug (latest): Stops tone generation of MMC5 at 0x00. (ACCURATE! _PASS_)
VirtuaNSF (latest v1601): Stops tone generation of MMC5 at 0x07. (INACCURATE!)
However it seems that the frequencies of the tones generated do not equate to the frequencies generated by hardware.
The tones generated by the MMC5 from the hardware render do seem to be ultrasonic... ImATrackMan says that he's able to hear the frequencies of the hardware render clip up to 0x05. I can hear them up to 0x07.
Generally speaking, there doesn't seem to be a single emulator that emulates either 2a0x nor MMC5 ultrasonic frequencies the way that hardware does. A comparison with the hardware render output will verify this.