突然ですが、Arduino UNOでMIDIコントローラーが作りたいですね!
というわけで、以前、缶の作り方を紹介しましたが、今度はもっと簡単なのを紹介します。
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へのロード方法を書いておくと、
- Arduino UNOとPC or MacをUSBケーブルでつなぐ (dualMocoの場合、ジャンパーするので注意)
- Arduino IDEを立ち上げる
- 新しいスケッチを開く
- 上記スケッチをコピー&ペーストして保存
- マイコンボードに書き込む(IDEの左上の「→」ボタン)を押す。
エラーが出なければ成功です。
Arduino MIDI Library 4.2への変更点
本記事初稿時に利用したArduino MIDI Libraryはv3.2でした。
現在最新版はv4.2となっており、多少コードの記載方法が変わっています。
サンプルの変更点は下記の通りです。
1. MIDI_CREATE_DEFAULT_INSTANCE() の追加
コードの先頭で、マクロMIDI_CREATE_DEFAULT_INSTANCE()
の呼び出しを追加しています。これを追加しないといろいろエラーが出ます。
詳細は下記を参照してください。
2. MIDI.turnThruOff()の追加
これは、もともと必要だったのかも?
コントローラーだけ作ってる分には問題にはならないかもしれませんが、MIDI OUTしたものがMIDI INにループバックするのを防ぐために、setup()
でMIDI.turnThruOff()
を呼び出すよう追加しています。
使ってみよう
書き込んだままだとMIDIとして認識していませんので、Arduinoは一旦外して、ジャンパーを外して、またPCと繋ぎます。
すると、MIDI I/Fとして認識されているはずです。
こんな感じでできましたか?
さっそく、DAWと繋いでみましょう。
。。。。?
。。。。DAWを持ってない?
大丈夫。ブラウザがある!
そうなんです!!
最近は、ブラウザ(Google Chromeの最新版)があれば、MIDIを試すことができるんです!
- MIDIモードで(つまりジャンパを外して)Arduino UNOとPC or MacをUSBケーブルで繋ぐ
- Chromeを立ち上げる ※この順番が重要。プラグアンドプレイはしてくれません!
- 下記サイトのどちらかにアクセス!
どうですか?!
鳴らすことができましたか?
これは、最近の一部のブラウザ(主にChrome)がWeb MIDI APIというものに対応しているからなんです。
ブラウザを使った音楽については、Web Music Developers JPというところで議論されています。
Web MIDI APIや、Web Audioなどに興味を持った方は、是非参加してみてくださいね〜!
まとめ
ブラウザとArduinoを華麗に繋いで楽器にしてしまおう、ということで、簡単なMIDIコントローラーを作ってみました。
「できねーぞ〜」という方は、 @tadfmac までお気軽にお問い合わせください!
みなさん、面白い楽器を作ってみてくださいね!