Mocoを使ったArduinoのUSB-MIDI化

Arduino UNO Revison 3 (R3) を[Moco](http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/)というUSB-MIDIファームでUSB-MIDI化した時のメモ。導入のために理解しておきたい知識が結構広範囲なのでまとめます。適宜リンク先も参照してください。

- 前提1: Arduinoを使ってLEDを光らせる程度の普通の使い方を理解している
- 前提2: MacにArduinoをつないでいる
- 前提3: MIDI自体の扱いには慣れている(DAWを使ったことがある、など)
- 前提4: 書いてる人間はソフト系(なので、ターミナル操作などは簡単に書きます)

# 背景知識
- Arduino UNOはATmega328Pというマイコンに自由にプログラムを書き込んでいろいろする道具で、ホスト機(WinとかMac)からプログラムを書き込む時はシリアル通信をしている。つまり、Macから見ると、ArduinoはUSB-シリアルデバイスとして見えている。
- USB-シリアルデバイスとして振る舞っているのはArduino UNOの本体であるATmega328Pではなく、USBコネクタの近くに配置されているATmega16U2という別の小さいマイコン (以下簡単にこれをUSBシリアルマイコンと呼ぶ)。
- そしてこのATmega16U2のファームを書き換えることで、MacからArduinoがどのように見えるかを書き換えることができる。USB-MIDI化というのは、このATmega16U2にUSB-MIDIとして振る舞うためのファームを書き込むこと。
- Mocoをインストールすると、普通はUSB-MIDIデバイスとして見え、Arduinoのジャンパピンをつないだときは元々と同じUSB-シリアルとして見える。ので、開発時のArduino本体のプログラム書き換えと、実用時のUSB-MIDIデバイスとしての動作を、USB-ケーブルを一度抜くだけで切り替えられるようになる(詳しくは本家開発元を参照)。

# 実作業
1. Mocoのファームウェア本体をダウンロードする。[githubのこのページ](https://github.com/kuwatay/mocolufa/blob/master/HEX/dualMoco.hex) から「Raw」ボタンを右クリック->ファイルに保存などで.hexファイルだけ手元に持ってきてもOK。
2. USBシリアルマイコンのファームを書き換えるためのプログラム[dfu-programmer](http://dfu-programmer.github.io)を用意する(dfu = Device Firmware Update)。自分でビルドする場合には以下の手順で (注: もっと楽な方法があるはず)。
    1. [dfu-programmer](http://sourceforge.net/projects/dfu-programmer/files/dfu-programmer/)のソースをダウンロードする
    2. [dfu-programmerに必要なlibusb](http://www.libusb.org)のソースをダウンロードする
    3. libusbを解凍してそのディレクトリに移動し、以下実行(注: /usr/local/以下にファイルがコピーされます
        
        ```
        ./configure
        make
        sudo make install
        ```
    
    4. dfu-programmerを解凍してそのディレクトリに移動し、以下実行
    
        ```
        export CPPFLAGS="-I/usr/local/include/libusb-1.0/"
        export LDFLAGS="-L/usr/local/lib"
        export LIBS="-lusb-1.0"
        ./configure
        make
        ```

        これでdfu-programmerという実行ファイルが./src/以下にできるので、適宜dualMoco.hexのあるディレクトリなどにコピー

3. ArduinoをDevice Firmware Update (DFU) モードでホスト機と接続する。具体的にはArduinoのジャンパピンをショートさせながらホスト機とUSBケーブルで接続し、電源LED(ONと印刷がある隣)が光ったのを確認してからショートさせた箇所を解放する。[こちらのページ](http://www.dm9records.com/index.php/tips/arduino/moco/) で図解してくれています。
4. ターミナルを立ち上げて、dfu-programmerとdualMoco.hexのあるディレクトリに移動し、以下を実行。
    
    ```
    sudo ./dfu-programmer atmega16u2 erase
    sudo ./dfu-programmer atmega16u2 flash ./dualMoco.hex 
    sudo ./dfu-programmer atmega16u2 reset
    ```
    
    一行目で ```dfu-programmer: no device present. ``` と表示される場合は失敗で、原因は(1) 1番目の引数に与えるUSBシリアルマイコンが間違っているか、(2) ArduinoがDFUモードで接続できていないか。上記コマンドはArduino UNO R3の場合の引数なので、別のArduinoの場合は別の名称になるかもしれないので、Arduino現物のUSBシリアルマイコンに印刷されている小さい文字を見たり[dfu-programmerのページ](http://dfu-programmer.github.io) でチェック。

5. 成功したら一度USBケーブルを抜き差しすると、USBシリアルデバイスとしては認識されず(つまりArduino IDEでプログラム書き込みはこのままではできない)、USB-MIDIデバイスとして認識される。本家で紹介されている通り、ICSPコネクタのPIN4とPIN6をジャンパピンでショートさせればArduino IDEからプログラム書き込み可能。

# その後は
[Arduinoの普通のMIDIライブラリ](http://playground.arduino.cc/Main/MIDILibrary)を使った処理がUSB-MIDIとつながるはずです。プログラム書き換え時はジャンパピンのショートをお忘れなく。


# 参考リンク
- [本家開発元](http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/)
- [本系開発元で配っているUSB-MIDIファーム(のバイナリデータ)](https://github.com/kuwatay/mocolufa/blob/master/HEX/dualMoco.hex)
- [Arduino側のMocoの紹介記事](https://www.arduino.cc/en/Hacking/MidiWith8U2Firmware)
- [dfu-programmerのページ](http://dfu-programmer.github.io)
- [同じことをしている海外記事](http://www.instructables.com/id/DFU-programmer-on-Mac-OS-X/)
- [qiitaの先輩記事](http://qiita.com/tadfmac/items/9136f47ae1eea99a4ef7)