ArduinoでMIDI信号を電圧に変換せよ!

LinkedIn にシェア
Delicious にシェア
LINEで送る
email this
Pocket

飽きた訳ではないのだよ。時間が取れなかったのだ。
…と前置きをした所でものすごく久々のArduino記事。
今までは外部からの入力をMIDIに変換するものを作っていたのだが、
訳あって外部からのMIDI入力を電圧に変更するものを作る。
今までの逆だ。

とってもArduinoは既にUSB-MIDIデバイス化しているし、
すごい人達のおかげでMIDI信号を生成する所は
すでにライブラリがあるので(これは本当にありがたい)、
簡単なコードで実現できる、はずだ。

#include <MIDI.h>                //MIDIライブラリ読み込み
MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  // put your setup code here, to run once:
 MIDI.begin(); //MIDIライブラリを使う
 pinMode(13,OUTPUT); //13ピンをアウトプットに設定
}

void loop() 
{
    if (MIDI.read()) //MIDIメッセージを受信したら
      {
        switch(MIDI.getType()) {
            case midi::NoteOn: //鍵盤を押されたら
            digitalWrite(13,HIGH); //13をHIGHに(LED点灯) 
            break;
            
            case midi::NoteOff: //鍵盤を離されたら
            digitalWrite(13,LOW); //13をLOWに(LED消灯)
            break;
        }
      }
}

というわけで、これを書き込んでDAWからMIDI信号を送ると
ボード上のLEDが光るはずなのだが、

20150929ard2
なぜかめちゃくちゃなMIDIデータが書き込まれる。
2tickとか3tick置きに書き込まれていて
全く訳が分からない。
Recボタンを外したら直ったのだが、
なにかループが起きてバグったのだろうか。
解決した


無事ノートナンバーに反応して光った。
これはデジタルアウトで、オン/オフのスイッチなので、
次はコントロールチェンジの0-127を0-5Vの
電圧に変換するアナログアウト(厳密にはPWMだが)をしてみよう。

#include <MIDI.h>                //MIDIライブラリ読み込み
MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  // put your setup code here, to run once:
 MIDI.begin(); //MIDIライブラリを使う
 pinMode(11,OUTPUT); //11ピンをアウトプットに設定
}

void loop() 
{
      uint8_t data1,data2;
    if (MIDI.read()) //MIDIメッセージを受信したら
      {
        switch(MIDI.getType()) {
            case midi::ControlChange: //CCを受信したら
            data1 = MIDI.getData1(); //CC No取得
            data2 = MIDI.getData2(); //CC 値を取得
            data2 = data2*2;
            analogWrite(11,data2); //11の出力をccの値に 
            break;
        }

      }
}


いいのか、こんなに簡単で。
Arduinoって素晴らしい。
Arduino UNOにはこのPWMアウトが6つあるので、
コントロールナンバーに対応して別々のアウトに
変換するコードを書けば、1台につき6個の自由自在に
制御できる0-5Vの信号が生成できる。

さて、次は6ポートフルに使って
動作確認できる何かを作ってみようか。

〈Arduino関連〉Arduino UNO

〈Arduino関連〉Arduino UNO
価格:3,326円(税込、送料別)

“ArduinoでMIDI信号を電圧に変換せよ!” への2件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください