物理モデリング
物理モデリングという言葉は、たいてい宣伝文句として初めて目に入ります。そのため「とても出来のいいサンプル」のことだろうと推測されがちですが、意味はむしろ逆です。サンプル音源が持っているのは、すでに起きた音の録音です。物理モデルが持っているのは、その音を出すであろう物体の記述であり、音は聞いている最中に計算されます。信号経路のどこにも録音はありません。そもそも何も録音されていないからです。
本ページでは、それによって何が得られ、何を代償にし、どこで通用しなくなるのかを説明します。概念のみで、コードはありません。
同じ問いへの 2 つの答え
「チェロはどんな音か」と問われたとき、サンプラーはチェロの録音で答えます。モデルは弦と弓と胴で答え、あとは計算に決めさせます。前者はひとつの演奏について正確で、後者はメカニズムについて正確です。これは種類の違う正確さであり、限界付近でのふるまいも違ってきます。
物体をシミュレートする
振動する弦は波形ではありません。波を運ぶ媒質であり、その波は弦の上を進み、両端で反射し、往復のたびに少しずつエネルギーを失い、途中で互いに干渉します。聞こえる音色は、それらすべてを経たあとに残ったものが、駒と胴を通して放射されたものです。モデルはその過程をサンプル単位で再現し、出てきたものをそのまま受け取ります。
押さえておきたいのは、モデルには「保存されたノート」という概念がないという点です。あるのは状態 — どこにどれだけのエネルギーがあり、どちらへ動いているか — と、その状態を 1 サンプル進める規則だけです。ノートを鳴らせば状態が展開します。途中で押し込めば、そこから先の展開が変わります。参照される表はありません。
導波管モデル
この方式の代表格が導波管(ディジタルウェーブガイド)で、名前の物々しさに反して単純です。部品は 3 つです。
- 遅延線が伝搬を担います。片端を出た波は決まったサンプル数をかけてもう一方の端に届き、そのサンプル数がそのまま音高です。往復が短い=周回が速い=音が高い。これらのエンジンにチューニング用のオシレーターが無いのは、長さが調律を担っているからです。
- 損失フィルターが往復ごとの損失を担います。反射のたびにエネルギーは失われ、低域よりも高域のほうが多く失われます。撥弦した音が静かになる前にまず鈍くなるのは、まさにこれが理由です。ループにフィルターを 1 つ置くだけで、減衰のふるまい全体が再現されます。
- 励振部がエネルギーを注ぎ込みます。ハンマー、プレクトラム、弓、リード、一対の唇、空気のジェット。
これらは方式に共通する役割を示す概念であり、遅延線やフィードバック構成が同一という意味ではありません。
これらのモデルには遅延とフィードバックという共通概念があるので、遅延、反射、損失、励振という語を方式全体で使えます。ただし、励振部だけを差し替えた 1 つのループではありません。擦弦モデルは弓の位置で分かれる 2 本の遅延線を使います。リードモデルは 1 本の管体を使い、円筒と円錐でフィードバックの符号と周期が変わります。金管モデルは全周期の管体に 2 極の唇共鳴器と固有のベル反射を組み合わせます。そのため brightness と damping は各モデル固有の反射段と損失段に対応します。
表現が切り替えではなく連続になる
これが実用上の違いであり、言葉の印象より大きな差です。
サンプラーは、格子状に並んだ録音の集合です。鍵盤上に数音、それぞれにベロシティレイヤーが数段。強く弾くとは別の録音を選ぶことです。何段録ろうと格子は有限で、2 つのレイヤーの間はすべて、同時には存在しなかった 2 つの演奏のクロスフェードです。さらに厄介なのは、いったんノートが始まれば録音は確定していることです。サンプラーはそれをフェードし、フィルターをかけ、別の音を重ねることはできますが、すでに鳴っているノートを「もっと強く弾かれていたこと」にはできません。
モデルに格子はありません。弓にかける力はループが毎サンプル読む数値なので、ノートの途中で強く押せば、そのサンプル以降の弦の食いつき方が変わります。そして一緒に増す明るさは上から足されたエフェクトではなく、弦がより強く駆動されたことの帰結です。より大きな音の録音を選ぶのではなく弓を押し込むのであり、楽器は楽器らしく応えます。押し込まれている対象が、メカニズムのモデルそのものだからです。
コストの逆転
サンプリングと比べると、物理モデリングは保存容量をボイスごとの計算へ振り替えます。
| サンプル音源 | 物理モデル | |
|---|---|---|
| データ | 多数の音域・ベロシティレイヤー・アーティキュレーションを録音するため、大きくなりやすい | コンパクトなパラメータ集合 |
| CPU | メモリを読み、リサンプルし、ミックスする | ボイスごとに毎サンプル物理を解く |
| 先に尽きる資源 | ディスク、ダウンロード、メモリ | 同時発音数 |
| 1 音増やすコスト | 別の再生ボイスとリーダー状態 | そのボイス専用の遅延線・フィルター・共鳴器と再生状態 |
この逆転があるからこそ、SoundFont を一切伴わない MIDI ファイルでも、これらの音色で鳴らせます。保存するものが無いので、ダウンロードするものも無いのです。同時に、擦弦楽器の密なアレンジがサンプル再生より重いレンダリングになる理由でもあります。音声を取ってくるのではなく、計算しているからです。
打撃と持続
励振部は 2 種類に分かれ、その区別が「ノートの途中で演奏者に何ができるか」を決めます。
打撃・撥弦系の励振部は、ほぼ瞬時に仕事を終えます。ハンマーが弦に触れ、エネルギーを渡し、離れる。以降はループが自力で鳴り止んでいくだけです。この種のワンショット励振では、表現上の主な判断 — どれだけ強く、どれだけ速く、弦のどこを — は打撃時に行われ、発音中の励振ルートを受け取る対象がありません。
持続系の励振部は、ノートが続く限りループにエネルギーを供給し続けます。弓は弦に乗り続け、息はリードに届き続け、蛇腹は舌の脇へ空気を押し出し続けます。励振部はループの内側にあり、戻ってくる波に反応します。これらの楽器が生きているように感じられるのはそのためです。強く押せば音色が変わるのは、パラメータがフェードしたからではなく、結合の仕方が変わったからです。
そこで得られるのは、発音中も演奏者が音に関わり続けられることです。擦弦のクレッシェンドは一続きの身ぶりであって、アーティキュレーションの連打ではありません。管楽器の奏者はアタックが過ぎたあとでもフレーズを形づくれます。打撃モデルには形づくる余地が残っていないので、そこへ差し向けられた表現用のコントロールは届く先がありません。libsonare はそれを、コントロールを受け取って黙って何もしないのではなく、明示的に「受け取らない」と宣言する形で扱います。
知っておくべき限界
2 つあり、どちらもモデルを選ぶ前に知っておく価値があります。
モデルは、モデル化されたものの音しか出しません。 汎用の「リアルさ」スイッチではありません。管体のモデルはクラリネットやサックスを見事に出しますが、合唱はまったく出しません。特定の楽器の個性 — このチェロが、このホールで — はメカニズムの中には無く、そこへ近づけるのはこの方式が提供するものではなく較正の仕事です。
適合範囲の外で、モデルは緩やかに劣化しません。 サンプラーを録音範囲の外へ押し出すと、見慣れた壊れ方をします。明るすぎる、遅すぎる、いかにも引き伸ばされている。一方、適合させたパラメータ範囲の外へ押し出されたモデルは、そもそもその楽器であることをやめかねません。何も食いつかない弓圧、誰も望まないモードへオーバーブローする吹圧、損失を止めてループを発散させる損失フィルター。壊れるときは、品質が少しずつ落ちるのではなく、別の物体に変わってしまいます。
アコースティックモデル
libsonare の内蔵シンセサイザーは、複数のエンジンをこの方式で作っています。それぞれがひとつの物理量を軸に組まれており、その物理量とは演奏者が実際に操るもので、モデルの残りはそれに応答するように配置されています。
| モデル | 何をモデル化しているか | 軸に据えた物理量 |
|---|---|---|
piano | フェルトハンマー、結合したユニゾン弦、響板 | ハンマーが打つ位置 |
pipe-organ | 共通の風箱から風を得るフルーパイプ | 歌口の風圧 |
bowed-string | 松脂を塗った弓が弦に食いつき滑る | 接触位置と弓圧 |
reed | ケーンリードが円筒・円錐の管体を開閉する | 吹圧とリードの硬さ |
brass | 朝顔付きの管体に対する唇のバルブ | 吹圧とアンブシュア |
flute | エッジを横切るエアジェットが開管を駆動する | ジェットの通過時間と管の周期の比 |
plucked-string | 湾曲した駒に触れながら振動する弦 | 撥弦位置と駒のビビり |
vocal | 声門音源を 5 つの母音フォルマントに通す | どの母音か |
free-reed | 空気流に駆動され、スロット内で振動する金属の舌 | 蛇腹の圧力と舌の硬さ |
harpsichord | 爪で弾く弦の組と短い後部セグメント | プレクトラムと後部結合 |
それぞれが公開するパラメータ、その既定値と範囲、そして各モデルが現時点でどこまで固まっているかは 物理モデル にまとまっています。ピアノモデルは調整済みですが、それ以外の物理モデルはまだ調整・較正を待っており、今後のパッチリリースで作業を続けます。完成済みの楽器シミュレーションではなく、データ不要のプレビュー/フォールバック音色として扱ってください。導波管ではないが物理的な考え方を使うエンジンもあり — modal は同調した共鳴器のバンクを一斉に叩き、percussion は円形膜にノイズ層を重ねてモデル化します。additive は加算合成であり、物理モデルではありません。これらは 内蔵シンセサイザー で他のエンジンと並べて説明されています。
libsonare での実装
導波管として説明できるのは piano・pipe-organ・bowed-string・reed・brass・flute・plucked-string・harpsichord です。vocal はソース・フィルターモデルで、声門音源を母音フォルマントの共鳴器バンクに通すため、同じ形のループは持ちません。free-reed は空気流に駆動され、スロット内で振動する舌で、結合する気柱を持ちません。それでも物理モデルに含めているのは、波形として描かれるのではなく、依然としてメカニズムから解かれているからです。
ライブでの表現は、ボイスごとの名前付きフィールドではなく 4 つの抽象化された励振軸を通ってモデルに届きます。force(励振部への駆動 — 弓圧、口腔圧、蛇腹圧)、position(励振部が共鳴体と出会う位置。擦弦だけが持ちます)、brightness(放射端の音色的な開き具合。音量とは切り離されています)、morph(レジストレーションのモーフ。スペクトルが励振ではなく描画で決まるエンジン向け)です。モジュレーションのルートはエンジンではなく軸を指定するので、ディスパッチは 1 行で全ボイスをまかない、各エンジンは自分が宣言した軸だけを読みます。
受け入れ集合は推論ではなく宣言です。excitation_axes.h の engine_axis_capability() がエンジンモードごとに 1 行を持ち、その背後の switch には default: ラベルが無いので、何も宣言しない新しいモードはコンパイルを通りません。また、持続励振と宣言しながら軸マスクが空のエンジンは static_assert で落ちます。打撃系と撥弦系のエンジンは 4 軸のどれも受け取りません — karplus-strong・modal・percussion・piano・plucked-string・harpsichord、そして物理モデルではない subtractive・fm・sample も同様です。これらはワンショットの励振で、発音中の励振軸を宣言しません。additive は中間的な例です。ドローバーのトーンホイールは持続しますが励振されるわけではないので、morph 軸だけを取ります。vocal は brightness のみで、force には brightness のティルトかアンプ以外に向かう先がありません。
関連: 物理モデル、内蔵シンセサイザー(NativeSynth)、音源方式、シンセの音作りの基礎、SoundFont とサンプル音源