ArduinoをUSB-MIDIデバイス化してDAWでLED目ん玉コントロール
Moco for LUFAというありがたいファームウェアでArduinoのUSBシリアル変換チップをUSB-MIDI変換するように書き換えてDAWソフトReasonでLEDをコントロールできるにしました!
目次
構成
マイコンはArduino Unoを使用
目ん玉には68個のLED(Neopixel)を使用
Arduino USB-MIDIデバイス化
以下が非常に参考になりました! ホントこの通りやっただけです。
DAWソフトReasonの設定
DAWはMIDI出力できればなんでもいいのですが今回はReasonを使用します。
外部MIDIインストゥルメントを配置しデバイスに”MocoLUFA”を選択します。
Arduino IDEコード
MIDIキーボードのノートで瞳の色を変更し、ピッチでまばたき、Modulationで左右に動かします。
Arduino用MIDIライブラリとして以下を使用しました。
https://github.com/FortySevenEffects/arduino_midi_library/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
#include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE(); #include <Adafruit_NeoPixel.h> uint8_t Note, Pitch, Mod; #define PIN 6 Adafruit_NeoPixel led = Adafruit_NeoPixel(68, PIN, NEO_GRB + NEO_KHZ800); int blackNum = 24; int pupilNum = 12; uint32_t color; int brightness = 40; int LR =0; //Black eye L&R animation int blackLED[15][24] = {{12,32,35,55,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, {12,13,31,36,54,55,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, {11,13,14,30,37,53,54,56,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, {10,11,14,15,29,38,52,53,56,57,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, { 9,10,11,12,15,16,28,33,34,39,51,52,55,56,57,58,68,68,68,68,68,68,68,68}, { 0, 8, 9,10,11,12,13,16,17,27,32,35,40,50,51,54,55,56,57,58,59,67,68,68}, { 0, 1, 7, 8, 9,10,13,14,17,18,26,31,36,41,49,50,53,54,57,58,59,60,66,67}, { 1, 2, 6, 7, 8, 9,14,15,18,19,25,30,37,42,48,49,52,53,58,59,60,61,65,66}, { 2, 3, 5, 6, 7, 8,15,16,19,20,24,29,38,43,47,48,51,52,59,60,61,62,64,65}, { 3, 4, 5, 6, 7,16,17,20,21,23,28,39,44,46,47,50,51,60,61,62,63,64,68,68}, { 4, 5, 6,17,18,21,22,27,40,45,46,49,50,61,62,63,68,68,68,68,68,68,68,68}, { 4, 5,18,19,26,41,48,49,62,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, { 4,19,20,25,42,47,48,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, {20,21,24,43,46,47,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}, {21,23,44,46,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}}; //pupil L&R animation int pupilLED[15][12] = {{33,34,68,68,68,68,68,68,68,68,68,68}, {32,33,34,35,68,68,68,68,68,68,68,68}, {12,31,32,33,34,35,36,55,68,68,68,68}, {12,13,30,31,32,33,34,35,36,37,54,55}, {13,14,29,30,31,32,35,36,37,38,53,54}, {14,15,28,29,30,31,36,37,38,39,52,53}, {15,16,27,28,29,30,37,38,39,40,51,52}, {16,17,26,27,28,29,38,39,40,41,50,51}, {17,18,25,26,27,28,39,40,41,42,49,50}, {18,19,24,25,26,27,40,41,42,43,48,49}, {19,20,23,24,25,26,41,42,43,44,47,48}, {20,21,22,23,24,25,42,43,44,45,46,47}, {21,22,23,24,43,44,45,46,68,68,68,68}, {22,23,44,45,68,68,68,68,68,68,68,68}, {22,45,68,68,68,68,68,68,68,68,68,68}}; //Blink animation int eyelid = 0; int eyelidNum[8] = {0,4,8,16,24,34,44,56}; int eyelidLED[56] = {64,65,66,67,58,59,60,61,56,57,62,63,49,50,51,52,47,48,53,54,38,39,40,41,46,55,36,37,42,43,26,27,28,29,35,44,24,25,30,31,15,16,17,18,34,45,23,32,13,14,19,20,6,7,8,9}; void setup() { MIDI.begin(); led.begin(); led.setBrightness(brightness); // Initial Brightness 40 led.show(); // Initialize all pixels to 'off' color = led.Color(0, 177, 55); //pupil color } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return led.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return led.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return led.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } void blink(int eyelid, int LR) { if (eyelid != 8){ //白目 for(uint16_t i=0; i<led.numPixels(); i++) { led.setPixelColor(i, led.Color(66, 66, 66)); } //黒目 for(uint16_t i=0; i<blackNum; i++) { led.setPixelColor(blackLED[LR][i], color); } //瞳孔 for(uint16_t i=0; i<pupilNum; i++) { led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66)); } //まぶた for(int i=0; i < eyelidNum[eyelid]; i++) { led.setPixelColor(eyelidLED[i], 0); } } else if (eyelid == 8){ led.clear(); } led.show(); } void loop() { if (MIDI.read()) { switch(MIDI.getType()) { case midi::NoteOn: Note = MIDI.getData1(); // ノートNo.48-72 ALESIS Q25 break; case midi::PitchBend: Pitch = MIDI.getData2(); //ini=64 (0-127) break; case midi::ControlChange: //CCを受信 Mod = MIDI.getData2(); //CC値 38-127 break; } //ノートで瞳の色変更 byte NoteColor = map(Note, 48, 72, 0, 255); color = Wheel(NoteColor); //PitchBendでまばたき eyelid = map(Pitch, 0, 64, 8, 0); if (eyelid > 8) { eyelid = 8; } if (eyelid < 0) { eyelid = 0; } //Modulationで瞳左右 LR = map(Mod, 38, 127, 0, 14); if (LR > 14) { LR = 14; } if (LR < 0) { LR = 0; } blink(eyelid, LR); } } |
動作
リアルタイムにコントロールしてもよし 予めシーケンス入力して演奏と同期させるのもよし いつかこれ使ってライブしたいなぁ。
参考
- https://webmusicdevelopers.appspot.com/codelabs/arduino-mocolufa/index.html?ja-jp
- http://necobit.com/2015/05/arduino-de-midi.html
- http://necobit.com/2015/09/arduino-midi.html
- http://ichirowo.com/2011/05/arduino-midi-library/
追記(16/9/15)
Make: Japan様で紹介していただけました!
初めまして。質問ですが、MIDIでモーターも制御できたりするのでしょうか??
omatsuさんコメントありがとうございます!
マイコンのアナログピンをMIDIで制御してモータドライバ介してモータ駆動などで
イケると思います。
たとえば以下のようなモータドライバなど
http://akizukidenshi.com/catalog/g/gK-09848/
なるほど!すごいですね!!
私は全くの初心者なのですが、
モーターを制御してその音を収録したいとおもっております。
映像作品でサウンドデザインするためです。
是非ともアドバイス頂けたら幸いです!
面白そうですね!
モータの回転数で音を変化させるってことですよね?
MIDIのnoteやccでモーター回転数を変化させるのは可能です。
以下を考慮して部品や構成選定するのが良いかと思います。
① 使用するモータの電圧範囲、数量
② ①より使用するモータドライバと制御用マイコン、電源が絞られます
もし我々で協力できることがあればお気軽にお問い合わせください♪
失礼でなければメール対応も可能です。
ありがとうございます!ぜひご協力お願いしたいです!
また改めてご連絡させていただきますね!
メール対応もぜひお願いしたいと思っております。
よろしくお願いします!!
ありがとうございます!
ご連絡お待ちしております!
こんばんわ。質問のメールをお送りしたいのですがどちらにお送りすれば良いでしょうか?
分からずにすみません。。。