Also after more analysis of the VGM data, MoonBlaster seems to set the wave table number and ADSR parameters every time a key-on is done. This is a massive waste of time and data, and vgm_cmp
also does not seem to catch it. Adapting the script to optimise this:
Track Length Original vgm_facc Custom Freq-opt Wave-opt 01_Title.vgm 1:55 287 kB 259 kB 132 kB 99 kB 77 kB 02_Map.vgm 0:14 26 kB 24 kB 12 kB 10 kB 8 kB 03_Palm.vgm 1:38 187 kB 172 kB 87 kB 72 kB 55 kB 04_Battle.vgm 1:33 309 kB 278 kB 141 kB 99 kB 80 kB 05_Death.vgm 0:04 8 kB 7 kB 4 kB 3 kB 2 kB 06_Over.vgm 1:22 110 kB 100 kB 51 kB 38 kB 31 kB 07_Bonus.vgm 0:49 96 kB 87 kB 44 kB 35 kB 26 kB 08_Ice.vgm 2:15 454 kB 406 kB 206 kB 132 kB 115 kB 09_Ruins.vgm 1:59 373 kB 336 kB 170 kB 126 kB 101 kB 10_Forest.vgm 1:46 339 kB 307 kB 156 kB 120 kB 96 kB 11_Complete.vgm 0:06 19 kB 17 kB 9 kB 6 kB 6 kB 12_Credits.vgm 0:18 46 kB 42 kB 21 kB 18 kB 14 kB Total 13:59 2.2 MB 2.0 MB 1.0 MB 755 kB 608 kB
Now these last two optimisations I haven’t tested playing on an actual (or emulated) OPL4, but I believe it should work fine. But in the mean time, our test data has shrunk to just 27% of the original VGM size.
A working player: 07_bonus.com (26996 bytes)
Plays track 07_Bonus (26307 bytes), and works great on my real OPL4.
It needs some more work, e.g. there’s no banking yet so it can’t play anything larger than 50 kB or so, and I’m not handling certain edge cases properly, but it’s a nice proof of concept.