バウンスとレンダリング
クリップを並べ、テイクをコンプし、ループをグリッドへワープしました。最後の工程は、編集中のアレンジを、共有できる 1 つの完成オーディオファイルに変えることです。この工程をバウンス(またはレンダリング)と呼びます。
ひとことで言うと
バウンス / レンダリング = アレンジ全体を、オフラインかつ決定的に、完成オーディオバッファへと計算すること。
オフラインで決定的
バウンスはオフラインです。リアルタイムで動く必要はありません。軽いプロジェクトではリアルタイムより速く、重いプロジェクトでは遅く動くこともあります。優先するのは実時間に間に合わせることではなく、正しい結果を得ることです。
オフラインレンダリングはタイミングのゆらぎやドロップアウトを取り除き、エンジンには乱数の状態もないので、決定的でもあります。同じビルド・同じ実行環境で、同じプロジェクト・同じオプション・同じ楽器なら、常にサンプル単位で同じオーディオを生みます(実行環境やプラットフォームが違うと、浮動小数点の丸めで末尾のビットが変わることがあります)。ファイナルマスターをスピーカー録りではなくオフライン経路でバウンスするのはこのためです。
バウンスは「出力を録音する」ことではない
バウンスは編集モデルからアレンジを再構築し、クリーンにレンダリングします。プロジェクトのライブ演奏をキャプチャしているのではなく、計算しているので、再現可能で音切れもありません。大きな伸縮やハードな継ぎ目など、編集そのものが生むアーティファクトは、再生時に聞こえるとおりにレンダリングされます。
ミックスはミキサーシーンを通してレンダリングされる
初心者がよくする思い込みは、バウンスは全トラックを足し合わせるだけ、というものです。違います。アレンジはミキサーシーンを通してレンダリングされるため、完成ファイルにはミックス全体が反映されます。
つまり各トラックは自分のチャンネルストリップ(EQ、ダイナミクス、ゲイン、パン)を通り、センドが共有エフェクトへ送られ、すべてがバスを経てマスターへ集まります。ミックスするときとまったく同じです。バウンスはクリップの素の合算ではなく、ミックスそのものです。チャンネルストリップに何が載るかは ミキシング を参照してください。
以下の信号経路はライブ再生時に聞こえているものと同じで、バウンスはそれをオーディオデバイスの代わりにファイルへ書き出します。
MIDI トラックはバウンス時に楽器を必要とする
クリップとトラック で見たとおり、MIDI トラックは音ではなくノートを持ちます。そのためバウンス時には、そのノートをどの楽器が演奏するかを指定しなければなりません。libsonare はいくつかの入口を用意しています。
| やりたいこと | 使うもの |
|---|---|
| パッチ駆動のフルシンセ | 内蔵シンセサイザー(NativeSynth)楽器でバウンス |
| General MIDI の SoundFont | SoundFont 楽器でバウンス |
| 手軽な内蔵オシレーター | 内蔵楽器でバウンス |
| 自前の外部楽器(Python、JavaScript) | ホスト提供の楽器でバウンス |
楽器をバインドせずにバウンスすると、MIDI トラックは無音でレンダリングされます。ノートはあるのに、演奏する楽器がありません。オーディオトラックは常に音をレンダリングします。シンセ側は 内蔵シンセサイザー を参照してください。
長さは自動導出される(指定しない限り)
バウンスの長さは通常、指定する必要がありません。長さを省略すると、レンダラーが最後のクリップの末尾を探してタイムラインから自動導出し、それに最長の楽器リリーステール(ノートが終わった後に鳴り切ってフェードするのに必要な余韻ぶん)と、ミキサー自身のレイテンシとエフェクトテール(リバーブやディレイのインサートは入力が止まった後も鳴り続けます)を足します。そのため、最後のリバーブや長いシンセのリリースが減衰の途中で切れることはありません。特定の長さを強制したいときだけ、明示的に長さを指定します。
レイテンシ補正(PDC)
一部の楽器やエフェクトはレイテンシを生みます。出力する前に数サンプルの先読みが必要で、音がわずかに遅れて出てきます。何も補正しなければ、遅延のある楽器がミックスの後ろへずれていきます。
その対策がレイテンシ補正、別名 PDC(plugin delay compensation)です。その楽器が何サンプルのレイテンシを足すかをバウンスに伝えると、アレンジをサンプルへ変換する工程(コンパイル工程)がタイムラインをずらし、その楽器を他のすべてと再び合わせます。結果として、タイミングは崩れません。バウンスは報告されたレイテンシぶんを先にレンダーして捨てるので、結果の最初のサンプルはタイムラインの先頭で、あとから削る必要はありません。
数値を実際のレイテンシに合わせる
PDC は、与えたレイテンシ値が楽器の実際の値と一致して初めて機能します。小さすぎれば依然として遅れ、大きすぎれば先走ります。迷ったら推測ではなく、楽器が報告するレイテンシを問い合わせてください。
libsonare での実装
バウンスは Project クラスから実行します。素の bounce(options?) はオーディオトラックをレンダリングし、MIDI トラックは無音のままです。MIDI トラックを鳴らすには楽器をバインドします。bounceWithSynthInstrument(パッチ駆動の NativeSynth。SynthPatch、プリセット名、またはその配列を受け取る)、bounceWithSf2Instrument(loadSoundFont で読み込んだ SoundFont を使う GS 互換の SoundFont プレイヤー)、bounceWithBuiltinInstrument(シンプルなオシレーターシンセ)があり、Python の bounce_with_instruments と JavaScript の bounceWithInstruments/bounceWithInstrument で自前の外部楽器を組み込めます。ProjectBounceOptions で totalFrames を省略(または <= 0)すると、レンダリング長はアレンジ、楽器のリリーステール、ミキサーシーンのレイテンシとエフェクトテールから自動導出されます。すべてのバウンスはクリップの合算ではなく、ミキサーシーン(トラックごとのチャンネルストリップ・センド・バス)を通してレンダリングされます。レイテンシ補正はバウンスオプションの instrumentLatencySamples で与え、これがコンパイラに渡されて遅延のある楽器がタイミングを保ちます。レンダリング全体は、固定のプロジェクト + オプション + 楽器に対して決定的です。