試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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を更新

  1. ソースはあるので実行ファイルは作成できる
  2. nesasmがアセンブル時にエラーを出す件について
  3. WineでWin32版のnesasmを使用すると...

ソースはあるので実行ファイルは作成できる

ppmcknesasmC言語で書かれていて、ソースは配布ファイルに含まれているため、ビルドはできる。
下は

という作業を行いつつビルドする例。

$ 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/ディレクトリにppmckcnesasmが得られ、scripts/mml2nsf.plからファイルを変換できる環境自体は整う。
scripts/mml2nsf.plは、MMLファイルの場所を指定するとppmckcによるMML->ASM変換*2nesasmによる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ファイルが出力されることが分かった。
なお、ppmckcWineでWin32版を動かすようにしてみたが、出力される中間ファイル(.asmファイル)は同じものな上、GNU/Linux上でビルドしたものでもエラーは出ないため、WineでWin32版を使う必要はない(使うこともできるが特にメリットはない)。

使用したバージョン:

*1:中間ファイルとして、NES向けのアセンブリコード(.asmファイル)を生成し、nesasmアセンブルを行って、機械語NSFファイルを生成する流れ

*2:ppmckcは実際にはアセンブリコードの一部となるヘッダファイルを生成しているだけで、スクリプトの支援により.asmファイルを完成させている