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