ポケット・ミク(NSX-39)のSysExメモ

ポケット・ミク(ポケミク,NSX-39)のシステムエクスクルーシブ(SysEx)メッセージに関するメモ

はじめに

この記事はポケミクをカスタマイズするために必要な知識のうち,公式のカスタマイズガイドで十分に解説されていない部分を補うことを目的としている.読み進めるためには最低限2進数,10進数,16進数の関係を理解している必要がある.

送受信データは基本的に16進数で表記し,本文中において10進数と明確に区別すべきときを除いて,0x00や00Hのような16進数であることを主張する表記は省略することがある.A-Fの英字は10-15を意味する.データ列では可読性のために1byte(2桁)毎にアンダーバーで区切る.コマンドは4byteを基本単位としているので,4byte毎に改行して行末にそのデータ内容のコメントを付すことがある.
2進数は先頭に0bをつけて0b00000000のように表現する.
また,区別するために10進数を0d99のように表記することがある.

記事の内容について不明な点や誤りが疑われる場合,表現が適切でないと感じたときは些細な事でもコメントを頂けると助かります.

 

ポケミクとSysEx

SysExとは

ポケミクはUSB接続でPCやMIDI機器と接続して通信することができる.MIDI規格で信号のやり取りをし,ポケミクを電子楽器としてPCから音を鳴らしたり,ポケミクの鍵盤操作を外部機器で監視したりすることができる.これらはMIDI機器共通の規格のMIDIメッセージでやりとりされるが,これとは別に機器固有のメッセージを扱うシステムエクスクルーシブメッセージ(以下SysEx)という規格があり,特にポケミクにおいてはこのSysExを使うことでポテンシャルを高く引き出すことができる.

 

なぜポケミクでSysExが必要なのか

ポケミク単体では鍵盤のタッチによる演奏,プリセット歌詞を使った発声など,ハードウェア的な制約により使用範囲が非常に狭い.DTMユーザーであれば発声チャンネルを備えたMIDI機器としての利用価値を見出せるが,DTMをやらないユーザーにとっては猫に小判で,内蔵する高性能LSI NSX-1 のごく限られた機能をペンによって動作させているにすぎない.
ポケミク購入者の多くは,初音ミクの声を思い通りに操ったり,ボタンをカスタマイズしてあらかじめ入力したフレーズを話したり,楽器の音色を織り交ぜて愉快なポケミク生活を期待していたのではないかと思う.これらはSysExによるカスタマイズにより初めて実現する機能であり,ポケミクを活用するにはこれを避けて通ることはできない.
※ DTM(デスクトップミュージック):コンピュータ上での楽曲製作

 

どのようにSysExを使うのか

YAMAHA公式などによって公開されているChromeを使ったWeb MIDI APIを利用したアプリのほか,メッセージのやりとりはDAW,あるいはDominoなどのフリーのMIDIアプリでも可能である.プログラミングができるのであればPythonVisualBASICC++(windowsAPI),C#JavaなどでUSB-MIDI機器と通信するシステムの開発が可能である.
※ DAW(デジタルオーディオワークステーション):DTMのツールソフト

 

SysExでポケミクをカスタマイズする

カスタマイズをリセットしたい/動作が不安定になった/失敗したとき

カスタマイズに失敗すると発した音が消えなくなったり,予期せぬ動作をするようになる.その場合はボタンの「SHIFT」「▲」「▼」を同時に長押し(カウントダウン後の効果音が消えるまで)することで工場出荷時の状態にリセット(イニシャライズ)できる.リセット範囲はコマンドスロット(ボタンを含む)の内容,歌詞の内容など全てである.この動作はユーザーが書き換えできないようになっている.
何かの処理中に別の操作をすると音が消えなくなることがあるが,これは「A」「▲」「▼」を同時押しすることでMIDIリセット(パニック)ができる.この動作で内蔵のNSX-1をリセットする.全てのチャンネルの状態がリセットされ,GMの音色を変更していた場合は音色も初期化される.ボタンのカスタマイズはリセットされない.この動作は書き換えができるが,推奨しない.なお,鍵盤のタッチで消音できるのはch1(ボーカロイド)のみである.
また,「SHIFT」「▲」「▼」による工場出荷状態へのリセット動作は無音時にのみ有効であり,発声中などにコマンドを実行しようとしても呼び出せない.何らかの弾みでNOTE ON(発音)した後NOTE OFF(消音)しなかった場合,(音量に関わらず)システム的に発音状態となっている場合もこれに該当する.電源を入れ直したり,「A」「▲」「▼」によるパニックによって強制的に消音して対応できる.

 

SysExのきまり

ポケミクとの通信における全てのSysExは
F0_43_79_09_11_[送受信データ]_F7
で表現される.
送信データ量は(送信データ + 6byte).

送信データを送信する順に1byte毎に[d0_d1_d2_..._dn]と呼ぶことにする.これにより.F0_43_79_09_11_[d0_d1_d2_..._dn]_F7
のように送信データを構成する.

SysExによりポケミクへの歌詞入力,コマンドの直接実行,コマンドスロットへのコマンド登録などができる.

MIDIメッセージは各バイトの先頭ビットをステータスバイトとデータバイトの識別に使うので,データバイトは先頭ビットを0にし,00-7Fの7bitをデータ領域として使用する.コマンドの送受信は4byteを基本単位として行われるが,各バイトの先頭を0にするため実質データ量は7bit*4の28bit分である.

 

コマンド動作とその他の動作

SysExなどによってコマンド動作をしているとき,並行して別のコマンドを動かすことはできない.コマンド動作をしているとき,並行してMIDI入力などにより音を鳴らすことができる.コマンド動作をしているときに鍵盤を使って音を鳴らしたり,鍵盤で音を鳴らしているときコマンド動作を始めることができる(ただし,鍵盤をタッチしたとき・離したときに呼び出されるコマンドスロットに時限バッファを停止するコマンドやその他の動作をするコマンドが登録されているため,後述する方法で内容を空にする必要がある).

 

コマンドスロット

ポケミクには後述する方法でコマンドを登録できる,コマンドスロットという不揮発性のメモリ領域が用意されている.一旦書き換えたコマンドスロットの内容は電源を切っても持続し,次回以降の起動においても有効である.

 

物理ボタン

ポケミクには9つの物理ボタンがある.これらの操作はコマンドスロットの呼び出しに対応しており,カスタマイズガイドではそれぞれに通し番号を付して次のように扱われている.
SW1:「A」,SW2:「I」,SW3:「U」,SW4:「E」,SW5:「O」,
SW6:「VIBRATO」,SW7:「SHIFT」,
SW8:「VOL UP」,SW9:「VOL DOWN」

また,物理ボタンの操作によるコマンドスロットの呼び出しタイミングは
「何も押されていない状態からボタンを押したとき(単独で押した)」
「別のスイッチ状態へ移ったとき(ボタンを離した・更に違うボタンを押した)」
「押されているスイッチ数が増えたとき(特定の組み合わせのボタンを押した)」
「押されているスイッチ数が増えたとき(押しているスイッチの合計数が増えた)」
「押されているスイッチ数が減ったとき(押しているスイッチの合計数が減った)」
に大別される.

 

ポケミクのカスタマイズ

簡単なカスタマイズ

歌詞データの入力

送信データの先頭バイトd0を歌詞データの入力を意味する0A,d1を歌詞スロット番号(00-0F)とし,d2以降を文字指定データとする.例えば「はつねみく」を歌詞スロット5(05)に入力するとき,「は=47」「つ=3C」「ね=42」「み=65」「く=07」と変換し,送信データは
[0A_05_47_3C_42_65_07]
とする.送信するSysExのデータ列は
F0_43_79_09_11_0A_05_47_3C_42_65_07_F7
となる.
歌詞スロット5はデフォルト状態ではハードボタンの「O」を単体で押すことで選択状態になる.

歌詞データはユーザーズマニュアル裏表紙などにある文字テーブルリストに準拠する.

 

コマンドを外部から直接実行する

あらかじめ定められているコマンドを呼び出すことでNSX-39を外部から操作することができる.
コマンドを外部から直接実行するには送信データのd0を0Dとし,続いて4byte単位で実行したいコマンドを入力する.コマンドは表記した順に連続で実行され,最大255コマンドを同時に送信できる.例えばコマンドを3つ送信するとして,順に[08_08_00_00][09_04_00_42][08_09_28_00] とすると,送信するデータ列は
F0_43_79_09_11_0D_08_08_00_00_09_04_00_42_08_09_28_00_F7
となる.このデータ列を送ると直ちに「ね」を発声し,何らかの操作によって消音するまで発声しつづける.

 

コマンドをコマンドスロットに登録する

コマンドは外部からの通信で直ちに動作させるほかに,内蔵するメモリーにコマンドを登録して物理ボタンと連動して呼び出すなどの動作が可能である.
コマンドを登録する領域の事をコマンドスロットと呼ぶ.コマンドスロットは0x00~0x7Fの128個あり,そのうちユーザーが書換え可能なスロットは0x00~0x77の120個,書換え不可能なスロットは0x78~0x7Fの8個である.また,0x60~0x77の24個と0x25,0x28,0x2Fの合計27個のスロットは物理ボタンの操作や初期状態においてほかのコマンドスロットから呼び出されることがないスロットであり,書換えても通常操作の動作に影響なく利用できる.
コマンドをコマンドスロットに登録するには送信データのd0を0Cとし,次にコマンドスロット番号をd1で指定し,続いて4byte単位で実行したいコマンドを入力する.登録するコマンドについては外部からの直接実行の場合とほとんど同様である.最大255コマンドまで登録できる.例えば,コマンドスロット0x0Fにコマンドを3つ登録するとして,順に[08_08_00_00][09_04_00_0B][08_09_20_00]とすると,送信するデータ列は
F0_43_79_09_11_0C_0F_08_08_00_00_09_04_00_0B_08_09_20_00_F7
となる.このデータ列を送ると物理ボタンの「O」を押したときに「ぎ」を発声し,消音するまで発声し続ける.

 

コマンドスロットを初期化する

特定のコマンドスロットを(工場出荷状態に)初期化するには登録コマンドを入力せずにデータ列を送る.
例えばコマンドスロット0x0Fを初期化するとき,送信するデータ列はd0をコマンドスロットへの登録を示す0Cとし,次にコマンドスロット番号0Fを入力して登録コマンドは入力しない.送信するデータ列は
F0_43_79_09_11_0C_0F_F7
とする.物理ボタンの「O」を押すと歌詞「お」を発音する動作に戻る.

 

コマンドスロットの登録内容を請求する

コマンドスロットに登録されているコマンドを調べることができる.
コマンドスロットの内容を調べるとき,送信するデータ列のd0を0Bとし,d1にコマンドスロット番号を入力する.
例えばコマンドスロット0x7Eの内容を調べるとき,送信するデータ列のd0を0Bとし,d1にコマンドスロット番号7Eを入力する.送信するデータ列は
F0_43_79_09_11_0B_7E_F7
となる.データ列を送信すると内容が返答フォーマットに従って直ちに返される.コマンドスロット内容の返答については次の項目で解説する.

 

コマンドスロットの返答内容を解析する

コマンドスロットの内容を請求した際,登録されたコマンド列を1byte毎に[c0_c1_c2_..._cn]としたとき受信するデータ列は
F0_43_79_09_11_1B_[c0_c1_c2_..._cn]_F7
となる.データ内容にコマンドスロット番号は含まれない.
また,コマンドスロットの内容のコマンド数が10を超える場合は10コマンド毎に分割され,例えばコマンド数が26(104byte)のとき
F0_43_79_09_11_1B_[c0_c1_c2_..._c39]_F7
F0_43_79_09_11_1B_[c40_c41_c42_..._c79]_F7
F0_43_79_09_11_1B_[c80_c81_c82_..._c103]_F7
のようになり,全てのコマンド内容を返答するまで連続して送信される.
実際にコマンドスロット番号0x7Eの内容は次のように返される.
F0_43_79_09_11_1B_0C_02_00_00_0D_00_00_01_09_04_00_42_08_09_28_00_0D_00_00_3C_09_04_00_0B_08_01_00_00_0D_00_00_3C_08_08_00_00_07_00_00_40_F7
F0_43_79_09_11_1B_0C_04_00_00_08_08_00_00_07_00_00_40_0C_03_01_0A_F7

蛇足だが,ホストのシステムによってはひとつのMIDI機器についてMIDI-OUT機器とMIDI-IN機器を別々に開くことがある.

 

複雑なカスタマイズ

1ch(eVocaloid)以外のGM音源の利用

SysExで直接操作できるチャンネルは1chのeVocaloid音源に限られる.2ch~16chを外部から操作するにはMIDIメッセージを送受信するか,MIDIメッセージをSysExメッセージに変換して取り扱う.コマンドスロットにはMIDIメッセージを登録できないため,その場合はSysExメッセージにする必要がある.

10ch以外の2ch~16ch(0x01~0x0F)にはGM音源として128種類の音色が用意されており,一般的に1番から128番まで番号が振られているが,プログラムチェンジで取り扱う場合は0番(0x00)から127番(0x7F)となるため,データの中で表現するときは番号から1を引いた値を使う.0番がAcostic Grand Pianoで,127番がGun Shotである.

10ch(0x09)はパーカッションのために予約されており音色の書き換えができない.ドラムマップはYAMAHAXG規格.ノート番号は13(0x0d)~84(0x54)が有効で,73(0x49)はリセット時などに発する音である.

 

SysExメッセージによるMIDIメッセージの送受信

MIDIメッセージをSysExメッセージでポケミクへ送信するコマンドはDIRECT_MIDI_1,2,3である.MIDIメッセージが送信データ1byteを8bit分全て使うのに対し,SysExメッセージでは各バイトの先頭ビットが予約されているので1byteを7bit分しか利用できない.MIDIメッセージ1~3byteの内容bitを構成しなおして4byteのSysExコマンドに変換する.以下のように変換し,2byte以下の場合は区別するために一部のbitをHIGHにする(下の例では*印がHIGHにされたbit).また,USBホストへMIDIメッセージを送信する場合は更にSysExメッセージの最初のバイトの第4bitがHIGHにされる(下の例では#印がHIGHにされるbit).

3byte(DIRECT_MIDI(_OUT)_3)
0b00000000 11111111 22222222 33333333
0b000#0111 01111122 02222223 03333333
2byte(DIRECT_MIDI(_OUT)_2)
0b00000000 00000000 22222222 33333333
0b000#**** 00000022 02222223 03333333
1byte(DIRECT_MIDI(_OUT)_1)
0b00000000 00000000 00000000 33333333
0b000#**** 000*0000 00000003 03333333

 

カッココマンドによる条件分岐

カッココマンドを利用する事でコマンドを入れ子構造にし,簡単な条件分岐ができる.ただし条件分岐は限定的で,時限バッファのコマンドの有無,発音中の如何を判定する4通りの分岐処理しかできない.時限バッファについては後述するカッココマンド時限バッファで触れる.
コマンド列のうち,CACCO_START[0C_02_00_00]CACCO_END[0C_03_00_0n]に挟まれたコマンド列についてCACCO_ENDの最終byteの下位4bitで指定された条件に合致する場合にその挟まれたコマンドが実行される.条件は次の通り.

0b00000001 時限バッファにコマンドがあり,かつ発音中
0b00000010 時限バッファにコマンドがあり,かつ無音
0b00000100 時限バッファにコマンドがなく,かつ発音中
0b00001000 時限バッファにコマンドがなく,かつ無音
上記のbitを組み合わせ,時限バッファにコマンドがある場合に有効とするには最終byteを0x03,コマンドがない場合には0x0C,発音中には0x05,無音時には0x0A,全ての状態で有効とするには0x0Fとする.

 

カッココマンド時限バッファ

先述のカッココマンドを拡張し,遅延処理を可能にする.これにより指定した時間間隔をおいて順にコマンドを実行するなどの処理が可能となる.
コマンド列のうち,CACCO_START[0C_02_00_00](通常のカッココマンドと同じ)とCACCO_END_TIME[0C_03_01_0n]に挟まれたコマンド列についてCACCO_END_TIMEで指定された条件に合致する場合にその挟まれたコマンドが「時限バッファ」または「時限終了バッファ」に格納される.時限バッファは直ちに実行される.時限終了バッファはカッココマンド中でTIME_TAIL[0C_04_00_00]より後ろに記述されたコマンドについて,時限バッファの処理が全て完了する前に「時限バッファが破棄」された場合に呼び出され実行される.時限バッファが破棄されず全て完了すると時限終了バッファは破棄される.
cmdA,cmdB,cmdC,cmdDをコマンドとして

CACCO_START~cmdA~cmdB~CACCO_END_TIME
cmdA,cmdBが時限バッファに格納される.

CACCO_STARTTIME_TAIL~cmdA~cmdBCACCO_END_TIME
cmdA,cmdBは時限終了バッファに格納されるが,時限バッファの処理が直ちに完了するので時限終了バッファは速やかに破棄される.

CACCO_START~cmdA~cmdBTIME_TAIL~cmdC~cmdD~CACCO_END_TIME
cmdA,cmdBは時限バッファに格納され,cmdC,cmdDは時限終了バッファに格納される.cmdA,cmdBの処理が完了した場合,時限終了バッファは実行されず破棄され,cmdA,cmdBの処理が完了しないまま時限バッファが破棄されると,時限終了バッファが呼び出されてcmdC,cmdDが実行される.

 

コマンドの遅延処理

時限バッファに格納されたコマンド列においてTIME_WAITコマンドがある場合,TIME_WAITコマンドで指定された時間だけコマンドの実行が停止する(音声出力には影響しない).
TIME_WAITコマンドは[0D_nn_nn_nn]で構成され,nnの部分に任意の遅延時間を入力する.遅延時間は2[ms]単位である(約1000msを指定したい場合はデータを500とする).コマンドには3byte分のデータ領域があるが,各byteの先頭bitは予約されているためビットシフトして3*7bitが実質のデータ領域となる.そのため0(0x000000)~2097151(0x1FFFFF)が入力できる(大きい数値については動作未確認).

ビットシフトは以下のようになる.
0b00011111 22222222 33333333
0b01111122 02222223 03333333

1000[ms]を指定するとき,データは500(0x00_01_F4=0b00000001 11110100)なので,ビットシフトして0b00000011 01110100を入力する.コマンドにすると[0D_00_03_74]である.

また,外部からの命令でコマンドスロットや歌詞スロットなどのメモリの書換えが発生すると書換えの動作が優先され,遅延処理を含むコマンド処理のプロセスが一旦停止する.これは数百ms程度だが十分体感できる程度に影響する.

 

コマンドスロットの再帰的呼び出し

ポケミクのコマンドではC言語で言うwhile文のように同じ処理を繰り返し行うコマンドが用意されていない.繰り返し処理を行いたい場合は次のようにコマンドの使い方を工夫する.
例えばボタン(SHIFT+A)を押したときにパーカッションを一定間隔で鳴らしたい場合,楽器を鳴らした後に時限バッファコマンドを使って一定時間処理を遅延させ,同じコマンドスロットを再帰的に呼び出すことで繰り返し処理を実現できる.F0_43_79_09_11_0C_1F_0C_02_00_00_04_64_2E_7F_0D_00_01_7A_0A_48_00_1F_0C_03_01_0F_F7

0C_1F //sw7+sw1(shift+A)押下時(0x1F)のコマンド書き換え
_0C_02_00_00 //CACCO_START
_04_64_2E_7F //MIDI_DIRECT(0x99, 0x17, 0x7F) //0x17:Seq Click L
_0D_00_01_7A //TIME_WAIT (250)
_0A_48_00_1F //コマンドスロット0x1Fの再帰的呼び出し
_0C_03_01_0F //CACCO_END_TIME

このコマンドスロットを呼び出すと250(500ms)毎に電子音が鳴る.
ただし,このコマンドスロット(0x1F)の書き換えだけでは呼び出しボタンのリリース時に時限コマンドを停止する処理がされるので,時限終了バッファにてそれを回避するコマンドを設定するか,リリース時に何も処理をしないように該当コマンドスロットの内容を変更する必要がある.
なお,この方法はコマンドスロットへの書き込みが必要であり,外部機器からコマンドの直接入力では実現できない方法である.

 

コマンドスロットを空にする

呼び出し時に何もコマンドを実行しないためにはコマンドスロットを空にする必要がある.実際にはコマンドスロットの内容にEND_SLOT[0C_01_00_00](コマンドスロットの終了)のみを書き込む事で実現する.例えばコマンドスロット0x29を初期化するとき,送信するデータ列はd0をコマンドスロットへの登録を示す0Cとし,次にコマンドスロット番号29を入力して登録コマンドにEND_SLOTを入力する.送信するデータ列は
F0_43_79_09_11_0C_29_0C_01_00_00_F7

0C_29 //sw7+sw1(shift+A)リリース時(0x29)のコマンド書き換え
_0C_01_00_00 //END_SLOT(何も処理をしない:時限バッファを削除しない)

 

 

その他

バージョン情報の問い合わせ

ポケミクのバージョン情報を問い合わせる事ができる.

_send
f0h 43h 79h 09h 11h 01h f7h

_receive
f0h 43h 79h 09h 11h
11h
00h 01h 00h 02h
02h 05h 02h 00h
f7h

 

プリセットコマンドの内容請求

ポケミク(nsx-39)へコマンドスロットの内容を請求して得られた返答を解析する.

_send

f0h 43h 79h 09h 11h 0bh 00h f7h
(0x00:「NSX1起動後すぐ.またはCMD_MIDI_RESET実行時」)

_receive

f0h 43h 79h 09h 11h 1bh 0ah 08h 01h 00h 0ah 06h 00h 00h f7h

 

_send

f0h 43h 79h 09h 11h 0bh 01h f7h
(0x01:「NSX39起動後USB電源が確認できる場合」)

_receive
f0h 43h 79h 09h 11h
1bh
0ch 02h 00h 00h CACCO_STARTカッコスタート
0dh 00h 00h 06h TIME_WAIT(0x00 0x00 0x06)
09h 04h 00h 06h MOJI_SEL(0x06:「き」)
08h 09h 28h 00h NOTE_ON(0x28 0x00)
0dh 00h 00h 3ch TIME_WAIT(0x00_00_3C:(0d60:120ms))
09h 04h 00h 32h MOJI_SEL(0x32:「ど」)
08h 01h 00h 00h REVOICE
0dh 00h 00h 3ch TIME_WAIT
09h 04h 00h 02h MOJI_SEL(0x02:「う」)
08h 01h 00h 00h REVOICE
f7h

f0h 43h 79h 09h 11h
1bh
0dh 00h 00h 3ch TIME_WAIT
09h 04h 00h 20h MOJI_SEL
08h 01h 00h 00h REVOICE
0dh 00h 00h 3ch TIME_WAIT
09h 04h 00h 64h MOJI_SEL
08h 01h 00h 00h REVOICE
0dh 00h 00h 3ch TIME_WAIT
09h 04h 00h 20h M
08h 01h 00h 00h R
0dh 00h 00h 3ch T
f7h

f0h 43h 79h 09h 11h
1bh
09h 04h 00h 29h MOJI_SEL(0x29:「た」)
08h 01h 00h 00h R
0dh 00h 00h 3ch T
08h 08h 00h 00h NOTEOFF
0ah 48h 00h 1eh SLOT_EXE(0x1e)
07h 00h 00h 40h DIRECT_MIDI_3(0xE0 00 40)
0ch 04h 00h 00h TIME_TAIL
08h 08h 00h 00h NOTEOFF
07h 00h 00h 40h DIRECT_MIDI_3(0xE0 00 40)
0ah 48h 00h 1eh SLOT_EXE(0x1e)
f7h

f0h 43h 79h 09h 11h
1bh
0ch 03h 01h 0ah CACCO_END_TIME(0b1010:「無音時に実行」)
f7h

 _send

f0h 43h 79h 09h 11h 0bh 09h f7h
(0x09:「鍵盤をペンで触る」)

_receive

f0h 43h 79h 09h 11h
1bh
0ch 05h 00h 00h
f7h

 

 _send

f0h 43h 79h 09h 11h 0bh 0ah f7h
(0x0a:「鍵盤からペンを離す」)

_receive

f0h 43h 79h 09h 11h
1bh
0ch 02h 00h 00h
0dh 00h 00h 64h
08h 0eh 40h 00h
07h 00h 00h 40h
0ch 03h 01h 0fh
f7h

 

_send

f0h 43h 79h 09h 11h 0bh 32h f7h
(0x32:「押されているスイッチの数が上昇し,SW8とSW9とSW1が押されている状態へ推移」)

_receive

f0h 43h 79h 09h 11h
1bh
04h 65h 12h 66h DIRECT_MIDI_3(0x99 49 66:note on(ch9)))
0ch 02h 00h 00h
0dh 00h 00h 64h
0ah 07h 00h 00h MIDI_RESET
0ch 04h 00h 00h
0ah 07h 00h 00h
0ch 03h 01h 0fh
f7h

 

_send

f0h 43h 79h 09h 11h 0bh 78h f7h
(0x78:「押されているスイッチの数が上昇し,SW8とSW9とSW7が押されている状態へ推移」)

_receive

f0h 43h 79h 09h 11h
1bh
0ch 02h 00h 00h
0dh 00h 02h 2ch
09h 04h 00h 01h
08h 09h 28h 00h
0dh 00h 00h 28h
09h 04h 00h 40h
08h 01h 00h 00h
0dh 00h 00h 46h
09h 04h 00h 1fh
08h 01h 00h 00h
f7h

f0h 43h 79h 09h 11h
1bh
0dh 00h 00h 46h
09h 04h 00h 6fh
08h 01h 00h 00h
0dh 00h 00h 46h
09h 04h 00h 01h
08h 01h 00h 00h
0dh 00h 00h 46h
09h 04h 00h 1ch
08h 01h 00h 00h
0dh 00h 00h 46h
f7h

f0h 43h 79h 09h 11h
1bh
08h 08h 00h 00h
0dh 00h 00h 46h
09h 04h 00h 20h
08h 09h 28h 00h
0dh 00h 00h 46h
09h 04h 00h 64h
08h 01h 00h 00h
0dh 00h 00h 46h
09h 04h 00h 17h
08h 01h 00h 00h
f7h

f0h 43h 79h 09h 11h
1bh
0dh 00h 00h 46h
09h 04h 00h 05h
08h 01h 00h 00h
0dh 00h 00h 50h
08h 09h 2ch 00h
0dh 00h 00h 06h
08h 09h 30h 00h
0dh 00h 00h 06h
08h 09h 34h 00h
0dh 00h 00h 06h
f7h

f0h 43h 79h 09h 11h
1bh
08h 09h 38h 00h
0dh 00h 00h 06h
08h 09h 3ch 00h
0dh 00h 00h 06h
08h 08h 00h 00h
0dh 00h 03h 10h
09h 04h 00h 15h
08h 09h 28h 00h
0dh 00h 00h 3ch
09h 04h 00h 7bh
f7h

f0h 43h 79h 09h 11h
1bh
08h 01h 00h 00h
08h 09h 14h 00h
0dh 00h 00h 1eh
08h 08h 00h 00h
0dh 00h 03h 10h
09h 04h 00h 40h
08h 09h 28h 00h
0dh 00h 00h 3ch
09h 04h 00h 01h
08h 01h 00h 00h
f7h

f0h 43h 79h 09h 11h
1bh
08h 09h 14h 00h
0dh 00h 00h 1eh
08h 08h 00h 00h
0dh 00h 03h 10h
09h 04h 00h 01h
08h 09h 28h 00h
0dh 00h 00h 1eh
09h 04h 00h 36h
08h 01h 00h 00h
0dh 00h 00h 1eh
f7h

f0h 43h 79h 09h 11h
1bh
08h 08h 00h 00h
0dh 00h 03h 10h
0fh 03h 02h 37h
04h 45h 20h 50h
0fh 03h 04h 34h
04h 49h 20h 30h
0dh 00h 00h 02h
0ah 07h 01h 01h
04h 05h 20h 00h
04h 09h 20h 00h
f7h

f0h 43h 79h 09h 11h
1bh
0ah 07h 00h 00h
0ah 06h 00h 00h
0ch 04h 00h 00h
08h 08h 00h 00h
0ah 48h 00h 7ah
0ch 03h 01h 0ah
f7h

 

_send

f0h 43h 79h 09h 11h 0bh 7bh f7h
(0x7b:「MIDI_OUT_CH0ピッチベンドセンシティビティ16」)

_receive

 f0h 43h 79h 09h 11h
1bh
15h 41h 4ah 00h DIRECT_MIDI_OUT_3(0xB0 65 00)
15h 41h 48h 00h DIRECT_MIDI_OUT_3(0xB0 64 00)
15h 40h 0ch 10h DIRECT_MIDI_OUT_3(0xB0 06 10)
f7h
(0xBn:Control Change n:Channel No.)(0x65:RPN MSB)(0x00-7F:Data)
(0xBn:Control Change n:Channel No.)(0x64:RPN LSB)(0x00-7F:Data)
(0xBn:Control Change n:Channel No.)(0x65:Data Entry MSB)(0x00-7F:Data)
RPNの[MSB:0x00,LSB:0x00]=[Pitch Bend Sencivity]にデータ[0x10(0d16)]を入力する.ピッチベンド幅(0d-8192~0d8191)を片側16半音に分割し, 0d8192 ÷ 0d16 = 0d512 により,値が512変化するごとに半音変化する.
なお,NSX-1のピッチベンドセンシティビティはデフォルトで0x02(0d02),最小が0x00(0d00),最大が0x18(0d24).(YMW820アプリケーションノートp.1,p.3参照)
ピッチベンドを0x0C(0d12)に指定すると片側を12半音=1オクターブに分割し,0d682毎に半音変化する.

 

_send

f0h 43h 79h 09h 11h 0bh 7eh f7h
(0x7e:「「ねぎ」」)

_receive

f0h 43h 79h 09h 11h
1bh
0ch 02h 00h 00h CACCO_START
0dh 00h 00h 01h TIME_WAIT
09h 04h 00h 42h MOJI_SEL(0x42:「ね」)
08h 09h 28h 00h NOTEON
0dh 00h 00h 3ch TIME_WAIT
09h 04h 00h 0bh MOJI_SEL(0x0b:「ぎ」)
08h 01h 00h 00h REVOICE
0dh 00h 00h 3ch TIME_WAIT
08h 08h 00h 00h NOTEOFF
07h 00h 00h 40h DIRECT_MIDI_3(0xE0 00 40:(pitch bend(MSB:0x40,LSB:0x00:中央値)))
f7h

f0h 43h 79h 09h 11h
1bh
0ch 04h 00h 00h TIME_WAIT
08h 08h 00h 00h NOTEOFF
07h 00h 00h 40h DIRECT_MIDI_3(0xE0 00 40)
0ch 03h 01h 0ah CACCO_END_TIME(0x0a:「無音時」)
f7h

 

_send

f0h 43h 79h 09h 11h 0bh 7fh f7h
(0x7f:「「がっけんおとなのかがくまがじん」」)

_receive

f0h 43h 79h 09h 11h 1bh 0ch 02h 00h 00h 0dh 00h 00h 01h 09h 04h 00h 0ah 08h 09h 28h 00h 0dh 00h 00h 1eh 08h 08h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 08h 08h 09h 28h 00h 0dh 00h 00h 3ch f7h

f0h 43h 79h 09h 11h 1bh 09h 04h 00h 7bh 08h 01h 00h 00h 0dh 00h 00h 3ch 08h 08h 00h 00h 0dh 00h 00h 78h 09h 04h 00h 04h 08h 09h 28h 00h 0dh 00h 00h 1eh 09h 04h 00h 2dh 08h 01h 00h 00h f7h

f0h 43h 79h 09h 11h 1bh 0dh 00h 00h 3ch 09h 04h 00h 3fh 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 43h 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 05h 08h 01h 00h 00h 0dh 00h 00h 3ch f7h

f0h 43h 79h 09h 11h 1bh 09h 04h 00h 0ah 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 07h 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 64h 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 0ah f7h

f0h 43h 79h 09h 11h 1bh 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 1bh 08h 01h 00h 00h 0dh 00h 00h 3ch 09h 04h 00h 7bh 08h 01h 00h 00h 0dh 00h 00h 3ch 08h 08h 00h 00h 07h 00h 00h 40h f7h

f0h 43h 79h 09h 11h 1bh 0ch 04h 00h 00h 08h 08h 00h 00h 07h 00h 00h 40h 0ch 03h 01h 0ah f7h

 

DominoによるMIDI音源としての利用

Domino.exeを起動し,ファイル>環境設定 を開く.
ポケミクをパソコンに接続し,電源を入れ,パソコンに認識されている事を確かめる.
MIDI-INの項目でMIDI-INデバイス1に「NSX-39」をセットする.
MIDI-OUTの項目でポートAに「NSX-39」を,音源に「GM Level1」をセットする.
正しく設定できていればポケミクの鍵盤にタッチすると音階などの情報が視覚的に表示され,曲を入力し再生できるようになる.ただし,ch1(トラック1)はeVocaloidに予約されており音色の変更ができない.また,ch10はパーカッションに予約されている.

 

DominoによるSysEx送受信

環境設定>MIDI-IN,MIDI-OUT

挿入>エクスクルーシブ プロパティ(ダブルクリック)

編集>エクスクルーシブ受信

 

ポケット・ミク カスタマイズガイド v1.03 r2.5 誤植一覧

以下に誤植と思われる記事について解説する.なお,コマンドの表記についてはポケミクのバージョンによって動作が異なる場合がある.

p.8 2-2 プリセット1(SHIFT+A)は歌詞スロット番号06に相当する.歌詞スロット番号01は(A)単体を押してセットされる歌詞.

p.15 2-6-3 SW7(=SHIFTボタン)はコマンドスロット番号0x11の呼び出しに対応している.コマンドスロット番号0x07はSW1-9(全てのボタン)について押されているスイッチ数が増加するタイミングで呼び出されるコマンドであるため,例示されたデータ列の通りに書き換えると,SHIFTを含むいずれのボタンを押した場合でもクリック音が鳴るようになる.

p.15 2-6-3 クリック音の解除についても上記と同様にスイッチ名称とコマンドスロット番号が対応しない.ただし,コマンドスロット0x07について書き換えを行い,そのリセットを目的とするならばデータ列は正しい.

p.18 3-3 REVOICEコマンドのコマンドは(08_0E_00_01)ではなく(08_01_00_00)である.p.23の表は正しい.

p.22 3-7 CACCO_END_TIMEコマンド(0C_03_01_nn)が用いられるべきところでCACCO_ENDコマンド(0C_03_00_nn)が用いられている.データ列,そのコマンド解説ともに誤ってCACCO_ENDコマンドを使っており,TIME_WAITコマンドを含むため正常に動作できない.p.21の解説,p.23の表は正しい.

p.23 表3 コマンド一覧の列名に最小値が二つ並んでいるが,右側は最大値.

p.28 表4 (誤植と断言してしまう程ではないが)スロット番号0d38(0x26),0d39(0x27)の呼び出しタイミングについて,それぞれ「2個上と同様にSW8」「上と同様にSW9」よりも「2個上と同様にSW7+SW8」「上と同様にSW7+SW9」が適していると思われる.

 

おまけ

ポケミクの外形寸法
幅148mm
奥行き99.7mm(+スライドスイッチ0.6mm)
高さ(いずれも裏側突起1.3mm含む),スイッチ側31mm(スイッチ厚2mmを含む),鍵盤側25mm