While I would say Gil Galad's tutorial is pretty darn good, you really have to dig yourself into fow specific drivers work.
The easy ones are the games that use somesort of mapper, since they either use the $8000-$BFFF region or the hardwired bank for music (this is especially true for some Atlus games), but even then you need sometimes to make a little RAM fetch code.
Nintendo drivers are all just RAM storing, Konami ones are sometimes absurdly werid, TOSE drivers are sometimes store every channel on 1 init, sometimes they call every tune per channel like in Racket Attack, somtimes they need a TAY opcode (Frankeinstein) to work properly.
Some PAL NSFs are still broken due to them storing the PLAY call in an absurd way. Per say for me, I only had luck with some games that had a JSR to the original PLAY.
Then it comes optimazion. That can be a whole new level. Per say, the Hook NSF had a JSR to in the hardwired bank, however I took that code and relocated it under my init table. The NSF got became 13KB than 26KB. Hiroyuki Masuno's driver is a massive spaghetti code: stores the setup code in the hardwired bank $F000-$FFFF and stores the sequence data around $8000-$9FFF.
You have to write code to eliminate all the banks that are for game code setup.
This is an extremly tedious job, but this is how it should have been for the past 20 years.
Sure... you can cut out the banks and use the Bankswitch bytes, however there is a little message by Gil Galad: "ONLY USE THE BANKSWITCH BYTES UNLESS IT IS ABSOLUTELY NECESSARRY".
And since apart from games that has several banks of music code, you litearlly never have to enable it (unless typing 00 01 02 03 04 05 06 07 < ENA BANKS) at all. I even fixed some of Karmic's rips with this, and I think I even squezzed down his NSFs a bit.
As for public NSFs, I probably fixed more than 900 of these...
NSF ripping is kinda like debugging: you are the detective and the murdered person at the same time or something.