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

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

NSFファイル作成に用いるWAVE-DMC変換ツールをPythonに移植したもの(pydmcconv,pydmcconv-gtk)を作成・公開

NSFファイル作成に用いるWAVE-DMC 変換ツールDMC(DPCM)コンバータをWineの開発パッケージでビルドしてインストールするスクリプト」のDMC(DPCM)コンバータ(DMCconv.exe)のソースを見たところ、WindowsのMedia Control Interface(MCI)という高レベルAPIを用いており、Windowsの機能と密接であるかのように見えたのだが、よく見るとWAVEファイルに関する幾つかのフォーマット情報の取得とデータの読み込みを行っているだけなので、この機能を代替できればGNU/Linux向けに移植ができるのではないかと思い、探してみると、都合の良いことにPythonの標準のモジュールに「wave」というものがあることを発見した。
これとオプション解析のoptparseを用いて移植ができないか試してみたところ、最終的には動くものが作成できた。しかし、中の音量調整機能の部分において、計算の結果が一部微妙にオリジナル版と異なる値*1を出力する部分があり、音量調整に関するオプションが有効なときにオリジナル版とわずかに内容の異なるファイルを出力するようだ。しかし、音は正常に鳴り、出力されるDMCファイルやそれを用いたNSFファイルの品質に問題はない。また、-nオプションを付けて音量調整を無効化するとオリジナル版と全く同じデータを出力する。
今回の移植では、オリジナル版に近い使い方ができるCLI版(端末から用いる)とPyGTKによるGUI版とをそれぞれ作成し
http://kakurasan.ehoh.net/software/pydmcconv/
に公開した。オリジナル版のライセンスについては
[引用]ファイル名: DMCconv.txt より

配布や改変に関しては一切制限は設けませんので自由にやっちゃって下さい。コ汚いソー
スも付けときます。

となっており、移植版でもこれにならってCC0のもとで公開している。
なお、waveモジュールだけではWAVEファイルのフレームデータ部分の値に関する処理がうまく移植できず、arrayというモジュールを用いた。また、出力ファイル書き込み時のfputc()関数はstructというモジュールを用いて移植した。これらのモジュールの使用例としても使えるかもしれない。また、optparseモジュールの使い方も以前と少し変えており、その例としての意味もある。
動作についてはオリジナル版をWine上で一緒に使いながらある程度のテストは行ったが、まだ不具合が残っている可能性はある。
音の素材としてはHydrogenのドラムセット内にあるファイルをAudacityで開いてモノラル化(関連記事)し、それをWAVEファイルで書き出すと便利。ファイルはディストリのパッケージでは/usr/share/hydrogen/data/drumkits/[ドラムセット名]/などの下、一般ユーザがインストールしたドラムセットでは[ホームディレクトリ]/.hydrogen/data/drumkits/[ドラムセット名]/以下にある。

*1:数千という値に対して値が1だけ異なるものが一部存在するが、全く変わらないところもある