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