Zaurus

てのひらコンポーザーへの道 其の壱(nsf編)

LinuxZaurusにはAC97という規格に準拠した音源が標準で搭載されてます。折角普通のデスクトップ機と同程度の音源が載ってるのにこいつで遊ばないわけにはいかないという事で、いじれる環境を作ってみました。

今回使用するのは以下。

何故nsfかってのは謎です(笑)

詳しい使い方などはリンク先を参照してもらうとして、とりあえあずは環境を作ってしまいます。
カレントにダウンしてきたアーカイブ、その下に各ファイルを展開する先を作って、最終的に使っていくのはmckのディレクトリ…って感じになります。

$ ls
mck/
mckc/
mkit/
mck_0228.zip
mckc027.zip
mkit251_linux.zip
$

mkit(nesasm)のmake

$ mkdir mkit; cd mkit
$ unzip ../mkit251_linux.zip
$ cd SRC/AS
解凍して出来たファイルがすべて大文字になっているので小文字に変換します。今回は以下のスクリプトを組んで実行しました。ファイル名は適当に2low.shとかで。
#!/bin/sh
for fname in $*
do
    cname=`echo $fname | tr '[A-Z]' '[a-z]'`
    if [ "$fname" != "$cname" ] ; then
        mv $fname $cname
    else
        continue
    fi
done                                                                    
作成したスクリプトに実行権限を与えて実行。
$ chmod +x 2low.sh
$ ./2low.sh *
全部のファイルが小文字に変換されたところでmakefile.unxを編集します。バイナリが出来るディレクトリがカレントになるようにします。binディレクトリはBINとして作成されてるのでmakefile.unx中のbinを大文字にしてもOKですが。
で、あとはmakeするだけです。
$ vi makefile.unx

13: EXEDIR   = ../../bin
↓
13: EXEDIR   = .

$ make -f makefile.unx
途中でワーニングが2カ所ほど出ますが、まぁ問題ないでしょう。 カレントディレクトリにnesasmという名前でファイルが出来ているはずです。いちお、確認。
$ ./nesasm
NES Assembler (v2.51)

nesasm [-options] [-? (for help)] infile

-s/S   : show segment usage
-l #   : listing file output level (0-3)
-m     : force macro expansion in listing
-raw   : prevent adding a ROM header
-srec  : create a Motorola S-record file
infile : file to be assembled
$

mckcのmake

$ mkdir mckc; cd mckc
$ unzip ../mckc027.zip
$ cd souce
mckc.cdatamake.c(コメントもあるので全ファイルやった方が良いかも)の文字コード変換に以下のスクリプト(2euc.sh)を使用します。オリジナルのファイルは *.sjisとして保存されてます。要らなければ消しちゃっても良いです。分かる人は手作業のほうが早いでしょうね。
#!/bin/sh
for fname in $*
do
    nkf -e -Lu ${fname} > ${fname}.euc
    mv ${fname} ${fname}.sjis
    mv ${fname}.euc ${fname}
done
mkitの時と同様に実行権限を与えて実行します。
$ chmod +x 2euc.sh
$ ./2euc.sh *
datemake.cをwarningが出ないように修正。diffは以下。
1954c1954
<               fprintf( fp, "\tdb\t$00,$00,$00,$00\n", freq, 0, adr, size );
---
>               fprintf( fp, "\tdb\t$00,$00,$00,$00\n" );   /* CHANGE */
2925a2926
>   len = 0;    /* CHANGE */
3061c3062
< putAsm( FILE *fp, int data )
---
> void putAsm( FILE *fp, int data ) /* CHANGE */
3259c3260
<               env = cmd->param[0]&0x3f|0xc0;
---
>               env = (cmd->param[0]&0x3f)|0xc0;    /* CHANGE */
3272c3273
<               rel_env = cmd->param[0]&0x3f|0xc0;
---
>               rel_env = (cmd->param[0]&0x3f)|0xc0;    /* CHANGE */ 
中身は変数の初期化だとか演算の優先度だとか関数の返り値だとかなんで、修正しなくてもまぁ問題ないと言えば問題ないはずです。
Makefileは適当にこんな感じで。
CC      = gcc
TARGET  = mckc
OBJS    = mckc.o datamake.o freq.o file.o strings.o
CFLAGS  = -O2 -Wall -Wno-unused -fsigned-char

$(TARGET): $(OBJS)
	$(CC) -o $@ $(OBJS) -lm

.c.o:
	$(CC) -c $< $(CFLAGS)

clean:
	rm -f *.o $(TARGET)

mckc.o: Makefile mckc.h mckc.c
datamake.o: Makefile  mckc.h datamake.c
freq.o: Makefile  mckc.h freq.c
file.o: Makefile  mckc.h file.c
strings.o: Makefile  mckc.h strings.c
んで、makeします。
$ make
nesasmと同様にカレントにmckcのバイナリができてるはずです。
$ ./mckc
MML to MCK Data Converter Ver 0.27 by Manbow-J
使用方法:mckc [switch] <Input File[.MUS]> [<Output File[.h]>]
        [switch]
        -h -?   : ヘルプを表示
        -i      : 音色/エンベロープファイルに曲データを追加する
        -m<num> : エラー/ワーニング表示の選択(0:Jp 1:En)
        -n      : 音色/エンベロープファイルを出力しない
        -o<str> : 音色/エンベロープファイルのファイル名を<str>にする
        -w      : Warningメッセージを表示しません

$

mckの解凍

$ mkdir mck; cd mck
$ unzip ../mck_0228.zip
コンパイル用のバッチファイル(*.bat)はDOS用に出来てるのでこれをLinux用に書き換えます。まぁ、単純なコマンドだけなので対比は簡単ですね。あと改行コードもDOS用で動作に不具合がでるっぽいのでこれも変更します。
$ nkf -e -Lu make_nsf.bat > make_nes
$ chmod +x make_nes
$ vi make_nes

1: del nesmusic.nsf
2: nesasm -raw make_nsf.txt >error.txt
3: ren make_nsf.nes nesmusic.nsf
	
1: #!/bin/sh
2: rm nesmusic.nsf
3: ./nesasm -raw make_nsf.txt >error.txt
4: mv make_nsf.nes nesmusic.nsf

環境の統合
こうしてできたnesasmmckcを解凍したmckのディレクトリにコピーすればこれでnsfの簡単な作成環境の完成です。
mkit、mckcディレクトリはざっくり消しちゃいましょう。

$ rm -rf mkit/ mckc/
$ ./mckc -i songdata.mml
$ ./make_nsf
で、上のようにmmlを記述したファイルを指定してスクリプトを実行すればnesmusic.nsfってファイルが出来あがります。この辺はスクリプトを一本化しても良いですね。

聴いてみる

プレーヤーはここから nsfplayをダウンしてきて解凍し、PATHの通ったところ(/home/QtPalmtop/binとか?)に置けばOK。あとの使い方はREADME読んで(笑)

僕自身もfestalonを移植していたのですが、重すぎてどうにもならない状態で一月半ほど放置してました^^; 結局これを書き上げるのも放置状態だったということで、偶然にもプレーヤが見つかってよかったです。はい。
まぁ、ARMのアセンブラも触れられたし、grpofの使い方も覚えたしで無駄にはならなかったみたいですが…。
mdx、nsf…次はSPC Player欲しいな(^^;)

データはこの辺がアツイです。アーカイブ一式にソースも入ってたりするので出来上がった環境でコンパイルして鳴らしてみてください。

nesasmmckcのバイナリはそのうちに。

2003/07/27追記
mckkit-1.0を公開しました。nsfサウンドがLinuxZaurusで弄れます。
tarballで固めてあります。分からなかったら掲示板のほうへどうぞ。

2003/07/31更新
mckとmckcへのリンク先が間違ってたので修正しました(古いURLですよね?)^^; たびたびスイマセン。

2003/09/06更新
軽いプレッシャーを受けたんで昨日の帰りの電車の中でコンパイルしました(笑)
mckkit-1.1を公開。mckcをv0.26に入れ替えてあります。
あとmckcのリンク先を変更。

2003/09/11更新
mckkit-1.2を公開。mckcをv0.27に入れ替えてました。

2004/04/04更新
mckkit-1.3を公開。いろいろパッチを適用。READMEz.txt見てください


2003/07/24