Arduinoで作るフットスイッチ・ペダルMIDIインターフェイス

Arduinoで作るフットスイッチ・ペダルMIDIインターフェイス
================================================

## 概要

ギター、ベース、キーボードを扱うバンドマン等は足元にエフェクターなどゴロゴロ並べてると思いますが、特に昨今はデジタルなエフェクター等の流行りもあって、良いマルチエフェクターを一個用意して、それをMIDIで制御するなんていうセッティングもポピュラーになってきました。

MIDIで楽器を制御というと、シンセサイザーを扱う人だけのようですが、最近は[Axe-FX](http://www.musicland.co.jp/content/fractalaudio-axe-fx/)なんていうかなり良いギターのマルチエフェクタや、（身の回りでは）話題にはなっていませんが、[IKMultimedia Amplitude](http://www.ikmultimedia.com/products/amplitube/)のようにソフトウェアでアンプシュミレータが動くものがでてきており、ギタリスト業界でも、ソフトウェア的にエフェクタを制御するようなトレンドが注目されてるんじゃないでしょうか？

そういったデジタル楽器の音色制御をするとき、フットスイッチ・ペダルでの音色切り替えが必要になり、足元の[MIDIコントローラ](http://www.soundhouse.co.jp/shop/SearchList.asp?i_type=c&s_category_cd=141)を別途購入する必要ありますが、個人的にはスイッチの数、スイッチのクリック感、スイッチのレイアウト（スイッチ間の距離）、重さ等、どうにも気にいるものがなかったもので、自作して解決できないかなと感じたのが今回の動機でした。

## 作りたいもの・仕様

筆者はMIDIキーボード＋ノートPCのソフトシンセで演奏するのですが、ここで、キーボードとノートPCのMIDI入出力の間に自作のデバイスを挟んで、キーボードのMIDI信号にデバイスのフットスイッチ・ペダルの操作情報を混ぜて、ノートPCのソフトシンセに入力するようなものをつくろうと思います。（こうすると、足元の環境が自前で整備できるので、スタジオのレンタルのキーボードでも、足元の有り方に困らなくなるのです。）

![構想画像.png](https://qiita-image-store.s3.amazonaws.com/0/50758/25432d5b-14a4-459b-7e38-88c9b452673e.png)

仕様としては以下のようなものに限定しました。

* MIDI入力をそのまま出力に出すTHRUな仕組み→MIDI IN/OUTの端子
* 6個のフットスイッチ入力端子
* 1個のフットペダル入力端子
  * 本体自体にはスイッチ・ペダルの操作子は加えません。別途スイッチやペダルを購入して、つなげられる仕組みにします。こうすることで、自分の好みに応じて、スイッチを使い分けられるからです。
* デバイスにはLED、液晶、操作子などはなし。
  * コントローラとしてのコンフィグはArduinoのプログラムのビルドで直接調整します。

## 必要なもの

* Arduino UNO
  * 今回は一番ベーシックなUnoで。
* MJ-192 × 2 (MIDIの入出力)
  * http://www.marutsu.co.jp/shohin_19046/
  * 5P、DINソケット。売り場には5ピン以外のものもあるので、間違えないようにしてください。
* MJ-186 × 6
  * http://www.marutsu.co.jp/shohin_40117/
  * 6.3mmのモノラルジャック。ジャックによってフォン端子の抜き差しのしやすさが異なるので、使いやすいものを選びましょう。
* MJ-189
  * http://www.marutsu.co.jp/shohin_9984/
  * 6.3mmのステレオジャック。
* TLP552
* 1N4148
* 0.1μFコンデンサ
* 1kΩ抵抗
 * ここらへんはMIDI入力の回路で使います。
* 220Ω抵抗 × 3
 * いろんなところで使います。
 * （今回、自分は220Ω抵抗が身の回りになくて、適当に330Ω抵抗を使いました…。ご了承ください…。）

### あると良いもの

* 押していないときのみショートの状態を作れるボタン
 * プログラムのビルドの際に便利です。
* ユニバーサル基板
 * ハンダ付けして完成させる際には。ブレッドボード試作で満足であれば不要です。
* ケース
 * 完成させて、外で使う分には。ドリルなどで、穴あけ加工が必要ですね。
 
以上はなくても出来ます。今回はありでやってます。

## 回路

![circuit.png](https://qiita-image-store.s3.amazonaws.com/0/50758/40137a35-c764-f33f-8315-8d71d9149729.png)

各構成要素の回路図を用意しました。図は[Qt-BSch3VのMac版](https://informationsea.info/apps/qtbsch3v/)で書きました。

今回はわかりやすいことに、これらの回路を全て並列につなげれば完成です。フットスイッチ入力は6つあると思うので、図では適当に7Pinと書きましたが、適宜digitalReadできるピンを6つ選んでそれぞれつないでいきましょう。僕は今回、4,5,6,7,8,10ピンを選びました（深い意味はありません）。フットペダル入力、MIDI出力、MIDI入力は回路中に一回しか出てこないので迷うことがないと思います。MIDI入力は少々配線が複雑です。また、MIDI端子も向きに注意しましょう。前後が逆だと当然、動作しません。

フットスイッチの入力では、内部プルアップを使うため、このように簡素な回路になっています。フットペダルはケーブルが差し込んであるときは、ペダルの可変抵抗を、刺さっていないときは、ピンに接続されてる抵抗を介するようになっています。

MIDI入力では、Rx 0Pinの前にスイッチをつなげて、ボタンを押してない間のみ、ショート（短絡：つないでる状態）させるようにしました。これは、プログラムをビルドしてArduinoに転送する際に、Rx 0Pinがショートしている状態だと、転送に失敗するためです。なので、転送する際には、ボタンを押しながら転送させれば、Rx 0Pinが開放状態なので、プログラムが上手く転送できる仕組みです。

## コード

細かい設定はいろいろあるかと思いますが、今回はフットスイッチを4,5,6,7,8,10ピンを選び、踏んだ際にコントロール・チェンジを127の値で出力するようにしました。番号は70, 71, 72, 73, 74, 75です。フットペダルはコントロール・チェンジ4番の値を操作しています。若干、踏み込みの具合を考えて、マージンをとってあります。これらの出力はチャンネル１に対して出力します。

あとは簡単なデバッグ用に、スイッチ・ペダル入力時に本体LEDを一瞬点灯させるようにしました（本体がユニバーサル基板で隠れちゃってるんですが）

```c
#include <MIDI.h>
#define CH 1
#define LED_PIN 13
#define MAX_LED_PIN_TIME 200
#define PEDAL_MARGIN 64

MIDI_CREATE_DEFAULT_INSTANCE();

int switchPins[] = {4, 5, 6, 7, 8, 10};
int switchCCs[] = {70, 71, 72, 73, 74, 75};
int switchPreVal[] = {-1, -1, -1, -1, -1, -1};
int pedalPin = 0;
int pedalCC = 4;
int pedalPreVal = -1;

int ledPinTime = 0;

void setup() {
  MIDI.begin();
  pinMode(LED_PIN, OUTPUT);
  
  for(int i=0; i<6; i++){
    pinMode(switchPins[i], INPUT);
    digitalWrite(switchPins[i], HIGH);
  }
}


void loop() {
  for(int i=0; i<6; i++){
     int val = digitalRead(switchPins[i]);
     
     if(val != switchPreVal[i]){
       switchPreVal[i] = val;
       MIDI.sendControlChange(switchCCs[i], val * 127, CH);
       ledPinTime = MAX_LED_PIN_TIME;
     }
  }

  int val = map(analogRead(pedalPin), PEDAL_MARGIN, 1024 - PEDAL_MARGIN, 0, 127);
  val = val < 0 ? 0 : val;
  val = val > 127 ? 127 : val;
    
  if(val != pedalPreVal){
    pedalPreVal = val;
    MIDI.sendControlChange(pedalCC, val, CH);
    ledPinTime = MAX_LED_PIN_TIME;
  }
  
  MIDI.read();  // MIDI THRU
 
  digitalWrite(LED_PIN, ledPinTime > 0 ? HIGH : LOW);
  if(ledPinTime > 0) ledPinTime--;
}
```

## 完成品

![全体図.jpg](https://qiita-image-store.s3.amazonaws.com/0/50758/4fc6fffc-06cc-d231-bea0-aa5a55e0722d.jpeg)

![側面１.jpg](https://qiita-image-store.s3.amazonaws.com/0/50758/62da2ae4-7ee1-93e6-d56a-e54d5db71071.jpeg)

![側面２.jpg](https://qiita-image-store.s3.amazonaws.com/0/50758/fe84cee1-9c11-2f5a-3e52-f6cdfdcf1b4f.jpeg)

ケース加工やはんだ付けは物凄く下手なので、あまりうつらないように引き気味で撮ってしまいました、ごめんなさい（笑）

前面には、フットスイッチの入力端子を６つ並べて、後ろ側には、MIDIの入出力、フットペダルの入力、後はArduinoのUSB、電源端子を出しています。USBも電源端子も出すことで、どちらでも稼働させられます。

## 製作費

しっかりとは計算していませんが、Arduinoとケースで3500円程度。後は、各端子など含めると5500円程度になるかと思います。

こう見ると、安いかのように見えますが、このボックスはフットスイッチ・ペダルは外部の物を用いて使わなければいけないため、その分の値段が膨らみますね。フットスイッチのBOSS FS-5Uはひとつ2000円程度、フットペダルは写真のKORG XVP-10は9000円程度のいいもの使ってますが、ポピュラーなフットペダルの価格は5000円程度でしょうか。2000×6+5000で17,000円ぐらい余剰にかかります。

PCとつなぐMIDIケーブルはYAMAHA UX-16を使ってます、これは3500円程度ですね。MIDIケーブルもう一本買うとすると、トータル4500円程度？

トータルすると、**27,000円程度**です。自作したからといって、極端に安くなったりするわけではありませんね。コストより、自分好みのものが作れるかどうかの付加価値を見たほうが幸せになれると思います。


## 今後やりたいこと

* Arduino pro mini等で小型化
* 入力端子数の検討（スイッチ６つと、ペダル１つで足りるか？）
* ケースの外側に、動作状況を表示するLEDをつけたい
* MIDI端子から伸びている線をユニバーサル基板にハンダ付けではなくて、コネクタ等を用いて取り外しを容易にしたい。
 * MIDIの端子はケースの外側からはめ込む形状のため、取り外しメンテができない状態になってしまっている。 
* 可変抵抗やボタンなどで、コンフィグをいじれるようにしたり、コントロール・チェンジやプログラムチェンジを出せるようにしたい
* Arduino本体のUSB MIDI I/F化
 * http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/
* ケースの塗装・表面加工等

## まとめ：Arduinoの開発プロセスへの感想

完成図一枚目の、ケースの中が見える写真を確認していただきたいのですが、今回、かなりスペースに余裕を持って製作にのぞみました。それは、『自分がどんな機能を欲しいかが具体的にわかってないので、後でいじって部分拡張できる余地を残したい』という意図でした。これが、もうちょっと実際の現場で使って、あの機能が必要だとか、この端子は過剰だ、などわかっていけば、また次の試作仕様が煮詰まっていけるものだと期待しています。そのときにはもっとコンパクトなものをつくりたいです。

後は、Arduinoの電子工作も、実際にモノを触って製作できるという過程が楽しかったりします。電気の授業を受けてから10年近くのブランクがある筆者でも、いろいろ途中で失敗はありましたが（モノの選定ミス、端子の前後間違えや基板上でのハンダ付けミス、ケース加工ミスなどなど；）、最終的には完成にこぎつけました。ちんたらやり続けて4ヶ月くらいで完成しました。モノとして完成すると、やっぱり嬉しさみたいのはあったりします。メーカーから類似商品買って、適度に妥協するのも悪くはないですが、自分の欲しいモノ、それで解決したい課題はなんだろうと考えて、仕様を悩ませたり、仕様を解決するために試行錯誤する過程も楽しいです。

[littleBits](http://jp.littlebits.com/synth/)という『磁石で電子回路をつないで電子工作を行うことを通して、電子回路を楽しく学べる』製品が出たり、[大人の科学マガジン](http://otonanokagaku.net/magazine/)ではシンセやポケットミクの工作が取り扱われています。決して、これらで作られるデバイス・ガジェットというのは、既存の製品の品質に太刀打ちできるものではないとは思うのですが、これらで作ったモノに楽しめるのは、**モノが良いか悪いかじゃなくて『自分が作った楽器』という文脈を含めて楽しめる製品**だから話題になるのかもしれませんね。

ぜひぜひ興味があればチャレンジしてください。

何か回路やコード等で、間違いなど有りましたら、ぜひご指摘ください。

## 参考

* http://d.hatena.ne.jp/KZR/20090716/p1
* http://dev.tetrastyle.net/2011/07/midi_21.html