謎のアレ

というわけで、帰宅したら今度はMSX-BASIC+魔神語じゃぁ〜(w
先日から頭を痛めてたMuSICAのVCD形式のデータを読み込んで加工する、という部分ですが…なんとか無事に動きました! 現在、モーフィング機能と波形一覧表示機能以外は全部動いてます。 今週中には完成しそうです。(^^)
で、VCDデータ(生バイナリ)の読み込み自体は、COPYコマンドでINT型配列変数への直接読み込みで出来るんですが…問題は、そこから1バイトづつのデータ抽出なのでした。 C言語だったら、char=8bit, short=16bit, int=32bit などと最初から長さが決まってるんで、キャストするなりして簡単に1バイトの取り出しが出来るんですが、MSX-BASIC上では、INT型は符号付16bit固定らしいのです。 つまり、INT型1個につき2個分のデータが入ってる! しかも、符号つきなんで、色々と扱いがメンドウなのです。 色々と悩んだ挙句、読み込んだデータからINT値への変換は例えば以下のような感じにしました。


10 '>>>>> SCC wave data read from VD
20 FOR I=0 TO 31 STEP 2
30 SCC(I) = (VD(I/2) AND &H00FF)
40 SCC(I+1)=((VD(I/2) AND &HFF00)/256)
50 IF (SCC(I)>&H7F) THEN SCC(I)=(SCC(I) OR &HFF00)
60 NEXT
めんどくさいですねぇ。 まず、下位データと上位データをそれぞれ1バイト分でマスクして代入します。 このとき、上位データは実際の数値が8ビットシフトされてるので、256で割ってから代入します。 んで、苦労したのが50行目。 下位データは、&H80より大きな値であれば、本来は負の値でなければいけないんですが、INT変数SCCは16bitで計算してるので、このまま代入すると負の値にならない! んで、どうしたかというと、ここで上位バイトのビットを全部立てて、ムリヤリ負の値にしてしまうという荒技に出たのでした。(ぉ 他にもこんなムチャクチャなキャストをしてる箇所満載で、果たしてちゃんと動作してくれてるのか激しく不安。(T_T) でも、ここまで動いたんなら、是非この音色エディタも使いたいところです。 がむばります。