NSFPlay 3.0+ roadmap
bbbradsmith opened this issue · 0 comments
bbbradsmith commented
NSFPlay 2.6 will likely be the last version 2 release. NSFPlay 3.0 will be a huge rewrite to address many architectural problems due to the program's age. Cross platform support and performance improvement is the biggest goal here, but also trying to make future maintenance easier.
Work will be done in the nsfplay3 branch: nsplay3
- rewrite all audio generation to potentially use floating point? (#definable)
- Infinite playtime option
- Seeking easier, seek when paused/stopped?
- Sound device selection.
- Bus/stack plugins: NSF validator, other export tools, trace logger?
- Improve loop detection
- APU debug pin emulation
- wider resample window? (i.e. multi-lobe sinc?)
- Mac/Linux versions?
- Foobar2000 plugin
- KB plugin
- Visualizer plugin system. Full register view capability.
- De-MFC GUI, change to a .lib, and build directly into plugin.
- Remove plugin stubs from xgm, these belong in the plugin project itself.
- Breakout window for info (nice for looking at NSFe text chunk).
- NSFe metadata editor (maybe other people would start making NSFes???)
- One click button for keyboard view?
- Vertical stacking for multiple key dots on same pitch?
- Other: Behaviour with 2 NSFs in a playlist is counterintuitive.
- Always On Top > wxSTAY_ON_TOP on wxFrame?
- ROM usage (CDL?) visualization for NSF rippers, other debugging tools?
- Mirroring of chip registers
-- create a "yoked" wrapper for multichip that responds to only lowest address? - VRC6 exhibits "vibrato click" at A-3, see: https://cdn.discordapp.com/attachments/239104268794200064/317404503986929664/test.nsf
-- clicking does happen on hardware but seems to be exacerbated by NSFPlay, maybe this is a sampling granularity thing?
-- this might be count-down vs count-up behaviour (i.e. reload "counter" to freq2 only when counter counts down to 0, also eliminates weird arbitrary need to clamp counter on 9001/2 writes)
--- we could test this: play low frequency, do a $4011 pop to mark time, write a low frequency, see how long it takes (trigger at several phases, use enable bit to reset)
--- test 2A03 and VRC6 and MMC5 and 5B this way! (can I make a multichip NSF for convenience?)
--- 2A03 already went to countdown logic in 2020: eeff32d - "APU clock" square should be 8 part not 16, and the divider should never reset manually, see: https://forums.nesdev.com/viewtopic.php?p=185505#p185505 / https://forums.nesdev.com/viewtopic.php?p=186129#p186129
- option to not disable bankswitch registers with bank 0 0 0 0 0 0 0 0
- 5B does not support ImATrackMan's PWM envelope volume control (i.e. high freq square + env = half volume env)
- MMC5 squares, are they nonlinear, does PCM affect them?
- Battletoads track 10, noise sounds much duller on hardware.
- Better anti-click fadeoff?
- Play Metroid FDS 33 on hardware, make sure that wrapping is correct.
- See thread: https://twitter.com/ImATrackMan/status/940851266191855616
-- Summary: Phase reset clicks are suffering from lack of timing precision, should be fixed when moving to a timing method that has cycle synchronization of writes and emulator.
-- Summary: 5B exhibits phase reset from $0FF to $100 but not $100 to $0FF transition? (Think this is expected behaviour if low byte is written first in both cases. Should be fixed by better timing precision.)
-- counter[ch] > freq2[ch] etc. clamps for VRC6 frequency writes are probably wrong (should do immediate modulo, maybe? this is a wrong implementation clearly, but borne out of the many clocks per update problem)
--- See VRC6 countdown note above. - Waveform visualizer
- Expand info window to show all available fields (+text?) rather than one string for the whole thing
- Play speed override option (keyboard adjustment should have more than just 1-8 integers), maybe allow CPU speed adjustment too?
- NSFLive memory access viewer: visual map of memory usage (like FCEUX code data log)
- DPCM ripper
- Sesame Street Countdown does not play. Bad rip?
- validation: VRC7 speed limit? (hard)
- validation: illegal opcodes
- validation: IRQ usage
- validation: writes to register mirrors
- linearity tests for APU especially and expansion audio as well, should be able to automate by playing a consistent frequency at different volumes, do RMS average over stable areas of the recording, etc.
- Winamp plugin: hover over taskbar, play controls work but track select does not work properly.
- N163 oversampling
- VRC7 emulation rewrite (don't forget YM2413)
-- https://github.com/0xJonas/VRC7-Sound
-- http://www.smspower.org/Development/YM2413
-- https://github.com/chocolate-doom/chocolate-doom/tree/master/opl - Jaleco sample playback emulation, maybe also develop an audio estimation technique? Should be similar to NEC UPD7759:
-- https://github.com/mamedev/mame/blob/master/src/devices/sound/upd7759.cpp - Export multi-WAV individual channels
- Export all tracks
Other stuff that was on 2.5's wishlist:
- 5B emulation rewrite
-- Tone/Envelope/Noise 0 = 1 (envelope is incorrect)
-- Phase should increment and >= period. (Current implementation is weird.)
-- MAME: https://github.com/mamedev/mame/blob/master/src/devices/sound/ay8910.cpp
-- Amplifier model
--- https://forums.nesdev.com/viewtopic.php?f=2&t=17745
--- Hard knee amplification: https://github.com/bbbradsmith/nsfplay/compare/5b_amplifier
---- hard knee model works, need to highpass inputs (including 2A03)
---- is there something more efficient than pow per sample?
---- UI to make it optional, should amplifier-off version be tweaked too? (undo the flattening of high volumes in output table?)
---- multichip should use the amplifier for 5B only and not 2A03 or other chips
-- 50% PVM of envelope by high frequency tone should work #43 - Loopy's new wave of FDS RE:
-- https://forums.nesdev.com/viewtopic.php?p=232662#p232662
-- Sweep test its lowpass filter
-- Waveform DAC nonlinearity model? (Maybe just a slider from 0 perfect to 1 = big discontinuity... a harmonic recursion that remaps the ranges to 0-255 with overlap?)
-- FDS verify all halts / non-halts - OPL2 notes, may help VRC7 implementation: https://docs.google.com/document/d/18IGx18NQY_Q1PJVZ-bHywao9bhsDoAqoIn1rIm42nwo
- Onebus 2xAPU ?
- N163 what happens when you cut down a very long period with a short one (does it take multiple ticks to drop down phase? can probably read it back to test?)
- N163 take a close look at amplitude of multiplex vs non and see if it can be closer
-- See: https://forums.nesdev.com/viewtopic.php?p=237121#p237121 - 2A03 volume curves
- 2A03 nonlinear volume, should standardize on square 15 = nonlinear version (for NSFe mixe compatibility)
-- See: https://forums.nesdev.com/viewtopic.php?p=237121#p237121 - 2A03 verify all halts / non-halts (should be well documented by now, MMC5 should be same)
- N163 verify all halts / non-halts
- VRC6 verify all halts / non-halts
- 5B / VRC7 halts should be known now
- Conflict between $E000 silence of N163/VRC7 with 5B multichip? (Block these in multichip. Only N163 actually implements it currently.)
- VRC7 test register, VRC7 $E000 register.
- APU square period should be 8 not 16 long and instead internal period register should be doubled to simulate 1/2 clock divider.
- Triangle "silence on 0" seems to reveal inconsistent halting behaviour, may also affect init option? (Does triangle init explicitly init to phase 0 correctly?)
- Test CPU again.
- OPLL + VRC7 as TNS cart See: #54
- Debug export at native CPU frequency instead of audio samplerate.
- Scroll wheel to control master volume?
Visualizer thoughts:
- Would be nice to have a low volume note threshold, like a transparent dot, on the keyboard view.