XG音源のSysExエフェクトの読み方、書き方

最初に断っておきますが、ほぼ自分用のメモです。プログラミングには直接関係ないのですが、これに関するプログラムを行う場合には必要な情報です。たとえば、会計プログラムを作るには会計の知識無しには作れないわけで。

---
某DTMグループで以下のような質問しました。
>「質問です。今、YAMAHAのハードXG音源（MUやQY、ポケットミクなど）でSysEXのMIDIイベントを打ち込むときに、それを補助するようなエディターってありますでしょうか？　XGのエフェクターなどを使いたいのですが、その程度のSysEXイベントを手打ちで打ち込むのがしんどそうなので。CuBaseにはあるらしいのですが、ウチはあいにくLogic Proで。イベントだけ生成してそれをコピペで貼り付けるようなエディタでもいいですし、AUとかで用意されているならそれでもいいです。というか、QYみたいに自力完結できないハード音源を使っているかたは今でもXG WORKSとか使っていらっしゃるのでしょうか？」

しかし、コメントもイイネも全くつかなかったので、自分で調べることにしました。（念のため言っておきますが、だからといってそのグループに恨みがあるかとか、失望したとかそういうことは一切ありません。かなりニッチな話題ですし、仕方がないでしょう）
結局、エディタのようなものは見つからなくて、手打ちでダンプリストみたいな呪文を打ち込むしかないようでした。このとき見つかった最も有益な資料は以下です。


YAMAHA | XG READING PAGE - ヤマハ
「Dr.青山のXG解体新書」ともいうようです。
https://jp.yamaha.com/files/download/other_assets/9/321739/read_aoyama.pdf

これの（図4-5）
￼![Pasted Graphic.tiff](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1019283/9d10f176-c91f-1d6f-ba0b-45303d4069d2.tiff)
XGの仕様書だけでこのようなエフェクトを設定するのはなかなか厄介で、この図がなかったら途方に暮れてました。

最初の４行が大事です。後はMIDIイベントが読める人なら普通に読めるかと思いますし、読めなくてもDAWなどを使っている人でしたらなんとなく分かるかと思います。（ちなみに、5,6,7行目は音色切り替えのバンク設定のことで、「Dr.青山のXG解体新書」の最初の方に説明があります）

最初の４行ではValue1列の通り、Delay L.C.R.というエフェクトについて、左チャンネルのディレイを333.3ms、右チャンネルのディレイを0.3ms、これをシステムエフェクトとして設定しています。右の16進数がなぜこれを意味しているのかをこれから説明していきます。

## 1行目
`F0 43 10 4C 02 01 40 05 00 F7`

XG READING PAGEのページには次のようにあります。
「SysEx.では図3-6のアドレスやデータの前と後ろに (F0 43 10 4C) 30 38 02 6D (F7)
のように「F0 43 10 4C」と「F7」を付けます(43 10 4CはXG固有の情報、 F0とF7はSysEx.の始まりと終わりを表わす情報)。」
さらに細かく言うと、SysExは必ず「F0」で始まり、「F7」で終了します。「43」はヤマハのメーカーID、「10」はデバイス番号、「4C」はXGを意味するモデルIDというのだそうです。とにかくXG音源の場合は「F0 43 10 4C」と「F7」をつける、と覚えてしまっていいです。（詳細は省きますが検索すればすぐにわかります）

その先はこちらの検索ページから辿っていきます。（これはヤマハの資料検索で”XG”と打ち込んだだけです。）
https://jp.yamaha.com/products/contents/pianos/downloads/technical_docs/index.html?l=ja&c=&k=XG

これの
XG仕様書V1.35（XG Parameter Change Table）
https://jp.yamaha.com/files/download/other_assets/8/321748/xgparameterchangetable.pdf
を見ます。
<別表3-3>
￼![Pasted Graphic 2.tiff](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1019283/eef9dce2-e119-9ec9-f0e4-f97ab1a1cfd1.tiff)
￼

```
02 01 40  2 00-7F  VARIATION TYPE MSB  XG EFFECT MAP 参照 05(=DELAY L,C,R) 
            00-7F  VARIATION TYPE LSB  00 : basic type 00 
```

なるほど、 02 01 40 というのがバリエーションエフェクトを表す値ということのようです。
そして、そのひとつとして、DELAY L,C,Rがあると。
DELAY L,C,R以外には何があるか、これを見るにはまた別のファイルを開きます。

XG仕様書V1.35（Effect Map）
https://jp.yamaha.com/files/download/other_assets/3/321743/efctmap.pdf
![Pasted Graphic 1.tiff](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1019283/37bc661b-e1d3-5d55-3dae-16eeb4eed04d.tiff)
￼
最初のREVERBとCHORUSはバリエーションエフェクトではなく、次のVARIATION/INSERTION 
という表からです。
￼
「05, 00」ならばDELAY L,C,R、
「06 00」ならばDELAY LR
「01 01」ならばHALL 2
ということですね。
 ここまでの説明で最初の行の意味がわかるかと思います。
`F0 43 10 4C 02 01 40 05 00 F7`

|コード|意味|
|:---|:---|
|F0 43 10 4C|XGの始まり（お約束）|
|02 01 40|バリエーションエフェクトを表す。|
|05 00|DELAY L,C,Rを表す。|
|F7|XGの終了（お約束）|

となります。

2行目
---
`F0 43 10 4C 02 01 42 1A 05 F7`
１行目との違いは「42 1A 05」だけですね。

まず、先ほどの
XG仕様書V1.35（XG Parameter Change Table）
を見ると、
「02 01 42」の部分がひとかたまりで、バリエーションエフェクトのパラメータ１を表しています。
これが何を意味しているのかは、
XG仕様書V1.35（Effect Parameter List）
https://jp.yamaha.com/files/download/other_assets/5/321745/efctparamlist.pdf
￼![Pasted Graphic 3.tiff](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1019283/2b3fab54-2655-ef28-07a2-872b06f7d040.tiff)

ここにあります。この表からパラメタの意味、設定できる値、単位、デフォルト値がわかります。
注意点としては、このパラメタ全てが使えるかどうかはXG音源次第ということです。たとえば、QY70ではDELAY L,C,Rは第５パラメタまでしかありません。

次の「1A 05」はパラメタの値を示しています。このパラメタでは素直に値そのものがパラメタ値となっていますが、たとえば、上の表でいえば、第１３パラメタのEQ Low Frequencyはさらに、table3という別表を探してくることになります。「1A 05」の意味ですが、素直に10進数に変換すると「6661」となり、最初の図4-5の「333.3ms」とは値が合致しません。
これは値が8bitではなく7bitだからのようです。（裏付ける文書は見つかりませんでしたが）
なので、1A(=26) x 128 + 05 = 3333となります。


|コード|意味|
|:---|:---|
|F0 43 10 4C|XGの始まり（お約束）|
|02 01 42|バリエーションエフェクトの第１パラメタを表す。|
|1A 05|パラメタの値：1A(=26) x 128 + 05 = 3333|
|F7|XGの終了（お約束）|

3行目
---
`F0 43 10 4C 02 01 44 0003 F7`
これは簡単ですね。

|コード|意味|
|:---|:---|
|F0 43 10 4C|XGの始まり（お約束）|
|02 01 44|バリエーションエフェクトの第2パラメタを表す。|
|00 03|パラメタの値：0.3msを表す。|
|F7|XGの終了（お約束）|


4行目
---
「F0 43 10 4C 02 01 5A 01 F7」
これは、XG READING PAGEに説明があり通り、「システムエフェクト」を表しています。
エフェクトの使い方として、「インサーションエフェクト」と「システムエフェクト」があります。
「02 01 5A 00」インサーションエフェクト
「02 01 5A 01」システムエフェクト
「インサーションエフェクト」は特定のチャンネルだけに影響を及ぼします。他のチャンネルには一切無関係です。「システムエフェクト」はいわゆるセンドリターンエフェクトのことです。ディレイやリバーブなどを全体で決めておいて、それに対してどれだけエフェクトに配分するかを全てのチャンネルに対して決めます。実は図4-5ではその配分量も図の中にあって、下から２行目の「Variation Send【94】」とのいうのがその値です。実はこれは単なるコントロールチェンジイベント#94です。配分量は、その隣にある　Value 2の【64】となります。

|コード|意味|
|:---|:---|
|F0 43 10 4C|XGの始まり（お約束）|
|02 01 5A|バリエーションエフェクトのパラメタ（インサーションエフェクトかシステムエフェクトかを決定する）|
|01|00: インサーションエフェクト　01: システムエフェクト|
|F7|XGの終了（お約束）|