この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
usb_midi_controller:arduino_midi_controller [2018/04/21 02:01] fifi |
usb_midi_controller:arduino_midi_controller [2018/04/21 02:19] (現在) fifi [ソースコード(2018/4/21)] |
||
---|---|---|---|
ライン 3: | ライン 3: | ||
すごい参考になる資料 https://www.slideshare.net/tadfmac/arduinomidi | すごい参考になる資料 https://www.slideshare.net/tadfmac/arduinomidi | ||
MOCOの焼き方が書かれている | MOCOの焼き方が書かれている | ||
+ | |||
+ | # pitch bendエラーの原因が分かった | ||
+ | おそらく | ||
+ | ``` | ||
+ | Serial.begin(9600); | ||
+ | ``` | ||
+ | のせいで異なるフォーマットで通信していた可能性がある | ||
+ | |||
# Arduino Midi Librari リファレンス | # Arduino Midi Librari リファレンス | ||
+ | ソースコード : | ||
http://arduinomidilib.sourceforge.net/a00001.html#ac34d163205bb01ac5e03df7e64facebe | http://arduinomidilib.sourceforge.net/a00001.html#ac34d163205bb01ac5e03df7e64facebe | ||
- | なぜかMIDI.send***は使い物にならない | + | ソースコード sendControlChange : http://arduinomidilib.sourceforge.net/a00001.html#a3a80e9bd2cfdb619be91d80e8f3b7825 |
- | ↓を参考に | + | |
+ | なぜかMIDI.send***は使い物にならない | ||
+ | ↓を参考に: サンプルコード | ||
http://forum.arduino.cc/index.php?topic=293460.0 | http://forum.arduino.cc/index.php?topic=293460.0 | ||
ライン 108: | ライン 119: | ||
+ | ## ソースコード(2018/4/21) | ||
+ | ``` | ||
+ | |||
+ | /* | ||
+ | 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; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | ``` |