ArduinoとMIDI vol.1 ― 2014年10月25日
ArduinoでMIDI【リサーチ】
ArduinoにはMIDIシールドなどMIDIに関連したシールドが販売されています。また、ArduinoクローンメーカーでMIDIに
特化したMIDUINOもあります。ArduinoはMIDIを使用したフィジカルコントローラーを作成するのに大変都合が良く出来ています。
Arduinoを使用した楽器を作ったり、MIDIコントローラ、MIDIシーケンサーやMIDIデータのアナライザーとして作成したり、コネクターや変換器として利用したりとArduinoは結構活躍しています。
最近のMIDI機器はPCでの利用が前提のせいでしょうかUSB MIDIになっています。Arduino UNO R2、R3でもUSBコントローラーに使用されているATmega8U2やATmega16U2はファームウエアを書き換えることで特別な
ハードウエアなしでUSB MIDIに変身できます。
MIDIに関するメッセージ仕様はこちらを参照ください。
- 【基本】Arduino MIDI Library
Arduinoスケッチ作成に使用します。ダウンロードしてlibrariesフォルダーにコピーします。
Arduino MIDI Libraryの解説は少なくここ、またはここ(英文)を参照してください。 - 【基本】Arduino による MIDI 機器の制御 ハードウエア作製
- 【基本】MIDIデータを受信する ハードウエア作製
Arduino UNO R3を使用してbootloaderをUSB MIDI用のファームウエアに書き換えてしまうとMIDIライブラリーで作成したスケッチは変更なしでUSB MIDI機器になります。 - 【応用】MIDIアナログシーケンサー
- 【応用】MIDI コントローラー
- 【応用】超簡単!Arduino UNOをMIDIコントローラーにしよう!
- 【応用】Arduinoで自作MIDIコントローラーを作ってみる
- 【応用】MIDI音源を作ってみた
MIDI KITSではキット販売と一緒にサンプル回路とスケッチが掲載されています。大変参考になります。
その他にSDカードの保存したMIDIファイルを再生するMr. MIDI2プレーヤーがあります。
このプレーヤーはArduinoと同じAVRマイコンを使用しています。このプレーヤーの出力はMIDIですので音源に接続して音を出します。YAMAHAのピアノプレーヤーなどにも出力できます。
ArduinoとMIDI vol.2 ― 2014年10月25日
ArduinoでMIDIコントローラーを作成する。(プロトタイプ)
SainSmart UNO R3がうまく動作したので目的のMIDIコントローラーの作製に入ります。ATmega328Pはアナログポートが6ポートしかありませんので74HC4051や74HC4052などLOGIC ANALOG MULTIPLEXERSを利用してアナログポート数を拡張する必要があります。今回は9個のVRを接続します。
- MIDI出力で接続:
Arduinoのシリアル出力を使用します。Arduino MIDI Libraryを使用してスケッチを作成します。 - USB MIDI:
LUFAでbootloaderを書き換えてUSB MIDI化します。
Arduinoで作成したMIDIコントローラーがUSB MIDI機器として認識してくれれば市販のDAWソフトのフィジカルコントローラーとして利用できます。
ArduinoとMIDI vol.3 ― 2014年10月25日
ArduinoでMIDIコントローラーを作成する。(スケッチ)
Arduino MIDI コントローラーを参考にLOGIC ANALOG MULTIPLEXERSは手持ちのTI 4052を使用したスケッチを書いてみました。 MIDIチャネルの選択にKeypadを使用しています。いくつかの問題はありますが、一応動いています。
#include <MIDI.h> #include <Keypad.h> MIDI_CREATE_DEFAULT_INSTANCE(); #define LED 13 #define A4052 10 #define B4052 11 const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; //connect to the row pinouts of the keypad byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad byte colPins[COLS] = {5, 4, 3, 2}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); int sensor1Pin = 0; int sensor2Pin = 1; int volumePin = 2; int sensorValue; int midiValue = 0; int old_midiValue[8]; int old_volValue; int midiCh = 1; int r0 = 0; // 4052 Abit int r1 = 0; // 4052 Bbit int row = 0; int count = 0; byte bin[] = {0,1,10,11}; //bin array org int cc[] = {10,11,91,93,94,64,65,66}; // SC-88Pro Control change // PAN, EXP, Reverb, Chorus, Dely, Hold1, Portamento, Sostenuto boolean checkChange(int val1,int val2, int range){ int l,h; l = val2-range; h = val2+range; if((l > val1)||(h < val1)){ return true; } else { return false; } } void control(){ if(count > 3){ count = 0; } row = bin[count]; r0 = row & 0x01; r1 = (row>>1) & 0x01; digitalWrite(A4052,r0); digitalWrite(B4052,r1); sensorValue = analogRead(volumePin); // read volume midiValue = sensorValue / 8; if(checkChange(midiValue, old_volValue, 2)){ MIDI.sendControlChange(7,midiValue,midiCh); old_volValue = midiValue; } int ccc = count; sensorValue = analogRead(sensor1Pin); //read Y ch midiValue = sensorValue / 8; if(checkChange(midiValue, old_midiValue[ccc], 2)){ MIDI.sendControlChange(cc[ccc],midiValue,midiCh); old_midiValue[ccc] = midiValue; } ccc = count + 4; sensorValue = analogRead(sensor2Pin); // read X ch midiValue = sensorValue / 8; if(checkChange(midiValue, old_midiValue[ccc], 2)){ MIDI.sendControlChange(cc[ccc],midiValue,midiCh); old_midiValue[ccc] = midiValue; } count++; } void setup(){ pinMode(LED, OUTPUT); //LED13 pinMode(A4052, OUTPUT); //4052 Abit pinMode(B4052, OUTPUT); //4052 Bbit old_volValue = 0; for(int i=0; i>7; ++i){ old_midiValue[i] = 0; } MIDI.begin(1); } int keybuf = 1; int keycnt = 0; void loop(){ char key = keypad.getKey(); if(key){ if (key == '#'){ midiCh = keybuf; keybuf = 1; keycnt = 0; }else{ if(keycnt > 0){ keybuf = keybuf * 10 + atoi(&key); }else{ keybuf = atoi(&key); } keycnt += 1; } } control(); }
使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。
作成したMIDIコントローラーはUSB MIDI機器として認識してデバッグにはMIDI-OX というMIDIユーティリティーソフトを使用しています。フィジカルコントローラーとしてはいまいちですがこれからブラシアップしていく予定です。
最近のコメント