GNU/Linux上におけるppmckの覚え書き(2009/9/7現在)
(2010/2/2)その後のバージョン9aでビルドは簡単に行えるようになっており、更に大変ありがたいことにnesasmの落ちる問題も修正されているため、この記事は古い内容となる。「GNU/Linux上におけるppmckについてのその後(2010/2/2現在)」も参照。
以下、以前の内容となる。
ppmck(ppmck.web.fc2.com/ppmck.html)は、NSF形式(NES/ファミリーコンピュータ向けの機械語による曲データ形式)のデータの作成を支援するツールで、MagicKit(www.magicengine.com/mkit/)というツール群に含まれるアセンブラnesasmと組み合わせて使用する*1ことで、テキスト(MMLファイル)によるデータをNSF形式へ変換することができる。
ここでは、GNU/Linux上でこのツールを使用する上での手順や注意点を扱う。
(2014/12/25)ppmckのURLを更新
ソースはあるので実行ファイルは作成できる
ppmckもnesasmもC言語で書かれていて、ソースは配布ファイルに含まれているため、ビルドはできる。下は
- ビルド時のルールを記述したMakefileを一部GNU/Linux向けに修正
- 日本語のメッセージをCP932(WindowsのShift_JIS)からUTF-8へ変換
- 変換支援PerlスクリプトをGNU/Linux向けに修正
という作業を行いつつビルドする例。
$ mkdir work; cd work/ $ wget takamatsu.cool.ne.jp/dutycycle/ppmck/ppmck09.zip $ unzip ppmck09.zip $ cd mck/src/ppmckc/ $ for f in *.c; do mv ${f}{,.sjis}; iconv -f cp932 -t utf8 ${f}.sjis >| ${f}; done; unset f $ cd - $ sed -i -e 's:\.\.\\:../:g' -e 's:bin\\:bin/:' mck/src/nesasm/Makefile.unx $ sed -i 's:\.exe::' mck/src/ppmckc/Makefile $ make -C mck/src/nesasm -f Makefile.unx $ make -C mck/src/ppmckc $ sed -i -e 's:\r::' -e 's:\.exe::' mck/scripts/mml2nsf.pl $ cd mck/
これを行うことでmck/bin/ディレクトリにppmckcとnesasmが得られ、scripts/mml2nsf.plからファイルを変換できる環境自体は整う。
scripts/mml2nsf.plは、MMLファイルの場所を指定するとppmckcによるMML->ASM変換*2とnesasmによるASM->NSF変換を続けて行ってくれるスクリプトなので、実際の変換時にはこれを使用する。
2009/9/7の時点では、これよりも新しい「9 ex4」というバージョンも存在し、リンクが
wikiwiki.jp/mck/?%CA%E4%BD%F5%A5%C4%A1%BC%A5%EB
にあるので、代わりにダウンロードしてもよいが、バージョン9のファイルに含まれるファイルが一部抜けているので注意。
nesasmがアセンブル時にエラーを出す件について
ppmck.web.fc2.com/installppmck.htmlにあるサンプルMMLeine.mmlを用意して変換を試してみたところ
$ perl -w scripts/mml2nsf.pl [eine.mmlの場所] MML to MCK Data Converter Ver 0.27 by Manbow-J pmck modification by BKC rel 0.2 patches FDS enable patch([OK]), 4-46, 4-356, 5-17, 5-95, 5-313, 5-658 ppmck release 9 by h7 eine.mml -> songdata.h -------+---------------+---------------+ Track | Total | Loop | Symbol|(count)|(frame)|(count)|(frame)| -------+-------+-------+-------+-------+ A | 768 320| | B | | | C | 768 320| | D | | | E | | | -------+-------+-------+-------+-------+ 終了しました NES Assembler (v2.51) pass 1 pass 2 #[2] ppmck/sounddrv.h 844 00:8313 beq freq_add_mcknumber_with_asl_arithmetic_shift ;always Undefined symbol in operand field! 844 00:8313 beq freq_add_mcknumber_with_asl_arithmetic_shift ;always Branch address out of range! 856 00:8321 freq_add_mcknumber_with_asl_arithmetic_shift: Internal error[1]! # 3 error(s) *** glibc detected *** [展開ディレクトリ]/mck/bin/nesasm: corrupted double-linked list: 0x0000000001d8a4d0 *** ======= Backtrace: ========= /lib64/libc.so.6[0x7feaa06baf38] /lib64/libc.so.6[0x7feaa06bd028] /lib64/libc.so.6(cfree+0x76)[0x7feaa06bd256] /lib64/libc.so.6(fclose+0x151)[0x7feaa06abad1] [展開ディレクトリ]/mck/bin/nesasm[0x401c14] /lib64/libc.so.6(__libc_start_main+0xe6)[0x7feaa0665316] [展開ディレクトリ]/mck/bin/nesasm[0x400ec9] ======= Memory map: ======== 00400000-00410000 r-xp 00000000 00:10 2806220 [展開ディレクトリ]/mck/bin/nesasm 00610000-00613000 rw-p 00010000 00:10 2806220 [展開ディレクトリ]/mck/bin/nesasm 00613000-00829000 rw-p 00613000 00:00 0 01d81000-01da2000 rw-p 01d81000 00:00 0 [heap] 7fea9c000000-7fea9c021000 rw-p 7fea9c000000 00:00 0 7fea9c021000-7feaa0000000 ---p 7fea9c021000 00:00 0 7feaa0431000-7feaa0447000 r-xp 00000000 08:06 368685 /lib64/libgcc_s-4.3.2.so.1 7feaa0447000-7feaa0646000 ---p 00016000 08:06 368685 /lib64/libgcc_s-4.3.2.so.1 7feaa0646000-7feaa0647000 rw-p 00015000 08:06 368685 /lib64/libgcc_s-4.3.2.so.1 7feaa0647000-7feaa079f000 r-xp 00000000 08:06 368648 /lib64/libc-2.8.so 7feaa079f000-7feaa099e000 ---p 00158000 08:06 368648 /lib64/libc-2.8.so 7feaa099e000-7feaa09a2000 r--p 00157000 08:06 368648 /lib64/libc-2.8.so 7feaa09a2000-7feaa09a3000 rw-p 0015b000 08:06 368648 /lib64/libc-2.8.so 7feaa09a3000-7feaa09a8000 rw-p 7feaa09a3000 00:00 0 7feaa09a8000-7feaa09c3000 r-xp 00000000 08:06 372677 /lib64/ld-2.8.so 7feaa0b9c000-7feaa0b9e000 rw-p 7feaa0b9c000 00:00 0 7feaa0bbe000-7feaa0bc2000 rw-p 7feaa0bbe000 00:00 0 7feaa0bc2000-7feaa0bc3000 r--p 0001a000 08:06 372677 /lib64/ld-2.8.so 7feaa0bc3000-7feaa0bc4000 rw-p 0001b000 08:06 372677 /lib64/ld-2.8.so 7fffa8bad000-7fffa8bc3000 rw-p 7ffffffe9000 00:00 0 [stack] 7fffa8bfd000-7fffa8bfe000 r-xp 7fffa8bfd000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] そのようなファイルやディレクトリはありません at scripts/mml2nsf.pl line 85.
のようになり、正常に終了しなかった。中間ファイル(.asmファイル)が出来ていることや表示されたメッセージから
- ppmckcは正常に終了
- nesasmが内部エラーを起こした上で落ちている?
ということが分かるものの、nesasmのエラーに関しては対処の仕方が分からない。
MagicKitの配布ファイルに付属したGNU/Linux向け実行ファイル(BIN/NESASM)で置き換えてもみたが、結果は変わらなかった。
また、ex4のバージョンも使用してみたが、結果は同様となった。
(2014/12/25)ppmckサンプルのあるページのURLを更新
WineでWin32版のnesasmを使用すると...
ppmckの配布ファイルにはWin32向けの実行ファイルが含まれているため、試しにこれをWineで実行するようにスクリプトを修正してみた。下は、配布されている状態のmml2nsf.plに対して行う修正例(上で書いている一連の流れの中で行っている修正(下から2行目)を行う代わりに実行する点に注意)。
$ sed -i -e 's:\r::' -e 's:\(ppmckc\).exe:\1:' -e 's:\(\\"$nesasm\\\):wine \1:' mck/scripts/mml2nsf.pl
これで試したところ、nesasmの出力は
NES Assembler (v2.51) pass 1 pass 2 segment usage: ZP $0000-$001A [ 27] BSS $0200-$02C9 [ 202] BANK 0 2430/5762 ---- ---- 3K 5K
となり、正常にNSFファイルが出力されることが分かった。
なお、ppmckcもWineでWin32版を動かすようにしてみたが、出力される中間ファイル(.asmファイル)は同じものな上、GNU/Linux上でビルドしたものでもエラーは出ないため、WineでWin32版を使う必要はない(使うこともできるが特にメリットはない)。
使用したバージョン: