この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
usb_midi_controller:arduino_midi_controller [2018/04/21 02:05] 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 リファレンス | ||
| ライン 111: | ライン 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; | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | ``` | ||