すごい参考になる資料 https://www.slideshare.net/tadfmac/arduinomidi MOCOの焼き方が書かれている
おそらく
Serial.begin(9600);
のせいで異なるフォーマットで通信していた可能性がある
ソースコード : http://arduinomidilib.sourceforge.net/a00001.html#ac34d163205bb01ac5e03df7e64facebe
ソースコード sendControlChange : http://arduinomidilib.sourceforge.net/a00001.html#a3a80e9bd2cfdb619be91d80e8f3b7825
なぜかMIDI.send***は使い物にならない
↓を参考に: サンプルコード
http://forum.arduino.cc/index.php?topic=293460.0
#include <MIDI.h> #include <midi_Defs.h> #include <midi_Message.h> #include <midi_Namespace.h> #include <midi_Settings.h> //http://forum.arduino.cc/index.php?topic=293460.0 MIDI_CREATE_DEFAULT_INSTANCE(); void setup() { MIDI.begin(); } void loop() { for(int i=0; i<128; i++){ for(int j=0; j<128; j++){ for(int c=1; c<17; c++){ MIDI.send(midi::ControlChange, i, j, c); } } } }
Ch: 1 (固定) Controller : potにより変更 Value : pot 0-127, (btn 0 or 127)
#define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(3000); digitalWrite(LED_PIN, LOW); delay(3000); }
/* 8chマルチプレクサ4051を使って8chVRの値を読み取る 2018/04/21 FiFI */ #include <MIDI.h> #include <midi_Defs.h> #include <midi_Message.h> #include <midi_Namespace.h> #include <midi_Settings.h> MIDI_CREATE_DEFAULT_INSTANCE(); // ========================== // 構造体 // ========================== struct MIDI_NOTE { int ControlNumber; // 出力するノート番号 int Old; // 前の値 }; // ========================== // VR構造体配列 // ========================== struct MIDI_NOTE VR_List[8] = { {10, 0}, // ControlNumber 0, value 0 {11, 0}, // ControlNumber 1, value 0 {12, 0}, // ControlNumber 2, value 0 {13, 0}, // ControlNumber 3, value 0 {14, 0}, // ControlNumber 4, value 0 {15, 0}, // ControlNumber 5, value 0 {16, 0}, // ControlNumber 6, value 0 {17, 0}, // ControlNumber 7, value 0 }; int VR_COUNT = 8; // ちゃんと更新する // ========================== // BTN構造体配列 // ========================== struct MIDI_NOTE BTN_List[8] = { {20, 0}, // ControlNumber 0, value 0 {21, 0}, // ControlNumber 1, value 0 {22, 0}, // ControlNumber 2, value 0 {23, 0}, // ControlNumber 3, value 0 {24, 0}, // ControlNumber 4, value 0 {25, 0}, // ControlNumber 5, value 0 {26, 0}, // ControlNumber 6, value 0 {27, 0}, // ControlNumber 7, value 0 }; int BTN_COUNT = 8; // ちゃんと更新する // ========================== // MUXのチャンネル配列 (定数) // ========================== int MUX_CHANNELS[8][3] = { // A, B, C, (s0, s1, s2) {0, 0, 0}, // Channel 0 {1, 0, 0}, // Channel 1 {0, 1, 0}, // Channel 2 {1, 1, 0}, // Channel 3 {0, 0, 1}, // Channel 4 {1, 0, 1}, // Channel 5 {0, 1, 1}, // Channel 6 {1, 1, 1}, // Channel 7 }; struct s_mux_pins { int s0; int s1; int s2; int io_a; // アナログ入力PIN (不使用は-1) int io_d; // デジタル入力PIN (不使用は-1) }; // =============================================== // 初期化処理 // =============================================== // VR用 8ch MUX (pin配置はユーザが変更可能です) struct s_mux_pins VR_MUX_PIN = {2, 3, 4, 0, -1}; // s0,s1,s2,io_a,io_d // BTN用 8ch MUX (pin配置はユーザが変更可能です) struct s_mux_pins BTN_MUX_PIN = {3, 4, 5, -1, 6}; // s0,s1,s2,io_a,io_d void setup() { // VR MUX Setup pinMode(VR_MUX_PIN.s0, OUTPUT); pinMode(VR_MUX_PIN.s1, OUTPUT); pinMode(VR_MUX_PIN.s2, OUTPUT); digitalWrite(VR_MUX_PIN.s0, LOW); digitalWrite(VR_MUX_PIN.s1, LOW); digitalWrite(VR_MUX_PIN.s2, LOW); // BTN MUX Setup pinMode(BTN_MUX_PIN.s0, OUTPUT); pinMode(BTN_MUX_PIN.s1, OUTPUT); pinMode(BTN_MUX_PIN.s2, OUTPUT); digitalWrite(BTN_MUX_PIN.s0, LOW); digitalWrite(BTN_MUX_PIN.s1, LOW); digitalWrite(BTN_MUX_PIN.s2, LOW); // MIDI Setup MIDI.begin(); // MIDI.turnThruOff(); // Serial Setup // Serial.begin(9600); // 悪い影響与えている可能性あり } // =============================================== // ヘルパー // =============================================== boolean checkChange(int val1, int val2, int range); int readMux4VR(int channel); // =============================================== // メインルーチン // =============================================== void loop() { int i; // TODO: 一巡目は無視 // ============================================ // // Read VR Mux // ============================================ // for (int i = 0; i < VR_COUNT; i++) { int analog = readMux4VR(i); int vel = map(analog, 0, 1023, 0, 127); // VRの現在値を取得 MIDI_NOTE tVR = VR_List[i]; // MIDI送信先情報 // ローパス // vel = (VR1.old * 0.9) + (vel * 0.1); if (checkChange(vel, tVR.Old, 1)) { // MIDI.sendNoteOn(0, vel, tVR.ControlNumber); // 書き出す (note no, velocity, ch) MIDI.send(midi::ControlChange, tVR.ControlNumber, vel, 1); tVR.Old = vel; VR_List[i] = tVR; // Serial.print(i); // Serial.print(":"); // Serial.print(vel); // Serial.print(":"); // Serial.print(analog); // Serial.println(""); // 改行 // delay(10); } } // ============================================ // // Read Button Mux // ============================================ // } // + 以下、ヘルパー関数 + // // =============================================== // ヘルパー関数 // =============================================== // これはセンサー入力のフラつき対策 boolean checkChange(int val1, int val2, int range) { int l, h; l = val2 - range; h = val2 + range; if ((val1 < l) || (h < val1)) { return true; } return false; } int readMux4VR(int channel) { int controlPins[] = {VR_MUX_PIN.s0, VR_MUX_PIN.s1, VR_MUX_PIN.s2}; digitalWrite(VR_MUX_PIN.s0, MUX_CHANNELS[channel][0]); digitalWrite(VR_MUX_PIN.s1, MUX_CHANNELS[channel][1]); digitalWrite(VR_MUX_PIN.s2, MUX_CHANNELS[channel][2]); //read the value at the SIG pin int val = analogRead(VR_MUX_PIN.io_a); return val; }