MIDIのデータ構造の前に…

SMFでの数値表現って厄介ですねー。可変長数値とか言うの…。自分で考えてもわからなかったので、どっかにおちてたC++のコードを翻訳した。SMFを読み取るプログラムを書いてたのだが、この部分がないと完成できなかったので、作ったのさ。

        static byte[] Encode(ulong fixnum)
        {
            byte index = (byte)CeilLog_128(fixnum);
            byte[] variable = new byte[index];
            variable[index - 1] = (byte)(fixnum & 0x7F);
            for (byte i = 1; i < index; i++)
            {
                variable[index - i - 1] = (byte)((fixnum >> (7 * i)) | 0x80);
            }
            return variable;
        }
        static uint CeilLog_128(ulong num)
        {
            if (num < 128)
                return 1;
            else
                return 1 + CeilLog_128(num >> 7);
        }

        static ulong Decode(byte[] variable)
        {
            ulong _fixed = 0;
            for (byte k = 0; ; k++)
            {
                // 最大8バイト
                if (k >= 8)
                    throw new Exception();// Error
                _fixed += (ulong)(variable[k] & 0x7F);
                if (variable[k] >> 7 == 0)
                    break;
                _fixed <<= 7;
            }
            return _fixed;
        }
        static ulong Decode(Stream stream)
        {
            ulong _fixed = 0;
            for (byte k = 0; ; k++)
            {
                int variable_k = stream.ReadByte();

                if(variable_k==-1)
                    throw new Exception();// Error

                // 最大8バイト
                if (k >= 8)
                    throw new Exception();// Error

                _fixed += (ulong)(variable_k & 0x7F);
                if (variable_k >> 7 == 0)
                    break;
                _fixed <<= 7;
            }
            return _fixed;
        }

このデータ構造を使ったクラス(もしくは構造体)をいつか作ろうかな。演算を定義するのが難しそうだ…離散フーリエ変換とか必要なの??
マウスのホイールが壊れたらしく、時々逆方向に回転してしまう…