凝った作業

危険な設定もあるので、トラブル時の対応に自信がない人はむやみに真似をしないこと。


ソフトの手書き設定

Audacityは(多分バージョン1.3xから)~/Application Data/Audacity以下に設定ファイルを置くようになった。audacity.cfgでほとんどの設定が可能。プロジェクトファイルもXMLなので手書き編集可能。

REAPERは「Human readable and editable project file format」がウリらしいが、プロジェクトファイルだけでなく設定ファイルもHuman readable and editableである。ファイルは~/Application Data/REAPER/以下にあり、だいたいの設定はREAPER.iniで行う。

上記以外に、SynthFont、Topten Software(Cantabileのメーカー)、Yellow Tools(Independenceのメーカー)、Cycle of 5th(SoundEngineのメーカー)などが~/Application Data/以下にテキスト形式でデータを保存する。Xlutop(Chainerのメーカー)もデータは置くがテキスト形式ではない。

ソフトをインストールしたフォルダに設定ファイルを置くソフトもある。Wavosaurはwavosaur.iniとwavosaur.cfgができる。MIDIによるリモートコントロールはwavosaur.cfgの最後で設定する。Dominoの設定はIniFilesフォルダ内のiniファイルで行う。VSTHostはDataフォルダ(変更可能:アスキーテキストとバイナリデータが入り混じっているが、手書きで編集できなくはない)。

当然ながら、Timidity++なども設定ファイルはテキスト形式である。編集用ソフトではないが、LilithやKbmplayもソフトをインストールしたフォルダにテキスト形式の設定ファイルを持っている。

ここまで挙げたうち、REAPERはデフォルトのWaveファイル保存先が、Lilithはショートカットの設定が、強制終了時にリセットされてしまう(多分、初心者がハマらないように気を使っているのだと思う)。とくにLilithのショートカット設定は消えると面倒なので、バックアップをとっておいた方がよいだろう。


fxp/fxbファイルは手書きできるか

やろうと思えば不可能ではないが、フォーマットの規制が緩いようなので、プラグインごとに書式を把握しなくてはならない。

fxpとfxbはともにチャンク形式を取っており、CcnK+空白(0x00)4バイト+チャンク名+空白3バイト+0x01の16バイトでチャンクを宣言するようである。fxpはCcnK+空白4バイト+FxCk+空白3バイト+0x01に続いてデータが入る形、fsbはCcnK+空白4バイト+FxBk+空白3バイト+0x01に続いてデータが入り、以後プリセットプログラムごとにfxpと同形式のデータが続く(上記いづれも実際のファイルから推測したもので、正式な仕様書に基づく情報ではない)。


VSTのパラメータ解像度

VSTプラグインのパラメータは、Audacityならほぼ無制限の小数(小数点以下第260位までは入力可能なことを確認している:Nyquistプラグインは32bitの浮動小数点数で数値を扱うので、似たような処理だと思う)、Wavosaurなら0.01などの単位で調整できるが内部的には128段階や256段階程度の解像度しか持たないものもある。また、MIDIのコントロールチェンジイベントでは128段階までしか分解できない。

表示の仕方もマチマチで、内部の表示をそのまま出していると思しきものもあれば入力値から単純計算したと思われる値を出している(内部的には整数で扱っていても表示が小数になるなど)ものもある。

非常に細かい数値をムキになってイジっても、VSTホストとプラグインとの兼ね合いで無視されてしまうことが多いので、あまり気にしない方がよい。


サウンドドライバの概要

それほど重大な問題ではないのだが、まとまった情報が少ないようなので。サウンドドライバの品質で話題になるのはレイテンシの大きさくらいなので、バッファの仕様を中心に実験したが、数ミリ秒のレイテンシを気にしても実利はない(たとえば、アコギを弾くとき耳から弦までの距離が68cmあればそれだけで2msくらい、アコピを弾くときに耳から弦までが1.7mならそれだけで5msくらい音が遅れる:音速=340m/sで計算)ということはしっかり念頭においてほしい(というか、そんなオーダーの遅延がもし本当に問題になるのなら、USB接続の外付けサウンドカードなんて使っていられないはずである)。

簡単な算数ではあるが、48KHzサンプリングなら480サンプル、44.1KHzサンプリングなら441サンプルのデータが10ms分に相当する。ただし、レイテンシやジッタの問題はサウンドドライバのバッファ量だけで計れるものではなく、たとえばMIDIキーボードからソフトウェアシンセを使うような場合、MIDIキーボードの出力、MIDI信号伝達路、パソコンの割り込み処理、シンセ自身のバッファなどを総合的に考えないと意味がない(オーディオドライバの設定は、あくまでオーディオドライバがデータを受け取ってから出力するまでの区間にしか影響しない:たとえば、オーディオドライバ以外の部分で30msくらいレイテンシがある場合に、オーディオドライバのバッファを10ms相当から5ms相当に削ってもあまり意味がない)。

ちなみに、MIDI信号伝達路でのレイテンシに関連してまれにワルモノ扱いされる光学カプラ(フォトカプラ)の応答時間は、数十nsからせいぜい1μsくらいのオーダーで、レイテンシの主原因ではないどころかUSB2.0ハイスピードモードのマイクロフレーム(125μs)よりもはるかに小さい(MIDIのレイテンシについてはArt & Science Laboratoryというサイトに非常に詳細な調査結果が掲載されている)。録音再生系では、ADコンバータとDAコンバータがそれぞれ、1fs=96KHzのシグマデルタ式で0.5msくらい(入出力の合算で1msくらい)かけるものが多いようだ(変換を行うICの仕様書や、親切なメーカーなら製品カタログにも書いてある)。

パソコンの割り込みには、DPC(=Deferred Procedure Call=遅延プロシージャ呼び出し)のレイテンシが関与する。筆者はあまり理解できていないのだが、どうやら、IRQ(=Interrupt ReQuest=割り込み要求)発生>ISR(Interrupt Service Routine=割り込みサービスルーチン=割り込みハンドラ)が対応>手間がかかる処理ならDPCルーチン起動>優先度にしたがってDPCのキューをコールバック処理、という手順になっているらしい。ようするに、パソコンに面倒な仕事(音声の再生とか)を「今すぐやってくれ」と頼んだらどのくらいの時間で反応してくれるか、という値である(多分)。普通に動いているシステムなら、数十μsから数msくらいのオーダーだろう。ThesyconDPC Latency Checkerというソフトで測定できる(このソフトの表示に従うと、1ms未満が望ましいようだ:少なくともDPCのレイテンシより大きくバッファを取らないと、知覚できるかどうかは別として、ドロップアウトを回避できないはず)。

ハードウェアの製品紹介記事などに低負荷時の必要バッファ数だけを取り上げたものがあるが、併用するアプリケーションによって5倍や10倍は簡単に変わるため、その数字だけ論ってもほとんど無意味である。なお、普通の設定なら、サウンドドライバの種類は音質に影響を与えない(しいていえばリスナーの「気分」が変わるだけ:オーディオの重箱の隅のページでも少し触れている)。

最後に、これは憶測でしかないが、バッファをギリギリまで切り詰めた場合の挙動はサウンドカードによって異なると思われる。USB2.0ハイスピードモードやFireWireのフレームは125μs(48KHzサンプリングだと6サンプル相当)だが、ぶっちゃけこのレベルで少々ドロップアウトが起きても補間(線形補間あたりで十分だと思う)が効いていれば気付かない人の方が多いのではないか(試しに手元にあった音声ファイル数種類をAudacityのドローツールでイジってみたが、線形補間風に処理すれば6サンプルくらいのドロップアウトはまるで知覚できなかった:たまたまインパルス的な波形が潰れれば誰でもわかると思うが、普通に録音している限り可能性は高くなさそう)。レイテンシはモロに数字で現れる性能のひとつなので、音質劣化を目立たない範囲に留めつつレイテンシを削る工夫がなにかしらなされていても不思議ではない。


サウンドドライバの比較

追記:後から知ったのだが、ASIO4ALLでマルチデバイスを有効にすると、デバイス数に応じて処理が重くなることがあるらしい(参考にした報告がこれなのだが、重くなった原因に(ASIO4ALLと無関係な)USBの渋滞がどれだけ関与しているのか不明)。以下の実験は、たしかオンボードサウンドとSound Blasterを両方有効にして行ったはずなので、もしかするとASIO4ALLにやや不利な数字になっているかもしれない。

ASIO4ALLVersion 2.8 (final)、REAPER0.999、Sound Blaster Audigy LSのWindows2000用ドライバを使って実験をした。ソフトの概要についてはソフト紹介のページのオマケを参照。Pentium3互換のCeleron1.2GHzと512MBのメモリを搭載したマシンを使い、ステレオのラインインにギター(左チャンネル)とマイク(右チャンネル)をつないで48KHz/24bit/2ch出力した。

ASIO4ALL(v2.8):
REAPERではバッファサイズ128sampleで安定動作した。112sampleでも動かないことはないがたまにジッタが出る。ステレオ入力でもモノラル入力でも変化なし。なぜか、ASIO4ALLの設定画面にあるSound Blaster Audigy LS用の設定は無視され、AC97互換オンボードサウンド用の設定のみが使われる(両方同じ値にすれば確実)。REAPER起動中にa4apanel.EXEから設定を変更しても反映されない模様(REAPERからASIO Configurationボタンでパネルを開けば反映される:v2.9ではタスクトレイからも操作可能)。ちなみに、VSTHost1.44(256sampleのバッファだとややジッタが出る)は自前で保存した設定を強制するようだ(REAPERと違って、a4apanel.EXEでの設定は一切無視される:v2.9での動作は不明)。Wavosaur(512sampleくらいバッファを用意しないと安定動作しない)はa4apanel.EXEで設定した値を使う模様。アプリケーションによって必要なバッファ量がかなり変わることがわかる。

DirectSound:
合計5000sampleくらい取らないと安定しない。REAPERの設定画面は掛け算方式の表示になっているが、これはおそらくサブバッファの本数を示しているのだと思う(詳しくはMSDNの解説を参照)。1本にするとモノラルでも音が出ず、4本だと1024sampleでややジッタが出る。バッファの合計サイズが問題なようで、1024sampleを4本でも128sampleを32本でもさほど変わらないのだが、2入力2出力で4本以上は必要ということなのかもしれない(どういう配分なのかわからないが)。

Kernel Streaming:
優秀。96sampleでも何とか動く。8000sampleで4本と32本を比較してみたが変わらなかった(DirectSoundではレイテンシが8倍になる)ので、本数を余計に取っても使用されないだけらしい(REAPERの表示上はレイテンシが増えるが実際には影響がない)。本数は64本が上限らしく、12sample64本でも動いたが、本数を増やすと挙動が安定しない気がする(憶測だが、バッファが足りない場合に未使用バッファと稼動中のバッファをニコイチにして、勝手にバッファを増やすのではないか)。

限界性能ではカーネルストリーミングがわずかに上なのだが、挙動がイマイチつかめないのと録音時にトラックが丸ごと後ろにずれるのが少し面倒(ローレベルなレイヤーを直で叩いているので当たり前といえば当たり前)。ずれはレイテンシ補正のオフセット設定で多分何とかなるが面倒なので調べていない(ASIO4ALL経由の録音なら勝手に補正してくれる:ASIO4ALLのLatency Compensationの設定は「自動補正を微調整する」ための機能)。ASIO4ALLは比較的安定しているが、設定画面が親切でない(v2.9でかなり親切になったのだが、筆者はv2.8の不親切な設定パネルが好きで、結局v2.8に戻してしまった)。高い負荷をかける場合、使用するプラグインによってカーネルストリーミングが優秀だったりASIO4ALLが優秀だったりする(FreeAmp3Fullのプリセットod-wa-dl-CrunchやDrive-ch-dlなどで顕著)。


サウンドドライバ関連のTips

ドライバによって受け入れ可能なsample format(ビット深度)が違う。たとえば筆者の手元では、Wave Out(MME)とDirectSoundは32bitデータしか受け取ってくれないし、Kernel Streaming(カーネルストリーミング)は16または24bitのデータしか受け取ってくれない。膨大な種類があるわけではないので全部試してみればよいだろう。

REAPER使用中にサウンドドライバの機嫌が悪くなった場合、オプション画面からデバイスの設定を開いてすぐ閉じてやればたいてい直る(ようするに、音源を一度クローズして開きなおせばよい:音声の入出力をすべて停止してから操作するとより安全)。カーネルストリーミングのバッファ値に非常に大きな値を設定するとREAPERが落ちて起動できなくなるが、REAPER.iniを手書きで書き換えてやれば直る([audioconfig]の項にあるks_bsの値)。筆者の手元では8000sample4本なら大丈夫で9600sample4本だと落ちた(64本だと60000sample取っても落ちない)。

筆者はバッファ2048sampleのASIO4ALLを常用している(1280sampleも取れば十分なのだが、ジッタが出たときにいちいち調整するのが面倒なので:FreeAmpで遊ぶときだけカーネルストリーミングを使う)。なお、MTRからライン録音する場合など、音質に気を使いたい(ジッタを避けたい)場合はバッファを大きく取らなくてはならない。起動しているソフトに重いものがあれば終了しておいた方がよいだろう。

どうしてもジッタが消えない場合、試しにマスタートラックをRenderしてみて、十分な速度(少なくとも1.0 x realtime)が出ていることを確認しよう(インプット速度がアウトプット速度に追いついていなければ、どれほど大量のバッファを確保しても時間の問題でジッタが出る:1曲丸ごとか、せめて3分の1くらいバッファに入れられれば話が違うのだろうが)。

ASIO4ALLの設定画面で「Exit」が出てこない場合どこか設定を変えてから戻してやればボタンが出てくる(チェックボックスを2回クリックするなど)。

2つ以上のアプリケーションでサウンドデバイスを共用する場合だが、筆者の手元では、VSTHostがASIO4ALLをオープンしているところにREAPERがカーネルストリーミングをオープンしにいくとREAPERが固まる。順番を逆にするとどちらも固まらないし、REAPERでASIO4ALLを使う設定にすると順番に関わらず固まらない(両方から音が出る)。いづれにせよイレギュラーな処理だろうからやらない方がよいが、サウンドドライバ関連でソフトが頻繁に落ちる場合は競合関係を見直してみよう。



ローコスト制作の目次に戻る / 音楽メモの目次にもどる

自滅への道トップページ