USBを使って、Arduino UNOをMIDIコントローラとしてPCに認識させる手順を紹介します。パソコンとArduino UNOをUSBで接続するだけなので、MIDIシールドやUSB-MIDI変換ケーブルも不用です。ArduinoをMIDIコントローラにできれば、センサやスイッチと組み合わせてオリジナルの楽器が作れますね!

必要なもの

これらはArduinoをMIDIコントローラにするために必須のリソースです。先にダウンロードを済ませてしまいましょう。

  1. FLIP
    ATMEL製のファームウェア書き込み用ソフトウェアです。下記URLが使えない場合はMICROCHIP社のHPトップの検索欄に「FRIP」と入力してみましょう。
    https://www.microchip.com/developmenttools/ProductDetails/flip

  2. mocolufa-master
    ArduioをMIDIデバイスとして認識させるファームウェアです。Arduino UNO上のサブチップセットに書きこみます。ダウンロード後、解凍しておきます。
    https://github.com/kuwatay/mocolufa

  3. Arduino MIDI library
    Arduino IDEで使用するMIDIライブラリです。IDE上で”MIDI.h”を使えるようにします。解凍不用です。
    https://github.com/FortySevenEffects/arduino_midi_library

Arduino MIDI libraryを使えるようにする

Arduino MIDI libraryをArduino IDEでインクルードできるようにします。
スケッチ>>ライブラリをインクルード>>.ZIP式のライブラリをインストールをクリック。あらかじめダウンロードしたライブライのファイルを解凍せずに指定します。

これでMIDIライブラリをインクルードできるようになりました。しかし、このままではArduino UNOをMIDIデバイスとして認識させることはできません。MIDIデバイスとして認識させるには、Arudino UNOにサブチップセット“ATMEGA162U”(モデルによって若干変わります)のファームウェアを書き換える必要があります。

ファームウェアの書き換え

Arduinoのファームウェアを書き換えることで、ArduinoをMIDIデバイスに変身させてしまいましょう。

Arduino UNOにはメインのマイコンであるATMEGA328Pの他に、もう一つマイコンが搭載されています。USBポートの近くにある黒いチップがそれです。

普段はATMEGA328P-開発用PC間通信の相互変換を担う重要な役割を担っていますが、このファームウェアを書き換えることができます。買ったばかりの状態では、PCからArduino UNOとしか認識されませんが、このファームウェアを書き換えることでマウスなどのポインティングデバイスや、キーボードのような入力装置として認識させることが可能です

今回はMIDIデバイスとして認識させたいので、専用に開発されたファームウェアを書き込みます。書き込みにはFLIPというソフトを使用します。

FLIPのインストール

MICRPCHIPのHPからダウンロードしてきます。私はFLIP 3.4.7.112 for Windows (Java Runtime Environment included)を使いました。ダウンロードが完了したら、インストーラを管理者権限から実行し、画面に沿って進めます。特に標準の設定から変更する必要はありません。

デバイスを認識させる

FLIPをインストールするだけでは、Arduinonのサブチップセット用ドライバはインストールされません。そのため手動でインストールします。現状、「不明なデバイス」として表示されています。(これをしないでFLIPを立ち上げでもデバイスが認識されません。)

「不明なデバイス」をクリックで選択し、のプロパティを表示します。

ドライバの更新をクリック。

コンピュータを参照してドライバーソフトウェアを検索します」を選択。

先ほどインストールしたFLIPのディレクトリまで辿り、usbというフォルダを選択して次へ。これで完了です。

FLIPでファームウェアの書き換えの準備

書き込みには手順があります。この手順を守らないとファームウェアの書き換えすらできませんので注意が必要です。

手順①
USBを抜いた状態(電源を入れていない状態)でArduinoのUSBレセプタクル近くにあるICSPの4ピン,6ピンを短絡します。

手順②
USBケーブルを差し込み(電源を入れ)、数秒経ったらICSPの5ピン,6ピンの短絡を解除します。Windowsの場合、短絡を解除した時点でデバイスの認識音が鳴るはずです。

これでArduinoの本体(ATMEGA328P)ではなくサブチップセットに対してPCが認識するようになります。

FLIPでファームウェアの書き換え

左上にあるICのアイコンをクリックします。

対応するデバイスを選択します。どのデバイスか分からない場合、チップの刻印を見てみましょう。私の場合、ATMEGA16U2でした。

ATMELの文字が青くなれば認識された証拠です。

File>>Load HEC Fileをクリック。mocolufa-maseter>>dualmoco.hexを選択して、左下のRunをクリックします。

数秒で書き込みは完了します。特にエラーが出なければ成功です。

MIDIプログラムを書き込む

プログラム書き込みの準備

その前に、ArduinoをこのままPCに接続するとMIDIデバイスとして認識されてしまいます。これを回避するために、USBケーブルをPCに接続する前にICSPの4ピン,6ピンを短絡させ、次に数秒待ってから短絡を解除するとArduinoとして認識されます。

一度この立ち上げ方をすれば、電源を落とすまでは設定が継続されます。頻繁にMIDIのテスト/Arduinoプログラムの書き換えを繰り返し行う場合はICSPの4ピン,6ピンの間にスイッチを取り付けておけば便利でしょう。

サンプルプログラム

いよいよMIDIライブラリを使ったプログラムを書き込みます。下記のサンプルプログラムはMIDIの出力のみを最低限実現するプログラムです。

このサンプルプログラムでは、Arduinoが出力するMIDI信号の変化を確認したいので、ドレミファソラシドを繰り返し出力するようにします。

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE(); // MIDIクラスのインスタンスとして"MIDI"を生成する。

int table[8] = {48,50,52,53,55,57,59,60}; //ドレミファソラシド

void setup() {
  MIDI.begin(1);
}

void loop() {
  for(int i = 0; i < 8; i++){
    //ノート出力
    MIDI.sendNoteOn(table[i],127,1);  // ノートオン
    delay(1000);                // 1秒待機
    MIDI.sendNoteOff(table[i],0,1);   // ノートオフ
  }
}

ちょっとだけ解説

ハイライトしている行がMIDIに関わる命令です。

MIDI_CREATE_DEFAULT_INSTANCE();
MIDIクラスのインスタンス(MIDIに関わる処理をしてくれる人)を作成します。

MIDI.begin(1);
MIDIのチャンネル1をオン(起動)します。一つしかMIDI出力をしない場合はとりあえず(1)としましょう。

MIDI.sendNoteOn(table[i],127,1);
MIDIノートを127(MAXのボリューム)でチャンネル1に出力します。tableはプログラム上部で宣言しているノート番号です。48,50,52,53,55,57,59,60は、それぞれドレミファソラシドに対応したノート番号です。

MIDI.sendNoteOff(table[i],0,1);
ノート番号table[i]の音をoffします。

さっそく鳴らしてみよう

WEBサイト上に実現されたシンセイサイザを使って音の確認をします。

①プログラムの完了したArduinoをPCに接続し、①次に下記のサイトをアクセスしましょう。Plug and Play(途中で刺しても動く)機能はないのでこの立ち上げ順序が重要です。サイトはF5で再読み込みしてもいいので、Arduinoのプログラムを何度も書き込みながら試す場合は刺しっぱなしでもいいでしょう。

※このサイトはGoogle Chromeで正常に動作します。

MIDI-driven Web Audio synthesizer

うまくいけば、MIDI_INのプルダウンに自動でMocoLUFAと表示され、PCのスピーカからドレミファソラシドの音階が聞こえてきます。元の音がよく分からない場合、右上のSUSTAINとRELEASEを最大にすると元の音が聞こえやすくなります。うまく読み込まれない場合はUSBの抜き差し上記サイトの再読み込みを実施しましょう。

参考サイト