model "WAV(RIFF)ファイルを読み込んで、チャンクを解析する" { // ファイルパス macro dir,file,ext; pathsplit $(pathname), dir,file,ext; // 手続き procedure strings siz,len { // 現在のファイルポインタ位置から、+sizバイトまでの間で、 // 長さlen文字以上の印刷可能文字(0x20〜0x7e)を探して、表示する。 // 表示したバイト数を変数stringsに返す。 nvar len=4; var slen; macro str; var fpos; var fpos_end; var cmp; var cchr; macro schr; ftell fin,fpos; fpos_end=fpos + siz; while (fpos=len) { gsub "#","#",str; fprint fout," "$(str); strings=strings + slen; } slen=0; mlet str=""; } else { chrcat str,cchr; } ftell fin,fpos; } strlen slen=$(str); if (slen>=len) { gsub "#","#",str; fprint fout," "$(str); strings=strings + slen; } } procedure indent { var idx; idx=0; while (idx0) { fprint fout,$,; } } else { strcmp cmp=$(buf),"fmt "; if (cmp=0) { // WAVファイルのfmtチャンク var fmt; var chn; var spl; var bps; var alg; var wid; fget16 fin,fmt; fget16 fin,chn; fget32 fin,spl; fget32 fin,bps; fget16 fin,alg; fget16 fin,wid; mlet NUM_FORM="%g"; fprint fout," fmt=# chn=# spl=# Bps=# alg=# wid=#"$,, fmt,chn,spl,bps,alg,wid; } } } // ファイルポインタをsiz(偶数境界に切り上げ)だけ進める。 fseek fin,fpos + @((siz + 1)/2)*2; } until !(fpos + @((siz + 1)/2)*2