ArduinoとMIDI vol.3 ― 2014年10月25日
ArduinoでMIDIコントローラーを作成する。(スケッチ)
Arduino MIDI コントローラーを参考にLOGIC ANALOG MULTIPLEXERSは手持ちのTI 4052を使用したスケッチを書いてみました。 MIDIチャネルの選択にKeypadを使用しています。いくつかの問題はありますが、一応動いています。
MIDI Control Change for SC-88Pro
使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。
#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ユーティリティーソフトを使用しています。フィジカルコントローラーとしてはいまいちですがこれからブラシアップしていく予定です。
コメント
トラックバック
このエントリのトラックバックURL: http://azss.asablo.jp/blog/2014/10/25/7473574/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
最近のコメント