みどりの工具箱

プログラミングや電子工作について書きます

PSS-A50のMIDIデータ解析

PSS-A50が送信するMIDIデータを解析してみました。

データ取得方法など

Raspberry Pi PicoとTinyUSBを使って受信したデータをシリアル出力しました。

PSS-A50のMIDIデータについては下記のMIDIリファレンスを参考にしています。
https://jp.yamaha.com/files/download/other_assets/6/1282286/pssa50_ja_mr_a0.pdf

送信データ取得

発音

鍵盤を押したときに送られるデータ(16進数)です。音はNo.001(グランドピアノ)ですが、ほかの音でも同じでした。

// ----- タッチレスポンスオフ -----
90 30 50  // 押
90 30 00  // 離

// ----- タッチレスポンスオン(強打)-----
90 30 7f
90 30 00

// ----- タッチレスポンスオン(弱く) -----
90 30 01
90 30 00

MIDIリファレンスによるとノートオフは送受信できず、代わりにベロシティが0になると記載されており、その通りになっています。 タッチレスポンスオフのときは0x50になっていました(0x7fではないのですね)。タッチレスポンスオンのときのベロシティは0x01~0x7fまで出ています。

音色切り替え

// ----- No.04 -> No.01 -----
b0 00 00  // MIDI_CC_BANK_SELECT_MSB
b0 20 00  // MIDI_CC_BANK_SELECT_LSB
c0 00     // MIDI_CV_PROGRAM_CHANGE
b1 00 00  // MIDI_CC_BANK_SELECT_MSB
b1 20 00  // MIDI_CC_BANK_SELECT_LSB
c1 00     // MIDI_CV_PROGRAM_CHANGE
b0 07 64  // MIDI_CC_CHANNEL_VOLUME_MSB
b0 5b 08  // MIDI_CC_EFFECT1_DEPTH
b1 07 64  // MIDI_CC_CHANNEL_VOLUME_MSB
b1 5b 08  // MIDI_CC_EFFECT1_DEPTH

// ----- No.32 -> No.33 -----
b0 00 00  // MIDI_CC_BANK_SELECT_MSB
b0 20 00  // MIDI_CC_BANK_SELECT_LSB
c0 54     // MIDI_CV_PROGRAM_CHANGE
b1 00 00 
b1 20 00 
c1 54
b0 07 46  // MIDI_CC_CHANNEL_VOLUME_MSB
b0 5b 0e  // MIDI_CC_EFFECT1_DEPTH
b1 07 46 
b1 5b 0e

音色切り替えのときは、0chと1chに全く同じデータが送信されています。0chと1chはそれぞれ手弾き音(デフォルトの場合)とアルペジオ演奏(手弾き+1)です。面白いのが、バンクセレクトとプログラムチェンジ以外にエフェクトも送信されています。

この中から音色設定だけ抜き出すと下記のようになります(No.001 グランドピアノの例)。

// No.001 Grand Piano
b0 00 00  // MIDI_CC_BANK_SELECT_MSB
b0 20 00  // MIDI_CC_BANK_SELECT_LSB
c0 00     // MIDI_CV_PROGRAM_CHANGE
b0 07 64  // MIDI_CC_CHANNEL_VOLUME_MSB
b0 5b 08  // MIDI_CC_EFFECT1_DEPTH

録音再生

// ----- 再生 -----
fa   // MIDI_STATUS_SYSREAL_START
b2 78 00   // MIDI_CM_ALL_SOUND_OFF
b3 78 00   // MIDI_CM_ALL_SOUND_OFF
b2 07 5a   // MIDI_CC_CHANNEL_VOLUME_MSB
92 20 50   // MIDI_CV_NOTE_ON > note: 32, vel: 80
b3 07 48   // MIDI_CC_CHANNEL_VOLUME_MSB
93 39 56   // MIDI_CV_NOTE_ON > note: 57, vel: 86
93 24 65   // MIDI_CV_NOTE_ON > note: 36, vel: 101
93 2c 4a   // MIDI_CV_NOTE_ON > note: 44, vel: 74
...

再生開始時には 0xfa が送信されています。その後、2chと3ch(それぞれ録音した手弾き音とアルペジオ演奏)の音が停止されています。再生開始前に各chにボリューム設定が送信されてからノートオンしています。

// ----- 停止 -----
fc   // MIDI_STATUS_SYSREAL_STOP
82 22 00   // MIDI_CV_NOTE_OFF > note: 34, vel: 0
82 2e 00   // MIDI_CV_NOTE_OFF > note: 46, vel: 0
f0 7e 7f 09 01 f7   // MIDI_STATUS_SYSEX (GM SYSTEM ON)

b2 00 00   // MIDI_CC_BANK_SELECT_MSB
b2 20 00   // MIDI_CC_BANK_SELECT_LSB
c2 21      // MIDI_CV_PROGRAM_CHANGE
b2 5b 03   // MIDI_CC_EFFECT1_DEPTH
b2 5d 14   // MIDI_CC_EFFECT3_DEPTH
b2 01 00   // MIDI_CC_MODULATION_MSB
b2 47 40   // MIDI_CC_SOUND_CONTROL2
b2 48 40   // MIDI_CC_SOUND_CONTROL3
b2 49 40   // MIDI_CC_SOUND_CONTROL4
b2 4a 40   // MIDI_CC_SOUND_CONTROL5
b2 05 19   // MIDI_CC_PORTAMENTO_TIME_MSB
b2 41 00   // MIDI_CC_PORTAMENTO
b2 65 00   // MIDI_CC_RPN_MSB
b2 64 00   // MIDI_CC_RPN_LSB
b2 06 02   // MIDI_CC_DATA_ENTRY_MSB (PITCH BEND SENSITIVITY)
b2 65 7f   // MIDI_CC_RPN_MSB (RPN NULL)
b2 64 7f   // MIDI_CC_RPN_LSB (RPN NULL)
e2 00 40   // MIDI_CV_PITCH_WHEEL_CHANGE
f0 43 10 4c 08 02 0c 40 f7   // MIDI_STATUS_SYSEX (VELOCITY SENSE DEPTH)
f0 43 10 4c 08 02 0d 40 f7   // MIDI_STATUS_SYSEX (VELOCITY SENSE OFFSET)

b3 00 7f   // MIDI_CC_BANK_SELECT_MSB
b3 20 00   // MIDI_CC_BANK_SELECT_LSB
c3 00      // MIDI_CV_PROGRAM_CHANGE
b3 5b 15   // MIDI_CC_EFFECT1_DEPTH
b3 5d 00   // MIDI_CC_EFFECT3_DEPTH
b3 01 00   // MIDI_CC_MODULATION_MSB
b3 47 40   // MIDI_CC_SOUND_CONTROL2
b3 48 40   // MIDI_CC_SOUND_CONTROL3
b3 49 40   // MIDI_CC_SOUND_CONTROL4
b3 4a 40   // MIDI_CC_SOUND_CONTROL5
b3 05 19   // MIDI_CC_PORTAMENTO_TIME_MSB
b3 41 00   // MIDI_CC_PORTAMENTO
b3 65 00   // MIDI_CC_RPN_MSB
b3 64 00   // MIDI_CC_RPN_LSB
b3 06 02   // MIDI_CC_DATA_ENTRY_MSB
b3 65 7f   // MIDI_CC_RPN_MSB (RPN NULL)
b3 64 7f   // MIDI_CC_RPN_LSB (RPN NULL)
e3 00 40   // MIDI_CV_PITCH_WHEEL_CHANGE
f0 43 10 4c 08 03 0c 40 f7   // MIDI_STATUS_SYSEX
f0 43 10 4c 08 03 0d 40 f7   // MIDI_STATUS_SYSEX
b2 0b 7f   // MIDI_CC_EXPRESSION_MSB

停止時にはいろいろ送られてきます。長いので3つに区切りました。

最初に停止( 0xfc )が送信された後、ノートオフが送信され(MIDIリファレンスではノートオフ送受信不可になっていたのに...)、 f0 7e 7f 09 01 f7GMシステムオンが送信されています。GMシステムオンはMIDIリファレンスによると、

MIDIマスターチューニングを除くすべてのデータの設定値をデフォルトに戻します

とのことですので、リセットしているのでしょう。

残りの2つのブロックが2ch, 3chそれぞれの音色設定です。
その中に出てくるf0 43 10 4c 08 02 0c 40 f7, f0 43 10 4c 08 02 0d 40 f7PSS-A50のMIDIリファレンスには記載がありません。f0 43 10 4c ... f7 は定型文のようなもの(参考)なので、残りの 08 02 0c 40 のところを見る必要があります。

XG PARAMETER CHANGE TABLE を確認するとどちらもベロシティに関する設定で、08 nn 0CVELOCITY SENSE DEPTH08 nn 0DVELOCITY SENSE OFFSET でした。値は 0x40でデフォルト値に戻しているようです。

- - - - -

この再生と停止の信号を見て、以前作成したRaspberry Pi Picoのサステインペダルを使うと再生音が初回だけおかしくなる理由がわかりました。作ったペダルはPSS-A50が送出したMIDIデータをそのまま送り返しているのですが、再生時は音色設定が行われないので2ch, 3chのデフォルトの音(No.001)で再生されます。停止すると、音色設定が行われるので2回目以降は正しい音で再生されます。なぜ再生時ではなく停止時に送っているのか不思議です。

また、再生後は必ず若干リバーブがかかったピアノ音源(No.001)になっていたのですが、その原因は5行目の f0 7e 7f 09 01 f7GMシステムオン) でした。これをPSS-A50が受信すると、音源がデフォルトのNo.001に変更されます。リバーブのかかった音になるのは、それがデフォルトの音だからだと思います。上で音色変更の際にバンクセレクトとプログラムチェンジ以外のデータが送信されていると記載しましたが、デフォルトの値から変更していたようです。

SUSTAIN

// オン
b0 48 6e    // MIDI_CC_SOUND_CONTROL3 
b1 48 6e    // MIDI_CC_SOUND_CONTROL3 

// オフ
b0 48 40    // MIDI_CC_SOUND_CONTROL3 
b1 48 40    // MIDI_CC_SOUND_CONTROL3 

サステインはコントロールチェンジのダンパーペダル bn 40 xx ではなく、サウンドコントロール3(リリースタイム)で設定されていました。

いくつかの音色で試してみましたが、リリースタイムの設定は0x6e(ON), 0x40(OFF)に固定されているようでした。

PORTAMENTO

// オン
b0 05 19    // MIDI_CC_PORTAMENTO_TIME_MSB 
b1 05 19    // MIDI_CC_PORTAMENTO_TIME_MSB 
b0 41 7f    // MIDI_CC_PORTAMENTO 
b1 41 7f    // MIDI_CC_PORTAMENTO 

// オフ
b0 41 00    // MIDI_CC_PORTAMENTO 
b1 41 00    // MIDI_CC_PORTAMENTO 

オンのときはポルタメントタイムを設定した後にポルタメントをオンしています。

サステインと同様にポルタメントタイムは音色によらず0x19固定のようです。

TUNING

f0 43 10 27 30 00 00 07 0f 00 f7

PSS-A50でチューニングすると上記のようなデータが送信されます。これはMIDIリファレンスの「MIDIマスターチューニング」に書いてある内容と同じでした。

MIDI OUT CHANNEL

// ch0 -> ch1(表示上は ch1 -> ch2)
b0 7b 00    // MIDI_CM_ALL_NOTE_OFF
b0 78 00    // MIDI_CM_ALL_SOUND_OFF 
b0 79 00    // MIDI_CM_RESET_ALL_CONTROLLER 
b1 7b 00    // 以下、chが異なるだけ
b1 78 00
b1 79 00
b2 7b 00
b2 78 00
b2 79 00
b3 7b 00
b3 78 00
b3 79 00

ch1->ch2にすると、0xbn のnの部分が+1変化しました。

PHRASE VOLUME

b2 07 36    // MIDI_CC_CHANNEL_VOLUME_MSB 
b3 07 2b    // MIDI_CC_CHANNEL_VOLUME_MSB 

録音した手引き音(デフォルト:2ch)とアルペジオ演奏(デフォルト:3ch)の音量設定が変更されています。2ch, 3chで設定される音量が違うようです。

常時送信されているもの

fe    // アクティブセンシング
f8    // MIDIクロック

ここまで記載したデータは上の2つを省いたものです。これらは常時送信されていました。

変化しないもの

下記はPSS-A50を操作してもデータは送信されませんでした。

  • MASTER VOLUME
  • CONTROL CHANGE
  • PROGRAM CHANGE
  • LOCAL CONTROL
  • TRANSPOSE
  • METRONOME
  • TOUCH RESPONSE
  • OCTAVE

ここまでで記載していないのはMOTION EFFECTですが、種類が多くて全部見るのは大変なので省きます。ちなみに動作としては、コントロールチェンジが連続で送られてきていました。

(おまけ)使用できる設定一覧

PSS-A50に送信できる値の一覧を作成しました(PSS-A50が送信するデータとは若干異なります)。内容はMIDIリファレンスそのままです。エクスクルーシブは録音再生でMIDIリファレンスに載っていないデータが送信されていたので、もしかするといろいろ設定できるのかもしれません。

// コントロールチェンジ(nはチャンネル番号)
bn 01 xx  // MIDI_CC_MODULATION  (モジュレーション)
bn 05 xx  // MIDI_CC_PORTAMENTO_TIME (ポルタメントタイム)
bn 07 xx  // MIDI_CC_CHANNEL_VOLUME_MSB (チャンネルボリュームMSB)
bn 0b xx  // MIDI_CC_EXPRESSION_MSB (エクスプレッションMSB)
bn 06 xx  // MIDI_CC_DATA_ENTRY_MSB (データエントリーMSB)
bn 26 xx  // MIDI_CC_DATA_ENTRY_LSB (データエントリーLSB)
bn 40 xx  // MIDI_CC_DAMPER_PEDAL (サステイン)
bn 41 xx  // MIDI_CC_PORTAMENTO (ポルタメント)
bn 47 xx  // MIDI_CC_SOUND_CONTROL2 (ティンバー/ハーモニックインテンス)
bn 48 xx  // MIDI_CC_SOUND_CONTROL3 (リリースタイム)
bn 49 xx  // MIDI_CC_SOUND_CONTROL4 (アタックタイム)
bn 4a xx  // MIDI_CC_SOUND_CONTROL5 (ブライトネス)
bn 5b xx  // MIDI_CC_EFFECT1_DEPTH (リバーブ)
bn 5d xx  // MIDI_CC_EFFECT3_DEPTH (コーラス)
bn 60     // MIDI_CC_DATA_INCREMENT
bn 61     // MIDI_CC_DATA_DECREMENT
bn 64 xx  // MIDI_RPN_LSB
bn 65 xx  // MIDI_RPN_MSB

// その他(nはチャンネル番号)
bn 78 00  // MIDI_CM_ALL_SOUND_OFF (オールサウンドオフ)
bn 7e xx  // ↑と同じ
bn 7f xx  // ↑と同じ
bn 79 00  // MIDI_CM_RESET_ALL_CONTROLLER (リセットオールコントロール)
bn 7a xx  // MIDI_CM_LOCAL_CONTROL (ローカルコントロール)
bn 7b 00  // MIDI_CM_ALL_NOTE_OFF (オールノートオフ)
bn 7c 00  // ↑と同じ
bn 7d 00  // ↑と同じ
cn xx     // プログラムチェンジ
fe        // MIDI_ACTIVE_SENSING (アクティブセンシング)

// エクスクルーシブ
f0 7e 7f 09 01 f7  // GMシステムオン(デフォルトに戻す)
f0 7f 7f 04 01 ll mm f7  // MIDIマスターボリューム(ll: 無視, mm: 値)
f0 43 1n 27 30 00 00 mm ll cc f7  // MIDIマスターチューニング(mm, ll: マスターチューニング値, n, cc: 任意)
f0 43 10 4c 08 nn 0c mm f7  // VELOCITY SENSE DEPTH(nn: チャンネル, mm: 値)
f0 43 10 4c 08 nn 0d mm f7  // VELOCITY SENSE OFFSET(nn: チャンネル, mm: 値)
etc...?

おわりに

以前作成したペダルでは、送信されたデータをそのまま送り返す処理のせいでおかしな挙動をしているのかと思っていましたが、そういうわけではなさそうだということがわかり一安心です。
思ったよりいろいろな値が設定できるので、音色を変えて遊ぶのも面白そうだと思いました。

参考リンク

PSS-A50 MIDIリファレンス
https://jp.yamaha.com/files/download/other_assets/6/1282286/pssa50_ja_mr_a0.pdf XG PARAMETER CHANGE TABLE
https://jp.yamaha.com/files/download/other_assets/8/321748/xgparameterchangetable.pdf
XG音源のSysExエフェクトの読み方、書き方
https://qiita.com/natto21/items/569f9e6c5baa3359aa92
MIDIメッセージ一覧
https://www.g200kg.com/jp/docs/tech/midi.html
MIDIコントロールチェンジ一覧
https://www.g200kg.com/jp/docs/tech/controlchange.html
前回の記事(Picoを使ってPSS-A50にサステインペダルを付けてみた)
https://ym0268.hatenablog.com/entry/pico_midi_pedal