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

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

TiMidity++でサウンドフォントを使用するための設定ファイルを自動生成するツール(cfgforsf)について

TiMidity++と設定ファイル

TiMidity++は音源にサウンドフォントという形式の音色ファイルを使用することができるが、GUS/patchと同様、音源ファイルの指定・音色の割り当て・各種調整といった目的で、音を鳴らすために独自の設定ファイルを必要とする。
TiMidity++向けのGUS/patch音色セットの場合は設定ファイルが付属している場合がほとんどだが、サウンドフォントにはTiMidity++用設定ファイルが付属していることはほとんどなく、基本的には自前で用意することになる。
なお、
http://timidity.s11.xrea.com/
に設定ファイルが用意されているものもあるが、2004年の途中から更新されていないようだ。

設定ファイル自動生成ツールcfgforsf

調べてみると、Windows用の実行ファイルcfgforsf.exeというものが存在し、これがサウンドフォントに含まれる音色情報を読み込んでTiMidity++向けの設定ファイルを生成してくれるようだ。
このツール「Cfg For SoundFont」は青木氏のサイト(http://xm.at.infoseek.co.jp/timidity/index.html)から入手できる。
この中にソースはなかった*1が、TiMidity++のソースツリーからビルドできることが分かり、Wineを使う必要はないようだ。
[引用]ファイル名: cfgforsf004/readme.txt より

コンパイル方法
timidity/sndfont.c を見て、
CFG_FOR_SF マクロを指定して適当にコンパイルすればできます。

ビルド

具体的なビルド手順に関する情報はなく、ビルドのルールを記述したMakefile.amなどにもターゲットとして書かれていなかったため、色々試した結果、
[引用]ファイル名: TiMidity++-2.13.2/timidity/sndfont.c より

/*********************************************************************

    cfg for soundfont utility.

  demanded sources.
     common.c  controls.c  dumb_c.c  instrum.c  sbkconv.c  sffile.c
     sfitem.c  sndfont.c  tables.c  version.c
		 mt19937ar.c quantity.c smplfile.c
     utils/  libarc/
  additional sources (for -f option)
     filter.c  freq.c  resample.c

  MACRO
      CFG_FOR_SF

 *********************************************************************/

上記コメントをたよりにビルドすることに成功したが、コンパイルエラー対策として、ソースの(ほんの)一部に修正を加える必要があった。
パッチは
http://cid-3f9be5b1cd4a806c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/Gentoo%20Linux%20ebuild/media-sound/cfgforsf/files/timidity++-2.13.2-cfgforsf-src.patch.txt
に作成・アップロードした。
手動でコンパイル/リンクして実行ファイルを作成する場合は

$ tar jxf [TiMidity++-2.13.2.tar.bz2の場所]
$ cd TiMidity++-2.13.2/
$ patch -p1 < [timidity++-2.13.2-cfgforsf-src.patchの場所]
patching file interface/dumb_c.c
patching file timidity/sndfont.c
$ ./configure --disable-audio --without-x
$ for dir in libarc utils; do make -C ${dir}; done
$ cd timidity/
$ make newton_table.c
$ for f in common controls instrum sbkconv sffile sfitem sndfont tables version mt19937ar quantity smplfile filter freq resample ../interface/dumb_c; do gcc -DCFG_FOR_SF -DHAVE_CONFIG_H -I. -I../ -I../utils -I../libarc -c ${f}.c; done
$ gcc -o cfgforsf common.o controls.o instrum.o sbkconv.o sffile.o sfitem.o sndfont.o tables.o version.o mt19937ar.o quantity.o smplfile.o filter.o freq.o resample.o dumb_c.o -L../libarc -L../utils -lm -larc -lutils
$ sudo install -s cfgforsf /usr/local/bin/
$ cd ../../
$ rm TiMidity++-2.13.2/ -fr

のように、makeを使用する場合は
http://cid-3f9be5b1cd4a806c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/Gentoo%20Linux%20ebuild/media-sound/cfgforsf/files/timidity++-2.13.2-cfgforsf-automake.patch.txt
のパッチを用意して

$ tar jxf [TiMidity++-2.13.2.tar.bz2の場所]
$ cd TiMidity++-2.13.2/
$ patch -p1 < [timidity++-2.13.2-cfgforsf-src.patchの場所]
patching file interface/dumb_c.c
patching file timidity/sndfont.c
$ patch -p1 < [timidity++-2.13.2-cfgforsf-automake.patchの場所]
patching file timidity/Makefile.am
$ automake --add-missing &>/dev/null
$ ac_cv_lib_dl_dlopen=no ./configure --disable-audio --without-x
$ make -C timidity/ cfgforsf
$ sudo install -s cfgforsf /usr/local/bin/
$ cd ../../
$ rm TiMidity++-2.13.2/ -fr

のようにしてインストールする。追加したautomake用ターゲット定義は、インストールされるものとしては定義していないため、ビルド完了後に手動でコピーしてインストールする。インストール先は好みで変更(${HOME}/bin/など)。
Gentoo Linux向けのebuild
http://cid-3f9be5b1cd4a806c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/Gentoo%20Linux%20ebuild/media-sound/cfgforsf/cfgforsf-2.13.2.ebuild.txt
に作成・アップロードした。あらかじめ、先ほどの2つのパッチをfilesディレクトリに入れてから

$ sudo ebuild [ローカルOverlay]/media-sound/cfgforsf/cfgforsf-[バージョン].ebuild digest

を実行し、emergeでインストールする。
(2008/12/1)Mandriva Linux向けにRPMパッケージを作成し、公開した。

使い方

サウンドフォントの場所を引数に指定する。

$ cfgforsf ( [オプション] ) [sf2ファイル] ( [出力ファイル] )

出力ファイルを省略すると標準出力に書き出される。

$ cfgforsf ( [オプション] ) [sf2ファイル] ( | [フィルタコマンドなど] ) > [出力ファイル]
$ cfgforsf ( [オプション] ) [sf2ファイル] | less

書き出される設定ファイルは、ディレクトリ指定部分(dir [サウンドフォント/設定ファイルのディレクトリ])などを除いて、そのまま使用できる状態になっている。
オプションとしては

  Options:
    -s: sort by bank/program. (default)
    -S or -s-: do not sort by bank/program.
    -c: output comment. (default)
    -C or -c-: do not output comment.
    -f drumset note: calculate sample frequency.
    -F drumset note: do not calculate sample frequency. (default = -F - -)

となっているが、-Cオプションを付けないとコメントだらけになる点には注意。
気に入らない部分があれば
http://timidity.s11.xrea.com/files/doc-cfgj.htm
などを参考にチューニングを行っていくこともできるし、複数のサウンドフォントを組み合わせる際に、自動生成した設定を元にいじっていくこともできる。
(2009/3/10)「cfgforsfをドラッグ・アンド・ドロップで使用するためのGUIフロントエンドを作成」で、GUIファイルマネージャからドラッグ・アンド・ドロップすることで簡単に使用できるようなツールを作成した。

関連記事:

*1:中にGPL2とLGPL2.1の文書が入っていたため、ソースが入手できるはず