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

  • 91
    いいね
  • 8
    コメント

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

MIDI Controller

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をはじめようキットを買うと良いと思います。
上記材料のうち、ボリューム以外全部そろいます。

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

ブレッドボードやユニバーサル基盤で直接刺して使いたいので、アルプス電気のRK09Kシリーズの10KΩ Bカーブのものがおすすめです。

こんなの(足がとんがってるの)

これ、秋葉原のマルツパーツ館か、若松を覗いてみたらあると思います。マルツにあるのは背が高いです。(なぜか、千石や秋月だとボードに刺さるタイプが見当たらない。。。)
若松ならコレですね

つないでみよう

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

配線図

※今回は、はじめてFritzingというものを使ってみました。

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

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

これは、MORECAT_LABさんが配布されているdualMOCO という ArduinoのUSBをMIDIとして認識させるためのファームを使わせていただきます。

これの使い方は、上記サイトやDm9 Recordsさんを見ていただければ大体わかるのですが、Macの方は dfu-programmerでハマることが予想されます。 ので、手前味噌ですが、Macの方は Arduino UNO Rev.3でdfu-programmerを使うための記事を参照してください。
というか、コレを使えば簡単です。

うまくいきましたか?

Arduino MIDI Libraryを入れよう

ArduinoでMIDIを簡単に扱うためのArduino MIDI Libraryが提供されています。これを使います。
ArdionoのLibraryフォルダに入れておいてください。
入れ方は、Arduinoに各種ライブラリをインストールする方法で紹介されています。

スケッチをつくる

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

// 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の場合、ジャンパーするので注意)
  2. Arduino IDEを立ち上げる
  3. 新しいスケッチを開く
  4. 上記スケッチをコピー&ペーストして保存
  5. マイコンボードに書き込む(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として認識されているはずです。

鳴らしてみた動画

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

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

大丈夫。ブラウザがある!

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

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

どうですか?!
鳴らすことができましたか?

これは、最近の一部のブラウザ(主にChrome)がWeb MIDI APIというものに対応しているからなんです。

ブラウザを使った音楽については、Web Music Developers JPというところで議論されています。
Web MIDI APIや、Web Audioなどに興味を持った方は、是非参加してみてくださいね〜!

まとめ

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

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