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(); }
作成したMIDIコントローラーはUSB MIDI機器として認識してデバッグにはMIDI-OX というMIDIユーティリティーソフトを使用しています。フィジカルコントローラーとしてはいまいちですがこれからブラシアップしていく予定です。