読者です 読者をやめる 読者になる 読者になる

すこしふしぎ.

VR/HI系院生による技術ブログ.まったりいきましょ.(友人ズとブログリレー中.さぼったら焼肉おごらなきゃいけない)

midi規格についてもう少ししらべた

midi

前回の記事で調べた知識をもとにサンプルプログラムを読み解こうとするも, 途中でよくわからない命令群に出会ってしまった.

どうやらこれはエクスクルーシブメッセージと呼ばれる種類のシステムメッセージらしい, 今回は,前回の補足としてエクスクルーシブメッセージについて調べまとめる.

いんとろ

よくわからない部分はこんな感じ.

(中略)
//lylic send
void lylic_send(int num){
  Serial.write(0xF0);
  Serial.write(0x43);
  Serial.write(0x79);
  Serial.write(0x09);
  Serial.write(0x00);
  Serial.write(0x50);
  Serial.write(0x10); 

  for(int i=0;i<num;i++){
    if(i != 0) Serial.write(0x2c); 
    Serial.write(phoneticSymbols[lylics[i]]);
  }
  
  Serial.write(0x00); 
  Serial.write(0xF7); 
}

前回の知識では「ステータスバイト1つ」と「データバイト1〜2つ」で命令が構成されていた. 例えば"80 3c 7f"は

  • [ノートオン@ch0(80)]
  • [音程:C3(3c=60のノートナンバー)]
  • [強さ:127(7f=127)]

という感じ. しかしこの部分ではひたすらシリアルでデータを送っている. はじめに送るのがF0hで,以降はすべて80h以下. 80h以下ということはすべてデータバイトであるはず. データバイトがかなり大量にあるのかな..?

どうもこの形式はF0から始まる命令群に特有のもののよう.

ふくしゅう:ステータスバイトの種類

いったんステータスバイトの種類を復習する.

byte event
8n ノートオフ
9n ノートオン
An ポリフォニックキープレッシャ
Bn コントロールチェンジ
Cn プログラムチェンジ
Dn チャンネルプレッシャ
En ピッチベンドチェンジ
Fn システムメッセージ

8n~Enにおけるnはチャンネルナンバー.システムメッセージはチャンネルに寄らず,nによりメッセージ内容を表現できる. システムメッセージの種類は以下.

byte event
F0 エクスクルーシブメッセージ
F1 midiタイムコード
F2 ソングポジションポインタ
F3 ソングセレクト
F4 -
F5 -
F6 チューンリクエスト
F7 エンドオブエクスクルーシブ
F8 タイミングクロック
F9 -
FA スタート
FB コンティニュー
FC ストップ
FD -
FE アクティブセンシング
FF システムリセット

参考にしたのはこちら .-は未定義で使われていないメッセージらしい.

今回のメッセージはF0から始まるエクスクルーシブメッセージというものになる.

エクスクルーシブメッセージとは

とりあえずwikiから引用.

システムエクスクルーシブメッセージ(Sys-Ex、またはSysExと略記し、シスイーエックスと読む場合もある)は、MIDI機器のより細かい設定を行ったり、音色データやサンプリングデータを送受信するなど、各メーカーのMIDI機器の固有のデータのやりとりに使用できるシステムメッセージである。ステータスバイトF0Hで始まる。 MIDIメッセージは大抵2バイト程度のデータバイトで成り立つが、SysExはMIDIメッセージ中、唯一データバイト長が指定されていない。可変長のため、最後にシステムコモンメッセージとして定義されているF7H エンドオブエクスクルーシブ (EOX) を送信することでSysExの終了を表現する。

データ長が可変だから,今までみたメッセージとは異なった感じになるのか. 確かに[F0]ではじまって[F7]で終了している.

存在意義としては,様々な機材で特有の命令を用意するための規格,というところかな. だから,対応していないメッセージを送られると解釈できないことも起こりえる. リファレンスをきちんと見て送信データを生成することが大切である.

今回の場合

今回の命令はどのような意味を持っているのか,実際にリファレンスを見てみる. yamahaの公式リファレンスシートではp5~p8がSysExのページになっていた.

送信していたデータはこんな感じ.

F0 43 79 09 00 50 10 [2C [歌詞番号]] 00 F7

F0がスタート,F7が終了なので,これ全部で一つの命令になってる. []でくくった部分はfor文で繰り返されていた. なんとまぁ長い命令.. (命令フォーマットが似ているので対象を探し当てるのにちょっと苦労しそうw

レファレンスでみつかったのがこれ.

f:id:ism1000ch:20131205212736p:plain

どうやらeVocaloid用の専用メッセージのよう. まさに先述した機器特有のメッセージということだ. phonetic symbolsとは発音記号のことで,「どのような歌詞をで歌わせるか」の命令というイメージでよいだろう.

データ構成は,F0 43 79 09 00 50までがPhonetic symbolsの命令開始を表し,1mで歌詞追加モード選択,ddで発音記号のリストを追加していく.データを追加し終わったらF7でSysExを終了する.

発音記号追加のルールは以下.

  • ASCIIコードで発音記号を表記(資料末に対応表有り)
  • 発音記号を組み合わせるときはスペース(0x20)を挟む
  • 次の文字に移るときはコンマ(0x2C)を挟む
  • リスト終了時はNULL(0x00)を付与
  • eVocaloidは128個の発音記号を保持できる
  • リストは全体で128バイト以下にする

例としてのってるのはこんな感じ.

ex.) o,h[SP]a,j[SP]o[NUL]

これだと「おはよう」としゃべる準備ができるということかな. ここに更に音程を加えていくとeVocaloidとして歌わせることができるのではないだろうか.

まとめ

midi規格におけるシステムエクスクルーシブの意味,NSX-1におけるPhonetic Symbols SysExのデータ構成をまとめた. これでサンプルプログラムを理解できるようになるはず!