テイクとコンピング
優れた録音の演奏が一発で完璧に決まることは、ほとんどありません。歌い手は 1 番をテイク 2 で決め、サビをテイク 5 で決める。ギターソロはある演奏のすばらしい入りと、別の演奏のきれいな締めを併せ持つ。テイク と コンピング は、そのすべてのベストを取り出すための 2 つの考え方です。
2 つの言葉の定義
テイク はパートの 1 回の録音です。コンピング(compositing から)は、複数のテイクにまたがるベストな瞬間を組み合わせて、1 つの最終演奏を作り上げることです。
テイクとは何か
パートを録音すると、その 1 回が テイク です。もう一度録れば 2 つ目のテイクです。libsonare はこれらをプロジェクト全体に散らかすのではなく、1 つのクリップの中に テイクを格納します。クリップはテイクのリストを保持し、そのうちのちょうど 1 つが アクティブテイク — クリップを再生したときに今聞こえているテイク — になります。
これが便利なのは、テイク同士がそろったままになるからです。すべてタイムライン上の同じ開始位置を共有するため、アクティブテイクを切り替えれば、何かが位置からずれることなく、同じパートの別の演奏を即座に試聴できます。
ループ録音 — テイクを素早く集める
テイクを集める一番速い方法が ループ録音 です。たとえば 1 番ぶんのループ区間を設定し、演奏を続けるあいだトランスポートにそこを巡回させ続けます。ループを 1 周するたびに 新しいテイク がクリップに取り込まれます。10 周すれば、1 つのクリップに 10 個のテイクが重なり、コンピングの準備が整います。
別々のクリップに録るより優れている理由
すべてのテイクが 1 本のトラックの 1 つのクリップに収まるため、あらかじめそろっていて比較が容易です。10 レーンに散った 10 個のクリップをやりくりするのではなく、その場で候補をめくっていく感覚です。
コンピング — ベストな演奏を組み立てる
テイクが何個か集まると、その 1 つを頭から終わりまでそのまま使いたいことはまずありません。コンピング は、時間の区間ごとに どのテイクを鳴らすかを選ばせてくれます。
クリップのタイムラインを区間に分け、各区間にテイクを割り当てます。最初のフレーズはテイク 2、次はテイク 5、最後はテイク 1 — その結果、ひと続きでは一度も実現しなかった完璧な演奏のように聞こえます。
視覚的には、コンピングはテイクの「レーン」の重なりと、そこを通る選択経路のように見えます。
時間 ──────────────────────────────────────────►
テイク1 │░░░░░░│ │ │██████████████████████│ ← 終わりを採用
テイク2 │██████████████│ │ │░░░░░░░░░░░░░░░│ ← 入りを採用
テイク3 │░░░░░░│██████████████│ │░░░░░░░░░░░░░░░│ ← 中間を採用
└──────┴──────────────┴──────┴──────────────┘
コンプ: テイク2 テイク3 (空白) テイク1塗りつぶされた各ブロックが コンプセグメント です。開始時刻・終了時刻・そこで鳴るテイクの id を持ちます。これらのセグメントが集まって コンプレーン — 最終演奏のレシピ — を形づくります。
コンピングが大切な理由
| パート | コンピングが役立つ理由 |
|---|---|
| リードボーカル | 音程・タイミング・表現が同じテイクでそろって最高になることはまれ。各フレーズのベストな歌い回しをつなぐ |
| ソロ | あるテイクのひらめいたフレーズと、別のテイクのきれいな着地を残す |
| 語り / ナレーション | 録り直さずに、各文の最も明瞭な言い回しをつなぎ合わせる |
コンピングは非破壊編集です。テイクそのものには手を付けません。いつ どの テイクを鳴らすかを記述しているだけなので、納得がいくまで何度でも組み直せます。
コンピングは手作業のクロスフェードではない
コンプは各時間区間をどのテイクが受け持つかを記述する、オーディオ領域をドラッグして自分でクロスフェードするよりも高いレベルの構造です。コンプセグメントの境目は、通常なら短いフェードを入れたい場所です。テイク間の切り替えが耳につくときは意識してください。
libsonare での実装
テイクとコンプは Project の編集モデルにおいてクリップ上に格納されます。クリップはテイクのリストとアクティブテイク id を持ち、setClipTakes(clipId, takes, activeTakeId?) で設定します。各テイクは { id, sourceId?, sourceOffsetPpq?, name? } です。コンプレーンは setClipCompSegments(clipId, segments) で設定し、各セグメントは四分音符単位(浮動小数。1.0 が四分音符 1 つ)で { startPpq, endPpq, takeId? } です。ループ録音は 1 回の呼び出しで取り込めます。addLoopRecordingTakes({ trackId, loopLengthPpq, audio, ... }) が取り込んだバッファをループ境界で切り分けてクリップにテイクを追加し、{ clipId, takeCount } を返します。プロジェクトをコンパイルすると、編集コンパイラがテイクリストを横断して各コンプセグメントを割り当て先のテイクから読み取り、レンダリングします。すべては toJson() / Project.fromJson(json) で JSON を往復するため、コンプは保存と再読み込みを越えて残ります。