So I need to know this before designing my sound engine and NMI a certain way... I want to use two 16+1 byte "dummy" DMC samples to apply volume control to the triangle channel (the noise channel inconsistency I can get rid of easily) one of them being all $00 bytes and the other $FF bytes embedded into my Init code so that it doesn't have to take more space from the fixed bank. But in the meantime I also want to use my percussive samples, so what I would have to do is make a version of each drum I need that sets the IRQ flag. The loading process is pretty straightforward, I have a table with $1F entries (the upper 3 bits being the note length) for each of the 4 DMC registers, so a $4011 write is also assigned to every one of them. What I would do when I want to keep the triangle volume down is playing the drum, and when the IRQ fires, play the $FF ramp immediately.
But what if this IRQ happens to fire during NMI, or during my OAM transfer? Does the IRQ fire at all? And if so, can it potentially mess with my transfer? If it's not reliable I will give up on this approach, I can also imagine the IRQ firing right when my wait for the end of VBlank is about to end and this happens and I lose some time and return to game logic a bit late.
But what if this IRQ happens to fire during NMI, or during my OAM transfer? Does the IRQ fire at all? And if so, can it potentially mess with my transfer? If it's not reliable I will give up on this approach, I can also imagine the IRQ firing right when my wait for the end of VBlank is about to end and this happens and I lose some time and return to game logic a bit late.