スライドホイッスルをMIDI楽器化! ”MEMIDION”
スライドホイッスルをMIDI信号で自動で動くようにしてみました。MEMIDIONです。
MEMIDIONはMIDIキーボードで動かして楽器にもなるし、DAWで動かしてMIDI音源としても使えます。
いずれも息を吹きかけないと音はならないが。。。。
制御はUSB-MIDIデバイス化したArduinoで行いました。
目次
構成
全体
MEMIDION
もろもろの部品を木の板に固定
部品
- マイコン Arduino UNO
USB-MIDIデバイス化して使用します。
- スライドホイッスル
- モーター ダブルギヤボックス
ここでは片側のモータ1個だけ使っています。ギア比は38.2:1で使用。
- モータドライバDRV8835
- トラック&ホイールセット
キャタピラをホイッスルのスライド部に固定しました。
-
赤外線近接距離センサモジュール VL6180X
詳細
ArduinoでモータドライバDRV8835を介してモータ(キャタピラ)制御。
距離センサVL6180Xでホイッスルのスライダーの先端の距離を測定してスライド量を制御。
Arduino USB-MIDIデバイス化
Moco for LUFAというファームウェアをArduinoに書きこんでArduinoをMIDIデバイスとして認識させます。以下が非常に参考になりました! ホントこの通りやっただけです。
DAWソフトReasonの設定
DAWはMIDI出力できればなんでもいいのですが今回はReasonを使用します。
外部MIDIインストゥルメントを配置しデバイスに”MocoLUFA”を選択します。
Arduino IDEコード
MIDIキーボードやDAWからのMIDI信号でスライドホイッスルのスライダをうごかして音階を変えます。スライド量は距離センサVL6180Xの測定値で制御しています。
Arduino用MIDIライブラリとして以下を使用しました。
https://github.com/FortySevenEffects/arduino_midi_library/
距離センサVL6180X用のライブラリは以下です。
https://github.com/pololu/vl6180x-arduino
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 |
#include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE(); #include <Wire.h> #include <VL6180X.h> uint8_t Note, NoteOld; VL6180X sensor; int meas; int aim = 50; int diff = 5; int moveTime = 100; void setup() { Wire.begin(); MIDI.begin(); pinMode(2, OUTPUT); pinMode(3, OUTPUT); sensor.init(); sensor.configureDefault(); sensor.setTimeout(500); } void loop() { //MIDIキーボード検出 if (MIDI.read()) { switch(MIDI.getType()) { case midi::NoteOn: //スライド戻し digitalWrite(2, HIGH); digitalWrite(3, LOW); //delay(70); delay(10); digitalWrite(2, LOW); digitalWrite(3, LOW); Note = MIDI.getData1(); // ノートNo.48-72 ALESIS Q25 break; case midi::NoteOff: Note = 255; break; } } //スライド距離設定 if(Note == 57) aim = 22; //A if(Note == 58) aim = 33; //A# if(Note == 59) aim = 41; //B if(Note == 60) aim = 52; //C if(Note == 61) aim = 62; //C# if(Note == 62) aim = 71; //D if(Note == 63) aim = 81; //D# if(Note == 64) aim = 90; //E if(Note == 65) aim = 97; //F if(Note == 66) aim = 103; //F# if(Note == 67) aim = 109; //G if(Note == 68) aim = 116; //G# if(Note == 69) aim = 121; //A if(Note == 70) aim = 126; //A# if(Note == 71) aim = 129; //B if(Note == 72) aim = 133; //C //距離センサ測定 meas = sensor.readRangeSingleMillimeters(); //モータ動作 if(meas > (aim - diff) && meas < (aim + diff)){ digitalWrite(2, LOW); digitalWrite(3, LOW); }else if(meas > aim){ digitalWrite(2, LOW); digitalWrite(3, HIGH); }else if(meas < aim){ digitalWrite(2, HIGH); digitalWrite(3, LOW); } } |
動作
MIDIキーボードの鍵盤でスライド量が変化します。
DAWでMIDI音源として自動演奏も可能です。息は吹き続けなくてはいけませんが。。。。
音階微妙ですが。。。家にあるものでなんとかできました! 🙂
追記
改良 (2018/10/20)
かっこよく筐体作って機能も追加しました♪
☟読んでみてください!