mixture-art@Q
技術+アイディア+世俗+なんとなく思ったこと、すべての融合がmixture-art
DIY Arduino-MIDIコントローラーの作り方を説明する

最近友人たちから「こんなことって実現できる?」と
ハードウェア絡みの質問を受け取ることが多い。
時代はハードウェア活況だなぁと噛み締めると同時に、
きっちり『エンジニアとしてできることの幅』を広げておかなければなるまい、
と気を引き締めるのでありまス。

ということでとある友人の要望から派生して
Arduino-MIDIコントローラというものにトライしてみた。
構成は単純で

スイッチ → Arduino → Mac上のAbleton Live

という接続で曲をコントロールしてみたのでそのメモを残す。
ちなみにMac前提で話を進めてしまうのでそこはご了承を。
ちょっと説明不足で不親切な部分もあるが、まぁそれは気が向いたときに追記することとする。

完成品のデモビデオ(笑)はこちら

とりあえず基板を作る。半田ごて握るべし

さてスイッチはなんでも良いし、当然動画にあったようなスライダーなんかも可能だ。
MouserやDigikeyなどで購入するといいだろう。
http://mouser.com
http://digikey.com

スイッチは全て
・片方のピンをGND
・もう片方のピンをArduinoのGPIOポート
というように接続する

ピンに直接接続しても構わないのはArduino上で『内部プルアップ』するからだ。
コードを参照して欲しい。

Arduinoのコーディングは一瞬

以下のコードはスイッチひとつだけのケース。(話をシンプルにしておく)

————————————————————-

————————————————————-

とりあえず発行するMIDI信号は「0xB0 0x** 0x**」にしてある。
汎用的なシグナルチェンジのアサインだが
もしピッチベンドをやりたかったら「0xE0 0x** 0x**」など自由に書き換え可能だ。

ちなみに今回ArduinoはLeonardoを使った。

信号をどうスイッチからLiveまで送るかについてはちょっと頭をひねった

さてMac側では

『ArduinoのUSB Serialの信号をMIDIとして受け取る仕組み』

が必要だ。
MIDI出力を作ってそれをUSB-MIDIアダプタに入れて、、、とやっても良いがやぼったい。

またArduino自体をUSB MIDIデバイスとしてドライバを書き換える方法も存在するが、
それをやってしまうとISP(特別なプログラマ)を使ってプログラムを書き込まなきゃ
いけなくなるのでここではパス。

せっかくなのでPythonスクリプトを構築することにした。

Pythonをインストールしていない人はググってくださいな。ここでは省略。

さてPythonのコードはちょっとデバッグしながら書いた

simplecoremidiというライブラリを使うと簡単にできるのでそれを入れる。

ターミナルから以下を叩く

sudo pip install simplecoremidi

あとSerial通信に必要なのはpyserialだ。
こちらもインストールしよう。

sudo pip install pyserial

で、Pythonのコードはこんなカンジ。

やっていることは3回USBシリアルポートから信号を取り込んで、
受け取った3bytesのメッセージをCoreMIDIに流し込んでいるだけ。

ところがここで問題が

ふとした拍子に受信バイトが分割されるなどでデータがおかしくなることがある。
そういう場合のために対処コードを多少入れた。
(合成や復元など複雑なことはせず、とりあえず破棄するようにしている)

ここで先ほどのdelay(1)の種明かしだが、本来はシリアルデータはだーっと送って
それを受け取った側で分割したり配列に入れ直したりするのだが、ここでは手抜きをした。
このコードでは1byteずつしか送られないため『単純に3回受け取れば良い』という寸法だ。

その分余計なディレイは当然入るが、用途から考えて問題ないと考える。

あと3byteオンリーでSysExメッセージには対応していないけど、
それもとりあえずヨシとする。

デバイスの検出は、、、まぁいいや

シリアルデバイス”/dev/tty.usbxxxxxxx”の部分はセッティングや使うArduino、
そして接続方法によっても変わるので確認して書き換えて欲しい。

確認方法はArduinoのIDEで “Tools” -> “Serial Port” というのを確認するか

ls /dev/ | grep tty | grep usb

とかやれば見つかるはずだ。
# きっと自動検出するコードが書けるのだろうけど別に売るものでもないので一旦コレで良しとする

ArduinoをMacに接続してさきほどのpythonスクリプトを起動しよう。

Ableton Live側の設定

さて、ここまでできたらお次はAbleton Liveでの設定について
これは単に自分が持っているソフトがLiveなのでそれでやっているだけなので
他のCoreMIDI対応ソフトがなんでも使える。

Liveのメニューの設定からMIDIのタブを選ぶと

“simplecoremidi”というのが見つかるはず。

そこで”Remote”の設定をONにしておけばこれでもう完了だ。

Live画面右上のMIDIを押すとMIDIアサインの設定状態になる。
アサインしたいところをクリックして次に対応させたい物理スイッチを押せばアサインが確定する。

ということでこれで演奏可能。自作Arduino-MIDIコントローラの完成だ。

(追記)

/dev/usb.ttyxxxxxx
を自動検出するコードは以下の形

大型追記w

変更点
・スライダーを追加
・ピンアサインは別ファイルに記載してマッピングを読み込む
・3byte以上のMIDIコマンドにも対応
・PythonのコードでのMIDIコマンド検出部分を整理(安定)

Arduinoのコード

ちみみに設定ファイルassign_map.hはこんな感じ。

Python側はこんな感じ。

Yosemiteで動作確認済み。