【HSP】可変長数値を扱えるようにする ver.1.1【モジュール】

【HSP】可変長数値を扱えるようにする ver.1.1【モジュール】

※2012/08/07 13:54 : 修正
4バイト以内の可変長数値を本来の数値に戻します。

#module "kerupani_memory"
; 初期化命令
#deffunc k_m_init
dim bits,1
dim number,1
dim number2,1
dim stat2@,1
return
; 可変長数値用lpeek (符号無し 7~28bit 整数?)
#defcfunc lpeek3 var _p1,int _p2
bits=0
number=lpeek(_p1,_p2)
number2=0
bits=((number>>7&1)|(number>>14&2)|(number>>21&4)|(number>>28&8))^0xFF
bits=(bits&(-bits))-1
bits=(bits&0x55555555)+(bits>> 1&0x55555555)
bits=(bits&0x33333333)+(bits>> 2&0x33333333)
bits=(bits&0x0F0F0F0F)+(bits>> 4&0x0F0F0F0F)
bits=(bits&0x00FF00FF)+(bits>> 8&0x00FF00FF)
bits=(bits&0x0000FFFF)+(bits>>16&0x0000FFFF)
repeat bits+1
number2=(number>>(cnt*8)&0x7F)<<((bits-cnt)*7)|number2
loop
stat2@=bits+1
return number2
#global
k_m_init

lpeek3 関数で可変長数値を取出します。

stat2という変数に、可変長数値のバイト長が返ります。
一回lpeekで4バイトのデータを取り、各バイトの一番左のビット (最上位ビット。MSBって言うらしい) を別の変数に保存しておいて、その変数の、一番右から何番目の所に初めて0が来るか調べて (ここのところは「ビットを数える・探すアルゴリズム」を参考にさせていただきました) 、最後に、元の数値が入った変数から8bitごとに7bitづつ切り出してつなげれば完成です。
一昔前まで、可変長数値って5バイトかと思ってたんですよね~おはずかしい… (32bitの数値あらわすかと思っていたもので) 。
でも、そのおかげで割と楽にできました。(気が付くの遅っ)
まあというわけで、MIDIの解析はもうちょっとでいける…といいなぁ (不安) 。
他にもいろいろとやりかけのことが残ってるし、頑張らないとな…。
ではまたいつかお会いしましょう。
↓クリックしてね~


「【HSP】可変長数値を扱えるようにする ver.1.1【モジュール】」への2件のフィードバック

  1. おお!!いいんじゃないですか!?
    パソコン関連が話せる友達があまりいないので…増えると私うれしいです!!

コメントは受け付けていません。