音源方式
このセクションの他のページは、どれも「呼び出し方」から始まります。プリセットを割り当て、プログラムチェンジを送り、SoundFont を読み込む。このページはその一歩手前、他のページが解決済みとして扱っている 2 つの疑問から始めます。
オーディオエンジンがサンプルデータを一切持たないのはなぜか。 そしてブラウザのタブで動くものが、なぜ 1990 年代の据え置き音源モジュール向けの規格に対応しているのか。
答えは同じで、コストの判断です。
先に読むページ
このページは、オシレーター、FM のオペレーター、プログラム、バンクといった言葉を定義せずに使います。初めて見る言葉があれば、シンセの音作りの基礎、MIDI の基礎、GM と GSの順に読むと、基本から説明しています。
音を鳴らす 4 つの方式と、それぞれのコスト
デジタル楽器が音を作る方法は、大きく 4 通りに分かれます。違いは「どんな音が出せるか」よりも、コストをどこで負担するかにあります。聴き手がダウンロードするバイト数か、発音中にプロセッサが回す演算量か、のどちらかです。
| 方式 | データ量 | 計算量 | 表現はどこから入るか | このエンジンでの実体 |
|---|---|---|---|---|
| サンプル再生 | 上限なく増える | 少ない | ベロシティや奏法ごとに録音した素材のクロスフェード | SoundFont プレイヤー(持ち込んだサンプル用) |
| FM | ほぼゼロ | 中程度 | オペレーター比と、時間変化する変調指数 | 複数のエンジンモード。フォールバックバンクのエレピとシンセブラス |
| 物理モデリング | ほぼゼロ | 多い | 弓圧、息圧、唇の張力といった物理量 | 9 種のアコースティックボイス(ピアノ、パイプオルガン、擦弦、リード、金管、フルート、バジングブリッジ撥弦、ボーカル、フリーリード)に加え、撥弦ループ、ハープシコード、モーダル、膜鳴モデル |
| サブトラクティブ(バーチャルアナログ) | ほぼゼロ | 中程度 | エンベロープで動くフィルターのカットオフとレゾナンス | SynthPatch のアナログボイス。リード、パッド、シンセ SE |
容量を食うのは最初の 1 行だけです。サンプルライブラリの容量は音色数 × 音色あたりのレイヤー数 × 収録品質という積で決まり、この 3 つはどれも設計者が増やしたくなるものです。積が小さくなることはありません。
残る 3 行が持つのは少数の係数だけで、代わりにプロセッサの時間を使います。擦弦ボイスは擦弦楽器の録音ではなく、弦と、弓の固着と滑り、弦が張られた胴体をモデル化したループを 1 サンプルごとに解いたものです。表現の入り方が違うのもここから来ます。大きく録れた素材に差し替えるのではなく、弓を強く押し付ける、という入り方になります。
ブラウザではサンプルの道を選べない
1990 年代の音源モジュールとその系譜は最初の道を選び、かなり先まで進みました。音色を増やし、ベロシティレイヤーを増やし、収録品質を上げる。楽器が机の上の箱でディスクを内蔵しているなら、ギガバイト級まで無理なく走れる道です。
ブラウザはその道を選べません。 ここで配信されるのは、訪問者が音を聞く前にダウンロードする 1 つのバイナリで、その中にサンプルデータは 1 バイトも入っていません。そこでコストの置き場所を移しました。ダウンロードから外し、プロセッサに載せたわけです。
- データ(ブラウザが読み込む量)
- 計算量(発音中のボイス 1 つあたりの処理)
この 1 つの判断から、サイト上の 2 つのものが導かれます。別々の機能ではなく、帰結として読むと分かりやすくなります。
- 17 種類のエンジンモード。 音色の幅を録音の数で稼げないなら、合成方式の種類で稼ぐしかありません。各モードは素の音を作る別々のやり方で、幅はサンプルを増やすのではなく方式を複数持つことで確保されています。
- SoundFont がないときに鳴るフォールバックバンク。 MIDI ファイルは何も用意しなくても音にならなければならず、それができるのは背後にデータを持たないバンクだけです。
SoundFont プレイヤーはこれと矛盾しません。訪問者が持ち込むサンプル、つまり手元にあって、すでにダウンロード済みで、自分で読み込むと決めたバンクのために存在します。エンジンがしないのは、サンプルを同梱することです。
GS を選んだ理由
2 つ目の疑問のほうが、たいていの読者には奇妙に映ります。論旨は一行です。音色に名前を付ける手段がないとき、レンダリングするエンジンには番号体系が要る。そしてそれはすでに存在する。
エンジンにはプラグインの接続口がある。WebAssembly ビルドにはそれを置く場所がない
ブラウザはネイティブのプラグインを読み込めません。Audio Unit や VST のプラグインは OS のライブラリで、Web ページにはそれを開く手段がないからです。「プラグインが使えない」はブラウザビルドの性質であって、エンジンの性質ではありません。 デスクトップ向けには、外部の楽器やエフェクトを受け入れる接続口がエンジンにあります。
ソース上の根拠
src/host/plugin_host.h の InstrumentProvider は、素の PluginDescriptor をコア側のインスタンスに変える抽象ファクトリで、プラグイン SDK を一切名指ししないヘッダオンリーのインタフェースです。それが成り立つ理由はファイル冒頭のコメント自身が書いており、実際のブリッジは「ビルドオプションの背後でツリー外に」置かれます。macOS の Audio Unit バックエンド(src/host/backends/plughost/)がコンパイルされるのは src/host/backends/CMakeLists.txt の if(BUILD_AU_HOST) の内側だけです。このオプションはトップレベルの CMakeLists.txt で既定 OFF と宣言されており、リンクするのは AudioToolbox、AudioUnit、AVFoundation、CoreAudio です。
プラグインがなければ、音色を名指すものがない
これは一見した以上に重い話です。どの音かという問いの答えは、普通はプラグインが持っています。セッションがプラグインを名指し、プラグインがプリセットを名指し、セッションを誰かに渡せば両方が一緒に渡る。プラグインを取り去ると 2 つが同時に壊れます。音色を選ぶための語彙がなくなり、音色を渡すための器もなくなります。
GM と GS は、まさにその問題に対する既存の答えです。プログラムナンバー、バンク、ドラムキット、パートごとの設定、エフェクトセンドは、いずれもファイルの中を一緒に運ばれる値として規定されています。これを理解するレンダラなら、その存在を知らない相手から渡されたファイルでも、意図されたものを鳴らせます。
GS は音ではなく制御プロトコルとして採用されている
ここがこのページの前半と後半をつなぐ部分で、エンジン自身が次のように書いています(src/midi/synth/docs/gs.md)。
GS is implemented here as a way to control physical-model and FM instruments, and the resemblance to a sound module stops at the wire.
(GS はここでは物理モデルと FM の楽器を制御する手段として実装されており、音源モジュールとの類似は信号線の上で終わる。)
GS を名乗ることは、特定のハードウェアの音を再現するという主張ではありません。上の表に並ぶ物理モデルと FM のボイスを指し示すための番号体系です。プログラム 40 はバイオリンを選びますが、応えるのは擦弦モデルであって録音ではなく、プロトコルはもともとそれ以上を保証していません。同じ資料はその帰結も明示しています。あるプログラムの音色がハードウェアと違うという報告は、どちら向きの違いであれ、このプロトコルに対する不具合ではありません。
エンジンが仕様から離れる箇所では、その旨を明記したうえで違いを 3 種類に分けています。仕様準拠のファイルからは届かない拡張、理由を記録した意図的な相違、この構成にはアドレスの受け手がない縮退の 3 つです。この 3 分類の表とアドレスごとの詳細は GM と GS フォールバックバンクにあります。
本当に WebAssembly から来ている制約
こちらが本物です。
| 制約 | 根拠 |
|---|---|
| プラグインを読み込めない | ネイティブのプラグインは OS のライブラリで、Web ページからは開けない(上の根拠を参照) |
| サンプルを同梱しない | 上の図に出ているバイナリサイズ。音色数 × レイヤー数ぶんの録音はダウンロードに収まらない |
もう 1 つの事実は WebAssembly の限界ではなくサイトの選択です。このサイトは SharedArrayBuffer なし(COOP/COEP ヘッダなし)で動いているので、エンジンは AudioWorklet 内の単一ヒープになります。
次に読むページ
このページは入り口で、細部は以下のページにあります。
- 内蔵シンセサイザー:共通の制御レイヤー、17 種類のエンジンモード、
SynthPatch、名前付きプリセットカタログ。 - GM / GS フォールバックバンク:個々のアドレス、バンク、ドラムキット。
- GM 音色マップ:128 プログラム全体のエンジンと音色の作り。
- 物理モデル:モデル化されたボイスそのものと、各ボイスが受け取るパラメータ。
- SoundFont プレイヤー:持ち込んだサンプルと、モデルバンクとの組み合わせ方。
- MIDI 入力:以上のすべてを鍵盤から鳴らす方法。