MIDI 2.0 UMPにおけるノートオン命令について

正式なリリースについてはまだ白紙状態なのですが、いまMIDI 2.0 UMP (Universal MIDI Packet、雑にいえば新しいMIDIメッセージのフォーマット)に関する調べ物をしていたらだんだん同人誌化できそうな感じになってきたので、そのうちまとめて出そうと思っています。既に技術書典9およびM3 2020秋でのリリースを公開しているLV2開発者ガイドと併せて楽しめる読み物にできればと思っています。

とはいえWebにも調査内容をフツーに公開したいので、どんな内容の本になるかという紹介も兼ねて、昨日まとめていたノートオン・ノートオフ命令に関する説明の部分をまるっと公開します。まだドラフトなので最終版は変わるかもしれません。図も今回は仕様書のコピペです。そもそもUMPとは何なのか、MIDI 2.0とは何なのか、みたいな話が無いので読みにくいかもしれませんがそこはご容赦あれ…


ノートオン・ノートオフ命令は、MIDI 1.0のものから何点か機能追加されています。まずはメッセージ構造を見てみましょう。

f:id:atsushieno:20200824151743p:plain
MIDI 2.0ノートオンメッセージのパケット(UMP仕様書より)

note numberの次にattribute typeという見慣れないフィールドがあります。その次はvelocityですが、これはMIDI 1.0の7ビットから16ビットに拡大されています。そして残り16ビットにattribute dataというフィールドが追加されています。

ノートの属性

MIDI 2.0のノート命令で新しいのがこの属性(attribute)です。ノートオン・ノートオフの時点でそのノートにひとつプロパティ値のようなものを指定できます。属性の種類は現時点での仕様では次の3種類のみです。

属性種別 定義
0 なし 値も0が想定されています
1 製造者固有 バイスの製造者(Manufacturer)が意味を定義します
2 プロファイル固有 MIDI-CIプロファイルの策定者が意味を定義します
3 Pitch 7.9 1セント未満の微分音を設定します

製造者固有あるいはプロファイル固有の情報として使うと、いわゆるアーティキュレーションの機能を実現できます。その具体的な効果はMIDIバイスのプログラム(音色)しだいです。MIDI-CIプロファイルは現在具体的な仕様が何一つ存在しないので、現状では無視してよいでしょう。

ピッチ補正

Pitch 7.9というのは、アーティキュレーションとは全く異なる用途になります。これは1セントすなわちMIDIノートの値でいえば1.0(半音階)より小さい値を固定小数点で指定するものです。7.9というのは、整数部分を7ビット、小数部分を9ビットで表現する型であることを意味しています。

MIDI 1.0の時代でも、ピッチ補正を設定できるMIDI音源は存在しました。MMAもMTS(MIDI Tuning Standard)と呼ばれる仕様を策定しており、このシステムエクスクルーシブメッセージを使うとノート別のチューニングを変更できました。

またノート別RPNの3番にはPitch 7.25というより固定小数点精度の高いデータを設定できます。

そして、MIDI 1.0の時代からあるピッチベンドも存在します。ピッチベンドの値の効果は、RPNの0番で規定されているピッチベンド・センシティビティ(感度)の値によって、2セントから24セントまで変わります。MIDI 2.0ではピッチベンドもノート別に指定できるようになっています。

最後に、MIDI 1.0の頃から、RPNの1番と2番にはマスターチューニングというパラメーターが存在します。すべてのノートオンに適用されるピッチ補正です。

ノートのピッチを決定するのに、一体いくつの変数を考慮しなければならないのでしょうか?? MIDI 2.0仕様では、次の任意の組み合わせによって決まる、という説明を加えています。

  • MIDI 1.0と同様のデフォルトピッチ: ノートオンのノート番号
  • ノートオンに継続的に適用されるピッチ補正: MTS, ノート別RPNの3番
  • ノートオンに1度だけ適用されるピッチ補正: ノートオンのPitch 7.9
  • 以上に対して追加で加えられるピッチ補正: マスターチューニング、ノート別ピッチベンド、(チャンネルの)ピッチベンド

もし読者にサンプラーなどを実装する機会があったら、どこかに実装の抜け落ちている部分がないか確認してみましょう。

また、ユーザー(クリエイター)の視点で考えると、これらには他にも利用上の特性の違いがあることがわかります。たとえばPitch 7.9でノートとピッチを指定できるのはノートオンのタイミングのみです。そのノートに対して後からピッチ補正をかけたい場合はノート別ピッチベンド(あるいはピッチベンド)を使うしかありません。

MTSとPitch 7.9の具体的な用途・使い分け

属性種別3を選択した場合、実際に発音される音階はPtch 7.9の7ビット整数部分が示すことになります。このメッセージのnote部分にはそれでは何の意味が残るのかというと、ノートオフやノート別コントロールの対象を示すインデックスとして機能します。そうしないと、同じノート番号で別のPitch 7.9で発音したり、別のノート番号から同じPitch 7.9で消音したりといった謎の状態が生じて混乱することになるでしょう。

そもそもなぜPitch 7.9のような整数値を含むノート構造が必要になるのでしょうか? ファインチューニングしたいだけであれば、小数だけで足りるはずではないでしょうか? …その答えは微分音という音楽表現にあります。

一般的な微分音について説明する前に、もう少し簡単な用例を紹介します。それは純正律と呼ばれるチューニング標準です。

われわれが学校教育等で教わる一般的な音楽理論は12平均律と呼ばれる音階・周波数の配置に基づいています。12平均律の配置は、さまざまなコード(和音)を一定の美しさで聴くことが出来るように最適化された配置です(和音の響きの美しさは各音階がどれだけ離れているか、きれいな比率で倍数になっているか、といった要因で決まります)。

実は、かつては*1純正律と呼ばれる周波数配置に基づいて12音階が定められていました。枝葉末節になるので定義はここでは省略しますが、これは主音が固定された和音を鳴らすとより美しく響き、転調すると美しくないとされています。

作曲家によっては、この純正律をあえて好んで使うので、せっかく機械的に周波数を補正できるのであればそう出来るようにすべき、と考えるのは自然なことでしょう。これがMTSの存在する理由の一つです。もっとも、純正律をサポートするだけであれば、チューニングに整数部分は必要ありません。1セント未満の小さな単位で周波数が補正できれば十分であるはずです。

さて、世の中にはさらに変わった音楽を求めて、12平均律ではないオクターブの分割を探求する人たちがいます。そこでは1オクターブを24分割したり、31分割したり、53分割したりといった実験が行われます。これが微分音(microtonal)といわれるものです。この微分音をDAWMIDIの(互換の)データに基づいて表現しようと思うと、チューニングが小数だけでは足りないのです。1オクターブが24ノートによって成立するとしたら、12ノート目は半オクターブ分しか進んでいないのです。

微分音クリエイターは、表現できるノートの音域を犠牲にしてノートに周波数を割り当てます。この時に使われるのがMTSでした。また、周波数マッピングを任意の数値で可能にするために、Scalaと呼ばれるデータを用いることがあります*2

MIDI 1.0でもMTSで微分音作曲ができていたのであれば、Pitch 7.9は微分音作曲に有意な機能追加となるのでしょうか? その答えは、ピッチ補正は必ずしもコード理論に基づいてノートに対して固定された周波数を適用しなくても使いたい場合がありうる、ということです。MTSやノート別RPNを前提にすると、楽曲の特定箇所の特定のノートだけワンタイムで少しピッチを上下させたい、といった入力は面倒になります。ノート別ピッチを適用することも可能ですが、ピッチベンドは別の目的で使っている可能性もあります。ノートオンに付随して調整できるほうが自然に打ち込めるのです。

アーティキュレーションとノート別コントローラー・NRPNの使い分け

独自の音源ソフトウェアなどを開発している読者であれば、Pitch 7.9ではなく独自のアーティキュレーションとして、何かしらのパラメーターをサポートしたいと読者は考えるかもしれません。しかしひとつ注意してもらいたいのは、属性の値はノートオンのタイミングでしか指定できないということです。現在のMIDI 2.0 UMP仕様では、いったんノートオンを送信した後でそのアーティキュレーションを変更することはできません。

もしパラメーターがノートオンの後でも変更できるようなものにしたい場合は、ノートオンの属性ではなく、ノート別コントローラーやノート別NRPNを活用するとよいでしょう。たとえば歌唱合成ソフトウェアでブレシネス(息の強さ)やオープンネス(口の開き方)などはしばしばアーティキュレーションの類型として説明されますが、もしMIDI 2.0のパラメーターとして実装するのであれば*3、機能によってはノート別コントローラーにしておくほうが無難かもしれません。

ノート別アーティキュレーションはたかだか1つしか指定できない点も注意すべきでしょう。ノート別コントローラーであればいくつでも指定可能です。

ベロシティ0の扱い

MIDI 1.0では、ノートオフメッセージをベロシティ0のノートオンメッセージで代替することが仕様上認められていました。これはMIDI 2.0のノートオンではもはや認められていません。MIDI 2.0でベロシティ0のノートオンメッセージをMIDI 1.0に変換する場合は、ベロシティを1にすべきである、と仕様上明記されています。

逆にMIDI 1.0のノートオンメッセージでベロシティ0のものをMIDI 2.0メッセージに変換する場合については明記されていません。これはノートオフメッセージとして変換することが意図されているのかどうか、対象デバイスを限定しているかどうか等の各種状況に依存するからであろうと筆者は考えています。

MIDIメッセージをサポートするオーディオプラグイン規格によっては、このMIDI 2.0の制約を先んじて規定していたものがあります。Linuxデスクトップで使われているLV2仕様などがそうです。

*1:Wikipediaの記述では、純正律の期限は2世紀に遡るとなっています。平均律は16〜17世紀です。

*2:プログラミング言語Scalaとは全くの別物です。

*3:ここではリアルタイムで歌唱合成できる世界に住んでいると仮定します。