USB-MIDIコントローラをArduinoにつなぐ

やりたいこと

KORG製のUSB-MIDIコントローラ nanoKONTROL2Arduinoに接続して、スライダやノブ、ボタンの値を取りたい。

f:id:licheng:20200821200427j:plain:w600

ミニUSBホストシールドの改造

ミニUSBホストシールドは困った仕様なので改造が必要。下記の記事を参考にした。

以下に要点をまとめる。

問題点

MAX3421Eは3.3V用のICなのでVccは3.3Vでなければならないが、VccとVbusが直結されているため、USBに5Vでなく3.3Vが給電されてしまう。

解決策

VccとVbusの結線をパターンカットし、RAWとVbusをジャンパで結線する。そしてRAWに5Vを給電する。すると、Vbusは5V、Vccは3.3Vとなる。5VをRAWに給電するためにUSBシリアルアダプタも少し改造した。

f:id:licheng:20200821203143j:plain:w600

ソフトウェア

USBホストおよびUSB-MIDIのライブラリは下記のものを利用した。

実験に用いたスケッチを下記に掲げる。これは上記ライブラリのサンプルスケッチ USBH_MIDI_dump を元にしている。

MIDIメッセージの内容

USB-MIDIのメッセージは4バイトの固定長であり、2バイト目以降にMIDI本来のメッセージが格納される。詳しくは下記を参照。

nanoKONTROL2のスライダやノブ、ボタンを操作すると「コントロールチェンジ」のメッセージが送られてくる。

  • 1バイト目 : 0Bh = ケーブル番号=0, コントロールチェンジ
  • 2バイト目 : B0h = コントロールチェンジ, チャンネル番号=0
  • 3バイト目 : コントロール番号
  • 4バイト目 : データ値

f:id:licheng:20200821232131p:plain

コントロール番号の割り当て

工場出荷状態のnanoKONTROL2ではコントロール番号は下記のような割り当てになっている。

  • 00h ~ 07h : スライダ (左から順に)
  • 10h ~ 17h : ノブ (左から順に)
  • 20h ~ 27h : Sボタン (左から順に)
  • 30h ~ 37h : Mボタン (左から順に)
  • 40h ~ 47h : Rボタン (左から順に)
  • 29h : PLAYボタン [>]
  • 2Ah : STOPボタン [□]
  • 2Bh : REWボタン [<<]
  • 2Ch : FFボタン [>>]
  • 2Dh : RECボタン [〇]
  • 2Eh : CYCLEボタン [CYCLE]
  • 3Ah : PREV TRACKボタン [<]
  • 3Bh : NEXT TRACKボタン [>]
  • 3Ch : SET MARKERボタン [SET]
  • 3Dh : PREV MARKERボタン [<]
  • 3Eh : NEXT MARKERボタン [>]

スライダおよびノブのデータ値は、00h~7Fhの間で連続変化する。
ボタンのデータ値は、押した時に7Fhとなり、はなすと00hになる。

なお、スライダ、ノブ、ボタンのチャンネル番号、コントロール番号、データ値は、KORG Kontrol Editorというソフトでカスタマイズできる。

疑問点

スライダ、ノブを動かしたときにはメッセージが来るが、動かす前の初期値は取得できないものか?