Unopad-Abletonを搭載したArduinoMIDIコントローラー
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 9 | ||||
| × | 1 |
必要なツールとマシン
> |
|
アプリとオンラインサービス
| ||||
| ||||
|
このプロジェクトについて
まとめ
MIDIコントローラーのほとんどのチュートリアルとプロジェクトは、Arduinoの動作の説明のみに基づいていますが、DAW自体での使用にはあまり基づいていません。必要なものをすべて1か所にまとめたチュートリアルを作成したいと思います。このプロジェクトでは、初心者がコントローラーを作成して使用するプロセスをよりよく理解できるように支援したいと思いました。これが誰かに役立つことを願っています。
私は長い間MIDIコントローラーを作りたかったのですが、ついにそれを作りました。今度はプロジェクトをあなたと共有します。 USB経由でMIDIメッセージを送信する機能がないArduinoUnoを使用したため、特別なプログラムを使用する必要がありました(テキストの後半で説明します)。
次のセクションでは、電気回路、Arduinoコード、およびコンピューターとDAW(この場合はAbleton)への接続方法について説明します。
回路
とてもシンプルな回路です。私は9つのプッシュボタンを使用しましたが、複数のボタンを押す機能が必要だったため、マトリックスでは使用しませんでした(より簡単で、未使用のデジタルピンがあります-マトリックスでは9を使用すると6になります)。
ボタン3 ==> D2ボタン2 ==> D3ボタン1 ==> D4ボタン6 ==> D5ボタン5 ==> D6ボタン4 ==> D7ボタン9 ==> D8ボタン8 ==> D9ボタン7 ==> D10
MIDIマッピング
36から45までの9つのMIDIノートと、NOTE_ONとNOTE_OFFを定義しました。
このMIDIチュートリアルは、MIDI言語を使用してMIDIプロトコルを使用するデバイスを制御する方法を理解するのに役立ちます。
#define NOTE_ONE 36#define NOTE_TWO 37 //ここですべてのメモを定義します。#defineNOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127
MIDI over USB
Arduino Unoはそれ自体ではMIDIノートをDAWに送信できないため、LoopMidiとHairless MIDI <-> SerialBridgeの2つの追加プログラムを使用する必要があります。
LoopMidiを使用して、HairlessMidiでArduinoポートに接続するために使用できる仮想MIDIポートを作成します。
コードの説明
Buttonクラスを作成し、次のように使用します:
int NUMBER_BUTTONS =9; Button Button1(4、NOTE_ONE); Button Button2(3、NOTE_TWO); Button Button3(2、NOTE_THREE); Button Button4(7、NOTE_FOUR); Button Button5(6、NOTE_FIVE); Button Button6(5、NOTE_SIX); Button Button7(10、NOTE_SEVEN); Button Button8(9、NOTE_EIGHT); Button Button9(8、NOTE_NINE); Button * Buttons [] {&Button1、&Button2、&Button3、&Button4、&Button5、&Button6 、&Button7、&Button8、&Button9};
ボタンの実装の詳細については、Buttons.cppを参照してください。
抵抗を使用せず、ボタンをデジタルピンとグランドに接続するだけなので、INPUTの代わりにINPUT_PULLUPを使用します。
// Buttons.cpppinMode(_pin、INPUT_PULLUP);
これに関する唯一のトリッキーな部分は、 HIGH
を探していないことです。 あなたが想定しているような信号–ボタンは LOW
を発します <コード>(0)コード> 押されたとき。
//ボタンが押された場合if(state ==0){midiNoteOn(Buttons [i]-> Note、127); } //(state ==1){}
の場合、ボタンは押されません
これは、ボタンの初期状態が0ではなく1であることも意味します。
// Buttons.cpp _state =1;
すべてのNOTEONメッセージには、対応するNOTEOFFメッセージが必要です。ボタンを押すと、NOTE_ONメッセージが送信されます。ボタンを離すと、NOTE_OFFメッセージが送信されるので、初期状態に加えて、最後に記憶された状態をコードに追加しました。
// Buttons.cpp _lastState =1;
現在の状態が最後の状態と異なる場合にのみ、MIDIメッセージを送信します。
// Buttons.cppif(state!=_lastState){// ....}
この2つの関数を使用して、MIDIメッセージを送信します。関数のパラメータは注です および midiVelocity (最大速度を使用しました。)
void midiNoteOn(byte note、byte midiVelocity){Serial.write(NOTE_ON_CMD); Serial.write(注); Serial.write(midiVelocity);} void midiNoteOff(byte note、byte midiVelocity){Serial.write(NOTE_OFF_CMD); Serial.write(注); Serial.write(midiVelocity);}
プログラムロジックを関数 updateButtons
に配置しました 機能。
void updateButtons(){for(int i =0; i getButtonState(); //ボタンが押された場合if(state ==0){midiNoteOn(Buttons [i]-> Note、127); } //(state ==1)midiNoteOff(Buttons [i]-> Note、0);の場合、ボタンは押されません。 }}
関数はループメソッド内で呼び出されます。
void loop(){if(NUMBER_BUTTONS!=0)updateButtons();}
コントローラーをDAW(Ableton Live)で使用する
DAWを使い始めたばかりの私は、そこに何かを接続する方法を知りませんでした。 Korg Nanokeyを接続すると、Abletonはそれを自分で認識し、すぐにコントローラーを使用できるようになりました。これは(もちろん)Arduinoコントローラーには当てはまりませんでした。これはHIDデバイスではなく、PCがArduinoとして認識しているためです。
ここでは、Ableton Live10でArduinoMIDIコントローラーを接続して使用する方法を紹介します。
- Abletonと接続する
loopMIDI を開きます 次の画像のように新しい仮想MIDIポートを作成します。
<図> <図>hairless-midiserial を開きます 次の画像のように、シリアルポート、MIDI出力、MIDI入力を割り当てます。シリアルポートにはArduinoUnoポートを選択し、MIDI入力と出力には前の手順で作成した仮想MIDIポートを使用します。
Arduinoスケッチでボーレートを同じレートに設定します。ファイル>設定に移動します。 、そこでボーレートを設定する必要があります。
すべてが正しく行われていれば、コントローラーから送信されたMIDIメッセージをデバッグできます。コントローラのボタンを押して、ヘアレスMIDIで着信MIDIメッセージを確認します。
<図> <図>ヘアレスMIDIを閉じないでください!
Ableton Liveを開き、[オプション]タブ、[設定]の順に移動します。リンクMIDIタブは、この例のようになります。
<図>すべてが適切に接続されていること、およびAbletonがMIDIメッセージを読み取っていることを確認するために、Abletonの右上隅を確認します。次の例に示すように、コントローラーのボタンを押すと、一番上のボックスが点滅します。
<図>コントローラを使用する準備ができました!
- コントローラーをドラムラックとして使用 または キーボード
MIDIトラックを選択します。 モニター セクションで In を選択します 、自動の代わりに 、および MIDI to スピーカー出力を選択してください。キーボードの音が聞こえるはずです。ドラムラックについても同じことが必要です。
<図>
完成したプロジェクト
このプロジェクトでは古いスピーカーボックスと、家で見つけたプラスチックを使用しました。両方のプラスチックプレートをケースの寸法にカットし、ボタン用のドリル穴と後で追加する1つのLEDを作成しました。
別のMIDIコントローラーに使用するのと同じケースの古いスピーカーもあります。今回はノブとジョイスティックを使用します。
<図> <図> <図> <図> <図> <図> <図> <図><図> <図> <図>
やること
-CCモードに変更するためのボタンの長押し。
コード
- MidiDrumPad.ino
- Buttons.cpp
- Buttons.h
MidiDrumPad.ino Arduino
#include "Buttons.h" // ------ Notes -------------#define NOTE_ONE 36#define NOTE_TWO 37#define NOTE_THREE 38#define NOTE_FOUR 39#define NOTE_FIVE 40#define NOTE_SIX 41#define NOTE_SEVEN 42#define NOTE_EIGHT 43#define NOTE_NINE 44#define NOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127 // ------------------ ------ int NUMBER_BUTTONS =9; Button Button1(4、NOTE_ONE); Button Button2(3、NOTE_TWO); Button Button3(2、NOTE_THREE); Button Button4(7、NOTE_FOUR); Button Button5(6、NOTE_FIVE); Button Button6(5、NOTE_SIX); Button Button7(10、NOTE_SEVEN); Button Button8(9、NOTE_EIGHT); Button Button9(8、NOTE_NINE); Button * Buttons [] {&Button1、&Button2、&Button3、&Button4、&Button5、&Button6 、&Button7、&Button8、&Button9}; int red_light_pin =11; int green_light_pin =12; int blue_light_pin =13; void setup(){Serial.begin(9600);} void loop(){if(NUMBER_BUTTONS!=0)updateButtons( );} void updateButtons(){for(int i =0; igetButtonState(); //ボタンが押された場合if(state ==0){midiNoteOn(Buttons [i]-> Note、127); } //ボタンが押されていないif(state ==1){midiNoteOff(Buttons [i]-> Note、0); }}} void RGB_color(int red_light_value、int green_light_value、int blue_light_value){analogWrite(red_light_pin、red_light_value); analogWrite(green_light_pin、green_light_value); analogWrite(blue_light_pin、blue_light_value);} // MIDIノートを送信ONvoidmidiNoteOn(byte note、byte midiVelocity){Serial.write(NOTE_ON_CMD); Serial.write(注); Serial.write(midiVelocity);} // MIDIノートを送信OFFvoidmidiNoteOff(byte note、byte midiVelocity){Serial.write(NOTE_OFF_CMD); Serial.write(注); Serial.write(midiVelocity);}
Buttons.cpp Arduino
#include "Buttons.h" Button ::Button(int pin、short note){_ pin =pin; pinMode(_pin、INPUT_PULLUP); _state =1; _lastState =1; Note =note;} int Button ::getButtonState(){int returnValue =-1; int state =digitalRead(_pin); if(state ==_lastState)return 5; if(state!=_lastState){if(state ==0){returnValue =0; } else {returnValue =1; }} _lastState =状態; return returnValue;}
Buttons.h Arduino
#ifndef Buttons_h#define Buttons_h#include// Button(Pin Number、Note Number)class Button {public:Button(int pin、short note); int getButtonState(); int注;プライベート:int _pin;短い_note; int _state; int _lastState;}; #endif
私のGithubからコードをダウンロードできます
https://github.com/sadreactonly/MidiDrumpad 回路図
製造プロセス