超簡単！Arduino UNOをMIDIコントローラーにしよう！ <Arduino MIDI Library 4.2対応版>

突然ですが、Arduino UNOでMIDIコントローラーが作りたいですね！
というわけで、以前、缶の作り方を紹介しましたが、今度はもっと簡単なのを紹介します。

![MIDI Controller](http://img.dfm.lrv.jp/midi/controller.jpg)

Arduino UNOをそのまま使って、ボリューム、CDS、スイッチ1を1つづつ繋ぐだけ！
USBをそのまま使うので、MIDIケーブルもMIDI/IFも不要！

しかも、今度のやつの方が、機能が豊富です。
なななんと！前回の缶はノートON/OFFができるだけでしたが、今回は音程も変えられるし、なんとピッチベンドもできちゃいます。
頑張ればメロディーが演奏できるかもしれません！（相当難しいですw）

さっそく作ってみましょう！

> 2015.7.22
> 記事が古くなりましたので、Arduino IDE 1.6.3とArduino MIDI Library 4.2に対応するよう修正しています。

## 材料を集めよう

私はちっちゃいのを作りたかったので、ユニバーサル基盤にはんだ付けしましたが、ブレッドボードがあれば、はんだ付けも要りません。

- Arduino UNO R3 × 1
- USBケーブル (Arduinoと繋ぐやつ) × 1
- ユニバーサル基盤 × 1
- ジャンパーワイヤー適量
- 1/4W 抵抗 10KΩ × 1
- 1/4W 抵抗  1KΩ × 2 (Arduino専用なら実は無くても作れる)
- ボリューム (可変抵抗器) 10KΩ Bカーブ × 1
- CdSセル × 1 

以上！

Arduinoを持ってる人は、普通に持ってそうなものばかりですね！

まだArduino持ってないぞ！という方は[Arduinoをはじめようキット](http://www.amazon.co.jp/gp/product/B0025Y6C5G/ref=pd_lpo_sbs_dp_ss_2?pf_rd_p=466449256&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=B009FCU9EG&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=11AHVGHFDVWG9TTCQVKX)を買うと良いと思います。
上記材料のうち、ボリューム以外全部そろいます。

ボリュームは、秋葉原に寄ることがあれば、[10KΩ Bカーブ]のものを探しましょう。

ブレッドボードやユニバーサル基盤で直接刺して使いたいので、アルプス電気の[RK09Kシリーズの10KΩ Bカーブのもの](http://www.alps.com/WebObjects/catalog.woa/J/HTML/Potentiometer/RotaryPotentiometers/RK09K/RK09K_list.html)がおすすめです。

![こんなの(足がとんがってるの)](http://img.dfm.lrv.jp/midi/volume.png)

これ、秋葉原のマルツパーツ館か、若松を覗いてみたらあると思います。マルツにあるのは背が高いです。（なぜか、千石や秋月だとボードに刺さるタイプが見当たらない。。。）
[若松ならコレですね](http://www.wakamatsu-net.com/cgibin/biz/page.cgi?cate=2203&page=#22030040)

## つないでみよう

下記のように配線しましょう！

![配線図](http://img.dfm.lrv.jp/midi/diagram.png)

※今回は、はじめて[Fritzing](http://fritzing.org/home/)というものを使ってみました。

抵抗は、タクトスイッチのプルダウンに10KΩを使っていますが、これ以外は1Kです。
あと、可変抵抗保護の気持ちを込めて、1Kを繋いでいますが、Arduinoが出す電流はそれほど大きくないので、実は不要ですw
（実験したあと電源回路を変えた時によくボーリュームから煙がでるのでw もう繋いでおこうと）

## ArduinoをDFUでMIDIデバイスに変更！

これは、MORECAT_LABさんが配布されている[dualMOCO という ArduinoのUSBをMIDIとして認識させるためのファーム](http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/)を使わせていただきます。

これの使い方は、上記サイトや[Dm9 Records](http://www.dm9records.com/index.php/tips/arduino/moco/)さんを見ていただければ大体わかるのですが、Macの方は **dfu-programmerでハマることが予想されます。** ので、手前味噌ですが、Macの方は [Arduino UNO Rev.3でdfu-programmerを使うための記事](http://qiita.com/tadfmac/items/b941f7d4858386e2d1b0)を参照してください。
というか、[コレ](http://temp.dfm.lrv.jp/dfuprogrammer/dfu-programmer-061bin.zip)を使えば簡単です。

うまくいきましたか?

## Arduino MIDI Libraryを入れよう

ArduinoでMIDIを簡単に扱うための[Arduino MIDI Library](http://playground.arduino.cc/Main/MIDILibrary)が提供されています。これを使います。
ArdionoのLibraryフォルダに入れておいてください。
入れ方は、[Arduinoに各種ライブラリをインストールする方法](http://www.dm9records.com/index.php/tips/arduino/arduino/)で紹介されています。

## スケッチをつくる

いよいよ、プログラムです。

```c
// Using :
// - DualMoco : http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/
// - MIDI Library : http://playground.arduino.cc/Main/MIDILibrary
// 
// Device:
// LED    : D13
// BUTTON : D8 (Note ON/OFF)
// VOLUME : A0 (MIDI Note) 
// CDS    : A1 (MIDI PitchBend) 

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

// つなげる場所により変えよう
const int LED = 13;
const int BUTTON = 8;
const int VOLUME = 0;
const int CDS = 1;

// 回路の抵抗度合いなどに応じて数値は調整しよう
#define note_MIN 0
#define note_MAX 127
#define vol_MIN 200 // volume保護用に抵抗で分圧してる関係上
#define vol_MAX 1023

// これもCdSを手で覆った時だけ使いたいのでこんな値
// 明るさによって変わるので調整しよう
#define cds_MIN 820
#define cds_MAX 1023

// pitchbendは本当は -8192 - 8191 だけど
// 元々の値が荒いので、ベンド幅を1/4にしとく。
// これだとあまり変わらないので、もっと増やしてもいいかも。
// そのへんは好みでw
#define pb_MIN -2048
#define pb_MAX 2048

// 初期化処理です
void setup(){
  pinMode(LED,OUTPUT); 
  pinMode(BUTTON,INPUT); 
  MIDI.begin(1);                // Launch MIDI with default options
  MIDI.turnThruOff();
}

// これはセンサー入力のフラつき対策
boolean checkChange(int val1,int val2, int range){
  int l,h;
  l = val2-range;
  h = val2+range;
  if((l > val1)||(h < val1)){
   return true;
  }
  return false;
} 

int button = 0;
int note = 0;
int cds = 0;
boolean isplay = false;

void loop(){
  int nowbutton;
  int nownote;
  int nowcds;

  // Note Number change
  nownote = analogRead(VOLUME);    
  nownote = map(nownote, vol_MAX, vol_MIN, note_MIN, note_MAX);
  if(checkChange(nownote,note,1)){
    if(isplay){
      MIDI.sendNoteOff(note,0,1);
      MIDI.sendNoteOn(nownote,100,1);
    }
    note = nownote;
  }

  // Cds (Pitchbend)
  nowcds = analogRead(CDS);
  if(nowcds > cds_MIN){
    nowcds = map(nowcds, cds_MIN, cds_MAX, pb_MAX, pb_MIN);
    MIDI.sendPitchBend(nowcds,1);
  }else{
    nowcds = 0;
    if(cds != nowcds){
      MIDI.sendPitchBend(0,1);
    }     
  }
  cds = nowcds;

  // Button (Note ON/OFF)
  nowbutton = digitalRead(BUTTON);
  if(nowbutton != button){
    if(nowbutton == HIGH) {
      MIDI.sendNoteOn(note,100,1);
      isplay = true;
      digitalWrite(LED,HIGH);
    }else{
      MIDI.sendNoteOff(note,0,1);
      isplay = false;
      digitalWrite(LED,LOW);
    }
    delay(50);
  }
  button = nowbutton;
}
```

### ちょっとだけ解説

簡単に解説すると、下記のような処理を行っています。

- analogRead(0)で、ボリュームの値を読み込んで、ノートNo.(0〜127)に変換
- digitalRead(8)で、押した時にNoteOn, 離した時にNoteOff
- analogRead(1)で、CdSの値を読み込んで、ピッチベンドに変換して送信

こんな感じです。
特にanalogReadの部分は配線のやりかたで、けっこう誤差が出るので、数値を調整してみてください。
（ジャンプワイヤーは、柔いのより固いのの方が抵抗少なくて良いですね）

念のため、Arduino UNOへのロード方法を書いておくと、

1. Arduino UNOとPC or MacをUSBケーブルでつなぐ (dualMocoの場合、ジャンパーするので注意)
1. Arduino IDEを立ち上げる
1. 新しいスケッチを開く
1. 上記スケッチをコピー&ペーストして保存
1. マイコンボードに書き込む(IDEの左上の「→」ボタン)を押す。

エラーが出なければ成功です。

#### Arduino MIDI Library 4.2への変更点

本記事初稿時に利用したArduino MIDI Libraryはv3.2でした。
現在最新版はv4.2となっており、多少コードの記載方法が変わっています。

サンプルの変更点は下記の通りです。

##### 1. MIDI_CREATE_DEFAULT_INSTANCE() の追加

コードの先頭で、マクロ`MIDI_CREATE_DEFAULT_INSTANCE()`の呼び出しを追加しています。これを追加しないといろいろエラーが出ます。

詳細は下記を参照してください。

https://github.com/FortySevenEffects/arduino_midi_library/releases

##### 2. MIDI.turnThruOff()の追加

> これは、もともと必要だったのかも？

コントローラーだけ作ってる分には問題にはならないかもしれませんが、MIDI OUTしたものがMIDI INにループバックするのを防ぐために、`setup()`で`MIDI.turnThruOff()`を呼び出すよう追加しています。

## 使ってみよう

書き込んだままだとMIDIとして認識していませんので、Arduinoは一旦外して、ジャンパーを外して、またPCと繋ぎます。
すると、MIDI I/Fとして認識されているはずです。

[鳴らしてみた動画](http://instagram.com/p/nSuIw7nCnM/)

こんな感じでできましたか？

さっそく、DAWと繋いでみましょう。
。。。。？
。。。。DAWを持ってない？

### 大丈夫。ブラウザがある！

そうなんです！！
最近は、ブラウザ（Google Chromeの最新版）があれば、MIDIを試すことができるんです！

1. MIDIモードで（つまりジャンパを外して）Arduino UNOとPC or MacをUSBケーブルで繋ぐ
2. Chromeを立ち上げる ※この順番が重要。プラグアンドプレイはしてくれません！
3. 下記サイトのどちらかにアクセス！

- [かっこいいアナログシンセ！](https://webaudiodemos.appspot.com/midi-synth/)
- [GUIないけど演奏できる！](https://webaudiodemos.appspot.com/monosynth/)

どうですか？！
鳴らすことができましたか？

これは、最近の一部のブラウザ（主にChrome）が[Web MIDI API](http://g200kg.github.io/web-midi-api-ja/)というものに対応しているからなんです。

ブラウザを使った音楽については、[Web Music Developers JP](https://groups.google.com/forum/#!forum/web-music-developers-jp)というところで議論されています。
Web MIDI APIや、Web Audioなどに興味を持った方は、是非参加してみてくださいね〜！

## まとめ

ブラウザとArduinoを華麗に繋いで楽器にしてしまおう、ということで、簡単なMIDIコントローラーを作ってみました。
「できねーぞ〜」という方は、 @tadfmac までお気軽にお問い合わせください！

みなさん、面白い楽器を作ってみてくださいね！