It is interesting to see how similar our approaches to note algebra is. While my project is written in Rust, it looks like we calculate note names in a very similar way [1].
I also really like the way you are handling accidentals - by storing accidentals including double-sharps and double-flats alongside the notes. I am using a global variable which picks between using sharps or flats when showing accidentals - works fine for now but definitely does not cover all use cases. I'll see if your approach can solve some of the problems I've encountered.
Thank you again for sharing, I feel like I learned many useful things from just a cursory glance at Kord. Likewise, I hope you find Harmony Explorer interesting!
[0] https://github.com/tiniuclx/harmony-explorer
[1] https://github.com/tiniuclx/harmony-explorer/blob/master/src...