すごい参考になる資料 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.send(midi::ControlChange, tVR.ControlNumber, vel, 1);
tVR.Old = vel;
VR_List[i] = tVR;
}
}
// ============================================ //
// 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;
}