GM と GS
MIDI ファイルは音を持ちません。「プログラム 40、チャンネル 3、ノート 67、強め」と言うだけで、あとは聞いている側に委ねます。これは他人にファイルを渡すまではうまくいきます。渡した途端に困るのは、その番号のどこにも「プログラム 40 とは何か」が書かれていないからです。ある機械ではヴァイオリンで、次の機械では誰も名前を覚えていない工場出荷プリセットです。
General MIDI(GM)は、その番号の意味を固定する取り決めです。GS は、その上に積まれたより大きな取り決めです。本ページでは、それぞれが何を保証し、どちらも保証していないものは何で、libsonare がそれをどう使っているのかを説明します。概念のみで、コードはありません。
一文でいうと
GM が決めるのはどの枠かだけです。その枠がどんな音かは決して決めません。GM に正しく従った 2 台の機械でも音は一致しませんが、どちらも故障ではありません。
番号の取り決めで得られるもの
GM 以前、.mid ファイルが可搬だったのは「解析できる」という意味においてだけでした。音符は届く。楽器はくじ引きです。GM はこれを、ひとつの地味で、しかし途方もなく有用な手で変えました — 表を公開したのです。プログラム 0 はアコースティックグランドピアノ。24 はナイロン弦ギター。40 はヴァイオリン。56 はトランペット。128 枠すべてに担当が決まっています。8 つずつ、16 のファミリー(ピアノ、クロマチックパーカッション、オルガン、ギター、ベース、ストリングス、アンサンブル、ブラス、リード、パイプ、シンセリード、シンセパッド、シンセエフェクト、エスニック、パーカッシブ、効果音)にまとめられています。
これで得られるのは忠実さではありません。そのファイルを見たことのない機械の上で、それと分かる音になることです。ベースラインはベースらしい何かから出て、メロディはメロディを担える何かから出て、別の機械に移してもアレンジが崩れません。libsonare 版のその表が GM 音色マップ で、128 プログラムそれぞれがここで何に解決されるかを一覧にしています。
ドラムチャンネル
打楽器はこの枠組みに収まりません。GM はそれを回避策ではなく例外で扱います。ひとつのチャンネル — 慣例としてチャンネル 10 — では、ノートナンバーが音高を意味することをやめ、楽器を意味し始めます。ノート 36 はキック、38 はスネア、42 はクローズハイハット、49 はクラッシュシンバルです。つまりドラムパートは、誰もメロディとして読まないメロディ行として書かれ、GM 機器はどれも、それを別の規則で読みます。
チャンネル 10 のトラックを 1 オクターブ上げると、音程の高いドラムキットではなく意味不明な何かになるのはこのためです。番号は名前であり、名前を 12 ずらせば別の名前になるだけだからです。
バンクセレクト、バリエーション音色、音色マップ
128 プログラムは多くありません。バンクセレクトは、この仕組みを壊さずにアドレスを広げます。プログラムチェンジの直前に送る 2 つのコントロールチェンジが、プログラムをどの棚から読むかを選びます。キャピタル音色 — 素の GM 楽器 — は、バンクを選ばなかったときに得られるものなので、GM だけのファイルはそのまま鳴ります。
バリエーション音色とは、その他の棚に載っているものです。同じ枠を、違う声で鳴らしたもの。プログラム 48 はストリングスで、プログラム 48 のバリエーションは別のストリングスです。プログラムナンバーそのものは何も変わらないので、そのバリエーションを持たない機器はキャピタル音色に落ち、アレンジは変わらず鳴ります。
バンクセレクトの MSB と LSB は、それぞれ別の役割を持ちます。一方はバリエーションを選び、もう一方は音色マップを選びます。音色マップとは、そのバリエーション番号を照らし合わせる音色セットの世代のことです。同じバリエーション番号でも 1991 年の音色セットと 1998 年のそれでは指すものが違うので、音色マップはファイルが「どちら向けに書かれたか」を告げる手段になります。正確な割り当ては下の ::: details にあります。
ドラムキットも同じ仕組みで選びますが、プログラムナンバーの意味が変わります。パートがリズムパートだと宣言されると、そのプログラムナンバーは楽器を選ぶことをやめ、キットを選び始めます。キットには Standard、Room、Power、Jazz、Brush、Orchestra、そして後の音色マップが次々に追加したドラムマシン系・プロダクション系のキット群があります。キットがリズムパートのバリエーションである関係は、バリエーション音色が旋律プログラムのバリエーションである関係とまったく同じで、選択中のマップが定義していないキットは無音ではなく Standard に落ちます。
GS が GM に足すもの
GM は楽器一覧で止まります。GS はその先へ進み、追加されるものはすべて同じ性格を持っています。GM が機械任せにしていたものを、ファイル側の制御下に置くのです。
- パートごとの編集。 16 パートそれぞれが、自前のフィルターカットオフとレゾナンス、自前のエンベロープのアタック・ディケイ・リリース、自前のビブラートのレート・深さ・ディレイ、自前のチューニング・キーレンジ・パンを持ちます。GM ファイルはヴァイオリンを求めますが、GS ファイルは「明るさを抑え、ビブラートの立ち上がりを遅くしたヴァイオリン」を求められます。
- ファイルと一緒に運ばれるエフェクト。 リバーブ・コーラス・ディレイがモジュール全体のユニットとしてあり、パートごとのセンド量を持ちます。さらに専用のパラメータブロックを備えたインサーションエフェクトもあります。リバーブの量は、たまたま再生した人の設定の問題ではなくなります。
- リズムパートの機構。 GM のドラムチャンネルは慣例ひとつです。GS はそれをどのパートでも設定できるスイッチにし、複数のリズムパートを同時に許し、そのパートが鳴らすキットを選ばせ、さらにキットの上にノートごとの編集層 — レベル、パン、ピッチ、3 つのエフェクトセンド、排他グループ、叩かれたノートが実際に鳴らす音 — を重ねます。
これらはすべてシステムエクスクルーシブで指定されます。GS ファイルが長いバイト列だらけなのはそのためで、GM しか知らない機器はそれを無害に読み飛ばします。そう設計されています。GS ファイルとは、理解されない場所では何もしない追加指示を添えた GM ファイルなのです。
境界線と、それが欠陥ではない理由
ここが引っかかりどころです。この種の規格が固定するのはどの枠かであって、その枠がどんな音かでは決してありません。 プログラム 40 はヴァイオリンだと言いますが、どのヴァイオリンを、どう録音し、誰が、どんな部屋で、どんな強さで弾いたかは言いません。2 つの実装が仕様に完全に従いながら、まったく似ていない音 — 片方は温かいサンプル、片方は細い合成音 — を出すことがあり得て、そのどちらかを不合格にするテストは存在しません。
これを互換性のバグとして扱っても行き止まりです。そもそも互換であるべき基準となる録音が存在しないからです。検証できるのは、メッセージが届いたか、理解されたか、そして仕様が示す向きと量でそれが名指すパラメータを動かしたか、です。規格が実際に保証するのはこちらであり、実装を照らし合わせる基準にすべきなのもこちらです。
ここでの GS の意味
libsonare はサンプルライブラリを持たず、SoundFont も同梱しません。その GM/GS 音色は、サンプルレートで計算される物理モデルと FM スタックであり、そのためこの規格がここで何に使われるのかは、エンジン自身の仕様書に明記されています。
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 は模倣ではなくアドレス空間として読んでください。プログラム 41 はチェロを選びますが、応えるのは擦弦モデル — 遅延線、損失フィルター、シミュレートされた弓 — であって、その録音ではありません。パートごとの編集は実際に効き、仕様どおりのことをします。カットオフの編集はモデルのフィルターを働かせ、エンベロープの編集はモデルの振幅エンベロープを伸縮させ、ビブラートの編集はモデルのピッチ LFO を動かします。意図的に保証していないのは、どの枠であれ特定のハードウェアと一致して鳴ることであり、「一致しない」という報告はプロトコル上の欠陥にはあたりません。
見返りは、そもそも GM が発明された理由そのものです。ファイルが届き、エンジンがすでに知っている語彙で楽器を名指し、そして鳴る — ダウンロードも、導入すべきバンクも要らず、送り手と受け手が番号以上に合意すべきものもありません。どの枠がどの音色に割り当てられるかは GM/GS フォールバックバンク に、ブラウザ用エンジンがサンプル同梱ではなくこの道を選んだ理由は 音源方式 にあります。
libsonare でのアドレッシング
バンクセレクトの MSB と LSB は役割が分かれています。バンクセレクト MSB(CC#0)がバリエーション音色番号を運び、キャピタル音色はプログラムチェンジのままです。バンクセレクト LSB(CC#32)は音色マップを選びます — 1 から 4 が定義された順に並ぶ 4 世代の音色セットで、4 が最新かつモジュール自身のマップ、そして 0 は「モジュールが設定されているマップ」を意味します。このメッセージを受け取ったことのないモジュールは、すでに自分の既定マップを鳴らしているからです。定義済みのマップ外の値は、無音ではなくモジュール既定として読まれます。
ドラムキットはリズムパートのプログラムナンバーで指定されます。 各マップにまたがって 26 のキットが定義されており、うち 10 はどのマップからも選べます(Standard、Room、Power、Electronic、Analog Machine、Jazz、Brush、Orchestra、SFX、Legacy Map)。さらにマップ 2 が 5 つ、マップ 3 が 11 を追加します。プログラム 64 と 65 は意図的にこの表の外に置かれており、ファイルがノート単位で組み立てる 2 つのユーザードラムセットを選ぶために空けてあります。プログラムナンバーはここではゼロ始まりなので、マニュアルで 1 始まりの「PC 26」と書かれた Analog Machine のセットはプログラム 25 です。導入元のマップをファイルが選んでいないキットは Standard に落ちます。これは、自分のマップにないキットを求められたハードウェアモジュールの挙動と同じです。
対象機種は最新世代のモジュール、つまり自身のマップがマップ 4 である機種であり、それはマップ 3 の世代を含みます。 2 つのパラメータアドレスマップは、重なるところではサイズ・データ範囲・電源投入時の既定値のすべてで一致し、10 点で分かれます。うち 9 点では新しいほうの機種が上位集合なので、マップ 3 向けのファイルは音色マップ 3 を選べば何も犠牲にせず鳴ります。残る 1 点は逆向きです。ストアされたパッチとユーザーエフェクトタイプはフロントパネルの記憶領域であり、レンダラーは持ちません。そのため、その領域全体は理由を記録したうえで意図的に未実装とされており、未割り当てのまま放置されてはいません。
関連: GM/GS フォールバックバンク、GM 音色マップ、音源方式、MIDI の基礎、SoundFont とサンプル音源