# Arduino すごい参考になる資料 https://www.slideshare.net/tadfmac/arduinomidi MOCOの焼き方が書かれている # pitch bendエラーの原因が分かった おそらく ``` Serial.begin(9600); ``` のせいで異なるフォーマットで通信していた可能性がある # Arduino Midi Librari リファレンス ソースコード : 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 #include #include #include #include //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) ## デバイスマネージャの認識/表示についてのメモ - 通常時 : USER-PC > ポート(COMとLPT) > Arduino Uno (COM5) - DFUA時 : USER-PC > ATMEGGA > 16U2 - ## Moco For LUFAの焼き方 - windows [Dm9records :: Moco for LUFA](http://www.dm9records.com/index.php/tips/arduino/moco/) - 焼きこみソフトをダウンロード http://www.microchip.com/developmenttools/productdetails.aspx?partno=flip - libusb0.dll が必要: - dll Download : https://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip/download - READMEを読みながら適当に配置 - [atmel Flip を使用時のatlibusbdfu.dll not foundの対処法 - ブログ](https://blog.goo.ne.jp/iroha112233/e/44c0fe332fc69344e232514bfcd9fc0d) - ドライバを更新した。ら。エラーなし。 - Mocoの.hexファイルをダウンロード https://github.com/kuwatay/mocolufa ## 備忘録 - Arduino公式のMIDIライブラリをダウンロード/配置 Arduino/librariesの下に配置 http://playground.arduino.cc/Main/MIDILibrary ### LEDチカで動作を確認 ``` #define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(3000); digitalWrite(LED_PIN, LOW); delay(3000); } ``` ## スイッチを押してみよう https://qiita.com/tadfmac/items/9136f47ae1eea99a4ef7#%E6%9D%90%E6%96%99%E3%82%92%E9%9B%86%E3%82%81%E3%82%88%E3%81%86 ## ISCPのピン配置 http://www.arduinolab.net/in-circuit-system-programming-icsp-using-usbtinyisp-and-arduino-ide/ # 受け側 C# NAudio.MIDIIn https://github.com/naudio/NAudio/blob/master/Docs/MidiInAndOut.md ## ソースコード(2018/4/21) ``` /* 8chマルチプレクサ4051を使って8chVRの値を読み取る 2018/04/21 FiFI */ #include #include #include #include #include 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; } ```