VL-BASICのPLAY(MML)をSMF(.mid)に変換

 

N88-BASIC(PC-9801)、NL-BASIC、VL-BASICのPLAY(MML)

VL-BASICのMPU PLAY(MPU MIDI)などの

演奏データをSMF(Standard MIDI File)

~.midに変換する方法を紹介します。

(ただし、VL-BASICで動くものに限ります)

 

mid20516.zip(tron2txt.exe、txt2mid.exe)、

VL-BASICは以下からダウンロードして下さい。

VL-BASIC(N88-BASIC互換?)ホームページへのリンク

ホームページに書いてあるパスワードを入力して、

Readme.txtを読んで、遊んで見て下さい。

すべて、windows用です。

 

次の3Stepで変換します。

 

変換方法(MPU TRONの出力をa.txtで説明)

Step1

VL-BASICを起動し、

LOAD "ファイル名" で演奏プログラムをロードします。

CMD MPU ON

MPU TRON("a")

RUN 音はなりませんが演奏データ(MIDI)を出力します。

MPU TROFF ファイルをクローズします。

 

Step2

a.txtを

tron2txt.exe

に重ねる

 

Step3

a_txt.txtを

txt2mid.exe

に重ねる

a_txt_txt.midを

MIDIプレーヤーで演奏

 

もう少し、詳しく解説

 

Step1

VL-BASICのPLAYやMPU PLAYなどで演奏した。

データ(MIDI)をファイルに出力します。

 

LOAD "ファイル名" で演奏プログラムをロードします。

CMD MPU ON

MPU TRON("a") aは任意のファイル名

RUN 音はなりませんが演奏データ(MIDI)を出力します。

MPU TROFF ファイルをクローズします。

 

a.txtができます。

内容は

wait(msec), midiデータ...

...

です。

 

Step2

tron2txt.exe

a.txtを重ねるとa_txt.txtを出力します。

重ねるファイル名に.が複数個あると誤動作します。

 

a.txtのwaitをSMF(Standard MIDI File)の

wait形式に変換しヘッダーを付けます。

二進数で(16進では最大FFFFFFF)

aaaa bbbbbbbb cccccccc dddddddd

は、SMF形式では(16進では最大FFFFFF7F)

1aaaabbb 1bbbbbcc 1ccccccd 0ddddddd

1byteの最上位bitが1は続きがあり

0はそこで終わりという符号で、

1バイト7bitで数値を表します。

十進    16進         SMF16進

0   →  0 00 00 00 →    00

127 →  0 00 00 7F →    7F

128 →  0 00 00 80 → 81 00

255 →  0 00 00 FF → 81 7F

256 →  0 00 01 00 → 82 00

 

Step3

txt2mid.exe

a_txt.txtを重ねるとa_txt_txt.midを出力します。

重ねるファイル名に.が複数個あると誤動作します。

 

.txtは.midに、それ以外は.txtに変換します。

 

バイナリファイルを、16進数のダンプリストにして

テキストファイルに出力します。

 

4D,54,68,64,00,00,00,06,00,00,00,01,01,E0,4D,54,72 ; MThd・・・・・・・・・潼Tr

....

 

また、16進を,で区切った(;はコメント)テキストファイルを

バイナリーに変換できます。

(拡張子は.midになりますが、必要に応じて変更して下さい。)

 

 

N88-BASICで円と色塗り

  

下記リストをマウスで選択しCtrl+cでコピーし、

NL-BASICの画面でAlt+v(Ctrl+vではないので注意)

でプログラムを読込めます。

 

100 SCREEN 3

110 CLS 3

120 FOR R=16 TO 160 STEP 16

130   CIRCLE(320, 200), R, 6

140 NEXT

150 VIEW(0, 200)-(639, 399)

160 ROLL , -16

170 VIEW(0,   0)-(639, 399)

180 A$ = CHR$(&HFF)+CHR$(&H55)+CHR$(&H55)+CHR$(&HFF)+CHR$(&HAA)+CHR$(&HAA)

190 PAINT(320, 300), A$, 6

 

NL-BASIC最新版以外では不具合の為動きません

ので、下記よりダウンロードして下さい。

 

NL-BASICは、下記リンクよりダウンロードできます。

NL-BASIC(N88-BASIC互換?)ホームページへのリンク

Readme.txtを読んで、遊んで見て下さい。

  

プログラムの説明

 

SCREEN 3 (640×400 カラー2page)でVIEWをリセット

CLS 3 でテキスト(1)とグラフィック画面(2)の両方(1+2=3)消去

 

CIRCLE(320,200),R,Cで同心円を描き、

 

VIEW(0,200)-(639,399)で画面下半分のみ描画にし、

ROLL , -16で右に16dotずらし、

VIEW(0,0)-(639,399)で全画面描画にし、

 

PAINTで以下のパターンでタイルペイントしました。

 

    16進  2進

Blue  FF  11111111 1の位(この位が1なら1)

Red   55  01010101 2の位(この位が1なら2)

Green 55  01010101 4の位(この位が1なら4)

          17171717 … 合計

Blue  FF  11111111 1の位(この位が1なら1)

Red   AA  10101010 2の位(この位が1なら2)

Green AA  10101010 4の位(この位が1なら4)

          71717171 … 合計

(0:黒 1:青 2:赤 3:紫 4:緑 5:水色 6:黄 7:白)

よって、A$は、

青白青白...

白青白青...

...

というタイルパターンで塗りつぶします。

 

以下、NL-BASICマニュアルから抜粋

詳しくはマニュアルを見て下さい

多少違いはありますが、

PC-9801(N88-BASIC)のマニュアルの方が

より詳しいと思います。

 

CIRCLE(X,Y),R[,C][,a1][,a2][,e][,F][,B/T$]

半径RのC色の円を描く

a1~a2ラジアンの弧を描画(a1,a2 < 0で弦を描く)

楕円半径比a;b = 1:e 大きいほうがRになる

FならB色(タイルパターンT$)で塗りつぶす

 

VIEW(X1,Y1)-(X2,Y2)[,C][,B]

描画領域の指定、C色で塗潰し、B色の枠で描画領域の外を囲む

 

ROLL [H][,W][,N/Y]

VIEW内を上下H,左右Wドットスクロールする

H>0上,W>0左 空いた領域は、N又は省略は0、Yは消去色で埋める

 

 

 

 

勝手にリンクの紹介です(ゲーム保存協会)

 

N88-BASICのプログラムを探していたところ、

N-BASIC(Mini PC-8001)のページに行きつき、

そこから、さらにゲーム保存協会のページに

たどり着きました。

勝手にリンクを貼っておきます。

 

ゲーム保存協会

 

本格的な感じがします。

 

主に80年代のデジタルゲームを中心に保存と

書いてありますが、

BASICのお絵描きプログラムなども保存されて

いるのでしょうか