ゴメン想定外のコーディングだ。それは。

if(apu.volume1_enable) {
data[index++] = (byte)0x00;
data[index++] = (byte)0xFF;
data[index++] = (byte)0xE2;
data[index++] = (byte)(AUDIO_VOL[apu.volume1] & 0x3F);
}

だと思った。
スピード追求してるみたいだからベタな書き方だけど。
サイズの計算なくすなら、まずは最大幅幅確保してからという手もありだ。
変数indexが最後には、サイズと一致しているハズだから
最後に
byte[] result = new byte[index];
System.arraycopy(data,0,result,0,index);
でいいんじゃない?
最大幅分のbyte配列のメモリは余計に使うけど。