缶とArduinoを使ったアコースティックMIDIコントローラーの作り方

# 缶とArduinoを使ったアコースティックMIDIコントローラーの作り方

昨日1月18日に六本木のGoogleオフィスで開催されたAMEI+Google主催の[Web Music ハッカソン #2](http://googledevjp.blogspot.jp/2013/12/web-music-2.html)に参加してきました。

![Web Music ハッカソン #2 の様子](http://img.dfm.lrv.jp/can/hac.jpg)

ハッカソンの様子は、当日チューターとして参加されたg200kgさんや、Googleの北村さんのサイトで紹介されていますので、そちらを見ていただけたらと思います。

- g200kgさん『[Web Music ハッカソン#2 が開催されました](http://www.g200kg.com/archives/2014/01/web-music-2.html)』
- Google北村さん『[Web Music ハッカソン #2 を開催しました](http://blog.agektmr.com/2014/01/web-music-2.html)』

ここでは、ハッカソンで私が叩いた缶（アコースティックMIDIコントローラ）の作り方を紹介したいと思います。

## 缶?  

これです↓
右から、3号缶、1号缶、2号缶です。

![ハッカソンで使った3つの缶](http://img.dfm.lrv.jp/can/cans.JPG)

それぞれの缶の機能は、下記のようになっています。
- 1号缶：アコースティック楽器
- 2号缶：アコースティックMIDIコントローラー
- 3号缶：アコースティック楽器風MIDIビープ音源

缶は、すばらしい音色のアコースティック楽器にもかかわらず、非常に安価です！  
ぶっ叩いたときの音も大きく、実は叩き方によってとても変化に富んだ音が出る奥の深い楽器です。  
本当におすすめです。  

## 缶の入手方法  

缶はもちろん、どの缶でもかまいませんが、私は横浜駅東口地下街ポルタにある「[PocketMart](http://www.yokohamaporta.jp/shopguide/shop/index.php?scd=311)」というお店で売ってるお菓子（えびせん）の缶を使いました。  

![PocketMartさん](http://img.dfm.lrv.jp/can/shop.jpg)

この缶、とても音が良いのです。もちろん、中身のえびせんも美味しいですよ！
お店で売らなくなったら悲しいので、宣伝しちゃおう、というわけです。（あまり効果はないでしょうが）

## まず、1号缶（アコースティック楽器）をつくる。

最初に1号缶（アコースティック楽器）を作ります。
2号缶は、1号缶にMIDI送信機能を追加したものです。
3号缶は、1号缶にMIDI受信機能と音源を追加したものです。(現状ビープ音しか鳴らないので改善したいです)  

とにかく、何か缶を手にいれてください。
それが中身の入っている缶だとしたら、適切な方法で空にしてください。
(たとえば、PocketMartのえびせんの缶だとしたら、えびせんは食べてください。食べきった後は、しっかり洗いましょう)

それでは、缶を適当に叩いてみてください。良い音がしましたか?
もし、あまり良い音が聞こえなくてもあきらめないでください。
叩き方や持ち方を変えながら叩いてみてください。良い叩き方が見つかるかもしれません。
いろいろやってみて、どうしても欲しい音が出ないときは、ほかの缶でチャレンジしてみてください。
いい音が出た！と思える缶に出会えたら？あなたの1号缶の完成です！

1号缶を回路図にしてみました。
ただの空き缶ですので、回路図はたぶん↓のようなものになるはずです。
![1号缶回路図](http://img.dfm.lrv.jp/can/sem1.jpg)

## 2号缶（アコースティックMIDIコントローラー）にチャレンジ！

1号缶は、すばらしいアコースティック楽器です。

ただ1つの欠点は、それが何のヒネリもなく、意外性に欠けることです。
それは、MIDI OUTを付けることでかなり克服できます！
MIDIを繋いだ先の機器との不思議な連携を可能にします。

![2号缶と3号缶の中身](http://img.dfm.lrv.jp/can/inside.JPG)
(右が2号缶です。左は3号缶)

Arduinoを使えばMIDIの実装も簡単です。

### 工作！
それでは、2号缶（アコースティックMIDIコントローラー）用基盤を作りましょう。  

**ある前提なもの**
- MacかWinかLinuxか。Arduino開発環境
- Arduino UNO R3 1つ
- 配線のための電線、はんだなど 適量 
- はんだごて、ラジオペンチなどの工具
- 缶に穴をあけるためのドリル
- 基板を缶に固定するためのボルト＋ナット（ボルトは3mm頭の20mm以上のものが4つと、10mmのものが2つ必要です）

**用意するもの**
- [ATmega328p](http://akizukidenshi.com/catalog/g/gI-03142/) 1つ
- ユニバーサル基板 [こういうの](http://akizukidenshi.com/catalog/g/gP-00517/) 1つ
- 220Ω, 10KΩの抵抗 1つづつ
- [DINソケット(メス)](http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=62NA-3BMT) 1つ
- コンデンサマイク(ECM) [C9767](http://akizukidenshi.com/catalog/g/gP-01810/) 1つ
- LED 1つ
- 006P電池BOX 1つ
- 0.1μFのコンデンサ 3〜4個
- 22pFのコンデンサ 2個
- 16Mhzのクリスタル [これ](http://akizukidenshi.com/catalog/g/gP-00545/) 1つ  
- 5V1A三端子レギュレーター [TA7805S](http://akizukidenshi.com/catalog/g/gI-06312/) 1つ

上記が用意できたら、下図のように配線をします。
(手書きですいません！！w)
![2号缶回路図](http://img.dfm.lrv.jp/can/sem2.jpg)
※おっと、図中の「22pH」は「22pF」の誤りです。
※電源周りは省略してます。下記サイトを参考に9V→5V降圧回路を組んでください。

> 2014/08/19 追記
> 上記回路図ですが、マイクとATMega328pの接続箇所が間違っています。
> 正しくは、10KΩ抵抗とマイク+の間から線を出してATMega328pの23ピンに繋いでください。
> 

[Arduino互換回路の作成](https://sites.google.com/a/gclue.jp/android-docs-2009/zi-zuoarduinono-zuo-cheng)
※上記サイトの0.33μFは0.1μFで代用しました。006P電池前提なんでいいかな？と。(素人考え)

私がやったら、こんな感じになりました〜
![2号缶用基板](http://img.dfm.lrv.jp/can/board2.JPG)
(なんか、よけいなものがいろいろ映っていますが気にしないでください。。。。)

基板が出来たら、缶に入れます。頑張ってなんとか入れてくださいw  
入れ方は缶の形にもよると思いますが、缶に穴をあけて、ボルト+ナットでも固定できます。
(私がやったやり方が良いとも思えないので、ここは豪快に割愛します)

### プログラム！

さて、ようやくQiitaっぽい部分を書きます。
基板を作っただけですと、ATmega328pにプログラムが書き込めてませんので、動きません。
下記手順でプログラムを書き込む必要があります。
それぞれのやり方は、他のサイトで詳細に教えてくれますので、そちらを見てください。

1. ブートローダーを書き込む[やり方](http://www3.big.or.jp/~schaft/hardware/bootloader_writer/page001.html)
2. ブートローダーを書き込んだATmega328pにスケッチを書き込む (Arduino UNO R3のATmegaソケットにブートローダーを書き込んだATmega328pを物理的にさした後、Arduino IDEからスケッチの書き込みを普通に行う)

	尚、スケッチではMIDI.hを使います。IDEに[MIDI Library](http://playground.arduino.cc/Main/MIDILibrary)を入れておいてください。

3. Arduino UNOからスケッチを書き込んだATmega328pを取り外して、作った2号缶用基板に差し込む

直値バリバリでプログラマーの方に怒られそうですがw、書き込むスケッチの例です。
缶とマイクの距離や、マイクの特性でvolの値は調整してください。

	// MIC    : A0
	// LED    : D13
	// TX     : D1
	
	#include <MIDI.h>
	
	void setup(){
	  MIDI.begin(1);
	  pinMode(13,OUTPUT);
	}
	
	void loop(){
	  int vol,vel;
	  vol = analogRead(A0);
	
	  if((vol > 884)&&(vol < 1084)){
	    vol = vol - 984;
	    vol = abs(vol);
	    if(vol > 20){
	      vel = (vol * 2) + 32;
	      if(vel > 127){
	        vel = 127;
	      }
	      digitalWrite(13,HIGH);
	      MIDI.sendNoteOn(64,vel,1);
	      delay(100);
	      MIDI.sendNoteOff(64,0,1);
	    }else{
	      digitalWrite(13,LOW);
	    }
	  }
	}

さて、缶への組み込みまで、うまくいきましたか？
マイクで拾う値をプログラム側で調整する必要がありますので、缶を叩きながら調整してみてください。(私のハッカソンは殆どそれで終わったという。。w)
MIDI出力の確認ができて、いい感じに叩いて反応するようになったら、2号缶の完成です！
おつかれさまでした。

## 3号缶（アコースティック楽器風MIDIビープ音源）もつくる?

「ビープ音が鳴るだけ」という、あまりモチベーションがあがらない3号缶ですが、一応作り方を紹介します。

**用意するもの**
- [ATmega328p](http://akizukidenshi.com/catalog/g/gI-03142/) 1つ
- ユニバーサル基板 [こういうの](http://akizukidenshi.com/catalog/g/gP-00517/) 1つ
- 220Ω, 1KΩの抵抗 1つづつ
- 整流用ダイオード [1N4148](http://akizukidenshi.com/catalog/g/gI-00743/) 1つ
- [DINソケット(メス)](http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=62NA-3BMT) 1つ
- ちっちゃいスピーカー (100均の耳にひっかけるタイプのヘッドフォンをバラして取り出すの推奨。これだと100円で2つ手に入ります) 1つ
- LED 1つ
- 006P電池BOX 1つ
- 0.1μFのコンデンサ 3つくらい
- 22pFのコンデンサ 2つ
- 16Mhzのクリスタル [これ](http://akizukidenshi.com/catalog/g/gP-00545/) 1つ  
- 5V1A三端子レギュレーター [TA7805S](http://akizukidenshi.com/catalog/g/gI-06312/) 1つ

### 工作!

殆ど2号缶用基板と同じですが、下記が違います。
- MIDI-OUTをMIDI-INに変更する(フォトカプラを使うので、ちょっと面倒)
- マイクの代わりにスピーカーをつける(付けるところが違うので注意)

下図のように配線をします。
(またまた手書きですいません！！w)
![3号缶回路図](http://img.dfm.lrv.jp/can/sem3.JPG)
**※絵のTLP552の5番PINのグランド接続を書き忘れました。作る際は5番PINをグランドへ接続してください。**
※スピーカー部はオーディオ端子とかにしても良さそうですが、今回は缶に入れる前提なので適当です。


こんな感じになります。  
![3号缶基板](http://img.dfm.lrv.jp/can/board3.JPG)

### プログラム!

組み込み方は、2号缶と一緒です。
同じようにやりましょう。
スケッチは下記のようになります。
(下はビープ音鳴らすだけの単純なものですが、ここで凝った音響合成とかすれば、もっとかっこ良くなるはず！)

	// MIDIを受けてBeep音を出すだけのプログラム
	// スピーカーは D6に付けてください。

	#include <avr/pgspace.h>
	#include <MIDI.h>

	// Note Number -> Frequency 変換
	PROGMEM int freqs[] = {
	  8,8,9,9,10,11,11,12,13,14,15,15,16,17,18,19,
	  21,22,23,24,26,28,29,31,33,35,37,39,41,44,46,49,
	  52,55,58,62,65,69,73,78,82,87,93,98,104,110,117,123,
	  131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,
	  330,349,370,392,415,440,466,494,523,554,587,623,659,698,740,784,
	  831,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,
	  2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699,4978,
	  5274,5588,5920,6272,6645,7040,7459,7902,8372,8870,9397,9956,10548,11175,11840,12544
	};
	
	const int BUZZER = 6;
	const int LED = 13;
	
	int speed = 50;
	
	void setup(){
	  pinMode(BUZZER,OUTPUT);  // スピーカー
	  pinMode(LED,OUTPUT);     // LED
	  MIDI.begin(1);           // Launch MIDI with default options
	}
	
	int midi = 0;
	int freq;
	void loop(){
	  int data;
	  if (MIDI.read()) {
	    switch(MIDI.getType()){
	      case NoteOn:
	        midi = 1;
	        data = MIDI.getData1();
	        freq = pgm_read_word(freqs + data);
	        break;
	      case NoteOff:
	        midi = 0;
	        break;
	      default:
	        break;
	    }
	  }
	  if(midi == 1){
	    digitalWrite(LED,HIGH);
	    tone(BUZZER,freq,speed);
	    delay(speed);
	    digitalWrite(LED,LOW);
	  }
	}

さて、ビービーうるさいMIDI音源ができました。
缶に入れても入れなくてもいいですが、入れたら3号缶（アコースティック楽器風MIDIビープ音源）の出来上がりです。

## まとめ

Arduino工作開始1ヶ月の初心者の記事を最後まで読んで頂きありがとうございました。
いろいろと変なところもあると思いますので、ツッコミ等頂けたら助かります。

ハッカソンでは、3分しか時間がなくて缶を叩くだけで終わってしまいましたので、この場を借りて補足させて頂きました。
初めてのQiitaの記事となってしまいましたが、これからも書いていこうと思います。
よろしくお願いします。