レトロなDTM用MIDI音源には、操作パネルが無いものもあります
ハードウェアのMIDIコントローラー等はお高くつくのでPCだけでなんとか簡単にMIDI音源を操作できないかな。。。
と思ったことはありませんか?
今回は、Arduinoを使ってMIDI音源をコントロールしてみたいと思います
必要なもの
・Arduino&USBケーブル
Arduino UNOなど
・仮想MIDIドライバー
LoopMIDI
http://www.tobias-erichsen.de/software/loopmidi.html
・シリアル-MIDI変換ソフト
Hairless MIDI<->Serial Bridge
http://projectgus.github.io/hairless-midiserial/
・MIDI音源
これがないと始まらない!?
※USB接続できないものは別途MIDIインターフェースが必要です
ArduinoやArduinoIDEで使用可能な各種開発ボードをUSBケーブルで接続します
Serial portにArduinoのCOMポート、MIDI OutにMIDI音源へのインターフェースを設定し、MIDI送信するアプリケーションの出力をloopMIDIにしてください
Arduinoにプログラムを転送するときは、左上のチェックボックスをOFFにしないと転送時にエラーになります
MIDI信号の受け取り方ですが
このように、1バイトずつMIDI信号を拾ってもよいのですが
while (Serial.available() ) {
data = Serial.read();
}
MIDIライブラリというものがあるのでそちらを使うと簡単です
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
Arduinoのライブラリはこのようにグローバルにインスタンスを持つのが一般的な様です
まずは初期化
void setup()
{
MIDI.begin(MIDI_CHANNEL_OMNI);
MIDI.turnThruOff();
Serial.begin(115200);
}
シリアル-MIDI変換ソフトの通信速度設定も115200に合わせておきましょう
メインループは大まかにこんな感じです
void loop()
{
uint8_t ch, sts, d1, d2;
if (MIDI.read()) {
sts = MIDI.getType();
d1 = MIDI.getData1();
d2 = MIDI.getData2();
ch = MIDI.getChannel();
// MIDIデーター改ざん処理
// MIDIデーター送信
MIDI.send( sts, d1, d2, ch);
}
}
setupで、
MIDI.turnThruOff()
と記述して、そのままOUTにTHRUされないようにして、自分で
MIDI.send()
を使って改ざんしたデーターを送信してあげるという流れになります
例えば、すべてのバンクセレクトを0にする場合
// MIDIデーター改ざん処理
if (sts == midi::ControlChange && d1 == midi::BankSelect) {
d2 = 0;
}
の様な感じです
この場合のmidi::BankSelectは0(LSB)です
32(MSB)を設定してあげる場合は定義が無い様なので直値で追加してみてください
デバイス一覧に出てくるものであれば、Microsoft GS Wavetable Synth等のソフトウェア音源でも操作可能です
実際のところ、X68kの出たなツインビーがSC-55mkIIでちゃんと鳴らないってところからこのコーディングに至りました
ArduinoUNOにMIDIシールドを付けて、実機でも動作可能なのでぜひ試してみてください