Sherry WRDのバイナリファイルを出力するコンパイラです。とにかく "簡単に" 作成できるようになっています。
SherryWRD仕様 1.1 に準拠したSRYファイルを出力します。
このファイルは、HTML 4.0形式です。
Sherry WRDとは、沢渡みかげ氏が考案した、256色表示可能なWRDの仕様です。
詳細は、SherryWRDのページ(沢渡みかげ氏)と、SherryWRDのページ(ふみぃ)にて、公開されています。
さしあたっては、このドキュメントでは、Sherry WRD Easy Compiler(SECL.EXE)を使用して、WRDを作成する方法を記述します。
SECL.EXEは、Win32 Console Applicationです。つまり、Windows 95/NT4.0以上のコマンドプロンプトで動作します。
SECL.EXEは、拡張子[.ESR]のプレーンテキストのソースファイルから、拡張子[.SRY]のSherry WRDバイナリファイルを出力します。WRDの配布をする場合、拡張子[.SRY]のファイル、および、画像データ[.PNG]を配布することになります。
コマンドラインの書式は以下のとおりです。
SECL <input file .esr> [ [<output file .sry>] <smf file .mid>]
小節、拍子情報を読み込むために、標準MIDIファイルを指定する必要があります。省略した場合は、4/4拍子、変拍子無しと仮定されます。
エラーがあった場合は、ファイル名、行数がいっしょに出力され、コンパイルが中断されます。
SECL独自の用語(?)がある場合があります。
(0,0)-(65535,65535)まで。
(0,0)-(79,29)まで。
0-255まで
0-32767まで
0-255まで
時間の制御などをします。
SherryWRDのであることを宣言します。
verは1を指定してください。
offsetは、時間軸をティック単位でずらすものです。シーケンサでST+値を使った場合、補正してください。(現在未実装) 省略した場合は0、つまり補正無しです。
@SherryWRD(1,10);
演奏開始に合わせます。(WRD中には必ず1つ必要です)
@SherryWRD(1); @AllocatePage(1); @AllocatePage(2); @Start;
指定した時間にタイミングを合わせます。measure:tickです。tickの分解能は、4分音符=48 です。
@TIME(measure, tick)
@Delta(0) @SetTime(10,0) @Locate(0,0) あいうえお @SetTime(11,0); @Locate(0,1) かきくけこ
行と行の間のウェイトを指定したステップ数にします。デフォルトは、4分音符(=48)となります。
@Delta(step)
指定したステップ数だけウェイトを置きます。
グラフィック画面に対する、操作
指定したグラフィックページを確保します。width,heightは省略可能で、省略した場合は640x480となります。
サイズが、640x480以外のページを確保した場合、そのページは@DisplayPage()で表示画面にする事が出来なくなります。
この命令で確保したグラフィックページの透過色は0になります。
ページ0は確保済みの状態になっています。サイズは、640x480となっています。
@AllocPage(page#, width, height);
@AllocatePage(1, 640, 480); @DisplayPage(1);
指定したグラフィックページを解放します。メモリ消費量を抑えるために、不要なページは解放することを推奨します。。
新たにグラフィックページとパレットを確保し、指定したファイル名のPNGファイルを読み込みます。パレットは指定したパレットへ転送されます。
この命令で確保したグラフィックページの透過色はPNGファイルで指定されている透過色になります。透過色の指定の無いPNGファイルは、透過色が0になります。
@LoadPicture(1, 1, "TEST.PNG"); @DisplayPage(1, 0); @ChangePalette(1);
描画ページの指定した座標に、画像ファイルを描画します。PNG画像の(x1,y1)-(x2,y2)領域を、描画ページの(x,y)に転送します。PNGのパレットは、pal#で指定したパレットを作成して、そこに格納されます。pal#は省略可能です。省略した場合は、パレットは切り捨てられます。
@AllocatePage(1); @ActivePage(1); @DrawPicture("TEST.PNG", 0, 0, 320, 200, 100, 200);
透過色付きの画像ファイルを描画します。透明色の部分は描画しません。PNGのパレットは、pal#で指定したパレットに格納されます。pal#は省略可能です。省略した場合は、パレットは切り捨てられます。
@AllocatePage(1); @ActivePage(1); @DrawPictureTransparent("TEST.PNG", 0, 0, 320, 200, 100, 200);
線を描画します。
@AllocatePage(1); @ActivePage(1); @Line(0, 0, 639, 479, 10);
四辺形を描画します。
@AllocatePage(1); @ActivePage(1); @Box(0, 0, 639, 479, 10);
四辺形を描画し、塗りつぶします。
@AllocatePage(1); @ActivePage(1); @BoxFill(0, 0, 639, 479, 10);
表示ページを指定します。
指定するページのサイズは640x480でなければなりません。また、複数のページを指定する事により、透過色を利用して画面の重ねあわせをする事が出来ます。透明色の部分はそれより後ろのページが見えるようになります。
また、テキスト画面は一番手前側(一番上)に表示されます。ただし、@TextPage()でテキスト画面を指定した場合は、自分で@DisplayPage()にテキスト画面を指定しなければなりません。
@DPAGE();
@AllocatePage(1); @AllocatePage(2); @AllocatePage(3); @TextPage(3); @DisplayPage(0, 1, 2, 3);
描画ページを指定します。
グラフィック画面への描画はすべて、このコマンドで指定したページに行われます。
@APAGE();
@ActivePage(1); @Line(0, 0, 50, 50,1);
ビットマスク指定。値は、8bitです。デフォルトは255(=0xFF)です。
グラフィック画面への描画にはすべて適用されます。
このコマンドは、ラインスタイルではありません。
@MASK
@MaskPattern(15); @Line(0, 0, 50, 50, 200);
領域移動。src#ページの(x1,y1)-(x2,y2)の領域を、dest#ページの(xd,yd)に転送します。
// page0 (0,0)-(10,10) から page1 (100,100) にコピー @Move(0, 0, 10, 10, 100, 100, 0, 1);
透過色付き領域移動。
透過色の部分はコピーされません。透過色は、src#ページの透過色が適用されます。
@TMOVE
// page0 (0,0)-(10,10) から page1 (100,100) に透過色付きコピー @TMove(0, 0, 10, 10, 100, 100, 0, 1);
特殊効果付領域移動。src#ページの(x1,y1)-(x2,y2)の領域を、dest#ページの(xd,yd)に転送します。
transparent=1のとき、透過色が有効になります。0のときは無視します。
timeだけの時間をかけて徐々にコピーします。
intervalは、動作間隔です。小さいほど滑らかになりますが、処理が重くなります。デフォルトは4です。一部の特殊効果では無効となります。
次のような効果が用意されています。
effecttype | interval | 効果 |
---|---|---|
0 | 4steps固定 | 8x8の領域を同心円上に広がりながらコピー |
1 | 8steps固定 | 8ライン単位で、上から下へ |
2 | 8steps固定 | 8ライン単位で、上から下へ |
3 | 8steps固定 | 8ライン単位で、左から右へ |
4 | 8steps固定 | 8ライン単位で、右から左へ |
5 | 4steps固定 | GIFインターレース風 |
6 | 8steps固定 | 某はっぱゲーム風 クロスフェード |
20 | 左上からワイプ | |
21 | 右上からワイプ | |
22 | 左下からワイプ | |
23 | 左上からワイプ | |
24 | 真ん中から左右にワイプ | |
25 | 真ん中から上下にワイプ | |
26 | 真ん中から上下左右にワイプ | |
27 | 上から下へワイプ | |
28 | 下から上へワイプ | |
29 | 左から右へワイプ | |
30 | 右から左へワイプ | |
40 | 8x8に領域に区切ってランダムに転送 | |
41 | 16x16に領域に区切ってランダムに転送 | |
42 | 32x23に領域に区切ってランダムに転送 | |
43 | 奇数ラインを左から、偶数ラインを右から登場 |
0-6は、マスクパターンコピーを使います。そのため動作がのろいです。16以降は単なるコピーを組み合わせています。そこそこの速度は出ます。また、intervalの値は無視され、interval=time/stepとなります。
40-42番のランダム転送と、43番のMSX2+もどきは、出力ファイルのサイズが激増する要因になるので、ご注意下さい。
ほかにこのような効果が欲しい、というのがあればぜひご意見下さい。前向きに検討したいと思います。
// page0 (0,0)-(10,10) から page1 (100,100) にコピー 1小節かけてGIFインターレース風に @MoveEffect(0, 5, 192, 0, 0, 10, 10, 100, 100, 0, 0);
グラフィックページに、文字列を描画します。
x,y,colorはそれぞれ省略可能です。省略した場合は前回使用した値を使用します。この命令はグラフィック画面へ描画します。テキスト画面とは関係がありません。
@AllocatePage(1); @ActivePage(1); @DrawText(0, 0, 20, "あいうえお");
歌詞を表示する。
string中には、以下の特殊文字列を指定する事が出来ます。
_ | @DELTAで指定したタイミングを挿入 | |..| | ||で囲った部分を同一タイミングとします。 | 文字 | 1文字は1タイミングになります。 | '\'_, '\|', '\\' | 指定した文字自身を表示します。 |
コマンドは並列に動作します。つまり、実行後の時間ポインタは変わりません。
この命令はグラフィック画面へ描画します。テキスト画面とは関係がありません。
// 'あいうえお\' と表示します。 @Delta(48); @DrawLyrics(0, 0, 20, "あい___|abc|うえお\\") @ @DrawLyrics(0, 0, 21, "あい___|abc|うえお\\") @ @DrawLyrics(0, 0, 22, "あい___|abc|うえお\\") @ @DrawLyrics(0, 0, 23, "あい___|abc|うえお\\")
歌詞を表示する。色番号をcolor1〜color2へ変化させて描画します。timeで示した時間かけて描画します。
page#にある、(x,y)-(x+15,y+15)にあるパターンを文字パターンとして指定します。
このコマンドを使用すると、文字色の指定が無視されます。
テキスト画面、グラフィック画面の双方に影響します。
// グラフィカル文字のパターン作成 @APAGE(3); @BOXFILL(0, 0, 15, 2, 210); @BOXFILL(0, 3, 15, 5, 211); @BOXFILL(0, 6, 15, 9, 212); @BOXFILL(0, 10, 15, 12, 211); @BOXFILL(0, 13, 15, 15, 210); @TextPattern(3, 0, 0); // 表示 @DrawText(0, 0, 0, "あいうえお");
@TextPatternの指定をキャンセルします。
@TextPattern();
パレットに対する操作
パレットを作成します。作成後のパレットの中身はすべて黒に設定されます。
パレット#0は確保済みの状態となっているので、改めて確保する必要はありません。
@AllocatePalette(1,2,3,4,5,6,7);
確保されているパレットを解放します。
@FreePalette(1,2,3,4,5,6,7);
フェードアウト/インをします。pal1# => pal2#へ滑らかに色を変化させます。
フェードは、tickで指定した時間内に終了します。
stepは、パレットを変更するインターバルを指定します。stepを省略した場合は10段階変化します。(step=tick/10)
@Fade(0, 1, 192, 5); // pal#0 〜 pal#1 へ変化させます。1小節だけ、時間がかかります。
パレット切り替え。指定したパレットを適用させます。
@PALCHG
@ChangePalette(1);
パレットの内容を変更します。
colorの値は、HTMLと同じで、16進数で0xRRGGBBとなります。
// pal#20に、#0=赤, #1=紫 に設定します。 @SetPalette(20, 0, 0xFF0000, 0xFF00FF);
指定したパレットの中身を全部同じ色に設定します。
主に、フェードイン/アウトの時に使うパレットで使用します。
@SetPaletteAll(0, 0xFFFFFF); // 全部 白 @Fade(0, 1, 192); // 白からのフェードイン
パレットsrc#の内容ををパレットdest#に転送します。
パレットsrc1#とsrc2#をpercentで指定した比でミックスして、dest#に格納します。
// 明るさを半分にします。 @LoadPicture(2, 1, "TEST.PNG"); @SetPaletteAll(2, 0x000000); @PaletteContrast(1, 2, 0, 50); @PALCHG(0);
これらのコマンドを使用する事により、文字列をそのまま描画する事が出来ます。
テキスト画面の座標の範囲は、(0,0)-(79,29)です。@TextPage()を使わなかった場合は自動的に画面を確保します。
テキスト画面でも、グラフィック操作を行いたい場合は、@TextPage()を使う必要があります。
テキスト表示モードを指定します。
このコマンドは、"画面に表示するかしないか"ではなくて、テキスト画面への描画を許可するか、しないかです。mode=0のときにテキスト画面に描画しようとすると、エラーとなります。デフォルトは1です。
WRDソースを空行を使ってきれいに整形したい場合は、@TextMode(0)を使います。
@TMODE
@SherryWRD(1); @TextMode(0); // 初期化なのでテキスト画面への描画はない @AllocatePage(..) ... ... @Start; @TextMode(1); // テキスト画面への描画開始 あいうえお かきくけこ @TextMode(2); あ___|いうえお|
テキスト画面のスクロール領域を定義します。デフォルトは、(0,0)-(79,29)です。
カーソル位置、テキストの色を設定します。
fcolorは文字色、bcolorは背景色です。文字色のデフォルトは7、背景色のデフォルトは、0(透明) です。
省略した場合は、以前の値が引き継がれます。
@LOCATE
テキスト画面クリア。指定した範囲を背景色(デフォルト0)で塗りつぶします。
@TCLS
@TextClear(0, 0, 79, 29);
テキスト表示色/背景色指定。@TextPattern()を指定中は無視されます。デフォルトは文字色=7、背景色=0です。
@COLOR
行末に ';' (セミコロン)を付けると、行間のタイミングがなくなり、次の行と同じタイミングで実行されます。逆に、セミコロンが無いと、1行ずつ@DELTAで指定したウェイトが挿入されます。
MIMPIのように、直接表示文字列を書いても描画されず、エラーとなります。このような使い方をしたい場合は、@TextMode(1)と指定すると可能になります。
'//' 以降は、行末までコメント扱いになります。そのとき、セミコロンは // より前になければなりません。
あいうえお; // コメント @Locate(0,0); // コメント
Sherry WRDでは、画像ファイルとして、PNG形式を使用する事が出来ます。PNG形式は、GIFのLZW特許問題を回避するために、CompuServe, W3Cが開発した画像ファイルフォーマットです。W3Cのお墨付きがあるファイルフォーマットなので、普及は時間の問題だと言われています。
PNG形式には、以下のフォーマットが用意されています。
タイプ | ビット数 | スペック |
---|---|---|
0 | 1,2,4,8,16 | グレースケール |
2 | 8,16 | RGB指定 |
3 | 1,2,4,8 | パレットインデックス指定 (パレットテーブル付き) |
4 | 8,16 | グレースケール (αチャンネル付き) |
6 | 8,16 | RGB指定 (αチャンネル付き) |
このうち、SherryWRDで扱う事が出来るのは、タイプ3のパレット付きのフォーマットです。ビット数は問いません。
画像ファイルには、複数の透明色を指定する事が出来ますが、SherryWRDで使用できるのは、最初の1つのみです。残りは無視されます。
また、bmp2png.exeを用意すると、SECL.EXEでBMPファイルを使用することが出来ます。SECL.EXEは、BMPファイルが指定されると、自動的にBMP2PNG.EXEを呼び出して、PNGファイルに変換します。
bmp2png.exeはBMP Toolsの中に入っています。ツール入手方法のページをご覧ください。
Sherry Easy Compilerは、Sherry WRDのために作られた簡易コンパイラです。以下のようなコンセプトで開発しています。
SECLのソースには、最低限次のような記述が必要です。テンプレートとして活用してみてください。次に示すソースは、とりあえず"BACK.PNG"という画像ファイルを背景として表示し、歌詞を表示するものです。"BACK.PNG"は、640x480でなければなりません。
@SherryWRD(1); @TextMode(0); // パレットの確保 @AllocatePalette(1); // #1 真っ白 @SetPaletteAll(1, 0xFFFFFF); // PNG読み込み // #2ページに、"BACK.PNG"を読み込み。パレットは#0に格納 @LoadPicture(2, 0, "BACK.PNG"); @MOVE(0, 0, 639, 479, 0, 0, 2, 0); // #2ページから #0ページへ転送 // テキスト文字用パレット @SetPalette(0, 255, 0xFFFFFF); // 表示ページ指定 @DisplayPage(0); // 描画ページ指定 @ActivePage(0); // 演奏開始 @Start; @TextMode(1); @Time(1,0); @Fade(1, 0, 192); // #1〜#0にフェード @Time(2); @ChangePalette(0); @TIME(14,78) @TextMode(2); @delta(8); @Locate(10, 5, 255); あい_う|えお|かきくけこ
まず、必要なだけ画面、パレットを確保します。パレットは@ChangePaletteとするとはじめて適用されます。画面ページも、@DisplayPage()を使用してから表示されます。
SECLでは、表示ページに最大4枚のページを指定する事が出来ます。これは4枚の画像を重ねあわせが出来るという事を意味します。
表示する際は、一番後ろにあたる背景ページから順番に上に重ねあわせていきます。このとき、透明色の概念が重要となります。
透明色というのは、その名のとおり、透き通った色です。この色で描画された部分は後ろ側のページが見えるようになります。透明色は通常、0となります。
透明色付きPNGファイルを利用する場合、透明色部分が0である保証がありませんので、次のような方法を取る必要があります。
まず、@LoadPictureであるページに画像をロードします。@LoadPicture()で確保したページの透明色は、PNGファイルで指定したいる透明色に自動的にセットされます。よって@MoveTransparent()を使用する事が出来ます。そこで、@MoveTransparent()を使用して目的のページに描画します。
@LoadPicture(200, 0, "CHARACTER.PNG"); // #200に読み込み @DisplayPage(0, 1, 2); // #0,#1,#2を表示ページに設定 @MoveTransparent(0, 0, 32, 32, 100, 150, 200, 2); // PNGファイルの(0,0)-(32,32)の領域を #2ページの(100,150)に転送
Sherry WRDでは、256色の色を使用する事が出来ます。しかし、256色の画像を使用してしまっては、文字を表示するための色が無くなってしまいます。そこで、Sherry WRDで使用する画像は、減色して使用する事になります。
たとえば、256色画像を任意のツールを使用して、200色に減色します。そうすると、あまった、色番号 #200-#255は文字や、その他のオブジェクトのために使用する事が出来ます。
また、16色画像を複数表示する、といった利用方法もあります。
Sherry WRDについての情報は、http://www.ns.kogakuin.ac.jp/~c396022/Sherry/ (ふみぃ)、もしくは、http://www.mafumafu.com/sherry/ (沢渡みかげさん)にあります。関連ツールの配布も行っています。
現在、このSRYファイルを再生できるプレイヤーは、
があります。
曲データの配布は必ず、SRYファイルで行ってください。再生側がこのコンパイラを持っているとは限らないからです。また、SherryWRD仕様は、バイナリレベル(SRYファイル)での互換性を保証しています。
私が直接アップロードしているのは、以下のとおりです。
もっと高度なWRDを作りたい方は、沢渡みかげさんのSherry Compilerが便利です。現在制作中だそうです。
入手場所は、Sherry WRDのページへどうぞ。
tosさんが作成された、減色ツールです。
入手場所は、以下のとおりです。
現在、次の機能が未実装です。いずれ実装したいと思います。
このプログラムの著作権は、ふみぃが保有しております。
このプログラムの転載、再配布は、金銭を伴わない非営利に限り自由です。許可は要りません。(許可申請メールを送っても返信する事はありません)
このプログラムを雑誌、書籍、本、CD−ROMなど、金銭の伴う配布をする場合は、許可が必要です。掲載誌もしくは掲載されたメディアを送付する必要があります。
なにかご意見がありましたら、c396022@ns.kogakuin.ac.jpにお願いします。このメールアドレスでは今のところ質問は受け付けておりません。
質問は、fumy-mlでお願いします。私が主催しているメーリングリストです。
また、ゆいNETでは、次のボードを巡回しています。
Copyright(c)1997,98 by Fumy. All rights reserved.