【HSP】big endianの数値をメモリに読み書きできるようにする【モジュール】

【HSP】big endianの数値をメモリに読み書きできるようにする【モジュール】

以前途中であきらめましたけど、
東方project→音楽→MIDIってことで、やっぱりMIDIのことが知りたくなったので (え
もう一度挑戦してみることにしました。
まず、MIDIファイルは基本的に数値をbig endian (ビッグエンディアン) で格納している (HSPと逆) ので、
それに対応させる必要があります。
可変長数値はあとにさせてください。すいません。

#module "kerupani_memory"
#defcfunc wnumcnv int _p1
return (_p1>>8&0xFF)|((_p1&0x7F)<<8)|((_p1>>7&0x01)*0x1FFFF<<15)
#defcfunc wnumcnv2 int _p1
return (_p1>>8&0x7F)|((_p1&0xFF)<<8)|((_p1>>24)&0x80)
#defcfunc lnumcnv int _p1
return (_p1>>24&0xFF)|((_p1>>16&0xFF)<<8)|((_p1>>8&0xFF)<<16)|((_p1&0xFF)<<24)
; Big Endian用wpeek (符号付き 16bit 整数) ※本家と違って -32768 ~ 32767 の価が返ります
#defcfunc wpeek2 var _p1,int _p2
return wnumcnv(wpeek(_p1,_p2))
; Big Endian用wpoke (符号付き 16bit 整数)
#deffunc wpoke2 var _p1,int _p2,int _p3
wpoke _p1,_p2,wnumcnv2(_p3)
return 
; Big Endian用lpeek (符号付き 32bit 整数)
#defcfunc lpeek2 var _p1,int _p2
return lnumcnv(lpeek(_p1,_p2))
; Big Endian用lpoke (符号付き 32bit 整数)
#deffunc lpoke2 var _p1,int _p2,int _p3
lpoke _p1,_p2,lnumcnv(_p3)
return 
#global

peekとpokeは1バイトなので問題ないですよね。
wpeekとwpokeとlpeekとlpokeに2をつければ対応します。
他に定義してる関数はモジュール内だけで使う関数なので気にしないでください。
4バイトのデータだったら単純に入れ替えるだけでよいので楽でしたが、2バイトのほうは、HSPが整数扱うとなると4バイトでしかできないからちょっと厄介でした。
ふう。あとは可変長数値の読み書きを可能にしてMIDIイベントを地道に解析するようにすればだいたい完成かな…。
ではまたいつかお会いしましょう。
↓クリックお願いします~