1. Merge some of the common code in decode_note() 2. Use a jump table for the two switch() statements in decode_note() 3. Make the frequency and volume table lookups use self-modify code instead of checking which table to use at runtime 4. The time-length calculation can be much faster, it only needs to find the length of one channel (not all three, right now re-using code) 5. I also should run some more PT3 files through to verify correctness, I've only validated 3 so far. 6. Merge mockingboard output to register calc, instead of setting all 13 registers then walking through and outputting them 7. Clear out the channel data with a memset() instead of explicitly setting values? 8. Self modify the 1MHz vs 1.7MHz change 9. Align the volume/frequency tables. Save a few cycles on the reads? some further out things 1. I think the z80 assembly version generates the lookup tables at startup, potentially saving a lot of space 2. Each channel uses roughly 40 bytes of state, so 120 bytes total. Putting that in the zero page will save a lot of space in the executable (though wouldn't really help speed that much if I keep using index-X addressing mode). I don't think game/demo authors would be excited about giving up half the zero page though. Player: 1. Loop support 2. Keys to increase/decrease pattern 3. Handle LZ4 compressed files? 4. Have RTS code exit with error if file not found 5. Center the title/author? Bugs: Sometimes when using arrows, the next song will have channels out of synch?