I have good news to report.
I went ahead and tested my theories on why the official sound.bin doesn't work and I was correct. It turns out the header in the 0.app wants you to record the uncompressed file size, not the compressed one. I've already implemented this into the u8 tool, which will be released tonight.
Now more importantly, this might lead to fixing our issues with the brlyt file as well.
You see, the IMET (0.app) header asks for the file size of the sound.bin, banner.bin and icon.bin. Up until recently I've simply read the file length, recorded it, an left as-is. My experiments with the sound.bin lead me to believe this is wrong, however. You see sound.bin's recorded size, even if it isn't compressed, is NEVER the size of the file. If no compression is used, we record the size of the sound.bin minus 32 (the size of the IMD5 header) which gives us the size of the actual file and not all the header info. If it is compressed, we record the size of the file when uncompressed, which again ignores the first 32 bytes.
My point, the size is always at least 32 bytes smaller!
I THINK the wii is using these three values to allocate memory for the files when they are loaded (as in the case of lz77 files it could be larger than the actual file). A sound.bin with an incorrect file size has never been a big deal, because if it's too small then the file simply won't play, but it won't effect the other two files as it is the last to be loaded. Now banner.bin is a different story, it's the first to be loaded. Let's say we get the size too small.... normally this wouldn't be much of an issue.... there's a lot of empty space in a brlyt and chopping off a few bytes wouldn't hurt... BUT if the file is certain lengths, it'd start to effect the image files also included in the banner. If you try to load a tpl with a bit chopped off the end, you get the same kind of corruption we've been seeing.
Long story short, I'm gonna try to manipulate these values and see if it helps. If it does then I can simply use the same function I use for the sound.bin so it'll take mere minutes to implement.
*EDIT*
I went ahead and implemented this new size on the banner.bin and it appears to still load just fine. I haven't tested a long brlyt with it yet though. I'll do more testing tonight when I have time.
*EDIT2*
This also might be related to our issues with the icon.bin when we recompress it as well. I'm not saying gbalzss isn't also responsible, but it could be that it makes a lz77 of a different size when it re-compresses and that is what is causing the issue as again, a few bytes might get chopped off or added if the value is wrong.