改良版 TiMidity メモ
知っておくと役に立つかもしれない点を記述します.
TiMidity を利用する人へ
- ネットワーク上に落っこちている skin データを利用してしまう技:
bash$ timidity_skin=http://〜.zip timidity -ii 〜.mid
tcsh> env timidity_skin=http://〜.zip timidity -ii 〜.mid
- 最大同時発音数を越えるときは,
1. NoteON 状態以外 voice の中で,最も音量の小さなもの.
2. 全ての voice の中で最も音量の小さなもの.
3. 全て NoteON 状態で音量も同じ場合は,
内部の voice リストの最初の voice.
の順でどれかの voice が削除され,新しい voice と入れ替わります.
- バンク 0 を バンク 127 で置き換えて演奏する技:
timidity -x'bank 0\n#extension copybank 127' file.mid
- URL http://〜 で WWW サーバ上の MIDI ファイルを演奏するとき,WWW サーバには
「TiMidity-バージョン番号」という User-Agent が報告されます.User-Agent の
ログをとっている WWW サーバは稀ですが,もしそのようなサーバがあったら
TiMidity HTTP クライアントの存在を教えてあげましょう.
- ローカルのアーカイブファイルはもちろん,HTTP や FTP のアーカイブファイルも
演奏できます.
- tar + gzip (*.tar.gz, *.tgz) ファイルの読み込みはメモリと時間を浪費
します.個々のファイルに分割するために,一旦解凍し,圧縮しなおして
メモリに蓄えるからです.
現在 TiMidity がサポートしている圧縮アーカイブファイルの中では
zip (*.zip) ファイルがもっとも効率的です.
- アーカイブファイルは,拡張子により形式が判断されます.拡張子が妥当でない
場合はアーカイブファイルと認識されません.
- 私が普段使っているオプション&設定 (in ~/.timidity.cfg)
#extension opt -p128
#extension opt -bb
#extension opt -iNv
#extension opt -Ecr
#extension opt -r
#extension opt -F
bank 0
#extension timeout 0 5
#extension timeout 1 5
#extension timeout 9 5
#extension timeout 46 5
#extension timeout 98 5
bank 8
#extension timeout 0 5
#extension timeout 1 5
改良版 TiMidity 用の ump.so のための設定 (in ~/.bashrc)
export TIMID_INTERFACE=kv
export TIMID_RATE=32000
ダイナミックリンクインターフェース:N, n, k, m, s
通常のインターフェース:d, a, T, e
- カレントディレクトリとサブディレクトリにある
MIDI ファイルを全て演奏する技:
timidity `ls -F`
- 多数の MIDI ファイルを演奏する場合は -U オプションを用いて,1 曲毎に
パッチを free したほうがいいみたい.そうしないと TiMidity がマシンのメモリ
をいっぱい食ってしまう.
- ビブラート,モジュレーション,ピッチベンドなどのピッチの変化する Note は
演奏前のリサンプルキャッシュは働きません.
- -EV オプションを用いてビブラート (NRPN:MSB=1,LSB=8,9,10) を無効にすると,
演奏前のリサンプルのキャッシュの効果が良くなります.
ただし,音の質が下がります.
- -Ec オプションでコーラスを有効にしておくのはいいですよ.またコーラスが
用いられていない MIDI ファイルの場合は -Ec64 として,全チャネルにコーラスを
かけて演奏するのもいいです.
- コーラスのかかった Note は 2 倍の発音数になります.
- N インターフェースでは 't' キーを押すことでトレースモードと
非トレースモードを演奏時に切り替えることができます.ただし,
非トレースモードからトレースモードへ移るときは,一瞬音が途切れます.
これは仕様です.
- N インターフェースのトレースモードでは '%' キーを押すことで n
インターフェースの表示方式に切り替わります.
- N インターフェースでは 'E' キーを押すことによって,起動時オプションの -E
のモードを変更することができます.
- TiMidity の限界 (ほとんどは設定で変更できます):
- MIDI イベントは 2097150 個まで.
- サンプル数は 2147483647 まで.
- 32 チャネルまで演奏できる(設定により最大 256 チャネルまで増やせる).
- トレース表示は 16 チャネルまで.
- MIDI テキスイベント (歌詞など) は 32766 個まで.
- ファイル名の長さは 1023 文字まで.
- N インターフェースのトレースモードでは 8191 文字まで安全に表示
できるが,一部の環境を除いてこの制限を越えるとバグる.
- 音源パッチの最大サンプルサイズは 4M bytes.
- 再生レートは 4 kHz 〜 65 kHz.
- N インターフェースのコマンド入力欄に入力できる文字数は
1024-(プロンプト長) 文字まで.
- N インターフェースで処理できるファイル数は
512×(画面の行数 - 7) 個まで.
- サウンドスペクトログラムの表示域は 15Hz 以上.
- サウンドスペクトログラムの分解能は,再生レート/512.
- 最大同時発音数は 256 まで.
- 同一音は 256 重まで.
TiMidity をコンパイル/移植/改良するひとへ
- -DAUDIO_FILLING_MILSEC=5000 オプションを付けてコンパイルすると
音飛びが多少解消されます。
- お金のない人や Motif のない環境では,
LessTif というフリーな Motif
ソースコード互換なライブラリを用いれば,Motif
インターフェースが利用できます。
- PlayMode がオリジナルと少し異なっていますので,出力音源デバイスに
関するコードを記述するとき,以下の点を注意してください.
- 変更点
flush_output() の返り値が変りました.
current_samples() と play_loop() が追加されました.
play_event() が追加されました。
- flush_output()
オリジナルの返り値は void ですが,改良版では int です.その返り値は
flush_output() 内で発生したコントロールイベントです.何もイベントが
ない場合は RC_NONE を返します.なお,flush_output() は音がなりやむまで
ブロックする使用になっています.ブロックしない場合,
トレース時の演奏と表示の同期がずれる可能性があります.
current_samples() をサポートしていない場合は,トレース時の演奏と表示
の同期を取らないため,flush_output() でブロックする必要性はありません.
- current_samples()
現在,演奏中のサンプル数を返します.これは,トレース時の演奏と表示の
同期を取るために用いられます.サポートしていない場合は -1 を
返してください.current_samples() が返すサンプル数は,以下の関数
が呼ばれた時点で 0 に初期化されます.
open_output(), close_output(), flush_output(), purge_output()
- play_loop()
幾つかの play_mode の output_data() では,実際の音源デバイスにデータ
を書き込まずに,メモリにコピーするだけになっています.このメモリに
コピーされたデータを実際の音源デバイスに書き込む命令が play_loop()
です.全て書き込みが終了した場合は 0 を,まだ書き込むべきデータが
残っている場合は 1 を返します.
- int play_event(MidiEvent *)
引数にはこれから変換されるべき TiMidity の内部 MIDI コードが
渡されます。
- ControlMode がオリジナルとだいぶ異なっていますので,
ユーザインターフェースの作成には,以下の点を注意してください.
以下のメンバ関数が event(CelEvent *e) 関数に取って変わりました。
refresh(), reset(), total_time(), current_time(), note(), master_volume()
program(), volume(), expression(), panning(), sustain(), pitch_bend()
- config.h: FLOAT_T は float/double のどちらを用いてもいい場合に
用いられます.コード中では,double を用いるべき箇所では
double,float を用いるべき箇所では float と明示的に用いていますので,
どちらを定義しても問題はありません.
マシンによっては double より float の方が高速な場合が
あります.そのようなマシンでは,FLOAT_T を float に定義して
コンパイルしてください.
戻る