SECL Reference Manual

Sherry WRDのバイナリファイルを出力するコンパイラです。とにかく "簡単に" 作成できるようになっています。

SherryWRD仕様 1.1 に準拠したSRYファイルを出力します。

このファイルは、HTML 4.0形式です。


Sherry WRDとは?

Sherry WRDとは、沢渡みかげ氏が考案した、256色表示可能なWRDの仕様です。

詳細は、SherryWRDのページ(沢渡みかげ氏)と、SherryWRDのページ(ふみぃ)にて、公開されています。

さしあたっては、このドキュメントでは、Sherry WRD Easy Compiler(SECL.EXE)を使用して、WRDを作成する方法を記述します。


SECL.EXEの使い方

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独自の用語(?)がある場合があります。

用語一覧

グラフィックページ
線、画像などが格納されているページです。
@AllocatePage()を使ってページを作ります。ページは最大256個作る事が出来ます。
テキストページ
文字が格納されているページです。画面の一番手前側に表示されます。SECLでは、唯一1枚のテキストページが準備されます。また、グラフィックページをテキストページとして使用することも出来ます。(@TextPage)
パレット
256個の色が集まった組です。パレットは、@AllocatePalette()で作成し、@SetPalette()でパレットの中身をセットします。また、@LoadPicture()/@DrawPicture()実行時に、PNGファイルのパレットを読み込む事が出来ます。@ChangePalette()で実際の画面に反映させます。
ティック (tick)
時間の単位。1tickは192分音符となります。また、192=全音符 96=2分音符 48=4分音符...となります。
透明色
透明色は特別な色です。画面を重ねあわせる場合、透過色の領域は描画されず、背景がそのまま残ります。通常、透明色は0です。@LoadPicture()で確保したページはPNGファイルの透明色が適用されます。

制限

グラフィック座標

(0,0)-(65535,65535)まで。

テキスト座標

(0,0)-(79,29)まで。

パレット番号

0-255まで

ページ番号

0-32767まで

色番号

0-255まで

制御命令

時間の制御などをします。

@SherryWRD(ver,offset)

SherryWRDのであることを宣言します。

verは1を指定してください。

offsetは、時間軸をティック単位でずらすものです。シーケンサでST+値を使った場合、補正してください。(現在未実装) 省略した場合は0、つまり補正無しです。

@SherryWRD(1,10);

@Start

演奏開始に合わせます。(WRD中には必ず1つ必要です)

@SherryWRD(1);
@AllocatePage(1);
@AllocatePage(2);
@Start;

@SetTime(measure, tick)

指定した時間にタイミングを合わせます。measure:tickです。tickの分解能は、4分音符=48 です。

別名

@TIME(measure, tick)

@Delta(0)
@SetTime(10,0)
@Locate(0,0)
あいうえお
@SetTime(11,0);
@Locate(0,1)
かきくけこ

@SetDelta(step)

行と行の間のウェイトを指定したステップ数にします。デフォルトは、4分音符(=48)となります。

別名

@Delta(step)

@Wait(step)

指定したステップ数だけウェイトを置きます。

@End 演奏終了に合わせます。コンパイル時にMIDIファイルを指定する必要があります。

グラフィックページ描画命令

グラフィック画面に対する、操作

@AllocatePage(page# [, width, height])

指定したグラフィックページを確保します。width,heightは省略可能で、省略した場合は640x480となります。

サイズが、640x480以外のページを確保した場合、そのページは@DisplayPage()で表示画面にする事が出来なくなります。

この命令で確保したグラフィックページの透過色は0になります。

ページ0は確保済みの状態になっています。サイズは、640x480となっています。

別名

@AllocPage(page#, width, height);

@AllocatePage(1, 640, 480);
@DisplayPage(1);

@FreePage(page#)

指定したグラフィックページを解放します。メモリ消費量を抑えるために、不要なページは解放することを推奨します。。

@LoadPicture(page#, pal#, filename)

新たにグラフィックページとパレットを確保し、指定したファイル名のPNGファイルを読み込みます。パレットは指定したパレットへ転送されます。

この命令で確保したグラフィックページの透過色はPNGファイルで指定されている透過色になります。透過色の指定の無いPNGファイルは、透過色が0になります。

@LoadPicture(1, 1, "TEST.PNG");
@DisplayPage(1, 0);
@ChangePalette(1);

@DrawPicture(filename, x1, y1, x2, y2, x, y, pal#)

描画ページの指定した座標に、画像ファイルを描画します。PNG画像の(x1,y1)-(x2,y2)領域を、描画ページの(x,y)に転送します。PNGのパレットは、pal#で指定したパレットを作成して、そこに格納されます。pal#は省略可能です。省略した場合は、パレットは切り捨てられます。

@AllocatePage(1);
@ActivePage(1);
@DrawPicture("TEST.PNG", 0, 0, 320, 200, 100, 200);

@DrawPictureTransparent(filename, x1, y1, x2, y2, pal#)

透過色付きの画像ファイルを描画します。透明色の部分は描画しません。PNGのパレットは、pal#で指定したパレットに格納されます。pal#は省略可能です。省略した場合は、パレットは切り捨てられます。

@AllocatePage(1);
@ActivePage(1);
@DrawPictureTransparent("TEST.PNG", 0, 0, 320, 200, 100, 200);

@Line(x1, y1, x2, y2, color)

線を描画します。

@AllocatePage(1);
@ActivePage(1);
@Line(0, 0, 639, 479, 10);

@Box(x1, y1, x2, y2, color)

四辺形を描画します。

@AllocatePage(1);
@ActivePage(1);
@Box(0, 0, 639, 479, 10);

@BoxFill(x1, y1, x2, y2, color)

四辺形を描画し、塗りつぶします。

@AllocatePage(1);
@ActivePage(1);
@BoxFill(0, 0, 639, 479, 10);

@DisplayPage(page1# <<<, page2#>, page3#>, page#4>)

表示ページを指定します。

指定するページのサイズは640x480でなければなりません。また、複数のページを指定する事により、透過色を利用して画面の重ねあわせをする事が出来ます。透明色の部分はそれより後ろのページが見えるようになります。

また、テキスト画面は一番手前側(一番上)に表示されます。ただし、@TextPage()でテキスト画面を指定した場合は、自分で@DisplayPage()にテキスト画面を指定しなければなりません。

別名

@DPAGE();

@AllocatePage(1);
@AllocatePage(2);
@AllocatePage(3);
@TextPage(3);
@DisplayPage(0, 1, 2, 3);

@ActivePage(page#)

描画ページを指定します。

グラフィック画面への描画はすべて、このコマンドで指定したページに行われます。

別名

@APAGE();

@ActivePage(1);
@Line(0, 0, 50, 50,1);

@MaskPattern(maskbit)

ビットマスク指定。値は、8bitです。デフォルトは255(=0xFF)です。

グラフィック画面への描画にはすべて適用されます。

このコマンドは、ラインスタイルではありません。

別名

@MASK

@MaskPattern(15);
@Line(0, 0, 50, 50, 200);

@Move(x1, y1, x2, y2, xd, yd, src#, dest#)

領域移動。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);

@MoveTransparent(x1, y1, x2, y2, xd, yd, src#, dest#)

別名

透過色付き領域移動。

透過色の部分はコピーされません。透過色は、src#ページの透過色が適用されます。

@TMOVE

// page0 (0,0)-(10,10) から page1 (100,100) に透過色付きコピー
@TMove(0, 0, 10, 10, 100, 100, 0, 1);

@MoveEffect(effecttype, time, interval, x1, y1, x2, y2, xd, yd, source page#, destination page#, transparent)

特殊効果付領域移動。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);

@DrawText(x, y, color, string)

グラフィックページに、文字列を描画します。

x,y,colorはそれぞれ省略可能です。省略した場合は前回使用した値を使用します。この命令はグラフィック画面へ描画します。テキスト画面とは関係がありません。

@AllocatePage(1);
@ActivePage(1);
@DrawText(0, 0, 20, "あいうえお");

@DrawLyrics(x, y, color, string)

歌詞を表示する。

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|うえお\\")

@DrawLyricsRainbow(x, y, color1, color2, time, string)

歌詞を表示する。色番号をcolor1〜color2へ変化させて描画します。timeで示した時間かけて描画します。

@TextPattern(page#, x, y)

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, "あいうえお");

@TextPatternOFF()

@TextPatternの指定をキャンセルします。

@TextPattern();

パレット制御命令

パレットに対する操作

@AllocatePalette(pal#, pal#, pal#....)

パレットを作成します。作成後のパレットの中身はすべて黒に設定されます。

パレット#0は確保済みの状態となっているので、改めて確保する必要はありません。

@AllocatePalette(1,2,3,4,5,6,7);

@FreePalette(pal#, pal#, pal#....)

確保されているパレットを解放します。

@FreePalette(1,2,3,4,5,6,7);

@Fade(Pal1#, pal2#, tick [,step])

フェードアウト/インをします。pal1# => pal2#へ滑らかに色を変化させます。

フェードは、tickで指定した時間内に終了します。

stepは、パレットを変更するインターバルを指定します。stepを省略した場合は10段階変化します。(step=tick/10)

@Fade(0, 1, 192, 5); // pal#0 〜 pal#1 へ変化させます。1小節だけ、時間がかかります。

@ChangePalette(pal#)

パレット切り替え。指定したパレットを適用させます。

別名

@PALCHG

@ChangePalette(1);

@SetPalette(pal#, index#, color....)

パレットの内容を変更します。

colorの値は、HTMLと同じで、16進数で0xRRGGBBとなります。

// pal#20に、#0=赤, #1=紫 に設定します。
@SetPalette(20, 0, 0xFF0000, 0xFF00FF);

@SetPaletteAll(pal#, color)

指定したパレットの中身を全部同じ色に設定します。

主に、フェードイン/アウトの時に使うパレットで使用します。

@SetPaletteAll(0, 0xFFFFFF); // 全部 白
@Fade(0, 1, 192); // 白からのフェードイン

@CopyPalette(dest#, src#)

パレットsrc#の内容ををパレットdest#に転送します。

@PaletteMix(dest#, src1#, src2#, percent)

パレット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()を使う必要があります。

@TextMode(mode)

テキスト表示モードを指定します。

このコマンドは、"画面に表示するかしないか"ではなくて、テキスト画面への描画を許可するか、しないかです。mode=0のときにテキスト画面に描画しようとすると、エラーとなります。デフォルトは1です。

WRDソースを空行を使ってきれいに整形したい場合は、@TextMode(0)を使います。

別名

@TMODE

@SherryWRD(1);
@TextMode(0); // 初期化なのでテキスト画面への描画はない

@AllocatePage(..)
...
...

@Start;
@TextMode(1); // テキスト画面への描画開始
あいうえお
かきくけこ
@TextMode(2);
あ___|いうえお|

@TextWindow(x1, y1, x2, y2)

テキスト画面のスクロール領域を定義します。デフォルトは、(0,0)-(79,29)です。

@TextLocate(x, y, fcolor, bcolor)

カーソル位置、テキストの色を設定します。

fcolorは文字色、bcolorは背景色です。文字色のデフォルトは7、背景色のデフォルトは、0(透明) です。

省略した場合は、以前の値が引き継がれます。

別名

@LOCATE

@TextClear(x1, y1, x2, y2)

テキスト画面クリア。指定した範囲を背景色(デフォルト0)で塗りつぶします。

別名

@TCLS

@TextClear(0, 0, 79, 29);

@TextColor(color、backcolor)

テキスト表示色/背景色指定。@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 Easy Compilerは、Sherry WRDのために作られた簡易コンパイラです。以下のようなコンセプトで開発しています。

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)に転送

256色画像の利用方法

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ファイル)での互換性を保証しています。

関連ツール/入手方法

SECL.EXEの入手方法

私が直接アップロードしているのは、以下のとおりです。

関連ツール

Sherry Compiler

もっと高度なWRDを作りたい方は、沢渡みかげさんのSherry Compilerが便利です。現在制作中だそうです。

入手場所は、Sherry WRDのページへどうぞ。

T-Bcnv

tosさんが作成された、減色ツールです。

入手場所は、以下のとおりです。

制限事項

現在、次の機能が未実装です。いずれ実装したいと思います。

著作権、再配布など

このプログラムの著作権は、ふみぃが保有しております。

このプログラムの転載、再配布は、金銭を伴わない非営利に限り自由です。許可は要りません。(許可申請メールを送っても返信する事はありません)

このプログラムを雑誌、書籍、本、CD−ROMなど、金銭の伴う配布をする場合は、許可が必要です。掲載誌もしくは掲載されたメディアを送付する必要があります。

なにかご意見がありましたら、c396022@ns.kogakuin.ac.jpにお願いします。このメールアドレスでは今のところ質問は受け付けておりません。

質問は、fumy-mlでお願いします。私が主催しているメーリングリストです。

また、ゆいNETでは、次のボードを巡回しています。

Copyright(c)1997,98 by Fumy. All rights reserved.